From 044e818cf89ab8587c8acb7927edd740db3a164d Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 17 May 2012 12:49:33 +0000 Subject: [PATCH 001/159] ____ `````|````` | | | ..'''' | | | |______ .'' | | | | ..' | | |_______ |___________ ....'' merge to TRUNK! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * The old compositor is still available (Debug Menu: 200) This commit was brought to you by: Developers: * Monique Dewanchand * Jeroen Bakker * Dalai Felinto * Lukas Tönne Review: * Brecht van Lommel Testers: * Nate Wiebe * Wolfgang Faehnle * Carlo Andreacchio * Daniel Salazar * Artur Mag * Christian Krupa * Francesco Siddi * Dan McGrath * Bassam Kurdali But mostly by the community: Gold: Joshua Faulkner Michael Tiemann Francesco Paglia Blender Guru Blender Developers Fund Silver: Pablo Vazquez Joel Heethaar Amrein Olivier Ilias Karasavvidis Thomas Kumlehn Sebastian Koenig Hannu Hoffrén Benjamin Dansie Fred M'ule Michel Vilain Bradley Cathey Gianmichele Mariani Gottfried Hofmann Bjørnar Frøyse Valentijn Bruning Paul Holmes Clemens Rudolph Juris Graphix David Strebel Ronan Zeegers François Tarlier Felipe Andres Esquivel Reed Olaf Beckman Jesus Alberto Olmos Linares Kajimba Maria Figueiredo Alexandr Galperin Francesco Siddi Julio Iglesias Lopez Kjartan Tysdal Thomas Torfs Film Works Teruyuki Nakamura Roger Luethi Benoit Bolsee Stefan Abrahamsen Andreas Mattijat Xavier Bouchoux Blender 3D Graphics and Animation Henk Vostermans Daniel Blanco Delgado BlenderDay/2011 Bradley Cathey Matthieu Dupont de Dinechin Gianmichele Mariani Jérôme Scaillet Bronze (Ivo Grigull, Dylan Urquidi, Philippe Derungs, Phil Beauchamp, Bruce Parrott, Mathieu Quiblier, Daniel Martinez, Leandro Inocencio, Lluc Romaní Brasó, Jonathan Williamson, Michael Ehlen, Karlis Stigis, Dreamsteep, Martin Lindelöf, Filippo Saracino, Douwe van der Veen, Olli Äkräs, Bruno D'Arcangeli, Francisco Sedrez Warmling, Watchmike.ca, peter lener, Matteo Novellino, Martin Kirsch, Austars Schnore, KC Elliott, Massimiliano Puliero, Karl Stein, Wood Design Studios, Omer Khan, Jyrki Kanto, Michał Krupa, Lars Brubaker, Neil Richmond, Adam Kalisz, Robert Garlington, Ian Wilson, Carlo Andreacchio, Jeremias Boos, Robert Holcomb, Gabriel Zöller, Robert Cude, Natibel de Leon, Nathan Turnage, Nicolas Vergnes, Philipp Kleinhenz, Norman Hartig, Louis Kreusel, Christopher Taylor, Giovanni Remondini, Daniel Rentzsch, Nico Partipilo, Thomas Ventresco, Johannes Schwarz, Александр Коротеев, Brendon Harvey, Marcelo G. Malheiros, Marius Giurgi, Richard Burns, Perttu Iso-Metsälä, Steve Bazin, Radoslav Borisov, Yoshiyuki Shida, Julien Guigner, Andrew Hunter, Philipp Oeser, Daniel Thul, Thobias Johansson, Mauro Bonecchi, Georg Piorczynski, Sebastian Michailidis, L M Weedy, Gen X, Stefan Hinze, Nicolò Zubbini, Erik Pusch, Rob Scott, Florian Koch, Charles Razack, Adrian Baker, Oliver Villar Diz, David Revoy, Julio Iglesias Lopez, Coen Spoor, Carlos Folch, Joseph Christie, Victor Hernández García, David Mcsween, James Finnerty, Cory Kruckenberg, Giacomo Graziosi, Olivier Saraja, Lars Brubaker, Eric Hudson, Johannes Schwarz, David Elguea, Marcus Schulderinsky, Karel De Bruijn, Lucas van Wijngaarden, Stefano Ciarrocchi, Mehmet Eribol, Thomas Berglund, Zuofei Song, Dylan Urquidi ) --- release/scripts/startup/bl_ui/space_node.py | 20 + source/blender/CMakeLists.txt | 2 + source/blender/SConscript | 2 + source/blender/blenkernel/BKE_node.h | 13 +- source/blender/blenkernel/intern/node.c | 7 + source/blender/blenloader/intern/readfile.c | 17 +- source/blender/compositor/CMakeLists.txt | 607 ++++++++ source/blender/compositor/COM_compositor.h | 278 ++++ source/blender/compositor/COM_defines.h | 99 ++ source/blender/compositor/SConscript | 14 + .../compositor/intern/COM_CPUDevice.cpp | 41 + .../blender/compositor/intern/COM_CPUDevice.h | 41 + .../compositor/intern/COM_ChannelInfo.cpp | 34 + .../compositor/intern/COM_ChannelInfo.h | 121 ++ .../compositor/intern/COM_ChunkOrder.cpp | 48 + .../compositor/intern/COM_ChunkOrder.h | 45 + .../intern/COM_ChunkOrderHotspot.cpp | 38 + .../compositor/intern/COM_ChunkOrderHotspot.h | 37 + .../intern/COM_CompositorContext.cpp | 47 + .../compositor/intern/COM_CompositorContext.h | 147 ++ .../compositor/intern/COM_Converter.cpp | 492 ++++++ .../blender/compositor/intern/COM_Converter.h | 70 + .../blender/compositor/intern/COM_Device.cpp | 24 + source/blender/compositor/intern/COM_Device.h | 57 + .../compositor/intern/COM_ExecutionGroup.cpp | 566 +++++++ .../compositor/intern/COM_ExecutionGroup.h | 404 +++++ .../compositor/intern/COM_ExecutionSystem.cpp | 310 ++++ .../compositor/intern/COM_ExecutionSystem.h | 229 +++ .../intern/COM_ExecutionSystemHelper.cpp | 310 ++++ .../intern/COM_ExecutionSystemHelper.h | 127 ++ .../compositor/intern/COM_InputSocket.cpp | 217 +++ .../compositor/intern/COM_InputSocket.h | 162 ++ .../compositor/intern/COM_MemoryBuffer.cpp | 338 +++++ .../compositor/intern/COM_MemoryBuffer.h | 170 +++ .../compositor/intern/COM_MemoryManager.cpp | 68 + .../compositor/intern/COM_MemoryManager.h | 146 ++ .../intern/COM_MemoryManagerState.cpp | 94 ++ .../intern/COM_MemoryManagerState.h | 87 ++ .../compositor/intern/COM_MemoryProxy.cpp | 37 + .../compositor/intern/COM_MemoryProxy.h | 106 ++ source/blender/compositor/intern/COM_Node.cpp | 182 +++ source/blender/compositor/intern/COM_Node.h | 131 ++ .../compositor/intern/COM_NodeBase.cpp | 128 ++ .../blender/compositor/intern/COM_NodeBase.h | 174 +++ .../compositor/intern/COM_NodeOperation.cpp | 114 ++ .../compositor/intern/COM_NodeOperation.h | 247 ++++ .../compositor/intern/COM_NodeProgram.cpp | 0 .../compositor/intern/COM_NodeProgram.h | 7 + .../compositor/intern/COM_OpenCLDevice.cpp | 61 + .../compositor/intern/COM_OpenCLDevice.h | 88 ++ .../compositor/intern/COM_OutputSocket.cpp | 146 ++ .../compositor/intern/COM_OutputSocket.h | 105 ++ .../blender/compositor/intern/COM_Socket.cpp | 47 + source/blender/compositor/intern/COM_Socket.h | 100 ++ .../intern/COM_SocketConnection.cpp | 86 ++ .../compositor/intern/COM_SocketConnection.h | 123 ++ .../compositor/intern/COM_SocketReader.cpp | 25 + .../compositor/intern/COM_SocketReader.h | 113 ++ .../compositor/intern/COM_WorkPackage.cpp | 28 + .../compositor/intern/COM_WorkPackage.h | 64 + .../compositor/intern/COM_WorkScheduler.cpp | 313 ++++ .../compositor/intern/COM_WorkScheduler.h | 127 ++ .../compositor/intern/COM_compositor.cpp | 59 + .../compositor/nodes/COM_AlphaOverNode.cpp | 67 + .../compositor/nodes/COM_AlphaOverNode.h | 38 + .../nodes/COM_BilateralBlurNode.cpp | 41 + .../compositor/nodes/COM_BilateralBlurNode.h | 38 + .../blender/compositor/nodes/COM_BlurNode.cpp | 79 + .../blender/compositor/nodes/COM_BlurNode.h | 39 + .../compositor/nodes/COM_BokehBlurNode.cpp | 63 + .../compositor/nodes/COM_BokehBlurNode.h | 39 + .../compositor/nodes/COM_BokehImageNode.cpp | 37 + .../compositor/nodes/COM_BokehImageNode.h | 38 + .../compositor/nodes/COM_BoxMaskNode.cpp | 41 + .../compositor/nodes/COM_BoxMaskNode.h | 38 + .../compositor/nodes/COM_BrightnessNode.cpp | 39 + .../compositor/nodes/COM_BrightnessNode.h | 38 + .../compositor/nodes/COM_ChannelMatteNode.cpp | 89 ++ .../compositor/nodes/COM_ChannelMatteNode.h | 38 + .../compositor/nodes/COM_ChromaMatteNode.cpp | 70 + .../compositor/nodes/COM_ChromaMatteNode.h | 38 + .../compositor/nodes/COM_ColorBalanceNode.cpp | 68 + .../compositor/nodes/COM_ColorBalanceNode.h | 39 + .../nodes/COM_ColorCorrectionNode.cpp | 42 + .../nodes/COM_ColorCorrectionNode.h | 38 + .../compositor/nodes/COM_ColorCurveNode.cpp | 44 + .../compositor/nodes/COM_ColorCurveNode.h | 38 + .../compositor/nodes/COM_ColorMatteNode.cpp | 67 + .../compositor/nodes/COM_ColorMatteNode.h | 38 + .../compositor/nodes/COM_ColorNode.cpp | 38 + .../blender/compositor/nodes/COM_ColorNode.h | 38 + .../compositor/nodes/COM_ColorRampNode.cpp | 51 + .../compositor/nodes/COM_ColorRampNode.h | 39 + .../compositor/nodes/COM_ColorSpillNode.cpp | 55 + .../compositor/nodes/COM_ColorSpillNode.h | 39 + .../compositor/nodes/COM_ColorToBWNode.cpp | 39 + .../compositor/nodes/COM_ColorToBWNode.h | 37 + .../compositor/nodes/COM_CombineHSVANode.cpp | 43 + .../compositor/nodes/COM_CombineHSVANode.h | 38 + .../compositor/nodes/COM_CombineRGBANode.cpp | 59 + .../compositor/nodes/COM_CombineRGBANode.h | 37 + .../compositor/nodes/COM_CombineYCCANode.cpp | 42 + .../compositor/nodes/COM_CombineYCCANode.h | 37 + .../compositor/nodes/COM_CombineYUVANode.cpp | 37 + .../compositor/nodes/COM_CombineYUVANode.h | 37 + .../compositor/nodes/COM_CompositorNode.cpp | 42 + .../compositor/nodes/COM_CompositorNode.h | 37 + .../compositor/nodes/COM_ConvertAlphaNode.cpp | 43 + .../compositor/nodes/COM_ConvertAlphaNode.h | 37 + .../blender/compositor/nodes/COM_CropNode.cpp | 46 + .../blender/compositor/nodes/COM_CropNode.h | 36 + .../compositor/nodes/COM_DefocusNode.cpp | 110 ++ .../compositor/nodes/COM_DefocusNode.h | 39 + .../nodes/COM_DifferenceMatteNode.cpp | 52 + .../nodes/COM_DifferenceMatteNode.h | 39 + .../compositor/nodes/COM_DilateErodeNode.cpp | 46 + .../compositor/nodes/COM_DilateErodeNode.h | 38 + .../nodes/COM_DirectionalBlurNode.cpp | 40 + .../nodes/COM_DirectionalBlurNode.h | 38 + .../compositor/nodes/COM_DisplaceNode.cpp | 45 + .../compositor/nodes/COM_DisplaceNode.h | 36 + .../nodes/COM_DistanceMatteNode.cpp | 59 + .../compositor/nodes/COM_DistanceMatteNode.h | 38 + .../nodes/COM_DoubleEdgeMaskNode.cpp | 43 + .../compositor/nodes/COM_DoubleEdgeMaskNode.h | 38 + .../compositor/nodes/COM_EllipseMaskNode.cpp | 41 + .../compositor/nodes/COM_EllipseMaskNode.h | 38 + .../compositor/nodes/COM_FilterNode.cpp | 81 + .../blender/compositor/nodes/COM_FilterNode.h | 39 + .../blender/compositor/nodes/COM_FlipNode.cpp | 53 + .../blender/compositor/nodes/COM_FlipNode.h | 38 + .../compositor/nodes/COM_GammaNode.cpp | 38 + .../blender/compositor/nodes/COM_GammaNode.h | 38 + .../compositor/nodes/COM_GlareNode.cpp | 128 ++ .../blender/compositor/nodes/COM_GlareNode.h | 38 + .../compositor/nodes/COM_GroupNode.cpp | 69 + .../blender/compositor/nodes/COM_GroupNode.h | 57 + .../COM_HueSaturationValueCorrectNode.cpp | 69 + .../nodes/COM_HueSaturationValueCorrectNode.h | 37 + .../nodes/COM_HueSaturationValueNode.cpp | 68 + .../nodes/COM_HueSaturationValueNode.h | 37 + .../compositor/nodes/COM_IDMaskNode.cpp | 48 + .../blender/compositor/nodes/COM_IDMaskNode.h | 38 + .../compositor/nodes/COM_ImageNode.cpp | 150 ++ .../blender/compositor/nodes/COM_ImageNode.h | 44 + .../compositor/nodes/COM_InvertNode.cpp | 42 + .../blender/compositor/nodes/COM_InvertNode.h | 38 + .../nodes/COM_LensDistortionNode.cpp | 57 + .../compositor/nodes/COM_LensDistortionNode.h | 38 + .../nodes/COM_LuminanceMatteNode.cpp | 60 + .../compositor/nodes/COM_LuminanceMatteNode.h | 38 + .../compositor/nodes/COM_MapUVNode.cpp | 41 + .../blender/compositor/nodes/COM_MapUVNode.h | 36 + .../compositor/nodes/COM_MapValueNode.cpp | 40 + .../compositor/nodes/COM_MapValueNode.h | 37 + .../blender/compositor/nodes/COM_MathNode.cpp | 92 ++ .../blender/compositor/nodes/COM_MathNode.h | 38 + .../blender/compositor/nodes/COM_MixNode.cpp | 131 ++ source/blender/compositor/nodes/COM_MixNode.h | 37 + .../compositor/nodes/COM_MovieClipNode.cpp | 118 ++ .../compositor/nodes/COM_MovieClipNode.h | 37 + .../nodes/COM_MovieDistortionNode.cpp | 44 + .../nodes/COM_MovieDistortionNode.h | 38 + .../blender/compositor/nodes/COM_MuteNode.cpp | 91 ++ .../blender/compositor/nodes/COM_MuteNode.h | 40 + .../compositor/nodes/COM_NormalNode.cpp | 56 + .../blender/compositor/nodes/COM_NormalNode.h | 39 + .../compositor/nodes/COM_NormalizeNode.cpp | 36 + .../compositor/nodes/COM_NormalizeNode.h | 37 + .../compositor/nodes/COM_OutputFileNode.cpp | 89 ++ .../compositor/nodes/COM_OutputFileNode.h | 40 + .../compositor/nodes/COM_RenderLayersNode.cpp | 109 ++ .../compositor/nodes/COM_RenderLayersNode.h | 37 + .../compositor/nodes/COM_RotateNode.cpp | 60 + .../blender/compositor/nodes/COM_RotateNode.h | 38 + .../compositor/nodes/COM_ScaleNode.cpp | 86 ++ .../blender/compositor/nodes/COM_ScaleNode.h | 38 + .../compositor/nodes/COM_SeparateHSVANode.cpp | 42 + .../compositor/nodes/COM_SeparateHSVANode.h | 39 + .../compositor/nodes/COM_SeparateRGBANode.cpp | 70 + .../compositor/nodes/COM_SeparateRGBANode.h | 37 + .../compositor/nodes/COM_SeparateYCCANode.cpp | 44 + .../compositor/nodes/COM_SeparateYCCANode.h | 38 + .../compositor/nodes/COM_SeparateYUVANode.cpp | 40 + .../compositor/nodes/COM_SeparateYUVANode.h | 38 + .../compositor/nodes/COM_SetAlphaNode.cpp | 35 + .../compositor/nodes/COM_SetAlphaNode.h | 38 + .../compositor/nodes/COM_SocketProxyNode.cpp | 89 ++ .../compositor/nodes/COM_SocketProxyNode.h | 46 + .../compositor/nodes/COM_SplitViewerNode.cpp | 49 + .../compositor/nodes/COM_SplitViewerNode.h | 37 + .../compositor/nodes/COM_Stabilize2dNode.cpp | 87 ++ .../compositor/nodes/COM_Stabilize2dNode.h | 34 + .../compositor/nodes/COM_SwitchNode.cpp | 43 + .../blender/compositor/nodes/COM_SwitchNode.h | 38 + .../compositor/nodes/COM_TextureNode.cpp | 49 + .../compositor/nodes/COM_TextureNode.h | 34 + .../blender/compositor/nodes/COM_TimeNode.cpp | 55 + .../blender/compositor/nodes/COM_TimeNode.h | 38 + .../compositor/nodes/COM_TonemapNode.cpp | 39 + .../compositor/nodes/COM_TonemapNode.h | 38 + .../compositor/nodes/COM_TransformNode.cpp | 77 + .../compositor/nodes/COM_TransformNode.h | 34 + .../compositor/nodes/COM_TranslateNode.cpp | 43 + .../compositor/nodes/COM_TranslateNode.h | 38 + .../compositor/nodes/COM_ValueNode.cpp | 38 + .../blender/compositor/nodes/COM_ValueNode.h | 38 + .../compositor/nodes/COM_VectorBlurNode.cpp | 45 + .../compositor/nodes/COM_VectorBlurNode.h | 38 + .../compositor/nodes/COM_VectorCurveNode.cpp | 40 + .../compositor/nodes/COM_VectorCurveNode.h | 38 + .../compositor/nodes/COM_ViewLevelsNode.cpp | 64 + .../compositor/nodes/COM_ViewLevelsNode.h | 38 + .../compositor/nodes/COM_ViewerNode.cpp | 54 + .../blender/compositor/nodes/COM_ViewerNode.h | 37 + .../compositor/nodes/COM_ZCombineNode.cpp | 64 + .../compositor/nodes/COM_ZCombineNode.h | 38 + .../operations/COM_AlphaOverKeyOperation.cpp | 58 + .../operations/COM_AlphaOverKeyOperation.h | 44 + .../COM_AlphaOverMixedOperation.cpp | 61 + .../operations/COM_AlphaOverMixedOperation.h | 48 + .../COM_AlphaOverPremultiplyOperation.cpp | 59 + .../COM_AlphaOverPremultiplyOperation.h | 45 + .../operations/COM_AntiAliasOperation.cpp | 97 ++ .../operations/COM_AntiAliasOperation.h | 61 + .../operations/COM_BilateralBlurOperation.cpp | 115 ++ .../operations/COM_BilateralBlurOperation.h | 57 + .../operations/COM_BlurBaseOperation.cpp | 102 ++ .../operations/COM_BlurBaseOperation.h | 58 + .../operations/COM_BokehBlurOperation.cpp | 159 ++ .../operations/COM_BokehBlurOperation.h | 60 + .../operations/COM_BokehImageOperation.cpp | 112 ++ .../operations/COM_BokehImageOperation.h | 67 + .../operations/COM_BoxMaskOperation.cpp | 110 ++ .../operations/COM_BoxMaskOperation.h | 65 + .../operations/COM_BrightnessOperation.cpp | 78 + .../operations/COM_BrightnessOperation.h | 56 + .../operations/COM_CalculateMeanOperation.cpp | 122 ++ .../operations/COM_CalculateMeanOperation.h | 69 + ...OM_CalculateStandardDeviationOperation.cpp | 94 ++ .../COM_CalculateStandardDeviationOperation.h | 47 + .../operations/COM_ChangeHSVOperation.cpp | 50 + .../operations/COM_ChangeHSVOperation.h | 59 + .../operations/COM_ChannelMatteOperation.cpp | 117 ++ .../operations/COM_ChannelMatteOperation.h | 76 + .../operations/COM_ChromaMatteOperation.cpp | 97 ++ .../operations/COM_ChromaMatteOperation.h | 52 + .../COM_ColorBalanceASCCDLOperation.cpp | 71 + .../COM_ColorBalanceASCCDLOperation.h | 81 + .../COM_ColorBalanceLGGOperation.cpp | 76 + .../operations/COM_ColorBalanceLGGOperation.h | 81 + .../COM_ColorCorrectionOperation.cpp | 134 ++ .../operations/COM_ColorCorrectionOperation.h | 64 + .../operations/COM_ColorCurveOperation.cpp | 95 ++ .../operations/COM_ColorCurveOperation.h | 56 + .../operations/COM_ColorMatteOperation.cpp | 80 + .../operations/COM_ColorMatteOperation.h | 52 + .../operations/COM_ColorRampOperation.cpp | 53 + .../operations/COM_ColorRampOperation.h | 57 + .../operations/COM_ColorSpillOperation.cpp | 110 ++ .../operations/COM_ColorSpillOperation.h | 64 + .../COM_CombineChannelsOperation.cpp | 72 + .../operations/COM_CombineChannelsOperation.h | 42 + .../operations/COM_CompositorOperation.cpp | 122 ++ .../operations/COM_CompositorOperation.h | 69 + .../COM_ConvertColorProfileOperation.cpp | 47 + .../COM_ConvertColorProfileOperation.h | 78 + .../COM_ConvertColorToBWOperation.cpp | 43 + .../COM_ConvertColorToBWOperation.h | 60 + .../COM_ConvertColorToVectorOperation.cpp | 41 + .../COM_ConvertColorToVectorOperation.h | 59 + .../COM_ConvertColourToValueProg.cpp | 43 + .../operations/COM_ConvertColourToValueProg.h | 59 + .../COM_ConvertDepthToRadiusOperation.cpp | 97 ++ .../COM_ConvertDepthToRadiusOperation.h | 72 + .../COM_ConvertHSVToRGBOperation.cpp | 46 + .../operations/COM_ConvertHSVToRGBOperation.h | 59 + .../COM_ConvertKeyToPremulOperation.cpp | 53 + .../COM_ConvertKeyToPremulOperation.h | 49 + .../COM_ConvertPremulToKeyOperation.cpp | 60 + .../COM_ConvertPremulToKeyOperation.h | 48 + .../COM_ConvertRGBToHSVOperation.cpp | 45 + .../operations/COM_ConvertRGBToHSVOperation.h | 60 + .../COM_ConvertRGBToYCCOperation.cpp | 67 + .../operations/COM_ConvertRGBToYCCOperation.h | 68 + .../COM_ConvertRGBToYUVOperation.cpp | 44 + .../operations/COM_ConvertRGBToYUVOperation.h | 59 + .../COM_ConvertValueToColourProg.cpp | 45 + .../operations/COM_ConvertValueToColourProg.h | 53 + .../COM_ConvertValueToVectorOperation.cpp | 46 + .../COM_ConvertValueToVectorOperation.h | 59 + .../COM_ConvertVectorToColorOperation.cpp | 42 + .../COM_ConvertVectorToColorOperation.h | 59 + .../COM_ConvertVectorToValueOperation.cpp | 43 + .../COM_ConvertVectorToValueOperation.h | 59 + .../COM_ConvertYCCToRGBOperation.cpp | 67 + .../operations/COM_ConvertYCCToRGBOperation.h | 68 + .../COM_ConvertYUVToRGBOperation.cpp | 45 + .../operations/COM_ConvertYUVToRGBOperation.h | 58 + .../COM_ConvolutionEdgeFilterOperation.cpp | 95 ++ .../COM_ConvolutionEdgeFilterOperation.h | 34 + .../COM_ConvolutionFilterOperation.cpp | 136 ++ .../COM_ConvolutionFilterOperation.h | 48 + .../operations/COM_CropOperation.cpp | 104 ++ .../compositor/operations/COM_CropOperation.h | 63 + .../operations/COM_CurveBaseOperation.cpp | 38 + .../operations/COM_CurveBaseOperation.h | 44 + .../COM_DifferenceMatteOperation.cpp | 84 ++ .../operations/COM_DifferenceMatteOperation.h | 53 + .../operations/COM_DilateErodeOperation.cpp | 145 ++ .../operations/COM_DilateErodeOperation.h | 70 + .../COM_DirectionalBlurOperation.cpp | 115 ++ .../operations/COM_DirectionalBlurOperation.h | 59 + .../operations/COM_DisplaceOperation.cpp | 147 ++ .../operations/COM_DisplaceOperation.h | 63 + .../COM_DisplaceSimpleOperation.cpp | 127 ++ .../operations/COM_DisplaceSimpleOperation.h | 63 + .../operations/COM_DistanceMatteOperation.cpp | 86 ++ .../operations/COM_DistanceMatteOperation.h | 52 + .../operations/COM_DotproductOperation.cpp | 51 + .../operations/COM_DotproductOperation.h | 41 + .../COM_DoubleEdgeMaskOperation.cpp | 1195 +++++++++++++++ .../operations/COM_DoubleEdgeMaskOperation.h | 64 + .../operations/COM_EllipseMaskOperation.cpp | 114 ++ .../operations/COM_EllipseMaskOperation.h | 65 + .../COM_FastGaussianBlurOperation.cpp | 197 +++ .../COM_FastGaussianBlurOperation.h | 45 + .../operations/COM_FlipOperation.cpp | 68 + .../compositor/operations/COM_FlipOperation.h | 44 + .../operations/COM_FogGlowImageOperation.cpp | 48 + .../operations/COM_FogGlowImageOperation.h | 39 + .../operations/COM_GammaCorrectOperation.cpp | 98 ++ .../operations/COM_GammaCorrectOperation.h | 80 + .../operations/COM_GammaOperation.cpp | 56 + .../operations/COM_GammaOperation.h | 54 + .../COM_GaussianBokehBlurOperation.cpp | 174 +++ .../COM_GaussianBokehBlurOperation.h | 51 + .../operations/COM_GaussianXBlurOperation.cpp | 128 ++ .../operations/COM_GaussianXBlurOperation.h | 49 + .../operations/COM_GaussianYBlurOperation.cpp | 125 ++ .../operations/COM_GaussianYBlurOperation.h | 49 + .../operations/COM_GlareBaseOperation.cpp | 75 + .../operations/COM_GlareBaseOperation.h | 70 + .../COM_GlareSimpleStarOperation.cpp | 113 ++ .../operations/COM_GlareSimpleStarOperation.h | 35 + .../operations/COM_GlareStreaksOperation.cpp | 94 ++ .../operations/COM_GlareStreaksOperation.h | 35 + .../COM_GlareThresholdOperation.cpp | 48 + .../operations/COM_GlareThresholdOperation.h | 57 + ...COM_HueSaturationValueCorrectOperation.cpp | 74 + .../COM_HueSaturationValueCorrectOperation.h | 53 + .../operations/COM_IDMaskOperation.cpp | 45 + .../operations/COM_IDMaskOperation.h | 57 + .../operations/COM_ImageOperation.cpp | 149 ++ .../operations/COM_ImageOperation.h | 94 ++ .../operations/COM_InvertOperation.cpp | 70 + .../operations/COM_InvertOperation.h | 60 + .../operations/COM_LensGhostOperation.cpp | 792 ++++++++++ .../operations/COM_LensGhostOperation.h | 82 + .../operations/COM_LensGlowImageOperation.cpp | 51 + .../operations/COM_LensGlowImageOperation.h | 52 + .../operations/COM_LensGlowOperation.cpp | 54 + .../operations/COM_LensGlowOperation.h | 56 + .../COM_LuminanceMatteOperation.cpp | 79 + .../operations/COM_LuminanceMatteOperation.h | 51 + .../operations/COM_MapUVOperation.cpp | 153 ++ .../operations/COM_MapUVOperation.h | 62 + .../operations/COM_MapValueOperation.cpp | 52 + .../operations/COM_MapValueOperation.h | 66 + .../operations/COM_MathBaseOperation.cpp | 239 +++ .../operations/COM_MathBaseOperation.h | 150 ++ .../operations/COM_MixAddOperation.cpp | 47 + .../operations/COM_MixAddOperation.h | 45 + .../operations/COM_MixBaseOperation.cpp | 89 ++ .../operations/COM_MixBaseOperation.h | 67 + .../operations/COM_MixBlendOperation.cpp | 47 + .../operations/COM_MixBlendOperation.h | 45 + .../operations/COM_MixBurnOperation.cpp | 84 ++ .../operations/COM_MixBurnOperation.h | 45 + .../operations/COM_MixColorOperation.cpp | 59 + .../operations/COM_MixColorOperation.h | 45 + .../operations/COM_MixDarkenOperation.cpp | 54 + .../operations/COM_MixDarkenOperation.h | 45 + .../operations/COM_MixDifferenceOperation.cpp | 47 + .../operations/COM_MixDifferenceOperation.h | 45 + .../operations/COM_MixDivideOperation.cpp | 57 + .../operations/COM_MixDivideOperation.h | 45 + .../operations/COM_MixDodgeOperation.cpp | 89 ++ .../operations/COM_MixDodgeOperation.h | 45 + .../operations/COM_MixHueOperation.cpp | 58 + .../operations/COM_MixHueOperation.h | 45 + .../operations/COM_MixLightenOperation.cpp | 52 + .../operations/COM_MixLightenOperation.h | 44 + .../COM_MixLinearLightOperation.cpp | 54 + .../operations/COM_MixLinearLightOperation.h | 45 + .../operations/COM_MixMultiplyOperation.cpp | 47 + .../operations/COM_MixMultiplyOperation.h | 45 + .../operations/COM_MixOverlayOperation.cpp | 60 + .../operations/COM_MixOverlayOperation.h | 45 + .../operations/COM_MixSaturationOperation.cpp | 54 + .../operations/COM_MixSaturationOperation.h | 45 + .../operations/COM_MixScreenOperation.cpp | 48 + .../operations/COM_MixScreenOperation.h | 44 + .../operations/COM_MixSoftLightOperation.cpp | 53 + .../operations/COM_MixSoftLightOperation.h | 45 + .../operations/COM_MixSubtractOperation.cpp | 45 + .../operations/COM_MixSubtractOperation.h | 45 + .../operations/COM_MixValueOperation.cpp | 52 + .../operations/COM_MixValueOperation.h | 44 + .../COM_MovieClipAttributeOperation.cpp | 67 + .../COM_MovieClipAttributeOperation.h | 61 + .../operations/COM_MovieClipOperation.cpp | 94 ++ .../operations/COM_MovieClipOperation.h | 64 + .../COM_MovieDistortionOperation.cpp | 89 ++ .../operations/COM_MovieDistortionOperation.h | 113 ++ .../COM_MultilayerImageOperation.cpp | 96 ++ .../operations/COM_MultilayerImageOperation.h | 68 + .../operations/COM_NormalizeOperation.cpp | 108 ++ .../operations/COM_NormalizeOperation.h | 69 + .../operations/COM_OpenCLKernels.cl | 9 + .../operations/COM_OpenCLKernels.cl.cpp | 14 + .../operations/COM_OutputFileOperation.cpp | 260 ++++ .../operations/COM_OutputFileOperation.h | 89 ++ .../operations/COM_PreviewOperation.cpp | 127 ++ .../operations/COM_PreviewOperation.h | 56 + .../COM_ProjectorLensDistortionOperation.cpp | 71 + .../COM_ProjectorLensDistortionOperation.h | 64 + .../operations/COM_QualityStepHelper.cpp | 69 + .../operations/COM_QualityStepHelper.h | 53 + .../operations/COM_ReadBufferOperation.cpp | 70 + .../operations/COM_ReadBufferOperation.h | 51 + .../COM_RenderLayersAOOperation.cpp | 28 + .../operations/COM_RenderLayersAOOperation.h | 33 + .../operations/COM_RenderLayersAlphaProg.cpp | 46 + .../operations/COM_RenderLayersAlphaProg.h | 35 + .../operations/COM_RenderLayersBaseProg.cpp | 130 ++ .../operations/COM_RenderLayersBaseProg.h | 99 ++ .../COM_RenderLayersColorOperation.cpp | 27 + .../COM_RenderLayersColorOperation.h | 33 + .../COM_RenderLayersCyclesOperation.cpp | 27 + .../COM_RenderLayersCyclesOperation.h | 33 + .../operations/COM_RenderLayersDepthProg.cpp | 28 + .../operations/COM_RenderLayersDepthProg.h | 34 + .../COM_RenderLayersDiffuseOperation.cpp | 27 + .../COM_RenderLayersDiffuseOperation.h | 33 + .../COM_RenderLayersEmitOperation.cpp | 27 + .../COM_RenderLayersEmitOperation.h | 33 + .../COM_RenderLayersEnvironmentOperation.cpp | 27 + .../COM_RenderLayersEnvironmentOperation.h | 33 + .../operations/COM_RenderLayersImageProg.cpp | 27 + .../operations/COM_RenderLayersImageProg.h | 34 + .../COM_RenderLayersIndirectOperation.cpp | 27 + .../COM_RenderLayersIndirectOperation.h | 33 + ...COM_RenderLayersMaterialIndexOperation.cpp | 27 + .../COM_RenderLayersMaterialIndexOperation.h | 33 + .../COM_RenderLayersMistOperation.cpp | 27 + .../COM_RenderLayersMistOperation.h | 11 + .../COM_RenderLayersNormalOperation.cpp | 27 + .../COM_RenderLayersNormalOperation.h | 33 + .../COM_RenderLayersObjectIndexOperation.cpp | 27 + .../COM_RenderLayersObjectIndexOperation.h | 33 + .../COM_RenderLayersReflectionOperation.cpp | 27 + .../COM_RenderLayersReflectionOperation.h | 33 + .../COM_RenderLayersRefractionOperation.cpp | 27 + .../COM_RenderLayersRefractionOperation.h | 33 + .../COM_RenderLayersShadowOperation.cpp | 27 + .../COM_RenderLayersShadowOperation.h | 33 + .../COM_RenderLayersSpecularOperation.cpp | 27 + .../COM_RenderLayersSpecularOperation.h | 33 + .../COM_RenderLayersSpeedOperation.cpp | 27 + .../COM_RenderLayersSpeedOperation.h | 33 + .../COM_RenderLayersUVOperation.cpp | 27 + .../operations/COM_RenderLayersUVOperation.h | 33 + .../operations/COM_RotateOperation.cpp | 93 ++ .../operations/COM_RotateOperation.h | 46 + .../operations/COM_ScaleOperation.cpp | 196 +++ .../operations/COM_ScaleOperation.h | 77 + .../COM_ScreenLensDistortionOperation.cpp | 164 ++ .../COM_ScreenLensDistortionOperation.h | 74 + .../COM_SeparateChannelOperation.cpp | 43 + .../operations/COM_SeparateChannelOperation.h | 42 + .../operations/COM_SetAlphaOperation.cpp | 51 + .../operations/COM_SetAlphaOperation.h | 51 + .../operations/COM_SetColorOperation.cpp | 39 + .../operations/COM_SetColorOperation.h | 64 + .../operations/COM_SetSamplerOperation.cpp | 39 + .../operations/COM_SetSamplerOperation.h | 51 + .../operations/COM_SetValueOperation.cpp | 36 + .../operations/COM_SetValueOperation.h | 54 + .../operations/COM_SetVectorOperation.cpp | 45 + .../operations/COM_SetVectorOperation.h | 68 + .../operations/COM_SocketProxyOperation.cpp | 41 + .../operations/COM_SocketProxyOperation.h | 39 + .../operations/COM_SplitViewerOperation.cpp | 102 ++ .../operations/COM_SplitViewerOperation.h | 44 + .../operations/COM_TextureOperation.cpp | 100 ++ .../operations/COM_TextureOperation.h | 81 + .../operations/COM_TonemapOperation.cpp | 163 ++ .../operations/COM_TonemapOperation.h | 103 ++ .../operations/COM_TranslateOperation.cpp | 67 + .../operations/COM_TranslateOperation.h | 47 + .../COM_VariableSizeBokehBlurOperation.cpp | 142 ++ .../COM_VariableSizeBokehBlurOperation.h | 62 + .../operations/COM_VectorBlurOperation.cpp | 113 ++ .../operations/COM_VectorBlurOperation.h | 73 + .../operations/COM_VectorCurveOperation.cpp | 56 + .../operations/COM_VectorCurveOperation.h | 52 + .../operations/COM_ViewerBaseOperation.cpp | 92 ++ .../operations/COM_ViewerBaseOperation.h | 71 + .../operations/COM_ViewerOperation.cpp | 108 ++ .../operations/COM_ViewerOperation.h | 41 + .../operations/COM_WriteBufferOperation.cpp | 161 ++ .../operations/COM_WriteBufferOperation.h | 52 + .../operations/COM_ZCombineOperation.cpp | 87 ++ .../operations/COM_ZCombineOperation.h | 57 + .../blender/editors/space_image/image_ops.c | 2 +- source/blender/editors/space_node/drawnode.c | 287 ++++ source/blender/editors/space_node/node_edit.c | 8 +- source/blender/makesdna/DNA_node_types.h | 74 +- source/blender/makesrna/intern/rna_nodetree.c | 391 +++++ .../makesrna/intern/rna_nodetree_types.h | 7 +- source/blender/nodes/CMakeLists.txt | 8 + source/blender/nodes/NOD_composite.h | 8 + source/blender/nodes/SConscript | 1 + .../nodes/composite/node_composite_tree.c | 50 +- .../nodes/node_composite_bokehblur.c | 60 + .../nodes/node_composite_bokehimage.c | 66 + .../composite/nodes/node_composite_boxmask.c | 75 + .../nodes/node_composite_colorcorrection.c | 89 ++ .../nodes/node_composite_ellipsemask.c | 75 + .../composite/nodes/node_composite_image.c | 1 - .../composite/nodes/node_composite_switch.c | 58 + .../composite/nodes/node_composite_viewer.c | 2 + source/blender/opencl/CMakeLists.txt | 39 + source/blender/opencl/OCL_opencl.h | 37 + source/blender/opencl/SConscript | 8 + source/blender/opencl/intern/OCL_opencl.c | 37 + source/blender/opencl/intern/clew.c | 311 ++++ source/blender/opencl/intern/clew.h | 1317 +++++++++++++++++ .../blender/render/intern/source/pipeline.c | 4 +- .../bad_level_call_stubs/stubs.c | 3 + source/creator/CMakeLists.txt | 3 + 542 files changed, 40125 insertions(+), 31 deletions(-) create mode 100644 source/blender/compositor/CMakeLists.txt create mode 100644 source/blender/compositor/COM_compositor.h create mode 100644 source/blender/compositor/COM_defines.h create mode 100644 source/blender/compositor/SConscript create mode 100644 source/blender/compositor/intern/COM_CPUDevice.cpp create mode 100644 source/blender/compositor/intern/COM_CPUDevice.h create mode 100644 source/blender/compositor/intern/COM_ChannelInfo.cpp create mode 100644 source/blender/compositor/intern/COM_ChannelInfo.h create mode 100644 source/blender/compositor/intern/COM_ChunkOrder.cpp create mode 100644 source/blender/compositor/intern/COM_ChunkOrder.h create mode 100644 source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp create mode 100644 source/blender/compositor/intern/COM_ChunkOrderHotspot.h create mode 100644 source/blender/compositor/intern/COM_CompositorContext.cpp create mode 100644 source/blender/compositor/intern/COM_CompositorContext.h create mode 100644 source/blender/compositor/intern/COM_Converter.cpp create mode 100644 source/blender/compositor/intern/COM_Converter.h create mode 100644 source/blender/compositor/intern/COM_Device.cpp create mode 100644 source/blender/compositor/intern/COM_Device.h create mode 100644 source/blender/compositor/intern/COM_ExecutionGroup.cpp create mode 100644 source/blender/compositor/intern/COM_ExecutionGroup.h create mode 100644 source/blender/compositor/intern/COM_ExecutionSystem.cpp create mode 100644 source/blender/compositor/intern/COM_ExecutionSystem.h create mode 100644 source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp create mode 100644 source/blender/compositor/intern/COM_ExecutionSystemHelper.h create mode 100644 source/blender/compositor/intern/COM_InputSocket.cpp create mode 100644 source/blender/compositor/intern/COM_InputSocket.h create mode 100644 source/blender/compositor/intern/COM_MemoryBuffer.cpp create mode 100644 source/blender/compositor/intern/COM_MemoryBuffer.h create mode 100644 source/blender/compositor/intern/COM_MemoryManager.cpp create mode 100644 source/blender/compositor/intern/COM_MemoryManager.h create mode 100644 source/blender/compositor/intern/COM_MemoryManagerState.cpp create mode 100644 source/blender/compositor/intern/COM_MemoryManagerState.h create mode 100644 source/blender/compositor/intern/COM_MemoryProxy.cpp create mode 100644 source/blender/compositor/intern/COM_MemoryProxy.h create mode 100644 source/blender/compositor/intern/COM_Node.cpp create mode 100644 source/blender/compositor/intern/COM_Node.h create mode 100644 source/blender/compositor/intern/COM_NodeBase.cpp create mode 100644 source/blender/compositor/intern/COM_NodeBase.h create mode 100644 source/blender/compositor/intern/COM_NodeOperation.cpp create mode 100644 source/blender/compositor/intern/COM_NodeOperation.h create mode 100644 source/blender/compositor/intern/COM_NodeProgram.cpp create mode 100644 source/blender/compositor/intern/COM_NodeProgram.h create mode 100644 source/blender/compositor/intern/COM_OpenCLDevice.cpp create mode 100644 source/blender/compositor/intern/COM_OpenCLDevice.h create mode 100644 source/blender/compositor/intern/COM_OutputSocket.cpp create mode 100644 source/blender/compositor/intern/COM_OutputSocket.h create mode 100644 source/blender/compositor/intern/COM_Socket.cpp create mode 100644 source/blender/compositor/intern/COM_Socket.h create mode 100644 source/blender/compositor/intern/COM_SocketConnection.cpp create mode 100644 source/blender/compositor/intern/COM_SocketConnection.h create mode 100644 source/blender/compositor/intern/COM_SocketReader.cpp create mode 100644 source/blender/compositor/intern/COM_SocketReader.h create mode 100644 source/blender/compositor/intern/COM_WorkPackage.cpp create mode 100644 source/blender/compositor/intern/COM_WorkPackage.h create mode 100644 source/blender/compositor/intern/COM_WorkScheduler.cpp create mode 100644 source/blender/compositor/intern/COM_WorkScheduler.h create mode 100644 source/blender/compositor/intern/COM_compositor.cpp create mode 100644 source/blender/compositor/nodes/COM_AlphaOverNode.cpp create mode 100644 source/blender/compositor/nodes/COM_AlphaOverNode.h create mode 100644 source/blender/compositor/nodes/COM_BilateralBlurNode.cpp create mode 100644 source/blender/compositor/nodes/COM_BilateralBlurNode.h create mode 100644 source/blender/compositor/nodes/COM_BlurNode.cpp create mode 100644 source/blender/compositor/nodes/COM_BlurNode.h create mode 100644 source/blender/compositor/nodes/COM_BokehBlurNode.cpp create mode 100644 source/blender/compositor/nodes/COM_BokehBlurNode.h create mode 100644 source/blender/compositor/nodes/COM_BokehImageNode.cpp create mode 100644 source/blender/compositor/nodes/COM_BokehImageNode.h create mode 100644 source/blender/compositor/nodes/COM_BoxMaskNode.cpp create mode 100644 source/blender/compositor/nodes/COM_BoxMaskNode.h create mode 100644 source/blender/compositor/nodes/COM_BrightnessNode.cpp create mode 100644 source/blender/compositor/nodes/COM_BrightnessNode.h create mode 100644 source/blender/compositor/nodes/COM_ChannelMatteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ChannelMatteNode.h create mode 100644 source/blender/compositor/nodes/COM_ChromaMatteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ChromaMatteNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorBalanceNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorBalanceNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorCorrectionNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorCurveNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorCurveNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorMatteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorMatteNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorRampNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorRampNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorSpillNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorSpillNode.h create mode 100644 source/blender/compositor/nodes/COM_ColorToBWNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ColorToBWNode.h create mode 100644 source/blender/compositor/nodes/COM_CombineHSVANode.cpp create mode 100644 source/blender/compositor/nodes/COM_CombineHSVANode.h create mode 100644 source/blender/compositor/nodes/COM_CombineRGBANode.cpp create mode 100644 source/blender/compositor/nodes/COM_CombineRGBANode.h create mode 100644 source/blender/compositor/nodes/COM_CombineYCCANode.cpp create mode 100644 source/blender/compositor/nodes/COM_CombineYCCANode.h create mode 100644 source/blender/compositor/nodes/COM_CombineYUVANode.cpp create mode 100644 source/blender/compositor/nodes/COM_CombineYUVANode.h create mode 100644 source/blender/compositor/nodes/COM_CompositorNode.cpp create mode 100644 source/blender/compositor/nodes/COM_CompositorNode.h create mode 100644 source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ConvertAlphaNode.h create mode 100644 source/blender/compositor/nodes/COM_CropNode.cpp create mode 100644 source/blender/compositor/nodes/COM_CropNode.h create mode 100644 source/blender/compositor/nodes/COM_DefocusNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DefocusNode.h create mode 100644 source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DifferenceMatteNode.h create mode 100644 source/blender/compositor/nodes/COM_DilateErodeNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DilateErodeNode.h create mode 100644 source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DirectionalBlurNode.h create mode 100644 source/blender/compositor/nodes/COM_DisplaceNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DisplaceNode.h create mode 100644 source/blender/compositor/nodes/COM_DistanceMatteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DistanceMatteNode.h create mode 100644 source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp create mode 100644 source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h create mode 100644 source/blender/compositor/nodes/COM_EllipseMaskNode.cpp create mode 100644 source/blender/compositor/nodes/COM_EllipseMaskNode.h create mode 100644 source/blender/compositor/nodes/COM_FilterNode.cpp create mode 100644 source/blender/compositor/nodes/COM_FilterNode.h create mode 100644 source/blender/compositor/nodes/COM_FlipNode.cpp create mode 100644 source/blender/compositor/nodes/COM_FlipNode.h create mode 100644 source/blender/compositor/nodes/COM_GammaNode.cpp create mode 100644 source/blender/compositor/nodes/COM_GammaNode.h create mode 100644 source/blender/compositor/nodes/COM_GlareNode.cpp create mode 100644 source/blender/compositor/nodes/COM_GlareNode.h create mode 100644 source/blender/compositor/nodes/COM_GroupNode.cpp create mode 100644 source/blender/compositor/nodes/COM_GroupNode.h create mode 100644 source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp create mode 100644 source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h create mode 100644 source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp create mode 100644 source/blender/compositor/nodes/COM_HueSaturationValueNode.h create mode 100644 source/blender/compositor/nodes/COM_IDMaskNode.cpp create mode 100644 source/blender/compositor/nodes/COM_IDMaskNode.h create mode 100644 source/blender/compositor/nodes/COM_ImageNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ImageNode.h create mode 100644 source/blender/compositor/nodes/COM_InvertNode.cpp create mode 100644 source/blender/compositor/nodes/COM_InvertNode.h create mode 100644 source/blender/compositor/nodes/COM_LensDistortionNode.cpp create mode 100644 source/blender/compositor/nodes/COM_LensDistortionNode.h create mode 100644 source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_LuminanceMatteNode.h create mode 100644 source/blender/compositor/nodes/COM_MapUVNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MapUVNode.h create mode 100644 source/blender/compositor/nodes/COM_MapValueNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MapValueNode.h create mode 100644 source/blender/compositor/nodes/COM_MathNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MathNode.h create mode 100644 source/blender/compositor/nodes/COM_MixNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MixNode.h create mode 100644 source/blender/compositor/nodes/COM_MovieClipNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MovieClipNode.h create mode 100644 source/blender/compositor/nodes/COM_MovieDistortionNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MovieDistortionNode.h create mode 100644 source/blender/compositor/nodes/COM_MuteNode.cpp create mode 100644 source/blender/compositor/nodes/COM_MuteNode.h create mode 100644 source/blender/compositor/nodes/COM_NormalNode.cpp create mode 100644 source/blender/compositor/nodes/COM_NormalNode.h create mode 100644 source/blender/compositor/nodes/COM_NormalizeNode.cpp create mode 100644 source/blender/compositor/nodes/COM_NormalizeNode.h create mode 100644 source/blender/compositor/nodes/COM_OutputFileNode.cpp create mode 100644 source/blender/compositor/nodes/COM_OutputFileNode.h create mode 100644 source/blender/compositor/nodes/COM_RenderLayersNode.cpp create mode 100644 source/blender/compositor/nodes/COM_RenderLayersNode.h create mode 100644 source/blender/compositor/nodes/COM_RotateNode.cpp create mode 100644 source/blender/compositor/nodes/COM_RotateNode.h create mode 100644 source/blender/compositor/nodes/COM_ScaleNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ScaleNode.h create mode 100644 source/blender/compositor/nodes/COM_SeparateHSVANode.cpp create mode 100644 source/blender/compositor/nodes/COM_SeparateHSVANode.h create mode 100644 source/blender/compositor/nodes/COM_SeparateRGBANode.cpp create mode 100644 source/blender/compositor/nodes/COM_SeparateRGBANode.h create mode 100644 source/blender/compositor/nodes/COM_SeparateYCCANode.cpp create mode 100644 source/blender/compositor/nodes/COM_SeparateYCCANode.h create mode 100644 source/blender/compositor/nodes/COM_SeparateYUVANode.cpp create mode 100644 source/blender/compositor/nodes/COM_SeparateYUVANode.h create mode 100644 source/blender/compositor/nodes/COM_SetAlphaNode.cpp create mode 100644 source/blender/compositor/nodes/COM_SetAlphaNode.h create mode 100644 source/blender/compositor/nodes/COM_SocketProxyNode.cpp create mode 100644 source/blender/compositor/nodes/COM_SocketProxyNode.h create mode 100644 source/blender/compositor/nodes/COM_SplitViewerNode.cpp create mode 100644 source/blender/compositor/nodes/COM_SplitViewerNode.h create mode 100644 source/blender/compositor/nodes/COM_Stabilize2dNode.cpp create mode 100644 source/blender/compositor/nodes/COM_Stabilize2dNode.h create mode 100644 source/blender/compositor/nodes/COM_SwitchNode.cpp create mode 100644 source/blender/compositor/nodes/COM_SwitchNode.h create mode 100644 source/blender/compositor/nodes/COM_TextureNode.cpp create mode 100644 source/blender/compositor/nodes/COM_TextureNode.h create mode 100644 source/blender/compositor/nodes/COM_TimeNode.cpp create mode 100644 source/blender/compositor/nodes/COM_TimeNode.h create mode 100644 source/blender/compositor/nodes/COM_TonemapNode.cpp create mode 100644 source/blender/compositor/nodes/COM_TonemapNode.h create mode 100644 source/blender/compositor/nodes/COM_TransformNode.cpp create mode 100644 source/blender/compositor/nodes/COM_TransformNode.h create mode 100644 source/blender/compositor/nodes/COM_TranslateNode.cpp create mode 100644 source/blender/compositor/nodes/COM_TranslateNode.h create mode 100644 source/blender/compositor/nodes/COM_ValueNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ValueNode.h create mode 100644 source/blender/compositor/nodes/COM_VectorBlurNode.cpp create mode 100644 source/blender/compositor/nodes/COM_VectorBlurNode.h create mode 100644 source/blender/compositor/nodes/COM_VectorCurveNode.cpp create mode 100644 source/blender/compositor/nodes/COM_VectorCurveNode.h create mode 100644 source/blender/compositor/nodes/COM_ViewLevelsNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ViewLevelsNode.h create mode 100644 source/blender/compositor/nodes/COM_ViewerNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ViewerNode.h create mode 100644 source/blender/compositor/nodes/COM_ZCombineNode.cpp create mode 100644 source/blender/compositor/nodes/COM_ZCombineNode.h create mode 100644 source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp create mode 100644 source/blender/compositor/operations/COM_AlphaOverKeyOperation.h create mode 100644 source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp create mode 100644 source/blender/compositor/operations/COM_AlphaOverMixedOperation.h create mode 100644 source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp create mode 100644 source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h create mode 100644 source/blender/compositor/operations/COM_AntiAliasOperation.cpp create mode 100644 source/blender/compositor/operations/COM_AntiAliasOperation.h create mode 100644 source/blender/compositor/operations/COM_BilateralBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_BilateralBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_BlurBaseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_BlurBaseOperation.h create mode 100644 source/blender/compositor/operations/COM_BokehBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_BokehBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_BokehImageOperation.cpp create mode 100644 source/blender/compositor/operations/COM_BokehImageOperation.h create mode 100644 source/blender/compositor/operations/COM_BoxMaskOperation.cpp create mode 100644 source/blender/compositor/operations/COM_BoxMaskOperation.h create mode 100644 source/blender/compositor/operations/COM_BrightnessOperation.cpp create mode 100644 source/blender/compositor/operations/COM_BrightnessOperation.h create mode 100644 source/blender/compositor/operations/COM_CalculateMeanOperation.cpp create mode 100644 source/blender/compositor/operations/COM_CalculateMeanOperation.h create mode 100644 source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp create mode 100644 source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h create mode 100644 source/blender/compositor/operations/COM_ChangeHSVOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ChangeHSVOperation.h create mode 100644 source/blender/compositor/operations/COM_ChannelMatteOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ChannelMatteOperation.h create mode 100644 source/blender/compositor/operations/COM_ChromaMatteOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ChromaMatteOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorCorrectionOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorCurveOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorCurveOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorMatteOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorMatteOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorRampOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorRampOperation.h create mode 100644 source/blender/compositor/operations/COM_ColorSpillOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ColorSpillOperation.h create mode 100644 source/blender/compositor/operations/COM_CombineChannelsOperation.cpp create mode 100644 source/blender/compositor/operations/COM_CombineChannelsOperation.h create mode 100644 source/blender/compositor/operations/COM_CompositorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_CompositorOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertColorProfileOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertColorToBWOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertColourToValueProg.h create mode 100644 source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertValueToColourProg.h create mode 100644 source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h create mode 100644 source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ConvolutionFilterOperation.h create mode 100644 source/blender/compositor/operations/COM_CropOperation.cpp create mode 100644 source/blender/compositor/operations/COM_CropOperation.h create mode 100644 source/blender/compositor/operations/COM_CurveBaseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_CurveBaseOperation.h create mode 100644 source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DifferenceMatteOperation.h create mode 100644 source/blender/compositor/operations/COM_DilateErodeOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DilateErodeOperation.h create mode 100644 source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DirectionalBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_DisplaceOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DisplaceOperation.h create mode 100644 source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DisplaceSimpleOperation.h create mode 100644 source/blender/compositor/operations/COM_DistanceMatteOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DistanceMatteOperation.h create mode 100644 source/blender/compositor/operations/COM_DotproductOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DotproductOperation.h create mode 100644 source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp create mode 100644 source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h create mode 100644 source/blender/compositor/operations/COM_EllipseMaskOperation.cpp create mode 100644 source/blender/compositor/operations/COM_EllipseMaskOperation.h create mode 100644 source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_FastGaussianBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_FlipOperation.cpp create mode 100644 source/blender/compositor/operations/COM_FlipOperation.h create mode 100644 source/blender/compositor/operations/COM_FogGlowImageOperation.cpp create mode 100644 source/blender/compositor/operations/COM_FogGlowImageOperation.h create mode 100644 source/blender/compositor/operations/COM_GammaCorrectOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GammaCorrectOperation.h create mode 100644 source/blender/compositor/operations/COM_GammaOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GammaOperation.h create mode 100644 source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GaussianXBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GaussianYBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_GlareBaseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GlareBaseOperation.h create mode 100644 source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GlareSimpleStarOperation.h create mode 100644 source/blender/compositor/operations/COM_GlareStreaksOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GlareStreaksOperation.h create mode 100644 source/blender/compositor/operations/COM_GlareThresholdOperation.cpp create mode 100644 source/blender/compositor/operations/COM_GlareThresholdOperation.h create mode 100644 source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp create mode 100644 source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h create mode 100644 source/blender/compositor/operations/COM_IDMaskOperation.cpp create mode 100644 source/blender/compositor/operations/COM_IDMaskOperation.h create mode 100644 source/blender/compositor/operations/COM_ImageOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ImageOperation.h create mode 100644 source/blender/compositor/operations/COM_InvertOperation.cpp create mode 100644 source/blender/compositor/operations/COM_InvertOperation.h create mode 100644 source/blender/compositor/operations/COM_LensGhostOperation.cpp create mode 100644 source/blender/compositor/operations/COM_LensGhostOperation.h create mode 100644 source/blender/compositor/operations/COM_LensGlowImageOperation.cpp create mode 100644 source/blender/compositor/operations/COM_LensGlowImageOperation.h create mode 100644 source/blender/compositor/operations/COM_LensGlowOperation.cpp create mode 100644 source/blender/compositor/operations/COM_LensGlowOperation.h create mode 100644 source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp create mode 100644 source/blender/compositor/operations/COM_LuminanceMatteOperation.h create mode 100644 source/blender/compositor/operations/COM_MapUVOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MapUVOperation.h create mode 100644 source/blender/compositor/operations/COM_MapValueOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MapValueOperation.h create mode 100644 source/blender/compositor/operations/COM_MathBaseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MathBaseOperation.h create mode 100644 source/blender/compositor/operations/COM_MixAddOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixAddOperation.h create mode 100644 source/blender/compositor/operations/COM_MixBaseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixBaseOperation.h create mode 100644 source/blender/compositor/operations/COM_MixBlendOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixBlendOperation.h create mode 100644 source/blender/compositor/operations/COM_MixBurnOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixBurnOperation.h create mode 100644 source/blender/compositor/operations/COM_MixColorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixColorOperation.h create mode 100644 source/blender/compositor/operations/COM_MixDarkenOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixDarkenOperation.h create mode 100644 source/blender/compositor/operations/COM_MixDifferenceOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixDifferenceOperation.h create mode 100644 source/blender/compositor/operations/COM_MixDivideOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixDivideOperation.h create mode 100644 source/blender/compositor/operations/COM_MixDodgeOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixDodgeOperation.h create mode 100644 source/blender/compositor/operations/COM_MixHueOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixHueOperation.h create mode 100644 source/blender/compositor/operations/COM_MixLightenOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixLightenOperation.h create mode 100644 source/blender/compositor/operations/COM_MixLinearLightOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixLinearLightOperation.h create mode 100644 source/blender/compositor/operations/COM_MixMultiplyOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixMultiplyOperation.h create mode 100644 source/blender/compositor/operations/COM_MixOverlayOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixOverlayOperation.h create mode 100644 source/blender/compositor/operations/COM_MixSaturationOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixSaturationOperation.h create mode 100644 source/blender/compositor/operations/COM_MixScreenOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixScreenOperation.h create mode 100644 source/blender/compositor/operations/COM_MixSoftLightOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixSoftLightOperation.h create mode 100644 source/blender/compositor/operations/COM_MixSubtractOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixSubtractOperation.h create mode 100644 source/blender/compositor/operations/COM_MixValueOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MixValueOperation.h create mode 100644 source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MovieClipAttributeOperation.h create mode 100644 source/blender/compositor/operations/COM_MovieClipOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MovieClipOperation.h create mode 100644 source/blender/compositor/operations/COM_MovieDistortionOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MovieDistortionOperation.h create mode 100644 source/blender/compositor/operations/COM_MultilayerImageOperation.cpp create mode 100644 source/blender/compositor/operations/COM_MultilayerImageOperation.h create mode 100644 source/blender/compositor/operations/COM_NormalizeOperation.cpp create mode 100644 source/blender/compositor/operations/COM_NormalizeOperation.h create mode 100644 source/blender/compositor/operations/COM_OpenCLKernels.cl create mode 100644 source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp create mode 100644 source/blender/compositor/operations/COM_OutputFileOperation.cpp create mode 100644 source/blender/compositor/operations/COM_OutputFileOperation.h create mode 100644 source/blender/compositor/operations/COM_PreviewOperation.cpp create mode 100644 source/blender/compositor/operations/COM_PreviewOperation.h create mode 100644 source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h create mode 100644 source/blender/compositor/operations/COM_QualityStepHelper.cpp create mode 100644 source/blender/compositor/operations/COM_QualityStepHelper.h create mode 100644 source/blender/compositor/operations/COM_ReadBufferOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ReadBufferOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersAOOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersAlphaProg.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersBaseProg.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersColorOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersCyclesOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersDepthProg.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersEmitOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersImageProg.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersImageProg.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersIndirectOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersMistOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersNormalOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersReflectionOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersRefractionOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersShadowOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersSpecularOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersSpeedOperation.h create mode 100644 source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RenderLayersUVOperation.h create mode 100644 source/blender/compositor/operations/COM_RotateOperation.cpp create mode 100644 source/blender/compositor/operations/COM_RotateOperation.h create mode 100644 source/blender/compositor/operations/COM_ScaleOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ScaleOperation.h create mode 100644 source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h create mode 100644 source/blender/compositor/operations/COM_SeparateChannelOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SeparateChannelOperation.h create mode 100644 source/blender/compositor/operations/COM_SetAlphaOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SetAlphaOperation.h create mode 100644 source/blender/compositor/operations/COM_SetColorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SetColorOperation.h create mode 100644 source/blender/compositor/operations/COM_SetSamplerOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SetSamplerOperation.h create mode 100644 source/blender/compositor/operations/COM_SetValueOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SetValueOperation.h create mode 100644 source/blender/compositor/operations/COM_SetVectorOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SetVectorOperation.h create mode 100644 source/blender/compositor/operations/COM_SocketProxyOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SocketProxyOperation.h create mode 100644 source/blender/compositor/operations/COM_SplitViewerOperation.cpp create mode 100644 source/blender/compositor/operations/COM_SplitViewerOperation.h create mode 100644 source/blender/compositor/operations/COM_TextureOperation.cpp create mode 100644 source/blender/compositor/operations/COM_TextureOperation.h create mode 100644 source/blender/compositor/operations/COM_TonemapOperation.cpp create mode 100644 source/blender/compositor/operations/COM_TonemapOperation.h create mode 100644 source/blender/compositor/operations/COM_TranslateOperation.cpp create mode 100644 source/blender/compositor/operations/COM_TranslateOperation.h create mode 100644 source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_VectorBlurOperation.cpp create mode 100644 source/blender/compositor/operations/COM_VectorBlurOperation.h create mode 100644 source/blender/compositor/operations/COM_VectorCurveOperation.cpp create mode 100644 source/blender/compositor/operations/COM_VectorCurveOperation.h create mode 100644 source/blender/compositor/operations/COM_ViewerBaseOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ViewerBaseOperation.h create mode 100644 source/blender/compositor/operations/COM_ViewerOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ViewerOperation.h create mode 100644 source/blender/compositor/operations/COM_WriteBufferOperation.cpp create mode 100644 source/blender/compositor/operations/COM_WriteBufferOperation.h create mode 100644 source/blender/compositor/operations/COM_ZCombineOperation.cpp create mode 100644 source/blender/compositor/operations/COM_ZCombineOperation.h create mode 100644 source/blender/nodes/composite/nodes/node_composite_bokehblur.c create mode 100644 source/blender/nodes/composite/nodes/node_composite_bokehimage.c create mode 100644 source/blender/nodes/composite/nodes/node_composite_boxmask.c create mode 100644 source/blender/nodes/composite/nodes/node_composite_colorcorrection.c create mode 100644 source/blender/nodes/composite/nodes/node_composite_ellipsemask.c create mode 100644 source/blender/nodes/composite/nodes/node_composite_switch.c create mode 100644 source/blender/opencl/CMakeLists.txt create mode 100644 source/blender/opencl/OCL_opencl.h create mode 100644 source/blender/opencl/SConscript create mode 100644 source/blender/opencl/intern/OCL_opencl.c create mode 100644 source/blender/opencl/intern/clew.c create mode 100644 source/blender/opencl/intern/clew.h diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index 0114f33928a..11c258ef689 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -205,5 +205,25 @@ class NODE_PT_properties(Panel): col.prop(snode, "backdrop_y", text="Y") col.operator("node.backimage_move", text="Move") +class NODE_PT_quality(bpy.types.Panel): + bl_space_type = 'NODE_EDITOR' + bl_region_type = 'UI' + bl_label = "Quality" + + @classmethod + def poll(cls, context): + snode = context.space_data + return snode.tree_type == 'COMPOSITING' and snode.node_tree is not None + + def draw(self, context): + layout = self.layout + snode = context.space_data + tree = snode.node_tree + + layout.prop(tree, "render_quality", text="Render") + layout.prop(tree, "edit_quality", text="Edit") + layout.prop(tree, "chunksize") + layout.prop(tree, "use_opencl") + if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index cb17a87fd76..e0fd33d1316 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -94,11 +94,13 @@ add_subdirectory(blenkernel) add_subdirectory(blenlib) add_subdirectory(bmesh) add_subdirectory(render) +add_subdirectory(compositor) add_subdirectory(blenfont) add_subdirectory(blenloader) add_subdirectory(blenpluginapi) add_subdirectory(ikplugin) add_subdirectory(gpu) +add_subdirectory(opencl) add_subdirectory(imbuf) add_subdirectory(avi) add_subdirectory(nodes) diff --git a/source/blender/SConscript b/source/blender/SConscript index c3a7089f425..411a04528c5 100644 --- a/source/blender/SConscript +++ b/source/blender/SConscript @@ -9,9 +9,11 @@ SConscript(['avi/SConscript', 'blenloader/SConscript', 'blenpluginapi/SConscript', 'gpu/SConscript', + 'opencl/SConscript', 'editors/SConscript', 'imbuf/SConscript', 'makesdna/SConscript', + 'compositor/SConscript', 'render/SConscript', 'nodes/SConscript', 'modifiers/SConscript', diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 68b3e01b9ff..a6018a45821 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -145,9 +145,13 @@ typedef struct bNodeType { 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); + /// Additional drawing on backdrop. + void (*uibackdropfunc)(struct SpaceNode* snode, struct ImBuf* backdrop, struct bNode* node, int x, int y); + /// Draw a node socket. Default draws the input value button. NodeSocketButtonFunction drawinputfunc; NodeSocketButtonFunction drawoutputfunc; + /// Optional custom label function for the node header. const char *(*labelfunc)(struct bNode *); /// Optional custom resize handle polling. @@ -647,6 +651,13 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define CMP_NODE_TONEMAP 302 #define CMP_NODE_LENSDIST 303 +#define CMP_NODE_COLORCORRECTION 312 +#define CMP_NODE_MASK_BOX 313 +#define CMP_NODE_MASK_ELLIPSE 314 +#define CMP_NODE_BOKEHIMAGE 315 +#define CMP_NODE_BOKEHBLUR 316 +#define CMP_NODE_SWITCH 317 + /* channel toggles */ #define CMP_CHAN_RGB 1 #define CMP_CHAN_A 2 @@ -674,7 +685,7 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); 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 ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews); void ntreeCompositTagRender(struct Scene *sce); int ntreeCompositTagAnimated(struct bNodeTree *ntree); void ntreeCompositTagGenerators(struct bNodeTree *ntree); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index a25cd0d3b38..c6424580a31 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1930,6 +1930,13 @@ static void registerCompositNodes(bNodeTreeType *ttype) register_node_type_cmp_transform(ttype); register_node_type_cmp_stabilize2d(ttype); register_node_type_cmp_moviedistortion(ttype); + + register_node_type_cmp_colorcorrection(ttype); + register_node_type_cmp_boxmask(ttype); + register_node_type_cmp_ellipsemask(ttype); + register_node_type_cmp_bokehimage(ttype); + register_node_type_cmp_bokehblur(ttype); + register_node_type_cmp_switch(ttype); } static void registerShaderNodes(bNodeTreeType *ttype) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index f57310dab74..2e023868e45 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -7402,6 +7402,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if (main->versionfile < 263) { + /* Default for old files is to save particle rotations to pointcache */ + ParticleSettings *part; + for (part = main->particle.first; part; part = part->id.next) + part->flag |= PART_ROTATIONS; { /* Default for old files is to save particle rotations to pointcache */ ParticleSettings *part; @@ -7419,6 +7423,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main) for (ntree = main->nodetree.first; ntree; ntree=ntree->id.next) do_versions_nodetree_multi_file_output_path_2_64_0(ntree); } + + + } if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 3)) { @@ -7525,7 +7532,15 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* 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! */ - + { + Scene *scene; + // composite redesign + for (scene=main->scene.first; scene; scene=scene->id.next) + if (scene->nodetree) + if ( scene->nodetree->chunksize == 0) { + scene->nodetree->chunksize = 256; + } + } /* don't forget to set version number in blender.c! */ } diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt new file mode 100644 index 00000000000..6c26c481977 --- /dev/null +++ b/source/blender/compositor/CMakeLists.txt @@ -0,0 +1,607 @@ +# $Id: CMakeLists.txt 14444 2008-04-16 22:40:48Z hos $ +# ***** 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. +# +# The Original Code is: all of this file. +# +# Contributor(s): Jeroen Bakker, Monique Dewanchand, Blender Developers Fund. +# +# ***** END GPL LICENSE BLOCK ***** + +set(INC + . + ../blenkernel + ../blenlib + ../makesdna + ../render/extern/include + ../render/intern/include + ../makesrna + ../blenloader + ../blenlib + ../windowmanager + ../imbuf + ../../../intern/guardedalloc + nodes + ../nodes/ + ../nodes/composite + ../nodes/intern + intern + operations + ../opencl +) + +set(SRC + COM_compositor.h + COM_defines.h + + intern/COM_compositor.cpp + intern/COM_ExecutionSystem.cpp + intern/COM_ExecutionSystem.h + intern/COM_ExecutionSystemHelper.cpp + intern/COM_ExecutionSystemHelper.h + intern/COM_Converter.cpp + intern/COM_Converter.h + intern/COM_ExecutionGroup.cpp + intern/COM_ExecutionGroup.h + intern/COM_Node.cpp + intern/COM_Node.h + intern/COM_NodeBase.cpp + intern/COM_NodeBase.h + intern/COM_NodeOperation.cpp + intern/COM_NodeOperation.h + intern/COM_Socket.cpp + intern/COM_Socket.h + intern/COM_SocketReader.cpp + intern/COM_SocketReader.h + intern/COM_InputSocket.cpp + intern/COM_InputSocket.h + intern/COM_OutputSocket.cpp + intern/COM_OutputSocket.h + intern/COM_SocketConnection.cpp + intern/COM_SocketConnection.h + intern/COM_MemoryProxy.cpp + intern/COM_MemoryProxy.h + intern/COM_MemoryBuffer.cpp + intern/COM_MemoryBuffer.h + intern/COM_MemoryManager.cpp + intern/COM_MemoryManager.h + intern/COM_MemoryManagerState.cpp + intern/COM_MemoryManagerState.h + intern/COM_WorkScheduler.cpp + intern/COM_WorkScheduler.h + intern/COM_WorkPackage.cpp + intern/COM_WorkPackage.h + intern/COM_ChunkOrder.cpp + intern/COM_ChunkOrder.h + intern/COM_ChunkOrderHotspot.cpp + intern/COM_ChunkOrderHotspot.h + intern/COM_Device.cpp + intern/COM_Device.h + intern/COM_CPUDevice.cpp + intern/COM_CPUDevice.h + intern/COM_OpenCLDevice.cpp + intern/COM_OpenCLDevice.h + intern/COM_CompositorContext.cpp + intern/COM_CompositorContext.h + intern/COM_ChannelInfo.cpp + intern/COM_ChannelInfo.h + operations/COM_QualityStepHelper.h + operations/COM_QualityStepHelper.cpp + +# Internal nodes + nodes/COM_MuteNode.cpp + nodes/COM_MuteNode.h + nodes/COM_GroupNode.cpp + nodes/COM_GroupNode.h + nodes/COM_SocketProxyNode.cpp + nodes/COM_SocketProxyNode.h + +# input nodes + nodes/COM_RenderLayersNode.cpp + nodes/COM_RenderLayersNode.h + nodes/COM_ImageNode.cpp + nodes/COM_ImageNode.h + nodes/COM_TextureNode.cpp + nodes/COM_TextureNode.h + nodes/COM_BokehImageNode.cpp + nodes/COM_BokehImageNode.h + nodes/COM_ColorNode.cpp + nodes/COM_ColorNode.h + nodes/COM_ValueNode.cpp + nodes/COM_ValueNode.h + nodes/COM_TimeNode.cpp + nodes/COM_TimeNode.h + nodes/COM_SwitchNode.cpp + nodes/COM_SwitchNode.h + nodes/COM_MovieClipNode.cpp + nodes/COM_MovieClipNode.h + nodes/COM_OutputFileNode.cpp + nodes/COM_OutputFileNode.h + +# output nodes + nodes/COM_CompositorNode.cpp + nodes/COM_CompositorNode.h + nodes/COM_ViewerNode.cpp + nodes/COM_ViewerNode.h + nodes/COM_SplitViewerNode.cpp + nodes/COM_SplitViewerNode.h + nodes/COM_ViewLevelsNode.cpp + nodes/COM_ViewLevelsNode.h + operations/COM_CalculateStandardDeviationOperation.cpp + operations/COM_CalculateStandardDeviationOperation.h + operations/COM_CalculateMeanOperation.cpp + operations/COM_CalculateMeanOperation.h + +# distort nodes + nodes/COM_TranslateNode.cpp + nodes/COM_TranslateNode.h + nodes/COM_ScaleNode.cpp + nodes/COM_ScaleNode.h + nodes/COM_RotateNode.cpp + nodes/COM_RotateNode.h + nodes/COM_FlipNode.cpp + nodes/COM_FlipNode.h + + nodes/COM_MapUVNode.cpp + nodes/COM_MapUVNode.h + nodes/COM_DisplaceNode.cpp + nodes/COM_DisplaceNode.h + + nodes/COM_DifferenceMatteNode.cpp + nodes/COM_DifferenceMatteNode.h + nodes/COM_LuminanceMatteNode.cpp + nodes/COM_LuminanceMatteNode.h + nodes/COM_DistanceMatteNode.cpp + nodes/COM_DistanceMatteNode.h + nodes/COM_ChromaMatteNode.cpp + nodes/COM_ChromaMatteNode.h + nodes/COM_ColorMatteNode.cpp + nodes/COM_ColorMatteNode.h + nodes/COM_ChannelMatteNode.cpp + nodes/COM_ChannelMatteNode.h + nodes/COM_LensDistortionNode.cpp + nodes/COM_LensDistortionNode.h + + nodes/COM_GlareNode.cpp + nodes/COM_GlareNode.h + + nodes/COM_CropNode.cpp + nodes/COM_CropNode.h + operations/COM_CropOperation.cpp + operations/COM_CropOperation.h + + operations/COM_LensGlowOperation.cpp + operations/COM_LensGlowOperation.h + operations/COM_LensGhostOperation.cpp + operations/COM_LensGhostOperation.h + nodes/COM_TransformNode.cpp + nodes/COM_TransformNode.h + nodes/COM_Stabilize2dNode.cpp + nodes/COM_Stabilize2dNode.h + nodes/COM_MovieDistortionNode.cpp + nodes/COM_MovieDistortionNode.h + nodes/COM_DefocusNode.cpp + nodes/COM_DefocusNode.h + +# color nodes + nodes/COM_VectorCurveNode.cpp + nodes/COM_VectorCurveNode.h + nodes/COM_ColorCurveNode.cpp + nodes/COM_ColorCurveNode.h + nodes/COM_ColorToBWNode.cpp + nodes/COM_ColorToBWNode.h + nodes/COM_ColorRampNode.cpp + nodes/COM_ColorRampNode.h + nodes/COM_MixNode.cpp + nodes/COM_MixNode.h + nodes/COM_AlphaOverNode.cpp + nodes/COM_AlphaOverNode.h + nodes/COM_ZCombineNode.cpp + nodes/COM_ZCombineNode.h + nodes/COM_BrightnessNode.cpp + nodes/COM_BrightnessNode.h + nodes/COM_ColorBalanceNode.cpp + nodes/COM_ColorBalanceNode.h + nodes/COM_InvertNode.cpp + nodes/COM_InvertNode.h + nodes/COM_GammaNode.cpp + nodes/COM_GammaNode.h + nodes/COM_SetAlphaNode.cpp + nodes/COM_SetAlphaNode.h + nodes/COM_ConvertAlphaNode.cpp + nodes/COM_ConvertAlphaNode.h + nodes/COM_AlphaOverNode.cpp + nodes/COM_AlphaOverNode.h + nodes/COM_HueSaturationValueNode.cpp + nodes/COM_HueSaturationValueNode.h + nodes/COM_HueSaturationValueCorrectNode.cpp + nodes/COM_HueSaturationValueCorrectNode.h + nodes/COM_ColorCorrectionNode.cpp + nodes/COM_ColorCorrectionNode.h + nodes/COM_TonemapNode.cpp + nodes/COM_TonemapNode.h + operations/COM_TonemapOperation.cpp + operations/COM_TonemapOperation.h + +# converter nodes + nodes/COM_IDMaskNode.cpp + nodes/COM_IDMaskNode.h + nodes/COM_SeparateRGBANode.cpp + nodes/COM_SeparateRGBANode.h + nodes/COM_CombineRGBANode.cpp + nodes/COM_CombineRGBANode.h + nodes/COM_SeparateHSVANode.cpp + nodes/COM_SeparateHSVANode.h + nodes/COM_CombineHSVANode.cpp + nodes/COM_CombineHSVANode.h + nodes/COM_SeparateYUVANode.cpp + nodes/COM_SeparateYUVANode.h + nodes/COM_CombineYUVANode.cpp + nodes/COM_CombineYUVANode.h + nodes/COM_SeparateYCCANode.cpp + nodes/COM_SeparateYCCANode.h + nodes/COM_CombineYCCANode.cpp + nodes/COM_CombineYCCANode.h + + nodes/COM_NormalNode.cpp + nodes/COM_NormalNode.h + nodes/COM_NormalizeNode.cpp + nodes/COM_NormalizeNode.h + nodes/COM_MathNode.cpp + nodes/COM_MathNode.h + nodes/COM_MapValueNode.cpp + nodes/COM_MapValueNode.h + + operations/COM_NormalizeOperation.cpp + operations/COM_NormalizeOperation.h + +# Filter nodes + nodes/COM_BilateralBlurNode.cpp + nodes/COM_BilateralBlurNode.h + operations/COM_BilateralBlurOperation.cpp + operations/COM_BilateralBlurOperation.h + nodes/COM_VectorBlurNode.cpp + nodes/COM_VectorBlurNode.h + operations/COM_VectorBlurOperation.cpp + operations/COM_VectorBlurOperation.h + + + + nodes/COM_FilterNode.cpp + nodes/COM_FilterNode.h + nodes/COM_DilateErodeNode.cpp + nodes/COM_DilateErodeNode.h + nodes/COM_BlurNode.cpp + nodes/COM_BlurNode.h + nodes/COM_BokehBlurNode.cpp + nodes/COM_BokehBlurNode.h + nodes/COM_DirectionalBlurNode.cpp + nodes/COM_DirectionalBlurNode.h + operations/COM_GaussianXBlurOperation.cpp + operations/COM_GaussianXBlurOperation.h + operations/COM_GaussianYBlurOperation.cpp + operations/COM_GaussianYBlurOperation.h + operations/COM_GaussianBokehBlurOperation.cpp + operations/COM_GaussianBokehBlurOperation.h + operations/COM_BokehBlurOperation.cpp + operations/COM_BokehBlurOperation.h + operations/COM_VariableSizeBokehBlurOperation.cpp + operations/COM_VariableSizeBokehBlurOperation.h + operations/COM_FastGaussianBlurOperation.cpp + operations/COM_FastGaussianBlurOperation.h + operations/COM_BlurBaseOperation.cpp + operations/COM_BlurBaseOperation.h + operations/COM_DirectionalBlurOperation.cpp + operations/COM_DirectionalBlurOperation.h + operations/COM_MovieClipAttributeOperation.cpp + operations/COM_MovieClipAttributeOperation.h + operations/COM_MovieDistortionOperation.cpp + operations/COM_MovieDistortionOperation.h + operations/COM_GammaCorrectOperation.h + operations/COM_GammaCorrectOperation.cpp + +# Matte nodes + nodes/COM_BoxMaskNode.cpp + nodes/COM_BoxMaskNode.h + nodes/COM_EllipseMaskNode.cpp + nodes/COM_EllipseMaskNode.h + nodes/COM_ColorSpillNode.cpp + nodes/COM_ColorSpillNode.h + nodes/COM_DoubleEdgeMaskNode.cpp + nodes/COM_DoubleEdgeMaskNode.h + + operations/COM_DoubleEdgeMaskOperation.cpp + operations/COM_DoubleEdgeMaskOperation.h +operations/COM_ColorSpillOperation.cpp +operations/COM_ColorSpillOperation.h + operations/COM_RenderLayersBaseProg.cpp + operations/COM_RenderLayersBaseProg.h + operations/COM_RenderLayersImageProg.cpp + operations/COM_RenderLayersImageProg.h + operations/COM_RenderLayersAlphaProg.cpp + operations/COM_RenderLayersAlphaProg.h + operations/COM_RenderLayersDepthProg.cpp + operations/COM_RenderLayersDepthProg.h + operations/COM_RenderLayersNormalOperation.cpp + operations/COM_RenderLayersNormalOperation.h + operations/COM_RenderLayersSpeedOperation.cpp + operations/COM_RenderLayersSpeedOperation.h + operations/COM_RenderLayersColorOperation.cpp + operations/COM_RenderLayersColorOperation.h + operations/COM_RenderLayersUVOperation.cpp + operations/COM_RenderLayersUVOperation.h + operations/COM_RenderLayersMistOperation.cpp + operations/COM_RenderLayersMistOperation.h + operations/COM_RenderLayersObjectIndexOperation.cpp + operations/COM_RenderLayersObjectIndexOperation.h + operations/COM_RenderLayersMaterialIndexOperation.cpp + operations/COM_RenderLayersMaterialIndexOperation.h + operations/COM_RenderLayersDiffuseOperation.cpp + operations/COM_RenderLayersDiffuseOperation.h + operations/COM_RenderLayersSpecularOperation.cpp + operations/COM_RenderLayersSpecularOperation.h + operations/COM_RenderLayersShadowOperation.cpp + operations/COM_RenderLayersShadowOperation.h + operations/COM_RenderLayersAOOperation.cpp + operations/COM_RenderLayersAOOperation.h + operations/COM_RenderLayersEmitOperation.cpp + operations/COM_RenderLayersEmitOperation.h + operations/COM_RenderLayersReflectionOperation.cpp + operations/COM_RenderLayersReflectionOperation.h + operations/COM_RenderLayersRefractionOperation.cpp + operations/COM_RenderLayersRefractionOperation.h + operations/COM_RenderLayersEnvironmentOperation.cpp + operations/COM_RenderLayersEnvironmentOperation.h + operations/COM_RenderLayersIndirectOperation.cpp + operations/COM_RenderLayersIndirectOperation.h + operations/COM_RenderLayersCyclesOperation.cpp + operations/COM_RenderLayersCyclesOperation.h + +operations/COM_ImageOperation.cpp +operations/COM_ImageOperation.h +operations/COM_MultilayerImageOperation.cpp +operations/COM_MultilayerImageOperation.h +operations/COM_TextureOperation.cpp +operations/COM_TextureOperation.h +operations/COM_BokehImageOperation.cpp +operations/COM_BokehImageOperation.h +operations/COM_LensGlowImageOperation.cpp +operations/COM_LensGlowImageOperation.h + + + operations/COM_SocketProxyOperation.h + operations/COM_SocketProxyOperation.cpp + + operations/COM_CompositorOperation.h + operations/COM_CompositorOperation.cpp + operations/COM_OutputFileOperation.h + operations/COM_OutputFileOperation.cpp + operations/COM_ViewerBaseOperation.h + operations/COM_ViewerBaseOperation.cpp + operations/COM_ViewerOperation.h + operations/COM_ViewerOperation.cpp + operations/COM_PreviewOperation.h + operations/COM_PreviewOperation.cpp + operations/COM_SplitViewerOperation.h + operations/COM_SplitViewerOperation.cpp + operations/COM_ConvertValueToColourProg.h + operations/COM_ConvertValueToColourProg.cpp + operations/COM_ConvertColourToValueProg.h + operations/COM_ConvertColourToValueProg.cpp + operations/COM_ConvertColorToBWOperation.h + operations/COM_ConvertColorToBWOperation.cpp + operations/COM_ConvertColorToVectorOperation.h + operations/COM_ConvertColorToVectorOperation.cpp + operations/COM_ConvertValueToVectorOperation.h + operations/COM_ConvertValueToVectorOperation.cpp + operations/COM_ConvertVectorToColorOperation.h + operations/COM_ConvertVectorToColorOperation.cpp + operations/COM_ConvertVectorToValueOperation.h + operations/COM_ConvertVectorToValueOperation.cpp +operations/COM_ConvertDepthToRadiusOperation.h +operations/COM_ConvertDepthToRadiusOperation.cpp + operations/COM_ZCombineOperation.cpp + operations/COM_ZCombineOperation.h + + operations/COM_ConvertRGBToYCCOperation.h + operations/COM_ConvertRGBToYCCOperation.cpp + operations/COM_ConvertYCCToRGBOperation.h + operations/COM_ConvertYCCToRGBOperation.cpp + operations/COM_ConvertRGBToYUVOperation.h + operations/COM_ConvertRGBToYUVOperation.cpp + operations/COM_ConvertYUVToRGBOperation.h + operations/COM_ConvertYUVToRGBOperation.cpp + operations/COM_ConvertRGBToHSVOperation.h + operations/COM_ConvertRGBToHSVOperation.cpp + operations/COM_ConvertHSVToRGBOperation.h + operations/COM_ConvertHSVToRGBOperation.cpp + operations/COM_ChangeHSVOperation.h + operations/COM_ChangeHSVOperation.cpp + operations/COM_ColorCurveOperation.h + operations/COM_ColorCurveOperation.cpp + operations/COM_ColorRampOperation.h + operations/COM_ColorRampOperation.cpp + operations/COM_VectorCurveOperation.h + operations/COM_VectorCurveOperation.cpp + operations/COM_CurveBaseOperation.h + operations/COM_CurveBaseOperation.cpp + operations/COM_HueSaturationValueCorrectOperation.cpp + operations/COM_HueSaturationValueCorrectOperation.h + operations/COM_DifferenceMatteOperation.cpp + operations/COM_DifferenceMatteOperation.h + operations/COM_LuminanceMatteOperation.cpp + operations/COM_LuminanceMatteOperation.h + operations/COM_DistanceMatteOperation.cpp + operations/COM_DistanceMatteOperation.h + operations/COM_ChromaMatteOperation.cpp + operations/COM_ChromaMatteOperation.h + operations/COM_ColorMatteOperation.cpp + operations/COM_ColorMatteOperation.h + operations/COM_ChannelMatteOperation.cpp + operations/COM_ChannelMatteOperation.h + operations/COM_ConvertPremulToKeyOperation.cpp + operations/COM_ConvertPremulToKeyOperation.h + operations/COM_ConvertKeyToPremulOperation.cpp + operations/COM_ConvertKeyToPremulOperation.h + + operations/COM_ReadBufferOperation.cpp + operations/COM_ReadBufferOperation.h + operations/COM_WriteBufferOperation.cpp + operations/COM_WriteBufferOperation.h + operations/COM_MixBaseOperation.h + operations/COM_MixBaseOperation.cpp + operations/COM_MixBlendOperation.cpp + operations/COM_MixBlendOperation.h + operations/COM_MixAddOperation.h + operations/COM_MixAddOperation.cpp + operations/COM_MixMultiplyOperation.h + operations/COM_MixMultiplyOperation.cpp + operations/COM_BrightnessOperation.cpp + operations/COM_BrightnessOperation.h + operations/COM_GammaOperation.cpp + operations/COM_GammaOperation.h + operations/COM_ColorCorrectionOperation.cpp + operations/COM_ColorCorrectionOperation.h + operations/COM_SetValueOperation.h + operations/COM_SetValueOperation.cpp + operations/COM_SetColorOperation.h + operations/COM_SetColorOperation.cpp + operations/COM_SetVectorOperation.h + operations/COM_SetVectorOperation.cpp + + operations/COM_MixBurnOperation.h + operations/COM_MixBurnOperation.cpp + operations/COM_MixColorOperation.h + operations/COM_MixColorOperation.cpp + operations/COM_MixDarkenOperation.h + operations/COM_MixDarkenOperation.cpp + operations/COM_MixDodgeOperation.h + operations/COM_MixDodgeOperation.cpp + operations/COM_MixDifferenceOperation.h + operations/COM_MixDifferenceOperation.cpp + operations/COM_MixDivideOperation.h + operations/COM_MixDivideOperation.cpp + operations/COM_MixHueOperation.h + operations/COM_MixHueOperation.cpp + operations/COM_MixLightenOperation.h + operations/COM_MixLightenOperation.cpp + operations/COM_MixLinearLightOperation.h + operations/COM_MixLinearLightOperation.cpp + operations/COM_MixOverlayOperation.h + operations/COM_MixOverlayOperation.cpp + operations/COM_MixSaturationOperation.h + operations/COM_MixSaturationOperation.cpp + operations/COM_MixScreenOperation.h + operations/COM_MixScreenOperation.cpp + operations/COM_MixSoftLightOperation.h + operations/COM_MixSoftLightOperation.cpp + operations/COM_MixValueOperation.h + operations/COM_MixValueOperation.cpp + operations/COM_MixSubtractOperation.h + operations/COM_MixSubtractOperation.cpp + + operations/COM_MathBaseOperation.h + operations/COM_MathBaseOperation.cpp + + operations/COM_AlphaOverMixedOperation.h + operations/COM_AlphaOverMixedOperation.cpp + operations/COM_AlphaOverPremultiplyOperation.h + operations/COM_AlphaOverPremultiplyOperation.cpp + operations/COM_AlphaOverKeyOperation.h + operations/COM_AlphaOverKeyOperation.cpp + + operations/COM_ColorBalanceLGGOperation.h + operations/COM_ColorBalanceLGGOperation.cpp + operations/COM_ColorBalanceASCCDLOperation.h + operations/COM_ColorBalanceASCCDLOperation.cpp + operations/COM_InvertOperation.cpp + operations/COM_InvertOperation.h + operations/COM_SetAlphaOperation.cpp + operations/COM_SetAlphaOperation.h + operations/COM_MapValueOperation.cpp + operations/COM_MapValueOperation.h + +# Distort operation + operations/COM_TranslateOperation.h + operations/COM_TranslateOperation.cpp + operations/COM_RotateOperation.h + operations/COM_RotateOperation.cpp + operations/COM_ScaleOperation.h + operations/COM_ScaleOperation.cpp + operations/COM_MapUVOperation.h + operations/COM_MapUVOperation.cpp + operations/COM_DisplaceOperation.h + operations/COM_DisplaceOperation.cpp + operations/COM_DisplaceSimpleOperation.h + operations/COM_DisplaceSimpleOperation.cpp + operations/COM_FlipOperation.h + operations/COM_FlipOperation.cpp + operations/COM_ProjectorLensDistortionOperation.cpp + operations/COM_ProjectorLensDistortionOperation.h + operations/COM_ScreenLensDistortionOperation.cpp + operations/COM_ScreenLensDistortionOperation.h + +#Filter operations + operations/COM_ConvolutionFilterOperation.h + operations/COM_ConvolutionFilterOperation.cpp + operations/COM_ConvolutionEdgeFilterOperation.h + operations/COM_ConvolutionEdgeFilterOperation.cpp + operations/COM_DilateErodeOperation.cpp + operations/COM_DilateErodeOperation.h + operations/COM_FogGlowImageOperation.cpp + operations/COM_FogGlowImageOperation.h + operations/COM_GlareThresholdOperation.cpp + operations/COM_GlareThresholdOperation.h + operations/COM_GlareBaseOperation.cpp + operations/COM_GlareBaseOperation.h + operations/COM_GlareSimpleStarOperation.cpp + operations/COM_GlareSimpleStarOperation.h + operations/COM_GlareStreaksOperation.cpp + operations/COM_GlareStreaksOperation.h + operations/COM_SetSamplerOperation.cpp + operations/COM_SetSamplerOperation.h + + +#Convert operations + operations/COM_IDMaskOperation.cpp + operations/COM_IDMaskOperation.h + + operations/COM_SeparateChannelOperation.cpp + operations/COM_SeparateChannelOperation.h + operations/COM_CombineChannelsOperation.cpp + operations/COM_CombineChannelsOperation.h + + operations/COM_DotproductOperation.cpp + operations/COM_DotproductOperation.h +# Matte operation + operations/COM_BoxMaskOperation.h + operations/COM_BoxMaskOperation.cpp + operations/COM_EllipseMaskOperation.h + operations/COM_EllipseMaskOperation.cpp + + operations/COM_MovieClipOperation.cpp + operations/COM_MovieClipOperation.h + operations/COM_ConvertColorProfileOperation.cpp + operations/COM_ConvertColorProfileOperation.h + + operations/COM_AntiAliasOperation.cpp + operations/COM_AntiAliasOperation.h +) + +blender_add_lib(bf_compositor "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/compositor/COM_compositor.h b/source/blender/compositor/COM_compositor.h new file mode 100644 index 00000000000..2891d8cdfa0 --- /dev/null +++ b/source/blender/compositor/COM_compositor.h @@ -0,0 +1,278 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + + #ifdef __cplusplus + extern "C" { + #endif + +#include "DNA_node_types.h" + + +/** + * @defgroup Model The data model of the compositor + * @defgroup Memory The memory management stuff + * @defgroup Execution The execution logic + * @defgroup Conversion Conversion logic + * @defgroup Node All nodes of the compositor + * @defgroup Operation All operations of the compositor + * + * @mainpage Introduction of the Blender Compositor + * + * @section bcomp Blender compositor + * This project redesigns the interals of Blender's compositor. The project has been executed in 2011 by At Mind. At Mind is a technology company located in Amsterdam, The Netherlands. + * The project has been crowdfunded. This code has been released under GPL2 to be used in Blender. + * + * @section goals The goals of the project + * the new compositor has 2 goals. + * - Make a faster compositor (speed of calculation) + * - Make the compositor work faster for you (workflow) + * + * @section speed Faster compositor + * The speedup has been done by making better use of the hardware Blenders is working on. The previous compositor only used a single threaded model to calculate a node. The only exception to this is the Defocus node. + * Only when it is possible to calculate two full nodes in parallel a second thread was used. Current workstations have 8-16 threads available, and most of the time these are idle. + * + * In the new compositor we want to use as much of threads as possible. Even new OpenCL capable GPU-hardware can be used for calculation. + * + * @section workflow Work faster + * The previous compositor only showed the final image. The compositor could wait a long time before seeing the result of his work. The new compositor will work in a way that it will focus on getting information back to the user. + * It will prioritise its work to get earlier user feedback. + * + * @page memory Memory model + * The main issue is the type of memory model to use. Blender is used by consumers and professionals. Ranging from low-end machines to very high-end machines. The system should work on high-end machines and on low-end machines. + * + * + * @page executing Executing + * @section prepare Prepare execution + * + * during the preparation of the execution All ReadBufferOperation will receive an offset. this offset is used during execution as an optimization trick + * Next all operations will be initialized for execution @see NodeOperation.initExecution + * Next all ExecutionGroup's will be initialized for execution @see ExecutionGroup.initExecution + * this all is controlled from @see ExecutionSystem.execute + * + * @section priority Render priority + * Render priority is an priority of an output node. A user has a different need of Render priorities of output nodes than during editing. + * for example. the Active ViewerNode has top priority during editing, but during rendering a CompositeNode has. + * All NodeOperation has a setting for their renderpriority, but only for output NodeOperation these have effect. + * In ExecutionSystem.execute all priorities are checked. For every priority the ExecutionGroup's are check if the priority do match. + * When match the ExecutionGroup will be executed (this happens in serial) + * + * @see ExecutionSystem.execute control of the Render priority + * @see NodeOperation.getRenderPriority receive the render priority + * @see ExecutionGroup.execute the main loop to execute a whole ExecutionGroup + * + * @section order Chunk order + * + * When a ExecutionGroup is executed, first the order of chunks are determined. + * The settings are stored in the ViewerNode inside the ExecutionGroup. ExecutionGroups that have no viewernode, will use a default one. + * There are several possible chunk orders + * - [@ref OrderOfChunks.COM_TO_CENTER_OUT]: Start calculating from a configurable point and order by nearest chunk + * - [@ref OrderOfChunks.COM_TO_RANDOM]: Randomize all chunks. + * - [@ref OrderOfChunks.COM_TO_TOP_DOWN]: Start calculation from the bottom to the top of the image + * - [@ref OrderOfChunks.COM_TO_RULE_OF_THIRDS]: Experimental order based on 9 hotspots in the image + * + * When the chunkorder is determined, the first few chunks will be checked if they can be scheduled. + * Chunks can have three states: + * - [@ref ChunkExecutionState.COM_ES_NOT_SCHEDULED]: Chunk is not yet scheduled, or dependacies are not met + * - [@ref ChunkExecutionState.COM_ES_SCHEDULED]: All dependacies are met, chunk is scheduled, but not finished + * - [@ref ChunkExecutionState.COM_ES_EXECUTED]: Chunk is finished + * + * @see ExecutionGroup.execute + * @see ViewerBaseOperation.getChunkOrder + * @see OrderOfChunks + * + * @section interest Area of interest + * An ExecutionGroup can have dependancies to other ExecutionGroup's. Data passing from one ExecutionGroup to another one are stored in 'chunks'. + * If not all input chunks are available the chunk execution will not be scheduled. + *
+  * +-------------------------------------+              +--------------------------------------+
+  * | ExecutionGroup A                    |              | ExecutionGroup B                     |
+  * | +----------------+  +-------------+ |              | +------------+   +-----------------+ |
+  * | | NodeOperation a|  | WriteBuffer | |              | | ReadBuffer |   | ViewerOperation | |
+  * | |                *==* Operation   | |              | | Operation  *===*                 | |
+  * | |                |  |             | |              | |            |   |                 | |
+  * | +----------------+  +-------------+ |              | +------------+   +-----------------+ |
+  * |                                |    |              |   |                                  |
+  * +--------------------------------|----+              +---|----------------------------------+
+  *                                  |                       |
+  *                                  |                       |
+  *                                +---------------------------+
+  *                                | MemoryProxy               |
+  *                                | +----------+  +---------+ |
+  *                                | | Chunk a  |  | Chunk b | |
+  *                                | |          |  |         | |
+  *                                | +----------+  +---------+ |
+  *                                |                           |
+  *                                +---------------------------+
+  * 
+ * + * In the above example ExecutionGroup B has an outputoperation (ViewerOperation) and is being executed. + * The first chunk is evaluated [@ref ExecutionGroup.scheduleChunkWhenPossible], but not all input chunks are available. The relevant ExecutionGroup (that can calculate the missing chunks; ExecutionGroup A) is + * Asked to calculate the area ExecutionGroup B is missing. [@ref ExecutionGroup.scheduleAreaWhenPossible] + * ExecutionGroup B checks what chunks the area spans, and tries to schedule these chunks. If all input data is available these chunks are scheduled [@ref ExecutionGroup.scheduleChunk] + * + *
+  *
+  * +-------------------------+        +----------------+                           +----------------+
+  * | ExecutionSystem.execute |        | ExecutionGroup |                           | ExecutionGroup |
+  * +-------------------------+        | (B)            |                           | (A)            |
+  *            O                       +----------------+                           +----------------+
+  *            O                                |                                            |
+  *            O       ExecutionGroup.execute   |                                            |
+  *            O------------------------------->O                                            |
+  *            .                                O                                            |
+  *            .                                O-------\                                    |
+  *            .                                .       | ExecutionGroup.scheduleChunkWhenPossible
+  *            .                                .  O----/ (*)                                |
+  *            .                                .  O                                         |
+  *            .                                .  O                                         |
+  *            .                                .  O  ExecutionGroup.scheduleAreaWhenPossible|
+  *            .                                .  O---------------------------------------->O
+  *            .                                .  .                                         O----------\ ExecutionGroup.scheduleChunkWhenPossible
+  *            .                                .  .                                         .          | (*)
+  *            .                                .  .                                         .  O-------/
+  *            .                                .  .                                         .  O
+  *            .                                .  .                                         .  O
+  *            .                                .  .                                         .  O-------\ ExecutionGroup.scheduleChunk
+  *            .                                .  .                                         .  .       |
+  *            .                                .  .                                         .  .  O----/
+  *            .                                .  .                                         .  O<=O
+  *            .                                .  .                                         O<=O
+  *            .                                .  .                                         O
+  *            .                                .  O<========================================O
+  *            .                                .  O                                         |
+  *            .                                O<=O                                         |
+  *            .                                O                                            |
+  *            .                                O                                            |
+  * 
+ * + * This happens until all chunks of (ExecutionGroup B) are finished executing or the user break's the process. + * + * NodeOperation like the ScaleOperation can influence the area of interest by reimplementing the [@ref NodeOperation.determineAreaOfInterest] method + * + *
+  *
+  * +--------------------------+                             +---------------------------------+
+  * | ExecutionGroup A         |                             | ExecutionGroup B                |
+  * |                          |                             |                                 |
+  * +--------------------------+                             +---------------------------------+
+  *           Needed chunks from ExecutionGroup A               |   Chunk of ExecutionGroup B (to be evaluated)
+  *            +-------+ +-------+                              |                  +--------+
+  *            |Chunk 1| |Chunk 2|               +----------------+                |Chunk 1 |
+  *            |       | |       |               | ScaleOperation |                |        |
+  *            +-------+ +-------+               +----------------+                +--------+
+  *
+  *            +-------+ +-------+
+  *            |Chunk 3| |Chunk 4|
+  *            |       | |       |
+  *            +-------+ +-------+
+  *
+  * 
+ * + * @see ExecutionGroup.execute Execute a complete ExecutionGroup. Halts until finished or breaked by user + * @see ExecutionGroup.scheduleChunkWhenPossible Tries to schedule a single chunk, checks if all input data is available. Can trigger dependant chunks to be calculated + * @see ExecutionGroup.scheduleAreaWhenPossible Tries to schedule an area. This can be multiple chunks (is called from [@ref ExecutionGroup.scheduleChunkWhenPossible]) + * @see ExecutionGroup.scheduleChunk Schedule a chunk on the WorkScheduler + * @see NodeOperation.determineDependingAreaOfInterest Influence the area of interest of a chunk. + * @see WriteBufferOperation NodeOperation to write to a MemoryProxy/MemoryBuffer + * @see ReadBufferOperation NodeOperation to read from a MemoryProxy/MemoryBuffer + * @see MemoryProxy proxy for information about memory image (a image consist out of multiple chunks) + * @see MemoryBuffer Allocated memory for a single chunk + * + * @section workscheduler WorkScheduler + * the WorkScheduler is implemented as a static class. the responsibility of the WorkScheduler is to balance WorkPackages to the available and free devices. + * the workscheduler can work in 2 states. For witching these between the state you need to recompile blender + * + * @subsection multithread Multi threaded + * Default the workscheduler will place all work as WorkPackage in a queue. + * For every CPUcore a working thread is created. These working threads will ask the WorkScheduler if there is work for a specific Device. + * the workscheduler will find work for the device and the device will be asked to execute the WorkPackage + + * @subsection singlethread Single threaded + * For debugging reasons the multi-threading can be disabled. This is done by changing the COM_CURRENT_THREADING_MODEL to COM_TM_NOTHREAD. When compiling the workscheduler + * will be changes to support no threading and run everything on the CPU. + * + * @section devices Devices + * A Device within the compositor context is a Hardware component that can used to calculate chunks. This chunk is encapseled in a WorkPackage. + * the WorkScheduler controls the devices and selects the device where a WorkPackage will be calculated. + * + * @subsection WS_Devices Workscheduler + * The WorkScheduler controls all Devices. When initializing the compositor the WorkScheduler selects all devices that will be used during compositor. + * There are two types of Devices, CPUDevice and OpenCLDevice. + * When an ExecutionGroup schedules a Chunk the schedule method of the WorkScheduler + * The Workscheduler determines if the chunk can be run on an OpenCLDevice (and that there are available OpenCLDevice). If this is the case the chunk will be added to the worklist for OpenCLDevice's + * otherwise the chunk will be added to the worklist of CPUDevices. + * + * A thread will read the work-list and sends a workpackage to its device. + * + * @see WorkScheduler.schedule method that is called to schedule a chunk + * @see Device.execute method called to execute a chunk + * + * @subsection CPUDevice CPUDevice + * When a CPUDevice gets a WorkPackage the Device will get the inputbuffer that is needed to calculate the chunk. Allocation is already done by the ExecutionGroup. + * The outputbuffer of the chunk is being created. + * The OutputOperation of the ExecutionGroup is called to execute the area of the outputbuffer. + * + * @see ExecutionGroup + * @see NodeOperation.executeRegion executes a single chunk of a NodeOperation + * @see CPUDevice.execute + * + * @subsection GPUDevice OpenCLDevice + * + * To be completed! + * @see NodeOperation.executeOpenCLRegion + * @see OpenCLDevice.execute + * + * @section executePixel executing a pixel + * Finally the last step, the node functionality :) + + * @page newnode Creating new nodes + */ + +/** + * @brief The main method that is used to execute the compositor tree. + * It can be executed during editing (blenkernel/node.c) or rendering + * (renderer/pipeline.c) + * + * @param editingtree [struct bNodeTree] + * reference to the compositor editing tree + * + * @param rendering [true false] + * This parameter determines whether the function is called from rendering (true) or editing (false). + * based on this setting the system will work differently: + * - during rendering only Composite & the File output node will be calculated + * @see NodeOperation.isOutputProgram(int rendering) of the specific operations + * + * - during editing all output nodes will be calculated + * @see NodeOperation.isOutputProgram(int rendering) of the specific operations + * + * - another quality setting can be used bNodeTree. The quality is determined by the bNodeTree fields. + * quality can be modified by the user from within the node panels. + * @see bNodeTree.edit_quality + * @see bNodeTree.render_quality + * + * - output nodes can have different priorities in the WorkScheduler. This is implemented in the COM_execute function. + */ +void COM_execute(bNodeTree *editingtree, int rendering); + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/compositor/COM_defines.h b/source/blender/compositor/COM_defines.h new file mode 100644 index 00000000000..df807091cb8 --- /dev/null +++ b/source/blender/compositor/COM_defines.h @@ -0,0 +1,99 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_defines_h_ +#define _COM_defines_h_ + +/** + * @brief possible data types for SocketConnection + * @ingroup Model + */ +typedef enum DataType { + /** @brief Unknown data type (or not yet known) */ + COM_DT_UNKNOWN = 0, + /** @brief Value data type */ + COM_DT_VALUE = 1, + /** @brief Vector data type */ + COM_DT_VECTOR = 2, + /** @brief Color data type */ + COM_DT_COLOR = 4 +} DataType; + +/** + * @brief Possible quality settings + * @see CompositorContext.quality + * @ingroup Execution + */ +typedef enum CompositorQuality { + /** @brief High quality setting */ + COM_QUALITY_HIGH = 0 , + /** @brief Medium quality setting */ + COM_QUALITY_MEDIUM = 1, + /** @brief Low quality setting */ + COM_QUALITY_LOW = 2 +} CompositorQuality; + +// configurable items + +// chunk size determination +#define COM_PREVIEW_SIZE 140.0f +#define COM_OPENCL_ENABLED +#define COM_PREVIEW_ENABLED +// workscheduler threading models +/** + * COM_TM_QUEUE is a multithreaded model, which uses the BLI_thread_queue pattern. This is the default option. + */ +#define COM_TM_QUEUE 1 + +/** + * COM_TM_NOTHREAD is a single threading model, everything is executed in the caller thread. easy for debugging + */ +#define COM_TM_NOTHREAD 0 + +/** + * COM_CURRENT_THREADING_MODEL can be one of the above, COM_TM_QUEUE is currently default. + */ +#define COM_CURRENT_THREADING_MODEL COM_TM_QUEUE +// chunk order +/** + * @brief The order of chunks to be scheduled + * @ingroup Execution + */ +typedef enum OrderOfChunks { + /** @brief order from a distance to centerX/centerY */ + COM_TO_CENTER_OUT = 0, + /** @brief order randomly */ + COM_TO_RANDOM = 1, + /** @brief no ordering */ + COM_TO_TOP_DOWN = 2, + /** @brief experimental ordering with 9 hotspots */ + COM_TO_RULE_OF_THIRDS = 3 +} OrderOfChunks; + +#define COM_RULE_OF_THIRDS_DIVIDER 100.0f + +#define COM_NUMBER_OF_CHANNELS 4 + +#define COM_DEFAULT_RESOLUTION_WIDTH 640 +#define COM_DEFAULT_RESOLUTION_HEIGHT 480 + +#endif diff --git a/source/blender/compositor/SConscript b/source/blender/compositor/SConscript new file mode 100644 index 00000000000..08fe1ea5e19 --- /dev/null +++ b/source/blender/compositor/SConscript @@ -0,0 +1,14 @@ +#!/usr/bin/python +Import ('env') +defs = ['GLEW_STATIC'] + +sources = env.Glob('intern/*.cpp') + env.Glob('nodes/*.cpp') + env.Glob('operations/*.cpp') + +incs = '. nodes intern operations ../blenlib ../blenkernel ../makesdna ../render/extern/include ../render/intern/include' +incs += ' ../makesrna ../blenloader ../../../intern/guardedalloc ../imbuf ../windowmanager ' +incs += '../opencl ../nodes ../nodes/intern ../nodes/composite ' + +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] + +env.BlenderLib ( 'bf_composite', sources, Split(incs), defines=defs, libtype=['core','player'], priority = [191,191] ) diff --git a/source/blender/compositor/intern/COM_CPUDevice.cpp b/source/blender/compositor/intern/COM_CPUDevice.cpp new file mode 100644 index 00000000000..2e74fbf19b3 --- /dev/null +++ b/source/blender/compositor/intern/COM_CPUDevice.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CPUDevice.h" + +void CPUDevice::execute(WorkPackage *work) { + const unsigned int chunkNumber = work->getChunkNumber(); + ExecutionGroup * executionGroup = work->getExecutionGroup(); + rcti rect; + + executionGroup->determineChunkRect(&rect, chunkNumber); + MemoryBuffer ** inputBuffers = executionGroup->getInputBuffers(chunkNumber); + MemoryBuffer * outputBuffer = executionGroup->allocateOutputBuffer(chunkNumber, &rect); + + executionGroup->getOutputNodeOperation()->executeRegion(&rect, chunkNumber, inputBuffers); + + executionGroup->finalizeChunkExecution(chunkNumber, inputBuffers); + if (outputBuffer != NULL) { + outputBuffer->setCreatedState(); + } +} + diff --git a/source/blender/compositor/intern/COM_CPUDevice.h b/source/blender/compositor/intern/COM_CPUDevice.h new file mode 100644 index 00000000000..f577e2b8926 --- /dev/null +++ b/source/blender/compositor/intern/COM_CPUDevice.h @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CPUDevice_h +#define _COM_CPUDevice_h + +#include "COM_Device.h" + +/** + * @brief class representing a CPU device. + * @note for every hardware thread in the system a CPUDevice instance will exist in the workscheduler + */ +class CPUDevice: public Device { +public: + /** + * @brief execute a WorkPackage + * @param work the WorkPackage to execute + */ + void execute(WorkPackage *work); +}; + +#endif diff --git a/source/blender/compositor/intern/COM_ChannelInfo.cpp b/source/blender/compositor/intern/COM_ChannelInfo.cpp new file mode 100644 index 00000000000..e945babe9c3 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChannelInfo.cpp @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ChannelInfo.h" +#include "COM_defines.h" +#include + +/** + * @brief create new ChannelInfo instance and sets the defaults. + */ +ChannelInfo::ChannelInfo() { + this->number = 0; + this->premultiplied = true; + this->type = COM_CT_UNUSED; +} diff --git a/source/blender/compositor/intern/COM_ChannelInfo.h b/source/blender/compositor/intern/COM_ChannelInfo.h new file mode 100644 index 00000000000..40933bce6f5 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChannelInfo.h @@ -0,0 +1,121 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ChannelInfo_h +#define _COM_ChannelInfo_h + +#include +#include "BKE_text.h" +#include +#include "DNA_node_types.h" +#include "BLI_rect.h" + +using namespace std; + +/** + * @brief List of possible channel types + * @ingroup Model + */ +typedef enum ChannelType { + COM_CT_ColorComponent /** @brief this channel is contains color information. Specific used is determined by channelnumber, and in the future color space */, + COM_CT_Alpha /** @brief this channel is contains transparency value */, + COM_CT_Value /** @brief this channel is contains a value */, + COM_CT_X /** @brief this channel is contains a X value */, + COM_CT_Y /** @brief this channel is contains a Y value */, + COM_CT_Z /** @brief this channel is contains a Z value */, + COM_CT_W /** @brief this channel is contains a W value */, + COM_CT_UNUSED /** @brief this channel is unused */ +} ChannelType; + +/** + * @brief ChannelInfo holds information about a channel. + * + * Channels are transported from node to node via a SocketConnection. + * ChannelInfo holds specific setting of these channels in order that the to-node of the connection + * Can handle specific logic per channel setting. + * + * @note currently this is not used, but a future place to implement color spacing and other things. + * @ingroup Model + */ +class ChannelInfo { +private: + /** + * @brief the channel number, in the connection. [0-3] + */ + int number; + + /** + * @brief type of channel + */ + ChannelType type; + + /** + * @brieg Is this value in this channel premultiplied with its alpha + * @note only valid if type = ColorComponent; + */ + bool premultiplied; + +// /** +// * Color space of this value. +// * only valid when type = ColorComponent; +// */ +// string colorspacename; + +public: + /** + * @brief creates a new ChannelInfo and set default values + */ + ChannelInfo(); + + /** + * @brief set the index of this channel in the SocketConnection + */ + void setNumber(const int number) { this->number = number; } + + /** + * @brief get the index of this channel in the SocketConnection + */ + const int getNumber() const {return this->number; } + + /** + * @brief set the type of channel + */ + void setType(const ChannelType type) { this->type = type; } + + /** + * @brief get the type of channel + */ + const ChannelType getType() const {return this->type; } + + /** + * @brief set the premultiplicatioin of this channel + */ + void setPremultiplied(const bool premultiplied) { this->premultiplied = premultiplied; } + + /** + * @brief is this channel premultiplied + */ + const bool isPremultiplied() const {return this->premultiplied;} +}; + + +#endif diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cpp b/source/blender/compositor/intern/COM_ChunkOrder.cpp new file mode 100644 index 00000000000..784b848a2f9 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrder.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ChunkOrder.h" +#include "BLI_math.h" + +ChunkOrder::ChunkOrder() { + this->distance = 0.0; + this->number = 0; + this->x = 0; + this->y = 0; +} + +void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots) { + unsigned int index; + double distance = MAXFLOAT; + for (index = 0 ; index < numberOfHotspots ; index ++) { + ChunkOrderHotspot* hotspot = hotspots[index]; + double ndistance = hotspot->determineDistance(this->x, this->y); + if (ndistance < distance) { + distance = ndistance; + } + } + this->distance = distance; +} + +bool operator<(const ChunkOrder& a, const ChunkOrder& b) { + return a.distance < b.distance; +} diff --git a/source/blender/compositor/intern/COM_ChunkOrder.h b/source/blender/compositor/intern/COM_ChunkOrder.h new file mode 100644 index 00000000000..3dbb4ae8080 --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrder.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ChunkOrder_h_ +#define _COM_ChunkOrder_h_ + +#include "COM_ChunkOrderHotspot.h" +class ChunkOrder { +private: + unsigned int number; + int x; + int y; + double distance; +public: + ChunkOrder(); + void determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots); + friend bool operator<(const ChunkOrder& a, const ChunkOrder& b); + + void setChunkNumber(unsigned int chunknumber) {this->number = chunknumber;} + void setX(int x) {this->x = x;} + void setY(int y) {this->y = y;} + unsigned int getChunkNumber() {return this->number;} + double getDistance() {return this->distance;} +}; + +#endif diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp new file mode 100644 index 00000000000..11079878b4f --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ChunkOrderHotspot.h" +#include + +ChunkOrderHotspot::ChunkOrderHotspot(int x, int y, float addition) { + this->x = x; + this->y = y; + this->addition = addition; +} + +double ChunkOrderHotspot::determineDistance(int x, int y) { + int dx = x-this->x; + int dy = y-this->y; + double result = sqrt((double)(dx*dx+dy*dy)); + result += this->addition; + return result; +} diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.h b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h new file mode 100644 index 00000000000..ceb5934a7df --- /dev/null +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ChunkOrderHotSpot_h_ +#define _COM_ChunkOrderHotSpot_h_ + +class ChunkOrderHotspot { +private: + int x; + int y; + float addition; + +public: + ChunkOrderHotspot(int x, int y, float addition); + double determineDistance(int x, int y); +}; + +#endif diff --git a/source/blender/compositor/intern/COM_CompositorContext.cpp b/source/blender/compositor/intern/COM_CompositorContext.cpp new file mode 100644 index 00000000000..dbb05d4f493 --- /dev/null +++ b/source/blender/compositor/intern/COM_CompositorContext.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CompositorContext.h" +#include "COM_defines.h" +#include + +CompositorContext::CompositorContext() { + this->scene = NULL; + this->quality = COM_QUALITY_HIGH; + this->hasActiveOpenCLDevices = false; +} + +const int CompositorContext::getFramenumber() const { + if (this->scene) { + return this->scene->r.cfra; + } else { + return -1; /* this should never happen */ + } +} + +const int CompositorContext::isColorManaged() const { + if (this->scene) { + return this->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT; + } else { + return 0; /* this should never happen */ + } +} diff --git a/source/blender/compositor/intern/COM_CompositorContext.h b/source/blender/compositor/intern/COM_CompositorContext.h new file mode 100644 index 00000000000..dc5b248f777 --- /dev/null +++ b/source/blender/compositor/intern/COM_CompositorContext.h @@ -0,0 +1,147 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CompositorContext_h +#define _COM_CompositorContext_h + +#include +#include "BKE_text.h" +#include +#include "DNA_node_types.h" +#include "BLI_rect.h" +#include "DNA_scene_types.h" +#include "COM_defines.h" + +/** + * @brief Overall context of the compositor + */ +class CompositorContext { +private: + /** + * @brief The rendering field describes if we are rendering (F12) or if we are editing (Node editor) + * This field is initialized in ExecutionSystem and must only be read from that point on. + * @see ExecutionSystem + */ + bool rendering; + + /** + * @brief The quality of the composite. + * This field is initialized in ExecutionSystem and must only be read from that point on. + * @see ExecutionSystem + */ + CompositorQuality quality; + + /** + * @brief Reference to the scene that is being composited. + * This field is initialized in ExecutionSystem and must only be read from that point on. + * @see ExecutionSystem + */ + Scene* scene; + + /** + * @brief reference to the bNodeTree + * This field is initialized in ExecutionSystem and must only be read from that point on. + * @see ExecutionSystem + */ + bNodeTree* bnodetree; + + /** + * @brief does this system have active opencl devices? + */ + bool hasActiveOpenCLDevices; + +public: + /** + * @brief constructor initializes the context with default values. + */ + CompositorContext(); + + /** + * @brief set the rendering field of the context + */ + void setRendering(bool rendering) { this->rendering = rendering; } + + /** + * @brief get the rendering field of the context + */ + bool isRendering() const {return this->rendering;} + + /** + * @brief set the scene of the context + */ + void setScene(Scene* scene) {this->scene = scene;} + + /** + * @brief set the bnodetree of the context + */ + void setbNodeTree(bNodeTree* bnodetree) {this->bnodetree = bnodetree;} + + /** + * @brief get the bnodetree of the context + */ + const bNodeTree * getbNodeTree() const {return this->bnodetree;} + + /** + * @brief get the scene of the context + */ + const Scene* getScene() const {return this->scene;} + + /** + * @brief set the quality + */ + void setQuality(CompositorQuality quality) { + this->quality = quality; + } + + /** + * @brief get the quality + */ + const CompositorQuality getQuality() const { + return quality; + } + + /** + * @brief get the current framenumber of the scene in this context + */ + const int getFramenumber() const; + + /** + * @brief has this system active openclDevices? + */ + const bool getHasActiveOpenCLDevices() const { + return this->hasActiveOpenCLDevices; + } + + /** + * @brief set has this system active openclDevices? + */ + void setHasActiveOpenCLDevices(bool hasAvtiveOpenCLDevices) { + this->hasActiveOpenCLDevices = hasAvtiveOpenCLDevices; + } + + int getChunksize() {return this->getbNodeTree()->chunksize;} + + const int isColorManaged() const; +}; + + +#endif diff --git a/source/blender/compositor/intern/COM_Converter.cpp b/source/blender/compositor/intern/COM_Converter.cpp new file mode 100644 index 00000000000..56b1da97df8 --- /dev/null +++ b/source/blender/compositor/intern/COM_Converter.cpp @@ -0,0 +1,492 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Converter.h" +#include "BKE_node.h" +#include "COM_CompositorNode.h" +#include "COM_RenderLayersNode.h" +#include "COM_ColorToBWNode.h" +#include "string.h" +#include "COM_SocketConnection.h" +#include "COM_ConvertColourToValueProg.h" +#include "COM_ConvertValueToColourProg.h" +#include "COM_ConvertColorToVectorOperation.h" +#include "COM_ConvertValueToVectorOperation.h" +#include "COM_ConvertVectorToColorOperation.h" +#include "COM_ConvertVectorToValueOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_MixNode.h" +#include "COM_MuteNode.h" +#include "COM_TranslateNode.h" +#include "COM_RotateNode.h" +#include "COM_ScaleNode.h" +#include "COM_FlipNode.h" +#include "COM_IDMaskNode.h" +#include "COM_FilterNode.h" +#include "COM_BrightnessNode.h" +#include "COM_SeparateRGBANode.h" +#include "COM_CombineRGBANode.h" +#include "COM_SeparateHSVANode.h" +#include "COM_CombineHSVANode.h" +#include "COM_SeparateYUVANode.h" +#include "COM_CombineYUVANode.h" +#include "COM_SeparateYCCANode.h" +#include "COM_CombineYCCANode.h" +#include "COM_AlphaOverNode.h" +#include "COM_ColorBalanceNode.h" +#include "COM_ViewerNode.h" +#include "COM_SplitViewerNode.h" +#include "COM_InvertNode.h" +#include "COM_GroupNode.h" +#include "COM_NormalNode.h" +#include "COM_NormalizeNode.h" +#include "COM_ImageNode.h" +#include "COM_BokehImageNode.h" +#include "COM_ColorCurveNode.h" +#include "COM_VectorCurveNode.h" +#include "COM_SetAlphaNode.h" +#include "COM_ConvertAlphaNode.h" +#include "COM_MapUVNode.h" +#include "COM_DisplaceNode.h" +#include "COM_MathNode.h" +#include "COM_HueSaturationValueNode.h" +#include "COM_HueSaturationValueCorrectNode.h" +#include "COM_ColorCorrectionNode.h" +#include "COM_BoxMaskNode.h" +#include "COM_EllipseMaskNode.h" +#include "COM_GammaNode.h" +#include "COM_ColorRampNode.h" +#include "COM_DifferenceMatteNode.h" +#include "COM_LuminanceMatteNode.h" +#include "COM_DistanceMatteNode.h" +#include "COM_ChromaMatteNode.h" +#include "COM_ColorMatteNode.h" +#include "COM_ChannelMatteNode.h" +#include "COM_BlurNode.h" +#include "COM_BokehBlurNode.h" +#include "COM_DilateErodeNode.h" +#include "COM_TranslateOperation.h" +#include "COM_LensDistortionNode.h" +#include "COM_TextureNode.h" +#include "COM_ColorNode.h" +#include "COM_ValueNode.h" +#include "COM_TimeNode.h" +#include "COM_DirectionalBlurNode.h" +#include "COM_ZCombineNode.h" +#include "COM_SetValueOperation.h" +#include "COM_ScaleOperation.h" +#include "COM_ExecutionSystemHelper.h" +#include "COM_TonemapNode.h" +#include "COM_SwitchNode.h" +#include "COM_GlareNode.h" +#include "COM_MovieClipNode.h" +#include "COM_ColorSpillNode.h" +#include "COM_OutputFileNode.h" +#include "COM_MapValueNode.h" +#include "COM_TransformNode.h" +#include "COM_Stabilize2dNode.h" +#include "COM_BilateralBlurNode.h" +#include "COM_VectorBlurNode.h" +#include "COM_MovieDistortionNode.h" +#include "COM_ViewLevelsNode.h" +#include "COM_DefocusNode.h" +#include "COM_DoubleEdgeMaskNode.h" +#include "COM_CropNode.h" + +Node* Converter::convert(bNode *bNode) { + Node * node; + + if (bNode->flag & NODE_MUTED) { + node = new MuteNode(bNode); + return node; + } + + switch (bNode->type) { + case CMP_NODE_COMPOSITE: + node = new CompositorNode(bNode); + break; + case CMP_NODE_R_LAYERS: + node = new RenderLayersNode(bNode); + break; + case CMP_NODE_TEXTURE: + node = new TextureNode(bNode); + break; + case CMP_NODE_RGBTOBW: + node = new ColourToBWNode(bNode); + break; + case CMP_NODE_MIX_RGB: + node = new MixNode(bNode); + break; + case CMP_NODE_TRANSLATE: + node = new TranslateNode(bNode); + break; + case CMP_NODE_SCALE: + node = new ScaleNode(bNode); + break; + case CMP_NODE_ROTATE: + node = new RotateNode(bNode); + break; + case CMP_NODE_FLIP: + node = new FlipNode(bNode); + break; + case CMP_NODE_FILTER: + node = new FilterNode(bNode); + break; + case CMP_NODE_ID_MASK: + node = new IDMaskNode(bNode); + break; + case CMP_NODE_BRIGHTCONTRAST: + node = new BrightnessNode(bNode); + break; + case CMP_NODE_SEPRGBA: + node = new SeparateRGBANode(bNode); + break; + case CMP_NODE_COMBRGBA: + node = new CombineRGBANode(bNode); + break; + case CMP_NODE_SEPHSVA: + node = new SeparateHSVANode(bNode); + break; + case CMP_NODE_COMBHSVA: + node = new CombineHSVANode(bNode); + break; + case CMP_NODE_SEPYUVA: + node = new SeparateYUVANode(bNode); + break; + case CMP_NODE_COMBYUVA: + node = new CombineYUVANode(bNode); + break; + case CMP_NODE_SEPYCCA: + node = new SeparateYCCANode(bNode); + break; + case CMP_NODE_COMBYCCA: + node = new CombineYCCANode(bNode); + break; + case CMP_NODE_ALPHAOVER: + node = new AlphaOverNode(bNode); + break; + case CMP_NODE_COLORBALANCE: + node = new ColorBalanceNode(bNode); + break; + case CMP_NODE_VIEWER: + node = new ViewerNode(bNode); + break; + case CMP_NODE_SPLITVIEWER: + node = new SplitViewerNode(bNode); + break; + case CMP_NODE_INVERT: + node = new InvertNode(bNode); + break; + case NODE_GROUP: + node = new GroupNode(bNode); + break; + case CMP_NODE_NORMAL: + node = new NormalNode(bNode); + break; + case CMP_NODE_NORMALIZE: + node = new NormalizeNode(bNode); + break; + case CMP_NODE_IMAGE: + node = new ImageNode(bNode); + break; + case CMP_NODE_SETALPHA: + node = new SetAlphaNode(bNode); + break; + case CMP_NODE_PREMULKEY: + node = new ConvertAlphaNode(bNode); + break; + case CMP_NODE_MATH: + node = new MathNode(bNode); + break; + case CMP_NODE_HUE_SAT: + node = new HueSaturationValueNode(bNode); + break; + case CMP_NODE_COLORCORRECTION: + node = new ColorCorrectionNode(bNode); + break; + case CMP_NODE_MASK_BOX: + node = new BoxMaskNode(bNode); + break; + case CMP_NODE_MASK_ELLIPSE: + node = new EllipseMaskNode(bNode); + break; + case CMP_NODE_GAMMA: + node = new GammaNode(bNode); + break; + case CMP_NODE_CURVE_RGB: + node = new ColorCurveNode(bNode); + break; + case CMP_NODE_CURVE_VEC: + node = new VectorCurveNode(bNode); + break; + case CMP_NODE_HUECORRECT: + node = new HueSaturationValueCorrectNode(bNode); + break; + case CMP_NODE_MAP_UV: + node = new MapUVNode(bNode); + break; + case CMP_NODE_DISPLACE: + node = new DisplaceNode(bNode); + break; + case CMP_NODE_VALTORGB: + node = new ColorRampNode(bNode); + break; + case CMP_NODE_DIFF_MATTE: + node = new DifferenceMatteNode(bNode); + break; + case CMP_NODE_LUMA_MATTE: + node = new LuminanceMatteNode(bNode); + break; + case CMP_NODE_DIST_MATTE: + node = new DistanceMatteNode(bNode); + break; + case CMP_NODE_CHROMA_MATTE: + node = new ChromaMatteNode(bNode); + break; + case CMP_NODE_COLOR_MATTE: + node = new ColorMatteNode(bNode); + break; + case CMP_NODE_CHANNEL_MATTE: + node = new ChannelMatteNode(bNode); + break; + case CMP_NODE_BLUR: + node = new BlurNode(bNode); + break; + case CMP_NODE_BOKEHIMAGE: + node = new BokehImageNode(bNode); + break; + case CMP_NODE_BOKEHBLUR: + node = new BokehBlurNode(bNode); + break; + case CMP_NODE_DILATEERODE: + node = new DilateErodeNode(bNode); + break; + case CMP_NODE_LENSDIST: + node = new LensDistortionNode(bNode); + break; + case CMP_NODE_RGB: + node = new ColorNode(bNode); + break; + case CMP_NODE_VALUE: + node = new ValueNode(bNode); + break; + case CMP_NODE_TIME: + node = new TimeNode(bNode); + break; + case CMP_NODE_DBLUR: + node = new DirectionalBlurNode(bNode); + break; + case CMP_NODE_ZCOMBINE: + node = new ZCombineNode(bNode); + break; + case CMP_NODE_TONEMAP: + node = new TonemapNode(bNode); + break; + case CMP_NODE_SWITCH: + node = new SwitchNode(bNode); + break; + case CMP_NODE_GLARE: + node = new GlareNode(bNode); + break; + case CMP_NODE_MOVIECLIP: + node = new MovieClipNode(bNode); + break; + case CMP_NODE_COLOR_SPILL: + node = new ColorSpillNode(bNode); + break; +case CMP_NODE_OUTPUT_FILE: + node = new OutputFileNode(bNode); + break; + case CMP_NODE_MAP_VALUE: + node = new MapValueNode(bNode); + break; + case CMP_NODE_TRANSFORM: + node = new TransformNode(bNode); + break; + case CMP_NODE_STABILIZE2D: + node = new Stabilize2dNode(bNode); + break; + case CMP_NODE_BILATERALBLUR: + node = new BilateralBlurNode(bNode); + break; + case CMP_NODE_VECBLUR: + node = new VectorBlurNode(bNode); + break; + case CMP_NODE_MOVIEDISTORTION: + node = new MovieDistortionNode(bNode); + break; + case CMP_NODE_VIEW_LEVELS: + node = new ViewLevelsNode(bNode); + break; + case CMP_NODE_DEFOCUS: + node = new DefocusNode(bNode); + break; + case CMP_NODE_DOUBLEEDGEMASK: + node = new DoubleEdgeMaskNode(bNode); + break; + case CMP_NODE_CROP: + node = new CropNode(bNode); + break; + /* not inplemented yet */ + default: + node = new MuteNode(bNode); + break; + } + return node; +} +void Converter::convertDataType(SocketConnection* connection, ExecutionSystem *system) { + OutputSocket* outputSocket = connection->getFromSocket(); + InputSocket* inputSocket = connection->getToSocket(); + DataType fromDatatype = outputSocket->getActualDataType(); + DataType toDatatype = inputSocket->getActualDataType(); + NodeOperation * converter = NULL; + if (fromDatatype == COM_DT_VALUE && toDatatype == COM_DT_COLOR) { + converter = new ConvertValueToColourProg(); + } else if (fromDatatype == COM_DT_VALUE && toDatatype == COM_DT_VECTOR) { + converter = new ConvertValueToVectorOperation(); + } else if (fromDatatype == COM_DT_COLOR && toDatatype == COM_DT_VALUE) { + converter = new ConvertColourToValueProg(); + } else if (fromDatatype == COM_DT_COLOR && toDatatype == COM_DT_VECTOR) { + converter = new ConvertColorToVectorOperation(); + } else if (fromDatatype == COM_DT_VECTOR && toDatatype == COM_DT_VALUE) { + converter = new ConvertVectorToValueOperation(); + } else if (fromDatatype == COM_DT_VECTOR && toDatatype == COM_DT_COLOR) { + converter = new ConvertVectorToColorOperation(); + } + if (converter != NULL) { + inputSocket->relinkConnections(converter->getInputSocket(0)); + ExecutionSystemHelper::addLink(system->getConnections(), converter->getOutputSocket(), inputSocket); + system->addOperation(converter); + } +} + +void Converter::convertResolution(SocketConnection *connection, ExecutionSystem *system) { + InputSocketResizeMode mode = connection->getToSocket()->getResizeMode(); + + NodeOperation * toOperation = (NodeOperation*)connection->getToNode(); + const float toWidth = toOperation->getWidth(); + const float toHeight = toOperation->getHeight(); + NodeOperation * fromOperation = (NodeOperation*)connection->getFromNode(); + const float fromWidth = fromOperation->getWidth(); + const float fromHeight = fromOperation->getHeight(); + bool doCenter = false; + bool doScale = false; + float addX= (toWidth-fromWidth)/2.0f; + float addY = (toHeight-fromHeight)/2.0f; + float scaleX=0; + float scaleY=0; + + switch (mode) { + case COM_SC_NO_RESIZE: + break; + case COM_SC_CENTER: + doCenter = true; + break; + case COM_SC_FIT_WIDTH: + doCenter = true; + doScale = true; + scaleX = scaleY = toWidth/fromWidth; + break; + case COM_SC_FIT_HEIGHT: + doCenter = true; + doScale = true; + scaleX = scaleY = toHeight/fromHeight; + break; + case COM_SC_FIT: + doCenter = true; + doScale = true; + scaleX = toWidth/fromWidth; + scaleY = toHeight/fromHeight; + if (scaleX < scaleY) { + scaleX = scaleY; + } else { + scaleY = scaleX; + } + break; + case COM_SC_STRETCH: + doCenter = true; + doScale = true; + scaleX = toWidth/fromWidth; + scaleY = toHeight/fromHeight; + break; + + } + + if (doCenter) { + NodeOperation *first = NULL; + SocketConnection *c; + ScaleOperation * scaleOperation = NULL; + if(doScale) { + scaleOperation = new ScaleOperation(); + first = scaleOperation; + SetValueOperation * sxop = new SetValueOperation(); + sxop->setValue(scaleX); + c = ExecutionSystemHelper::addLink(system->getConnections(), sxop->getOutputSocket(), scaleOperation->getInputSocket(1)); + c->setIgnoreResizeCheck(true); + SetValueOperation * syop = new SetValueOperation(); + syop->setValue(scaleY); + c = ExecutionSystemHelper::addLink(system->getConnections(), syop->getOutputSocket(), scaleOperation->getInputSocket(2)); + c->setIgnoreResizeCheck(true); + system->addOperation(sxop); + system->addOperation(syop); + + unsigned int resolution[2] = {fromWidth, fromHeight}; + scaleOperation->setResolution(resolution); + sxop->setResolution(resolution); + syop->setResolution(resolution); + system->addOperation(scaleOperation); + + c->setIgnoreResizeCheck(true); + } + + TranslateOperation * translateOperation = new TranslateOperation(); + if (!first) first = translateOperation; + SetValueOperation * xop = new SetValueOperation(); + xop->setValue(addX); + c = ExecutionSystemHelper::addLink(system->getConnections(), xop->getOutputSocket(), translateOperation->getInputSocket(1)); + c->setIgnoreResizeCheck(true); + SetValueOperation * yop = new SetValueOperation(); + yop->setValue(addY); + c = ExecutionSystemHelper::addLink(system->getConnections(), yop->getOutputSocket(), translateOperation->getInputSocket(2)); + c->setIgnoreResizeCheck(true); + system->addOperation(xop); + system->addOperation(yop); + + unsigned int resolution[2] = {toWidth, toHeight}; + translateOperation->setResolution(resolution); + xop->setResolution(resolution); + yop->setResolution(resolution); + system->addOperation(translateOperation); + + if (doScale) { + c = ExecutionSystemHelper::addLink(system->getConnections(), scaleOperation->getOutputSocket(), translateOperation->getInputSocket(0)); + c->setIgnoreResizeCheck(true); + } + + InputSocket * inputSocket = connection->getToSocket(); + inputSocket->relinkConnections(first->getInputSocket(0)); + c = ExecutionSystemHelper::addLink(system->getConnections(), translateOperation->getOutputSocket(), inputSocket); + c->setIgnoreResizeCheck(true); + } + + connection->setIgnoreResizeCheck(true); +} diff --git a/source/blender/compositor/intern/COM_Converter.h b/source/blender/compositor/intern/COM_Converter.h new file mode 100644 index 00000000000..f5144d1bfed --- /dev/null +++ b/source/blender/compositor/intern/COM_Converter.h @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_Converter_h +#define _COM_Converter_h + +#include "DNA_node_types.h" +#include "COM_Node.h" + +/** + * @brief Conversion methods for the compositor + */ +class Converter { +public: + /** + * @brief Convert/wraps a bNode in its Node instance. + * + * For all nodetypes a wrapper class is created. + * Muted nodes are wrapped with MuteNode. + * + * @note When adding a new node to blender, this method needs to be changed to return the correct Node instance. + * + * @see Node + * @see MuteNode + */ + static Node* convert(bNode* bNode); + + /** + * @brief This method will add a datetype conversion rule when the to-socket does not support the from-socket actual data type. + * + * @note this method is called when conversion is needed. + * + * @param connection the SocketConnection what needs conversion + * @param system the ExecutionSystem to add the conversion to. + * @see SocketConnection - a link between two sockets + */ + static void convertDataType(SocketConnection* connection, ExecutionSystem *system); + + /** + * @brief This method will add a resolution rule based on the settings of the InputSocket. + * + * @note Conversion logic is implemented in this method + * @see InputSocketResizeMode for the possible conversions. + + * @param connection the SocketConnection what needs conversion + * @param system the ExecutionSystem to add the conversion to. + * @see SocketConnection - a link between two sockets + */ + static void convertResolution(SocketConnection* connection, ExecutionSystem *system); +}; +#endif diff --git a/source/blender/compositor/intern/COM_Device.cpp b/source/blender/compositor/intern/COM_Device.cpp new file mode 100644 index 00000000000..64172cdd472 --- /dev/null +++ b/source/blender/compositor/intern/COM_Device.cpp @@ -0,0 +1,24 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Device.h" + diff --git a/source/blender/compositor/intern/COM_Device.h b/source/blender/compositor/intern/COM_Device.h new file mode 100644 index 00000000000..74a9400f8f3 --- /dev/null +++ b/source/blender/compositor/intern/COM_Device.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_Device_h +#define _COM_Device_h + +#include "COM_ExecutionSystem.h" +#include "COM_WorkPackage.h" +#include "COM_NodeOperation.h" +#include "BLI_rect.h" +#include "COM_MemoryBuffer.h" + +/** + * @brief Abstract class for device implementations to be used by the Compositor. + * devices are queried, initialized and used by the WorkScheduler. + * work are packaged as a WorkPackage instance. + */ +class Device { +public: + /** + * @brief initialize the device + */ + virtual bool initialize() {return true;} + + /** + * @brief deinitialize the device + */ + virtual void deinitialize() {} + + /** + * @brief execute a WorkPackage + * @param work the WorkPackage to execute + */ + virtual void execute(WorkPackage *work) = 0; + +}; + +#endif diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp new file mode 100644 index 00000000000..22d4366a1a8 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -0,0 +1,566 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ExecutionGroup.h" +#include "COM_InputSocket.h" +#include "COM_SocketConnection.h" +#include "COM_defines.h" +#include "math.h" +#include "COM_ExecutionSystem.h" +#include +#include "COM_ReadBufferOperation.h" +#include "COM_WriteBufferOperation.h" +#include "COM_ReadBufferOperation.h" +#include "COM_WorkScheduler.h" +#include "COM_ViewerOperation.h" +#include +#include "BLI_math.h" +#include "COM_MemoryManager.h" +#include "PIL_time.h" +#include "COM_ChunkOrder.h" +#include +#include "BLI_math.h" +#include "COM_ExecutionSystemHelper.h" + +ExecutionGroup::ExecutionGroup() { + this->isOutput = false; + this->complex = false; + this->chunkExecutionStates = NULL; + this->bTree = NULL; + this->height = 0; + this->width = 0; + this->cachedMaxReadBufferOffset = 0; + this->numberOfXChunks = 0; + this->numberOfYChunks = 0; + this->numberOfChunks = 0; + this->initialized = false; + this->openCL = false; + this->chunksFinished = 0; +} + +int ExecutionGroup::getRenderPriotrity() { + return this->getOutputNodeOperation()->getRenderPriority(); +} + +bool ExecutionGroup::containsOperation(NodeOperation* operation) { + for (vector::const_iterator iterator = this->operations.begin() ; iterator != this->operations.end() ; ++iterator) { + NodeOperation* inListOperation = *iterator; + if (inListOperation == operation) { + return true; + } + } + return false; +} + +const bool ExecutionGroup::isComplex() const { + return this->complex; +} + +bool ExecutionGroup::canContainOperation(NodeOperation* operation) { + if (!this->initialized) {return true;} + if (operation->isReadBufferOperation()) {return true;} + if (operation->isWriteBufferOperation()) {return false;} + if (operation->isSetOperation()) {return true;} + + if (!this->isComplex()) { + return (!operation->isComplex()); + } else { + return false; + } +} + +void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operation) { + if (containsOperation(operation)) return; + if (canContainOperation(operation)) { + if (!operation->isBufferOperation()) { + this->complex = operation->isComplex(); + this->openCL = operation->isOpenCL(); + this->initialized = true; + } + this->operations.push_back(operation); + if (operation->isReadBufferOperation()) { + ReadBufferOperation* readOperation = (ReadBufferOperation*)operation; + WriteBufferOperation* writeOperation = readOperation->getMemoryProxy()->getWriteBufferOperation(); + this->addOperation(system, writeOperation); + } else { + unsigned int index; + for (index = 0 ; index < operation->getNumberOfInputSockets(); index ++) { + InputSocket * inputSocket = operation->getInputSocket(index); + if (inputSocket->isConnected()) { + NodeOperation* node = (NodeOperation*)inputSocket->getConnection()->getFromNode(); + this->addOperation(system, node); + } + } + } + } else { + if (operation->isWriteBufferOperation()) { + WriteBufferOperation * writeoperation = (WriteBufferOperation*)operation; + if (writeoperation->getMemoryProxy()->getExecutor() == NULL) { + ExecutionGroup* newGroup = new ExecutionGroup(); + writeoperation->getMemoryProxy()->setExecutor(newGroup); + newGroup->addOperation(system, operation); + ExecutionSystemHelper::addExecutionGroup(system->getExecutionGroups(), newGroup); + } + } + } +} + +NodeOperation* ExecutionGroup::getOutputNodeOperation() const{ + return this->operations[0]; // the first operation of the group is always the output operation. +} + +void ExecutionGroup::initExecution() +{ + if (this->chunkExecutionStates != NULL) { + delete[] this->chunkExecutionStates; + } + unsigned int index; + determineNumberOfChunks(); + + this->chunkExecutionStates = NULL; + if (this->numberOfChunks != 0) { + this->chunkExecutionStates = new ChunkExecutionState[numberOfChunks]; + for (index = 0 ; index < numberOfChunks ; index ++) { + this->chunkExecutionStates[index] = COM_ES_NOT_SCHEDULED; + } + } + + + unsigned int maxNumber = 0; + + for (index = 0 ; index < this->operations.size(); index ++) { + NodeOperation* operation = this->operations[index]; + if (operation->isReadBufferOperation()) { + ReadBufferOperation *readOperation = (ReadBufferOperation*)operation; + this->cachedReadOperations.push_back(readOperation); + maxNumber = max(maxNumber, readOperation->getOffset()); + } + } + maxNumber++; + this->cachedMaxReadBufferOffset = maxNumber; + +} + +void ExecutionGroup::deinitExecution() { + if (this->chunkExecutionStates != NULL) { + delete[] this->chunkExecutionStates; + this->chunkExecutionStates = NULL; + } + this->numberOfChunks = 0; + this->numberOfXChunks = 0; + this->numberOfYChunks = 0; + this->cachedReadOperations.clear(); + this->bTree = NULL; +} +void ExecutionGroup::determineResolution(unsigned int resolution[]) { + NodeOperation* operation = this->getOutputNodeOperation(); + unsigned int preferredResolution[2]; + preferredResolution[0] = 0; + preferredResolution[1] = 0; + operation->determineResolution(resolution, preferredResolution); + operation->setResolution(resolution); + this->setResolution(resolution); +} + +void ExecutionGroup::determineNumberOfChunks() { + const float chunkSizef = this->chunkSize; + this->numberOfXChunks = ceil(this->width / chunkSizef); + this->numberOfYChunks = ceil(this->height / chunkSizef); + this->numberOfChunks = this->numberOfXChunks * this->numberOfYChunks; +} + +/** + * this method is called for the top execution groups. containing the compositor node or the preview node or the viewer node) + */ +void ExecutionGroup::execute(ExecutionSystem* graph) { + CompositorContext& context = graph->getContext(); + const bNodeTree* bTree = context.getbNodeTree(); + if (this->width == 0 || this->height == 0) {return;} /// @note: break out... no pixels to calculate. + if (bTree->test_break && bTree->test_break(bTree->tbh)) {return;} /// @note: early break out for blur and preview nodes + if (this->numberOfChunks == 0) {return;} /// @note: early break out + unsigned int chunkNumber; + + this->chunksFinished = 0; + this->bTree = bTree; + unsigned int index; + unsigned int *chunkOrder = new unsigned int[this->numberOfChunks]; + + for (chunkNumber = 0 ; chunkNumbernumberOfChunks ; chunkNumber++) { + chunkOrder[chunkNumber] = chunkNumber; + } + NodeOperation *operation = this->getOutputNodeOperation(); + float centerX = 0.5; + float centerY = 0.5; + int chunkorder = COM_TO_CENTER_OUT; + + if (operation->isViewerOperation()) { + ViewerBaseOperation* viewer = (ViewerBaseOperation*)operation; + centerX = viewer->getCenterX(); + centerY = viewer->getCenterY(); + chunkorder = viewer->getChunkOrder(); + } + + switch (chunkorder) { + case COM_TO_RANDOM: + for (index = 0 ; index < 2* numberOfChunks ; index ++) { + int index1 = rand()%numberOfChunks; + int index2 = rand()%numberOfChunks; + int s = chunkOrder[index1]; + chunkOrder[index1] = chunkOrder[index2]; + chunkOrder[index2] = s; + } + break; + case COM_TO_CENTER_OUT: + { + ChunkOrderHotspot **hotspots = new ChunkOrderHotspot*[1]; + hotspots[0] = new ChunkOrderHotspot(this->width*centerX, this->height*centerY, 0.0f); + rcti rect; + ChunkOrder *chunkOrders = new ChunkOrder[this->numberOfChunks]; + for (index = 0 ; index < this->numberOfChunks; index ++) { + determineChunkRect(&rect, index); + chunkOrders[index].setChunkNumber(index); + chunkOrders[index].setX(rect.xmin); + chunkOrders[index].setY(rect.ymin); + chunkOrders[index].determineDistance(hotspots, 1); + } + + sort(&chunkOrders[0], &chunkOrders[numberOfChunks-1]); + for (index = 0 ; index < numberOfChunks; index ++) { + chunkOrder[index] = chunkOrders[index].getChunkNumber(); + } + + delete hotspots[0]; + delete[] hotspots; + delete[] chunkOrders; + } + break; + case COM_TO_RULE_OF_THIRDS: + { + ChunkOrderHotspot **hotspots = new ChunkOrderHotspot*[9]; + unsigned int tx = this->width/6; + unsigned int ty = this->height/6; + unsigned int mx = this->width/2; + unsigned int my = this->height/2; + unsigned int bx = mx+2*tx; + unsigned int by = my+2*ty; + + float addition = numberOfChunks/COM_RULE_OF_THIRDS_DIVIDER; + hotspots[0] = new ChunkOrderHotspot(mx, my, addition*0); + hotspots[1] = new ChunkOrderHotspot(tx, my, addition*1); + hotspots[2] = new ChunkOrderHotspot(bx, my, addition*2); + hotspots[3] = new ChunkOrderHotspot(bx, by, addition*3); + hotspots[4] = new ChunkOrderHotspot(tx, ty, addition*4); + hotspots[5] = new ChunkOrderHotspot(bx, ty, addition*5); + hotspots[6] = new ChunkOrderHotspot(tx, by, addition*6); + hotspots[7] = new ChunkOrderHotspot(mx, ty, addition*7); + hotspots[8] = new ChunkOrderHotspot(mx, by, addition*8); + rcti rect; + ChunkOrder *chunkOrders = new ChunkOrder[this->numberOfChunks]; + for (index = 0 ; index < this->numberOfChunks; index ++) { + determineChunkRect(&rect, index); + chunkOrders[index].setChunkNumber(index); + chunkOrders[index].setX(rect.xmin); + chunkOrders[index].setY(rect.ymin); + chunkOrders[index].determineDistance(hotspots, 9); + } + + sort(&chunkOrders[0], &chunkOrders[numberOfChunks]); + + for (index = 0 ; index < numberOfChunks; index ++) { + chunkOrder[index] = chunkOrders[index].getChunkNumber(); + } + + delete hotspots[0]; + delete hotspots[1]; + delete hotspots[2]; + delete hotspots[3]; + delete hotspots[4]; + delete hotspots[5]; + delete hotspots[6]; + delete hotspots[7]; + delete hotspots[8]; + delete[] hotspots; + delete[] chunkOrders; + } + break; + case COM_TO_TOP_DOWN: + default: + break; + } + + bool breaked = false; + bool finished = false; + unsigned int startIndex = 0; + const int maxNumberEvaluated = BLI_system_thread_count()*2; + + while (!finished && !breaked) { + unsigned int index; + bool startEvaluated = false; + finished = true; + int numberEvaluated = 0; + + for (index = startIndex ; index < numberOfChunks && numberEvaluated < maxNumberEvaluated; index ++) { + int chunkNumber = chunkOrder[index]; + int yChunk = chunkNumber/this->numberOfXChunks; + int xChunk = chunkNumber - (yChunk*this->numberOfXChunks); + const ChunkExecutionState state = this->chunkExecutionStates[chunkNumber]; + if (state == COM_ES_NOT_SCHEDULED) { + scheduleChunkWhenPossible(graph, xChunk, yChunk); + finished=false; + startEvaluated = true; + numberEvaluated++; + } else if (state == COM_ES_SCHEDULED) { + finished=false; + startEvaluated = true; + numberEvaluated++; + } else if (state == COM_ES_EXECUTED && !startEvaluated) { + startIndex = index+1; + } + } + PIL_sleep_ms(10); + + if (bTree->test_break && bTree->test_break(bTree->tbh)) { + breaked = true; + } + } + + delete[] chunkOrder; +} + +MemoryBuffer** ExecutionGroup::getInputBuffers(int chunkNumber) { + rcti rect; + vector memoryproxies; + unsigned int index; + determineChunkRect(&rect, chunkNumber); + + this->determineDependingMemoryProxies(&memoryproxies); + MemoryBuffer **memoryBuffers = new MemoryBuffer*[this->cachedMaxReadBufferOffset]; + for (index= 0 ; index < this->cachedMaxReadBufferOffset ; index ++) { + memoryBuffers[index] = NULL; + } + rcti output; + for (index = 0 ; index < this->cachedReadOperations.size(); index ++) { + ReadBufferOperation *readOperation = (ReadBufferOperation*)this->cachedReadOperations[index]; + MemoryProxy * memoryProxy = readOperation->getMemoryProxy(); + this->determineDependingAreaOfInterest(&rect, readOperation, &output); + MemoryBuffer* memoryBuffer = memoryProxy->getExecutor()->constructConsolidatedMemoryBuffer(memoryProxy, &output); + memoryBuffers[readOperation->getOffset()] = memoryBuffer; + } + return memoryBuffers; +} + +MemoryBuffer* ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *rect) { + // find all chunks inside the rect + // determine minxchunk, minychunk, maxxchunk, maxychunk where x and y are chunknumbers + float chunkSizef = this->chunkSize; + + int indexx, indexy; + + const int minxchunk = floor(rect->xmin/chunkSizef); + const int maxxchunk = ceil((rect->xmax-1)/chunkSizef); + const int minychunk = floor(rect->ymin/chunkSizef); + const int maxychunk = ceil((rect->ymax-1)/chunkSizef); + + if (maxxchunk== minxchunk+1 && maxychunk == minychunk+1) { + const int chunkNumber = minxchunk+minychunk*numberOfXChunks; + MemoryBuffer *result = MemoryManager::getMemoryBuffer(memoryProxy, chunkNumber); + return result; + } + + rcti chunkRect; + chunkRect.xmin = minxchunk*this->chunkSize; + chunkRect.xmax = maxxchunk*this->chunkSize; + chunkRect.ymin = minychunk*this->chunkSize; + chunkRect.ymax = maxychunk*this->chunkSize; + + CLAMP(chunkRect.xmin, 0, (int)this->width); + CLAMP(chunkRect.xmax, 0, (int)this->width); + CLAMP(chunkRect.ymin, 0, (int)this->height); + CLAMP(chunkRect.ymax, 0, (int)this->height); + + MemoryBuffer *result = new MemoryBuffer(memoryProxy, &chunkRect); + + for (indexx = max(minxchunk, 0); indexxnumberOfXChunks, maxxchunk) ; indexx++) { + for (indexy = max(minychunk, 0); indexynumberOfYChunks, maxychunk) ; indexy++) { + int chunkNumber = indexx+indexy*this->numberOfXChunks; + MemoryBuffer *chunkBuffer = MemoryManager::getMemoryBuffer(memoryProxy, chunkNumber); + result->copyContentFrom(chunkBuffer); + } + } + + return result; +} + +void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer** memoryBuffers) { + if (this->chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED) + this->chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED; + else + throw "Threading inconsistency"; + + this->chunksFinished++; + if (memoryBuffers) { + for (unsigned int index = 0 ; index < this->cachedMaxReadBufferOffset; index ++) { + MemoryBuffer * buffer = memoryBuffers[index]; + if (buffer) { + if (buffer->isTemporarily()) { + memoryBuffers[index] = NULL; + delete buffer; + } + } + } + delete[] memoryBuffers; + } + if (bTree) { + // status report is only performed for top level Execution Groups. + float progress = chunksFinished; + progress/=numberOfChunks; + bTree->progress(bTree->prh, progress); + } +} + +inline void ExecutionGroup::determineChunkRect(rcti* rect, const unsigned int xChunk, const unsigned int yChunk ) const { + const unsigned int minx = xChunk * chunkSize; + const unsigned int miny = yChunk * chunkSize; + BLI_init_rcti(rect, minx, min(minx + this->chunkSize, this->width), miny, min(miny + this->chunkSize, this->height)); +} + +void ExecutionGroup::determineChunkRect(rcti* rect, const unsigned int chunkNumber) const { + const unsigned int yChunk = chunkNumber / numberOfXChunks; + const unsigned int xChunk = chunkNumber - (yChunk * numberOfXChunks); + determineChunkRect(rect, xChunk, yChunk); +} + +MemoryBuffer* ExecutionGroup::allocateOutputBuffer(int chunkNumber, rcti* rect) { + MemoryBuffer* outputBuffer = NULL; + // output allocation is only valid when our outputoperation is a memorywriter + NodeOperation * operation = this->getOutputNodeOperation(); + if (operation->isWriteBufferOperation()) { + WriteBufferOperation* writeOperation = (WriteBufferOperation*)operation; + outputBuffer = MemoryManager::allocateMemoryBuffer(writeOperation->getMemoryProxy(), chunkNumber, rect); + } + return outputBuffer; +} + + +bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem * graph, rcti *area) { + // find all chunks inside the rect + // determine minxchunk, minychunk, maxxchunk, maxychunk where x and y are chunknumbers + + float chunkSizef = this->chunkSize; + + int indexx, indexy; + const int minxchunk = floor(area->xmin/chunkSizef); + const int maxxchunk = ceil((area->xmax-1)/chunkSizef); + const int minychunk = floor(area->ymin/chunkSizef); + const int maxychunk = ceil((area->ymax-1)/chunkSizef); + + bool result = true; + for (indexx = max(minxchunk, 0); indexxchunkExecutionStates[chunkNumber] == COM_ES_NOT_SCHEDULED) { + this->chunkExecutionStates[chunkNumber] = COM_ES_SCHEDULED; + WorkScheduler::schedule(this, chunkNumber); + return true; + } + return false; +} + +bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem * graph, int xChunk, int yChunk) { + if (xChunk < 0 || xChunk >= (int)this->numberOfXChunks) { + return true; + } + if (yChunk < 0 || yChunk >= (int)this->numberOfYChunks) { + return true; + } + int chunkNumber = yChunk*this->numberOfXChunks + xChunk; + // chunk is already executed + if (this->chunkExecutionStates[chunkNumber] == COM_ES_EXECUTED) { + return true; + } + + // chunk is scheduled, but not executed + if (this->chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED) { + return false; + } + + // chunk is nor executed nor scheduled. + vector memoryProxies; + this->determineDependingMemoryProxies(&memoryProxies); + + rcti rect; + determineChunkRect(&rect, xChunk, yChunk); + unsigned int index; + bool canBeExecuted = true; + rcti area; + + for (index = 0 ; index < cachedReadOperations.size() ; index ++) { + ReadBufferOperation * readOperation = (ReadBufferOperation*)cachedReadOperations[index]; + BLI_init_rcti(&area, 0, 0, 0, 0); + MemoryProxy * memoryProxy = memoryProxies[index]; + determineDependingAreaOfInterest(&rect, readOperation, &area); + ExecutionGroup *group = memoryProxy->getExecutor(); + + if (group != NULL) { + if (!group->scheduleAreaWhenPossible(graph, &area)) { + canBeExecuted = false; + } + } else { + throw "ERROR"; + } + } + + if (canBeExecuted) { + scheduleChunk(chunkNumber); + } + + return false; +} + +void ExecutionGroup::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output) { + this->getOutputNodeOperation()->determineDependingAreaOfInterest(input, readOperation, output); +} + +void ExecutionGroup::determineDependingMemoryProxies(vector *memoryProxies) { + unsigned int index; + for (index = 0 ; index < this->cachedReadOperations.size() ; index ++) { + ReadBufferOperation * readOperation = (ReadBufferOperation*) this->cachedReadOperations[index]; + memoryProxies->push_back(readOperation->getMemoryProxy()); + } +} + +bool ExecutionGroup::operator ==(const ExecutionGroup & executionGroup) const { + return this->getOutputNodeOperation() == executionGroup.getOutputNodeOperation(); +} + +bool ExecutionGroup::isOpenCL() { + return this->openCL; +} diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.h b/source/blender/compositor/intern/COM_ExecutionGroup.h new file mode 100644 index 00000000000..2d5e0965297 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionGroup.h @@ -0,0 +1,404 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ExecutionGroup_h +#define _COM_ExecutionGroup_h + +#include "COM_Node.h" +#include "COM_NodeOperation.h" +#include +#include "BLI_rect.h" +#include "COM_MemoryProxy.h" +#include "COM_Device.h" +#include "COM_CompositorContext.h" + + +/** + * @brief the execution state of a chunk in an ExecutionGroup + * @ingroup Execution + */ +typedef enum ChunkExecutionState { + /** + * @brief chunk is not yet scheduled + */ + COM_ES_NOT_SCHEDULED = 0, + /** + * @brief chunk is scheduled, but not yet executed + */ + COM_ES_SCHEDULED = 1, + /** + * @brief chunk is executed. + */ + COM_ES_EXECUTED = 2 +} ChunkExecutionState; + +class MemoryProxy; +class ReadBufferOperation; +class Device; + +/** + * @brief Class ExecutionGroup is a group of NodeOperations that are executed as one. + * This grouping is used to combine Operations that can be executed as one whole when multi-processing. + * @ingroup Execution + */ +class ExecutionGroup { +private: + // fields + /** + * @brief unique identifier of this node. + */ + string id; + + /** + * @brief list of operations in this ExecutionGroup + */ + vector operations; + + /** + * @brief is this ExecutionGroup an input ExecutionGroup + * an input execution group is a group that is at the end of the calculation (the output is important for the user) + */ + int isOutput; + + /** + * @brief Width of the output + */ + unsigned int width; + + /** + * @brief Height of the output + */ + unsigned int height; + + /** + * @brief size of a single chunk, being Width or of height + * a chunk is always a square, except at the edges of the MemoryBuffer + */ + unsigned int chunkSize; + + /** + * @brief number of chunks in the x-axis + */ + unsigned int numberOfXChunks; + + /** + * @brief number of chunks in the y-axis + */ + unsigned int numberOfYChunks; + + /** + * @brief total number of chunks + */ + unsigned int numberOfChunks; + + /** + * @brief contains this ExecutionGroup a complex NodeOperation. + */ + bool complex; + + /** + * @brief can this ExecutionGroup be scheduled on an OpenCLDevice + */ + bool openCL; + + /** + * @brief what is the maximum number field of all ReadBufferOperation in this ExecutionGroup. + * @note this is used to construct the MemoryBuffers that will be passed during execution. + */ + unsigned int cachedMaxReadBufferOffset; + + /** + * @brief a cached vector of all read operations in the execution group. + */ + vector cachedReadOperations; + + /** + * @brief reference to the original bNodeTree, this field is only set for the 'top' execution group. + * @note can only be used to call the callbacks for progress, status and break + */ + const bNodeTree * bTree; + + /** + * @brief total number of chunks that have been calculated for this ExecutionGroup + */ + unsigned int chunksFinished; + + /** + * @brief the chunkExecutionStates holds per chunk the execution state. this state can be + * - COM_ES_NOT_SCHEDULED: not scheduled + * - COM_ES_SCHEDULED: scheduled + * - COM_ES_EXECUTED: executed + */ + ChunkExecutionState *chunkExecutionStates; + + /** + * @brief indicator when this ExecutionGroup has valid NodeOperations in its vector for Execution + * @note When building the ExecutionGroup NodeOperations are added via recursion. First a WriteBufferOperations is added, then the + * @note Operation containing the settings that is important for the ExecutiongGroup is added, + * @note When this occurs, these settings are copied over from the node to the ExecutionGroup + * @note and the Initialized flag is set to true. + * @see complex + * @see openCL + */ + bool initialized; + + // methods + /** + * @brief check whether parameter operation can be added to the execution group + * @param operation the operation to be added + */ + bool canContainOperation(NodeOperation* operation); + + /** + * @brief get the Render priority of this ExecutionGroup + * @see ExecutionSystem.execute + */ + int getRenderPriotrity(); + + /** + * @brief calculate the actual chunk size of this execution group. + * @note A chunk size is an unsigned int that is both the height and width of a chunk. + * @note The chunk size will not be stored in the chunkSize field. This needs to be done + * @note by the calling method. + */ + unsigned int determineChunkSize(); + + + /** + * @brief Determine the rect (minx, maxx, miny, maxy) of a chunk at a position. + * @note Only gives usefull results ater the determination of the chunksize + * @see determineChunkSize() + */ + void determineChunkRect(rcti* rect, const unsigned int xChunk, const unsigned int yChunk) const; + + /** + * @brief determine the number of chunks, based on the chunkSize, width and height. + * @note The result are stored in the fields numberOfChunks, numberOfXChunks, numberOfYChunks + */ + void determineNumberOfChunks(); + + /** + * @brief try to schedule a specific chunk. + * @note scheduling succeeds when all input requirements are met and the chunks hasen't been scheduled yet. + * @param graph + * @param xChunk + * @param yChunk + * @return [true:false] + * true: package(s) are scheduled + * false: scheduling is deferred (depending workpackages are scheduled) + */ + bool scheduleChunkWhenPossible(ExecutionSystem * graph, int xChunk, int yChunk); + + /** + * @brief try to schedule a specific area. + * @note Check if a certain area is available, when not available this are will be checked. + * @note This method is called from other ExecutionGroup's. + * @param graph + * @param rect + * @return [true:false] + * true: package(s) are scheduled + * false: scheduling is deferred (depending workpackages are scheduled) + */ + bool scheduleAreaWhenPossible(ExecutionSystem * graph, rcti * rect); + + /** + * @brief add a chunk to the WorkScheduler. + * @param chunknumber + */ + bool scheduleChunk(unsigned int chunkNumber); + + /** + * @brief determine the area of interest of a certain input area + * @note This method only evaluates a single ReadBufferOperation + * @param input the input area + * @param readOperation The ReadBufferOperation where the area needs to be evaluated + * @param output the area needed of the ReadBufferOperation. Result + */ + void determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output); + + +public: + // constructors + ExecutionGroup(); + + /** + * @brief set the id of this ExecutionGroup + * @param id + */ + void setId(string id) {this->id = id;} + + /** + * @brief return the id of this ExecutionGroup + */ + const string getId() const {return this->id;} + + // methods + /** + * @brief check to see if a NodeOperation is already inside this execution group + * @param operation the NodeOperation to check + * @return [true,false] + */ + bool containsOperation(NodeOperation* operation); + + /** + * @brief add an operation to this ExecutionGroup + * @note this method will add input of the operations recursivly + * @note this method can create multiple ExecutionGroup's + * @param system + * @param operation + */ + void addOperation(ExecutionSystem* system, NodeOperation *operation); + + /** + * @brief is this ExecutionGroup an output ExecutionGroup + * @note An OutputExecution group are groups containing a + * @note ViewerOperation, CompositeOperation, PreviewOperation. + * @see NodeOperation.isOutputOperation + */ + const int isOutputExecutionGroup() const {return this->isOutput;} + + /** + * @brief set whether this ExecutionGroup is an output + * @param isOutput + */ + void setOutputExecutionGroup(int isOutput) {this->isOutput = isOutput;} + + /** + * @brief determine the resolution of this ExecutionGroup + * @param resolution + */ + void determineResolution(unsigned int resolution[]); + + /** + * @brief set the resolution of this executiongroup + * @param resolution + */ + void setResolution(unsigned int resolution[]) {this->width = resolution[0];this->height = resolution[1];} + + /** + * @brief get the width of this execution group + */ + const unsigned int getWidth() {return this->width;} + + /** + * @brief get the height of this execution group + */ + const unsigned int getHeight() {return this->height;} + + /** + * @brief does this ExecutionGroup contains a complex NodeOperation + */ + const bool isComplex() const; + + + /** + * @brief get the output operation of this ExecutionGroup + * @return NodeOperation* output operation + */ + NodeOperation* getOutputNodeOperation() const; + + /** + * @brief compose multiple chunks into a single chunk + * @return Memorybuffer* consolidated chunk + */ + MemoryBuffer* constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *output); + + /** + * @brief initExecution is called just before the execution of the whole graph will be done. + * @note The implementation will calculate the chunkSize of this execution group. + */ + void initExecution(); + + /** + * @brief get all inputbuffers needed to calculate an chunk + * @note all inputbuffers must be executed + * @param chunkNumber the chunk to be calculated + * @return MemoryBuffer** the inputbuffers + */ + MemoryBuffer** getInputBuffers(int chunkNumber); + + /** + * @brief allocate the outputbuffer of a chunk + * @param chunkNumber the number of the chunk in the ExecutionGroup + * @param rect the rect of that chunk + * @see determineChunkRect + */ + MemoryBuffer* allocateOutputBuffer(int chunkNumber, rcti *rect); + + /** + * @brief after a chunk is executed the needed resources can be freed or unlocked. + * @param chunknumber + * @param memorybuffers + */ + void finalizeChunkExecution(int chunkNumber, MemoryBuffer** memoryBuffers); + + /** + * @brief deinitExecution is called just after execution the whole graph. + * @note It will release all needed resources + */ + void deinitExecution(); + + + /** + * @brief schedule an ExecutionGroup + * @note this method will return when all chunks have been calculated, or the execution has breaked (by user) + * + * first the order of the chunks will be determined. This is determined by finding the ViewerOperation and get the relevant information from it. + * - ChunkOrdering + * - CenterX + * - CenterY + * + * After determining the order of the chunks the chunks will be scheduled + * + * @see ViewerOperation + * @param system + */ + void execute(ExecutionSystem* system); + + /** + * @brief this method determines the MemoryProxy's where this execution group depends on. + * @note After this method determineDependingAreaOfInterest can be called to determine + * @note the area of the MemoryProxy.creator thas has to be executed. + * @param memoryProxies result + */ + void determineDependingMemoryProxies(vector *memoryProxies); + + /** + * @brief Determine the rect (minx, maxx, miny, maxy) of a chunk. + * @note Only gives usefull results ater the determination of the chunksize + * @see determineChunkSize() + */ + void determineChunkRect(rcti* rect, const unsigned int chunkNumber) const; + + + bool operator ==(const ExecutionGroup &executionGroup) const; + + /** + * @brief can this ExecutionGroup be scheduled on an OpenCLDevice + * @see WorkScheduler.schedule + */ + bool isOpenCL(); + + void setChunksize(int chunksize) {this->chunkSize = chunksize;} +}; + +#endif diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp new file mode 100644 index 00000000000..d82d725d234 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp @@ -0,0 +1,310 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ExecutionSystem.h" + +#include "PIL_time.h" +#include "BKE_node.h" +#include "COM_Converter.h" +#include +#include "COM_NodeOperation.h" +#include "COM_ExecutionGroup.h" +#include "COM_NodeBase.h" +#include "COM_WorkScheduler.h" +#include "COM_ReadBufferOperation.h" +#include "COM_MemoryManager.h" +#include "stdio.h" +#include "COM_GroupNode.h" +#include "COM_WriteBufferOperation.h" +#include "COM_ReadBufferOperation.h" +#include "COM_ExecutionSystemHelper.h" + +#include "BKE_global.h" + +ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { + this->context.setbNodeTree(editingtree); + + /* initialize the CompositorContext */ + if (rendering) { + context.setQuality((CompositorQuality)editingtree->render_quality); + } else { + context.setQuality((CompositorQuality)editingtree->edit_quality); + } + context.setRendering(rendering); + context.setHasActiveOpenCLDevices(WorkScheduler::hasGPUDevices() && (editingtree->flag & NTREE_COM_OPENCL)); + + Node* mainOutputNode=NULL; + + mainOutputNode = ExecutionSystemHelper::addbNodeTree(*this, 0, editingtree); + + if (mainOutputNode) { + context.setScene((Scene*)mainOutputNode->getbNode()->id); + this->convertToOperations(); + this->groupOperations(); /* group operations in ExecutionGroups */ + vector executionGroups; + this->findOutputExecutionGroup(&executionGroups); + unsigned int index; + unsigned int resolution[2]; + for (index = 0 ; index < executionGroups.size(); index ++) { + resolution[0]=0; + resolution[1]=0; + ExecutionGroup* executionGroup = executionGroups[index]; + executionGroup->determineResolution(resolution); + } + } + + if (G.f & G_DEBUG) ExecutionSystemHelper::debugDump(this); +} + +ExecutionSystem::~ExecutionSystem() { + unsigned int index; + for(index = 0; index < this->connections.size(); index++) { + SocketConnection* connection = this->connections[index]; + delete connection; + } + this->connections.clear(); + for(index = 0; index < this->nodes.size(); index++) { + Node* node = this->nodes[index]; + delete node; + } + this->nodes.clear(); + for(index = 0; index < this->operations.size(); index++) { + NodeOperation* operation = this->operations[index]; + delete operation; + } + this->operations.clear(); + for(index = 0; index < this->groups.size(); index++) { + ExecutionGroup* group = this->groups[index]; + delete group; + } + this->groups.clear(); +} + +void ExecutionSystem::execute() { + unsigned int order = 0; + for( vector::iterator iter = this->operations.begin(); iter != operations.end(); ++iter ) { + NodeBase* node = *iter; + NodeOperation *operation = (NodeOperation*) node; + if (operation->isReadBufferOperation()) { + ReadBufferOperation * readOperation = (ReadBufferOperation*)operation; + readOperation->setOffset(order); + order ++; + } + } + + MemoryManager::initialize(); + unsigned int index; + + for (index = 0 ; index < this->operations.size() ; index ++) { + NodeOperation * operation = this->operations[index]; + operation->initExecution(); + } + for (index = 0 ; index < this->groups.size() ; index ++) { + ExecutionGroup * executionGroup = this->groups[index]; + executionGroup->setChunksize(context.getChunksize()); + executionGroup->initExecution(); + } + + WorkScheduler::start(this->context); + + + vector executionGroups; + this->findOutputExecutionGroup(&executionGroups); + + /* start execution of the ExecutionGroups based on priority of their output node */ + for (int priority = 9 ; priority>=0 ; priority--) { + for (index = 0 ; index < executionGroups.size(); index ++) { + ExecutionGroup* group = executionGroups[index]; + NodeOperation* output = group->getOutputNodeOperation(); + if (output->getRenderPriority() == priority) { + group->execute(this); + } + } + } + + WorkScheduler::finish(); + WorkScheduler::stop(); + + for (index = 0 ; index < this->operations.size() ; index ++) { + NodeOperation * operation = this->operations[index]; + operation->deinitExecution(); + } + for (index = 0 ; index < this->groups.size() ; index ++) { + ExecutionGroup * executionGroup = this->groups[index]; + executionGroup->deinitExecution(); + } + MemoryManager::clear(); +} + +void ExecutionSystem::addOperation(NodeOperation *operation) { + ExecutionSystemHelper::addOperation(this->operations, operation); +} + +void ExecutionSystem::addReadWriteBufferOperations(NodeOperation *operation) { + // for every input add write and read operation if input is not a read operation + // only add read operation to other links when they are attached to buffered operations. + unsigned int index; + for (index = 0 ; index < operation->getNumberOfInputSockets();index++) { + InputSocket* inputsocket = operation->getInputSocket(index); + if (inputsocket->isConnected()) { + SocketConnection *connection = inputsocket->getConnection(); + NodeOperation* otherEnd = (NodeOperation*)connection->getFromNode(); + if (!otherEnd->isReadBufferOperation()) { + // check of other end already has write operation + OutputSocket *fromsocket = connection->getFromSocket(); + WriteBufferOperation * writeoperation = fromsocket->findAttachedWriteBufferOperation(); + if (writeoperation == NULL) { + writeoperation = new WriteBufferOperation(); + writeoperation->setbNodeTree(this->getContext().getbNodeTree()); + this->addOperation(writeoperation); + ExecutionSystemHelper::addLink(this->getConnections(), fromsocket, writeoperation->getInputSocket(0)); + } + ReadBufferOperation *readoperation = new ReadBufferOperation(); + readoperation->setMemoryProxy(writeoperation->getMemoryProxy()); + connection->setFromSocket(readoperation->getOutputSocket()); + readoperation->getOutputSocket()->addConnection(connection); + this->addOperation(readoperation); + } + } + } + /* + link the outputsocket to a write operation + link the writeoperation to a read operation + link the read operation to the next node. + */ + OutputSocket * outputsocket = operation->getOutputSocket(); + if (outputsocket->isConnected()) { + int index; + WriteBufferOperation *writeOperation; + writeOperation = new WriteBufferOperation(); + writeOperation->setbNodeTree(this->getContext().getbNodeTree()); + this->addOperation(writeOperation); + for (index = 0 ; index < outputsocket->getNumberOfConnections();index ++) { + SocketConnection * connection = outputsocket->getConnection(index); + ReadBufferOperation* readoperation = new ReadBufferOperation(); + readoperation->setMemoryProxy(writeOperation->getMemoryProxy()); + connection->setFromSocket(readoperation->getOutputSocket()); + readoperation->getOutputSocket()->addConnection(connection); + this->addOperation(readoperation); + } + ExecutionSystemHelper::addLink(this->getConnections(), outputsocket, writeOperation->getInputSocket(0)); + } +} + +void ExecutionSystem::convertToOperations() { + unsigned int index; + // first determine data types of the nodes, this can be used by the node to convert to a different operation system + this->determineActualSocketDataTypes((vector&)this->nodes); + for(index = 0; index < this->nodes.size(); index++) { + Node* node = (Node*)this->nodes[index]; + node->convertToOperations(this, &this->context); + } + + // update the socket types of the operations. this will be used to add conversion operations in the system + this->determineActualSocketDataTypes((vector&)this->operations); + for (index = 0 ; index < this->connections.size(); index ++) { + SocketConnection *connection = this->connections[index]; + if (connection->isValid()) { + if (connection->getFromSocket()->getActualDataType() != connection->getToSocket()->getActualDataType()) { + Converter::convertDataType(connection, this); + } + } + } + + // determine all resolutions of the operations (Width/Height) + for (index = 0 ; index < this->operations.size(); index ++) { + NodeOperation* operation= this->operations[index]; + if (operation->isOutputOperation(context.isRendering())) { + unsigned int resolution[2] = {0,0}; + unsigned int preferredResolution[2] = {0,0}; + operation->determineResolution(resolution, preferredResolution); + operation->setResolution(resolution); + } + } + + // add convert resolution operations when needed. + for (index = 0 ; index < this->connections.size(); index ++) { + SocketConnection *connection = this->connections[index]; + if (connection->isValid()) { + if (connection->needsResolutionConversion()) { + Converter::convertResolution(connection, this); + } + } + } + +} + +void ExecutionSystem::groupOperations() { + vector outputOperations; + NodeOperation * operation; + unsigned int index; + // surround complex operations with ReadBufferOperation and WriteBufferOperation + for(index = 0; index < this->operations.size(); index++) { + operation = this->operations[index]; + if (operation->isComplex()) { + this->addReadWriteBufferOperations(operation); + } + } + ExecutionSystemHelper::findOutputNodeOperations(&outputOperations, this->getOperations(), this->context.isRendering()); + for( vector::iterator iter = outputOperations.begin(); iter != outputOperations.end(); ++iter ) { + operation = *iter; + ExecutionGroup *group = new ExecutionGroup(); + group->addOperation(this, operation); + group->setOutputExecutionGroup(true); + ExecutionSystemHelper::addExecutionGroup(this->getExecutionGroups(), group); + } +} + +void ExecutionSystem::addSocketConnection(SocketConnection *connection) +{ + this->connections.push_back(connection); +} + + +void ExecutionSystem::determineActualSocketDataTypes(vector &nodes) { + unsigned int index; + /* first do all input nodes */ + for(index = 0; index < nodes.size(); index++) { + NodeBase* node = nodes[index]; + if (node->isInputNode()) { + node->determineActualSocketDataTypes(); + } + } + + /* then all other nodes */ + for(index = 0; index < nodes.size(); index++) { + NodeBase* node = nodes[index]; + if (!node->isInputNode()) { + node->determineActualSocketDataTypes(); + } + } +} + +void ExecutionSystem::findOutputExecutionGroup(vector *result) const { + unsigned int index; + for (index = 0 ; index < this->groups.size() ; index ++) { + ExecutionGroup* group = this->groups[index]; + if (group->isOutputExecutionGroup()) { + result->push_back(group); + } + } +} diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.h b/source/blender/compositor/intern/COM_ExecutionSystem.h new file mode 100644 index 00000000000..7d0830491f3 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionSystem.h @@ -0,0 +1,229 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class ExecutionGroup; + +#ifndef _COM_ExecutionSystem_h +#define _COM_ExecutionSystem_h + +#include "DNA_node_types.h" +#include +#include "COM_Node.h" +#include "COM_SocketConnection.h" +#include "BKE_text.h" +#include "COM_ExecutionGroup.h" +#include "COM_NodeOperation.h" + +using namespace std; + +/** + * @page execution Execution model + * In order to get to an efficient model for execution, serveral steps are being done. these steps are explained below. + * + * @section EM_Step1 Step 1: translating blender node system to the new compsitor system + * Blenders node structure is based on C structs (DNA). These structs are not efficient in the new architecture. We want to use classes in order to simplify the system. + * during this step the blender node_tree is evaluated and converted to a CPP node system. + * + * @see ExecutionSystem + * @see Converter.convert + * @see Node + * + * @section EM_Step2 Step2: translating nodes to operations + * Ungrouping the GroupNodes. Group nodes are node_tree's in node_tree's. The new system only supports a single level of node_tree. We will 'flatten' the system in a single level. + * @see GroupNode + * @see ExecutionSystemHelper.ungroup + * + * Every node has the ability to convert itself to operations. The node itself is responsible to create a correct NodeOperation setup based on its internal settings. + * Most Node only need to convert it to its NodeOperation. Like a ColorToBWNode doesn't check anything, but replaces itself with a ConvertColorToBWOperation. + * More complex nodes can use different NodeOperation based on settings; like MixNode. based on the selected Mixtype a different operation will be used. + * for more information see the page about creating new Nodes. [@subpage newnode] + * + * @see ExecutionSystem.convertToOperations + * @see Node.convertToOperations + * @see NodeOperation base class for all operations in the system + * + * @section EM_Step3 Step3: add additional conversions to the operation system + * - Data type conversions: the system has 3 data types COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR. The user can connect a Value socket to a color socket. As values are ordered differently than colors a conversion happens. + * + * - Image size conversions: the system can automatically convert when resolutions do not match. An InputSocket has a resize mode. This can be any of the folowing settings. + * - [@ref InputSocketResizeMode.COM_SC_CENTER]: The center of both images are aligned + * - [@ref InputSocketResizeMode.COM_SC_FIT_WIDTH]: The width of both images are aligned + * - [@ref InputSocketResizeMode.COM_SC_FIT_HEIGHT]: the height of both images are aligned + * - [@ref InputSocketResizeMode.COM_SC_FIT]: The width, or the height of both images are aligned to make sure that it fits. + * - [@ref InputSocketResizeMode.COM_SC_STRETCH]: The width and the height of both images are aligned + * - [@ref InputSocketResizeMode.COM_SC_NO_RESIZE]: bottom left of the images are aligned. + * + * @see Converter.convertDataType Datatype conversions + * @see Converter.convertResolution Image size conversions + * + * @section EM_Step4 Step4: group operations in executions groups + * ExecutionGroup are groups of operations that are calculated as being one bigger operation. All operations will be part of an ExecutionGroup. + * Complex nodes will be added to separate groups. Between ExecutionGroup's the data will be stored in MemoryBuffers. ReadBufferOperations and WriteBufferOperations are added where needed. + * + *
+  *
+  *        +------------------------------+      +----------------+
+  *        | ExecutionGroup A             |      |ExecutionGroup B|   ExecutionGroup
+  *        | +----------+     +----------+|      |+----------+    |
+  *   /----->| Operation|---->| Operation|-\ /--->| Operation|-\  |   NodeOperation
+  *   |    | | A        |     | B        ||| |   || C        | |  |
+  *   |    | | cFFA     |  /->| cFFA     ||| |   || cFFA     | |  |
+  *   |    | +----------+  |  +----------+|| |   |+----------+ |  |
+  *   |    +---------------|--------------+v |   +-------------v--+
+  * +-*----+           +---*--+         +--*-*--+           +--*----+
+  * |inputA|           |inputB|         |outputA|           |outputB| MemoryBuffer
+  * |cFAA  |           |cFAA  |         |cFAA   |           |cFAA   |
+  * +------+           +------+         +-------+           +-------+
+  * 
+ * @see ExecutionSystem.groupOperations method doing this step + * @see ExecutionSystem.addReadWriteBufferOperations + * @see NodeOperation.isComplex + * @see ExecutionGroup class representing the ExecutionGroup + */ + +/** + * @brief the ExecutionSystem contains the whole compositor tree. + */ +class ExecutionSystem { +private: + /** + * @brief the context used during execution + */ + CompositorContext context; + + /** + * @brief vector of nodes + */ + vector nodes; + + /** + * @brief vector of operations + */ + vector operations; + + /** + * @brief vector of groups + */ + vector groups + + /** + * @brief vector of connections + */; + vector connections; + +private: //methods + /** + * @brief add ReadBufferOperation and WriteBufferOperation around an operation + * @param operation the operation to add the bufferoperations around. + */ + void addReadWriteBufferOperations(NodeOperation* operation); + + + /** + * find all execution group with output nodes + */ + void findOutputExecutionGroup(vector *result) const; + +public: + /** + * @brief Create a new ExecutionSystem and initialize it with the + * editingtree. + * + * @param editingtree [bNodeTree*] + * @param rendering [true false] + */ + ExecutionSystem(bNodeTree* editingtree, bool rendering); + + /** + * Destructor + */ + ~ExecutionSystem(); + + + /** + * @brief execute this system + * - initialize the NodeOperation's and ExecutionGroup's + * - schedule the output ExecutionGroup's based on their priority + * - deinitialize the ExecutionGroup's and NodeOperation's + */ + void execute(); + + /** + * @brief Add an operation to the operation list + * + * @param operation the operation to add + */ + void addOperation(NodeOperation* operation); + + /** + * Add an editor link to the system. convert it to an socketconnection (CPP-representative) + * this converted socket is returned. + */ + SocketConnection* addNodeLink(bNodeLink* bNodeLink); + void addSocketConnection(SocketConnection* connection); + + /** + * @brief Convert all nodes to operations + */ + void convertToOperations(); + + /** + * @brief group operations in ExecutionGroup's + * @see ExecutionGroup + */ + void groupOperations(); + + /** + * @brief get the reference to the compositor context + */ + CompositorContext& getContext() {return this->context;} + + /** + * @brief get the reference to the compositor nodes + */ + vector& getNodes() {return this->nodes;} + + /** + * @brief get the reference to the compositor connections + */ + vector& getConnections() {return this->connections;} + + /** + * @brief get the reference to the list of execution groups + */ + vector& getExecutionGroups() {return this->groups;} + + /** + * @brief get the reference to the list of operations + */ + vector& getOperations() {return this->operations;} + +private: + + /** + * @brief determine the actual data types of all sockets + * @param nodes list of nodes or operations to do the data type determination + */ + void determineActualSocketDataTypes(vector &nodes); + +}; +#endif diff --git a/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp b/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp new file mode 100644 index 00000000000..d6b03b41105 --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp @@ -0,0 +1,310 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ExecutionSystemHelper.h" + +#include "PIL_time.h" +#include "BKE_node.h" +#include "COM_Converter.h" +#include +#include "COM_NodeOperation.h" +#include "COM_ExecutionGroup.h" +#include "COM_NodeBase.h" +#include "COM_WorkScheduler.h" +#include "COM_ReadBufferOperation.h" +#include "COM_MemoryManager.h" +#include "stdio.h" +#include "COM_GroupNode.h" +#include "COM_WriteBufferOperation.h" +#include "COM_ReadBufferOperation.h" + +Node* ExecutionSystemHelper::addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree *tree) { + vector& nodes = system.getNodes(); + vector& links = system.getConnections(); + Node* mainnode = NULL; + /* add all nodes of the tree to the node list */ + bNode* node = (bNode*)tree->nodes.first; + while (node != NULL) { + Node* execnode = addNode(nodes, node); + if (node->type == CMP_NODE_COMPOSITE) { + mainnode = execnode; + } + node = (bNode*)node->next; + } + + NodeRange node_range(nodes.begin()+nodes_start, nodes.end()); + + /* add all nodelinks of the tree to the link list */ + bNodeLink* nodelink = (bNodeLink*)tree->links.first; + while (nodelink != NULL) { + addNodeLink(node_range, links, nodelink); + nodelink = (bNodeLink*)nodelink->next; + } + + /* Expand group nodes */ + for (int i=nodes_start; i < nodes.size(); ++i) { + Node *execnode = nodes[i]; + if (execnode->isGroupNode()) { + GroupNode * groupNode = (GroupNode*)execnode; + groupNode->ungroup(system); + } + } + + return mainnode; +} + +void ExecutionSystemHelper::addNode(vector& nodes, Node *node) { + nodes.push_back(node); +} + +Node* ExecutionSystemHelper::addNode(vector& nodes, bNode *bNode) { + Converter converter; + Node * node; + node = converter.convert(bNode); + if (node != NULL) { + addNode(nodes, node); + return node; + } + return NULL; +} +void ExecutionSystemHelper::addOperation(vector& operations, NodeOperation *operation) { + operations.push_back(operation); +} + +void ExecutionSystemHelper::addExecutionGroup(vector& executionGroups, ExecutionGroup *executionGroup) { + executionGroups.push_back(executionGroup); +} + +void ExecutionSystemHelper::findOutputNodeOperations(vector* result, vector& operations, bool rendering) { + unsigned int index; + + for (index = 0 ; index < operations.size() ; index ++) { + NodeOperation* operation = operations[index]; + if (operation->isOutputOperation(rendering)) { + result->push_back(operation); + } + } +} + +static InputSocket* find_input(NodeRange &node_range, bNode *bnode, bNodeSocket* bsocket) { + if (bnode != NULL) { + for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + Node* node = *it; + if (node->getbNode() == bnode) + return node->findInputSocketBybNodeSocket(bsocket); + } + } else { + for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + Node* node = *it; + if (node->isProxyNode()) { + InputSocket *proxySocket = node->getInputSocket(0); + if (proxySocket->getbNodeSocket()==bsocket) + return proxySocket; + } + } + } + return NULL; +} +static OutputSocket* find_output(NodeRange &node_range, bNode *bnode, bNodeSocket* bsocket) { + if (bnode != NULL) { + for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + Node* node = *it; + if (node->getbNode() == bnode) + return node->findOutputSocketBybNodeSocket(bsocket); + } + } else { + for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + Node* node = *it; + if (node->isProxyNode()) { + OutputSocket *proxySocket = node->getOutputSocket(0); + if (proxySocket->getbNodeSocket()==bsocket) + return proxySocket; + } + } + } + return NULL; +} +SocketConnection* ExecutionSystemHelper::addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink) { + /// @note: cyclic lines will be ignored. This has been copied from node.c + if (bNodeLink->tonode != 0 && bNodeLink->fromnode != 0) { + if(!(bNodeLink->fromnode->level >= bNodeLink->tonode->level && bNodeLink->tonode->level!=0xFFF)) { // only add non cyclic lines! so execution will procede + return NULL; + } + } + + InputSocket *inputSocket = find_input(node_range, bNodeLink->tonode, bNodeLink->tosock); + OutputSocket *outputSocket = find_output(node_range, bNodeLink->fromnode, bNodeLink->fromsock); + if (inputSocket == NULL || outputSocket == NULL) { + return NULL; + } + if (inputSocket->isConnected()) { + return NULL; + } + SocketConnection* connection = addLink(links, outputSocket, inputSocket); + return connection; +} + +SocketConnection* ExecutionSystemHelper::addLink(vector& links, OutputSocket* fromSocket, InputSocket* toSocket) { + SocketConnection * newconnection = new SocketConnection(); + newconnection->setFromSocket(fromSocket); + newconnection->setToSocket(toSocket); + fromSocket->addConnection(newconnection); + toSocket->setConnection(newconnection); + links.push_back(newconnection); + return newconnection; +} + +void ExecutionSystemHelper::debugDump(ExecutionSystem* system) { + Node* node; + NodeOperation* operation; + ExecutionGroup* group; + SocketConnection* connection; + int tot, tot2; + printf("-- BEGIN COMPOSITOR DUMP --\r\n"); + printf("digraph compositorexecution {\r\n"); + tot = system->getNodes().size(); + for (int i = 0 ; i < tot ; i ++) { + node = system->getNodes()[i]; + printf("// NODE: %s\r\n", node->getbNode()->typeinfo->name); + } + tot = system->getOperations().size(); + for (int i = 0 ; i < tot ; i ++) { + operation = system->getOperations()[i]; + printf("// OPERATION: %p\r\n", operation); + printf("\t\"O_%p\"", operation); + printf(" [shape=record,label=\"{"); + tot2 = operation->getNumberOfInputSockets(); + if (tot2 != 0) { + printf("{"); + for (int j = 0 ; j < tot2 ; j ++) { + InputSocket *socket = operation->getInputSocket(j); + if (j != 0) { + printf("|"); + } + printf("", socket); + switch (socket->getActualDataType()) { + case COM_DT_VALUE: + printf("Value"); + break; + case COM_DT_VECTOR: + printf("Vector"); + break; + case COM_DT_COLOR: + printf("Color"); + break; + case COM_DT_UNKNOWN: + printf("Unknown"); + break; + } + } + printf("}"); + printf("|"); + } + if (operation->isViewerOperation()) { + printf("Viewer"); + } else if (operation->isOutputOperation(system->getContext().isRendering())) { + printf("Output"); + } else if (operation->isSetOperation()) { + printf("Set"); + } else if (operation->isReadBufferOperation()) { + printf("ReadBuffer"); + } else if (operation->isWriteBufferOperation()) { + printf("WriteBuffer"); + } else { + printf("O_%p", operation); + } + tot2 = operation->getNumberOfOutputSockets(); + if (tot2 != 0) { + printf("|"); + printf("{"); + for (int j = 0 ; j < tot2 ; j ++) { + OutputSocket *socket = operation->getOutputSocket(j); + if (j != 0) { + printf("|"); + } + printf("", socket); + switch (socket->getActualDataType()) { + case COM_DT_VALUE: + printf("Value"); + break; + case COM_DT_VECTOR: + printf("Vector"); + break; + case COM_DT_COLOR: + printf("Color"); + break; + case COM_DT_UNKNOWN: + printf("Unknown"); + break; + } + } + printf("}"); + } + printf("}\"]"); + printf("\r\n"); + } + tot = system->getExecutionGroups().size(); + for (int i = 0 ; i < tot ; i ++) { + group = system->getExecutionGroups()[i]; + printf("// GROUP: %d\r\n", i); + printf("subgraph {\r\n"); + printf("// OUTPUTOPERATION: %p\r\n", group->getOutputNodeOperation()); + printf(" O_%p\r\n", group->getOutputNodeOperation()); + printf("}\r\n"); + } + tot = system->getOperations().size(); + for (int i = 0 ; i < tot ; i ++) { + operation = system->getOperations()[i]; + if (operation->isReadBufferOperation()) { + ReadBufferOperation * read = (ReadBufferOperation*)operation; + WriteBufferOperation * write= read->getMemoryProxy()->getWriteBufferOperation(); + printf("\t\"O_%p\" -> \"O_%p\" [style=dotted]\r\n", write, read); + } + } + tot = system->getConnections().size(); + for (int i = 0 ; i < tot ; i ++) { + connection = system->getConnections()[i]; + printf("// CONNECTION: %p.%p -> %p.%p\r\n", connection->getFromNode(), connection->getFromSocket(), connection->getToNode(), connection->getToSocket()); + printf("\t\"O_%p\":\"OUT_%p\" -> \"O_%p\":\"IN_%p\"", connection->getFromNode(), connection->getFromSocket(), connection->getToNode(), connection->getToSocket()); + if (!connection->isValid()) { + printf(" [color=red]"); + } else { + switch (connection->getFromSocket()->getActualDataType()) { + case COM_DT_VALUE: + printf(" [color=grey]"); + break; + case COM_DT_VECTOR: + printf(" [color=blue]"); + break; + case COM_DT_COLOR: + printf(" [color=orange]"); + break; + case COM_DT_UNKNOWN: + printf(" [color=black]"); + break; + } + } + printf("\r\n"); + } + printf("}\r\n"); + printf("-- END COMPOSITOR DUMP --\r\n"); +} diff --git a/source/blender/compositor/intern/COM_ExecutionSystemHelper.h b/source/blender/compositor/intern/COM_ExecutionSystemHelper.h new file mode 100644 index 00000000000..e6b11c4043f --- /dev/null +++ b/source/blender/compositor/intern/COM_ExecutionSystemHelper.h @@ -0,0 +1,127 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class ExecutionGroup; + +#ifndef _COM_ExecutionSystemHelper_h +#define _COM_ExecutionSystemHelper_h + +#include "DNA_node_types.h" +#include +#include "COM_Node.h" +#include "COM_SocketConnection.h" +#include "BKE_text.h" +#include "COM_ExecutionGroup.h" + +using namespace std; + +/** + * + */ +class ExecutionSystemHelper { + +public: + + /** + * @brief add an bNodeTree to the nodes list and connections + * @param system Execution system + * @param nodes_start Starting index in the system's nodes list for nodes in this tree. + * @param tree bNodeTree to add + * @return Node representing the "Compositor node" of the maintree. or NULL when a subtree is added + */ + static Node* addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree * tree); + + /** + * @brief add an editor node to the system. + * this node is converted to a Node instance. + * and the converted node is returned + * + * @param bNode node to add + * @return Node that represents the bNode or null when not able to convert. + */ + static Node* addNode(vector& nodes, bNode* bNode); + + /** + * @brief Add a Node to a list + * + * @param nodes the list where the node needs to be added to + * @param node the node to be added + */ + static void addNode(vector& nodes, Node* node); + + /** + * @brief Add an operation to the operation list + * + * The id of the operation is updated. + * + * @param operations the list where the operation need to be added to + * @param operation the operation to add + */ + static void addOperation(vector &operations, NodeOperation* operation); + + /** + * @brief Add an ExecutionGroup to a list + * + * The id of the ExecutionGroup is updated. + * + * @param executionGroups the list where the executionGroup need to be added to + * @param executionGroup the ExecutionGroup to add + */ + static void addExecutionGroup(vector& executionGroups, ExecutionGroup *executionGroup); + + /** + * Find all Node Operations that needs to be executed. + * @param rendering + * the rendering parameter will tell what type of execution we are doing + * FALSE is editing, TRUE is rendering + */ + static void findOutputNodeOperations(vector* result, vector& operations , bool rendering); + + /** + * @brief add a bNodeLink to the list of links + * the bNodeLink will be wrapped in a SocketConnection + * + * @note Cyclic links will be ignored + * + * @param node_range list of possible nodes for lookup. + * @param links list of links to add the bNodeLink to + * @param bNodeLink the link to be added + * @return the created SocketConnection or NULL + */ + static SocketConnection* addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink); + + /** + * @brief create a new SocketConnection and add to a vector of links + * @param links the vector of links + * @param fromSocket the startpoint of the connection + * @param toSocket the endpoint of the connection + * @return the new created SocketConnection + */ + static SocketConnection* addLink(vector& links, OutputSocket* fromSocket, InputSocket* toSocket); + + /** + * @brief dumps the content of the execution system to standard out + * @param system the execution system to dump + */ + static void debugDump(ExecutionSystem* system); +}; +#endif diff --git a/source/blender/compositor/intern/COM_InputSocket.cpp b/source/blender/compositor/intern/COM_InputSocket.cpp new file mode 100644 index 00000000000..9596d5b73b0 --- /dev/null +++ b/source/blender/compositor/intern/COM_InputSocket.cpp @@ -0,0 +1,217 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Socket.h" +#include "COM_Node.h" +#include "COM_SocketConnection.h" +#include "COM_ExecutionSystem.h" + +InputSocket::InputSocket(DataType datatype) :Socket(datatype) { + this->connection = NULL; + this->resizeMode = COM_SC_CENTER; +} +InputSocket::InputSocket(DataType datatype, InputSocketResizeMode resizeMode) :Socket(datatype) { + this->connection = NULL; + this->resizeMode = resizeMode; +} + +InputSocket::InputSocket(InputSocket* from) :Socket(from->getDataType()) { + this->connection = NULL; + this->resizeMode = from->getResizeMode(); +} + +int InputSocket::isInputSocket() const { return true; } +const int InputSocket::isConnected() const { return this->connection != NULL; } + +void InputSocket::setConnection(SocketConnection *connection) { + this->connection = connection; +} +SocketConnection* InputSocket::getConnection() {return this->connection;} + +void InputSocket::determineResolution(unsigned int resolution[],unsigned int preferredResolution[]) { + if (this->isConnected()){ + this->connection->getFromSocket()->determineResolution(resolution, preferredResolution); + } else { + return; + } +} + +DataType InputSocket::convertToSupportedDataType(DataType datatype) { + int supportedDataTypes = getDataType(); + if (supportedDataTypes&datatype) { + return datatype; + } + bool candoValue = supportedDataTypes&COM_DT_VALUE; + bool candoVector = supportedDataTypes&COM_DT_VECTOR; + bool candoColor = supportedDataTypes&COM_DT_COLOR; + + if (datatype == COM_DT_VALUE) { + if (candoColor) { + return COM_DT_COLOR; + } else if (candoVector) { + return COM_DT_VECTOR; + } + } else if (datatype == COM_DT_VECTOR) { + if (candoColor) { + return COM_DT_COLOR; + } else if (candoValue) { + return COM_DT_VALUE; + } + } else if (datatype == COM_DT_COLOR) { + if (candoVector) { + return COM_DT_VECTOR; + } else if (candoValue) { + return COM_DT_VALUE; + } + } + return this->getDataType(); +} + +void InputSocket::determineActualDataType() { + /// @note: this method is only called for inputsocket that are not connected. + /// @note: passes COM_DT_COLOR, the convertToSupportedDataType converts this to a capable DataType + this->setActualDataType(this->convertToSupportedDataType(COM_DT_COLOR)); + #if 0 // XXX TODO check for proxy node and use output data type? + if (this->getGroupOutputSocket()) { + if (!this->isInsideOfGroupNode()) { + this->getGroupOutputSocket()->determineActualDataType(); + } + } + #endif +} + +void InputSocket::notifyActualInputType(DataType datatype) { + DataType supportedDataType = convertToSupportedDataType(datatype); + this->setActualDataType(supportedDataType); + this->fireActualDataTypeSet(); +} + +void InputSocket::fireActualDataTypeSet() { + this->getNode()->notifyActualDataTypeSet(this, this->getActualDataType()); +} +void InputSocket::relinkConnections(InputSocket *relinkToSocket) { + this->relinkConnections(relinkToSocket, false, -1, NULL); +} + +void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem* graph) { + if (!duplicate) { + this->relinkConnections(relinkToSocket, autoconnect, editorNodeInputSocketIndex, graph); + } else { + if (!this->isConnected() && autoconnect) { + Node* node = (Node*)this->getNode(); + switch (this->getActualDataType()) { + case COM_DT_UNKNOWN: + case COM_DT_COLOR: + node->addSetColorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VECTOR: + node->addSetVectorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VALUE: + node->addSetValueOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + } + return; + } + SocketConnection * newConnection = new SocketConnection(); + OutputSocket * fromSocket = this->getConnection()->getFromSocket(); + newConnection->setToSocket(relinkToSocket); + newConnection->setFromSocket(fromSocket); + relinkToSocket->setConnection(newConnection); + fromSocket->addConnection(newConnection); + graph->addSocketConnection(newConnection); + } +} + +void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem* graph) { + if (!isConnected()) { + if (autoconnect) { + Node* node = (Node*)this->getNode(); + switch (this->getActualDataType()) { + case COM_DT_UNKNOWN: + case COM_DT_COLOR: + node->addSetColorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VECTOR: + node->addSetVectorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VALUE: + node->addSetValueOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + } + } + return; + } + SocketConnection *connection = this->getConnection(); + connection->setToSocket(relinkToSocket); + relinkToSocket->setConnection(connection); + this->setConnection(NULL); +} + +const ChannelInfo* InputSocket::getChannelInfo(const int channelnumber) { + if (this->isConnected() && this->connection->getFromSocket()) { + return this->connection->getFromSocket()->getChannelInfo(channelnumber); + } else { + return NULL; + } +} + +bool InputSocket::isStatic() { + if (isConnected()) { + NodeBase* node = this->getConnection()->getFromNode(); + if (node) { + return node->isStatic(); + } + } + return true; +} +SocketReader* InputSocket::getReader() { + return this->getOperation(); +} + +NodeOperation* InputSocket::getOperation() const { + if (isConnected()) { + return (NodeOperation*)this->connection->getFromSocket()->getNode(); + } else { + return NULL; + } +} + +float* InputSocket::getStaticValues() { + /* XXX only works for socket types with actual float input values. + * currently all compositor socket types (value, rgba, vector) support this. + */ + bNodeSocket *b_socket = this->getbNodeSocket(); + static float default_null = 0.0f; + + switch (this->getDataType()) { + case COM_DT_VALUE: + return &((bNodeSocketValueFloat*)b_socket->default_value)->value; + case COM_DT_COLOR: + return ((bNodeSocketValueRGBA*)b_socket->default_value)->value; + case COM_DT_VECTOR: + return ((bNodeSocketValueVector*)b_socket->default_value)->value; + default: + /* XXX this should never happen, just added to please the compiler */ + return &default_null; + } +} diff --git a/source/blender/compositor/intern/COM_InputSocket.h b/source/blender/compositor/intern/COM_InputSocket.h new file mode 100644 index 00000000000..340cfa98ef6 --- /dev/null +++ b/source/blender/compositor/intern/COM_InputSocket.h @@ -0,0 +1,162 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_InputSocket_h +#define _COM_InputSocket_h + +#include +#include "COM_Socket.h" +#include "COM_SocketReader.h" + +using namespace std; +class SocketConnection; +class Node; +class ExecutionSystem; +class OutputSocket; +class ChannelInfo; +class NodeOperation; + +/** + * @brief Resize modes of inputsockets + * How are the input and working resolutions matched + * @ingroup Model + */ +typedef enum InputSocketResizeMode { + /** @brief Center the input image to the center of the working area of the node, no resizing occurs */ + COM_SC_CENTER = NS_CR_CENTER, + /** @brief The bottom left of the input image is the bottom left of the working area of the node, no resizing occurs */ + COM_SC_NO_RESIZE = NS_CR_NONE, + /** @brief Fit the width of the input image to the width of the working area of the node */ + COM_SC_FIT_WIDTH = NS_CR_FIT_WIDTH, + /** @brief Fit the height of the input image to the height of the working area of the node */ + COM_SC_FIT_HEIGHT = NS_CR_FIT_HEIGHT, + /** @brief Fit the width or the height of the input image to the width or height of the working area of the node, image will be larger than the working area */ + COM_SC_FIT = NS_CR_FIT, + /** @brief Fit the width and the height of the input image to the width and height of the working area of the node, image will be equally larger than the working area */ + COM_SC_STRETCH = NS_CR_STRETCH +} InputSocketResizeMode; + +/** + * @brief InputSocket are sockets that can receive data/input + * @ingroup Model + */ +class InputSocket : public Socket { +private: + /** + * @brief connection connected to this InputSocket. + * An input socket can only have a single connection + */ + SocketConnection* connection; + + /** + * @brief resize mode of this socket + */ + InputSocketResizeMode resizeMode; + + + /** + * @brief convert a data type to a by the socket supported data type. + * + * @param datatype the datatype that needs to be checked + * @section data-conversion + */ + DataType convertToSupportedDataType(DataType datatype); + + /** + * @brief called when the ActualDataType is set. notifies other parties + */ + void fireActualDataTypeSet(); + +public: + InputSocket(DataType datatype); + InputSocket(DataType datatype, InputSocketResizeMode resizeMode); + InputSocket(InputSocket* from); + + void setConnection(SocketConnection* connection); + SocketConnection* getConnection(); + + const int isConnected() const; + int isInputSocket() const; + + /** + * @brief determine the resolution of this data going through this socket + * @param resolution the result of this operation + * @param preferredResolution the preferrable resolution as no resolution could be determined + */ + void determineResolution(unsigned int resolution[],unsigned int preferredResolution[]); + + void determineActualDataType(); + + /** + * @brief Notifies the Input of the data type (via a SocketConnection) + * @param datatype the datatype to evaluate + */ + void notifyActualInputType(DataType datatype); + + /** + * @brief move all connections of this input socket to another socket + * only use this method when already checked the availability of a SocketConnection + * @param relinkToSocket the socket to move to connections to + */ + void relinkConnections(InputSocket *relinkToSocket); + + /** + * @brief move all connections of this input socket to another socket + * @param relinkToSocket the socket to move to connections to + * @param autoconnect will a set operation be added when no connections exist + * @param editorNodeInputSocketIndex index of the socket number of the bNode (used to retrieve the value for autoconnection) + * @param system ExecutionSystem to update to + */ + void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem* system); + + /** + * @brief move all connections of this input socket to another socket + * @param relinkToSocket the socket to move to connections to + * @param autoconnect will a set operation be added when no connections exist + * @param editorNodeInputSocketIndex index of the socket number of the bNode (used to retrieve the value for autoconnection) + * @param duplicate instead of move do a copy of the connection. + * @param system ExecutionSystem to update to + */ + void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem* system); + + /** + * @brief set the resize mode + * @param resizeMode the new resize mode. + */ + void setResizeMode(InputSocketResizeMode resizeMode) {this->resizeMode = resizeMode;} + + /** + * @brief get the resize mode of this socket + * @return InputSocketResizeMode + */ + InputSocketResizeMode getResizeMode() const {return this->resizeMode;} + + const ChannelInfo* getChannelInfo(const int channelnumber); + + bool isStatic(); + + float* getStaticValues(); + SocketReader* getReader(); + NodeOperation* getOperation() const; +}; + +#endif diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cpp b/source/blender/compositor/intern/COM_MemoryBuffer.cpp new file mode 100644 index 00000000000..53357b8ec50 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp @@ -0,0 +1,338 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MemoryBuffer.h" +#include "MEM_guardedalloc.h" +#include "BLI_math.h" +#include "BKE_global.h" + +unsigned int MemoryBuffer::determineBufferSize() { + return getWidth() * getHeight(); +} + +int MemoryBuffer::getWidth() const { + return this->rect.xmax-this->rect.xmin; +} +int MemoryBuffer::getHeight() const { + return this->rect.ymax-this->rect.ymin; +} + +MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, unsigned int chunkNumber, rcti* rect) { + BLI_init_rcti(&this->rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax); + this->memoryProxy = memoryProxy; + this->chunkNumber = chunkNumber; + this->buffer = (float*)MEM_mallocN(sizeof(float)*determineBufferSize()*4, "COM_MemoryBuffer"); + this->state = COM_MB_ALLOCATED; + this->datatype = COM_DT_COLOR; + this->chunkWidth = this->rect.xmax - this->rect.xmin; +} + +MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, rcti* rect) { + BLI_init_rcti(&this->rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax); + this->memoryProxy = memoryProxy; + this->chunkNumber = -1; + this->buffer = (float*)MEM_mallocN(sizeof(float)*determineBufferSize()*4, "COM_MemoryBuffer"); + this->state = COM_MB_TEMPORARILY; + this->datatype = COM_DT_COLOR; + this->chunkWidth = this->rect.xmax - this->rect.xmin; +} +MemoryBuffer* MemoryBuffer::duplicate() { + MemoryBuffer *result = new MemoryBuffer(this->memoryProxy, &this->rect); + memcpy(result->buffer, this->buffer, this->determineBufferSize()*4*sizeof(float)); + return result; +} +void MemoryBuffer::clear() { + memset(this->buffer, 0, this->determineBufferSize()*4*sizeof(float)); +} + +float* MemoryBuffer::convertToValueBuffer() { + int size = this->determineBufferSize(); + int i; + int offset4; + float* result = new float[size]; + for (i = 0, offset4 = 0 ; i < size ; i ++, offset4 +=4) { + result[i] = this->buffer[offset4]; + } + + return result; +} + +MemoryBuffer::~MemoryBuffer() { + if (this->buffer) { + MEM_freeN(this->buffer); + this->buffer = NULL; + } +} + +void MemoryBuffer::copyContentFrom(MemoryBuffer *otherBuffer) { + if (!otherBuffer) { + return; + } + unsigned int otherY; + unsigned int minX = max(this->rect.xmin, otherBuffer->rect.xmin); + unsigned int maxX = min(this->rect.xmax, otherBuffer->rect.xmax); + unsigned int minY = max(this->rect.ymin, otherBuffer->rect.ymin); + unsigned int maxY = min(this->rect.ymax, otherBuffer->rect.ymax); + int offset; + int otherOffset; + + + for (otherY = minY ; otherYrect.ymin) * otherBuffer->chunkWidth + minX-otherBuffer->rect.xmin)*4; + offset = ((otherY - this->rect.ymin) * this->chunkWidth + minX-this->rect.xmin)*4; + memcpy(&this->buffer[offset], &otherBuffer->buffer[otherOffset], (maxX-minX) * 4*sizeof(float)); + } +} + +void MemoryBuffer::read(float* result, int x, int y) { + if (x>=this->rect.xmin && x < this->rect.xmax && + y>=this->rect.ymin && y < this->rect.ymax) { + int dx = x-this->rect.xmin; + int dy = y-this->rect.ymin; + int offset = (this->chunkWidth*dy+dx)*4; + result[0] = this->buffer[offset]; + result[1] = this->buffer[offset+1]; + result[2] = this->buffer[offset+2]; + result[3] = this->buffer[offset+3]; + } + else { + result[0] = 0.0f; + result[1] = 0.0f; + result[2] = 0.0f; + result[3] = 0.0f; + } +} +void MemoryBuffer::writePixel(int x, int y, float color[4]) { + if (x>=this->rect.xmin && x < this->rect.xmax && + y>=this->rect.ymin && y < this->rect.ymax) { + int offset = (this->chunkWidth*y+x)*4; + this->buffer[offset] = color[0]; + this->buffer[offset+1] = color[1]; + this->buffer[offset+2] = color[2]; + this->buffer[offset+3] = color[3]; + } +} + +void MemoryBuffer::readCubic(float* result, float x, float y) { + int x1 = floor(x); + int x2 = x1 + 1; + int y1 = floor(y); + int y2 = y1 + 1; + + float valuex = x - x1; + float valuey = y - y1; + float mvaluex = 1.0 - valuex; + float mvaluey = 1.0 - valuey; + + float color1[4]; + float color2[4]; + float color3[4]; + float color4[4]; + + read(color1, x1, y1); + read(color2, x1, y2); + read(color3, x2, y1); + read(color4, x2, y2); + + color1[0] = color1[0]*mvaluey + color2[0]*valuey; + color1[1] = color1[1]*mvaluey + color2[1]*valuey; + color1[2] = color1[2]*mvaluey + color2[2]*valuey; + color1[3] = color1[3]*mvaluey + color2[3]*valuey; + + color3[0] = color3[0]*mvaluey + color4[0]*valuey; + color3[1] = color3[1]*mvaluey + color4[1]*valuey; + color3[2] = color3[2]*mvaluey + color4[2]*valuey; + color3[3] = color3[3]*mvaluey + color4[3]*valuey; + + result[0] = color1[0]*mvaluex + color3[0]*valuex; + result[1] = color1[1]*mvaluex + color3[1]*valuex; + result[2] = color1[2]*mvaluex + color3[2]*valuex; + result[3] = color1[3]*mvaluex + color3[3]*valuex; +} + + +// table of (exp(ar) - exp(a)) / (1 - exp(a)) for r in range [0, 1] and a = -2 +// used instead of actual gaussian, otherwise at high texture magnifications circular artifacts are visible +#define EWA_MAXIDX 255 +static float EWA_WTS[EWA_MAXIDX + 1] = +{ 1.f, 0.990965f, 0.982f, 0.973105f, 0.96428f, 0.955524f, 0.946836f, 0.938216f, 0.929664f, + 0.921178f, 0.912759f, 0.904405f, 0.896117f, 0.887893f, 0.879734f, 0.871638f, 0.863605f, + 0.855636f, 0.847728f, 0.839883f, 0.832098f, 0.824375f, 0.816712f, 0.809108f, 0.801564f, + 0.794079f, 0.786653f, 0.779284f, 0.771974f, 0.76472f, 0.757523f, 0.750382f, 0.743297f, + 0.736267f, 0.729292f, 0.722372f, 0.715505f, 0.708693f, 0.701933f, 0.695227f, 0.688572f, + 0.68197f, 0.67542f, 0.66892f, 0.662471f, 0.656073f, 0.649725f, 0.643426f, 0.637176f, + 0.630976f, 0.624824f, 0.618719f, 0.612663f, 0.606654f, 0.600691f, 0.594776f, 0.588906f, + 0.583083f, 0.577305f, 0.571572f, 0.565883f, 0.56024f, 0.55464f, 0.549084f, 0.543572f, + 0.538102f, 0.532676f, 0.527291f, 0.521949f, 0.516649f, 0.511389f, 0.506171f, 0.500994f, + 0.495857f, 0.490761f, 0.485704f, 0.480687f, 0.475709f, 0.470769f, 0.465869f, 0.461006f, + 0.456182f, 0.451395f, 0.446646f, 0.441934f, 0.437258f, 0.432619f, 0.428017f, 0.42345f, + 0.418919f, 0.414424f, 0.409963f, 0.405538f, 0.401147f, 0.39679f, 0.392467f, 0.388178f, + 0.383923f, 0.379701f, 0.375511f, 0.371355f, 0.367231f, 0.363139f, 0.359079f, 0.355051f, + 0.351055f, 0.347089f, 0.343155f, 0.339251f, 0.335378f, 0.331535f, 0.327722f, 0.323939f, + 0.320186f, 0.316461f, 0.312766f, 0.3091f, 0.305462f, 0.301853f, 0.298272f, 0.294719f, + 0.291194f, 0.287696f, 0.284226f, 0.280782f, 0.277366f, 0.273976f, 0.270613f, 0.267276f, + 0.263965f, 0.26068f, 0.257421f, 0.254187f, 0.250979f, 0.247795f, 0.244636f, 0.241502f, + 0.238393f, 0.235308f, 0.232246f, 0.229209f, 0.226196f, 0.223206f, 0.220239f, 0.217296f, + 0.214375f, 0.211478f, 0.208603f, 0.20575f, 0.20292f, 0.200112f, 0.197326f, 0.194562f, + 0.191819f, 0.189097f, 0.186397f, 0.183718f, 0.18106f, 0.178423f, 0.175806f, 0.17321f, + 0.170634f, 0.168078f, 0.165542f, 0.163026f, 0.16053f, 0.158053f, 0.155595f, 0.153157f, + 0.150738f, 0.148337f, 0.145955f, 0.143592f, 0.141248f, 0.138921f, 0.136613f, 0.134323f, + 0.132051f, 0.129797f, 0.12756f, 0.125341f, 0.123139f, 0.120954f, 0.118786f, 0.116635f, + 0.114501f, 0.112384f, 0.110283f, 0.108199f, 0.106131f, 0.104079f, 0.102043f, 0.100023f, + 0.0980186f, 0.09603f, 0.094057f, 0.0920994f, 0.0901571f, 0.08823f, 0.0863179f, 0.0844208f, + 0.0825384f, 0.0806708f, 0.0788178f, 0.0769792f, 0.0751551f, 0.0733451f, 0.0715493f, 0.0697676f, + 0.0679997f, 0.0662457f, 0.0645054f, 0.0627786f, 0.0610654f, 0.0593655f, 0.0576789f, 0.0560055f, + 0.0543452f, 0.0526979f, 0.0510634f, 0.0494416f, 0.0478326f, 0.0462361f, 0.0446521f, 0.0430805f, + 0.0415211f, 0.039974f, 0.0384389f, 0.0369158f, 0.0354046f, 0.0339052f, 0.0324175f, 0.0309415f, + 0.029477f, 0.0280239f, 0.0265822f, 0.0251517f, 0.0237324f, 0.0223242f, 0.020927f, 0.0195408f, + 0.0181653f, 0.0168006f, 0.0154466f, 0.0141031f, 0.0127701f, 0.0114476f, 0.0101354f, 0.00883339f, + 0.00754159f, 0.00625989f, 0.00498819f, 0.00372644f, 0.00247454f, 0.00123242f, 0.f +}; + +static void radangle2imp(float a2, float b2, float th, float* A, float* B, float* C, float* F) +{ + float ct2 = cosf(th); + const float st2 = 1.f - ct2*ct2; // <- sin(th)^2 + ct2 *= ct2; + *A = a2*st2 + b2*ct2; + *B = (b2 - a2)*sinf(2.f*th); + *C = a2*ct2 + b2*st2; + *F = a2*b2; +} + +// all tests here are done to make sure possible overflows are hopefully minimized +static void imp2radangle(float A, float B, float C, float F, float* a, float* b, float* th, float* ecc) +{ + if (F <= 1e-5f) { // use arbitrary major radius, zero minor, infinite eccentricity + *a = sqrtf(A > C ? A : C); + *b = 0.f; + *ecc = 1e10f; + *th = 0.5f*(atan2f(B, A - C) + (float)M_PI); + } + else { + const float AmC = A - C, ApC = A + C, F2 = F*2.f; + const float r = sqrtf(AmC*AmC + B*B); + float d = ApC - r; + *a = (d <= 0.f) ? sqrtf(A > C ? A : C) : sqrtf(F2 / d); + d = ApC + r; + if (d <= 0.f) { + *b = 0.f; + *ecc = 1e10f; + } + else { + *b = sqrtf(F2 / d); + *ecc = *a / *b; + } + // incr theta by 0.5*pi (angle of major axis) + *th = 0.5f*(atan2f(B, AmC) + (float)M_PI); + } +} + +float clipuv(float x, float limit){ + x = (x < 0) ? 0 : ((x >= limit) ? (limit - 1) : x); + return x; +} + +void MemoryBuffer::readEWA(float* result, float fx, float fy, float dx, float dy) { + int width = this->getWidth(), height = this->getHeight(); + + // scaling dxt/dyt by full resolution can cause overflow because of huge A/B/C and esp. F values, + // scaling by aspect ratio alone does the opposite, so try something in between instead... + const float ff2 = width, ff = sqrtf(ff2), q = height / ff; + const float Ux = dx*ff, Vx = dx*q, Uy = dy*ff, Vy = dy*q; + float A = Vx*Vx + Vy*Vy; + float B = -2.f*(Ux*Vx + Uy*Vy); + float C = Ux*Ux + Uy*Uy; + float F = A*C - B*B*0.25f; + float a, b, th, ecc, a2, b2, ue, ve, U0, V0, DDQ, U, ac1, ac2, BU, d; + int u, v, u1, u2, v1, v2; + // The so-called 'high' quality ewa method simply adds a constant of 1 to both A & C, + // so the ellipse always covers at least some texels. But since the filter is now always larger, + // it also means that everywhere else it's also more blurry then ideally should be the case. + // So instead here the ellipse radii are modified instead whenever either is too low. + // Use a different radius based on interpolation switch, just enough to anti-alias when interpolation is off, + // and slightly larger to make result a bit smoother than bilinear interpolation when interpolation is on + // (minimum values: const float rmin = intpol ? 1.f : 0.5f;) + const float rmin = 1.5625f/ff2; + imp2radangle(A, B, C, F, &a, &b, &th, &ecc); + if ((b2 = b*b) < rmin) { + if ((a2 = a*a) < rmin) { + B = 0.f; + A = C = rmin; + F = A*C; + } + else { + b2 = rmin; + radangle2imp(a2, b2, th, &A, &B, &C, &F); + } + } + + ue = ff*sqrtf(C); + ve = ff*sqrtf(A); + d = (float)(EWA_MAXIDX + 1) / (F*ff2); + A *= d; + B *= d; + C *= d; + + U0 = fx; + V0 = fy; + u1 = (int)(floorf(U0 - ue)); + u2 = (int)(ceilf(U0 + ue)); + v1 = (int)(floorf(V0 - ve)); + v2 = (int)(ceilf(V0 + ve)); + U0 -= 0.5f; + V0 -= 0.5f; + DDQ = 2.f*A; + U = u1 - U0; + ac1 = A*(2.f*U + 1.f); + ac2 = A*U*U; + BU = B*U; + + d = result[0] = result[1] = result[2] = result[3] = 0.f; + for (v=v1; v<=v2; ++v) { + const float V = v - V0; + float DQ = ac1 + B*V; + float Q = (C*V + BU)*V + ac2; + for (u=u1; u<=u2; ++u) { + if (Q < (float)(EWA_MAXIDX + 1)) { + float tc[4]; + const float wt = EWA_WTS[(Q < 0.f) ? 0 : (unsigned int)Q]; + read(tc, clipuv(u, width), clipuv(v, height)); + result[0] += tc[0]*wt; + result[1] += tc[1]*wt; + result[2] += tc[2]*wt; + result[3] += result[3] ? tc[3]*wt : 0.f; + d += wt; + } + Q += DQ; + DQ += DDQ; + } + } + + // d should hopefully never be zero anymore + d = 1.f/d; + result[0] *= d; + result[1] *= d; + result[2] *= d; + // clipping can be ignored if alpha used, texr->ta already includes filtered edge + result[3] = result[3] ? result[3] *d : 1.f; +} diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h new file mode 100644 index 00000000000..78fb16a7b12 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryBuffer.h @@ -0,0 +1,170 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class MemoryBuffer; + +#ifndef _COM_MemoryBuffer_h_ +#define _COM_MemoryBuffer_h_ + +#include "COM_ExecutionGroup.h" +#include "BLI_rect.h" +#include "COM_MemoryProxy.h" +extern "C" { + #include "BLI_threads.h" +} +#include + +/** + * @brief state of a memory buffer + * @ingroup Memory + */ +typedef enum MemoryBufferState { + /** @brief memory has been allocated on creator device and CPU machine, but kernel has not been executed */ + COM_MB_ALLOCATED = 1, + /** @brief memory is available for use, content has been created */ + COM_MB_AVAILABLE = 2, + /** @brief chunk is consolidated from other chunks. special state.*/ + COM_MB_TEMPORARILY = 6 +} MemoryBufferState; + +class MemoryProxy; + +/** + * @brief a MemoryBuffer contains access to the data of a chunk + */ +class MemoryBuffer { +private: + /** + * @brief proxy of the memory (same for all chunks in the same buffer) + */ + MemoryProxy * memoryProxy; + + /** + * @brief the type of buffer COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR + */ + DataType datatype; + + + /** + * @brief region of this buffer inside reative to the MemoryProxy + */ + rcti rect; + + /** + * brief refers to the chunknumber within the executiongroup where related to the MemoryProxy + * @see memoryProxy + */ + unsigned int chunkNumber; + + /** + * @brief width of the chunk + */ + unsigned int chunkWidth; + + /** + * @brief state of the buffer + */ + MemoryBufferState state; + + /** + * @brief the actual float buffer/data + */ + float* buffer; + +public: + /** + * @brief construct new MemoryBuffer for a chunk + */ + MemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti* rect); + + /** + * @brief construct new temporarily MemoryBuffer for an area + */ + MemoryBuffer(MemoryProxy *memoryProxy, rcti* rect); + + /** + * @brief destructor + */ + ~MemoryBuffer(); + + /** + * @brief read the ChunkNumber of this MemoryBuffer + */ + unsigned int getChunkNumber() {return this->chunkNumber;} + + /** + * @brief get the data of this MemoryBuffer + * @note buffer should already be available in memory + */ + float* getBuffer() {return this->buffer;} + + /** + * @brief after execution the state will be set to available by calling this method + */ + void setCreatedState() { + this->state = COM_MB_AVAILABLE; + } + + void read(float* result, int x, int y); + void writePixel(int x, int y, float color[4]); + void readCubic(float* result, float x, float y); + void readEWA(float *result, float fx, float fy, float dx, float dy); + + /** + * @brief is this MemoryBuffer a temporarily buffer (based on an area, not on a chunk) + */ + inline const bool isTemporarily() const {return this->state == COM_MB_TEMPORARILY;} + + /** + * @brief add the content from otherBuffer to this MemoryBuffer + * @param otherBuffer source buffer + */ + void copyContentFrom(MemoryBuffer* otherBuffer); + + /** + * @brief get the rect of this MemoryBuffer + */ + rcti* getRect() {return &this->rect;} + + /** + * @brief get the width of this MemoryBuffer + */ + int getWidth() const; + + /** + * @brief get the height of this MemoryBuffer + */ + int getHeight() const; + + /** + * @brief clear the buffer. Make all pixels black transparant. + */ + void clear(); + + MemoryBuffer* duplicate(); + + float* convertToValueBuffer(); +private: + unsigned int determineBufferSize(); +}; + +#endif diff --git a/source/blender/compositor/intern/COM_MemoryManager.cpp b/source/blender/compositor/intern/COM_MemoryManager.cpp new file mode 100644 index 00000000000..fa587e8c7d6 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryManager.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MemoryManager.h" +#include "BLI_threads.h" +#include +#include "COM_defines.h" + +vector buffers; + +ThreadMutex mutex; + +MemoryBuffer* MemoryManager::allocateMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber, rcti *rect) { + MemoryBuffer *result = new MemoryBuffer(id, chunkNumber, rect); + MemoryManagerState * state = MemoryManager::getState(id); + state->addMemoryBuffer(result); + BLI_mutex_lock(&mutex); + buffers.push_back(result); + BLI_mutex_unlock(&mutex); + return result; +} + +void MemoryManager::addMemoryProxy(MemoryProxy *memoryProxy) { + MemoryManagerState * state = MemoryManager::getState(memoryProxy); + if (!state) { + state = new MemoryManagerState(memoryProxy); + memoryProxy->setState(state); + } +} +MemoryBuffer* MemoryManager::getMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber){ + MemoryManagerState * state = MemoryManager::getState(id); + if (!state) { + return NULL; + } + MemoryBuffer* buffer = state->getMemoryBuffer(chunkNumber); + if (!buffer) return NULL; + return buffer; +} + +MemoryManagerState* MemoryManager::getState(MemoryProxy* memoryProxy) { + return memoryProxy->getState(); +} +void MemoryManager::initialize() { + BLI_mutex_init(&mutex); +} +void MemoryManager::clear() { + buffers.clear(); + BLI_mutex_end(&mutex); +} diff --git a/source/blender/compositor/intern/COM_MemoryManager.h b/source/blender/compositor/intern/COM_MemoryManager.h new file mode 100644 index 00000000000..506bf2a8c24 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryManager.h @@ -0,0 +1,146 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MemoryManager_h_ +#define _COM_MemoryManager_h_ + +#include "COM_MemoryBuffer.h" +#include "COM_MemoryProxy.h" +#include "COM_ExecutionGroup.h" +#include "COM_MemoryManagerState.h" + +/** + * @page memorymanager The Memory Manager + * The compositor has its own MemoryManager. The goal of the MemoryManager is to manage the memory allocated by chunks. + * During execution new chunks will be created [MemoryManager.allocateMemoryBuffer] When calculation is finished the MemoryBuffer will get the state [MemoryBufferState.COM_MB_AVAILABLE]. + * From now on other ExecutionGroup and NodeOperations may read from the MemoryBuffer. + * The MemoryManager also has the capability to save MemoryBuffer's to disk in order to free some memory. + * + * @section S_MEM Memory manager + * The memory manager synchronize and optimize data across devices. + * Only one NodeOperation running on a device is able to write to a MemoryBuffer. This MemoryBuffer is only allocated on the main-device memory (CPU). + * The MemoryBuffer.state will be [MemoryBufferState.COM_MB_ALLOCATED]. As soon as the chunk has been executed the state changes to [MemoryBufferState.COM_MB_AVAILABLE]. This MemoryBuffer can now be used as inputBuffer of ExecutionGroup's. + * When needed the MemoryBuffer will be stored to a file. This will save memory that can be used by other tiles. + * @subsection S_MEM_1 Step one + * When a chunk of an ExecutionGroup is being executed by a device, the MemoryBuffer is allocated on the CPU. + *
+  * Allocation of the output MemoryBuffer
+  *  +----------------------------------------+
+  *  | Main device (CPU)                      |
+  *  | +----------------+   +--------------+  |
+  *  | | ExecutionGroup |   | MemoryBuffer |  |
+  *  | |                |   | Chunk a      |  |
+  *  | +----------------+   +--------------+  |
+  *  |                                        |
+  *  +----------------------------------------+
+  * 
+ * @see MemoryManager.allocateMemoryBuffer + * + * @subsection S_MEM_2 Step two + * The Device will execute the ExecutionGroup. This differs per type of Device. CPUDevice will call the NodeOperation.executeRegion method of the outputnode of the ExecutionGroup. + * The [NodeOperation.executeRegion] writes the result to the allocated MemoryBuffer. When finished the state of the MemoryBuffer will be set to [MemoryBufferState.COM_MB_AVAILABLE]. + *
+  * Execute a chunk and store result to the MemoryBuffer
+  *  +----------------------------------------+
+  *  | Main device (CPU)                      |
+  *  | +----------------+   +--------------+  |
+  *  | | ExecutionGroup |   | MemoryBuffer |  |
+  *  | |                |   | Chunk a      |  |
+  *  | +----------------+   +--------------+  |
+  *  |         |                 ^            |
+  *  | +----------------+        |            |
+  *  | | NodeOperation  |--------+            |
+  *  | |                |     Write result    |
+  *  | +----------------+                     |
+  *  |                                        |
+  *  +----------------------------------------+
+  * 
+ * @subsection S_MEM_3 Step 3 + * Other Chunks that depend on the MemoryBuffer can now use it. + * When a MemoryBuffer is being used its number of users are increased. When a 'user' is finished the number of users are decreased, If a MemoryBuffer has no users, the system can decide to store the data to disk and free some memory. + * @see MemoryBuffer.numberOfUsers + * @see MemoryBuffer.saveToDisk + * + * @subsection S_MEM_CON Temporarily MemoryBuffers + * Nodes like blur nodes can depend on multiple MemoryBuffer of the same MemoryProxy. These multiple buffers will be consolidated temporarily to a new MemoryBuffer. + * When execution is finished this temporarily memory buffer is deallicated. + *
+  *  Original MemoryBuffer's  Temporarily
+  *  +-------+ +-------+      MemoryBuffer
+  *  | MB A  | | MB B  |      +-------+-------+
+  *  +-------+ +-------+      | MB A  | MB B  |
+  *                       ==> +-------+-------+
+  *  +-------+ +-------+      | MB C  | MB D  |
+  *  | MB C  | | MB D  |      +-------+-------+
+  *  +-------+ +-------+
+  * 
+ * @see ExecutionGroup.constructConsolidatedMemoryBuffer constructs the temporarily MemoryBuffer + * @see MemoryBuffer.state state is MemoryManagerState.COM_MB_TEMPORARILY + * @see ExecutionGroup.finalizeChunkExecution deallocate the temporarily MemoryBuffer + * @note this MemoryBuffer is not managed by the MemoryManager + */ + +/** + * @brief the memory manager for the compostor + * @ingroup Memory + */ +class MemoryManager { +private: + /** + * @brief retrieve the state of a certain MemoryProxy; + * @param memoryProxy the MemoryProxy to retrieve the state from + */ + static MemoryManagerState* getState(MemoryProxy* memoryProxy); +public: + /** + * @brief allocate a memory buffer + * @param memoryProxy the MemoryProxy to get a chunk from + * @param chunkNumber number of the chunk to receive + * @param rect size + position of the chunk + */ + static MemoryBuffer* allocateMemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti* rect); + + /** + * @brief get a memory buffer + * @param memoryProxy the MemoryProxy to get a chunk from + * @param chunkNumber number of the chunk to receive + * @param addUser must we add a user to the chunk. + */ + static MemoryBuffer* getMemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber); + + /** + * @brief add a MemoryProxy to the scope of the memory manager + * @param memoryProxy the MemoryProxy to add + */ + static void addMemoryProxy(MemoryProxy *memoryProxy); + + /** + * @brief clear the memory manager + */ + static void clear(); + + /** + * @brief initialize the memory manager. + */ + static void initialize(); +}; +#endif diff --git a/source/blender/compositor/intern/COM_MemoryManagerState.cpp b/source/blender/compositor/intern/COM_MemoryManagerState.cpp new file mode 100644 index 00000000000..56946c3f0f2 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryManagerState.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MemoryManagerState.h" + +MemoryManagerState::MemoryManagerState(MemoryProxy *memoryProxy) { + this->memoryProxy = memoryProxy; + this->currentSize = 0; + this->chunkBuffers = NULL; + BLI_mutex_init(&this->mutex); +} + +MemoryProxy * MemoryManagerState::getMemoryProxy() { + return this->memoryProxy; +} + +MemoryManagerState::~MemoryManagerState() { + this->memoryProxy = NULL; + unsigned int index; + for (index = 0 ; index < this->currentSize; index ++){ + MemoryBuffer* buffer = this->chunkBuffers[index]; + if (buffer) { + delete buffer; + } + } + delete this->chunkBuffers; + BLI_mutex_end(&this->mutex); +} + +void MemoryManagerState::addMemoryBuffer(MemoryBuffer *buffer) { + BLI_mutex_lock(&this->mutex); + unsigned int chunkNumber = buffer->getChunkNumber(); + unsigned int index; + while (this->currentSize <= chunkNumber) { + unsigned int newSize = this->currentSize + 1000; + MemoryBuffer** newbuffer = new MemoryBuffer*[newSize]; + MemoryBuffer** oldbuffer = this->chunkBuffers; + + for (index = 0 ; index < this->currentSize ; index++) { + newbuffer[index] = oldbuffer[index]; + } + for (index = currentSize ; index < newSize; index++) { + newbuffer[index] = NULL; + } + + this->chunkBuffers = newbuffer; + this->currentSize = newSize; + if (oldbuffer) delete oldbuffer; + } + + if (this->chunkBuffers[chunkNumber] == NULL) { + this->chunkBuffers[chunkNumber] = buffer; + } else { + throw "ALREADY ALLOCATED!"; + } + BLI_mutex_unlock(&this->mutex); +} + +MemoryBuffer* MemoryManagerState::getMemoryBuffer(unsigned int chunkNumber) { + MemoryBuffer* result = NULL; + if (chunkNumber< this->currentSize){ + result = this->chunkBuffers[chunkNumber]; + if (result) { + return result; + } + } + + BLI_mutex_lock(&this->mutex); + if (chunkNumber< this->currentSize){ + result = this->chunkBuffers[chunkNumber]; + } + + BLI_mutex_unlock(&this->mutex); + return result; +} diff --git a/source/blender/compositor/intern/COM_MemoryManagerState.h b/source/blender/compositor/intern/COM_MemoryManagerState.h new file mode 100644 index 00000000000..4b4f0a112a8 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryManagerState.h @@ -0,0 +1,87 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class MemoryManagerState; + +#ifndef _COM_MemoryManagerState_h_ +#define _COM_MemoryManagerState_h_ + +#include "COM_MemoryProxy.h" +#include "COM_MemoryBuffer.h" +#include +extern "C" { + #include "BLI_threads.h" +} + +/** + * @brief State of a MemoryProxy in the MemoryManager. + * @ingroup Memory + */ +class MemoryManagerState { +private: + /** + * @brief reference to the MemoryProxy of this state + */ + MemoryProxy *memoryProxy; + + /** + * @brief list of all chunkbuffers + */ + MemoryBuffer** chunkBuffers; + + /** + * @brief size of the chunkBuffers + */ + unsigned int currentSize; + + /** + * @brief lock to this memory for multithreading + */ + ThreadMutex mutex; +public: + /** + * @brief creates a new MemoryManagerState for a certain MemoryProxy. + */ + MemoryManagerState(MemoryProxy * memoryProxy); + /** + * @brief destructor + */ + ~MemoryManagerState(); + + /** + * @brief get the reference to the MemoryProxy this state belongs to. + */ + MemoryProxy *getMemoryProxy(); + + /** + * @brief add a new memorybuffer to the state + */ + void addMemoryBuffer(MemoryBuffer* buffer); + + /** + * @brief get the MemoryBuffer assiciated to a chunk. + * @param chunkNumber the chunknumber + */ + MemoryBuffer* getMemoryBuffer(unsigned int chunkNumber); +}; + +#endif diff --git a/source/blender/compositor/intern/COM_MemoryProxy.cpp b/source/blender/compositor/intern/COM_MemoryProxy.cpp new file mode 100644 index 00000000000..0880af9833c --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryProxy.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MemoryProxy.h" + + +MemoryProxy::MemoryProxy() { + this->state = NULL; + this->writeBufferOperation = NULL; + this->executor = NULL; +} + +MemoryProxy::~MemoryProxy() { + if (this->state) { + delete this->state; + this->state = NULL; + } +} diff --git a/source/blender/compositor/intern/COM_MemoryProxy.h b/source/blender/compositor/intern/COM_MemoryProxy.h new file mode 100644 index 00000000000..9424ea9a3e5 --- /dev/null +++ b/source/blender/compositor/intern/COM_MemoryProxy.h @@ -0,0 +1,106 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class MemoryProxy; + + +#ifndef _COM_MemoryProxy_h +#define _COM_MemoryProxy_h +#include "COM_ExecutionGroup.h" +#include "COM_MemoryManagerState.h" + +class ExecutionGroup; + +/** + * @brief A MemoryProxy is a unique identifier for a memory buffer. + * A single MemoryProxy is used among all chunks of the same buffer, + * the MemoryBuffer only stores the data of a single chunk. + * @ingroup Memory + */ +class MemoryProxy { +private: + /** + * @brief reference to the ouput operation of the executiongroup + */ + WriteBufferOperation *writeBufferOperation; + + /** + * @brief reference to the executor. the Execution group that can fill a chunk + */ + ExecutionGroup *executor; + + /** + * @brief data of the different chunks. + * @note state is part of this class due to optimization in the MemoryManager + */ + MemoryManagerState * state; + + /** + * @brief datatype of this MemoryProxy + */ + DataType datatype; + + /** + * @brief channel information of this buffer + */ + ChannelInfo channelInfo[COM_NUMBER_OF_CHANNELS]; +public: + MemoryProxy(); + ~MemoryProxy(); + + /** + * @brief set the ExecutionGroup that can be scheduled to calculate a certain chunk. + * @param group the ExecutionGroup to set + */ + void setExecutor(ExecutionGroup *executor) {this->executor = executor;} + + /** + * @brief get the ExecutionGroup that can be scheduled to calculate a certain chunk. + */ + ExecutionGroup* getExecutor() {return this->executor;} + + /** + * @brief set the WriteBufferOperation that is responsible for writing to this MemoryProxy + * @param operation + */ + void setWriteBufferOperation(WriteBufferOperation* operation) {this->writeBufferOperation = operation;} + + /** + * @brief get the WriteBufferOperation that is responsible for writing to this MemoryProxy + * @return WriteBufferOperation + */ + WriteBufferOperation* getWriteBufferOperation() {return this->writeBufferOperation;} + + /** + * @brief set the memorymanager state of this MemoryProxy, this is set from the MemoryManager + * @param state the state to set + */ + void setState(MemoryManagerState *state) {this->state = state;} + + /** + * @brief get the state of this MemoryProxy + * @return MemoryManagerState reference to the state of this MemoryProxy. + */ + MemoryManagerState* getState() {return this->state;} +}; + +#endif diff --git a/source/blender/compositor/intern/COM_Node.cpp b/source/blender/compositor/intern/COM_Node.cpp new file mode 100644 index 00000000000..2587eaa5195 --- /dev/null +++ b/source/blender/compositor/intern/COM_Node.cpp @@ -0,0 +1,182 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Node.h" +#include "string.h" + +#include "COM_NodeOperation.h" +#include "BKE_node.h" +#include "COM_SetValueOperation.h" +#include "COM_SetVectorOperation.h" +#include "COM_SetColorOperation.h" +#include "COM_SocketConnection.h" +#include "COM_ExecutionSystem.h" +#include "COM_PreviewOperation.h" +#include "COM_TranslateOperation.h" + +#include "COM_SocketProxyNode.h" + +//#include "stdio.h" +#include "COM_defines.h" + +Node::Node(bNode* editorNode, bool create_sockets) { + this->editorNode = editorNode; + + if (create_sockets) { + bNodeSocket * input = (bNodeSocket*)editorNode->inputs.first; + while (input != NULL) { + DataType dt = COM_DT_VALUE; + if (input->type == SOCK_RGBA) dt = COM_DT_COLOR; + if (input->type == SOCK_VECTOR) dt = COM_DT_VECTOR; + + this->addInputSocket(dt, (InputSocketResizeMode)input->resizemode, input); + input = (bNodeSocket*)input->next; + } + bNodeSocket *output = (bNodeSocket*)editorNode->outputs.first; + while(output != NULL) { + DataType dt = COM_DT_VALUE; + if (output->type == SOCK_RGBA) dt = COM_DT_COLOR; + if (output->type == SOCK_VECTOR) dt = COM_DT_VECTOR; + + this->addOutputSocket(dt, output); + output = (bNodeSocket*)output->next; + } + } +} +Node::Node() { + this->editorNode = NULL; +} + +bNode* Node::getbNode() {return this->editorNode;} + +void Node::addSetValueOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex) { + bNodeSocket *bSock = (bNodeSocket*)this->getEditorInputSocket(editorNodeInputSocketIndex); + SetValueOperation *operation = new SetValueOperation(); + bNodeSocketValueFloat *val = (bNodeSocketValueFloat*)bSock->default_value; + operation->setValue(val->value); + this->addLink(graph, operation->getOutputSocket(), inputsocket); + graph->addOperation(operation); +} + +void Node::addPreviewOperation(ExecutionSystem *system, OutputSocket *outputSocket, int priority) { +#ifdef COM_PREVIEW_ENABLED + PreviewOperation *operation = new PreviewOperation(); + system->addOperation(operation); + operation->setbNode(this->getbNode()); + operation->setbNodeTree(system->getContext().getbNodeTree()); + operation->setPriority(priority); + this->addLink(system, outputSocket, operation->getInputSocket(0)); +#endif +} + +void Node::addPreviewOperation(ExecutionSystem *system, InputSocket *inputSocket, int priority) { + if (inputSocket->isConnected()) { + OutputSocket *outputsocket = inputSocket->getConnection()->getFromSocket(); + this->addPreviewOperation(system, outputsocket, priority); + } +} + +SocketConnection* Node::addLink(ExecutionSystem *graph, OutputSocket* outputSocket, InputSocket* inputsocket) { + if (inputsocket->isConnected()) { + return NULL; + } + SocketConnection *connection = new SocketConnection(); + connection->setFromSocket(outputSocket); + outputSocket->addConnection(connection); + connection->setToSocket(inputsocket); + inputsocket->setConnection(connection); + graph->addSocketConnection(connection); + return connection; +} + +void Node::addSetColorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex) { + bNodeSocket *bSock = (bNodeSocket*)this->getEditorInputSocket(editorNodeInputSocketIndex); + SetColorOperation *operation = new SetColorOperation(); + bNodeSocketValueRGBA *val = (bNodeSocketValueRGBA*)bSock->default_value; + operation->setChannel1(val->value[0]); + operation->setChannel2(val->value[1]); + operation->setChannel3(val->value[2]); + operation->setChannel4(val->value[3]); + this->addLink(graph, operation->getOutputSocket(), inputsocket); + graph->addOperation(operation); +} + +void Node::addSetVectorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex) { + bNodeSocket *bSock = (bNodeSocket*)this->getEditorInputSocket(editorNodeInputSocketIndex); + bNodeSocketValueVector *val = (bNodeSocketValueVector*)bSock->default_value; + SetVectorOperation *operation = new SetVectorOperation(); + operation->setX(val->value[0]); + operation->setY(val->value[1]); + operation->setZ(val->value[2]); + operation->setW(val->value[3]); + this->addLink(graph, operation->getOutputSocket(), inputsocket); + graph->addOperation(operation); +} + +bNodeSocket* Node::getEditorInputSocket(int editorNodeInputSocketIndex) { + bNodeSocket *bSock = (bNodeSocket*)this->getbNode()->inputs.first; + int index = 0; + while (bSock != NULL) { + if (index == editorNodeInputSocketIndex) { + return bSock; + } + index++; + bSock = bSock->next; + } + return NULL; +} +bNodeSocket* Node::getEditorOutputSocket(int editorNodeInputSocketIndex) { + bNodeSocket *bSock = (bNodeSocket*)this->getbNode()->outputs.first; + int index = 0; + while (bSock != NULL) { + if (index == editorNodeInputSocketIndex) { + return bSock; + } + index++; + bSock = bSock->next; + } + return NULL; +} + +InputSocket* Node::findInputSocketBybNodeSocket(bNodeSocket* socket) { + vector &inputsockets = this->getInputSockets(); + unsigned int index; + for (index = 0 ; index < inputsockets.size(); index ++) { + InputSocket* input = inputsockets[index]; + if (input->getbNodeSocket() == socket) { + return input; + } + } + return NULL; +} + +OutputSocket* Node::findOutputSocketBybNodeSocket(bNodeSocket* socket) { + vector &outputsockets = this->getOutputSockets(); + unsigned int index; + for (index = 0 ; index < outputsockets.size(); index ++) { + OutputSocket* output = outputsockets[index]; + if (output->getbNodeSocket() == socket) { + return output; + } + } + return NULL; +} diff --git a/source/blender/compositor/intern/COM_Node.h b/source/blender/compositor/intern/COM_Node.h new file mode 100644 index 00000000000..3706592a585 --- /dev/null +++ b/source/blender/compositor/intern/COM_Node.h @@ -0,0 +1,131 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_Node_h +#define _COM_Node_h + +#include "COM_NodeBase.h" +#include "COM_InputSocket.h" +#include "COM_OutputSocket.h" +#include "COM_CompositorContext.h" +#include "DNA_node_types.h" +#include "BKE_text.h" +#include +#include + +using namespace std; + +class Node; +class NodeOperation; +class ExecutionSystem; + +typedef vector NodeList; +typedef NodeList::iterator NodeIterator; +typedef pair NodeRange; + +/** + * My node documentation. + */ +class Node:public NodeBase { +private: + /** + * @brief stores the reference to the SDNA bNode struct + */ + bNode* editorNode; + +public: + Node(bNode* editorNode, bool create_sockets=true); + + /** + * @brief get the reference to the SDNA bNode struct + */ + bNode* getbNode(); + + /** + * @brief convert node to operation + * + * @todo this must be described furter + * + * @param system the ExecutionSystem where the operations need to be added + * @param context reference to the CompositorContext + */ + virtual void convertToOperations(ExecutionSystem* system, CompositorContext * context) =0; + + /** + * this method adds a SetValueOperation as input of the input socket. + * This can only be used from the convertToOperation method. all other usages are not allowed + */ + void addSetValueOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex); + + /** + * this method adds a SetColorOperation as input of the input socket. + * This can only be used from the convertToOperation method. all other usages are not allowed + */ + void addSetColorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex); + + /** + * this method adds a SetVectorOperation as input of the input socket. + * This can only be used from the convertToOperation method. all other usages are not allowed + */ + void addSetVectorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex); + + /** + * Creates a new link between an outputSocket and inputSocket and registrates the link to the graph + * @return the new created link + */ + SocketConnection* addLink(ExecutionSystem *graph, OutputSocket* outputSocket, InputSocket* inputsocket); + + /** + * is this node a group node. + */ + virtual bool isGroupNode() const { return false; } + /** + * is this node a proxy node. + */ + virtual bool isProxyNode() const { return false; } + + /** + * @brief find the InputSocket by bNodeSocket + * + * @param socket + */ + InputSocket* findInputSocketBybNodeSocket(bNodeSocket* socket); + + /** + * @brief find the OutputSocket by bNodeSocket + * + * @param socket + */ + OutputSocket* findOutputSocketBybNodeSocket(bNodeSocket* socket); +protected: + + Node(); + + void addPreviewOperation(ExecutionSystem *system, InputSocket* inputSocket, int priority); + void addPreviewOperation(ExecutionSystem *system, OutputSocket* inputSocket, int priority); + + bNodeSocket* getEditorInputSocket(int editorNodeInputSocketIndex); + bNodeSocket* getEditorOutputSocket(int editorNodeOutputSocketIndex); +private: +}; + +#endif diff --git a/source/blender/compositor/intern/COM_NodeBase.cpp b/source/blender/compositor/intern/COM_NodeBase.cpp new file mode 100644 index 00000000000..6e6be889572 --- /dev/null +++ b/source/blender/compositor/intern/COM_NodeBase.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_NodeBase.h" +#include "string.h" +#include "COM_NodeOperation.h" +#include "BKE_node.h" +#include "COM_SetValueOperation.h" +#include "COM_SetColorOperation.h" +#include "COM_SocketConnection.h" +#include "COM_ExecutionSystem.h" + +NodeBase::NodeBase() { +} + + +NodeBase::~NodeBase(){ + while (!this->outputsockets.empty()) { + delete (this->outputsockets.back()); + this->outputsockets.pop_back(); + } + while (!this->inputsockets.empty()) { + delete (this->inputsockets.back()); + this->inputsockets.pop_back(); + } +} + +void NodeBase::addInputSocket(DataType datatype) { + this->addInputSocket(datatype, COM_SC_CENTER, NULL); +} + +void NodeBase::addInputSocket(DataType datatype, InputSocketResizeMode resizeMode) { + this->addInputSocket(datatype, resizeMode, NULL); +} +void NodeBase::addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket* bSocket) { + InputSocket *socket = new InputSocket(datatype, resizeMode); + socket->setEditorSocket(bSocket); + socket->setNode(this); + this->inputsockets.push_back(socket); +} + +void NodeBase::addOutputSocket(DataType datatype) { + this->addOutputSocket(datatype, NULL); + +} +void NodeBase::addOutputSocket(DataType datatype, bNodeSocket* bSocket) { + OutputSocket *socket = new OutputSocket(datatype); + socket->setEditorSocket(bSocket); + socket->setNode(this); + this->outputsockets.push_back(socket); +} +const bool NodeBase::isInputNode() const { + return this->inputsockets.size() == 0; +} + +OutputSocket* NodeBase::getOutputSocket(int index) { + return this->outputsockets[index]; +} + +InputSocket* NodeBase::getInputSocket(int index) { + return this->inputsockets[index]; +} + + +void NodeBase::determineActualSocketDataTypes() { + unsigned int index; + for (index = 0 ; index < this->outputsockets.size() ; index ++) { + OutputSocket* socket = this->outputsockets[index]; + if (socket->getActualDataType() ==COM_DT_UNKNOWN && socket->isConnected()) { + socket->determineActualDataType(); + } + } + for (index = 0 ; index < this->inputsockets.size() ; index ++) { + InputSocket* socket = this->inputsockets[index]; + if (socket->getActualDataType() ==COM_DT_UNKNOWN) { + socket->determineActualDataType(); + } + } +} + +DataType NodeBase::determineActualDataType(OutputSocket *outputsocket) { + const int inputIndex = outputsocket->getInputSocketDataTypeDeterminatorIndex(); + if (inputIndex != -1) { + return this->getInputSocket(inputIndex)->getActualDataType(); + } else { + return outputsocket->getDataType(); + } +} + +void NodeBase::notifyActualDataTypeSet(InputSocket *socket, DataType actualType) { + unsigned int index; + int socketIndex = -1; + for (index = 0 ; index < this->inputsockets.size() ; index ++) { + if (this->inputsockets[index] == socket) { + socketIndex = (int)index; + break; + } + } + if (socketIndex == -1) return; + + for (index = 0 ; index < this->outputsockets.size() ; index ++) { + OutputSocket* socket = this->outputsockets[index]; + if (socket->isActualDataTypeDeterminedByInputSocket() && + socket->getInputSocketDataTypeDeterminatorIndex() == socketIndex) { + socket->setActualDataType(actualType); + socket->fireActualDataType(); + } + } +} diff --git a/source/blender/compositor/intern/COM_NodeBase.h b/source/blender/compositor/intern/COM_NodeBase.h new file mode 100644 index 00000000000..10028324d91 --- /dev/null +++ b/source/blender/compositor/intern/COM_NodeBase.h @@ -0,0 +1,174 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_NodeBase_h +#define _COM_NodeBase_h + +#include "COM_InputSocket.h" +#include "COM_OutputSocket.h" +#include "DNA_node_types.h" +#include "BKE_text.h" +#include +#include + +using namespace std; + + +class NodeOperation; +class ExecutionSystem; + +/** + * @brief The NodeBase class is the super-class of all node related objects like @see Node @see NodeOperation + * the reason for the existence of this class is to support graph-nodes when using ExecutionSystem + * the NodeBase also contains the reference to InputSocket and OutputSocket. + * @ingroup Model + */ +class NodeBase { +private: + /** + * @brief the list of actual inputsockets @see InputSocket + */ + vector inputsockets; + + /** + * @brief the list of actual outputsockets @see OutputSocket + */ + vector outputsockets; + +protected: + /** + * @brief get access to the vector of input sockets + */ + inline vector& getInputSockets() {return this->inputsockets;} + + /** + * @brief get access to the vector of input sockets + */ + inline vector& getOutputSockets() {return this->outputsockets;} + + +public: + /** + * @brief destructor + * clean up memory related to this NodeBase. + */ + virtual ~NodeBase(); + + /** + * @brief determine the actual socket data types that will go through the system + */ + virtual void determineActualSocketDataTypes(); + + /** + * @brief determine the actual socket data types of a specific outputsocket + * + * @param outputsocket + * a reference to the actual outputsocket where the datatype must be determined from + * + * @return + * COM_DT_VALUE if it is a value (1 float buffer) + * COM_DT_COLOR if it is a value (4 float buffer) + * COM_DT_VECTOR if it is a value (3 float buffer) + */ + virtual DataType determineActualDataType(OutputSocket *outputsocket); + + /** + * @brief is this node an operation? + * This is true when the instance is of the subclass NodeOperation. + * @return [true:false] + * @see NodeOperation + */ + virtual const int isOperation() const {return false;} + + /** + * @brief check if this is an input node + * An input node is a node that only has output sockets and no input sockets + * @return [false..true] + */ + const bool isInputNode() const; + + /** + * @brief Return the number of input sockets of this node. + */ + const unsigned int getNumberOfInputSockets() const {return this->inputsockets.size();} + + /** + * @brief Return the number of output sockets of this node. + */ + const unsigned int getNumberOfOutputSockets() const {return this->outputsockets.size();} + + /** + * after the data has been determined of an outputsocket that has a connection with an inputsocket this method is called on the + * node that contains the inputsocket. + * @param socket + * the reference of the inputsocket where connected data type is found + * @param actualType [COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR] + * the actual data type that is coming from the connected output socket + */ + virtual void notifyActualDataTypeSet(InputSocket* socket, const DataType actualType); + + /** + * get the reference to a certain outputsocket + * @param index + * the index of the needed outputsocket + */ + OutputSocket* getOutputSocket(const int index); + + /** + * get the reference to the first outputsocket + * @param index + * the index of the needed outputsocket + */ + inline OutputSocket* getOutputSocket() {return getOutputSocket(0);} + + /** + * get the reference to a certain inputsocket + * @param index + * the index of the needed inputsocket + */ + InputSocket* getInputSocket(const int index); + + + virtual bool isStatic() const {return false;} + void getStaticValues(float* result) const {} +protected: + NodeBase(); + + /** + * @brief add an InputSocket to the collection of inputsockets + * @note may only be called in an constructor + * @param socket the InputSocket to add + */ + void addInputSocket(DataType datatype); + void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode); + void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket* socket); + + /** + * @brief add an OutputSocket to the collection of outputsockets + * @note may only be called in an constructor + * @param socket the OutputSocket to add + */ + void addOutputSocket(DataType datatype); + void addOutputSocket(DataType datatype, bNodeSocket* socket); +}; + +#endif diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp new file mode 100644 index 00000000000..b02bcb6676e --- /dev/null +++ b/source/blender/compositor/intern/COM_NodeOperation.cpp @@ -0,0 +1,114 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_NodeOperation.h" +#include +#include "COM_InputSocket.h" +#include "COM_SocketConnection.h" +#include "COM_defines.h" +#include "stdio.h" + +NodeOperation::NodeOperation() { + this->resolutionInputSocketIndex = 0; + this->complex = false; + this->width = 0; + this->height = 0; + this->openCL = false; +} + +void NodeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + unsigned int temp[2]; + unsigned int temp2[2]; + vector &inputsockets = this->getInputSockets(); + + for (unsigned int index = 0 ; index < inputsockets.size();index++) { + InputSocket* inputSocket = inputsockets[index]; + if (inputSocket->isConnected()) { + if (index == this->resolutionInputSocketIndex) { + inputSocket->determineResolution(resolution, preferredResolution); + temp2[0] = resolution[0]; + temp2[1] = resolution[1]; + break; + } + } + } + for (unsigned int index = 0 ; index < inputsockets.size();index++) { + InputSocket* inputSocket = inputsockets[index]; + if (inputSocket->isConnected()) { + if (index != resolutionInputSocketIndex) { + inputSocket->determineResolution(temp, temp2); + } + } + } +} +void NodeOperation::setResolutionInputSocketIndex(unsigned int index) { + this->resolutionInputSocketIndex = index; +} +void NodeOperation::initExecution() { +} + +void NodeOperation::initMutex() { + BLI_mutex_init(&mutex); +} +void NodeOperation::deinitMutex() { + BLI_mutex_end(&mutex); +} +void NodeOperation::deinitExecution() { +} +SocketReader* NodeOperation::getInputSocketReader(unsigned int inputSocketIndex) { + return this->getInputSocket(inputSocketIndex)->getReader(); +} +NodeOperation* NodeOperation::getInputOperation(unsigned int inputSocketIndex) { + return this->getInputSocket(inputSocketIndex)->getOperation(); +} + +void NodeOperation::getConnectedInputSockets(vector *sockets) { + vector &inputsockets = this->getInputSockets(); + for (vector::iterator iterator = inputsockets.begin() ; iterator!= inputsockets.end() ; iterator++) { + InputSocket *socket = *iterator; + if (socket->isConnected()) { + sockets->push_back(socket); + } + } +} + +bool NodeOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti* output) { + if (this->isInputNode()) { + BLI_init_rcti(output, input->xmin, input->xmax, input->ymin, input->ymax); + return false; + } else { + unsigned int index; + vector &inputsockets = this->getInputSockets(); + + for (index = 0 ; index < inputsockets.size() ; index++) { + InputSocket* inputsocket = inputsockets[index]; + if (inputsocket->isConnected()) { + NodeOperation* inputoperation = (NodeOperation*)inputsocket->getConnection()->getFromNode(); + bool result = inputoperation->determineDependingAreaOfInterest(input, readOperation, output); + if (result) { + return true; + } + } + } + return false; + } +} diff --git a/source/blender/compositor/intern/COM_NodeOperation.h b/source/blender/compositor/intern/COM_NodeOperation.h new file mode 100644 index 00000000000..5dabc4db840 --- /dev/null +++ b/source/blender/compositor/intern/COM_NodeOperation.h @@ -0,0 +1,247 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_NodeProgram_h +#define _COM_NodeProgram_h + +class NodeOperation; + +#include "COM_Node.h" +#include +#include +#include "COM_MemoryBuffer.h" +#include "COM_MemoryProxy.h" +#include "COM_SocketReader.h" +#include "OCL_opencl.h" +#include "list" + +class ReadBufferOperation; + +/** + * @brief NodeOperation are contains calculation logic + * + * Subclasses needs to implement the execution method (defined in SocketReader) to implement logic. + * @ingroup Model + */ +class NodeOperation : public NodeBase, public SocketReader { +private: + /** + * @brief the index of the input socket that will be used to determine the resolution + */ + unsigned int resolutionInputSocketIndex; + + /** + * @brief is this operation a complex one. + * + * Complex operations are typically doing many reads to calculate the output of a single pixel. + * Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true. + */ + bool complex; + + /** + * @brief can this operation be scheduled on an OpenCL device. + * @note Only applicable if complex is True + */ + bool openCL; + + /** + * @brief mutex reference for very special node initializations + * @note only use when you really know what you are doing. + * this mutex is used to share data among chunks in the same operation + * @see TonemapOperation for an example of usage + * @see NodeOperation.initMutex initializes this mutex + * @see NodeOperation.deinitMutex deinitializes this mutex + * @see NodeOperation.getMutex retrieve a pointer to this mutex. + */ + ThreadMutex mutex; + +public: + /** + * @brief is this node an operation? + * This is true when the instance is of the subclass NodeOperation. + * @return [true:false] + * @see NodeBase + */ + const int isOperation() const {return true;} + + /** + * @brief determine the resolution of this node + * @note this method will not set the resolution, this is the responsibility of the caller + * @param resolution the result of this operation + * @param preferredResolution the preferrable resolution as no resolution could be determined + */ + virtual void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + /** + * @brief isOutputOperation determines whether this operation is an output of the ExecutionSystem during rendering or editing. + * + * Default behaviour if not overriden, this operation will not be evaluated as being an output of the ExecutionSystem. + * + * @see ExecutionSystem + * @group check + * @param rendering [true false] + * true: rendering + * false: editing + * + * @return bool the result of this method + */ + virtual bool isOutputOperation(bool rendering) const {return false;} + + /** + * isBufferOperation returns if this is an operation that work directly on buffers. + * + * there are only 2 implementation where this is true: + * @see ReadBufferOperation + * @see WriteBufferOperation + * for all other operations this will result in false. + */ + virtual int isBufferOperation() {return false;} + + virtual void initExecution(); + void initMutex(); + + /** + * @brief when a chunk is executed by a CPUDevice, this method is called + * @ingroup execution + * @param rect the rectangle of the chunk (location and size) + * @param chunkNumber the chunkNumber to be calculated + * @param memoryBuffers all input MemoryBuffer's needed + */ + virtual void executeRegion(rcti *rect, unsigned int chunkNumber, MemoryBuffer** memoryBuffers) {} + + /** + * @brief when a chunk is executed by an OpenCLDevice, this method is called + * @ingroup execution + * @note this method is only implemented in WriteBufferOperation + * @param context the OpenCL context + * @param program the OpenCL program containing all compositor kernels + * @param queue the OpenCL command queue of the device the chunk is executed on + * @param rect the rectangle of the chunk (location and size) + * @param chunkNumber the chunkNumber to be calculated + * @param memoryBuffers all input MemoryBuffer's needed + */ + virtual void executeOpenCLRegion(cl_context context, cl_program program, cl_command_queue queue, rcti *rect, unsigned int chunkNumber, MemoryBuffer** memoryBuffers) {} + + /** + * @brief custom handle to add new tasks to the OpenCL command queue in order to execute a chunk on an GPUDevice + * @ingroup execution + * @param context the OpenCL context + * @param program the OpenCL program containing all compositor kernels + * @param queue the OpenCL command queue of the device the chunk is executed on + * @param outputMemoryBuffer the allocated memory buffer in main CPU memory + * @param clOutputBuffer the allocated memory buffer in OpenCLDevice memory + * @param inputMemoryBuffers all input MemoryBuffer's needed + * @param clMemToCleanUp all created cl_mem references must be added to this list. Framework will clean this after execution + * @param clKernelsToCleanUp all created cl_kernel references must be added to this list. Framework will clean this after execution + */ + virtual void executeOpenCL(cl_context context,cl_program program, cl_command_queue queue, MemoryBuffer* outputMemoryBuffer, cl_mem clOutputBuffer, MemoryBuffer** inputMemoryBuffers, list *clMemToCleanUp, list *clKernelsToCleanUp) {} + virtual void deinitExecution(); + void deinitMutex(); + + /** + * @brief set the resolution + * @param resolution the resolution to set + */ + void setResolution(unsigned int resolution[]) {this->width = resolution[0];this->height = resolution[1];} + void getConnectedInputSockets(vector *sockets); + + /** + * @brief is this operation complex + * + * Complex operations are typically doing many reads to calculate the output of a single pixel. + * Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true. + */ + const bool isComplex() const {return this->complex;} + virtual const bool isSetOperation() const {return false;} + + /** + * @brief is this operation of type ReadBufferOperation + * @return [true:false] + * @see ReadBufferOperation + */ + virtual const bool isReadBufferOperation() const {return false;} + + /** + * @brief is this operation of type WriteBufferOperation + * @return [true:false] + * @see WriteBufferOperation + */ + virtual const bool isWriteBufferOperation() const {return false;} + + /** + * @brief is this operation the active viewer output + * user can select an ViewerNode to be active (the result of this node will be drawn on the backdrop) + * @return [true:false] + * @see BaseViewerOperation + */ + virtual const bool isActiveViewerOutput() const {return false;} + + virtual bool determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output); + + /** + * @brief set the index of the input socket that will determine the resolution of this operation + * @param index the index to set + */ + void setResolutionInputSocketIndex(unsigned int index); + + /** + * @brief get the render priority of this node. + * @note only applicable for output operations like ViewerOperation + * @return [0:9] 9 is highest priority + */ + virtual const int getRenderPriority() const {return 0;} + + /** + * @brief can this NodeOperation be scheduled on an OpenCLDevice + * @see WorkScheduler.schedule + * @see ExecutionGroup.addOperation + */ + bool isOpenCL() { return this->openCL; } + + virtual bool isViewerOperation() {return false;} +protected: + NodeOperation(); + + void setWidth(unsigned int width) {this->width = width;} + void setHeight(unsigned int height) {this->height= height;} + SocketReader* getInputSocketReader(unsigned int inputSocketindex); + NodeOperation* getInputOperation(unsigned int inputSocketindex); + + inline ThreadMutex* getMutex() {return &this->mutex;} + + /** + * @brief set whether this operation is complex + * + * Complex operations are typically doing many reads to calculate the output of a single pixel. + * Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true. + */ + void setComplex(bool complex) {this->complex = complex;} + + /** + * @brief set if this NodeOperation can be scheduled on a OpenCLDevice + */ + void setOpenCL(bool openCL) {this->openCL = openCL;} + + +}; + +#endif diff --git a/source/blender/compositor/intern/COM_NodeProgram.cpp b/source/blender/compositor/intern/COM_NodeProgram.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/source/blender/compositor/intern/COM_NodeProgram.h b/source/blender/compositor/intern/COM_NodeProgram.h new file mode 100644 index 00000000000..a71fa2b676f --- /dev/null +++ b/source/blender/compositor/intern/COM_NodeProgram.h @@ -0,0 +1,7 @@ +#ifndef _COM_NodeProgram_h +#define _COM_NodeProgram_h + +class NodeProgram{ +}; + +#endif diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.cpp b/source/blender/compositor/intern/COM_OpenCLDevice.cpp new file mode 100644 index 00000000000..acf3bf3789d --- /dev/null +++ b/source/blender/compositor/intern/COM_OpenCLDevice.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_OpenCLDevice.h" +#include "COM_WorkScheduler.h" + + +OpenCLDevice::OpenCLDevice(cl_context context, cl_device_id device, cl_program program){ + this->device = device; + this->context = context; + this->program = program; + this->queue = NULL; +} + +bool OpenCLDevice::initialize(){ + cl_int error; + queue = clCreateCommandQueue(context, device, 0, &error); + return false; +} + +void OpenCLDevice::deinitialize(){ + if(queue){ + clReleaseCommandQueue(queue); + } +} + +void OpenCLDevice::execute(WorkPackage *work) { + const unsigned int chunkNumber = work->getChunkNumber(); + ExecutionGroup * executionGroup = work->getExecutionGroup(); + rcti rect; + + executionGroup->determineChunkRect(&rect, chunkNumber); + MemoryBuffer ** inputBuffers = executionGroup->getInputBuffers(chunkNumber); + MemoryBuffer * outputBuffer = executionGroup->allocateOutputBuffer(chunkNumber, &rect); + + executionGroup->getOutputNodeOperation()->executeOpenCLRegion(this->context, this->program, this->queue, &rect, chunkNumber, inputBuffers); + + executionGroup->finalizeChunkExecution(chunkNumber, inputBuffers); + if (outputBuffer != NULL) { + outputBuffer->setCreatedState(); + } +} diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.h b/source/blender/compositor/intern/COM_OpenCLDevice.h new file mode 100644 index 00000000000..f61c555558d --- /dev/null +++ b/source/blender/compositor/intern/COM_OpenCLDevice.h @@ -0,0 +1,88 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class OpenCLDevice; + +#ifndef _COM_OpenCLDevice_h +#define _COM_OpenCLDevice_h + +#include "COM_Device.h" +#include "OCL_opencl.h" +#include "COM_WorkScheduler.h" + + +/** + * @brief device representing an GPU OpenCL device. + * an instance of this class represents a single cl_device + */ +class OpenCLDevice: public Device { +private: + /** + *@brief opencl context + */ + cl_context context; + + /** + *@brief opencl device + */ + cl_device_id device; + + /** + *@brief opencl program + */ + cl_program program; + + /** + *@brief opencl command queue + */ + cl_command_queue queue; +public: + /** + *@brief constructor with opencl device + *@param context + *@param device + */ + OpenCLDevice(cl_context context, cl_device_id device, cl_program program); + + + /** + * @brief initialize the device + * During initialization the OpenCL cl_command_queue is created + * the command queue is stored in the field queue. + * @see queue + */ + bool initialize(); + + /** + * @brief deinitialize the device + * During deintiialization the command queue is cleared + */ + void deinitialize(); + + /** + * @brief execute a WorkPackage + * @param work the WorkPackage to execute + */ + void execute(WorkPackage *work); +}; + +#endif diff --git a/source/blender/compositor/intern/COM_OutputSocket.cpp b/source/blender/compositor/intern/COM_OutputSocket.cpp new file mode 100644 index 00000000000..a262ad5f6ea --- /dev/null +++ b/source/blender/compositor/intern/COM_OutputSocket.cpp @@ -0,0 +1,146 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Socket.h" +#include "COM_Node.h" +#include "COM_SocketConnection.h" +#include "COM_NodeOperation.h" + +OutputSocket::OutputSocket(DataType datatype) :Socket(datatype) { + this->inputSocketDataTypeDeterminatorIndex = -1; +} +OutputSocket::OutputSocket(DataType datatype, int inputSocketDataTypeDeterminatorIndex) :Socket(datatype) { + this->inputSocketDataTypeDeterminatorIndex = inputSocketDataTypeDeterminatorIndex; +} + +OutputSocket::OutputSocket(OutputSocket *from): Socket(from->getDataType()) { + this->inputSocketDataTypeDeterminatorIndex = from->getInputSocketDataTypeDeterminatorIndex(); +} + +int OutputSocket::isOutputSocket() const { return true; } +const int OutputSocket::isConnected() const { return this->connections.size()!=0; } + +void OutputSocket::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + NodeBase* node = this->getNode(); + if (node->isOperation()) { + NodeOperation* operation = (NodeOperation*)node; + operation->determineResolution(resolution, preferredResolution); + operation->setResolution(resolution); + } +} + +void OutputSocket::determineActualDataType() { + DataType actualDatatype = this->getNode()->determineActualDataType(this); + + /** @todo: set the channel info needs to be moved after integration with OCIO */ + this->channelinfo[0].setNumber(0); + this->channelinfo[1].setNumber(1); + this->channelinfo[2].setNumber(2); + this->channelinfo[3].setNumber(3); + switch (actualDatatype) { + case COM_DT_VALUE: + this->channelinfo[0].setType(COM_CT_Value); + break; + case COM_DT_VECTOR: + this->channelinfo[0].setType(COM_CT_X); + this->channelinfo[1].setType(COM_CT_Y); + this->channelinfo[2].setType(COM_CT_Z); + break; + case COM_DT_COLOR: + this->channelinfo[0].setType(COM_CT_ColorComponent); + this->channelinfo[1].setType(COM_CT_ColorComponent); + this->channelinfo[2].setType(COM_CT_ColorComponent); + this->channelinfo[3].setType(COM_CT_Alpha); + break; + default: + break; + } + + this->setActualDataType(actualDatatype); + this->fireActualDataType(); +} + +void OutputSocket::addConnection(SocketConnection *connection) { + this->connections.push_back(connection); +} + +void OutputSocket::fireActualDataType() { + unsigned int index; + for (index = 0 ; index < this->connections.size();index ++) { + SocketConnection *connection = this->connections[index]; + connection->getToSocket()->notifyActualInputType(this->getActualDataType()); + } +} +void OutputSocket::relinkConnections(OutputSocket *relinkToSocket, bool single) { + if (isConnected()) { + if (single) { + SocketConnection *connection = this->connections[0]; + connection->setFromSocket(relinkToSocket); + relinkToSocket->addConnection(connection); +// relinkToSocket->setActualDataType(this->getActualDataType()); + this->connections.erase(this->connections.begin()); + } else { + unsigned int index; + for (index = 0 ; index < this->connections.size();index ++) { + SocketConnection *connection = this->connections[index]; + connection->setFromSocket(relinkToSocket); + relinkToSocket->addConnection(connection); + } +// relinkToSocket->setActualDataType(this->getActualDataType()); + this->connections.clear(); + } + } +} +void OutputSocket::removeFirstConnection() { + SocketConnection *connection = this->connections[0]; + InputSocket* inputSocket = connection->getToSocket(); + if (inputSocket != NULL) { + inputSocket->setConnection(NULL); + } + this->connections.erase(this->connections.begin()); +} + +void OutputSocket::clearConnections() { + while (this->isConnected()) { + removeFirstConnection(); + } +} + +WriteBufferOperation* OutputSocket::findAttachedWriteBufferOperation() const { + unsigned int index; + for (index = 0 ; index < this->connections.size();index++) { + SocketConnection* connection = this->connections[index]; + NodeBase* node = connection->getToNode(); + if (node->isOperation()) { + NodeOperation* operation = (NodeOperation*)node; + if (operation->isWriteBufferOperation()) { + return (WriteBufferOperation*)operation; + } + } + } + return NULL; +} + +ChannelInfo* OutputSocket::getChannelInfo(const int channelnumber) { + return &this->channelinfo[channelnumber]; +} + diff --git a/source/blender/compositor/intern/COM_OutputSocket.h b/source/blender/compositor/intern/COM_OutputSocket.h new file mode 100644 index 00000000000..8815f0bb3a8 --- /dev/null +++ b/source/blender/compositor/intern/COM_OutputSocket.h @@ -0,0 +1,105 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_OutputSocket_h +#define _COM_OutputSocket_h + +#include +#include "COM_Socket.h" +#include "COM_ChannelInfo.h" + +using namespace std; +class SocketConnection; +class Node; +class InputSocket; +class WriteBufferOperation; + +//#define COM_ST_INPUT 0 +//#define COM_ST_OUTPUT 1 + +/** + * @brief OutputSocket are sockets that can send data/input + * @ingroup Model + */ +class OutputSocket : public Socket { +private: + vector connections; + + /** + * @brief index of the inputsocket that determines the datatype of this outputsocket + * -1 will not use any inputsocket to determine the datatype, but use the outputsocket + * default datatype. + */ + int inputSocketDataTypeDeterminatorIndex; + + ChannelInfo channelinfo[4]; + void removeFirstConnection(); +public: + OutputSocket(DataType datatype); + OutputSocket(DataType datatype, int inputSocketDataTypeDeterminatorIndex); + OutputSocket(OutputSocket * from); + void addConnection(SocketConnection *connection); + SocketConnection* getConnection(unsigned int index) {return this->connections[index];} + const int isConnected() const; + int isOutputSocket() const; + + /** + * @brief determine the resolution of this socket + * @param resolution the result of this operation + * @param preferredResolution the preferrable resolution as no resolution could be determined + */ + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + /** + * @brief determine the actual data type and channel info. + */ + void determineActualDataType(); + void relinkConnections(OutputSocket *relinkToSocket) {this->relinkConnections(relinkToSocket, false);}; + void relinkConnections(OutputSocket *relinkToSocket, bool single); + bool isActualDataTypeDeterminedByInputSocket() { + return this->inputSocketDataTypeDeterminatorIndex>-1; + } + const int getNumberOfConnections() {return connections.size();} + + /** + * @brief get the index of the inputsocket that determines the datatype of this outputsocket + */ + int getInputSocketDataTypeDeterminatorIndex() {return this->inputSocketDataTypeDeterminatorIndex;} + void clearConnections(); + + /** + * @brief find a connected write buffer operation to this OutputSocket + * @return WriteBufferOperation or NULL + */ + WriteBufferOperation* findAttachedWriteBufferOperation() const; + ChannelInfo* getChannelInfo(const int channelnumber); + + /** + * @brief trigger determine actual data type to all connected sockets + * @note will only be triggered just after the actual data type is set. + */ + void fireActualDataType(); + +private: + +}; +#endif diff --git a/source/blender/compositor/intern/COM_Socket.cpp b/source/blender/compositor/intern/COM_Socket.cpp new file mode 100644 index 00000000000..cb429c9df4a --- /dev/null +++ b/source/blender/compositor/intern/COM_Socket.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Socket.h" +#include "COM_Node.h" +#include "COM_SocketConnection.h" + +Socket::Socket(DataType datatype) { + this->datatype = datatype; + this->actualType = COM_DT_UNKNOWN; + this->editorSocket = NULL; + this->node = NULL; +} + +DataType Socket::getDataType() const { + return this->datatype; +} + +int Socket::isInputSocket() const { return false; } +int Socket::isOutputSocket() const { return false; } +const int Socket::isConnected() const {return false;} +void Socket::setNode(NodeBase *node) {this->node = node;} +NodeBase* Socket::getNode() const {return this->node;} + +DataType Socket::getActualDataType() const {return this->actualType;} +void Socket::setActualDataType(DataType actualType) { + this->actualType = actualType; +} diff --git a/source/blender/compositor/intern/COM_Socket.h b/source/blender/compositor/intern/COM_Socket.h new file mode 100644 index 00000000000..3243a371cda --- /dev/null +++ b/source/blender/compositor/intern/COM_Socket.h @@ -0,0 +1,100 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_Socket_h +#define _COM_Socket_h + +#include +#include "BKE_text.h" +#include +#include "DNA_node_types.h" +#include "COM_defines.h" + +using namespace std; +class SocketConnection; +class NodeBase; + +/** + * @brief Base class for InputSocket and OutputSocket. + * + * A socket are the points on an node where the user can make a connection between. + * Sockets are always part of a node or an operation. + * + * @see InputSocket + * @see OutputSocket + * @see SocketConnection - a connection between an InputSocket and an OutputSocket + * @ingroup Model + */ +class Socket { +private: + /** + * Reference to the node where this Socket belongs to + */ + NodeBase* node; + + /** + * the datatype of this socket. Is used for automatically data transformation. + * @section data-conversion + */ + DataType datatype; + + /** + * the actual data type during execution. This can be different than the field datatype, based on the conversion rules of the node + * @section data-conversion + */ + DataType actualType; + + bNodeSocket* editorSocket; +public: + Socket(DataType datatype); + + DataType getDataType() const; + void setNode(NodeBase* node); + NodeBase* getNode() const; + + /** + * @brief get the actual data type + * + * @note The actual data type can differ from the data type this socket expects. + * @return actual DataType + */ + DataType getActualDataType() const; + + /** + * @brief set the actual data type + * @param actualType the new actual type + */ + void setActualDataType(DataType actualType); + + const virtual int isConnected() const; + int isInputSocket() const; + int isOutputSocket() const; + virtual void determineResolution(int resolution[], unsigned int preferredResolution[]) {} + virtual void determineActualDataType() {} + + void setEditorSocket(bNodeSocket* editorSocket) {this->editorSocket = editorSocket;} + bNodeSocket* getbNodeSocket() const {return this->editorSocket;} + +}; + + +#endif diff --git a/source/blender/compositor/intern/COM_SocketConnection.cpp b/source/blender/compositor/intern/COM_SocketConnection.cpp new file mode 100644 index 00000000000..6c6c673501a --- /dev/null +++ b/source/blender/compositor/intern/COM_SocketConnection.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SocketConnection.h" +#include "COM_NodeOperation.h" + +SocketConnection::SocketConnection() { + this->fromSocket = NULL; + this->toSocket = NULL; + this->setIgnoreResizeCheck(false); +} + +void SocketConnection::setFromSocket(OutputSocket* fromsocket){ + if (fromsocket == NULL) { + throw "ERROR"; + } + this->fromSocket = fromsocket; +} + +OutputSocket* SocketConnection::getFromSocket() const {return this->fromSocket;} +void SocketConnection::setToSocket(InputSocket* tosocket) { + if (tosocket == NULL) { + throw "ERROR"; + } + this->toSocket = tosocket; +} + +InputSocket* SocketConnection::getToSocket() const {return this->toSocket;} + +NodeBase* SocketConnection::getFromNode() const { + if (this->getFromSocket() == NULL) { + return NULL; + } else { + return this->getFromSocket()->getNode(); + } +} +NodeBase* SocketConnection::getToNode() const { + if (this->getToSocket() == NULL) { + return NULL; + } else { + return this->getToSocket()->getNode(); + } +} +bool SocketConnection::isValid() const { + if ((this->getToSocket() != NULL && this->getFromSocket() != NULL)) { + if (this->getFromNode()->isOperation() && this->getToNode()->isOperation()) { + return true; + } + } + return false; +} + +bool SocketConnection::needsResolutionConversion() const { + if (this->ignoreResizeCheck) {return false;} + NodeOperation* fromOperation = (NodeOperation*)this->getFromNode(); + NodeOperation* toOperation = (NodeOperation*)this->getToNode(); + if (this->toSocket->getResizeMode() == COM_SC_NO_RESIZE) {return false;} + const unsigned int fromWidth = fromOperation->getWidth(); + const unsigned int fromHeight = fromOperation->getHeight(); + const unsigned int toWidth = toOperation->getWidth(); + const unsigned int toHeight = toOperation->getHeight(); + + if (fromWidth == toWidth && fromHeight == toHeight) { + return false; + } + return true; +} diff --git a/source/blender/compositor/intern/COM_SocketConnection.h b/source/blender/compositor/intern/COM_SocketConnection.h new file mode 100644 index 00000000000..55811cc6ebe --- /dev/null +++ b/source/blender/compositor/intern/COM_SocketConnection.h @@ -0,0 +1,123 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SocketConnection_h +#define _COM_SocketConnection_h + +#include "DNA_node_types.h" +#include "COM_Node.h" +#include "COM_Socket.h" +#include "COM_ChannelInfo.h" + +/** + * @brief An SocketConnection is an connection between an InputSocket and an OutputSocket. + * + *
+  * +----------+     To InputSocket +----------+
+  * | From     |  SocketConnection \| To Node  |
+  * | Node     *====================*          |
+  * |          |\                   |          |
+  * |          | From OutputSocket  +----------+
+  * +----------+
+  * 
+ * @ingroup Model + * @see InputSocket + * @see OutputSocket + */ +class SocketConnection { +private: + /** + * @brief Startpoint of the connection + */ + OutputSocket *fromSocket; + + /** + * @brief Endpoint of the connection + */ + InputSocket *toSocket; + + /** + * @brief has the resize already been done for this connection + */ + bool ignoreResizeCheck; +public: + SocketConnection(); + + /** + * @brief set the startpoint of the connection + * @param fromsocket + */ + void setFromSocket(OutputSocket* fromsocket); + + /** + * @brief get the startpoint of the connection + * @return from OutputSocket + */ + OutputSocket* getFromSocket() const; + + /** + * @brief set the endpoint of the connection + * @param tosocket + */ + void setToSocket(InputSocket* tosocket); + + /** + * @brief get the endpoint of the connection + * @return to InputSocket + */ + InputSocket* getToSocket() const; + + /** + * @brief check if this connection is valid + */ + bool isValid() const; + + /** + * @brief return the Node where this connection is connected from + */ + NodeBase * getFromNode() const; + + /** + * @brief return the Node where this connection is connected to + */ + NodeBase * getToNode() const; + + /** + * @brief set, whether the resize has already been done for this SocketConnection + */ + void setIgnoreResizeCheck(bool check) {this->ignoreResizeCheck = check;} + + /** + * @brief has the resize already been done for this SocketConnection + */ + bool isIgnoreResizeCheck() const { return this->ignoreResizeCheck;} + + /** + * @brief does this SocketConnection need resolution conversion + * @note PreviewOperation's will be ignored + * @note Already converted SocketConnection's will be ignored + * @return needs conversion [true:false] + */ + bool needsResolutionConversion() const; +}; + +#endif diff --git a/source/blender/compositor/intern/COM_SocketReader.cpp b/source/blender/compositor/intern/COM_SocketReader.cpp new file mode 100644 index 00000000000..45f3be5a66c --- /dev/null +++ b/source/blender/compositor/intern/COM_SocketReader.cpp @@ -0,0 +1,25 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SocketReader.h" + + diff --git a/source/blender/compositor/intern/COM_SocketReader.h b/source/blender/compositor/intern/COM_SocketReader.h new file mode 100644 index 00000000000..fd07726a939 --- /dev/null +++ b/source/blender/compositor/intern/COM_SocketReader.h @@ -0,0 +1,113 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SocketReader_h +#define _COM_SocketReader_h +#include "BLI_rect.h" +#include "COM_defines.h" + +typedef enum PixelSampler { + COM_PS_NEAREST, + COM_PS_BILINEAR, + COM_PS_BICUBIC +} PixelSampler; + +class MemoryBuffer; +/** + * @brief Helper class for reading socket data. + * Only use this class for dispatching (un-ary and n-ary) executions. + * @ingroup Execution + */ +class SocketReader { +private: +protected: + /** + * @brief Holds the width of the output of this operation. + */ + unsigned int width; + + /** + * @brief Holds the height of the output of this operation. + */ + unsigned int height; + + + /** + * @brief calculate a single pixel + * @note this method is called for non-complex + * @param result is a float[4] array to store the result + * @param x the x-coordinate of the pixel to calculate in image space + * @param y the y-coordinate of the pixel to calculate in image space + * @param inputBuffers chunks that can be read by their ReadBufferOperation. + */ + virtual void executePixel(float* result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) {} + + /** + * @brief calculate a single pixel + * @note this method is called for complex + * @param result is a float[4] array to store the result + * @param x the x-coordinate of the pixel to calculate in image space + * @param y the y-coordinate of the pixel to calculate in image space + * @param inputBuffers chunks that can be read by their ReadBufferOperation. + * @param chunkData chunk specific data a during execution time. + */ + virtual void executePixel(float* result, int x, int y, MemoryBuffer *inputBuffers[], void* chunkData) { + executePixel(result, x, y, COM_PS_NEAREST, inputBuffers); + } + + /** + * @brief calculate a single pixel using an EWA filter + * @note this method is called for complex + * @param result is a float[4] array to store the result + * @param x the x-coordinate of the pixel to calculate in image space + * @param y the y-coordinate of the pixel to calculate in image space + * @param dx + * @param dy + * @param inputBuffers chunks that can be read by their ReadBufferOperation. + */ + virtual void executePixel(float* result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) {} + +public: + inline void read(float* result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + executePixel(result, x, y, sampler, inputBuffers); + } + inline void read(float* result, int x, int y, MemoryBuffer *inputBuffers[], void* chunkData) { + executePixel(result, x, y, inputBuffers, chunkData); + } + inline void read(float* result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) { + executePixel(result, x, y, dx, dy, inputBuffers); + } + + virtual void* initializeTileData(rcti *rect, MemoryBuffer** memoryBuffers) { + return 0; + } + virtual void deinitializeTileData(rcti *rect, MemoryBuffer** memoryBuffers, void* data) { + } + + virtual MemoryBuffer* getInputMemoryBuffer(MemoryBuffer** memoryBuffers) {return 0;} + + + inline const unsigned int getWidth() const {return this->width;} + inline const unsigned int getHeight() const {return this->height;} +}; + +#endif diff --git a/source/blender/compositor/intern/COM_WorkPackage.cpp b/source/blender/compositor/intern/COM_WorkPackage.cpp new file mode 100644 index 00000000000..d606e845b00 --- /dev/null +++ b/source/blender/compositor/intern/COM_WorkPackage.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_WorkPackage.h" + +WorkPackage::WorkPackage(ExecutionGroup *group, unsigned int chunkNumber) { + this->executionGroup = group; + this->chunkNumber = chunkNumber; +} diff --git a/source/blender/compositor/intern/COM_WorkPackage.h b/source/blender/compositor/intern/COM_WorkPackage.h new file mode 100644 index 00000000000..3169a9dcc30 --- /dev/null +++ b/source/blender/compositor/intern/COM_WorkPackage.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +class WorkPackage; + +#ifndef _COM_WorkPackage_h_ +#define _COM_WorkPackage_h_ + +#include "COM_ExecutionGroup.h" + +/** + * @brief contains data about work that can be scheduled + * @see WorkScheduler + */ +class WorkPackage { +private: + /** + * @brief executionGroup with the operations-setup to be evaluated + */ + ExecutionGroup* executionGroup; + + /** + * @brief number of the chunk to be executed + */ + unsigned int chunkNumber; +public: + /** + * @constructor + * @param group the ExecutionGroup + * @param chunkNumber the number of the chunk + */ + WorkPackage(ExecutionGroup* group, unsigned int chunkNumber); + + /** + * @brief get the ExecutionGroup + */ + ExecutionGroup* getExecutionGroup() const {return this->executionGroup;} + + /** + * @brief get the number of the chunk + */ + unsigned int getChunkNumber() const {return this->chunkNumber;} +}; + +#endif diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp new file mode 100644 index 00000000000..e7c1e00dd96 --- /dev/null +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -0,0 +1,313 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include +#include "COM_WorkScheduler.h" +#include "PIL_time.h" +#include "BLI_threads.h" +#include "COM_CPUDevice.h" +#include "COM_OpenCLDevice.h" +#include "OCL_opencl.h" +#include "stdio.h" +#include "COM_OpenCLKernels.cl.cpp" + +#if COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD +#warning COM_CURRENT_THREADING_MODEL COM_TM_NOTHREAD is activated. Use only for debugging. +#elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE +#else +#error COM_CURRENT_THREADING_MODEL No threading model selected +#endif + + +/// @brief global state of the WorkScheduler. +static WorkSchedulerState state; +/// @brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created +static vector cpudevices; + +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE +/// @brief list of all thread for every CPUDevice in cpudevices a thread exists +static ListBase cputhreads; +/// @brief all scheduled work for the cpu +static ThreadQueue * cpuqueue; +static ThreadQueue * gpuqueue; +#ifdef COM_OPENCL_ENABLED +static cl_context context; +static cl_program program; +/// @brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is created +static vector gpudevices; +/// @brief list of all thread for every GPUDevice in cpudevices a thread exists +static ListBase gputhreads; +/// @brief all scheduled work for the gpu +#ifdef COM_OPENCL_ENABLED +static bool openclActive = false; +#endif +#endif +#endif + + +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE +void* WorkScheduler::thread_execute_cpu(void* data) { + bool continueLoop = true; + Device* device = (Device*)data; + while (continueLoop) { + WorkPackage* work = (WorkPackage*)BLI_thread_queue_pop(cpuqueue); + if (work) { + device->execute(work); + delete work; + } + PIL_sleep_ms(10); + + if (WorkScheduler::isStopping()) { + continueLoop = false; + } + } + return NULL; +} + +void* WorkScheduler::thread_execute_gpu(void* data) { + bool continueLoop = true; + Device* device = (Device*)data; + while (continueLoop) { + WorkPackage* work = (WorkPackage*)BLI_thread_queue_pop(gpuqueue); + if (work) { + device->execute(work); + delete work; + } + PIL_sleep_ms(10); + + if (WorkScheduler::isStopping()) { + continueLoop = false; + } + } + return NULL; +} + +bool WorkScheduler::isStopping() {return state == COM_WSS_STOPPING;} +#endif + + + +void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) { + WorkPackage* package = new WorkPackage(group, chunkNumber); +#if COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD + CPUDevice device; + device.execute(package); + delete package; +#elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE +#ifdef COM_OPENCL_ENABLED + if (group->isOpenCL() && openclActive){ + BLI_thread_queue_push(gpuqueue, package); + } else{ + BLI_thread_queue_push(cpuqueue, package); + } +#else + BLI_thread_queue_push(cpuqueue, package); +#endif +#endif +} + +void WorkScheduler::start(CompositorContext &context) { +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE + unsigned int index; + cpuqueue = BLI_thread_queue_init(); + BLI_thread_queue_nowait(cpuqueue); + BLI_init_threads(&cputhreads, thread_execute_cpu, cpudevices.size()); + for (index = 0 ; index < cpudevices.size() ; index ++) { + Device* device = cpudevices[index]; + BLI_insert_thread(&cputhreads, device); + } +#ifdef COM_OPENCL_ENABLED + if (context.getHasActiveOpenCLDevices()) { + gpuqueue = BLI_thread_queue_init(); + BLI_thread_queue_nowait(gpuqueue); + BLI_init_threads(&gputhreads, thread_execute_gpu, gpudevices.size()); + for (index = 0 ; index < gpudevices.size() ; index ++) { + Device* device = gpudevices[index]; + BLI_insert_thread(&gputhreads, device); + } + openclActive = true; + } else { + openclActive = false; + } +#endif +#endif + state = COM_WSS_STARTED; +} +void WorkScheduler::finish() { +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE +#ifdef COM_OPENCL_ENABLED + if (openclActive) { + while (BLI_thread_queue_size(gpuqueue) + BLI_thread_queue_size(cpuqueue) > 0) { + PIL_sleep_ms(10); + } + } else { + while (BLI_thread_queue_size(cpuqueue) > 0) { + PIL_sleep_ms(10); + } + } +#else + while (BLI_thread_queue_size(cpuqueue) > 0) { + PIL_sleep_ms(10); + } +#endif +#endif +} +void WorkScheduler::stop() { + state = COM_WSS_STOPPING; +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE + BLI_end_threads(&cputhreads); + BLI_thread_queue_free(cpuqueue); + cpuqueue = NULL; +#ifdef COM_OPENCL_ENABLED + if (openclActive) { + BLI_end_threads(&gputhreads); + BLI_thread_queue_free(gpuqueue); + gpuqueue = NULL; + } +#endif +#endif + state = COM_WSS_STOPPED; +} + +bool WorkScheduler::hasGPUDevices() { +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE +#ifdef COM_OPENCL_ENABLED + return gpudevices.size()>0; +#else + return 0; +#endif +#else + return 0; +#endif +} + +extern void clContextError(const char *errinfo, const void *private_info, size_t cb, void *user_data) { + printf("OPENCL error: %s\n", errinfo); +} + +void WorkScheduler::initialize() { + state = COM_WSS_UNKNOWN; + +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE + int numberOfCPUThreads = BLI_system_thread_count(); + + for (int index = 0 ; index < numberOfCPUThreads ; index ++) { + CPUDevice *device = new CPUDevice(); + device->initialize(); + cpudevices.push_back(device); + } +#ifdef COM_OPENCL_ENABLED + context = NULL; + program = NULL; + if (clCreateContextFromType) { + cl_uint numberOfPlatforms; + cl_int error; + error = clGetPlatformIDs(0, 0, &numberOfPlatforms); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + printf("%d number of platforms\n", numberOfPlatforms); + cl_platform_id *platforms = new cl_platform_id[numberOfPlatforms]; + error = clGetPlatformIDs(numberOfPlatforms, platforms, 0); + unsigned int indexPlatform; + cl_uint totalNumberOfDevices = 0; + for (indexPlatform = 0 ; indexPlatform < numberOfPlatforms ; indexPlatform ++) { + cl_platform_id platform = platforms[indexPlatform]; + cl_uint numberOfDevices; + clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, 0, &numberOfDevices); + totalNumberOfDevices += numberOfDevices; + } + + cl_device_id *cldevices = new cl_device_id[totalNumberOfDevices]; + unsigned int numberOfDevicesReceived = 0; + for (indexPlatform = 0 ; indexPlatform < numberOfPlatforms ; indexPlatform ++) { + cl_platform_id platform = platforms[indexPlatform]; + cl_uint numberOfDevices; + clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, 0, &numberOfDevices); + clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numberOfDevices, cldevices+numberOfDevicesReceived*sizeof (cl_device_id), 0); + numberOfDevicesReceived += numberOfDevices; + } + context = clCreateContext(NULL, totalNumberOfDevices, cldevices, clContextError, NULL, &error); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + program = clCreateProgramWithSource(context, 1, &sourcecode, 0, &error); + error = clBuildProgram(program, totalNumberOfDevices, cldevices, 0, 0, 0); + if (error != CL_SUCCESS) { + cl_int error2; + size_t ret_val_size; + printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); + error2 = clGetProgramBuildInfo(program, cldevices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size); + if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + char* build_log = new char[ret_val_size+1]; + error2 = clGetProgramBuildInfo(program, cldevices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL); + if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + build_log[ret_val_size] = '\0'; + printf("%s", build_log); + delete build_log; + + } + unsigned int indexDevices; + for (indexDevices = 0 ; indexDevices < totalNumberOfDevices ; indexDevices ++) { + cl_device_id device = cldevices[indexDevices]; + OpenCLDevice* clDevice = new OpenCLDevice(context, device, program); + clDevice->initialize(), + gpudevices.push_back(clDevice); + char resultString[32]; + error = clGetDeviceInfo(device, CL_DEVICE_NAME, 32, resultString, 0); + printf("OPENCL_DEVICE: %s, ", resultString); + error = clGetDeviceInfo(device, CL_DEVICE_VENDOR, 32, resultString, 0); + printf("%s\n", resultString); + } + delete cldevices; + delete platforms; + } +#endif +#endif + + state = COM_WSS_INITIALIZED; +} + +void WorkScheduler::deinitialize() { +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE + Device* device; + while(cpudevices.size()>0) { + device = cpudevices.back(); + cpudevices.pop_back(); + device->deinitialize(); + delete device; + } +#ifdef COM_OPENCL_ENABLED + while(gpudevices.size()>0) { + device = gpudevices.back(); + gpudevices.pop_back(); + device->deinitialize(); + delete device; + } + if (program) { + clReleaseProgram(program); + program = NULL; + } + if (context) { + clReleaseContext(context); + context = NULL; + } +#endif +#endif + state = COM_WSS_DEINITIALIZED; +} diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h new file mode 100644 index 00000000000..0befa209e47 --- /dev/null +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -0,0 +1,127 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_WorkScheduler_h_ +#define _COM_WorkScheduler_h_ + +#include "COM_ExecutionGroup.h" +extern "C" { + #include "BLI_threads.h" +} +#include "COM_WorkPackage.h" +#include "COM_defines.h" +#include "COM_Device.h" + +// STATES +/** @brief states of the WorkScheduler + * @ingroup execution + */ +typedef enum WorkSchedulerState { + COM_WSS_UNKNOWN = -1, + COM_WSS_INITIALIZED = 0, + COM_WSS_STARTED = 1, + COM_WSS_STOPPING = 2, + COM_WSS_STOPPED = 3, + COM_WSS_DEINITIALIZED = 4 +} WorkSchedulerState; + +/** @brief the workscheduler + * @ingroup execution + */ +class WorkScheduler { + +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE + /** + * @brief are we being stopped. + */ + static bool isStopping(); + + /** + * @brief main thread loop for cpudevices + * inside this loop new work is queried and being executed + */ + static void* thread_execute_cpu(void* data); + + /** + * @brief main thread loop for gpudevices + * inside this loop new work is queried and being executed + */ + static void* thread_execute_gpu(void* data); +#endif +public: + /** + * @brief schedule a chunk of a group to be calculated. + * An execution group schedules a chunk in the WorkScheduler + * when ExecutionGroup.isOpenCL is set the work will be handled by a OpenCLDevice + * otherwide the work is scheduled for an CPUDevice + * @see ExecutionGroup.execute + * @param group the execution group + * @param chunkNumber the number of the chunk in the group to be executed + */ + static void schedule(ExecutionGroup* group, int chunkNumber); + + /** + * @brief initialize the WorkScheduler + * + * during initialization the mutexes are initialized. + * there are two mutexes (for every device type one) + * After mutex initialization the system is queried in order to count the number of CPUDevices and GPUDevices to be created. + * For every hardware thread a CPUDevice and for every OpenCL GPU device a OpenCLDevice is created. + * these devices are stored in a separate list (cpudevices & gpudevices) + */ + static void initialize(); + + /** + * @brief deinitialize the WorkScheduler + * free all allocated resources + */ + static void deinitialize(); + + /** + * @brief Start the execution + * this methods will start the WorkScheduler. Inside this method all threads are initialized. + * for every device a thread is created. + * @see initialize Initialization and query of the number of devices + */ + static void start(CompositorContext &context); + + /** + * @brief stop the execution + * All created thread by the start method are destroyed. + * @see start + */ + static void stop(); + + /** + * @brief wait for all work to be completed. + */ + static void finish(); + + /** + * @brief Are there OpenCL capable GPU devices initialized? + * the result of this method is stored in the CompositorContext + * A node can generate a different operation tree when OpenCLDevices exists. + * @see CompositorContext.getHasActiveOpenCLDevices + */ + static bool hasGPUDevices(); +}; +#endif diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp new file mode 100644 index 00000000000..5707fc2c2fe --- /dev/null +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + + +#include "BKE_node.h" +extern "C" { + #include "BLI_threads.h" +} + +#include "COM_compositor.h" +#include "COM_ExecutionSystem.h" +#include "COM_WorkScheduler.h" + +static ThreadMutex *compositorMutex; +void COM_execute(bNodeTree *editingtree, int rendering) { + if (compositorMutex == NULL) { /// TODO: move to blender startup phase + compositorMutex = new ThreadMutex(); + BLI_mutex_init(compositorMutex); + WorkScheduler::initialize(); ///TODO: call workscheduler.deinitialize somewhere + } + BLI_mutex_lock(compositorMutex); + if (editingtree->test_break && editingtree->test_break(editingtree->tbh)) { + // during editing multiple calls to this method can be triggered. + // make sure one the last one will be doing the work. + BLI_mutex_unlock(compositorMutex); + return; + + } + + /* set progress bar to 0% and status to init compositing*/ + editingtree->progress(editingtree->prh, 0.0); + editingtree->stats_draw(editingtree->sdh, (char*)"Compositing"); + + /* initialize execution system */ + ExecutionSystem* system = new ExecutionSystem(editingtree, rendering); + system->execute(); + delete system; + + BLI_mutex_unlock(compositorMutex); +} diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp new file mode 100644 index 00000000000..7cd26bc79b7 --- /dev/null +++ b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_AlphaOverNode.h" + +#include "COM_MixBaseOperation.h" +#include "COM_AlphaOverKeyOperation.h" +#include "COM_AlphaOverMixedOperation.h" +#include "COM_AlphaOverPremultiplyOperation.h" + +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "DNA_material_types.h" // the ramp types + +void AlphaOverNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *valueSocket = this->getInputSocket(0); + InputSocket *color1Socket = this->getInputSocket(1); + InputSocket *color2Socket = this->getInputSocket(2); + OutputSocket *outputSocket = this->getOutputSocket(0); + bNode* editorNode = this->getbNode(); + + MixBaseOperation *convertProg; + NodeTwoFloats *ntf= (NodeTwoFloats*)editorNode->storage; + if (ntf->x!= 0.0f) { + AlphaOverMixedOperation *mixOperation = new AlphaOverMixedOperation(); + mixOperation->setX(ntf->x); + convertProg = mixOperation; + + } else if (editorNode->custom1) { + convertProg = new AlphaOverKeyOperation(); + } else { + convertProg = new AlphaOverPremultiplyOperation(); + } + + convertProg->setUseValueAlphaMultiply(false); + if (color1Socket->isConnected()) { + convertProg->setResolutionInputSocketIndex(1); + } else if (color2Socket->isConnected()) { + convertProg->setResolutionInputSocketIndex(2); + } else { + convertProg->setResolutionInputSocketIndex(0); + } + valueSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); + color1Socket->relinkConnections(convertProg->getInputSocket(1), true, 1, graph); + color2Socket->relinkConnections(convertProg->getInputSocket(2), true, 2, graph); + outputSocket->relinkConnections(convertProg->getOutputSocket(0)); + graph->addOperation(convertProg); +} diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.h b/source/blender/compositor/nodes/COM_AlphaOverNode.h new file mode 100644 index 00000000000..b9840f89d3a --- /dev/null +++ b/source/blender/compositor/nodes/COM_AlphaOverNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_AlphaOverNode_h +#define _COM_AlphaOverNode_h + +#include "COM_Node.h" + +/** + * @brief AlphaOverNode + * @ingroup Node + */ +class AlphaOverNode: public Node { +public: + AlphaOverNode(bNode* editorNode) :Node(editorNode) {} + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp b/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp new file mode 100644 index 00000000000..5302fb01f1c --- /dev/null +++ b/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BilateralBlurNode.h" +#include "DNA_scene_types.h" +#include "DNA_node_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_BilateralBlurOperation.h" + +BilateralBlurNode::BilateralBlurNode(bNode *editorNode): Node(editorNode) { +} + +void BilateralBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + NodeBilateralBlurData *data = (NodeBilateralBlurData*)this->getbNode()->storage; + BilateralBlurOperation *operation = new BilateralBlurOperation(); + operation->setQuality(context->getQuality()); + operation->setData(data); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_BilateralBlurNode.h b/source/blender/compositor/nodes/COM_BilateralBlurNode.h new file mode 100644 index 00000000000..d5d9b7367a4 --- /dev/null +++ b/source/blender/compositor/nodes/COM_BilateralBlurNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BilateralBlurNode_h_ +#define _COM_BilateralBlurNode_h_ + +#include "COM_Node.h" + +/** + * @brief BilateralBlurNode + * @ingroup Node + */ +class BilateralBlurNode: public Node { +public: + BilateralBlurNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_BlurNode.cpp b/source/blender/compositor/nodes/COM_BlurNode.cpp new file mode 100644 index 00000000000..c278ea877ba --- /dev/null +++ b/source/blender/compositor/nodes/COM_BlurNode.cpp @@ -0,0 +1,79 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BlurNode.h" +#include "DNA_scene_types.h" +#include "DNA_node_types.h" +#include "COM_GaussianXBlurOperation.h" +#include "COM_GaussianYBlurOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_GaussianBokehBlurOperation.h" +#include "COM_FastGaussianBlurOperation.h" + +BlurNode::BlurNode(bNode *editorNode): Node(editorNode) { +} + +void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + bNode* editorNode = this->getbNode(); + NodeBlurData * data = (NodeBlurData*)editorNode->storage; + const bNodeSocket *sock = this->getInputSocket(1)->getbNodeSocket(); + //const float size = ((const bNodeSocketValueFloat*)sock->default_value)->value; + + CompositorQuality quality = context->getQuality(); + + if (data->filtertype == R_FILTER_MITCH || data->filtertype == R_FILTER_CATROM) { + quality = COM_QUALITY_HIGH; + } + if (data->filtertype == R_FILTER_FAST_GAUSS) { + FastGaussianBlurOperation *operationfgb = new FastGaussianBlurOperation(); + operationfgb->setData(data); + this->getInputSocket(0)->relinkConnections(operationfgb->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operationfgb->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operationfgb->getOutputSocket(0)); + graph->addOperation(operationfgb); + addPreviewOperation(graph, operationfgb->getOutputSocket(), 5); + }else if (!data->bokeh) { + GaussianXBlurOperation *operationx = new GaussianXBlurOperation(); + operationx->setData(data); + operationx->setQuality(quality); + this->getInputSocket(0)->relinkConnections(operationx->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operationx->getInputSocket(1), true, 1, graph); + graph->addOperation(operationx); + GaussianYBlurOperation *operationy = new GaussianYBlurOperation(); + operationy->setData(data); + operationy->setQuality(quality); + this->getOutputSocket(0)->relinkConnections(operationy->getOutputSocket()); + graph->addOperation(operationy); + addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0)); + addLink(graph, operationx->getInputSocket(1)->getConnection()->getFromSocket(), operationy->getInputSocket(1)); + addPreviewOperation(graph, operationy->getOutputSocket(), 5); + } else { + GaussianBokehBlurOperation *operation = new GaussianBokehBlurOperation(); + operation->setData(data); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + operation->setQuality(quality); + graph->addOperation(operation); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + addPreviewOperation(graph, operation->getOutputSocket(), 5); + } +} diff --git a/source/blender/compositor/nodes/COM_BlurNode.h b/source/blender/compositor/nodes/COM_BlurNode.h new file mode 100644 index 00000000000..087e2be208f --- /dev/null +++ b/source/blender/compositor/nodes/COM_BlurNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BlurNode_h_ +#define _COM_BlurNode_h_ + +#include "COM_Node.h" + +/** + * @brief BlurNode + * @ingroup Node + */ + +class BlurNode: public Node { +public: + BlurNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp new file mode 100644 index 00000000000..c40bcab3ffb --- /dev/null +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp @@ -0,0 +1,63 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BokehBlurNode.h" +#include "DNA_scene_types.h" +#include "DNA_camera_types.h" +#include "DNA_object_types.h" +#include "DNA_node_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_BokehBlurOperation.h" +#include "COM_VariableSizeBokehBlurOperation.h" +#include "COM_ConvertDepthToRadiusOperation.h" + +BokehBlurNode::BokehBlurNode(bNode *editorNode): Node(editorNode) { +} + +void BokehBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + Object* camob = context->getScene()->camera; + + if (this->getInputSocket(2)->isConnected()) { + VariableSizeBokehBlurOperation *operation = new VariableSizeBokehBlurOperation(); + ConvertDepthToRadiusOperation *converter = new ConvertDepthToRadiusOperation(); + converter->setfStop(4.0f); + converter->setCameraObject(camob); + operation->setMaxBlur(16); + operation->setQuality(context->getQuality()); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(2)->relinkConnections(converter->getInputSocket(0), true, 2, graph); + addLink(graph, converter->getOutputSocket(), operation->getInputSocket(2)); + graph->addOperation(operation); + graph->addOperation(converter); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + } else { + BokehBlurOperation *operation = new BokehBlurOperation(); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(2), true, 3, graph); + operation->setSize(((bNodeSocketValueFloat*)this->getInputSocket(2)->getbNodeSocket()->default_value)->value); + operation->setQuality(context->getQuality()); + graph->addOperation(operation); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + } +} diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.h b/source/blender/compositor/nodes/COM_BokehBlurNode.h new file mode 100644 index 00000000000..cb9d117c8ae --- /dev/null +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehBlurNode_h_ +#define _COM_BokehBlurNode_h_ + +#include "COM_Node.h" + +/** + * @brief BokehBlurNode + * @ingroup Node + */ + +class BokehBlurNode: public Node { +public: + BokehBlurNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_BokehImageNode.cpp b/source/blender/compositor/nodes/COM_BokehImageNode.cpp new file mode 100644 index 00000000000..511727636b5 --- /dev/null +++ b/source/blender/compositor/nodes/COM_BokehImageNode.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BokehImageNode.h" +#include "DNA_scene_types.h" +#include "COM_BokehImageOperation.h" +#include "COM_ExecutionSystem.h" + +BokehImageNode::BokehImageNode(bNode *editorNode): Node(editorNode) { +} + +void BokehImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + BokehImageOperation *operation = new BokehImageOperation(); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + operation->setData((NodeBokehImage*)this->getbNode()->storage); + addPreviewOperation(graph, operation->getOutputSocket(0), 9); +} diff --git a/source/blender/compositor/nodes/COM_BokehImageNode.h b/source/blender/compositor/nodes/COM_BokehImageNode.h new file mode 100644 index 00000000000..f3322077c47 --- /dev/null +++ b/source/blender/compositor/nodes/COM_BokehImageNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehImageNode_h_ +#define _COM_BokehImageNode_h_ + +#include "COM_Node.h" + +/** + * @brief BokehImageNode + * @ingroup Node + */ +class BokehImageNode: public Node { +public: + BokehImageNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_BoxMaskNode.cpp b/source/blender/compositor/nodes/COM_BoxMaskNode.cpp new file mode 100644 index 00000000000..7f904f1acc0 --- /dev/null +++ b/source/blender/compositor/nodes/COM_BoxMaskNode.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BoxMaskNode.h" +#include "DNA_scene_types.h" +#include "COM_BoxMaskOperation.h" +#include "COM_ExecutionSystem.h" + +BoxMaskNode::BoxMaskNode(bNode *editorNode): Node(editorNode) { +} + +void BoxMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + BoxMaskOperation *operation; + operation = new BoxMaskOperation(); + operation->setData((NodeBoxMask*)this->getbNode()->storage); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + operation->setMaskType(this->getbNode()->custom1); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_BoxMaskNode.h b/source/blender/compositor/nodes/COM_BoxMaskNode.h new file mode 100644 index 00000000000..c91730fdbb8 --- /dev/null +++ b/source/blender/compositor/nodes/COM_BoxMaskNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BoxMaskNode_h_ +#define _COM_BoxMaskNode_h_ + +#include "COM_Node.h" + +/** + * @brief BoxMaskNode + * @ingroup Node + */ +class BoxMaskNode: public Node { +public: + BoxMaskNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.cpp b/source/blender/compositor/nodes/COM_BrightnessNode.cpp new file mode 100644 index 00000000000..3ff5538f13e --- /dev/null +++ b/source/blender/compositor/nodes/COM_BrightnessNode.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BrightnessNode.h" +#include "DNA_scene_types.h" +#include "COM_BrightnessOperation.h" +#include "COM_ExecutionSystem.h" + +BrightnessNode::BrightnessNode(bNode *editorNode): Node(editorNode) { +} +/// @todo: add anti alias when not FSA +void BrightnessNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + BrightnessOperation *operation = new BrightnessOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2),true, 2, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.h b/source/blender/compositor/nodes/COM_BrightnessNode.h new file mode 100644 index 00000000000..8f1c9ccda86 --- /dev/null +++ b/source/blender/compositor/nodes/COM_BrightnessNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BrightnessNode_h_ +#define _COM_BrightnessNode_h_ + +#include "COM_Node.h" + +/** + * @brief BrightnessNode + * @ingroup Node + */ +class BrightnessNode: public Node { +public: + BrightnessNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp new file mode 100644 index 00000000000..bf3def05643 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ChannelMatteNode.h" +#include "BKE_node.h" +#include "COM_ChannelMatteOperation.h" +#include "COM_ConvertRGBToHSVOperation.h" +#include "COM_ConvertRGBToYCCOperation.h" +#include "COM_ConvertRGBToYUVOperation.h" +#include "COM_SetAlphaOperation.h" + +ChannelMatteNode::ChannelMatteNode(bNode *editorNode): Node(editorNode) +{} + +void ChannelMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + InputSocket *inputSocketImage = this->getInputSocket(0); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + OutputSocket *outputSocketMatte = this->getOutputSocket(1); + + NodeOperation *convert=NULL; + bNode* node = this->getbNode(); + + /* colorspace */ + switch(node->custom1) { + case CMP_NODE_CHANNEL_MATTE_CS_RGB: + break; + case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ + convert = new ConvertRGBToHSVOperation(); + break; + case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ + convert = new ConvertRGBToYUVOperation(); + break; + case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ + convert = new ConvertRGBToYCCOperation(); + ((ConvertRGBToYCCOperation *)convert)->setMode(0); /* BLI_YCC_ITU_BT601 */ + break; + default: + break; + } + + ChannelMatteOperation *operation = new ChannelMatteOperation(); + /* pass the ui properties to the operation */ + operation->setSettings((NodeChroma*)node->storage, node->custom2); + + SetAlphaOperation *operationAlpha = new SetAlphaOperation(); + + if (convert) { + inputSocketImage->relinkConnections(convert->getInputSocket(0), true, 0, graph); + addLink(graph, convert->getOutputSocket(), operation->getInputSocket(0)); + addLink(graph, convert->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); + graph->addOperation(convert); + } + else { + inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); + addLink(graph, operation->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); + } + + if (outputSocketMatte->isConnected()) { + outputSocketMatte->relinkConnections(operation->getOutputSocket(0)); + } + + graph->addOperation(operation); + graph->addOperation(operationAlpha); + + addLink(graph, operation->getOutputSocket(), operationAlpha->getInputSocket(1)); + addPreviewOperation(graph, operationAlpha->getOutputSocket(), 9); + + if (outputSocketImage->isConnected()) { + outputSocketImage->relinkConnections(operationAlpha->getOutputSocket()); + } +} diff --git a/source/blender/compositor/nodes/COM_ChannelMatteNode.h b/source/blender/compositor/nodes/COM_ChannelMatteNode.h new file mode 100644 index 00000000000..cb67ac604b2 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ChannelMatteNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef COM_ChannelMatteNODE_H +#define COM_ChannelMatteNODE_H + +#include "COM_Node.h" + +/** + * @brief ChannelMatteNode + * @ingroup Node + */ +class ChannelMatteNode : public Node +{ +public: + ChannelMatteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; + +#endif // COM_ChannelMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp b/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp new file mode 100644 index 00000000000..36d315c3a4b --- /dev/null +++ b/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ChromaMatteNode.h" +#include "BKE_node.h" +#include "COM_ChromaMatteOperation.h" +#include "COM_ConvertRGBToYCCOperation.h" +#include "COM_SetAlphaOperation.h" + +ChromaMatteNode::ChromaMatteNode(bNode *editorNode): Node(editorNode) +{} + +void ChromaMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + InputSocket *inputSocketImage = this->getInputSocket(0); + InputSocket *inputSocketKey = this->getInputSocket(1); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + OutputSocket *outputSocketMatte = this->getOutputSocket(1); + + ConvertRGBToYCCOperation *operationRGBToYCC_Image = new ConvertRGBToYCCOperation(); + ConvertRGBToYCCOperation *operationRGBToYCC_Key = new ConvertRGBToYCCOperation(); + operationRGBToYCC_Image->setMode(0); /* BLI_YCC_ITU_BT601 */ + operationRGBToYCC_Key->setMode(0); /* BLI_YCC_ITU_BT601 */ + + ChromaMatteOperation *operation = new ChromaMatteOperation(); + bNode* editorsnode = getbNode(); + operation->setSettings((NodeChroma*)editorsnode->storage); + + inputSocketImage->relinkConnections(operationRGBToYCC_Image->getInputSocket(0), true, 0, graph); + inputSocketKey->relinkConnections(operationRGBToYCC_Key->getInputSocket(0), true, 0, graph); + + addLink(graph, operationRGBToYCC_Image->getOutputSocket(), operation->getInputSocket(0)); + addLink(graph, operationRGBToYCC_Key->getOutputSocket(), operation->getInputSocket(1)); + + graph->addOperation(operationRGBToYCC_Image); + graph->addOperation(operationRGBToYCC_Key); + graph->addOperation(operation); + + if (outputSocketMatte->isConnected()) { + outputSocketMatte->relinkConnections(operation->getOutputSocket()); + } + + SetAlphaOperation *operationAlpha = new SetAlphaOperation(); + addLink(graph, operationRGBToYCC_Image->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), operationAlpha->getInputSocket(1)); + + graph->addOperation(operationAlpha); + addPreviewOperation(graph, operationAlpha->getOutputSocket(), 9); + + if (outputSocketImage->isConnected()) { + outputSocketImage->relinkConnections(operationAlpha->getOutputSocket()); + } +} diff --git a/source/blender/compositor/nodes/COM_ChromaMatteNode.h b/source/blender/compositor/nodes/COM_ChromaMatteNode.h new file mode 100644 index 00000000000..6008137b4a7 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ChromaMatteNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef COM_ChromaMatteNODE_H +#define COM_ChromaMatteNODE_H + +#include "COM_Node.h" + +/** + * @brief ChromaMatteNode + * @ingroup Node + */ +class ChromaMatteNode : public Node +{ +public: + ChromaMatteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; + +#endif // COM_ChromaMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp new file mode 100644 index 00000000000..73d10d4b1ca --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorBalanceNode.h" +#include "COM_ColorBalanceLGGOperation.h" +#include "COM_ColorBalanceASCCDLOperation.h" +#include "COM_ExecutionSystem.h" +#include "BKE_node.h" +#include "COM_MixBlendOperation.h" + +ColorBalanceNode::ColorBalanceNode(bNode* editorNode): Node(editorNode) +{ +} +void ColorBalanceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + InputSocket *inputImageSocket = this->getInputSocket(1); + OutputSocket *outputSocket = this->getOutputSocket(0); + + bNode* node = this->getbNode(); + NodeColorBalance *n= (NodeColorBalance *)node->storage; + NodeOperation*operation; + if (node->custom1 == 0) { + ColorBalanceLGGOperation* operationLGG = new ColorBalanceLGGOperation(); + { + int c; + + for (c = 0; c < 3; c++) { + n->lift_lgg[c] = 2.0f - n->lift[c]; + n->gamma_inv[c] = (n->gamma[c] != 0.0f) ? 1.0f/n->gamma[c] : 1000000.0f; + } + } + + operationLGG->setGain(n->gain); + operationLGG->setLift(n->lift_lgg); + operationLGG->setGammaInv(n->gamma_inv); + operation = operationLGG; + } else { + ColorBalanceASCCDLOperation *operationCDL = new ColorBalanceASCCDLOperation(); + operationCDL->setGain(n->gain); + operationCDL->setLift(n->lift); + operationCDL->setGamma(n->gamma); + operation = operationCDL; + } + + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputImageSocket->relinkConnections(operation->getInputSocket(1), true, 0, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.h b/source/blender/compositor/nodes/COM_ColorBalanceNode.h new file mode 100644 index 00000000000..6de431a764f --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef COM_ColorBalanceNODE_H +#define COM_ColorBalanceNODE_H + +#include "COM_Node.h" + +/** + * @brief ColorBalanceNode + * @ingroup Node + */ +class ColorBalanceNode : public Node +{ +public: + ColorBalanceNode(bNode* editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif // COM_ColorBalanceNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp new file mode 100644 index 00000000000..ac3e1285e75 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorCorrectionNode.h" +#include "DNA_scene_types.h" +#include "COM_ColorCorrectionOperation.h" +#include "COM_ExecutionSystem.h" + +ColorCorrectionNode::ColorCorrectionNode(bNode *editorNode): Node(editorNode) { +} + +void ColorCorrectionNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + ColorCorrectionOperation *operation = new ColorCorrectionOperation(); + bNode* editorNode = getbNode(); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + operation->setData((NodeColorCorrection*)editorNode->storage); + operation->setRedChannelEnabled((editorNode->custom1&1)>0); + operation->setGreenChannelEnabled((editorNode->custom1&2)>0); + operation->setBlueChannelEnabled((editorNode->custom1&4)>0); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.h b/source/blender/compositor/nodes/COM_ColorCorrectionNode.h new file mode 100644 index 00000000000..e5c35476931 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorCorrectionNode_h_ +#define _COM_ColorCorrectionNode_h_ + +#include "COM_Node.h" + +/** + * @brief ColorCorrectionNode + * @ingroup Node + */ +class ColorCorrectionNode: public Node { +public: + ColorCorrectionNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ColorCurveNode.cpp b/source/blender/compositor/nodes/COM_ColorCurveNode.cpp new file mode 100644 index 00000000000..55837a35b59 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorCurveNode.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorCurveNode.h" +#include "DNA_scene_types.h" +#include "COM_ColorCurveOperation.h" +#include "COM_ExecutionSystem.h" + +ColorCurveNode::ColorCurveNode(bNode *editorNode): Node(editorNode) { +} + +void ColorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + ColorCurveOperation *operation = new ColorCurveOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, graph); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, graph); + + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + operation->setCurveMapping((CurveMapping*)this->getbNode()->storage); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ColorCurveNode.h b/source/blender/compositor/nodes/COM_ColorCurveNode.h new file mode 100644 index 00000000000..aade20860c2 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorCurveNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorCurveNode_h_ +#define _COM_ColorCurveNode_h_ + +#include "COM_Node.h" + +/** + * @brief ColorCurveNode + * @ingroup Node + */ +class ColorCurveNode: public Node { +public: + ColorCurveNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ColorMatteNode.cpp b/source/blender/compositor/nodes/COM_ColorMatteNode.cpp new file mode 100644 index 00000000000..fa00c95f50b --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorMatteNode.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ColorMatteNode.h" +#include "BKE_node.h" +#include "COM_ColorMatteOperation.h" +#include "COM_ConvertRGBToHSVOperation.h" +#include "COM_SetAlphaOperation.h" + +ColorMatteNode::ColorMatteNode(bNode *editorNode): Node(editorNode) +{} + +void ColorMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + InputSocket *inputSocketImage = this->getInputSocket(0); + InputSocket *inputSocketKey = this->getInputSocket(1); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + OutputSocket *outputSocketMatte = this->getOutputSocket(1); + + ConvertRGBToHSVOperation *operationRGBToHSV_Image = new ConvertRGBToHSVOperation(); + ConvertRGBToHSVOperation *operationRGBToHSV_Key = new ConvertRGBToHSVOperation(); + + ColorMatteOperation *operation = new ColorMatteOperation(); + bNode* editorsnode = getbNode(); + operation->setSettings((NodeChroma*)editorsnode->storage); + + inputSocketImage->relinkConnections(operationRGBToHSV_Image->getInputSocket(0), true, 0, graph); + inputSocketKey->relinkConnections(operationRGBToHSV_Key->getInputSocket(0), true, 1, graph); + + addLink(graph, operationRGBToHSV_Image->getOutputSocket(), operation->getInputSocket(0)); + addLink(graph, operationRGBToHSV_Key->getOutputSocket(), operation->getInputSocket(1)); + + if (outputSocketMatte->isConnected()) { + outputSocketMatte->relinkConnections(operation->getOutputSocket(0)); + } + + graph->addOperation(operationRGBToHSV_Image); + graph->addOperation(operationRGBToHSV_Key); + graph->addOperation(operation); + + SetAlphaOperation *operationAlpha = new SetAlphaOperation(); + addLink(graph, operationRGBToHSV_Image->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), operationAlpha->getInputSocket(1)); + graph->addOperation(operationAlpha); + addPreviewOperation(graph, operationAlpha->getOutputSocket(), 9); + + if (outputSocketImage->isConnected()) { + outputSocketImage->relinkConnections(operationAlpha->getOutputSocket()); + } +} diff --git a/source/blender/compositor/nodes/COM_ColorMatteNode.h b/source/blender/compositor/nodes/COM_ColorMatteNode.h new file mode 100644 index 00000000000..af64616d054 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorMatteNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef COM_ColorMatteNODE_H +#define COM_ColorMatteNODE_H + +#include "COM_Node.h" + +/** + * @brief ColorMatteNode + * @ingroup Node + */ +class ColorMatteNode : public Node +{ +public: + ColorMatteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; + +#endif // COM_ColorMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorNode.cpp b/source/blender/compositor/nodes/COM_ColorNode.cpp new file mode 100644 index 00000000000..0eee305a7e6 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorNode.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorNode.h" +#include "DNA_scene_types.h" +#include "COM_SetColorOperation.h" +#include "COM_ExecutionSystem.h" + +ColorNode::ColorNode(bNode *editorNode): Node(editorNode) { +} + +void ColorNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + SetColorOperation *operation = new SetColorOperation(); + bNodeSocket* socket = this->getEditorOutputSocket(0); + bNodeSocketValueRGBA *dval = (bNodeSocketValueRGBA*)socket->default_value; + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + operation->setChannels(dval->value); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ColorNode.h b/source/blender/compositor/nodes/COM_ColorNode.h new file mode 100644 index 00000000000..6a9f3062676 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorNode_h_ +#define _COM_ColorNode_h_ + +#include "COM_Node.h" + +/** + * @brief ColorNode + * @ingroup Node + */ +class ColorNode: public Node { +public: + ColorNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ColorRampNode.cpp b/source/blender/compositor/nodes/COM_ColorRampNode.cpp new file mode 100644 index 00000000000..bd1b3b5a35e --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorRampNode.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorRampNode.h" +#include "COM_ExecutionSystem.h" +#include "BKE_node.h" +#include "COM_ColorRampOperation.h" +#include "COM_SeparateChannelOperation.h" +#include "DNA_texture_types.h" + +ColorRampNode::ColorRampNode(bNode* editorNode): Node(editorNode) +{} + +void ColorRampNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + OutputSocket *outputSocket = this->getOutputSocket(0); + OutputSocket *outputSocketAlpha = this->getOutputSocket(1); + bNode* editorNode = this->getbNode(); + + ColorRampOperation * operation = new ColorRampOperation(); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + if (outputSocketAlpha->isConnected()) { + SeparateChannelOperation *operation2 = new SeparateChannelOperation(); + outputSocketAlpha->relinkConnections(operation2->getOutputSocket()); + addLink(graph, operation->getOutputSocket(), operation2->getInputSocket(0)); + operation2->setChannel(3); + graph->addOperation(operation2); + } + operation->setColorBand((ColorBand*)editorNode->storage); + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ColorRampNode.h b/source/blender/compositor/nodes/COM_ColorRampNode.h new file mode 100644 index 00000000000..de0f2a5395e --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorRampNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef COM_ColorRampNODE_H +#define COM_ColorRampNODE_H + +#include "COM_Node.h" + +/** + * @brief ColorRampNode + * @ingroup Node + */ +class ColorRampNode : public Node +{ +public: + ColorRampNode(bNode* editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif // COM_ColorRampNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp new file mode 100644 index 00000000000..011a2cb12cc --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp @@ -0,0 +1,55 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorSpillNode.h" +#include "BKE_node.h" +#include "COM_ColorSpillOperation.h" + +ColorSpillNode::ColorSpillNode(bNode *editorNode): Node(editorNode) +{} + +void ColorSpillNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + InputSocket *inputSocketImage = this->getInputSocket(0); + InputSocket *inputSocketFac = this->getInputSocket(1); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + + bNode* editorsnode = getbNode(); + + + ColorSpillOperation *operation; + if (editorsnode->custom2 == 0) { + // Simple color spill + operation = new ColorSpillOperation(); + } else { + // Average color spill + operation = new ColorSpillAverageOperation(); + } + operation->setSettings((NodeColorspill*)editorsnode->storage); + operation->setSpillChannel(editorsnode->custom1-1); // Channel for spilling + + + inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocketFac->relinkConnections(operation->getInputSocket(1), true, 1, graph); + + outputSocketImage->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.h b/source/blender/compositor/nodes/COM_ColorSpillNode.h new file mode 100644 index 00000000000..ed0e33b0742 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorSpillNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef COM_ColorSpillNODE_H +#define COM_ColorSpillNODE_H + +#include "COM_Node.h" + +/** + * @brief ColorSpillNode + * @ingroup Node + */ +class ColorSpillNode : public Node +{ +public: + ColorSpillNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; + +#endif // COM_ColorSpillNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorToBWNode.cpp b/source/blender/compositor/nodes/COM_ColorToBWNode.cpp new file mode 100644 index 00000000000..a58c2e9fd19 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorToBWNode.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorToBWNode.h" + +#include "COM_ConvertColorToBWOperation.h" +#include "COM_ExecutionSystem.h" + +ColourToBWNode::ColourToBWNode(bNode *editorNode): Node(editorNode) { +} + +void ColourToBWNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *colourSocket = this->getInputSocket(0); + OutputSocket *valueSocket = this->getOutputSocket(0); + + ConvertColorToBWOperation *convertProg = new ConvertColorToBWOperation(); + colourSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); + valueSocket->relinkConnections(convertProg->getOutputSocket(0)); + graph->addOperation(convertProg); +} diff --git a/source/blender/compositor/nodes/COM_ColorToBWNode.h b/source/blender/compositor/nodes/COM_ColorToBWNode.h new file mode 100644 index 00000000000..e2badd1b104 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ColorToBWNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColourToBWNode_h +#define _COM_ColourToBWNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief ColourToBWNode + * @ingroup Node + */ +class ColourToBWNode : public Node { +public: + ColourToBWNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_CombineHSVANode.cpp b/source/blender/compositor/nodes/COM_CombineHSVANode.cpp new file mode 100644 index 00000000000..bd43f207fc7 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineHSVANode.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CombineHSVANode.h" + +#include "COM_CombineChannelsOperation.h" + +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "COM_ConvertHSVToRGBOperation.h" + +CombineHSVANode::CombineHSVANode(bNode *editorNode): CombineRGBANode(editorNode) { +} + +void CombineHSVANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + ConvertHSVToRGBOperation *operation = new ConvertHSVToRGBOperation(); + OutputSocket *outputSocket = this->getOutputSocket(0); + if (outputSocket->isConnected()) { + outputSocket->relinkConnections(operation->getOutputSocket()); + addLink(graph, outputSocket, operation->getInputSocket(0)); + } + graph->addOperation(operation); + CombineRGBANode::convertToOperations(graph, context); +} diff --git a/source/blender/compositor/nodes/COM_CombineHSVANode.h b/source/blender/compositor/nodes/COM_CombineHSVANode.h new file mode 100644 index 00000000000..fabd6f91f7e --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineHSVANode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CombineHSVANode_h +#define _COM_CombineHSVANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_CombineRGBANode.h" +/** + * @brief CombineHSVANode + * @ingroup Node + */ +class CombineHSVANode : public CombineRGBANode { +public: + CombineHSVANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp new file mode 100644 index 00000000000..8a1a34589a5 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CombineRGBANode.h" + +#include "COM_CombineChannelsOperation.h" + +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "DNA_material_types.h" // the ramp types + + +CombineRGBANode::CombineRGBANode(bNode *editorNode): Node(editorNode) { +} + + +void CombineRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputRSocket = this->getInputSocket(0); + InputSocket *inputGSocket = this->getInputSocket(1); + InputSocket *inputBSocket = this->getInputSocket(2); + InputSocket *inputASocket = this->getInputSocket(3); + OutputSocket *outputSocket = this->getOutputSocket(0); + + CombineChannelsOperation *operation = new CombineChannelsOperation(); + if (inputRSocket->isConnected()) { + operation->setResolutionInputSocketIndex(0); + } else if (inputGSocket->isConnected()) { + operation->setResolutionInputSocketIndex(1); + } else if (inputBSocket->isConnected()) { + operation->setResolutionInputSocketIndex(2); + } else { + operation->setResolutionInputSocketIndex(3); + } + inputRSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputGSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); + inputBSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + inputASocket->relinkConnections(operation->getInputSocket(3), true, 3, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_CombineRGBANode.h b/source/blender/compositor/nodes/COM_CombineRGBANode.h new file mode 100644 index 00000000000..182bfece6d3 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineRGBANode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CombineRGBANode_h +#define _COM_CombineRGBANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief CombineRGBANode + * @ingroup Node + */ +class CombineRGBANode : public Node { +public: + CombineRGBANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_CombineYCCANode.cpp b/source/blender/compositor/nodes/COM_CombineYCCANode.cpp new file mode 100644 index 00000000000..bf31daf5852 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineYCCANode.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_CombineYCCANode.h" +#include "COM_ConvertYCCToRGBOperation.h" + +CombineYCCANode::CombineYCCANode(bNode *editorNode): CombineRGBANode(editorNode) { +} + +void CombineYCCANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + ConvertYCCToRGBOperation *operation = new ConvertYCCToRGBOperation(); + OutputSocket *outputSocket = this->getOutputSocket(0); + + bNode *node = this->getbNode(); + operation->setMode(node->custom1); + + if (outputSocket->isConnected()) { + outputSocket->relinkConnections(operation->getOutputSocket()); + addLink(graph, outputSocket, operation->getInputSocket(0)); + } + + graph->addOperation(operation); + CombineRGBANode::convertToOperations(graph, context); +} diff --git a/source/blender/compositor/nodes/COM_CombineYCCANode.h b/source/blender/compositor/nodes/COM_CombineYCCANode.h new file mode 100644 index 00000000000..86e2d50e950 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineYCCANode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_CombineYCCANode_h +#define _COM_CombineYCCANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_CombineRGBANode.h" +/** + * @brief CombineYCCANode + * @ingroup Node + */ +class CombineYCCANode : public CombineRGBANode { +public: + CombineYCCANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_CombineYUVANode.cpp b/source/blender/compositor/nodes/COM_CombineYUVANode.cpp new file mode 100644 index 00000000000..3348eacc86f --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineYUVANode.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_CombineYUVANode.h" +#include "COM_ConvertYUVToRGBOperation.h" + +CombineYUVANode::CombineYUVANode(bNode *editorNode): CombineRGBANode(editorNode) { +} + +void CombineYUVANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + ConvertYUVToRGBOperation *operation = new ConvertYUVToRGBOperation(); + OutputSocket *outputSocket = this->getOutputSocket(0); + if (outputSocket->isConnected()) { + outputSocket->relinkConnections(operation->getOutputSocket()); + addLink(graph, outputSocket, operation->getInputSocket(0)); + } + graph->addOperation(operation); + CombineRGBANode::convertToOperations(graph, context); +} diff --git a/source/blender/compositor/nodes/COM_CombineYUVANode.h b/source/blender/compositor/nodes/COM_CombineYUVANode.h new file mode 100644 index 00000000000..7d2f9cddf7e --- /dev/null +++ b/source/blender/compositor/nodes/COM_CombineYUVANode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_CombineYUVANode_h +#define _COM_CombineYUVANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_CombineRGBANode.h" +/** + * @brief CombineYUVANode + * @ingroup Node + */ +class CombineYUVANode : public CombineRGBANode { +public: + CombineYUVANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_CompositorNode.cpp b/source/blender/compositor/nodes/COM_CompositorNode.cpp new file mode 100644 index 00000000000..95db41b322c --- /dev/null +++ b/source/blender/compositor/nodes/COM_CompositorNode.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CompositorNode.h" +#include "COM_CompositorOperation.h" +#include "COM_ExecutionSystem.h" + +CompositorNode::CompositorNode(bNode *editorNode): Node(editorNode) { +} + +void CompositorNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *imageSocket = this->getInputSocket(0); + InputSocket *alphaSocket = this->getInputSocket(1); + if (imageSocket->isConnected()) { + CompositorOperation *colourAlphaProg = new CompositorOperation(); + colourAlphaProg->setScene(context->getScene()); + colourAlphaProg->setbNodeTree(context->getbNodeTree()); + imageSocket->relinkConnections(colourAlphaProg->getInputSocket(0)); + alphaSocket->relinkConnections(colourAlphaProg->getInputSocket(1)); + graph->addOperation(colourAlphaProg); + addPreviewOperation(graph, colourAlphaProg->getInputSocket(0), 5); + } +} diff --git a/source/blender/compositor/nodes/COM_CompositorNode.h b/source/blender/compositor/nodes/COM_CompositorNode.h new file mode 100644 index 00000000000..e77d1d2f225 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CompositorNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CompositorNode_h +#define _COM_CompositorNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief CompositorNode + * @ingroup Node + */ +class CompositorNode : public Node { +public: + CompositorNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp new file mode 100644 index 00000000000..4e20b3a5d3a --- /dev/null +++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertAlphaNode.h" +#include "COM_ConvertPremulToKeyOperation.h" +#include "COM_ConvertKeyToPremulOperation.h" +#include "COM_ExecutionSystem.h" + +void ConvertAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + NodeOperation* operation = NULL; + bNode* node = this->getbNode(); + + /* value hardcoded in rna_nodetree.c */ + if (node->custom1 == 1){ + operation = new ConvertPremulToKeyOperation(); + } + else { + operation = new ConvertKeyToPremulOperation(); + } + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.h b/source/blender/compositor/nodes/COM_ConvertAlphaNode.h new file mode 100644 index 00000000000..04834a45c45 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertAlphaNode_h +#define _COM_ConvertAlphaNode_h + +#include "COM_Node.h" + +/** + * @brief ConvertAlphaNode + * @ingroup Node + */ +class ConvertAlphaNode: public Node { +public: + ConvertAlphaNode(bNode* editorNode) :Node(editorNode) {} + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_CropNode.cpp b/source/blender/compositor/nodes/COM_CropNode.cpp new file mode 100644 index 00000000000..fdbb1529c60 --- /dev/null +++ b/source/blender/compositor/nodes/COM_CropNode.cpp @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CropNode.h" +#include "COM_CropOperation.h" + + +CropNode::CropNode(bNode *editorNode) : Node(editorNode) { +} + +void CropNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context){ + bNode* node = getbNode(); + NodeTwoXYs *cropSettings = (NodeTwoXYs*)node->storage; + bool relative = (bool)node->custom2; + bool cropImage = (bool)node->custom1; + CropBaseOperation *operation; + if (cropImage){ + operation = new CropImageOperation(); + } else { + operation = new CropOperation(); + } + operation->setCropSettings(cropSettings); + operation->setRelative(relative); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_CropNode.h b/source/blender/compositor/nodes/COM_CropNode.h new file mode 100644 index 00000000000..a39bd47f22a --- /dev/null +++ b/source/blender/compositor/nodes/COM_CropNode.h @@ -0,0 +1,36 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CropNode_h_ +#define _COM_CropNode_h_ + +#include "COM_Node.h" + +class CropNode: public Node { +public: + CropNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif + + diff --git a/source/blender/compositor/nodes/COM_DefocusNode.cpp b/source/blender/compositor/nodes/COM_DefocusNode.cpp new file mode 100644 index 00000000000..7f5c9896bbe --- /dev/null +++ b/source/blender/compositor/nodes/COM_DefocusNode.cpp @@ -0,0 +1,110 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DefocusNode.h" +#include "DNA_scene_types.h" +#include "DNA_camera_types.h" +#include "DNA_object_types.h" +#include "DNA_node_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_ConvertDepthToRadiusOperation.h" +#include "COM_VariableSizeBokehBlurOperation.h" +#include "COM_BokehImageOperation.h" +#include "COM_MathBaseOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_GammaCorrectOperation.h" + +DefocusNode::DefocusNode(bNode *editorNode): Node(editorNode) { +} + +void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + bNode *node = this->getbNode(); + Scene *scene= (Scene*)node->id; + Object* camob = (scene)? scene->camera: NULL; + NodeDefocus *data = (NodeDefocus*)node->storage; + + NodeOperation* radiusOperation; + if (data->no_zbuf) { + MathMultiplyOperation *multiply = new MathMultiplyOperation(); + SetValueOperation *multiplier = new SetValueOperation(); + multiplier->setValue(data->scale); + SetValueOperation *maxRadius = new SetValueOperation(); + maxRadius->setValue(data->maxblur); + MathMinimumOperation *minimize = new MathMinimumOperation(); + this->getInputSocket(1)->relinkConnections(multiply->getInputSocket(0), true, 1, graph); + addLink(graph, multiplier->getOutputSocket(), multiply->getInputSocket(1)); + addLink(graph, maxRadius->getOutputSocket(), minimize->getInputSocket(1)); + addLink(graph, multiply->getOutputSocket(), minimize->getInputSocket(0)); + + graph->addOperation(multiply); + graph->addOperation(multiplier); + graph->addOperation(maxRadius); + graph->addOperation(minimize); + radiusOperation = minimize; + } else { + ConvertDepthToRadiusOperation *converter = new ConvertDepthToRadiusOperation(); + converter->setCameraObject(camob); + converter->setfStop(data->fstop); + converter->setMaxRadius(data->maxblur); + this->getInputSocket(1)->relinkConnections(converter->getInputSocket(0), true, 1, graph); + graph->addOperation(converter); + radiusOperation = converter; + } + + BokehImageOperation *bokeh = new BokehImageOperation(); + NodeBokehImage * bokehdata = new NodeBokehImage(); + bokehdata->angle = data->rotation; + bokehdata->rounding = 0.0f; + bokehdata->flaps = data->bktype; + if (data->bktype<3) { + bokehdata->flaps = 5; + bokehdata->rounding = 1.0f; + } + bokehdata->catadioptric = 0.0f; + bokehdata->lensshift = 0.0f; + + bokeh->setData(bokehdata); + bokeh->deleteDataOnFinish(); + graph->addOperation(bokeh); + + VariableSizeBokehBlurOperation *operation = new VariableSizeBokehBlurOperation(); + operation->setQuality(context->getQuality()); + operation->setMaxBlur(data->maxblur); + operation->setThreshold(data->bthresh); + addLink(graph, bokeh->getOutputSocket(), operation->getInputSocket(1)); + addLink(graph, radiusOperation->getOutputSocket(), operation->getInputSocket(2)); + if (data->gamco) { + GammaCorrectOperation * correct = new GammaCorrectOperation(); + GammaUncorrectOperation * inverse = new GammaUncorrectOperation(); + this->getInputSocket(0)->relinkConnections(correct->getInputSocket(0), 0, true, graph); + addLink(graph, correct->getOutputSocket(), operation->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), inverse->getInputSocket(0)); + this->getOutputSocket()->relinkConnections(inverse->getOutputSocket()); + graph->addOperation(correct); + graph->addOperation(inverse); + } else { + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, true, graph); + this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); + } + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_DefocusNode.h b/source/blender/compositor/nodes/COM_DefocusNode.h new file mode 100644 index 00000000000..3d2ff7eb4de --- /dev/null +++ b/source/blender/compositor/nodes/COM_DefocusNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DefocusNode_h_ +#define _COM_DefocusNode_h_ + +#include "COM_Node.h" + +/** + * @brief DefocusNode + * @ingroup Node + */ + +class DefocusNode: public Node { +public: + DefocusNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp b/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp new file mode 100644 index 00000000000..8327813cf05 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DifferenceMatteNode.h" +#include "BKE_node.h" +#include "COM_DifferenceMatteOperation.h" +#include "COM_SetAlphaOperation.h" + +DifferenceMatteNode::DifferenceMatteNode(bNode* editorNode): Node(editorNode) +{} + +void DifferenceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + InputSocket *inputSocket2 = this->getInputSocket(1); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + OutputSocket *outputSocketMatte = this->getOutputSocket(1); + bNode* editorNode = this->getbNode(); + + DifferenceMatteOperation * operationSet = new DifferenceMatteOperation(); + operationSet->setSettings((NodeChroma*)editorNode->storage); + inputSocket->relinkConnections(operationSet->getInputSocket(0), true, 0, graph); + inputSocket2->relinkConnections(operationSet->getInputSocket(1), true, 1, graph); + + outputSocketMatte->relinkConnections(operationSet->getOutputSocket(0)); + graph->addOperation(operationSet); + + SetAlphaOperation * operation = new SetAlphaOperation(); + addLink(graph, operationSet->getInputSocket(0)->getConnection()->getFromSocket(), operation->getInputSocket(0)); + addLink(graph, operationSet->getOutputSocket(), operation->getInputSocket(1)); + outputSocketImage->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); + addPreviewOperation(graph, operation->getOutputSocket(), 5); +} diff --git a/source/blender/compositor/nodes/COM_DifferenceMatteNode.h b/source/blender/compositor/nodes/COM_DifferenceMatteNode.h new file mode 100644 index 00000000000..2adce752f49 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DifferenceMatteNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef COM_DifferenceMatteNODE_H +#define COM_DifferenceMatteNODE_H + +#include "COM_Node.h" + +/** + * @brief DifferenceMatteNode + * @ingroup Node + */ +class DifferenceMatteNode : public Node +{ +public: + DifferenceMatteNode(bNode* editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif // COM_DifferenceMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp new file mode 100644 index 00000000000..185eb6475bf --- /dev/null +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DilateErodeNode.h" +#include "DNA_scene_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_DilateErodeOperation.h" +#include "COM_AntiAliasOperation.h" +#include "BLI_math.h" + +DilateErodeNode::DilateErodeNode(bNode *editorNode): Node(editorNode) { +} + +void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + bNode* editorNode = this->getbNode(); + DilateErodeOperation *operation = new DilateErodeOperation(); + operation->setDistance(editorNode->custom2); + operation->setInset(2.0f); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + + AntiAliasOperation * antiAlias = new AntiAliasOperation(); + addLink(graph, operation->getOutputSocket(), antiAlias->getInputSocket(0)); + this->getOutputSocket(0)->relinkConnections(antiAlias->getOutputSocket(0)); + graph->addOperation(operation); + graph->addOperation(antiAlias); +} diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.h b/source/blender/compositor/nodes/COM_DilateErodeNode.h new file mode 100644 index 00000000000..1ebf7e0b4c8 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DilateErodeNode_h_ +#define _COM_DilateErodeNode_h_ + +#include "COM_Node.h" + +/** + * @brief DilateErodeNode + * @ingroup Node + */ +class DilateErodeNode: public Node { +public: + DilateErodeNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp b/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp new file mode 100644 index 00000000000..ef3e4918048 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp @@ -0,0 +1,40 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DirectionalBlurNode.h" +#include "DNA_scene_types.h" +#include "DNA_node_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_DirectionalBlurOperation.h" + +DirectionalBlurNode::DirectionalBlurNode(bNode *editorNode): Node(editorNode) { +} + +void DirectionalBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + NodeDBlurData *data = (NodeDBlurData*)this->getbNode()->storage; + DirectionalBlurOperation *operation = new DirectionalBlurOperation(); + operation->setQuality(context->getQuality()); + operation->setData(data); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_DirectionalBlurNode.h b/source/blender/compositor/nodes/COM_DirectionalBlurNode.h new file mode 100644 index 00000000000..842e330d6d0 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DirectionalBlurNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DirectionalBlurNode_h_ +#define _COM_DirectionalBlurNode_h_ + +#include "COM_Node.h" + +/** + * @brief DirectionalBlurNode + * @ingroup Node + */ +class DirectionalBlurNode: public Node { +public: + DirectionalBlurNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_DisplaceNode.cpp b/source/blender/compositor/nodes/COM_DisplaceNode.cpp new file mode 100644 index 00000000000..ff5dd413468 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DisplaceNode.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_DisplaceNode.h" +#include "COM_DisplaceOperation.h" +#include "COM_DisplaceSimpleOperation.h" +#include "COM_ExecutionSystem.h" + +DisplaceNode::DisplaceNode(bNode *editorNode): Node(editorNode) { +} + +void DisplaceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + NodeOperation *operation; + if (context->getQuality() == COM_QUALITY_LOW) + operation = new DisplaceSimpleOperation(); + else + operation = new DisplaceOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, graph); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_DisplaceNode.h b/source/blender/compositor/nodes/COM_DisplaceNode.h new file mode 100644 index 00000000000..3451f05dd1f --- /dev/null +++ b/source/blender/compositor/nodes/COM_DisplaceNode.h @@ -0,0 +1,36 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_DisplaceNode_h +#define _COM_DisplaceNode_h + +#include "COM_Node.h" + +/** + * @brief DisplaceNode + * @ingroup Node + */ +class DisplaceNode : public Node { +public: + DisplaceNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp b/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp new file mode 100644 index 00000000000..c55ce803f97 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_DistanceMatteNode.h" +#include "BKE_node.h" +#include "COM_DistanceMatteOperation.h" +#include "COM_SetAlphaOperation.h" + +DistanceMatteNode::DistanceMatteNode(bNode *editorNode): Node(editorNode) +{} + +void DistanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + InputSocket *inputSocketImage = this->getInputSocket(0); + InputSocket *inputSocketKey = this->getInputSocket(1); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + OutputSocket *outputSocketMatte = this->getOutputSocket(1); + + DistanceMatteOperation *operation = new DistanceMatteOperation(); + bNode* editorsnode = getbNode(); + operation->setSettings((NodeChroma*)editorsnode->storage); + + inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocketKey->relinkConnections(operation->getInputSocket(1), true, 1, graph); + + if (outputSocketMatte->isConnected()) { + outputSocketMatte->relinkConnections(operation->getOutputSocket()); + } + + graph->addOperation(operation); + + SetAlphaOperation *operationAlpha = new SetAlphaOperation(); + addLink(graph, operation->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), operationAlpha->getInputSocket(1)); + + graph->addOperation(operationAlpha); + addPreviewOperation(graph, operationAlpha->getOutputSocket(), 9); + + if (outputSocketImage->isConnected()) { + outputSocketImage->relinkConnections(operationAlpha->getOutputSocket()); + } +} diff --git a/source/blender/compositor/nodes/COM_DistanceMatteNode.h b/source/blender/compositor/nodes/COM_DistanceMatteNode.h new file mode 100644 index 00000000000..740eb767a71 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DistanceMatteNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef COM_DistanceMatteNODE_H +#define COM_DistanceMatteNODE_H + +#include "COM_Node.h" + +/** + * @brief DistanceMatteNode + * @ingroup Node + */ +class DistanceMatteNode : public Node +{ +public: + DistanceMatteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; + +#endif // COM_DistanceMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp new file mode 100644 index 00000000000..f1ec4ab9b23 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DoubleEdgeMaskNode.h" +#include "COM_DoubleEdgeMaskOperation.h" +#include "DNA_scene_types.h" +#include "COM_ExecutionSystem.h" + +DoubleEdgeMaskNode::DoubleEdgeMaskNode(bNode *editorNode): Node(editorNode) { +} + +void DoubleEdgeMaskNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + DoubleEdgeMaskOperation *operation; + bNode* bnode = this->getbNode(); + + operation = new DoubleEdgeMaskOperation(); + operation->setAdjecentOnly(bnode->custom1); + operation->setKeepInside(bnode->custom2); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + system->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h new file mode 100644 index 00000000000..26d553a1422 --- /dev/null +++ b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DoubleEdgeMaskNode_h_ +#define _COM_DoubleEdgeMaskNode_h_ + +#include "COM_Node.h" + +/** + * @brief DoubleEdgeMaskNode + * @ingroup Node + */ +class DoubleEdgeMaskNode: public Node { +public: + DoubleEdgeMaskNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp b/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp new file mode 100644 index 00000000000..89996f0e590 --- /dev/null +++ b/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_EllipseMaskNode.h" +#include "DNA_scene_types.h" +#include "COM_EllipseMaskOperation.h" +#include "COM_ExecutionSystem.h" + +EllipseMaskNode::EllipseMaskNode(bNode *editorNode): Node(editorNode) { +} + +void EllipseMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + EllipseMaskOperation *operation; + operation = new EllipseMaskOperation(); + operation->setData((NodeEllipseMask*)this->getbNode()->storage); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + operation->setMaskType(this->getbNode()->custom1); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_EllipseMaskNode.h b/source/blender/compositor/nodes/COM_EllipseMaskNode.h new file mode 100644 index 00000000000..4fecf6946cc --- /dev/null +++ b/source/blender/compositor/nodes/COM_EllipseMaskNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_EllipseMaskNode_h_ +#define _COM_EllipseMaskNode_h_ + +#include "COM_Node.h" + +/** + * @brief EllipseMaskNode + * @ingroup Node + */ +class EllipseMaskNode: public Node { +public: + EllipseMaskNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_FilterNode.cpp b/source/blender/compositor/nodes/COM_FilterNode.cpp new file mode 100644 index 00000000000..ce78e451f30 --- /dev/null +++ b/source/blender/compositor/nodes/COM_FilterNode.cpp @@ -0,0 +1,81 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_FilterNode.h" +#include "COM_ConvolutionFilterOperation.h" +#include "COM_ConvolutionEdgeFilterOperation.h" +#include "COM_ExecutionSystem.h" +#include "BKE_node.h" +#include "COM_MixBlendOperation.h" + +FilterNode::FilterNode(bNode* editorNode): Node(editorNode) +{ +} + +void FilterNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + InputSocket *inputImageSocket = this->getInputSocket(1); + OutputSocket *outputSocket = this->getOutputSocket(0); + ConvolutionFilterOperation *operation = NULL; + + switch(this->getbNode()->custom1) { + case CMP_FILT_SOFT: + operation = new ConvolutionFilterOperation(); + operation->set3x3Filter(1/16.0f, 2/16.0f, 1/16.0f, 2/16.0f, 4/16.0f, 2/16.0f, 1/16.0f, 2/16.0f, 1/16.0f); + break; + case CMP_FILT_SHARP: + operation = new ConvolutionFilterOperation(); + operation->set3x3Filter(-1,-1,-1,-1,9,-1,-1,-1,-1); + break; + case CMP_FILT_LAPLACE: + operation = new ConvolutionFilterOperation(); + operation->set3x3Filter(-1/8.0f, -1/8.0f, -1/8.0f, -1/8.0f, 1.0f, -1/8.0f, -1/8.0f, -1/8.0f, -1/8.0f); + break; + case CMP_FILT_SOBEL: + operation = new ConvolutionEdgeFilterOperation(); + operation->set3x3Filter(1,2,1,0,0,0,-1,-2,-1); + break; + case CMP_FILT_PREWITT: + operation = new ConvolutionEdgeFilterOperation(); + operation->set3x3Filter(1,1,1,0,0,0,-1,-1,-1); + break; + case CMP_FILT_KIRSCH: + operation = new ConvolutionEdgeFilterOperation(); + operation->set3x3Filter(5,5,5,-3,-3,-3,-2,-2,-2); + break; + case CMP_FILT_SHADOW: + operation = new ConvolutionFilterOperation(); + operation->set3x3Filter(1,2,1,0,1,0,-1,-2,-1); + break; + default: + operation = new ConvolutionFilterOperation(); + operation->set3x3Filter(0,0,0,0,1,0,0,0,0); + break; + } + + inputImageSocket->relinkConnections(operation->getInputSocket(0), true, 1, graph); + inputSocket->relinkConnections(operation->getInputSocket(1), true, 0, graph); + outputSocket->relinkConnections(operation->getOutputSocket()); + addPreviewOperation(graph, operation->getOutputSocket(0), 5); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_FilterNode.h b/source/blender/compositor/nodes/COM_FilterNode.h new file mode 100644 index 00000000000..c77846ef2fe --- /dev/null +++ b/source/blender/compositor/nodes/COM_FilterNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef COM_FILTERNODE_H +#define COM_FILTERNODE_H + +#include "COM_Node.h" + +/** + * @brief FilterNode + * @ingroup Node + */ +class FilterNode : public Node +{ +public: + FilterNode(bNode* editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif // COM_FILTERNODE_H diff --git a/source/blender/compositor/nodes/COM_FlipNode.cpp b/source/blender/compositor/nodes/COM_FlipNode.cpp new file mode 100644 index 00000000000..7fbb21478ec --- /dev/null +++ b/source/blender/compositor/nodes/COM_FlipNode.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_FlipNode.h" + +#include "COM_FlipOperation.h" +#include "COM_ExecutionSystem.h" + +FlipNode::FlipNode(bNode *editorNode) : Node(editorNode) { +} + +void FlipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + OutputSocket *outputSocket = this->getOutputSocket(0); + FlipOperation *operation = new FlipOperation(); + switch (this->getbNode()->custom1) { + case 0: /// @TODO: I didn't find any constants in the old implementation, should I introduce them. + operation->setFlipX(true); + operation->setFlipY(false); + break; + case 1: + operation->setFlipX(false); + operation->setFlipY(true); + break; + case 2: + operation->setFlipX(true); + operation->setFlipY(true); + break; + } + + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_FlipNode.h b/source/blender/compositor/nodes/COM_FlipNode.h new file mode 100644 index 00000000000..593fed452af --- /dev/null +++ b/source/blender/compositor/nodes/COM_FlipNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_FlipNode_h_ +#define _COM_FlipNode_h_ + +#include "COM_Node.h" + +/** + * @brief FlipNode + * @ingroup Node + */ +class FlipNode: public Node { +public: + FlipNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_GammaNode.cpp b/source/blender/compositor/nodes/COM_GammaNode.cpp new file mode 100644 index 00000000000..e61f9245f40 --- /dev/null +++ b/source/blender/compositor/nodes/COM_GammaNode.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GammaNode.h" +#include "DNA_scene_types.h" +#include "COM_GammaOperation.h" +#include "COM_ExecutionSystem.h" + +GammaNode::GammaNode(bNode *editorNode): Node(editorNode) { +} + +void GammaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + GammaOperation *operation = new GammaOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_GammaNode.h b/source/blender/compositor/nodes/COM_GammaNode.h new file mode 100644 index 00000000000..56f2374467d --- /dev/null +++ b/source/blender/compositor/nodes/COM_GammaNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GammaNode_h_ +#define _COM_GammaNode_h_ + +#include "COM_Node.h" + +/** + * @brief GammaNode + * @ingroup Node + */ +class GammaNode: public Node { +public: + GammaNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_GlareNode.cpp b/source/blender/compositor/nodes/COM_GlareNode.cpp new file mode 100644 index 00000000000..c0fcad1a5b3 --- /dev/null +++ b/source/blender/compositor/nodes/COM_GlareNode.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GlareNode.h" +#include "DNA_node_types.h" +#include "COM_FogGlowImageOperation.h" +#include "COM_BokehBlurOperation.h" +#include "COM_GlareThresholdOperation.h" +#include "COM_GlareSimpleStarOperation.h" +#include "COM_GlareStreaksOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_MixBlendOperation.h" + +GlareNode::GlareNode(bNode *editorNode): Node(editorNode) { +} + +void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + bNode* node = this->getbNode(); + NodeGlare* glare = (NodeGlare*)node->storage; + + switch (glare->type) { + + default: + case 2: // streaks + { + GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation(); + GlareStreaksOperation * glareoperation = new GlareStreaksOperation(); + SetValueOperation * mixvalueoperation = new SetValueOperation(); + MixBlendOperation * mixoperation = new MixBlendOperation(); + + this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); + addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0)); + addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); + addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2)); + addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1)); + this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket()); + + thresholdOperation->setThreshold(glare->threshold); + glareoperation->setGlareSettings(glare); + mixvalueoperation->setValue(0.5f+glare->mix*0.5f); + mixoperation->setResolutionInputSocketIndex(1); + + system->addOperation(glareoperation); + system->addOperation(thresholdOperation); + system->addOperation(mixvalueoperation); + system->addOperation(mixoperation); + } + break; + case 1: // fog glow + { + GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation(); + FogGlowImageOperation * kerneloperation = new FogGlowImageOperation(); + BokehBlurOperation * bluroperation = new BokehBlurOperation(); + SetValueOperation * valueoperation = new SetValueOperation(); + SetValueOperation * mixvalueoperation = new SetValueOperation(); + MixBlendOperation * mixoperation = new MixBlendOperation(); + mixoperation->setResolutionInputSocketIndex(1); + this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); + addLink(system, thresholdOperation->getOutputSocket(), bluroperation->getInputSocket(0)); + addLink(system, kerneloperation->getOutputSocket(), bluroperation->getInputSocket(1)); + addLink(system, valueoperation->getOutputSocket(), bluroperation->getInputSocket(2)); + addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); + addLink(system, bluroperation->getOutputSocket(), mixoperation->getInputSocket(2)); + addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1)); + + thresholdOperation->setThreshold(glare->threshold); + bluroperation->setSize(0.003f*glare->size); + bluroperation->setQuality(context->getQuality()); + valueoperation->setValue(1.0f); + mixvalueoperation->setValue(0.5f+glare->mix*0.5f); + this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket()); + + system->addOperation(bluroperation); + system->addOperation(kerneloperation); + system->addOperation(thresholdOperation); + system->addOperation(mixvalueoperation); + system->addOperation(valueoperation); + system->addOperation(mixoperation); + } + break; + + case 0: // simple star + { + GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation(); + GlareSimpleStarOperation * glareoperation = new GlareSimpleStarOperation(); + SetValueOperation * mixvalueoperation = new SetValueOperation(); + MixBlendOperation * mixoperation = new MixBlendOperation(); + + this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); + addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0)); + addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); + addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2)); + addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1)); + this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket()); + + thresholdOperation->setThreshold(glare->threshold); + glareoperation->setGlareSettings(glare); + mixvalueoperation->setValue(0.5f+glare->mix*0.5f); + mixoperation->setResolutionInputSocketIndex(1); + + + system->addOperation(glareoperation); + system->addOperation(thresholdOperation); + system->addOperation(mixvalueoperation); + system->addOperation(mixoperation); + } + break; + } +} diff --git a/source/blender/compositor/nodes/COM_GlareNode.h b/source/blender/compositor/nodes/COM_GlareNode.h new file mode 100644 index 00000000000..b3e965fa72d --- /dev/null +++ b/source/blender/compositor/nodes/COM_GlareNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GlareNode_h_ +#define _COM_GlareNode_h_ + +#include "COM_Node.h" + +/** + * @brief GlareNode + * @ingroup Node + */ +class GlareNode: public Node { +public: + GlareNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_GroupNode.cpp b/source/blender/compositor/nodes/COM_GroupNode.cpp new file mode 100644 index 00000000000..dcb8691524a --- /dev/null +++ b/source/blender/compositor/nodes/COM_GroupNode.cpp @@ -0,0 +1,69 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GroupNode.h" +#include "COM_SocketProxyNode.h" +#include "COM_ExecutionSystemHelper.h" + +GroupNode::GroupNode(bNode *editorNode): Node(editorNode) { +} + +void GroupNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +} + +void GroupNode::ungroup(ExecutionSystem &system) { + vector &inputsockets = this->getInputSockets(); + vector &outputsockets = this->getOutputSockets(); + unsigned int index; + + /* get the node list size _before_ adding proxy nodes, so they are available for linking */ + int nodes_start = system.getNodes().size(); + + for (index = 0 ; index < inputsockets.size();index ++) { + InputSocket * inputSocket = inputsockets[index]; + bNodeSocket *editorInput = inputSocket->getbNodeSocket(); + if (editorInput->groupsock) { + if (inputSocket->isConnected()) { + SocketProxyNode * proxy = new SocketProxyNode(this->getbNode(), editorInput, editorInput->groupsock); + inputSocket->relinkConnections(proxy->getInputSocket(0), true, index, &system); + ExecutionSystemHelper::addNode(system.getNodes(), proxy); + } else { + OutputSocketProxyNode * proxy = new OutputSocketProxyNode(this->getbNode(), editorInput, editorInput->groupsock); + inputSocket->relinkConnections(proxy->getInputSocket(0), true, index, &system); + ExecutionSystemHelper::addNode(system.getNodes(), proxy); + } + } + } + + for (index = 0 ; index < outputsockets.size();index ++) { + OutputSocket * outputSocket = outputsockets[index]; + bNodeSocket *editorOutput = outputSocket->getbNodeSocket(); + if (outputSocket->isConnected() && editorOutput->groupsock) { + SocketProxyNode * proxy = new SocketProxyNode(this->getbNode(), editorOutput->groupsock, editorOutput); + outputSocket->relinkConnections(proxy->getOutputSocket(0)); + ExecutionSystemHelper::addNode(system.getNodes(), proxy); + } + } + + bNodeTree* subtree = (bNodeTree*)this->getbNode()->id; + ExecutionSystemHelper::addbNodeTree(system, nodes_start, subtree); +} diff --git a/source/blender/compositor/nodes/COM_GroupNode.h b/source/blender/compositor/nodes/COM_GroupNode.h new file mode 100644 index 00000000000..a3a46ad2c33 --- /dev/null +++ b/source/blender/compositor/nodes/COM_GroupNode.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GroupNode_h_ +#define _COM_GroupNode_h_ + +#include "COM_Node.h" +#include "COM_ExecutionSystem.h" + +/** + * @brief Represents a group node + * @ingroup Node + */ +class GroupNode: public Node { +public: + GroupNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + + /** + * @brief check if this node a group node. + * @returns true + */ + bool isGroupNode() const { return true; } + + /** + * @brief ungroup this group node. + * during ungroup the subtree (internal nodes and links) of the group node + * are added to the ExecutionSystem. + * + * Between the main tree and the subtree proxy nodes will be added + * to translate between InputSocket and OutputSocket + * + * @param system the ExecutionSystem where to add the subtree + */ + void ungroup(ExecutionSystem &system); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp new file mode 100644 index 00000000000..88ba24498bb --- /dev/null +++ b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp @@ -0,0 +1,69 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_HueSaturationValueCorrectNode.h" + +#include "COM_ConvertColourToValueProg.h" +#include "COM_ExecutionSystem.h" +#include "COM_ConvertRGBToHSVOperation.h" +#include "COM_ConvertHSVToRGBOperation.h" +#include "COM_MixBlendOperation.h" +#include "COM_SetColorOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_ChangeHSVOperation.h" +#include "DNA_node_types.h" +#include "COM_HueSaturationValueCorrectOperation.h" + +HueSaturationValueCorrectNode::HueSaturationValueCorrectNode(bNode *editorNode): Node(editorNode) { +} + +void HueSaturationValueCorrectNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *valueSocket = this->getInputSocket(0); + InputSocket *colourSocket = this->getInputSocket(1); + OutputSocket *outputSocket = this->getOutputSocket(0); + bNode* editorsnode = getbNode(); + CurveMapping *storage = (CurveMapping*)editorsnode->storage; + + if (colourSocket->isConnected() && outputSocket->isConnected()) { + ConvertRGBToHSVOperation * rgbToHSV = new ConvertRGBToHSVOperation(); + ConvertHSVToRGBOperation * hsvToRGB = new ConvertHSVToRGBOperation(); + HueSaturationValueCorrectOperation *changeHSV = new HueSaturationValueCorrectOperation(); + MixBlendOperation * blend = new MixBlendOperation(); + + colourSocket->relinkConnections(rgbToHSV->getInputSocket(0), true, 0, graph); + addLink(graph, rgbToHSV->getOutputSocket(), changeHSV->getInputSocket(0)); + addLink(graph, changeHSV->getOutputSocket(), hsvToRGB->getInputSocket(0)); + addLink(graph, hsvToRGB->getOutputSocket(), blend->getInputSocket(2)); + addLink(graph, rgbToHSV->getInputSocket(0)->getConnection()->getFromSocket(), blend->getInputSocket(1)); + valueSocket->relinkConnections(blend->getInputSocket(0), true, 0, graph); + outputSocket->relinkConnections(blend->getOutputSocket()); + + changeHSV->setCurveMapping(storage); + + blend->setResolutionInputSocketIndex(1); + + graph->addOperation(rgbToHSV); + graph->addOperation(hsvToRGB); + graph->addOperation(changeHSV); + graph->addOperation(blend); + } +} diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h new file mode 100644 index 00000000000..d69990f712c --- /dev/null +++ b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_HueSaturationValueCorrectNode_h +#define _COM_HueSaturationValueCorrectNode_h + +#include "COM_Node.h" + +/** + * @brief HueSaturationValueCorrectNode + * @ingroup Node + */ +class HueSaturationValueCorrectNode : public Node { +public: + HueSaturationValueCorrectNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp b/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp new file mode 100644 index 00000000000..b4b9b55cf8b --- /dev/null +++ b/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_HueSaturationValueNode.h" + +#include "COM_ConvertColourToValueProg.h" +#include "COM_ExecutionSystem.h" +#include "COM_ConvertRGBToHSVOperation.h" +#include "COM_ConvertHSVToRGBOperation.h" +#include "COM_MixBlendOperation.h" +#include "COM_SetColorOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_ChangeHSVOperation.h" +#include "DNA_node_types.h" + +HueSaturationValueNode::HueSaturationValueNode(bNode *editorNode): Node(editorNode) { +} + +void HueSaturationValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *valueSocket = this->getInputSocket(0); + InputSocket *colourSocket = this->getInputSocket(1); + OutputSocket *outputSocket = this->getOutputSocket(0); + bNode* editorsnode = getbNode(); + NodeHueSat *storage = (NodeHueSat*)editorsnode->storage; + + ConvertRGBToHSVOperation * rgbToHSV = new ConvertRGBToHSVOperation(); + ConvertHSVToRGBOperation * hsvToRGB = new ConvertHSVToRGBOperation(); + ChangeHSVOperation *changeHSV = new ChangeHSVOperation(); + MixBlendOperation * blend = new MixBlendOperation(); + + colourSocket->relinkConnections(rgbToHSV->getInputSocket(0), true, 0, graph); + addLink(graph, rgbToHSV->getOutputSocket(), changeHSV->getInputSocket(0)); + addLink(graph, changeHSV->getOutputSocket(), hsvToRGB->getInputSocket(0)); + addLink(graph, hsvToRGB->getOutputSocket(), blend->getInputSocket(2)); + addLink(graph, rgbToHSV->getInputSocket(0)->getConnection()->getFromSocket(), blend->getInputSocket(1)); + valueSocket->relinkConnections(blend->getInputSocket(0), true, 0, graph); + outputSocket->relinkConnections(blend->getOutputSocket()); + + changeHSV->setHue(storage->hue); + changeHSV->setSaturation(storage->sat); + changeHSV->setValue(storage->val); + + blend->setResolutionInputSocketIndex(1); + + graph->addOperation(rgbToHSV); + graph->addOperation(hsvToRGB); + graph->addOperation(changeHSV); + graph->addOperation(blend); +} diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueNode.h b/source/blender/compositor/nodes/COM_HueSaturationValueNode.h new file mode 100644 index 00000000000..4fa1a4f547c --- /dev/null +++ b/source/blender/compositor/nodes/COM_HueSaturationValueNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_HueSaturationValueNode_h +#define _COM_HueSaturationValueNode_h + +#include "COM_Node.h" + +/** + * @brief HueSaturationValueNode + * @ingroup Node + */ +class HueSaturationValueNode : public Node { +public: + HueSaturationValueNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.cpp b/source/blender/compositor/nodes/COM_IDMaskNode.cpp new file mode 100644 index 00000000000..440468afd46 --- /dev/null +++ b/source/blender/compositor/nodes/COM_IDMaskNode.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_IDMaskNode.h" +#include "DNA_scene_types.h" +#include "COM_IDMaskOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_AntiAliasOperation.h" + +IDMaskNode::IDMaskNode(bNode *editorNode): Node(editorNode) { +} +void IDMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + bNode* bnode = this->getbNode(); + IDMaskOperation *operation; + operation = new IDMaskOperation(); + operation->setObjectIndex(bnode->custom1); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + if (bnode->custom2==0 || context->getScene()->r.scemode & R_FULL_SAMPLE) { + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + } else { + AntiAliasOperation * antiAliasOperation = new AntiAliasOperation(); + addLink(graph, operation->getOutputSocket(), antiAliasOperation->getInputSocket(0)); + this->getOutputSocket(0)->relinkConnections(antiAliasOperation->getOutputSocket(0)); + graph->addOperation(antiAliasOperation); + } + graph->addOperation(operation); + +} diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.h b/source/blender/compositor/nodes/COM_IDMaskNode.h new file mode 100644 index 00000000000..5559044df4e --- /dev/null +++ b/source/blender/compositor/nodes/COM_IDMaskNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_IDMaskNode_h_ +#define _COM_IDMaskNode_h_ + +#include "COM_Node.h" + +/** + * @brief IDMaskNode + * @ingroup Node + */ +class IDMaskNode: public Node { +public: + IDMaskNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp new file mode 100644 index 00000000000..20e6069b60a --- /dev/null +++ b/source/blender/compositor/nodes/COM_ImageNode.cpp @@ -0,0 +1,150 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#include "COM_ImageNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_ImageOperation.h" +#include "COM_MultilayerImageOperation.h" +#include "BKE_node.h" +#include "BLI_utildefines.h" + +ImageNode::ImageNode(bNode *editorNode): Node(editorNode) { +} +NodeOperation* ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer* rl, Image* image, ImageUser* user, int framenumber, int outputsocketIndex, int pass, DataType datatype) { + OutputSocket *outputSocket = this->getOutputSocket(outputsocketIndex); + MultilayerBaseOperation * operation = NULL; + switch (datatype) { + case COM_DT_VALUE: + operation = new MultilayerValueOperation(pass); + break; + case COM_DT_VECTOR: + operation = new MultilayerVectorOperation(pass); + break; + case COM_DT_COLOR: + operation = new MultilayerColorOperation(pass); + break; + default: + break; + } + operation->setImage(image); + operation->setRenderLayer(rl); + operation->setImageUser(user); + operation->setFramenumber(framenumber); + outputSocket->relinkConnections(operation->getOutputSocket()); + system->addOperation(operation); + return operation; +} + +void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + /// Image output + OutputSocket *outputImage = this->getOutputSocket(0); + bNode *editorNode = this->getbNode(); + Image *image = (Image*)editorNode->id; + ImageUser *imageuser = (ImageUser*)editorNode->storage; + int framenumber = context->getFramenumber(); + int numberOfOutputs = this->getNumberOfOutputSockets(); + + /* force a load, we assume iuser index will be set OK anyway */ + if(image && image->type==IMA_TYPE_MULTILAYER) { + BKE_image_get_ibuf(image, imageuser); + if(image->rr) { + OutputSocket * socket; + int index; + for (index = 0 ; index < numberOfOutputs ; index ++) { + socket = this->getOutputSocket(index); + if (socket->isConnected() || index == 0) { + bNodeSocket *bnodeSocket = socket->getbNodeSocket(); + NodeImageLayer *storage = (NodeImageLayer*)bnodeSocket->storage; + int passindex = storage->pass_index; + int layerindex = storage->layer_index; + RenderLayer *rl= (RenderLayer*)BLI_findlink(&image->rr->layers, layerindex); + if (rl) { + + RenderPass *rpass = (RenderPass *)BLI_findlink(&rl->passes, passindex); + if (rpass) { + NodeOperation * operation = NULL; + imageuser->pass = passindex; + imageuser->layer = layerindex; + switch (rpass->channels) { + case 1: + operation = doMultilayerCheck(graph, rl, image, imageuser, framenumber, index, passindex, COM_DT_VALUE); + break; + /* using image operations for both 3 and 4 channels (RGB and RGBA respectively) */ + /* XXX any way to detect actual vector images? */ + case 3: + operation = doMultilayerCheck(graph, rl, image, imageuser, framenumber, index, passindex, COM_DT_VECTOR); + break; + case 4: + operation = doMultilayerCheck(graph, rl, image, imageuser, framenumber, index, passindex, COM_DT_COLOR); + break; + + default: + /* XXX add a dummy operation? */ + break; + } + if (index == 0 && operation) { + addPreviewOperation(graph, operation->getOutputSocket(), 9); + } + } + } + } + } + } + } else { + if (numberOfOutputs > 0) { + ImageOperation *operation = new ImageOperation(); + if (outputImage->isConnected()) { + outputImage->relinkConnections(operation->getOutputSocket()); + } + operation->setImage(image); + operation->setImageUser(imageuser); + operation->setFramenumber(framenumber); + graph->addOperation(operation); + addPreviewOperation(graph, operation->getOutputSocket(), 9); + } + + if (numberOfOutputs > 1) { + OutputSocket *alphaImage = this->getOutputSocket(1); + if (alphaImage->isConnected()) { + ImageAlphaOperation *alphaOperation = new ImageAlphaOperation(); + alphaOperation->setImage(image); + alphaOperation->setImageUser(imageuser); + alphaOperation->setFramenumber(framenumber); + alphaImage->relinkConnections(alphaOperation->getOutputSocket()); + graph->addOperation(alphaOperation); + } + } + if (numberOfOutputs > 2) { + OutputSocket *depthImage = this->getOutputSocket(2); + if (depthImage->isConnected()) { + ImageDepthOperation *depthOperation = new ImageDepthOperation(); + depthOperation->setImage(image); + depthOperation->setImageUser(imageuser); + depthOperation->setFramenumber(framenumber); + depthImage->relinkConnections(depthOperation->getOutputSocket()); + graph->addOperation(depthOperation); + } + } + } +} + diff --git a/source/blender/compositor/nodes/COM_ImageNode.h b/source/blender/compositor/nodes/COM_ImageNode.h new file mode 100644 index 00000000000..cfbfbd119f9 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ImageNode.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#include "COM_defines.h" +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "DNA_image_types.h" +extern "C" { + #include "RE_engine.h" +} + +/** + * @brief ImageNode + * @ingroup Node + */ +class ImageNode : public Node { + +private: + NodeOperation* doMultilayerCheck(ExecutionSystem *system, RenderLayer* rl, Image* image, ImageUser* user, int framenumber, int outputsocketIndex, int pass, DataType datatype); +public: + ImageNode(bNode* editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); + +}; diff --git a/source/blender/compositor/nodes/COM_InvertNode.cpp b/source/blender/compositor/nodes/COM_InvertNode.cpp new file mode 100644 index 00000000000..2c47b467537 --- /dev/null +++ b/source/blender/compositor/nodes/COM_InvertNode.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_InvertNode.h" +#include "DNA_scene_types.h" +#include "COM_InvertOperation.h" +#include "COM_ExecutionSystem.h" +#include "BKE_node.h" + +InvertNode::InvertNode(bNode *editorNode): Node(editorNode) { +} + +void InvertNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InvertOperation *operation = new InvertOperation(); + bNode* node = this->getbNode(); + operation->setColor(node->custom1 & CMP_CHAN_RGB); + operation->setAlpha(node->custom1 & CMP_CHAN_A); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_InvertNode.h b/source/blender/compositor/nodes/COM_InvertNode.h new file mode 100644 index 00000000000..ec70be3ba31 --- /dev/null +++ b/source/blender/compositor/nodes/COM_InvertNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_InvertNode_h_ +#define _COM_InvertNode_h_ + +#include "COM_Node.h" + +/** + * @brief InvertNode + * @ingroup Node + */ +class InvertNode: public Node { +public: + InvertNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp new file mode 100644 index 00000000000..edaa0a9009e --- /dev/null +++ b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_LensDistortionNode.h" +#include "DNA_scene_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_ProjectorLensDistortionOperation.h" +#include "COM_ScreenLensDistortionOperation.h" + +LensDistortionNode::LensDistortionNode(bNode *editorNode): Node(editorNode) { +} + +void LensDistortionNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + bNode* editorNode = this->getbNode(); + NodeLensDist * data = (NodeLensDist*)editorNode->storage; + if (data->proj) { + ProjectorLensDistortionOperation *operation = new ProjectorLensDistortionOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + operation->setDispertion(this->getInputSocket(2)->getStaticValues()[0]); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + + operation->setData(data); + graph->addOperation(operation); + + } else { + ScreenLensDistortionOperation *operation = new ScreenLensDistortionOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + operation->setDistortion(this->getInputSocket(1)->getStaticValues()[0]); + operation->setDispertion(this->getInputSocket(2)->getStaticValues()[0]); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + + operation->setData(data); + graph->addOperation(operation); + } + +} diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.h b/source/blender/compositor/nodes/COM_LensDistortionNode.h new file mode 100644 index 00000000000..41b84d4baff --- /dev/null +++ b/source/blender/compositor/nodes/COM_LensDistortionNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_LensDistortionNode_h_ +#define _COM_LensDistortionNode_h_ + +#include "COM_Node.h" + +/** + * @brief LensDistortionNode + * @ingroup Node + */ +class LensDistortionNode: public Node { +public: + LensDistortionNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp b/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp new file mode 100644 index 00000000000..010688b6c2a --- /dev/null +++ b/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_LuminanceMatteNode.h" +#include "BKE_node.h" +#include "COM_LuminanceMatteOperation.h" +#include "COM_ConvertRGBToYUVOperation.h" +#include "COM_SetAlphaOperation.h" + +LuminanceMatteNode::LuminanceMatteNode(bNode *editorNode): Node(editorNode) +{} + +void LuminanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + InputSocket *inputSocket = this->getInputSocket(0); + OutputSocket *outputSocketImage = this->getOutputSocket(0); + OutputSocket *outputSocketMatte = this->getOutputSocket(1); + + ConvertRGBToYUVOperation *rgbToYUV = new ConvertRGBToYUVOperation(); + LuminanceMatteOperation *operationSet = new LuminanceMatteOperation(); + bNode* editorsnode = getbNode(); + operationSet->setSettings((NodeChroma*)editorsnode->storage); + + inputSocket->relinkConnections(rgbToYUV->getInputSocket(0), true, 0, graph); + addLink(graph, rgbToYUV->getOutputSocket(), operationSet->getInputSocket(0)); + + if (outputSocketMatte->isConnected()) { + outputSocketMatte->relinkConnections(operationSet->getOutputSocket(0)); + } + + graph->addOperation(rgbToYUV); + graph->addOperation(operationSet); + + SetAlphaOperation *operation = new SetAlphaOperation(); + addLink(graph, rgbToYUV->getInputSocket(0)->getConnection()->getFromSocket(), operation->getInputSocket(0)); + addLink(graph, operationSet->getOutputSocket(), operation->getInputSocket(1)); + graph->addOperation(operation); + addPreviewOperation(graph, operation->getOutputSocket(), 9); + + if (outputSocketImage->isConnected()) { + outputSocketImage->relinkConnections(operation->getOutputSocket()); + } +} diff --git a/source/blender/compositor/nodes/COM_LuminanceMatteNode.h b/source/blender/compositor/nodes/COM_LuminanceMatteNode.h new file mode 100644 index 00000000000..e2dd8b47833 --- /dev/null +++ b/source/blender/compositor/nodes/COM_LuminanceMatteNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef COM_LuminanceMatteNODE_H +#define COM_LuminanceMatteNODE_H + +#include "COM_Node.h" + +/** + * @brief LuminanceMatteNode + * @ingroup Node + */ +class LuminanceMatteNode : public Node +{ +public: + LuminanceMatteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; + +#endif // COM_LuminanceMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_MapUVNode.cpp b/source/blender/compositor/nodes/COM_MapUVNode.cpp new file mode 100644 index 00000000000..14129eb7064 --- /dev/null +++ b/source/blender/compositor/nodes/COM_MapUVNode.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_MapUVNode.h" +#include "COM_MapUVOperation.h" +#include "COM_ExecutionSystem.h" + +MapUVNode::MapUVNode(bNode *editorNode): Node(editorNode) { +} + +void MapUVNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + MapUVOperation *operation = new MapUVOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + bNode* node = this->getbNode(); + operation->setAlpha((float)node->custom1); + operation->setResolutionInputSocketIndex(1); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_MapUVNode.h b/source/blender/compositor/nodes/COM_MapUVNode.h new file mode 100644 index 00000000000..3092e84990f --- /dev/null +++ b/source/blender/compositor/nodes/COM_MapUVNode.h @@ -0,0 +1,36 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_MapUVNode_h +#define _COM_MapUVNode_h + +#include "COM_Node.h" + +/** + * @brief MapUVNode + * @ingroup Node + */ +class MapUVNode : public Node { +public: + MapUVNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_MapValueNode.cpp b/source/blender/compositor/nodes/COM_MapValueNode.cpp new file mode 100644 index 00000000000..834b74a552d --- /dev/null +++ b/source/blender/compositor/nodes/COM_MapValueNode.cpp @@ -0,0 +1,40 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MapValueNode.h" + +#include "COM_MapValueOperation.h" +#include "COM_ExecutionSystem.h" + +MapValueNode::MapValueNode(bNode *editorNode): Node(editorNode) { +} + +void MapValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *colourSocket = this->getInputSocket(0); + OutputSocket *valueSocket = this->getOutputSocket(0); + TexMapping* storage = (TexMapping*)this->getbNode()->storage; + MapValueOperation *convertProg = new MapValueOperation(); + convertProg->setSettings(storage); + colourSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); + valueSocket->relinkConnections(convertProg->getOutputSocket(0)); + graph->addOperation(convertProg); +} diff --git a/source/blender/compositor/nodes/COM_MapValueNode.h b/source/blender/compositor/nodes/COM_MapValueNode.h new file mode 100644 index 00000000000..47a6ea6adce --- /dev/null +++ b/source/blender/compositor/nodes/COM_MapValueNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MapValueNode_h +#define _COM_MapValueNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief MapValueNode + * @ingroup Node + */ +class MapValueNode : public Node { +public: + MapValueNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_MathNode.cpp b/source/blender/compositor/nodes/COM_MathNode.cpp new file mode 100644 index 00000000000..075b90c0f2b --- /dev/null +++ b/source/blender/compositor/nodes/COM_MathNode.cpp @@ -0,0 +1,92 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MathNode.h" +#include "COM_MathBaseOperation.h" +#include "COM_ExecutionSystem.h" + +void MathNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + MathBaseOperation* operation=NULL; + + switch(this->getbNode()->custom1) + { + case 0: /* Add */ + operation = new MathAddOperation(); + break; + case 1: /* Subtract */ + operation = new MathSubtractOperation(); + break; + case 2: /* Multiply */ + operation = new MathMultiplyOperation(); + break; + case 3: /* Divide */ + operation = new MathDivideOperation(); + break; + case 4: /* Sine */ + operation = new MathSineOperation(); + break; + case 5: /* Cosine */ + operation = new MathCosineOperation(); + break; + case 6: /* Tangent */ + operation = new MathTangentOperation(); + break; + case 7: /* Arc-Sine */ + operation = new MathArcSineOperation(); + break; + case 8: /* Arc-Cosine */ + operation = new MathArcCosineOperation(); + break; + case 9: /* Arc-Tangent */ + operation = new MathArcTangentOperation(); + break; + case 10: /* Power */ + operation = new MathPowerOperation(); + break; + case 11: /* Logarithm */ + operation = new MathLogarithmOperation(); + break; + case 12: /* Minimum */ + operation = new MathMinimumOperation(); + break; + case 13: /* Maximum */ + operation = new MathMaximumOperation(); + break; + case 14: /* Round */ + operation = new MathRoundOperation(); + break; + case 15: /* Less Than */ + operation = new MathLessThanOperation(); + break; + case 16: /* Greater Than */ + operation = new MathGreaterThanOperation(); + break; + } + + if (operation != NULL) { + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + graph->addOperation(operation); + } +} diff --git a/source/blender/compositor/nodes/COM_MathNode.h b/source/blender/compositor/nodes/COM_MathNode.h new file mode 100644 index 00000000000..f5e6b5daebe --- /dev/null +++ b/source/blender/compositor/nodes/COM_MathNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MathNode_h +#define _COM_MathNode_h + +#include "COM_Node.h" + +/** + * @brief MathNode + * @ingroup Node + */ +class MathNode: public Node { +public: + MathNode(bNode* editorNode) :Node(editorNode) {} + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_MixNode.cpp b/source/blender/compositor/nodes/COM_MixNode.cpp new file mode 100644 index 00000000000..1477163d1fc --- /dev/null +++ b/source/blender/compositor/nodes/COM_MixNode.cpp @@ -0,0 +1,131 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixNode.h" + +#include "COM_MixBlendOperation.h" +#include "COM_MixAddOperation.h" +#include "COM_MixMultiplyOperation.h" +#include "COM_MixBurnOperation.h" +#include "COM_MixColorOperation.h" +#include "COM_MixDarkenOperation.h" +#include "COM_MixDifferenceOperation.h" +#include "COM_MixDivideOperation.h" +#include "COM_MixHueOperation.h" +#include "COM_MixLightenOperation.h" +#include "COM_MixLinearLightOperation.h" +#include "COM_MixOverlayOperation.h" +#include "COM_MixSaturationOperation.h" +#include "COM_MixScreenOperation.h" +#include "COM_MixSoftLightOperation.h" +#include "COM_MixSubtractOperation.h" +#include "COM_MixValueOperation.h" +#include "COM_MixDodgeOperation.h" + +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "DNA_material_types.h" // the ramp types + + +MixNode::MixNode(bNode *editorNode): Node(editorNode) { +} + + +void MixNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *valueSocket = this->getInputSocket(0); + InputSocket *color1Socket = this->getInputSocket(1); + InputSocket *color2Socket = this->getInputSocket(2); + OutputSocket *outputSocket = this->getOutputSocket(0); + bNode* editorNode = this->getbNode(); + + MixBaseOperation *convertProg; + + switch (editorNode->custom1) { + case MA_RAMP_ADD: + convertProg = new MixAddOperation(); + break; + case MA_RAMP_MULT: + convertProg = new MixMultiplyOperation(); + break; + case MA_RAMP_LIGHT: + convertProg = new MixLightenOperation(); + break; + case MA_RAMP_BURN: + convertProg = new MixBurnOperation(); + break; + case MA_RAMP_HUE: + convertProg = new MixHueOperation(); + break; + case MA_RAMP_COLOR: + convertProg = new MixColorOperation(); + break; + case MA_RAMP_SOFT: + convertProg = new MixSoftLightOperation(); + break; + case MA_RAMP_SCREEN: + convertProg = new MixScreenOperation(); + break; + case MA_RAMP_LINEAR: + convertProg = new MixLinearLightOperation(); + break; + case MA_RAMP_DIFF: + convertProg = new MixDifferenceOperation(); + break; + case MA_RAMP_SAT: + convertProg = new MixSaturationOperation(); + break; + case MA_RAMP_DIV: + convertProg = new MixDivideOperation(); + break; + case MA_RAMP_SUB: + convertProg = new MixSubtractOperation(); + break; + case MA_RAMP_DARK: + convertProg = new MixDarkenOperation(); + break; + case MA_RAMP_OVERLAY: + convertProg = new MixOverlayOperation(); + break; + case MA_RAMP_VAL: + convertProg = new MixValueOperation(); + break; + case MA_RAMP_DODGE: + convertProg = new MixDodgeOperation(); + break; + + case MA_RAMP_BLEND: + default: + convertProg = new MixBlendOperation(); + break; + } + convertProg->setUseValueAlphaMultiply(this->getbNode()->custom2); + + valueSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); + color1Socket->relinkConnections(convertProg->getInputSocket(1), true, 1, graph); + color2Socket->relinkConnections(convertProg->getInputSocket(2), true, 2, graph); + outputSocket->relinkConnections(convertProg->getOutputSocket(0)); + addPreviewOperation(graph, convertProg->getOutputSocket(0), 5); + + convertProg->getInputSocket(2)->setResizeMode(color2Socket->getResizeMode()); + + graph->addOperation(convertProg); +} diff --git a/source/blender/compositor/nodes/COM_MixNode.h b/source/blender/compositor/nodes/COM_MixNode.h new file mode 100644 index 00000000000..4b57bdbc02a --- /dev/null +++ b/source/blender/compositor/nodes/COM_MixNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixNode_h +#define _COM_MixNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief MixNode + * @ingroup Node + */ +class MixNode : public Node { +public: + MixNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.cpp b/source/blender/compositor/nodes/COM_MovieClipNode.cpp new file mode 100644 index 00000000000..7d11a06a24d --- /dev/null +++ b/source/blender/compositor/nodes/COM_MovieClipNode.cpp @@ -0,0 +1,118 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MovieClipNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_MovieClipOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_ConvertColorProfileOperation.h" + +extern "C" { + #include "DNA_movieclip_types.h" + #include "BKE_movieclip.h" + #include "BKE_tracking.h" +} + +MovieClipNode::MovieClipNode(bNode *editorNode): Node(editorNode) { +} + +void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + OutputSocket *outputMovieClip = this->getOutputSocket(0); + OutputSocket *offsetXMovieClip = this->getOutputSocket(1); + OutputSocket *offsetYMovieClip = this->getOutputSocket(2); + OutputSocket *scaleMovieClip = this->getOutputSocket(3); + OutputSocket *angleMovieClip = this->getOutputSocket(4); + + bNode *editorNode = this->getbNode(); + MovieClip *movieClip = (MovieClip*)editorNode->id; + MovieClipUser *movieClipUser = (MovieClipUser*)editorNode->storage; + + ImBuf * ibuf= NULL; + if (movieClip) { + ibuf = BKE_movieclip_get_ibuf(movieClip, movieClipUser); + } + + // always connect the output image + MovieClipOperation *operation = new MovieClipOperation(); + + if (ibuf && context->isColorManaged() && ibuf->profile == IB_PROFILE_NONE) { + ConvertColorProfileOperation *converter = new ConvertColorProfileOperation(); + converter->setFromColorProfile(IB_PROFILE_LINEAR_RGB); + converter->setToColorProfile(IB_PROFILE_SRGB); + addLink(graph, operation->getOutputSocket(), converter->getInputSocket(0)); + addPreviewOperation(graph, converter->getOutputSocket(), 9); + if (outputMovieClip->isConnected()) { + outputMovieClip->relinkConnections(converter->getOutputSocket()); + } + graph->addOperation(converter); + if (ibuf) { + converter->setPredivided(ibuf->flags & IB_cm_predivide); + } + } else { + addPreviewOperation(graph, operation->getOutputSocket(), 9); + if (outputMovieClip->isConnected()) { + outputMovieClip->relinkConnections(operation->getOutputSocket()); + } + } + operation->setMovieClip(movieClip); + operation->setMovieClipUser(movieClipUser); + operation->setFramenumber(context->getFramenumber()); + graph->addOperation(operation); + + MovieTrackingStabilization *stab= &movieClip->tracking.stabilization; + float loc[2], scale, angle; + loc[0] = 0.0f; + loc[1] = 0.0f; + scale = 1.0f; + angle = 0.0f; + + if (ibuf) { + if(stab->flag&TRACKING_2D_STABILIZATION) { + BKE_tracking_stabilization_data(&movieClip->tracking, context->getFramenumber(), ibuf->x, ibuf->y, loc, &scale, &angle); + } + } + + if (offsetXMovieClip->isConnected()) { + SetValueOperation * operationSetValue = new SetValueOperation(); + operationSetValue->setValue(loc[0]); + offsetXMovieClip->relinkConnections(operationSetValue->getOutputSocket()); + graph->addOperation(operationSetValue); + } + if (offsetYMovieClip->isConnected()) { + SetValueOperation * operationSetValue = new SetValueOperation(); + operationSetValue->setValue(loc[1]); + offsetYMovieClip->relinkConnections(operationSetValue->getOutputSocket()); + graph->addOperation(operationSetValue); + } + if (scaleMovieClip->isConnected()) { + SetValueOperation * operationSetValue = new SetValueOperation(); + operationSetValue->setValue(scale); + scaleMovieClip->relinkConnections(operationSetValue->getOutputSocket()); + graph->addOperation(operationSetValue); + } + if (angleMovieClip->isConnected()) { + SetValueOperation * operationSetValue = new SetValueOperation(); + operationSetValue->setValue(angle); + angleMovieClip->relinkConnections(operationSetValue->getOutputSocket()); + graph->addOperation(operationSetValue); + } +} diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.h b/source/blender/compositor/nodes/COM_MovieClipNode.h new file mode 100644 index 00000000000..883ebe486f8 --- /dev/null +++ b/source/blender/compositor/nodes/COM_MovieClipNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Node.h" +#include "DNA_node_types.h" + +/** + * @brief MovieClipNode + * @ingroup Node + */ +class MovieClipNode : public Node { + + +public: + MovieClipNode(bNode* editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); + +}; diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp new file mode 100644 index 00000000000..4233f313a87 --- /dev/null +++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MovieDistortionNode.h" + +#include "COM_MovieDistortionOperation.h" +#include "COM_ExecutionSystem.h" +#include "DNA_movieclip_types.h" + +MovieDistortionNode::MovieDistortionNode(bNode *editorNode) : Node(editorNode) { +} + +void MovieDistortionNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + OutputSocket *outputSocket = this->getOutputSocket(0); + bNode* bnode = this->getbNode(); + MovieClip * clip = (MovieClip*)bnode->id; + + MovieDistortionOperation * operation = new MovieDistortionOperation(bnode->custom1 == 1); + operation->setMovieClip(clip); + + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, system); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + system->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.h b/source/blender/compositor/nodes/COM_MovieDistortionNode.h new file mode 100644 index 00000000000..28eec5011a2 --- /dev/null +++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MovieDistortionNode_h_ +#define _COM_MovieDistortionNode_h_ + +#include "COM_Node.h" + +/** + * @brief MovieDistortionNode + * @ingroup Node + */ +class MovieDistortionNode: public Node { +public: + MovieDistortionNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_MuteNode.cpp b/source/blender/compositor/nodes/COM_MuteNode.cpp new file mode 100644 index 00000000000..44accf42f6a --- /dev/null +++ b/source/blender/compositor/nodes/COM_MuteNode.cpp @@ -0,0 +1,91 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MuteNode.h" +#include "COM_SocketConnection.h" +#include "stdio.h" +#include "COM_SetValueOperation.h" +#include "COM_SetVectorOperation.h" +#include "COM_SetColorOperation.h" + +MuteNode::MuteNode(bNode *editorNode): Node(editorNode) { +} + +void MuteNode::reconnect(ExecutionSystem * graph, OutputSocket * output) { + vector &inputsockets = this->getInputSockets(); + for (unsigned int index = 0; index < inputsockets.size() ; index ++) { + InputSocket *input = inputsockets[index]; + if (input->getDataType() == output->getDataType()) { + if (input->isConnected()) { + output->relinkConnections(input->getConnection()->getFromSocket(), false); + return; + } + } + } + + NodeOperation * operation; + switch (output->getDataType()) { + case COM_DT_VALUE: + { + SetValueOperation *valueoperation = new SetValueOperation(); + valueoperation->setValue(0.0f); + operation = valueoperation; + break; + } + case COM_DT_VECTOR: + { + SetVectorOperation *vectoroperation = new SetVectorOperation(); + vectoroperation->setX(0.0f); + vectoroperation->setY(0.0f); + vectoroperation->setW(0.0f); + operation = vectoroperation; + break; + } + case COM_DT_COLOR: + { + SetColorOperation *coloroperation = new SetColorOperation(); + coloroperation->setChannel1(0.0f); + coloroperation->setChannel2(0.0f); + coloroperation->setChannel3(0.0f); + coloroperation->setChannel4(0.0f); + operation = coloroperation; + break; + } + } + if (operation) { + output->relinkConnections(operation->getOutputSocket(), false); + graph->addOperation(operation); + } + + output->clearConnections(); +} + +void MuteNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + vector &outputsockets = this->getOutputSockets(); + + for (unsigned int index = 0 ; index < outputsockets.size() ; index ++) { + OutputSocket * output = outputsockets[index]; + if (output->isConnected()) { + reconnect(graph, output); + } + } +} diff --git a/source/blender/compositor/nodes/COM_MuteNode.h b/source/blender/compositor/nodes/COM_MuteNode.h new file mode 100644 index 00000000000..c2d1f283c62 --- /dev/null +++ b/source/blender/compositor/nodes/COM_MuteNode.h @@ -0,0 +1,40 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MuteNode_h_ +#define _COM_MuteNode_h_ + +#include "COM_Node.h" + +/** + * @brief MuteNode + * @ingroup Node + */ +class MuteNode: public Node { +public: + MuteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +private: + void reconnect(ExecutionSystem* graph, OutputSocket * output); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_NormalNode.cpp b/source/blender/compositor/nodes/COM_NormalNode.cpp new file mode 100644 index 00000000000..b54d8b8aab6 --- /dev/null +++ b/source/blender/compositor/nodes/COM_NormalNode.cpp @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_NormalNode.h" +#include "COM_ExecutionSystem.h" +#include "BKE_node.h" +#include "COM_DotproductOperation.h" +#include "COM_SetVectorOperation.h" + +NormalNode::NormalNode(bNode* editorNode): Node(editorNode) +{} + +void NormalNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + OutputSocket *outputSocket = this->getOutputSocket(0); + OutputSocket *outputSocketDotproduct = this->getOutputSocket(1); + bNode* editorNode = this->getbNode(); + + SetVectorOperation * operationSet = new SetVectorOperation(); + bNodeSocket * insock = (bNodeSocket*)editorNode->outputs.first; + bNodeSocketValueVector *dval = (bNodeSocketValueVector*)insock->default_value; + operationSet->setX(dval->value[0]); + operationSet->setY(dval->value[1]); + operationSet->setZ(dval->value[2]); + operationSet->setW(0.0f); + + outputSocket->relinkConnections(operationSet->getOutputSocket(0)); + graph->addOperation(operationSet); + + if (outputSocketDotproduct->isConnected()) { + DotproductOperation *operation = new DotproductOperation(); + outputSocketDotproduct->relinkConnections(operation->getOutputSocket(0)); + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + addLink(graph, operationSet->getOutputSocket(0), operation->getInputSocket(1)); + graph->addOperation(operation); + } +} diff --git a/source/blender/compositor/nodes/COM_NormalNode.h b/source/blender/compositor/nodes/COM_NormalNode.h new file mode 100644 index 00000000000..97a2f4bdd06 --- /dev/null +++ b/source/blender/compositor/nodes/COM_NormalNode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef COM_NORMALNODE_H +#define COM_NORMALNODE_H + +#include "COM_Node.h" + +/** + * @brief NormalNode + * @ingroup Node + */ +class NormalNode : public Node +{ +public: + NormalNode(bNode* editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif // COM_NormalNODE_H diff --git a/source/blender/compositor/nodes/COM_NormalizeNode.cpp b/source/blender/compositor/nodes/COM_NormalizeNode.cpp new file mode 100644 index 00000000000..dbe8278af0f --- /dev/null +++ b/source/blender/compositor/nodes/COM_NormalizeNode.cpp @@ -0,0 +1,36 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_NormalizeNode.h" +#include "COM_NormalizeOperation.h" +#include "COM_ExecutionSystem.h" + +NormalizeNode::NormalizeNode(bNode *editorNode): Node(editorNode) { +} + +void NormalizeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + NormalizeOperation *operation = new NormalizeOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_NormalizeNode.h b/source/blender/compositor/nodes/COM_NormalizeNode.h new file mode 100644 index 00000000000..b955b52391e --- /dev/null +++ b/source/blender/compositor/nodes/COM_NormalizeNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_NormalizeNode_h_ +#define _COM_NormalizeNode_h_ + +#include "COM_Node.h" + +/** + * @brief NormalizeNode + * @ingroup Node + */ +class NormalizeNode: public Node { +public: + NormalizeNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.cpp b/source/blender/compositor/nodes/COM_OutputFileNode.cpp new file mode 100644 index 00000000000..d844861cdd5 --- /dev/null +++ b/source/blender/compositor/nodes/COM_OutputFileNode.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#include "COM_OutputFileNode.h" +#include "COM_OutputFileOperation.h" +#include "COM_ExecutionSystem.h" +#include "BLI_path_util.h" +#include "BKE_utildefines.h" + +OutputFileNode::OutputFileNode(bNode *editorNode): Node(editorNode) { +} + +void OutputFileNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + NodeImageMultiFile* storage = (NodeImageMultiFile*)this->getbNode()->storage; + + if (!context->isRendering()) { + /* XXX TODO as in previous implementation? + * add dummy operations and exit, to prevent file writing on each compo update. + */ + } + + if (storage->format.imtype==R_IMF_IMTYPE_MULTILAYER) { + /* single output operation for the multilayer file */ + OutputOpenExrMultiLayerOperation *outputOperation = new OutputOpenExrMultiLayerOperation( + context->getScene(), context->getbNodeTree(), storage->base_path, storage->format.exr_codec); + + int num_inputs = getNumberOfInputSockets(); + bool hasConnections = false; + for (int i=0; i < num_inputs; ++i) { + InputSocket *input = getInputSocket(i); + if (input->isConnected()) { + hasConnections = true; + NodeImageMultiFileSocket *sockdata = (NodeImageMultiFileSocket *)input->getbNodeSocket()->storage; + + outputOperation->add_layer(sockdata->path, input->getDataType()); + + input->relinkConnections(outputOperation->getInputSocket(i)); + } + } + if (hasConnections) addPreviewOperation(graph, outputOperation->getInputSocket(0), 5); + + graph->addOperation(outputOperation); + } + else { /* single layer format */ + int num_inputs = getNumberOfInputSockets(); + bool previewAdded = false; + for (int i=0; i < num_inputs; ++i) { + InputSocket *input = getInputSocket(i); + if (input->isConnected()) { + NodeImageMultiFileSocket *sockdata = (NodeImageMultiFileSocket *)input->getbNodeSocket()->storage; + ImageFormatData *format = (sockdata->use_node_format ? &storage->format : &sockdata->format); + char path[FILE_MAX]; + + /* combine file path for the input */ + BLI_join_dirfile(path, FILE_MAX, storage->base_path, sockdata->path); + + OutputSingleLayerOperation *outputOperation = new OutputSingleLayerOperation( + context->getScene(), context->getbNodeTree(), input->getActualDataType(), format, path); + input->relinkConnections(outputOperation->getInputSocket(0)); + graph->addOperation(outputOperation); + if (!previewAdded) { + addPreviewOperation(graph, outputOperation->getInputSocket(0), 5); + previewAdded = true; + } + } + } + } +} + diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.h b/source/blender/compositor/nodes/COM_OutputFileNode.h new file mode 100644 index 00000000000..10cbba7d50f --- /dev/null +++ b/source/blender/compositor/nodes/COM_OutputFileNode.h @@ -0,0 +1,40 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#ifndef _COM_OutputFileNode_h +#define _COM_OutputFileNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" + +/** + * @brief OutputFileNode + * @ingroup Node + */ +class OutputFileNode : public Node { +public: + OutputFileNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_RenderLayersNode.cpp b/source/blender/compositor/nodes/COM_RenderLayersNode.cpp new file mode 100644 index 00000000000..e22c2fd5910 --- /dev/null +++ b/source/blender/compositor/nodes/COM_RenderLayersNode.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_RenderLayersImageProg.h" +#include "COM_RenderLayersAlphaProg.h" +#include "COM_RenderLayersDepthProg.h" +#include "COM_RenderLayersNormalOperation.h" +#include "COM_RenderLayersSpeedOperation.h" +#include "COM_RenderLayersColorOperation.h" +#include "COM_RenderLayersUVOperation.h" +#include "COM_RenderLayersMistOperation.h" +#include "COM_RenderLayersObjectIndexOperation.h" +#include "COM_RenderLayersDiffuseOperation.h" +#include "COM_RenderLayersSpecularOperation.h" +#include "COM_RenderLayersShadowOperation.h" +#include "COM_RenderLayersAOOperation.h" +#include "COM_RenderLayersEmitOperation.h" +#include "COM_RenderLayersReflectionOperation.h" +#include "COM_RenderLayersRefractionOperation.h" +#include "COM_RenderLayersEnvironmentOperation.h" +#include "COM_RenderLayersIndirectOperation.h" +#include "COM_RenderLayersMaterialIndexOperation.h" +#include "COM_RenderLayersCyclesOperation.h" +#include "COM_TranslateOperation.h" +#include "COM_RotateOperation.h" +#include "COM_ScaleOperation.h" +#include "COM_SetValueOperation.h" + +RenderLayersNode::RenderLayersNode(bNode *editorNode): Node(editorNode) { +} + +void RenderLayersNode::testSocketConnection(ExecutionSystem* system, int outputSocketNumber, RenderLayersBaseProg * operation) { + OutputSocket *outputSocket = this->getOutputSocket(outputSocketNumber); + Scene* scene = (Scene*)this->getbNode()->id; + short layerId = this->getbNode()->custom1; + + if (outputSocket->isConnected()) { + operation->setScene(scene); + operation->setLayerId(layerId); + outputSocket->relinkConnections(operation->getOutputSocket()); + system->addOperation(operation); + if (outputSocketNumber == 0) { // only do for image socket if connected + addPreviewOperation(system, operation->getOutputSocket(), 9); + } + } else { + if (outputSocketNumber == 0) { + system->addOperation(operation); + operation->setScene(scene); + operation->setLayerId(layerId); + addPreviewOperation(system, operation->getOutputSocket(), 9); + } else { + delete operation; + } + } +} + +void RenderLayersNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + testSocketConnection(graph, 0, new RenderLayersColourProg()); + testSocketConnection(graph, 1, new RenderLayersAlphaProg()); + testSocketConnection(graph, 2, new RenderLayersDepthProg()); + testSocketConnection(graph, 3, new RenderLayersNormalOperation()); + testSocketConnection(graph, 4, new RenderLayersUVOperation()); + testSocketConnection(graph, 5, new RenderLayersSpeedOperation()); + testSocketConnection(graph, 6, new RenderLayersColorOperation()); + testSocketConnection(graph, 7, new RenderLayersDiffuseOperation()); + testSocketConnection(graph, 8, new RenderLayersSpecularOperation()); + testSocketConnection(graph, 9, new RenderLayersShadowOperation()); + testSocketConnection(graph, 10, new RenderLayersAOOperation()); + testSocketConnection(graph, 11, new RenderLayersReflectionOperation()); + testSocketConnection(graph, 12, new RenderLayersRefractionOperation()); + testSocketConnection(graph, 13, new RenderLayersIndirectOperation()); + testSocketConnection(graph, 14, new RenderLayersObjectIndexOperation()); + testSocketConnection(graph, 15, new RenderLayersMaterialIndexOperation()); + testSocketConnection(graph, 16, new RenderLayersMistOperation()); + testSocketConnection(graph, 17, new RenderLayersEmitOperation()); + testSocketConnection(graph, 18, new RenderLayersEnvironmentOperation()); + + // cycles passes + testSocketConnection(graph, 19, new RenderLayersCyclesOperation(SCE_PASS_DIFFUSE_DIRECT)); + testSocketConnection(graph, 20, new RenderLayersCyclesOperation(SCE_PASS_DIFFUSE_INDIRECT)); + testSocketConnection(graph, 21, new RenderLayersCyclesOperation(SCE_PASS_DIFFUSE_COLOR)); + testSocketConnection(graph, 22, new RenderLayersCyclesOperation(SCE_PASS_GLOSSY_DIRECT)); + testSocketConnection(graph, 23, new RenderLayersCyclesOperation(SCE_PASS_GLOSSY_INDIRECT)); + testSocketConnection(graph, 24, new RenderLayersCyclesOperation(SCE_PASS_GLOSSY_COLOR)); + testSocketConnection(graph, 25, new RenderLayersCyclesOperation(SCE_PASS_TRANSM_DIRECT)); + testSocketConnection(graph, 26, new RenderLayersCyclesOperation(SCE_PASS_TRANSM_INDIRECT)); + testSocketConnection(graph, 27, new RenderLayersCyclesOperation(SCE_PASS_TRANSM_COLOR)); +} diff --git a/source/blender/compositor/nodes/COM_RenderLayersNode.h b/source/blender/compositor/nodes/COM_RenderLayersNode.h new file mode 100644 index 00000000000..285b6f6d007 --- /dev/null +++ b/source/blender/compositor/nodes/COM_RenderLayersNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_RenderLayersBaseProg.h" + +/** + * @brief RenderLayersNode + * @ingroup Node + */ +class RenderLayersNode : public Node { +public: + RenderLayersNode(bNode* editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +private: + void testSocketConnection(ExecutionSystem* graph, int outputSocketNumber, RenderLayersBaseProg * operation); +}; diff --git a/source/blender/compositor/nodes/COM_RotateNode.cpp b/source/blender/compositor/nodes/COM_RotateNode.cpp new file mode 100644 index 00000000000..059a62874bb --- /dev/null +++ b/source/blender/compositor/nodes/COM_RotateNode.cpp @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RotateNode.h" + +#include "COM_RotateOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_SetSamplerOperation.h" + +RotateNode::RotateNode(bNode *editorNode) : Node(editorNode) { +} + +void RotateNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + InputSocket *inputDegreeSocket = this->getInputSocket(1); + OutputSocket *outputSocket = this->getOutputSocket(0); + RotateOperation *operation = new RotateOperation(); + SetSamplerOperation *sampler = new SetSamplerOperation(); + + switch (this->getbNode()->custom1) { + case 0: + sampler->setSampler(COM_PS_NEAREST); + break ; + case 1: + sampler->setSampler(COM_PS_BILINEAR); + break; + case 2: + sampler->setSampler(COM_PS_BICUBIC); + break; + + } + + addLink(system, sampler->getOutputSocket(), operation->getInputSocket(0)); + + inputSocket->relinkConnections(sampler->getInputSocket(0), true, 0, system); + inputDegreeSocket->relinkConnections(operation->getInputSocket(1), true, 1, system); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + system->addOperation(sampler); + system->addOperation(operation); + +} diff --git a/source/blender/compositor/nodes/COM_RotateNode.h b/source/blender/compositor/nodes/COM_RotateNode.h new file mode 100644 index 00000000000..7e4f7a1a546 --- /dev/null +++ b/source/blender/compositor/nodes/COM_RotateNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RotateNode_h_ +#define _COM_RotateNode_h_ + +#include "COM_Node.h" + +/** + * @brief RotateNode + * @ingroup Node + */ +class RotateNode: public Node { +public: + RotateNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ScaleNode.cpp b/source/blender/compositor/nodes/COM_ScaleNode.cpp new file mode 100644 index 00000000000..b281ed64d79 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ScaleNode.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ScaleNode.h" + +#include "COM_ScaleOperation.h" +#include "COM_ExecutionSystem.h" +#include "BKE_node.h" +#include "COM_SetValueOperation.h" + +ScaleNode::ScaleNode(bNode *editorNode) : Node(editorNode) { +} + +void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + InputSocket *inputXSocket = this->getInputSocket(1); + InputSocket *inputYSocket = this->getInputSocket(2); + OutputSocket *outputSocket = this->getOutputSocket(0); + bNode* bnode = this->getbNode(); + switch (bnode->custom1) { + case CMP_SCALE_RELATIVE: { + ScaleOperation *operation = new ScaleOperation(); + + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputXSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); + inputYSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } + break; + case CMP_SCALE_SCENEPERCENT: { + SetValueOperation * scaleFactorOperation = new SetValueOperation(); + scaleFactorOperation->setValue(context->getScene()->r.size/100.0f); + ScaleOperation * operation = new ScaleOperation(); + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + addLink(graph, scaleFactorOperation->getOutputSocket(), operation->getInputSocket(1)); + addLink(graph, scaleFactorOperation->getOutputSocket(), operation->getInputSocket(2)); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(scaleFactorOperation); + graph->addOperation(operation); + } + break; + + case CMP_SCALE_RENDERPERCENT: { + const RenderData* data = &context->getScene()->r; + ScaleFixedSizeOperation * operation = new ScaleFixedSizeOperation(); + operation->setNewWidth(data->xsch*data->size/100.0f); + operation->setNewHeight(data->ysch*data->size/100.0f); + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + operation->getInputSocket(0)->getConnection()->setIgnoreResizeCheck(true); + graph->addOperation(operation); + } + break; + + case CMP_SCALE_ABSOLUTE: { + ScaleAbsoluteOperation *operation = new ScaleAbsoluteOperation(); // TODO: what is the use of this one.... perhaps some issues when the ui was updated.... + + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputXSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); + inputYSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } + break; + } +} diff --git a/source/blender/compositor/nodes/COM_ScaleNode.h b/source/blender/compositor/nodes/COM_ScaleNode.h new file mode 100644 index 00000000000..b6a1a56d8c9 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ScaleNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ScaleNode_h_ +#define _COM_ScaleNode_h_ + +#include "COM_Node.h" + +/** + * @brief ScaleNode + * @ingroup Node + */ +class ScaleNode: public Node { +public: + ScaleNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp b/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp new file mode 100644 index 00000000000..922b9c051d5 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SeparateHSVANode.h" + +#include "COM_SeparateChannelOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "COM_ConvertRGBToHSVOperation.h" + +SeparateHSVANode::SeparateHSVANode(bNode *editorNode): SeparateRGBANode(editorNode) { +} + +void SeparateHSVANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + ConvertRGBToHSVOperation *operation = new ConvertRGBToHSVOperation(); + InputSocket *inputSocket = this->getInputSocket(0); + if (inputSocket->isConnected()) { + inputSocket->relinkConnections(operation->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), inputSocket); + } + graph->addOperation(operation); + SeparateRGBANode::convertToOperations(graph, context); +} diff --git a/source/blender/compositor/nodes/COM_SeparateHSVANode.h b/source/blender/compositor/nodes/COM_SeparateHSVANode.h new file mode 100644 index 00000000000..9fbd0212509 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateHSVANode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SeparateHSVANode_h +#define _COM_SeparateHSVANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_SeparateRGBANode.h" + +/** + * @brief SeparateHSVANode + * @ingroup Node + */ +class SeparateHSVANode : public SeparateRGBANode { +public: + SeparateHSVANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp b/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp new file mode 100644 index 00000000000..08b3c87cbf9 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SeparateRGBANode.h" + +#include "COM_SeparateChannelOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "DNA_material_types.h" // the ramp types + + +SeparateRGBANode::SeparateRGBANode(bNode *editorNode): Node(editorNode) { +} + + +void SeparateRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *imageSocket = this->getInputSocket(0); + OutputSocket *outputRSocket = this->getOutputSocket(0); + OutputSocket *outputGSocket = this->getOutputSocket(1); + OutputSocket *outputBSocket = this->getOutputSocket(2); + OutputSocket *outputASocket = this->getOutputSocket(3); + + if (outputRSocket->isConnected()) { + SeparateChannelOperation *operation = new SeparateChannelOperation(); + operation->setChannel(0); + imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + outputRSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } + if (outputGSocket->isConnected()) { + SeparateChannelOperation *operation = new SeparateChannelOperation(); + operation->setChannel(1); + imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + outputGSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } + if (outputBSocket->isConnected()) { + SeparateChannelOperation *operation = new SeparateChannelOperation(); + operation->setChannel(2); + imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + outputBSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } + if (outputASocket->isConnected()) { + SeparateChannelOperation *operation = new SeparateChannelOperation(); + operation->setChannel(3); + imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + outputASocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } +} diff --git a/source/blender/compositor/nodes/COM_SeparateRGBANode.h b/source/blender/compositor/nodes/COM_SeparateRGBANode.h new file mode 100644 index 00000000000..5fb00600790 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateRGBANode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SeparateRGBANode_h +#define _COM_SeparateRGBANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief SeparateRGBANode + * @ingroup Node + */ +class SeparateRGBANode : public Node { +public: + SeparateRGBANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp b/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp new file mode 100644 index 00000000000..854f74cda4c --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_SeparateYCCANode.h" +#include "COM_SeparateChannelOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "COM_ConvertRGBToYCCOperation.h" + +SeparateYCCANode::SeparateYCCANode(bNode *editorNode): SeparateRGBANode(editorNode) { +} + +void SeparateYCCANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + ConvertRGBToYCCOperation *operation = new ConvertRGBToYCCOperation(); + InputSocket *inputSocket = this->getInputSocket(0); + + bNode *node = this->getbNode(); + operation->setMode(node->custom1); + + if (inputSocket->isConnected()) { + inputSocket->relinkConnections(operation->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), inputSocket); + } + graph->addOperation(operation); + SeparateRGBANode::convertToOperations(graph, context); +} diff --git a/source/blender/compositor/nodes/COM_SeparateYCCANode.h b/source/blender/compositor/nodes/COM_SeparateYCCANode.h new file mode 100644 index 00000000000..441eba9bc93 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateYCCANode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_SeparateYCCANode_h +#define _COM_SeparateYCCANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_SeparateRGBANode.h" + +/** + * @brief SeparateYCCANode + * @ingroup Node + */ +class SeparateYCCANode : public SeparateRGBANode { +public: + SeparateYCCANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp b/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp new file mode 100644 index 00000000000..db8a8bd2697 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp @@ -0,0 +1,40 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_SeparateYUVANode.h" +#include "COM_SeparateChannelOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "COM_ConvertRGBToYUVOperation.h" + +SeparateYUVANode::SeparateYUVANode(bNode *editorNode): SeparateRGBANode(editorNode) { +} + +void SeparateYUVANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { + ConvertRGBToYUVOperation *operation = new ConvertRGBToYUVOperation(); + InputSocket *inputSocket = this->getInputSocket(0); + if (inputSocket->isConnected()) { + inputSocket->relinkConnections(operation->getInputSocket(0)); + addLink(graph, operation->getOutputSocket(), inputSocket); + } + graph->addOperation(operation); + SeparateRGBANode::convertToOperations(graph, context); +} diff --git a/source/blender/compositor/nodes/COM_SeparateYUVANode.h b/source/blender/compositor/nodes/COM_SeparateYUVANode.h new file mode 100644 index 00000000000..136ce1b4f20 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SeparateYUVANode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_SeparateYUVANode_h +#define _COM_SeparateYUVANode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +#include "COM_SeparateRGBANode.h" + +/** + * @brief SeparateYUVANode + * @ingroup Node + */ +class SeparateYUVANode : public SeparateRGBANode { +public: + SeparateYUVANode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp new file mode 100644 index 00000000000..5dd7dea1fa8 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp @@ -0,0 +1,35 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SetAlphaNode.h" +#include "COM_SetAlphaOperation.h" +#include "COM_ExecutionSystem.h" + +void SetAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + SetAlphaOperation* operation = new SetAlphaOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 0, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.h b/source/blender/compositor/nodes/COM_SetAlphaNode.h new file mode 100644 index 00000000000..c9d819d172e --- /dev/null +++ b/source/blender/compositor/nodes/COM_SetAlphaNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SetAlphaNode_h +#define _COM_SetAlphaNode_h + +#include "COM_Node.h" + +/** + * @brief SetAlphaNode + * @ingroup Node + */ +class SetAlphaNode: public Node { +public: + SetAlphaNode(bNode* editorNode) :Node(editorNode) {} + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp new file mode 100644 index 00000000000..0622ed0ea84 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SocketProxyNode.h" +#include "COM_SocketConnection.h" +#include "COM_SocketProxyOperation.h" +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "COM_SetVectorOperation.h" +#include "COM_SetColorOperation.h" + +SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput): Node(editorNode, false) { + DataType dt; + + dt = COM_DT_VALUE; + if (editorInput->type == SOCK_RGBA) dt = COM_DT_COLOR; + if (editorInput->type == SOCK_VECTOR) dt = COM_DT_VECTOR; + this->addInputSocket(dt, (InputSocketResizeMode)editorInput->resizemode, editorInput); + + dt = COM_DT_VALUE; + if (editorOutput->type == SOCK_RGBA) dt = COM_DT_COLOR; + if (editorOutput->type == SOCK_VECTOR) dt = COM_DT_VECTOR; + this->addOutputSocket(dt, editorOutput); +} + +void SocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + OutputSocket * outputsocket = this->getOutputSocket(0); + if (outputsocket->isConnected()) { + SocketProxyOperation *operation = new SocketProxyOperation(); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } +} + +void OutputSocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + OutputSocket * outputsocket = this->getOutputSocket(0); + InputSocket * inputsocket = this->getInputSocket(0); + if (outputsocket->isConnected()) { + switch (outputsocket->getActualDataType()) { + case COM_DT_VALUE: + { + SetValueOperation *operation = new SetValueOperation(); + bNodeSocketValueFloat *dval = (bNodeSocketValueFloat*)inputsocket->getbNodeSocket()->default_value; + operation->setValue(dval->value); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + break; + } + case COM_DT_COLOR: + { + SetColorOperation *operation = new SetColorOperation(); + bNodeSocketValueRGBA *dval = (bNodeSocketValueRGBA*)inputsocket->getbNodeSocket()->default_value; + operation->setChannels(dval->value); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + break; + } + case COM_DT_VECTOR: + { + SetVectorOperation *operation = new SetVectorOperation(); + bNodeSocketValueVector *dval = (bNodeSocketValueVector*)inputsocket->getbNodeSocket()->default_value; + operation->setVector(dval->value); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + break; + } + } + } +} diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.h b/source/blender/compositor/nodes/COM_SocketProxyNode.h new file mode 100644 index 00000000000..eb14f84c46a --- /dev/null +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.h @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SocketProxyNode_h_ +#define _COM_SocketProxyNode_h_ + +#include "COM_Node.h" + +/** + * @brief SocketProxyNode + * @ingroup Node + */ +class SocketProxyNode: public Node { +public: + SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + + virtual bool isProxyNode() const { return true; } +}; + +class OutputSocketProxyNode: public SocketProxyNode { +public: + OutputSocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput): SocketProxyNode(editorNode, editorInput, editorOutput) {} + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp new file mode 100644 index 00000000000..12204c65112 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SplitViewerNode.h" +#include "BKE_global.h" + +#include "COM_SplitViewerOperation.h" +#include "COM_ExecutionSystem.h" + +SplitViewerNode::SplitViewerNode(bNode *editorNode): Node(editorNode) { +} + +void SplitViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *image1Socket = this->getInputSocket(0); + InputSocket *image2Socket = this->getInputSocket(1); + Image* image = (Image*)this->getbNode()->id; + ImageUser * imageUser = (ImageUser*) this->getbNode()->storage; + if (image1Socket->isConnected() && image2Socket->isConnected()) { + SplitViewerOperation *splitViewerOperation = new SplitViewerOperation(); + splitViewerOperation->setImage(image); + splitViewerOperation->setImageUser(imageUser); + splitViewerOperation->setActive(this->getbNode()->flag & NODE_DO_OUTPUT); + splitViewerOperation->setSplitPercentage(this->getbNode()->custom1); + splitViewerOperation->setXSplit(!this->getbNode()->custom2); + image1Socket->relinkConnections(splitViewerOperation->getInputSocket(0), true, 1, graph); + image2Socket->relinkConnections(splitViewerOperation->getInputSocket(1), true, 1, graph); + addPreviewOperation(graph, splitViewerOperation->getInputSocket(0), 0); + graph->addOperation(splitViewerOperation); + } +} diff --git a/source/blender/compositor/nodes/COM_SplitViewerNode.h b/source/blender/compositor/nodes/COM_SplitViewerNode.h new file mode 100644 index 00000000000..e2d7a8c0dc9 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SplitViewerNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SplitViewerNode_h +#define _COM_SplitViewerNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief SplitViewerNode + * @ingroup Node + */ +class SplitViewerNode : public Node { +public: + SplitViewerNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp new file mode 100644 index 00000000000..74fde974784 --- /dev/null +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp @@ -0,0 +1,87 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Stabilize2dNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_TranslateOperation.h" +#include "COM_RotateOperation.h" +#include "COM_ScaleOperation.h" +#include "COM_MovieClipAttributeOperation.h" + +extern "C" { + #include "DNA_movieclip_types.h" + #include "BKE_tracking.h" +} + +Stabilize2dNode::Stabilize2dNode(bNode *editorNode): Node(editorNode) { +} + +void Stabilize2dNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *imageInput = this->getInputSocket(0); + MovieClip *clip= (MovieClip *)getbNode()->id; + + ScaleOperation * scaleOperation = new ScaleOperation(); + RotateOperation * rotateOperation = new RotateOperation(); + TranslateOperation * translateOperation = new TranslateOperation(); + MovieClipAttributeOperation *scaleAttribute = new MovieClipAttributeOperation(); + MovieClipAttributeOperation *angleAttribute = new MovieClipAttributeOperation(); + MovieClipAttributeOperation *xAttribute = new MovieClipAttributeOperation(); + MovieClipAttributeOperation *yAttribute = new MovieClipAttributeOperation(); + + scaleAttribute->setAttribute(MCA_SCALE); + scaleAttribute->setFramenumber(context->getFramenumber()); + scaleAttribute->setMovieClip(clip); + + angleAttribute->setAttribute(MCA_ANGLE); + angleAttribute->setFramenumber(context->getFramenumber()); + angleAttribute->setMovieClip(clip); + + xAttribute->setAttribute(MCA_X); + xAttribute->setFramenumber(context->getFramenumber()); + xAttribute->setMovieClip(clip); + + yAttribute->setAttribute(MCA_Y); + yAttribute->setFramenumber(context->getFramenumber()); + yAttribute->setMovieClip(clip); + + imageInput->relinkConnections(scaleOperation->getInputSocket(0), true, 0, graph); + addLink(graph, scaleAttribute->getOutputSocket(), scaleOperation->getInputSocket(1)); + addLink(graph, scaleAttribute->getOutputSocket(), scaleOperation->getInputSocket(2)); + + addLink(graph, scaleOperation->getOutputSocket(), rotateOperation->getInputSocket(0)); + addLink(graph, angleAttribute->getOutputSocket(), rotateOperation->getInputSocket(1)); + rotateOperation->setDoDegree2RadConversion(false); + + addLink(graph, rotateOperation->getOutputSocket(), translateOperation->getInputSocket(0)); + addLink(graph, xAttribute->getOutputSocket(), translateOperation->getInputSocket(1)); + addLink(graph, yAttribute->getOutputSocket(), translateOperation->getInputSocket(2)); + + this->getOutputSocket()->relinkConnections(translateOperation->getOutputSocket()); + + graph->addOperation(scaleAttribute); + graph->addOperation(angleAttribute); + graph->addOperation(xAttribute); + graph->addOperation(yAttribute); + graph->addOperation(scaleOperation); + graph->addOperation(translateOperation); + graph->addOperation(rotateOperation); +} diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.h b/source/blender/compositor/nodes/COM_Stabilize2dNode.h new file mode 100644 index 00000000000..613bb97b994 --- /dev/null +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.h @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Node.h" +#include "DNA_node_types.h" + +/** + * @brief Stabilize2dNode + * @ingroup Node + */ +class Stabilize2dNode : public Node { +public: + Stabilize2dNode(bNode* editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; diff --git a/source/blender/compositor/nodes/COM_SwitchNode.cpp b/source/blender/compositor/nodes/COM_SwitchNode.cpp new file mode 100644 index 00000000000..1b15ae0e890 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SwitchNode.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SwitchNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_SocketProxyOperation.h" + +SwitchNode::SwitchNode(bNode *editorNode): Node(editorNode) { +} + + +void SwitchNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + SocketProxyOperation * operation = new SocketProxyOperation(); + int switchFrame = this->getbNode()->custom1; + + if (!switchFrame) { + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + } else { + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(0), true, 1, graph); + } + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_SwitchNode.h b/source/blender/compositor/nodes/COM_SwitchNode.h new file mode 100644 index 00000000000..da93af42489 --- /dev/null +++ b/source/blender/compositor/nodes/COM_SwitchNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SwitchNode_h +#define _COM_SwitchNode_h + +#include "COM_Node.h" +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" +/** + * @brief SwitchNode + * @ingroup Node + */ +class SwitchNode : public Node { +public: + SwitchNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_TextureNode.cpp b/source/blender/compositor/nodes/COM_TextureNode.cpp new file mode 100644 index 00000000000..ac78c1afd7d --- /dev/null +++ b/source/blender/compositor/nodes/COM_TextureNode.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TextureNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_TextureOperation.h" + +TextureNode::TextureNode(bNode *editorNode): Node(editorNode) { +} + +void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + bNode* editorNode = this->getbNode(); + Tex* texture = (Tex*)editorNode->id; + TextureOperation* operation = new TextureOperation(); + this->getOutputSocket(1)->relinkConnections(operation->getOutputSocket()); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); + operation->setTexture(texture); + system->addOperation(operation); + addPreviewOperation(system, operation->getOutputSocket(), 9); + + if (this->getOutputSocket(0)->isConnected()) { + TextureAlphaOperation* alphaOperation = new TextureAlphaOperation(); + this->getOutputSocket(0)->relinkConnections(alphaOperation->getOutputSocket()); + addLink(system, operation->getInputSocket(0)->getConnection()->getFromSocket(), alphaOperation->getInputSocket(0)); + addLink(system, operation->getInputSocket(1)->getConnection()->getFromSocket(), alphaOperation->getInputSocket(1)); + alphaOperation->setTexture(texture); + system->addOperation(alphaOperation); + } +} diff --git a/source/blender/compositor/nodes/COM_TextureNode.h b/source/blender/compositor/nodes/COM_TextureNode.h new file mode 100644 index 00000000000..493c94ddb19 --- /dev/null +++ b/source/blender/compositor/nodes/COM_TextureNode.h @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Node.h" +#include "DNA_node_types.h" + +/** + * @brief TextureNode + * @ingroup Node + */ +class TextureNode : public Node { +public: + TextureNode(bNode* editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; diff --git a/source/blender/compositor/nodes/COM_TimeNode.cpp b/source/blender/compositor/nodes/COM_TimeNode.cpp new file mode 100644 index 00000000000..3e2c750d3aa --- /dev/null +++ b/source/blender/compositor/nodes/COM_TimeNode.cpp @@ -0,0 +1,55 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TimeNode.h" +#include "DNA_scene_types.h" +#include "COM_SetValueOperation.h" +#include "COM_ExecutionSystem.h" +extern "C" { + #include "BKE_colortools.h" +} +#include "BLI_utildefines.h" + +TimeNode::TimeNode(bNode *editorNode): Node(editorNode) { +} + +void TimeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + SetValueOperation *operation = new SetValueOperation(); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + bNode* node = this->getbNode(); + + /* stack order output: fac */ + float fac= 0.0f; + const int framenumber = context->getFramenumber(); + + if (framenumber < node->custom1) { + fac = 0.0f; + } else if (framenumber > node->custom2) { + fac = 1.0f; + } else if(node->custom1 < node->custom2) { + fac= (context->getFramenumber() - node->custom1)/(float)(node->custom2-node->custom1); + } + + fac= curvemapping_evaluateF((CurveMapping*)node->storage, 0, fac); + operation->setValue(CLAMPIS(fac, 0.0f, 1.0f)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_TimeNode.h b/source/blender/compositor/nodes/COM_TimeNode.h new file mode 100644 index 00000000000..25134db8528 --- /dev/null +++ b/source/blender/compositor/nodes/COM_TimeNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_TimeNode_h_ +#define _COM_TimeNode_h_ + +#include "COM_Node.h" + +/** + * @brief TimeNode + * @ingroup Node + */ +class TimeNode: public Node { +public: + TimeNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_TonemapNode.cpp b/source/blender/compositor/nodes/COM_TonemapNode.cpp new file mode 100644 index 00000000000..a610146a495 --- /dev/null +++ b/source/blender/compositor/nodes/COM_TonemapNode.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TonemapNode.h" +#include "DNA_scene_types.h" +#include "COM_TonemapOperation.h" +#include "COM_ExecutionSystem.h" + +TonemapNode::TonemapNode(bNode *editorNode): Node(editorNode) { +} + +void TonemapNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + NodeTonemap* data = (NodeTonemap*)this->getbNode()->storage; + TonemapOperation *operation = data->type==1?new PhotoreceptorTonemapOperation():new TonemapOperation(); + + operation->setData(data); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + system->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_TonemapNode.h b/source/blender/compositor/nodes/COM_TonemapNode.h new file mode 100644 index 00000000000..2140d7deb6a --- /dev/null +++ b/source/blender/compositor/nodes/COM_TonemapNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_TonemapNode_h_ +#define _COM_TonemapNode_h_ + +#include "COM_Node.h" + +/** + * @brief TonemapNode + * @ingroup Node + */ +class TonemapNode: public Node { +public: + TonemapNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_TransformNode.cpp b/source/blender/compositor/nodes/COM_TransformNode.cpp new file mode 100644 index 00000000000..9b6d5ec35c5 --- /dev/null +++ b/source/blender/compositor/nodes/COM_TransformNode.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TransformNode.h" +#include "COM_ExecutionSystem.h" +#include "COM_TranslateOperation.h" +#include "COM_RotateOperation.h" +#include "COM_ScaleOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_SetSamplerOperation.h" + +TransformNode::TransformNode(bNode *editorNode): Node(editorNode) { +} + +void TransformNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *imageInput = this->getInputSocket(0); + InputSocket *xInput = this->getInputSocket(1); + InputSocket *yInput = this->getInputSocket(2); + InputSocket *angleInput = this->getInputSocket(3); + InputSocket *scaleInput = this->getInputSocket(4); + + ScaleOperation * scaleOperation = new ScaleOperation(); + RotateOperation * rotateOperation = new RotateOperation(); + TranslateOperation * translateOperation = new TranslateOperation(); + SetSamplerOperation *sampler = new SetSamplerOperation(); + + switch (this->getbNode()->custom1) { + case 0: + sampler->setSampler(COM_PS_NEAREST); + break ; + case 1: + sampler->setSampler(COM_PS_BILINEAR); + break; + case 2: + sampler->setSampler(COM_PS_BICUBIC); + break; + } + + imageInput->relinkConnections(sampler->getInputSocket(0), true, 0, graph); + addLink(graph, sampler->getOutputSocket(), scaleOperation->getInputSocket(0)); + scaleInput->relinkConnections(scaleOperation->getInputSocket(1), true, 4, graph); + addLink(graph, scaleOperation->getInputSocket(1)->getConnection()->getFromSocket(), scaleOperation->getInputSocket(2)); // xscale = yscale + + addLink(graph, scaleOperation->getOutputSocket(), rotateOperation->getInputSocket(0)); + rotateOperation->setDoDegree2RadConversion(false); + angleInput->relinkConnections(rotateOperation->getInputSocket(1), true, 3, graph); + + addLink(graph, rotateOperation->getOutputSocket(), translateOperation->getInputSocket(0)); + xInput->relinkConnections(translateOperation->getInputSocket(1), true, 1, graph); + yInput->relinkConnections(translateOperation->getInputSocket(2), true, 2, graph); + + this->getOutputSocket()->relinkConnections(translateOperation->getOutputSocket()); + + graph->addOperation(sampler); + graph->addOperation(scaleOperation); + graph->addOperation(rotateOperation); + graph->addOperation(translateOperation); +} diff --git a/source/blender/compositor/nodes/COM_TransformNode.h b/source/blender/compositor/nodes/COM_TransformNode.h new file mode 100644 index 00000000000..bcb71ba8e5d --- /dev/null +++ b/source/blender/compositor/nodes/COM_TransformNode.h @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_Node.h" +#include "DNA_node_types.h" + +/** + * @brief TransformNode + * @ingroup Node + */ +class TransformNode : public Node { +public: + TransformNode(bNode* editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp new file mode 100644 index 00000000000..4dfa901610c --- /dev/null +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TranslateNode.h" + +#include "COM_TranslateOperation.h" +#include "COM_ExecutionSystem.h" + +TranslateNode::TranslateNode(bNode *editorNode) : Node(editorNode) { +} + +void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *inputSocket = this->getInputSocket(0); + InputSocket *inputXSocket = this->getInputSocket(1); + InputSocket *inputYSocket = this->getInputSocket(2); + OutputSocket *outputSocket = this->getOutputSocket(0); + TranslateOperation *operation = new TranslateOperation(); + + inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputXSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); + inputYSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + outputSocket->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_TranslateNode.h b/source/blender/compositor/nodes/COM_TranslateNode.h new file mode 100644 index 00000000000..8f7558ea468 --- /dev/null +++ b/source/blender/compositor/nodes/COM_TranslateNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_TranslateNode_h_ +#define _COM_TranslateNode_h_ + +#include "COM_Node.h" + +/** + * @brief TranslateNode + * @ingroup Node + */ +class TranslateNode: public Node { +public: + TranslateNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ValueNode.cpp b/source/blender/compositor/nodes/COM_ValueNode.cpp new file mode 100644 index 00000000000..0b40872bed4 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ValueNode.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ValueNode.h" +#include "DNA_scene_types.h" +#include "COM_SetValueOperation.h" +#include "COM_ExecutionSystem.h" + +ValueNode::ValueNode(bNode *editorNode): Node(editorNode) { +} + +void ValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + SetValueOperation *operation = new SetValueOperation(); + bNodeSocket* socket = this->getEditorOutputSocket(0); + bNodeSocketValueFloat *dval = (bNodeSocketValueFloat*)socket->default_value; + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + operation->setValue(dval->value); + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_ValueNode.h b/source/blender/compositor/nodes/COM_ValueNode.h new file mode 100644 index 00000000000..f0322a9704c --- /dev/null +++ b/source/blender/compositor/nodes/COM_ValueNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ValueNode_h_ +#define _COM_ValueNode_h_ + +#include "COM_Node.h" + +/** + * @brief ValueNode + * @ingroup Node + */ +class ValueNode: public Node { +public: + ValueNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_VectorBlurNode.cpp b/source/blender/compositor/nodes/COM_VectorBlurNode.cpp new file mode 100644 index 00000000000..2063f21c785 --- /dev/null +++ b/source/blender/compositor/nodes/COM_VectorBlurNode.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_VectorBlurNode.h" +#include "DNA_node_types.h" +#include "COM_FogGlowImageOperation.h" +#include "COM_BokehBlurOperation.h" +#include "COM_VectorBlurOperation.h" +#include "COM_SetValueOperation.h" +#include "COM_MixBlendOperation.h" + +VectorBlurNode::VectorBlurNode(bNode *editorNode): Node(editorNode) { +} + +void VectorBlurNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { + bNode* node = this->getbNode(); + NodeBlurData* vectorBlurSettings = (NodeBlurData*)node->storage; + VectorBlurOperation *operation = new VectorBlurOperation(); + operation->setVectorBlurSettings(vectorBlurSettings); + operation->setQuality(context->getQuality()); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, system); + this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); + system->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_VectorBlurNode.h b/source/blender/compositor/nodes/COM_VectorBlurNode.h new file mode 100644 index 00000000000..54449bde1d3 --- /dev/null +++ b/source/blender/compositor/nodes/COM_VectorBlurNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_VectorBlurNode_h_ +#define _COM_VectorBlurNode_h_ + +#include "COM_Node.h" + +/** + * @brief VectorBlurNode + * @ingroup Node + */ +class VectorBlurNode: public Node { +public: + VectorBlurNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_VectorCurveNode.cpp b/source/blender/compositor/nodes/COM_VectorCurveNode.cpp new file mode 100644 index 00000000000..c62906a82a6 --- /dev/null +++ b/source/blender/compositor/nodes/COM_VectorCurveNode.cpp @@ -0,0 +1,40 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_VectorCurveNode.h" +#include "DNA_scene_types.h" +#include "COM_VectorCurveOperation.h" +#include "COM_ExecutionSystem.h" + +VectorCurveNode::VectorCurveNode(bNode *editorNode): Node(editorNode) { +} + +void VectorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + VectorCurveOperation *operation = new VectorCurveOperation(); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + + operation->setCurveMapping((CurveMapping*)this->getbNode()->storage); + + graph->addOperation(operation); +} diff --git a/source/blender/compositor/nodes/COM_VectorCurveNode.h b/source/blender/compositor/nodes/COM_VectorCurveNode.h new file mode 100644 index 00000000000..e18dac54c2c --- /dev/null +++ b/source/blender/compositor/nodes/COM_VectorCurveNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_VectorCurveNode_h_ +#define _COM_VectorCurveNode_h_ + +#include "COM_Node.h" + +/** + * @brief VectorCurveNode + * @ingroup Node + */ +class VectorCurveNode: public Node { +public: + VectorCurveNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp new file mode 100644 index 00000000000..b5b15b2ba70 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ViewLevelsNode.h" +#include "DNA_scene_types.h" +#include "COM_ExecutionSystem.h" +#include "COM_CalculateMeanOperation.h" +#include "COM_CalculateStandardDeviationOperation.h" + +ViewLevelsNode::ViewLevelsNode(bNode *editorNode): Node(editorNode) { +} +void ViewLevelsNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket * input = this->getInputSocket(0); + bool firstOperationConnected = false; + if (input->isConnected()) { + OutputSocket* inputSocket= input->getConnection()->getFromSocket(); + // add preview to inputSocket; + + OutputSocket * socket = this->getOutputSocket(0); + if (socket->isConnected()) { + // calculate mean operation + CalculateMeanOperation * operation = new CalculateMeanOperation(); + input->relinkConnections(operation->getInputSocket(0), true, 0, graph); + firstOperationConnected = true; + operation->setSetting(this->getbNode()->custom1); + socket->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); + } + + socket = this->getOutputSocket(1); + if (socket->isConnected()) { + // calculate standard deviation operation + CalculateStandardDeviationOperation * operation = new CalculateStandardDeviationOperation(); + if (firstOperationConnected) { + addLink(graph, inputSocket, operation->getInputSocket(0)); + }else{ + input->relinkConnections(operation->getInputSocket(0), true, 0, graph); + } + operation->setSetting(this->getbNode()->custom1); + socket->relinkConnections(operation->getOutputSocket()); + graph->addOperation(operation); + } + } +} + diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.h b/source/blender/compositor/nodes/COM_ViewLevelsNode.h new file mode 100644 index 00000000000..9d6b764a2a9 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ViewLevelsNode_h_ +#define _COM_ViewLevelsNode_h_ + +#include "COM_Node.h" + +/** + * @brief ViewLevelsNode + * @ingroup Node + */ +class ViewLevelsNode: public Node { +public: + ViewLevelsNode(bNode *editorNode); + void convertToOperations(ExecutionSystem* graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp new file mode 100644 index 00000000000..0148fac47f9 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ViewerNode.h" +#include "BKE_global.h" + +#include "COM_ViewerOperation.h" +#include "COM_ExecutionSystem.h" + +ViewerNode::ViewerNode(bNode *editorNode): Node(editorNode) { +} + +void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { + InputSocket *imageSocket = this->getInputSocket(0); + InputSocket *alphaSocket = this->getInputSocket(1); + Image* image = (Image*)this->getbNode()->id; + ImageUser * imageUser = (ImageUser*) this->getbNode()->storage; + if (imageSocket->isConnected()) { + bNode* editorNode = this->getbNode(); + ViewerOperation *viewerOperation = new ViewerOperation(); + viewerOperation->setColorManagement( context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT); + viewerOperation->setColorPredivide( context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE); + viewerOperation->setbNodeTree(context->getbNodeTree()); + viewerOperation->setImage(image); + viewerOperation->setImageUser(imageUser); + viewerOperation->setActive(editorNode->flag & NODE_DO_OUTPUT); + viewerOperation->setChunkOrder((OrderOfChunks)editorNode->custom1); + viewerOperation->setCenterX(editorNode->custom3); + viewerOperation->setCenterY(editorNode->custom4); + imageSocket->relinkConnections(viewerOperation->getInputSocket(0), true, 0, graph); + alphaSocket->relinkConnections(viewerOperation->getInputSocket(1)); + graph->addOperation(viewerOperation); + addPreviewOperation(graph, viewerOperation->getInputSocket(0), 0); + } +} diff --git a/source/blender/compositor/nodes/COM_ViewerNode.h b/source/blender/compositor/nodes/COM_ViewerNode.h new file mode 100644 index 00000000000..59371f04e87 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ViewerNode.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ViewerNode_h +#define _COM_ViewerNode_h + +#include "COM_Node.h" +#include "DNA_node_types.h" +/** + * @brief ViewerNode + * @ingroup Node + */ +class ViewerNode : public Node { +public: + ViewerNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; +#endif diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.cpp b/source/blender/compositor/nodes/COM_ZCombineNode.cpp new file mode 100644 index 00000000000..be7b6ebdc45 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ZCombineNode.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ZCombineNode.h" + +#include "COM_ZCombineOperation.h" + +#include "COM_ExecutionSystem.h" +#include "COM_SetValueOperation.h" +#include "COM_MathBaseOperation.h" + +#include "DNA_material_types.h" // the ramp types + +void ZCombineNode::convertToOperations(ExecutionSystem* system, CompositorContext * context) { + if (this->getOutputSocket(0)->isConnected()) { + ZCombineOperation * operation = NULL; + if (this->getbNode()->custom1) { + operation = new ZCombineAlphaOperation(); + } else { + operation = new ZCombineOperation(); + } + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, system); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, system); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + system->addOperation(operation); + if (this->getOutputSocket(1)->isConnected()) { + MathMinimumOperation * zoperation = new MathMinimumOperation(); + addLink(system, operation->getInputSocket(1)->getConnection()->getFromSocket(), zoperation->getInputSocket(0)); + addLink(system, operation->getInputSocket(3)->getConnection()->getFromSocket(), zoperation->getInputSocket(1)); + this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); + system->addOperation(zoperation); + } + } else { + if (this->getOutputSocket(1)->isConnected()) { + MathMinimumOperation * zoperation = new MathMinimumOperation(); + this->getInputSocket(1)->relinkConnections(zoperation->getInputSocket(0), true, 1, system); + this->getInputSocket(3)->relinkConnections(zoperation->getInputSocket(1), true, 3, system); + this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); + system->addOperation(zoperation); + } + } +} diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.h b/source/blender/compositor/nodes/COM_ZCombineNode.h new file mode 100644 index 00000000000..0faf7df8725 --- /dev/null +++ b/source/blender/compositor/nodes/COM_ZCombineNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ZCombineNode_h +#define _COM_ZCombineNode_h + +#include "COM_Node.h" + +/** + * @brief ZCombineNode + * @ingroup Node + */ +class ZCombineNode: public Node { +public: + ZCombineNode(bNode* editorNode) :Node(editorNode) {} + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp new file mode 100644 index 00000000000..2dba9572ee8 --- /dev/null +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp @@ -0,0 +1,58 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_AlphaOverKeyOperation.h" + +AlphaOverKeyOperation::AlphaOverKeyOperation(): MixBaseOperation() { +} + +void AlphaOverKeyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputOverColor[4]; + float value[4]; + + inputValueOperation->read(value, x, y, sampler, inputBuffers); + inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); + inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); + + if(inputOverColor[3]<=0.0f) { + outputValue[0] = inputColor1[0]; + outputValue[1] = inputColor1[1]; + outputValue[2] = inputColor1[2]; + outputValue[3] = inputColor1[3]; + } + else if(value[0]==1.0f && inputOverColor[3]>=1.0f) { + outputValue[0] = inputOverColor[0]; + outputValue[1] = inputOverColor[1]; + outputValue[2] = inputOverColor[2]; + outputValue[3] = inputOverColor[3]; + } + else { + float premul= value[0]*inputOverColor[3]; + float mul= 1.0f - premul; + + outputValue[0]= (mul*inputColor1[0]) + premul*inputOverColor[0]; + outputValue[1]= (mul*inputColor1[1]) + premul*inputOverColor[1]; + outputValue[2]= (mul*inputColor1[2]) + premul*inputOverColor[2]; + outputValue[3]= (mul*inputColor1[3]) + value[0]*inputOverColor[3]; + } +} diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h new file mode 100644 index 00000000000..5ed99d0dbc6 --- /dev/null +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_AlphaOverKeyOperation_h +#define _COM_AlphaOverKeyOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class AlphaOverKeyOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + AlphaOverKeyOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp new file mode 100644 index 00000000000..9deb00ae71a --- /dev/null +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_AlphaOverMixedOperation.h" + +AlphaOverMixedOperation::AlphaOverMixedOperation(): MixBaseOperation() { + this->x = 0.0f; +} + +void AlphaOverMixedOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputOverColor[4]; + float value[4]; + + inputValueOperation->read(value, x, y, sampler, inputBuffers); + inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); + inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); + + if(inputOverColor[3]<=0.0f) { + outputValue[0] = inputColor1[0]; + outputValue[1] = inputColor1[1]; + outputValue[2] = inputColor1[2]; + outputValue[3] = inputColor1[3]; + } + else if(value[0]==1.0f && inputOverColor[3]>=1.0f) { + outputValue[0] = inputOverColor[0]; + outputValue[1] = inputOverColor[1]; + outputValue[2] = inputOverColor[2]; + outputValue[3] = inputOverColor[3]; + } + else { + float addfac= 1.0f - this->x + inputOverColor[3]*this->x; + float premul= value[0]*addfac; + float mul= 1.0f - value[0]*inputOverColor[3]; + + outputValue[0]= (mul*inputColor1[0]) + premul*inputOverColor[0]; + outputValue[1]= (mul*inputColor1[1]) + premul*inputOverColor[1]; + outputValue[2]= (mul*inputColor1[2]) + premul*inputOverColor[2]; + outputValue[3]= (mul*inputColor1[3]) + value[0]*inputOverColor[3]; + } +} + diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h new file mode 100644 index 00000000000..3ee5f243303 --- /dev/null +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_AlphaOverMixedOperation_h +#define _COM_AlphaOverMixedOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class AlphaOverMixedOperation : public MixBaseOperation { +private: + float x; +public: + /** + * Default constructor + */ + AlphaOverMixedOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void setX(float x) {this->x = x;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp new file mode 100644 index 00000000000..635a6308601 --- /dev/null +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_AlphaOverPremultiplyOperation.h" + +AlphaOverPremultiplyOperation::AlphaOverPremultiplyOperation(): MixBaseOperation() { +} + +void AlphaOverPremultiplyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputOverColor[4]; + float value[4]; + + inputValueOperation->read(value, x, y, sampler, inputBuffers); + inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); + inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); + + /* Zero alpha values should still permit an add of RGB data */ + if(inputOverColor[3]<0.0f) { + outputValue[0] = inputColor1[0]; + outputValue[1] = inputColor1[1]; + outputValue[2] = inputColor1[2]; + outputValue[3] = inputColor1[3]; + } + else if(value[0]==1.0f && inputOverColor[3]>=1.0f) { + outputValue[0] = inputOverColor[0]; + outputValue[1] = inputOverColor[1]; + outputValue[2] = inputOverColor[2]; + outputValue[3] = inputOverColor[3]; + } + else { + float mul= 1.0f - value[0]*inputOverColor[3]; + + outputValue[0]= (mul*inputColor1[0]) + value[0]*inputOverColor[0]; + outputValue[1]= (mul*inputColor1[1]) + value[0]*inputOverColor[1]; + outputValue[2]= (mul*inputColor1[2]) + value[0]*inputOverColor[2]; + outputValue[3]= (mul*inputColor1[3]) + value[0]*inputOverColor[3]; + } +} + diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h new file mode 100644 index 00000000000..4fc3b482942 --- /dev/null +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_AlphaOverPremultiplyOperation_h +#define _COM_AlphaOverPremultiplyOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class AlphaOverPremultiplyOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + AlphaOverPremultiplyOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_AntiAliasOperation.cpp b/source/blender/compositor/operations/COM_AntiAliasOperation.cpp new file mode 100644 index 00000000000..729d04c182e --- /dev/null +++ b/source/blender/compositor/operations/COM_AntiAliasOperation.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_AntiAliasOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" +extern "C" { + #include "RE_render_ext.h" +} + + +AntiAliasOperation::AntiAliasOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->valueReader = NULL; + this->buffer = NULL; + this->setComplex(true); +} +void AntiAliasOperation::initExecution() { + this->valueReader = this->getInputSocketReader(0); + NodeOperation::initMutex(); +} + +void AntiAliasOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { + if (y < 0 || y >= this->height || x < 0 || x >= this->width) { + color[0] = 0.0f; + } else { + int offset = y*this->width + x; + color[0] = buffer[offset]/255.0f; + } + +} + +void AntiAliasOperation::deinitExecution() { + this->valueReader = NULL; + if (this->buffer) { + delete buffer; + } + NodeOperation::deinitMutex(); +} + +bool AntiAliasOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti imageInput; + if (this->buffer) { + return false; + } else { + NodeOperation* operation = getInputOperation(0); + imageInput.xmax = operation->getWidth(); + imageInput.xmin = 0; + imageInput.ymax = operation->getHeight(); + imageInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&imageInput, readOperation, output) ) { + return true; + } + } + return false; +} + +void* AntiAliasOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + if (this->buffer) {return buffer;} + BLI_mutex_lock(getMutex()); + if (this->buffer == NULL) { + MemoryBuffer* tile = (MemoryBuffer*)valueReader->initializeTileData(rect, memoryBuffers); + int size = tile->getHeight()*tile->getWidth(); + float * input = tile->getBuffer(); + char* valuebuffer = new char[size]; + for (int i = 0 ; i < size ; i ++) { + float in = input[i* COM_NUMBER_OF_CHANNELS]; + if (in < 0.0f) { in = 0.0f;} + if (in > 1.0f) {in = 1.0f;} + valuebuffer[i] = in * 255; + } + antialias_tagbuf(tile->getWidth(), tile->getHeight(), valuebuffer); + this->buffer = valuebuffer; + } + BLI_mutex_unlock(getMutex()); + return this->buffer; +} diff --git a/source/blender/compositor/operations/COM_AntiAliasOperation.h b/source/blender/compositor/operations/COM_AntiAliasOperation.h new file mode 100644 index 00000000000..1b8b4c42ff9 --- /dev/null +++ b/source/blender/compositor/operations/COM_AntiAliasOperation.h @@ -0,0 +1,61 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_AntiAliasOperation_h +#define _COM_AntiAliasOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +/** + * @brief AntiAlias operations + * it only supports anti aliasing on BW buffers. + * @ingroup operation + */ +class AntiAliasOperation : public NodeOperation { +protected: + /** + * @brief Cached reference to the reader + */ + SocketReader * valueReader; + char *buffer; +public: + AntiAliasOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +}; +#endif diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp b/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp new file mode 100644 index 00000000000..5743b388705 --- /dev/null +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp @@ -0,0 +1,115 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BilateralBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +BilateralBlurOperation::BilateralBlurOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + + this->inputColorProgram = NULL; + this->inputDeterminatorProgram = NULL; +} + +void BilateralBlurOperation::initExecution() { + this->inputColorProgram = getInputSocketReader(0); + this->inputDeterminatorProgram = getInputSocketReader(1); + this->space = this->data->sigma_space + this->data->iter; + QualityStepHelper::initExecution(COM_QH_INCREASE); +} + +void BilateralBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + // read the determinator color at x, y, this will be used as the reference color for the determinator + float determinatorReferenceColor[4]; + float determinator[4]; + float tempColor[4]; + float blurColor[4]; + float blurDivider; + float space = this->space; + float sigmacolor = this->data->sigma_color; + int minx = floor(x - space); + int maxx = ceil(x + space); + int miny = floor(y - space); + int maxy = ceil(y + space); + float deltaColor; + this->inputDeterminatorProgram->read(determinatorReferenceColor, x, y, inputBuffers, data); + + blurColor[0] = 0.0f; + blurColor[1] = 0.0f; + blurColor[2] = 0.0f; + blurColor[3] = 0.0f; + blurDivider = 0.0f; + for (int yi = miny ; yi < maxy ; yi+=QualityStepHelper::getStep()) { + for (int xi = minx ; xi < maxx ; xi+=QualityStepHelper::getStep()) { + // read determinator + this->inputDeterminatorProgram->read(determinator, xi, yi, inputBuffers, data); + deltaColor = fabsf(determinatorReferenceColor[0] - determinator[0])+ + fabsf(determinatorReferenceColor[1] - determinator[1])+ + fabsf(determinatorReferenceColor[2] - determinator[2]); // do not take the alpha channel into account + if (deltaColor< sigmacolor) { + // add this to the blur + this->inputColorProgram->read(tempColor, xi, yi, inputBuffers, data); + blurColor[0]+=tempColor[0]; + blurColor[1]+=tempColor[1]; + blurColor[2]+=tempColor[2]; + blurColor[3]+=tempColor[3]; + blurDivider += 1.0f; + } + } + } + + if (blurDivider > 0.0f) { + color[0] = blurColor[0]/blurDivider; + color[1] = blurColor[1]/blurDivider; + color[2] = blurColor[2]/blurDivider; + color[3] = blurColor[3]/blurDivider; + } else { + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 1.0f; + } +} + +void BilateralBlurOperation::deinitExecution() { + this->inputColorProgram = NULL; + this->inputDeterminatorProgram = NULL; +} + +bool BilateralBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + int add = ceil(this->space)+1; + + newInput.xmax = input->xmax + (add); + newInput.xmin = input->xmin - (add); + newInput.ymax = input->ymax + (add); + newInput.ymin = input->ymin - (add); + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.h b/source/blender/compositor/operations/COM_BilateralBlurOperation.h new file mode 100644 index 00000000000..295797fb0b8 --- /dev/null +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehBilateralBlurOperation_h +#define _COM_BilateralBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_QualityStepHelper.h" + +class BilateralBlurOperation : public NodeOperation, public QualityStepHelper { +private: + SocketReader* inputColorProgram; + SocketReader* inputDeterminatorProgram; + NodeBilateralBlurData* data; + float space; + +public: + BilateralBlurOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + void setData(NodeBilateralBlurData *data) {this->data = data;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp new file mode 100644 index 00000000000..b18c0762c1a --- /dev/null +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp @@ -0,0 +1,102 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BlurBaseOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +BlurBaseOperation::BlurBaseOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + this->inputProgram = NULL; + this->data = NULL; + this->size = 1.0f; + this->deleteData = false; +} +void BlurBaseOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); + this->inputSize = this->getInputSocketReader(1); + this->data->image_in_width= this->getWidth(); + this->data->image_in_height= this->getHeight(); + if(this->data->relative) { + switch (this->data->aspect) { + case CMP_NODE_BLUR_ASPECT_NONE: + this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_width); + this->data->sizey= (int)(this->data->percenty*0.01f*this->data->image_in_height); + break; + case CMP_NODE_BLUR_ASPECT_Y: + this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_width); + this->data->sizey= (int)(this->data->percenty*0.01f*this->data->image_in_width); + break; + case CMP_NODE_BLUR_ASPECT_X: + this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_height); + this->data->sizey= (int)(this->data->percenty*0.01f*this->data->image_in_height); + break; + } + } + + QualityStepHelper::initExecution(COM_QH_MULTIPLY); + +} + +float* BlurBaseOperation::make_gausstab(int rad) +{ + float *gausstab, sum, val; + int i, n; + + n = 2 * rad + 1; + + gausstab = new float[n]; + + sum = 0.0f; + for (i = -rad; i <= rad; i++) { + val= RE_filter_value(this->data->filtertype, (float)i/(float)rad); + sum += val; + gausstab[i+rad] = val; + } + + sum= 1.0f/sum; + for(i=0; iinputProgram = NULL; + this->inputSize = NULL; + if (this->deleteData) { + delete this->data; + } + this->data = NULL; +} + +void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers){ + float result[4]; + this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, memoryBuffers); + this->size = result[0]; +} diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.h b/source/blender/compositor/operations/COM_BlurBaseOperation.h new file mode 100644 index 00000000000..3eb36f29865 --- /dev/null +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.h @@ -0,0 +1,58 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BlurBaseOperation_h +#define _COM_BlurBaseOperation_h +#include "COM_NodeOperation.h" +#include "COM_QualityStepHelper.h" + +class BlurBaseOperation : public NodeOperation, public QualityStepHelper { +private: + +protected: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputProgram; + SocketReader* inputSize; + NodeBlurData * data; + BlurBaseOperation(); + float* make_gausstab(int rad); + float size; + bool deleteData; + void updateSize(MemoryBuffer **memoryBuffers); +public: + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeBlurData* data) {this->data= data;} + + void deleteDataWhenFinished() {this->deleteData = true;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.cpp b/source/blender/compositor/operations/COM_BokehBlurOperation.cpp new file mode 100644 index 00000000000..31345dbaeff --- /dev/null +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.cpp @@ -0,0 +1,159 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BokehBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +BokehBlurOperation::BokehBlurOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + + this->size = .01; + + this->inputProgram = NULL; + this->inputBokehProgram = NULL; + this->inputBoundingBoxReader = NULL; +} + +void* BokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void BokehBlurOperation::initExecution() { + this->inputProgram = getInputSocketReader(0); + this->inputBokehProgram = getInputSocketReader(1); + this->inputBoundingBoxReader = getInputSocketReader(2); + + int width = inputBokehProgram->getWidth(); + int height = inputBokehProgram->getHeight(); + + float dimension; + if (widthbokehMidX = width/2.0f; + this->bokehMidY = height/2.0f; + this->bokehDimension = dimension/2.0f; + QualityStepHelper::initExecution(COM_QH_INCREASE); +} + +void BokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float tempColor[4]; + float tempBoundingBox[4]; + float bokeh[4]; + + inputBoundingBoxReader->read(tempBoundingBox, x, y, COM_PS_NEAREST, inputBuffers); + if (tempBoundingBox[0] >0.0f) { + tempColor[0] = 0; + tempColor[1] = 0; + tempColor[2] = 0; + tempColor[3] = 0; + float overallmultiplyerr = 0; + float overallmultiplyerg = 0; + float overallmultiplyerb = 0; + MemoryBuffer* inputBuffer = (MemoryBuffer*)data; + float* buffer = inputBuffer->getBuffer(); + int bufferwidth = inputBuffer->getWidth(); + int bufferstartx = inputBuffer->getRect()->xmin; + int bufferstarty = inputBuffer->getRect()->ymin; + int pixelSize = this->size*this->getWidth(); + + int miny = y - pixelSize; + int maxy = y + pixelSize; + int minx = x - pixelSize; + int maxx = x + pixelSize; + miny = max(miny, inputBuffer->getRect()->ymin); + minx = max(minx, inputBuffer->getRect()->xmin); + maxy = min(maxy, inputBuffer->getRect()->ymax); + maxx = min(maxx, inputBuffer->getRect()->xmax); + + int step = getStep(); + int offsetadd = getOffsetAdd(); + + float m = this->bokehDimension/pixelSize; + for (int ny = miny ; ny < maxy ; ny +=step) { + int bufferindex = ((minx - bufferstartx)*4)+((ny-bufferstarty)*4*bufferwidth); + for (int nx = minx ; nx < maxx ; nx +=step) { + float u = this->bokehMidX - (nx-x) *m; + float v = this->bokehMidY - (ny-y) *m; + inputBokehProgram->read(bokeh, u, v, COM_PS_NEAREST, inputBuffers); + tempColor[0] += bokeh[0] * buffer[bufferindex]; + tempColor[1] += bokeh[1] * buffer[bufferindex+1]; + tempColor[2] += bokeh[2]* buffer[bufferindex+2]; + overallmultiplyerr += bokeh[0]; + overallmultiplyerg += bokeh[1]; + overallmultiplyerb += bokeh[2]; + bufferindex +=offsetadd; + } + } + color[0] = tempColor[0]*(1.0/overallmultiplyerr); + color[1] = tempColor[1]*(1.0/overallmultiplyerg); + color[2] = tempColor[2]*(1.0/overallmultiplyerb); + color[3] = 1.0f; + } else { + inputProgram->read(color, x, y, COM_PS_NEAREST, inputBuffers); + } +} + +void BokehBlurOperation::deinitExecution() { + this->inputProgram = NULL; + this->inputBokehProgram = NULL; + this->inputBoundingBoxReader = NULL; +} + +bool BokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + rcti bokehInput; + + newInput.xmax = input->xmax + (size*this->getWidth()); + newInput.xmin = input->xmin - (size*this->getWidth()); + newInput.ymax = input->ymax + (size*this->getWidth()); + newInput.ymin = input->ymin - (size*this->getWidth()); + + NodeOperation* operation = getInputOperation(1); + bokehInput.xmax = operation->getWidth(); + bokehInput.xmin = 0; + bokehInput.ymax = operation->getHeight(); + bokehInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&bokehInput, readOperation, output) ) { + return true; + } + operation = getInputOperation(0); + if (operation->determineDependingAreaOfInterest(&newInput, readOperation, output) ) { + return true; + } + operation = getInputOperation(2); + if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) { + return true; + } + return false; +} diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.h b/source/blender/compositor/operations/COM_BokehBlurOperation.h new file mode 100644 index 00000000000..c782c421966 --- /dev/null +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.h @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehBokehBlurOperation_h +#define _COM_BokehBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_QualityStepHelper.h" + +class BokehBlurOperation : public NodeOperation, public QualityStepHelper { +private: + SocketReader* inputProgram; + SocketReader* inputBokehProgram; + SocketReader* inputBoundingBoxReader; + float size; + float bokehMidX; + float bokehMidY; + float bokehDimension; +public: + BokehBlurOperation(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + void setSize(float size) {this->size = size;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cpp b/source/blender/compositor/operations/COM_BokehImageOperation.cpp new file mode 100644 index 00000000000..3286217e71d --- /dev/null +++ b/source/blender/compositor/operations/COM_BokehImageOperation.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BokehImageOperation.h" +#include "BLI_math.h" + +BokehImageOperation::BokehImageOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_COLOR); + this->deleteData = false; +} +void BokehImageOperation::initExecution() { + this->centerX = getWidth() / 2; + this->centerY = getHeight() / 2; + this->center[0] = this->centerX; + this->center[1] = this->centerY; + this->inverseRounding = 1.0-this->data->rounding; + this->circularDistance = getWidth()/2; + this->flapRad = (M_PI*2)/this->data->flaps; + this->flapRadAdd = (this->data->angle/360.0)*M_PI*2; + if (this->flapRadAdd>M_PI) { + this->flapRadAdd-=M_PI*2; + } +} +void BokehImageOperation::detemineStartPointOfFlap(float r[2], int flapNumber, float distance) { + r[0] = sin(flapRad*flapNumber + flapRadAdd)*distance+centerX; + r[1] = cos(flapRad*flapNumber + flapRadAdd)*distance+centerY; +} +float BokehImageOperation::isInsideBokeh(float distance, float x, float y) { + float insideBokeh = 0.0; + const float deltaX = x - centerX; + const float deltaY = y - centerY; + float closestPoint[2]; + float lineP1[2]; + float lineP2[2]; + float point[2]; + point[0] = x; + point[1] = y; + + const float distanceToCenter = len_v2v2(point, center); + const float bearing = (atan2f(deltaX, deltaY) + (M_PI*2)); + int flapNumber = (int)((bearing-flapRadAdd)/flapRad); + + detemineStartPointOfFlap(lineP1, flapNumber, distance); + detemineStartPointOfFlap(lineP2, flapNumber+1, distance); + closest_to_line_v2(closestPoint, point, lineP1, lineP2); + + const float distanceLineToCenter = len_v2v2(center, closestPoint); + const float distanceRoundingToCenter = inverseRounding*distanceLineToCenter+this->data->rounding*distance; + + const float catadioptricDistanceToCenter = distanceRoundingToCenter*this->data->catadioptric; + if (distanceRoundingToCenter>=distanceToCenter && catadioptricDistanceToCenter<=distanceToCenter) { + if (distanceRoundingToCenter-distanceToCenter<1.0) { + insideBokeh = (distanceRoundingToCenter-distanceToCenter); + } else if (this->data->catadioptric != 0.0 && distanceToCenter-catadioptricDistanceToCenter<1.0) { + insideBokeh = (distanceToCenter-catadioptricDistanceToCenter); + } else { + insideBokeh = 1.0; + } + } + return insideBokeh; +} +void BokehImageOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float shift = this->data->lensshift; + float shift2 = shift/2.0f; + float distance = this->circularDistance; + float insideBokehMax = isInsideBokeh(distance, x, y); + float insideBokehMed = isInsideBokeh(distance-fabs(shift2*distance), x, y); + float insideBokehMin = isInsideBokeh(distance-fabs(shift*distance), x, y); + if (shift<0) { + color[0] = insideBokehMax; + color[1] = insideBokehMed; + color[2] = insideBokehMin; + } else { + color[0] = insideBokehMin; + color[1] = insideBokehMed; + color[2] = insideBokehMax; + } + color[3] = 1.0f; +} + +void BokehImageOperation::deinitExecution() { + if (deleteData) { + if (data) { + delete data; + data = NULL; + } + } +} + +void BokehImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + resolution[0] = 512; + resolution[1] = 512; +} diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h new file mode 100644 index 00000000000..3089ca6f12e --- /dev/null +++ b/source/blender/compositor/operations/COM_BokehImageOperation.h @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehImageOperation_h +#define _COM_BokehImageOperation_h +#include "COM_NodeOperation.h" + + +class BokehImageOperation : public NodeOperation { +private: + NodeBokehImage *data; + + float center[2]; + float centerX; + float centerY; + float inverseRounding; + float circularDistance; + float flapRad; + float flapRadAdd; + + bool deleteData; + + void detemineStartPointOfFlap(float r[2], int flapNumber, float distance); + float isInsideBokeh(float distance, float x, float y); +public: + BokehImageOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + void setData(NodeBokehImage *data) {this->data = data;} + void deleteDataOnFinish() {this->deleteData = true;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.cpp b/source/blender/compositor/operations/COM_BoxMaskOperation.cpp new file mode 100644 index 00000000000..44157051089 --- /dev/null +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.cpp @@ -0,0 +1,110 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BoxMaskOperation.h" +#include "BLI_math.h" +#include "DNA_node_types.h" + +BoxMaskOperation::BoxMaskOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputMask = NULL; + this->inputValue = NULL; + this->cosine = 0.0f; + this->sine = 0.0f; +} +void BoxMaskOperation::initExecution() { + this->inputMask = this->getInputSocketReader(0); + this->inputValue = this->getInputSocketReader(1); + const double rad = DEG2RAD(this->data->rotation); + this->cosine = cos(rad); + this->sine = sin(rad); + this->aspectRatio = ((float)this->getWidth())/this->getHeight(); +} + +void BoxMaskOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputMask[4]; + float inputValue[4]; + + float rx = x/this->getWidth(); + float ry = y/this->getHeight(); + + const float dy = (ry - this->data->y)/this->aspectRatio; + const float dx = rx - this->data->x; + rx = this->data->x+(this->cosine*dx + this->sine*dy); + ry = this->data->y+(-this->sine*dx + this->cosine*dy); + + this->inputMask->read(inputMask, x, y, sampler, inputBuffers); + this->inputValue->read(inputValue, x, y, sampler, inputBuffers); + + float halfHeight = (this->data->height)/2.0f; + float halfWidth = this->data->width/2.0f; + bool inside = rx > this->data->x-halfWidth + && rx < this->data->x+halfWidth + && ry > this->data->y-halfHeight + && ry < this->data->y+halfHeight; + + switch (this->maskType) { + case CMP_NODE_MASKTYPE_ADD: + if (inside) { + color[0] = max(inputMask[0],inputValue[0]); + } else { + color[0] = inputMask[0]; + } + break; + case CMP_NODE_MASKTYPE_SUBTRACT: + if (inside) { + color[0] = inputMask[0]-inputValue[0]; + CLAMP(color[0], 0, 1); + } else { + color[0] = inputMask[0]; + } + break; + case CMP_NODE_MASKTYPE_MULTIPLY: + if (inside) { + color[0] = inputMask[0]*inputValue[0]; + } else { + color[0] = 0; + } + break; + case CMP_NODE_MASKTYPE_NOT: + if (inside) { + if (inputMask[0]>0.0f) { + color[0] = 0; + } else { + color[0] = inputValue[0]; + } + } else { + color[0] = inputMask[0]; + } + break; + } + + +} + +void BoxMaskOperation::deinitExecution() { + this->inputMask = NULL; + this->inputValue = NULL; +} + diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.h b/source/blender/compositor/operations/COM_BoxMaskOperation.h new file mode 100644 index 00000000000..3436eec8b4c --- /dev/null +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.h @@ -0,0 +1,65 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BoxMaskOperation_h +#define _COM_BoxMaskOperation_h +#include "COM_NodeOperation.h" + + +class BoxMaskOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputMask; + SocketReader * inputValue; + + float sine; + float cosine; + float aspectRatio; + int maskType; + + NodeBoxMask *data; +public: + BoxMaskOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeBoxMask *data) {this->data = data;} + + void setMaskType(int maskType) {this->maskType = maskType;} + +}; +#endif diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.cpp b/source/blender/compositor/operations/COM_BrightnessOperation.cpp new file mode 100644 index 00000000000..bb481f71cc1 --- /dev/null +++ b/source/blender/compositor/operations/COM_BrightnessOperation.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_BrightnessOperation.h" + +BrightnessOperation::BrightnessOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; +} +void BrightnessOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); + this->inputBrightnessProgram = this->getInputSocketReader(1); + this->inputContrastProgram = this->getInputSocketReader(2); +} + +void BrightnessOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + float a, b; + float inputBrightness[4]; + float inputContrast[4]; + this->inputProgram->read(inputValue, x, y, sampler, inputBuffers); + this->inputBrightnessProgram->read(inputBrightness, x, y, sampler, inputBuffers); + this->inputContrastProgram->read(inputContrast, x, y, sampler, inputBuffers); + float brightness = inputBrightness[0]; + float contrast = inputContrast[0]; + brightness /= 100.0f; + float delta = contrast / 200.0f; + a = 1.0f - delta * 2.0f; + /* + * The algorithm is by Werner D. Streidt + * (http://visca.com/ffactory/archives/5-99/msg00021.html) + * Extracted of OpenCV demhist.c + */ + if( contrast > 0 ) + { + a = 1.0f / a; + b = a * (brightness - delta); + } + else + { + delta *= -1; + b = a * (brightness + delta); + } + + color[0] = a*inputValue[0]+b; + color[1] = a*inputValue[1]+b; + color[2] = a*inputValue[2]+b; + color[3] = inputValue[3]; +} + +void BrightnessOperation::deinitExecution() { + this->inputProgram = NULL; + this->inputBrightnessProgram = NULL; + this->inputContrastProgram = NULL; +} + diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.h b/source/blender/compositor/operations/COM_BrightnessOperation.h new file mode 100644 index 00000000000..60666098bc1 --- /dev/null +++ b/source/blender/compositor/operations/COM_BrightnessOperation.h @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BrightnessOperation_h +#define _COM_BrightnessOperation_h +#include "COM_NodeOperation.h" + + +class BrightnessOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + SocketReader * inputBrightnessProgram; + SocketReader* inputContrastProgram; + +public: + BrightnessOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp new file mode 100644 index 00000000000..062e7fc69fe --- /dev/null +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp @@ -0,0 +1,122 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CalculateMeanOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + + + +CalculateMeanOperation::CalculateMeanOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->addOutputSocket(COM_DT_VALUE); + this->imageReader = NULL; + this->iscalculated = false; + this->setting = 1; + this->setComplex(true); +} +void CalculateMeanOperation::initExecution() { + this->imageReader = this->getInputSocketReader(0); + this->iscalculated = false; + NodeOperation::initMutex(); +} + +void CalculateMeanOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { + color[0] = this->result; +} + +void CalculateMeanOperation::deinitExecution() { + this->imageReader = NULL; + NodeOperation::deinitMutex(); +} + +bool CalculateMeanOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti imageInput; + if (iscalculated) { + return false; + } + NodeOperation* operation = getInputOperation(0); + imageInput.xmax = operation->getWidth(); + imageInput.xmin = 0; + imageInput.ymax = operation->getHeight(); + imageInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&imageInput, readOperation, output) ) { + return true; + } + return false; +} + +void* CalculateMeanOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + BLI_mutex_lock(getMutex()); + if (!this->iscalculated) { + MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + calculateMean(tile); + this->iscalculated = true; + } + BLI_mutex_unlock(getMutex()); + return NULL; +} + +void CalculateMeanOperation::calculateMean(MemoryBuffer * tile) { + this->result = 0.0f; + float* buffer = tile->getBuffer(); + int size = tile->getWidth()*tile->getHeight(); + int pixels = 0; + float sum; + for (int i = 0, offset = 0 ; i < size ; i ++, offset +=4) { + if (buffer[offset+3] > 0) { + pixels ++; + + switch(this->setting) + { + case 1: + { + sum += buffer[offset]*0.35f + buffer[offset+1]*0.45f + buffer[offset+2]*0.2f; + break; + } + case 2: + { + sum+= buffer[offset]; + break; + } + case 3: + { + sum+= buffer[offset+1]; + break; + } + case 4: + { + sum+= buffer[offset+2]; + break; + } + case 5: + { + float yuv[3]; + rgb_to_yuv(buffer[offset], buffer[offset+1], buffer[offset+2], &yuv[0], &yuv[1], &yuv[2]); + sum+=yuv[0]; + break; + } + } + } + } + this->result = sum / pixels; +} diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.h b/source/blender/compositor/operations/COM_CalculateMeanOperation.h new file mode 100644 index 00000000000..e77b864c5c8 --- /dev/null +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.h @@ -0,0 +1,69 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CalculateMeanOperation_h +#define _COM_CalculateMeanOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +/** + * @brief base class of CalculateMean, implementing the simple CalculateMean + * @ingroup operation + */ +class CalculateMeanOperation : public NodeOperation { +protected: + /** + * @brief Cached reference to the reader + */ + SocketReader * imageReader; + + bool iscalculated; + float result; + int setting; + +public: + CalculateMeanOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void setSetting(int setting) {this->setting = setting;} + +protected: + void calculateMean(MemoryBuffer* tile); +}; +#endif diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp new file mode 100644 index 00000000000..4cd990e417e --- /dev/null +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CalculateStandardDeviationOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + + + +CalculateStandardDeviationOperation::CalculateStandardDeviationOperation(): CalculateMeanOperation() { +} + +void CalculateStandardDeviationOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { + color[0] = this->standardDeviation; +} + +void* CalculateStandardDeviationOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + BLI_mutex_lock(getMutex()); + if (!this->iscalculated) { + MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + CalculateMeanOperation::calculateMean(tile); + this->standardDeviation = 0.0f; + float* buffer = tile->getBuffer(); + int size = tile->getWidth()*tile->getHeight(); + int pixels = 0; + float sum; + float mean = this->result; + for (int i = 0, offset = 0 ; i < size ; i ++, offset +=4) { + if (buffer[offset+3] > 0) { + pixels ++; + + switch(this->setting) + { + case 1: + { + float value = buffer[offset]*0.35f + buffer[offset+1]*0.45f + buffer[offset+2]*0.2f; + sum+=(value-mean)*(value-mean); + break; + } + case 2: + { + float value = buffer[offset]; + sum+=value; + sum+=(value-mean)*(value-mean); + break; + } + case 3: + { + float value = buffer[offset+1]; + sum+=value; + sum+=(value-mean)*(value-mean); + break; + } + case 4: + { + float value = buffer[offset+2]; + sum+=value; + sum+=(value-mean)*(value-mean); + } + case 5: + { + float yuv[3]; + rgb_to_yuv(buffer[offset], buffer[offset+1], buffer[offset+2], &yuv[0], &yuv[1], &yuv[2]); + sum+=(yuv[0]-mean)*(yuv[0]-mean); + break; + } + } + } + } + this->standardDeviation = sqrt(sum / (float)(pixels-1)); + this->iscalculated = true; + } + BLI_mutex_unlock(getMutex()); + return NULL; +} diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h new file mode 100644 index 00000000000..9da8823acd1 --- /dev/null +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CalculateStandardDeviationOperation_h +#define _COM_CalculateStandardDeviationOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" +#include "COM_CalculateMeanOperation.h" +/** + * @brief base class of CalculateStandardDeviation, implementing the simple CalculateStandardDeviation + * @ingroup operation + */ +class CalculateStandardDeviationOperation : public CalculateMeanOperation { +protected: + float standardDeviation; + +public: + CalculateStandardDeviationOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp b/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp new file mode 100644 index 00000000000..fd2bd3991ec --- /dev/null +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ChangeHSVOperation.h" + +ChangeHSVOperation::ChangeHSVOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ChangeHSVOperation::initExecution() { + this->inputOperation = getInputSocketReader(0); +} + +void ChangeHSVOperation::deinitExecution() { + this->inputOperation = NULL; +} + +void ChangeHSVOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + + inputOperation->read(inputColor1, x, y, sampler, inputBuffers); + + outputValue[0] = inputColor1[0] + (this->hue - 0.5f); + if (outputValue[0]>1.0f) outputValue[0]-=1.0; else if(outputValue[0]<0.0) outputValue[0]+= 1.0; + outputValue[1] = inputColor1[1] * this->saturation; + outputValue[2] = inputColor1[2] * this->value; + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.h b/source/blender/compositor/operations/COM_ChangeHSVOperation.h new file mode 100644 index 00000000000..8adae8e8ce7 --- /dev/null +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ChangeHSVOperation_h +#define _COM_ChangeHSVOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ChangeHSVOperation : public NodeOperation { +private: + SocketReader * inputOperation; + + float hue; + float saturation; + float value; + +public: + /** + * Default constructor + */ + ChangeHSVOperation(); + + void initExecution(); + void deinitExecution(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void setHue(float hue) {this->hue = hue;} + void setSaturation(float saturation) {this->saturation = saturation;} + void setValue(float value) {this->value = value;} + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp b/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp new file mode 100644 index 00000000000..b595aca3c46 --- /dev/null +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ChannelMatteOperation.h" +#include "BLI_math.h" + +ChannelMatteOperation::ChannelMatteOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addOutputSocket(COM_DT_VALUE); + + inputImageProgram = NULL; +} + +void ChannelMatteOperation::initExecution() { + this->inputImageProgram = this->getInputSocketReader(0); + + this->limit_range = this->limit_max - this->limit_min; + + switch (this->limit_method) { + /* SINGLE */ + case 0: { + /* 123 / RGB / HSV / YUV / YCC */ + const int matte_channel=this->matte_channel-1; + const int limit_channel=this->limit_channel-1; + this->ids[0] = matte_channel; + this->ids[1] = limit_channel; + this->ids[2] = limit_channel; + break; + } + /* MAX */ + case 1: { + switch (this->matte_channel) { + case 1: { + this->ids[0] = 0; + this->ids[1] = 1; + this->ids[2] = 2; + break; + } + case 2: { + this->ids[0] = 1; + this->ids[1] = 0; + this->ids[2] = 2; + break; + } + case 3: { + this->ids[0] = 2; + this->ids[1] = 0; + this->ids[2] = 1; + break; + } + default: + break; + } + break; + } + default: + break; + } +} + +void ChannelMatteOperation::deinitExecution() { + this->inputImageProgram= NULL; +} + +void ChannelMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inColor[4]; + float alpha; + + const float limit_max = this->limit_max; + const float limit_min = this->limit_min; + const float limit_range = this->limit_range; + + this->inputImageProgram->read(inColor, x, y, sampler, inputBuffers); + + /* matte operation */ + alpha = inColor[this->ids[0]] - max(inColor[this->ids[1]], inColor[this->ids[2]]); + + /* flip because 0.0 is transparent, not 1.0 */ + alpha = 1.f - alpha; + + /* test range*/ + if(alpha > limit_max) { + alpha = inColor[3]; /*whatever it was prior */ + } + else if(alpha < limit_min){ + alpha = 0.f; + } + else {/*blend */ + alpha = (alpha - limit_min) / limit_range; + } + + /* store matte(alpha) value in [0] to go with + * COM_SetAlphaOperation and the Value output + */ + + /* don't make something that was more transparent less transparent */ + outputValue[0] = min(alpha, inColor[3]); +} + diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.h b/source/blender/compositor/operations/COM_ChannelMatteOperation.h new file mode 100644 index 00000000000..33e502fe565 --- /dev/null +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.h @@ -0,0 +1,76 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ChannelMatteOperation_h +#define _COM_ChannelMatteOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ChannelMatteOperation : public NodeOperation { +private: + SocketReader *inputImageProgram; + + int color_space; /* node->custom1 */ + int matte_channel; /* node->custom2 */ + int limit_method; /* node->algorithm */ + int limit_channel; /* node->channel */ + float limit_max; /* node->storage->t1 */ + float limit_min; /* node->storage->t2 */ + + float limit_range; + + /** ids to use for the operations (max and simple) + * alpha = in[ids[0]] - max(in[ids[1]], in[ids[2]]) + * the simple operation is using: + * alpha = in[ids[0]] - in[ids[1]] + * but to use the same formula and operation for both we do: + * ids[2] = ids[1] + * alpha = in[ids[0]] - max(in[ids[1]], in[ids[2]]) + */ + int ids[3]; +public: + /** + * Default constructor + */ + ChannelMatteOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setSettings(NodeChroma* nodeChroma, const int custom2) + { + this->limit_max = nodeChroma->t1; + this->limit_min = nodeChroma->t2; + this->limit_method = nodeChroma->algorithm; + this->limit_channel = nodeChroma->channel; + this->matte_channel = custom2; + } +}; +#endif diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp new file mode 100644 index 00000000000..8e793f08a3b --- /dev/null +++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ChromaMatteOperation.h" +#include "BLI_math.h" + +ChromaMatteOperation::ChromaMatteOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addInputSocket(COM_DT_COLOR); + addOutputSocket(COM_DT_VALUE); + + inputImageProgram = NULL; + inputKeyProgram = NULL; +} + +void ChromaMatteOperation::initExecution() { + this->inputImageProgram = this->getInputSocketReader(0); + this->inputKeyProgram = this->getInputSocketReader(1); +} + +void ChromaMatteOperation::deinitExecution() { + this->inputImageProgram= NULL; + this->inputKeyProgram= NULL; +} + +void ChromaMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inKey[4]; + float inImage[4]; + + const float acceptance = this->settings->t1; /* in radians */ + const float cutoff = this->settings->t2; /* in radians */ + const float gain = this->settings->fstrength; + + float x_angle, z_angle, alpha; + float theta, beta; + float kfg; + + this->inputKeyProgram->read(inKey, x, y, sampler, inputBuffers); + this->inputImageProgram->read(inImage, x, y, sampler, inputBuffers); + + /* store matte(alpha) value in [0] to go with + * COM_SetAlphaOperation and the Value output + */ + + /* Algorithm from book "Video Demistified," does not include the spill reduction part */ + /* find theta, the angle that the color space should be rotated based on key*/ + theta=atan2(inKey[2], inKey[1]); + + /*rotate the cb and cr into x/z space */ + x_angle=inImage[1]*cosf(theta)+inImage[2]*sinf(theta); + z_angle=inImage[2]*cosf(theta)-inImage[1]*sinf(theta); + + /*if within the acceptance angle */ + /* if kfg is <0 then the pixel is outside of the key color */ + kfg= x_angle-(fabsf(z_angle)/tanf(acceptance/2.f)); + + if(kfg>0.f) { /* found a pixel that is within key color */ + alpha=(1.f-kfg)*(gain); + + beta=atan2(z_angle,x_angle); + + /* if beta is within the cutoff angle */ + if(fabsf(beta) < (cutoff/2.f)) { + alpha=0.f; + } + + /* don't make something that was more transparent less transparent */ + if (alphasettings= nodeChroma;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp new file mode 100644 index 00000000000..317d84b0299 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorBalanceASCCDLOperation.h" +#include "BLI_math.h" + +inline float colorbalance_cdl(float in, float offset, float power, float slope) +{ + float x = in * slope + offset; + + /* prevent NaN */ + CLAMP(x, 0.0, 1.0); + + return powf(x, power); +} + +ColorBalanceASCCDLOperation::ColorBalanceASCCDLOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputValueOperation = NULL; + this->inputColorOperation = NULL; + this->setResolutionInputSocketIndex(1); +} + +void ColorBalanceASCCDLOperation::initExecution() { + this->inputValueOperation = this->getInputSocketReader(0); + this->inputColorOperation = this->getInputSocketReader(1); +} + +void ColorBalanceASCCDLOperation::executePixel(float* outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + float value[4]; + + inputValueOperation->read(value, x, y, sampler, inputBuffers); + inputColorOperation->read(inputColor, x, y, sampler, inputBuffers); + + float fac = value[0]; + fac = min(1.0f, fac); + const float mfac= 1.0f - fac; + + outputColor[0] = mfac*inputColor[0] + fac * colorbalance_cdl(inputColor[0], this->lift[0], this->gamma[0], this->gain[0]); + outputColor[1] = mfac*inputColor[1] + fac * colorbalance_cdl(inputColor[1], this->lift[1], this->gamma[1], this->gain[1]); + outputColor[2] = mfac*inputColor[2] + fac * colorbalance_cdl(inputColor[2], this->lift[2], this->gamma[2], this->gain[2]); + outputColor[3] = inputColor[3]; + +} + +void ColorBalanceASCCDLOperation::deinitExecution() { + this->inputValueOperation = NULL; + this->inputColorOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h new file mode 100644 index 00000000000..a7e9680c98d --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h @@ -0,0 +1,81 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorBalanceASCCDLOperation_h +#define _COM_ColorBalanceASCCDLOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ColorBalanceASCCDLOperation : public NodeOperation { +protected: + /** + * Prefetched reference to the inputProgram + */ + SocketReader * inputValueOperation; + SocketReader * inputColorOperation; + + float gain[3]; + float lift[3]; + float gamma[3]; + +public: + /** + * Default constructor + */ + ColorBalanceASCCDLOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setGain(float gain[3]) { + this->gain[0] = gain[0]; + this->gain[1] = gain[1]; + this->gain[2] = gain[2]; + } + void setLift(float lift[3]) { + this->lift[0] = lift[0]; + this->lift[1] = lift[1]; + this->lift[2] = lift[2]; + } + void setGamma(float gamma[3]) { + this->gamma[0] = gamma[0]; + this->gamma[1] = gamma[1]; + this->gamma[2] = gamma[2]; + } +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp new file mode 100644 index 00000000000..b853c28136f --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorBalanceLGGOperation.h" +#include "BLI_math.h" + + +inline float colorbalance_lgg(float in, float lift_lgg, float gamma_inv, float gain) +{ + /* 1:1 match with the sequencer with linear/srgb conversions, the conversion isnt pretty + * but best keep it this way, sice testing for durian shows a similar calculation + * without lin/srgb conversions gives bad results (over-saturated shadows) with colors + * slightly below 1.0. some correction can be done but it ends up looking bad for shadows or lighter tones - campbell */ + float x= (((linearrgb_to_srgb(in) - 1.0f) * lift_lgg) + 1.0f) * gain; + + /* prevent NaN */ + if (x < 0.f) x = 0.f; + + return powf(srgb_to_linearrgb(x), gamma_inv); +} + +ColorBalanceLGGOperation::ColorBalanceLGGOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputValueOperation = NULL; + this->inputColorOperation = NULL; + this->setResolutionInputSocketIndex(1); +} + +void ColorBalanceLGGOperation::initExecution() { + this->inputValueOperation = this->getInputSocketReader(0); + this->inputColorOperation = this->getInputSocketReader(1); +} + +void ColorBalanceLGGOperation::executePixel(float* outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + float value[4]; + + inputValueOperation->read(value, x, y, sampler, inputBuffers); + inputColorOperation->read(inputColor, x, y, sampler, inputBuffers); + + float fac = value[0]; + fac = min(1.0f, fac); + const float mfac= 1.0f - fac; + + outputColor[0] = mfac*inputColor[0] + fac * colorbalance_lgg(inputColor[0], this->lift[0], this->gamma_inv[0], this->gain[0]); + outputColor[1] = mfac*inputColor[1] + fac * colorbalance_lgg(inputColor[1], this->lift[1], this->gamma_inv[1], this->gain[1]); + outputColor[2] = mfac*inputColor[2] + fac * colorbalance_lgg(inputColor[2], this->lift[2], this->gamma_inv[2], this->gain[2]); + outputColor[3] = inputColor[3]; + +} + +void ColorBalanceLGGOperation::deinitExecution() { + this->inputValueOperation = NULL; + this->inputColorOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h new file mode 100644 index 00000000000..ebaabfeb736 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h @@ -0,0 +1,81 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorBalanceLGGOperation_h +#define _COM_ColorBalanceLGGOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ColorBalanceLGGOperation : public NodeOperation { +protected: + /** + * Prefetched reference to the inputProgram + */ + SocketReader * inputValueOperation; + SocketReader * inputColorOperation; + + float gain[3]; + float lift[3]; + float gamma_inv[3]; + +public: + /** + * Default constructor + */ + ColorBalanceLGGOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setGain(float gain[3]) { + this->gain[0] = gain[0]; + this->gain[1] = gain[1]; + this->gain[2] = gain[2]; + } + void setLift(float lift[3]) { + this->lift[0] = lift[0]; + this->lift[1] = lift[1]; + this->lift[2] = lift[2]; + } + void setGammaInv(float gamma_inv[3]) { + this->gamma_inv[0] = gamma_inv[0]; + this->gamma_inv[1] = gamma_inv[1]; + this->gamma_inv[2] = gamma_inv[2]; + } +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp new file mode 100644 index 00000000000..fef045481f7 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp @@ -0,0 +1,134 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorCorrectionOperation.h" +#include "BLI_math.h" + +ColorCorrectionOperation::ColorCorrectionOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->inputImage = NULL; + this->inputMask = NULL; + this->redChannelEnabled = true; + this->greenChannelEnabled = true; + this->blueChannelEnabled = true; +} +void ColorCorrectionOperation::initExecution() { + this->inputImage = this->getInputSocketReader(0); + this->inputMask = this->getInputSocketReader(1); +} + +void ColorCorrectionOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputImageColor[4]; + float inputMask[4]; + this->inputImage->read(inputImageColor, x, y, sampler, inputBuffers); + this->inputMask->read(inputMask, x, y, sampler, inputBuffers); + + float level = (inputImageColor[0] + inputImageColor[1] + inputImageColor[2])/3.0f; + float contrast= this->data->master.contrast; + float saturation = this->data->master.saturation; + float gamma = this->data->master.gamma; + float gain = this->data->master.gain; + float lift = this->data->master.lift; + float r, g, b; + + float value = inputMask[0]; + value = min(1.0f, value); + const float mvalue= 1.0f - value; + + float levelShadows = 0.0; + float levelMidtones = 0.0; + float levelHighlights = 0.0; +#define MARGIN 0.10 +#define MARGIN_DIV (0.5/MARGIN) + if ( level < this->data->startmidtones-MARGIN) { + levelShadows = 1.0f; + } else if (level < this->data->startmidtones+MARGIN) { + levelMidtones = ((level-this->data->startmidtones)*MARGIN_DIV)+0.5; + levelShadows = 1.0- levelMidtones; + } else if (level < this->data->endmidtones-MARGIN) { + levelMidtones = 1.0f; + } else if (level < this->data->endmidtones+MARGIN) { + levelHighlights = ((level-this->data->endmidtones)*MARGIN_DIV)+0.5; + levelMidtones = 1.0- levelHighlights; + } else { + levelHighlights = 1.0f; + } +#undef MARGIN +#undef MARGIN_DIV + contrast *= (levelShadows*this->data->shadows.contrast)+(levelMidtones*this->data->midtones.contrast)+(levelHighlights*this->data->highlights.contrast); + saturation *= (levelShadows*this->data->shadows.saturation)+(levelMidtones*this->data->midtones.saturation)+(levelHighlights*this->data->highlights.saturation); + gamma *= (levelShadows*this->data->shadows.gamma)+(levelMidtones*this->data->midtones.gamma)+(levelHighlights*this->data->highlights.gamma); + gain *= (levelShadows*this->data->shadows.gain)+(levelMidtones*this->data->midtones.gain)+(levelHighlights*this->data->highlights.gain); + lift += (levelShadows*this->data->shadows.lift)+(levelMidtones*this->data->midtones.lift)+(levelHighlights*this->data->highlights.lift); + + r = inputImageColor[0]; + g = inputImageColor[1]; + b = inputImageColor[2]; + + float invgamma = 1.0f/gamma; + float luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; + r = ( luma + saturation * (r - luma)); + g = ( luma + saturation * (g - luma)); + b = ( luma + saturation * (b - luma)); + CLAMP (r, 0.0f, 1.0f); + CLAMP (g, 0.0f, 1.0f); + CLAMP (b, 0.0f, 1.0f); + + r = 0.5+((r-0.5)*contrast); + g = 0.5+((g-0.5)*contrast); + b = 0.5+((b-0.5)*contrast); + + r = powf(r*gain+lift, invgamma); + g = powf(g*gain+lift, invgamma); + b = powf(b*gain+lift, invgamma); + + + // mix with mask + r = mvalue*inputImageColor[0] + value * r; + g = mvalue*inputImageColor[1] + value * g; + b = mvalue*inputImageColor[2] + value * b; + + if (this->redChannelEnabled) { + output[0] = r; + } else { + output[0] = inputImageColor[0]; + } + if (this->greenChannelEnabled) { + output[1] = g; + } else { + output[1] = inputImageColor[1]; + } + if (this->blueChannelEnabled) { + output[2] = b; + } else { + output[2] = inputImageColor[2]; + } + output[3] = inputImageColor[3]; +} + +void ColorCorrectionOperation::deinitExecution() { + this->inputImage = NULL; + this->inputMask = NULL; +} + diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.h b/source/blender/compositor/operations/COM_ColorCorrectionOperation.h new file mode 100644 index 00000000000..9a3eefe30c6 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorCorrectionOperation_h +#define _COM_ColorCorrectionOperation_h +#include "COM_NodeOperation.h" + + +class ColorCorrectionOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputImage; + SocketReader* inputMask; + NodeColorCorrection *data; + + bool redChannelEnabled; + bool greenChannelEnabled; + bool blueChannelEnabled; + +public: + ColorCorrectionOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeColorCorrection * data) {this->data = data;} + void setRedChannelEnabled(bool enabled) {this->redChannelEnabled = enabled;} + void setGreenChannelEnabled(bool enabled) {this->greenChannelEnabled = enabled;} + void setBlueChannelEnabled(bool enabled) {this->blueChannelEnabled = enabled;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.cpp b/source/blender/compositor/operations/COM_ColorCurveOperation.cpp new file mode 100644 index 00000000000..cb16b99f06b --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorCurveOperation.h" + +#ifdef __cplusplus +extern "C" { +#endif + #include "BKE_colortools.h" +#ifdef __cplusplus +} +#endif + +ColorCurveOperation::ColorCurveOperation(): CurveBaseOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + + this->inputFacProgram = NULL; + this->inputImageProgram = NULL; + this->inputBlackProgram = NULL; + this->inputWhiteProgram = NULL; + + this->setResolutionInputSocketIndex(1); +} +void ColorCurveOperation::initExecution() { + CurveBaseOperation::initExecution(); + this->inputFacProgram = this->getInputSocketReader(0); + this->inputImageProgram = this->getInputSocketReader(1); + this->inputBlackProgram = this->getInputSocketReader(2); + this->inputWhiteProgram = this->getInputSocketReader(3); + + curvemapping_premultiply(this->curveMapping, 0); + +} + +void ColorCurveOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float black[4]; + float white[4]; + float fac[4]; + float image[4]; + + this->inputBlackProgram->read(black, x, y, sampler, inputBuffers); + this->inputWhiteProgram->read(white, x, y, sampler, inputBuffers); + + curvemapping_set_black_white(this->curveMapping, black, white); + + this->inputFacProgram->read(fac, x, y, sampler, inputBuffers); + this->inputImageProgram->read(image, x, y, sampler, inputBuffers); + + if(fac[0]>=1.0) + curvemapping_evaluate_premulRGBF(this->curveMapping, color, image); + else if(*fac<=0.0) { + color[0]= image[0]; + color[1]= image[1]; + color[2]= image[2]; + } + else { + float col[4], mfac= 1.0f-*fac; + curvemapping_evaluate_premulRGBF(this->curveMapping, col, image); + color[0]= mfac*image[0] + *fac*col[0]; + color[1]= mfac*image[1] + *fac*col[1]; + color[2]= mfac*image[2] + *fac*col[2]; + } + color[3]= image[3]; +} + +void ColorCurveOperation::deinitExecution() { + this->inputFacProgram = NULL; + this->inputImageProgram = NULL; + this->inputBlackProgram = NULL; + this->inputWhiteProgram = NULL; + curvemapping_premultiply(this->curveMapping, 1); +} diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.h b/source/blender/compositor/operations/COM_ColorCurveOperation.h new file mode 100644 index 00000000000..986f6fcfcc2 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.h @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorCurveOperation_h +#define _COM_ColorCurveOperation_h +#include "COM_NodeOperation.h" +#include "DNA_color_types.h" +#include "COM_CurveBaseOperation.h" + +class ColorCurveOperation : public CurveBaseOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputFacProgram; + SocketReader * inputImageProgram; + SocketReader * inputBlackProgram; + SocketReader * inputWhiteProgram; +public: + ColorCurveOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.cpp b/source/blender/compositor/operations/COM_ColorMatteOperation.cpp new file mode 100644 index 00000000000..a80788ddd33 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.cpp @@ -0,0 +1,80 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ColorMatteOperation.h" +#include "BLI_math.h" + +ColorMatteOperation::ColorMatteOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addInputSocket(COM_DT_COLOR); + addOutputSocket(COM_DT_VALUE); + + inputImageProgram = NULL; + inputKeyProgram = NULL; +} + +void ColorMatteOperation::initExecution() { + this->inputImageProgram = this->getInputSocketReader(0); + this->inputKeyProgram = this->getInputSocketReader(1); +} + +void ColorMatteOperation::deinitExecution() { + this->inputImageProgram= NULL; + this->inputKeyProgram= NULL; +} + +void ColorMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inColor[4]; + float inKey[4]; + + const float hue=this->settings->t1; + const float sat=this->settings->t2; + const float val=this->settings->t3; + + float h_wrap; + + this->inputImageProgram->read(inColor, x, y, sampler, inputBuffers); + this->inputKeyProgram->read(inKey, x, y, sampler, inputBuffers); + + + /* store matte(alpha) value in [0] to go with + * COM_SetAlphaOperation and the Value output + */ + + if( + /* do hue last because it needs to wrap, and does some more checks */ + + /* sat */ (fabsf(inColor[1]-inKey[1]) < sat) && + /* val */ (fabsf(inColor[2]-inKey[2]) < val) && + + /* multiply by 2 because it wraps on both sides of the hue, + * otherwise 0.5 would key all hue's */ + + /* hue */ ((h_wrap= 2.f * fabsf(inColor[0]-inKey[0])) < hue || (2.f - h_wrap) < hue) + ) { + outputValue[0]=0.f; /*make transparent*/ + } + + else { /*pixel is outside key color */ + outputValue[0]=inColor[3]; /* make pixel just as transparent as it was before */ + } +} + diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.h b/source/blender/compositor/operations/COM_ColorMatteOperation.h new file mode 100644 index 00000000000..954a5bbb3e8 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ColorMatteOperation_h +#define _COM_ColorMatteOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ColorMatteOperation : public NodeOperation { +private: + NodeChroma *settings; + SocketReader *inputImageProgram; + SocketReader *inputKeyProgram; +public: + /** + * Default constructor + */ + ColorMatteOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorRampOperation.cpp b/source/blender/compositor/operations/COM_ColorRampOperation.cpp new file mode 100644 index 00000000000..a7cfb30b439 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorRampOperation.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorRampOperation.h" + +#ifdef __cplusplus +extern "C" { +#endif + #include "BKE_texture.h" +#ifdef __cplusplus +} +#endif + +ColorRampOperation::ColorRampOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + + this->inputProgram = NULL; + this->colorBand = NULL; +} +void ColorRampOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void ColorRampOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float values[4]; + + this->inputProgram->read(values, x, y, sampler, inputBuffers); + do_colorband(this->colorBand, values[0], color); +} + +void ColorRampOperation::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_ColorRampOperation.h b/source/blender/compositor/operations/COM_ColorRampOperation.h new file mode 100644 index 00000000000..08a6c26a8bf --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorRampOperation.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorRampOperation_h +#define _COM_ColorRampOperation_h +#include "COM_NodeOperation.h" +#include "DNA_texture_types.h" + +class ColorRampOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + ColorBand* colorBand; +public: + ColorRampOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setColorBand(ColorBand* colorBand) {this->colorBand = colorBand;} + + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.cpp b/source/blender/compositor/operations/COM_ColorSpillOperation.cpp new file mode 100644 index 00000000000..9f054540332 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.cpp @@ -0,0 +1,110 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This Reader is free software; you can redistribute it and/or + * modify it under the terms of the 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 Reader is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this Reader; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ColorSpillOperation.h" +#include "BLI_math.h" +#define avg(a,b) ((a+b)/2) + +ColorSpillOperation::ColorSpillOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addInputSocket(COM_DT_VALUE); + addOutputSocket(COM_DT_COLOR); + + inputImageReader = NULL; + inputFacReader = NULL; + this->spillChannel = 1; // GREEN +} + +void ColorSpillOperation::initExecution() { + this->inputImageReader = this->getInputSocketReader(0); + this->inputFacReader = this->getInputSocketReader(1); + if (spillChannel == 0) { + rmut = -1.0f; + gmut = 1.0f; + bmut = 1.0f; + this->channel2 = 1; + this->channel3 = 2; + if (settings->unspill == 0) { + settings->uspillr = 1.0f; + settings->uspillg = 0.0f; + settings->uspillb = 0.0f; + } + } else if (spillChannel == 1) { + rmut = 1.0f; + gmut = -1.0f; + bmut = 1.0f; + this->channel2 = 0; + this->channel3 = 2; + if (settings->unspill == 0) { + settings->uspillr = 0.0f; + settings->uspillg = 1.0f; + settings->uspillb = 0.0f; + } + } else { + rmut = 1.0f; + gmut = 1.0f; + bmut = -1.0f; + + this->channel2 = 0; + this->channel3 = 1; + if (settings->unspill == 0) { + settings->uspillr = 0.0f; + settings->uspillg = 0.0f; + settings->uspillb = 1.0f; + } + } +} + +void ColorSpillOperation::deinitExecution() { + this->inputImageReader= NULL; + this->inputFacReader = NULL; +} + +void ColorSpillOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float fac[4]; + float input[4]; + float map; + this->inputFacReader->read(fac, x, y, sampler, inputBuffers); + this->inputImageReader->read(input, x, y, sampler, inputBuffers); + float rfac = min(1.0f, fac[0]); + map = calculateMapValue(rfac, input); + if(map>0) { + outputValue[0]=input[0]+rmut*(settings->uspillr*map); + outputValue[1]=input[1]+gmut*(settings->uspillg*map); + outputValue[2]=input[2]+bmut*(settings->uspillb*map); + outputValue[3]=input[3]; + } + else { + outputValue[0]=input[0]; + outputValue[1]=input[1]; + outputValue[2]=input[2]; + outputValue[3]=input[3]; + } +} +float ColorSpillOperation::calculateMapValue(float fac, float *input) { + return fac * (input[this->spillChannel]-(this->settings->limscale*input[settings->limchan])); +} + + +float ColorSpillAverageOperation::calculateMapValue(float fac, float *input) { + return fac * (input[this->spillChannel]-(this->settings->limscale*avg(input[this->channel2], input[this->channel3]))); +} diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.h b/source/blender/compositor/operations/COM_ColorSpillOperation.h new file mode 100644 index 00000000000..963eaae3076 --- /dev/null +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ColorSpillOperation_h +#define _COM_ColorSpillOperation_h +#include "COM_NodeOperation.h" + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ColorSpillOperation : public NodeOperation { +protected: + NodeColorspill *settings; + SocketReader *inputImageReader; + SocketReader *inputFacReader; + int spillChannel; + int channel2; + int channel3; + float rmut, gmut, bmut; +public: + /** + * Default constructor + */ + ColorSpillOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setSettings(NodeColorspill* nodeColorSpill) {this->settings= nodeColorSpill;} + void setSpillChannel(int channel) {this->spillChannel = channel;} + + float calculateMapValue(float fac, float *input); +}; + +class ColorSpillAverageOperation: public ColorSpillOperation { +public: + float calculateMapValue(float fac, float *input); +}; +#endif diff --git a/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp b/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp new file mode 100644 index 00000000000..efeac9db410 --- /dev/null +++ b/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp @@ -0,0 +1,72 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CombineChannelsOperation.h" +#include + +CombineChannelsOperation::CombineChannelsOperation() : NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputChannel1Operation = NULL; + this->inputChannel2Operation = NULL; + this->inputChannel3Operation = NULL; + this->inputChannel4Operation = NULL; +} +void CombineChannelsOperation::initExecution() { + this->inputChannel1Operation = this->getInputSocketReader(0); + this->inputChannel2Operation = this->getInputSocketReader(1); + this->inputChannel3Operation = this->getInputSocketReader(2); + this->inputChannel4Operation = this->getInputSocketReader(3); +} + +void CombineChannelsOperation::deinitExecution() { + this->inputChannel1Operation = NULL; + this->inputChannel2Operation = NULL; + this->inputChannel3Operation = NULL; + this->inputChannel4Operation = NULL; +} + + +void CombineChannelsOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float input[4]; + /// @todo: remove if statements + if (this->inputChannel1Operation) { + this->inputChannel1Operation->read(input, x, y, sampler, inputBuffers); + color[0] = input[0]; + } + if (this->inputChannel2Operation) { + this->inputChannel2Operation->read(input, x, y, sampler, inputBuffers); + color[1] = input[0]; + } + if (this->inputChannel3Operation) { + this->inputChannel3Operation->read(input, x, y, sampler, inputBuffers); + color[2] = input[0]; + } + if (this->inputChannel4Operation) { + this->inputChannel4Operation->read(input, x, y, sampler, inputBuffers); + color[3] = input[0]; + } +} diff --git a/source/blender/compositor/operations/COM_CombineChannelsOperation.h b/source/blender/compositor/operations/COM_CombineChannelsOperation.h new file mode 100644 index 00000000000..18dd1fd2ec9 --- /dev/null +++ b/source/blender/compositor/operations/COM_CombineChannelsOperation.h @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CombineChannelsOperation_h_ +#define _COM_CombineChannelsOperation_h_ + +#include "COM_NodeOperation.h" + +class CombineChannelsOperation: public NodeOperation { +private: + SocketReader *inputChannel1Operation; + SocketReader *inputChannel2Operation; + SocketReader *inputChannel3Operation; + SocketReader *inputChannel4Operation; +public: + CombineChannelsOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp new file mode 100644 index 00000000000..7590b4be299 --- /dev/null +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -0,0 +1,122 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CompositorOperation.h" +#include "COM_SocketConnection.h" +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "BKE_image.h" + +extern "C" { + #include "RE_pipeline.h" + #include "RE_shader_ext.h" + #include "RE_render_ext.h" + #include "MEM_guardedalloc.h" +#include "render_types.h" +} +#include "PIL_time.h" + + +CompositorOperation::CompositorOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + + this->setScene(NULL); + this->outputBuffer = NULL; + this->imageInput = NULL; + this->alphaInput = NULL; +} + +void CompositorOperation::initExecution() { + // When initializing the tree during initial load the width and height can be zero. + this->imageInput = getInputSocketReader(0); + this->alphaInput = getInputSocketReader(1); + if (this->getWidth() * this->getHeight() != 0) { + this->outputBuffer=(float*) MEM_callocN(this->getWidth()*this->getHeight()*4*sizeof(float), "CompositorOperation"); + } + const Scene * scene = this->scene; + Render* re= RE_GetRender(scene->id.name); + RenderResult *rr= RE_AcquireResultWrite(re); + if(rr) { + if(rr->rectf != NULL) { + MEM_freeN(rr->rectf); + } + rr->rectf= outputBuffer; + } + if (re) { + RE_ReleaseResult(re); + re = NULL; + } + +} + +void CompositorOperation::deinitExecution() { + this->outputBuffer = NULL; + this->imageInput = NULL; + this->alphaInput = NULL; +} + + +void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { + float color[8]; // 7 is enough + float* buffer = this->outputBuffer; + + if (!buffer) return; + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int offset = (y1*this->getWidth() + x1 ) * 4; + int x; + int y; + bool breaked = false; + + for (y = y1 ; y < y2 && (!breaked); y++) { + for (x = x1 ; x < x2 && (!breaked) ; x++) { + imageInput->read(color, x, y, COM_PS_NEAREST, memoryBuffers); + if (alphaInput != NULL) { + alphaInput->read(&(color[3]), x, y, COM_PS_NEAREST, memoryBuffers); + } + buffer[offset] = color[0]; + buffer[offset+1] = color[1]; + buffer[offset+2] = color[2]; + buffer[offset+3] = color[3]; + offset +=4; + if (tree->test_break && tree->test_break(tree->tbh)) { + breaked = true; + } + } + offset += (this->getWidth()-(x2-x1))*4; + } +} + +void CompositorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + int width = this->scene->r.xsch*this->scene->r.size/100; + int height= this->scene->r.ysch*this->scene->r.size/100; + preferredResolution[0] = width; + preferredResolution[1] = height; + + NodeOperation::determineResolution(resolution, preferredResolution); + + resolution[0] = width; + resolution[1] = height; +} diff --git a/source/blender/compositor/operations/COM_CompositorOperation.h b/source/blender/compositor/operations/COM_CompositorOperation.h new file mode 100644 index 00000000000..6f71fdff7b4 --- /dev/null +++ b/source/blender/compositor/operations/COM_CompositorOperation.h @@ -0,0 +1,69 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CompositorOperation_h +#define _COM_CompositorOperation_h +#include "COM_NodeOperation.h" +#include "DNA_scene_types.h" +#include "BLI_rect.h" + +/** + * @brief Compositor output operation + */ +class CompositorOperation : public NodeOperation { +private: + /** + * @brief local reference to the scene + */ + const Scene* scene; + + /** + * @brief local reference to the node tree + */ + const bNodeTree* tree; + + /** + * @brief reference to the output float buffer + */ + float *outputBuffer; + + /** + * @brief local reference to the input image operation + */ + SocketReader* imageInput; + + /** + * @brief local reference to the input alpha operation + */ + SocketReader* alphaInput; +public: + CompositorOperation(); + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); + void setScene(const Scene* scene) {this->scene = scene;} + void setbNodeTree(const bNodeTree* tree) {this->tree= tree;} + bool isOutputOperation(bool rendering) const {return rendering;} + void initExecution(); + void deinitExecution(); + const int getRenderPriority() const {return 7;} + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp new file mode 100644 index 00000000000..3267994feea --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertColorProfileOperation.h" + +extern "C" { + #include "IMB_imbuf.h" +} +ConvertColorProfileOperation::ConvertColorProfileOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; + this->predivided = false; +} + +void ConvertColorProfileOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertColorProfileOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float color[4]; + inputOperation->read(color, x, y, sampler, inputBuffers); + IMB_buffer_float_from_float(outputValue, color, 4, this->toProfile, this->fromProfile, this->predivided, 1, 1, 0, 0); +} + +void ConvertColorProfileOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h new file mode 100644 index 00000000000..9781795b952 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h @@ -0,0 +1,78 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertColorProfileOperation_h +#define _COM_ConvertColorProfileOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertColorProfileOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; + + /** + * @brief color profile where to convert from + */ + int fromProfile; + + /** + * @brief color profile where to convert to + */ + int toProfile; + + /** + * @brief is color predivided + */ + bool predivided; +public: + /** + * Default constructor + */ + ConvertColorProfileOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setFromColorProfile(int colorProfile) {this->fromProfile = colorProfile;} + void setToColorProfile(int colorProfile) {this->toProfile = colorProfile;} + void setPredivided(bool predivided) {this->predivided = predivided;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp new file mode 100644 index 00000000000..8c48c5c0d14 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertColorToBWOperation.h" + +ConvertColorToBWOperation::ConvertColorToBWOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_VALUE); + this->inputOperation = NULL; +} + +void ConvertColorToBWOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertColorToBWOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(&inputColor[0], x, y, sampler, inputBuffers); + outputValue[0] = (inputColor[0]*0.35f + inputColor[1]*0.45f + inputColor[2]*0.2f)*inputColor[3]; +} + +void ConvertColorToBWOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h new file mode 100644 index 00000000000..82d71453e1e --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertColorToBWOperation_h +#define _COM_ConvertColorToBWOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertColorToBWOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertColorToBWOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp new file mode 100644 index 00000000000..af86f3ea5e8 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertColorToVectorOperation.h" + +ConvertColorToVectorOperation::ConvertColorToVectorOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_VECTOR); + this->inputOperation = NULL; +} + +void ConvertColorToVectorOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertColorToVectorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + inputOperation->read(outputValue, x, y, sampler, inputBuffers); +} + +void ConvertColorToVectorOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h new file mode 100644 index 00000000000..de7315da02f --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertColorToVectorOperation_h +#define _COM_ConvertColorToVectorOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertColorToVectorOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertColorToVectorOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp b/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp new file mode 100644 index 00000000000..caf41419668 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertColourToValueProg.h" + +ConvertColourToValueProg::ConvertColourToValueProg(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_VALUE); + this->inputOperation = NULL; +} + +void ConvertColourToValueProg::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertColourToValueProg::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(&inputColor[0], x, y, sampler, inputBuffers); + outputValue[0] = ((inputColor[0] + inputColor[1] + inputColor[2])/3.0f)*inputColor[3]; +} + +void ConvertColourToValueProg::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertColourToValueProg.h b/source/blender/compositor/operations/COM_ConvertColourToValueProg.h new file mode 100644 index 00000000000..73e71b5665a --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertColourToValueProg.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertColourToValueProg_h +#define _COM_ConvertColourToValueProg_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertColourToValueProg : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertColourToValueProg(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp new file mode 100644 index 00000000000..345fc37b340 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertDepthToRadiusOperation.h" +#include "BLI_math.h" +#include "DNA_camera_types.h" + +ConvertDepthToRadiusOperation::ConvertDepthToRadiusOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputOperation = NULL; + this->fStop = 128.0f; + this->cameraObject = NULL; + this->maxRadius = 32.0f; +} + +float ConvertDepthToRadiusOperation::determineFocalDistance() { + + if (cameraObject == NULL || cameraObject->type != OB_CAMERA) { + return 10.0f; + } else { + Camera *camera= (Camera*)this->cameraObject->data; + cam_lens = camera->lens; + if (camera->dof_ob) { + /* too simple, better to return the distance on the view axis only + * return len_v3v3(ob->obmat[3], cam->dof_ob->obmat[3]); */ + float mat[4][4], imat[4][4], obmat[4][4]; + + copy_m4_m4(obmat, cameraObject->obmat); + normalize_m4(obmat); + invert_m4_m4(imat, obmat); + mult_m4_m4m4(mat, imat, camera->dof_ob->obmat); + return (float)fabs(mat[3][2]); + } + return camera->YF_dofdist; + } +} + +void ConvertDepthToRadiusOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + float focalDistance = determineFocalDistance(); + if (focalDistance==0.0f) focalDistance = 1e10f; /* if the dof is 0.0 then set it be be far away */ + inverseFocalDistance = 1.f/focalDistance; + this->aspect = (this->getWidth() > this->getHeight()) ? (this->getHeight() / (float)this->getWidth()) : (this->getWidth() / (float)this->getHeight()); + this->aperture = 0.5f*(this->cam_lens / (this->aspect*32.f)) / this->fStop; + float minsz = MIN2(getWidth(), getHeight()); + this->dof_sp = (float)minsz / (16.f / cam_lens); // <- == aspect * MIN2(img->x, img->y) / tan(0.5f * fov); +} + +void ConvertDepthToRadiusOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + float z; + float radius; + inputOperation->read(inputValue, x, y, sampler, inputBuffers); + z = inputValue[0]; + if (z!=0.f) { + float iZ = (1.f/z); + + // bug #6656 part 2b, do not rescale + /* + bcrad = 0.5f*fabs(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f)); + // scale crad back to original maximum and blend + crad->rect[px] = bcrad + wts->rect[px]*(scf*crad->rect[px] - bcrad); + */ + radius = 0.5f*fabsf(this->aperture*(dof_sp*(inverseFocalDistance - iZ) - 1.f)); + // 'bug' #6615, limit minimum radius to 1 pixel, not really a solution, but somewhat mitigates the problem + if (radius < 0.5f) radius = 0.5f; + if (radius > maxRadius) { + radius = maxRadius; + } + outputValue[0] = radius; + } + else outputValue[0] = 0.0f; +} + +void ConvertDepthToRadiusOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h new file mode 100644 index 00000000000..80a56122565 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h @@ -0,0 +1,72 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertDepthToRadiusOperation_h +#define _COM_ConvertDepthToRadiusOperation_h +#include "COM_NodeOperation.h" +#include "DNA_object_types.h" + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertDepthToRadiusOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; + float fStop; + float aspect; + float maxRadius; + float inverseFocalDistance; + float aperture; + float cam_lens; + float dof_sp; + Object *cameraObject; +public: + /** + * Default constructor + */ + ConvertDepthToRadiusOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setfStop(float fStop) {this->fStop = fStop;} + void setMaxRadius(float maxRadius) {this->maxRadius = maxRadius;} + void setCameraObject(Object* camera) {this->cameraObject = camera;} + float determineFocalDistance(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp new file mode 100644 index 00000000000..8de98fef28b --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertHSVToRGBOperation.h" +#include "BLI_math_color.h" + +ConvertHSVToRGBOperation::ConvertHSVToRGBOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertHSVToRGBOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertHSVToRGBOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(inputColor, x, y, sampler, inputBuffers); + hsv_to_rgb(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); + outputValue[3] = inputColor[3]; +} + +void ConvertHSVToRGBOperation::deinitExecution() { + this->inputOperation = NULL; +} + diff --git a/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h new file mode 100644 index 00000000000..f2f61250aad --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertHSVToRGBOperation_h +#define _COM_ConvertHSVToRGBOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertHSVToRGBOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertHSVToRGBOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp new file mode 100644 index 00000000000..509093f4d5f --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertKeyToPremulOperation.h" +#include "BLI_math.h" + +ConvertKeyToPremulOperation::ConvertKeyToPremulOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + + this->inputColor = NULL; +} + +void ConvertKeyToPremulOperation::initExecution() { + this->inputColor = getInputSocketReader(0); +} + +void ConvertKeyToPremulOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + float alpha; + + this->inputColor->read(inputValue, x, y, sampler, inputBuffers); + alpha = inputValue[3]; + + outputValue[0] = inputValue[0] * alpha; + outputValue[1] = inputValue[1] * alpha; + outputValue[2] = inputValue[2] * alpha; + + /* never touches the alpha */ + outputValue[3] = alpha; +} + +void ConvertKeyToPremulOperation::deinitExecution() { + this->inputColor = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h new file mode 100644 index 00000000000..15195b37f49 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h @@ -0,0 +1,49 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertKeyToPremulOperation_h +#define _COM_ConvertKeyToPremulOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertKeyToPremulOperation : public NodeOperation { +private: + SocketReader *inputColor; +public: + /** + * Default constructor + */ + ConvertKeyToPremulOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp new file mode 100644 index 00000000000..6f676b1c404 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp @@ -0,0 +1,60 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertPremulToKeyOperation.h" +#include "BLI_math.h" + +ConvertPremulToKeyOperation::ConvertPremulToKeyOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + + this->inputColor = NULL; +} + +void ConvertPremulToKeyOperation::initExecution() { + this->inputColor = getInputSocketReader(0); +} + +void ConvertPremulToKeyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + float alpha; + + this->inputColor->read(inputValue, x, y, sampler, inputBuffers); + alpha = inputValue[3]; + + if(fabsf(alpha) < 1e-5f) { + outputValue[0]= 0.f; + outputValue[1]= 0.f; + outputValue[2]= 0.f; + } + else { + outputValue[0] = inputValue[0] / alpha; + outputValue[1] = inputValue[1] / alpha; + outputValue[2] = inputValue[2] / alpha; + } + + /* never touches the alpha */ + outputValue[3] = alpha; +} + +void ConvertPremulToKeyOperation::deinitExecution() { + this->inputColor = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h new file mode 100644 index 00000000000..431dcfe5742 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h @@ -0,0 +1,48 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertPremulToKeyOperation_h +#define _COM_ConvertPremulToKeyOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertPremulToKeyOperation : public NodeOperation { +private: + SocketReader *inputColor; +public: + /** + * Default constructor + */ + ConvertPremulToKeyOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp new file mode 100644 index 00000000000..b8208a864ff --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertRGBToHSVOperation.h" +#include "BLI_math_color.h" + +ConvertRGBToHSVOperation::ConvertRGBToHSVOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertRGBToHSVOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertRGBToHSVOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(inputColor, x, y, sampler, inputBuffers); + rgb_to_hsv(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); + outputValue[3] = inputColor[3]; +} + +void ConvertRGBToHSVOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h new file mode 100644 index 00000000000..a36092640e8 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertRGBToHSVOperation_h +#define _COM_ConvertRGBToHSVOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertRGBToHSVOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertRGBToHSVOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp new file mode 100644 index 00000000000..623376d532f --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertRGBToYCCOperation.h" +#include "BLI_math_color.h" + +ConvertRGBToYCCOperation::ConvertRGBToYCCOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertRGBToYCCOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertRGBToYCCOperation::setMode(int mode) { + switch(mode) + { + case 1: + this->mode = BLI_YCC_ITU_BT709; + break; + case 2: + this->mode = BLI_YCC_JFIF_0_255; + break; + case 0: + default: + this->mode = BLI_YCC_ITU_BT601; + break; + } +} + +void ConvertRGBToYCCOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + float color[3]; + + inputOperation->read(inputColor, x, y, sampler, inputBuffers); + rgb_to_ycc(inputColor[0], inputColor[1], inputColor[2], &color[0], &color[1], &color[2], this->mode); + + /* divided by 255 to normalize for viewing in */ + outputValue[0] = color[0]/255.f; /* Y */ + outputValue[1] = color[1]/255.f; /* Cb*/ + outputValue[2] = color[2]/255.f; /* Cr*/ + outputValue[3] = inputColor[3]; +} + +void ConvertRGBToYCCOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h new file mode 100644 index 00000000000..76825061c19 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertRGBToYCCOperation_h +#define _COM_ConvertRGBToYCCOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertRGBToYCCOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; + + /** + * YCbCr mode (Jpeg, ITU601, ITU709) + */ + int mode; +public: + /** + * Default constructor + */ + ConvertRGBToYCCOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + /** + * Set the YCC mode + */ + void setMode(int mode); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp new file mode 100644 index 00000000000..c8ab3dd5a4b --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertRGBToYUVOperation.h" +#include "BLI_math_color.h" + +ConvertRGBToYUVOperation::ConvertRGBToYUVOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertRGBToYUVOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertRGBToYUVOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(inputColor, x, y, sampler, inputBuffers); + rgb_to_yuv(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); + outputValue[3] = inputColor[3]; +} + +void ConvertRGBToYUVOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h new file mode 100644 index 00000000000..aba759b6b97 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertRGBToYUVOperation_h +#define _COM_ConvertRGBToYUVOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertRGBToYUVOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertRGBToYUVOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp b/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp new file mode 100644 index 00000000000..622163739d6 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertValueToColourProg.h" + +ConvertValueToColourProg::ConvertValueToColourProg(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; +} +void ConvertValueToColourProg::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void ConvertValueToColourProg::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + this->inputProgram->read(inputValue, x, y, sampler, inputBuffers); + color[0] = inputValue[0]; + color[1] = inputValue[0]; + color[2] = inputValue[0]; + color[3] = 1.0f; +} + +void ConvertValueToColourProg::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertValueToColourProg.h b/source/blender/compositor/operations/COM_ConvertValueToColourProg.h new file mode 100644 index 00000000000..25643a74f35 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertValueToColourProg.h @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertValueToColourProg_h +#define _COM_ConvertValueToColourProg_h +#include "COM_NodeOperation.h" + + +class ConvertValueToColourProg : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputProgram; +public: + ConvertValueToColourProg(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp new file mode 100644 index 00000000000..c675ea16fdb --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertValueToVectorOperation.h" + +ConvertValueToVectorOperation::ConvertValueToVectorOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VECTOR); + this->inputOperation = NULL; +} + +void ConvertValueToVectorOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertValueToVectorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float input[4]; + inputOperation->read(input, x, y, sampler, inputBuffers); + outputValue[0] = input[0]; + outputValue[1] = input[0]; + outputValue[2] = input[0]; + outputValue[3] = 0.0f; +} + +void ConvertValueToVectorOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h new file mode 100644 index 00000000000..0824bb0e4fe --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertValueToVectorOperation_h +#define _COM_ConvertValueToVectorOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertValueToVectorOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertValueToVectorOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp new file mode 100644 index 00000000000..517fc56e93e --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertVectorToColorOperation.h" + +ConvertVectorToColorOperation::ConvertVectorToColorOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VECTOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertVectorToColorOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertVectorToColorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + inputOperation->read(outputValue, x, y, sampler, inputBuffers); + outputValue[3] = 1.0f; +} + +void ConvertVectorToColorOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h new file mode 100644 index 00000000000..4ebaf5b9230 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertVectorToColorOperation_h +#define _COM_ConvertVectorToColorOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertVectorToColorOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertVectorToColorOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp new file mode 100644 index 00000000000..a57cd229e1f --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvertVectorToValueOperation.h" + +ConvertVectorToValueOperation::ConvertVectorToValueOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VECTOR); + this->addOutputSocket(COM_DT_VALUE); + this->inputOperation = NULL; +} + +void ConvertVectorToValueOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertVectorToValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float input[4]; + inputOperation->read(input, x, y, sampler, inputBuffers); + outputValue[0] = (input[0]+input[1]+input[2])/3.0f; +} + +void ConvertVectorToValueOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h new file mode 100644 index 00000000000..ede7853f57e --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvertVectorToValueOperation_h +#define _COM_ConvertVectorToValueOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertVectorToValueOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertVectorToValueOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp new file mode 100644 index 00000000000..1d8ee944915 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertYCCToRGBOperation.h" +#include "BLI_math_color.h" + +ConvertYCCToRGBOperation::ConvertYCCToRGBOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertYCCToRGBOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertYCCToRGBOperation::setMode(int mode) { + switch(mode) + { + case 1: + this->mode = BLI_YCC_ITU_BT709; + break; + case 2: + this->mode = BLI_YCC_JFIF_0_255; + break; + case 0: + default: + this->mode = BLI_YCC_ITU_BT601; + break; + } +} + +void ConvertYCCToRGBOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(inputColor, x, y, sampler, inputBuffers); + + /* need to un-normalize the data */ + inputColor[0] *= 255.f; /* Y */ + inputColor[1] *= 255.f; /* Cb*/ + inputColor[2] *= 255.f; /* Cr*/ + + ycc_to_rgb(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2], this->mode); + outputValue[3] = inputColor[3]; +} + +void ConvertYCCToRGBOperation::deinitExecution() { + this->inputOperation = NULL; +} + diff --git a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h new file mode 100644 index 00000000000..c3702de3b48 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertYCCToRGBOperation_h +#define _COM_ConvertYCCToRGBOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertYCCToRGBOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; + + /** + * YCbCr mode (Jpeg, ITU601, ITU709) + */ + int mode; +public: + /** + * Default constructor + */ + ConvertYCCToRGBOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + /** + * Set the YCC mode + */ + void setMode(int mode); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp new file mode 100644 index 00000000000..a807030cb8a --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_ConvertYUVToRGBOperation.h" +#include "BLI_math_color.h" + +ConvertYUVToRGBOperation::ConvertYUVToRGBOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void ConvertYUVToRGBOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void ConvertYUVToRGBOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + inputOperation->read(inputColor, x, y, sampler, inputBuffers); + yuv_to_rgb(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); + outputValue[3] = inputColor[3]; +} + +void ConvertYUVToRGBOperation::deinitExecution() { + this->inputOperation = NULL; +} + diff --git a/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h new file mode 100644 index 00000000000..6d82d36fe5c --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h @@ -0,0 +1,58 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_ConvertYUVToRGBOperation_h +#define _COM_ConvertYUVToRGBOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ConvertYUVToRGBOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; +public: + /** + * Default constructor + */ + ConvertYUVToRGBOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp new file mode 100644 index 00000000000..6505e1be83e --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvolutionEdgeFilterOperation.h" +#include "BLI_math.h" + +ConvolutionEdgeFilterOperation::ConvolutionEdgeFilterOperation() : ConvolutionFilterOperation() { +} +inline void addFilter(float* result, float*input, float value) { + result[0] += input[0] * value; + result[1] += input[1] * value; + result[2] += input[2] * value; +} + +void ConvolutionEdgeFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float in1[4],in2[4], res1[4], res2[4]; + + float value[4]; + this->inputValueOperation->read(value, x, y, inputBuffers, NULL); + float mval = 1.0f - value[0]; + + res1[0] = 0.0f; + res1[1] = 0.0f; + res1[2] = 0.0f; + res1[3] = 0.0f; + res2[0] = 0.0f; + res2[1] = 0.0f; + res2[2] = 0.0f; + res2[3] = 0.0f; + + this->inputOperation->read(in1, x-1, y-1, inputBuffers, NULL); + addFilter(res1, in1, this->filter[0]); + addFilter(res2, in1, this->filter[0]); + + this->inputOperation->read(in1, x, y-1, inputBuffers, NULL); + addFilter(res1, in1, this->filter[1]); + addFilter(res2, in1, this->filter[3]); + + this->inputOperation->read(in1, x+1, y-1, inputBuffers, NULL); + addFilter(res1, in1, this->filter[2]); + addFilter(res2, in1, this->filter[6]); + + this->inputOperation->read(in1, x-1, y, inputBuffers, NULL); + addFilter(res1, in1, this->filter[3]); + addFilter(res2, in1, this->filter[1]); + + this->inputOperation->read(in2, x, y, inputBuffers, NULL); + addFilter(res1, in2, this->filter[4]); + addFilter(res2, in2, this->filter[4]); + + this->inputOperation->read(in1, x+1, y, inputBuffers, NULL); + addFilter(res1, in1, this->filter[5]); + addFilter(res2, in1, this->filter[7]); + + this->inputOperation->read(in1, x-1, y+1, inputBuffers, NULL); + addFilter(res1, in1, this->filter[6]); + addFilter(res2, in1, this->filter[2]); + + this->inputOperation->read(in1, x, y+1, inputBuffers, NULL); + addFilter(res1, in1, this->filter[7]); + addFilter(res2, in1, this->filter[5]); + + this->inputOperation->read(in1, x+1, y+1, inputBuffers, NULL); + addFilter(res1, in1, this->filter[8]); + addFilter(res2, in1, this->filter[8]); + + color[0] = sqrt(res1[0]*res1[0]+res2[0]*res2[0]); + color[1] = sqrt(res1[1]*res1[1]+res2[1]*res2[1]); + color[2] = sqrt(res1[2]*res1[2]+res2[2]*res2[2]); + + color[0] = color[0]*value[0] + in2[0] * mval; + color[1] = color[1]*value[0] + in2[1] * mval; + color[2] = color[2]*value[0] + in2[2] * mval; + + color[3] = in2[3]; +} diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h new file mode 100644 index 00000000000..64a52d1a925 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvolutionEdgeFilterOperation_h_ +#define _COM_ConvolutionEdgeFilterOperation_h_ + +#include "COM_ConvolutionFilterOperation.h" + +class ConvolutionEdgeFilterOperation: public ConvolutionFilterOperation { +public: + ConvolutionEdgeFilterOperation(); + void executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp new file mode 100644 index 00000000000..1bf53260e23 --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp @@ -0,0 +1,136 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ConvolutionFilterOperation.h" + +ConvolutionFilterOperation::ConvolutionFilterOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; + this->filter = NULL; + this->setComplex(true); +} +void ConvolutionFilterOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + this->inputValueOperation = this->getInputSocketReader(1); +} + +void ConvolutionFilterOperation::set3x3Filter(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) { + this->filter = new float[9]; + this->filter[0] = f1; + this->filter[1] = f2; + this->filter[2] = f3; + this->filter[3] = f4; + this->filter[4] = f5; + this->filter[5] = f6; + this->filter[6] = f7; + this->filter[7] = f8; + this->filter[8] = f9; + this->filterHeight = 3; + this->filterWidth = 3; +} + +void ConvolutionFilterOperation::deinitExecution() { + this->inputOperation = NULL; + this->inputValueOperation = NULL; + if (this->filter) { + delete this->filter; + this->filter = NULL; + } +} + + +void ConvolutionFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data) { + color[0] = 0.0; + color[1] = 0.0; + color[2] = 0.0; + color[3] = 0.0; + float in1[4]; + float in2[4]; + float value[4]; + this->inputValueOperation->read(value, x, y, inputBuffers, NULL); + float mval = 1.0f - value[0]; + + this->inputOperation->read(in1, x-1, y-1, inputBuffers, NULL); + color[0] += in1[0] * this->filter[0]; + color[1] += in1[1] * this->filter[0]; + color[2] += in1[2] * this->filter[0]; + color[3] += in1[3] * this->filter[0]; + this->inputOperation->read(in1, x, y-1, inputBuffers, NULL); + color[0] += in1[0] * this->filter[1]; + color[1] += in1[1] * this->filter[1]; + color[2] += in1[2] * this->filter[1]; + color[3] += in1[3] * this->filter[1]; + this->inputOperation->read(in1, x+1, y-1, inputBuffers, NULL); + color[0] += in1[0] * this->filter[2]; + color[1] += in1[1] * this->filter[2]; + color[2] += in1[2] * this->filter[2]; + color[3] += in1[3] * this->filter[2]; + this->inputOperation->read(in1, x-1, y, inputBuffers, NULL); + color[0] += in1[0] * this->filter[3]; + color[1] += in1[1] * this->filter[3]; + color[2] += in1[2] * this->filter[3]; + color[3] += in1[3] * this->filter[3]; + this->inputOperation->read(in2, x, y, inputBuffers, NULL); + color[0] += in2[0] * this->filter[4]; + color[1] += in2[1] * this->filter[4]; + color[2] += in2[2] * this->filter[4]; + color[3] += in2[3] * this->filter[4]; + this->inputOperation->read(in1, x+1, y, inputBuffers, NULL); + color[0] += in1[0] * this->filter[5]; + color[1] += in1[1] * this->filter[5]; + color[2] += in1[2] * this->filter[5]; + color[3] += in1[3] * this->filter[5]; + this->inputOperation->read(in1, x-1, y+1, inputBuffers, NULL); + color[0] += in1[0] * this->filter[6]; + color[1] += in1[1] * this->filter[6]; + color[2] += in1[2] * this->filter[6]; + color[3] += in1[3] * this->filter[6]; + this->inputOperation->read(in1, x, y+1, inputBuffers, NULL); + color[0] += in1[0] * this->filter[7]; + color[1] += in1[1] * this->filter[7]; + color[2] += in1[2] * this->filter[7]; + color[3] += in1[3] * this->filter[7]; + this->inputOperation->read(in1, x+1, y+1, inputBuffers, NULL); + color[0] += in1[0] * this->filter[8]; + color[1] += in1[1] * this->filter[8]; + color[2] += in1[2] * this->filter[8]; + color[3] += in1[3] * this->filter[8]; + + color[0] = color[0]*value[0] + in2[0] * mval; + color[1] = color[1]*value[0] + in2[1] * mval; + color[2] = color[2]*value[0] + in2[2] * mval; +} + +bool ConvolutionFilterOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + int addx = (this->filterWidth-1)/2+1; + int addy = (this->filterHeight-1)/2+1; + newInput.xmax = input->xmax + addx; + newInput.xmin = input->xmin - addx; + newInput.ymax = input->ymax + addy; + newInput.ymin = input->ymin - addy; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h new file mode 100644 index 00000000000..732b3d3699e --- /dev/null +++ b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ConvolutionFilterOperation_h_ +#define _COM_ConvolutionFilterOperation_h_ + +#include "COM_NodeOperation.h" + +class ConvolutionFilterOperation: public NodeOperation { +private: + int filterWidth; + int filterHeight; + +protected: + SocketReader *inputOperation; + SocketReader *inputValueOperation; + float* filter; + +public: + ConvolutionFilterOperation(); + void set3x3Filter(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data); + + void initExecution(); + void deinitExecution(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_CropOperation.cpp b/source/blender/compositor/operations/COM_CropOperation.cpp new file mode 100644 index 00000000000..a763ded7f52 --- /dev/null +++ b/source/blender/compositor/operations/COM_CropOperation.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CropOperation.h" +#include "BLI_math.h" + +CropBaseOperation::CropBaseOperation() :NodeOperation(){ + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; + this->settings = NULL; +} + +void CropBaseOperation::updateArea() { + SocketReader * inputReference = this->getInputSocketReader(0); + float width = inputReference->getWidth(); + float height = inputReference->getHeight(); + if (this->relative){ + settings->x1= width * settings->fac_x1; + settings->x2= width * settings->fac_x2; + settings->y1= height * settings->fac_y1; + settings->y2= height * settings->fac_y2; + } + if (width <= settings->x1 + 1) + settings->x1 = width - 1; + if (height <= settings->y1 + 1) + settings->y1 = height - 1; + if (width <= settings->x2 + 1) + settings->x2 = width - 1; + if (height <= settings->y2 + 1) + settings->y2 = height - 1; + + this->xmax = MAX2(settings->x1, settings->x2) + 1; + this->xmin = MIN2(settings->x1, settings->x2); + this->ymax = MAX2(settings->y1, settings->y2) + 1; + this->ymin = MIN2(settings->y1, settings->y2); +} + +void CropBaseOperation::initExecution(){ + this->inputOperation = this->getInputSocketReader(0); + updateArea(); +} + +void CropBaseOperation::deinitExecution(){ + this->inputOperation = NULL; +} + +CropOperation::CropOperation() :CropBaseOperation(){ +} + +void CropOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]){ + if ((x < this->xmax && x >= xmin) && (y < ymax && y >= ymin)){ + inputOperation->read(color, x, y, sampler, inputBuffers); + } else { + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.0f; + } +} + +CropImageOperation::CropImageOperation() :CropBaseOperation(){ +} + +bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output){ + rcti newInput; + + newInput.xmax = input->xmax + this->xmin; + newInput.xmin = input->xmin + this->xmin; + newInput.ymax = input->ymax + this->ymin; + newInput.ymin = input->ymin + this->ymin; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} + +void CropImageOperation::determineResolution(unsigned int resolution[], unsigned int preferedResolution[]){ + NodeOperation::determineResolution(resolution, preferedResolution); + updateArea(); + resolution[0] = this->xmax - this->xmin; + resolution[1] = this->ymax - this->ymin; +} + +void CropImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]){ + this->inputOperation->read(color, (x + this->xmin), (y + this->ymin), sampler, inputBuffers); +} diff --git a/source/blender/compositor/operations/COM_CropOperation.h b/source/blender/compositor/operations/COM_CropOperation.h new file mode 100644 index 00000000000..a728212d221 --- /dev/null +++ b/source/blender/compositor/operations/COM_CropOperation.h @@ -0,0 +1,63 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CropOperation_h_ +#define _COM_CropOperation_h_ + +#include "COM_NodeOperation.h" + +class CropBaseOperation: public NodeOperation { +protected: + SocketReader *inputOperation; + NodeTwoXYs *settings; + bool relative; + int xmax; + int xmin; + int ymax; + int ymin; + + void updateArea(); +public: + CropBaseOperation(); + void initExecution(); + void deinitExecution(); + void setCropSettings(NodeTwoXYs *settings) {this->settings = settings;} + void setRelative(bool rel) {this->relative =rel;} +}; + +class CropOperation: public CropBaseOperation { +private: +public: + CropOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +class CropImageOperation: public CropBaseOperation { +private: +public: + CropImageOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void determineResolution(unsigned int resolution[], unsigned int preferedResolution[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_CurveBaseOperation.cpp b/source/blender/compositor/operations/COM_CurveBaseOperation.cpp new file mode 100644 index 00000000000..ddccff01772 --- /dev/null +++ b/source/blender/compositor/operations/COM_CurveBaseOperation.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_CurveBaseOperation.h" + +#ifdef __cplusplus +extern "C" { +#endif + #include "BKE_colortools.h" +#ifdef __cplusplus +} +#endif + +CurveBaseOperation::CurveBaseOperation(): NodeOperation() { + this->curveMapping = NULL; +} +void CurveBaseOperation::initExecution() { + curvemapping_initialize(this->curveMapping); +} diff --git a/source/blender/compositor/operations/COM_CurveBaseOperation.h b/source/blender/compositor/operations/COM_CurveBaseOperation.h new file mode 100644 index 00000000000..bd4ee2ef2ed --- /dev/null +++ b/source/blender/compositor/operations/COM_CurveBaseOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_CurveBaseOperation_h +#define _COM_CurveBaseOperation_h +#include "COM_NodeOperation.h" +#include "DNA_color_types.h" + +class CurveBaseOperation : public NodeOperation { +protected: + /** + * Cached reference to the inputProgram + */ + CurveMapping *curveMapping; +public: + CurveBaseOperation(); + + /** + * Initialize the execution + */ + void initExecution(); + + void setCurveMapping(CurveMapping* mapping) {this->curveMapping = mapping;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp new file mode 100644 index 00000000000..92d9e29dcec --- /dev/null +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DifferenceMatteOperation.h" +#include "BLI_math.h" + +DifferenceMatteOperation::DifferenceMatteOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addInputSocket(COM_DT_COLOR); + addOutputSocket(COM_DT_VALUE); + + inputImage1Program = NULL; + inputImage2Program = NULL; +} + +void DifferenceMatteOperation::initExecution() { + this->inputImage1Program = this->getInputSocketReader(0); + this->inputImage2Program = this->getInputSocketReader(1); +} +void DifferenceMatteOperation::deinitExecution() { + this->inputImage1Program= NULL; + this->inputImage2Program= NULL; +} + +void DifferenceMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inColor1[4]; + float inColor2[4]; + + const float tolerence=this->settings->t1; + const float falloff=this->settings->t2; + float difference; + float alpha; + + this->inputImage1Program->read(inColor1, x, y, sampler, inputBuffers); + this->inputImage2Program->read(inColor2, x, y, sampler, inputBuffers); + + difference= fabs(inColor2[0]-inColor1[0])+ + fabs(inColor2[1]-inColor1[1])+ + fabs(inColor2[2]-inColor1[2]); + + /*average together the distances*/ + difference=difference/3.0; + + /*make 100% transparent*/ + if(difference < tolerence) { + outputValue[0]=0.0; + } + /*in the falloff region, make partially transparent */ + else if(difference < falloff+tolerence) { + difference=difference-tolerence; + alpha=difference/falloff; + /*only change if more transparent than before */ + if(alpha < inColor1[3]) { + outputValue[0]=alpha; + } + else { /* leave as before */ + outputValue[0]=inColor1[3]; + } + } + else { + /*foreground object*/ + outputValue[0]= inColor1[3]; + } +} + diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.h b/source/blender/compositor/operations/COM_DifferenceMatteOperation.h new file mode 100644 index 00000000000..2b63bfd7a15 --- /dev/null +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.h @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DifferenceMatteOperation_h +#define _COM_DifferenceMatteOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class DifferenceMatteOperation : public NodeOperation { +private: + NodeChroma* settings; + SocketReader * inputImage1Program; + SocketReader* inputImage2Program; +public: + /** + * Default constructor + */ + DifferenceMatteOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp new file mode 100644 index 00000000000..df3bf996c96 --- /dev/null +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -0,0 +1,145 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DilateErodeOperation.h" +#include "BLI_math.h" + +DilateErodeOperation::DilateErodeOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->setComplex(true); + this->inputProgram = NULL; + this->inset = 0.0f; + this->_switch = 0.5f; + this->distance = 0.0f; +} +void DilateErodeOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); + if (this->distance < 0.0f) { + this->scope = - this->distance + this->inset; + } else { + if (this->inset*2 > this->distance) { + this->scope = max(this->inset*2 - this->distance, this->distance); + } else { + this->scope = distance; + } + } + if (scope < 3) { + scope = 3; + } +} + +void* DilateErodeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + void* buffer = inputProgram->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void DilateErodeOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float inputValue[4]; + const float sw = this->_switch; + const float distance = this->distance; + float pixelvalue; + const float rd = scope * scope; + const float inset = this->inset; + float mindist = rd*2; + + MemoryBuffer* inputBuffer = (MemoryBuffer*)data; + float* buffer = inputBuffer->getBuffer(); + rcti* rect = inputBuffer->getRect(); + const int minx = max(x - scope, rect->xmin); + const int miny = max(y - scope, rect->ymin); + const int maxx = min(x + scope, rect->xmax); + const int maxy = min(y + scope, rect->ymax); + const int bufferWidth = rect->xmax-rect->xmin; + int offset; + + this->inputProgram->read(inputValue, x, y, inputBuffers, NULL); + if (inputValue[0]>sw) { + for (int yi = miny ; yiymin)*bufferWidth+(minx-rect->xmin))*4; + for (int xi = minx ; xiymin)*bufferWidth+(minx-rect->xmin))*4; + for (int xi = minx ; xisw) { + const float dx = xi-x; + const float dy = yi-y; + const float dis = dx*dx+dy*dy; + mindist = min(mindist, dis); + } + offset +=4; + + } + } + pixelvalue = sqrtf(mindist); + } + + if (distance > 0.0f) { + const float delta = distance - pixelvalue; + if (delta >= 0.0f) { + if (delta >= inset) { + color[0] = 1.0f; + } else { + color[0] = delta/inset; + } + } else { + color[0] = 0.0f; + } + } else { + const float delta = -distance+pixelvalue; + if (delta < 0.0f) { + if (delta < -inset) { + color[0] = 1.0f; + } else { + color[0] = (-delta)/inset; + } + } else { + color[0] = 0.0f; + } + } +} + +void DilateErodeOperation::deinitExecution() { + this->inputProgram = NULL; +} + +bool DilateErodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + newInput.xmax = input->xmax + scope; + newInput.xmin = input->xmin - scope; + newInput.ymax = input->ymax + scope; + newInput.ymin = input->ymin - scope; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.h b/source/blender/compositor/operations/COM_DilateErodeOperation.h new file mode 100644 index 00000000000..af554fa0d16 --- /dev/null +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.h @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DilateErodeOperation_h +#define _COM_DilateErodeOperation_h +#include "COM_NodeOperation.h" + + +class DilateErodeOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + + float distance; + float _switch; + float inset; + + /** + * determines the area of interest to track pixels + * keep this one as small as possible for speed gain. + */ + int scope; +public: + DilateErodeOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setDistance(float distance) {this->distance = distance;} + void setSwitch(float sw) {this->_switch = sw;} + void setInset(float inset) {this->inset = inset;} + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp new file mode 100644 index 00000000000..5b066d8f16e --- /dev/null +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp @@ -0,0 +1,115 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DirectionalBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +DirectionalBlurOperation::DirectionalBlurOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + + this->inputProgram = NULL; +} + +void DirectionalBlurOperation::initExecution() { + this->inputProgram = getInputSocketReader(0); + QualityStepHelper::initExecution(COM_QH_INCREASE); + const float angle = this->data->angle; + const float zoom = this->data->zoom; + const float spin = this->data->spin; + const float iterations = this->data->iter; + const float distance = this->data->distance; + const float center_x = this->data->center_x; + const float center_y = this->data->center_y; + const float width = getWidth(); + const float height = getHeight(); + + const float a= angle; + const float itsc= 1.f / pow(2.f, (float)iterations); + float D; + + D= distance * sqrtf(width*width + height*height); + center_x_pix= center_x * width; + center_y_pix= center_y * height; + + tx= itsc * D * cos(a); + ty= -itsc * D * sin(a); + sc= itsc * zoom; + rot= itsc * spin; + +} + +void DirectionalBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + const int iterations = pow(2.f, this->data->iter); + float col[4]= {0,0,0,0}; + float col2[4]= {0,0,0,0}; + this->inputProgram->read(col2, x, y, COM_PS_NEAREST, inputBuffers); + float ltx = tx; + float lty = ty; + float lsc = sc; + float lrot = rot; + /* blur the image */ + for(int i= 0; i < iterations; ++i) { + const float cs= cos(lrot), ss= sin(lrot); + const float isc= 1.f / (1.f + lsc); + + const float v= isc * (y - center_y_pix) + lty; + const float u= isc * (x - center_x_pix) + ltx; + + this->inputProgram->read(col, cs * u + ss * v + center_x_pix, cs * v - ss * u + center_y_pix, COM_PS_NEAREST, inputBuffers); + + col2[0] += col[0]; + col2[1] += col[1]; + col2[2] += col[2]; + col2[3] += col[3]; + + /* double transformations */ + ltx += tx; + lty += ty; + lrot += rot; + lsc += sc; + } + color[0] = col2[0]/iterations; + color[1] = col2[1]/iterations; + color[2] = col2[2]/iterations; + color[3] = col2[3]/iterations; +} + +void DirectionalBlurOperation::deinitExecution() { + this->inputProgram = NULL; +} + +bool DirectionalBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.h b/source/blender/compositor/operations/COM_DirectionalBlurOperation.h new file mode 100644 index 00000000000..e82b451c102 --- /dev/null +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.h @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehDirectionalBlurOperation_h +#define _COM_DirectionalBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_QualityStepHelper.h" + +class DirectionalBlurOperation : public NodeOperation, public QualityStepHelper { +private: + SocketReader* inputProgram; + NodeDBlurData* data; + + float center_x_pix, center_y_pix; + float tx, ty; + float sc, rot; + +public: + DirectionalBlurOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + void setData(NodeDBlurData *data) {this->data = data;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_DisplaceOperation.cpp b/source/blender/compositor/operations/COM_DisplaceOperation.cpp new file mode 100644 index 00000000000..b30ce5ac5b5 --- /dev/null +++ b/source/blender/compositor/operations/COM_DisplaceOperation.cpp @@ -0,0 +1,147 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_DisplaceOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + +DisplaceOperation::DisplaceOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VECTOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + + this->inputColorProgram = NULL; + this->inputVectorProgram = NULL; + this->inputScaleXProgram = NULL; + this->inputScaleYProgram = NULL; +} + +void DisplaceOperation::initExecution() { + this->inputColorProgram = this->getInputSocketReader(0); + this->inputVectorProgram = this->getInputSocketReader(1); + this->inputScaleXProgram = this->getInputSocketReader(2); + this->inputScaleYProgram = this->getInputSocketReader(3); + + width_x4 = this->getWidth() * 4; + height_x4 = this->getHeight() * 4; +} + + +/* minimum distance (in pixels) a pixel has to be displaced + * in order to take effect */ +#define DISPLACE_EPSILON 0.01f + +void DisplaceOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) +{ + float inVector[4]; + float inScale[4]; + + float p_dx, p_dy; /* main displacement in pixel space */ + float d_dx, d_dy; + float dxt, dyt; + float u, v; + + this->inputScaleXProgram->read(inScale, x, y, COM_PS_NEAREST, inputBuffers); + float xs = inScale[0]; + this->inputScaleYProgram->read(inScale, x, y, COM_PS_NEAREST, inputBuffers); + float ys = inScale[0]; + + /* clamp x and y displacement to triple image resolution - + * to prevent hangs from huge values mistakenly plugged in eg. z buffers */ + CLAMP(xs, -width_x4, width_x4); + CLAMP(ys, -height_x4, height_x4); + + this->inputVectorProgram->read(inVector, x, y, COM_PS_NEAREST, inputBuffers); + p_dx = inVector[0] * xs; + p_dy = inVector[1] * ys; + + /* displaced pixel in uv coords, for image sampling */ + u = x - p_dx + 0.5f; + v = y - p_dy + 0.5f; + + /* calc derivatives */ + this->inputVectorProgram->read(inVector, x+1, y, COM_PS_NEAREST, inputBuffers); + d_dx = inVector[0] * xs; + this->inputVectorProgram->read(inVector, x, y+1, COM_PS_NEAREST, inputBuffers); + d_dy = inVector[0] * ys; + + /* clamp derivatives to minimum displacement distance in UV space */ + dxt = p_dx - d_dx; + dyt = p_dy - d_dy; + + dxt = signf(dxt)*maxf(fabsf(dxt), DISPLACE_EPSILON)/this->getWidth(); + dyt = signf(dyt)*maxf(fabsf(dyt), DISPLACE_EPSILON)/this->getHeight(); + + /* EWA filtering */ + this->inputColorProgram->read(color, u, v, dxt, dyt, inputBuffers); +} + +void DisplaceOperation::deinitExecution() { + this->inputColorProgram = NULL; + this->inputVectorProgram = NULL; + this->inputScaleXProgram = NULL; + this->inputScaleYProgram = NULL; +} + +bool DisplaceOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti colorInput; + rcti vectorInput; + NodeOperation *operation=NULL; + + /* the vector buffer only needs a 2x2 buffer. The image needs whole buffer */ + /* image */ + operation = getInputOperation(0); + colorInput.xmax = operation->getWidth(); + colorInput.xmin = 0; + colorInput.ymax = operation->getHeight(); + colorInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&colorInput, readOperation, output)) { + return true; + } + + /* vector */ + operation = getInputOperation(1); + vectorInput.xmax = input->xmax + 2; + vectorInput.xmin = input->xmin; + vectorInput.ymax = input->ymax + 2; + vectorInput.ymin = input->ymin; + if (operation->determineDependingAreaOfInterest(&vectorInput, readOperation, output)) { + return true; + } + + /* scale x */ + operation = getInputOperation(2); + if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) { + return true; + } + + /* scale y */ + operation = getInputOperation(3); + if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) { + return true; + } + + return false; +} + diff --git a/source/blender/compositor/operations/COM_DisplaceOperation.h b/source/blender/compositor/operations/COM_DisplaceOperation.h new file mode 100644 index 00000000000..17f65eea20f --- /dev/null +++ b/source/blender/compositor/operations/COM_DisplaceOperation.h @@ -0,0 +1,63 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_DisplaceOperation_h +#define _COM_DisplaceOperation_h +#include "COM_NodeOperation.h" + + +class DisplaceOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputColorProgram; + SocketReader* inputVectorProgram; + SocketReader* inputScaleXProgram; + SocketReader* inputScaleYProgram; + + float width_x4; + float height_x4; + +public: + DisplaceOperation(); + + /** + * we need a 2x2 differential filter for Vector Input and full buffer for the image + */ + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp new file mode 100644 index 00000000000..99d1eb1cd14 --- /dev/null +++ b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp @@ -0,0 +1,127 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_DisplaceSimpleOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + +DisplaceSimpleOperation::DisplaceSimpleOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VECTOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + + this->inputColorProgram = NULL; + this->inputVectorProgram = NULL; + this->inputScaleXProgram = NULL; + this->inputScaleYProgram = NULL; +} + +void DisplaceSimpleOperation::initExecution() { + this->inputColorProgram = this->getInputSocketReader(0); + this->inputVectorProgram = this->getInputSocketReader(1); + this->inputScaleXProgram = this->getInputSocketReader(2); + this->inputScaleYProgram = this->getInputSocketReader(3); + + width_x4 = this->getWidth() * 4; + height_x4 = this->getHeight() * 4; +} + + +/* minimum distance (in pixels) a pixel has to be displaced + * in order to take effect */ +#define DISPLACE_EPSILON 0.01f + +void DisplaceSimpleOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ + float inVector[4]; + float inScale[4]; + + float p_dx, p_dy; /* main displacement in pixel space */ + float u, v; + + this->inputScaleXProgram->read(inScale, x, y, sampler, inputBuffers); + float xs = inScale[0]; + this->inputScaleYProgram->read(inScale, x, y, sampler, inputBuffers); + float ys = inScale[0]; + + /* clamp x and y displacement to triple image resolution - + * to prevent hangs from huge values mistakenly plugged in eg. z buffers */ + CLAMP(xs, -width_x4, width_x4); + CLAMP(ys, -height_x4, height_x4); + + this->inputVectorProgram->read(inVector, x, y, sampler, inputBuffers); + p_dx = inVector[0] * xs; + p_dy = inVector[1] * ys; + + /* displaced pixel in uv coords, for image sampling */ + /* clamp nodes to avoid glitches */ + u = x - p_dx + 0.5f; + v = y - p_dy + 0.5f; + CLAMP(u, 0.f, this->getWidth()-1.f); + CLAMP(v, 0.f, this->getHeight()-1.f); + + this->inputColorProgram->read(color, u, v, sampler, inputBuffers); +} + +void DisplaceSimpleOperation::deinitExecution() { + this->inputColorProgram = NULL; + this->inputVectorProgram = NULL; + this->inputScaleXProgram = NULL; + this->inputScaleYProgram = NULL; +} + +bool DisplaceSimpleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti colorInput; + NodeOperation *operation=NULL; + + /* the vector buffer only needs a 2x2 buffer. The image needs whole buffer */ + /* image */ + operation = getInputOperation(0); + colorInput.xmax = operation->getWidth(); + colorInput.xmin = 0; + colorInput.ymax = operation->getHeight(); + colorInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&colorInput, readOperation, output)) { + return true; + } + + /* vector */ + if (operation->determineDependingAreaOfInterest(input, readOperation, output)) { + return true; + } + + /* scale x */ + operation = getInputOperation(2); + if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) { + return true; + } + + /* scale y */ + operation = getInputOperation(3); + if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) { + return true; + } + + return false; +} + diff --git a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h new file mode 100644 index 00000000000..88569954305 --- /dev/null +++ b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h @@ -0,0 +1,63 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_DisplaceSimpleOperation_h +#define _COM_DisplaceSimpleOperation_h +#include "COM_NodeOperation.h" + + +class DisplaceSimpleOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputColorProgram; + SocketReader* inputVectorProgram; + SocketReader* inputScaleXProgram; + SocketReader* inputScaleYProgram; + + float width_x4; + float height_x4; + +public: + DisplaceSimpleOperation(); + + /** + * we need a full buffer for the image + */ + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp b/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp new file mode 100644 index 00000000000..bef470ca9de --- /dev/null +++ b/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_DistanceMatteOperation.h" +#include "BLI_math.h" + +DistanceMatteOperation::DistanceMatteOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addInputSocket(COM_DT_COLOR); + addOutputSocket(COM_DT_VALUE); + + inputImageProgram = NULL; + inputKeyProgram = NULL; +} + +void DistanceMatteOperation::initExecution() { + this->inputImageProgram = this->getInputSocketReader(0); + this->inputKeyProgram = this->getInputSocketReader(1); +} + +void DistanceMatteOperation::deinitExecution() { + this->inputImageProgram= NULL; + this->inputKeyProgram= NULL; +} + +void DistanceMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inKey[4]; + float inImage[4]; + + const float tolerence=this->settings->t1; + const float falloff=this->settings->t2; + + float distance; + float alpha; + + this->inputKeyProgram->read(inKey, x, y, sampler, inputBuffers); + this->inputImageProgram->read(inImage, x, y, sampler, inputBuffers); + + distance = sqrt(pow((inKey[0]-inImage[0]),2)+ + pow((inKey[1]-inImage[1]),2)+ + pow((inKey[2]-inImage[2]),2)); + + /* store matte(alpha) value in [0] to go with + * COM_SetAlphaOperation and the Value output + */ + + /*make 100% transparent */ + if(distance < tolerence) { + outputValue[0]=0.f; + } + /*in the falloff region, make partially transparent */ + else if(distance < falloff+tolerence){ + distance=distance-tolerence; + alpha=distance/falloff; + /*only change if more transparent than before */ + if(alpha < inImage[3]) { + outputValue[0]=alpha; + } + else { /* leave as before */ + outputValue[0]=inImage[3]; + } + } + else { + /* leave as before */ + outputValue[0]=inImage[3]; + } +} + diff --git a/source/blender/compositor/operations/COM_DistanceMatteOperation.h b/source/blender/compositor/operations/COM_DistanceMatteOperation.h new file mode 100644 index 00000000000..efa735445fa --- /dev/null +++ b/source/blender/compositor/operations/COM_DistanceMatteOperation.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_DistanceMatteOperation_h +#define _COM_DistanceMatteOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class DistanceMatteOperation : public NodeOperation { +private: + NodeChroma *settings; + SocketReader *inputImageProgram; + SocketReader *inputKeyProgram; +public: + /** + * Default constructor + */ + DistanceMatteOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_DotproductOperation.cpp b/source/blender/compositor/operations/COM_DotproductOperation.cpp new file mode 100644 index 00000000000..284fb0ddca4 --- /dev/null +++ b/source/blender/compositor/operations/COM_DotproductOperation.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DotproductOperation.h" + +DotproductOperation::DotproductOperation() : NodeOperation() { + this->addInputSocket(COM_DT_VECTOR); + this->addInputSocket(COM_DT_VECTOR); + this->addOutputSocket(COM_DT_VALUE); + this->setResolutionInputSocketIndex(0); + this->input1Operation = NULL; + this->input2Operation = NULL; +} +void DotproductOperation::initExecution() { + this->input1Operation = this->getInputSocketReader(0); + this->input2Operation = this->getInputSocketReader(1); +} + +void DotproductOperation::deinitExecution() { + this->input1Operation = NULL; + this->input2Operation = NULL; +} + +/** @todo: current implementation is the inverse of a dotproduct. not 'logically' correct + */ +void DotproductOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float input1[4]; + float input2[4]; + this->input1Operation->read(input1, x, y, sampler, inputBuffers); + this->input2Operation->read(input2, x, y, sampler, inputBuffers); + color[0] = -(input1[0]*input2[0]+input1[1]*input2[1]+input1[2]*input2[2]); +} diff --git a/source/blender/compositor/operations/COM_DotproductOperation.h b/source/blender/compositor/operations/COM_DotproductOperation.h new file mode 100644 index 00000000000..0244fffa110 --- /dev/null +++ b/source/blender/compositor/operations/COM_DotproductOperation.h @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DotproductOperation_h_ +#define _COM_DotproductOperation_h_ + +#include "COM_NodeOperation.h" + +class DotproductOperation: public NodeOperation { +private: + SocketReader *input1Operation; + SocketReader *input2Operation; +public: + DotproductOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp new file mode 100644 index 00000000000..cb6b27b9da1 --- /dev/null +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp @@ -0,0 +1,1195 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_DoubleEdgeMaskOperation.h" +#include "BLI_math.h" +#include "DNA_node_types.h" + +// this part has been copied from the double edge mask +// Contributor(s): Peter Larabell. +static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ + int x; + unsigned int isz=0; // inner edge size + unsigned int osz=0; // outer edge size + unsigned int gsz=0; // gradient fill area size + /* Test the four corners */ + /* upper left corner */ + x=t-rw+1; + // test if inner mask is filled + if(limask[x]){ + // test if pixel underneath, or to the right, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + /* upper right corner */ + x=t; + // test if inner mask is filled + if(limask[x]){ + // test if pixel underneath, or to the left, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + /* lower left corner */ + x=0; + // test if inner mask is filled + if(limask[x]){ + // test if pixel above, or to the right, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + /* lower right corner */ + x=rw-1; + // test if inner mask is filled + if(limask[x]){ + // test if pixel above, or to the left, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + + /* Test the TOP row of pixels in buffer, except corners */ + for(x= t-1; x>=(t-rw)+2; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel to the right, or to the left, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + + /* Test the BOTTOM row of pixels in buffer, except corners */ + for(x= rw-2; x; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel to the right, or to the left, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + /* Test the LEFT edge of pixels in buffer, except corners */ + for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel underneath, or above, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + + /* Test the RIGHT edge of pixels in buffer, except corners */ + for(x= t-rw; x>rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel underneath, or above, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + + rsize[0]=isz; // fill in our return sizes for edges + fill + rsize[1]=osz; + rsize[2]=gsz; +} + +static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ + int x; + unsigned int isz=0; // inner edge size + unsigned int osz=0; // outer edge size + unsigned int gsz=0; // gradient fill area size + /* Test the four corners */ + /* upper left corner */ + x=t-rw+1; + // test if inner mask is filled + if(limask[x]){ + // test if pixel underneath, or to the right, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* upper right corner */ + x=t; + // test if inner mask is filled + if(limask[x]){ + // test if pixel underneath, or to the left, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* lower left corner */ + x=0; + // test if inner mask is filled + if(limask[x]){ + // test if pixel above, or to the right, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty above or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* lower right corner */ + x=rw-1; + // test if inner mask is filled + if(limask[x]){ + // test if pixel above, or to the left, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* Test the TOP row of pixels in buffer, except corners */ + for(x= t-1; x>=(t-rw)+2; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel to the left, or to the right, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + + /* Test the BOTTOM row of pixels in buffer, except corners */ + for(x= rw-2; x; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel to the left, or to the right, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + /* Test the LEFT edge of pixels in buffer, except corners */ + for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel underneath, or above, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + + /* Test the RIGHT edge of pixels in buffer, except corners */ + for(x= t-rw; x>rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if pixel underneath, or above, are empty in the inner mask, + // but filled in the outer mask + if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + + rsize[0]=isz; // fill in our return sizes for edges + fill + rsize[1]=osz; + rsize[2]=gsz; +} + +static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ + int x; + unsigned int isz=0; // inner edge size + unsigned int osz=0; // outer edge size + unsigned int gsz=0; // gradient fill area size + /* Test the four corners */ + /* upper left corner */ + x=t-rw+1; + // test if inner mask is filled + if(limask[x]){ + // test if the inner mask is empty underneath or to the right + if(!limask[x-rw] || !limask[x+1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + /* upper right corner */ + x=t; + // test if inner mask is filled + if(limask[x]){ + // test if the inner mask is empty underneath or to the left + if(!limask[x-rw] || !limask[x-1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + /* lower left corner */ + x=0; + // test if inner mask is filled + if(limask[x]){ + // test if inner mask is empty above or to the right + if(!limask[x+rw] || !limask[x+1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + /* lower right corner */ + x=rw-1; + // test if inner mask is filled + if(limask[x]){ + // test if inner mask is empty above or to the left + if(!limask[x+rw] || !limask[x-1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + + /* Test the TOP row of pixels in buffer, except corners */ + for(x= t-1; x>=(t-rw)+2; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty to the left or to the right + if(!limask[x-1] || !limask[x+1]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + + /* Test the BOTTOM row of pixels in buffer, except corners */ + for(x= rw-2; x; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty to the left or to the right + if(!limask[x-1] || !limask[x+1]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + /* Test the LEFT edge of pixels in buffer, except corners */ + for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty underneath or above + if(!limask[x-rw] || !limask[x+rw]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + + /* Test the RIGHT edge of pixels in buffer, except corners */ + for(x= t-rw; x>rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty underneath or above + if(!limask[x-rw] || !limask[x+rw]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } + } + + rsize[0]=isz; // fill in our return sizes for edges + fill + rsize[1]=osz; + rsize[2]=gsz; +} + +static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ + int x; + unsigned int isz=0; // inner edge size + unsigned int osz=0; // outer edge size + unsigned int gsz=0; // gradient fill area size + /* Test the four corners */ + /* upper left corner */ + x=t-rw+1; + // test if inner mask is filled + if(limask[x]){ + // test if the inner mask is empty underneath or to the right + if(!limask[x-rw] || !limask[x+1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* upper right corner */ + x=t; + // test if inner mask is filled + if(limask[x]){ + // test if the inner mask is empty underneath or to the left + if(!limask[x-rw] || !limask[x-1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* lower left corner */ + x=0; + // test if inner mask is filled + if(limask[x]){ + // test if inner mask is empty above or to the right + if(!limask[x+rw] || !limask[x+1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* lower right corner */ + x=rw-1; + // test if inner mask is filled + if(limask[x]){ + // test if inner mask is empty above or to the left + if(!limask[x+rw] || !limask[x-1]){ + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + if(!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + /* Test the TOP row of pixels in buffer, except corners */ + for(x= t-1; x>=(t-rw)+2; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty to the left or to the right + if(!limask[x-1] || !limask[x+1]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + + /* Test the BOTTOM row of pixels in buffer, except corners */ + for(x= rw-2; x; x--) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty to the left or to the right + if(!limask[x-1] || !limask[x+1]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + /* Test the LEFT edge of pixels in buffer, except corners */ + for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty underneath or above + if(!limask[x-rw] || !limask[x+rw]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + + /* Test the RIGHT edge of pixels in buffer, except corners */ + for(x= t-rw; x>rw; x-=rw) { + // test if inner mask is filled + if(limask[x]) { + // test if inner mask is empty underneath or above + if(!limask[x-rw] || !limask[x+rw]) { + isz++; // increment inner edge size + lres[x]=4; // flag pixel as inner edge + } else { + res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge + } + } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + osz++; // increment outer edge size + lres[x]=3; // flag pixel as outer edge + } else { + gsz++; // increment the gradient pixel count + lres[x]=2; // flag pixel as gradient + } + } + } + + rsize[0]=isz; // fill in our return sizes for edges + fill + rsize[1]=osz; + rsize[2]=gsz; +} + +static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz){ + int x; // x = pixel loop counter + int a; // a = pixel loop counter + int dx; // dx = delta x + int pix_prevRow; // pix_prevRow = pixel one row behind the one we are testing in a loop + int pix_nextRow; // pix_nextRow = pixel one row in front of the one we are testing in a loop + int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop + int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop + /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ + for(x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { + a=x-2; + pix_prevRow=a+rw; + pix_nextRow=a-rw; + pix_prevCol=a+1; + pix_nextCol=a-1; + while(a>dx-2) { + if(!limask[a]) { // if the inner mask is empty + if(lomask[a]) { // if the outer mask is full + /* + Next we test all 4 directions around the current pixel: next/prev/up/down + The test ensures that the outer mask is empty and that the inner mask + is also empty. If both conditions are true for any one of the 4 adjacent pixels + then the current pixel is counted as being a true outer edge pixel. + */ + if((!lomask[pix_nextCol] && !limask[pix_nextCol]) || + (!lomask[pix_prevCol] && !limask[pix_prevCol]) || + (!lomask[pix_nextRow] && !limask[pix_nextRow]) || + (!lomask[pix_prevRow] && !limask[pix_prevRow])) + { + in_osz++; // increment the outer boundary pixel count + lres[a]=3; // flag pixel as part of outer edge + } else { // it's not a boundary pixel, but it is a gradient pixel + in_gsz++; // increment the gradient pixel count + lres[a]=2; // flag pixel as gradient + } + } + + } else { + if(!limask[pix_nextCol] || !limask[pix_prevCol] || !limask[pix_nextRow] || !limask[pix_prevRow]) { + in_isz++; // increment the inner boundary pixel count + lres[a]=4; // flag pixel as part of inner edge + } else { + res[a]=1.0f; // pixel is part of inner mask, but not at an edge + } + } + a--; + pix_prevRow--; + pix_nextRow--; + pix_prevCol--; + pix_nextCol--; + } + } + + rsize[0]=in_isz; // fill in our return sizes for edges + fill + rsize[1]=in_osz; + rsize[2]=in_gsz; +} + +static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz){ + int x; // x = pixel loop counter + int a; // a = pixel loop counter + int dx; // dx = delta x + int pix_prevRow; // pix_prevRow = pixel one row behind the one we are testing in a loop + int pix_nextRow; // pix_nextRow = pixel one row in front of the one we are testing in a loop + int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop + int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop + /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ + for(x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { + a=x-2; + pix_prevRow=a+rw; + pix_nextRow=a-rw; + pix_prevCol=a+1; + pix_nextCol=a-1; + while(a>dx-2) { + if(!limask[a]) { // if the inner mask is empty + if(lomask[a]) { // if the outer mask is full + /* + Next we test all 4 directions around the current pixel: next/prev/up/down + The test ensures that the outer mask is empty and that the inner mask + is also empty. If both conditions are true for any one of the 4 adjacent pixels + then the current pixel is counted as being a true outer edge pixel. + */ + if((!lomask[pix_nextCol] && !limask[pix_nextCol]) || + (!lomask[pix_prevCol] && !limask[pix_prevCol]) || + (!lomask[pix_nextRow] && !limask[pix_nextRow]) || + (!lomask[pix_prevRow] && !limask[pix_prevRow])) + { + in_osz++; // increment the outer boundary pixel count + lres[a]=3; // flag pixel as part of outer edge + } else { // it's not a boundary pixel, but it is a gradient pixel + in_gsz++; // increment the gradient pixel count + lres[a]=2; // flag pixel as gradient + } + } + + } else { + if((!limask[pix_nextCol] && lomask[pix_nextCol]) || + (!limask[pix_prevCol] && lomask[pix_prevCol]) || + (!limask[pix_nextRow] && lomask[pix_nextRow]) || + (!limask[pix_prevRow] && lomask[pix_prevRow])) + { + in_isz++; // increment the inner boundary pixel count + lres[a]=4; // flag pixel as part of inner edge + } else { + res[a]=1.0f; // pixel is part of inner mask, but not at an edge + } + } + a--; + pix_prevRow--; // advance all four "surrounding" pixel pointers + pix_nextRow--; + pix_prevCol--; + pix_nextCol--; + } + } + + rsize[0]=in_isz; // fill in our return sizes for edges + fill + rsize[1]=in_osz; + rsize[2]=in_gsz; +} + +static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigned int *lres, float *res, unsigned short *gbuf, unsigned int *innerEdgeOffset, unsigned int *outerEdgeOffset, unsigned int isz, unsigned int gsz){ + int x; // x = pixel loop counter + int a; // a = temporary pixel index buffer loop counter + unsigned int ud; // ud = unscaled edge distance + unsigned int dmin; // dmin = minimun edge distance + + unsigned int rsl; // long used for finding fast 1.0/sqrt + unsigned int gradientFillOffset; + unsigned int innerAccum=0; // for looping inner edge pixel indexes, represents current position from offset + unsigned int outerAccum=0; // for looping outer edge pixel indexes, represents current position from offset + unsigned int gradientAccum=0; // for looping gradient pixel indexes, represents current position from offset + /* + Here we compute the size of buffer needed to hold (row,col) coordinates + for each pixel previously determined to be either gradient, inner edge, + or outer edge. + + Allocation is done by requesting 4 bytes "sizeof(int)" per pixel, even + though gbuf[] is declared as unsigned short* (2 bytes) because we don't + store the pixel indexes, we only store x,y location of pixel in buffer. + + This does make the assumption that x and y can fit in 16 unsigned bits + so if Blender starts doing renders greater than 65536 in either direction + this will need to allocate gbuf[] as unsigned int* and allocate 8 bytes + per flagged pixel. + + In general, the buffer on-screen: + + Example: 9 by 9 pixel block + + . = pixel non-white in both outer and inner mask + o = pixel white in outer, but not inner mask, adjacent to "." pixel + g = pixel white in outer, but not inner mask, not adjacent to "." pixel + i = pixel white in inner mask, adjacent to "g" or "." pixel + F = pixel white in inner mask, only adjacent to other pixels white in the inner mask + + + ......... <----- pixel #80 + ..oooo... + .oggggo.. + .oggiggo. + .ogiFigo. + .oggiggo. + .oggggo.. + ..oooo... + pixel #00 -----> ......... + + gsz = 18 (18 "g" pixels above) + isz = 4 (4 "i" pixels above) + osz = 18 (18 "o" pixels above) + + + The memory in gbuf[] after filling will look like this: + + gradientFillOffset (0 pixels) innerEdgeOffset (18 pixels) outerEdgeOffset (22 pixels) + / / / + / / / + |X Y X Y X Y X Y > <----------------> <------------------------> <----------------+ + |0 2 4 6 8 10 12 14 > ... <68 70 72 74 > ... <80 82 84 86 88 90 > ... <152 154 156 158 | <- bytes + +--------------------------------> <----------------> <------------------------> <----------------+ + |g0 g0 g1 g1 g2 g2 g3 g3 > =0; x--) { + gradientFillOffset=x<<1; + t=gbuf[gradientFillOffset]; // calculate column of pixel indexed by gbuf[x] + fsz=gbuf[gradientFillOffset+1]; // calculate row of pixel indexed by gbuf[x] + dmin=0xffffffff; // reset min distance to edge pixel + for(a=outerEdgeOffset+osz-1; a>=outerEdgeOffset; a--) { // loop through all outer edge buffer pixels + ud=a<<1; + dy=t-gbuf[ud]; // set dx to gradient pixel column - outer edge pixel row + dx=fsz-gbuf[ud+1]; // set dy to gradient pixel row - outer edge pixel column + ud=dx*dx+dy*dy; // compute sum of squares + if(ud>1); // in floats vs. unsigned ints to compute an approximate + odist=*(float*)&rsl; // reciprocal square root + odist=odist*(rsopf-(rsf*odist*odist)); // -- ** this line can be iterated for more accuracy ** -- + dmin=0xffffffff; // reset min distance to edge pixel + for(a= innerEdgeOffset+isz-1; a>=innerEdgeOffset; a--) { // loop through all inside edge pixels + ud=a<<1; + dy=t-gbuf[ud]; // compute delta in Y from gradient pixel to inside edge pixel + dx=fsz-gbuf[ud+1]; // compute delta in X from gradient pixel to inside edge pixel + ud=dx*dx+dy*dy; // compute sum of squares + if(ud>1); // see notes above + idist=*(float*)&rsl; // + idist=idist*(rsopf-(rsf*idist*idist)); // + /* + Note once again that since we are using reciprocals of distance values our + proportion is already the correct intensity, and does not need to be + subracted from 1.0 like it would have if we used real distances. + */ + + /* + Here we reconstruct the pixel's memory location in the CompBuf by + Pixel Index = Pixel Column + ( Pixel Row * Row Width ) + */ + res[gbuf[gradientFillOffset+1]+(gbuf[gradientFillOffset]*rw)]=(idist/(idist+odist)); //set intensity + } + +} + +// end of copy + +void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float *res) { + + unsigned int *lres; // lres = unsigned int pointer to output pixel buffer (for bit operations) + unsigned int *limask; // limask = unsigned int pointer to inner mask (for bit operations) + unsigned int *lomask; // lomask = unsigned int pointer to outer mask (for bit operations) + + int rw; // rw = pixel row width + int t; // t = total number of pixels in buffer - 1 (used for loop starts) + int fsz; // size of the frame + + unsigned int isz=0; // size (in pixels) of inside edge pixel index buffer + unsigned int osz=0; // size (in pixels) of outside edge pixel index buffer + unsigned int gsz=0; // size (in pixels) of gradient pixel index buffer + unsigned int rsize[3]; // size storage to pass to helper functions + unsigned int innerEdgeOffset=0; // offset into final buffer where inner edge pixel indexes start + unsigned int outerEdgeOffset=0; // offset into final buffer where outer edge pixel indexes start + + unsigned short *gbuf; // gradient/inner/outer pixel location index buffer + + if(true) { // if both input sockets have some data coming in... + + t=(this->getWidth()*this->getHeight())-1; // determine size of the frame + + lres= (unsigned int*)res; // unsigned int pointer to output buffer (for bit level ops) + limask=(unsigned int*)imask; // unsigned int pointer to input mask (for bit level ops) + lomask=(unsigned int*)omask; // unsigned int pointer to output mask (for bit level ops) + rw= this->getWidth(); // width of a row of pixels + + + /* + The whole buffer is broken up into 4 parts. The four CORNERS, the FIRST and LAST rows, the + LEFT and RIGHT edges (excluding the corner pixels), and all OTHER rows. + This allows for quick computation of outer edge pixels where + a screen edge pixel is marked to be gradient. + + The pixel type (gradient vs inner-edge vs outer-edge) tests change + depending on the user selected "Inner Edge Mode" and the user selected + "Buffer Edge Mode" on the node's GUI. There are 4 sets of basically the + same algorithm: + + 1.) Inner Edge -> Adjacent Only + Buffer Edge -> Keep Inside + + 2.) Inner Edge -> Adjacent Only + Buffer Edge -> Bleed Out + + 3.) Inner Edge -> All + Buffer Edge -> Keep Inside + + 4.) Inner Edge -> All + Buffer Edge -> Bleed Out + + Each version has slightly different criteria for detecting an edge pixel. + */ + if(this->adjecentOnly) { // if "adjacent only" inner edge mode is turned on + if(this->keepInside) { // if "keep inside" buffer edge mode is turned on + do_adjacentKeepBorders(t,rw,limask,lomask,lres,res,rsize); + }else{ // "bleed out" buffer edge mode is turned on + do_adjacentBleedBorders(t,rw,limask,lomask,lres,res,rsize); + } + isz=rsize[0]; // set up inner edge, outer edge, and gradient buffer sizes after border pass + osz=rsize[1]; + gsz=rsize[2]; + // detect edges in all non-border pixels in the buffer + do_adjacentEdgeDetection(t,rw,limask,lomask,lres,res,rsize,isz,osz,gsz); + }else{ // "all" inner edge mode is turned on + if(this->keepInside) { // if "keep inside" buffer edge mode is turned on + do_allKeepBorders(t,rw,limask,lomask,lres,res,rsize); + }else{ // "bleed out" buffer edge mode is turned on + do_allBleedBorders(t,rw,limask,lomask,lres,res,rsize); + } + isz=rsize[0]; // set up inner edge, outer edge, and gradient buffer sizes after border pass + osz=rsize[1]; + gsz=rsize[2]; + // detect edges in all non-border pixels in the buffer + do_allEdgeDetection(t,rw,limask,lomask,lres,res,rsize,isz,osz,gsz); + } + + isz=rsize[0]; // set edge and gradient buffer sizes once again... + osz=rsize[1]; // the sizes in rsize[] may have been modified + gsz=rsize[2]; // by the do_*EdgeDetection() function. + + fsz=gsz+isz+osz; // calculate size of pixel index buffer needed + gbuf= new unsigned short[fsz*2]; // allocate edge/gradient pixel index buffer + + do_createEdgeLocationBuffer(t,rw,lres,res,gbuf,&innerEdgeOffset,&outerEdgeOffset,isz,gsz); + do_fillGradientBuffer(rw,res,gbuf,isz,osz,gsz,innerEdgeOffset,outerEdgeOffset); + + delete gbuf; // free the gradient index buffer + } +} + +DoubleEdgeMaskOperation::DoubleEdgeMaskOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputInnerMask = NULL; + this->inputOuterMask = NULL; + this->adjecentOnly = false; + this->keepInside = false; + this->setComplex(true); +} + +bool DoubleEdgeMaskOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + if (this->cachedInstance == NULL) { + rcti newInput; + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } else { + return false; + } +} + +void DoubleEdgeMaskOperation::initExecution() { + this->inputInnerMask = this->getInputSocketReader(0); + this->inputOuterMask = this->getInputSocketReader(1); + initMutex(); + this->cachedInstance = NULL; +} + +void* DoubleEdgeMaskOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + if (this->cachedInstance) return this->cachedInstance; + + BLI_mutex_lock(getMutex()); + if (this->cachedInstance == NULL) { + MemoryBuffer* innerMask = (MemoryBuffer*)inputInnerMask->initializeTileData(rect, memoryBuffers); + MemoryBuffer* outerMask= (MemoryBuffer*)inputOuterMask->initializeTileData(rect, memoryBuffers); + float* data = new float[this->getWidth()*this->getHeight()]; + float* imask = innerMask->convertToValueBuffer(); + float* omask = outerMask->convertToValueBuffer(); + doDoubleEdgeMask(imask, omask, data); + delete imask; + delete omask; + this->cachedInstance = data; + } + BLI_mutex_unlock(getMutex()); + return this->cachedInstance; +} +void DoubleEdgeMaskOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float* buffer = (float*) data; + int index = (y*this->getWidth() + x); + color[0] = buffer[index]; + color[1] = buffer[index+1]; + color[2] = buffer[index+2]; + color[3] = buffer[index+3]; +} + +void DoubleEdgeMaskOperation::deinitExecution() { + this->inputInnerMask = NULL; + this->inputOuterMask = NULL; + deinitMutex(); + if (this->cachedInstance) { + delete cachedInstance; + this->cachedInstance = NULL; + } +} + diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h new file mode 100644 index 00000000000..f233570800a --- /dev/null +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_DoubleEdgeMaskOperation_h +#define _COM_DoubleEdgeMaskOperation_h +#include "COM_NodeOperation.h" + + +class DoubleEdgeMaskOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOuterMask; + SocketReader * inputInnerMask; + bool adjecentOnly; + bool keepInside; + float* cachedInstance; +public: + DoubleEdgeMaskOperation(); + + void doDoubleEdgeMask(float* inner, float *outer, float *res); + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + void setAdjecentOnly(bool adjecentOnly) {this->adjecentOnly = adjecentOnly;} + void setKeepInside(bool keepInside) {this->keepInside = keepInside;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp b/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp new file mode 100644 index 00000000000..033cb4da84d --- /dev/null +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp @@ -0,0 +1,114 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_EllipseMaskOperation.h" +#include "BLI_math.h" +#include "DNA_node_types.h" + +EllipseMaskOperation::EllipseMaskOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputMask = NULL; + this->inputValue = NULL; + this->cosine = 0.0f; + this->sine = 0.0f; +} +void EllipseMaskOperation::initExecution() { + this->inputMask = this->getInputSocketReader(0); + this->inputValue = this->getInputSocketReader(1); + const double rad = DEG2RAD(this->data->rotation); + this->cosine = cos(rad); + this->sine = sin(rad); + this->aspectRatio = ((float)this->getWidth())/this->getHeight(); +} + +void EllipseMaskOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputMask[4]; + float inputValue[4]; + + float rx = x/this->getWidth(); + float ry = y/this->getHeight(); + + const float dy = (ry - this->data->y)/this->aspectRatio; + const float dx = rx - this->data->x; + rx = this->data->x+(this->cosine*dx + this->sine*dy); + ry = this->data->y+(-this->sine*dx + this->cosine*dy); + + this->inputMask->read(inputMask, x, y, sampler, inputBuffers); + this->inputValue->read(inputValue, x, y, sampler, inputBuffers); + + const float halfHeight = (this->data->height)/2.0f; + const float halfWidth = this->data->width/2.0f; + float sx = rx-this->data->x; + sx *= sx; + const float tx = halfWidth * halfWidth; + float sy = ry-this->data->y; + sy *= sy; + const float ty = halfHeight * halfHeight; + + bool inside = ((sx/tx)+(sy/ty))<1.0f; + + switch (this->maskType) { + case CMP_NODE_MASKTYPE_ADD: + if (inside) { + color[0] = max(inputMask[0],inputValue[0]); + } else { + color[0] = inputMask[0]; + } + break; + case CMP_NODE_MASKTYPE_SUBTRACT: + if (inside) { + color[0] = inputMask[0]-inputValue[0]; + CLAMP(color[0], 0, 1); + } else { + color[0] = inputMask[0]; + } + break; + case CMP_NODE_MASKTYPE_MULTIPLY: + if (inside) { + color[0] = inputMask[0]*inputValue[0]; + } else { + color[0] = 0; + } + break; + case CMP_NODE_MASKTYPE_NOT: + if (inside) { + if (inputMask[0]>0.0f) { + color[0] = 0; + } else { + color[0] = inputValue[0]; + } + } else { + color[0] = inputMask[0]; + } + break; + } + + +} + +void EllipseMaskOperation::deinitExecution() { + this->inputMask = NULL; + this->inputValue = NULL; +} + diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.h b/source/blender/compositor/operations/COM_EllipseMaskOperation.h new file mode 100644 index 00000000000..969013782e6 --- /dev/null +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.h @@ -0,0 +1,65 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_EllipseMaskOperation_h +#define _COM_EllipseMaskOperation_h +#include "COM_NodeOperation.h" + + +class EllipseMaskOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputMask; + SocketReader * inputValue; + + float sine; + float cosine; + float aspectRatio; + int maskType; + + NodeEllipseMask *data; +public: + EllipseMaskOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeEllipseMask *data) {this->data = data;} + + void setMaskType(int maskType) {this->maskType = maskType;} + +}; +#endif diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp new file mode 100644 index 00000000000..aae39694220 --- /dev/null +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp @@ -0,0 +1,197 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_FastGaussianBlurOperation.h" +#include "MEM_guardedalloc.h" +#include "BLI_utildefines.h" + +FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation(){ + this->iirgaus = false; +} + +void FastGaussianBlurOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data) { + MemoryBuffer *newData = (MemoryBuffer*)data; + + newData->read(color, x, y); +} + +bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output){ + rcti newInput; + rcti sizeInput; + sizeInput.xmin = 0; + sizeInput.ymin = 0; + sizeInput.xmax = 5; + sizeInput.ymax = 5; + + NodeOperation * operation = this->getInputOperation(1); + if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { + return true; + }else { + if(this->iirgaus){ + newInput.xmax = input->xmax + (sx); + newInput.xmin = input->xmin - (sx); + newInput.ymax = input->ymax + (sy); + newInput.ymin = input->ymin - (sy); + }else { + newInput.xmin = 0; + newInput.ymin = 0; + newInput.xmax = this->getWidth(); + newInput.ymax = this->getHeight(); + } + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } +} + +void* FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers){ + MemoryBuffer *newBuf = (MemoryBuffer*)this->inputProgram->initializeTileData(rect, memoryBuffers); + MemoryBuffer *copy = newBuf->duplicate(); + updateSize(memoryBuffers); + + int c; + sx = data->sizex * this->size/2.0f; + sy = data->sizey * this->size/2.0f; + this->iirgaus = true; + + if ((sx == sy) && (sx > 0.f)) { + for (c=0; c 0.f) { + for (c=0; c 0.f) { + for (c=0; cgetBuffer(); + + // <0.5 not valid, though can have a possibly useful sort of sharpening effect + if (sigma < 0.5f) return; + + if ((xy < 1) || (xy > 3)) xy = 3; + + // XXX The YVV macro defined below explicitly expects sources of at least 3x3 pixels, + // so just skiping blur along faulty direction if src's def is below that limit! + if (src->getWidth() < 3) xy &= ~(int) 1; + if (src->getHeight() < 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.556f) + q = 0.9804f*(sigma - 3.556f) + 2.5091f; + else // sigma >= 0.5 + q = (0.0561f*sigma + 0.5784f)*sigma - 0.2568f; + q2 = q*q; + sc = (1.1668 + q)*(3.203729649 + (2.21566 + q)*q); + // no gabor filtering here, so no complex multiplies, just the regular coefs. + // all negated here, so as not to have to recalc Triggs/Sdika matrix + cf[1] = q*(5.788961737 + (6.76492 + 3.0*q)*q)/ sc; + cf[2] = -q2*(3.38246 + 3.0*q)/sc; + // 0 & 3 unchanged + cf[3] = q2*q/sc; + cf[0] = 1.0 - cf[1] - cf[2] - cf[3]; + + // Triggs/Sdika border corrections, + // it seems to work, not entirely sure if it is actually totally correct, + // Besides J.M.Geusebroek's anigauss.c (see http://www.science.uva.nl/~mark), + // found one other implementation by Cristoph Lampert, + // but neither seem to be quite the same, result seems to be ok so far anyway. + // Extra scale factor here to not have to do it in filter, + // though maybe this had something to with the precision errors + sc = cf[0]/((1.0 + cf[1] - cf[2] + cf[3])*(1.0 - cf[1] - cf[2] - cf[3])*(1.0 + cf[2] + (cf[1] - cf[3])*cf[3])); + tsM[0] = sc*(-cf[3]*cf[1] + 1.0 - cf[3]*cf[3] - cf[2]); + tsM[1] = sc*((cf[3] + cf[1])*(cf[2] + cf[3]*cf[1])); + tsM[2] = sc*(cf[3]*(cf[1] + cf[3]*cf[2])); + tsM[3] = sc*(cf[1] + cf[3]*cf[2]); + tsM[4] = sc*(-(cf[2] - 1.0)*(cf[2] + cf[3]*cf[1])); + tsM[5] = sc*(-(cf[3]*cf[1] + cf[3]*cf[3] + cf[2] - 1.0)*cf[3]); + tsM[6] = sc*(cf[3]*cf[1] + cf[2] + cf[1]*cf[1] - cf[2]*cf[2]); + tsM[7] = sc*(cf[1]*cf[2] + cf[3]*cf[2]*cf[2] - cf[1]*cf[3]*cf[3] - cf[3]*cf[3]*cf[3] - cf[3]*cf[2] + cf[3]); + tsM[8] = sc*(cf[3]*(cf[1] + cf[3]*cf[2])); + +#define YVV(L) \ +{ \ +W[0] = cf[0]*X[0] + cf[1]*X[0] + cf[2]*X[0] + cf[3]*X[0]; \ +W[1] = cf[0]*X[1] + cf[1]*W[0] + cf[2]*X[0] + cf[3]*X[0]; \ +W[2] = cf[0]*X[2] + cf[1]*W[1] + cf[2]*W[0] + cf[3]*X[0]; \ +for (i=3; i=0; i--) \ +Y[i] = cf[0]*W[i] + cf[1]*Y[i+1] + cf[2]*Y[i+2] + cf[3]*Y[i+3]; \ +} + + // intermediate buffers + sz = MAX2(src->getWidth(), src->getHeight()); + X = (double*)MEM_callocN(sz*sizeof(double), "IIR_gauss X buf"); + Y = (double*)MEM_callocN(sz*sizeof(double), "IIR_gauss Y buf"); + W = (double*)MEM_callocN(sz*sizeof(double), "IIR_gauss W buf"); + if (xy & 1) { // H + for (y=0; ygetHeight(); ++y) { + const int yx = y*src->getWidth(); + for (x=0; xgetWidth(); ++x) + X[x] = buffer[(x + yx)*COM_NUMBER_OF_CHANNELS + chan]; + YVV(src->getWidth()); + for (x=0; xgetWidth(); ++x) + buffer[(x + yx)*COM_NUMBER_OF_CHANNELS + chan] = Y[x]; + } + } + if (xy & 2) { // V + for (x=0; xgetWidth(); ++x) { + for (y=0; ygetHeight(); ++y) + X[y] = buffer[(x + y*src->getWidth())*COM_NUMBER_OF_CHANNELS + chan]; + YVV(src->getHeight()); + for (y=0; ygetHeight(); ++y) + buffer[(x + y*src->getWidth())*COM_NUMBER_OF_CHANNELS + chan] = Y[y]; + } + } + + MEM_freeN(X); + MEM_freeN(W); + MEM_freeN(Y); +#undef YVV + +} diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h new file mode 100644 index 00000000000..3e1d5416ca7 --- /dev/null +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_FastGaussianBlurOperation_h +#define _COM_FastGaussianBlurOperation_h + +#include "COM_BlurBaseOperation.h" +#include "DNA_node_types.h" + +class FastGaussianBlurOperation: public BlurBaseOperation { +private: + float sx; + float sy; + bool iirgaus; +public: + FastGaussianBlurOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); + + void IIR_gauss(MemoryBuffer *src, float sigma, int channel, int xy); + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); + +}; +#endif + diff --git a/source/blender/compositor/operations/COM_FlipOperation.cpp b/source/blender/compositor/operations/COM_FlipOperation.cpp new file mode 100644 index 00000000000..afe3173ab0f --- /dev/null +++ b/source/blender/compositor/operations/COM_FlipOperation.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_FlipOperation.h" + +FlipOperation::FlipOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; + this->flipX = true; + this->flipY = false; +} +void FlipOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void FlipOperation::deinitExecution() { + this->inputOperation = NULL; +} + + +void FlipOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float nx = this->flipX?this->getWidth()-1-x:x; + float ny = this->flipY?this->getHeight()-1-y:y; + + this->inputOperation->read(color, nx, ny, sampler, inputBuffers); +} + +bool FlipOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + if (this->flipX) { + newInput.xmax = (this->getWidth()- 1 - input->xmin)+1; + newInput.xmin = (this->getWidth()- 1 - input->xmax)-1; + } else { + newInput.xmin = input->xmin; + newInput.xmax = input->xmax; + } + if (this->flipY) { + newInput.ymax = (this->getHeight()- 1 - input->ymin)+1; + newInput.ymin = (this->getHeight()- 1 - input->ymax)-1; + } else { + newInput.ymin = input->ymin; + newInput.ymax = input->ymax; + } + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_FlipOperation.h b/source/blender/compositor/operations/COM_FlipOperation.h new file mode 100644 index 00000000000..9774cfd7bcd --- /dev/null +++ b/source/blender/compositor/operations/COM_FlipOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_FlipOperation_h_ +#define _COM_FlipOperation_h_ + +#include "COM_NodeOperation.h" + +class FlipOperation: public NodeOperation { +private: + SocketReader *inputOperation; + bool flipX; + bool flipY; +public: + FlipOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + void setFlipX(bool flipX) {this->flipX = flipX;} + void setFlipY(bool flipY) {this->flipY = flipY;} +}; + +#endif diff --git a/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp b/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp new file mode 100644 index 00000000000..a81597322a0 --- /dev/null +++ b/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_FogGlowImageOperation.h" +#include "BLI_math.h" + +FogGlowImageOperation::FogGlowImageOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_COLOR); +} +void FogGlowImageOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + const float cs_r = 1.f, cs_g = 1.f, cs_b = 1.f; + + float u, v, w, d, r; + + v = 2.f*(y / (float)512) - 1.f; + u = 2.f*(x / (float)512) - 1.f; + r = (u*u + v*v)*256; + d = -sqrtf(sqrtf(sqrtf(r))); + w = (0.5f + 0.5f*cos((double)u*M_PI))*(0.5f + 0.5f*cos((double)v*M_PI)); + color[0] = expf(d*cs_r) * w; + color[1] = expf(d*cs_g) * w; + color[2] = expf(d*cs_b) * w; + color[3] = 1.0f; +} + +void FogGlowImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + resolution[0] = 512; + resolution[1] = 512; +} diff --git a/source/blender/compositor/operations/COM_FogGlowImageOperation.h b/source/blender/compositor/operations/COM_FogGlowImageOperation.h new file mode 100644 index 00000000000..f68346eeb8d --- /dev/null +++ b/source/blender/compositor/operations/COM_FogGlowImageOperation.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_FogGlowOperation_h +#define _COM_FogGlowOperation_h +#include "COM_NodeOperation.h" +#include "DNA_lamp_types.h" + +class FogGlowImageOperation : public NodeOperation { +public: + FogGlowImageOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp b/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp new file mode 100644 index 00000000000..c83c5d0ecb6 --- /dev/null +++ b/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp @@ -0,0 +1,98 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GammaCorrectOperation.h" +#include "BLI_math.h" + +GammaCorrectOperation::GammaCorrectOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; +} +void GammaCorrectOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void GammaCorrectOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + this->inputProgram->read(inputColor, x, y, sampler, inputBuffers); + if (inputColor[3] > 0.0f) { + inputColor[0] /= inputColor[3]; + inputColor[1] /= inputColor[3]; + inputColor[2] /= inputColor[3]; + } + + /* check for negative to avoid nan's */ + color[0] = inputColor[0]>0.0f?inputColor[0]*inputColor[0] :0.0f; + color[1] = inputColor[1]>0.0f?inputColor[1]*inputColor[1] :0.0f; + color[2] = inputColor[2]>0.0f?inputColor[2]*inputColor[2] :0.0f; + + inputColor[0] *= inputColor[3]; + inputColor[1] *= inputColor[3]; + inputColor[2] *= inputColor[3]; + + color[0] = inputColor[0]; + color[1] = inputColor[1]; + color[2] = inputColor[2]; + color[3] = inputColor[3]; +} + +void GammaCorrectOperation::deinitExecution() { + this->inputProgram = NULL; +} + +GammaUncorrectOperation::GammaUncorrectOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; +} +void GammaUncorrectOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void GammaUncorrectOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor[4]; + this->inputProgram->read(inputColor, x, y, sampler, inputBuffers); + + if (inputColor[3] > 0.0f) { + inputColor[0] /= inputColor[3]; + inputColor[1] /= inputColor[3]; + inputColor[2] /= inputColor[3]; + } + + color[0] = inputColor[0]>0.0f?sqrtf(inputColor[0]) :0.0f; + color[1] = inputColor[1]>0.0f?sqrtf(inputColor[1]) :0.0f; + color[2] = inputColor[2]>0.0f?sqrtf(inputColor[2]) :0.0f; + + inputColor[0] *= inputColor[3]; + inputColor[1] *= inputColor[3]; + inputColor[2] *= inputColor[3]; + + color[0] = inputColor[0]; + color[1] = inputColor[1]; + color[2] = inputColor[2]; + color[3] = inputColor[3]; +} + +void GammaUncorrectOperation::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_GammaCorrectOperation.h b/source/blender/compositor/operations/COM_GammaCorrectOperation.h new file mode 100644 index 00000000000..bcf78f4508a --- /dev/null +++ b/source/blender/compositor/operations/COM_GammaCorrectOperation.h @@ -0,0 +1,80 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GammaCorrectOperation_h +#define _COM_GammaCorrectOperation_h +#include "COM_NodeOperation.h" + + +class GammaCorrectOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + +public: + GammaCorrectOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; + +class GammaUncorrectOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + +public: + GammaUncorrectOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_GammaOperation.cpp b/source/blender/compositor/operations/COM_GammaOperation.cpp new file mode 100644 index 00000000000..eaa56c2f31a --- /dev/null +++ b/source/blender/compositor/operations/COM_GammaOperation.cpp @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GammaOperation.h" +#include "BLI_math.h" + +GammaOperation::GammaOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; + this->inputGammaProgram = NULL; +} +void GammaOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); + this->inputGammaProgram = this->getInputSocketReader(1); +} + +void GammaOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + float inputGamma[4]; + + this->inputProgram->read(inputValue, x, y, sampler, inputBuffers); + this->inputGammaProgram->read(inputGamma, x, y, sampler, inputBuffers); + const float gamma = inputGamma[0]; + /* check for negative to avoid nan's */ + color[0] = inputValue[0]>0.0f?pow(inputValue[0], gamma):inputValue[0]; + color[1] = inputValue[1]>0.0f?pow(inputValue[1], gamma):inputValue[1]; + color[2] = inputValue[2]>0.0f?pow(inputValue[2], gamma):inputValue[2]; + + color[3] = inputValue[3]; +} + +void GammaOperation::deinitExecution() { + this->inputProgram = NULL; + this->inputGammaProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_GammaOperation.h b/source/blender/compositor/operations/COM_GammaOperation.h new file mode 100644 index 00000000000..0fbbf58bad6 --- /dev/null +++ b/source/blender/compositor/operations/COM_GammaOperation.h @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GammaOperation_h +#define _COM_GammaOperation_h +#include "COM_NodeOperation.h" + + +class GammaOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + SocketReader* inputGammaProgram; + +public: + GammaOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp new file mode 100644 index 00000000000..9b7df61143e --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp @@ -0,0 +1,174 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GaussianBokehBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +GaussianBokehBlurOperation::GaussianBokehBlurOperation(): BlurBaseOperation() { + this->gausstab = NULL; +} + +void* GaussianBokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + updateGauss(memoryBuffers); + void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { + if (this->gausstab == NULL) { + float radxf; + float radyf; + int n; + float* dgauss; + float* ddgauss; + float val; + int j, i; + const float width = this->getWidth(); + const float height = this->getHeight(); + updateSize(memoryBuffers); + + radxf = size*(float)this->data->sizex; + if(radxf>width/2.0f) + radxf= width/2.0f; + else if(radxf<1.0f) + radxf= 1.0f; + + /* vertical */ + radyf = size*(float)this->data->sizey; + if(radyf>height/2.0f) + radyf= height/2.0f; + else if(radyf<1.0f) + radyf= 1.0f; + + radx= ceil(radxf); + rady= ceil(radyf); + + n = (2*radx+1)*(2*rady+1); + + /* create a full filter image */ + ddgauss= new float[n]; + dgauss= ddgauss; + val= 0.0f; + for(j=-rady; j<=rady; j++) { + for(i=-radx; i<=radx; i++, dgauss++) { + float fj= (float)j/radyf; + float fi= (float)i/radxf; + float dist= sqrt(fj*fj + fi*fi); + *dgauss= RE_filter_value(this->data->filtertype, dist); + + val+= *dgauss; + } + } + if(val!=0.0f) { + val= 1.0f/val; + for(j= n -1; j>=0; j--) + ddgauss[j]*= val; + } + else ddgauss[4]= 1.0f; + + gausstab = ddgauss; + } +} + +void GaussianBokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float tempColor[4]; + tempColor[0] = 0; + tempColor[1] = 0; + tempColor[2] = 0; + tempColor[3] = 0; + float overallmultiplyer = 0; + MemoryBuffer* inputBuffer = (MemoryBuffer*)data; + float* buffer = inputBuffer->getBuffer(); + int bufferwidth = inputBuffer->getWidth(); + int bufferstartx = inputBuffer->getRect()->xmin; + int bufferstarty = inputBuffer->getRect()->ymin; + + int miny = y - this->rady; + int maxy = y + this->rady; + int minx = x - this->radx; + int maxx = x + this->radx; + miny = max(miny, inputBuffer->getRect()->ymin); + minx = max(minx, inputBuffer->getRect()->xmin); + maxy = min(maxy, inputBuffer->getRect()->ymax); + maxx = min(maxx, inputBuffer->getRect()->xmax); + + int index = 0; + int step = QualityStepHelper::getStep(); + int offsetadd = QualityStepHelper::getOffsetAdd(); + for (int ny = miny ; ny < maxy ; ny +=step) { + int bufferindex = ((minx - bufferstartx)*4)+((ny-bufferstarty)*4*bufferwidth); + for (int nx = minx ; nx < maxx ; nx +=step) { + float multiplyer = gausstab[index]; + tempColor[0] += multiplyer * buffer[bufferindex]; + tempColor[1] += multiplyer * buffer[bufferindex+1]; + tempColor[2] += multiplyer * buffer[bufferindex+2]; + tempColor[3] += multiplyer * buffer[bufferindex+3]; + overallmultiplyer += multiplyer; + index += step; + bufferindex +=offsetadd; + } + } + float divider = 1.0/overallmultiplyer; + color[0] = tempColor[0]*divider; + color[1] = tempColor[1]*divider; + color[2] = tempColor[2]*divider; + color[3] = tempColor[3]*divider; +} + +void GaussianBokehBlurOperation::deinitExecution() { + BlurBaseOperation::deinitExecution(); + delete this->gausstab; + this->gausstab = NULL; +} + +bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + rcti sizeInput; + sizeInput.xmin = 0; + sizeInput.ymin = 0; + sizeInput.xmax = 5; + sizeInput.ymax = 5; + NodeOperation * operation = this->getInputOperation(1); + + if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { + return true; + } else { + if (this->gausstab) { + int addx = radx; + int addy = rady; + newInput.xmax = input->xmax + addx; + newInput.xmin = input->xmin - addx; + newInput.ymax = input->ymax + addy; + newInput.ymin = input->ymin - addy; + } else { + newInput.xmin = 0; + newInput.ymin = 0; + newInput.xmax = this->getWidth(); + newInput.ymax = this->getHeight(); + } + return BlurBaseOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } +} diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h new file mode 100644 index 00000000000..806f77fd375 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehGaussianBokehBlurOperation_h +#define _COM_GaussianBokehBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_BlurBaseOperation.h" +#include "COM_QualityStepHelper.h" + +class GaussianBokehBlurOperation : public BlurBaseOperation { +private: + float* gausstab; + int radx, rady; + void updateGauss(MemoryBuffer **memoryBuffers); + +public: + GaussianBokehBlurOperation(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp new file mode 100644 index 00000000000..a93c0e44d18 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GaussianXBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +GaussianXBlurOperation::GaussianXBlurOperation(): BlurBaseOperation() { + this->gausstab = NULL; + this->rad = 0; + +} + +void* GaussianXBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + updateGauss(memoryBuffers); + void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void GaussianXBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { + if (this->gausstab == NULL) { + updateSize(memoryBuffers); + float rad = size*this->data->sizex; + if(rad<1) + rad= 1; + + this->rad = rad; + this->gausstab = BlurBaseOperation::make_gausstab(rad); + } +} + +void GaussianXBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data) { + + float tempColor[4]; + tempColor[0] = 0; + tempColor[1] = 0; + tempColor[2] = 0; + tempColor[3] = 0; + float overallmultiplyer = 0; + MemoryBuffer* inputBuffer = (MemoryBuffer*)data; + float* buffer = inputBuffer->getBuffer(); + int bufferwidth = inputBuffer->getWidth(); + int bufferstartx = inputBuffer->getRect()->xmin; + int bufferstarty = inputBuffer->getRect()->ymin; + + int miny = y; + int maxy = y; + int minx = x - this->rad; + int maxx = x + this->rad; + miny = max(miny, inputBuffer->getRect()->ymin); + minx = max(minx, inputBuffer->getRect()->xmin); + maxy = min(maxy, inputBuffer->getRect()->ymax); + maxx = min(maxx, inputBuffer->getRect()->xmax); + + int index = 0; + int step = getStep(); + int offsetadd = getOffsetAdd(); + int bufferindex = ((minx - bufferstartx)*4)+((miny-bufferstarty)*4*bufferwidth); + for (int nx = minx ; nx < maxx ; nx +=step) { + float multiplyer = gausstab[index++]; + tempColor[0] += multiplyer * buffer[bufferindex]; + tempColor[1] += multiplyer * buffer[bufferindex+1]; + tempColor[2] += multiplyer * buffer[bufferindex+2]; + tempColor[3] += multiplyer * buffer[bufferindex+3]; + overallmultiplyer += multiplyer; + bufferindex +=offsetadd; + } + float divider = 1.0/overallmultiplyer; + color[0] = tempColor[0]*divider; + color[1] = tempColor[1]*divider; + color[2] = tempColor[2]*divider; + color[3] = tempColor[3]*divider; +} + +void GaussianXBlurOperation::deinitExecution() { + BlurBaseOperation::deinitExecution(); + delete this->gausstab; + this->gausstab = NULL; +} + +bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + rcti sizeInput; + sizeInput.xmin = 0; + sizeInput.ymin = 0; + sizeInput.xmax = 5; + sizeInput.ymax = 5; + + NodeOperation * operation = this->getInputOperation(1); + if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { + return true; + }else { + if (this->gausstab == NULL) { + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + }else{ + newInput.xmax = input->xmax + rad; + newInput.xmin = input->xmin - rad; + newInput.ymax = input->ymax; + newInput.ymin = input->ymin; + } + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } +} diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h new file mode 100644 index 00000000000..6b6eb4d80f9 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h @@ -0,0 +1,49 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GaussianXBlurOperation_h +#define _COM_GaussianXBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_BlurBaseOperation.h" + +class GaussianXBlurOperation : public BlurBaseOperation { +private: + float* gausstab; + int rad; + void updateGauss(MemoryBuffer **memoryBuffers); +public: + GaussianXBlurOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp new file mode 100644 index 00000000000..86f9dbf5c40 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -0,0 +1,125 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GaussianYBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +GaussianYBlurOperation::GaussianYBlurOperation(): BlurBaseOperation() { + this->gausstab = NULL; + this->rad = 0; +} + +void* GaussianYBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + updateGauss(memoryBuffers); + void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void GaussianYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { + if (this->gausstab == NULL) { + updateSize(memoryBuffers); + float rad = size*this->data->sizey; + if(rad<1) + rad= 1; + + this->rad = rad; + this->gausstab = BlurBaseOperation::make_gausstab(rad); + } +} + +void GaussianYBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data) { + + float tempColor[4]; + tempColor[0] = 0; + tempColor[1] = 0; + tempColor[2] = 0; + tempColor[3] = 0; + float overallmultiplyer = 0; + MemoryBuffer* inputBuffer = (MemoryBuffer*)data; + float* buffer = inputBuffer->getBuffer(); + int bufferwidth = inputBuffer->getWidth(); + int bufferstartx = inputBuffer->getRect()->xmin; + int bufferstarty = inputBuffer->getRect()->ymin; + + int miny = y - this->rad; + int maxy = y + this->rad; + int minx = x; + int maxx = x; + miny = max(miny, inputBuffer->getRect()->ymin); + minx = max(minx, inputBuffer->getRect()->xmin); + maxy = min(maxy, inputBuffer->getRect()->ymax); + maxx = min(maxx, inputBuffer->getRect()->xmax); + + int step = getStep(); + int index = 0; + for (int ny = miny ; ny < maxy ; ny +=step) { + int bufferindex = ((minx - bufferstartx)*4)+((ny-bufferstarty)*4*bufferwidth); + float multiplyer = gausstab[index++]; + tempColor[0] += multiplyer * buffer[bufferindex]; + tempColor[1] += multiplyer * buffer[bufferindex+1]; + tempColor[2] += multiplyer * buffer[bufferindex+2]; + tempColor[3] += multiplyer * buffer[bufferindex+3]; + overallmultiplyer += multiplyer; + } + float divider = 1.0/overallmultiplyer; + color[0] = tempColor[0]*divider; + color[1] = tempColor[1]*divider; + color[2] = tempColor[2]*divider; + color[3] = tempColor[3]*divider; +} + +void GaussianYBlurOperation::deinitExecution() { + BlurBaseOperation::deinitExecution(); + delete this->gausstab; + this->gausstab = NULL; +} + +bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + rcti sizeInput; + sizeInput.xmin = 0; + sizeInput.ymin = 0; + sizeInput.xmax = 5; + sizeInput.ymax = 5; + + NodeOperation * operation = this->getInputOperation(1); + if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { + return true; + }else { + if (this->gausstab == NULL) { + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + } else { + newInput.xmax = input->xmax; + newInput.xmin = input->xmin; + newInput.ymax = input->ymax + rad; + newInput.ymin = input->ymin - rad; + } + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } +} diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h new file mode 100644 index 00000000000..5c116e80a71 --- /dev/null +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h @@ -0,0 +1,49 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GaussianYBlurOperation_h +#define _COM_GaussianYBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_BlurBaseOperation.h" + +class GaussianYBlurOperation : public BlurBaseOperation { +private: + float* gausstab; + int rad; + void updateGauss(MemoryBuffer **memoryBuffers); +public: + GaussianYBlurOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp new file mode 100644 index 00000000000..b86c61ea9da --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp @@ -0,0 +1,75 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GlareBaseOperation.h" +#include "BLI_math.h" + +GlareBaseOperation::GlareBaseOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->settings = NULL; + this->cachedInstance = NULL; + setComplex(true); +} +void GlareBaseOperation::initExecution() { + initMutex(); + this->inputProgram = getInputSocketReader(0); + this->cachedInstance = NULL; +} + +void GlareBaseOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float* buffer = (float*) data; + int index = (y*this->getWidth() + x) * COM_NUMBER_OF_CHANNELS; + color[0] = buffer[index]; + color[1] = buffer[index+1]; + color[2] = buffer[index+2]; + color[3] = buffer[index+3]; +} + +void GlareBaseOperation::deinitExecution() { + deinitMutex(); + this->inputProgram = NULL; + if (this->cachedInstance) { + delete cachedInstance; + this->cachedInstance = NULL; + } +} +void* GlareBaseOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + BLI_mutex_lock(getMutex()); + if (this->cachedInstance == NULL) { + MemoryBuffer* tile = (MemoryBuffer*)inputProgram->initializeTileData(rect, memoryBuffers); + float* data = new float[this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS]; + this->generateGlare(data, tile, this->settings); + this->cachedInstance = data; + } + BLI_mutex_unlock(getMutex()); + return this->cachedInstance; +} + +bool GlareBaseOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.h b/source/blender/compositor/operations/COM_GlareBaseOperation.h new file mode 100644 index 00000000000..4233e6150a2 --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.h @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GlareBaseOperation_h +#define _COM_GlareBaseOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +class GlareBaseOperation : public NodeOperation { +private: + /** + * @brief Cached reference to the inputProgram + */ + SocketReader * inputProgram; + + /** + * @brief settings of the glare node. + */ + NodeGlare * settings; + + float* cachedInstance; + +public: + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + + void setGlareSettings(NodeGlare * settings) {this->settings = settings;} + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +protected: + GlareBaseOperation(); + + virtual void generateGlare(float* data, MemoryBuffer* inputTile, NodeGlare* settings) = 0; + + +}; +#endif diff --git a/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp b/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp new file mode 100644 index 00000000000..ce3fd82acf0 --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp @@ -0,0 +1,113 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GlareSimpleStarOperation.h" + +void GlareSimpleStarOperation::generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) { + int i, x, y, ym, yp, xm, xp; + float c[4] = {0,0,0,0}, tc[4] = {0,0,0,0}; + const float f1 = 1.f - settings->fade, f2 = (1.f - f1)*0.5f; + + + MemoryBuffer* tbuf1 = inputTile->duplicate(); + MemoryBuffer* tbuf2 = inputTile->duplicate(); + + for (i=0; iiter; i++) { +// // (x || x-1, y-1) to (x || x+1, y+1) +// // F + for (y=0; ygetHeight(); y++) { + ym = y - i; + yp = y + i; + for (x=0; xgetWidth(); x++) { + xm = x - i; + xp = x + i; + tbuf1->read(c, x, y); + c[0]*=f1; c[1]*=f1 ; c[2] *=f1; + tbuf1->read(tc, (settings->angle ? xm : x), ym); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + tbuf1->read(tc, (settings->angle ? xp : x), yp); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + c[3] = 1.0f; + tbuf1->writePixel(x, y, c); + + tbuf2->read(c, x, y); + c[0]*=f1; c[1]*=f1 ; c[2] *=f1; + tbuf2->read(tc, xm, (settings->angle ? yp : y)); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + tbuf2->read(tc, xp, (settings->angle ? ym : y)); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + c[3] = 1.0f; + tbuf2->writePixel(x, y, c); + + } + } +// // B + for (y=tbuf1->getHeight()-1; y>=0; y--) { + ym = y - i; + yp = y + i; + for (x=tbuf1->getWidth()-1; x>=0; x--) { + xm = x - i; + xp = x + i; + tbuf1->read(c, x, y); + c[0]*=f1; c[1]*=f1 ; c[2] *=f1; + tbuf1->read(tc, (settings->angle ? xm : x), ym); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + tbuf1->read(tc, (settings->angle ? xp : x), yp); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + c[3] = 1.0f; + tbuf1->writePixel(x, y, c); + + tbuf2->read(c, x, y); + c[0]*=f1; c[1]*=f1 ; c[2] *=f1; + tbuf2->read(tc, xm, (settings->angle ? yp : y)); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + tbuf2->read(tc, xp, (settings->angle ? ym : y)); + c[0]+=tc[0]*f2; + c[1]+=tc[1]*f2; + c[2]+=tc[2]*f2; + c[3] = 1.0f; + tbuf2->writePixel(x, y, c); + } + } + } + + for (i = 0 ; i < this->getWidth()*this->getHeight()*4 ; i++) { + data[i] = tbuf1->getBuffer()[i] + tbuf2->getBuffer()[i]; + } + + delete tbuf1; + delete tbuf2; +} diff --git a/source/blender/compositor/operations/COM_GlareSimpleStarOperation.h b/source/blender/compositor/operations/COM_GlareSimpleStarOperation.h new file mode 100644 index 00000000000..22040da9bc5 --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareSimpleStarOperation.h @@ -0,0 +1,35 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GlareSimpleStarOperation_h +#define _COM_GlareSimpleStarOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" +#include "COM_GlareBaseOperation.h" + +class GlareSimpleStarOperation : public GlareBaseOperation { +public: + GlareSimpleStarOperation() : GlareBaseOperation() {} +protected: + void generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp b/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp new file mode 100644 index 00000000000..177bb6e0730 --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GlareStreaksOperation.h" +#include "BLI_math.h" + +void GlareStreaksOperation::generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) { + int x, y, n; + unsigned int nump=0; + float c1[4], c2[4], c3[4], c4[4]; + float a, ang = DEG2RADF(360.0f)/(float)settings->angle; + + int size = inputTile->getWidth()*inputTile->getHeight(); + int size4 = size*4; + + + MemoryBuffer* tsrc = inputTile->duplicate(); + MemoryBuffer* tdst = new MemoryBuffer(NULL, inputTile->getRect()); + tdst->clear(); + memset(data, 0, size4*sizeof(float)); + + for (a=0.f; aangle_ofs; + const float vx = cos((double)an), vy = sin((double)an); + for (n=0; niter; ++n) { + const float p4 = pow(4.0, (double)n); + const float vxp = vx*p4, vyp = vy*p4; + const float wt = pow((double)settings->fade, (double)p4); + const float cmo = 1.f - (float)pow((double)settings->colmod, (double)n+1); // colormodulation amount relative to current pass + float* tdstcol = tdst->getBuffer(); + for (y=0; ygetHeight(); ++y) { + for (x=0; xgetWidth(); ++x, tdstcol+=4) { + // first pass no offset, always same for every pass, exact copy, + // otherwise results in uneven brightness, only need once + if (n==0) tsrc->read(c1, x, y); else c1[0]=c1[1]=c1[2]=0; + tsrc->readCubic(c2, x + vxp, y + vyp); + tsrc->readCubic(c3, x + vxp*2.f, y + vyp*2.f); + tsrc->readCubic(c4, x + vxp*3.f, y + vyp*3.f); + // modulate color to look vaguely similar to a color spectrum + c2[1] *= cmo; + c2[2] *= cmo; + + c3[0] *= cmo; + c3[1] *= cmo; + + c4[0] *= cmo; + c4[2] *= cmo; + + tdstcol[0] = 0.5f*(tdstcol[0] + c1[0] + wt*(c2[0] + wt*(c3[0] + wt*c4[0]))); + tdstcol[1] = 0.5f*(tdstcol[1] + c1[1] + wt*(c2[1] + wt*(c3[1] + wt*c4[1]))); + tdstcol[2] = 0.5f*(tdstcol[2] + c1[2] + wt*(c2[2] + wt*(c3[2] + wt*c4[2]))); + tdstcol[3] = 1.0f; + } + } + memcpy(tsrc->getBuffer(), tdst->getBuffer(), sizeof(float)*size4); + } + +// addImage(sbuf, tsrc, 1.f/(float)(6 - ndg->iter)); // add result to data @todo + float* sourcebuffer = tsrc->getBuffer(); + float factor = 1.f/(float)(6 - settings->iter); + for (int i = 0 ; i < size4; i ++) { + data[i] += sourcebuffer[i] * factor; + } + for (int i = 0 ; i < size; i ++) { + data[i*4+3] = 1.0f; + } + + tdst->clear(); + memcpy(tsrc->getBuffer(), inputTile->getBuffer(), sizeof(float)*size4); + nump++; + } + + delete tsrc; + delete tdst; +} diff --git a/source/blender/compositor/operations/COM_GlareStreaksOperation.h b/source/blender/compositor/operations/COM_GlareStreaksOperation.h new file mode 100644 index 00000000000..07155a4713a --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareStreaksOperation.h @@ -0,0 +1,35 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GlareStreaksOperation_h +#define _COM_GlareStreaksOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" +#include "COM_GlareBaseOperation.h" + +class GlareStreaksOperation : public GlareBaseOperation { +public: + GlareStreaksOperation() : GlareBaseOperation() {} +protected: + void generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings); +}; +#endif diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp b/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp new file mode 100644 index 00000000000..cc8bda2730e --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_GlareThresholdOperation.h" +#include "BLI_math.h" + +GlareThresholdOperation::GlareThresholdOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; +} +void GlareThresholdOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void GlareThresholdOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + this->inputProgram->read(color, x, y, sampler, inputBuffers); + if ((0.212671f*color[0] + 0.71516f*color[1] + 0.072169f*color[2]) >= threshold) { + color[0] -= threshold, color[1] -= threshold, color[2] -= threshold; + color[0] = MAX2(color[0], 0.f); + color[1] = MAX2(color[1], 0.f); + color[2] = MAX2(color[2], 0.f); + } + else color[0] = color[1] = color[2] = 0.f; +} + +void GlareThresholdOperation::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.h b/source/blender/compositor/operations/COM_GlareThresholdOperation.h new file mode 100644 index 00000000000..3d68181ae47 --- /dev/null +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_GlareScaleOperation_h +#define _COM_GlareScaleOperation_h +#include "COM_NodeOperation.h" +#include "DNA_lamp_types.h" + +class GlareThresholdOperation : public NodeOperation { +private: + /** + * @brief Cached reference to the inputProgram + */ + SocketReader * inputProgram; + + float threshold; + +public: + GlareThresholdOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setThreshold(float threshold) {this->threshold = threshold;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp new file mode 100644 index 00000000000..d5d577e91a9 --- /dev/null +++ b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp @@ -0,0 +1,74 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_HueSaturationValueCorrectOperation.h" + +#include "BLI_math.h" + +#ifdef __cplusplus +extern "C" { +#endif + #include "BKE_colortools.h" +#ifdef __cplusplus +} +#endif + +HueSaturationValueCorrectOperation::HueSaturationValueCorrectOperation(): CurveBaseOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + + this->inputProgram = NULL; +} +void HueSaturationValueCorrectOperation::initExecution() { + CurveBaseOperation::initExecution(); + this->inputProgram = this->getInputSocketReader(0); +} + +void HueSaturationValueCorrectOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float hsv[4], f; + + this->inputProgram->read(hsv, x, y, sampler, inputBuffers); + + /* adjust hue, scaling returned default 0.5 up to 1 */ + f = curvemapping_evaluateF(this->curveMapping, 0, hsv[0]); + hsv[0] += f-0.5f; + + /* adjust saturation, scaling returned default 0.5 up to 1 */ + f = curvemapping_evaluateF(this->curveMapping, 1, hsv[0]); + hsv[1] *= (f * 2.f); + + /* adjust value, scaling returned default 0.5 up to 1 */ + f = curvemapping_evaluateF(this->curveMapping, 2, hsv[0]); + hsv[2] *= (f * 2.f); + + hsv[0] = hsv[0] - floor(hsv[0]); /* mod 1.0 */ + CLAMP(hsv[1], 0.f, 1.f); + + output[0]= hsv[0]; + output[1]= hsv[1]; + output[2]= hsv[2]; + output[3]= hsv[3]; +} + +void HueSaturationValueCorrectOperation::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h new file mode 100644 index 00000000000..472a85f5531 --- /dev/null +++ b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_HueSaturationValueCorrectOperation_h +#define _COM_HueSaturationValueCorrectOperation_h +#include "COM_NodeOperation.h" +#include "COM_CurveBaseOperation.h" + +class HueSaturationValueCorrectOperation : public CurveBaseOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; +public: + HueSaturationValueCorrectOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* Vector, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_IDMaskOperation.cpp b/source/blender/compositor/operations/COM_IDMaskOperation.cpp new file mode 100644 index 00000000000..198248e35a3 --- /dev/null +++ b/source/blender/compositor/operations/COM_IDMaskOperation.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_IDMaskOperation.h" + +IDMaskOperation::IDMaskOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputProgram = NULL; +} +void IDMaskOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void IDMaskOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + + this->inputProgram->read(inputValue, x, y, sampler, inputBuffers); + const float a = (inputValue[0] == this->objectIndex)?1.0f:0.0f; + color[0] = a; +} + +void IDMaskOperation::deinitExecution() { + this->inputProgram = NULL; +} + diff --git a/source/blender/compositor/operations/COM_IDMaskOperation.h b/source/blender/compositor/operations/COM_IDMaskOperation.h new file mode 100644 index 00000000000..3b22be16d8a --- /dev/null +++ b/source/blender/compositor/operations/COM_IDMaskOperation.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_IDMaskOperation_h +#define _COM_IDMaskOperation_h +#include "COM_NodeOperation.h" + + +class IDMaskOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputProgram; + + float objectIndex; +public: + IDMaskOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setObjectIndex(float objectIndex) {this->objectIndex = objectIndex;} + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ImageOperation.cpp b/source/blender/compositor/operations/COM_ImageOperation.cpp new file mode 100644 index 00000000000..52c2e44f7d4 --- /dev/null +++ b/source/blender/compositor/operations/COM_ImageOperation.cpp @@ -0,0 +1,149 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ImageOperation.h" + +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "DNA_image_types.h" +#include "BKE_image.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" + #include "RE_shader_ext.h" + #include "RE_render_ext.h" + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + +BaseImageOperation::BaseImageOperation(): NodeOperation() { + this->image = NULL; + this->buffer = NULL; + this->imageBuffer = NULL; + this->imageUser = NULL; + this->imagewidth = 0; + this->imageheight = 0; + this->framenumber = 0; + this->depthBuffer = NULL; + this->numberOfChannels = 0; +} +ImageOperation::ImageOperation(): BaseImageOperation() { + this->addOutputSocket(COM_DT_COLOR); +} +ImageAlphaOperation::ImageAlphaOperation(): BaseImageOperation() { + this->addOutputSocket(COM_DT_VALUE); +} +ImageDepthOperation::ImageDepthOperation(): BaseImageOperation() { + this->addOutputSocket(COM_DT_VALUE); +} + +ImBuf* BaseImageOperation::getImBuf() { + ImBuf *ibuf; + + ibuf= BKE_image_get_ibuf(this->image, this->imageUser); + if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) { + return NULL; + } + + if (ibuf->rect_float == NULL) { + IMB_float_from_rect(ibuf); + } + return ibuf; +} + + +void BaseImageOperation::initExecution() { + ImBuf *stackbuf= getImBuf(); + this->buffer = stackbuf; + if (stackbuf) { + this->imageBuffer = stackbuf->rect_float; + this->depthBuffer = stackbuf->zbuf_float; + this->imagewidth = stackbuf->x; + this->imageheight = stackbuf->y; + this->numberOfChannels = stackbuf->channels; + } +} + +void BaseImageOperation::deinitExecution() { + this->imageBuffer= NULL; +} + +void BaseImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + ImBuf *stackbuf= getImBuf(); + if (stackbuf) { + resolution[0] = stackbuf->x; + resolution[1] = stackbuf->y; + } +} + +void ImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + if (this->imageBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.0f; + } else { + switch (sampler) { + case COM_PS_NEAREST: + neareast_interpolation_color(this->buffer, NULL, color, x, y); + break; + case COM_PS_BILINEAR: + bilinear_interpolation_color(this->buffer, NULL, color, x, y); + break; + case COM_PS_BICUBIC: + bicubic_interpolation_color(this->buffer, NULL, color, x, y); + break; + } + } +} + +void ImageAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float tempcolor[4]; + + if (this->imageBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { + color[0] = 0.0f; + } else { + tempcolor[3] = 1.0f; + switch (sampler) { + case COM_PS_NEAREST: + neareast_interpolation_color(this->buffer, NULL, tempcolor, x, y); + break; + case COM_PS_BILINEAR: + bilinear_interpolation_color(this->buffer, NULL, tempcolor, x, y); + break; + case COM_PS_BICUBIC: + bicubic_interpolation_color(this->buffer, NULL, tempcolor, x, y); + break; + } + color[0] = tempcolor[3]; + } +} + +void ImageDepthOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + if (this->depthBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { + color[0] = 0.0f; + } else { + int offset = y * width + x; + color[0] = this->depthBuffer[offset]; + } +} diff --git a/source/blender/compositor/operations/COM_ImageOperation.h b/source/blender/compositor/operations/COM_ImageOperation.h new file mode 100644 index 00000000000..a5e2c753b59 --- /dev/null +++ b/source/blender/compositor/operations/COM_ImageOperation.h @@ -0,0 +1,94 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + + +#ifndef _COM_ImageOperation_h +#define _COM_ImageOperation_h + +#include "COM_NodeOperation.h" +#include "DNA_scene_types.h" +#include "BLI_listbase.h" +#include "BKE_image.h" +extern "C" { + #include "RE_pipeline.h" + #include "RE_shader_ext.h" + #include "RE_render_ext.h" + #include "MEM_guardedalloc.h" +} + +/** + * @brief Base class for all image operations + */ +class BaseImageOperation : public NodeOperation { +protected: + ImBuf* buffer; + Image* image; + ImageUser* imageUser; + float *imageBuffer; + float *depthBuffer; + int imageheight; + int imagewidth; + int framenumber; + int numberOfChannels; + + BaseImageOperation(); + /** + * Determine the output resolution. The resolution is retrieved from the Renderer + */ + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + virtual ImBuf* getImBuf(); + +public: + + void initExecution(); + void deinitExecution(); + void setImage(Image* image) {this->image = image;} + void setImageUser(ImageUser* imageuser) {this->imageUser = imageuser;} + + void setFramenumber(int framenumber) {this->framenumber = framenumber;} +}; +class ImageOperation: public BaseImageOperation { +public: + /** + * Constructor + */ + ImageOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class ImageAlphaOperation: public BaseImageOperation { +public: + /** + * Constructor + */ + ImageAlphaOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class ImageDepthOperation: public BaseImageOperation { +public: + /** + * Constructor + */ + ImageDepthOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_InvertOperation.cpp b/source/blender/compositor/operations/COM_InvertOperation.cpp new file mode 100644 index 00000000000..a90c7b6b8d2 --- /dev/null +++ b/source/blender/compositor/operations/COM_InvertOperation.cpp @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_InvertOperation.h" + +InvertOperation::InvertOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputValueProgram = NULL; + this->inputColorProgram = NULL; + this->color = true; + this->alpha = false; + setResolutionInputSocketIndex(1); +} +void InvertOperation::initExecution() { + this->inputValueProgram = this->getInputSocketReader(0); + this->inputColorProgram = this->getInputSocketReader(1); +} + +void InvertOperation::executePixel(float* out, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue[4]; + float inputColor[4]; + this->inputValueProgram->read(inputValue, x, y, sampler, inputBuffers); + this->inputColorProgram->read(inputColor, x, y, sampler, inputBuffers); + + const float value = inputValue[0]; + const float invertedValue = 1.0f - value; + + if(color) { + out[0] = (1.0f - inputColor[0])*value + inputColor[0]*invertedValue; + out[1] = (1.0f - inputColor[1])*value + inputColor[1]*invertedValue; + out[2] = (1.0f - inputColor[2])*value + inputColor[2]*invertedValue; + } else { + out[0] = inputColor[0]; + out[1] = inputColor[1]; + out[2] = inputColor[2]; + } + + if(alpha) + out[3] = (1.0f - inputColor[3])*value + inputColor[3]*invertedValue; + else + out[3] = inputColor[3]; + +} + +void InvertOperation::deinitExecution() { + this->inputValueProgram = NULL; + this->inputColorProgram = NULL; +} + diff --git a/source/blender/compositor/operations/COM_InvertOperation.h b/source/blender/compositor/operations/COM_InvertOperation.h new file mode 100644 index 00000000000..6baa10a3d62 --- /dev/null +++ b/source/blender/compositor/operations/COM_InvertOperation.h @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_InvertOperation_h +#define _COM_InvertOperation_h +#include "COM_NodeOperation.h" + + +class InvertOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputValueProgram; + SocketReader * inputColorProgram; + + bool alpha; + bool color; + +public: + InvertOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setColor(bool color) {this->color = color;} + void setAlpha(bool alpha) {this->alpha = alpha;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp new file mode 100644 index 00000000000..eb957ca4756 --- /dev/null +++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp @@ -0,0 +1,792 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_LensGhostOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + +#define MAX_STEP 256 +class Ray { +public: + float position[3]; + float direction[3]; + float uv[2]; + double wavelength; + float intensity; + bool valid; + void copyFrom(Ray* other) { + copy_v3_v3(position, other->position); + copy_v3_v3(direction, other->direction); + copy_v2_v2(uv, other->uv); + wavelength = other->wavelength; + intensity = other->intensity; + this->valid = other->valid; + } +}; + +class Intersection { +public: + float position[3]; + float normal[3]; + double theta; + bool hit; + bool inverted; +}; + +class LensInterface { +public: + float position[3]; + float radius; + float nominalRadius; + double refraction1; + double refraction2; + double refraction3; + float thicknessCoathing; + virtual bool isFlat() = 0; + virtual void intersect(Intersection* result, Ray* ray) = 0; +}; + +class FlatInterface: public LensInterface { +public: + bool isFlat() {return true;} + FlatInterface(float positionX, float positionY, float positionZ, float radius) { + this->position[0] = positionX; + this->position[1] = positionY; + this->position[2] = positionZ; + this->radius = radius; + this->nominalRadius = radius; + this->refraction1 = 1.0f; + this->refraction2 = 1.0f; + this->refraction3 = 1.0f; + this->thicknessCoathing = 0.0f; + + } + void intersect(Intersection* result, Ray* ray) { + const float dz = this->position[2]-ray->position[2]; + result->position[0] = ray->position[0] + ray->direction[0]*(dz)/ray->direction[2]; + result->position[1] = ray->position[1] + ray->direction[1]*(dz)/ray->direction[2]; + result->position[2] = ray->position[2] + ray->direction[2]*(dz)/ray->direction[2]; + result->normal[0] = 0.0f; + result->normal[1] = 0.0f; + result->normal[2] = ray->direction[2]>0?-1.0f:1.0f; + result->theta = 0.0f; +// result->hit = this->nominalRadius>maxf(fabs(result->position[0]), fabs(result->position[1])); + result->hit = true; + result->inverted = false; + } +}; + +class SphereInterface: public LensInterface { +public: + SphereInterface(float positionX, float positionY, float positionZ, float radius, float nominalRadius, float n0, float n2, float coatingPhase) { + this->position[0] = positionX; + this->position[1] = positionY; + this->position[2] = positionZ; + this->radius = radius; + this->nominalRadius = nominalRadius; + this->refraction1 = n0; + this->refraction3 = n2; + this->refraction2 = maxf(sqrtf(n0*n2), 1.38); + + this->thicknessCoathing = coatingPhase/4/this->refraction2; + } + bool isFlat() {return false;} + void intersect(Intersection* result, Ray* ray) { + float delta[3] ={ray->position[0] - this->position[0], + ray->position[1] - this->position[1], + ray->position[2] - this->position[2]}; + float b = dot_v3v3(delta, ray->direction); + float c = dot_v3v3(delta, delta) - this->radius*this->radius; + float b2c = b*b-c; + if (b2c < 0) { + result->hit = false; + } else { + float sgn = (this->radius*ray->direction[2])>0?1.0f:-1.0f; + float t = sqrtf(b2c)*sgn-b; + result->position[0] = ray->direction[0]*t+ray->position[0]; + result->position[1] = ray->direction[1]*t+ray->position[1]; + result->position[2] = ray->direction[2]*t+ray->position[2]; + + float p[3] = { + result->position[0] - this->position[0], + result->position[1] - this->position[1], + result->position[2] - this->position[2] + }; + normalize_v3(p); + + if (dot_v3v3(p, ray->direction)> 0) { + result->normal[0] = -p[0]; + result->normal[1] = -p[1]; + result->normal[2] = -p[2]; + } else { + result->normal[0] = p[0]; + result->normal[1] = p[1]; + result->normal[2] = p[2]; + } + + float inverse[3] ={ + -ray->direction[0], + -ray->direction[1], + -ray->direction[2]}; + + result->theta = acosf(dot_v3v3(inverse, result->normal)); + result->hit = this->nominalRadius>sqrt(result->position[0]*result->position[0]+result->position[1]*result->position[1]); +// result->hit = this->nominalRadius>maxf(fabs(result->position[0]), fabs(result->position[1])); +// result->hit = true; + result->inverted = t < 0; + } + } +}; +class RayResult { +public: + float x; + float y; + float intensity[3]; + float u; + float v; + float screenX; + float screenY; + bool valid; + bool hasIntensity; +}; +class Bounce{ +public: + LensInterface *interface1; + LensInterface *interface2; + RayResult *raster; + int length; // number of interfaces to travel + int rasterLength; + Bounce(LensInterface *interface1, LensInterface *interface2, int length, int rasterStep) { + this->interface1 = interface1; + this->interface2 = interface2; + this->length = length; + this->rasterLength = rasterStep; + this->raster = new RayResult[rasterLength*rasterLength]; + for (int i = 0 ; i < rasterLength*rasterLength ; i++) { + RayResult * res = &this->raster[i]; + res->intensity[0] = 0.0f; + res->intensity[1] = 0.0f; + res->intensity[2] = 0.0f; + res->x = 0.0f; + res->y = 0.0f; + res->u = 0.0f; + res->v = 0.0f; + res->valid = false; + } + } + ~Bounce() { + delete raster; + + } + + RayResult* getRayResult(int x, int y) { + return &(raster[x+y*rasterLength]); + } +}; +class LensSystem { +public: + vector interfaces; + vector bounces; + int bokehIndex; + int lensIndex; + + ~LensSystem() { + for (int index = 0 ; index isFlat()) { + for (int j = i+1; j < interfaces.size()-1 ; j ++) { + if (!interfaces[j]->isFlat()) { + int length = interfaces.size()+2*(j-i); + Bounce* bounce = new Bounce(interfaces[j], interfaces[i], length, step); + bounces.push_back(bounce); + } + } + } + } + + } + + void addInterface(LensInterface* interface) { + this->interfaces.push_back(interface); + this->lensIndex = this->interfaces.size()-1; + } + + static int refraction(float *refract, float *n, float *view, double index) + { + + return 1; + +// float dot, fac; + +// VECCOPY(refract, view); + +// dot= view[0]*n[0] + view[1]*n[1] + view[2]*n[2]; + +// if(dot>0.0f) { +// index = 1.0f/index; +// fac= 1.0f - (1.0f - dot*dot)*index*index; +// if(fac<= 0.0f) return 0; +// fac= -dot*index + sqrt(fac); +// } +// else { +// fac= 1.0f - (1.0f - dot*dot)*index*index; +// if(fac<= 0.0f) return 0; +// fac= -dot*index - sqrt(fac); +// } + +// refract[0]= index*view[0] + fac*n[0]; +// refract[1]= index*view[1] + fac*n[1]; +// refract[2]= index*view[2] + fac*n[2]; + +// normalize_v3(refract); +// return 1; + //--- +// const double cosI = dot_v3v3(n, view); +// const double sinT2 = index * index * (1.0 - cosI * cosI); +// if (sinT2 >= 1.0f) +// { +// return 0; +// } +// refract[0] = index*view[0] - (index + sqrt(1.0-sinT2))*n[0]; +// refract[1] = index*view[1] - (index + sqrt(1.0-sinT2))*n[1]; +// refract[2] = index*view[2] - (index + sqrt(1.0-sinT2))*n[2]; +// normalize_v3(refract); +// return 1; + //--- + +// double ni = -dot_v3v3(view, n); +// double test = 1.0f - index*index*(1.0f-ni*ni); +// if (test < 0) { +// return 0; +// } else { +// double mul = index*ni + sqrt(test); +// refract[0] = index * view[0] - mul*n[0]; +// refract[1] = index * view[1] - mul*n[1]; +// refract[2] = index * view[2] - mul*n[2]; +// normalize_v3(refract); +// return 1; +// } + } + + /* orn = original face normal */ + static void reflection(float *ref, float *n, float *view) + { + float f1; + + f1= -2.0f*dot_v3v3(n, view); + + ref[0]= (view[0]+f1*n[0]); + ref[1]= (view[1]+f1*n[1]); + ref[2]= (view[2]+f1*n[2]); + normalize_v3(ref); + } + + static float fresnelAR(float theta0, float lambda, float d1, float n0, float n1, float n2) { + // refractionangles in coating and the 2nd medium + float theta1 = asin(sin(theta0)*n0/n1); + float theta2 = asin(sin(theta0)*n0/n2); + + float rs01 = -sin(theta0-theta1)/sin(theta0+theta1); + float rp01 = tan( theta0-theta1)/tan(theta0+theta1); + float ts01 = 2 * sin ( theta1 ) * cos ( theta0 ) / sin ( theta0+theta1 ) ; + float tp01 = ts01*cos(theta0-theta1); + // amplitude for inner reflection + float rs12 = -sin ( theta1-theta2 ) / sin ( theta1+theta2 ) ; + float rp12 = +tan ( theta1-theta2 ) / tan ( theta1+theta2 ) ; + // after passing through first surface twice : + // 2 transmissions and 1 reflection + float ris = ts01 * ts01 * rs12 ; + float rip = tp01 * tp01 * rp12 ; + // phase difference between outer and inner reflections + float dy = d1 * n1 ; + float dx = tan ( theta1 ) * dy ; + float delay = sqrt ( dx * dx+dy * dy ) ; + float relPhase = 4 * M_PI / lambda * ( delay-dx * sin ( theta0 ) ) ; + // Add up sines of different phase and amplitude + float out_s2 = rs01 * rs01 + ris * ris + 2 * rs01 * ris * cos ( relPhase ) ; + float out_p2 = rp01 * rp01 + rip * rip + 2 * rp01 * rip * cos ( relPhase ) ; + return ( out_s2+out_p2 ) / 2 ; + } + + void detectHit(Ray* result, Ray* inputRay, Bounce *bounce) { + int phase = 0; + int delta = 1; + int t = 1; + int k; + result->copyFrom(inputRay); + result->valid = false; + LensInterface* next = bounce->interface1; + LensInterface* f = NULL; + Intersection intersection; + for (k = 0 ; k < bounce->length-1;k++, t+=delta) { + f = this->interfaces[t]; + bool breflect = next == f; + if (breflect) { + delta = -delta; + if (phase == 0) { + next = bounce->interface2; + } else { + next = NULL; + } + phase ++; + } + + f->intersect(&intersection, result); + if (!intersection.hit) { + break; + } + if (f->isFlat()) { + if (t == this->bokehIndex) { + result->uv[0] = intersection.position[0]/f->nominalRadius; + result->uv[1] = intersection.position[1]/f->nominalRadius; + } + } + + float p[3] = { + intersection.position[0]-result->position[0], + intersection.position[1]-result->position[1], + intersection.position[2]-result->position[2] + }; + + float nfac = sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]); + + if (intersection.inverted) { + nfac *= -1; + } + + result->direction[0] = p[0]/nfac; + result->direction[1] = p[1]/nfac; + result->direction[2] = p[2]/nfac; + result->position[0] = intersection.position[0]; + result->position[1] = intersection.position[1]; + result->position[2] = intersection.position[2]; + + if (!f->isFlat()) { + // do refraction and reflection + double n0 = result->direction[2]<0?f->refraction1:f->refraction3; + double n1 = f->refraction2; + double n2 = result->direction[2]<0?f->refraction3:f->refraction1; + if (!breflect) { + float view[3] ={ + result->direction[0], + result->direction[1], + result->direction[2] + }; + int ref = this->refraction(result->direction, intersection.normal, view, n0/n1); + if (ref == 0) { + break; + } + } else { + this->reflection(result->direction, intersection.normal, result->direction); + float fresnelMultiplyer = fresnelAR(intersection.theta, result->wavelength, f->thicknessCoathing, n0, n1, n2); + if (isnan(fresnelMultiplyer)) { + fresnelMultiplyer = 0.0f; + } + result->intensity *= fresnelMultiplyer; + } + } + + } + if (k < bounce->length-1) { + result->intensity = 0; + } else { + result->valid = true; + } + } +}; + +typedef struct LensFace { + RayResult* v1; + RayResult* v2; + RayResult* v3; +} LensFace; + +LensGhostProjectionOperation::LensGhostProjectionOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->addOutputSocket(COM_DT_COLOR); + this->lampObject = NULL; + this->cameraObject = NULL; + this->system = NULL; + this->quality = COM_QUALITY_HIGH; + this->setComplex(false); +} + +LensGhostOperation::LensGhostOperation(): LensGhostProjectionOperation() { + this->setComplex(true); + +} + +void LensGhostProjectionOperation::initExecution() { + if (this->cameraObject != NULL && this->lampObject != NULL) { + if (lampObject == NULL || cameraObject == NULL) { + visualLampPosition[0] = 0; + visualLampPosition[1] = 0; + visualLampPosition[2] = 0; + } else { + /* too simple, better to return the distance on the view axis only + * return len_v3v3(ob->obmat[3], cam->dof_ob->obmat[3]); */ + float matt[4][4], imat[4][4], obmat[4][4]; + + copy_m4_m4(obmat, cameraObject->obmat); + normalize_m4(obmat); + invert_m4_m4(imat, obmat); + mult_m4_m4m4(matt, imat, lampObject->obmat); + + visualLampPosition[0] = (float)(matt[3][0]); + visualLampPosition[1] = (float)(matt[3][1]); + visualLampPosition[2] = (float)fabs(matt[3][2]); + } + } + this->lamp = (Lamp*)lampObject->data; + + this->step = this->quality==COM_QUALITY_LOW?64:this->quality==COM_QUALITY_MEDIUM?128:256; + this->bokehReader = this->getInputSocketReader(1); + +#define MM *0.001f +#define CM *0.01f +#define NM *0.000000001 +#define RED 650 NM +#define GREEN 510 NM +#define BLUE 475 NM +#define AIR 1.000293f +#define GLASS 1.5200f +#define TEST 0.000002f + // determine interfaces + LensSystem *system = new LensSystem(); + system->addInterface(new FlatInterface(0.0f,0.0f, 6.5 CM, 30 MM)); //ENTRANCE + system->addInterface(new SphereInterface(0.0f,0.0f, -3 CM, 8 CM, 3 CM, AIR, GLASS , 0.f)); + system->addInterface(new SphereInterface(0.0f,0.0f, -4 CM, 8 CM, 3 CM, GLASS, AIR, GREEN)); + system->addInterface(new FlatInterface(0.0f,0.0f, 3.0 CM, 15 MM)); // BOKEH + system->addInterface(new SphereInterface(0.0f,0.0f, 6 CM, 3 CM, 2 CM, AIR, GLASS, 0.0f)); + system->addInterface(new SphereInterface(0.0f,0.0f, 5.5 CM, 3 CM, 2 CM, GLASS, AIR, 0.f)); + system->addInterface(new FlatInterface(0.0f,0.0f,0 CM, 30 MM)); // SENSOR + system->bokehIndex =3; + + // determine interfaces +// LensSystem *system = new LensSystem(); +// system->addInterface(new FlatInterface(0.0f,0.0f, 6.5 CM, 30 MM)); //ENTRANCE +// system->addInterface(new SphereInterface(0.0f,0.0f, 14 CM, 8 CM, 6 CM, AIR, GLASS , 0.0f)); +// system->addInterface(new SphereInterface(0.0f,0.0f, 12 CM, 8 CM, 6 CM, GLASS, AIR, GREEN)); +// system->addInterface(new FlatInterface(0.0f,0.0f, 3.0 CM, 30 MM)); // BOKEH +// system->addInterface(new SphereInterface(0.0f,0.0f, 1 CM, 3 CM, 2 CM, AIR, GLASS, GREEN)); +// system->addInterface(new SphereInterface(0.0f,0.0f, -2 CM, 3 CM, 2 CM, GLASS, AIR, RED)); +// system->addInterface(new FlatInterface(0.0f,0.0f,0 CM, 20 MM)); // SENSOR +// system->bokehIndex = 3; +#undef CM +#undef MM + // determine bounces + system->updateBounces(step); + this->system = system; +} + +void LensGhostOperation::initExecution() { + LensGhostProjectionOperation::initExecution(); + LensSystem *system = (LensSystem*)this->system; + LensInterface *interface1 = system->interfaces[0]; + + // for every herz + float HERZ[3]={650 NM,510 NM,475 NM}; /// @todo use 7 for high quality? + for (int iw = 0 ; iw < 3 ; iw ++) { + float wavelength = HERZ[iw]; + // for every bounce + for (int ib = 0 ; ib < system->bounces.size() ; ib++) { + Bounce* bounce = system->bounces[ib]; + // based on quality setting the number of iteration will be different (128^2, 64^2, 32^2) + for (int xi = 0 ; xi < step ; xi ++) { + float x = -interface1->radius+xi*(interface1->radius*2/step); + for (int yi = 0 ; yi < step ; yi ++) { + float y = -interface1->radius+yi*(interface1->radius*2/step); + Ray r; + Ray result; + r.wavelength = wavelength; + r.intensity = this->lamp->energy; + r.uv[0] = 0.0f; + r.uv[1] = 0.0f; + r.position[0] = visualLampPosition[0]; + r.position[1] = visualLampPosition[1]; + r.position[2] = visualLampPosition[2]; + r.direction[0] = interface1->position[0]+x - r.position[0]; + r.direction[1] = interface1->position[1]+y - r.position[1]; + r.direction[2] = interface1->position[2] - r.position[2]; + normalize_v3(r.direction); + system->detectHit(&result, &r, bounce); + RayResult *res = bounce->getRayResult(xi, yi); + if (iw == 0) { + res->x = result.position[0]; + res->y = result.position[1]; + res->u = result.uv[0]; + res->v = result.uv[1]; + } + res->intensity[iw] = result.intensity; + if (result.valid) { + res->valid = true; + } + } + } + } + } +#undef NM + const int width = this->getWidth(); + const int height = this->getHeight(); + const float width2 = width/2.0f; + const float height2 = height/2.0f; + float *data = new float[width*height*4]; + for (int i = 0 ; i < width*height ; i ++) { + data[i*4+0] = 0.0f; + data[i*4+1] = 0.0f; + data[i*4+2] = 0.0f; + data[i*4+3] = 1.0f; + } + /// @todo every bounce creates own image. these images are added together at the end +// LensSystem *system = (LensSystem*)this->system; + LensInterface * lens = system->interfaces[system->lensIndex]; + for (int i = 0 ; i < system->bounces.size() ; i ++) { + Bounce* bounce = system->bounces[i]; + for (int r = 0 ; r < bounce->rasterLength*bounce->rasterLength ; r ++) { + RayResult *result = &bounce->raster[r]; +// if (result->valid) { + float ru= result->x/lens->nominalRadius*width2+width2; + float rv = result->y/lens->nominalRadius*height2+height2; + result->screenX = ru; + result->screenY = rv; + result->hasIntensity = result->intensity[0]>0.0f &&result->intensity[1]>0.0f&& result->intensity[2]>0.0f; +// } + } + } +} + +void* LensGhostOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + vector* result = new vector(); + LensSystem *system = (LensSystem*)this->system; + const float minx = rect->xmin; + const float miny = rect->ymin; + const float maxx = rect->xmax; + const float maxy = rect->ymax; + for (int i = 0 ; i < system->bounces.size() ; i ++) { + Bounce* bounce = system->bounces[i]; + int faceX, faceY; + for (faceX = 0 ; faceX < bounce->rasterLength-1 ; faceX++) { + for (faceY = 0 ; faceY < bounce->rasterLength-1 ; faceY++) { + RayResult* vertex1 = bounce->getRayResult(faceX, faceY); + RayResult* vertex2 = bounce->getRayResult(faceX+1, faceY); + RayResult* vertex3 = bounce->getRayResult(faceX+1, faceY+1); + RayResult* vertex4 = bounce->getRayResult(faceX, faceY+1); + // early hit test + if (!((vertex1->screenX < minx && vertex2->screenX < minx && vertex3->screenX < minx && vertex4->screenX < minx) || + (vertex1->screenX > maxx && vertex2->screenX > maxx && vertex3->screenX > maxx && vertex4->screenX > maxx) || + (vertex1->screenY < miny && vertex2->screenY < miny && vertex3->screenY < miny && vertex4->screenY < miny) || + (vertex1->screenY > maxy && vertex2->screenY > maxy && vertex3->screenY > maxy && vertex4->screenY > maxy))) { + int number = vertex1->hasIntensity +vertex2->hasIntensity +vertex3->hasIntensity +vertex4->hasIntensity; + if (number == 4) { + LensFace* face = new LensFace(); + face->v1 = vertex1; + face->v2 = vertex2; + face->v3 = vertex3; + result->push_back(face); + face = new LensFace(); + face->v1 = vertex3; + face->v2 = vertex4; + face->v3 = vertex1; + result->push_back(face); + } else if (number == 3) { + LensFace *face = new LensFace(); + if (!vertex1->hasIntensity) { + face->v1 = vertex2; + face->v2 = vertex3; + face->v3 = vertex4; + } else if (!vertex2->hasIntensity) { + face->v1 = vertex1; + face->v2 = vertex3; + face->v3 = vertex4; + } else if (!vertex3->hasIntensity) { + face->v1 = vertex1; + face->v2 = vertex2; + face->v3 = vertex4; + } else { + face->v1 = vertex1; + face->v2 = vertex2; + face->v3 = vertex3; + } + result->push_back(face); + } + } + } + } + } + + return result; +} + +void LensGhostOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { + if (data) { + vector* faces = (vector*)data; + while (faces->size() != 0) { + LensFace *face = faces->back(); + faces->pop_back(); + delete face; + } + delete faces; + } +} + + +void LensGhostProjectionOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float bokeh[4]; + LensSystem *system = (LensSystem*)this->system; + LensInterface *interface1 = system->interfaces[0]; + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.0f; + const float width = this->getWidth(); + const float height = this->getHeight(); + const float size = min(height, width); + const float width2 = width/2; + const float height2 = height/2; + const float size2 = size/2; + +#define NM *0.000000001 + float HERZ[3]={650 NM,510 NM,475 NM}; /// @todo use 7 for high quality? + float rx = ((x-width2)/size2) * interface1->radius; + float ry = ((y-height2)/size2) * interface1->radius; + + for (int iw = 0 ; iw < 3 ; iw ++) { + float intensity = 0.0f; + float wavelength = HERZ[iw]; + float colorcomponent = 0.0f; + if (iw ==0 ) colorcomponent = lamp->r; + if (iw ==1 ) colorcomponent = lamp->g; + if (iw ==2 ) colorcomponent = lamp->b; + + + // for every bounce + for (int ib = 0 ; ib < system->bounces.size() ; ib++) { + Bounce* bounce = system->bounces[ib]; + // based on quality setting the number of iteration will be different (128^2, 64^2, 32^2) + + Ray r; + Ray result; + r.wavelength = wavelength; + r.intensity = this->lamp->energy; + r.uv[0] = 0.0f; + r.uv[1] = 0.0f; + r.position[0] = visualLampPosition[0]; + r.position[1] = visualLampPosition[1]; + r.position[2] = visualLampPosition[2]; + r.direction[0] = interface1->position[0]+rx - r.position[0]; + r.direction[1] = interface1->position[1]+ry - r.position[1]; + r.direction[2] = interface1->position[2] - r.position[2]; + normalize_v3(r.direction); + system->detectHit(&result, &r, bounce); + if (result.valid) { + float u = ((result.uv[0]+1.0f)/2)*bokehReader->getWidth(); + float v = ((result.uv[1]+1.0f)/2)*bokehReader->getHeight(); + + bokehReader->read(bokeh, u, v, sampler, inputBuffers); + + intensity += result.intensity *bokeh[iw]; + } + } + intensity = maxf(0.0f, intensity); + color[iw] = intensity*colorcomponent; + } + color[3] = 1.0f; +#undef NM + +} + + + +void LensGhostOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + vector* faces = (vector*)data; + const float bokehWidth = bokehReader->getWidth(); + const float bokehHeight = bokehReader->getHeight(); + float bokeh[4]; + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 1.0f; + + unsigned int index; + for (index = 0 ; index < faces->size() ; index ++) { + LensFace * face = faces->operator [](index); + RayResult* vertex1 = face->v1; + RayResult* vertex2 = face->v2; + RayResult* vertex3 = face->v3; + if (!((vertex1->screenX < x && vertex2->screenX < x && vertex3->screenX < x) || + (vertex1->screenX > x && vertex2->screenX > x && vertex3->screenX > x) || + (vertex1->screenY < y && vertex2->screenY < y && vertex3->screenY < y) || + (vertex1->screenY > y && vertex2->screenY > y && vertex3->screenY > y))) { + + const float v1[2] = {vertex1->screenX, vertex1->screenY}; + const float v2[2] = {vertex2->screenX, vertex2->screenY}; + const float v3[2] = {vertex3->screenX, vertex3->screenY}; + const float co[2] = {x, y}; + float weights[3]; + + barycentric_weights_v2(v1, v2, v3, co, weights); + if (weights[0]>=0.0f && weights[0]<=1.0f && + weights[1]>=0.0f && weights[1]<=1.0f && + weights[2]>=0.0f && weights[2]<=1.0f) { +// const float u = (vertex1->u*weights[0]+vertex2->u*weights[1]+vertex3->u*weights[2]); +// const float v = (vertex1->v*weights[0]+vertex2->v*weights[1]+vertex3->v*weights[2]); +// const float tu = ((u+1.0f)/2.0f)*bokehWidth; +// const float tv = ((v+1.0f)/2.0f)*bokehHeight; +// bokehReader->read(bokeh, tu, tv, inputBuffers); + +// color[0] = max(color[0], bokeh[0]*(vertex1->intensity[0]*weights[0]+vertex2->intensity[0]*weights[1]+vertex3->intensity[0]*weights[2])); +// color[1] = max(color[1], bokeh[1]*(vertex1->intensity[1]*weights[0]+vertex2->intensity[1]*weights[1]+vertex3->intensity[1]*weights[2])); +// color[2] = max(color[2], bokeh[2]*(vertex1->intensity[2]*weights[0]+vertex2->intensity[2]*weights[1]+vertex3->intensity[2]*weights[2])); + color[0] = max(color[0], (vertex1->intensity[0]*weights[0]+vertex2->intensity[0]*weights[1]+vertex3->intensity[0]*weights[2])); + color[1] = max(color[1], (vertex1->intensity[1]*weights[0]+vertex2->intensity[1]*weights[1]+vertex3->intensity[1]*weights[2])); + color[2] = max(color[2], (vertex1->intensity[2]*weights[0]+vertex2->intensity[2]*weights[1]+vertex3->intensity[2]*weights[2])); + } + } + } +} + + +void LensGhostProjectionOperation::deinitExecution() { + if (this->system) delete (LensSystem*)this->system; + this->system = NULL; + this->bokehReader = NULL; +} + +bool LensGhostProjectionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti bokehInput; + + NodeOperation *operation = this->getInputOperation(1); + bokehInput.xmax = operation->getWidth(); + bokehInput.xmin = 0; + bokehInput.ymax = operation->getHeight(); + bokehInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&bokehInput, readOperation, output) ) { + return true; + } + + return NodeOperation::determineDependingAreaOfInterest(input, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.h b/source/blender/compositor/operations/COM_LensGhostOperation.h new file mode 100644 index 00000000000..396f681e797 --- /dev/null +++ b/source/blender/compositor/operations/COM_LensGhostOperation.h @@ -0,0 +1,82 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_LensGhostOperation_h +#define _COM_LensGhostOperation_h +#include "COM_NodeOperation.h" +#include "DNA_lamp_types.h" +#include "DNA_object_types.h" +#include "DNA_camera_types.h" + +class LensGhostProjectionOperation : public NodeOperation { +protected: + Object* lampObject; + Lamp* lamp; + Object* cameraObject; + + void* system; + float visualLampPosition[3]; + CompositorQuality quality; + int step; + SocketReader * bokehReader; + +public: + LensGhostProjectionOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + void setLampObject(Object* lampObject) {this->lampObject = lampObject;} + void setCameraObject(Object* cameraObject) {this->cameraObject = cameraObject;} + + void setQuality(CompositorQuality quality) {this->quality = quality;} +}; + +class LensGhostOperation : public LensGhostProjectionOperation { +public: + LensGhostOperation(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + /** + * Initialize the execution + */ + void initExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp b/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp new file mode 100644 index 00000000000..935844a84f1 --- /dev/null +++ b/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_LensGlowImageOperation.h" +#include "BLI_math.h" + +LensGlowImageOperation::LensGlowImageOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_COLOR); +} +void LensGlowImageOperation::initExecution() { + this->scale = 1/20000.0f; +} +void LensGlowImageOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + const float cs_r = 1.f, cs_g = 1.f, cs_b = 1.f; + const float v = 2.f*(y / (float)512.0f) - 1.f; + const float u = 2.f*(x / (float)512.0f) - 1.f; + const float r = (u*u + v*v)*scale; + const float d = -sqrtf(sqrtf(sqrtf(r)))*9.f; + const float w = (0.5f + 0.5f*cos((double)u*M_PI))*(0.5f + 0.5f*cos((double)v*M_PI)); + color[0] = expf(d*cs_r) * w; + color[1] = expf(d*cs_g) * w; + color[2] = expf(d*cs_b) * w; + color[3] = 1.0f; +} + +void LensGlowImageOperation::deinitExecution() { +} + +void LensGlowImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + resolution[0] = 512; + resolution[1] = 512; +} diff --git a/source/blender/compositor/operations/COM_LensGlowImageOperation.h b/source/blender/compositor/operations/COM_LensGlowImageOperation.h new file mode 100644 index 00000000000..2943f8957a6 --- /dev/null +++ b/source/blender/compositor/operations/COM_LensGlowImageOperation.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_LensGlowImageOperation_h +#define _COM_LensGlowImageOperation_h +#include "COM_NodeOperation.h" + + +class LensGlowImageOperation : public NodeOperation { +private: + float scale; + +public: + LensGlowImageOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_LensGlowOperation.cpp b/source/blender/compositor/operations/COM_LensGlowOperation.cpp new file mode 100644 index 00000000000..ecaef52d8e1 --- /dev/null +++ b/source/blender/compositor/operations/COM_LensGlowOperation.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_LensGlowOperation.h" +#include "BLI_math.h" + +LensGlowOperation::LensGlowOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputProgram = NULL; + this->lamp = NULL; +} +void LensGlowOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); +} + +void LensGlowOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +// const float emit100 = this->lamp->energy*100; +// const float emit200 = emit100*2; +// const float deltaX = 160-x; +// const float deltaY = 100-y; +// const float distance = deltaX * deltaX + deltaY*deltaY; + +// float glow = (emit100-(distance))/(emit200); +// if (glow<0) glow=0; + +// color[0] = glow*lamp->r; +// color[1] = glow*lamp->g; +// color[2] = glow*lamp->b; +// color[3] = 1.0f; +} + +void LensGlowOperation::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_LensGlowOperation.h b/source/blender/compositor/operations/COM_LensGlowOperation.h new file mode 100644 index 00000000000..9a18f605cda --- /dev/null +++ b/source/blender/compositor/operations/COM_LensGlowOperation.h @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_LensGlowOperation_h +#define _COM_LensGlowOperation_h +#include "COM_NodeOperation.h" +#include "DNA_lamp_types.h" + +class LensGlowOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + Lamp* lamp; + +public: + LensGlowOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setLamp(Lamp* lamp) {this->lamp = lamp;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp new file mode 100644 index 00000000000..7850a631212 --- /dev/null +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp @@ -0,0 +1,79 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_LuminanceMatteOperation.h" +#include "BLI_math.h" + +LuminanceMatteOperation::LuminanceMatteOperation(): NodeOperation() { + addInputSocket(COM_DT_COLOR); + addOutputSocket(COM_DT_VALUE); + + inputImageProgram = NULL; +} + +void LuminanceMatteOperation::initExecution() { + this->inputImageProgram = this->getInputSocketReader(0); +} + +void LuminanceMatteOperation::deinitExecution() { + this->inputImageProgram= NULL; +} + +void LuminanceMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inColor[4]; + + const float high=this->settings->t1; + const float low=this->settings->t2; + + float alpha; + + this->inputImageProgram->read(inColor, x, y, sampler, inputBuffers); + + /* one line thread-friend algorithm: + outputValue[0] = max(inputValue[3], min(high, max(low, ((inColor[0]-low)/(high-low)))) + */ + + /* test range*/ + if(inColor[0] > high) { + alpha=1.f; + } + else if(inColor[0] < low){ + alpha=0.f; + } + else {/*blend */ + alpha=(inColor[0]-low)/(high-low); + } + + + /* store matte(alpha) value in [0] to go with + * COM_SetAlphaOperation and the Value output + */ + + /* don't make something that was more transparent less transparent */ + if (alphasettings= nodeChroma;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_MapUVOperation.cpp b/source/blender/compositor/operations/COM_MapUVOperation.cpp new file mode 100644 index 00000000000..ef0c9004a7d --- /dev/null +++ b/source/blender/compositor/operations/COM_MapUVOperation.cpp @@ -0,0 +1,153 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_MapUVOperation.h" +#include "BLI_math.h" + +MapUVOperation::MapUVOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VECTOR); + this->addOutputSocket(COM_DT_COLOR); + this->alpha = 0.f; + this->setComplex(true); + + this->inputUVProgram = NULL; + this->inputColorProgram = NULL; +} + +void MapUVOperation::initExecution() { + this->inputColorProgram = this->getInputSocketReader(0); + this->inputUVProgram = this->getInputSocketReader(1); +} + +void MapUVOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputUV[4]; + float uv_a[4], uv_b[4]; + float u,v; + + float dx, dy; + float uv_l, uv_r; + float uv_u, uv_d; + + this->inputUVProgram->read(inputUV, x, y, sampler, inputBuffers); + if (inputUV[2] == 0.f) { + color[0] = 0.f; + color[1] = 0.f; + color[2] = 0.f; + color[3] = 0.f; + return; + } + /* adaptive sampling, red (U) channel */ + this->inputUVProgram->read(uv_a, x-1, y, COM_PS_NEAREST, inputBuffers); + this->inputUVProgram->read(uv_b, x+1, y, COM_PS_NEAREST, inputBuffers); + uv_l= uv_a[2]!=0.f? fabs(inputUV[0] - uv_a[0]) : 0.f; + uv_r= uv_b[2]!=0.f? fabs(inputUV[0] - uv_b[0]) : 0.f; + + dx= 0.5f * (uv_l + uv_r); + + /* adaptive sampling, green (V) channel */ + this->inputUVProgram->read(uv_a, x, y-1, COM_PS_NEAREST, inputBuffers); + this->inputUVProgram->read(uv_b, x, y+1, COM_PS_NEAREST, inputBuffers); + uv_u= uv_a[2]!=0.f? fabs(inputUV[1] - uv_a[1]) : 0.f; + uv_d= uv_b[2]!=0.f? fabs(inputUV[1] - uv_b[1]) : 0.f; + + dy= 0.5f * (uv_u + uv_d); + + /* more adaptive sampling, red and green (UV) channels */ + this->inputUVProgram->read(uv_a, x-1, y-1, COM_PS_NEAREST, inputBuffers); + this->inputUVProgram->read(uv_b, x-1, y+1, COM_PS_NEAREST, inputBuffers); + uv_l= uv_a[2]!=0.f? fabsf(inputUV[0] - uv_a[0]) : 0.f; + uv_r= uv_b[2]!=0.f? fabsf(inputUV[0] - uv_b[0]) : 0.f; + uv_u= uv_a[2]!=0.f? fabsf(inputUV[1] - uv_a[1]) : 0.f; + uv_d= uv_b[2]!=0.f? fabsf(inputUV[1] - uv_b[1]) : 0.f; + + dx+= 0.25f * (uv_l + uv_r); + dy+= 0.25f * (uv_u + uv_d); + + this->inputUVProgram->read(uv_a, x+1, y-1, COM_PS_NEAREST, inputBuffers); + this->inputUVProgram->read(uv_b, x+1, y+1, COM_PS_NEAREST, inputBuffers); + uv_l= uv_a[2]!=0.f? fabsf(inputUV[0] - uv_a[0]) : 0.f; + uv_r= uv_b[2]!=0.f? fabsf(inputUV[0] - uv_b[0]) : 0.f; + uv_u= uv_a[2]!=0.f? fabsf(inputUV[1] - uv_a[1]) : 0.f; + uv_d= uv_b[2]!=0.f? fabsf(inputUV[1] - uv_b[1]) : 0.f; + + dx+= 0.25f * (uv_l + uv_r); + dy+= 0.25f * (uv_u + uv_d); + + /* UV to alpha threshold */ + const float threshold = this->alpha * 0.05f; + float alpha = 1.0f - threshold * (dx + dy); + if (alpha < 0.f) alpha= 0.f; + else alpha *= inputUV[2]; + + /* should use mipmap */ + dx= min(dx, 0.2f); + dy= min(dy, 0.2f); + + + /* EWA filtering */ + u = inputUV[0] * inputColorProgram->getWidth(); + v = inputUV[1] * inputColorProgram->getHeight(); + + this->inputColorProgram->read(color, u, v, dx, dy, inputBuffers); + + /* "premul" */ + if(alpha < 1.0f) { + color[0]*= alpha; + color[1]*= alpha; + color[2]*= alpha; + color[3]*= alpha; + } +} + +void MapUVOperation::deinitExecution() { + this->inputUVProgram = NULL; + this->inputColorProgram = NULL; +} + +bool MapUVOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti colorInput; + rcti uvInput; + NodeOperation *operation=NULL; + + /* the uv buffer only needs a 3x3 buffer. The image needs whole buffer */ + + operation = getInputOperation(0); + colorInput.xmax = operation->getWidth(); + colorInput.xmin = 0; + colorInput.ymax = operation->getHeight(); + colorInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&colorInput, readOperation, output)) { + return true; + } + + operation = getInputOperation(1); + uvInput.xmax = input->xmax + 1; + uvInput.xmin = input->xmin - 1; + uvInput.ymax = input->ymax + 1; + uvInput.ymin = input->ymin - 1; + if (operation->determineDependingAreaOfInterest(&uvInput, readOperation, output)) { + return true; + } + + return false; +} + diff --git a/source/blender/compositor/operations/COM_MapUVOperation.h b/source/blender/compositor/operations/COM_MapUVOperation.h new file mode 100644 index 00000000000..58c962eb17c --- /dev/null +++ b/source/blender/compositor/operations/COM_MapUVOperation.h @@ -0,0 +1,62 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_MapUVOperation_h +#define _COM_MapUVOperation_h +#include "COM_NodeOperation.h" + + +class MapUVOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputUVProgram; + SocketReader* inputColorProgram; + + float alpha; + +public: + MapUVOperation(); + + /** + * we need a 3x3 differential filter for UV Input and full buffer for the image + */ + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setAlpha(float alpha){this->alpha = alpha;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_MapValueOperation.cpp b/source/blender/compositor/operations/COM_MapValueOperation.cpp new file mode 100644 index 00000000000..33d38b8475d --- /dev/null +++ b/source/blender/compositor/operations/COM_MapValueOperation.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MapValueOperation.h" + +MapValueOperation::MapValueOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputOperation = NULL; +} + +void MapValueOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void MapValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float src[4]; + inputOperation->read(src, x, y, sampler, inputBuffers); + TexMapping *texmap= this->settings; + float value = (src[0] + texmap->loc[0])*texmap->size[0]; + if(texmap->flag & TEXMAP_CLIP_MIN) + if(valuemin[0]) + value= texmap->min[0]; + if(texmap->flag & TEXMAP_CLIP_MAX) + if(value>texmap->max[0]) + value= texmap->max[0]; + + outputValue[0] = value; +} + +void MapValueOperation::deinitExecution() { + this->inputOperation = NULL; +} diff --git a/source/blender/compositor/operations/COM_MapValueOperation.h b/source/blender/compositor/operations/COM_MapValueOperation.h new file mode 100644 index 00000000000..93274a12493 --- /dev/null +++ b/source/blender/compositor/operations/COM_MapValueOperation.h @@ -0,0 +1,66 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MapValueOperation_h +#define _COM_MapValueOperation_h +#include "COM_NodeOperation.h" +#include "DNA_texture_types.h" + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MapValueOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputOperation; + TexMapping * settings; +public: + /** + * Default constructor + */ + MapValueOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + /** + * @brief set the TexMapping settings + */ + void setSettings(TexMapping* settings) {this->settings = settings;} + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.cpp b/source/blender/compositor/operations/COM_MathBaseOperation.cpp new file mode 100644 index 00000000000..55880566bf2 --- /dev/null +++ b/source/blender/compositor/operations/COM_MathBaseOperation.cpp @@ -0,0 +1,239 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MathBaseOperation.h" +extern "C" { +#include "BLI_math.h" +} + +MathBaseOperation::MathBaseOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->inputValue1Operation = NULL; + this->inputValue2Operation = NULL; +} + +void MathBaseOperation::initExecution() { + this->inputValue1Operation = this->getInputSocketReader(0); + this->inputValue2Operation = this->getInputSocketReader(1); +} + + +void MathBaseOperation::deinitExecution() { + this->inputValue1Operation = NULL; + this->inputValue2Operation = NULL; +} + +void MathAddOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = inputValue1[0] + inputValue2[0]; +} + +void MathSubtractOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = inputValue1[0] - inputValue2[0]; +} + +void MathMultiplyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = inputValue1[0] * inputValue2[0]; +} + +void MathDivideOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + if(inputValue2[0]==0) /* We don't want to divide by zero. */ + outputValue[0]= 0.0; + else + outputValue[0]= inputValue1[0] / inputValue2[0]; +} + +void MathSineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = sin(inputValue1[0]); +} + +void MathCosineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = cos(inputValue1[0]); +} + +void MathTangentOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = tan(inputValue1[0]); +} + +void MathArcSineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + if(inputValue1[0] <= 1 && inputValue1[0] >= -1 ) + outputValue[0]= asin(inputValue1[0]); + else + outputValue[0]= 0.0; +} + +void MathArcCosineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + if(inputValue1[0] <= 1 && inputValue1[0] >= -1 ) + outputValue[0]= acos(inputValue1[0]); + else + outputValue[0]= 0.0; +} + +void MathArcTangentOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = atan(inputValue1[0]); +} + +void MathPowerOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + if( inputValue1[0] >= 0 ) { + outputValue[0]= pow(inputValue1[0], inputValue2[0]); + } else { + float y_mod_1 = fmod(inputValue2[0], 1); + /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ + if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { + outputValue[0]= pow(inputValue1[0], (float)floor(inputValue2[0] + 0.5)); + } else { + outputValue[0] = 0.0; + } + } +} + +void MathLogarithmOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + if( inputValue1[0] > 0 && inputValue2[0] > 0 ) + outputValue[0]= log(inputValue1[0]) / log(inputValue2[0]); + else + outputValue[0]= 0.0; +} + +void MathMinimumOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = min(inputValue1[0], inputValue2[0]); +} + +void MathMaximumOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = max(inputValue1[0], inputValue2[0]); +} + +void MathRoundOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = round(inputValue1[0]); +} + +void MathLessThanOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputValue1[4]; + float inputValue2[4]; + + inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = inputValue1[0]read(&inputValue1[0], x, y, sampler, inputBuffers); + inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); + + outputValue[0] = inputValue1[0]>inputValue2[0]?1.0f:0.0f; +} + + diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.h b/source/blender/compositor/operations/COM_MathBaseOperation.h new file mode 100644 index 00000000000..728d989e1e9 --- /dev/null +++ b/source/blender/compositor/operations/COM_MathBaseOperation.h @@ -0,0 +1,150 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MathBaseOperation_h +#define _COM_MathBaseOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MathBaseOperation : public NodeOperation { +protected: + /** + * Prefetched reference to the inputProgram + */ + SocketReader * inputValue1Operation; + SocketReader * inputValue2Operation; + +protected: + /** + * Default constructor + */ + MathBaseOperation(); +public: + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) = 0; + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + +}; + +class MathAddOperation: public MathBaseOperation { +public: + MathAddOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathSubtractOperation: public MathBaseOperation { +public: + MathSubtractOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathMultiplyOperation: public MathBaseOperation { +public: + MathMultiplyOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathDivideOperation: public MathBaseOperation { +public: + MathDivideOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathSineOperation: public MathBaseOperation { +public: + MathSineOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathCosineOperation: public MathBaseOperation { +public: + MathCosineOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathTangentOperation: public MathBaseOperation { +public: + MathTangentOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +class MathArcSineOperation: public MathBaseOperation { +public: + MathArcSineOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathArcCosineOperation: public MathBaseOperation { +public: + MathArcCosineOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathArcTangentOperation: public MathBaseOperation { +public: + MathArcTangentOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathPowerOperation: public MathBaseOperation { +public: + MathPowerOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathLogarithmOperation: public MathBaseOperation { +public: + MathLogarithmOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathMinimumOperation: public MathBaseOperation { +public: + MathMinimumOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathMaximumOperation: public MathBaseOperation { +public: + MathMaximumOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathRoundOperation: public MathBaseOperation { +public: + MathRoundOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathLessThanOperation: public MathBaseOperation { +public: + MathLessThanOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +class MathGreaterThanOperation: public MathBaseOperation { +public: + MathGreaterThanOperation() : MathBaseOperation() {} + void executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_MixAddOperation.cpp b/source/blender/compositor/operations/COM_MixAddOperation.cpp new file mode 100644 index 00000000000..d428ca52b49 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixAddOperation.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixAddOperation.h" + +MixAddOperation::MixAddOperation(): MixBaseOperation() { +} + +void MixAddOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float inputValue[4]; + + inputValueOperation->read(inputValue, x, y, sampler, inputBuffers); + inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); + inputColor2Operation->read(inputColor2, x, y, sampler, inputBuffers); + + + float value = inputValue[0]; + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + outputValue[0] = inputColor1[0]+value*inputColor2[0]; + outputValue[1] = inputColor1[1]+value*inputColor2[1]; + outputValue[2] = inputColor1[2]+value*inputColor2[2]; + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixAddOperation.h b/source/blender/compositor/operations/COM_MixAddOperation.h new file mode 100644 index 00000000000..0a76083be73 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixAddOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixAddOperation_h +#define _COM_MixAddOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixAddOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixAddOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixBaseOperation.cpp b/source/blender/compositor/operations/COM_MixBaseOperation.cpp new file mode 100644 index 00000000000..9f8378defe9 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixBaseOperation.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixBaseOperation.h" + +MixBaseOperation::MixBaseOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->inputValueOperation = NULL; + this->inputColor1Operation = NULL; + this->inputColor2Operation = NULL; + this->setUseValueAlphaMultiply(false); +} + +void MixBaseOperation::initExecution() { + this->inputValueOperation = this->getInputSocketReader(0); + this->inputColor1Operation = this->getInputSocketReader(1); + this->inputColor2Operation = this->getInputSocketReader(2); +} + +void MixBaseOperation::executePixel(float* outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + outputColor[0] = valuem*(inputColor1[0])+value*(inputColor2[0]); + outputColor[1] = valuem*(inputColor1[1])+value*(inputColor2[1]); + outputColor[2] = valuem*(inputColor1[2])+value*(inputColor2[2]); + outputColor[3] = inputColor1[3]; +} + +void MixBaseOperation::deinitExecution() { + this->inputValueOperation = NULL; + this->inputColor1Operation = NULL; + this->inputColor2Operation = NULL; +} + +void MixBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]){ + InputSocket* socket; + unsigned int tempPreferredResolution[] = {0,0}; + unsigned int tempResolution[2]; + + socket = this->getInputSocket(1); + socket->determineResolution(tempResolution, tempPreferredResolution); + if((tempResolution[0] != 0) && (tempResolution[1] != 0)){ + this->setResolutionInputSocketIndex(1); + }else { + socket = this->getInputSocket(2); + tempPreferredResolution[0] = 0; + tempPreferredResolution[1] = 0; + socket->determineResolution(tempResolution, tempPreferredResolution); + if((tempResolution[0] != 0) && (tempResolution[1] != 0)){ + this->setResolutionInputSocketIndex(2); + }else { + this->setResolutionInputSocketIndex(0); + } + } + NodeOperation::determineResolution(resolution, preferredResolution); +} + diff --git a/source/blender/compositor/operations/COM_MixBaseOperation.h b/source/blender/compositor/operations/COM_MixBaseOperation.h new file mode 100644 index 00000000000..171cde080eb --- /dev/null +++ b/source/blender/compositor/operations/COM_MixBaseOperation.h @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixBaseOperation_h +#define _COM_MixBaseOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixBaseOperation : public NodeOperation { +protected: + /** + * Prefetched reference to the inputProgram + */ + SocketReader * inputValueOperation; + SocketReader* inputColor1Operation; + SocketReader* inputColor2Operation; + bool valueAlphaMultiply; +public: + /** + * Default constructor + */ + MixBaseOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + void setUseValueAlphaMultiply(const bool value) {this->valueAlphaMultiply = value;} + bool useValueAlphaMultiply() {return this->valueAlphaMultiply;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixBlendOperation.cpp b/source/blender/compositor/operations/COM_MixBlendOperation.cpp new file mode 100644 index 00000000000..7b12393bb20 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixBlendOperation.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixBlendOperation.h" + +MixBlendOperation::MixBlendOperation(): MixBaseOperation() { +} + +void MixBlendOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float inputValue[4]; + float value; + + inputValueOperation->read(inputValue, x, y, sampler, inputBuffers); + inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); + inputColor2Operation->read(inputColor2, x, y, sampler, inputBuffers); + value = inputValue[0]; + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + outputValue[0] = valuem*(inputColor1[0])+value*(inputColor2[0]); + outputValue[1] = valuem*(inputColor1[1])+value*(inputColor2[1]); + outputValue[2] = valuem*(inputColor1[2])+value*(inputColor2[2]); + outputValue[3] = inputColor1[3]; +} diff --git a/source/blender/compositor/operations/COM_MixBlendOperation.h b/source/blender/compositor/operations/COM_MixBlendOperation.h new file mode 100644 index 00000000000..5cf31ee9151 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixBlendOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixBlendOperation_h +#define _COM_MixBlendOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixBlendOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixBlendOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixBurnOperation.cpp b/source/blender/compositor/operations/COM_MixBurnOperation.cpp new file mode 100644 index 00000000000..28b86be5e1e --- /dev/null +++ b/source/blender/compositor/operations/COM_MixBurnOperation.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixBurnOperation.h" + +MixBurnOperation::MixBurnOperation(): MixBaseOperation() { +} + +void MixBurnOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + float tmp; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + tmp = valuem + value*inputColor2[0]; + if (tmp <= 0.0f) + outputValue[0] = 0.0f; + else { + tmp = 1.0f - (1.0f - inputColor1[0]) / tmp; + if (tmp < 0.0f) + outputValue[0] = 0.0f; + else if (tmp > 1.0f) + outputValue[0] = 1.0f; + else + outputValue[0] = tmp; + } + + tmp = valuem + value*inputColor2[1]; + if (tmp <= 0.0f) + outputValue[1] = 0.0f; + else { + tmp = 1.0f - (1.0f - inputColor1[1]) / tmp; + if (tmp < 0.0f) + outputValue[1] = 0.0f; + else if (tmp > 1.0f) + outputValue[1] = 1.0f; + else + outputValue[1] = tmp; + } + + tmp = valuem + value*inputColor2[2]; + if (tmp <= 0.0f) + outputValue[2] = 0.0f; + else { + tmp = 1.0f - (1.0f - inputColor1[2]) / tmp; + if (tmp < 0.0f) + outputValue[2] = 0.0f; + else if (tmp > 1.0f) + outputValue[2] = 1.0f; + else + outputValue[2] = tmp; + } + + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixBurnOperation.h b/source/blender/compositor/operations/COM_MixBurnOperation.h new file mode 100644 index 00000000000..132db3d25e7 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixBurnOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixBurnOperation_h +#define _COM_MixBurnOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixBurnOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixBurnOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixColorOperation.cpp b/source/blender/compositor/operations/COM_MixColorOperation.cpp new file mode 100644 index 00000000000..ebcb7056570 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixColorOperation.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixColorOperation.h" + +extern "C" { + #include "BLI_math.h" +} + +MixColorOperation::MixColorOperation(): MixBaseOperation() { +} + +void MixColorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + float colH,colS,colV; + rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); + if(colS!=0.0f){ + float rH,rS,rV; + float tmpr,tmpg,tmpb; + rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); + hsv_to_rgb(colH , colS, rV, &tmpr, &tmpg, &tmpb); + outputValue[0] = valuem*(inputColor1[0]) + value*tmpr; + outputValue[1] = valuem*(inputColor1[1]) + value*tmpg; + outputValue[2] = valuem*(inputColor1[2]) + value*tmpb; + } + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixColorOperation.h b/source/blender/compositor/operations/COM_MixColorOperation.h new file mode 100644 index 00000000000..dfbdcfc0368 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixColorOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixColorOperation_h +#define _COM_MixColorOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixColorOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixColorOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixDarkenOperation.cpp b/source/blender/compositor/operations/COM_MixDarkenOperation.cpp new file mode 100644 index 00000000000..773a51e92cb --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDarkenOperation.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixDarkenOperation.h" + +MixDarkenOperation::MixDarkenOperation(): MixBaseOperation() { +} + +void MixDarkenOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem = 1.0f-value; + float tmp; + tmp=inputColor2[0]+((1.0f-inputColor2[0])*valuem); + if(tmp < inputColor1[0]) outputValue[0]= tmp; + else outputValue[0] = inputColor1[0]; + tmp=inputColor2[1]+((1.0f-inputColor2[1])*valuem); + if(tmp < inputColor1[1]) outputValue[1]= tmp; + else outputValue[1] = inputColor1[1]; + tmp=inputColor2[2]+((1.0f-inputColor2[2])*valuem); + if(tmp < inputColor1[2]) outputValue[2]= tmp; + else outputValue[2] = inputColor1[2]; + + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixDarkenOperation.h b/source/blender/compositor/operations/COM_MixDarkenOperation.h new file mode 100644 index 00000000000..7ead435212d --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDarkenOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixDarkenOperation_h +#define _COM_MixDarkenOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixDarkenOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixDarkenOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp b/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp new file mode 100644 index 00000000000..4ea1428b387 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixDifferenceOperation.h" +#include "BLI_math.h" + +MixDifferenceOperation::MixDifferenceOperation(): MixBaseOperation() { +} + +void MixDifferenceOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + outputValue[0] = valuem*inputColor1[0] + value*fabsf(inputColor1[0]-inputColor2[0]); + outputValue[1] = valuem*inputColor1[1] + value*fabsf(inputColor1[1]-inputColor2[1]); + outputValue[2] = valuem*inputColor1[2] + value*fabsf(inputColor1[2]-inputColor2[2]); + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixDifferenceOperation.h b/source/blender/compositor/operations/COM_MixDifferenceOperation.h new file mode 100644 index 00000000000..9b95d5a91ad --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDifferenceOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixDifferenceOperation_h +#define _COM_MixDifferenceOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixDifferenceOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixDifferenceOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixDivideOperation.cpp b/source/blender/compositor/operations/COM_MixDivideOperation.cpp new file mode 100644 index 00000000000..c2579c6a89c --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDivideOperation.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixDivideOperation.h" + +MixDivideOperation::MixDivideOperation(): MixBaseOperation() { +} + +void MixDivideOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + if(inputColor2[0]!=0.0f) + outputValue[0] = valuem*(inputColor1[0]) + value*(inputColor1[0])/inputColor2[0]; + else + outputValue[0] = 0.0f; + if(inputColor2[1]!=0.0f) + outputValue[1] = valuem*(inputColor1[1]) + value*(inputColor1[1])/inputColor2[1]; + else + outputValue[1] = 0.0f; + if(inputColor2[2]!=0.0f) + outputValue[2] = valuem*(inputColor1[2]) + value*(inputColor1[2])/inputColor2[2]; + else + outputValue[2] = 0.0f; + + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixDivideOperation.h b/source/blender/compositor/operations/COM_MixDivideOperation.h new file mode 100644 index 00000000000..d43ddb49c91 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDivideOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixDivideOperation_h +#define _COM_MixDivideOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixDivideOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixDivideOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixDodgeOperation.cpp b/source/blender/compositor/operations/COM_MixDodgeOperation.cpp new file mode 100644 index 00000000000..7e6ddeee5e6 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDodgeOperation.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixDodgeOperation.h" + +MixDodgeOperation::MixDodgeOperation(): MixBaseOperation() { +} + +void MixDodgeOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + float tmp; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + + if (inputColor1[0] != 0.0f) { + tmp = 1.0f - value*inputColor2[0]; + if (tmp <= 0.0f) + outputValue[0] = 1.0f; + else { + tmp = inputColor1[0] / tmp; + if (tmp > 1.0f) + outputValue[0] = 1.0f; + else + outputValue[0] = tmp; + } + } + else + outputValue[0] = 0.0f; + + if (inputColor1[1] != 0.0f) { + tmp = 1.0f - value*inputColor2[1]; + if (tmp <= 0.0f) + outputValue[1] = 1.0f; + else { + tmp = inputColor1[1] / tmp; + if (tmp > 1.0f) + outputValue[1] = 1.0f; + else + outputValue[1] = tmp; + } + } + else + outputValue[1] = 0.0f; + + if (inputColor1[2] != 0.0f) { + tmp = 1.0f - value*inputColor2[2]; + if (tmp <= 0.0f) + outputValue[2] = 1.0f; + else { + tmp = inputColor1[2] / tmp; + if (tmp > 1.0f) + outputValue[2] = 1.0f; + else + outputValue[2] = tmp; + } + } + else + outputValue[2] = 0.0f; + + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixDodgeOperation.h b/source/blender/compositor/operations/COM_MixDodgeOperation.h new file mode 100644 index 00000000000..0a910c167ba --- /dev/null +++ b/source/blender/compositor/operations/COM_MixDodgeOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixDodgeOperation_h +#define _COM_MixDodgeOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixDodgeOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixDodgeOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixHueOperation.cpp b/source/blender/compositor/operations/COM_MixHueOperation.cpp new file mode 100644 index 00000000000..386bd02ba2a --- /dev/null +++ b/source/blender/compositor/operations/COM_MixHueOperation.cpp @@ -0,0 +1,58 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixHueOperation.h" + +extern "C" { + #include "BLI_math.h" +} + +MixHueOperation::MixHueOperation(): MixBaseOperation() { +} + +void MixHueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + float colH,colS,colV; + rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); + if(colS!=0.0f){ + float rH,rS,rV; + float tmpr,tmpg,tmpb; + rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); + hsv_to_rgb(colH , rS, rV, &tmpr, &tmpg, &tmpb); + outputValue[0] = valuem*(inputColor1[0]) + value*tmpr; + outputValue[1] = valuem*(inputColor1[1]) + value*tmpg; + outputValue[2] = valuem*(inputColor1[2]) + value*tmpb; + } + outputValue[3] = inputColor1[3]; +} diff --git a/source/blender/compositor/operations/COM_MixHueOperation.h b/source/blender/compositor/operations/COM_MixHueOperation.h new file mode 100644 index 00000000000..5e46b625385 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixHueOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixHueOperation_h +#define _COM_MixHueOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixHueOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixHueOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixLightenOperation.cpp b/source/blender/compositor/operations/COM_MixLightenOperation.cpp new file mode 100644 index 00000000000..32d28b785b7 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixLightenOperation.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixLightenOperation.h" + +MixLightenOperation::MixLightenOperation(): MixBaseOperation() { +} + +void MixLightenOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float tmp; + tmp=value * inputColor2[0]; + if(tmp > inputColor1[0]) outputValue[0]= tmp; + else outputValue[0] = inputColor1[0]; + tmp=value * inputColor2[1]; + if(tmp > inputColor1[1]) outputValue[1]= tmp; + else outputValue[1] = inputColor1[1]; + tmp=value * inputColor2[2]; + if(tmp > inputColor1[2]) outputValue[2]= tmp; + else outputValue[2] = inputColor1[2]; + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixLightenOperation.h b/source/blender/compositor/operations/COM_MixLightenOperation.h new file mode 100644 index 00000000000..64b1bf9bbc9 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixLightenOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixLightenOperation_h +#define _COM_MixLightenOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixLightenOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixLightenOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp b/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp new file mode 100644 index 00000000000..413b09d7242 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixLinearLightOperation.h" + +MixLinearLightOperation::MixLinearLightOperation(): MixBaseOperation() { +} + +void MixLinearLightOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + if (inputColor2[0] > 0.5f) + outputValue[0] = inputColor1[0] + value*(2.0f*(inputColor2[0]-0.5f)); + else + outputValue[0] = inputColor1[0] + value*(2.0f*(inputColor2[0]) - 1.0f); + if (inputColor2[1] > 0.5f) + outputValue[1] = inputColor1[1] + value*(2.0f*(inputColor2[1]-0.5f)); + else + outputValue[1] = inputColor1[1] + value*(2.0f*(inputColor2[1]) - 1.0f); + if (inputColor2[2] > 0.5f) + outputValue[2] = inputColor1[2] + value*(2.0f*(inputColor2[2]-0.5f)); + else + outputValue[2] = inputColor1[2] + value*(2.0f*(inputColor2[2]) - 1.0f); + + outputValue[3] = inputColor1[3]; +} diff --git a/source/blender/compositor/operations/COM_MixLinearLightOperation.h b/source/blender/compositor/operations/COM_MixLinearLightOperation.h new file mode 100644 index 00000000000..9fb2a433104 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixLinearLightOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixLinearLightOperation_h +#define _COM_MixLinearLightOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixLinearLightOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixLinearLightOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp b/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp new file mode 100644 index 00000000000..82c6c2e9c1f --- /dev/null +++ b/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixMultiplyOperation.h" + +MixMultiplyOperation::MixMultiplyOperation(): MixBaseOperation() { +} + +void MixMultiplyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float inputValue[4]; + + inputValueOperation->read(inputValue, x, y, sampler, inputBuffers); + inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); + inputColor2Operation->read(inputColor2, x, y, sampler, inputBuffers); + + float value = inputValue[0]; + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + outputValue[0] = inputColor1[0] *(valuem+value*inputColor2[0]); + outputValue[1] = inputColor1[1] *(valuem+value*inputColor2[1]); + outputValue[2] = inputColor1[2] *(valuem+value*inputColor2[2]); + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixMultiplyOperation.h b/source/blender/compositor/operations/COM_MixMultiplyOperation.h new file mode 100644 index 00000000000..c35e4bbf64b --- /dev/null +++ b/source/blender/compositor/operations/COM_MixMultiplyOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixMultiplyOperation_h +#define _COM_MixMultiplyOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixMultiplyOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixMultiplyOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixOverlayOperation.cpp b/source/blender/compositor/operations/COM_MixOverlayOperation.cpp new file mode 100644 index 00000000000..8254701adad --- /dev/null +++ b/source/blender/compositor/operations/COM_MixOverlayOperation.cpp @@ -0,0 +1,60 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixOverlayOperation.h" + +MixOverlayOperation::MixOverlayOperation(): MixBaseOperation() { +} + +void MixOverlayOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + + float valuem= 1.0f-value; + + if(inputColor1[0] < 0.5f) { + outputValue[0] = inputColor1[0] * (valuem + 2.0f*value*inputColor2[0]); + } else { + outputValue[0] = 1.0f - (valuem + 2.0f*value*(1.0f - inputColor2[0])) * (1.0f - inputColor1[0]); + } + if(inputColor1[1] < 0.5f) { + outputValue[1] = inputColor1[1] * (valuem + 2.0f*value*inputColor2[1]); + } else { + outputValue[1] = 1.0f - (valuem + 2.0f*value*(1.0f - inputColor2[1])) * (1.0f - inputColor1[1]); + } + if(inputColor1[2] < 0.5f) { + outputValue[2] = inputColor1[2] * (valuem + 2.0f*value*inputColor2[2]); + } else { + outputValue[2] = 1.0f - (valuem + 2.0f*value*(1.0f - inputColor2[2])) * (1.0f - inputColor1[2]); + } + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixOverlayOperation.h b/source/blender/compositor/operations/COM_MixOverlayOperation.h new file mode 100644 index 00000000000..1a0e865b0e8 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixOverlayOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixOverlayOperation_h +#define _COM_MixOverlayOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixOverlayOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixOverlayOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixSaturationOperation.cpp b/source/blender/compositor/operations/COM_MixSaturationOperation.cpp new file mode 100644 index 00000000000..18ff6f46c46 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixSaturationOperation.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixSaturationOperation.h" + +extern "C" { + #include "BLI_math.h" +} + +MixSaturationOperation::MixSaturationOperation(): MixBaseOperation() { +} + +void MixSaturationOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + float rH,rS,rV; + rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); + if(rS!=0.0f){ + float colH,colS,colV; + rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); + hsv_to_rgb(rH , (valuem*rS+value*colS), rV, &outputValue[0], &outputValue[1], &outputValue[2]); + } + outputValue[3] = inputColor1[3]; +} diff --git a/source/blender/compositor/operations/COM_MixSaturationOperation.h b/source/blender/compositor/operations/COM_MixSaturationOperation.h new file mode 100644 index 00000000000..cea2c886a06 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixSaturationOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixSaturationOperation_h +#define _COM_MixSaturationOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixSaturationOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixSaturationOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixScreenOperation.cpp b/source/blender/compositor/operations/COM_MixScreenOperation.cpp new file mode 100644 index 00000000000..25004ca7257 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixScreenOperation.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixScreenOperation.h" + +MixScreenOperation::MixScreenOperation(): MixBaseOperation() { +} + +void MixScreenOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float valuev[4]; + + inputValueOperation->read(valuev, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + float value = valuev[0]; + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + outputValue[0] = 1.0f - (valuem + value*(1.0f-inputColor2[0])) *(1.0f-inputColor1[0]); + outputValue[1] = 1.0f - (valuem + value*(1.0f-inputColor2[1])) *(1.0f-inputColor1[1]); + outputValue[2] = 1.0f - (valuem + value*(1.0f-inputColor2[2])) *(1.0f-inputColor1[2]); + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixScreenOperation.h b/source/blender/compositor/operations/COM_MixScreenOperation.h new file mode 100644 index 00000000000..5fb99c7582f --- /dev/null +++ b/source/blender/compositor/operations/COM_MixScreenOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixScreenOperation_h +#define _COM_MixScreenOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixScreenOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixScreenOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp b/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp new file mode 100644 index 00000000000..3195b3440ec --- /dev/null +++ b/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixSoftLightOperation.h" + +MixSoftLightOperation::MixSoftLightOperation(): MixBaseOperation() { +} + +void MixSoftLightOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem = 1.0f-value; + float scr, scg, scb; + + /* first calculate non-fac based Screen mix */ + scr = 1.0f - (1.0f - inputColor2[0]) * (1.0f - inputColor1[0]); + scg = 1.0f - (1.0f - inputColor2[1]) * (1.0f - inputColor1[1]); + scb = 1.0f - (1.0f - inputColor2[2]) * (1.0f - inputColor1[2]); + + outputValue[0] = valuem*(inputColor1[0]) + value*(((1.0f - inputColor1[0]) * inputColor2[0] * (inputColor1[0])) + (inputColor1[0] * scr)); + outputValue[1] = valuem*(inputColor1[1]) + value*(((1.0f - inputColor1[1]) * inputColor2[1] * (inputColor1[1])) + (inputColor1[1] * scg)); + outputValue[2] = valuem*(inputColor1[2]) + value*(((1.0f - inputColor1[2]) * inputColor2[2] * (inputColor1[2])) + (inputColor1[2] * scb)); + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixSoftLightOperation.h b/source/blender/compositor/operations/COM_MixSoftLightOperation.h new file mode 100644 index 00000000000..1f5e9a24f07 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixSoftLightOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixSoftLightOperation_h +#define _COM_MixSoftLightOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixSoftLightOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixSoftLightOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixSubtractOperation.cpp b/source/blender/compositor/operations/COM_MixSubtractOperation.cpp new file mode 100644 index 00000000000..49792c99c27 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixSubtractOperation.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixSubtractOperation.h" + +MixSubtractOperation::MixSubtractOperation(): MixBaseOperation() { +} + +void MixSubtractOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + outputValue[0] = inputColor1[0]-value*(inputColor2[0]); + outputValue[1] = inputColor1[1]-value*(inputColor2[1]); + outputValue[2] = inputColor1[2]-value*(inputColor2[2]); + outputValue[3] = inputColor1[3]; +} + diff --git a/source/blender/compositor/operations/COM_MixSubtractOperation.h b/source/blender/compositor/operations/COM_MixSubtractOperation.h new file mode 100644 index 00000000000..119d614081f --- /dev/null +++ b/source/blender/compositor/operations/COM_MixSubtractOperation.h @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixSubtractOperation_h +#define _COM_MixSubtractOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixSubtractOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixSubtractOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_MixValueOperation.cpp b/source/blender/compositor/operations/COM_MixValueOperation.cpp new file mode 100644 index 00000000000..93bb7b59b5f --- /dev/null +++ b/source/blender/compositor/operations/COM_MixValueOperation.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MixValueOperation.h" + +extern "C" { + #include "BLI_math.h" +} + +MixValueOperation::MixValueOperation(): MixBaseOperation() { +} + +void MixValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float inputColor1[4]; + float inputColor2[4]; + float value; + + inputValueOperation->read(&value, x, y, sampler, inputBuffers); + inputColor1Operation->read(&inputColor1[0], x, y, sampler, inputBuffers); + inputColor2Operation->read(&inputColor2[0], x, y, sampler, inputBuffers); + + if (this->useValueAlphaMultiply()) { + value *= inputColor2[3]; + } + float valuem= 1.0f-value; + + float rH,rS,rV; + float colH,colS,colV; + rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); + rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); + hsv_to_rgb(rH , rS, (valuem*rV+value*colV), &outputValue[0], &outputValue[1], &outputValue[2]); + outputValue[3] = inputColor1[3]; +} diff --git a/source/blender/compositor/operations/COM_MixValueOperation.h b/source/blender/compositor/operations/COM_MixValueOperation.h new file mode 100644 index 00000000000..ce358ebb506 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixValueOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MixValueOperation_h +#define _COM_MixValueOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MixValueOperation : public MixBaseOperation { +public: + /** + * Default constructor + */ + MixValueOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; +#endif diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp new file mode 100644 index 00000000000..5d0e7e4a4fe --- /dev/null +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MovieClipAttributeOperation.h" +extern "C" { + #include "BKE_tracking.h" +} +MovieClipAttributeOperation::MovieClipAttributeOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_VALUE); + this->valueSet = false; + this->framenumber = 0; + this->attribute = MCA_X; +} + +void MovieClipAttributeOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + if (!valueSet) { + float loc[2], scale, angle; + loc[0] = 0.0f; + loc[1] = 0.0f; + scale = 1.0f; + angle = 0.0f; + if (clip) { + BKE_tracking_stabilization_data(&clip->tracking, framenumber, getWidth(), getHeight(), loc, &scale, &angle); + } + switch (this->attribute) { + case MCA_SCALE: + this->value = scale; + break; + case MCA_ANGLE: + this->value = angle; + break; + case MCA_X: + this->value = loc[0]; + break; + case MCA_Y: + this->value = loc[1]; + break; + } + valueSet = true; + } + outputValue[0] = this->value; +} + +void MovieClipAttributeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + resolution[0] = preferredResolution[0]; + resolution[1] = preferredResolution[1]; +} + diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h new file mode 100644 index 00000000000..960d837dd7e --- /dev/null +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h @@ -0,0 +1,61 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MovieClipAttributeOperation_h +#define _COM_MovieClipAttributeOperation_h +#include "COM_NodeOperation.h" +#include "DNA_movieclip_types.h" + +typedef enum MovieClipAttribute { + MCA_SCALE, + MCA_X, + MCA_Y, + MCA_ANGLE +} MovieClipAttribute; +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class MovieClipAttributeOperation : public NodeOperation { +private: + MovieClip * clip; + float value; + bool valueSet; + int framenumber; + MovieClipAttribute attribute; +public: + /** + * Default constructor + */ + MovieClipAttributeOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + void setMovieClip(MovieClip* clip) {this->clip = clip;} + void setFramenumber(int framenumber) {this->framenumber = framenumber;} + void setAttribute(MovieClipAttribute attribute) {this->attribute = attribute;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.cpp b/source/blender/compositor/operations/COM_MovieClipOperation.cpp new file mode 100644 index 00000000000..74179293c6c --- /dev/null +++ b/source/blender/compositor/operations/COM_MovieClipOperation.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MovieClipOperation.h" + +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "BLI_math.h" +extern "C" { + #include "BKE_movieclip.h" + #include "IMB_imbuf.h" +} +#include "BKE_image.h" + +MovieClipOperation::MovieClipOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_COLOR); + this->movieClip = NULL; + this->movieClipBuffer = NULL; + this->movieClipUser = NULL; + this->movieClipwidth = 0; + this->movieClipheight = 0; + this->framenumber = 0; +} + + +void MovieClipOperation::initExecution() { + if (this->movieClip) { + BKE_movieclip_user_set_frame(this->movieClipUser, this->framenumber); + ImBuf *ibuf; + ibuf= BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); + if (ibuf) { + this->movieClipBuffer = ibuf; + if (ibuf->rect_float == NULL || ibuf->userflags&IB_RECT_INVALID) { + IMB_float_from_rect(ibuf); + ibuf->userflags&= ~IB_RECT_INVALID; + } + } + } +} + +void MovieClipOperation::deinitExecution() { + this->movieClipBuffer = NULL; +} + +void MovieClipOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + ImBuf *ibuf; + if (this->movieClip) { + ibuf= BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); + if (ibuf) { + resolution[0] = ibuf->x; + resolution[1] = ibuf->y; + } + } +} + +void MovieClipOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + if (this->movieClipBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.0f; + } else { + switch (sampler) { + case COM_PS_NEAREST: + neareast_interpolation_color(this->movieClipBuffer, NULL, color, x, y); + break; + case COM_PS_BILINEAR: + bilinear_interpolation_color(this->movieClipBuffer, NULL, color, x, y); + break; + case COM_PS_BICUBIC: + bicubic_interpolation_color(this->movieClipBuffer, NULL, color, x, y); + break; + } + } +} diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.h b/source/blender/compositor/operations/COM_MovieClipOperation.h new file mode 100644 index 00000000000..c861115dee8 --- /dev/null +++ b/source/blender/compositor/operations/COM_MovieClipOperation.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + + +#ifndef _COM_ImageOperation_h +#define _COM_ImageOperation_h + +#include "COM_NodeOperation.h" +#include "DNA_scene_types.h" +#include "DNA_movieclip_types.h" +#include "BLI_listbase.h" +#include "IMB_imbuf_types.h" + +/** + * Base class for all renderlayeroperations + * + * @todo: rename to operation. + */ +class MovieClipOperation : public NodeOperation { +protected: + MovieClip* movieClip; + MovieClipUser* movieClipUser; + ImBuf *movieClipBuffer; + int movieClipheight; + int movieClipwidth; + int framenumber; + + /** + * Determine the output resolution. The resolution is retrieved from the Renderer + */ + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + +public: + MovieClipOperation(); + + void initExecution(); + void deinitExecution(); + void setMovieClip(MovieClip* image) {this->movieClip = image;} + void setMovieClipUser(MovieClipUser* imageuser) {this->movieClipUser = imageuser;} + + void setFramenumber(int framenumber) {this->framenumber = framenumber;} + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp new file mode 100644 index 00000000000..360719aa59f --- /dev/null +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_MovieDistortionOperation.h" + +extern "C" { + #include "BKE_tracking.h" + +#include "BLI_linklist.h" +} + + +vector s_cache; + + +MovieDistortionOperation::MovieDistortionOperation(bool distortion) : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; + this->movieClip = NULL; + this->cache = NULL; + this->distortion = distortion; +} +void MovieDistortionOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + if (this->movieClip) { + for (int i = 0 ; i < s_cache.size() ; i ++) { + DistortionCache* c = (DistortionCache*)s_cache[i]; + if (c->isCacheFor(this->movieClip, this->width, this->height, this->distortion)) { + this->cache = c; + return; + } + } + DistortionCache* newC = new DistortionCache(this->movieClip, this->width, this->height, this->distortion); + s_cache.push_back(newC); + this->cache = newC; + } else { + this->cache = NULL; + } +} + +void MovieDistortionOperation::deinitExecution() { + this->inputOperation = NULL; + this->movieClip = NULL; +} + + +void MovieDistortionOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + + if (this->cache != NULL) { + float u, v; + this->cache->getUV(&this->movieClip->tracking, x, y, &u, &v); + this->inputOperation->read(color, u, v, sampler, inputBuffers); + } + else { + this->inputOperation->read(color, x, y, sampler, inputBuffers); + } +} + +bool MovieDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + newInput.xmax = input->xmax + 100; + newInput.xmin = input->xmin - 100; + newInput.ymax = input->ymax + 100; + newInput.ymin = input->ymin - 100; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.h b/source/blender/compositor/operations/COM_MovieDistortionOperation.h new file mode 100644 index 00000000000..21aa955075d --- /dev/null +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.h @@ -0,0 +1,113 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_MovieDistortionOperation_h_ +#define _COM_MovieDistortionOperation_h_ + +#include "COM_NodeOperation.h" +#include "DNA_movieclip_types.h" +extern "C" { + #include "BKE_tracking.h" +} + +class DistortionCache { +private: + float k1; + float k2; + float k3; + int width; + int height; + bool inverted; + float *buffer; + int *bufferCalculated; +public: + DistortionCache(MovieClip* movieclip, int width, int height, bool inverted) { + this->k1 = movieclip->tracking.camera.k1; + this->k2 = movieclip->tracking.camera.k2; + this->k3 = movieclip->tracking.camera.k3; + this->width = width; + this->height = height; + this->inverted = inverted; + this->bufferCalculated = new int[this->width*this->height]; + this->buffer = new float[this->width*this->height*2]; + for (int i = 0 ; i < this->width*this->height ; i ++) { + this->bufferCalculated[i] = 0; + } + } + bool isCacheFor(MovieClip* movieclip, int width, int height, bool inverted) { + return this->k1 == movieclip->tracking.camera.k1 && + this->k2 == movieclip->tracking.camera.k2 && + this->k3 == movieclip->tracking.camera.k3 && + this->inverted == inverted && + this->width == width && + this->height == height; + } + + void getUV(MovieTracking* trackingData, int x, int y, float *u, float*v) { + if (x<0 || x >= this->width || y <0 || y >= this->height) { + *u = x; + *v = y; + } else { + int offset = y * this->width + x; + int offset2 = offset*2; + if (!bufferCalculated[offset]) { + float in[2]; + float out[2]; + in[0] = x; + in[1] = y; + if (inverted) { + BKE_tracking_invert_intrinsics(trackingData, in, out); + } else { + BKE_tracking_apply_intrinsics(trackingData, in, out); + } + buffer[offset2] = out[0]; + buffer[offset2+1] = out[1]; + bufferCalculated[offset] = 1; + } + *u = buffer[offset2]; + *v = buffer[offset2+1]; + } + } +}; + +class MovieDistortionOperation: public NodeOperation { +private: + DistortionCache *cache; + SocketReader *inputOperation; + MovieClip * movieClip; + +protected: + bool distortion; + +public: + MovieDistortionOperation(bool distortion); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setMovieClip(MovieClip* clip) {this->movieClip = clip;} + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp new file mode 100644 index 00000000000..53b71ed528e --- /dev/null +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp @@ -0,0 +1,96 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#include "COM_MultilayerImageOperation.h" +extern "C" { + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + +MultilayerBaseOperation::MultilayerBaseOperation(int pass): BaseImageOperation() { + this->passId = pass; +} +ImBuf* MultilayerBaseOperation::getImBuf() { + RenderPass *rpass; + rpass = (RenderPass *)BLI_findlink(&this->renderlayer->passes, this->passId); + if(rpass) { + this->imageUser->pass= this->passId; + BKE_image_multilayer_index(image->rr, this->imageUser); + return BaseImageOperation::getImBuf(); + } + return NULL; +} + +void MultilayerColorOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + int yi = y; + int xi = x; + if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.0f; + } else { + if (this->numberOfChannels == 4) { + switch (sampler) { + case COM_PS_NEAREST: + neareast_interpolation_color(this->buffer, NULL, color, x, y); + break; + case COM_PS_BILINEAR: + bilinear_interpolation_color(this->buffer, NULL, color, x, y); + break; + case COM_PS_BICUBIC: + bicubic_interpolation_color(this->buffer, NULL, color, x, y); + break; + } + } else { + int offset = (yi*this->getWidth()+xi)*3; + color[0] = this->imageBuffer[offset]; + color[1] = this->imageBuffer[offset+1]; + color[2] = this->imageBuffer[offset+2]; + } + } +} + +void MultilayerValueOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + int yi = y; + int xi = x; + if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { + color[0] = 0.0f; + } else { + float result = this->imageBuffer[yi*this->getWidth()+xi]; + color[0] = result; + } +} + +void MultilayerVectorOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + int yi = y; + int xi = x; + if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { + color[0] = 0.0f; + } else { + int offset = (yi*this->getWidth()+xi)*3; + color[0] = this->imageBuffer[offset]; + color[1] = this->imageBuffer[offset+1]; + color[2] = this->imageBuffer[offset+2]; + } +} diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.h b/source/blender/compositor/operations/COM_MultilayerImageOperation.h new file mode 100644 index 00000000000..37e8020d56c --- /dev/null +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.h @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + + +#ifndef _COM_MultilayerImageOperation_h +#define _COM_MultilayerImageOperation_h + +#include "COM_ImageOperation.h" + +class MultilayerBaseOperation: public BaseImageOperation { +private: + int passId; + RenderLayer* renderlayer; +protected: + ImBuf* getImBuf(); +public: + /** + * Constructor + */ + MultilayerBaseOperation(int pass); + void setRenderLayer(RenderLayer *renderlayer) {this->renderlayer = renderlayer;} +}; + +class MultilayerColorOperation: public MultilayerBaseOperation { +public: + MultilayerColorOperation(int pass): MultilayerBaseOperation(pass) { + this->addOutputSocket(COM_DT_COLOR); + } + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +class MultilayerValueOperation: public MultilayerBaseOperation { +public: + MultilayerValueOperation(int pass): MultilayerBaseOperation(pass) { + this->addOutputSocket(COM_DT_VALUE); + } + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +class MultilayerVectorOperation: public MultilayerBaseOperation { +public: + MultilayerVectorOperation(int pass): MultilayerBaseOperation(pass) { + this->addOutputSocket(COM_DT_VECTOR); + } + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.cpp b/source/blender/compositor/operations/COM_NormalizeOperation.cpp new file mode 100644 index 00000000000..ade2fde8d07 --- /dev/null +++ b/source/blender/compositor/operations/COM_NormalizeOperation.cpp @@ -0,0 +1,108 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#include "COM_NormalizeOperation.h" + +NormalizeOperation::NormalizeOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->imageReader = NULL; + this->cachedInstance = NULL; + this->setComplex(true); +} +void NormalizeOperation::initExecution() { + this->imageReader = this->getInputSocketReader(0); + NodeOperation::initMutex(); +} + +void NormalizeOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { + /* using generic two floats struct to store x: min y: mult */ + NodeTwoFloats *minmult = (NodeTwoFloats *)data; + + float output[4]; + this->imageReader->read(output, x, y, inputBuffers, NULL); + + color[0] = (output[0] - minmult->x) * minmult->y; +} + +void NormalizeOperation::deinitExecution() { + this->imageReader = NULL; + if (this->cachedInstance) { + delete cachedInstance; + } + NodeOperation::deinitMutex(); +} + +bool NormalizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti imageInput; + + NodeOperation* operation = getInputOperation(0); + imageInput.xmax = operation->getWidth(); + imageInput.xmin = 0; + imageInput.ymax = operation->getHeight(); + imageInput.ymin = 0; + + if (operation->determineDependingAreaOfInterest(&imageInput, readOperation, output) ) { + return true; + } + return false; +} + +/* The code below assumes all data is inside range +- this, and that input buffer is single channel */ +#define BLENDER_ZMAX 10000.0f + +void* NormalizeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + + BLI_mutex_lock(getMutex()); + + if (this->cachedInstance == NULL) { + MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + /* using generic two floats struct to store x: min y: mult */ + NodeTwoFloats *minmult = new NodeTwoFloats(); + + float *buffer = tile->getBuffer(); + int p = tile->getWidth() * tile->getHeight(); + float *bc = buffer; + + float minv = 1.0f+BLENDER_ZMAX; + float maxv = -1.0f-BLENDER_ZMAX; + + float value; + while (p--) { + value=bc[0]; + maxv = max(value, maxv); + minv = min(value, minv); + bc+=4; + } + + minmult->x = minv; + /* The rare case of flat buffer would cause a divide by 0 */ + minmult->y = ((maxv!=minv)? 1.0f/(maxv-minv):0.f); + + this->cachedInstance = minmult; + } + + BLI_mutex_unlock(getMutex()); + return this->cachedInstance; +} + +void NormalizeOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { +} diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.h b/source/blender/compositor/operations/COM_NormalizeOperation.h new file mode 100644 index 00000000000..9475cd3852a --- /dev/null +++ b/source/blender/compositor/operations/COM_NormalizeOperation.h @@ -0,0 +1,69 @@ +/* + * Copyright 2012, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Dalai Felinto + */ + +#ifndef _COM_NormalizeOperation_h +#define _COM_NormalizeOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +/** + * @brief base class of normalize, implementing the simple normalize + * @ingroup operation + */ +class NormalizeOperation : public NodeOperation { +protected: + /** + * @brief Cached reference to the reader + */ + SocketReader * imageReader; + + /** + * @brief temporarily cache of the execution storage + * it stores x->min and y->mult + */ + NodeTwoFloats * cachedInstance; + +public: + NormalizeOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl b/source/blender/compositor/operations/COM_OpenCLKernels.cl new file mode 100644 index 00000000000..d462f5d8250 --- /dev/null +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl @@ -0,0 +1,9 @@ +/// This file contains all opencl kernels for node-operation implementations + +__kernel void testKernel(__global __write_only image2d_t output){ + int x = get_global_id(0); + int y = get_global_id(1); + int2 coords = {x, y}; + float4 color = {0.0f, 1.0f, 0.0f, 1.0f}; + write_imagef(output, coords, color); +} diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp new file mode 100644 index 00000000000..4cf50823c00 --- /dev/null +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp @@ -0,0 +1,14 @@ +/// @todo: this source needs to be generated from COM_OpenCLKernels.cl. +/// not implemented yet. new data to h + +const char* sourcecode = "/// This file contains all opencl kernels for node-operation implementations \n" \ +"\n" \ +"__kernel void testKernel(__global __write_only image2d_t output){\n" \ +" int x = get_global_id(0);\n" \ +" int y = get_global_id(1);\n" \ +" int2 coords = {x, y}; \n" \ +" float4 color = {0.0f, 1.0f, 0.0f, 1.0f};\n" \ +" write_imagef(output, coords, color);\n" \ +"}\n" \ +"\0\n"; + diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp new file mode 100644 index 00000000000..e410dd966c8 --- /dev/null +++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp @@ -0,0 +1,260 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#include "COM_OutputFileOperation.h" +#include "COM_SocketConnection.h" +#include +#include "BLI_listbase.h" +#include "BLI_path_util.h" +#include "BLI_string.h" +#include "DNA_scene_types.h" +#include "BKE_image.h" +#include "BKE_global.h" +#include "BKE_main.h" + +extern "C" { + #include "MEM_guardedalloc.h" + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + +static int get_datatype_size(DataType datatype) +{ + switch (datatype) { + case COM_DT_VALUE: return 1; + case COM_DT_VECTOR: return 3; + case COM_DT_COLOR: return 4; + default: return 0; + } +} + +static float *init_buffer(unsigned int width, unsigned int height, DataType datatype) { + // When initializing the tree during initial load the width and height can be zero. + if (width != 0 && height != 0) { + int size = get_datatype_size(datatype); + return (float *)MEM_callocN(width*height*size*sizeof(float), "OutputFile buffer"); + } + else + return NULL; +} + +static void write_buffer_rect(rcti *rect, MemoryBuffer** memoryBuffers, const bNodeTree *tree, + SocketReader *reader, float* buffer, unsigned int width, DataType datatype) +{ + float color[4]; + int i, size = get_datatype_size(datatype); + + if (!buffer) return; + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int offset = (y1*width + x1 ) * size; + int x; + int y; + bool breaked = false; + + for (y = y1 ; y < y2 && (!breaked); y++) { + for (x = x1 ; x < x2 && (!breaked) ; x++) { + reader->read(color, x, y, COM_PS_NEAREST, memoryBuffers); + + for (i=0; i < size; ++i) + buffer[offset+i] = color[i]; + offset += size; + + if (tree->test_break && tree->test_break(tree->tbh)) + breaked = true; + } + offset += (width-(x2-x1)) * size; + } +} + + +OutputSingleLayerOperation::OutputSingleLayerOperation( + const Scene *scene, const bNodeTree *tree, DataType datatype, ImageFormatData *format, const char *path) +{ + this->scene = scene; + this->tree = tree; + + this->addInputSocket(datatype); + + this->outputBuffer = NULL; + this->datatype = datatype; + this->imageInput = NULL; + + this->format = format; + BLI_strncpy(this->path, path, sizeof(this->path)); +} + +void OutputSingleLayerOperation::initExecution() { + this->imageInput = getInputSocketReader(0); + this->outputBuffer = init_buffer(this->getWidth(), this->getHeight(), this->datatype); +} + +void OutputSingleLayerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { + write_buffer_rect(rect, memoryBuffers, this->tree, imageInput, this->outputBuffer, this->getWidth(), this->datatype); +} + +void OutputSingleLayerOperation::deinitExecution() +{ + if (this->getWidth() * this->getHeight() != 0) { + + int size = get_datatype_size(this->datatype); + ImBuf *ibuf= IMB_allocImBuf(this->getWidth(), this->getHeight(), size*8, 0); + Main *bmain= G.main; /* TODO, have this passed along */ + char filename[FILE_MAX]; + + ibuf->channels = size; + ibuf->rect_float= this->outputBuffer; + ibuf->mall |= IB_rectfloat; + ibuf->dither= scene->r.dither_intensity; + + if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) + ibuf->profile = IB_PROFILE_LINEAR_RGB; + + BKE_makepicstring(filename, this->path, bmain->name, this->scene->r.cfra, this->format->imtype, + (this->scene->r.scemode & R_EXTENSION), true); + + if (0 == BKE_imbuf_write(ibuf, filename, this->format)) + printf("Cannot save Node File Output to %s\n", filename); + else + printf("Saved: %s\n", filename); + + IMB_freeImBuf(ibuf); + } + this->outputBuffer = NULL; + this->imageInput = NULL; +} + + +OutputOpenExrLayer::OutputOpenExrLayer(const char *name, DataType datatype) +{ + BLI_strncpy(this->name, name, sizeof(this->name)); + this->datatype = datatype; + /* these are created in initExecution */ + this->outputBuffer = 0; + this->imageInput = 0; +} + +OutputOpenExrMultiLayerOperation::OutputOpenExrMultiLayerOperation( + const Scene *scene, const bNodeTree *tree, const char *path, char exr_codec) +{ + this->scene = scene; + this->tree = tree; + + BLI_strncpy(this->path, path, sizeof(this->path)); + this->exr_codec = exr_codec; +} + +void OutputOpenExrMultiLayerOperation::add_layer(const char *name, DataType datatype) +{ + this->addInputSocket(datatype); + layers.push_back(OutputOpenExrLayer(name, datatype)); +} + +void OutputOpenExrMultiLayerOperation::initExecution() +{ + for (int i=0; i < layers.size(); ++i) { + layers[i].imageInput = getInputSocketReader(i); + layers[i].outputBuffer = init_buffer(this->getWidth(), this->getHeight(), layers[i].datatype); + } +} + +void OutputOpenExrMultiLayerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) +{ + for (int i=0; i < layers.size(); ++i) { + write_buffer_rect(rect, memoryBuffers, this->tree, layers[i].imageInput, layers[i].outputBuffer, this->getWidth(), layers[i].datatype); + } +} + +void OutputOpenExrMultiLayerOperation::deinitExecution() +{ + unsigned int width = this->getWidth(); + unsigned int height = this->getHeight(); + if (width != 0 && height != 0) { + Main *bmain= G.main; /* TODO, have this passed along */ + char filename[FILE_MAX]; + void *exrhandle= IMB_exr_get_handle(); + + BKE_makepicstring(filename, this->path, bmain->name, this->scene->r.cfra, R_IMF_IMTYPE_MULTILAYER, + (this->scene->r.scemode & R_EXTENSION), true); + BLI_make_existing_file(filename); + + for (int i=0; i < layers.size(); ++i) { + char channelname[EXR_TOT_MAXNAME]; + BLI_strncpy(channelname, layers[i].name, sizeof(channelname)-2); + char *channelname_ext = channelname + strlen(channelname); + + float *buf = layers[i].outputBuffer; + + /* create channels */ + switch (layers[i].datatype) { + case COM_DT_VALUE: + strcpy(channelname_ext, ".V"); + IMB_exr_add_channel(exrhandle, 0, channelname, 1, width, buf); + break; + case COM_DT_VECTOR: + strcpy(channelname_ext, ".X"); + IMB_exr_add_channel(exrhandle, 0, channelname, 3, 3*width, buf); + strcpy(channelname_ext, ".Y"); + IMB_exr_add_channel(exrhandle, 0, channelname, 3, 3*width, buf+1); + strcpy(channelname_ext, ".Z"); + IMB_exr_add_channel(exrhandle, 0, channelname, 3, 3*width, buf+2); + break; + case COM_DT_COLOR: + strcpy(channelname_ext, ".R"); + IMB_exr_add_channel(exrhandle, 0, channelname, 4, 4*width, buf); + strcpy(channelname_ext, ".G"); + IMB_exr_add_channel(exrhandle, 0, channelname, 4, 4*width, buf+1); + strcpy(channelname_ext, ".B"); + IMB_exr_add_channel(exrhandle, 0, channelname, 4, 4*width, buf+2); + strcpy(channelname_ext, ".A"); + IMB_exr_add_channel(exrhandle, 0, channelname, 4, 4*width, buf+3); + break; + default: + break; + } + + } + + /* when the filename has no permissions, this can fail */ + if (IMB_exr_begin_write(exrhandle, filename, width, height, this->exr_codec)) { + IMB_exr_write_channels(exrhandle); + } + else { + /* TODO, get the error from openexr's exception */ + /* XXX nice way to do report? */ + printf("Error Writing Render Result, see console\n"); + } + + IMB_exr_close(exrhandle); + for (int i=0; i < layers.size(); ++i) { + if (layers[i].outputBuffer) { + MEM_freeN(layers[i].outputBuffer); + layers[i].outputBuffer = NULL; + } + + layers[i].imageInput = NULL; + } + } +} diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.h b/source/blender/compositor/operations/COM_OutputFileOperation.h new file mode 100644 index 00000000000..0fbe874e9e0 --- /dev/null +++ b/source/blender/compositor/operations/COM_OutputFileOperation.h @@ -0,0 +1,89 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + * Lukas Tönne + */ + +#ifndef _COM_OutputFileOperation_h +#define _COM_OutputFileOperation_h +#include "COM_NodeOperation.h" +#include "BLI_rect.h" +#include "BKE_utildefines.h" + +#include "intern/openexr/openexr_multi.h" + +/* Writes the image to a single-layer file. */ +class OutputSingleLayerOperation : public NodeOperation { +private: + const Scene *scene; + const bNodeTree* tree; + + ImageFormatData *format; + char path[FILE_MAX]; + + float *outputBuffer; + DataType datatype; + SocketReader* imageInput; + +public: + OutputSingleLayerOperation(const Scene *scene, const bNodeTree *tree, DataType datatype, ImageFormatData *format, const char *path); + + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); + bool isOutputOperation(bool rendering) const {return true;} + void initExecution(); + void deinitExecution(); + const int getRenderPriority() const {return 7;} +}; + +/* extra info for OpenEXR layers */ +struct OutputOpenExrLayer { + OutputOpenExrLayer(const char *name, DataType datatype); + + char name[EXR_TOT_MAXNAME-2]; + float *outputBuffer; + DataType datatype; + SocketReader* imageInput; +}; + +/* Writes inputs into OpenEXR multilayer channels. */ +class OutputOpenExrMultiLayerOperation : public NodeOperation { +private: + typedef std::vector LayerList; + + const Scene *scene; + const bNodeTree* tree; + + char path[FILE_MAX]; + char exr_codec; + LayerList layers; + +public: + OutputOpenExrMultiLayerOperation(const Scene *scene, const bNodeTree *tree, const char *path, char exr_codec); + + void add_layer(const char *name, DataType datatype); + + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); + bool isOutputOperation(bool rendering) const {return true;} + void initExecution(); + void deinitExecution(); + const int getRenderPriority() const {return 7;} +}; + +#endif diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cpp b/source/blender/compositor/operations/COM_PreviewOperation.cpp new file mode 100644 index 00000000000..5191c940f70 --- /dev/null +++ b/source/blender/compositor/operations/COM_PreviewOperation.cpp @@ -0,0 +1,127 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_PreviewOperation.h" +#include "COM_SocketConnection.h" +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "BKE_image.h" +#include "WM_api.h" +#include "WM_types.h" +#include "PIL_time.h" +#include "BLI_utildefines.h" +#include "BLI_math_color.h" +#include "COM_defines.h" +#include "BLI_math.h" +extern "C" { + #include "MEM_guardedalloc.h" + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + + +PreviewOperation::PreviewOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->outputBuffer = NULL; + this->input = NULL; + this->divider = 1.0f; + this->node = NULL; + this->priority = 0; +} + +void PreviewOperation::initExecution() { + this->input = getInputSocketReader(0); + if (!this->node->preview) { + this->node->preview = (bNodePreview*)MEM_callocN(sizeof(bNodePreview), "node preview"); + } else { + if (this->getWidth() == (unsigned int)this->node->preview->xsize && this->getHeight() == (unsigned int)this->node->preview->ysize) { + this->outputBuffer = this->node->preview->rect; + } + } + + if (this->outputBuffer == NULL) { + this->outputBuffer = (unsigned char*)MEM_callocN(sizeof(unsigned char)*4*getWidth()*getHeight(), "PreviewOperation"); + if(this->node->preview->rect) { + MEM_freeN(this->node->preview->rect); + } + this->node->preview->xsize= getWidth(); + this->node->preview->ysize= getHeight(); + this->node->preview->rect= outputBuffer; + } +} + +void PreviewOperation::deinitExecution() { + this->outputBuffer = NULL; + this->input = NULL; +} + +void PreviewOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer **memoryBuffers) { + int offset; + float color[4]; + for (int y = rect->ymin ; y < rect->ymax ; y++) { + offset = (y * getWidth() + rect->xmin)*4; + for (int x = rect->xmin ; x < rect->xmax ; x++) { + float rx = floor(x/divider); + float ry = floor(y/divider); + + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 1.0f; + input->read(color, rx, ry, COM_PS_NEAREST, memoryBuffers); + /// @todo: linear conversion only when scene color management is selected, also check predivide. + linearrgb_to_srgb_v4(color, color); + F4TOCHAR4(color, outputBuffer+offset); + offset +=4; + } + } +} +bool PreviewOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + newInput.xmin = input->xmin/divider; + newInput.xmax = input->xmax/divider; + newInput.ymin = input->ymin/divider; + newInput.ymax = input->ymax/divider; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} +void PreviewOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + NodeOperation::determineResolution(resolution, preferredResolution); + int width = resolution[0]; + int height = resolution[1]; + this->divider = 0.0f; + if (width > height) { + divider = COM_PREVIEW_SIZE / (width-1); + } else { + divider = COM_PREVIEW_SIZE / (height-1); + } + width = width * divider; + height = height * divider; + + resolution[0] = width; + resolution[1] = height; +} + +const int PreviewOperation::getRenderPriority() const { + return this->priority; +} diff --git a/source/blender/compositor/operations/COM_PreviewOperation.h b/source/blender/compositor/operations/COM_PreviewOperation.h new file mode 100644 index 00000000000..c36c85ad746 --- /dev/null +++ b/source/blender/compositor/operations/COM_PreviewOperation.h @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_PreviewOperation_h +#define _COM_PreviewOperation_h +#include "COM_NodeOperation.h" +#include "DNA_image_types.h" +#include "BLI_rect.h" + +class PreviewOperation : public NodeOperation { +protected: + unsigned char *outputBuffer; + + /** + * @brief holds reference to the SDNA bNode, where this nodes will render the preview image for + */ + bNode* node; + const bNodeTree* tree; + SocketReader* input; + float divider; + int priority; + +public: + PreviewOperation(); + bool isOutputOperation(bool rendering) const {return true;} + void initExecution(); + void deinitExecution(); + const int getRenderPriority() const; + + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer **memoryBuffers); + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + void setbNode(bNode* node) { this->node = node;} + void setbNodeTree(const bNodeTree* tree) { this->tree = tree;} + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void setPriority(int priority) { this->priority = priority; } +}; +#endif diff --git a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp new file mode 100644 index 00000000000..adb72f9abb3 --- /dev/null +++ b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ProjectorLensDistortionOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + +ProjectorLensDistortionOperation::ProjectorLensDistortionOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + this->inputProgram = NULL; +} +void ProjectorLensDistortionOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); + kr = 0.25f*MAX2(MIN2(this->dispersion, 1.f), 0.f); + kr2 = kr * 20; +} + +void* ProjectorLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + void* buffer = inputProgram->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void ProjectorLensDistortionOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float inputValue[4]; + const float height = this->getHeight(); + const float width = this->getWidth(); + const float v = (y + 0.5f)/height; + const float u = (x + 0.5f)/width; + MemoryBuffer * inputBuffer = (MemoryBuffer*)data; + inputBuffer->readCubic(inputValue, (u*width + kr2) - 0.5f, v*height - 0.5f); + color[0] = inputValue[0]; + inputBuffer->read(inputValue, x, y); + color[1] = inputValue[1]; + inputBuffer->readCubic(inputValue, (u*width - kr2) - 0.5f, v*height - 0.5f); + color[2] = inputValue[2]; + color[3] = 1.0f; +} + +void ProjectorLensDistortionOperation::deinitExecution() { + this->inputProgram = NULL; +} + +bool ProjectorLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + newInput.ymax = input->ymax; + newInput.ymin = input->ymin; + newInput.xmin = input->xmin-kr2-2; + newInput.xmax = input->xmax+kr2+2; + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h new file mode 100644 index 00000000000..6b05dbfcd41 --- /dev/null +++ b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ProjectorLensDistortionOperation_h +#define _COM_ProjectorLensDistortionOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +class ProjectorLensDistortionOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + + NodeLensDist * data; + + float dispersion; + float kr, kr2; +public: + ProjectorLensDistortionOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeLensDist* data) {this->data = data;} + void setDispertion(float dispersion) {this->dispersion = dispersion;} + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_QualityStepHelper.cpp b/source/blender/compositor/operations/COM_QualityStepHelper.cpp new file mode 100644 index 00000000000..c21163e03ac --- /dev/null +++ b/source/blender/compositor/operations/COM_QualityStepHelper.cpp @@ -0,0 +1,69 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_QualityStepHelper.h" + +QualityStepHelper::QualityStepHelper() { + this->quality = COM_QUALITY_HIGH; + this->step = 1; + this->offsetadd = 4; +} + +void QualityStepHelper::initExecution(QualityHelper helper) { + switch (helper) { + case COM_QH_INCREASE: + switch (this->quality) { + case COM_QUALITY_HIGH: + default: + this->step = 1; + this->offsetadd = 4; + break; + case COM_QUALITY_MEDIUM: + this->step = 2; + this->offsetadd = 8; + break; + case COM_QUALITY_LOW: + this->step = 3; + this->offsetadd = 12; + break; + } + break; + case COM_QH_MULTIPLY: + switch (this->quality) { + case COM_QUALITY_HIGH: + default: + this->step = 1; + this->offsetadd = 4; + break; + case COM_QUALITY_MEDIUM: + this->step = 2; + this->offsetadd = 8; + break; + case COM_QUALITY_LOW: + this->step = 4; + this->offsetadd = 16; + break; + } + break; + } +} + diff --git a/source/blender/compositor/operations/COM_QualityStepHelper.h b/source/blender/compositor/operations/COM_QualityStepHelper.h new file mode 100644 index 00000000000..ff4870f03bd --- /dev/null +++ b/source/blender/compositor/operations/COM_QualityStepHelper.h @@ -0,0 +1,53 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_QualityStepHelper_h +#define _COM_QualityStepHelper_h +#include "COM_defines.h" + +typedef enum QualityHelper { + COM_QH_INCREASE, + COM_QH_MULTIPLY +} QualityHelper; + +class QualityStepHelper { +private: + CompositorQuality quality; + int step; + int offsetadd; + +protected: + /** + * Initialize the execution + */ + void initExecution(QualityHelper helper); + + inline int getStep() const {return this->step;} + inline int getOffsetAdd() const {return this->offsetadd;} + +public: + QualityStepHelper(); + + + void setQuality(CompositorQuality quality) {this->quality = quality;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp new file mode 100644 index 00000000000..483a75a69d2 --- /dev/null +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ReadBufferOperation.h" +#include "COM_WriteBufferOperation.h" +#include "COM_defines.h" + +ReadBufferOperation::ReadBufferOperation():NodeOperation() { + this->addOutputSocket(COM_DT_COLOR); + this->offset = 0; +} + +void* ReadBufferOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + return getInputMemoryBuffer(memoryBuffers); +} + +void ReadBufferOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + if (this->memoryProxy != NULL) { + WriteBufferOperation * operation = memoryProxy->getWriteBufferOperation(); + operation->determineResolution(resolution, preferredResolution); + operation->setResolution(resolution); + + /// @todo: may not occur!, but does with blur node + if (memoryProxy->getExecutor()) memoryProxy->getExecutor()->setResolution(resolution); + } +} +void ReadBufferOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + MemoryBuffer *inputBuffer = inputBuffers[this->offset]; + if (inputBuffer) { + if (sampler == COM_PS_NEAREST) { + inputBuffer->read(color, x, y); + } else { + inputBuffer->readCubic(color, x, y); + } + } +} + +void ReadBufferOperation::executePixel(float *color, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) { + MemoryBuffer *inputBuffer = inputBuffers[this->offset]; + if (inputBuffer) { + inputBuffer->readEWA(color, x, y, dx, dy); + } +} + +bool ReadBufferOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output) { + if (this==readOperation) { + BLI_init_rcti(output, input->xmin, input->xmax, input->ymin, input->ymax); + return true; + } + return false; +} diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.h b/source/blender/compositor/operations/COM_ReadBufferOperation.h new file mode 100644 index 00000000000..807f615f2e1 --- /dev/null +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.h @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ReadBufferOperation_h +#define _COM_ReadBufferOperation_h + +#include "COM_NodeOperation.h" +#include "COM_MemoryProxy.h" + +class ReadBufferOperation: public NodeOperation { +private: + MemoryProxy *memoryProxy; + unsigned int offset; +public: + ReadBufferOperation(); + int isBufferOperation() {return true;} + void setMemoryProxy(MemoryProxy* memoryProxy) {this->memoryProxy = memoryProxy;} + MemoryProxy* getMemoryProxy() {return this->memoryProxy;} + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]); + const bool isReadBufferOperation() const {return true;} + void setOffset(unsigned int offset) {this->offset = offset;} + unsigned int getOffset() {return this->offset;} + bool determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti* output); + MemoryBuffer* getInputMemoryBuffer(MemoryBuffer** memoryBuffers) {return memoryBuffers[offset];} + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp new file mode 100644 index 00000000000..a73f29c3615 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersAOOperation.h" + +RenderLayersAOOperation::RenderLayersAOOperation() :RenderLayersBaseProg(SCE_PASS_AO, 3) { + this->addOutputSocket(COM_DT_COLOR); +} + diff --git a/source/blender/compositor/operations/COM_RenderLayersAOOperation.h b/source/blender/compositor/operations/COM_RenderLayersAOOperation.h new file mode 100644 index 00000000000..71b0b885e81 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersAOOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersAOOperation_h +#define _COM_RenderLayersAOOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersAOOperation : public RenderLayersBaseProg { +public: + RenderLayersAOOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp new file mode 100644 index 00000000000..d85d54489ac --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersAlphaProg.h" + +RenderLayersAlphaProg::RenderLayersAlphaProg() :RenderLayersBaseProg(SCE_PASS_COMBINED, 4) { + this->addOutputSocket(COM_DT_VALUE); +} + +void RenderLayersAlphaProg::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + int ix = x; + int iy = y; + float * inputBuffer = this->getInputBuffer(); + + if (inputBuffer == NULL || ix < 0 || iy < 0 || ix >= (int)this->getWidth() || iy >= (int)this->getHeight() ) { + output[0] = 0.0f; + output[1] = 0.0f; + output[2] = 0.0f; + output[3] = 0.0f; + } else { + unsigned int offset = (iy*this->getWidth()+ix) * 4; + output[0] = inputBuffer[offset+3]; + output[1] = 0.0f; + output[2] = 0.0f; + output[3] = 0.0f; + } +} diff --git a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h new file mode 100644 index 00000000000..6386915230c --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h @@ -0,0 +1,35 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersAlphaProg_h +#define _COM_RenderLayersAlphaProg_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersAlphaProg : public RenderLayersBaseProg { +public: + RenderLayersAlphaProg(); + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp b/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp new file mode 100644 index 00000000000..e63fcd5df4d --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp @@ -0,0 +1,130 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersBaseProg.h" + +#include "BLI_listbase.h" +#include "DNA_scene_types.h" + +extern "C" { + #include "RE_pipeline.h" + #include "RE_shader_ext.h" + #include "RE_render_ext.h" +} + +RenderLayersBaseProg::RenderLayersBaseProg(int renderpass, int elementsize): NodeOperation() { + this->renderpass = renderpass; + this->setScene(NULL); + this->inputBuffer = NULL; + this->elementsize = elementsize; +} + + +void RenderLayersBaseProg::initExecution() { + Scene * scene = this->getScene(); + Render *re= (scene)? RE_GetRender(scene->id.name): NULL; + RenderResult *rr= NULL; + + if(re) + rr= RE_AcquireResultRead(re); + + if(rr) { + SceneRenderLayer *srl= (SceneRenderLayer*)BLI_findlink(&scene->r.layers, getLayerId()); + if(srl) { + + RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); + if(rl && rl->rectf) { + this->inputBuffer = RE_RenderLayerGetPass(rl, renderpass); + + if (this->inputBuffer == NULL || renderpass == SCE_PASS_COMBINED) { + this->inputBuffer = rl->rectf; + } + } + } + } + if (re) { + RE_ReleaseResult(re); + re = NULL; + } +} + +void RenderLayersBaseProg::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + int ix = x; + int iy = y; + + if (inputBuffer == NULL || ix < 0 || iy < 0 || ix >= (int)this->getWidth() || iy >= (int)this->getHeight() ) { + output[0] = 0.0f; + output[1] = 0.0f; + output[2] = 0.0f; + output[3] = 0.0f; + } else { + unsigned int offset = (iy*this->getWidth()+ix) * elementsize; + if (elementsize == 1) { + output[0] = inputBuffer[offset]; + output[1] = 0.0f; + output[2] = 0.0f; + output[3] = 0.0f; + } else if (elementsize == 3){ + output[0] = inputBuffer[offset]; + output[1] = inputBuffer[offset+1]; + output[2] = inputBuffer[offset+2]; + output[3] = 1.0f; + } else { + output[0] = inputBuffer[offset]; + output[1] = inputBuffer[offset+1]; + output[2] = inputBuffer[offset+2]; + output[3] = inputBuffer[offset+3]; + } + } +} + +void RenderLayersBaseProg::deinitExecution() { + this->inputBuffer = NULL; +} + +void RenderLayersBaseProg::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + Scene *sce= this->getScene(); + Render *re= (sce)? RE_GetRender(sce->id.name): NULL; + RenderResult *rr= NULL; + + resolution[0] = 0; + resolution[1] = 0; + + if(re) + rr= RE_AcquireResultRead(re); + + if(rr) { + SceneRenderLayer *srl= (SceneRenderLayer*)BLI_findlink(&sce->r.layers, getLayerId()); + if(srl) { + RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); + if(rl && rl->rectf) { + resolution[0]=rl->rectx; + resolution[1]=rl->recty; + } + } + } + + if(re) + RE_ReleaseResult(re); + +} + diff --git a/source/blender/compositor/operations/COM_RenderLayersBaseProg.h b/source/blender/compositor/operations/COM_RenderLayersBaseProg.h new file mode 100644 index 00000000000..a1802d1db65 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersBaseProg.h @@ -0,0 +1,99 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + + +#ifndef _COM_RenderLayersBaseProg_h +#define _COM_RenderLayersBaseProg_h + +#include "COM_NodeOperation.h" +#include "DNA_scene_types.h" +#include "BLI_listbase.h" +#include "BKE_image.h" +extern "C" { + #include "RE_pipeline.h" + #include "RE_shader_ext.h" + #include "RE_render_ext.h" + #include "MEM_guardedalloc.h" +} + +/** + * Base class for all renderlayeroperations + * + * @todo: rename to operation. + */ +class RenderLayersBaseProg : public NodeOperation { +private: + /** + * Reference to the scene object. + */ + Scene* scene; + + /** + * layerId of the layer where this operation needs to get its data from + */ + short layerId; + + /** + * cached instance to the float buffer inside the layer + */ + float* inputBuffer; + + /** + * renderpass where this operation needs to get its data from + */ + int renderpass; + + int elementsize; + +protected: + /** + * Constructor + */ + RenderLayersBaseProg(int renderpass, int elementsize); + + /** + * Determine the output resolution. The resolution is retrieved from the Renderer + */ + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + /** + * retrieve the reference to the float buffer of the renderer. + */ + inline float* getInputBuffer() {return this->inputBuffer;} + +public: + /** + * setter for the scene field. Will be called from + * @see RenderLayerNode to set the actual scene where + * the data will be retrieved from. + */ + void setScene(Scene* scene) {this->scene = scene;} + Scene* getScene() {return this->scene;} + void setLayerId(short layerId) {this->layerId = layerId;} + short getLayerId() {return this->layerId;} + void initExecution(); + void deinitExecution(); + void executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp new file mode 100644 index 00000000000..71461ac0e3f --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersColorOperation.h" + +RenderLayersColorOperation::RenderLayersColorOperation() :RenderLayersBaseProg(SCE_PASS_RGBA, 4) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersColorOperation.h b/source/blender/compositor/operations/COM_RenderLayersColorOperation.h new file mode 100644 index 00000000000..4f4dfbfb6f3 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersColorOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersColorOperation_h +#define _COM_RenderLayersColorOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersColorOperation : public RenderLayersBaseProg { +public: + RenderLayersColorOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp new file mode 100644 index 00000000000..17e2c6683d9 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersCyclesOperation.h" + +RenderLayersCyclesOperation::RenderLayersCyclesOperation(int pass) :RenderLayersBaseProg(pass, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.h b/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.h new file mode 100644 index 00000000000..baa53c7388b --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersCyclesOperation_h +#define _COM_RenderLayersCyclesOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersCyclesOperation : public RenderLayersBaseProg { +public: + RenderLayersCyclesOperation(int pass); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp b/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp new file mode 100644 index 00000000000..badb9189206 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersDepthProg.h" + +RenderLayersDepthProg::RenderLayersDepthProg() :RenderLayersBaseProg(SCE_PASS_Z, 1) { + this->addOutputSocket(COM_DT_VALUE); +} + diff --git a/source/blender/compositor/operations/COM_RenderLayersDepthProg.h b/source/blender/compositor/operations/COM_RenderLayersDepthProg.h new file mode 100644 index 00000000000..fdbe25c818e --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersDepthProg.h @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersDepthProg_h +#define _COM_RenderLayersDepthProg_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersDepthProg : public RenderLayersBaseProg { +public: + RenderLayersDepthProg(); + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp new file mode 100644 index 00000000000..6c3359ed063 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersDiffuseOperation.h" + +RenderLayersDiffuseOperation::RenderLayersDiffuseOperation() :RenderLayersBaseProg(SCE_PASS_DIFFUSE, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.h b/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.h new file mode 100644 index 00000000000..8c20d6f497d --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersDiffuseOperation_h +#define _COM_RenderLayersDiffuseOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersDiffuseOperation : public RenderLayersBaseProg { +public: + RenderLayersDiffuseOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp new file mode 100644 index 00000000000..936b1f0c59a --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersEmitOperation.h" + +RenderLayersEmitOperation::RenderLayersEmitOperation() :RenderLayersBaseProg(SCE_PASS_EMIT, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersEmitOperation.h b/source/blender/compositor/operations/COM_RenderLayersEmitOperation.h new file mode 100644 index 00000000000..c003cb2f87b --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersEmitOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersEmitOperation_h +#define _COM_RenderLayersEmitOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersEmitOperation : public RenderLayersBaseProg { +public: + RenderLayersEmitOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp new file mode 100644 index 00000000000..642f07d7e16 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersEnvironmentOperation.h" + +RenderLayersEnvironmentOperation::RenderLayersEnvironmentOperation() :RenderLayersBaseProg(SCE_PASS_ENVIRONMENT, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.h b/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.h new file mode 100644 index 00000000000..b9310a1778b --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersEnvironmentOperation_h +#define _COM_RenderLayersEnvironmentOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersEnvironmentOperation : public RenderLayersBaseProg { +public: + RenderLayersEnvironmentOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp b/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp new file mode 100644 index 00000000000..a58f16b10a1 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersImageProg.h" + +RenderLayersColourProg::RenderLayersColourProg() :RenderLayersBaseProg(SCE_PASS_COMBINED, 4) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersImageProg.h b/source/blender/compositor/operations/COM_RenderLayersImageProg.h new file mode 100644 index 00000000000..b6ddac425cb --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersImageProg.h @@ -0,0 +1,34 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersColourProg_h +#define _COM_RenderLayersColourProg_h + +#include "COM_RenderLayersBaseProg.h" + +/// @TODO rename to image operation +class RenderLayersColourProg : public RenderLayersBaseProg { +public: + RenderLayersColourProg(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp new file mode 100644 index 00000000000..db61c237c61 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersIndirectOperation.h" + +RenderLayersIndirectOperation::RenderLayersIndirectOperation() :RenderLayersBaseProg(SCE_PASS_INDIRECT, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.h b/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.h new file mode 100644 index 00000000000..d64207a4355 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersIndirectOperation_h +#define _COM_RenderLayersIndirectOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersIndirectOperation : public RenderLayersBaseProg { +public: + RenderLayersIndirectOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp new file mode 100644 index 00000000000..96bab2569dd --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersMaterialIndexOperation.h" + +RenderLayersMaterialIndexOperation::RenderLayersMaterialIndexOperation() :RenderLayersBaseProg(SCE_PASS_INDEXMA, 1) { + this->addOutputSocket(COM_DT_VALUE); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.h b/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.h new file mode 100644 index 00000000000..d06568f5a10 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersMaterialIndexOperation_h +#define _COM_RenderLayersMaterialIndexOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersMaterialIndexOperation : public RenderLayersBaseProg { +public: + RenderLayersMaterialIndexOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp new file mode 100644 index 00000000000..d3be993b3f9 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersMistOperation.h" + +RenderLayersMistOperation::RenderLayersMistOperation() :RenderLayersBaseProg(SCE_PASS_MIST, 1) { + this->addOutputSocket(COM_DT_VALUE); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersMistOperation.h b/source/blender/compositor/operations/COM_RenderLayersMistOperation.h new file mode 100644 index 00000000000..8c0ee9bfcab --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersMistOperation.h @@ -0,0 +1,11 @@ +#ifndef _COM_RenderLayersMistOperation_h +#define _COM_RenderLayersMistOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersMistOperation : public RenderLayersBaseProg { +public: + RenderLayersMistOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp new file mode 100644 index 00000000000..dba40e3cc7a --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersNormalOperation.h" + +RenderLayersNormalOperation::RenderLayersNormalOperation() :RenderLayersBaseProg(SCE_PASS_NORMAL, 3) { + this->addOutputSocket(COM_DT_VECTOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersNormalOperation.h b/source/blender/compositor/operations/COM_RenderLayersNormalOperation.h new file mode 100644 index 00000000000..39b2040863a --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersNormalOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersNormalOperation_h +#define _COM_RenderLayersNormalOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersNormalOperation : public RenderLayersBaseProg { +public: + RenderLayersNormalOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp new file mode 100644 index 00000000000..d4d14de6d98 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersObjectIndexOperation.h" + +RenderLayersObjectIndexOperation::RenderLayersObjectIndexOperation() :RenderLayersBaseProg(SCE_PASS_INDEXOB, 1) { + this->addOutputSocket(COM_DT_VALUE); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.h b/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.h new file mode 100644 index 00000000000..e8a1602cbfc --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersObjectIndexOperation_h +#define _COM_RenderLayersObjectIndexOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersObjectIndexOperation : public RenderLayersBaseProg { +public: + RenderLayersObjectIndexOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp new file mode 100644 index 00000000000..0417a6fade2 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersReflectionOperation.h" + +RenderLayersReflectionOperation::RenderLayersReflectionOperation() :RenderLayersBaseProg(SCE_PASS_REFLECT, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.h b/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.h new file mode 100644 index 00000000000..3dc7148930b --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersReflectionOperation_h +#define _COM_RenderLayersReflectionOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersReflectionOperation : public RenderLayersBaseProg { +public: + RenderLayersReflectionOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp new file mode 100644 index 00000000000..74042f46f78 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersRefractionOperation.h" + +RenderLayersRefractionOperation::RenderLayersRefractionOperation() :RenderLayersBaseProg(SCE_PASS_REFRACT, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.h b/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.h new file mode 100644 index 00000000000..02ac7aa14f4 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersRefractionOperation_h +#define _COM_RenderLayersRefractionOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersRefractionOperation : public RenderLayersBaseProg { +public: + RenderLayersRefractionOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp new file mode 100644 index 00000000000..87155607d82 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersShadowOperation.h" + +RenderLayersShadowOperation::RenderLayersShadowOperation() :RenderLayersBaseProg(SCE_PASS_SHADOW, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersShadowOperation.h b/source/blender/compositor/operations/COM_RenderLayersShadowOperation.h new file mode 100644 index 00000000000..af35915c2ee --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersShadowOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersShadowOperation_h +#define _COM_RenderLayersShadowOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersShadowOperation : public RenderLayersBaseProg { +public: + RenderLayersShadowOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp new file mode 100644 index 00000000000..ed6a0853436 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersSpecularOperation.h" + +RenderLayersSpecularOperation::RenderLayersSpecularOperation() :RenderLayersBaseProg(SCE_PASS_SPEC, 3) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.h b/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.h new file mode 100644 index 00000000000..fc7d77976a3 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersSpecularOperation_h +#define _COM_RenderLayersSpecularOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersSpecularOperation : public RenderLayersBaseProg { +public: + RenderLayersSpecularOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp new file mode 100644 index 00000000000..0a76d04959e --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersSpeedOperation.h" + +RenderLayersSpeedOperation::RenderLayersSpeedOperation() :RenderLayersBaseProg(SCE_PASS_VECTOR, 4) { + this->addOutputSocket(COM_DT_COLOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.h b/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.h new file mode 100644 index 00000000000..d341aa43950 --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersSpeedOperation_h +#define _COM_RenderLayersSpeedOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersSpeedOperation : public RenderLayersBaseProg { +public: + RenderLayersSpeedOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp new file mode 100644 index 00000000000..b15bbb0f3dd --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RenderLayersUVOperation.h" + +RenderLayersUVOperation::RenderLayersUVOperation() :RenderLayersBaseProg(SCE_PASS_UV, 3) { + this->addOutputSocket(COM_DT_VECTOR); +} diff --git a/source/blender/compositor/operations/COM_RenderLayersUVOperation.h b/source/blender/compositor/operations/COM_RenderLayersUVOperation.h new file mode 100644 index 00000000000..3068372a66c --- /dev/null +++ b/source/blender/compositor/operations/COM_RenderLayersUVOperation.h @@ -0,0 +1,33 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RenderLayersUVOperation_h +#define _COM_RenderLayersUVOperation_h + +#include "COM_RenderLayersBaseProg.h" + +class RenderLayersUVOperation : public RenderLayersBaseProg { +public: + RenderLayersUVOperation(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_RotateOperation.cpp b/source/blender/compositor/operations/COM_RotateOperation.cpp new file mode 100644 index 00000000000..ef6c5bee90a --- /dev/null +++ b/source/blender/compositor/operations/COM_RotateOperation.cpp @@ -0,0 +1,93 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_RotateOperation.h" +#include "BLI_math.h" + +RotateOperation::RotateOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->imageSocket = NULL; + this->degreeSocket = NULL; + this->doDegree2RadConversion = false; +} +void RotateOperation::initExecution() { + this->imageSocket = this->getInputSocketReader(0); + this->degreeSocket = this->getInputSocketReader(1); + this->centerX = this->getWidth()/2.0; + this->centerY = this->getHeight()/2.0; + float degree[4]; + this->degreeSocket->read(degree, 0, 0, COM_PS_NEAREST, NULL); + double rad; + if (this->doDegree2RadConversion) { + rad = DEG2RAD(degree[0]); + } else { + rad = degree[0]; + } + this->cosine = cos(rad); + this->sine = sin(rad); +} + +void RotateOperation::deinitExecution() { + this->imageSocket = NULL; + this->degreeSocket = NULL; +} + + +void RotateOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + const float dy = y - this->centerY; + const float dx = x - this->centerX; + const float nx = this->centerX+(this->cosine*dx + this->sine*dy); + const float ny = this->centerY+(-this->sine*dx + this->cosine*dy); + this->imageSocket->read(color, nx, ny, sampler, inputBuffers); +} + +bool RotateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + const float dxmin = input->xmin - this->centerX; + const float dymin = input->ymin - this->centerY; + const float dxmax = input->xmax - this->centerX; + const float dymax = input->ymax - this->centerY; + + const float x1 = this->centerX+(this->cosine*dxmin + this->sine*dymin); + const float x2 = this->centerX+(this->cosine*dxmax + this->sine*dymin); + const float x3 = this->centerX+(this->cosine*dxmin + this->sine*dymax); + const float x4 = this->centerX+(this->cosine*dxmax + this->sine*dymax); + const float y1 = this->centerY+(-this->sine*dxmin + this->cosine*dymin); + const float y2 = this->centerY+(-this->sine*dxmax + this->cosine*dymin); + const float y3 = this->centerY+(-this->sine*dxmin + this->cosine*dymax); + const float y4 = this->centerY+(-this->sine*dxmax + this->cosine*dymax); + const float minx = min(x1, min(x2, min(x3, x4))); + const float maxx = max(x1, max(x2, max(x3, x4))); + const float miny = min(y1, min(y2, min(y3, y4))); + const float maxy = max(y1, max(y2, max(y3, y4))); + + newInput.xmax = ceil(maxx)+1; + newInput.xmin = floor(minx)-1; + newInput.ymax = ceil(maxy)+1; + newInput.ymin = floor(miny)-1; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_RotateOperation.h b/source/blender/compositor/operations/COM_RotateOperation.h new file mode 100644 index 00000000000..9965d1021da --- /dev/null +++ b/source/blender/compositor/operations/COM_RotateOperation.h @@ -0,0 +1,46 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_RotateOperation_h_ +#define _COM_RotateOperation_h_ + +#include "COM_NodeOperation.h" + +class RotateOperation: public NodeOperation { +private: + SocketReader *imageSocket; + SocketReader *degreeSocket; + float centerX; + float centerY; + float cosine; + float sine; + bool doDegree2RadConversion; +public: + RotateOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void initExecution(); + void deinitExecution(); + void setDoDegree2RadConversion(bool abool) {this->doDegree2RadConversion = abool;} +}; + +#endif diff --git a/source/blender/compositor/operations/COM_ScaleOperation.cpp b/source/blender/compositor/operations/COM_ScaleOperation.cpp new file mode 100644 index 00000000000..ef3d8250bab --- /dev/null +++ b/source/blender/compositor/operations/COM_ScaleOperation.cpp @@ -0,0 +1,196 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ScaleOperation.h" + +ScaleOperation::ScaleOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; + this->inputXOperation = NULL; + this->inputYOperation = NULL; +} +void ScaleOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + this->inputXOperation = this->getInputSocketReader(1); + this->inputYOperation = this->getInputSocketReader(2); + this->centerX = this->getWidth()/2.0; + this->centerY = this->getHeight()/2.0; +} + +void ScaleOperation::deinitExecution() { + this->inputOperation = NULL; + this->inputXOperation = NULL; + this->inputYOperation = NULL; +} + + +void ScaleOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float scaleX[4]; + float scaleY[4]; + + this->inputXOperation->read(scaleX, x, y, sampler, inputBuffers); + this->inputYOperation->read(scaleY, x, y, sampler, inputBuffers); + + const float scx = scaleX[0]; + const float scy = scaleY[0]; + + float nx = this->centerX+ (x - this->centerX) / scx; + float ny = this->centerY+ (y - this->centerY) / scy; + this->inputOperation->read(color, nx, ny, sampler, inputBuffers); +} + +bool ScaleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + float scaleX[4]; + float scaleY[4]; + + this->inputXOperation->read(scaleX, 0, 0, COM_PS_NEAREST, NULL); + this->inputYOperation->read(scaleY, 0, 0, COM_PS_NEAREST, NULL); + + const float scx = scaleX[0]; + const float scy = scaleY[0]; + + newInput.xmax = this->centerX+ (input->xmax - this->centerX) / scx; + newInput.xmin = this->centerX+ (input->xmin - this->centerX) / scx; + newInput.ymax = this->centerY+ (input->ymax - this->centerY) / scy; + newInput.ymin = this->centerY+ (input->ymin - this->centerY) / scy; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} + + +// SCALE ABSOLUTE +ScaleAbsoluteOperation::ScaleAbsoluteOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; + this->inputXOperation= NULL; + this->inputYOperation = NULL; +} +void ScaleAbsoluteOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + this->inputXOperation = this->getInputSocketReader(1); + this->inputYOperation = this->getInputSocketReader(2); + this->centerX = this->getWidth()/2.0; + this->centerY = this->getHeight()/2.0; +} + +void ScaleAbsoluteOperation::deinitExecution() { + this->inputOperation = NULL; + this->inputXOperation = NULL; + this->inputYOperation = NULL; +} + + +void ScaleAbsoluteOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float scaleX[4]; + float scaleY[4]; + + this->inputXOperation->read(scaleX, x, y, sampler, inputBuffers); + this->inputYOperation->read(scaleY, x, y, sampler, inputBuffers); + + const float scx = scaleX[0]; // target absolute scale + const float scy = scaleY[0]; // target absolute scale + const float width = this->getWidth(); + const float height = this->getHeight(); + //div + float relativeXScale = scx/width; + float relativeYScale = scy/height; + + float nx = this->centerX+ (x - this->centerX) / relativeXScale; + float ny = this->centerY+ (y - this->centerY) / relativeYScale; + this->inputOperation->read(color, nx, ny, sampler, inputBuffers); +} + +bool ScaleAbsoluteOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + float scaleX[4]; + float scaleY[4]; + + this->inputXOperation->read(scaleX, 0, 0, COM_PS_NEAREST, NULL); + this->inputYOperation->read(scaleY, 0, 0, COM_PS_NEAREST, NULL); + + const float scx = scaleX[0]; + const float scy = scaleY[0]; + const float width = this->getWidth(); + const float height = this->getHeight(); + //div + float relateveXScale = scx/width; + float relateveYScale = scy/height; + + newInput.xmax = this->centerX+ (input->xmax - this->centerX) / relateveXScale; + newInput.xmin = this->centerX+ (input->xmin - this->centerX) / relateveXScale; + newInput.ymax = this->centerY+ (input->ymax - this->centerY) / relateveYScale; + newInput.ymin = this->centerY+ (input->ymin - this->centerY) / relateveYScale; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} + + +// Absolute fixed siez +ScaleFixedSizeOperation::ScaleFixedSizeOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; +} +void ScaleFixedSizeOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + this->relX = inputOperation->getWidth() / (float)this->newWidth; + this->relY = inputOperation->getHeight() / (float)this->newHeight; +} + +void ScaleFixedSizeOperation::deinitExecution() { + this->inputOperation = NULL; +} + + +void ScaleFixedSizeOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + this->inputOperation->read(color, x*relX, y*relY, sampler, inputBuffers); +} + +bool ScaleFixedSizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + newInput.xmax = input->xmax *relX; + newInput.xmin = input->xmin *relX; + newInput.ymax = input->ymax *relY; + newInput.ymin = input->ymin *relY; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} + +void ScaleFixedSizeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + unsigned int nr[2]; + nr[0] = newWidth; + nr[1] = newHeight; + NodeOperation::determineResolution(resolution, nr); + resolution[0] = newWidth; + resolution[1] = newHeight; +} diff --git a/source/blender/compositor/operations/COM_ScaleOperation.h b/source/blender/compositor/operations/COM_ScaleOperation.h new file mode 100644 index 00000000000..3e075249fa1 --- /dev/null +++ b/source/blender/compositor/operations/COM_ScaleOperation.h @@ -0,0 +1,77 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ScaleOperation_h_ +#define _COM_ScaleOperation_h_ + +#include "COM_NodeOperation.h" + +class ScaleOperation: public NodeOperation { +private: + SocketReader *inputOperation; + SocketReader *inputXOperation; + SocketReader *inputYOperation; + float centerX; + float centerY; +public: + ScaleOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); +}; + +class ScaleAbsoluteOperation: public NodeOperation { + SocketReader *inputOperation; + SocketReader *inputXOperation; + SocketReader *inputYOperation; + float centerX; + float centerY; +public: + ScaleAbsoluteOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); +}; + +class ScaleFixedSizeOperation: public NodeOperation { + SocketReader *inputOperation; + int newWidth; + int newHeight; + float relX; + float relY; +public: + ScaleFixedSizeOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + void setNewWidth(int width) {this->newWidth = width;} + void setNewHeight(int height) {this->newHeight = height;} +}; + +#endif diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp new file mode 100644 index 00000000000..4a4ac6c6833 --- /dev/null +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp @@ -0,0 +1,164 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ScreenLensDistortionOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" +extern "C" { + #include "BLI_rand.h" +} + +ScreenLensDistortionOperation::ScreenLensDistortionOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + this->inputProgram = NULL; +} +void ScreenLensDistortionOperation::initExecution() { + this->inputProgram = this->getInputSocketReader(0); + kg = MAX2(MIN2(this->distortion, 1.f), -0.999f); + // smaller dispersion range for somewhat more control + const float d = 0.25f*MAX2(MIN2(this->dispersion, 1.f), 0.f); + kr = MAX2(MIN2((kg+d), 1.f), -0.999f); + kb = MAX2(MIN2((kg-d), 1.f), -0.999f); + maxk = MAX3(kr, kg, kb); + sc = (this->data->fit && (maxk > 0.f)) ? (1.f/(1.f + 2.f*maxk)) : (1.f/(1.f + maxk)); + drg = 4.f*(kg - kr); + dgb = 4.f*(kb - kg); + + kr4 = kr*4; + kg4 = kg*4.f; + kb4 *= kb*4.f; + cx = 0.5f*(float)getWidth(); + cy = 0.5f*(float)getHeight(); + +} + +void* ScreenLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + void* buffer = inputProgram->initializeTileData(NULL, memoryBuffers); + return buffer; +} + +void ScreenLensDistortionOperation::executePixel(float* outputColor, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + const float height = this->getHeight(); + const float width = this->getWidth(); + MemoryBuffer* buffer = (MemoryBuffer*)data; + + int dr = 0, dg = 0, db = 0; + float d, t, ln[6] = {0, 0, 0, 0, 0, 0}; + float tc[4] = {0, 0, 0, 0}; + const float v = sc*((y + 0.5f) - cy)/cy; + const float u = sc*((x + 0.5f) - cx)/cx; + int sta = 0, mid = 0, end = 0; + + if ((t = 1.f - kr4*(u*u + v*v)) >= 0.f) { + d = 1.f/(1.f + sqrtf(t)); + ln[0] = (u*d + 0.5f)*width - 0.5f, ln[1] = (v*d + 0.5f)*height - 0.5f; + sta = 1; + } + if ((t = 1.f - kg4*(u*u + v*v)) >= 0.f) { + d = 1.f/(1.f + sqrtf(t)); + ln[2] = (u*d + 0.5f)*width - 0.5f, ln[3] = (v*d + 0.5f)*height - 0.5f; + mid = 1; + } + if ((t = 1.f - kb4*(u*u + v*v)) >= 0.f) { + d = 1.f/(1.f + sqrtf(t)); + ln[4] = (u*d + 0.5f)*width - 0.5f, ln[5] = (v*d + 0.5f)*height - 0.5f; + end = 1; + } + + if (sta && mid && end) { + float jit = this->data->jit; + float z; + float color[4]; + { + // RG + const int dx = ln[2] - ln[0], dy = ln[3] - ln[1]; + const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; + const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); + const float sd = 1.f/(float)ds; + + for (z=0; zreadCubic(color, nx, ny); + tc[0] += (1.f-tz)*color[0], tc[1] += tz*color[1]; + dr++, dg++; + } + } + { + // GB + const int dx = ln[4] - ln[2], dy = ln[5] - ln[3]; + const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; + const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); + const float sd = 1.f/(float)ds; + + for (z=0; zreadCubic(color, nx, ny); + tc[1] += (1.f-tz)*color[1], tc[2] += tz*color[2]; + dg++, db++; + } + + } + if (dr) outputColor[0] = 2.f*tc[0] / (float)dr; + if (dg) outputColor[1] = 2.f*tc[1] / (float)dg; + if (db) outputColor[2] = 2.f*tc[2] / (float)db; + + /* set alpha */ + outputColor[3]= 1.0f; + } else { + outputColor[0]= 0.0f; + outputColor[1]= 0.0f; + outputColor[2]= 0.0f; + outputColor[3]= 0.0f; + } +} + +void ScreenLensDistortionOperation::deinitExecution() { + this->inputProgram = NULL; +} + +void ScreenLensDistortionOperation::determineUV(float result[2], float x, float y) const { + const float v = sc*((y + 0.5f) - cy)/cy; + const float u = sc*((x + 0.5f) - cx)/cx; + const float t = ABS(MIN3(kr, kg, kb)*4); + float d = 1.f/(1.f + sqrtf(t)); + result[0] = (u*d + 0.5f)*getWidth() - 0.5f; + result[1] = (v*d + 0.5f)*getHeight() - 0.5f; +} + +bool ScreenLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + newInput.xmin = 0; + newInput.ymin = 0; + newInput.ymax = inputProgram->getHeight(); + newInput.xmax = inputProgram->getWidth(); + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h new file mode 100644 index 00000000000..65262cfd3dd --- /dev/null +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h @@ -0,0 +1,74 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ScreenLensDistortionOperation_h +#define _COM_ScreenLensDistortionOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +class ScreenLensDistortionOperation : public NodeOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader* inputProgram; + + NodeLensDist * data; + + float dispersion; + float distortion; + float kr, kg, kb; + float kr4, kg4, kb4; + float maxk; + float drg; + float dgb; + float sc, cx, cy; +public: + ScreenLensDistortionOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeLensDist* data) {this->data = data;} + void setDispertion(float dispersion) {this->dispersion = dispersion;} + void setDistortion(float distortion) {this->distortion = distortion;} + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + +private: + void determineUV(float* result, float x, float y) const; + +}; +#endif diff --git a/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp b/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp new file mode 100644 index 00000000000..4e0ad1580cd --- /dev/null +++ b/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SeparateChannelOperation.h" + +SeparateChannelOperation::SeparateChannelOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_VALUE); + this->inputOperation = NULL; +} +void SeparateChannelOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void SeparateChannelOperation::deinitExecution() { + this->inputOperation = NULL; +} + + +void SeparateChannelOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float input[4]; + this->inputOperation->read(input, x, y, sampler, inputBuffers); + color[0] = input[this->channel]; +} diff --git a/source/blender/compositor/operations/COM_SeparateChannelOperation.h b/source/blender/compositor/operations/COM_SeparateChannelOperation.h new file mode 100644 index 00000000000..3c1eed4bdd9 --- /dev/null +++ b/source/blender/compositor/operations/COM_SeparateChannelOperation.h @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SeparateChannelOperation_h_ +#define _COM_SeparateChannelOperation_h_ + +#include "COM_NodeOperation.h" + +class SeparateChannelOperation: public NodeOperation { +private: + SocketReader *inputOperation; + int channel; +public: + SeparateChannelOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + void setChannel(int channel) {this->channel = channel;} +}; + +#endif diff --git a/source/blender/compositor/operations/COM_SetAlphaOperation.cpp b/source/blender/compositor/operations/COM_SetAlphaOperation.cpp new file mode 100644 index 00000000000..b6545912a80 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetAlphaOperation.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SetAlphaOperation.h" + +SetAlphaOperation::SetAlphaOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + + this->inputColor = NULL; + this->inputAlpha = NULL; +} + +void SetAlphaOperation::initExecution() { + this->inputColor = getInputSocketReader(0); + this->inputAlpha = getInputSocketReader(1); +} + +void SetAlphaOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float alphaInput[4]; + + this->inputColor->read(outputValue, x, y, sampler, inputBuffers); + this->inputAlpha->read(alphaInput, x, y, sampler, inputBuffers); + + outputValue[3] = alphaInput[0]; +} + +void SetAlphaOperation::deinitExecution() { + this->inputColor = NULL; + this->inputAlpha = NULL; +} diff --git a/source/blender/compositor/operations/COM_SetAlphaOperation.h b/source/blender/compositor/operations/COM_SetAlphaOperation.h new file mode 100644 index 00000000000..2cb42bf8cf3 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetAlphaOperation.h @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SetAlphaOperation_h +#define _COM_SetAlphaOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class SetAlphaOperation : public NodeOperation { +private: + SocketReader *inputColor; + SocketReader *inputAlpha; + +public: + /** + * Default constructor + */ + SetAlphaOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_SetColorOperation.cpp b/source/blender/compositor/operations/COM_SetColorOperation.cpp new file mode 100644 index 00000000000..729a8073d7a --- /dev/null +++ b/source/blender/compositor/operations/COM_SetColorOperation.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SetColorOperation.h" + +SetColorOperation::SetColorOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_COLOR); +} + +void SetColorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + outputValue[0] = this->channel1; + outputValue[1] = this->channel2; + outputValue[2] = this->channel3; + outputValue[3] = this->channel4; +} + +void SetColorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + resolution[0] = preferredResolution[0]; + resolution[1] = preferredResolution[1]; +} diff --git a/source/blender/compositor/operations/COM_SetColorOperation.h b/source/blender/compositor/operations/COM_SetColorOperation.h new file mode 100644 index 00000000000..13d4bc21392 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetColorOperation.h @@ -0,0 +1,64 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SetColorOperation_h +#define _COM_SetColorOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class SetColorOperation : public NodeOperation { +private: + float channel1; + float channel2; + float channel3; + float channel4; + +public: + /** + * Default constructor + */ + SetColorOperation(); + + const float getChannel1() {return this->channel1;} + void setChannel1(float value) {this->channel1 = value;} + const float getChannel2() {return this->channel2;} + void setChannel2(float value) {this->channel2 = value;} + const float getChannel3() {return this->channel3;} + void setChannel3(float value) {this->channel3 = value;} + const float getChannel4() {return this->channel4;} + void setChannel4(float value) {this->channel4 = value;} + void setChannels(float value[4]) {this->channel1 = value[0];this->channel2 = value[1];this->channel3 = value[2];this->channel4 = value[3];} + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + const bool isSetOperation() const {return true;} + +}; +#endif diff --git a/source/blender/compositor/operations/COM_SetSamplerOperation.cpp b/source/blender/compositor/operations/COM_SetSamplerOperation.cpp new file mode 100644 index 00000000000..d5fda4a8827 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetSamplerOperation.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SetSamplerOperation.h" + +SetSamplerOperation::SetSamplerOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); +} + +void SetSamplerOperation::initExecution() { + this->reader = this->getInputSocketReader(0); +} +void SetSamplerOperation::deinitExecution() { + this->reader = NULL; +} + +void SetSamplerOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + reader->read(output, x, y, this->sampler, inputBuffers); +} diff --git a/source/blender/compositor/operations/COM_SetSamplerOperation.h b/source/blender/compositor/operations/COM_SetSamplerOperation.h new file mode 100644 index 00000000000..f7b850fcfe9 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetSamplerOperation.h @@ -0,0 +1,51 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SetSamplerOperation_h +#define _COM_SetSamplerOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output Sampler. + * it assumes we are in sRGB colour space. + */ +class SetSamplerOperation : public NodeOperation { +private: + PixelSampler sampler; + SocketReader *reader; +public: + /** + * Default constructor + */ + SetSamplerOperation(); + + void setSampler(PixelSampler sampler) {this->sampler = sampler;} + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void initExecution(); + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_SetValueOperation.cpp b/source/blender/compositor/operations/COM_SetValueOperation.cpp new file mode 100644 index 00000000000..a8a681a6659 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetValueOperation.cpp @@ -0,0 +1,36 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SetValueOperation.h" + +SetValueOperation::SetValueOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_VALUE); +} + +void SetValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + outputValue[0] = this->value; +} + +void SetValueOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + resolution[0] = preferredResolution[0]; + resolution[1] = preferredResolution[1]; +} diff --git a/source/blender/compositor/operations/COM_SetValueOperation.h b/source/blender/compositor/operations/COM_SetValueOperation.h new file mode 100644 index 00000000000..30a8de16dc4 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetValueOperation.h @@ -0,0 +1,54 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SetValueOperation_h +#define _COM_SetValueOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class SetValueOperation : public NodeOperation { +private: + float value; + +public: + /** + * Default constructor + */ + SetValueOperation(); + + const float getValue() {return this->value;} + void setValue(float value) {this->value = value;} + + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + const bool isSetOperation() const {return true;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.cpp b/source/blender/compositor/operations/COM_SetVectorOperation.cpp new file mode 100644 index 00000000000..b9c8f4bc369 --- /dev/null +++ b/source/blender/compositor/operations/COM_SetVectorOperation.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SetVectorOperation.h" +#include "COM_defines.h" + +SetVectorOperation::SetVectorOperation(): NodeOperation() { + this->addOutputSocket(COM_DT_VECTOR); +} + +void SetVectorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + outputValue[0] = this->x; + outputValue[1] = this->y; + outputValue[2] = this->z; + outputValue[3] = this->w; +} + +void SetVectorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + if (preferredResolution[0] == 0 ||preferredResolution[1]==0) { + resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; + resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; + } else { + resolution[0] = preferredResolution[0]; + resolution[1] = preferredResolution[1]; + } +} diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.h b/source/blender/compositor/operations/COM_SetVectorOperation.h new file mode 100644 index 00000000000..c1f3c679b5b --- /dev/null +++ b/source/blender/compositor/operations/COM_SetVectorOperation.h @@ -0,0 +1,68 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SetVectorOperation_h +#define _COM_SetVectorOperation_h +#include "COM_NodeOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class SetVectorOperation : public NodeOperation { +private: + float x; + float y; + float z; + float w; + +public: + /** + * Default constructor + */ + SetVectorOperation(); + + const float getX() {return this->x;} + void setX(float value) {this->x = value;} + const float getY() {return this->y;} + void setY(float value) {this->y = value;} + const float getZ() {return this->z;} + void setZ(float value) {this->z = value;} + const float getW() {return this->w;} + void setW(float value) {this->w = value;} + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + const bool isSetOperation() const {return true;} + + void setVector(float vector[3]) { + setX(vector[0]); + setY(vector[1]); + setZ(vector[2]); + } +}; +#endif diff --git a/source/blender/compositor/operations/COM_SocketProxyOperation.cpp b/source/blender/compositor/operations/COM_SocketProxyOperation.cpp new file mode 100644 index 00000000000..161bdb3e295 --- /dev/null +++ b/source/blender/compositor/operations/COM_SocketProxyOperation.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SocketProxyOperation.h" + +SocketProxyOperation::SocketProxyOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR/*|COM_DT_VECTOR|COM_DT_VALUE*/); + this->addOutputSocket(COM_DT_COLOR); + this->inputOperation = NULL; +} + +void SocketProxyOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); +} + +void SocketProxyOperation::deinitExecution() { + this->inputOperation = NULL; +} + +void SocketProxyOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + this->inputOperation->read(color, x, y, sampler, inputBuffers); +} diff --git a/source/blender/compositor/operations/COM_SocketProxyOperation.h b/source/blender/compositor/operations/COM_SocketProxyOperation.h new file mode 100644 index 00000000000..a86134c1ea9 --- /dev/null +++ b/source/blender/compositor/operations/COM_SocketProxyOperation.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SocketProxyOperation_h_ +#define _COM_SocketProxyOperation_h_ + +#include "COM_NodeOperation.h" + +class SocketProxyOperation: public NodeOperation { +private: + SocketReader *inputOperation; +public: + SocketProxyOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_SplitViewerOperation.cpp b/source/blender/compositor/operations/COM_SplitViewerOperation.cpp new file mode 100644 index 00000000000..f9000cc63da --- /dev/null +++ b/source/blender/compositor/operations/COM_SplitViewerOperation.cpp @@ -0,0 +1,102 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_SplitViewerOperation.h" +#include "COM_SocketConnection.h" +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "BKE_image.h" +#include "BLI_utildefines.h" +#include "BLI_math_color.h" +#include "BLI_math_vector.h" + +extern "C" { + #include "MEM_guardedalloc.h" + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + + +SplitViewerOperation::SplitViewerOperation() : ViewerBaseOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR); + this->image1Input = NULL; + this->image2Input = NULL; +} + +void SplitViewerOperation::initExecution() { + // When initializing the tree during initial load the width and height can be zero. + this->image1Input = getInputSocketReader(0); + this->image2Input = getInputSocketReader(1); + ViewerBaseOperation::initExecution(); +} + +void SplitViewerOperation::deinitExecution() { + this->image1Input = NULL; + this->image2Input = NULL; + ViewerBaseOperation::deinitExecution(); +} + + +void SplitViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { + float* buffer = this->outputBuffer; + unsigned char* bufferDisplay = this->outputBufferDisplay; + + if (!buffer) return; + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int offset = (y1*this->getWidth() + x1 ) * 4; + int x; + int y; + int perc = xSplit?this->splitPercentage*getWidth()/100.0f:this->splitPercentage*getHeight()/100.0f; + for (y = y1 ; y < y2 ; y++) { + for (x = x1 ; x < x2 ; x++) { + bool image1; + float srgb[4]; + image1 = xSplit?x>perc:y>perc; + if (image1) { + image1Input->read(&(buffer[offset]), x, y, COM_PS_NEAREST, memoryBuffers); + } else { + image2Input->read(&(buffer[offset]), x, y, COM_PS_NEAREST, memoryBuffers); + } + /// @todo: linear conversion only when scene color management is selected, also check predivide. + if (this->doColorManagement) { + if(this->doColorPredivide) { + linearrgb_to_srgb_predivide_v4(srgb, buffer+offset); + } else { + linearrgb_to_srgb_v4(srgb, buffer+offset); + } + } else { + copy_v4_v4(srgb, buffer+offset); + } + + F4TOCHAR4(srgb, bufferDisplay+offset); + + offset +=4; + } + offset += (this->getWidth()-(x2-x1))*4; + } + updateImage(rect); +} + diff --git a/source/blender/compositor/operations/COM_SplitViewerOperation.h b/source/blender/compositor/operations/COM_SplitViewerOperation.h new file mode 100644 index 00000000000..61e4b027cec --- /dev/null +++ b/source/blender/compositor/operations/COM_SplitViewerOperation.h @@ -0,0 +1,44 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_SplitViewerOperation_h +#define _COM_SplitViewerOperation_h +#include "COM_ViewerBaseOperation.h" +#include "DNA_image_types.h" +#include "BLI_rect.h" + +class SplitViewerOperation : public ViewerBaseOperation { +private: + SocketReader* image1Input; + SocketReader* image2Input; + + float splitPercentage; + bool xSplit; +public: + SplitViewerOperation(); + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); + void initExecution(); + void deinitExecution(); + void setSplitPercentage(float splitPercentage) {this->splitPercentage = splitPercentage;} + void setXSplit(bool xsplit) {this->xSplit = xsplit;} +}; +#endif diff --git a/source/blender/compositor/operations/COM_TextureOperation.cpp b/source/blender/compositor/operations/COM_TextureOperation.cpp new file mode 100644 index 00000000000..1ca986f8893 --- /dev/null +++ b/source/blender/compositor/operations/COM_TextureOperation.cpp @@ -0,0 +1,100 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TextureOperation.h" + +#include "BLI_listbase.h" +#include "DNA_scene_types.h" + +TextureBaseOperation::TextureBaseOperation(): NodeOperation() { + this->addInputSocket(COM_DT_VECTOR);//offset + this->addInputSocket(COM_DT_VECTOR);//size + this->texture = NULL; + this->inputSize = NULL; + this->inputOffset = NULL; +} +TextureOperation::TextureOperation() : TextureBaseOperation() { + this->addOutputSocket(COM_DT_COLOR); +} +TextureAlphaOperation::TextureAlphaOperation() : TextureBaseOperation() { + this->addOutputSocket(COM_DT_VALUE); +} + +void TextureBaseOperation::initExecution() { + this->inputOffset = getInputSocketReader(0); + this->inputSize = getInputSocketReader(1); +} +void TextureBaseOperation::deinitExecution() { + this->inputSize = NULL; + this->inputOffset = NULL; +} + +void TextureBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { + if (preferredResolution[0] == 0 || preferredResolution[1] == 0) { + resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; + resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; + } else { + resolution[0] = preferredResolution[0]; + resolution[1] = preferredResolution[1]; + } +} + +void TextureAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + TextureBaseOperation::executePixel(color, x, y, sampler, inputBuffers); + color[0] = color[3]; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.0f; +} + +void TextureBaseOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; + float textureSize[4]; + float textureOffset[4]; + float vec[3]; + int retval; + const float cx = this->getWidth()/2; + const float cy = this->getHeight()/2; + const float u = (cx-x)/this->getWidth()*2; + const float v = (cy-y)/this->getHeight()*2; + + this->inputSize->read(textureSize, x, y, sampler, inputBuffers); + this->inputOffset->read(textureOffset, x, y, sampler, inputBuffers); + + vec[0]= textureSize[0]*(u + textureOffset[0]); + vec[1]= textureSize[1]*(v + textureOffset[1]); + vec[2]= textureSize[2]*textureOffset[2]; + + retval= multitex_ext(this->texture, vec, NULL, NULL, 0, &texres); + + if(texres.talpha) + color[3]= texres.ta; + else + color[3]= texres.tin; + + if((retval & TEX_RGB)) { + color[0]= texres.tr; + color[1]= texres.tg; + color[2]= texres.tb; + } + else color[0]= color[1]= color[2]= color[3]; +} diff --git a/source/blender/compositor/operations/COM_TextureOperation.h b/source/blender/compositor/operations/COM_TextureOperation.h new file mode 100644 index 00000000000..a545a5eea97 --- /dev/null +++ b/source/blender/compositor/operations/COM_TextureOperation.h @@ -0,0 +1,81 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + + +#ifndef _COM_TextureOperation_h +#define _COM_TextureOperation_h + +#include "COM_NodeOperation.h" +#include "DNA_scene_types.h" +#include "DNA_texture_types.h" +#include "BLI_listbase.h" +extern "C" { + #include "RE_pipeline.h" + #include "RE_shader_ext.h" + #include "RE_render_ext.h" + #include "MEM_guardedalloc.h" +} + +/** + * Base class for all renderlayeroperations + * + * @todo: rename to operation. + */ +class TextureBaseOperation : public NodeOperation { +private: + Tex* texture; + SocketReader *inputSize; + SocketReader *inputOffset; + +protected: + + /** + * Determine the output resolution. The resolution is retrieved from the Renderer + */ + void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); + + /** + * Constructor + */ + TextureBaseOperation(); + +public: + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void setTexture(Tex* texture) {this->texture = texture;} + void initExecution(); + void deinitExecution(); +}; + +class TextureOperation:public TextureBaseOperation { +public: + TextureOperation(); + +}; +class TextureAlphaOperation:public TextureBaseOperation { +public: + TextureAlphaOperation(); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + +}; + +#endif diff --git a/source/blender/compositor/operations/COM_TonemapOperation.cpp b/source/blender/compositor/operations/COM_TonemapOperation.cpp new file mode 100644 index 00000000000..84e893d0b2e --- /dev/null +++ b/source/blender/compositor/operations/COM_TonemapOperation.cpp @@ -0,0 +1,163 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TonemapOperation.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + + + +TonemapOperation::TonemapOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->addOutputSocket(COM_DT_COLOR); + this->imageReader = NULL; + this->data = NULL; + this->cachedInstance = NULL; + this->setComplex(true); +} +void TonemapOperation::initExecution() { + this->imageReader = this->getInputSocketReader(0); + NodeOperation::initMutex(); +} + +void TonemapOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { + AvgLogLum * avg = (AvgLogLum*)data; + + float output[4]; + this->imageReader->read(output, x, y, inputBuffers, NULL); + output[0] *= avg->al; + output[1] *= avg->al; + output[2] *= avg->al; + float dr = output[0] + this->data->offset; + float dg = output[1] + this->data->offset; + float db = output[2] + this->data->offset; + output[0] /= ((dr == 0.f) ? 1.f : dr); + output[1] /= ((dg == 0.f) ? 1.f : dg); + output[2] /= ((db == 0.f) ? 1.f : db); + const float igm = avg->igm; + if (igm != 0.f) { + output[0] = pow((double)MAX2(output[0], 0.), (double)igm); + output[1] = pow((double)MAX2(output[1], 0.), (double)igm); + output[2] = pow((double)MAX2(output[2], 0.), (double)igm); + } + + color[0] = output[0]; + color[1] = output[1]; + color[2] = output[2]; + color[3] = output[3]; +} +void PhotoreceptorTonemapOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { + AvgLogLum * avg = (AvgLogLum*)data; + NodeTonemap *ntm = this->data; + + const float f = exp((double)-this->data->f); + const float m = (ntm->m > 0.f) ? ntm->m : (0.3f + 0.7f*pow((double)avg->auto_key, 1.4)); + const float ic = 1.f - ntm->c, ia = 1.f - ntm->a; + + float output[4]; + this->imageReader->read(output, x, y, inputBuffers, NULL); + + const float L = 0.212671f*output[0] + 0.71516f*output[1] + 0.072169f*output[2]; + float I_l = output[0] + ic*(L - output[0]); + float I_g = avg->cav[0] + ic*(avg->lav - avg->cav[0]); + float I_a = I_l + ia*(I_g - I_l); + output[0] /= (output[0] + pow((double)f*I_a, (double)m)); + I_l = output[1] + ic*(L - output[1]); + I_g = avg->cav[1] + ic*(avg->lav - avg->cav[1]); + I_a = I_l + ia*(I_g - I_l); + output[1] /= (output[1] + pow((double)f*I_a,(double)m)); + I_l = output[2] + ic*(L - output[2]); + I_g = avg->cav[2] + ic*(avg->lav - avg->cav[2]); + I_a = I_l + ia*(I_g - I_l); + output[2] /= (output[2] + pow((double)f*I_a, (double)m)); + + color[0] = output[0]; + color[1] = output[1]; + color[2] = output[2]; + color[3] = output[3]; +} + +void TonemapOperation::deinitExecution() { + this->imageReader = NULL; + if (this->cachedInstance) { + delete cachedInstance; + } + NodeOperation::deinitMutex(); +} + +bool TonemapOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti imageInput; + + NodeOperation* operation = getInputOperation(0); + imageInput.xmax = operation->getWidth(); + imageInput.xmin = 0; + imageInput.ymax = operation->getHeight(); + imageInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&imageInput, readOperation, output) ) { + return true; + } + return false; +} + +void* TonemapOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + BLI_mutex_lock(getMutex()); + if (this->cachedInstance == NULL) { + MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + AvgLogLum *data = new AvgLogLum(); + + float * buffer = tile->getBuffer(); + + float lsum = 0; + int p = tile->getWidth() * tile->getHeight(); + float* bc = buffer; + float avl, maxl = -1e10f, minl = 1e10f; + const float sc = 1.f/(p); + float Lav = 0.f; + float cav[4] = {0.0f,0.0f,0.0f,0.0f}; + while (p--) { + float L = 0.212671f*bc[0] + 0.71516f*bc[1] + 0.072169f*bc[2]; + Lav += L; + cav[0] += bc[0]; + cav[1] += bc[1]; + cav[2] += bc[2]; + lsum += (float)log((double)MAX2(L, 0.0) + 1e-5); + maxl = (L > maxl) ? L : maxl; + minl = (L < minl) ? L : minl; + bc+=4; + } + data->lav = Lav * sc; + data->cav[0] = cav[0]*sc; + data->cav[1] = cav[1]*sc; + data->cav[2] = cav[2]*sc; + maxl = log((double)maxl + 1e-5); minl = log((double)minl + 1e-5f); avl = lsum*sc; + data->auto_key = (maxl > minl) ? ((maxl - avl) / (maxl - minl)) : 1.f; + float al = exp((double)avl); + data->al = (al == 0.f) ? 0.f : (this->data->key / al); + data->igm = (this->data->gamma==0.f) ? 1 : (1.f / this->data->gamma); + this->cachedInstance = data; + } + BLI_mutex_unlock(getMutex()); + return this->cachedInstance; +} + +void TonemapOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { +} diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h new file mode 100644 index 00000000000..c895fdcba77 --- /dev/null +++ b/source/blender/compositor/operations/COM_TonemapOperation.h @@ -0,0 +1,103 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_TonemapOperation_h +#define _COM_TonemapOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" + +/** + * @brief temporarily storage during execution of Tonemap + * @ingroup operation + */ +typedef struct AvgLogLum { + float al; + float auto_key; + float lav; + float cav[4]; + float igm; +} AvgLogLum; + +/** + * @brief base class of tonemap, implementing the simple tonemap + * @ingroup operation + */ +class TonemapOperation : public NodeOperation { +protected: + /** + * @brief Cached reference to the reader + */ + SocketReader * imageReader; + + /** + * @brief settings of the Tonemap + */ + NodeTonemap * data; + + /** + * @brief temporarily cache of the execution storage + */ + AvgLogLum * cachedInstance; + +public: + TonemapOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + + /** + * Initialize the execution + */ + void initExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setData(NodeTonemap* data) {this->data = data;} + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + +}; + +/** + * @brief class of tonemap, implementing the photoreceptor tonemap + * most parts have already been done in TonemapOperation + * @ingroup operation + */ + +class PhotoreceptorTonemapOperation : public TonemapOperation { +public: + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); +}; + +#endif diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp new file mode 100644 index 00000000000..48774833e14 --- /dev/null +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_TranslateOperation.h" + +TranslateOperation::TranslateOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setResolutionInputSocketIndex(0); + this->inputOperation = NULL; + this->inputXOperation = NULL; + this->inputYOperation = NULL; +} +void TranslateOperation::initExecution() { + this->inputOperation = this->getInputSocketReader(0); + this->inputXOperation = this->getInputSocketReader(1); + this->inputYOperation = this->getInputSocketReader(2); + + float tempDelta[4]; + this->inputXOperation->read(tempDelta, 0, 0, COM_PS_NEAREST, NULL); + this->deltaX = tempDelta[0]; + this->inputYOperation->read(tempDelta, 0, 0, COM_PS_NEAREST, NULL); + this->deltaY = tempDelta[0]; +} + +void TranslateOperation::deinitExecution() { + this->inputOperation = NULL; + this->inputXOperation = NULL; + this->inputYOperation = NULL; +} + + +void TranslateOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + this->inputOperation->read(color, x-this->getDeltaX(), y-this->getDeltaY(), sampler, inputBuffers); +} + +bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + + newInput.xmax = input->xmax - this->getDeltaX(); + newInput.xmin = input->xmin - this->getDeltaX(); + newInput.ymax = input->ymax - this->getDeltaY(); + newInput.ymin = input->ymin - this->getDeltaY(); + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} diff --git a/source/blender/compositor/operations/COM_TranslateOperation.h b/source/blender/compositor/operations/COM_TranslateOperation.h new file mode 100644 index 00000000000..eab3391041e --- /dev/null +++ b/source/blender/compositor/operations/COM_TranslateOperation.h @@ -0,0 +1,47 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_TranslateOperation_h_ +#define _COM_TranslateOperation_h_ + +#include "COM_NodeOperation.h" + +class TranslateOperation: public NodeOperation { +private: + SocketReader *inputOperation; + SocketReader*inputXOperation; + SocketReader*inputYOperation; + float deltaX; + float deltaY; +public: + TranslateOperation(); + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + void initExecution(); + void deinitExecution(); + + float getDeltaX() {return this->deltaX;} + float getDeltaY() {return this->deltaY;} +}; + +#endif diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp new file mode 100644 index 00000000000..e97b1155e22 --- /dev/null +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp @@ -0,0 +1,142 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_VariableSizeBokehBlurOperation.h" +#include "BLI_math.h" + +extern "C" { + #include "RE_pipeline.h" +} + +VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() : NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); // do not resize the bokeh image. + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + this->setComplex(true); + + this->inputProgram = NULL; + this->inputBokehProgram = NULL; + this->inputSizeProgram = NULL; + this->maxBlur = 32.0f; + this->threshold = 0.0f; +} + + +void VariableSizeBokehBlurOperation::initExecution() { + this->inputProgram = getInputSocketReader(0); + this->inputBokehProgram = getInputSocketReader(1); + this->inputSizeProgram = getInputSocketReader(2); + QualityStepHelper::initExecution(COM_QH_INCREASE); +} + +void VariableSizeBokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float tempColor[4]; + float readColor[4]; + float bokeh[4]; + tempColor[0] = 0; + tempColor[1] = 0; + tempColor[2] = 0; + tempColor[3] = 0; + float tempSize[4]; + float overallmultiplyerr = 0; + float overallmultiplyerg = 0; + float overallmultiplyerb = 0; + + int miny = y - maxBlur; + int maxy = y + maxBlur; + int minx = x - maxBlur; + int maxx = x + maxBlur; + { + inputProgram->read(readColor, x, y, COM_PS_NEAREST, inputBuffers); + tempColor[0] += readColor[0]; + tempColor[1] += readColor[1]; + tempColor[2] += readColor[2]; + overallmultiplyerr += 1; + overallmultiplyerg += 1; + overallmultiplyerb += 1; + + for (int ny = miny ; ny < maxy ; ny += QualityStepHelper::getStep()) { + for (int nx = minx ; nx < maxx ; nx += QualityStepHelper::getStep()) { + if (nx >=0 && nx < this->getWidth() && ny >= 0 && ny < getHeight()) { + inputSizeProgram->read(tempSize, nx, ny, COM_PS_NEAREST, inputBuffers); + float size = tempSize[0]; + size += this->threshold; + float dx = nx - x; + float dy = ny - y; + if (nx == x && ny == y) { + } else if (size>= fabs(dx) && size >= fabs(dy)) { + float u = 256+ dx*256/size; + float v = 256+ dy*256/size; + inputBokehProgram->read(bokeh, u, v, COM_PS_NEAREST, inputBuffers); + inputProgram->read(readColor, nx, ny, COM_PS_NEAREST, inputBuffers); + tempColor[0] += bokeh[0] * readColor[0]; + tempColor[1] += bokeh[1] * readColor[1]; + tempColor[2] += bokeh[2]* readColor[2]; + overallmultiplyerr += bokeh[0]; + overallmultiplyerg += bokeh[1]; + overallmultiplyerb += bokeh[2]; + } + } + } + } + color[0] = tempColor[0]*(1.0/overallmultiplyerr); + color[1] = tempColor[1]*(1.0/overallmultiplyerg); + color[2] = tempColor[2]*(1.0/overallmultiplyerb); + color[3] = 1.0f; + } + +} + +void VariableSizeBokehBlurOperation::deinitExecution() { + this->inputProgram = NULL; + this->inputBokehProgram = NULL; + this->inputSizeProgram = NULL; +} + +bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + rcti newInput; + rcti bokehInput; + + newInput.xmax = input->xmax + maxBlur+2; + newInput.xmin = input->xmin - maxBlur+2; + newInput.ymax = input->ymax + maxBlur-2; + newInput.ymin = input->ymin - maxBlur-2; + bokehInput.xmax = 512; + bokehInput.xmin = 0; + bokehInput.ymax = 512; + bokehInput.ymin = 0; + + NodeOperation* operation = getInputOperation(2); + if (operation->determineDependingAreaOfInterest(&newInput, readOperation, output) ) { + return true; + } + operation = getInputOperation(1); + if (operation->determineDependingAreaOfInterest(&bokehInput, readOperation, output) ) { + return true; + } + operation = getInputOperation(0); + if (operation->determineDependingAreaOfInterest(&newInput, readOperation, output) ) { + return true; + } + return false; +} diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h new file mode 100644 index 00000000000..6c3159a8092 --- /dev/null +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h @@ -0,0 +1,62 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_BokehVariableSizeBokehBlurOperation_h +#define _COM_VariableSizeBokehBlurOperation_h +#include "COM_NodeOperation.h" +#include "COM_QualityStepHelper.h" + +class VariableSizeBokehBlurOperation : public NodeOperation, public QualityStepHelper { +private: + int maxBlur; + float threshold; + SocketReader* inputProgram; + SocketReader* inputBokehProgram; + SocketReader* inputSizeProgram; + +public: + VariableSizeBokehBlurOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); + + void setMaxBlur(int maxRadius) {this->maxBlur = maxRadius;} + + void setThreshold(float threshold) {this->threshold = threshold;} + + +}; +#endif diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp new file mode 100644 index 00000000000..7d660177fbb --- /dev/null +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp @@ -0,0 +1,113 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_VectorBlurOperation.h" +#include "BLI_math.h" + +// use the implementation of blender internal renderer to calculate the vector blur. +extern "C" { + #include "RE_pipeline.h" +} + +VectorBlurOperation::VectorBlurOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); // ZBUF + this->addInputSocket(COM_DT_COLOR); //SPEED + this->addOutputSocket(COM_DT_COLOR); + this->settings = NULL; + this->cachedInstance = NULL; + this->inputImageProgram = NULL; + this->inputSpeedProgram = NULL; + this->inputZProgram = NULL; + setComplex(true); +} +void VectorBlurOperation::initExecution() { + initMutex(); + this->inputImageProgram = getInputSocketReader(0); + this->inputZProgram = getInputSocketReader(1); + this->inputSpeedProgram = getInputSocketReader(2); + this->cachedInstance = NULL; + QualityStepHelper::initExecution(COM_QH_INCREASE); + +} + +void VectorBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { + float* buffer = (float*) data; + int index = (y*this->getWidth() + x) * COM_NUMBER_OF_CHANNELS; + color[0] = buffer[index]; + color[1] = buffer[index+1]; + color[2] = buffer[index+2]; + color[3] = buffer[index+3]; +} + +void VectorBlurOperation::deinitExecution() { + deinitMutex(); + this->inputImageProgram = NULL; + this->inputSpeedProgram = NULL; + this->inputZProgram = NULL; + if (this->cachedInstance) { + delete cachedInstance; + this->cachedInstance = NULL; + } +} +void* VectorBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { + if (this->cachedInstance) return this->cachedInstance; + + BLI_mutex_lock(getMutex()); + if (this->cachedInstance == NULL) { + MemoryBuffer* tile = (MemoryBuffer*)inputImageProgram->initializeTileData(rect, memoryBuffers); + MemoryBuffer* speed= (MemoryBuffer*)inputSpeedProgram->initializeTileData(rect, memoryBuffers); + MemoryBuffer* z = (MemoryBuffer*)inputZProgram->initializeTileData(rect, memoryBuffers); + float* data = new float[this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS]; + memcpy(data, tile->getBuffer(),this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS*sizeof(float)); + this->generateVectorBlur(data, tile, speed, z); + this->cachedInstance = data; + } + BLI_mutex_unlock(getMutex()); + return this->cachedInstance; +} + +bool VectorBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { + if (this->cachedInstance == NULL) { + rcti newInput; + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } else { + return false; + } +} + +void VectorBlurOperation::generateVectorBlur(float* data, MemoryBuffer* inputImage, MemoryBuffer* inputSpeed, MemoryBuffer* inputZ) { + float *zbuf = inputZ->convertToValueBuffer(); + NodeBlurData blurdata; + blurdata.samples = this->settings->samples/QualityStepHelper::getStep(); + blurdata.maxspeed = this->settings->maxspeed; + blurdata.minspeed = this->settings->minspeed; + blurdata.curved = this->settings->curved; + blurdata.fac = this->settings->fac; + RE_zbuf_accumulate_vecblur(&blurdata, this->getWidth(), this->getHeight(), data, inputImage->getBuffer(), inputSpeed->getBuffer(), zbuf); + delete zbuf; + return; +} diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.h b/source/blender/compositor/operations/COM_VectorBlurOperation.h new file mode 100644 index 00000000000..e3275f1bc15 --- /dev/null +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.h @@ -0,0 +1,73 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_VectorBlurOperation_h +#define _COM_VectorBlurOperation_h +#include "COM_NodeOperation.h" +#include "DNA_node_types.h" +#include "COM_QualityStepHelper.h" + +class VectorBlurOperation : public NodeOperation, public QualityStepHelper { +private: + /** + * @brief Cached reference to the inputProgram + */ + SocketReader * inputImageProgram; + SocketReader * inputSpeedProgram; + SocketReader * inputZProgram; + + /** + * @brief settings of the glare node. + */ + NodeBlurData * settings; + + float* cachedInstance; + +public: + VectorBlurOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + + void setVectorBlurSettings(NodeBlurData * settings) {this->settings = settings;} + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +protected: + + void generateVectorBlur(float* data, MemoryBuffer* inputImage, MemoryBuffer* inputSpeed, MemoryBuffer* inputZ); + + +}; +#endif diff --git a/source/blender/compositor/operations/COM_VectorCurveOperation.cpp b/source/blender/compositor/operations/COM_VectorCurveOperation.cpp new file mode 100644 index 00000000000..697d082c33e --- /dev/null +++ b/source/blender/compositor/operations/COM_VectorCurveOperation.cpp @@ -0,0 +1,56 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_VectorCurveOperation.h" + +#ifdef __cplusplus +extern "C" { +#endif + #include "BKE_colortools.h" +#ifdef __cplusplus +} +#endif + +VectorCurveOperation::VectorCurveOperation(): CurveBaseOperation() { + this->addInputSocket(COM_DT_VECTOR); + this->addOutputSocket(COM_DT_VECTOR); + + this->inputProgram = NULL; +} +void VectorCurveOperation::initExecution() { + CurveBaseOperation::initExecution(); + this->inputProgram = this->getInputSocketReader(0); +} + +void VectorCurveOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float input[4]; + + + this->inputProgram->read(input, x, y, sampler, inputBuffers); + + curvemapping_evaluate_premulRGBF(this->curveMapping, output, input); + output[3]= input[3]; +} + +void VectorCurveOperation::deinitExecution() { + this->inputProgram = NULL; +} diff --git a/source/blender/compositor/operations/COM_VectorCurveOperation.h b/source/blender/compositor/operations/COM_VectorCurveOperation.h new file mode 100644 index 00000000000..d3097345ae5 --- /dev/null +++ b/source/blender/compositor/operations/COM_VectorCurveOperation.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_VectorCurveOperation_h +#define _COM_VectorCurveOperation_h +#include "COM_NodeOperation.h" +#include "COM_CurveBaseOperation.h" + +class VectorCurveOperation : public CurveBaseOperation { +private: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; +public: + VectorCurveOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float* Vector, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + + /** + * Initialize the execution + */ + void initExecution(); + + /** + * Deinitialize the execution + */ + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp new file mode 100644 index 00000000000..16143af7165 --- /dev/null +++ b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp @@ -0,0 +1,92 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ViewerBaseOperation.h" +#include "COM_SocketConnection.h" +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "BKE_image.h" +#include "WM_api.h" +#include "WM_types.h" +#include "PIL_time.h" +#include "BLI_utildefines.h" +#include "BLI_math_color.h" + +extern "C" { + #include "MEM_guardedalloc.h" + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + + +ViewerBaseOperation::ViewerBaseOperation() : NodeOperation() { + this->setImage(NULL); + this->setImageUser(NULL); + this->outputBuffer = NULL; + this->outputBufferDisplay = NULL; + this->active = false; + this->doColorManagement = true; +} + +void ViewerBaseOperation::initExecution() { + // When initializing the tree during initial load the width and height can be zero. + initImage(); +} + +void ViewerBaseOperation::initImage() { + Image* anImage = this->image; + ImBuf *ibuf= BKE_image_acquire_ibuf(anImage, this->imageUser, &this->lock); + + if (!ibuf) return; + if (ibuf->x != (int)getWidth() || ibuf->y != (int)getHeight()) { + imb_freerectImBuf(ibuf); + imb_freerectfloatImBuf(ibuf); + IMB_freezbuffloatImBuf(ibuf); + ibuf->x= getWidth(); + ibuf->y= getHeight(); + imb_addrectImBuf(ibuf); + imb_addrectfloatImBuf(ibuf); + anImage->ok= IMA_OK_LOADED; + } + + /* now we combine the input with ibuf */ + this->outputBuffer = ibuf->rect_float; + this->outputBufferDisplay = (unsigned char*)ibuf->rect; + + BKE_image_release_ibuf(this->image, this->lock); +} +void ViewerBaseOperation:: updateImage(rcti *rect) { + /// @todo: introduce new event to update smaller area + WM_main_add_notifier(NC_WINDOW|ND_DRAW, NULL); +} + +void ViewerBaseOperation::deinitExecution() { + this->outputBuffer = NULL; +} + +const int ViewerBaseOperation::getRenderPriority() const { + if (this->isActiveViewerOutput()) { + return 8; + } else { + return 0; + } +} diff --git a/source/blender/compositor/operations/COM_ViewerBaseOperation.h b/source/blender/compositor/operations/COM_ViewerBaseOperation.h new file mode 100644 index 00000000000..e94d2644e36 --- /dev/null +++ b/source/blender/compositor/operations/COM_ViewerBaseOperation.h @@ -0,0 +1,71 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ViewerBaseOperation_h +#define _COM_ViewerBaseOperation_h +#include "COM_NodeOperation.h" +#include "DNA_image_types.h" +#include "BLI_rect.h" + +class ViewerBaseOperation : public NodeOperation { +protected: + float *outputBuffer; + unsigned char *outputBufferDisplay; + Image * image; + ImageUser * imageUser; + void *lock; + bool active; + const bNodeTree* tree; + float centerX; + float centerY; + OrderOfChunks chunkOrder; + bool doColorManagement; + bool doColorPredivide; + +public: + bool isOutputOperation(bool rendering) const {return true;} + void initExecution(); + void deinitExecution(); + void setImage(Image* image) {this->image = image;} + void setImageUser(ImageUser* imageUser) {this->imageUser = imageUser;} + const bool isActiveViewerOutput() const {return active;} + void setActive(bool active) {this->active = active;} + void setbNodeTree(const bNodeTree* tree) {this->tree = tree;} + void setCenterX(float centerX) {this->centerX = centerX;} + void setCenterY(float centerY) {this->centerY = centerY;} + void setChunkOrder(OrderOfChunks tileOrder) {this->chunkOrder = tileOrder;} + float getCenterX() { return this->centerX; } + float getCenterY() { return this->centerY; } + OrderOfChunks getChunkOrder() { return this->chunkOrder; } + const int getRenderPriority() const; + void setColorManagement(bool doColorManagement) {this->doColorManagement = doColorManagement;} + void setColorPredivide(bool doColorPredivide) {this->doColorPredivide = doColorPredivide;} + bool isViewerOperation() {return true;} + +protected: + ViewerBaseOperation(); + void updateImage(rcti*rect); + +private: + void initImage(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cpp b/source/blender/compositor/operations/COM_ViewerOperation.cpp new file mode 100644 index 00000000000..b0d443f1cbd --- /dev/null +++ b/source/blender/compositor/operations/COM_ViewerOperation.cpp @@ -0,0 +1,108 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ViewerOperation.h" +#include "COM_SocketConnection.h" +#include "BLI_listbase.h" +#include "DNA_scene_types.h" +#include "BKE_image.h" +#include "WM_api.h" +#include "WM_types.h" +#include "PIL_time.h" +#include "BLI_utildefines.h" +#include "BLI_math_color.h" +#include "BLI_math_vector.h" + +extern "C" { + #include "MEM_guardedalloc.h" + #include "IMB_imbuf.h" + #include "IMB_imbuf_types.h" +} + + +ViewerOperation::ViewerOperation() : ViewerBaseOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + + this->imageInput = NULL; + this->alphaInput = NULL; +} + +void ViewerOperation::initExecution() { + // When initializing the tree during initial load the width and height can be zero. + this->imageInput = getInputSocketReader(0); + this->alphaInput = getInputSocketReader(1); + ViewerBaseOperation::initExecution(); +} + +void ViewerOperation::deinitExecution() { + this->imageInput = NULL; + this->alphaInput = NULL; + ViewerBaseOperation::deinitExecution(); +} + + +void ViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { + float* buffer = this->outputBuffer; + unsigned char* bufferDisplay = this->outputBufferDisplay; + if (!buffer) return; + const int x1 = rect->xmin; + const int y1 = rect->ymin; + const int x2 = rect->xmax; + const int y2 = rect->ymax; + const int offsetadd = (this->getWidth()-(x2-x1))*4; + int offset = (y1*this->getWidth() + x1 ) * 4; + float alpha[4], srgb[4]; + int x; + int y; + bool breaked = false; + + for (y = y1 ; y < y2 && (!breaked) ; y++) { + for (x = x1 ; x < x2; x++) { + imageInput->read(&(buffer[offset]), x, y, COM_PS_NEAREST, memoryBuffers); + if (alphaInput != NULL) { + alphaInput->read(alpha, x, y, COM_PS_NEAREST, memoryBuffers); + buffer[offset+3] = alpha[0]; + } + /// @todo: linear conversion only when scene color management is selected, also check predivide. + if (this->doColorManagement) { + if(this->doColorPredivide) { + linearrgb_to_srgb_predivide_v4(srgb, buffer+offset); + } else { + linearrgb_to_srgb_v4(srgb, buffer+offset); + } + } else { + copy_v4_v4(srgb, buffer+offset); + } + + F4TOCHAR4(srgb, bufferDisplay+offset); + + offset +=4; + } + if (tree->test_break && tree->test_break(tree->tbh)) { + breaked = true; + } + + offset += offsetadd; + } + updateImage(rect); +} diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h new file mode 100644 index 00000000000..951e9ff6fc3 --- /dev/null +++ b/source/blender/compositor/operations/COM_ViewerOperation.h @@ -0,0 +1,41 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ViewerOperation_h +#define _COM_ViewerOperation_h +#include "COM_NodeOperation.h" +#include "DNA_image_types.h" +#include "BLI_rect.h" +#include "COM_ViewerBaseOperation.h" + +class ViewerOperation : public ViewerBaseOperation { +private: + SocketReader* imageInput; + SocketReader* alphaInput; + +public: + ViewerOperation(); + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); + void initExecution(); + void deinitExecution(); +}; +#endif diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.cpp b/source/blender/compositor/operations/COM_WriteBufferOperation.cpp new file mode 100644 index 00000000000..44a769ee947 --- /dev/null +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.cpp @@ -0,0 +1,161 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_WriteBufferOperation.h" +#include "COM_defines.h" +#include "COM_MemoryManager.h" +#include + +/// @TODO: writebuffers don't have an actual data type set. +WriteBufferOperation::WriteBufferOperation() :NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->memoryProxy = new MemoryProxy(); + this->memoryProxy->setWriteBufferOperation(this); + this->memoryProxy->setExecutor(NULL); + this->tree = NULL; +} +WriteBufferOperation::~WriteBufferOperation() { + if (this->memoryProxy) { + delete this->memoryProxy; + this->memoryProxy = NULL; + } +} + +void WriteBufferOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + input->read(color, x, y, sampler, inputBuffers); +} +void WriteBufferOperation::initExecution() { + this->input = this->getInputOperation(0); + MemoryManager::addMemoryProxy(this->memoryProxy); +} +void WriteBufferOperation::deinitExecution() { + this->input = NULL; +} + + +void WriteBufferOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { + MemoryBuffer* memoryBuffer = MemoryManager::getMemoryBuffer(this->getMemoryProxy(), tileNumber); + float* buffer = memoryBuffer->getBuffer(); + if (this->input->isComplex()) { + void* data = this->input->initializeTileData(rect, memoryBuffers); + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int offset4 = 0; + int x; + int y; + bool breaked = false; + for (y = y1 ; y < y2 && (!breaked) ; y++) { + for (x = x1 ; x < x2; x++) { + input->read(&(buffer[offset4]), x, y, memoryBuffers, data); + offset4 +=4; + + } + if (tree->test_break && tree->test_break(tree->tbh)) { + breaked = true; + } + + } + if (data) { + this->input->deinitializeTileData(rect, memoryBuffers, data); + data = NULL; + } + } else { + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + int offset4 = 0; + int x; + int y; + bool breaked = false; + for (y = y1 ; y < y2 && (!breaked) ; y++) { + for (x = x1 ; x < x2 ; x++) { + input->read(&(buffer[offset4]), x, y, COM_PS_NEAREST, memoryBuffers); + offset4 +=4; + } + if (tree->test_break && tree->test_break(tree->tbh)) { + breaked = true; + } + } + } + memoryBuffer->setCreatedState(); +} + +void WriteBufferOperation::executeOpenCLRegion(cl_context context, cl_program program, cl_command_queue queue, rcti *rect, unsigned int chunkNumber, MemoryBuffer** inputMemoryBuffers) { + MemoryBuffer* outputMemoryBuffer = MemoryManager::getMemoryBuffer(this->getMemoryProxy(), chunkNumber); + float* outputFloatBuffer = outputMemoryBuffer->getBuffer(); + cl_int error; + /* + 1. create cl_mem from outputbuffer + 2. call NodeOperation (input) executeOpenCLChunk(.....) + 3. schedule readback from opencl to main device (outputbuffer) + 4. schedule native callback + + note: list of cl_mem will be filled by 2, and needs to be cleaned up by 4 + */ + // STEP 1 + const unsigned int outputBufferWidth = outputMemoryBuffer->getWidth(); + const unsigned int outputBufferHeight = outputMemoryBuffer->getHeight(); + + const cl_image_format imageFormat = { + CL_RGBA, + CL_FLOAT + }; + + cl_mem clOutputBuffer = clCreateImage2D(context, CL_MEM_WRITE_ONLY|CL_MEM_USE_HOST_PTR, &imageFormat, outputBufferWidth, outputBufferHeight, 0, outputFloatBuffer, &error); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + + // STEP 2 + list * clMemToCleanUp = new list(); + clMemToCleanUp->push_back(clOutputBuffer); + list *clKernelsToCleanUp = new list(); + + this->input->executeOpenCL(context, program, queue, outputMemoryBuffer, clOutputBuffer, inputMemoryBuffers, clMemToCleanUp, clKernelsToCleanUp); + + // STEP 3 + + size_t origin[3] = {0,0,0}; + size_t region[3] = {outputBufferWidth,outputBufferHeight,1}; + + error = clEnqueueBarrier(queue); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + error = clEnqueueReadImage(queue, clOutputBuffer, CL_TRUE, origin, region, 0, 0, outputFloatBuffer, 0, NULL, NULL); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + // STEP 4 + + while (clMemToCleanUp->size()>0) { + cl_mem mem = clMemToCleanUp->front(); + error = clReleaseMemObject(mem); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + clMemToCleanUp->pop_front(); + } + + while (clKernelsToCleanUp->size()>0) { + cl_kernel kernel = clKernelsToCleanUp->front(); + error = clReleaseKernel(kernel); + if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } + clKernelsToCleanUp->pop_front(); + } + delete clKernelsToCleanUp; +} diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.h b/source/blender/compositor/operations/COM_WriteBufferOperation.h new file mode 100644 index 00000000000..3b28ffd4f63 --- /dev/null +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_WriteBufferOperation_h_ +#define _COM_WriteBufferOperation_h_ + +#include "COM_NodeOperation.h" +#include "COM_MemoryProxy.h" +#include "COM_SocketReader.h" +/** + * @brief Operation to write to a tile + * @ingroup Operation + */ +class WriteBufferOperation: public NodeOperation { + MemoryProxy *memoryProxy; + NodeOperation *input; + const bNodeTree * tree; +public: + WriteBufferOperation(); + ~WriteBufferOperation(); + int isBufferOperation() {return true;} + MemoryProxy* getMemoryProxy() {return this->memoryProxy;} + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + const bool isWriteBufferOperation() const {return true;} + + void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); + void initExecution(); + void deinitExecution(); + void setbNodeTree(const bNodeTree* tree) {this->tree = tree;} + void executeOpenCLRegion(cl_context context, cl_program program, cl_command_queue queue, rcti *rect, unsigned int chunkNumber, MemoryBuffer** memoryBuffers); + +}; +#endif diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.cpp b/source/blender/compositor/operations/COM_ZCombineOperation.cpp new file mode 100644 index 00000000000..9aa06df1ead --- /dev/null +++ b/source/blender/compositor/operations/COM_ZCombineOperation.cpp @@ -0,0 +1,87 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "COM_ZCombineOperation.h" +#include "BLI_utildefines.h" + +ZCombineOperation::ZCombineOperation(): NodeOperation() { + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_COLOR); + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_COLOR); + + this->image1Reader = NULL; + this->depth1Reader = NULL; + this->image2Reader = NULL; + this->depth2Reader = NULL; + +} + +void ZCombineOperation::initExecution() { + this->image1Reader = this->getInputSocketReader(0); + this->depth1Reader = this->getInputSocketReader(1); + this->image2Reader = this->getInputSocketReader(2); + this->depth2Reader = this->getInputSocketReader(3); +} + +void ZCombineOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float depth1[4]; + float depth2[4]; + + this->depth1Reader->read(depth1, x, y, sampler, inputBuffers); + this->depth2Reader->read(depth2, x, y, sampler, inputBuffers); + if (depth1[0]image1Reader->read(color, x, y, sampler, inputBuffers); + } else { + this->image2Reader->read(color, x, y, sampler, inputBuffers); + } +} +void ZCombineAlphaOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + float depth1[4]; + float depth2[4]; + float color1[4]; + float color2[4]; + + this->depth1Reader->read(depth1, x, y, sampler, inputBuffers); + this->depth2Reader->read(depth2, x, y, sampler, inputBuffers); + if (depth1[0]image1Reader->read(color1, x, y, sampler, inputBuffers); + this->image2Reader->read(color2, x, y, sampler, inputBuffers); + } else { + this->image1Reader->read(color2, x, y, sampler, inputBuffers); + this->image2Reader->read(color1, x, y, sampler, inputBuffers); + } + float fac = color1[3]; + float ifac = 1.0f-fac; + color[0] = color1[0]+ifac*color2[0]; + color[1] = color1[1]+ifac*color2[1]; + color[2] = color1[2]+ifac*color2[2]; + color[3] = MAX2(color1[3], color2[3]); +} + +void ZCombineOperation::deinitExecution() { + this->image1Reader = NULL; + this->depth1Reader = NULL; + this->image2Reader = NULL; + this->depth2Reader = NULL; +} diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.h b/source/blender/compositor/operations/COM_ZCombineOperation.h new file mode 100644 index 00000000000..d5a3f02fea2 --- /dev/null +++ b/source/blender/compositor/operations/COM_ZCombineOperation.h @@ -0,0 +1,57 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_ZCombineOperation_h +#define _COM_ZCombineOperation_h +#include "COM_MixBaseOperation.h" + + +/** + * this program converts an input colour to an output value. + * it assumes we are in sRGB colour space. + */ +class ZCombineOperation : public NodeOperation { +protected: + SocketReader* image1Reader; + SocketReader* depth1Reader; + SocketReader* image2Reader; + SocketReader* depth2Reader; +public: + /** + * Default constructor + */ + ZCombineOperation(); + + void initExecution(); + void deinitExecution(); + + /** + * the inner loop of this program + */ + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +class ZCombineAlphaOperation: public ZCombineOperation { + void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); +}; + +#endif diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 58fbceb999d..e2ab5ea64e4 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -2210,7 +2210,7 @@ static int image_record_composite_apply(bContext *C, wmOperator *op) BKE_image_all_free_anim_ibufs(scene->r.cfra); ntreeCompositTagAnimated(scene->nodetree); - ntreeCompositExecTree(scene->nodetree, &scene->r, scene->r.cfra != rcd->old_cfra); /* 1 is no previews */ + ntreeCompositExecTree(scene->nodetree, &scene->r, 0, scene->r.cfra != rcd->old_cfra); /* 1 is no previews */ ED_area_tag_redraw(CTX_wm_area(C)); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 205202a0658..0a64c102150 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1967,6 +1967,256 @@ static void node_composit_buts_moviedistortion(uiLayout *layout, bContext *C, Po uiItemR(layout, ptr, "distortion_type", 0, "", 0); } +static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayout *row; + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "red", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "green", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "blue", 0, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "midtones_start", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_end", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemL(row, "Saturation", 0); + uiItemL(row, "Contrast", 0); + uiItemL(row, "Gamma", 0); + uiItemL(row, "Gain", 0); + uiItemL(row, "Lift", 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "highlights_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "midtones_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "shadows_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); +} +static void node_composit_buts_colorcorrection_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiLayout *row; + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "red", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "green", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "blue", 0, NULL, ICON_NONE); + row = layout; + uiItemL(row, "Saturation", 0); + uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + uiItemL(row, "Contrast", 0); + uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + uiItemL(row, "Gamma", 0); + uiItemR(row, ptr, "master_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + uiItemL(row, "Gain", 0); + uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + uiItemL(row, "Lift", 0); + uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "midtones_start", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_end", 0, NULL, ICON_NONE); +} + +static void node_composit_buts_switch(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "check", 0, NULL, ICON_NONE); +} + +static void node_composit_buts_boxmask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayout *row; + + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "x", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "y", 0, NULL, ICON_NONE); + + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + uiItemR(layout, ptr, "rotation", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "mask_type", 0, NULL, ICON_NONE); +} + +static void node_composit_buts_bokehimage(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "flaps", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "angle", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "rounding", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(layout, ptr, "catadioptric", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(layout, ptr, "shift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); +} + +void node_composit_backdrop_viewer(SpaceNode* snode, ImBuf* backdrop, bNode* node, int x, int y) +{ +// node_composit_backdrop_canvas(snode, backdrop, node, x, y); + if (node->custom1 == 0) { /// @todo: why did we need this one? + const float backdropWidth = backdrop->x; + const float backdropHeight = backdrop->y; + const float cx = x+snode->zoom*backdropWidth*node->custom3; + const float cy = y+snode->zoom*backdropHeight*node->custom4; + + glColor3f(1.0, 1.0, 1.0); + + glBegin(GL_LINES); + glVertex2f(cx-25, cy-25); + glVertex2f(cx+25, cy+25); + glVertex2f(cx+25, cy-25); + glVertex2f(cx-25, cy+25); + glEnd(); + } +} + +void node_composit_backdrop_boxmask(SpaceNode* snode, ImBuf* backdrop, bNode* node, int x, int y) +{ + NodeBoxMask * boxmask = node->storage; + const float backdropWidth = backdrop->x; + const float backdropHeight = backdrop->y; + const float aspect = backdropWidth/backdropHeight; + const float rad = DEG2RAD(-boxmask->rotation); + const float cosine = cos(rad); + const float sine = sin(rad); + const float halveBoxWidth = backdropWidth*(boxmask->width/2.0f); + const float halveBoxHeight = backdropHeight*(boxmask->height/2.0f)*aspect; + + float cx, cy, x1, x2, x3, x4; + float y1, y2, y3, y4; + + + /* keep this, saves us from a version patch */ + if(snode->zoom==0.0f) snode->zoom= 1.0f; + + glColor3f(1.0, 1.0, 1.0); + + cx = x+snode->zoom*backdropWidth*boxmask->x; + cy = y+snode->zoom*backdropHeight*boxmask->y; + + x1 = cx - (cosine*halveBoxWidth+sine*halveBoxHeight)*snode->zoom; + x2 = cx - (cosine*-halveBoxWidth+sine*halveBoxHeight)*snode->zoom; + x3 = cx - (cosine*-halveBoxWidth+sine*-halveBoxHeight)*snode->zoom; + x4 = cx - (cosine*halveBoxWidth+sine*-halveBoxHeight)*snode->zoom; + y1 = cy - (-sine*halveBoxWidth + cosine*halveBoxHeight)*snode->zoom; + y2 = cy - (-sine*-halveBoxWidth + cosine*halveBoxHeight)*snode->zoom; + y3 = cy - (-sine*-halveBoxWidth + cosine*-halveBoxHeight)*snode->zoom; + y4 = cy - (-sine*halveBoxWidth + cosine*-halveBoxHeight)*snode->zoom; + + glBegin(GL_LINE_LOOP); + glVertex2f(x1, y1); + glVertex2f(x2, y2); + glVertex2f(x3, y3); + glVertex2f(x4, y4); + glEnd(); +} + +void node_composit_backdrop_ellipsemask(SpaceNode* snode, ImBuf* backdrop, bNode* node, int x, int y) +{ + NodeEllipseMask * ellipsemask = node->storage; + const float backdropWidth = backdrop->x; + const float backdropHeight = backdrop->y; + const float aspect = backdropWidth/backdropHeight; + const float rad = DEG2RAD(-ellipsemask->rotation); + const float cosine = cos(rad); + const float sine = sin(rad); + const float halveBoxWidth = backdropWidth*(ellipsemask->width/2.0f); + const float halveBoxHeight = backdropHeight*(ellipsemask->height/2.0f)*aspect; + + float cx, cy, x1, x2, x3, x4; + float y1, y2, y3, y4; + + + /* keep this, saves us from a version patch */ + if(snode->zoom==0.0f) snode->zoom= 1.0f; + + glColor3f(1.0, 1.0, 1.0); + + cx = x+snode->zoom*backdropWidth*ellipsemask->x; + cy = y+snode->zoom*backdropHeight*ellipsemask->y; + + x1 = cx - (cosine*halveBoxWidth+sine*halveBoxHeight)*snode->zoom; + x2 = cx - (cosine*-halveBoxWidth+sine*halveBoxHeight)*snode->zoom; + x3 = cx - (cosine*-halveBoxWidth+sine*-halveBoxHeight)*snode->zoom; + x4 = cx - (cosine*halveBoxWidth+sine*-halveBoxHeight)*snode->zoom; + y1 = cy - (-sine*halveBoxWidth + cosine*halveBoxHeight)*snode->zoom; + y2 = cy - (-sine*-halveBoxWidth + cosine*halveBoxHeight)*snode->zoom; + y3 = cy - (-sine*-halveBoxWidth + cosine*-halveBoxHeight)*snode->zoom; + y4 = cy - (-sine*halveBoxWidth + cosine*-halveBoxHeight)*snode->zoom; + + glBegin(GL_LINE_LOOP); + + glVertex2f(x1, y1); + glVertex2f(x2, y2); + glVertex2f(x3, y3); + glVertex2f(x4, y4); + glEnd(); +} + +static void node_composit_buts_ellipsemask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayout *row; + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "x", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "y", 0, NULL, ICON_NONE); + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + uiItemR(layout, ptr, "rotation", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "mask_type", 0, NULL, ICON_NONE); +} + +static void node_composit_buts_viewer_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiLayout *col; + + uiItemR(layout, ptr, "tile_order", 0, NULL, ICON_NONE); + if (RNA_enum_get(ptr, "tile_order")==0) { + col= uiLayoutColumn(layout, 1); + uiItemR(col, ptr, "center_x", 0, NULL, ICON_NONE); + uiItemR(col, ptr, "center_y", 0, NULL, ICON_NONE); + } +} + /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) { @@ -2134,6 +2384,30 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_MOVIEDISTORTION: ntype->uifunc= node_composit_buts_moviedistortion; break; + case CMP_NODE_COLORCORRECTION: + ntype->uifunc=node_composit_buts_colorcorrection; + ntype->uifuncbut=node_composit_buts_colorcorrection_but; + break; + case CMP_NODE_SWITCH: + ntype->uifunc= node_composit_buts_switch; + break; + case CMP_NODE_MASK_BOX: + ntype->uifunc= node_composit_buts_boxmask; + ntype->uibackdropfunc = node_composit_backdrop_boxmask; + break; + case CMP_NODE_MASK_ELLIPSE: + ntype->uifunc= node_composit_buts_ellipsemask; + ntype->uibackdropfunc = node_composit_backdrop_ellipsemask; + break; + case CMP_NODE_BOKEHIMAGE: + ntype->uifunc= node_composit_buts_bokehimage; + break; + case CMP_NODE_VIEWER: + ntype->uifunc = NULL; + ntype->uifuncbut= node_composit_buts_viewer_but; + ntype->uibackdropfunc = node_composit_backdrop_viewer; + break; + default: ntype->uifunc= NULL; } @@ -2432,6 +2706,19 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage) glPixelZoom(1.0f, 1.0f); } } + + /// @note draw selected info on backdrop + if (snode->edittree) { + bNode *node = snode->edittree->nodes.first; + while (node) { + if (node->flag & NODE_SELECT) { + if (node->typeinfo->uibackdropfunc) { + node->typeinfo->uibackdropfunc(snode, ibuf, node, x, y); + } + } + node = node->next; + } + } glMatrixMode(GL_PROJECTION); glPopMatrix(); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index c23f6c76650..f71ce3f960c 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -185,8 +185,8 @@ static void compo_startjob(void *cjv, short *stop, short *do_update, float *prog // XXX BIF_store_spare(); - ntreeCompositExecTree(ntree, &cj->scene->r, 1); /* 1 is do_previews */ - + ntreeCompositExecTree(ntree, &cj->scene->r, 0, 1); /* 1 is do_previews */ + ntree->test_break= NULL; ntree->stats_draw= NULL; ntree->progress= NULL; @@ -405,6 +405,10 @@ void ED_node_composit_default(Scene *sce) } sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, 0); + + sce->nodetree->chunksize = 256; + sce->nodetree->edit_quality = NTREE_QUALITY_HIGH; + sce->nodetree->render_quality = NTREE_QUALITY_HIGH; ntemp.type = CMP_NODE_COMPOSITE; out= nodeAddNode(sce->nodetree, &ntemp); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 6fbaf1723bc..077c4011f4f 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -68,6 +68,14 @@ typedef struct bNodeStack { #define NS_OSA_VECTORS 1 #define NS_OSA_VALUES 2 +/* node socket/node socket type -b conversion rules */ +#define NS_CR_CENTER 0 +#define NS_CR_NONE 1 +#define NS_CR_FIT_WIDTH 2 +#define NS_CR_FIT_HEIGHT 3 +#define NS_CR_FIT 4 +#define NS_CR_STRETCH 5 + typedef struct bNodeSocket { struct bNodeSocket *next, *prev, *new_sock; @@ -87,7 +95,7 @@ typedef struct bNodeSocket { short stack_index; /* local stack index */ /* XXX deprecated, kept for forward compatibility */ short stack_type DNA_DEPRECATED; - int pad2; + int resizemode; /* compositor resize mode of the socket */ void *cache; /* cached data from execution */ /* internal data to retrieve relations and groups */ @@ -223,6 +231,11 @@ typedef struct bNodeLink { #define NODE_LINKFLAG_HILITE 1 /* link has been successfully validated */ #define NODE_LINK_VALID 2 +/* tree->edit_quality/tree->render_quality */ +#define NTREE_QUALITY_HIGH 0 +#define NTREE_QUALITY_MEDIUM 1 +#define NTREE_QUALITY_LOW 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 */ typedef struct bNodeTree { @@ -240,6 +253,10 @@ typedef struct bNodeTree { int update; /* update flags */ int nodetype; /* specific node type this tree is used for */ + + short edit_quality; /* Quality setting when editing */ + short render_quality; /* Quality setting when rendering */ + int chunksize; /* tile size for compositor engine */ ListBase inputs, outputs; /* external sockets for group nodes */ @@ -271,6 +288,7 @@ typedef struct bNodeTree { /* ntree->flag */ #define NTREE_DS_EXPAND 1 /* for animation editors */ +#define NTREE_COM_OPENCL 2 /* use opencl */ /* XXX not nice, but needed as a temporary flags * for group updates after library linking. */ @@ -317,6 +335,16 @@ typedef struct bNodeSocketValueRGBA { /* data structs, for node->storage */ +#define CMP_NODE_MASKTYPE_ADD 0 +#define CMP_NODE_MASKTYPE_SUBTRACT 1 +#define CMP_NODE_MASKTYPE_MULTIPLY 2 +#define CMP_NODE_MASKTYPE_NOT 3 + +#define CMP_NODE_LENSFLARE_GHOST 1 +#define CMP_NODE_LENSFLARE_GLOW 2 +#define CMP_NODE_LENSFLARE_CIRCLE 4 +#define CMP_NODE_LENSFLARE_STREAKS 8 + /* this one has been replaced with ImageUser, keep it for do_versions() */ typedef struct NodeImageAnim { int frames, sfra, nr; @@ -324,6 +352,50 @@ typedef struct NodeImageAnim { short pad; } NodeImageAnim; +typedef struct ColorCorrectionData { + float saturation; + float contrast; + float gamma; + float gain; + float lift; + int pad; +} ColorCorrectionData; + +typedef struct NodeColorCorrection { + ColorCorrectionData master; + ColorCorrectionData shadows; + ColorCorrectionData midtones; + ColorCorrectionData highlights; + float startmidtones; + float endmidtones; +} NodeColorCorrection; + +typedef struct NodeBokehImage { + float angle; + int flaps; + float rounding; + float catadioptric; + float lensshift; +} NodeBokehImage; + +typedef struct NodeBoxMask { + float x; + float y; + float rotation; + float height; + float width; + int pad; +} NodeBoxMask; + +typedef struct NodeEllipseMask { + float x; + float y; + float rotation; + float height; + float width; + int pad; +} NodeEllipseMask; + /* layer info for image node outputs */ typedef struct NodeImageLayer { /* index in the Image->layers and Image->layers->passes lists */ diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index f3ae30eb2aa..6c8293f8dae 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -64,6 +64,11 @@ EnumPropertyItem nodetree_type_items[] = { {0, NULL, 0, NULL, NULL} }; +EnumPropertyItem node_quality_items[] = { + {NTREE_QUALITY_HIGH, "HIGH", 0, "High", "High quality"}, + {NTREE_QUALITY_MEDIUM, "MEDIUM", 0, "Medium", "Medium quality"}, + {NTREE_QUALITY_LOW, "LOW", 0, "Low", "Low quality"}, + {0, NULL, 0, NULL, NULL}}; EnumPropertyItem node_socket_type_items[] = { {SOCK_FLOAT, "VALUE", 0, "Value", ""}, @@ -2931,6 +2936,373 @@ static void dev_cmd_transform(StructRNA *srna) RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } +/* -- Compositor Nodes ------------------------------------------------------ */ + +EnumPropertyItem node_masktype_items[] = { +{0, "ADD", 0, "Add", ""}, +{1, "SUBTRACT", 0, "Subtract", ""}, +{2, "MULTIPLY", 0, "Multiply", ""}, +{3, "NOT", 0, "Not", ""}, +{0, NULL, 0, NULL, NULL}}; + +static void def_cmp_boxmask(StructRNA *srna) +{ + PropertyRNA *prop; + + prop = RNA_def_property(srna, "mask_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, node_masktype_items); + RNA_def_property_ui_text(prop, "Mask type", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + RNA_def_struct_sdna_from(srna, "NodeBoxMask", "storage"); + + prop = RNA_def_property(srna, "x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "x"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, -1.0f, 2.0f); + RNA_def_property_ui_text(prop, "X position", "X position of the middle of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "y"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, -1.0f, 2.0f); + RNA_def_property_ui_text(prop, "Y position", "Y position of the middle of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "width"); + RNA_def_property_float_default(prop, 0.3f); + RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_ui_text(prop, "Width of the box", "Width of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "height"); + RNA_def_property_float_default(prop, 0.2f); + RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_ui_text(prop, "Height of the box", "Height of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "rotation"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1000.0f, 1000.0f); + RNA_def_property_ui_text(prop, "Rotation", "Rotationangle of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +} + +static void def_cmp_ellipsemask(StructRNA *srna) +{ + PropertyRNA *prop; + prop = RNA_def_property(srna, "mask_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, node_masktype_items); + RNA_def_property_ui_text(prop, "Mask type", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + RNA_def_struct_sdna_from(srna, "NodeEllipseMask", "storage"); + + prop = RNA_def_property(srna, "x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "x"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, -1.0f, 2.0f); + RNA_def_property_ui_text(prop, "X position", "X position of the middle of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "y"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, -1.0f, 2.0f); + RNA_def_property_ui_text(prop, "Y position", "Y position of the middle of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "width"); + RNA_def_property_float_default(prop, 0.3f); + RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_ui_text(prop, "Width of the box", "Width of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "height"); + RNA_def_property_float_default(prop, 0.2f); + RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_ui_text(prop, "Height of the box", "Height of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "rotation"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1000.0f, 1000.0f); + RNA_def_property_ui_text(prop, "Rotation", "Rotationangle of the box"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +} + +static void def_cmp_bokehimage(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeBokehImage", "storage"); + + prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "angle"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -0.0f, 360.0f); + RNA_def_property_ui_text(prop, "Angle", "Angle of the bokeh"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "flaps", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "flaps"); + RNA_def_property_int_default(prop, 5); + RNA_def_property_range(prop, 3, 24); + RNA_def_property_ui_text(prop, "Flaps", "Number of flaps"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "rounding", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "rounding"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Rounding", "Level of rounding of the bokeh"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "catadioptric", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "catadioptric"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Catadioptric", "Level of catadioptric of the bokeh"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "shift", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "lensshift"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1.0f, 1.0f); + RNA_def_property_ui_text(prop, "Lens shift", "Shift of the lens."); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + +} + +static void def_cmp_switch(StructRNA *srna) +{ + PropertyRNA *prop; + + prop = RNA_def_property(srna, "check", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "custom1", 0); + RNA_def_property_ui_text(prop, "Switch", "Off: first socket, On: second socket"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +} + +static void def_cmp_colorcorrection(StructRNA *srna) +{ + PropertyRNA *prop; + prop = RNA_def_property(srna, "red", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1); + RNA_def_property_boolean_default(prop, TRUE); + RNA_def_property_ui_text(prop, "Red", "Red channel active"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "green", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "custom1", 2); + RNA_def_property_boolean_default(prop, TRUE); + RNA_def_property_ui_text(prop, "Green", "Green channel active"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "blue", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "custom1", 4); + RNA_def_property_boolean_default(prop, TRUE); + RNA_def_property_ui_text(prop, "Blue", "Blue channel active"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + RNA_def_struct_sdna_from(srna, "NodeColorCorrection", "storage"); + + prop = RNA_def_property(srna, "midtones_start", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "startmidtones"); + RNA_def_property_float_default(prop, 0.2f); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Start of midtones", "Start of midtones"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "midtones_end", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "endmidtones"); + RNA_def_property_float_default(prop, 0.7f); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "End of midtones", "end of midtones"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "master_saturation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "master.saturation"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Master saturation", "Master saturation"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "master_contrast", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "master.contrast"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Master contrast", "Master contrast"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "master_gamma", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "master.gamma"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Master gamma", "Master gamma"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "master_gain", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "master.gain"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Master gain", "Master gain"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "master_lift", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "master.lift"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1, 1); + RNA_def_property_ui_text(prop, "Master lift", "Master lift"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + +// + prop = RNA_def_property(srna, "shadows_saturation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "shadows.saturation"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Shadows saturation", "Shadows saturation"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "shadows_contrast", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "shadows.contrast"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Shadows contrast", "Shadows contrast"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "shadows_gamma", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "shadows.gamma"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Shadows gamma", "Shadows gamma"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "shadows_gain", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "shadows.gain"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Shadows gain", "Shadows gain"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "shadows_lift", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "shadows.lift"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1, 1); + RNA_def_property_ui_text(prop, "Shadows lift", "Shadows lift"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +// + prop = RNA_def_property(srna, "midtones_saturation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "midtones.saturation"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Midtones saturation", "Midtones saturation"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "midtones_contrast", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "midtones.contrast"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Midtones contrast", "Midtones contrast"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "midtones_gamma", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "midtones.gamma"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Midtones gamma", "Midtones gamma"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "midtones_gain", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "midtones.gain"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Midtones gain", "Midtones gain"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "midtones_lift", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "midtones.lift"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1, 1); + RNA_def_property_ui_text(prop, "Midtones lift", "Midtones lift"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +// + prop = RNA_def_property(srna, "highlights_saturation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "highlights.saturation"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Highlights saturation", "Highlights saturation"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "highlights_contrast", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "highlights.contrast"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Highlights contrast", "Highlights contrast"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "highlights_gamma", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "highlights.gamma"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Highlights gamma", "Highlights gamma"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "highlights_gain", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "highlights.gain"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0, 4); + RNA_def_property_ui_text(prop, "Highlights gain", "Highlights gain"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "highlights_lift", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "highlights.lift"); + RNA_def_property_float_default(prop, 0.0f); + RNA_def_property_range(prop, -1, 1); + RNA_def_property_ui_text(prop, "Highlights lift", "Highlights lift"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +} + +static void def_cmp_viewer(StructRNA *srna) +{ + PropertyRNA *prop; + static EnumPropertyItem tileorder_items[] = { + {0, "CENTEROUT", 0, "Center", "Expand from center"}, + {1, "RANDOM", 0, "Random", "Random tiles"}, + {2, "BOTTOMUP", 0, "Bottom up", "Expand from bottom"}, + {3, "RULE_OF_THIRDS", 0, "Rule of thirds", "Expand from 9 places"}, + {0, NULL, 0, NULL, NULL}}; + + prop = RNA_def_property(srna, "tile_order", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, tileorder_items); + RNA_def_property_ui_text(prop, "Tile order", "tile order"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "center_x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "custom3"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "X", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "center_y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "custom4"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Y", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +} + /* -- Texture Nodes --------------------------------------------------------- */ @@ -3488,6 +3860,25 @@ static void rna_def_composite_nodetree(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Node"); RNA_def_property_ui_text(prop, "Nodes", ""); + prop= RNA_def_property(srna, "render_quality", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "render_quality"); + RNA_def_property_enum_items(prop, node_quality_items); + RNA_def_property_ui_text(prop, "Render quality", "Quality when rendering"); + + prop= RNA_def_property(srna, "edit_quality", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "edit_quality"); + RNA_def_property_enum_items(prop, node_quality_items); + RNA_def_property_ui_text(prop, "Edit quality", "Quality when editing"); + + prop= RNA_def_property(srna, "chunksize", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "chunksize"); + RNA_def_property_ui_text(prop, "Chunksize", "Max size of a chunk during calculation"); + RNA_def_property_range(prop, 32, 1024); + + prop= RNA_def_property(srna, "use_opencl", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", NTREE_COM_OPENCL); + RNA_def_property_ui_text(prop, "OpenCL", "Enable GPU calculations"); + rna_def_composite_nodetree_api(brna, prop); } diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h index d7e55ae27df..2da06d5dea7 100644 --- a/source/blender/makesrna/intern/rna_nodetree_types.h +++ b/source/blender/makesrna/intern/rna_nodetree_types.h @@ -91,7 +91,7 @@ DefNode( ShaderNode, SH_NODE_TEX_VORONOI, def_sh_tex_voronoi, "TE DefNode( ShaderNode, SH_NODE_TEX_CHECKER, def_sh_tex_checker, "TEX_CHECKER", TexChecker, "Checker Texture", "" ) DefNode( ShaderNode, SH_NODE_TEX_COORD, 0, "TEX_COORD", TexCoord, "Texture Coordinate","") -DefNode( CompositorNode, CMP_NODE_VIEWER, 0, "VIEWER", Viewer, "Viewer", "" ) +DefNode( CompositorNode, CMP_NODE_VIEWER, def_cmp_viewer, "VIEWER", Viewer, "Viewer", "" ) DefNode( CompositorNode, CMP_NODE_RGB, 0, "RGB", RGB, "RGB", "" ) DefNode( CompositorNode, CMP_NODE_VALUE, 0, "VALUE", Value, "Value", "" ) DefNode( CompositorNode, CMP_NODE_MIX_RGB, def_mix_rgb, "MIX_RGB", MixRGB, "Mix RGB", "" ) @@ -159,6 +159,11 @@ DefNode( CompositorNode, CMP_NODE_MOVIECLIP, def_cmp_movieclip, "MOVIE DefNode( CompositorNode, CMP_NODE_TRANSFORM, dev_cmd_transform, "TRANSFORM", Transform, "Transform", "" ) DefNode( CompositorNode, CMP_NODE_STABILIZE2D, def_cmp_stabilize2d, "STABILIZE2D", Stabilize, "Stabilize 2D", "" ) DefNode( CompositorNode, CMP_NODE_MOVIEDISTORTION,def_cmp_moviedistortion,"MOVIEDISTORTION",MovieDistortion, "Movie Distortion", "" ) +DefNode( CompositorNode, CMP_NODE_MASK_BOX, def_cmp_boxmask, "BOXMASK" ,BoxMask, "Box mask", "" ) +DefNode( CompositorNode, CMP_NODE_MASK_ELLIPSE, def_cmp_ellipsemask, "ELLIPSEMASK" ,EllipseMask, "Ellipse mask", "" ) +DefNode( CompositorNode, CMP_NODE_BOKEHIMAGE, def_cmp_bokehimage, "BOKEHIMAGE" ,BokehImage, "Bokeh image", "" ) +DefNode( CompositorNode, CMP_NODE_SWITCH, def_cmp_switch, "SWITCH" ,Switch, "Switch", "" ) +DefNode( CompositorNode, CMP_NODE_COLORCORRECTION,def_cmp_colorcorrection,"COLORCORRECTION",ColorCorrection, "ColorCorrection", "" ) DefNode( TextureNode, TEX_NODE_OUTPUT, def_tex_output, "OUTPUT", Output, "Output", "" ) DefNode( TextureNode, TEX_NODE_CHECKER, 0, "CHECKER", Checker, "Checker", "" ) diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index be9dd10b71d..772ce376cb8 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -35,6 +35,7 @@ set(INC ../makesrna ../render/extern/include ../../../intern/guardedalloc + ../compositor ) set(INC_SYS @@ -107,6 +108,13 @@ set(SRC composite/nodes/node_composite_vecBlur.c composite/nodes/node_composite_viewer.c composite/nodes/node_composite_zcombine.c + composite/nodes/node_composite_bokehblur.c + composite/nodes/node_composite_bokehimage.c + composite/nodes/node_composite_boxmask.c + composite/nodes/node_composite_ellipsemask.c + composite/nodes/node_composite_switch.c + composite/nodes/node_composite_colorcorrection.c + composite/node_composite_tree.c composite/node_composite_util.c diff --git a/source/blender/nodes/NOD_composite.h b/source/blender/nodes/NOD_composite.h index 284b89bc095..ca925c82afd 100644 --- a/source/blender/nodes/NOD_composite.h +++ b/source/blender/nodes/NOD_composite.h @@ -120,4 +120,12 @@ void register_node_type_cmp_glare(struct bNodeTreeType *ttype); void register_node_type_cmp_tonemap(struct bNodeTreeType *ttype); void register_node_type_cmp_lensdist(struct bNodeTreeType *ttype); + +void register_node_type_cmp_colorcorrection(struct bNodeTreeType *ttype); +void register_node_type_cmp_boxmask(struct bNodeTreeType *ttype); +void register_node_type_cmp_ellipsemask(struct bNodeTreeType *ttype); +void register_node_type_cmp_bokehimage(struct bNodeTreeType *ttype); +void register_node_type_cmp_bokehblur(struct bNodeTreeType *ttype); +void register_node_type_cmp_switch(struct bNodeTreeType *ttype); + #endif diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript index c8b13e24533..86178b31688 100644 --- a/source/blender/nodes/SConscript +++ b/source/blender/nodes/SConscript @@ -13,6 +13,7 @@ incs += ' ../imbuf ../avi ' incs += ' ../blenloader' incs += ' ../blenfont ../blenkernel ../renderconverter ' incs += ' ../gpu #/extern/glew/include ' +incs += ' ../compositor ' incs += ' ' + env['BF_OPENGL_INC'] incs += ' ' + env['BF_ZLIB_INC'] diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 41b1204fba4..b266af15060 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -59,6 +59,7 @@ #include "NOD_composite.h" #include "node_composite_util.h" +#include "COM_compositor.h" static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func) { @@ -136,7 +137,7 @@ static void localize(bNodeTree *localtree, bNodeTree *ntree) if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { if (node->id) { if (node->flag & NODE_DO_OUTPUT) - node->new_node->id= (ID *)BKE_image_copy((Image *)node->id); + node->new_node->id= (ID *)node->id; else node->new_node->id= NULL; } @@ -575,20 +576,19 @@ static void ntree_composite_texnode(bNodeTree *ntree, int init) } /* optimized tree execute test for compositing */ -void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) +/* optimized tree execute test for compositing */ +static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_preview) { bNodeExec *nodeexec; bNode *node; ListBase threads; ThreadData thdata; int totnode, curnode, rendering= 1, n; - bNodeTreeExec *exec; - - if (ntree==NULL) return; - - exec = ntree->execdata; - - if (do_preview) + bNodeTreeExec *exec= ntree->execdata; + + if(ntree==NULL) return; + + if(do_preview) ntreeInitPreview(ntree, 0, 0); if (!ntree->execdata) { @@ -598,7 +598,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) ntree_composite_texnode(ntree, 1); /* prevent unlucky accidents */ - if (G.background) + if(G.background) rd->scemode &= ~R_COMP_CROP; /* setup callerdata for thread callback */ @@ -613,15 +613,15 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) BLI_init_threads(&threads, exec_composite_node, rd->threads); - while (rendering) { + while(rendering) { - if (BLI_available_threads(&threads)) { + if(BLI_available_threads(&threads)) { nodeexec= getExecutableNode(exec); - if (nodeexec) { + if(nodeexec) { node = nodeexec->node; - if (ntree->progress && totnode) + if(ntree->progress && totnode) ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode)); - if (ntree->stats_draw) { + if(ntree->stats_draw) { char str[128]; BLI_snprintf(str, sizeof(str), "Compositing %d %s", curnode, node->name); ntree->stats_draw(ntree->sdh, str); @@ -640,21 +640,21 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) rendering= 0; /* test for ESC */ - if (ntree->test_break && ntree->test_break(ntree->tbh)) { - for (node= ntree->nodes.first; node; node= node->next) + 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) { + 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) { + 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) + if(rd->scemode & R_COMP_FREE) freeExecutableNode(exec); } } @@ -668,6 +668,14 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) ntreeCompositEndExecTree(exec, 1); } +void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int rendering, int do_preview) +{ + if(G.rt == 200) + ntreeCompositExecTreeOld(ntree, rd, do_preview); + else + COM_execute(ntree, rendering); +} + /* *********************************************** */ /* clumsy checking... should do dynamic outputs once */ diff --git a/source/blender/nodes/composite/nodes/node_composite_bokehblur.c b/source/blender/nodes/composite/nodes/node_composite_bokehblur.c new file mode 100644 index 00000000000..f239267a128 --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_bokehblur.c @@ -0,0 +1,60 @@ +/* + * $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/intern/CMP_nodes/CMP_blur.c + * \ingroup cmpnodes + */ + + +#include "../node_composite_util.h" + +/* **************** BLUR ******************** */ +static bNodeSocketTemplate cmp_node_bokehblur_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Bokeh", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Size", 0.01f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f}, + { SOCK_FLOAT, 1, "Bounding box", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketTemplate cmp_node_bokehblur_out[]= { + { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +void register_node_type_cmp_bokehblur(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, CMP_NODE_BOKEHBLUR, "Bokeh Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_bokehblur_in, cmp_node_bokehblur_out); + node_type_size(&ntype, 120, 80, 200); + nodeRegisterType(ttype, &ntype); +} diff --git a/source/blender/nodes/composite/nodes/node_composite_bokehimage.c b/source/blender/nodes/composite/nodes/node_composite_bokehimage.c new file mode 100644 index 00000000000..15dba89d12b --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_bokehimage.c @@ -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) 2006 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/CMP_nodes/CMP_gamma.c + * \ingroup cmpnodes + */ + + +#include "../node_composite_util.h" + +/* **************** Bokeh image Tools ******************** */ + +static bNodeSocketTemplate cmp_node_bokehimage_out[]= { + { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; +static void node_composit_init_bokehimage(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) +{ + NodeBokehImage * data = MEM_callocN(sizeof(NodeBokehImage), "NodeBokehImage"); + data->angle = 0.0f; + data->flaps = 5; + data->rounding = 0.0f; + data->catadioptric = 0.0f; + data->lensshift = 0.0f; + node->storage = data; +} + +void register_node_type_cmp_bokehimage(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, CMP_NODE_BOKEHIMAGE, "Bokeh Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, cmp_node_bokehimage_out); + node_type_size(&ntype, 140, 100, 320); + node_type_init(&ntype, node_composit_init_bokehimage); + node_type_storage(&ntype, "NodeBokehImage", node_free_standard_storage, node_copy_standard_storage); + + nodeRegisterType(ttype, &ntype); +} diff --git a/source/blender/nodes/composite/nodes/node_composite_boxmask.c b/source/blender/nodes/composite/nodes/node_composite_boxmask.c new file mode 100644 index 00000000000..be5d25f60c3 --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_boxmask.c @@ -0,0 +1,75 @@ +/* + * $Id: CMP_math.c 36271 2011-04-21 13:11:51Z campbellbarton $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 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): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/CMP_nodes/CMP_math.c + * \ingroup cmpnodes + */ + + +#include "../node_composite_util.h" + +/* **************** SCALAR MATH ******************** */ +static bNodeSocketTemplate cmp_node_boxmask_in[]= { + { SOCK_FLOAT, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketTemplate cmp_node_boxmask_out[]= { + { SOCK_FLOAT, 0, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static void node_composit_init_boxmask(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) +{ + NodeBoxMask *data = MEM_callocN(sizeof(NodeBoxMask), "NodeBoxMask"); + data->x = 0.5; + data->y = 0.5; + data->width = 0.2; + data->height = 0.1; + data->rotation = 0.0; + node->storage = data; +} + +void register_node_type_cmp_boxmask(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, CMP_NODE_MASK_BOX, "Box Mask", NODE_CLASS_MATTE, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_boxmask_in, cmp_node_boxmask_out); + node_type_size(&ntype, 120, 110, 160); + node_type_init(&ntype, node_composit_init_boxmask); + node_type_storage(&ntype, "NodeBoxMask", node_free_standard_storage, node_copy_standard_storage); + + nodeRegisterType(ttype, &ntype); +} + + + + diff --git a/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c b/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c new file mode 100644 index 00000000000..af085418c0e --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c @@ -0,0 +1,89 @@ +/* + * ***** 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): Jeroen Bakker. + * Monique Dewanchand + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/composite/nodes/node_composite_colorcorrection.c + * \ingroup cmpnodes + */ + + + +#include "node_composite_util.h" + + +/* ******************* Color Balance ********************************* */ +static bNodeSocketTemplate cmp_node_colorcorrection_in[]={ + { SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f}, + { SOCK_FLOAT, 1, "Mask", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { -1,0,""} +}; + +static bNodeSocketTemplate cmp_node_colorcorrection_out[]={ + { SOCK_RGBA,0,"Image"}, + { -1,0,""} +}; + +static void node_composit_init_colorcorrection(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) +{ + NodeColorCorrection *n= node->storage= MEM_callocN(sizeof(NodeColorCorrection), "node colorcorrection"); + n->startmidtones = 0.2f; + n->endmidtones = 0.7f; + n->master.contrast = 1.0f; + n->master.gain = 1.0f; + n->master.gamma = 1.0f; + n->master.lift= 0.0f; + n->master.saturation= 1.0f; + n->midtones.contrast = 1.0f; + n->midtones.gain = 1.0f; + n->midtones.gamma = 1.0f; + n->midtones.lift= 0.0f; + n->midtones.saturation= 1.0f; + n->shadows.contrast = 1.0f; + n->shadows.gain = 1.0f; + n->shadows.gamma = 1.0f; + n->shadows.lift= 0.0f; + n->shadows.saturation= 1.0f; + n->highlights.contrast = 1.0f; + n->highlights.gain = 1.0f; + n->highlights.gamma = 1.0f; + n->highlights.lift= 0.0f; + n->highlights.saturation= 1.0f; + node->custom1 = 7; // red + green + blue enabled +} + +void register_node_type_cmp_colorcorrection(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, CMP_NODE_COLORCORRECTION, "Color Correction", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_colorcorrection_in, cmp_node_colorcorrection_out); + node_type_size(&ntype, 400, 200, 400); + node_type_init(&ntype, node_composit_init_colorcorrection); + node_type_storage(&ntype, "NodeColorCorrection", node_free_standard_storage, node_copy_standard_storage); + + nodeRegisterType(ttype, &ntype); +} diff --git a/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c b/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c new file mode 100644 index 00000000000..556ad1ab6c6 --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c @@ -0,0 +1,75 @@ +/* + * $Id: CMP_math.c 36271 2011-04-21 13:11:51Z campbellbarton $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 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): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/CMP_nodes/CMP_math.c + * \ingroup cmpnodes + */ + + +#include "../node_composite_util.h" + +/* **************** SCALAR MATH ******************** */ +static bNodeSocketTemplate cmp_node_ellipsemask_in[]= { + { SOCK_FLOAT, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketTemplate cmp_node_ellipsemask_out[]= { + { SOCK_FLOAT, 0, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static void node_composit_init_ellipsemask(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) +{ + NodeEllipseMask *data = MEM_callocN(sizeof(NodeEllipseMask), "NodeEllipseMask"); + data->x = 0.5; + data->y = 0.5; + data->width = 0.2; + data->height = 0.1; + data->rotation = 0.0; + node->storage = data; +} + +void register_node_type_cmp_ellipsemask(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, CMP_NODE_MASK_ELLIPSE, "Ellipse Mask", NODE_CLASS_MATTE, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_ellipsemask_in, cmp_node_ellipsemask_out); + node_type_size(&ntype, 120, 110, 160); + node_type_init(&ntype, node_composit_init_ellipsemask); + node_type_storage(&ntype, "NodeEllipseMask", node_free_standard_storage, node_copy_standard_storage); + + nodeRegisterType(ttype, &ntype); +} + + + + diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c index 4467fb1f193..ad1264a7b6b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.c +++ b/source/blender/nodes/composite/nodes/node_composite_image.c @@ -715,7 +715,6 @@ static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNU RE_ReleaseResult(re); } - void register_node_type_cmp_rlayers(bNodeTreeType *ttype) { static bNodeType ntype; diff --git a/source/blender/nodes/composite/nodes/node_composite_switch.c b/source/blender/nodes/composite/nodes/node_composite_switch.c new file mode 100644 index 00000000000..f7b1f9e09e4 --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_switch.c @@ -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. + * + * The Original Code is Copyright (C) 2006 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/CMP_nodes/CMP_switch.c + * \ingroup cmpnodes + */ + +#include "../node_composite_util.h" + +/* **************** MIX RGB ******************** */ +static bNodeSocketTemplate cmp_node_switch_in[]= { + { SOCK_RGBA, 1, "Off", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "On", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketTemplate cmp_node_switch_out[]= { + { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +/* custom1 = mix type */ +void register_node_type_cmp_switch(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, CMP_NODE_SWITCH, "Switch", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_switch_in, cmp_node_switch_out); + node_type_size(&ntype, 110, 60, 120); + nodeRegisterType(ttype, &ntype); +} + diff --git a/source/blender/nodes/composite/nodes/node_composite_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c index 3fdedbb2e42..4a0726e473b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_viewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c @@ -129,6 +129,8 @@ static void node_composit_init_viewer(bNodeTree *UNUSED(ntree), bNode* node, bNo iuser->sfra= 1; iuser->fie_ima= 2; iuser->ok= 1; + node->custom3 = 0.5f; + node->custom4 = 0.5f; } void register_node_type_cmp_viewer(bNodeTreeType *ttype) diff --git a/source/blender/opencl/CMakeLists.txt b/source/blender/opencl/CMakeLists.txt new file mode 100644 index 00000000000..9c8ce830316 --- /dev/null +++ b/source/blender/opencl/CMakeLists.txt @@ -0,0 +1,39 @@ +# $Id: CMakeLists.txt 14444 2008-04-16 22:40:48Z hos $ +# ***** 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): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +set(INC + . +) + +set(SRC + OCL_opencl.h + intern/clew.h + intern/clew.c + intern/OCL_opencl.c +) + + +blender_add_lib(bf_opencl "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/opencl/OCL_opencl.h b/source/blender/opencl/OCL_opencl.h new file mode 100644 index 00000000000..4ee167b2fb4 --- /dev/null +++ b/source/blender/opencl/OCL_opencl.h @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef OCL_OPENCL_H +#define OCL_OPENCL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "intern/clew.h" +void OCL_init(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/source/blender/opencl/SConscript b/source/blender/opencl/SConscript new file mode 100644 index 00000000000..e91a99d5075 --- /dev/null +++ b/source/blender/opencl/SConscript @@ -0,0 +1,8 @@ +#!/usr/bin/python +Import ('env') + +sources = env.Glob('intern/*.c') + +incs = '.' + +env.BlenderLib ( 'bf_opencl', sources, Split(incs), libtype=['core','player'], priority = [192,192] ) diff --git a/source/blender/opencl/intern/OCL_opencl.c b/source/blender/opencl/intern/OCL_opencl.c new file mode 100644 index 00000000000..fa22acbc1a2 --- /dev/null +++ b/source/blender/opencl/intern/OCL_opencl.c @@ -0,0 +1,37 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#include "OCL_opencl.h" + +void OCL_init() +{ +#ifdef _WIN32 + const char *path = "OpenCL.dll"; +#elif defined(__APPLE__) + const char *path = "/Library/Frameworks/OpenCL.framework/OpenCL"; +#else + const char *path = "libOpenCL.so"; +#endif + + clewInit(path); +} + diff --git a/source/blender/opencl/intern/clew.c b/source/blender/opencl/intern/clew.c new file mode 100644 index 00000000000..d68eb17288f --- /dev/null +++ b/source/blender/opencl/intern/clew.c @@ -0,0 +1,311 @@ +////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2009 Organic Vectory B.V. +// Written by George van Venrooij +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file license.txt) +////////////////////////////////////////////////////////////////////////// + +#include "clew.h" + +//! \file clew.c +//! \brief OpenCL run-time loader source + +#ifndef CLCC_GENERATE_DOCUMENTATION +#ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN + #define VC_EXTRALEAN + #include + + typedef HMODULE CLCC_DYNLIB_HANDLE; + + #define CLCC_DYNLIB_OPEN LoadLibrary + #define CLCC_DYNLIB_CLOSE FreeLibrary + #define CLCC_DYNLIB_IMPORT GetProcAddress +#else + #include + + typedef void* CLCC_DYNLIB_HANDLE; + + #define CLCC_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL) + #define CLCC_DYNLIB_CLOSE dlclose + #define CLCC_DYNLIB_IMPORT dlsym +#endif +#else + //typedef implementation_defined CLCC_DYNLIB_HANDLE; + //#define CLCC_DYNLIB_OPEN(path) implementation_defined + //#define CLCC_DYNLIB_CLOSE implementation_defined + //#define CLCC_DYNLIB_IMPORT implementation_defined +#endif + +#include + +//! \brief module handle +static CLCC_DYNLIB_HANDLE module = NULL; + +// Variables holding function entry points +#ifndef CLCC_GENERATE_DOCUMENTATION +PFNCLGETPLATFORMIDS __oclGetPlatformIDs = NULL; +PFNCLGETPLATFORMINFO __oclGetPlatformInfo = NULL; +PFNCLGETDEVICEIDS __oclGetDeviceIDs = NULL; +PFNCLGETDEVICEINFO __oclGetDeviceInfo = NULL; +PFNCLCREATECONTEXT __oclCreateContext = NULL; +PFNCLCREATECONTEXTFROMTYPE __oclCreateContextFromType = NULL; +PFNCLRETAINCONTEXT __oclRetainContext = NULL; +PFNCLRELEASECONTEXT __oclReleaseContext = NULL; +PFNCLGETCONTEXTINFO __oclGetContextInfo = NULL; +PFNCLCREATECOMMANDQUEUE __oclCreateCommandQueue = NULL; +PFNCLRETAINCOMMANDQUEUE __oclRetainCommandQueue = NULL; +PFNCLRELEASECOMMANDQUEUE __oclReleaseCommandQueue = NULL; +PFNCLGETCOMMANDQUEUEINFO __oclGetCommandQueueInfo = NULL; +PFNCLSETCOMMANDQUEUEPROPERTY __oclSetCommandQueueProperty = NULL; +PFNCLCREATEBUFFER __oclCreateBuffer = NULL; +PFNCLCREATEIMAGE2D __oclCreateImage2D = NULL; +PFNCLCREATEIMAGE3D __oclCreateImage3D = NULL; +PFNCLRETAINMEMOBJECT __oclRetainMemObject = NULL; +PFNCLRELEASEMEMOBJECT __oclReleaseMemObject = NULL; +PFNCLGETSUPPORTEDIMAGEFORMATS __oclGetSupportedImageFormats = NULL; +PFNCLGETMEMOBJECTINFO __oclGetMemObjectInfo = NULL; +PFNCLGETIMAGEINFO __oclGetImageInfo = NULL; +PFNCLCREATESAMPLER __oclCreateSampler = NULL; +PFNCLRETAINSAMPLER __oclRetainSampler = NULL; +PFNCLRELEASESAMPLER __oclReleaseSampler = NULL; +PFNCLGETSAMPLERINFO __oclGetSamplerInfo = NULL; +PFNCLCREATEPROGRAMWITHSOURCE __oclCreateProgramWithSource = NULL; +PFNCLCREATEPROGRAMWITHBINARY __oclCreateProgramWithBinary = NULL; +PFNCLRETAINPROGRAM __oclRetainProgram = NULL; +PFNCLRELEASEPROGRAM __oclReleaseProgram = NULL; +PFNCLBUILDPROGRAM __oclBuildProgram = NULL; +PFNCLUNLOADCOMPILER __oclUnloadCompiler = NULL; +PFNCLGETPROGRAMINFO __oclGetProgramInfo = NULL; +PFNCLGETPROGRAMBUILDINFO __oclGetProgramBuildInfo = NULL; +PFNCLCREATEKERNEL __oclCreateKernel = NULL; +PFNCLCREATEKERNELSINPROGRAM __oclCreateKernelsInProgram = NULL; +PFNCLRETAINKERNEL __oclRetainKernel = NULL; +PFNCLRELEASEKERNEL __oclReleaseKernel = NULL; +PFNCLSETKERNELARG __oclSetKernelArg = NULL; +PFNCLGETKERNELINFO __oclGetKernelInfo = NULL; +PFNCLGETKERNELWORKGROUPINFO __oclGetKernelWorkGroupInfo = NULL; +PFNCLWAITFOREVENTS __oclWaitForEvents = NULL; +PFNCLGETEVENTINFO __oclGetEventInfo = NULL; +PFNCLRETAINEVENT __oclRetainEvent = NULL; +PFNCLRELEASEEVENT __oclReleaseEvent = NULL; +PFNCLGETEVENTPROFILINGINFO __oclGetEventProfilingInfo = NULL; +PFNCLFLUSH __oclFlush = NULL; +PFNCLFINISH __oclFinish = NULL; +PFNCLENQUEUEREADBUFFER __oclEnqueueReadBuffer = NULL; +PFNCLENQUEUEWRITEBUFFER __oclEnqueueWriteBuffer = NULL; +PFNCLENQUEUECOPYBUFFER __oclEnqueueCopyBuffer = NULL; +PFNCLENQUEUEREADIMAGE __oclEnqueueReadImage = NULL; +PFNCLENQUEUEWRITEIMAGE __oclEnqueueWriteImage = NULL; +PFNCLENQUEUECOPYIMAGE __oclEnqueueCopyImage = NULL; +PFNCLENQUEUECOPYIMAGETOBUFFER __oclEnqueueCopyImageToBuffer = NULL; +PFNCLENQUEUECOPYBUFFERTOIMAGE __oclEnqueueCopyBufferToImage = NULL; +PFNCLENQUEUEMAPBUFFER __oclEnqueueMapBuffer = NULL; +PFNCLENQUEUEMAPIMAGE __oclEnqueueMapImage = NULL; +PFNCLENQUEUEUNMAPMEMOBJECT __oclEnqueueUnmapMemObject = NULL; +PFNCLENQUEUENDRANGEKERNEL __oclEnqueueNDRangeKernel = NULL; +PFNCLENQUEUETASK __oclEnqueueTask = NULL; +PFNCLENQUEUENATIVEKERNEL __oclEnqueueNativeKernel = NULL; +PFNCLENQUEUEMARKER __oclEnqueueMarker = NULL; +PFNCLENQUEUEWAITFOREVENTS __oclEnqueueWaitForEvents = NULL; +PFNCLENQUEUEBARRIER __oclEnqueueBarrier = NULL; +PFNCLGETEXTENSIONFUNCTIONADDRESS __oclGetExtensionFunctionAddress = NULL; +#endif // CLCC_GENERATE_DOCUMENTATION + + +//! \brief Unloads OpenCL dynamic library, should not be called directly +static void clewExit(void) +{ + if (module != NULL) + { + // Ignore errors + CLCC_DYNLIB_CLOSE(module); + module = NULL; + } +} + +//! \param path path to dynamic library to load +//! \return CLEW_ERROR_OPEN_FAILED if the library could not be opened +//! CLEW_ERROR_ATEXIT_FAILED if atexit(clewExit) failed +//! CLEW_SUCCESS when the library was succesfully loaded +int clewInit(const char* path) +{ + int error = 0; + + // Check if already initialized + if (module != NULL) + { + return CLEW_SUCCESS; + } + + // Load library + module = CLCC_DYNLIB_OPEN(path); + + // Check for errors + if (module == NULL) + { + return CLEW_ERROR_OPEN_FAILED; + } + + // Set unloading + error = atexit(clewExit); + + if (error) + { + // Failure queing atexit, shutdown with error + CLCC_DYNLIB_CLOSE(module); + module = NULL; + + return CLEW_ERROR_ATEXIT_FAILED; + } + + // Determine function entry-points + __oclGetPlatformIDs = (PFNCLGETPLATFORMIDS )CLCC_DYNLIB_IMPORT(module, "clGetPlatformIDs"); + __oclGetPlatformInfo = (PFNCLGETPLATFORMINFO )CLCC_DYNLIB_IMPORT(module, "clGetPlatformInfo"); + __oclGetDeviceIDs = (PFNCLGETDEVICEIDS )CLCC_DYNLIB_IMPORT(module, "clGetDeviceIDs"); + __oclGetDeviceInfo = (PFNCLGETDEVICEINFO )CLCC_DYNLIB_IMPORT(module, "clGetDeviceInfo"); + __oclCreateContext = (PFNCLCREATECONTEXT )CLCC_DYNLIB_IMPORT(module, "clCreateContext"); + __oclCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE )CLCC_DYNLIB_IMPORT(module, "clCreateContextFromType"); + __oclRetainContext = (PFNCLRETAINCONTEXT )CLCC_DYNLIB_IMPORT(module, "clRetainContext"); + __oclReleaseContext = (PFNCLRELEASECONTEXT )CLCC_DYNLIB_IMPORT(module, "clReleaseContext"); + __oclGetContextInfo = (PFNCLGETCONTEXTINFO )CLCC_DYNLIB_IMPORT(module, "clGetContextInfo"); + __oclCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clCreateCommandQueue"); + __oclRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clRetainCommandQueue"); + __oclReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clReleaseCommandQueue"); + __oclGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO )CLCC_DYNLIB_IMPORT(module, "clGetCommandQueueInfo"); + __oclSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY )CLCC_DYNLIB_IMPORT(module, "clSetCommandQueueProperty"); + __oclCreateBuffer = (PFNCLCREATEBUFFER )CLCC_DYNLIB_IMPORT(module, "clCreateBuffer"); + __oclCreateImage2D = (PFNCLCREATEIMAGE2D )CLCC_DYNLIB_IMPORT(module, "clCreateImage2D"); + __oclCreateImage3D = (PFNCLCREATEIMAGE3D )CLCC_DYNLIB_IMPORT(module, "clCreateImage3D"); + __oclRetainMemObject = (PFNCLRETAINMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clRetainMemObject"); + __oclReleaseMemObject = (PFNCLRELEASEMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clReleaseMemObject"); + __oclGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS )CLCC_DYNLIB_IMPORT(module, "clGetSupportedImageFormats"); + __oclGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO )CLCC_DYNLIB_IMPORT(module, "clGetMemObjectInfo"); + __oclGetImageInfo = (PFNCLGETIMAGEINFO )CLCC_DYNLIB_IMPORT(module, "clGetImageInfo"); + __oclCreateSampler = (PFNCLCREATESAMPLER )CLCC_DYNLIB_IMPORT(module, "clCreateSampler"); + __oclRetainSampler = (PFNCLRETAINSAMPLER )CLCC_DYNLIB_IMPORT(module, "clRetainSampler"); + __oclReleaseSampler = (PFNCLRELEASESAMPLER )CLCC_DYNLIB_IMPORT(module, "clReleaseSampler"); + __oclGetSamplerInfo = (PFNCLGETSAMPLERINFO )CLCC_DYNLIB_IMPORT(module, "clGetSamplerInfo"); + __oclCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE )CLCC_DYNLIB_IMPORT(module, "clCreateProgramWithSource"); + __oclCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY )CLCC_DYNLIB_IMPORT(module, "clCreateProgramWithBinary"); + __oclRetainProgram = (PFNCLRETAINPROGRAM )CLCC_DYNLIB_IMPORT(module, "clRetainProgram"); + __oclReleaseProgram = (PFNCLRELEASEPROGRAM )CLCC_DYNLIB_IMPORT(module, "clReleaseProgram"); + __oclBuildProgram = (PFNCLBUILDPROGRAM )CLCC_DYNLIB_IMPORT(module, "clBuildProgram"); + __oclUnloadCompiler = (PFNCLUNLOADCOMPILER )CLCC_DYNLIB_IMPORT(module, "clUnloadCompiler"); + __oclGetProgramInfo = (PFNCLGETPROGRAMINFO )CLCC_DYNLIB_IMPORT(module, "clGetProgramInfo"); + __oclGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO )CLCC_DYNLIB_IMPORT(module, "clGetProgramBuildInfo"); + __oclCreateKernel = (PFNCLCREATEKERNEL )CLCC_DYNLIB_IMPORT(module, "clCreateKernel"); + __oclCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM )CLCC_DYNLIB_IMPORT(module, "clCreateKernelsInProgram"); + __oclRetainKernel = (PFNCLRETAINKERNEL )CLCC_DYNLIB_IMPORT(module, "clRetainKernel"); + __oclReleaseKernel = (PFNCLRELEASEKERNEL )CLCC_DYNLIB_IMPORT(module, "clReleaseKernel"); + __oclSetKernelArg = (PFNCLSETKERNELARG )CLCC_DYNLIB_IMPORT(module, "clSetKernelArg"); + __oclGetKernelInfo = (PFNCLGETKERNELINFO )CLCC_DYNLIB_IMPORT(module, "clGetKernelInfo"); + __oclGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO )CLCC_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo"); + __oclWaitForEvents = (PFNCLWAITFOREVENTS )CLCC_DYNLIB_IMPORT(module, "clWaitForEvents"); + __oclGetEventInfo = (PFNCLGETEVENTINFO )CLCC_DYNLIB_IMPORT(module, "clGetEventInfo"); + __oclRetainEvent = (PFNCLRETAINEVENT )CLCC_DYNLIB_IMPORT(module, "clRetainEvent"); + __oclReleaseEvent = (PFNCLRELEASEEVENT )CLCC_DYNLIB_IMPORT(module, "clReleaseEvent"); + __oclGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO )CLCC_DYNLIB_IMPORT(module, "clGetEventProfilingInfo"); + __oclFlush = (PFNCLFLUSH )CLCC_DYNLIB_IMPORT(module, "clFlush"); + __oclFinish = (PFNCLFINISH )CLCC_DYNLIB_IMPORT(module, "clFinish"); + __oclEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueReadBuffer"); + __oclEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer"); + __oclEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer"); + __oclEnqueueReadImage = (PFNCLENQUEUEREADIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueReadImage"); + __oclEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueWriteImage"); + __oclEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyImage"); + __oclEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer"); + __oclEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage"); + __oclEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueMapBuffer"); + __oclEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueMapImage"); + __oclEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject"); + __oclEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL )CLCC_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel"); + __oclEnqueueTask = (PFNCLENQUEUETASK )CLCC_DYNLIB_IMPORT(module, "clEnqueueTask"); + __oclEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL )CLCC_DYNLIB_IMPORT(module, "clEnqueueNativeKernel"); + __oclEnqueueMarker = (PFNCLENQUEUEMARKER )CLCC_DYNLIB_IMPORT(module, "clEnqueueMarker"); + __oclEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS )CLCC_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents"); + __oclEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLCC_DYNLIB_IMPORT(module, "clEnqueueBarrier"); + __oclGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLCC_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress"); + + return CLEW_SUCCESS; +} + +//! \param error CL error code +//! \return a string representation of the error code +const char* clewErrorString(cl_int error) +{ + static const char* strings[] = + { + // Error Codes + "CL_SUCCESS" // 0 + , "CL_DEVICE_NOT_FOUND" // -1 + , "CL_DEVICE_NOT_AVAILABLE" // -2 + , "CL_COMPILER_NOT_AVAILABLE" // -3 + , "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4 + , "CL_OUT_OF_RESOURCES" // -5 + , "CL_OUT_OF_HOST_MEMORY" // -6 + , "CL_PROFILING_INFO_NOT_AVAILABLE" // -7 + , "CL_MEM_COPY_OVERLAP" // -8 + , "CL_IMAGE_FORMAT_MISMATCH" // -9 + , "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10 + , "CL_BUILD_PROGRAM_FAILURE" // -11 + , "CL_MAP_FAILURE" // -12 + + , "" // -13 + , "" // -14 + , "" // -15 + , "" // -16 + , "" // -17 + , "" // -18 + , "" // -19 + + , "" // -20 + , "" // -21 + , "" // -22 + , "" // -23 + , "" // -24 + , "" // -25 + , "" // -26 + , "" // -27 + , "" // -28 + , "" // -29 + + , "CL_INVALID_VALUE" // -30 + , "CL_INVALID_DEVICE_TYPE" // -31 + , "CL_INVALID_PLATFORM" // -32 + , "CL_INVALID_DEVICE" // -33 + , "CL_INVALID_CONTEXT" // -34 + , "CL_INVALID_QUEUE_PROPERTIES" // -35 + , "CL_INVALID_COMMAND_QUEUE" // -36 + , "CL_INVALID_HOST_PTR" // -37 + , "CL_INVALID_MEM_OBJECT" // -38 + , "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39 + , "CL_INVALID_IMAGE_SIZE" // -40 + , "CL_INVALID_SAMPLER" // -41 + , "CL_INVALID_BINARY" // -42 + , "CL_INVALID_BUILD_OPTIONS" // -43 + , "CL_INVALID_PROGRAM" // -44 + , "CL_INVALID_PROGRAM_EXECUTABLE" // -45 + , "CL_INVALID_KERNEL_NAME" // -46 + , "CL_INVALID_KERNEL_DEFINITION" // -47 + , "CL_INVALID_KERNEL" // -48 + , "CL_INVALID_ARG_INDEX" // -49 + , "CL_INVALID_ARG_VALUE" // -50 + , "CL_INVALID_ARG_SIZE" // -51 + , "CL_INVALID_KERNEL_ARGS" // -52 + , "CL_INVALID_WORK_DIMENSION" // -53 + , "CL_INVALID_WORK_GROUP_SIZE" // -54 + , "CL_INVALID_WORK_ITEM_SIZE" // -55 + , "CL_INVALID_GLOBAL_OFFSET" // -56 + , "CL_INVALID_EVENT_WAIT_LIST" // -57 + , "CL_INVALID_EVENT" // -58 + , "CL_INVALID_OPERATION" // -59 + , "CL_INVALID_GL_OBJECT" // -60 + , "CL_INVALID_BUFFER_SIZE" // -61 + , "CL_INVALID_MIP_LEVEL" // -62 + , "CL_INVALID_GLOBAL_WORK_SIZE" // -63 + }; + + return strings[-error]; +} diff --git a/source/blender/opencl/intern/clew.h b/source/blender/opencl/intern/clew.h new file mode 100644 index 00000000000..bb7e0134dcf --- /dev/null +++ b/source/blender/opencl/intern/clew.h @@ -0,0 +1,1317 @@ +#ifndef CLCC_CLEW_HPP_INCLUDED +#define CLCC_CLEW_HPP_INCLUDED + +////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2009 Organic Vectory B.V. +// Written by George van Venrooij +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file license.txt) +////////////////////////////////////////////////////////////////////////// + +//! \file clew.h +//! \brief OpenCL run-time loader header +//! +//! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the +//! official OpenCL spec. The purpose of this code is to load the OpenCL dynamic +//! library at run-time and thus allow the executable to function on many +//! platforms regardless of the vendor of the OpenCL driver actually installed. +//! Some of the techniques used here were inspired by work done in the GLEW +//! library (http://glew.sourceforge.net/) + +// Run-time dynamic linking functionality based on concepts used in GLEW +#ifdef __OPENCL_CL_H +#error cl.h included before clew.h +#endif + +#ifdef __OPENCL_CL_PLATFORM_H +#error cl_platform.h included before clew.h +#endif + +#ifndef CLCC_GENERATE_DOCUMENTATION +// Prevent cl.h inclusion +#define __OPENCL_CL_H +// Prevent cl_platform.h inclusion +#define __CL_PLATFORM_H +#endif // CLCC_GENERATE_DOCUMENTATION + +/******************************************************************************* +* Copyright (c) 2008-2009 The Khronos Group Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and/or associated documentation files (the +* "Materials"), to deal in the Materials without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Materials, and to +* permit persons to whom the Materials are furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Materials. +* +* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +******************************************************************************/ +#ifdef __APPLE__ +/* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef CLCC_GENERATE_DOCUMENTATION + +#if defined(_WIN32) +#define CL_API_ENTRY +#define CL_API_CALL __stdcall +#else +#define CL_API_ENTRY +#define CL_API_CALL +#endif + +#if defined(__APPLE__) +//JBKK removed for compatibility with blender trunk #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#define CL_API_SUFFIX__VERSION_1_0 +#define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) +#else +#define CL_API_SUFFIX__VERSION_1_0 +#define CL_EXTENSION_WEAK_LINK +#endif + +#if defined(_WIN32) && defined(_MSC_VER) + +/* scalar types */ +typedef signed __int8 cl_char; +typedef unsigned __int8 cl_uchar; +typedef signed __int16 cl_short; +typedef unsigned __int16 cl_ushort; +typedef signed __int32 cl_int; +typedef unsigned __int32 cl_uint; +typedef signed __int64 cl_long; +typedef unsigned __int64 cl_ulong; + +typedef unsigned __int16 cl_half; +typedef float cl_float; +typedef double cl_double; + + +/* +* Vector types +* +* Note: OpenCL requires that all types be naturally aligned. +* This means that vector types must be naturally aligned. +* For example, a vector of four floats must be aligned to +* a 16 byte boundary (calculated as 4 * the natural 4-byte +* alignment of the float). The alignment qualifiers here +* will only function properly if your compiler supports them +* and if you don't actively work to defeat them. For example, +* in order for a cl_float4 to be 16 byte aligned in a struct, +* the start of the struct must itself be 16-byte aligned. +* +* Maintaining proper alignment is the user's responsibility. +*/ +typedef signed __int8 cl_char2[2]; +typedef signed __int8 cl_char4[4]; +typedef signed __int8 cl_char8[8]; +typedef signed __int8 cl_char16[16]; +typedef unsigned __int8 cl_uchar2[2]; +typedef unsigned __int8 cl_uchar4[4]; +typedef unsigned __int8 cl_uchar8[8]; +typedef unsigned __int8 cl_uchar16[16]; + +typedef signed __int16 cl_short2[2]; +typedef signed __int16 cl_short4[4]; +typedef signed __int16 cl_short8[8]; +typedef signed __int16 cl_short16[16]; +typedef unsigned __int16 cl_ushort2[2]; +typedef unsigned __int16 cl_ushort4[4]; +typedef unsigned __int16 cl_ushort8[8]; +typedef unsigned __int16 cl_ushort16[16]; + +typedef signed __int32 cl_int2[2]; +typedef signed __int32 cl_int4[4]; +typedef signed __int32 cl_int8[8]; +typedef signed __int32 cl_int16[16]; +typedef unsigned __int32 cl_uint2[2]; +typedef unsigned __int32 cl_uint4[4]; +typedef unsigned __int32 cl_uint8[8]; +typedef unsigned __int32 cl_uint16[16]; + +typedef signed __int64 cl_long2[2]; +typedef signed __int64 cl_long4[4]; +typedef signed __int64 cl_long8[8]; +typedef signed __int64 cl_long16[16]; +typedef unsigned __int64 cl_ulong2[2]; +typedef unsigned __int64 cl_ulong4[4]; +typedef unsigned __int64 cl_ulong8[8]; +typedef unsigned __int64 cl_ulong16[16]; + +typedef float cl_float2[2]; +typedef float cl_float4[4]; +typedef float cl_float8[8]; +typedef float cl_float16[16]; + +typedef double cl_double2[2]; +typedef double cl_double4[4]; +typedef double cl_double8[8]; +typedef double cl_double16[16]; +/* There are no vector types for half */ + +#else + +#include + +/* scalar types */ +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short __attribute__((aligned(2))); +typedef uint16_t cl_ushort __attribute__((aligned(2))); +typedef int32_t cl_int __attribute__((aligned(4))); +typedef uint32_t cl_uint __attribute__((aligned(4))); +typedef int64_t cl_long __attribute__((aligned(8))); +typedef uint64_t cl_ulong __attribute__((aligned(8))); + +typedef uint16_t cl_half __attribute__((aligned(2))); +typedef float cl_float __attribute__((aligned(4))); +typedef double cl_double __attribute__((aligned(8))); + +/* +* Vector types +* +* Note: OpenCL requires that all types be naturally aligned. +* This means that vector types must be naturally aligned. +* For example, a vector of four floats must be aligned to +* a 16 byte boundary (calculated as 4 * the natural 4-byte +* alignment of the float). The alignment qualifiers here +* will only function properly if your compiler supports them +* and if you don't actively work to defeat them. For example, +* in order for a cl_float4 to be 16 byte aligned in a struct, +* the start of the struct must itself be 16-byte aligned. +* +* Maintaining proper alignment is the user's responsibility. +*/ +typedef int8_t cl_char2[2] __attribute__((aligned(2))); +typedef int8_t cl_char4[4] __attribute__((aligned(4))); +typedef int8_t cl_char8[8] __attribute__((aligned(8))); +typedef int8_t cl_char16[16] __attribute__((aligned(16))); +typedef uint8_t cl_uchar2[2] __attribute__((aligned(2))); +typedef uint8_t cl_uchar4[4] __attribute__((aligned(4))); +typedef uint8_t cl_uchar8[8] __attribute__((aligned(8))); +typedef uint8_t cl_uchar16[16] __attribute__((aligned(16))); + +typedef int16_t cl_short2[2] __attribute__((aligned(4))); +typedef int16_t cl_short4[4] __attribute__((aligned(8))); +typedef int16_t cl_short8[8] __attribute__((aligned(16))); +typedef int16_t cl_short16[16] __attribute__((aligned(32))); +typedef uint16_t cl_ushort2[2] __attribute__((aligned(4))); +typedef uint16_t cl_ushort4[4] __attribute__((aligned(8))); +typedef uint16_t cl_ushort8[8] __attribute__((aligned(16))); +typedef uint16_t cl_ushort16[16] __attribute__((aligned(32))); + +typedef int32_t cl_int2[2] __attribute__((aligned(8))); +typedef int32_t cl_int4[4] __attribute__((aligned(16))); +typedef int32_t cl_int8[8] __attribute__((aligned(32))); +typedef int32_t cl_int16[16] __attribute__((aligned(64))); +typedef uint32_t cl_uint2[2] __attribute__((aligned(8))); +typedef uint32_t cl_uint4[4] __attribute__((aligned(16))); +typedef uint32_t cl_uint8[8] __attribute__((aligned(32))); +typedef uint32_t cl_uint16[16] __attribute__((aligned(64))); + +typedef int64_t cl_long2[2] __attribute__((aligned(16))); +typedef int64_t cl_long4[4] __attribute__((aligned(32))); +typedef int64_t cl_long8[8] __attribute__((aligned(64))); +typedef int64_t cl_long16[16] __attribute__((aligned(128))); +typedef uint64_t cl_ulong2[2] __attribute__((aligned(16))); +typedef uint64_t cl_ulong4[4] __attribute__((aligned(32))); +typedef uint64_t cl_ulong8[8] __attribute__((aligned(64))); +typedef uint64_t cl_ulong16[16] __attribute__((aligned(128))); + +typedef float cl_float2[2] __attribute__((aligned(8))); +typedef float cl_float4[4] __attribute__((aligned(16))); +typedef float cl_float8[8] __attribute__((aligned(32))); +typedef float cl_float16[16] __attribute__((aligned(64))); + +typedef double cl_double2[2] __attribute__((aligned(16))); +typedef double cl_double4[4] __attribute__((aligned(32))); +typedef double cl_double8[8] __attribute__((aligned(64))); +typedef double cl_double16[16] __attribute__((aligned(128))); + +/* There are no vector types for half */ + +#endif + +/******************************************************************************/ + +// Macro names and corresponding values defined by OpenCL + +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#if defined(_MSC_VER) +// MSVC doesn't understand hex floats +#define CL_FLT_MAX 3.402823466e+38F +#define CL_FLT_MIN 1.175494351e-38F +#define CL_FLT_EPSILON 1.192092896e-07F +#else +#define CL_FLT_MAX 0x1.fffffep127f +#define CL_FLT_MIN 0x1.0p-126f +#define CL_FLT_EPSILON 0x1.0p-23f +#endif + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#if defined(_MSC_VER) +// MSVC doesn't understand hex floats +#define CL_DBL_MAX 1.7976931348623158e+308 +#define CL_DBL_MIN 2.2250738585072014e-308 +#define CL_DBL_EPSILON 2.2204460492503131e-016 +#else +#define CL_DBL_MAX 0x1.fffffffffffffp1023 +#define CL_DBL_MIN 0x1.0p-1022 +#define CL_DBL_EPSILON 0x1.0p-52 +#endif + +#include + + +// CL.h contents +/******************************************************************************/ + +typedef struct _cl_platform_id * cl_platform_id; +typedef struct _cl_device_id * cl_device_id; +typedef struct _cl_context * cl_context; +typedef struct _cl_command_queue * cl_command_queue; +typedef struct _cl_mem * cl_mem; +typedef struct _cl_program * cl_program; +typedef struct _cl_kernel * cl_kernel; +typedef struct _cl_event * cl_event; +typedef struct _cl_sampler * cl_sampler; + +typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ +typedef cl_ulong cl_bitfield; +typedef cl_bitfield cl_device_type; +typedef cl_uint cl_platform_info; +typedef cl_uint cl_device_info; +typedef cl_bitfield cl_device_address_info; +typedef cl_bitfield cl_device_fp_config; +typedef cl_uint cl_device_mem_cache_type; +typedef cl_uint cl_device_local_mem_type; +typedef cl_bitfield cl_device_exec_capabilities; +typedef cl_bitfield cl_command_queue_properties; + +typedef intptr_t cl_context_properties; +typedef cl_uint cl_context_info; +typedef cl_uint cl_command_queue_info; +typedef cl_uint cl_channel_order; +typedef cl_uint cl_channel_type; +typedef cl_bitfield cl_mem_flags; +typedef cl_uint cl_mem_object_type; +typedef cl_uint cl_mem_info; +typedef cl_uint cl_image_info; +typedef cl_uint cl_addressing_mode; +typedef cl_uint cl_filter_mode; +typedef cl_uint cl_sampler_info; +typedef cl_bitfield cl_map_flags; +typedef cl_uint cl_program_info; +typedef cl_uint cl_program_build_info; +typedef cl_int cl_build_status; +typedef cl_uint cl_kernel_info; +typedef cl_uint cl_kernel_work_group_info; +typedef cl_uint cl_event_info; +typedef cl_uint cl_command_type; +typedef cl_uint cl_profiling_info; + +typedef struct _cl_image_format { + cl_channel_order image_channel_order; + cl_channel_type image_channel_data_type; +} cl_image_format; + + + +/******************************************************************************/ + +// Error Codes +#define CL_SUCCESS 0 +#define CL_DEVICE_NOT_FOUND -1 +#define CL_DEVICE_NOT_AVAILABLE -2 +#define CL_COMPILER_NOT_AVAILABLE -3 +#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 +#define CL_OUT_OF_RESOURCES -5 +#define CL_OUT_OF_HOST_MEMORY -6 +#define CL_PROFILING_INFO_NOT_AVAILABLE -7 +#define CL_MEM_COPY_OVERLAP -8 +#define CL_IMAGE_FORMAT_MISMATCH -9 +#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 +#define CL_BUILD_PROGRAM_FAILURE -11 +#define CL_MAP_FAILURE -12 + +#define CL_INVALID_VALUE -30 +#define CL_INVALID_DEVICE_TYPE -31 +#define CL_INVALID_PLATFORM -32 +#define CL_INVALID_DEVICE -33 +#define CL_INVALID_CONTEXT -34 +#define CL_INVALID_QUEUE_PROPERTIES -35 +#define CL_INVALID_COMMAND_QUEUE -36 +#define CL_INVALID_HOST_PTR -37 +#define CL_INVALID_MEM_OBJECT -38 +#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 +#define CL_INVALID_IMAGE_SIZE -40 +#define CL_INVALID_SAMPLER -41 +#define CL_INVALID_BINARY -42 +#define CL_INVALID_BUILD_OPTIONS -43 +#define CL_INVALID_PROGRAM -44 +#define CL_INVALID_PROGRAM_EXECUTABLE -45 +#define CL_INVALID_KERNEL_NAME -46 +#define CL_INVALID_KERNEL_DEFINITION -47 +#define CL_INVALID_KERNEL -48 +#define CL_INVALID_ARG_INDEX -49 +#define CL_INVALID_ARG_VALUE -50 +#define CL_INVALID_ARG_SIZE -51 +#define CL_INVALID_KERNEL_ARGS -52 +#define CL_INVALID_WORK_DIMENSION -53 +#define CL_INVALID_WORK_GROUP_SIZE -54 +#define CL_INVALID_WORK_ITEM_SIZE -55 +#define CL_INVALID_GLOBAL_OFFSET -56 +#define CL_INVALID_EVENT_WAIT_LIST -57 +#define CL_INVALID_EVENT -58 +#define CL_INVALID_OPERATION -59 +#define CL_INVALID_GL_OBJECT -60 +#define CL_INVALID_BUFFER_SIZE -61 +#define CL_INVALID_MIP_LEVEL -62 +#define CL_INVALID_GLOBAL_WORK_SIZE -63 + +// OpenCL Version +#define CL_VERSION_1_0 1 + +// cl_bool +#define CL_FALSE 0 +#define CL_TRUE 1 + +// cl_platform_info +#define CL_PLATFORM_PROFILE 0x0900 +#define CL_PLATFORM_VERSION 0x0901 +#define CL_PLATFORM_NAME 0x0902 +#define CL_PLATFORM_VENDOR 0x0903 +#define CL_PLATFORM_EXTENSIONS 0x0904 + +// cl_device_type - bitfield +#define CL_DEVICE_TYPE_DEFAULT (1 << 0) +#define CL_DEVICE_TYPE_CPU (1 << 1) +#define CL_DEVICE_TYPE_GPU (1 << 2) +#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) +#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF + +// cl_device_info +#define CL_DEVICE_TYPE 0x1000 +#define CL_DEVICE_VENDOR_ID 0x1001 +#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 +#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 +#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 +#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B +#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C +#define CL_DEVICE_ADDRESS_BITS 0x100D +#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E +#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F +#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 +#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 +#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 +#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 +#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 +#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 +#define CL_DEVICE_IMAGE_SUPPORT 0x1016 +#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 +#define CL_DEVICE_MAX_SAMPLERS 0x1018 +#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 +#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A +#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B +#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C +#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D +#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E +#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F +#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 +#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 +#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 +#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 +#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 +#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 +#define CL_DEVICE_ENDIAN_LITTLE 0x1026 +#define CL_DEVICE_AVAILABLE 0x1027 +#define CL_DEVICE_COMPILER_AVAILABLE 0x1028 +#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 +#define CL_DEVICE_QUEUE_PROPERTIES 0x102A +#define CL_DEVICE_NAME 0x102B +#define CL_DEVICE_VENDOR 0x102C +#define CL_DRIVER_VERSION 0x102D +#define CL_DEVICE_PROFILE 0x102E +#define CL_DEVICE_VERSION 0x102F +#define CL_DEVICE_EXTENSIONS 0x1030 +#define CL_DEVICE_PLATFORM 0x1031 + +// cl_device_fp_config - bitfield +#define CL_FP_DENORM (1 << 0) +#define CL_FP_INF_NAN (1 << 1) +#define CL_FP_ROUND_TO_NEAREST (1 << 2) +#define CL_FP_ROUND_TO_ZERO (1 << 3) +#define CL_FP_ROUND_TO_INF (1 << 4) +#define CL_FP_FMA (1 << 5) + +// cl_device_mem_cache_type +#define CL_NONE 0x0 +#define CL_READ_ONLY_CACHE 0x1 +#define CL_READ_WRITE_CACHE 0x2 + +// cl_device_local_mem_type +#define CL_LOCAL 0x1 +#define CL_GLOBAL 0x2 + +// cl_device_exec_capabilities - bitfield +#define CL_EXEC_KERNEL (1 << 0) +#define CL_EXEC_NATIVE_KERNEL (1 << 1) + +// cl_command_queue_properties - bitfield +#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) +#define CL_QUEUE_PROFILING_ENABLE (1 << 1) + +// cl_context_info +#define CL_CONTEXT_REFERENCE_COUNT 0x1080 +#define CL_CONTEXT_DEVICES 0x1081 +#define CL_CONTEXT_PROPERTIES 0x1082 + +// cl_context_properties +#define CL_CONTEXT_PLATFORM 0x1084 + +// cl_command_queue_info +#define CL_QUEUE_CONTEXT 0x1090 +#define CL_QUEUE_DEVICE 0x1091 +#define CL_QUEUE_REFERENCE_COUNT 0x1092 +#define CL_QUEUE_PROPERTIES 0x1093 + +// cl_mem_flags - bitfield +#define CL_MEM_READ_WRITE (1 << 0) +#define CL_MEM_WRITE_ONLY (1 << 1) +#define CL_MEM_READ_ONLY (1 << 2) +#define CL_MEM_USE_HOST_PTR (1 << 3) +#define CL_MEM_ALLOC_HOST_PTR (1 << 4) +#define CL_MEM_COPY_HOST_PTR (1 << 5) + +// cl_channel_order +#define CL_R 0x10B0 +#define CL_A 0x10B1 +#define CL_RG 0x10B2 +#define CL_RA 0x10B3 +#define CL_RGB 0x10B4 +#define CL_RGBA 0x10B5 +#define CL_BGRA 0x10B6 +#define CL_ARGB 0x10B7 +#define CL_INTENSITY 0x10B8 +#define CL_LUMINANCE 0x10B9 + +// cl_channel_type +#define CL_SNORM_INT8 0x10D0 +#define CL_SNORM_INT16 0x10D1 +#define CL_UNORM_INT8 0x10D2 +#define CL_UNORM_INT16 0x10D3 +#define CL_UNORM_SHORT_565 0x10D4 +#define CL_UNORM_SHORT_555 0x10D5 +#define CL_UNORM_INT_101010 0x10D6 +#define CL_SIGNED_INT8 0x10D7 +#define CL_SIGNED_INT16 0x10D8 +#define CL_SIGNED_INT32 0x10D9 +#define CL_UNSIGNED_INT8 0x10DA +#define CL_UNSIGNED_INT16 0x10DB +#define CL_UNSIGNED_INT32 0x10DC +#define CL_HALF_FLOAT 0x10DD +#define CL_FLOAT 0x10DE + +// cl_mem_object_type +#define CL_MEM_OBJECT_BUFFER 0x10F0 +#define CL_MEM_OBJECT_IMAGE2D 0x10F1 +#define CL_MEM_OBJECT_IMAGE3D 0x10F2 + +// cl_mem_info +#define CL_MEM_TYPE 0x1100 +#define CL_MEM_FLAGS 0x1101 +#define CL_MEM_SIZE 0x1102 +#define CL_MEM_HOST_PTR 0x1103 +#define CL_MEM_MAP_COUNT 0x1104 +#define CL_MEM_REFERENCE_COUNT 0x1105 +#define CL_MEM_CONTEXT 0x1106 + +// cl_image_info +#define CL_IMAGE_FORMAT 0x1110 +#define CL_IMAGE_ELEMENT_SIZE 0x1111 +#define CL_IMAGE_ROW_PITCH 0x1112 +#define CL_IMAGE_SLICE_PITCH 0x1113 +#define CL_IMAGE_WIDTH 0x1114 +#define CL_IMAGE_HEIGHT 0x1115 +#define CL_IMAGE_DEPTH 0x1116 + +// cl_addressing_mode +#define CL_ADDRESS_NONE 0x1130 +#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 +#define CL_ADDRESS_CLAMP 0x1132 +#define CL_ADDRESS_REPEAT 0x1133 + +// cl_filter_mode +#define CL_FILTER_NEAREST 0x1140 +#define CL_FILTER_LINEAR 0x1141 + +// cl_sampler_info +#define CL_SAMPLER_REFERENCE_COUNT 0x1150 +#define CL_SAMPLER_CONTEXT 0x1151 +#define CL_SAMPLER_NORMALIZED_COORDS 0x1152 +#define CL_SAMPLER_ADDRESSING_MODE 0x1153 +#define CL_SAMPLER_FILTER_MODE 0x1154 + +// cl_map_flags - bitfield +#define CL_MAP_READ (1 << 0) +#define CL_MAP_WRITE (1 << 1) + +// cl_program_info +#define CL_PROGRAM_REFERENCE_COUNT 0x1160 +#define CL_PROGRAM_CONTEXT 0x1161 +#define CL_PROGRAM_NUM_DEVICES 0x1162 +#define CL_PROGRAM_DEVICES 0x1163 +#define CL_PROGRAM_SOURCE 0x1164 +#define CL_PROGRAM_BINARY_SIZES 0x1165 +#define CL_PROGRAM_BINARIES 0x1166 + +// cl_program_build_info +#define CL_PROGRAM_BUILD_STATUS 0x1181 +#define CL_PROGRAM_BUILD_OPTIONS 0x1182 +#define CL_PROGRAM_BUILD_LOG 0x1183 + +// cl_build_status +#define CL_BUILD_SUCCESS 0 +#define CL_BUILD_NONE -1 +#define CL_BUILD_ERROR -2 +#define CL_BUILD_IN_PROGRESS -3 + +// cl_kernel_info +#define CL_KERNEL_FUNCTION_NAME 0x1190 +#define CL_KERNEL_NUM_ARGS 0x1191 +#define CL_KERNEL_REFERENCE_COUNT 0x1192 +#define CL_KERNEL_CONTEXT 0x1193 +#define CL_KERNEL_PROGRAM 0x1194 + +// cl_kernel_work_group_info +#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 +#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 +#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 + +// cl_event_info +#define CL_EVENT_COMMAND_QUEUE 0x11D0 +#define CL_EVENT_COMMAND_TYPE 0x11D1 +#define CL_EVENT_REFERENCE_COUNT 0x11D2 +#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 + +// cl_command_type +#define CL_COMMAND_NDRANGE_KERNEL 0x11F0 +#define CL_COMMAND_TASK 0x11F1 +#define CL_COMMAND_NATIVE_KERNEL 0x11F2 +#define CL_COMMAND_READ_BUFFER 0x11F3 +#define CL_COMMAND_WRITE_BUFFER 0x11F4 +#define CL_COMMAND_COPY_BUFFER 0x11F5 +#define CL_COMMAND_READ_IMAGE 0x11F6 +#define CL_COMMAND_WRITE_IMAGE 0x11F7 +#define CL_COMMAND_COPY_IMAGE 0x11F8 +#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 +#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA +#define CL_COMMAND_MAP_BUFFER 0x11FB +#define CL_COMMAND_MAP_IMAGE 0x11FC +#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD +#define CL_COMMAND_MARKER 0x11FE +#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF +#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 + +// command execution status +#define CL_COMPLETE 0x0 +#define CL_RUNNING 0x1 +#define CL_SUBMITTED 0x2 +#define CL_QUEUED 0x3 + +// cl_profiling_info +#define CL_PROFILING_COMMAND_QUEUED 0x1280 +#define CL_PROFILING_COMMAND_SUBMIT 0x1281 +#define CL_PROFILING_COMMAND_START 0x1282 +#define CL_PROFILING_COMMAND_END 0x1283 + +/********************************************************************************************************/ + +/********************************************************************************************************/ + +// Function signature typedef's + +// Platform API +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */, + cl_platform_id * /* platforms */, + cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */, + cl_platform_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Device APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETDEVICEIDS)(cl_platform_id /* platform */, + cl_device_type /* device_type */, + cl_uint /* num_entries */, + cl_device_id * /* devices */, + cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETDEVICEINFO)(cl_device_id /* device */, + cl_device_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Context APIs +typedef CL_API_ENTRY cl_context (CL_API_CALL * +PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */, + cl_uint /* num_devices */, + const cl_device_id * /* devices */, + void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, + void * /* user_data */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_context (CL_API_CALL * +PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */, + cl_device_type /* device_type */, + void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */, + void * /* user_data */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETCONTEXTINFO)(cl_context /* context */, + cl_context_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Command Queue APIs +typedef CL_API_ENTRY cl_command_queue (CL_API_CALL * +PFNCLCREATECOMMANDQUEUE)(cl_context /* context */, + cl_device_id /* device */, + cl_command_queue_properties /* properties */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */, + cl_command_queue_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */, + cl_command_queue_properties /* properties */, + cl_bool /* enable */, + cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0; + +// Memory Object APIs +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEBUFFER)(cl_context /* context */, + cl_mem_flags /* flags */, + size_t /* size */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEIMAGE2D)(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + size_t /* image_width */, + size_t /* image_height */, + size_t /* image_row_pitch */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL * +PFNCLCREATEIMAGE3D)(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + size_t /* image_width */, + size_t /* image_height */, + size_t /* image_depth */, + size_t /* image_row_pitch */, + size_t /* image_slice_pitch */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */, + cl_mem_flags /* flags */, + cl_mem_object_type /* image_type */, + cl_uint /* num_entries */, + cl_image_format * /* image_formats */, + cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */, + cl_mem_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETIMAGEINFO)(cl_mem /* image */, + cl_image_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Sampler APIs +typedef CL_API_ENTRY cl_sampler (CL_API_CALL * +PFNCLCREATESAMPLER)(cl_context /* context */, + cl_bool /* normalized_coords */, + cl_addressing_mode /* addressing_mode */, + cl_filter_mode /* filter_mode */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */, + cl_sampler_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Program Object APIs +typedef CL_API_ENTRY cl_program (CL_API_CALL * +PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */, + cl_uint /* count */, + const char ** /* strings */, + const size_t * /* lengths */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_program (CL_API_CALL * +PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const size_t * /* lengths */, + const unsigned char ** /* binaries */, + cl_int * /* binary_status */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLBUILDPROGRAM)(cl_program /* program */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const char * /* options */, + void (*pfn_notify)(cl_program /* program */, void * /* user_data */), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLUNLOADCOMPILER)(void) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPROGRAMINFO)(cl_program /* program */, + cl_program_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */, + cl_device_id /* device */, + cl_program_build_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Kernel Object APIs +typedef CL_API_ENTRY cl_kernel (CL_API_CALL * +PFNCLCREATEKERNEL)(cl_program /* program */, + const char * /* kernel_name */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */, + cl_uint /* num_kernels */, + cl_kernel * /* kernels */, + cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLSETKERNELARG)(cl_kernel /* kernel */, + cl_uint /* arg_index */, + size_t /* arg_size */, + const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETKERNELINFO)(cl_kernel /* kernel */, + cl_kernel_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */, + cl_device_id /* device */, + cl_kernel_work_group_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Event Object APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLWAITFOREVENTS)(cl_uint /* num_events */, + const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETEVENTINFO)(cl_event /* event */, + cl_event_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; + +// Profiling APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */, + cl_profiling_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +// Flush and Finish APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +// Enqueued Commands APIs +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_read */, + size_t /* offset */, + size_t /* cb */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_write */, + size_t /* offset */, + size_t /* cb */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_buffer */, + size_t /* src_offset */, + size_t /* dst_offset */, + size_t /* cb */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_read */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t /* row_pitch */, + size_t /* slice_pitch */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_write */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t /* input_row_pitch */, + size_t /* input_slice_pitch */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* src_image */, + cl_mem /* dst_image */, + const size_t * /* src_origin[3] */, + const size_t * /* dst_origin[3] */, + const size_t * /* region[3] */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* src_image */, + cl_mem /* dst_buffer */, + const size_t * /* src_origin[3] */, + const size_t * /* region[3] */, + size_t /* dst_offset */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_image */, + size_t /* src_offset */, + const size_t * /* dst_origin[3] */, + const size_t * /* region[3] */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY void * (CL_API_CALL * +PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + size_t /* offset */, + size_t /* cb */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY void * (CL_API_CALL * +PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t * /* image_row_pitch */, + size_t * /* image_slice_pitch */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */, + cl_mem /* memobj */, + void * /* mapped_ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */, + cl_kernel /* kernel */, + cl_uint /* work_dim */, + const size_t * /* global_work_offset */, + const size_t * /* global_work_size */, + const size_t * /* local_work_size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUETASK)(cl_command_queue /* command_queue */, + cl_kernel /* kernel */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */, + void (*user_func)(void *), + void * /* args */, + size_t /* cb_args */, + cl_uint /* num_mem_objects */, + const cl_mem * /* mem_list */, + const void ** /* args_mem_loc */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */, + cl_uint /* num_events */, + const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL * +PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +// Extension function access +// +// Returns the extension function address for the given function name, +// or NULL if a valid function can not be found. The client must +// check to make sure the address is not NULL, before using or +// calling the returned function address. +// +typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; + + +#define CLEW_STATIC + +#ifdef CLEW_STATIC +# define CLEWAPI extern +#else +# ifdef CLEW_BUILD +# define CLEWAPI extern __declspec(dllexport) +# else +# define CLEWAPI extern __declspec(dllimport) +# endif +#endif + +#if defined(_WIN32) +#define CLEW_FUN_EXPORT extern +#else +#define CLEW_FUN_EXPORT CLEWAPI +#endif + +#define CLEW_GET_FUN(x) x + + +// Variables holding function entry points +CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __oclGetPlatformIDs ; +CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __oclGetPlatformInfo ; +CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __oclGetDeviceIDs ; +CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __oclGetDeviceInfo ; +CLEW_FUN_EXPORT PFNCLCREATECONTEXT __oclCreateContext ; +CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __oclCreateContextFromType ; +CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __oclRetainContext ; +CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __oclReleaseContext ; +CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __oclGetContextInfo ; +CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __oclCreateCommandQueue ; +CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __oclRetainCommandQueue ; +CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __oclReleaseCommandQueue ; +CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __oclGetCommandQueueInfo ; +CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __oclSetCommandQueueProperty ; +CLEW_FUN_EXPORT PFNCLCREATEBUFFER __oclCreateBuffer ; +CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __oclCreateImage2D ; +CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __oclCreateImage3D ; +CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __oclRetainMemObject ; +CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __oclReleaseMemObject ; +CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __oclGetSupportedImageFormats ; +CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __oclGetMemObjectInfo ; +CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __oclGetImageInfo ; +CLEW_FUN_EXPORT PFNCLCREATESAMPLER __oclCreateSampler ; +CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __oclRetainSampler ; +CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __oclReleaseSampler ; +CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __oclGetSamplerInfo ; +CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __oclCreateProgramWithSource ; +CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __oclCreateProgramWithBinary ; +CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __oclRetainProgram ; +CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __oclReleaseProgram ; +CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __oclBuildProgram ; +CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __oclUnloadCompiler ; +CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __oclGetProgramInfo ; +CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __oclGetProgramBuildInfo ; +CLEW_FUN_EXPORT PFNCLCREATEKERNEL __oclCreateKernel ; +CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __oclCreateKernelsInProgram ; +CLEW_FUN_EXPORT PFNCLRETAINKERNEL __oclRetainKernel ; +CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __oclReleaseKernel ; +CLEW_FUN_EXPORT PFNCLSETKERNELARG __oclSetKernelArg ; +CLEW_FUN_EXPORT PFNCLGETKERNELINFO __oclGetKernelInfo ; +CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __oclGetKernelWorkGroupInfo ; +CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __oclWaitForEvents ; +CLEW_FUN_EXPORT PFNCLGETEVENTINFO __oclGetEventInfo ; +CLEW_FUN_EXPORT PFNCLRETAINEVENT __oclRetainEvent ; +CLEW_FUN_EXPORT PFNCLRELEASEEVENT __oclReleaseEvent ; +CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __oclGetEventProfilingInfo ; +CLEW_FUN_EXPORT PFNCLFLUSH __oclFlush ; +CLEW_FUN_EXPORT PFNCLFINISH __oclFinish ; +CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __oclEnqueueReadBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __oclEnqueueWriteBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __oclEnqueueCopyBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __oclEnqueueReadImage ; +CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __oclEnqueueWriteImage ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __oclEnqueueCopyImage ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __oclEnqueueCopyImageToBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __oclEnqueueCopyBufferToImage ; +CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __oclEnqueueMapBuffer ; +CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __oclEnqueueMapImage ; +CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __oclEnqueueUnmapMemObject ; +CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __oclEnqueueNDRangeKernel ; +CLEW_FUN_EXPORT PFNCLENQUEUETASK __oclEnqueueTask ; +CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __oclEnqueueNativeKernel ; +CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __oclEnqueueMarker ; +CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __oclEnqueueWaitForEvents ; +CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __oclEnqueueBarrier ; +CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __oclGetExtensionFunctionAddress ; + + +#define clGetPlatformIDs CLEW_GET_FUN(__oclGetPlatformIDs ) +#define clGetPlatformInfo CLEW_GET_FUN(__oclGetPlatformInfo ) +#define clGetDeviceIDs CLEW_GET_FUN(__oclGetDeviceIDs ) +#define clGetDeviceInfo CLEW_GET_FUN(__oclGetDeviceInfo ) +#define clCreateContext CLEW_GET_FUN(__oclCreateContext ) +#define clCreateContextFromType CLEW_GET_FUN(__oclCreateContextFromType ) +#define clRetainContext CLEW_GET_FUN(__oclRetainContext ) +#define clReleaseContext CLEW_GET_FUN(__oclReleaseContext ) +#define clGetContextInfo CLEW_GET_FUN(__oclGetContextInfo ) +#define clCreateCommandQueue CLEW_GET_FUN(__oclCreateCommandQueue ) +#define clRetainCommandQueue CLEW_GET_FUN(__oclRetainCommandQueue ) +#define clReleaseCommandQueue CLEW_GET_FUN(__oclReleaseCommandQueue ) +#define clGetCommandQueueInfo CLEW_GET_FUN(__oclGetCommandQueueInfo ) +#define clSetCommandQueueProperty CLEW_GET_FUN(__oclSetCommandQueueProperty ) +#define clCreateBuffer CLEW_GET_FUN(__oclCreateBuffer ) +#define clCreateImage2D CLEW_GET_FUN(__oclCreateImage2D ) +#define clCreateImage3D CLEW_GET_FUN(__oclCreateImage3D ) +#define clRetainMemObject CLEW_GET_FUN(__oclRetainMemObject ) +#define clReleaseMemObject CLEW_GET_FUN(__oclReleaseMemObject ) +#define clGetSupportedImageFormats CLEW_GET_FUN(__oclGetSupportedImageFormats ) +#define clGetMemObjectInfo CLEW_GET_FUN(__oclGetMemObjectInfo ) +#define clGetImageInfo CLEW_GET_FUN(__oclGetImageInfo ) +#define clCreateSampler CLEW_GET_FUN(__oclCreateSampler ) +#define clRetainSampler CLEW_GET_FUN(__oclRetainSampler ) +#define clReleaseSampler CLEW_GET_FUN(__oclReleaseSampler ) +#define clGetSamplerInfo CLEW_GET_FUN(__oclGetSamplerInfo ) +#define clCreateProgramWithSource CLEW_GET_FUN(__oclCreateProgramWithSource ) +#define clCreateProgramWithBinary CLEW_GET_FUN(__oclCreateProgramWithBinary ) +#define clRetainProgram CLEW_GET_FUN(__oclRetainProgram ) +#define clReleaseProgram CLEW_GET_FUN(__oclReleaseProgram ) +#define clBuildProgram CLEW_GET_FUN(__oclBuildProgram ) +#define clUnloadCompiler CLEW_GET_FUN(__oclUnloadCompiler ) +#define clGetProgramInfo CLEW_GET_FUN(__oclGetProgramInfo ) +#define clGetProgramBuildInfo CLEW_GET_FUN(__oclGetProgramBuildInfo ) +#define clCreateKernel CLEW_GET_FUN(__oclCreateKernel ) +#define clCreateKernelsInProgram CLEW_GET_FUN(__oclCreateKernelsInProgram ) +#define clRetainKernel CLEW_GET_FUN(__oclRetainKernel ) +#define clReleaseKernel CLEW_GET_FUN(__oclReleaseKernel ) +#define clSetKernelArg CLEW_GET_FUN(__oclSetKernelArg ) +#define clGetKernelInfo CLEW_GET_FUN(__oclGetKernelInfo ) +#define clGetKernelWorkGroupInfo CLEW_GET_FUN(__oclGetKernelWorkGroupInfo ) +#define clWaitForEvents CLEW_GET_FUN(__oclWaitForEvents ) +#define clGetEventInfo CLEW_GET_FUN(__oclGetEventInfo ) +#define clRetainEvent CLEW_GET_FUN(__oclRetainEvent ) +#define clReleaseEvent CLEW_GET_FUN(__oclReleaseEvent ) +#define clGetEventProfilingInfo CLEW_GET_FUN(__oclGetEventProfilingInfo ) +#define clFlush CLEW_GET_FUN(__oclFlush ) +#define clFinish CLEW_GET_FUN(__oclFinish ) +#define clEnqueueReadBuffer CLEW_GET_FUN(__oclEnqueueReadBuffer ) +#define clEnqueueWriteBuffer CLEW_GET_FUN(__oclEnqueueWriteBuffer ) +#define clEnqueueCopyBuffer CLEW_GET_FUN(__oclEnqueueCopyBuffer ) +#define clEnqueueReadImage CLEW_GET_FUN(__oclEnqueueReadImage ) +#define clEnqueueWriteImage CLEW_GET_FUN(__oclEnqueueWriteImage ) +#define clEnqueueCopyImage CLEW_GET_FUN(__oclEnqueueCopyImage ) +#define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__oclEnqueueCopyImageToBuffer ) +#define clEnqueueCopyBufferToImage CLEW_GET_FUN(__oclEnqueueCopyBufferToImage ) +#define clEnqueueMapBuffer CLEW_GET_FUN(__oclEnqueueMapBuffer ) +#define clEnqueueMapImage CLEW_GET_FUN(__oclEnqueueMapImage ) +#define clEnqueueUnmapMemObject CLEW_GET_FUN(__oclEnqueueUnmapMemObject ) +#define clEnqueueNDRangeKernel CLEW_GET_FUN(__oclEnqueueNDRangeKernel ) +#define clEnqueueTask CLEW_GET_FUN(__oclEnqueueTask ) +#define clEnqueueNativeKernel CLEW_GET_FUN(__oclEnqueueNativeKernel ) +#define clEnqueueMarker CLEW_GET_FUN(__oclEnqueueMarker ) +#define clEnqueueWaitForEvents CLEW_GET_FUN(__oclEnqueueWaitForEvents ) +#define clEnqueueBarrier CLEW_GET_FUN(__oclEnqueueBarrier ) +#define clGetExtensionFunctionAddress CLEW_GET_FUN(__oclGetExtensionFunctionAddress ) + +#endif // CLCC_GENERATE_DOCUMENTATION + +#define CLEW_SUCCESS 0 //!< Success error code +#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library +#define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit() + +//! \brief Load OpenCL dynamic library and set function entry points +int clewInit (const char*); +//! \brief Convert an OpenCL error code to its string equivalent +const char* clewErrorString (cl_int error); + +#ifdef __cplusplus +} +#endif + +#endif // CLCC_CLEW_HPP_INCLUDED diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index d7b06a78322..79f94c77dde 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1432,7 +1432,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree) ntreeCompositTagRender(re->scene); ntreeCompositTagAnimated(ntree); - ntreeCompositExecTree(ntree, &re->r, G.background==0); + ntreeCompositExecTree(ntree, &re->r, 1, G.background==0); } /* ensure we get either composited result or the active layer */ @@ -1596,7 +1596,7 @@ static void do_render_composite_fields_blur_3d(Render *re) if (re->r.scemode & R_FULL_SAMPLE) do_merge_fullsample(re, ntree); else { - ntreeCompositExecTree(ntree, &re->r, G.background==0); + ntreeCompositExecTree(ntree, &re->r, 1, G.background==0); } ntree->stats_draw= NULL; diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 6638cef32b2..87e51a0233c 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -518,6 +518,9 @@ struct DualConMesh *dualcon(const struct DualConMesh *input_mesh, struct CCLDeviceInfo; struct CCLDeviceInfo *CCL_compute_device_list(int opencl) { return NULL; } +/* compositor */ +void COM_execute(bNodeTree *editingtree, int rendering) {} + char blender_path[] = ""; #endif // WITH_GAMEENGINE diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 68cc2854749..d76c2071dca 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -38,6 +38,7 @@ blender_include_dirs( ../blender/makesdna ../blender/gpu ../blender/windowmanager + ../blender/opencl ) if(WIN32) @@ -910,6 +911,8 @@ endif() cycles_kernel cycles_util cycles_subd + bf_compositor #added for opencl compositor + bf_opencl #added for opencl compositor ) if(WITH_LIBMV) From a00cc81efb86921cb5c5db71c79528ec2c28d7a6 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 17 May 2012 12:59:34 +0000 Subject: [PATCH 002/159] readfile.c Style Cleanup: Whitespace, while -> for, etc. (3rd time lucky!) --- source/blender/blenloader/intern/readfile.c | 4434 +++++++++---------- 1 file changed, 2208 insertions(+), 2226 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2e023868e45..20f53afd69e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -147,9 +147,6 @@ #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 #include "BLO_readfile.h" #include "BLO_undofile.h" @@ -263,18 +260,18 @@ static void convert_tface_mt(FileData *fd, Main *main); static void BKE_reportf_wrap(ReportList *reports, ReportType type, const char *format, ...) { char fixed_buf[1024]; /* should be long enough */ - + va_list args; - + va_start(args, format); vsnprintf(fixed_buf, sizeof(fixed_buf), format, args); va_end(args); - + fixed_buf[sizeof(fixed_buf) - 1] = '\0'; - + BKE_report(reports, type, fixed_buf); - - if (G.background==0) { + + if (G.background == 0) { printf("%s\n", fixed_buf); } } @@ -283,8 +280,8 @@ static OldNewMap *oldnewmap_new(void) { OldNewMap *onm= MEM_callocN(sizeof(*onm), "OldNewMap"); - onm->entriessize= 1024; - onm->entries= MEM_mallocN(sizeof(*onm->entries)*onm->entriessize, "OldNewMap.entries"); + onm->entriessize = 1024; + onm->entries = MEM_mallocN(sizeof(*onm->entries)*onm->entriessize, "OldNewMap.entries"); return onm; } @@ -293,8 +290,8 @@ static int verg_oldnewmap(const void *v1, const void *v2) { const struct OldNew *x1=v1, *x2=v2; - if ( x1->old > x2->old) return 1; - else if ( x1->old < x2->old) return -1; + if (x1->old > x2->old) return 1; + else if (x1->old < x2->old) return -1; return 0; } @@ -302,31 +299,31 @@ static int verg_oldnewmap(const void *v1, const void *v2) static void oldnewmap_sort(FileData *fd) { qsort(fd->libmap->entries, fd->libmap->nentries, sizeof(OldNew), verg_oldnewmap); - fd->libmap->sorted= 1; + fd->libmap->sorted = 1; } /* nr is zero for data, and ID code for libdata */ static void oldnewmap_insert(OldNewMap *onm, void *oldaddr, void *newaddr, int nr) { OldNew *entry; - + if (oldaddr==NULL || newaddr==NULL) return; - if (onm->nentries==onm->entriessize) { - int osize= onm->entriessize; - OldNew *oentries= onm->entries; - - onm->entriessize*= 2; - onm->entries= MEM_mallocN(sizeof(*onm->entries)*onm->entriessize, "OldNewMap.entries"); - + if (onm->nentries == onm->entriessize) { + int osize = onm->entriessize; + OldNew *oentries = onm->entries; + + onm->entriessize *= 2; + onm->entries = MEM_mallocN(sizeof(*onm->entries)*onm->entriessize, "OldNewMap.entries"); + memcpy(onm->entries, oentries, sizeof(*oentries)*osize); MEM_freeN(oentries); } - entry= &onm->entries[onm->nentries++]; - entry->old= oldaddr; - entry->newp= newaddr; - entry->nr= nr; + entry = &onm->entries[onm->nentries++]; + entry->old = oldaddr; + entry->newp = newaddr; + entry->nr = nr; } void blo_do_versions_oldnewmap_insert(OldNewMap *onm, void *oldaddr, void *newaddr, int nr) @@ -337,29 +334,29 @@ void blo_do_versions_oldnewmap_insert(OldNewMap *onm, void *oldaddr, void *newad static void *oldnewmap_lookup_and_inc(OldNewMap *onm, void *addr) { int i; - - if (addr==NULL) return NULL; - - if (onm->lasthitnentries-1) { - OldNew *entry= &onm->entries[++onm->lasthit]; - - if (entry->old==addr) { + + if (addr == NULL) return NULL; + + if (onm->lasthit < onm->nentries-1) { + OldNew *entry = &onm->entries[++onm->lasthit]; + + if (entry->old == addr) { entry->nr++; return entry->newp; } } - - for (i=0; inentries; i++) { - OldNew *entry= &onm->entries[i]; - - if (entry->old==addr) { - onm->lasthit= i; - + + for (i = 0; i < onm->nentries; i++) { + OldNew *entry = &onm->entries[i]; + + if (entry->old == addr) { + onm->lasthit = i; + entry->nr++; return entry->newp; } } - + return NULL; } @@ -368,17 +365,17 @@ static void *oldnewmap_liblookup(OldNewMap *onm, void *addr, void *lib) { int i; - if (addr==NULL) return NULL; + if (addr == NULL) return NULL; /* lasthit works fine for non-libdata, linking there is done in same sequence as writing */ if (onm->sorted) { OldNew entry_s, *entry; - entry_s.old= addr; + entry_s.old = addr; - entry= bsearch(&entry_s, onm->entries, onm->nentries, sizeof(OldNew), verg_oldnewmap); + entry = bsearch(&entry_s, onm->entries, onm->nentries, sizeof(OldNew), verg_oldnewmap); if (entry) { - ID *id= entry->newp; + ID *id = entry->newp; if (id && (!lib || id->lib)) { return entry->newp; @@ -386,12 +383,12 @@ static void *oldnewmap_liblookup(OldNewMap *onm, void *addr, void *lib) } } - for (i=0; inentries; i++) { - OldNew *entry= &onm->entries[i]; - - if (entry->old==addr) { - ID *id= entry->newp; - + for (i = 0; i < onm->nentries; i++) { + OldNew *entry = &onm->entries[i]; + + if (entry->old == addr) { + ID *id = entry->newp; + if (id && (!lib || id->lib)) { return entry->newp; } @@ -405,19 +402,19 @@ static void oldnewmap_free_unused(OldNewMap *onm) { int i; - for (i=0; inentries; i++) { - OldNew *entry= &onm->entries[i]; - if (entry->nr==0) { + for (i = 0; i < onm->nentries; i++) { + OldNew *entry = &onm->entries[i]; + if (entry->nr == 0) { MEM_freeN(entry->newp); - entry->newp= NULL; + entry->newp = NULL; } } } static void oldnewmap_clear(OldNewMap *onm) { - onm->nentries= 0; - onm->lasthit= 0; + onm->nentries = 0; + onm->lasthit = 0; } static void oldnewmap_free(OldNewMap *onm) @@ -436,9 +433,9 @@ static void add_main_to_main(Main *mainvar, Main *from) { ListBase *lbarray[MAX_LIBARRAY], *fromarray[MAX_LIBARRAY]; int a; - + set_listbasepointers(mainvar, lbarray); - a= set_listbasepointers(from, fromarray); + a = set_listbasepointers(from, fromarray); while (a--) { BLI_movelisttolist(lbarray[a], fromarray[a]); } @@ -448,9 +445,8 @@ void blo_join_main(ListBase *mainlist) { Main *tojoin, *mainl; - - mainl= mainlist->first; - while ((tojoin= mainl->next)) { + mainl = mainlist->first; + while ((tojoin = mainl->next)) { add_main_to_main(mainl, tojoin); BLI_remlink(mainlist, tojoin); MEM_freeN(tojoin); @@ -462,24 +458,24 @@ static void split_libdata(ListBase *lb, Main *first) ListBase *lbn; ID *id, *idnext; Main *mainvar; - - id= lb->first; + + id = lb->first; while (id) { - idnext= id->next; + idnext = id->next; if (id->lib) { - mainvar= first; + mainvar = first; while (mainvar) { - if (mainvar->curlib==id->lib) { + if (mainvar->curlib == id->lib) { lbn= which_libbase(mainvar, GS(id->name)); BLI_remlink(lb, id); BLI_addtail(lbn, id); break; } - mainvar= mainvar->next; + mainvar = mainvar->next; } - if (mainvar==NULL) printf("error split_libdata\n"); + if (mainvar == NULL) printf("error split_libdata\n"); } - id= idnext; + id = idnext; } } @@ -488,20 +484,20 @@ void blo_split_main(ListBase *mainlist, Main *main) ListBase *lbarray[MAX_LIBARRAY]; Library *lib; int i; - - mainlist->first= mainlist->last= main; - main->next= NULL; - - if (main->library.first==NULL) + + mainlist->first = mainlist->last = main; + main->next = NULL; + + if (main->library.first == NULL) return; - for (lib= main->library.first; lib; lib= lib->id.next) { - Main *libmain= MEM_callocN(sizeof(Main), "libmain"); - libmain->curlib= lib; + for (lib = main->library.first; lib; lib = lib->id.next) { + Main *libmain = MEM_callocN(sizeof(Main), "libmain"); + libmain->curlib = lib; BLI_addtail(mainlist, libmain); } - - i= set_listbasepointers(main, lbarray); + + i = set_listbasepointers(main, lbarray); while (i--) split_libdata(lbarray[i], main->next); } @@ -521,7 +517,7 @@ static void read_file_version(FileData *fd, Main *main) BHead *bhead; for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { - if (bhead->code==GLOB) { + if (bhead->code == GLOB) { FileGlobal *fg= read_struct(fd, bhead, "Global"); if (fg) { main->subversionfile= fg->subversion; @@ -529,7 +525,7 @@ static void read_file_version(FileData *fd, Main *main) main->minsubversionfile= fg->minsubversion; MEM_freeN(fg); } - else if (bhead->code==ENDB) + else if (bhead->code == ENDB) break; } } @@ -546,24 +542,24 @@ static Main *blo_find_main(FileData *fd, ListBase *mainlist, const char *filepat cleanup_path(relabase, name1); // printf("blo_find_main: original in %s\n", name); // printf("blo_find_main: converted to %s\n", name1); - - for (m= mainlist->first; m; m= m->next) { - char *libname= (m->curlib)?m->curlib->filepath:m->name; + + for (m = mainlist->first; m; m = m->next) { + char *libname = (m->curlib) ? m->curlib->filepath : m->name; if (BLI_path_cmp(name1, libname) == 0) { if (G.debug & G_DEBUG) printf("blo_find_main: found library %s\n", libname); return m; } } - - m= MEM_callocN(sizeof(Main), "find_main"); + + m = MEM_callocN(sizeof(Main), "find_main"); BLI_addtail(mainlist, m); - - lib= BKE_libblock_alloc(&m->library, ID_LI, "lib"); + + lib = BKE_libblock_alloc(&m->library, ID_LI, "lib"); BLI_strncpy(lib->name, filepath, sizeof(lib->name)); BLI_strncpy(lib->filepath, name1, sizeof(lib->filepath)); - m->curlib= lib; + m->curlib = lib; read_file_version(fd, m); @@ -577,8 +573,8 @@ static Main *blo_find_main(FileData *fd, ListBase *mainlist, const char *filepat static void switch_endian_bh4(BHead4 *bhead) { /* the ID_.. codes */ - if ((bhead->code & 0xFFFF)==0) bhead->code >>=16; - + if ((bhead->code & 0xFFFF)==0) bhead->code >>= 16; + if (bhead->code != ENDB) { SWITCH_INT(bhead->len); SWITCH_INT(bhead->SDNAnr); @@ -589,8 +585,8 @@ static void switch_endian_bh4(BHead4 *bhead) static void switch_endian_bh8(BHead8 *bhead) { /* the ID_.. codes */ - if ((bhead->code & 0xFFFF)==0) bhead->code >>=16; - + if ((bhead->code & 0xFFFF)==0) bhead->code >>= 16; + if (bhead->code != ENDB) { SWITCH_INT(bhead->len); SWITCH_INT(bhead->SDNAnr); @@ -607,37 +603,37 @@ static void bh4_from_bh8(BHead *bhead, BHead8 *bhead8, int do_endian_swap) long long old; #endif - bhead4->code= bhead8->code; - bhead4->len= bhead8->len; + bhead4->code = bhead8->code; + bhead4->len = bhead8->len; if (bhead4->code != ENDB) { - - //perform a endian swap on 64bit pointers, otherwise the pointer might map to zero - //0x0000000000000000000012345678 would become 0x12345678000000000000000000000000 + /* perform a endian swap on 64bit pointers, otherwise the pointer might map to zero + * 0x0000000000000000000012345678 would become 0x12345678000000000000000000000000 + */ if (do_endian_swap) { SWITCH_LONGINT(bhead8->old); } - + /* this patch is to avoid a long long being read from not-eight aligned positions * is necessary on any modern 64bit architecture) */ memcpy(&old, &bhead8->old, 8); bhead4->old = (int) (old >> 3); - - bhead4->SDNAnr= bhead8->SDNAnr; - bhead4->nr= bhead8->nr; + + bhead4->SDNAnr = bhead8->SDNAnr; + bhead4->nr = bhead8->nr; } } static void bh8_from_bh4(BHead *bhead, BHead4 *bhead4) { BHead8 *bhead8 = (BHead8 *) bhead; - - bhead8->code= bhead4->code; - bhead8->len= bhead4->len; - + + bhead8->code = bhead4->code; + bhead8->len = bhead4->len; + if (bhead8->code != ENDB) { - bhead8->old= bhead4->old; - bhead8->SDNAnr= bhead4->SDNAnr; + bhead8->old = bhead4->old; + bhead8->SDNAnr = bhead4->SDNAnr; bhead8->nr= bhead4->nr; } } @@ -648,29 +644,29 @@ static BHeadN *get_bhead(FileData *fd) int readsize; if (fd) { - if ( ! fd->eof) { + if (!fd->eof) { /* initializing to zero isn't strictly needed but shuts valgrind up * since uninitialized memory gets compared */ - BHead8 bhead8= {0}; - BHead4 bhead4= {0}; - BHead bhead= {0}; + BHead8 bhead8 = {0}; + BHead4 bhead4 = {0}; + BHead bhead = {0}; - // First read the bhead structure. - // Depending on the platform the file was written on this can - // be a big or little endian BHead4 or BHead8 structure. - - // As usual 'ENDB' (the last *partial* bhead of the file) - // needs some special handling. We don't want to EOF just yet. - + /* First read the bhead structure. + * Depending on the platform the file was written on this can + * be a big or little endian BHead4 or BHead8 structure. + * + * As usual 'ENDB' (the last *partial* bhead of the file) + * needs some special handling. We don't want to EOF just yet. + */ if (fd->flags & FD_FLAGS_FILE_POINTSIZE_IS_4) { bhead4.code = DATA; readsize = fd->read(fd, &bhead4, sizeof(bhead4)); - + if (readsize == sizeof(bhead4) || bhead4.code == ENDB) { if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { switch_endian_bh4(&bhead4); } - + if (fd->flags & FD_FLAGS_POINTSIZE_DIFFERS) { bh8_from_bh4(&bhead, &bhead4); } @@ -686,12 +682,12 @@ static BHeadN *get_bhead(FileData *fd) else { bhead8.code = DATA; readsize = fd->read(fd, &bhead8, sizeof(bhead8)); - + if (readsize == sizeof(bhead8) || bhead8.code == ENDB) { if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { switch_endian_bh8(&bhead8); } - + if (fd->flags & FD_FLAGS_POINTSIZE_DIFFERS) { bh4_from_bh8(&bhead, &bhead8, (fd->flags & FD_FLAGS_SWITCH_ENDIAN)); } @@ -704,21 +700,21 @@ static BHeadN *get_bhead(FileData *fd) bhead.len= 0; } } - + /* make sure people are not trying to pass bad blend files */ if (bhead.len < 0) fd->eof = 1; - - // bhead now contains the (converted) bhead structure. Now read - // the associated data and put everything in a BHeadN (creative naming !) - - if ( ! fd->eof) { + + /* bhead now contains the (converted) bhead structure. Now read + * the associated data and put everything in a BHeadN (creative naming !) + */ + if (!fd->eof) { new_bhead = MEM_mallocN(sizeof(BHeadN) + bhead.len, "new_bhead"); if (new_bhead) { new_bhead->next = new_bhead->prev = NULL; new_bhead->bhead = bhead; - + readsize = fd->read(fd, new_bhead + 1, bhead.len); - + if (readsize != bhead.len) { fd->eof = 1; MEM_freeN(new_bhead); @@ -732,13 +728,13 @@ static BHeadN *get_bhead(FileData *fd) } } - // We've read a new block. Now add it to the list - // of blocks. - + /* We've read a new block. Now add it to the list + * of blocks. + */ if (new_bhead) { BLI_addtail(&fd->listbase, new_bhead); } - + return(new_bhead); } @@ -746,53 +742,53 @@ BHead *blo_firstbhead(FileData *fd) { BHeadN *new_bhead; BHead *bhead = NULL; - - // Rewind the file - // Read in a new block if necessary - + + /* Rewind the file + * Read in a new block if necessary + */ new_bhead = fd->listbase.first; if (new_bhead == NULL) { new_bhead = get_bhead(fd); } - + if (new_bhead) { bhead = &new_bhead->bhead; } - + return(bhead); } BHead *blo_prevbhead(FileData *UNUSED(fd), BHead *thisblock) { - BHeadN *bheadn= (BHeadN *) (((char *) thisblock) - GET_INT_FROM_POINTER( &((BHeadN*)0)->bhead) ); - BHeadN *prev= bheadn->prev; - - return prev?&prev->bhead:NULL; + BHeadN *bheadn = (BHeadN *) (((char *) thisblock) - GET_INT_FROM_POINTER( &((BHeadN*)0)->bhead) ); + BHeadN *prev = bheadn->prev; + + return (prev) ? &prev->bhead : NULL; } BHead *blo_nextbhead(FileData *fd, BHead *thisblock) { BHeadN *new_bhead = NULL; BHead *bhead = NULL; - + if (thisblock) { // bhead is actually a sub part of BHeadN // We calculate the BHeadN pointer from the BHead pointer below new_bhead = (BHeadN *) (((char *) thisblock) - GET_INT_FROM_POINTER( &((BHeadN*)0)->bhead) ); - + // get the next BHeadN. If it doesn't exist we read in the next one new_bhead = new_bhead->next; if (new_bhead == NULL) { new_bhead = get_bhead(fd); } } - + if (new_bhead) { // here we do the reverse: // go from the BHeadN pointer to the BHead pointer bhead = &new_bhead->bhead; } - + return(bhead); } @@ -800,17 +796,17 @@ static void decode_blender_header(FileData *fd) { char header[SIZEOFBLENDERHEADER], num[4]; int readsize; - - // read in the header data + + /* read in the header data */ readsize = fd->read(fd, header, sizeof(header)); - + if (readsize == sizeof(header)) { if (strncmp(header, "BLENDER", 7) == 0) { - int remove_this_endian_test= 1; - + int remove_this_endian_test = 1; + fd->flags |= FD_FLAGS_FILE_OK; - - // what size are pointers in the file ? + + /* what size are pointers in the file ? */ if (header[7]=='_') { fd->flags |= FD_FLAGS_FILE_POINTSIZE_IS_4; if (sizeof(void *) != 4) { @@ -822,16 +818,16 @@ static void decode_blender_header(FileData *fd) fd->flags |= FD_FLAGS_POINTSIZE_DIFFERS; } } - - // is the file saved in a different endian - // than we need ? + + /* is the file saved in a different endian + * than we need ? + */ if (((((char*)&remove_this_endian_test)[0]==1)?L_ENDIAN:B_ENDIAN) != ((header[8]=='v')?L_ENDIAN:B_ENDIAN)) { fd->flags |= FD_FLAGS_SWITCH_ENDIAN; } - - // get the version number - - memcpy(num, header+9, 3); + + /* get the version number */ + memcpy(num, header + 9, 3); num[3] = 0; fd->fileversion = atoi(num); } @@ -841,115 +837,114 @@ static void decode_blender_header(FileData *fd) static int read_file_dna(FileData *fd) { BHead *bhead; - - for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { - if (bhead->code==DNA1) { - int do_endian_swap= (fd->flags&FD_FLAGS_SWITCH_ENDIAN)?1:0; - - fd->filesdna= DNA_sdna_from_data(&bhead[1], bhead->len, do_endian_swap); + + for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) { + if (bhead->code == DNA1) { + int do_endian_swap = (fd->flags & FD_FLAGS_SWITCH_ENDIAN) ? 1 : 0; + + fd->filesdna = DNA_sdna_from_data(&bhead[1], bhead->len, do_endian_swap); if (fd->filesdna) { - - fd->compflags= DNA_struct_get_compareflags(fd->filesdna, fd->memsdna); + fd->compflags = DNA_struct_get_compareflags(fd->filesdna, fd->memsdna); /* used to retrieve ID names from (bhead+1) */ - fd->id_name_offs= DNA_elem_offset(fd->filesdna, "ID", "char", "name[]"); + fd->id_name_offs = DNA_elem_offset(fd->filesdna, "ID", "char", "name[]"); } - + return 1; } - else if (bhead->code==ENDB) + else if (bhead->code == ENDB) break; } - + return 0; } static int fd_read_from_file(FileData *filedata, void *buffer, unsigned int size) { int readsize = read(filedata->filedes, buffer, size); - + if (readsize < 0) { readsize = EOF; } else { filedata->seek += readsize; } - - return (readsize); + + return readsize; } static int fd_read_gzip_from_file(FileData *filedata, void *buffer, unsigned int size) { int readsize = gzread(filedata->gzfiledes, buffer, size); - + if (readsize < 0) { readsize = EOF; } else { filedata->seek += readsize; } - + return (readsize); } static int fd_read_from_memory(FileData *filedata, void *buffer, unsigned int size) { - // don't read more bytes then there are available in the buffer + /* don't read more bytes then there are available in the buffer */ int readsize = (int)MIN2(size, (unsigned int)(filedata->buffersize - filedata->seek)); - + memcpy(buffer, filedata->buffer + filedata->seek, readsize); filedata->seek += readsize; - + return (readsize); } static int fd_read_from_memfile(FileData *filedata, void *buffer, unsigned int size) { - static unsigned int seek= 1<<30; /* the current position */ - static unsigned int offset= 0; /* size of previous chunks */ - static MemFileChunk *chunk=NULL; + static unsigned int seek = (1<<30); /* the current position */ + static unsigned int offset = 0; /* size of previous chunks */ + static MemFileChunk *chunk = NULL; unsigned int chunkoffset, readsize, totread; - if (size==0) return 0; + if (size == 0) return 0; if (seek != (unsigned int)filedata->seek) { - chunk= filedata->memfile->chunks.first; - seek= 0; + chunk = filedata->memfile->chunks.first; + seek = 0; while (chunk) { if (seek + chunk->size > (unsigned) filedata->seek) break; - seek+= chunk->size; - chunk= chunk->next; + seek += chunk->size; + chunk = chunk->next; } - offset= seek; - seek= filedata->seek; + offset = seek; + seek = filedata->seek; } if (chunk) { - totread= 0; - + totread = 0; + do { /* first check if it's on the end if current chunk */ if (seek-offset == chunk->size) { - offset+= chunk->size; - chunk= chunk->next; + offset += chunk->size; + chunk = chunk->next; } - + /* debug, should never happen */ - if (chunk==NULL) { + if (chunk == NULL) { printf("illegal read, chunk zero\n"); return 0; } - - chunkoffset= seek-offset; - readsize= size-totread; - + + chunkoffset = seek-offset; + readsize = size-totread; + /* data can be spread over multiple chunks, so clamp size * to within this chunk, and then it will read further in * the next chunk */ if (chunkoffset+readsize > chunk->size) readsize= chunk->size-chunkoffset; - - memcpy((char*)buffer+totread, chunk->buf+chunkoffset, readsize); + + memcpy((char*)buffer + totread, chunk->buf + chunkoffset, readsize); totread += readsize; filedata->seek += readsize; seek += readsize; @@ -957,47 +952,47 @@ static int fd_read_from_memfile(FileData *filedata, void *buffer, unsigned int s return totread; } - + return 0; } static FileData *filedata_new(void) { FileData *fd = MEM_callocN(sizeof(FileData), "FileData"); - + fd->filedes = -1; fd->gzfiledes = NULL; - + /* XXX, this doesn't need to be done all the time, * but it keeps us re-entrant, remove once we have * a lib that provides a nice lock. - zr */ fd->memsdna = DNA_sdna_from_data(DNAstr, DNAlen, 0); - + fd->datamap = oldnewmap_new(); fd->globmap = oldnewmap_new(); fd->libmap = oldnewmap_new(); - + return fd; } static FileData *blo_decode_and_check(FileData *fd, ReportList *reports) { decode_blender_header(fd); - + if (fd->flags & FD_FLAGS_FILE_OK) { if (!read_file_dna(fd)) { BKE_reportf(reports, RPT_ERROR, "Failed to read blend file: \"%s\", incomplete", fd->relabase); blo_freefiledata(fd); - fd= NULL; + fd = NULL; } } else { BKE_reportf(reports, RPT_ERROR, "Failed to read blend file: \"%s\", not a blend file", fd->relabase); blo_freefiledata(fd); - fd= NULL; + fd = NULL; } - + return fd; } @@ -1006,9 +1001,9 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports) FileData *blo_openblenderfile(const char *filepath, ReportList *reports) { gzFile gzfile; - errno= 0; - gzfile= BLI_gzopen(filepath, "rb"); - + errno = 0; + gzfile = BLI_gzopen(filepath, "rb"); + if (gzfile == (gzFile)Z_NULL) { BKE_reportf(reports, RPT_ERROR, "Unable to open \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error reading file"); return NULL; @@ -1017,10 +1012,10 @@ FileData *blo_openblenderfile(const char *filepath, ReportList *reports) FileData *fd = filedata_new(); fd->gzfiledes = gzfile; fd->read = fd_read_gzip_from_file; - + /* needed for library_append and read_libraries */ BLI_strncpy(fd->relabase, filepath, sizeof(fd->relabase)); - + return blo_decode_and_check(fd, reports); } } @@ -1032,12 +1027,12 @@ FileData *blo_openblendermemory(void *mem, int memsize, ReportList *reports) return NULL; } else { - FileData *fd= filedata_new(); - fd->buffer= mem; - fd->buffersize= memsize; - fd->read= fd_read_from_memory; - fd->flags|= FD_FLAGS_NOT_MY_BUFFER; - + FileData *fd = filedata_new(); + fd->buffer = mem; + fd->buffersize = memsize; + fd->read = fd_read_from_memory; + fd->flags |= FD_FLAGS_NOT_MY_BUFFER; + return blo_decode_and_check(fd, reports); } } @@ -1049,12 +1044,12 @@ FileData *blo_openblendermemfile(MemFile *memfile, ReportList *reports) return NULL; } else { - FileData *fd= filedata_new(); - fd->memfile= memfile; - - fd->read= fd_read_from_memfile; - fd->flags|= FD_FLAGS_NOT_MY_BUFFER; - + FileData *fd = filedata_new(); + fd->memfile = memfile; + + fd->read = fd_read_from_memfile; + fd->flags |= FD_FLAGS_NOT_MY_BUFFER; + return blo_decode_and_check(fd, reports); } } @@ -1063,30 +1058,29 @@ FileData *blo_openblendermemfile(MemFile *memfile, ReportList *reports) void blo_freefiledata(FileData *fd) { if (fd) { - if (fd->filedes != -1) { close(fd->filedes); } - + if (fd->gzfiledes != NULL) { gzclose(fd->gzfiledes); } - + if (fd->buffer && !(fd->flags & FD_FLAGS_NOT_MY_BUFFER)) { MEM_freeN(fd->buffer); fd->buffer = NULL; } - + // Free all BHeadN data blocks BLI_freelistN(&fd->listbase); - + if (fd->memsdna) DNA_sdna_free(fd->memsdna); if (fd->filesdna) DNA_sdna_free(fd->filesdna); if (fd->compflags) MEM_freeN(fd->compflags); - + if (fd->datamap) oldnewmap_free(fd->datamap); if (fd->globmap) @@ -1108,7 +1102,9 @@ void blo_freefiledata(FileData *fd) int BLO_has_bfile_extension(const char *str) { - return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend") || BLI_testextensie(str, ".blend.gz")); + return (BLI_testextensie(str, ".ble") || + BLI_testextensie(str, ".blend") || + BLI_testextensie(str, ".blend.gz")); } int BLO_is_a_library(const char *path, char *dir, char *group) @@ -1120,32 +1116,32 @@ int BLO_is_a_library(const char *path, char *dir, char *group) char *fd; strcpy(dir, path); - len= strlen(dir); - if (len<7) return 0; - if ( dir[len-1] != '/' && dir[len-1] != '\\') return 0; + len = strlen(dir); + if (len < 7) return 0; + if ((dir[len - 1] != '/') && (dir[len - 1] != '\\')) return 0; - group[0]= 0; - dir[len-1]= 0; + group[0] = '\0'; + dir[len - 1] = '\0'; /* Find the last slash */ - fd= BLI_last_slash(dir); + fd = BLI_last_slash(dir); - if (fd==NULL) return 0; - *fd= 0; + if (fd == NULL) return 0; + *fd = 0; if (BLO_has_bfile_extension(fd+1)) { /* the last part of the dir is a .blend file, no group follows */ - *fd= '/'; /* put back the removed slash separating the dir and the .blend file name */ + *fd = '/'; /* put back the removed slash separating the dir and the .blend file name */ } else { - char *gp = fd+1; // in case we have a .blend file, gp points to the group - + char *gp = fd + 1; // in case we have a .blend file, gp points to the group + /* Find the last slash */ - fd= BLI_last_slash(dir); + fd = BLI_last_slash(dir); if (!fd || !BLO_has_bfile_extension(fd+1)) return 0; - + /* now we know that we are in a blend file and it is safe to * assume that gp actually points to a group */ - if (strcmp("Screen", gp)!=0) + if (strcmp("Screen", gp) != 0) BLI_strncpy(group, gp, GROUP_MAX); } return 1; @@ -1190,11 +1186,11 @@ void *blo_do_versions_newlibadr(FileData *fd, void *lib, void *adr) /* only lib static void *newlibadr_us(FileData *fd, void *lib, void *adr) /* increases user number */ { - ID *id= newlibadr(fd, lib, adr); - + ID *id = newlibadr(fd, lib, adr); + if (id) id->us++; - + return id; } @@ -1207,12 +1203,12 @@ static void change_idid_adr_fd(FileData *fd, void *old, void *new) { int i; - for (i=0; ilibmap->nentries; i++) { - OldNew *entry= &fd->libmap->entries[i]; + for (i = 0; i < fd->libmap->nentries; i++) { + OldNew *entry = &fd->libmap->entries[i]; if (old==entry->newp && entry->nr==ID_ID) { - entry->newp= new; - if (new) entry->nr= GS( ((ID *)new)->name ); + entry->newp = new; + if (new) entry->nr = GS( ((ID *)new)->name ); break; } } @@ -1222,11 +1218,13 @@ static void change_idid_adr(ListBase *mainlist, FileData *basefd, void *old, voi { Main *mainptr; - for (mainptr= mainlist->first; mainptr; mainptr= mainptr->next) { + for (mainptr = mainlist->first; mainptr; mainptr = mainptr->next) { FileData *fd; - if (mainptr->curlib) fd= mainptr->curlib->filedata; - else fd= basefd; + if (mainptr->curlib) + fd = mainptr->curlib->filedata; + else + fd = basefd; if (fd) { change_idid_adr_fd(fd, old, new); @@ -1240,35 +1238,36 @@ static void change_idid_adr(ListBase *mainlist, FileData *basefd, void *old, voi * if the local object still exists */ void blo_clear_proxy_pointers_from_lib(Main *oldmain) { - Object *ob= oldmain->object.first; + Object *ob = oldmain->object.first; - for (;ob; ob= ob->id.next) + for (; ob; ob= ob->id.next) { if (ob->id.lib) - ob->proxy_from= NULL; + ob->proxy_from = NULL; + } } void blo_make_image_pointer_map(FileData *fd, Main *oldmain) { - Image *ima= oldmain->image.first; - Scene *sce= oldmain->scene.first; + Image *ima = oldmain->image.first; + Scene *sce = oldmain->scene.first; int a; - fd->imamap= oldnewmap_new(); + fd->imamap = oldnewmap_new(); - for (;ima; ima= ima->id.next) { - Link *ibuf= ima->ibufs.first; + for (;ima; ima = ima->id.next) { + Link *ibuf = ima->ibufs.first; for (; ibuf; ibuf= ibuf->next) oldnewmap_insert(fd->imamap, ibuf, ibuf, 0); if (ima->gputexture) oldnewmap_insert(fd->imamap, ima->gputexture, ima->gputexture, 0); - for (a=0; arenders[a]) oldnewmap_insert(fd->imamap, ima->renders[a], ima->renders[a], 0); } for (; sce; sce= sce->id.next) { if (sce->nodetree) { bNode *node; - for (node= sce->nodetree->nodes.first; node; node= node->next) + for (node = sce->nodetree->nodes.first; node; node = node->next) oldnewmap_insert(fd->imamap, node->preview, node->preview, 0); } } @@ -1278,63 +1277,63 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain) /* this works because freeing old main only happens after this call */ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) { - OldNew *entry= fd->imamap->entries; - Image *ima= oldmain->image.first; - Scene *sce= oldmain->scene.first; + OldNew *entry = fd->imamap->entries; + Image *ima = oldmain->image.first; + Scene *sce = oldmain->scene.first; int i; /* used entries were restored, so we put them to zero */ - for (i=0; iimamap->nentries; i++, entry++) { - if (entry->nr>0) - entry->newp= NULL; + for ( i= 0; i < fd->imamap->nentries; i++, entry++) { + if (entry->nr > 0) + entry->newp = NULL; } - for (;ima; ima= ima->id.next) { + for (; ima; ima= ima->id.next) { Link *ibuf, *next; /* this mirrors direct_link_image */ - for (ibuf= ima->ibufs.first; ibuf; ibuf= next) { - next= ibuf->next; - if (NULL==newimaadr(fd, ibuf)) { /* so was restored */ + for (ibuf = ima->ibufs.first; ibuf; ibuf = next) { + next = ibuf->next; + if (NULL == newimaadr(fd, ibuf)) { /* so was restored */ BLI_remlink(&ima->ibufs, ibuf); - ima->bindcode= 0; - ima->gputexture= NULL; + ima->bindcode = 0; + ima->gputexture = NULL; } } - for (i=0; irenders[i]= newimaadr(fd, ima->renders[i]); - - ima->gputexture= newimaadr(fd, ima->gputexture); + for (i = 0; i < IMA_MAX_RENDER_SLOT; i++) + ima->renders[i] = newimaadr(fd, ima->renders[i]); + + ima->gputexture = newimaadr(fd, ima->gputexture); } - for (; sce; sce= sce->id.next) { + for (; sce; sce = sce->id.next) { if (sce->nodetree) { bNode *node; - for (node= sce->nodetree->nodes.first; node; node= node->next) - node->preview= newimaadr(fd, node->preview); + for (node = sce->nodetree->nodes.first; node; node = node->next) + node->preview = newimaadr(fd, node->preview); } } } void blo_make_movieclip_pointer_map(FileData *fd, Main *oldmain) { - MovieClip *clip= oldmain->movieclip.first; - Scene *sce= oldmain->scene.first; - - fd->movieclipmap= oldnewmap_new(); - + MovieClip *clip = oldmain->movieclip.first; + Scene *sce = oldmain->scene.first; + + fd->movieclipmap = oldnewmap_new(); + for (;clip; clip= clip->id.next) { if (clip->cache) oldnewmap_insert(fd->movieclipmap, clip->cache, clip->cache, 0); - + if (clip->tracking.camera.intrinsics) oldnewmap_insert(fd->movieclipmap, clip->tracking.camera.intrinsics, clip->tracking.camera.intrinsics, 0); } - - for (; sce; sce= sce->id.next) { + + for (; 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_MOVIEDISTORTION) + for (node = sce->nodetree->nodes.first; node; node= node->next) + if (node->type == CMP_NODE_MOVIEDISTORTION) oldnewmap_insert(fd->movieclipmap, node->storage, node->storage, 0); } } @@ -1344,28 +1343,28 @@ void blo_make_movieclip_pointer_map(FileData *fd, Main *oldmain) /* this works because freeing old main only happens after this call */ void blo_end_movieclip_pointer_map(FileData *fd, Main *oldmain) { - OldNew *entry= fd->movieclipmap->entries; - MovieClip *clip= oldmain->movieclip.first; - Scene *sce= oldmain->scene.first; + OldNew *entry = fd->movieclipmap->entries; + MovieClip *clip = oldmain->movieclip.first; + Scene *sce = oldmain->scene.first; int i; - + /* used entries were restored, so we put them to zero */ - for (i=0; imovieclipmap->nentries; i++, entry++) { - if (entry->nr>0) - entry->newp= NULL; + for (i=0; i < fd->movieclipmap->nentries; i++, entry++) { + if (entry->nr > 0) + entry->newp = NULL; } - - for (;clip; clip= clip->id.next) { - clip->cache= newmclipadr(fd, clip->cache); - clip->tracking.camera.intrinsics= newmclipadr(fd, clip->tracking.camera.intrinsics); + + for (; clip; clip = clip->id.next) { + clip->cache = newmclipadr(fd, clip->cache); + clip->tracking.camera.intrinsics = newmclipadr(fd, clip->tracking.camera.intrinsics); } - - for (; sce; sce= sce->id.next) { + + for (; 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_MOVIEDISTORTION) - node->storage= newmclipadr(fd, node->storage); + for (node = sce->nodetree->nodes.first; node; node = node->next) + if (node->type == CMP_NODE_MOVIEDISTORTION) + node->storage = newmclipadr(fd, node->storage); } } } @@ -1374,19 +1373,19 @@ void blo_end_movieclip_pointer_map(FileData *fd, Main *oldmain) /* undo file support: add all library pointers in lookup */ void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd) { - Main *ptr= mainlist->first; + Main *ptr = mainlist->first; ListBase *lbarray[MAX_LIBARRAY]; - for (ptr= ptr->next; ptr; ptr= ptr->next) { - int i= set_listbasepointers(ptr, lbarray); + for (ptr = ptr->next; ptr; ptr = ptr->next) { + int i = set_listbasepointers(ptr, lbarray); while (i--) { ID *id; - for (id= lbarray[i]->first; id; id= id->next) + for (id = lbarray[i]->first; id; id = id->next) oldnewmap_insert(fd->libmap, id, id, GS(id->name)); } } } - + /* ********** END OLD POINTERS ****************** */ /* ********** READ FILE ****************** */ @@ -1395,33 +1394,33 @@ static void switch_endian_structs(struct SDNA *filesdna, BHead *bhead) { int blocksize, nblocks; char *data; - - data= (char *)(bhead+1); - blocksize= filesdna->typelens[ filesdna->structs[bhead->SDNAnr][0] ]; - - nblocks= bhead->nr; + + data = (char *)(bhead+1); + blocksize = filesdna->typelens[ filesdna->structs[bhead->SDNAnr][0] ]; + + nblocks = bhead->nr; while (nblocks--) { DNA_struct_switch_endian(filesdna, bhead->SDNAnr, data); - - data+= blocksize; + + data += blocksize; } } static void *read_struct(FileData *fd, BHead *bh, const char *blockname) { - void *temp= NULL; - + void *temp = NULL; + if (bh->len) { /* switch is based on file dna */ if (bh->SDNAnr && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) switch_endian_structs(fd->filesdna, bh); - + if (fd->compflags[bh->SDNAnr]) { /* flag==0: doesn't exist anymore */ - if (fd->compflags[bh->SDNAnr]==2) { - temp= DNA_struct_reconstruct(fd->memsdna, fd->filesdna, fd->compflags, bh->SDNAnr, bh->nr, (bh+1)); + if (fd->compflags[bh->SDNAnr] == 2) { + temp = DNA_struct_reconstruct(fd->memsdna, fd->filesdna, fd->compflags, bh->SDNAnr, bh->nr, (bh+1)); } else { - temp= MEM_mallocN(bh->len, blockname); + temp = MEM_mallocN(bh->len, blockname); memcpy(temp, (bh+1), bh->len); } } @@ -1433,19 +1432,19 @@ static void *read_struct(FileData *fd, BHead *bh, const char *blockname) static void link_list(FileData *fd, ListBase *lb) /* only direct data */ { Link *ln, *prev; - - if (lb->first==NULL) return; - - lb->first= newdataadr(fd, lb->first); - ln= lb->first; - prev= NULL; + + if (lb->first == NULL) return; + + lb->first = newdataadr(fd, lb->first); + ln = lb->first; + prev = NULL; while (ln) { - ln->next= newdataadr(fd, ln->next); - ln->prev= prev; - prev= ln; - ln= ln->next; + ln->next = newdataadr(fd, ln->next); + ln->prev = prev; + prev = ln; + ln = ln->next; } - lb->last= prev; + lb->last = prev; } static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */ @@ -1453,26 +1452,26 @@ static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */ Link *ln, *prev; void *poin; - if (lb->first==NULL) return; - poin= newdataadr(fd, lb->first); + if (lb->first == NULL) return; + poin = newdataadr(fd, lb->first); if (lb->first) { oldnewmap_insert(fd->globmap, lb->first, poin, 0); } - lb->first= poin; - - ln= lb->first; - prev= NULL; + lb->first = poin; + + ln = lb->first; + prev = NULL; while (ln) { - poin= newdataadr(fd, ln->next); + poin = newdataadr(fd, ln->next); if (ln->next) { oldnewmap_insert(fd->globmap, ln->next, poin, 0); } - ln->next= poin; - ln->prev= prev; - prev= ln; - ln= ln->next; + ln->next = poin; + ln->prev = prev; + prev = ln; + ln = ln->next; } - lb->last= prev; + lb->last = prev; } static void test_pointer_array(FileData *fd, void **mat) @@ -1490,29 +1489,29 @@ static void test_pointer_array(FileData *fd, void **mat) * the new dna format. */ if (*mat) { - len= MEM_allocN_len(*mat)/fd->filesdna->pointerlen; - + len = MEM_allocN_len(*mat)/fd->filesdna->pointerlen; + if (fd->filesdna->pointerlen==8 && fd->memsdna->pointerlen==4) { - ipoin=imat= MEM_mallocN(len*4, "newmatar"); + ipoin=imat= MEM_mallocN(len * 4, "newmatar"); lpoin= *mat; - + while (len-- > 0) { if ((fd->flags & FD_FLAGS_SWITCH_ENDIAN)) SWITCH_LONGINT(*lpoin); - *ipoin= (int) ((*lpoin) >> 3); + *ipoin = (int)((*lpoin) >> 3); ipoin++; lpoin++; } MEM_freeN(*mat); - *mat= imat; + *mat = imat; } - + if (fd->filesdna->pointerlen==4 && fd->memsdna->pointerlen==8) { - lpoin=lmat= MEM_mallocN(len*8, "newmatar"); - ipoin= *mat; - + lpoin = lmat = MEM_mallocN(len * 8, "newmatar"); + ipoin = *mat; + while (len-- > 0) { - *lpoin= *ipoin; + *lpoin = *ipoin; ipoin++; lpoin++; } @@ -1531,8 +1530,8 @@ static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData { IDProperty *array; int i; - - /*since we didn't save the extra buffer, set totallen to len.*/ + + /* since we didn't save the extra buffer, set totallen to len */ prop->totallen = prop->len; prop->data.pointer = newdataadr(fd, prop->data.pointer); @@ -1540,13 +1539,13 @@ static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData /* note!, idp-arrays didn't exist in 2.4x, so the pointer will be cleared * theres not really anything we can do to correct this, at least don't crash */ - if (array==NULL) { - prop->len= 0; - prop->totallen= 0; + if (array == NULL) { + prop->len = 0; + prop->totallen = 0; } - - for (i=0; ilen; i++) + + for (i = 0; i < prop->len; i++) IDP_DirectLinkProperty(&array[i], switch_endian, fd); } @@ -1554,29 +1553,29 @@ static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *f { IDProperty **array; int i; - - /*since we didn't save the extra buffer, set totallen to len.*/ + + /* since we didn't save the extra buffer, set totallen to len */ prop->totallen = prop->len; prop->data.pointer = newdataadr(fd, prop->data.pointer); - + if (prop->subtype == IDP_GROUP) { test_pointer_array(fd, prop->data.pointer); - array= prop->data.pointer; - - for (i=0; ilen; i++) + array = prop->data.pointer; + + for (i = 0; i < prop->len; i++) IDP_DirectLinkProperty(array[i], switch_endian, fd); } else if (prop->subtype == IDP_DOUBLE) { if (switch_endian) { - for (i=0; ilen; i++) { - SWITCH_LONGINT(((double*)prop->data.pointer)[i]); + for (i = 0; i < prop->len; i++) { + SWITCH_LONGINT(((double *)prop->data.pointer)[i]); } } } else { if (switch_endian) { - for (i=0; ilen; i++) { - SWITCH_INT(((int*)prop->data.pointer)[i]); + for (i = 0; i < prop->len; i++) { + SWITCH_INT(((int *)prop->data.pointer)[i]); } } } @@ -1593,9 +1592,9 @@ static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, FileData *f { ListBase *lb = &prop->data.group; IDProperty *loop; - + link_list(fd, lb); - + /*Link child id properties now*/ for (loop=prop->data.group.first; loop; loop=loop->next) { IDP_DirectLinkProperty(loop, switch_endian, fd); @@ -1638,7 +1637,7 @@ static void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData } } -/*stub function*/ +/* stub function */ static void IDP_LibLinkProperty(IDProperty *UNUSED(prop), int UNUSED(switch_endian), FileData *UNUSED(fd)) { } @@ -1654,9 +1653,9 @@ static void direct_link_curvemapping(FileData *fd, CurveMapping *cumap) cumap->flag &= ~CUMA_PREMULLED; for (a=0; acm[a].curve= newdataadr(fd, cumap->cm[a].curve); - cumap->cm[a].table= NULL; - cumap->cm[a].premultable= NULL; + cumap->cm[a].curve = newdataadr(fd, cumap->cm[a].curve); + cumap->cm[a].table = NULL; + cumap->cm[a].premultable = NULL; } } @@ -1670,9 +1669,9 @@ static void lib_link_brush(FileData *fd, Main *main) for (brush= main->brush.first; brush; brush= brush->id.next) { if (brush->id.flag & LIB_NEEDLINK) { brush->id.flag -= LIB_NEEDLINK; - - brush->mtex.tex= newlibadr_us(fd, brush->id.lib, brush->mtex.tex); - brush->clone.image= newlibadr_us(fd, brush->id.lib, brush->clone.image); + + brush->mtex.tex = newlibadr_us(fd, brush->id.lib, brush->mtex.tex); + brush->clone.image = newlibadr_us(fd, brush->id.lib, brush->clone.image); } } } @@ -1682,14 +1681,14 @@ static void direct_link_brush(FileData *fd, Brush *brush) /* brush itself has been read */ /* fallof curve */ - brush->curve= newdataadr(fd, brush->curve); + brush->curve = newdataadr(fd, brush->curve); if (brush->curve) direct_link_curvemapping(fd, brush->curve); else BKE_brush_curve_preset(brush, CURVE_PRESET_SHARP); - brush->preview= NULL; - brush->icon_imbuf= NULL; + brush->preview = NULL; + brush->icon_imbuf = NULL; } static void direct_link_script(FileData *UNUSED(fd), Script *script) @@ -1703,12 +1702,12 @@ static void direct_link_script(FileData *UNUSED(fd), Script *script) static PackedFile *direct_link_packedfile(FileData *fd, PackedFile *oldpf) { - PackedFile *pf= newdataadr(fd, oldpf); - + PackedFile *pf = newdataadr(fd, oldpf); + if (pf) { - pf->data= newdataadr(fd, pf->data); + pf->data = newdataadr(fd, pf->data); } - + return pf; } @@ -1716,17 +1715,17 @@ static PackedFile *direct_link_packedfile(FileData *fd, PackedFile *oldpf) static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_prv) { - PreviewImage *prv= newdataadr(fd, old_prv); - + PreviewImage *prv = newdataadr(fd, old_prv); + if (prv) { int i; - for (i=0; i < NUM_ICON_SIZES; ++i) { + for (i = 0; i < NUM_ICON_SIZES; ++i) { if (prv->rect[i]) { prv->rect[i] = newdataadr(fd, prv->rect[i]); } } } - + return prv; } @@ -1738,18 +1737,18 @@ static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_p static void lib_link_ipo(FileData *fd, Main *main) { Ipo *ipo; - - ipo= main->ipo.first; + + ipo = main->ipo.first; while (ipo) { if (ipo->id.flag & LIB_NEEDLINK) { IpoCurve *icu; - for (icu= ipo->curve.first; icu; icu= icu->next) { + for (icu = ipo->curve.first; icu; icu = icu->next) { if (icu->driver) - icu->driver->ob= newlibadr(fd, ipo->id.lib, icu->driver->ob); + icu->driver->ob = newlibadr(fd, ipo->id.lib, icu->driver->ob); } ipo->id.flag -= LIB_NEEDLINK; } - ipo= ipo->id.next; + ipo = ipo->id.next; } } @@ -1759,12 +1758,12 @@ static void direct_link_ipo(FileData *fd, Ipo *ipo) IpoCurve *icu; link_list(fd, &(ipo->curve)); - icu= ipo->curve.first; + icu = ipo->curve.first; while (icu) { - icu->bezt= newdataadr(fd, icu->bezt); - icu->bp= newdataadr(fd, icu->bp); - icu->driver= newdataadr(fd, icu->driver); - icu= icu->next; + icu->bezt = newdataadr(fd, icu->bezt); + icu->bp = newdataadr(fd, icu->bp); + icu->driver = newdataadr(fd, icu->driver); + icu = icu->next; } } @@ -1779,7 +1778,7 @@ static void lib_link_nlastrips(FileData *fd, ID *id, ListBase *striplist) strip->act = newlibadr_us(fd, id->lib, strip->act); strip->ipo = newlibadr(fd, id->lib, strip->ipo); for (amod= strip->modifiers.first; amod; amod= amod->next) - amod->ob= newlibadr(fd, id->lib, amod->ob); + amod->ob = newlibadr(fd, id->lib, amod->ob); } } @@ -1810,12 +1809,12 @@ static void lib_link_fmodifiers(FileData *fd, ID *id, ListBase *list) { FModifier *fcm; - for (fcm= list->first; fcm; fcm= fcm->next) { + for (fcm = list->first; fcm; fcm = fcm->next) { /* data for specific modifiers */ switch (fcm->type) { case FMODIFIER_TYPE_PYTHON: { - FMod_Python *data= (FMod_Python *)fcm->data; + FMod_Python *data = (FMod_Python *)fcm->data; data->script = newlibadr(fd, id->lib, data->script); } break; @@ -1831,10 +1830,10 @@ static void lib_link_fcurves(FileData *fd, ID *id, ListBase *list) return; /* relink ID-block references... */ - for (fcu= list->first; fcu; fcu= fcu->next) { + for (fcu = list->first; fcu; fcu = fcu->next) { /* driver data */ if (fcu->driver) { - ChannelDriver *driver= fcu->driver; + ChannelDriver *driver = fcu->driver; DriverVar *dvar; for (dvar= driver->variables.first; dvar; dvar= dvar->next) { @@ -1842,9 +1841,9 @@ static void lib_link_fcurves(FileData *fd, ID *id, ListBase *list) { /* only relink if still used */ if (tarIndex < dvar->num_targets) - dtar->id= newlibadr(fd, id->lib, dtar->id); + dtar->id = newlibadr(fd, id->lib, dtar->id); else - dtar->id= NULL; + dtar->id = NULL; } DRIVER_TARGETS_LOOPER_END } @@ -1861,19 +1860,19 @@ static void direct_link_fmodifiers(FileData *fd, ListBase *list) { FModifier *fcm; - for (fcm= list->first; fcm; fcm= fcm->next) { + for (fcm = list->first; fcm; fcm = fcm->next) { /* relink general data */ - fcm->data = newdataadr(fd, fcm->data); - fcm->edata= NULL; + fcm->data = newdataadr(fd, fcm->data); + fcm->edata = NULL; /* do relinking of data for specific types */ switch (fcm->type) { case FMODIFIER_TYPE_GENERATOR: { - FMod_Generator *data= (FMod_Generator *)fcm->data; + FMod_Generator *data = (FMod_Generator *)fcm->data; + + data->coefficients = newdataadr(fd, data->coefficients); - data->coefficients= newdataadr(fd, data->coefficients); - if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { unsigned int a; for (a = 0; a < data->arraysize; a++) @@ -1883,14 +1882,14 @@ static void direct_link_fmodifiers(FileData *fd, ListBase *list) break; case FMODIFIER_TYPE_ENVELOPE: { - FMod_Envelope *data= (FMod_Envelope *)fcm->data; + FMod_Envelope *data= (FMod_Envelope *)fcm->data; data->data= newdataadr(fd, data->data); } break; case FMODIFIER_TYPE_PYTHON: { - FMod_Python *data= (FMod_Python *)fcm->data; + FMod_Python *data = (FMod_Python *)fcm->data; data->prop = newdataadr(fd, data->prop); IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); @@ -1906,24 +1905,24 @@ static void direct_link_fcurves(FileData *fd, ListBase *list) FCurve *fcu; /* link F-Curve data to F-Curve again (non ID-libs) */ - for (fcu= list->first; fcu; fcu= fcu->next) { + for (fcu = list->first; fcu; fcu = fcu->next) { /* curve data */ - fcu->bezt= newdataadr(fd, fcu->bezt); - fcu->fpt= newdataadr(fd, fcu->fpt); + fcu->bezt = newdataadr(fd, fcu->bezt); + fcu->fpt = newdataadr(fd, fcu->fpt); /* rna path */ - fcu->rna_path= newdataadr(fd, fcu->rna_path); + fcu->rna_path = newdataadr(fd, fcu->rna_path); /* group */ - fcu->grp= newdataadr(fd, fcu->grp); + fcu->grp = newdataadr(fd, fcu->grp); /* driver */ fcu->driver= newdataadr(fd, fcu->driver); if (fcu->driver) { ChannelDriver *driver= fcu->driver; DriverVar *dvar; - - driver->expr_comp= NULL; + + driver->expr_comp = NULL; /* relink variables, targets and their paths */ link_list(fd, &driver->variables); @@ -1932,9 +1931,9 @@ static void direct_link_fcurves(FileData *fd, ListBase *list) { /* only relink the targets being used */ if (tarIndex < dvar->num_targets) - dtar->rna_path= newdataadr(fd, dtar->rna_path); + dtar->rna_path = newdataadr(fd, dtar->rna_path); else - dtar->rna_path= NULL; + dtar->rna_path = NULL; } DRIVER_TARGETS_LOOPER_END } @@ -1958,7 +1957,7 @@ static void lib_link_action(FileData *fd, Main *main) // XXX depreceated - old animation system <<< for (chan=act->chanbase.first; chan; chan=chan->next) { - chan->ipo= newlibadr_us(fd, act->id.lib, chan->ipo); + chan->ipo = newlibadr_us(fd, act->id.lib, chan->ipo); lib_link_constraint_channels(fd, &act->id, &chan->constraintChannels); } // >>> XXX depreceated - old animation system @@ -1980,7 +1979,7 @@ static void direct_link_action(FileData *fd, bAction *act) // XXX depreceated - old animation system <<< for (achan = act->chanbase.first; achan; achan=achan->next) { - achan->grp= newdataadr(fd, achan->grp); + achan->grp = newdataadr(fd, achan->grp); link_list(fd, &achan->constraintChannels); } @@ -1998,7 +1997,7 @@ static void lib_link_nladata_strips(FileData *fd, ID *id, ListBase *list) { NlaStrip *strip; - for (strip= list->first; strip; strip= strip->next) { + for (strip = list->first; strip; strip = strip->next) { /* check strip's children */ lib_link_nladata_strips(fd, id, &strip->strips); @@ -2019,7 +2018,7 @@ static void lib_link_nladata(FileData *fd, ID *id, ListBase *list) NlaTrack *nlt; /* we only care about the NLA strips inside the tracks */ - for (nlt= list->first; nlt; nlt= nlt->next) { + for (nlt = list->first; nlt; nlt = nlt->next) { lib_link_nladata_strips(fd, id, &nlt->strips); } } @@ -2031,7 +2030,7 @@ static void direct_link_nladata_strips(FileData *fd, ListBase *list) { NlaStrip *strip; - for (strip= list->first; strip; strip= strip->next) { + for (strip = list->first; strip; strip = strip->next) { /* strip's child strips */ link_list(fd, &strip->strips); direct_link_nladata_strips(fd, &strip->strips); @@ -2051,7 +2050,7 @@ static void direct_link_nladata(FileData *fd, ListBase *list) { NlaTrack *nlt; - for (nlt= list->first; nlt; nlt= nlt->next) { + for (nlt = list->first; nlt; nlt = nlt->next) { /* relink list of strips */ link_list(fd, &nlt->strips); @@ -2068,8 +2067,8 @@ static void lib_link_keyingsets(FileData *fd, ID *id, ListBase *list) KS_Path *ksp; /* here, we're only interested in the ID pointer stored in some of the paths */ - for (ks= list->first; ks; ks= ks->next) { - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + for (ks = list->first; ks; ks = ks->next) { + for (ksp = ks->paths.first; ksp; ksp = ksp->next) { ksp->id= newlibadr(fd, id->lib, ksp->id); } } @@ -2082,11 +2081,11 @@ static void direct_link_keyingsets(FileData *fd, ListBase *list) KS_Path *ksp; /* link KeyingSet data to KeyingSet again (non ID-libs) */ - for (ks= list->first; ks; ks= ks->next) { + for (ks = list->first; ks; ks = ks->next) { /* paths */ link_list(fd, &ks->paths); - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + for (ksp = ks->paths.first; ksp; ksp = ksp->next) { /* rna path */ ksp->rna_path= newdataadr(fd, ksp->rna_path); } @@ -2142,7 +2141,7 @@ static void direct_link_animdata(FileData *fd, AnimData *adt) */ // TODO: it's not really nice that anyone should be able to save the file in this // state, but it's going to be too hard to enforce this single case... - adt->actstrip= newdataadr(fd, adt->actstrip); + adt->actstrip = newdataadr(fd, adt->actstrip); } /* ************ READ MOTION PATHS *************** */ @@ -2155,7 +2154,7 @@ static void direct_link_motionpath(FileData *fd, bMotionPath *mpath) return; /* relink points cache */ - mpath->points= newdataadr(fd, mpath->points); + mpath->points = newdataadr(fd, mpath->points); } /* ************ READ NODE TREE *************** */ @@ -2167,10 +2166,10 @@ static void lib_link_ntree(FileData *fd, ID *id, bNodeTree *ntree) if (ntree->adt) lib_link_animdata(fd, &ntree->id, ntree->adt); - ntree->gpd= newlibadr_us(fd, id->lib, ntree->gpd); + ntree->gpd = newlibadr_us(fd, id->lib, ntree->gpd); for (node= ntree->nodes.first; node; node= node->next) - node->id= newlibadr_us(fd, id->lib, node->id); + node->id = newlibadr_us(fd, id->lib, node->id); } /* library ntree linking after fileread */ @@ -2239,7 +2238,7 @@ static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNode bNode *node; ntreeInitTypes(ntree); - + /* need to do this here instead of in do_versions, otherwise next function can crash */ blo_do_versions_nodetree_default_value(ntree); @@ -2253,7 +2252,7 @@ static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNode */ static void lib_node_do_versions_group_indices(bNode *gnode) { - bNodeTree *ngroup= (bNodeTree*)gnode->id; + bNodeTree *ngroup = (bNodeTree*)gnode->id; bNode *intnode; bNodeSocket *sock, *gsock, *intsock; int found; @@ -2288,9 +2287,9 @@ static void lib_nodetree_do_versions_group_indices_cb(void *UNUSED(data), ID *UN { bNode *node; - for (node=ntree->nodes.first; node; node=node->next) { - if (node->type==NODE_GROUP) { - bNodeTree *ngroup= (bNodeTree*)node->id; + 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_GROUP_EXPOSE)) lib_node_do_versions_group_indices(node); } @@ -2312,31 +2311,31 @@ static void lib_verify_nodetree(Main *main, int UNUSED(open)) bNodeTree *ntree; int i; bNodeTreeType *ntreetype; - + /* this crashes blender on undo/redo */ #if 0 - if (open==1) { + if (open == 1) { reinit_nodesystem(); } #endif /* set node->typeinfo pointers */ - for (i=0; i < NUM_NTREE_TYPES; ++i) { - ntreetype= ntreeGetType(i); + 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) + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) lib_nodetree_init_types_cb(NULL, NULL, ntree); { - int has_old_groups=0; + 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) { + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) { if (ntree->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE) { /* this adds copies and links from all unlinked internal sockets to group inputs/outputs. */ node_group_expose_all_sockets(ntree); @@ -2345,8 +2344,8 @@ static void lib_verify_nodetree(Main *main, int UNUSED(open)) } if (has_old_groups) { - for (i=0; i < NUM_NTREE_TYPES; ++i) { - ntreetype= ntreeGetType(i); + 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); } @@ -2355,20 +2354,20 @@ static void lib_verify_nodetree(Main *main, int UNUSED(open)) for (ntree= main->nodetree.first; ntree; ntree= ntree->id.next) ntree->flag &= ~NTREE_DO_VERSIONS_GROUP_EXPOSE; } - + /* verify all group user nodes */ - for (ntree= main->nodetree.first; ntree; ntree= ntree->id.next) { + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) { ntreeVerifyNodes(main, &ntree->id); } /* make update calls where necessary */ { - for (ntree= main->nodetree.first; ntree; ntree= ntree->id.next) + 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); + + 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); } @@ -2377,10 +2376,10 @@ static void lib_verify_nodetree(Main *main, int UNUSED(open)) 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; + 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! */ @@ -2391,31 +2390,31 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) bNodeSocket *sock; bNodeLink *link; - ntree->init= 0; /* to set callbacks and force setting types */ - ntree->progress= NULL; - ntree->execdata= NULL; + ntree->init = 0; /* to set callbacks and force setting types */ + ntree->progress = NULL; + ntree->execdata = NULL; - ntree->adt= newdataadr(fd, ntree->adt); + ntree->adt = newdataadr(fd, ntree->adt); direct_link_animdata(fd, ntree->adt); link_list(fd, &ntree->nodes); - for (node= ntree->nodes.first; node; node= node->next) { + for (node = ntree->nodes.first; node; node = node->next) { if (node->type == NODE_DYNAMIC) { - node->custom1= 0; - node->custom1= BSET(node->custom1, NODE_DYNAMIC_LOADED); + 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); if (node->type == CMP_NODE_MOVIEDISTORTION) { - node->storage= newmclipadr(fd, node->storage); + node->storage = newmclipadr(fd, node->storage); } else - node->storage= newdataadr(fd, node->storage); - + 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)) @@ -2424,13 +2423,13 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) if ( ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) direct_link_curvemapping(fd, node->storage); else if (ELEM3(node->type, CMP_NODE_IMAGE, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) - ((ImageUser *)node->storage)->ok= 1; + ((ImageUser *)node->storage)->ok = 1; } else if ( ntree->type==NTREE_TEXTURE) { if (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) direct_link_curvemapping(fd, node->storage); else if (node->type==TEX_NODE_IMAGE) - ((ImageUser *)node->storage)->ok= 1; + ((ImageUser *)node->storage)->ok = 1; } } } @@ -2441,26 +2440,26 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) link_list(fd, &ntree->outputs); /* and we connect the rest */ - for (node= ntree->nodes.first; node; node= node->next) { + for (node = ntree->nodes.first; node; node = node->next) { node->parent = newdataadr(fd, node->parent); - node->preview= newimaadr(fd, node->preview); - node->lasty= 0; + node->preview = newimaadr(fd, node->preview); + node->lasty = 0; - for (sock= node->inputs.first; sock; sock= sock->next) + for (sock = node->inputs.first; sock; sock = sock->next) direct_link_node_socket(fd, sock); - for (sock= node->outputs.first; sock; sock= sock->next) + for (sock = node->outputs.first; sock; sock = sock->next) direct_link_node_socket(fd, sock); } - for (sock= ntree->inputs.first; sock; sock= sock->next) + for (sock = ntree->inputs.first; sock; sock = sock->next) direct_link_node_socket(fd, sock); - for (sock= ntree->outputs.first; sock; sock= sock->next) + for (sock = ntree->outputs.first; sock; sock = sock->next) direct_link_node_socket(fd, sock); - for (link= ntree->links.first; link; link= link->next) { - link->fromnode= newdataadr(fd, link->fromnode); - link->tonode= newdataadr(fd, link->tonode); - link->fromsock= newdataadr(fd, link->fromsock); - link->tosock= newdataadr(fd, link->tosock); + for (link = ntree->links.first; link; link= link->next) { + link->fromnode = newdataadr(fd, link->fromnode); + link->tonode = newdataadr(fd, link->tonode); + link->fromsock = newdataadr(fd, link->fromsock); + link->tosock = newdataadr(fd, link->tosock); } /* type verification is in lib-link */ @@ -2498,16 +2497,16 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist) for (con = conlist->first; con; con=con->next) { /* patch for error introduced by changing constraints (dunno how) */ /* if con->data type changes, dna cannot resolve the pointer! (ton) */ - if (con->data==NULL) { - con->type= CONSTRAINT_TYPE_NULL; + if (con->data == NULL) { + con->type = CONSTRAINT_TYPE_NULL; } /* own ipo, all constraints have it */ - con->ipo= newlibadr_us(fd, id->lib, con->ipo); // XXX depreceated - old animation system + con->ipo = newlibadr_us(fd, id->lib, con->ipo); // XXX depreceated - old animation system } /* relink all ID-blocks used by the constraints */ - cld.fd= fd; - cld.id= id; + cld.fd = fd; + cld.id = id; id_loop_constraints(conlist, lib_link_constraint_cb, &cld); } @@ -2515,7 +2514,7 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist) static void direct_link_constraints(FileData *fd, ListBase *lb) { bConstraint *con; - + link_list(fd, lb); for (con=lb->first; con; con=con->next) { con->data = newdataadr(fd, con->data); @@ -2558,16 +2557,16 @@ static void direct_link_constraints(FileData *fd, ListBase *lb) static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) { bPoseChannel *pchan; - bArmature *arm= ob->data; + bArmature *arm = ob->data; int rebuild; if (!pose || !arm) return; - + /* always rebuild to match proxy or lib changes */ rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib); - + if (ob->proxy) { /* sync proxy layer */ if (pose->proxy_layer) @@ -2580,15 +2579,15 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) arm->act_bone = bone; } } - + for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) { lib_link_constraints(fd, (ID *)ob, &pchan->constraints); /* hurms... loop in a loop, but yah... later... (ton) */ - pchan->bone= BKE_armature_find_bone_name(arm, pchan->name); + pchan->bone = BKE_armature_find_bone_name(arm, pchan->name); - pchan->custom= newlibadr_us(fd, arm->id.lib, pchan->custom); - if (pchan->bone==NULL) + pchan->custom = newlibadr_us(fd, arm->id.lib, pchan->custom); + if (pchan->bone == NULL) rebuild= 1; else if (ob->id.lib==NULL && arm->id.lib) { /* local pose selection copied to armature, bit hackish */ @@ -2598,7 +2597,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) } if (rebuild) { - ob->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; + ob->recalc = (OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); pose->flag |= POSE_RECALC; } } @@ -2606,54 +2605,54 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) static void lib_link_armature(FileData *fd, Main *main) { bArmature *arm; - - arm= main->armature.first; - + + arm = main->armature.first; + while (arm) { if (arm->id.flag & LIB_NEEDLINK) { if (arm->adt) lib_link_animdata(fd, &arm->id, arm->adt); arm->id.flag -= LIB_NEEDLINK; } - arm= arm->id.next; + arm = arm->id.next; } } static void direct_link_bones(FileData *fd, Bone* bone) { - Bone *child; - - bone->parent= newdataadr(fd, bone->parent); - bone->prop= newdataadr(fd, bone->prop); + Bone *child; + + bone->parent = newdataadr(fd, bone->parent); + bone->prop = newdataadr(fd, bone->prop); if (bone->prop) IDP_DirectLinkProperty(bone->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); bone->flag &= ~BONE_DRAW_ACTIVE; - + link_list(fd, &bone->childbase); - + for (child=bone->childbase.first; child; child=child->next) direct_link_bones(fd, child); } static void direct_link_armature(FileData *fd, bArmature *arm) { - Bone *bone; - + Bone *bone; + link_list(fd, &arm->bonebase); - arm->edbo= NULL; + arm->edbo = NULL; arm->sketch = NULL; - arm->adt= newdataadr(fd, arm->adt); + arm->adt = newdataadr(fd, arm->adt); direct_link_animdata(fd, arm->adt); - bone=arm->bonebase.first; + bone = arm->bonebase.first; while (bone) { direct_link_bones(fd, bone); bone=bone->next; } - - arm->act_bone= newdataadr(fd, arm->act_bone); - arm->act_edbone= NULL; + + arm->act_bone = newdataadr(fd, arm->act_bone); + arm->act_edbone = NULL; } /* ************ READ CAMERA ***************** */ @@ -2661,25 +2660,25 @@ static void direct_link_armature(FileData *fd, bArmature *arm) static void lib_link_camera(FileData *fd, Main *main) { Camera *ca; - - ca= main->camera.first; + + ca = main->camera.first; while (ca) { if (ca->id.flag & LIB_NEEDLINK) { if (ca->adt) lib_link_animdata(fd, &ca->id, ca->adt); - ca->ipo= newlibadr_us(fd, ca->id.lib, ca->ipo); // XXX depreceated - old animation system + ca->ipo = newlibadr_us(fd, ca->id.lib, ca->ipo); // XXX depreceated - old animation system - ca->dof_ob= newlibadr_us(fd, ca->id.lib, ca->dof_ob); + ca->dof_ob = newlibadr_us(fd, ca->id.lib, ca->dof_ob); ca->id.flag -= LIB_NEEDLINK; } - ca= ca->id.next; + ca = ca->id.next; } } static void direct_link_camera(FileData *fd, Camera *ca) { - ca->adt= newdataadr(fd, ca->adt); + ca->adt = newdataadr(fd, ca->adt); direct_link_animdata(fd, ca->adt); } @@ -2691,28 +2690,28 @@ static void lib_link_lamp(FileData *fd, Main *main) Lamp *la; MTex *mtex; int a; - - la= main->lamp.first; + + la = main->lamp.first; while (la) { if (la->id.flag & LIB_NEEDLINK) { if (la->adt) lib_link_animdata(fd, &la->id, la->adt); - for (a=0; amtex[a]; + for (a = 0; a < MAX_MTEX; a++) { + mtex = la->mtex[a]; if (mtex) { - mtex->tex= newlibadr_us(fd, la->id.lib, mtex->tex); - mtex->object= newlibadr(fd, la->id.lib, mtex->object); + mtex->tex = newlibadr_us(fd, la->id.lib, mtex->tex); + mtex->object = newlibadr(fd, la->id.lib, mtex->object); } } - la->ipo= newlibadr_us(fd, la->id.lib, la->ipo); // XXX depreceated - old animation system - + la->ipo = newlibadr_us(fd, la->id.lib, la->ipo); // XXX depreceated - old animation system + if (la->nodetree) lib_link_ntree(fd, &la->id, la->nodetree); la->id.flag -= LIB_NEEDLINK; } - la= la->id.next; + la = la->id.next; } } @@ -2720,14 +2719,14 @@ static void direct_link_lamp(FileData *fd, Lamp *la) { int a; - la->adt= newdataadr(fd, la->adt); + la->adt = newdataadr(fd, la->adt); direct_link_animdata(fd, la->adt); - + for (a=0; amtex[a]= newdataadr(fd, la->mtex[a]); + la->mtex[a] = newdataadr(fd, la->mtex[a]); } - la->curfalloff= newdataadr(fd, la->curfalloff); + la->curfalloff = newdataadr(fd, la->curfalloff); if (la->curfalloff) direct_link_curvemapping(fd, la->curfalloff); @@ -2743,28 +2742,28 @@ static void direct_link_lamp(FileData *fd, Lamp *la) static void lib_link_key(FileData *fd, Main *main) { Key *key; - - key= main->key.first; + + key = main->key.first; while (key) { /*check if we need to generate unique ids for the shapekeys*/ if (!key->uidgen) { KeyBlock *block; - + key->uidgen = 1; for (block=key->block.first; block; block=block->next) { block->uid = key->uidgen++; } } - + if (key->id.flag & LIB_NEEDLINK) { if (key->adt) lib_link_animdata(fd, &key->id, key->adt); - key->ipo= newlibadr_us(fd, key->id.lib, key->ipo); // XXX depreceated - old animation system - key->from= newlibadr(fd, key->id.lib, key->from); - + key->ipo = newlibadr_us(fd, key->id.lib, key->ipo); // XXX depreceated - old animation system + key->from = newlibadr(fd, key->id.lib, key->from); + key->id.flag -= LIB_NEEDLINK; } - key= key->id.next; + key = key->id.next; } } @@ -2772,31 +2771,29 @@ static void switch_endian_keyblock(Key *key, KeyBlock *kb) { int elemsize, a, b; char *data, *poin, *cp; - - elemsize= key->elemsize; - data= kb->data; - - for (a=0; atotelem; a++) { - - cp= key->elemstr; - poin= data; - - while ( cp[0] ) { /* cp[0] == amount */ - + + elemsize = key->elemsize; + data = kb->data; + + for (a = 0; a < kb->totelem; a++) { + cp = key->elemstr; + poin = data; + + while (cp[0]) { /* cp[0] == amount */ switch (cp[1]) { /* cp[1] = type */ - case IPO_FLOAT: - case IPO_BPOINT: - case IPO_BEZTRIPLE: - b= cp[0]; - while (b--) { - SWITCH_INT((*poin)); - poin+= 4; - } - break; + case IPO_FLOAT: + case IPO_BPOINT: + case IPO_BEZTRIPLE: + b = cp[0]; + + while (b--) { + SWITCH_INT((*poin)); + poin += 4; + } + break; } - - cp+= 2; - + + cp += 2; } data+= elemsize; } @@ -2805,23 +2802,22 @@ static void switch_endian_keyblock(Key *key, KeyBlock *kb) static void direct_link_key(FileData *fd, Key *key) { KeyBlock *kb; - - link_list(fd, &(key->block)); - - key->adt= newdataadr(fd, key->adt); - direct_link_animdata(fd, key->adt); + link_list(fd, &(key->block)); + + key->adt = newdataadr(fd, key->adt); + direct_link_animdata(fd, key->adt); + key->refkey= newdataadr(fd, key->refkey); - - kb= key->block.first; + + kb = key->block.first; while (kb) { - - kb->data= newdataadr(fd, kb->data); + kb->data = newdataadr(fd, kb->data); if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) switch_endian_keyblock(key, kb); - - kb= kb->next; + + kb = kb->next; } } @@ -2831,37 +2827,38 @@ static void lib_link_mball(FileData *fd, Main *main) { MetaBall *mb; int a; - - mb= main->mball.first; + + mb = main->mball.first; while (mb) { if (mb->id.flag & LIB_NEEDLINK) { if (mb->adt) lib_link_animdata(fd, &mb->id, mb->adt); - for (a=0; atotcol; a++) mb->mat[a]= newlibadr_us(fd, mb->id.lib, mb->mat[a]); - - mb->ipo= newlibadr_us(fd, mb->id.lib, mb->ipo); // XXX depreceated - old animation system - + for (a = 0; a < mb->totcol; a++) + mb->mat[a]= newlibadr_us(fd, mb->id.lib, mb->mat[a]); + + mb->ipo = newlibadr_us(fd, mb->id.lib, mb->ipo); // XXX depreceated - old animation system + mb->id.flag -= LIB_NEEDLINK; } - mb= mb->id.next; + mb = mb->id.next; } } static void direct_link_mball(FileData *fd, MetaBall *mb) { - mb->adt= newdataadr(fd, mb->adt); + mb->adt = newdataadr(fd, mb->adt); direct_link_animdata(fd, mb->adt); - mb->mat= newdataadr(fd, mb->mat); + mb->mat = newdataadr(fd, mb->mat); test_pointer_array(fd, (void **)&mb->mat); - + link_list(fd, &(mb->elems)); - - mb->disp.first= mb->disp.last= NULL; - mb->editelems= NULL; - mb->bb= NULL; + + mb->disp.first = mb->disp.last = NULL; + mb->editelems = NULL; + mb->bb = NULL; /* mb->edit_elems.first= mb->edit_elems.last= NULL;*/ - mb->lastelem= NULL; + mb->lastelem = NULL; } /* ************ READ WORLD ***************** */ @@ -2871,46 +2868,46 @@ static void lib_link_world(FileData *fd, Main *main) World *wrld; MTex *mtex; int a; - - wrld= main->world.first; + + wrld = main->world.first; while (wrld) { if (wrld->id.flag & LIB_NEEDLINK) { if (wrld->adt) lib_link_animdata(fd, &wrld->id, wrld->adt); - wrld->ipo= newlibadr_us(fd, wrld->id.lib, wrld->ipo); // XXX depreceated - old animation system + wrld->ipo = newlibadr_us(fd, wrld->id.lib, wrld->ipo); // XXX depreceated - old animation system - for (a=0; amtex[a]; + for (a=0; a < MAX_MTEX; a++) { + mtex = wrld->mtex[a]; if (mtex) { mtex->tex= newlibadr_us(fd, wrld->id.lib, mtex->tex); mtex->object= newlibadr(fd, wrld->id.lib, mtex->object); } } - + if (wrld->nodetree) lib_link_ntree(fd, &wrld->id, wrld->nodetree); wrld->id.flag -= LIB_NEEDLINK; } - wrld= wrld->id.next; + wrld = wrld->id.next; } } static void direct_link_world(FileData *fd, World *wrld) { int a; - + wrld->adt= newdataadr(fd, wrld->adt); direct_link_animdata(fd, wrld->adt); - + for (a=0; amtex[a]= newdataadr(fd, wrld->mtex[a]); } - + wrld->nodetree= newdataadr(fd, wrld->nodetree); if (wrld->nodetree) direct_link_nodetree(fd, wrld->nodetree); - + wrld->preview = direct_link_preview_image(fd, wrld->preview); } @@ -2920,20 +2917,20 @@ static void direct_link_world(FileData *fd, World *wrld) static void lib_link_vfont(FileData *UNUSED(fd), Main *main) { VFont *vf; - - vf= main->vfont.first; + + vf = main->vfont.first; while (vf) { if (vf->id.flag & LIB_NEEDLINK) { vf->id.flag -= LIB_NEEDLINK; } - vf= vf->id.next; + vf = vf->id.next; } } static void direct_link_vfont(FileData *fd, VFont *vf) { - vf->data= NULL; - vf->packedfile= direct_link_packedfile(fd, vf->packedfile); + vf->data = NULL; + vf->packedfile = direct_link_packedfile(fd, vf->packedfile); } /* ************ READ TEXT ****************** */ @@ -2941,57 +2938,57 @@ static void direct_link_vfont(FileData *fd, VFont *vf) static void lib_link_text(FileData *UNUSED(fd), Main *main) { Text *text; - - text= main->text.first; + + text = main->text.first; while (text) { if (text->id.flag & LIB_NEEDLINK) { text->id.flag -= LIB_NEEDLINK; } - text= text->id.next; + text = text->id.next; } } static void direct_link_text(FileData *fd, Text *text) { TextLine *ln; - - text->name= newdataadr(fd, text->name); - - text->undo_pos= -1; - text->undo_len= TXT_INIT_UNDO; - text->undo_buf= MEM_mallocN(text->undo_len, "undo buf"); - - text->compiled= NULL; - + + text->name = newdataadr(fd, text->name); + + text->undo_pos = -1; + text->undo_len = TXT_INIT_UNDO; + text->undo_buf = MEM_mallocN(text->undo_len, "undo buf"); + + text->compiled = NULL; + #if 0 if (text->flags & TXT_ISEXT) { BKE_text_reload(text); } else { #endif - + link_list(fd, &text->lines); link_list(fd, &text->markers); - - text->curl= newdataadr(fd, text->curl); - text->sell= newdataadr(fd, text->sell); - - ln= text->lines.first; + + text->curl = newdataadr(fd, text->curl); + text->sell = newdataadr(fd, text->sell); + + ln = text->lines.first; while (ln) { - ln->line= newdataadr(fd, ln->line); - ln->format= NULL; + ln->line = newdataadr(fd, ln->line); + ln->format = NULL; if (ln->len != (int) strlen(ln->line)) { printf("Error loading text, line lengths differ\n"); ln->len = strlen(ln->line); } - - ln= ln->next; + + ln = ln->next; } - + text->flags = (text->flags) & ~TXT_ISEXT; - - text->id.us= 1; + + text->id.us = 1; } /* ************ READ IMAGE ***************** */ @@ -2999,15 +2996,15 @@ static void direct_link_text(FileData *fd, Text *text) static void lib_link_image(FileData *fd, Main *main) { Image *ima; - - ima= main->image.first; + + ima = main->image.first; while (ima) { if (ima->id.flag & LIB_NEEDLINK) { if (ima->id.properties) IDP_LibLinkProperty(ima->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); - + ima->id.flag -= LIB_NEEDLINK; } - ima= ima->id.next; + ima = ima->id.next; } } @@ -3015,18 +3012,18 @@ static void link_ibuf_list(FileData *fd, ListBase *lb) { Link *ln, *prev; - if (lb->first==NULL) return; + if (lb->first == NULL) return; - lb->first= newimaadr(fd, lb->first); - ln= lb->first; - prev= NULL; + lb->first = newimaadr(fd, lb->first); + ln = lb->first; + prev = NULL; while (ln) { - ln->next= newimaadr(fd, ln->next); - ln->prev= prev; - prev= ln; - ln= ln->next; + ln->next = newimaadr(fd, ln->next); + ln->prev = prev; + prev = ln; + ln = ln->next; } - lb->last= prev; + lb->last = prev; } static void direct_link_image(FileData *fd, Image *ima) @@ -3035,33 +3032,33 @@ static void direct_link_image(FileData *fd, Image *ima) if (fd->imamap) link_ibuf_list(fd, &ima->ibufs); else - ima->ibufs.first= ima->ibufs.last= NULL; + ima->ibufs.first = ima->ibufs.last = NULL; /* if not restored, we keep the binded opengl index */ - if (ima->ibufs.first==NULL) { - ima->bindcode= 0; - ima->gputexture= NULL; + if (ima->ibufs.first == NULL) { + ima->bindcode = 0; + ima->gputexture = NULL; } - ima->anim= NULL; - ima->rr= NULL; - ima->repbind= NULL; + ima->anim = NULL; + ima->rr = NULL; + ima->repbind = NULL; /* undo system, try to restore render buffers */ if (fd->imamap) { int a; - for (a=0; arenders[a]= newimaadr(fd, ima->renders[a]); + for (a =0; a < IMA_MAX_RENDER_SLOT; a++) + ima->renders[a] = newimaadr(fd, ima->renders[a]); } else { memset(ima->renders, 0, sizeof(ima->renders)); - ima->last_render_slot= ima->render_slot; + ima->last_render_slot = ima->render_slot; } ima->packedfile = direct_link_packedfile(fd, ima->packedfile); ima->preview = direct_link_preview_image(fd, ima->preview); - ima->ok= 1; + ima->ok = 1; } @@ -3071,28 +3068,29 @@ static void lib_link_curve(FileData *fd, Main *main) { Curve *cu; int a; - - cu= main->curve.first; + + cu = main->curve.first; while (cu) { if (cu->id.flag & LIB_NEEDLINK) { if (cu->adt) lib_link_animdata(fd, &cu->id, cu->adt); - - for (a=0; atotcol; a++) cu->mat[a]= newlibadr_us(fd, cu->id.lib, cu->mat[a]); - - cu->bevobj= newlibadr(fd, cu->id.lib, cu->bevobj); - cu->taperobj= newlibadr(fd, cu->id.lib, cu->taperobj); - cu->textoncurve= newlibadr(fd, cu->id.lib, cu->textoncurve); - cu->vfont= newlibadr_us(fd, cu->id.lib, cu->vfont); - cu->vfontb= newlibadr_us(fd, cu->id.lib, cu->vfontb); - cu->vfonti= newlibadr_us(fd, cu->id.lib, cu->vfonti); - cu->vfontbi= newlibadr_us(fd, cu->id.lib, cu->vfontbi); - - cu->ipo= newlibadr_us(fd, cu->id.lib, cu->ipo); // XXX depreceated - old animation system - cu->key= newlibadr_us(fd, cu->id.lib, cu->key); - + + for (a = 0; a < cu->totcol; a++) + cu->mat[a] = newlibadr_us(fd, cu->id.lib, cu->mat[a]); + + cu->bevobj = newlibadr(fd, cu->id.lib, cu->bevobj); + cu->taperobj = newlibadr(fd, cu->id.lib, cu->taperobj); + cu->textoncurve = newlibadr(fd, cu->id.lib, cu->textoncurve); + cu->vfont = newlibadr_us(fd, cu->id.lib, cu->vfont); + cu->vfontb = newlibadr_us(fd, cu->id.lib, cu->vfontb); + cu->vfonti = newlibadr_us(fd, cu->id.lib, cu->vfonti); + cu->vfontbi = newlibadr_us(fd, cu->id.lib, cu->vfontbi); + + cu->ipo = newlibadr_us(fd, cu->id.lib, cu->ipo); // XXX depreceated - old animation system + cu->key = newlibadr_us(fd, cu->id.lib, cu->key); + cu->id.flag -= LIB_NEEDLINK; } - cu= cu->id.next; + cu = cu->id.next; } } @@ -3100,7 +3098,7 @@ static void lib_link_curve(FileData *fd, Main *main) static void switch_endian_knots(Nurb *nu) { int len; - + if (nu->knotsu) { len= KNOTSU(nu); while (len--) { @@ -3123,21 +3121,21 @@ static void direct_link_curve(FileData *fd, Curve *cu) cu->adt= newdataadr(fd, cu->adt); direct_link_animdata(fd, cu->adt); - cu->mat= newdataadr(fd, cu->mat); + cu->mat = newdataadr(fd, cu->mat); test_pointer_array(fd, (void **)&cu->mat); - cu->str= newdataadr(fd, cu->str); + cu->str = newdataadr(fd, cu->str); cu->strinfo= newdataadr(fd, cu->strinfo); - cu->tb= newdataadr(fd, cu->tb); + cu->tb = newdataadr(fd, cu->tb); if (cu->vfont == NULL) link_list(fd, &(cu->nurb)); else { cu->nurb.first=cu->nurb.last= NULL; - - tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "TextBoxread"); + + tb = MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "TextBoxread"); if (cu->tb) { memcpy(tb, cu->tb, cu->totbox*sizeof(TextBox)); MEM_freeN(cu->tb); - cu->tb= tb; + cu->tb = tb; } else { cu->totbox = 1; @@ -3148,28 +3146,28 @@ static void direct_link_curve(FileData *fd, Curve *cu) if (cu->wordspace == 0.0f) cu->wordspace = 1.0f; } - cu->bev.first=cu->bev.last= NULL; - cu->disp.first=cu->disp.last= NULL; - cu->editnurb= NULL; - cu->lastsel= NULL; - cu->path= NULL; - cu->editfont= NULL; + cu->bev.first = cu->bev.last = NULL; + cu->disp.first = cu->disp.last = NULL; + cu->editnurb = NULL; + cu->lastsel = NULL; + cu->path = NULL; + cu->editfont = NULL; - nu= cu->nurb.first; + nu = cu->nurb.first; while (nu) { - nu->bezt= newdataadr(fd, nu->bezt); - nu->bp= newdataadr(fd, nu->bp); - nu->knotsu= newdataadr(fd, nu->knotsu); - nu->knotsv= newdataadr(fd, nu->knotsv); + nu->bezt = newdataadr(fd, nu->bezt); + nu->bp = newdataadr(fd, nu->bp); + nu->knotsu = newdataadr(fd, nu->knotsu); + nu->knotsv = newdataadr(fd, nu->knotsv); if (cu->vfont == NULL) nu->charidx= nu->mat_nr; - + if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { switch_endian_knots(nu); } - - nu= nu->next; + + nu = nu->next; } - cu->bb= NULL; + cu->bb = NULL; } /* ************ READ TEX ***************** */ @@ -3177,21 +3175,23 @@ static void direct_link_curve(FileData *fd, Curve *cu) static void lib_link_texture(FileData *fd, Main *main) { Tex *tex; - - tex= main->tex.first; + + tex = main->tex.first; while (tex) { if (tex->id.flag & LIB_NEEDLINK) { if (tex->adt) lib_link_animdata(fd, &tex->id, tex->adt); - - tex->ima= newlibadr_us(fd, tex->id.lib, tex->ima); - tex->ipo= newlibadr_us(fd, tex->id.lib, tex->ipo); - if (tex->env) tex->env->object= newlibadr(fd, tex->id.lib, tex->env->object); + + tex->ima = newlibadr_us(fd, tex->id.lib, tex->ima); + tex->ipo = newlibadr_us(fd, tex->id.lib, tex->ipo); + if (tex->env) + tex->env->object = newlibadr(fd, tex->id.lib, tex->env->object); if (tex->pd) tex->pd->object= newlibadr(fd, tex->id.lib, tex->pd->object); - if (tex->vd) tex->vd->object= newlibadr(fd, tex->id.lib, tex->vd->object); - if (tex->ot) tex->ot->object= newlibadr(fd, tex->id.lib, tex->ot->object); - - + if (tex->vd) + tex->vd->object = newlibadr(fd, tex->id.lib, tex->vd->object); + if (tex->ot) + tex->ot->object = newlibadr(fd, tex->id.lib, tex->ot->object); + if (tex->nodetree) lib_link_ntree(fd, &tex->id, tex->nodetree); @@ -3203,54 +3203,54 @@ static void lib_link_texture(FileData *fd, Main *main) static void direct_link_texture(FileData *fd, Tex *tex) { - tex->adt= newdataadr(fd, tex->adt); + tex->adt = newdataadr(fd, tex->adt); direct_link_animdata(fd, tex->adt); - tex->plugin= newdataadr(fd, tex->plugin); + tex->plugin = newdataadr(fd, tex->plugin); if (tex->plugin) { - tex->plugin->handle= NULL; + tex->plugin->handle = NULL; open_plugin_tex(tex->plugin); /* initialize data for this instance, if an initialization * function exists. */ if (tex->plugin->instance_init) - tex->plugin->instance_init((void *) tex->plugin->data); + tex->plugin->instance_init((void *)tex->plugin->data); } - tex->coba= newdataadr(fd, tex->coba); - tex->env= newdataadr(fd, tex->env); + tex->coba = newdataadr(fd, tex->coba); + tex->env = newdataadr(fd, tex->env); if (tex->env) { - tex->env->ima= NULL; + tex->env->ima = NULL; memset(tex->env->cube, 0, 6*sizeof(void *)); tex->env->ok= 0; } tex->pd= newdataadr(fd, tex->pd); if (tex->pd) { tex->pd->point_tree = NULL; - tex->pd->coba= newdataadr(fd, tex->pd->coba); - tex->pd->falloff_curve= newdataadr(fd, tex->pd->falloff_curve); + tex->pd->coba = newdataadr(fd, tex->pd->coba); + tex->pd->falloff_curve = newdataadr(fd, tex->pd->falloff_curve); if (tex->pd->falloff_curve) { direct_link_curvemapping(fd, tex->pd->falloff_curve); } } - tex->vd= newdataadr(fd, tex->vd); + tex->vd = newdataadr(fd, tex->vd); if (tex->vd) { tex->vd->dataset = NULL; tex->vd->ok = 0; } else { if (tex->type == TEX_VOXELDATA) - tex->vd= MEM_callocN(sizeof(VoxelData), "direct_link_texture VoxelData"); + tex->vd = MEM_callocN(sizeof(VoxelData), "direct_link_texture VoxelData"); } - tex->ot= newdataadr(fd, tex->ot); + tex->ot = newdataadr(fd, tex->ot); tex->nodetree= newdataadr(fd, tex->nodetree); if (tex->nodetree) direct_link_nodetree(fd, tex->nodetree); tex->preview = direct_link_preview_image(fd, tex->preview); - + tex->iuser.ok= 1; } @@ -3263,24 +3263,24 @@ static void lib_link_material(FileData *fd, Main *main) Material *ma; MTex *mtex; int a; - - ma= main->mat.first; + + ma = main->mat.first; while (ma) { if (ma->id.flag & LIB_NEEDLINK) { if (ma->adt) lib_link_animdata(fd, &ma->id, ma->adt); - + /* Link ID Properties -- and copy this comment EXACTLY for easy finding * of library blocks that implement this.*/ if (ma->id.properties) IDP_LibLinkProperty(ma->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); - - ma->ipo= newlibadr_us(fd, ma->id.lib, ma->ipo); - ma->group= newlibadr_us(fd, ma->id.lib, ma->group); - for (a=0; amtex[a]; + ma->ipo = newlibadr_us(fd, ma->id.lib, ma->ipo); + ma->group = newlibadr_us(fd, ma->id.lib, ma->group); + + for (a=0; a < MAX_MTEX; a++) { + mtex = ma->mtex[a]; if (mtex) { - mtex->tex= newlibadr_us(fd, ma->id.lib, mtex->tex); - mtex->object= newlibadr(fd, ma->id.lib, mtex->object); + mtex->tex = newlibadr_us(fd, ma->id.lib, mtex->tex); + mtex->object = newlibadr(fd, ma->id.lib, mtex->object); } } @@ -3289,28 +3289,28 @@ static void lib_link_material(FileData *fd, Main *main) ma->id.flag -= LIB_NEEDLINK; } - ma= ma->id.next; + ma = ma->id.next; } } static void direct_link_material(FileData *fd, Material *ma) { int a; - - ma->adt= newdataadr(fd, ma->adt); + + ma->adt = newdataadr(fd, ma->adt); direct_link_animdata(fd, ma->adt); - for (a=0; amtex[a]= newdataadr(fd, ma->mtex[a]); + for (a = 0; a < MAX_MTEX; a++) { + ma->mtex[a] = newdataadr(fd, ma->mtex[a]); } - - ma->ramp_col= newdataadr(fd, ma->ramp_col); - ma->ramp_spec= newdataadr(fd, ma->ramp_spec); - ma->nodetree= newdataadr(fd, ma->nodetree); + ma->ramp_col = newdataadr(fd, ma->ramp_col); + ma->ramp_spec = newdataadr(fd, ma->ramp_spec); + + ma->nodetree = newdataadr(fd, ma->nodetree); if (ma->nodetree) direct_link_nodetree(fd, ma->nodetree); - + ma->preview = direct_link_preview_image(fd, ma->preview); ma->gpumaterial.first = ma->gpumaterial.last = NULL; } @@ -3333,39 +3333,39 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache) PTCacheMem *pm; PTCacheExtra *extra; int i; - + link_list(fd, &cache->mem_cache); - + pm = cache->mem_cache.first; - + for (; pm; pm=pm->next) { for (i=0; idata[i] = newdataadr(fd, pm->data[i]); /* the cache saves non-struct data without DNA */ if (pm->data[i] && ptcache_data_struct[i][0]=='\0' && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) { - int j, tot= (BKE_ptcache_data_size (i) * pm->totpoint)/4; /* data_size returns bytes */ - int *poin= pm->data[i]; + int j, tot = (BKE_ptcache_data_size (i) * pm->totpoint)/4; /* data_size returns bytes */ + int *poin = pm->data[i]; - for (j= 0; jextradata); - + for (extra=pm->extradata.first; extra; extra=extra->next) extra->data = newdataadr(fd, extra->data); } } else cache->mem_cache.first = cache->mem_cache.last = NULL; - + cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->edit= NULL; - cache->free_edit= NULL; - cache->cached_frames= NULL; + cache->simframe = 0; + cache->edit = NULL; + cache->free_edit = NULL; + cache->cached_frames = NULL; } static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache, int force_disk) @@ -3380,7 +3380,7 @@ static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointC cache->step = 1; } } - + *ocache = newdataadr(fd, *ocache); } else if (*ocache) { @@ -3391,7 +3391,7 @@ static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointC (*ocache)->flag |= PTCACHE_DISK_CACHE; (*ocache)->step = 1; } - + ptcaches->first = ptcaches->last = *ocache; } } @@ -3399,7 +3399,7 @@ static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointC static void lib_link_partdeflect(FileData *fd, ID *id, PartDeflect *pd) { if (pd && pd->tex) - pd->tex=newlibadr_us(fd, id->lib, pd->tex); + pd->tex = newlibadr_us(fd, id->lib, pd->tex); } static void lib_link_particlesettings(FileData *fd, Main *main) @@ -3413,19 +3413,19 @@ static void lib_link_particlesettings(FileData *fd, Main *main) while (part) { if (part->id.flag & LIB_NEEDLINK) { if (part->adt) lib_link_animdata(fd, &part->id, part->adt); - part->ipo= newlibadr_us(fd, part->id.lib, part->ipo); // XXX depreceated - old animation system + part->ipo = newlibadr_us(fd, part->id.lib, part->ipo); // XXX depreceated - old animation system part->dup_ob = newlibadr(fd, part->id.lib, part->dup_ob); part->dup_group = newlibadr(fd, part->id.lib, part->dup_group); part->eff_group = newlibadr(fd, part->id.lib, part->eff_group); part->bb_ob = newlibadr(fd, part->id.lib, part->bb_ob); - + lib_link_partdeflect(fd, &part->id, part->pd); lib_link_partdeflect(fd, &part->id, part->pd2); - + if (part->effector_weights) part->effector_weights->group = newlibadr(fd, part->id.lib, part->effector_weights->group); - + if (part->dupliweights.first && part->dup_group) { int index_ok = 0; /* check for old files without indices (all indexes 0) */ @@ -3442,7 +3442,7 @@ static void lib_link_particlesettings(FileData *fd, Main *main) } } } - + if (index_ok) { /* if we have indexes, let's use them */ dw = part->dupliweights.first; @@ -3460,7 +3460,7 @@ static void lib_link_particlesettings(FileData *fd, Main *main) else { part->dupliweights.first = part->dupliweights.last = NULL; } - + if (part->boids) { BoidState *state = part->boids->states.first; BoidRule *rule; @@ -3485,14 +3485,14 @@ static void lib_link_particlesettings(FileData *fd, Main *main) } } - for (a=0; amtex[a]; if (mtex) { mtex->tex = newlibadr_us(fd, part->id.lib, mtex->tex); mtex->object = newlibadr(fd, part->id.lib, mtex->object); } } - + part->id.flag -= LIB_NEEDLINK; } part= part->id.next; @@ -3501,15 +3501,15 @@ static void lib_link_particlesettings(FileData *fd, Main *main) static void direct_link_partdeflect(PartDeflect *pd) { - if (pd) pd->rng=NULL; + if (pd) pd->rng = NULL; } static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) { int a; - part->adt= newdataadr(fd, part->adt); - part->pd= newdataadr(fd, part->pd); - part->pd2= newdataadr(fd, part->pd2); + part->adt = newdataadr(fd, part->adt); + part->pd = newdataadr(fd, part->pd); + part->pd2 = newdataadr(fd, part->pd2); direct_link_animdata(fd, part->adt); direct_link_partdeflect(part->pd); @@ -3521,8 +3521,8 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) link_list(fd, &part->dupliweights); - part->boids= newdataadr(fd, part->boids); - part->fluid= newdataadr(fd, part->fluid); + part->boids = newdataadr(fd, part->boids); + part->fluid = newdataadr(fd, part->fluid); if (part->boids) { BoidState *state; @@ -3534,8 +3534,8 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) link_list(fd, &state->actions); } } - for (a=0; amtex[a]= newdataadr(fd, part->mtex[a]); + for (a = 0; a < MAX_MTEX; a++) { + part->mtex[a] = newdataadr(fd, part->mtex[a]); } } @@ -3544,32 +3544,32 @@ static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase ParticleSystem *psys, *psysnext; for (psys=particles->first; psys; psys=psysnext) { - psysnext= psys->next; + psysnext = psys->next; psys->part = newlibadr_us(fd, id->lib, psys->part); if (psys->part) { ParticleTarget *pt = psys->targets.first; - + for (; pt; pt=pt->next) pt->ob=newlibadr(fd, id->lib, pt->ob); - - psys->parent= newlibadr_us(fd, id->lib, psys->parent); + + psys->parent = newlibadr_us(fd, id->lib, psys->parent); psys->target_ob = newlibadr(fd, id->lib, psys->target_ob); - + if (psys->clmd) { /* XXX - from reading existing code this seems correct but intended usage of * pointcache should /w cloth should be added in 'ParticleSystem' - campbell */ - psys->clmd->point_cache= psys->pointcache; - psys->clmd->ptcaches.first= psys->clmd->ptcaches.last= NULL; - psys->clmd->coll_parms->group= newlibadr(fd, id->lib, psys->clmd->coll_parms->group); + psys->clmd->point_cache = psys->pointcache; + psys->clmd->ptcaches.first = psys->clmd->ptcaches.last= NULL; + psys->clmd->coll_parms->group = newlibadr(fd, id->lib, psys->clmd->coll_parms->group); } } else { /* particle modifier must be removed before particle system */ - ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys); + ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys); BLI_remlink(&ob->modifiers, psmd); modifier_free((ModifierData *)psmd); - + BLI_remlink(particles, psys); MEM_freeN(psys); } @@ -3580,7 +3580,7 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) ParticleSystem *psys; ParticleData *pa; int a; - + for (psys=particles->first; psys; psys=psys->next) { psys->particles=newdataadr(fd, psys->particles); @@ -3594,10 +3594,10 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) pa->keys= NULL; pa->totkey= 0; } - + psys->flag &= ~PSYS_KEYED; } - + if (psys->particles && psys->particles->boid) { pa = psys->particles; pa->boid = newdataadr(fd, pa->boid); @@ -3608,14 +3608,14 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) for (a=0, pa=psys->particles; atotpart; a++, pa++) pa->boid = NULL; } - + psys->fluid_springs = newdataadr(fd, psys->fluid_springs); - + psys->child = newdataadr(fd, psys->child); psys->effectors = NULL; - + link_list(fd, &psys->targets); - + psys->edit = NULL; psys->free_edit = NULL; psys->pathcache = NULL; @@ -3627,7 +3627,7 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) psys->renderdata = NULL; direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache, 0); - + if (psys->clmd) { psys->clmd = newdataadr(fd, psys->clmd); psys->clmd->clothObject = NULL; @@ -3640,12 +3640,12 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) if (psys->clmd->sim_parms->presets > 10) psys->clmd->sim_parms->presets = 0; } - + psys->hair_in_dm = psys->hair_out_dm = NULL; - + psys->clmd->point_cache = psys->pointcache; } - + psys->tree = NULL; psys->bvhtree = NULL; } @@ -3658,11 +3658,11 @@ static void lib_link_mtface(FileData *fd, Mesh *me, MTFace *mtface, int totface) { MTFace *tf= mtface; int i; - + /* Add pseudo-references (not fake users!) to images used by texface. A * little bogus; it would be better if each mesh consistently added one ref * to each image it used. - z0r */ - for (i=0; itpage= newlibadr(fd, me->id.lib, tf->tpage); if (tf->tpage && tf->tpage->id.us==0) tf->tpage->id.us= 1; @@ -3672,7 +3672,7 @@ static void lib_link_mtface(FileData *fd, Mesh *me, MTFace *mtface, int totface) static void lib_link_customdata_mtface(FileData *fd, Mesh *me, CustomData *fdata, int totface) { int i; - for (i=0; itotlayer; i++) { + for (i = 0; i < fdata->totlayer; i++) { CustomDataLayer *layer = &fdata->layers[i]; if (layer->type == CD_MTFACE) @@ -3691,11 +3691,11 @@ static void lib_link_customdata_mtpoly(FileData *fd, Mesh *me, CustomData *pdata if (layer->type == CD_MTEXPOLY) { MTexPoly *tf= layer->data; int i; - - for (i=0; itpage= newlibadr(fd, me->id.lib, tf->tpage); + + for (i = 0; i < totface; i++, tf++) { + tf->tpage = newlibadr(fd, me->id.lib, tf->tpage); if (tf->tpage && tf->tpage->id.us==0) - tf->tpage->id.us= 1; + tf->tpage->id.us = 1; } } } @@ -3704,35 +3704,35 @@ static void lib_link_customdata_mtpoly(FileData *fd, Mesh *me, CustomData *pdata static void lib_link_mesh(FileData *fd, Main *main) { Mesh *me; - - me= main->mesh.first; + + me = main->mesh.first; while (me) { if (me->id.flag & LIB_NEEDLINK) { int i; - + /* Link ID Properties -- and copy this comment EXACTLY for easy finding * of library blocks that implement this.*/ if (me->id.properties) IDP_LibLinkProperty(me->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); if (me->adt) lib_link_animdata(fd, &me->id, me->adt); - + /* this check added for python created meshes */ if (me->mat) { for (i=0; itotcol; i++) { - me->mat[i]= newlibadr_us(fd, me->id.lib, me->mat[i]); + me->mat[i] = newlibadr_us(fd, me->id.lib, me->mat[i]); } } - else me->totcol= 0; - - me->ipo= newlibadr_us(fd, me->id.lib, me->ipo); - me->key= newlibadr_us(fd, me->id.lib, me->key); - me->texcomesh= newlibadr_us(fd, me->id.lib, me->texcomesh); - + else me->totcol = 0; + + me->ipo = newlibadr_us(fd, me->id.lib, me->ipo); + me->key = newlibadr_us(fd, me->id.lib, me->key); + me->texcomesh = newlibadr_us(fd, me->id.lib, me->texcomesh); + lib_link_customdata_mtface(fd, me, &me->fdata, me->totface); lib_link_customdata_mtpoly(fd, me, &me->pdata, me->totpoly); if (me->mr && me->mr->levels.first) lib_link_customdata_mtface(fd, me, &me->mr->fdata, ((MultiresLevel*)me->mr->levels.first)->totface); - + /*check if we need to convert mfaces to mpolys*/ if (me->totface && !me->totpoly) { /* temporarily switch main so that reading from @@ -3741,7 +3741,7 @@ static void lib_link_mesh(FileData *fd, Main *main) G.main = main; BKE_mesh_convert_mfaces_to_mpolys(me); - + G.main = gmain; } @@ -3760,12 +3760,12 @@ static void lib_link_mesh(FileData *fd, Main *main) #else BKE_mesh_tessface_clear(me); #endif - + me->id.flag -= LIB_NEEDLINK; } - me= me->id.next; + me = me->id.next; } - + /* convert texface options to material */ convert_tface_mt(fd, main); } @@ -3773,24 +3773,24 @@ static void lib_link_mesh(FileData *fd, Main *main) static void direct_link_dverts(FileData *fd, int count, MDeformVert *mdverts) { int i; - + if (mdverts == NULL) { return; } - - for (i= count; i > 0; i--, mdverts++) { + + for (i = count; i > 0; i--, mdverts++) { /*convert to vgroup allocation system*/ MDeformWeight *dw; - if (mdverts->dw && (dw= newdataadr(fd, mdverts->dw))) { - const ssize_t dw_len= mdverts->totweight * sizeof(MDeformWeight); - void *dw_tmp= MEM_mallocN(dw_len, "direct_link_dverts"); + if (mdverts->dw && (dw = newdataadr(fd, mdverts->dw))) { + const ssize_t dw_len = mdverts->totweight * sizeof(MDeformWeight); + void *dw_tmp = MEM_mallocN(dw_len, "direct_link_dverts"); memcpy(dw_tmp, dw, dw_len); - mdverts->dw= dw_tmp; + mdverts->dw = dw_tmp; MEM_freeN(dw); } else { - mdverts->dw= NULL; - mdverts->totweight= 0; + mdverts->dw = NULL; + mdverts->totweight = 0; } } } @@ -3799,11 +3799,11 @@ static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps, int exte { if (mdisps) { int i; - + for (i = 0; i < count; ++i) { mdisps[i].disps = newdataadr(fd, mdisps[i].disps); mdisps[i].hidden = newdataadr(fd, mdisps[i].hidden); - + if (mdisps[i].totdisp && !mdisps[i].level) { /* this calculation is only correct for loop mdisps; * if loading pre-BMesh face mdisps this will be @@ -3812,13 +3812,13 @@ static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps, int exte float gridsize = sqrtf(mdisps[i].totdisp); mdisps[i].level = (int)(logf(gridsize - 1.0f) / (float)M_LN2) + 1; } - - if ( (fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps) ) { + + if ((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps)) { /* DNA_struct_switch_endian doesn't do endian swap for (*disps)[] */ /* this does swap for data written at write_mdisps() - readfile.c */ int x; - float *tmpdisps= *mdisps[i].disps; - for (x=0;xdata) + if (gpm->data) gpm->data = newdataadr(fd, gpm->data); } } @@ -3846,24 +3846,24 @@ static void direct_link_grid_paint_mask(FileData *fd, int count, GridPaintMask * static void direct_link_customdata(FileData *fd, CustomData *data, int count) { int i = 0; - - data->layers= newdataadr(fd, data->layers); - + + data->layers = newdataadr(fd, data->layers); + /* annoying workaround for bug [#31079] loading legacy files with * no polygons _but_ have stale customdata */ if (UNLIKELY(count == 0 && data->layers == NULL && data->totlayer != 0)) { memset(data, 0, sizeof(*data)); return; } - - data->external= newdataadr(fd, data->external); - + + data->external = newdataadr(fd, data->external); + while (i < data->totlayer) { CustomDataLayer *layer = &data->layers[i]; - + if (layer->flag & CD_FLAG_EXTERNAL) layer->flag &= ~CD_FLAG_IN_MEMORY; - + if (CustomData_verify_versions(data, i)) { layer->data = newdataadr(fd, layer->data); if (layer->type == CD_MDISPS) @@ -3873,7 +3873,7 @@ static void direct_link_customdata(FileData *fd, CustomData *data, int count) i++; } } - + CustomData_update_typemap(data); } @@ -3881,68 +3881,67 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) { mesh->mat= newdataadr(fd, mesh->mat); test_pointer_array(fd, (void **)&mesh->mat); - - mesh->mvert= newdataadr(fd, mesh->mvert); - mesh->medge= newdataadr(fd, mesh->medge); - mesh->mface= newdataadr(fd, mesh->mface); - mesh->mloop= newdataadr(fd, mesh->mloop); - mesh->mpoly= newdataadr(fd, mesh->mpoly); - mesh->tface= newdataadr(fd, mesh->tface); - mesh->mtface= newdataadr(fd, mesh->mtface); - mesh->mcol= newdataadr(fd, mesh->mcol); - mesh->msticky= newdataadr(fd, mesh->msticky); - mesh->dvert= newdataadr(fd, mesh->dvert); - mesh->mloopcol= newdataadr(fd, mesh->mloopcol); - mesh->mloopuv= newdataadr(fd, mesh->mloopuv); - mesh->mtpoly= newdataadr(fd, mesh->mtpoly); + + mesh->mvert = newdataadr(fd, mesh->mvert); + mesh->medge = newdataadr(fd, mesh->medge); + mesh->mface = newdataadr(fd, mesh->mface); + mesh->mloop = newdataadr(fd, mesh->mloop); + mesh->mpoly = newdataadr(fd, mesh->mpoly); + mesh->tface = newdataadr(fd, mesh->tface); + mesh->mtface = newdataadr(fd, mesh->mtface); + mesh->mcol = newdataadr(fd, mesh->mcol); + mesh->msticky = newdataadr(fd, mesh->msticky); + mesh->dvert = newdataadr(fd, mesh->dvert); + mesh->mloopcol = newdataadr(fd, mesh->mloopcol); + mesh->mloopuv = newdataadr(fd, mesh->mloopuv); + mesh->mtpoly = newdataadr(fd, mesh->mtpoly); mesh->mselect = newdataadr(fd, mesh->mselect); - + /* animdata */ - mesh->adt= newdataadr(fd, mesh->adt); + mesh->adt = newdataadr(fd, mesh->adt); direct_link_animdata(fd, mesh->adt); - + /* normally direct_link_dverts should be called in direct_link_customdata, * but for backwards compat in do_versions to work we do it here */ direct_link_dverts(fd, mesh->totvert, mesh->dvert); - + direct_link_customdata(fd, &mesh->vdata, mesh->totvert); direct_link_customdata(fd, &mesh->edata, mesh->totedge); direct_link_customdata(fd, &mesh->fdata, mesh->totface); direct_link_customdata(fd, &mesh->ldata, mesh->totloop); direct_link_customdata(fd, &mesh->pdata, mesh->totpoly); - + #ifdef USE_BMESH_FORWARD_COMPAT /* NEVER ENABLE THIS CODE INTO BMESH! * THIS IS FOR LOADING BMESH INTO OLDER FILES ONLY */ - mesh->mpoly= newdataadr(fd, mesh->mpoly); - mesh->mloop= newdataadr(fd, mesh->mloop); + mesh->mpoly = newdataadr(fd, mesh->mpoly); + mesh->mloop = newdataadr(fd, mesh->mloop); direct_link_customdata(fd, &mesh->pdata, mesh->totpoly); direct_link_customdata(fd, &mesh->ldata, mesh->totloop); if (mesh->mpoly) { /* be clever and load polygons as mfaces */ - mesh->totface= BKE_mesh_mpoly_to_mface(&mesh->fdata, &mesh->ldata, &mesh->pdata, mesh->totface, mesh->totloop, mesh->totpoly); - + CustomData_free(&mesh->pdata, mesh->totpoly); memset(&mesh->pdata, 0, sizeof(CustomData)); mesh->totpoly = 0; - + CustomData_free(&mesh->ldata, mesh->totloop); memset(&mesh->ldata, 0, sizeof(CustomData)); mesh->totloop = 0; - + mesh_update_customdata_pointers(mesh); } #endif - - - mesh->bb= NULL; - mesh->edit_btmesh= NULL; + + + mesh->bb = NULL; + mesh->edit_btmesh = NULL; /* Multires data */ mesh->mr= newdataadr(fd, mesh->mr); @@ -3950,15 +3949,15 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) MultiresLevel *lvl; link_list(fd, &mesh->mr->levels); - lvl= mesh->mr->levels.first; + lvl = mesh->mr->levels.first; direct_link_customdata(fd, &mesh->mr->vdata, lvl->totvert); direct_link_dverts(fd, lvl->totvert, CustomData_get(&mesh->mr->vdata, 0, CD_MDEFORMVERT)); direct_link_customdata(fd, &mesh->mr->fdata, lvl->totface); - mesh->mr->edge_flags= newdataadr(fd, mesh->mr->edge_flags); - mesh->mr->edge_creases= newdataadr(fd, mesh->mr->edge_creases); - + mesh->mr->edge_flags = newdataadr(fd, mesh->mr->edge_flags); + mesh->mr->edge_creases = newdataadr(fd, mesh->mr->edge_creases); + mesh->mr->verts = newdataadr(fd, mesh->mr->verts); /* If mesh has the same number of vertices as the @@ -3991,7 +3990,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) if ((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && mesh->tface) { TFace *tf= mesh->tface; int i; - + for (i=0; i< (mesh->totface); i++, tf++) { SWITCH_INT(tf->col[0]); SWITCH_INT(tf->col[1]); @@ -4007,13 +4006,13 @@ static void lib_link_latt(FileData *fd, Main *main) { Lattice *lt; - lt= main->latt.first; + lt = main->latt.first; while (lt) { if (lt->id.flag & LIB_NEEDLINK) { if (lt->adt) lib_link_animdata(fd, <->id, lt->adt); - lt->ipo= newlibadr_us(fd, lt->id.lib, lt->ipo); // XXX depreceated - old animation system - lt->key= newlibadr_us(fd, lt->id.lib, lt->key); + lt->ipo = newlibadr_us(fd, lt->id.lib, lt->ipo); // XXX depreceated - old animation system + lt->key = newlibadr_us(fd, lt->id.lib, lt->key); lt->id.flag -= LIB_NEEDLINK; } @@ -4023,12 +4022,12 @@ static void lib_link_latt(FileData *fd, Main *main) static void direct_link_latt(FileData *fd, Lattice *lt) { - lt->def= newdataadr(fd, lt->def); + lt->def = newdataadr(fd, lt->def); - lt->dvert= newdataadr(fd, lt->dvert); + lt->dvert = newdataadr(fd, lt->dvert); direct_link_dverts(fd, lt->pntsu*lt->pntsv*lt->pntsw, lt->dvert); - lt->editlatt= NULL; + lt->editlatt = NULL; lt->adt = newdataadr(fd, lt->adt); direct_link_animdata(fd, lt->adt); @@ -4061,29 +4060,29 @@ static void lib_link_object(FileData *fd, Main *main) bActuator *act; void *poin; int warn=0, a; - - ob= main->object.first; + + ob = main->object.first; while (ob) { if (ob->id.flag & LIB_NEEDLINK) { if (ob->id.properties) IDP_LibLinkProperty(ob->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); if (ob->adt) lib_link_animdata(fd, &ob->id, ob->adt); // XXX depreceated - old animation system <<< - ob->ipo= newlibadr_us(fd, ob->id.lib, ob->ipo); + ob->ipo = newlibadr_us(fd, ob->id.lib, ob->ipo); ob->action = newlibadr_us(fd, ob->id.lib, ob->action); // >>> XXX depreceated - old animation system - ob->parent= newlibadr(fd, ob->id.lib, ob->parent); - ob->track= newlibadr(fd, ob->id.lib, ob->track); - ob->poselib= newlibadr_us(fd, ob->id.lib, ob->poselib); - ob->dup_group= newlibadr_us(fd, ob->id.lib, ob->dup_group); + ob->parent = newlibadr(fd, ob->id.lib, ob->parent); + ob->track = newlibadr(fd, ob->id.lib, ob->track); + ob->poselib = newlibadr_us(fd, ob->id.lib, ob->poselib); + ob->dup_group = newlibadr_us(fd, ob->id.lib, ob->dup_group); - ob->proxy= newlibadr_us(fd, ob->id.lib, ob->proxy); + ob->proxy = newlibadr_us(fd, ob->id.lib, ob->proxy); if (ob->proxy) { /* paranoia check, actually a proxy_from pointer should never be written... */ - if (ob->proxy->id.lib==NULL) { - ob->proxy->proxy_from= NULL; - ob->proxy= NULL; + if (ob->proxy->id.lib == NULL) { + ob->proxy->proxy_from = NULL; + ob->proxy = NULL; if (ob->id.lib) printf("Proxy lost from object %s lib %s\n", ob->id.name+2, ob->id.lib->name); @@ -4092,47 +4091,48 @@ static void lib_link_object(FileData *fd, Main *main) } else { /* this triggers object_update to always use a copy */ - ob->proxy->proxy_from= ob; + ob->proxy->proxy_from = ob; /* force proxy updates after load/undo, a bit weak */ - ob->recalc= ob->proxy->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; + ob->recalc = ob->proxy->recalc = (OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); } } - ob->proxy_group= newlibadr(fd, ob->id.lib, ob->proxy_group); + ob->proxy_group = newlibadr(fd, ob->id.lib, ob->proxy_group); + + poin = ob->data; + ob->data = newlibadr_us(fd, ob->id.lib, ob->data); - poin= ob->data; - ob->data= newlibadr_us(fd, ob->id.lib, ob->data); - if (ob->data==NULL && poin!=NULL) { if (ob->id.lib) printf("Can't find obdata of %s lib %s\n", ob->id.name+2, ob->id.lib->name); else printf("Object %s lost data.\n", ob->id.name+2); - - ob->type= OB_EMPTY; - warn= 1; - + + ob->type = OB_EMPTY; + warn = 1; + if (ob->pose) { BKE_pose_free(ob->pose); ob->pose= NULL; ob->mode &= ~OB_MODE_POSE; } } - for (a=0; atotcol; a++) ob->mat[a]= newlibadr_us(fd, ob->id.lib, ob->mat[a]); + for (a=0; a < ob->totcol; a++) + ob->mat[a] = newlibadr_us(fd, ob->id.lib, ob->mat[a]); /* When the object is local and the data is library its possible * the material list size gets out of sync. [#22663] */ if (ob->data && ob->id.lib != ((ID *)ob->data)->lib) { - short *totcol_data= give_totcolp(ob); + short *totcol_data = give_totcolp(ob); /* Only expand so as not to loose any object materials that might be set. */ - if (totcol_data && *totcol_data > ob->totcol) { + if (totcol_data && (*totcol_data > ob->totcol)) { /* printf("'%s' %d -> %d\n", ob->id.name, ob->totcol, *totcol_data); */ resize_object_material(ob, *totcol_data); } } - - ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd); - ob->duplilist= NULL; - + + ob->gpd = newlibadr_us(fd, ob->id.lib, ob->gpd); + ob->duplilist = NULL; + ob->id.flag -= LIB_NEEDLINK; /* if id.us==0 a new base will be created later on */ @@ -4144,75 +4144,70 @@ static void lib_link_object(FileData *fd, Main *main) lib_link_constraint_channels(fd, &ob->id, &ob->constraintChannels); lib_link_nlastrips(fd, &ob->id, &ob->nlastrips); // >>> XXX depreceated - old animation system - + for (paf= ob->effect.first; paf; paf= paf->next) { - if (paf->type==EFF_PARTICLE) { - paf->group= newlibadr_us(fd, ob->id.lib, paf->group); + if (paf->type == EFF_PARTICLE) { + paf->group = newlibadr_us(fd, ob->id.lib, paf->group); } } - - sens= ob->sensors.first; - while (sens) { + + for (sens = ob->sensors.first; sens; sens = sens->next) { for (a=0; atotlinks; a++) - sens->links[a]= newglobadr(fd, sens->links[a]); - + sens->links[a] = newglobadr(fd, sens->links[a]); + if (sens->type==SENS_TOUCH) { - bTouchSensor *ts= sens->data; + bTouchSensor *ts = sens->data; ts->ma= newlibadr(fd, ob->id.lib, ts->ma); } else if (sens->type==SENS_MESSAGE) { bMessageSensor *ms= sens->data; - ms->fromObject= + ms->fromObject = newlibadr(fd, ob->id.lib, ms->fromObject); } - sens= sens->next; } - - cont= ob->controllers.first; - while (cont) { + + for (cont = ob->controllers.first; cont; cont = cont->next) { for (a=0; atotlinks; a++) - cont->links[a]= newglobadr(fd, cont->links[a]); - - if (cont->type==CONT_PYTHON) { - bPythonCont *pc= cont->data; - pc->text= newlibadr(fd, ob->id.lib, pc->text); + cont->links[a] = newglobadr(fd, cont->links[a]); + + if (cont->type == CONT_PYTHON) { + bPythonCont *pc = cont->data; + pc->text = newlibadr(fd, ob->id.lib, pc->text); } - cont->slinks= NULL; - cont->totslinks= 0; - - cont= cont->next; + cont->slinks = NULL; + cont->totslinks = 0; } - + act= ob->actuators.first; while (act) { - if (act->type==ACT_SOUND) { - bSoundActuator *sa= act->data; + if (act->type == ACT_SOUND) { + bSoundActuator *sa = act->data; sa->sound= newlibadr_us(fd, ob->id.lib, sa->sound); } - else if (act->type==ACT_GAME) { + else if (act->type == ACT_GAME) { /* bGameActuator *ga= act->data; */ } - else if (act->type==ACT_CAMERA) { - bCameraActuator *ca= act->data; + else if (act->type == ACT_CAMERA) { + bCameraActuator *ca = act->data; ca->ob= newlibadr(fd, ob->id.lib, ca->ob); } /* leave this one, it's obsolete but necessary to read for conversion */ - else if (act->type==ACT_ADD_OBJECT) { - bAddObjectActuator *eoa= act->data; + else if (act->type == ACT_ADD_OBJECT) { + bAddObjectActuator *eoa = act->data; if (eoa) eoa->ob= newlibadr(fd, ob->id.lib, eoa->ob); } - else if (act->type==ACT_OBJECT) { - bObjectActuator *oa= act->data; - if (oa==NULL) { + else if (act->type == ACT_OBJECT) { + bObjectActuator *oa = act->data; + if (oa == NULL) { init_actuator(act); } else { - oa->reference= newlibadr(fd, ob->id.lib, oa->reference); + oa->reference = newlibadr(fd, ob->id.lib, oa->reference); } } - else if (act->type==ACT_EDIT_OBJECT) { - bEditObjectActuator *eoa= act->data; - if (eoa==NULL) { + else if (act->type == ACT_EDIT_OBJECT) { + bEditObjectActuator *eoa = act->data; + if (eoa == NULL) { init_actuator(act); } else { @@ -4220,44 +4215,44 @@ static void lib_link_object(FileData *fd, Main *main) eoa->me= newlibadr(fd, ob->id.lib, eoa->me); } } - else if (act->type==ACT_SCENE) { - bSceneActuator *sa= act->data; + else if (act->type == ACT_SCENE) { + bSceneActuator *sa = act->data; sa->camera= newlibadr(fd, ob->id.lib, sa->camera); sa->scene= newlibadr(fd, ob->id.lib, sa->scene); } - else if (act->type==ACT_ACTION) { - bActionActuator *aa= act->data; + else if (act->type == ACT_ACTION) { + bActionActuator *aa = act->data; aa->act= newlibadr(fd, ob->id.lib, aa->act); } - else if (act->type==ACT_SHAPEACTION) { - bActionActuator *aa= act->data; + else if (act->type == ACT_SHAPEACTION) { + bActionActuator *aa = act->data; aa->act= newlibadr(fd, ob->id.lib, aa->act); } - else if (act->type==ACT_PROPERTY) { - bPropertyActuator *pa= act->data; + else if (act->type == ACT_PROPERTY) { + bPropertyActuator *pa = act->data; pa->ob= newlibadr(fd, ob->id.lib, pa->ob); } - else if (act->type==ACT_MESSAGE) { - bMessageActuator *ma= act->data; + else if (act->type == ACT_MESSAGE) { + bMessageActuator *ma = act->data; ma->toObject= newlibadr(fd, ob->id.lib, ma->toObject); } - else if (act->type==ACT_2DFILTER) { + else if (act->type == ACT_2DFILTER) { bTwoDFilterActuator *_2dfa = act->data; _2dfa->text= newlibadr(fd, ob->id.lib, _2dfa->text); } - else if (act->type==ACT_PARENT) { + else if (act->type == ACT_PARENT) { bParentActuator *parenta = act->data; parenta->ob = newlibadr(fd, ob->id.lib, parenta->ob); } - else if (act->type==ACT_STATE) { + else if (act->type == ACT_STATE) { /* bStateActuator *statea = act->data; */ } - else if (act->type==ACT_ARMATURE) { + else if (act->type == ACT_ARMATURE) { bArmatureActuator *arma= act->data; arma->target= newlibadr(fd, ob->id.lib, arma->target); arma->subtarget= newlibadr(fd, ob->id.lib, arma->subtarget); } - else if (act->type==ACT_STEERING) { + 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); @@ -4271,28 +4266,28 @@ static void lib_link_object(FileData *fd, Main *main) if (fluidmd && fluidmd->fss) fluidmd->fss->ipo = newlibadr_us(fd, ob->id.lib, fluidmd->fss->ipo); } - + { SmokeModifierData *smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke); - if (smd && smd->type == MOD_SMOKE_TYPE_DOMAIN && smd->domain) { + if (smd && (smd->type == MOD_SMOKE_TYPE_DOMAIN) && smd->domain) { smd->domain->flags |= MOD_SMOKE_FILE_LOAD; /* flag for refreshing the simulation after loading */ } } - + /* texture field */ if (ob->pd) lib_link_partdeflect(fd, &ob->id, ob->pd); - + if (ob->soft) ob->soft->effector_weights->group = newlibadr(fd, ob->id.lib, ob->soft->effector_weights->group); - + lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem); lib_link_modifiers(fd, ob); } - ob= ob->id.next; + ob = ob->id.next; } - + if (warn) { BKE_report(fd->reports, RPT_WARNING, "Warning in console"); } @@ -4309,13 +4304,13 @@ static void direct_link_pose(FileData *fd, bPose *pose) link_list(fd, &pose->chanbase); link_list(fd, &pose->agroups); - pose->chanhash= NULL; + pose->chanhash = NULL; for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) { - pchan->bone= NULL; - pchan->parent= newdataadr(fd, pchan->parent); - pchan->child= newdataadr(fd, pchan->child); - pchan->custom_tx= newdataadr(fd, pchan->custom_tx); + pchan->bone = NULL; + pchan->parent = newdataadr(fd, pchan->parent); + pchan->child = newdataadr(fd, pchan->child); + pchan->custom_tx = newdataadr(fd, pchan->custom_tx); direct_link_constraints(fd, &pchan->constraints); @@ -4323,12 +4318,12 @@ static void direct_link_pose(FileData *fd, bPose *pose) if (pchan->prop) IDP_DirectLinkProperty(pchan->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); - pchan->mpath= newdataadr(fd, pchan->mpath); + pchan->mpath = newdataadr(fd, pchan->mpath); if (pchan->mpath) direct_link_motionpath(fd, pchan->mpath); - pchan->iktree.first= pchan->iktree.last= NULL; - pchan->siktree.first= pchan->siktree.last= NULL; + pchan->iktree.first = pchan->iktree.last = NULL; + pchan->siktree.first = pchan->siktree.last = NULL; /* in case this value changes in future, clamp else we get undefined behavior */ CLAMP(pchan->rotmode, ROT_MODE_MIN, ROT_MODE_MAX); @@ -4342,68 +4337,68 @@ static void direct_link_pose(FileData *fd, bPose *pose) static void direct_link_modifiers(FileData *fd, ListBase *lb) { ModifierData *md; - + link_list(fd, lb); - + for (md=lb->first; md; md=md->next) { md->error = NULL; md->scene = NULL; /* if modifiers disappear, or for upward compatibility */ - if (NULL==modifierType_getInfo(md->type)) - md->type= eModifierType_None; + if (NULL == modifierType_getInfo(md->type)) + md->type = eModifierType_None; + + if (md->type == eModifierType_Subsurf) { + SubsurfModifierData *smd = (SubsurfModifierData *)md; - if (md->type==eModifierType_Subsurf) { - SubsurfModifierData *smd = (SubsurfModifierData*) md; - smd->emCache = smd->mCache = NULL; } - else if (md->type==eModifierType_Armature) { - ArmatureModifierData *amd = (ArmatureModifierData*) md; + else if (md->type == eModifierType_Armature) { + ArmatureModifierData *amd = (ArmatureModifierData *)md; - amd->prevCos= NULL; + amd->prevCos = NULL; } - else if (md->type==eModifierType_Cloth) { - ClothModifierData *clmd = (ClothModifierData*) md; + else if (md->type == eModifierType_Cloth) { + ClothModifierData *clmd = (ClothModifierData *)md; clmd->clothObject = NULL; clmd->sim_parms= newdataadr(fd, clmd->sim_parms); clmd->coll_parms= newdataadr(fd, clmd->coll_parms); - + direct_link_pointcache_list(fd, &clmd->ptcaches, &clmd->point_cache, 0); if (clmd->sim_parms) { if (clmd->sim_parms->presets > 10) clmd->sim_parms->presets = 0; - + clmd->sim_parms->reset = 0; - + clmd->sim_parms->effector_weights = newdataadr(fd, clmd->sim_parms->effector_weights); - + if (!clmd->sim_parms->effector_weights) { clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL); } } } - else if (md->type==eModifierType_Fluidsim) { - FluidsimModifierData *fluidmd = (FluidsimModifierData*) md; + else if (md->type == eModifierType_Fluidsim) { + FluidsimModifierData *fluidmd = (FluidsimModifierData *)md; - fluidmd->fss= newdataadr(fd, fluidmd->fss); + fluidmd->fss = newdataadr(fd, fluidmd->fss); if (fluidmd->fss) { - fluidmd->fss->fmd= fluidmd; + fluidmd->fss->fmd = fluidmd; fluidmd->fss->meshVelocities = NULL; } } - else if (md->type==eModifierType_Smoke) { - SmokeModifierData *smd = (SmokeModifierData*) md; - - if (smd->type==MOD_SMOKE_TYPE_DOMAIN) { + else if (md->type == eModifierType_Smoke) { + SmokeModifierData *smd = (SmokeModifierData *)md; + + if (smd->type == MOD_SMOKE_TYPE_DOMAIN) { smd->flow = NULL; smd->coll = NULL; smd->domain = newdataadr(fd, smd->domain); smd->domain->smd = smd; - + smd->domain->fluid = NULL; smd->domain->wt = NULL; smd->domain->shadow = NULL; @@ -4414,9 +4409,9 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) smd->domain->effector_weights = newdataadr(fd, smd->domain->effector_weights); if (!smd->domain->effector_weights) smd->domain->effector_weights = BKE_add_effector_weights(NULL); - + direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]), 1); - + /* Smoke uses only one cache from now on, so store pointer convert */ if (smd->domain->ptcaches[1].first || smd->domain->point_cache[1]) { if (smd->domain->point_cache[1]) { @@ -4432,14 +4427,14 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) smd->domain->point_cache[1] = NULL; } } - else if (smd->type==MOD_SMOKE_TYPE_FLOW) { + else if (smd->type == MOD_SMOKE_TYPE_FLOW) { smd->domain = NULL; smd->coll = NULL; smd->flow = newdataadr(fd, smd->flow); smd->flow->smd = smd; smd->flow->psys = newdataadr(fd, smd->flow->psys); } - else if (smd->type==MOD_SMOKE_TYPE_COLL) { + else if (smd->type == MOD_SMOKE_TYPE_COLL) { smd->flow = NULL; smd->domain = NULL; smd->coll = newdataadr(fd, smd->coll); @@ -4449,27 +4444,26 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) } else smd->type = 0; - } } - else if (md->type==eModifierType_DynamicPaint) { - DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; - + else if (md->type == eModifierType_DynamicPaint) { + DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md; + if (pmd->canvas) { pmd->canvas = newdataadr(fd, pmd->canvas); pmd->canvas->pmd = pmd; pmd->canvas->dm = NULL; pmd->canvas->flags &= ~MOD_DPAINT_BAKING; /* just in case */ - + if (pmd->canvas->surfaces.first) { DynamicPaintSurface *surface; link_list(fd, &pmd->canvas->surfaces); - + for (surface=pmd->canvas->surfaces.first; surface; surface=surface->next) { surface->canvas = pmd->canvas; surface->data = NULL; direct_link_pointcache_list(fd, &(surface->ptcaches), &(surface->pointcache), 1); - + if (!(surface->effector_weights = newdataadr(fd, surface->effector_weights))) surface->effector_weights = BKE_add_effector_weights(NULL); } @@ -4484,9 +4478,8 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) pmd->brush->dm = NULL; } } - else if (md->type==eModifierType_Collision) { - - CollisionModifierData *collmd = (CollisionModifierData*) md; + else if (md->type == eModifierType_Collision) { + CollisionModifierData *collmd = (CollisionModifierData *)md; /* // TODO: CollisionModifier should use pointcache // + have proper reset events before enabling this @@ -4510,55 +4503,55 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) collmd->mfaces = NULL; } - else if (md->type==eModifierType_Surface) { - SurfaceModifierData *surmd = (SurfaceModifierData*) md; - + else if (md->type == eModifierType_Surface) { + SurfaceModifierData *surmd = (SurfaceModifierData *)md; + surmd->dm = NULL; surmd->bvhtree = NULL; surmd->x = NULL; surmd->v = NULL; surmd->numverts = 0; } - else if (md->type==eModifierType_Hook) { - HookModifierData *hmd = (HookModifierData*) md; - - hmd->indexar= newdataadr(fd, hmd->indexar); + else if (md->type == eModifierType_Hook) { + HookModifierData *hmd = (HookModifierData *)md; + + hmd->indexar = newdataadr(fd, hmd->indexar); if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { int a; - for (a=0; atotindex; a++) { + for (a = 0; a < hmd->totindex; a++) { SWITCH_INT(hmd->indexar[a]); } } } - else if (md->type==eModifierType_ParticleSystem) { - ParticleSystemModifierData *psmd = (ParticleSystemModifierData*) md; - + else if (md->type == eModifierType_ParticleSystem) { + ParticleSystemModifierData *psmd = (ParticleSystemModifierData *)md; + psmd->dm= NULL; psmd->psys= newdataadr(fd, psmd->psys); psmd->flag &= ~eParticleSystemFlag_psys_updated; psmd->flag |= eParticleSystemFlag_file_loaded; } - else if (md->type==eModifierType_Explode) { - ExplodeModifierData *psmd = (ExplodeModifierData*) md; - - psmd->facepa=NULL; + else if (md->type == eModifierType_Explode) { + ExplodeModifierData *psmd = (ExplodeModifierData *)md; + + psmd->facepa = NULL; } - else if (md->type==eModifierType_MeshDeform) { - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - - mmd->bindinfluences= newdataadr(fd, mmd->bindinfluences); - mmd->bindoffsets= newdataadr(fd, mmd->bindoffsets); - mmd->bindcagecos= newdataadr(fd, mmd->bindcagecos); - mmd->dyngrid= newdataadr(fd, mmd->dyngrid); - mmd->dyninfluences= newdataadr(fd, mmd->dyninfluences); - mmd->dynverts= newdataadr(fd, mmd->dynverts); - - mmd->bindweights= newdataadr(fd, mmd->bindweights); - mmd->bindcos= newdataadr(fd, mmd->bindcos); - + else if (md->type == eModifierType_MeshDeform) { + MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; + + mmd->bindinfluences = newdataadr(fd, mmd->bindinfluences); + mmd->bindoffsets = newdataadr(fd, mmd->bindoffsets); + mmd->bindcagecos = newdataadr(fd, mmd->bindcagecos); + mmd->dyngrid = newdataadr(fd, mmd->dyngrid); + mmd->dyninfluences = newdataadr(fd, mmd->dyninfluences); + mmd->dynverts = newdataadr(fd, mmd->dynverts); + + mmd->bindweights = newdataadr(fd, mmd->bindweights); + mmd->bindcos = newdataadr(fd, mmd->bindcos); + if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { int a; - + if (mmd->bindoffsets) for (a=0; atotvert+1; a++) SWITCH_INT(mmd->bindoffsets[a]); @@ -4568,7 +4561,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) if (mmd->dynverts) for (a=0; atotvert; a++) SWITCH_INT(mmd->dynverts[a]); - + if (mmd->bindweights) for (a=0; atotcagevert*mmd->totvert; a++) SWITCH_INT(mmd->bindweights[a]); @@ -4577,22 +4570,22 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) SWITCH_INT(mmd->bindcos[a]); } } - else if (md->type==eModifierType_Ocean) { - OceanModifierData *omd = (OceanModifierData*) md; + else if (md->type == eModifierType_Ocean) { + OceanModifierData *omd = (OceanModifierData *)md; omd->oceancache = NULL; omd->ocean = NULL; omd->refresh = (MOD_OCEAN_REFRESH_ADD|MOD_OCEAN_REFRESH_RESET|MOD_OCEAN_REFRESH_SIM); } - else if (md->type==eModifierType_Warp) { - WarpModifierData *tmd = (WarpModifierData *) md; - + else if (md->type == eModifierType_Warp) { + WarpModifierData *tmd = (WarpModifierData *)md; + tmd->curfalloff= newdataadr(fd, tmd->curfalloff); if (tmd->curfalloff) direct_link_curvemapping(fd, tmd->curfalloff); } - else if (md->type==eModifierType_WeightVGEdit) { - WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; - + 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); @@ -4610,30 +4603,30 @@ static void direct_link_object(FileData *fd, Object *ob) /* weak weak... this was only meant as draw flag, now is used in give_base_to_objects too */ ob->flag &= ~OB_FROMGROUP; - + /* loading saved files with editmode enabled works, but for undo we like * to stay in object mode during undo presses so keep editmode disabled */ if (fd->memfile) - ob->mode &= ~(OB_MODE_EDIT|OB_MODE_PARTICLE_EDIT); + ob->mode &= ~(OB_MODE_EDIT | OB_MODE_PARTICLE_EDIT); - ob->disp.first=ob->disp.last= NULL; + ob->disp.first = ob->disp.last = NULL; - ob->adt= newdataadr(fd, ob->adt); + ob->adt = newdataadr(fd, ob->adt); direct_link_animdata(fd, ob->adt); - ob->pose= newdataadr(fd, ob->pose); + ob->pose = newdataadr(fd, ob->pose); direct_link_pose(fd, ob->pose); - ob->mpath= newdataadr(fd, ob->mpath); + ob->mpath = newdataadr(fd, ob->mpath); if (ob->mpath) direct_link_motionpath(fd, ob->mpath); - + link_list(fd, &ob->defbase); // XXX depreceated - old animation system <<< direct_link_nlastrips(fd, &ob->nlastrips); link_list(fd, &ob->constraintChannels); // >>> XXX depreceated - old animation system - + ob->mat= newdataadr(fd, ob->mat); test_pointer_array(fd, (void **)&ob->mat); ob->matbits= newdataadr(fd, ob->matbits); @@ -4644,14 +4637,14 @@ static void direct_link_object(FileData *fd, Object *ob) link_list(fd, &ob->effect); paf= ob->effect.first; while (paf) { - if (paf->type==EFF_PARTICLE) { - paf->keys= NULL; + if (paf->type == EFF_PARTICLE) { + paf->keys = NULL; } - if (paf->type==EFF_WAVE) { + if (paf->type == EFF_WAVE) { WaveEff *wav = (WaveEff*) paf; PartEff *next = paf->next; WaveModifierData *wmd = (WaveModifierData*) modifier_new(eModifierType_Wave); - + wmd->damp = wav->damp; wmd->flag = wav->flag; wmd->height = wav->height; @@ -4662,48 +4655,48 @@ static void direct_link_object(FileData *fd, Object *ob) wmd->starty = wav->startx; wmd->timeoffs = wav->timeoffs; wmd->width = wav->width; - + BLI_addtail(&ob->modifiers, wmd); - + BLI_remlink(&ob->effect, paf); MEM_freeN(paf); - + paf = next; continue; } - if (paf->type==EFF_BUILD) { + if (paf->type == EFF_BUILD) { BuildEff *baf = (BuildEff*) paf; PartEff *next = paf->next; BuildModifierData *bmd = (BuildModifierData*) modifier_new(eModifierType_Build); - + bmd->start = baf->sfra; bmd->length = baf->len; bmd->randomize = 0; bmd->seed = 1; - + BLI_addtail(&ob->modifiers, bmd); - + BLI_remlink(&ob->effect, paf); MEM_freeN(paf); - + paf = next; continue; } - paf= paf->next; + paf = paf->next; } - + ob->pd= newdataadr(fd, ob->pd); direct_link_partdeflect(ob->pd); ob->soft= newdataadr(fd, ob->soft); if (ob->soft) { - SoftBody *sb= ob->soft; + SoftBody *sb = ob->soft; - sb->bpoint= NULL; // init pointers so it gets rebuilt nicely - sb->bspring= NULL; - sb->scratch= NULL; + sb->bpoint = NULL; // init pointers so it gets rebuilt nicely + sb->bspring = NULL; + sb->scratch = NULL; /* although not used anymore */ /* still have to be loaded to be compatible with old files */ - sb->keys= newdataadr(fd, sb->keys); + sb->keys = newdataadr(fd, sb->keys); test_pointer_array(fd, (void **)&sb->keys); if (sb->keys) { int a; @@ -4711,34 +4704,31 @@ static void direct_link_object(FileData *fd, Object *ob) sb->keys[a]= newdataadr(fd, sb->keys[a]); } } - + sb->effector_weights = newdataadr(fd, sb->effector_weights); if (!sb->effector_weights) sb->effector_weights = BKE_add_effector_weights(NULL); - + direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache, 0); } - ob->bsoft= newdataadr(fd, ob->bsoft); + ob->bsoft = newdataadr(fd, ob->bsoft); ob->fluidsimSettings= newdataadr(fd, ob->fluidsimSettings); /* NT */ link_list(fd, &ob->particlesystem); direct_link_particlesystems(fd, &ob->particlesystem); link_list(fd, &ob->prop); - prop= ob->prop.first; - while (prop) { - prop->poin= newdataadr(fd, prop->poin); - if (prop->poin==NULL) prop->poin= &prop->data; - prop= prop->next; + for (prop = ob->prop.first; prop; prop = prop->next) { + prop->poin = newdataadr(fd, prop->poin); + if (prop->poin == NULL) + prop->poin = &prop->data; } link_list(fd, &ob->sensors); - sens= ob->sensors.first; - while (sens) { - sens->data= newdataadr(fd, sens->data); - sens->links= newdataadr(fd, sens->links); + for (sens = ob->sensors.first; sens; sens = sens->next) { + sens->data = newdataadr(fd, sens->data); + sens->links = newdataadr(fd, sens->links); test_pointer_array(fd, (void **)&sens->links); - sens= sens->next; } direct_link_constraints(fd, &ob->constraints); @@ -4751,10 +4741,9 @@ static void direct_link_object(FileData *fd, Object *ob) else if (!ob->state) { ob->state = 1; } - cont= ob->controllers.first; - while (cont) { - cont->data= newdataadr(fd, cont->data); - cont->links= newdataadr(fd, cont->links); + for (cont = ob->controllers.first; cont; cont = cont->next) { + cont->data = newdataadr(fd, cont->data); + cont->links = newdataadr(fd, cont->links); test_pointer_array(fd, (void **)&cont->links); if (cont->state_mask == 0) cont->state_mask = 1; @@ -4762,17 +4751,15 @@ static void direct_link_object(FileData *fd, Object *ob) } link_glob_list(fd, &ob->actuators); - act= ob->actuators.first; - while (act) { - act->data= newdataadr(fd, act->data); - act= act->next; + for (act = ob->actuators.first; act; act = act->next) { + act->data = newdataadr(fd, act->data); } link_list(fd, &ob->hooks); while (ob->hooks.first) { ObHook *hook = ob->hooks.first; - HookModifierData *hmd = (HookModifierData*) modifier_new(eModifierType_Hook); - + HookModifierData *hmd = (HookModifierData *)modifier_new(eModifierType_Hook); + hook->indexar= newdataadr(fd, hook->indexar); if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { int a; @@ -4780,11 +4767,11 @@ static void direct_link_object(FileData *fd, Object *ob) SWITCH_INT(hook->indexar[a]); } } - - /* Do conversion here because if we have loaded - * a hook we need to make sure it gets converted - * and freed, regardless of version. - */ + + /* Do conversion here because if we have loaded + * a hook we need to make sure it gets converted + * and freed, regardless of version. + */ copy_v3_v3(hmd->cent, hook->cent); hmd->falloff = hook->falloff; hmd->force = hook->force; @@ -4792,27 +4779,27 @@ static void direct_link_object(FileData *fd, Object *ob) hmd->object = hook->parent; memcpy(hmd->parentinv, hook->parentinv, sizeof(hmd->parentinv)); hmd->totindex = hook->totindex; - + BLI_addhead(&ob->modifiers, hmd); BLI_remlink(&ob->hooks, hook); modifier_unique_name(&ob->modifiers, (ModifierData*)hmd); - + MEM_freeN(hook); } - ob->customdata_mask= 0; - ob->bb= NULL; - ob->derivedDeform= NULL; - ob->derivedFinal= NULL; - ob->gpulamp.first= ob->gpulamp.last= NULL; + ob->customdata_mask = 0; + ob->bb = NULL; + ob->derivedDeform = NULL; + ob->derivedFinal = NULL; + ob->gpulamp.first= ob->gpulamp.last = NULL; link_list(fd, &ob->pc_ids); /* in case this value changes in future, clamp else we get undefined behavior */ CLAMP(ob->rotmode, ROT_MODE_MIN, ROT_MODE_MAX); if (ob->sculpt) { - ob->sculpt= MEM_callocN(sizeof(SculptSession), "reload sculpt session"); + ob->sculpt = MEM_callocN(sizeof(SculptSession), "reload sculpt session"); } } @@ -4823,16 +4810,17 @@ static void composite_patch(bNodeTree *ntree, Scene *scene) { bNode *node; - for (node= ntree->nodes.first; node; node= node->next) + for (node= ntree->nodes.first; node; node= node->next) { if (node->id==NULL && ELEM4(node->type, CMP_NODE_R_LAYERS, CMP_NODE_COMPOSITE, CMP_NODE_DEFOCUS, CMP_NODE_OUTPUT_FILE)) - node->id= &scene->id; + node->id = &scene->id; + } } static void link_paint(FileData *fd, Scene *sce, Paint *p) { if (p) { - p->brush= newlibadr_us(fd, sce->id.lib, p->brush); - p->paint_cursor= NULL; + p->brush = newlibadr_us(fd, sce->id.lib, p->brush); + p->paint_cursor = NULL; } } @@ -4844,7 +4832,7 @@ static void lib_link_scene(FileData *fd, Main *main) SceneRenderLayer *srl; TimeMarker *marker; - sce= main->scene.first; + sce = main->scene.first; while (sce) { if (sce->id.flag & LIB_NEEDLINK) { /* Link ID Properties -- and copy this comment EXACTLY for easy finding @@ -4854,10 +4842,10 @@ static void lib_link_scene(FileData *fd, Main *main) lib_link_keyingsets(fd, &sce->id, &sce->keyingsets); - sce->camera= newlibadr(fd, sce->id.lib, sce->camera); - sce->world= newlibadr_us(fd, sce->id.lib, sce->world); - sce->set= newlibadr(fd, sce->id.lib, sce->set); - sce->gpd= newlibadr_us(fd, sce->id.lib, sce->gpd); + sce->camera = newlibadr(fd, sce->id.lib, sce->camera); + sce->world = newlibadr_us(fd, sce->id.lib, sce->world); + sce->set = newlibadr(fd, sce->id.lib, sce->set); + sce->gpd = newlibadr_us(fd, sce->id.lib, sce->gpd); link_paint(fd, sce, &sce->toolsettings->sculpt->paint); link_paint(fd, sce, &sce->toolsettings->vpaint->paint); @@ -4865,29 +4853,29 @@ static void lib_link_scene(FileData *fd, Main *main) link_paint(fd, sce, &sce->toolsettings->imapaint.paint); link_paint(fd, sce, &sce->toolsettings->uvsculpt->paint); sce->toolsettings->skgen_template = newlibadr(fd, sce->id.lib, sce->toolsettings->skgen_template); - - for (base= sce->base.first; base; base= next) { - next= base->next; - - /* base->object= newlibadr_us(fd, sce->id.lib, base->object); */ - base->object= newlibadr_us(fd, sce->id.lib, base->object); + + for (base = sce->base.first; base; base = next) { + next = base->next; - if (base->object==NULL) { + /* base->object= newlibadr_us(fd, sce->id.lib, base->object); */ + base->object = newlibadr_us(fd, sce->id.lib, base->object); + + if (base->object == NULL) { BKE_reportf_wrap(fd->reports, RPT_ERROR, "LIB ERROR: Object lost from scene:'%s\'", sce->id.name + 2); BLI_remlink(&sce->base, base); - if (base==sce->basact) sce->basact= NULL; + if (base == sce->basact) sce->basact = NULL; MEM_freeN(base); } } - + SEQ_BEGIN (sce->ed, seq) { - if (seq->ipo) seq->ipo= newlibadr_us(fd, sce->id.lib, seq->ipo); + if (seq->ipo) seq->ipo = newlibadr_us(fd, sce->id.lib, seq->ipo); seq->scene_sound = NULL; if (seq->scene) { - seq->scene= newlibadr(fd, sce->id.lib, seq->scene); + seq->scene = newlibadr(fd, sce->id.lib, seq->scene); if (seq->scene) { seq->scene_sound = sound_scene_add_scene_sound_defaults(sce, seq); } @@ -4896,32 +4884,32 @@ static void lib_link_scene(FileData *fd, Main *main) seq->clip = newlibadr(fd, sce->id.lib, seq->clip); seq->clip->id.us++; } - if (seq->scene_camera) seq->scene_camera= newlibadr(fd, sce->id.lib, seq->scene_camera); + if (seq->scene_camera) seq->scene_camera = newlibadr(fd, sce->id.lib, seq->scene_camera); if (seq->sound) { seq->scene_sound = NULL; if (seq->type == SEQ_HD_SOUND) seq->type = SEQ_SOUND; else - seq->sound= newlibadr(fd, sce->id.lib, seq->sound); + seq->sound = newlibadr(fd, sce->id.lib, seq->sound); if (seq->sound) { seq->sound->id.us++; seq->scene_sound = sound_add_scene_sound_defaults(sce, seq); } } - seq->anim= NULL; + seq->anim = NULL; } SEQ_END #ifdef DURIAN_CAMERA_SWITCH - for (marker= sce->markers.first; marker; marker= marker->next) { + for (marker = sce->markers.first; marker; marker = marker->next) { if (marker->camera) { - marker->camera= newlibadr(fd, sce->id.lib, marker->camera); + marker->camera = newlibadr(fd, sce->id.lib, marker->camera); } } #else (void)marker; #endif - + seq_update_muting(sce->ed); seq_update_sound_bounds_all(sce); @@ -4931,37 +4919,38 @@ static void lib_link_scene(FileData *fd, Main *main) } for (srl= sce->r.layers.first; srl; srl= srl->next) { - srl->mat_override= newlibadr_us(fd, sce->id.lib, srl->mat_override); - srl->light_override= newlibadr_us(fd, sce->id.lib, srl->light_override); + srl->mat_override = newlibadr_us(fd, sce->id.lib, srl->mat_override); + srl->light_override = newlibadr_us(fd, sce->id.lib, srl->light_override); } /*Game Settings: Dome Warp Text*/ - sce->gm.dome.warptext= newlibadr(fd, sce->id.lib, sce->gm.dome.warptext); - + sce->gm.dome.warptext = newlibadr(fd, sce->id.lib, sce->gm.dome.warptext); + /* Motion Tracking */ - sce->clip= newlibadr_us(fd, sce->id.lib, sce->clip); - + sce->clip = newlibadr_us(fd, sce->id.lib, sce->clip); + sce->id.flag -= LIB_NEEDLINK; } - - sce= sce->id.next; + + sce = sce->id.next; } } static void link_recurs_seq(FileData *fd, ListBase *lb) { Sequence *seq; - + link_list(fd, lb); - - for (seq=lb->first; seq; seq=seq->next) + + for (seq = lb->first; seq; seq = seq->next) { if (seq->seqbase.first) link_recurs_seq(fd, &seq->seqbase); + } } static void direct_link_paint(FileData *fd, Paint **paint) { /* TODO. is this needed */ - (*paint)= newdataadr(fd, (*paint)); + (*paint) = newdataadr(fd, (*paint)); } static void direct_link_scene(FileData *fd, Scene *sce) @@ -4969,29 +4958,29 @@ static void direct_link_scene(FileData *fd, Scene *sce) Editing *ed; Sequence *seq; MetaStack *ms; - + sce->theDag = NULL; sce->dagisvalid = 0; - sce->obedit= NULL; - sce->stats= NULL; - sce->fps_info= NULL; - sce->customdata_mask_modal= 0; + sce->obedit = NULL; + sce->stats = NULL; + sce->fps_info = NULL; + sce->customdata_mask_modal = 0; sce->lay_updated = 0; - + sound_create_scene(sce); - + /* set users to one by default, not in lib-link, this will increase it for compo nodes */ - sce->id.us= 1; - + sce->id.us = 1; + link_list(fd, &(sce->base)); - sce->adt= newdataadr(fd, sce->adt); + sce->adt = newdataadr(fd, sce->adt); direct_link_animdata(fd, sce->adt); link_list(fd, &sce->keyingsets); direct_link_keyingsets(fd, &sce->keyingsets); - sce->basact= newdataadr(fd, sce->basact); + sce->basact = newdataadr(fd, sce->basact); sce->toolsettings= newdataadr(fd, sce->toolsettings); if (sce->toolsettings) { @@ -4999,44 +4988,44 @@ static void direct_link_scene(FileData *fd, Scene *sce) direct_link_paint(fd, (Paint**)&sce->toolsettings->vpaint); direct_link_paint(fd, (Paint**)&sce->toolsettings->wpaint); direct_link_paint(fd, (Paint**)&sce->toolsettings->uvsculpt); - - sce->toolsettings->imapaint.paintcursor= NULL; - sce->toolsettings->particle.paintcursor= NULL; + + sce->toolsettings->imapaint.paintcursor = NULL; + sce->toolsettings->particle.paintcursor = NULL; } if (sce->ed) { ListBase *old_seqbasep= &((Editing *)sce->ed)->seqbase; - ed= sce->ed= newdataadr(fd, sce->ed); - - ed->act_seq= newdataadr(fd, ed->act_seq); - + ed= sce->ed = newdataadr(fd, sce->ed); + + ed->act_seq = newdataadr(fd, ed->act_seq); + /* recursive link sequences, lb will be correctly initialized */ link_recurs_seq(fd, &ed->seqbase); - + SEQ_BEGIN (ed, seq) { seq->seq1= newdataadr(fd, seq->seq1); seq->seq2= newdataadr(fd, seq->seq2); seq->seq3= newdataadr(fd, seq->seq3); /* a patch: after introduction of effects with 3 input strips */ - if (seq->seq3==NULL) seq->seq3= seq->seq2; - - seq->plugin= newdataadr(fd, seq->plugin); - seq->effectdata= newdataadr(fd, seq->effectdata); + if (seq->seq3 == NULL) seq->seq3 = seq->seq2; + + seq->plugin = newdataadr(fd, seq->plugin); + seq->effectdata = newdataadr(fd, seq->effectdata); if (seq->type & SEQ_EFFECT) seq->flag |= SEQ_EFFECT_NOT_LOADED; - + if (seq->type == SEQ_SPEED) { - SpeedControlVars *s= seq->effectdata; - s->frameMap= NULL; + SpeedControlVars *s = seq->effectdata; + s->frameMap = NULL; } - - seq->strip= newdataadr(fd, seq->strip); + + seq->strip = newdataadr(fd, seq->strip); if (seq->strip && seq->strip->done==0) { - seq->strip->done= 1; - + seq->strip->done = 1; + if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE || seq->type == SEQ_RAM_SOUND || @@ -5089,35 +5078,38 @@ static void direct_link_scene(FileData *fd, Scene *sce) char *poin; intptr_t offset; - offset= ((intptr_t)&(temp.seqbase)) - ((intptr_t)&temp); + offset = ((intptr_t)&(temp.seqbase)) - ((intptr_t)&temp); /* root pointer */ if (ed->seqbasep == old_seqbasep) { - ed->seqbasep= &ed->seqbase; + ed->seqbasep = &ed->seqbase; } else { - - poin= (char *)ed->seqbasep; + poin = (char *)ed->seqbasep; poin -= offset; - poin= newdataadr(fd, poin); - if (poin) ed->seqbasep= (ListBase *)(poin+offset); - else ed->seqbasep= &ed->seqbase; + poin = newdataadr(fd, poin); + if (poin) + ed->seqbasep = (ListBase *)(poin+offset); + else + ed->seqbasep = &ed->seqbase; } /* stack */ link_list(fd, &(ed->metastack)); - for (ms= ed->metastack.first; ms; ms= ms->next) { - ms->parseq= newdataadr(fd, ms->parseq); + for (ms = ed->metastack.first; ms; ms= ms->next) { + ms->parseq = newdataadr(fd, ms->parseq); if (ms->oldbasep == old_seqbasep) ms->oldbasep= &ed->seqbase; else { - poin= (char *)ms->oldbasep; + poin = (char *)ms->oldbasep; poin -= offset; - poin= newdataadr(fd, poin); - if (poin) ms->oldbasep= (ListBase *)(poin+offset); - else ms->oldbasep= &ed->seqbase; + poin = newdataadr(fd, poin); + if (poin) + ms->oldbasep = (ListBase *)(poin+offset); + else + ms->oldbasep = &ed->seqbase; } } } @@ -5134,20 +5126,18 @@ static void direct_link_scene(FileData *fd, Scene *sce) sce->r.qtcodecdata->cdParms = newdataadr(fd, sce->r.qtcodecdata->cdParms); } if (sce->r.ffcodecdata.properties) { - sce->r.ffcodecdata.properties = newdataadr( - fd, sce->r.ffcodecdata.properties); + sce->r.ffcodecdata.properties = newdataadr(fd, sce->r.ffcodecdata.properties); if (sce->r.ffcodecdata.properties) { - IDP_DirectLinkProperty( - sce->r.ffcodecdata.properties, + IDP_DirectLinkProperty(sce->r.ffcodecdata.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); } } - + link_list(fd, &(sce->markers)); link_list(fd, &(sce->transform_spaces)); link_list(fd, &(sce->r.layers)); - - sce->nodetree= newdataadr(fd, sce->nodetree); + + sce->nodetree = newdataadr(fd, sce->nodetree); if (sce->nodetree) direct_link_nodetree(fd, sce->nodetree); } @@ -5158,44 +5148,44 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm) { wmWindow *win; - wm->id.us= 1; - link_list(fd, &(wm->windows)); + wm->id.us = 1; + link_list(fd, &wm->windows); - for (win= wm->windows.first; win; win= win->next) { - win->ghostwin= NULL; - win->eventstate= NULL; - win->curswin= NULL; - win->tweak= NULL; - - win->queue.first= win->queue.last= NULL; - win->handlers.first= win->handlers.last= NULL; - win->modalhandlers.first= win->modalhandlers.last= NULL; - win->subwindows.first= win->subwindows.last= NULL; - win->gesture.first= win->gesture.last= NULL; - - win->drawdata= NULL; - win->drawmethod= -1; - win->drawfail= 0; + for (win = wm->windows.first; win; win = win->next) { + win->ghostwin = NULL; + win->eventstate = NULL; + win->curswin = NULL; + win->tweak = NULL; + + win->queue.first = win->queue.last = NULL; + win->handlers.first = win->handlers.last = NULL; + win->modalhandlers.first = win->modalhandlers.last = NULL; + win->subwindows.first = win->subwindows.last = NULL; + win->gesture.first = win->gesture.last = NULL; + + win->drawdata = NULL; + win->drawmethod = -1; + win->drawfail = 0; } - wm->timers.first= wm->timers.last= NULL; - wm->operators.first= wm->operators.last= NULL; - wm->paintcursors.first= wm->paintcursors.last= NULL; - wm->queue.first= wm->queue.last= NULL; + wm->timers.first = wm->timers.last = NULL; + wm->operators.first = wm->operators.last = NULL; + wm->paintcursors.first = wm->paintcursors.last = NULL; + wm->queue.first = wm->queue.last = NULL; BKE_reports_init(&wm->reports, RPT_STORE); - - wm->keyconfigs.first= wm->keyconfigs.last= NULL; - wm->defaultconf= NULL; - wm->addonconf= NULL; - wm->userconf= NULL; - - wm->jobs.first= wm->jobs.last= NULL; - wm->drags.first= wm->drags.last= NULL; - wm->windrawable= NULL; - wm->winactive= NULL; - wm->initialized= 0; - wm->op_undo_depth= 0; + wm->keyconfigs.first = wm->keyconfigs.last = NULL; + wm->defaultconf = NULL; + wm->addonconf = NULL; + wm->userconf = NULL; + + wm->jobs.first = wm->jobs.last = NULL; + wm->drags.first = wm->drags.last = NULL; + + wm->windrawable = NULL; + wm->winactive = NULL; + wm->initialized = 0; + wm->op_undo_depth = 0; } static void lib_link_windowmanager(FileData *fd, Main *main) @@ -5203,11 +5193,11 @@ static void lib_link_windowmanager(FileData *fd, Main *main) wmWindowManager *wm; wmWindow *win; - for (wm= main->wm.first; wm; wm= wm->id.next) { + for (wm = main->wm.first; wm; wm = wm->id.next) { if (wm->id.flag & LIB_NEEDLINK) { - for (win= wm->windows.first; win; win= win->next) - win->screen= newlibadr(fd, NULL, win->screen); - + for (win = wm->windows.first; win; win = win->next) + win->screen = newlibadr(fd, NULL, win->screen); + wm->id.flag -= LIB_NEEDLINK; } } @@ -5229,17 +5219,17 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd) /* relink layers */ link_list(fd, &gpd->layers); - for (gpl= gpd->layers.first; gpl; gpl= gpl->next) { + for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { /* relink frames */ link_list(fd, &gpl->frames); - gpl->actframe= newdataadr(fd, gpl->actframe); + gpl->actframe = newdataadr(fd, gpl->actframe); - for (gpf= gpl->frames.first; gpf; gpf= gpf->next) { + for (gpf = gpl->frames.first; gpf; gpf = gpf->next) { /* relink strokes (and their points) */ link_list(fd, &gpf->strokes); - for (gps= gpf->strokes.first; gps; gps= gps->next) { - gps->points= newdataadr(fd, gps->points); + for (gps = gpf->strokes.first; gps; gps = gps->next) { + gps->points = newdataadr(fd, gps->points); } } } @@ -5253,19 +5243,19 @@ static void butspace_version_132(SpaceButs *buts) buts->v2d.tot.ymin = 0.0f; buts->v2d.tot.xmax = 1279.0f; buts->v2d.tot.ymax = 228.0f; - - buts->v2d.min[0]= 256.0f; - buts->v2d.min[1]= 42.0f; - - buts->v2d.max[0]= 2048.0f; - buts->v2d.max[1]= 450.0f; - - buts->v2d.minzoom= 0.5f; - buts->v2d.maxzoom= 1.21f; - - buts->v2d.scroll= 0; - buts->v2d.keepzoom= 1; - buts->v2d.keeptot= 1; + + buts->v2d.min[0] = 256.0f; + buts->v2d.min[1] = 42.0f; + + buts->v2d.max[0] = 2048.0f; + buts->v2d.max[1] = 450.0f; + + buts->v2d.minzoom = 0.5f; + buts->v2d.maxzoom = 1.21f; + + buts->v2d.scroll = 0; + buts->v2d.keepzoom = 1; + buts->v2d.keeptot = 1; } /* note: file read without screens option G_FILE_NO_UI; @@ -5274,22 +5264,22 @@ static void lib_link_screen(FileData *fd, Main *main) { bScreen *sc; ScrArea *sa; - - for (sc= main->screen.first; sc; sc= sc->id.next) { + + for (sc = main->screen.first; sc; sc = sc->id.next) { if (sc->id.flag & LIB_NEEDLINK) { - sc->id.us= 1; + sc->id.us = 1; sc->scene= newlibadr(fd, sc->id.lib, sc->scene); - sc->animtimer= NULL; /* saved in rare cases */ + sc->animtimer = NULL; /* saved in rare cases */ sa= sc->areabase.first; while (sa) { SpaceLink *sl; - sa->full= newlibadr(fd, sc->id.lib, sa->full); + sa->full = newlibadr(fd, sc->id.lib, sa->full); - for (sl= sa->spacedata.first; sl; sl= sl->next) { - if (sl->spacetype==SPACE_VIEW3D) { - View3D *v3d= (View3D*) sl; + for (sl = sa->spacedata.first; sl; sl= sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D*) sl; BGpic *bgpic = NULL; v3d->camera= newlibadr(fd, sc->id.lib, v3d->camera); @@ -5297,140 +5287,138 @@ static void lib_link_screen(FileData *fd, Main *main) /* should be do_versions but not easy adding into the listbase */ if (v3d->bgpic) { - v3d->bgpic= newlibadr(fd, sc->id.lib, v3d->bgpic); + v3d->bgpic = newlibadr(fd, sc->id.lib, v3d->bgpic); BLI_addtail(&v3d->bgpicbase, bgpic); - v3d->bgpic= NULL; + v3d->bgpic = NULL; } - - for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) { - bgpic->ima= newlibadr_us(fd, sc->id.lib, bgpic->ima); - bgpic->clip= newlibadr_us(fd, sc->id.lib, bgpic->clip); + + for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) { + bgpic->ima = newlibadr_us(fd, sc->id.lib, bgpic->ima); + bgpic->clip = newlibadr_us(fd, sc->id.lib, bgpic->clip); } if (v3d->localvd) { - v3d->localvd->camera= newlibadr(fd, sc->id.lib, v3d->localvd->camera); + v3d->localvd->camera = newlibadr(fd, sc->id.lib, v3d->localvd->camera); } } - else if (sl->spacetype==SPACE_IPO) { - SpaceIpo *sipo= (SpaceIpo *)sl; - bDopeSheet *ads= sipo->ads; + else if (sl->spacetype == SPACE_IPO) { + SpaceIpo *sipo = (SpaceIpo *)sl; + bDopeSheet *ads = sipo->ads; if (ads) { - ads->source= newlibadr(fd, sc->id.lib, ads->source); - ads->filter_grp= newlibadr(fd, sc->id.lib, ads->filter_grp); + ads->source = newlibadr(fd, sc->id.lib, ads->source); + ads->filter_grp = newlibadr(fd, sc->id.lib, ads->filter_grp); } } - else if (sl->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= (SpaceButs *)sl; - sbuts->pinid= newlibadr(fd, sc->id.lib, sbuts->pinid); - sbuts->mainbo= sbuts->mainb; - sbuts->mainbuser= sbuts->mainb; - if (main->versionfile<132) + else if (sl->spacetype == SPACE_BUTS) { + SpaceButs *sbuts = (SpaceButs *)sl; + sbuts->pinid = newlibadr(fd, sc->id.lib, sbuts->pinid); + sbuts->mainbo = sbuts->mainb; + sbuts->mainbuser = sbuts->mainb; + if (main->versionfile < 132) butspace_version_132(sbuts); } - else if (sl->spacetype==SPACE_FILE) { - SpaceFile *sfile= (SpaceFile *)sl; - sfile->files= NULL; - sfile->op= NULL; - sfile->layout= NULL; - sfile->folders_prev= NULL; - sfile->folders_next= NULL; + else if (sl->spacetype == SPACE_FILE) { + SpaceFile *sfile = (SpaceFile *)sl; + sfile->files = NULL; + sfile->op = NULL; + sfile->layout = NULL; + sfile->folders_prev = NULL; + sfile->folders_next = NULL; } - else if (sl->spacetype==SPACE_ACTION) { - SpaceAction *saction= (SpaceAction *)sl; - bDopeSheet *ads= &saction->ads; + else if (sl->spacetype == SPACE_ACTION) { + SpaceAction *saction = (SpaceAction *)sl; + bDopeSheet *ads = &saction->ads; if (ads) { - ads->source= newlibadr(fd, sc->id.lib, ads->source); - ads->filter_grp= newlibadr(fd, sc->id.lib, ads->filter_grp); + ads->source = newlibadr(fd, sc->id.lib, ads->source); + ads->filter_grp = newlibadr(fd, sc->id.lib, ads->filter_grp); } saction->action = newlibadr(fd, sc->id.lib, saction->action); } - else if (sl->spacetype==SPACE_IMAGE) { - SpaceImage *sima= (SpaceImage *)sl; - - sima->image= newlibadr_us(fd, sc->id.lib, sima->image); + else if (sl->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)sl; + + sima->image = newlibadr_us(fd, sc->id.lib, sima->image); /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data * so fingers crossed this works fine! */ - sima->gpd= newlibadr_us(fd, sc->id.lib, sima->gpd); + sima->gpd = newlibadr_us(fd, sc->id.lib, sima->gpd); } - else if (sl->spacetype==SPACE_NLA) { + else if (sl->spacetype == SPACE_NLA) { SpaceNla *snla= (SpaceNla *)sl; bDopeSheet *ads= snla->ads; if (ads) { - ads->source= newlibadr(fd, sc->id.lib, ads->source); - ads->filter_grp= newlibadr(fd, sc->id.lib, ads->filter_grp); + ads->source = newlibadr(fd, sc->id.lib, ads->source); + ads->filter_grp = newlibadr(fd, sc->id.lib, ads->filter_grp); } } - else if (sl->spacetype==SPACE_TEXT) { + else if (sl->spacetype == SPACE_TEXT) { SpaceText *st= (SpaceText *)sl; - + st->text= newlibadr(fd, sc->id.lib, st->text); st->drawcache= NULL; - } - else if (sl->spacetype==SPACE_SCRIPT) { - - SpaceScript *scpt= (SpaceScript *)sl; + else if (sl->spacetype == SPACE_SCRIPT) { + SpaceScript *scpt = (SpaceScript *)sl; /*scpt->script = NULL; - 2.45 set to null, better re-run the script */ if (scpt->script) { - scpt->script= newlibadr(fd, sc->id.lib, scpt->script); + scpt->script = newlibadr(fd, sc->id.lib, scpt->script); if (scpt->script) { SCRIPT_SET_NULL(scpt->script); } } } - else if (sl->spacetype==SPACE_OUTLINER) { + else if (sl->spacetype == SPACE_OUTLINER) { SpaceOops *so= (SpaceOops *)sl; TreeStoreElem *tselem; int a; - - so->tree.first= so->tree.last= NULL; - so->search_tse.id= newlibadr(fd, NULL, so->search_tse.id); + + so->tree.first = so->tree.last= NULL; + so->search_tse.id = newlibadr(fd, NULL, so->search_tse.id); if (so->treestore) { - tselem= so->treestore->data; - for (a=0; atreestore->usedelem; a++, tselem++) { - tselem->id= newlibadr(fd, NULL, tselem->id); + tselem = so->treestore->data; + for (a=0; a < so->treestore->usedelem; a++, tselem++) { + tselem->id = newlibadr(fd, NULL, tselem->id); } } } - else if (sl->spacetype==SPACE_NODE) { - SpaceNode *snode= (SpaceNode *)sl; + else if (sl->spacetype == SPACE_NODE) { + SpaceNode *snode = (SpaceNode *)sl; - snode->id= newlibadr(fd, sc->id.lib, snode->id); - snode->edittree= NULL; + snode->id = newlibadr(fd, sc->id.lib, snode->id); + snode->edittree = NULL; if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) { /* internal data, a bit patchy */ - snode->nodetree= NULL; + snode->nodetree = NULL; if (snode->id) { if (GS(snode->id->name)==ID_MA) - snode->nodetree= ((Material *)snode->id)->nodetree; + snode->nodetree = ((Material *)snode->id)->nodetree; else if (GS(snode->id->name)==ID_WO) - snode->nodetree= ((World *)snode->id)->nodetree; + snode->nodetree = ((World *)snode->id)->nodetree; else if (GS(snode->id->name)==ID_LA) - snode->nodetree= ((Lamp *)snode->id)->nodetree; + snode->nodetree = ((Lamp *)snode->id)->nodetree; else if (GS(snode->id->name)==ID_SCE) - snode->nodetree= ((Scene *)snode->id)->nodetree; + snode->nodetree = ((Scene *)snode->id)->nodetree; else if (GS(snode->id->name)==ID_TE) - snode->nodetree= ((Tex *)snode->id)->nodetree; + snode->nodetree = ((Tex *)snode->id)->nodetree; } } else { - snode->nodetree= newlibadr_us(fd, sc->id.lib, snode->nodetree); + snode->nodetree = newlibadr_us(fd, sc->id.lib, snode->nodetree); } snode->linkdrag.first = snode->linkdrag.last = NULL; } - else if (sl->spacetype==SPACE_CLIP) { - SpaceClip *sclip= (SpaceClip *)sl; - - sclip->clip= newlibadr_us(fd, sc->id.lib, sclip->clip); - + else if (sl->spacetype == SPACE_CLIP) { + SpaceClip *sclip = (SpaceClip *)sl; + + sclip->clip = newlibadr_us(fd, sc->id.lib, sclip->clip); + sclip->scopes.track_preview = NULL; sclip->draw_context = NULL; sclip->scopes.ok = 0; @@ -5446,22 +5434,21 @@ static void lib_link_screen(FileData *fd, Main *main) /* Only for undo files, or to restore a screen after reading without UI... */ static void *restore_pointer_by_name(Main *mainp, ID *id, int user) { - if (id) { - ListBase *lb= which_libbase(mainp, GS(id->name)); + ListBase *lb = which_libbase(mainp, GS(id->name)); if (lb) { // there's still risk of checking corrupt mem (freed Ids in oops) - ID *idn= lb->first; - char *name= id->name+2; + ID *idn = lb->first; + char *name = id->name + 2; while (idn) { - if (idn->name[2]==name[0] && strcmp(idn->name+2, name)==0) { - if (idn->lib==id->lib) { - if (user && idn->us==0) idn->us++; + if (idn->name[2] == name[0] && strcmp(idn->name+2, name) == 0) { + if (idn->lib == id->lib) { + if (user && idn->us == 0) idn->us++; break; } } - idn= idn->next; + idn = idn->next; } return idn; } @@ -5472,18 +5459,18 @@ static void *restore_pointer_by_name(Main *mainp, ID *id, int user) static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt) { Main *newmain = (Main *)arg_pt; - + if (seq->sound) { seq->sound = restore_pointer_by_name(newmain, (ID *)seq->sound, 0); seq->sound->id.us++; } - + if (seq->scene) seq->scene = restore_pointer_by_name(newmain, (ID *)seq->scene, 1); - + if (seq->scene_camera) seq->scene_camera = restore_pointer_by_name(newmain, (ID *)seq->scene_camera, 1); - + return 1; } @@ -5502,56 +5489,56 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) wmWindowManager *wm; bScreen *sc; ScrArea *sa; - + /* first windowmanager */ - for (wm= newmain->wm.first; wm; wm= wm->id.next) { + for (wm = newmain->wm.first; wm; wm = wm->id.next) { for (win= wm->windows.first; win; win= win->next) { - win->screen= restore_pointer_by_name(newmain, (ID *)win->screen, 1); + win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, 1); - if (win->screen==NULL) - win->screen= curscreen; - - win->screen->winid= win->winid; + if (win->screen == NULL) + win->screen = curscreen; + + win->screen->winid = win->winid; } } - for (sc= newmain->screen.first; sc; sc= sc->id.next) { - Scene *oldscene= sc->scene; - + for (sc = newmain->screen.first; sc; sc = sc->id.next) { + Scene *oldscene = sc->scene; + sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, 1); - if (sc->scene==NULL) - sc->scene= curscene; - + if (sc->scene == NULL) + sc->scene = curscene; + /* keep cursor location through undo */ copy_v3_v3(sc->scene->cursor, oldscene->cursor); - - sa= sc->areabase.first; + + sa = sc->areabase.first; while (sa) { SpaceLink *sl; - - for (sl= sa->spacedata.first; sl; sl= sl->next) { - if (sl->spacetype==SPACE_VIEW3D) { - View3D *v3d= (View3D*) sl; + + for (sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; BGpic *bgpic; ARegion *ar; if (v3d->scenelock) - v3d->camera= NULL; /* always get from scene */ + v3d->camera = NULL; /* always get from scene */ else - v3d->camera= restore_pointer_by_name(newmain, (ID *)v3d->camera, 1); - if (v3d->camera==NULL) - v3d->camera= sc->scene->camera; - v3d->ob_centre= restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1); + v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, 1); + if (v3d->camera == NULL) + v3d->camera = sc->scene->camera; + v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1); for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) { - bgpic->ima= restore_pointer_by_name(newmain, (ID *)bgpic->ima, 1); - bgpic->clip= restore_pointer_by_name(newmain, (ID *)bgpic->clip, 1); + bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, 1); + bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, 1); } if (v3d->localvd) { /*Base *base;*/ - - v3d->localvd->camera= sc->scene->camera; + + v3d->localvd->camera = sc->scene->camera; /* localview can become invalid during undo/redo steps, so we exit it when no could be found */ /* XXX regionlocalview ? @@ -5566,60 +5553,59 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) } */ } - else if (v3d->scenelock) v3d->lay= sc->scene->lay; - + else if (v3d->scenelock) v3d->lay = sc->scene->lay; + /* not very nice, but could help */ - if ((v3d->layact & v3d->lay)==0) v3d->layact= v3d->lay; + if ((v3d->layact & v3d->lay) == 0) v3d->layact = v3d->lay; /* free render engines for now */ - for (ar= sa->regionbase.first; ar; ar= ar->next) { + for (ar = sa->regionbase.first; ar; ar = ar->next) { RegionView3D *rv3d= ar->regiondata; - + if (rv3d && rv3d->render_engine) { RE_engine_free(rv3d->render_engine); - rv3d->render_engine= NULL; + rv3d->render_engine = NULL; } } } - else if (sl->spacetype==SPACE_IPO) { - SpaceIpo *sipo= (SpaceIpo *)sl; - bDopeSheet *ads= sipo->ads; + else if (sl->spacetype == SPACE_IPO) { + SpaceIpo *sipo = (SpaceIpo *)sl; + bDopeSheet *ads = sipo->ads; if (ads) { - ads->source= restore_pointer_by_name(newmain, (ID *)ads->source, 1); + ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1); if (ads->filter_grp) - ads->filter_grp= restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0); + ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0); } } - else if (sl->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= (SpaceButs *)sl; + else if (sl->spacetype == SPACE_BUTS) { + SpaceButs *sbuts = (SpaceButs *)sl; sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, 0); //XXX if (sbuts->ri) sbuts->ri->curtile = 0; } - else if (sl->spacetype==SPACE_FILE) { - - SpaceFile *sfile= (SpaceFile *)sl; - sfile->op= NULL; + else if (sl->spacetype == SPACE_FILE) { + SpaceFile *sfile = (SpaceFile *)sl; + sfile->op = NULL; } - else if (sl->spacetype==SPACE_ACTION) { - SpaceAction *saction= (SpaceAction *)sl; + else if (sl->spacetype == SPACE_ACTION) { + SpaceAction *saction = (SpaceAction *)sl; saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, 1); saction->ads.source= restore_pointer_by_name(newmain, (ID *)saction->ads.source, 1); - + if (saction->ads.filter_grp) saction->ads.filter_grp= restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, 0); } - else if (sl->spacetype==SPACE_IMAGE) { - SpaceImage *sima= (SpaceImage *)sl; - - sima->image= restore_pointer_by_name(newmain, (ID *)sima->image, 1); - + else if (sl->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)sl; + + sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, 1); + /* this will be freed, not worth attempting to find same scene, * since it gets initialized later */ sima->iuser.scene = NULL; - + sima->scopes.waveform_1 = NULL; sima->scopes.waveform_2 = NULL; sima->scopes.waveform_3 = NULL; @@ -5629,75 +5615,75 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data * so assume that here we're doing for undo only... */ - sima->gpd= restore_pointer_by_name(newmain, (ID *)sima->gpd, 1); + sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, 1); } - else if (sl->spacetype==SPACE_NLA) { - SpaceNla *snla= (SpaceNla *)sl; - bDopeSheet *ads= snla->ads; + else if (sl->spacetype == SPACE_NLA) { + SpaceNla *snla = (SpaceNla *)sl; + bDopeSheet *ads = snla->ads; if (ads) { - ads->source= restore_pointer_by_name(newmain, (ID *)ads->source, 1); + ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1); if (ads->filter_grp) - ads->filter_grp= restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0); + ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0); } } - else if (sl->spacetype==SPACE_TEXT) { - SpaceText *st= (SpaceText *)sl; + else if (sl->spacetype == SPACE_TEXT) { + SpaceText *st = (SpaceText *)sl; - st->text= restore_pointer_by_name(newmain, (ID *)st->text, 1); - if (st->text==NULL) st->text= newmain->text.first; + st->text = restore_pointer_by_name(newmain, (ID *)st->text, 1); + if (st->text == NULL) st->text = newmain->text.first; } - else if (sl->spacetype==SPACE_SCRIPT) { - SpaceScript *scpt= (SpaceScript *)sl; + else if (sl->spacetype == SPACE_SCRIPT) { + SpaceScript *scpt = (SpaceScript *)sl; - scpt->script= restore_pointer_by_name(newmain, (ID *)scpt->script, 1); + scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, 1); /*sc->script = NULL; - 2.45 set to null, better re-run the script */ if (scpt->script) { SCRIPT_SET_NULL(scpt->script); } } - else if (sl->spacetype==SPACE_OUTLINER) { + else if (sl->spacetype == SPACE_OUTLINER) { SpaceOops *so= (SpaceOops *)sl; int a; - so->search_tse.id= restore_pointer_by_name(newmain, so->search_tse.id, 0); + so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, 0); if (so->treestore) { - TreeStore *ts= so->treestore; - TreeStoreElem *tselem=ts->data; - for (a=0; ausedelem; a++, tselem++) { - tselem->id= restore_pointer_by_name(newmain, tselem->id, 0); + TreeStore *ts = so->treestore; + TreeStoreElem *tselem = ts->data; + for (a = 0; a < ts->usedelem; a++, tselem++) { + tselem->id = restore_pointer_by_name(newmain, tselem->id, 0); } } } - else if (sl->spacetype==SPACE_NODE) { + else if (sl->spacetype == SPACE_NODE) { SpaceNode *snode= (SpaceNode *)sl; - snode->id= restore_pointer_by_name(newmain, snode->id, 1); - snode->edittree= NULL; + snode->id = restore_pointer_by_name(newmain, snode->id, 1); + snode->edittree = NULL; if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) { - snode->nodetree= NULL; + snode->nodetree = NULL; if (snode->id) { if (GS(snode->id->name)==ID_MA) - snode->nodetree= ((Material *)snode->id)->nodetree; + snode->nodetree = ((Material *)snode->id)->nodetree; else if (GS(snode->id->name)==ID_SCE) - snode->nodetree= ((Scene *)snode->id)->nodetree; + snode->nodetree = ((Scene *)snode->id)->nodetree; else if (GS(snode->id->name)==ID_TE) - snode->nodetree= ((Tex *)snode->id)->nodetree; + snode->nodetree = ((Tex *)snode->id)->nodetree; } } else { snode->nodetree= restore_pointer_by_name(newmain, &snode->nodetree->id, 1); } } - else if (sl->spacetype==SPACE_CLIP) { - SpaceClip *sclip= (SpaceClip *)sl; - - sclip->clip= restore_pointer_by_name(newmain, (ID *)sclip->clip, 1); - + else if (sl->spacetype == SPACE_CLIP) { + SpaceClip *sclip = (SpaceClip *)sl; + + sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, 1); + sclip->scopes.ok = 0; } } @@ -5713,41 +5699,41 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype) { Panel *pa; - link_list(fd, &(ar->panels)); + link_list(fd, &ar->panels); - for (pa= ar->panels.first; pa; pa=pa->next) { - pa->paneltab= newdataadr(fd, pa->paneltab); - pa->runtime_flag= 0; - pa->activedata= NULL; - pa->type= NULL; + for (pa = ar->panels.first; pa; pa = pa->next) { + pa->paneltab = newdataadr(fd, pa->paneltab); + pa->runtime_flag = 0; + pa->activedata = NULL; + pa->type = NULL; } - ar->regiondata= newdataadr(fd, ar->regiondata); + ar->regiondata = newdataadr(fd, ar->regiondata); if (ar->regiondata) { - if (spacetype==SPACE_VIEW3D) { - RegionView3D *rv3d= ar->regiondata; + if (spacetype == SPACE_VIEW3D) { + RegionView3D *rv3d = ar->regiondata; - rv3d->localvd= newdataadr(fd, rv3d->localvd); - rv3d->clipbb= newdataadr(fd, rv3d->clipbb); + rv3d->localvd = newdataadr(fd, rv3d->localvd); + rv3d->clipbb = newdataadr(fd, rv3d->clipbb); - rv3d->depths= NULL; - rv3d->ri= NULL; - rv3d->render_engine= NULL; - rv3d->sms= NULL; - rv3d->smooth_timer= NULL; + rv3d->depths = NULL; + rv3d->ri = NULL; + rv3d->render_engine = NULL; + rv3d->sms = NULL; + rv3d->smooth_timer = NULL; } } - ar->v2d.tab_offset= NULL; - ar->v2d.tab_num= 0; - ar->v2d.tab_cur= 0; - ar->handlers.first= ar->handlers.last= NULL; - ar->uiblocks.first= ar->uiblocks.last= NULL; - ar->headerstr= NULL; - ar->swinid= 0; - ar->type= NULL; - ar->swap= 0; - ar->do_draw= 0; + ar->v2d.tab_offset = NULL; + ar->v2d.tab_num = 0; + ar->v2d.tab_cur = 0; + ar->handlers.first = ar->handlers.last = NULL; + ar->uiblocks.first = ar->uiblocks.last = NULL; + ar->headerstr = NULL; + ar->swinid = 0; + ar->type = NULL; + ar->swap = 0; + ar->do_draw = 0; memset(&ar->drawrct, 0, sizeof(ar->drawrct)); } @@ -5757,22 +5743,22 @@ void blo_do_versions_view3d_split_250(View3D *v3d, ListBase *regions) { ARegion *ar; - for (ar= regions->first; ar; ar= ar->next) { + for (ar = regions->first; ar; ar = ar->next) { if (ar->regiontype==RGN_TYPE_WINDOW && ar->regiondata==NULL) { RegionView3D *rv3d; - rv3d= ar->regiondata= MEM_callocN(sizeof(RegionView3D), "region v3d patch"); - rv3d->persp= (char)v3d->persp; - rv3d->view= (char)v3d->view; - rv3d->dist= v3d->dist; + rv3d = ar->regiondata = MEM_callocN(sizeof(RegionView3D), "region v3d patch"); + rv3d->persp = (char)v3d->persp; + rv3d->view = (char)v3d->view; + rv3d->dist = v3d->dist; copy_v3_v3(rv3d->ofs, v3d->ofs); copy_qt_qt(rv3d->viewquat, v3d->viewquat); } } - + /* this was not initialized correct always */ if (v3d->twtype == 0) - v3d->twtype= V3D_MANIP_TRANSLATE; + v3d->twtype = V3D_MANIP_TRANSLATE; } static void direct_link_screen(FileData *fd, bScreen *sc) @@ -5785,49 +5771,49 @@ static void direct_link_screen(FileData *fd, bScreen *sc) link_list(fd, &(sc->vertbase)); link_list(fd, &(sc->edgebase)); link_list(fd, &(sc->areabase)); - sc->regionbase.first= sc->regionbase.last= NULL; - sc->context= NULL; - - sc->mainwin= sc->subwinactive= 0; /* indices */ - sc->swap= 0; + sc->regionbase.first = sc->regionbase.last= NULL; + sc->context = NULL; + + sc->mainwin = sc->subwinactive= 0; /* indices */ + sc->swap = 0; /* hacky patch... but people have been saving files with the verse-blender, * causing the handler to keep running for ever, with no means to disable it */ - for (a=0; ahandler[a]==SCREEN_HANDLER_VERSE) { - sc->handler[a]= 0; + for (a = 0; a < SCREEN_MAXHANDLER; a+=2) { + if (sc->handler[a] == SCREEN_HANDLER_VERSE) { + sc->handler[a] = 0; break; } } /* edges */ - for (se= sc->edgebase.first; se; se= se->next) { - se->v1= newdataadr(fd, se->v1); - se->v2= newdataadr(fd, se->v2); - if ( (intptr_t)se->v1 > (intptr_t)se->v2) { - sv= se->v1; - se->v1= se->v2; - se->v2= sv; + for (se = sc->edgebase.first; se; se = se->next) { + se->v1 = newdataadr(fd, se->v1); + se->v2 = newdataadr(fd, se->v2); + if ((intptr_t)se->v1 > (intptr_t)se->v2) { + sv = se->v1; + se->v1 = se->v2; + se->v2 = sv; } - - if (se->v1==NULL) { + + if (se->v1 == NULL) { printf("error reading screen... file corrupt\n"); - se->v1= se->v2; + se->v1 = se->v2; } } - + /* areas */ - for (sa= sc->areabase.first; sa; sa= sa->next) { + for (sa = sc->areabase.first; sa; sa = sa->next) { SpaceLink *sl; ARegion *ar; - + link_list(fd, &(sa->spacedata)); link_list(fd, &(sa->regionbase)); - - sa->handlers.first= sa->handlers.last= NULL; - sa->type= NULL; /* spacetype callbacks */ - for (ar= sa->regionbase.first; ar; ar= ar->next) + sa->handlers.first = sa->handlers.last = NULL; + sa->type = NULL; /* spacetype callbacks */ + + for (ar = sa->regionbase.first; ar; ar = ar->next) direct_link_region(fd, ar, sa->spacetype); /* accident can happen when read/save new file with older version */ @@ -5838,80 +5824,80 @@ static void direct_link_screen(FileData *fd, bScreen *sc) BLI_addtail(&sa->spacedata, sinfo); } /* add local view3d too */ - else if (sa->spacetype==SPACE_VIEW3D) + else if (sa->spacetype == SPACE_VIEW3D) blo_do_versions_view3d_split_250(sa->spacedata.first, &sa->regionbase); - for (sl= sa->spacedata.first; sl; sl= sl->next) { + for (sl = sa->spacedata.first; sl; sl = sl->next) { link_list(fd, &(sl->regionbase)); - - for (ar= sl->regionbase.first; ar; ar= ar->next) + + for (ar = sl->regionbase.first; ar; ar = ar->next) direct_link_region(fd, ar, sl->spacetype); - - if (sl->spacetype==SPACE_VIEW3D) { + + if (sl->spacetype == SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; BGpic *bgpic; - + v3d->flag |= V3D_INVALID_BACKBUF; - - link_list(fd, &(v3d->bgpicbase)); - + + link_list(fd, &v3d->bgpicbase); + /* should be do_versions except this doesnt fit well there */ if (v3d->bgpic) { - bgpic= newdataadr(fd, v3d->bgpic); + bgpic = newdataadr(fd, v3d->bgpic); BLI_addtail(&v3d->bgpicbase, bgpic); - v3d->bgpic= NULL; + v3d->bgpic = NULL; } - - for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) - bgpic->iuser.ok= 1; - + + for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) + bgpic->iuser.ok = 1; + if (v3d->gpd) { - v3d->gpd= newdataadr(fd, v3d->gpd); + v3d->gpd = newdataadr(fd, v3d->gpd); direct_link_gpencil(fd, v3d->gpd); } - v3d->localvd= newdataadr(fd, v3d->localvd); - v3d->afterdraw_transp.first= v3d->afterdraw_transp.last= NULL; - v3d->afterdraw_xray.first= v3d->afterdraw_xray.last= NULL; - v3d->afterdraw_xraytransp.first= v3d->afterdraw_xraytransp.last= NULL; - v3d->properties_storage= NULL; - + v3d->localvd = newdataadr(fd, v3d->localvd); + v3d->afterdraw_transp.first = v3d->afterdraw_transp.last = NULL; + v3d->afterdraw_xray.first = v3d->afterdraw_xray.last = NULL; + v3d->afterdraw_xraytransp.first = v3d->afterdraw_xraytransp.last = NULL; + v3d->properties_storage = NULL; + /* render can be quite heavy, set to wire on load */ if (v3d->drawtype == OB_RENDER) v3d->drawtype = OB_WIRE; blo_do_versions_view3d_split_250(v3d, &sl->regionbase); } - else if (sl->spacetype==SPACE_IPO) { - SpaceIpo *sipo= (SpaceIpo*)sl; + else if (sl->spacetype == SPACE_IPO) { + SpaceIpo *sipo = (SpaceIpo *)sl; - sipo->ads= newdataadr(fd, sipo->ads); - sipo->ghostCurves.first= sipo->ghostCurves.last= NULL; + sipo->ads = newdataadr(fd, sipo->ads); + sipo->ghostCurves.first = sipo->ghostCurves.last = NULL; } - else if (sl->spacetype==SPACE_NLA) { - SpaceNla *snla= (SpaceNla*)sl; + else if (sl->spacetype == SPACE_NLA) { + SpaceNla *snla = (SpaceNla *)sl; - snla->ads= newdataadr(fd, snla->ads); + snla->ads = newdataadr(fd, snla->ads); } - else if (sl->spacetype==SPACE_OUTLINER) { - SpaceOops *soops= (SpaceOops*) sl; + else if (sl->spacetype == SPACE_OUTLINER) { + SpaceOops *soops = (SpaceOops *) sl; - soops->treestore= newdataadr(fd, soops->treestore); + soops->treestore = newdataadr(fd, soops->treestore); if (soops->treestore) { - soops->treestore->data= newdataadr(fd, soops->treestore->data); + soops->treestore->data = newdataadr(fd, soops->treestore->data); /* we only saved what was used */ - soops->treestore->totelem= soops->treestore->usedelem; + soops->treestore->totelem = soops->treestore->usedelem; soops->storeflag |= SO_TREESTORE_CLEANUP; // at first draw } } - else if (sl->spacetype==SPACE_IMAGE) { - SpaceImage *sima= (SpaceImage *)sl; + else if (sl->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)sl; - sima->cumap= newdataadr(fd, sima->cumap); + sima->cumap = newdataadr(fd, sima->cumap); if (sima->cumap) direct_link_curvemapping(fd, sima->cumap); - sima->iuser.scene= NULL; - sima->iuser.ok= 1; + sima->iuser.scene = NULL; + sima->iuser.ok = 1; sima->scopes.waveform_1 = NULL; sima->scopes.waveform_2 = NULL; sima->scopes.waveform_3 = NULL; @@ -5922,45 +5908,45 @@ static void direct_link_screen(FileData *fd, bScreen *sc) * so sacrifice a few old files for now to avoid crashes with new files! * committed: r28002 */ #if 0 - sima->gpd= newdataadr(fd, sima->gpd); + sima->gpd = newdataadr(fd, sima->gpd); if (sima->gpd) direct_link_gpencil(fd, sima->gpd); #endif } - else if (sl->spacetype==SPACE_NODE) { - SpaceNode *snode= (SpaceNode *)sl; + else if (sl->spacetype == SPACE_NODE) { + SpaceNode *snode = (SpaceNode *)sl; if (snode->gpd) { - snode->gpd= newdataadr(fd, snode->gpd); + snode->gpd = newdataadr(fd, snode->gpd); direct_link_gpencil(fd, snode->gpd); } } - else if (sl->spacetype==SPACE_TIME) { - SpaceTime *stime= (SpaceTime *)sl; - stime->caches.first= stime->caches.last= NULL; + else if (sl->spacetype == SPACE_TIME) { + SpaceTime *stime = (SpaceTime *)sl; + stime->caches.first = stime->caches.last = NULL; } - else if (sl->spacetype==SPACE_LOGIC) { - SpaceLogic *slogic= (SpaceLogic *)sl; + else if (sl->spacetype == SPACE_LOGIC) { + SpaceLogic *slogic = (SpaceLogic *)sl; if (slogic->gpd) { - slogic->gpd= newdataadr(fd, slogic->gpd); + slogic->gpd = newdataadr(fd, slogic->gpd); direct_link_gpencil(fd, slogic->gpd); } } - else if (sl->spacetype==SPACE_SEQ) { - SpaceSeq *sseq= (SpaceSeq *)sl; + else if (sl->spacetype == SPACE_SEQ) { + SpaceSeq *sseq = (SpaceSeq *)sl; if (sseq->gpd) { - sseq->gpd= newdataadr(fd, sseq->gpd); + sseq->gpd = newdataadr(fd, sseq->gpd); direct_link_gpencil(fd, sseq->gpd); } } - else if (sl->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= (SpaceButs *)sl; + else if (sl->spacetype == SPACE_BUTS) { + SpaceButs *sbuts = (SpaceButs *)sl; sbuts->path= NULL; sbuts->texuser= NULL; } - else if (sl->spacetype==SPACE_CONSOLE) { - SpaceConsole *sconsole= (SpaceConsole *)sl; + else if (sl->spacetype == SPACE_CONSOLE) { + SpaceConsole *sconsole = (SpaceConsole *)sl; ConsoleLine *cl, *cl_next; link_list(fd, &sconsole->scrollback); @@ -5972,12 +5958,12 @@ static void direct_link_screen(FileData *fd, bScreen *sc) /* comma expressions, (e.g. expr1, expr2, expr3) evalutate each expression, * from left to right. the right-most expression sets the result of the comma * expression as a whole*/ - for (cl= sconsole->history.first; cl; cl= cl_next) { - cl_next= cl->next; - cl->line= newdataadr(fd, cl->line); + for (cl = sconsole->history.first; cl; cl = cl_next) { + cl_next = cl->next; + cl->line = newdataadr(fd, cl->line); if (cl->line) { /* the allocted length is not written, so reset here */ - cl->len_alloc= cl->len + 1; + cl->len_alloc = cl->len + 1; } else { BLI_remlink(&sconsole->history, cl); @@ -5985,26 +5971,26 @@ static void direct_link_screen(FileData *fd, bScreen *sc) } } } - else if (sl->spacetype==SPACE_FILE) { - SpaceFile *sfile= (SpaceFile *)sl; + else if (sl->spacetype == SPACE_FILE) { + SpaceFile *sfile = (SpaceFile *)sl; /* this sort of info is probably irrelevant for reloading... * plus, it isn't saved to files yet! */ - sfile->folders_prev= sfile->folders_next= NULL; - sfile->files= NULL; - sfile->layout= NULL; - sfile->op= NULL; - sfile->params= newdataadr(fd, sfile->params); + sfile->folders_prev = sfile->folders_next = NULL; + sfile->files = NULL; + sfile->layout = NULL; + sfile->op = NULL; + sfile->params = newdataadr(fd, sfile->params); } } - sa->actionzones.first= sa->actionzones.last= NULL; - - sa->v1= newdataadr(fd, sa->v1); - sa->v2= newdataadr(fd, sa->v2); - sa->v3= newdataadr(fd, sa->v3); - sa->v4= newdataadr(fd, sa->v4); + sa->actionzones.first = sa->actionzones.last = NULL; + + sa->v1 = newdataadr(fd, sa->v1); + sa->v2 = newdataadr(fd, sa->v2); + sa->v3 = newdataadr(fd, sa->v3); + sa->v4 = newdataadr(fd, sa->v4); } } @@ -6015,20 +6001,20 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main) { Main *newmain; - for (newmain= fd->mainlist.first; newmain; newmain= newmain->next) { + for (newmain = fd->mainlist.first; newmain; newmain = newmain->next) { if (newmain->curlib) { if (BLI_path_cmp(newmain->curlib->filepath, lib->filepath) == 0) { BKE_reportf_wrap(fd->reports, RPT_WARNING, "Library '%s', '%s' had multiple instances, save and reload!", lib->name, lib->filepath); - + change_idid_adr(&fd->mainlist, fd, lib, newmain->curlib); // change_idid_adr_fd(fd, lib, newmain->curlib); BLI_remlink(&main->library, lib); MEM_freeN(lib); - - + + return; } } @@ -6043,16 +6029,16 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main) /* new main */ newmain= MEM_callocN(sizeof(Main), "directlink"); BLI_addtail(&fd->mainlist, newmain); - newmain->curlib= lib; - - lib->parent= NULL; + newmain->curlib = lib; + + lib->parent = NULL; } static void lib_link_library(FileData *UNUSED(fd), Main *main) { Library *lib; - for (lib= main->library.first; lib; lib= lib->id.next) { - lib->id.us= 1; + for (lib = main->library.first; lib; lib = lib->id.next) { + lib->id.us = 1; } } @@ -6061,23 +6047,23 @@ static void fix_relpaths_library(const char *basepath, Main *main) { Library *lib; /* BLO_read_from_memory uses a blank filename */ - if (basepath==NULL || basepath[0] == '\0') { - for (lib= main->library.first; lib; lib= lib->id.next) { + if (basepath == NULL || basepath[0] == '\0') { + for (lib = main->library.first; lib; lib= lib->id.next) { /* when loading a linked lib into a file which has not been saved, * there is nothing we can be relative to, so instead we need to make * it absolute. This can happen when appending an object with a relative * link into an unsaved blend file. See [#27405]. * The remap relative option will make it relative again on save - campbell */ - if (strncmp(lib->name, "//", 2)==0) { + if (strncmp(lib->name, "//", 2) == 0) { BLI_strncpy(lib->name, lib->filepath, sizeof(lib->name)); } } } else { - for (lib= main->library.first; lib; lib= lib->id.next) { + for (lib = main->library.first; lib; lib = lib->id.next) { /* Libraries store both relative and abs paths, recreate relative paths, * relative to the blend file since indirectly linked libs will be relative to their direct linked library */ - if (strncmp(lib->name, "//", 2)==0) { /* if this is relative to begin with? */ + if (strncmp(lib->name, "//", 2) == 0) { /* if this is relative to begin with? */ BLI_strncpy(lib->name, lib->filepath, sizeof(lib->name)); BLI_path_rel(lib->name, basepath); } @@ -6090,30 +6076,30 @@ static void fix_relpaths_library(const char *basepath, Main *main) static void lib_link_speaker(FileData *fd, Main *main) { Speaker *spk; - - spk= main->speaker.first; + + spk = main->speaker.first; while (spk) { if (spk->id.flag & LIB_NEEDLINK) { if (spk->adt) lib_link_animdata(fd, &spk->id, spk->adt); - + spk->sound= newlibadr(fd, spk->id.lib, spk->sound); if (spk->sound) { spk->sound->id.us++; } - + spk->id.flag -= LIB_NEEDLINK; } - spk= spk->id.next; + spk = spk->id.next; } } static void direct_link_speaker(FileData *fd, Speaker *spk) { - spk->adt= newdataadr(fd, spk->adt); + spk->adt = newdataadr(fd, spk->adt); direct_link_animdata(fd, spk->adt); #if 0 - spk->sound= newdataadr(fd, spk->sound); + spk->sound = newdataadr(fd, spk->sound); direct_link_sound(fd, spk->sound); #endif } @@ -6140,15 +6126,15 @@ static void lib_link_sound(FileData *fd, Main *main) { bSound *sound; - sound= main->sound.first; + sound = main->sound.first; while (sound) { if (sound->id.flag & LIB_NEEDLINK) { sound->id.flag -= LIB_NEEDLINK; - sound->ipo= newlibadr_us(fd, sound->id.lib, sound->ipo); // XXX depreceated - old animation system + sound->ipo = newlibadr_us(fd, sound->id.lib, sound->ipo); // XXX depreceated - old animation system sound_load(main, sound); } - sound= sound->id.next; + sound = sound->id.next; } } /* ***************** READ GROUP *************** */ @@ -6168,24 +6154,24 @@ static void lib_link_group(FileData *fd, Main *main) if (group->id.flag & LIB_NEEDLINK) { group->id.flag -= LIB_NEEDLINK; - add_us= 0; + add_us = 0; - go= group->gobject.first; + go = group->gobject.first; while (go) { go->ob= newlibadr(fd, group->id.lib, go->ob); if (go->ob) { go->ob->flag |= OB_FROMGROUP; /* if group has an object, it increments user... */ - add_us= 1; - if (go->ob->id.us==0) - go->ob->id.us= 1; + add_us = 1; + if (go->ob->id.us == 0) + go->ob->id.us = 1; } - go= go->next; + go = go->next; } if (add_us) group->id.us++; rem_from_group(group, NULL, NULL, NULL); /* removes NULL entries */ } - group= group->id.next; + group = group->id.next; } } @@ -6193,60 +6179,60 @@ static void lib_link_group(FileData *fd, Main *main) static void direct_link_movieReconstruction(FileData *fd, MovieTrackingReconstruction *reconstruction) { - reconstruction->cameras= newdataadr(fd, reconstruction->cameras); + reconstruction->cameras = newdataadr(fd, reconstruction->cameras); } static void direct_link_movieTracks(FileData *fd, ListBase *tracksbase) { MovieTrackingTrack *track; - + link_list(fd, tracksbase); - - track= tracksbase->first; + + track = tracksbase->first; while (track) { - track->markers= newdataadr(fd, track->markers); - - track= track->next; + track->markers = newdataadr(fd, track->markers); + + track = track->next; } } static void direct_link_movieclip(FileData *fd, MovieClip *clip) { - MovieTracking *tracking= &clip->tracking; + MovieTracking *tracking = &clip->tracking; MovieTrackingObject *object; clip->adt= newdataadr(fd, clip->adt); - if (fd->movieclipmap) clip->cache= newmclipadr(fd, clip->cache); - else clip->cache= NULL; + if (fd->movieclipmap) clip->cache = newmclipadr(fd, clip->cache); + else clip->cache = NULL; - if (fd->movieclipmap) clip->tracking.camera.intrinsics= newmclipadr(fd, clip->tracking.camera.intrinsics); - else clip->tracking.camera.intrinsics= NULL; + if (fd->movieclipmap) clip->tracking.camera.intrinsics = newmclipadr(fd, clip->tracking.camera.intrinsics); + else clip->tracking.camera.intrinsics = NULL; direct_link_movieTracks(fd, &tracking->tracks); direct_link_movieReconstruction(fd, &tracking->reconstruction); - clip->tracking.act_track= newdataadr(fd, clip->tracking.act_track); + clip->tracking.act_track = newdataadr(fd, clip->tracking.act_track); - clip->anim= NULL; - clip->tracking_context= NULL; - clip->tracking.stats= NULL; + clip->anim = NULL; + clip->tracking_context = NULL; + clip->tracking.stats = NULL; - clip->tracking.stabilization.ok= 0; - clip->tracking.stabilization.scaleibuf= NULL; - clip->tracking.stabilization.rot_track= newdataadr(fd, clip->tracking.stabilization.rot_track); + clip->tracking.stabilization.ok = 0; + clip->tracking.stabilization.scaleibuf = NULL; + clip->tracking.stabilization.rot_track = newdataadr(fd, clip->tracking.stabilization.rot_track); clip->tracking.dopesheet.ok = 0; clip->tracking.dopesheet.channels.first = clip->tracking.dopesheet.channels.last = NULL; link_list(fd, &tracking->objects); - - object= tracking->objects.first; + + object = tracking->objects.first; while (object) { direct_link_movieTracks(fd, &object->tracks); direct_link_movieReconstruction(fd, &object->reconstruction); - - object= object->next; + + object = object->next; } } @@ -6259,12 +6245,12 @@ static void lib_link_movieclip(FileData *fd, Main *main) if (clip->id.flag & LIB_NEEDLINK) { if (clip->adt) lib_link_animdata(fd, &clip->id, clip->adt); - - clip->gpd= newlibadr_us(fd, clip->id.lib, clip->gpd); - + + clip->gpd = newlibadr_us(fd, clip->id.lib, clip->gpd); + clip->id.flag -= LIB_NEEDLINK; } - clip= clip->id.next; + clip = clip->id.next; } } @@ -6310,27 +6296,27 @@ static const char *dataname(short id_code) static BHead *read_data_into_oldnewmap(FileData *fd, BHead *bhead, const char *allocname) { bhead = blo_nextbhead(fd, bhead); - + while (bhead && bhead->code==DATA) { void *data; #if 0 /* XXX DUMB DEBUGGING OPTION TO GIVE NAMES for guarded malloc errors */ - short *sp= fd->filesdna->structs[bhead->SDNAnr]; - char *tmp= malloc(100); + short *sp = fd->filesdna->structs[bhead->SDNAnr]; + char *tmp = malloc(100); allocname = fd->filesdna->types[ sp[0] ]; strcpy(tmp, allocname); - data= read_struct(fd, bhead, tmp); + data = read_struct(fd, bhead, tmp); #else - data= read_struct(fd, bhead, allocname); + data = read_struct(fd, bhead, allocname); #endif if (data) { oldnewmap_insert(fd->datamap, bhead->old, data, 0); } - + bhead = blo_nextbhead(fd, bhead); } - + return bhead; } @@ -6339,7 +6325,6 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID /* this routine reads a libblock and its direct data. Use link functions * to connect it all */ - ID *id; ListBase *lb; const char *allocname; @@ -6347,41 +6332,41 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID /* read libblock */ id = read_struct(fd, bhead, "lib block"); if (id_r) - *id_r= id; + *id_r = id; if (!id) return blo_nextbhead(fd, bhead); oldnewmap_insert(fd->libmap, bhead->old, id, bhead->code); /* for ID_ID check */ /* do after read_struct, for dna reconstruct */ - if (bhead->code==ID_ID) { - lb= which_libbase(main, GS(id->name)); + if (bhead->code == ID_ID) { + lb = which_libbase(main, GS(id->name)); } else { - lb= which_libbase(main, bhead->code); + lb = which_libbase(main, bhead->code); } BLI_addtail(lb, id); - + /* clear first 8 bits */ - id->flag= (id->flag & 0xFF00) | flag | LIB_NEEDLINK; - id->lib= main->curlib; + id->flag = (id->flag & 0xFF00) | flag | LIB_NEEDLINK; + id->lib = main->curlib; if (id->flag & LIB_FAKEUSER) id->us= 1; - else id->us= 0; + else id->us = 0; id->icon_id = 0; id->flag &= ~(LIB_ID_RECALC|LIB_ID_RECALC_DATA); - + /* this case cannot be direct_linked: it's just the ID part */ - if (bhead->code==ID_ID) { + if (bhead->code == ID_ID) { return blo_nextbhead(fd, bhead); } - + /* need a name for the mallocN, just for debugging and sane prints on leaks */ - allocname= dataname(GS(id->name)); + allocname = dataname(GS(id->name)); /* read all data into fd->datamap */ - bhead= read_data_into_oldnewmap(fd, bhead, allocname); - + bhead = read_data_into_oldnewmap(fd, bhead, allocname); + /* init pointers direct data */ switch (GS(id->name)) { case ID_WM: @@ -6483,10 +6468,10 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID IDP_DirectLinkProperty(id->properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); } } - + oldnewmap_free_unused(fd->datamap); oldnewmap_clear(fd->datamap); - + return (bhead); } @@ -6494,30 +6479,30 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID /* also version info is written here */ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead) { - FileGlobal *fg= read_struct(fd, bhead, "Global"); + FileGlobal *fg = read_struct(fd, bhead, "Global"); /* copy to bfd handle */ - bfd->main->subversionfile= fg->subversion; - bfd->main->minversionfile= fg->minversion; - bfd->main->minsubversionfile= fg->minsubversion; - bfd->main->revision= fg->revision; + bfd->main->subversionfile = fg->subversion; + bfd->main->minversionfile = fg->minversion; + bfd->main->minsubversionfile = fg->minsubversion; + bfd->main->revision = fg->revision; - bfd->winpos= fg->winpos; - bfd->fileflags= fg->fileflags; - bfd->displaymode= fg->displaymode; - bfd->globalf= fg->globalf; + bfd->winpos = fg->winpos; + bfd->fileflags = fg->fileflags; + bfd->displaymode = fg->displaymode; + bfd->globalf = fg->globalf; BLI_strncpy(bfd->filename, fg->filename, sizeof(bfd->filename)); if (G.fileflags & G_FILE_RECOVER) BLI_strncpy(fd->relabase, fg->filename, sizeof(fd->relabase)); - bfd->curscreen= fg->curscreen; - bfd->curscene= fg->curscene; + bfd->curscreen = fg->curscreen; + bfd->curscene = fg->curscene; MEM_freeN(fg); - - fd->globalf= bfd->globalf; - fd->fileflags= bfd->fileflags; + + fd->globalf = bfd->globalf; + fd->fileflags = bfd->fileflags; return blo_nextbhead(fd, bhead); } @@ -6526,11 +6511,11 @@ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead) static void link_global(FileData *fd, BlendFileData *bfd) { - bfd->curscreen= newlibadr(fd, NULL, bfd->curscreen); - bfd->curscene= newlibadr(fd, NULL, bfd->curscene); + bfd->curscreen = newlibadr(fd, NULL, bfd->curscreen); + bfd->curscene = newlibadr(fd, NULL, bfd->curscene); // this happens in files older than 2.35 - if (bfd->curscene==NULL) { - if (bfd->curscreen) bfd->curscene= bfd->curscreen->scene; + if (bfd->curscene == NULL) { + if (bfd->curscreen) bfd->curscene = bfd->curscreen->scene; } } @@ -6538,19 +6523,18 @@ static void link_global(FileData *fd, BlendFileData *bfd) void convert_tface_mt(FileData *fd, Main *main) { Main *gmain; - + /* this is a delayed do_version (so it can create new materials) */ if (main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 3)) { - //XXX hack, material.c uses G.main all over the place, instead of main // temporarily set G.main to the current main gmain = G.main; G.main = main; - + if (!(do_version_tface(main, 1))) { BKE_report(fd->reports, RPT_WARNING, "Texface conversion problem. Error in console"); } - + //XXX hack, material.c uses G.main allover the place, instead of main G.main = gmain; } @@ -6560,11 +6544,12 @@ static void do_versions_nodetree_image_default_alpha_output(bNodeTree *ntree) { bNode *node; bNodeSocket *sock; - for (node=ntree->nodes.first; node; node=node->next) { + + for (node = ntree->nodes.first; node; node = node->next) { if (ELEM(node->type, CMP_NODE_IMAGE, CMP_NODE_R_LAYERS)) { /* default Image output value should have 0 alpha */ sock = node->outputs.first; - ((bNodeSocketValueRGBA*)sock->default_value)->value[3] = 0.0f; + ((bNodeSocketValueRGBA *)(sock->default_value))->value[3] = 0.0f; } } } @@ -6573,10 +6558,10 @@ static void do_version_ntree_tex_mapping_260(void *UNUSED(data), ID *UNUSED(id), { bNode *node; - for (node=ntree->nodes.first; node; node=node->next) { + for (node = ntree->nodes.first; node; node = node->next) { if (node->type == SH_NODE_MAPPING) { TexMapping *tex_mapping; - + tex_mapping= node->storage; tex_mapping->projx= PROJ_X; tex_mapping->projy= PROJ_Y; @@ -6614,7 +6599,7 @@ static void do_versions_nodetree_convert_angle(bNodeTree *ntree) } else if (node->type == CMP_NODE_GLARE) { /* Convert degrees to radians. */ - NodeGlare* ndg = node->storage; + NodeGlare *ndg = node->storage; /* XXX DNA char to float conversion seems to map the char value into the [0.0f, 1.0f] range... */ ndg->angle_ofs = DEG2RADF(ndg->angle_ofs*255.0f); } @@ -6623,7 +6608,7 @@ static void do_versions_nodetree_convert_angle(bNodeTree *ntree) */ else if (node->type == SH_NODE_MAPPING) { /* Convert degrees to radians. */ - TexMapping* tmap = node->storage; + TexMapping *tmap = node->storage; tmap->rot[0] = DEG2RADF(tmap->rot[0]); tmap->rot[1] = DEG2RADF(tmap->rot[1]); tmap->rot[2] = DEG2RADF(tmap->rot[2]); @@ -6635,24 +6620,24 @@ void do_versions_image_settings_2_60(Scene *sce) { /* note: rd->subimtype is moved into individual settings now and no longer * exists */ - RenderData *rd= &sce->r; - ImageFormatData *imf= &sce->r.im_format; + RenderData *rd = &sce->r; + ImageFormatData *imf = &sce->r.im_format; /* we know no data loss happens here, the old values were in char range */ - imf->imtype= (char)rd->imtype; - imf->planes= (char)rd->planes; - imf->compress= (char)rd->quality; - imf->quality= (char)rd->quality; + imf->imtype = (char)rd->imtype; + imf->planes = (char)rd->planes; + imf->compress = (char)rd->quality; + imf->quality = (char)rd->quality; /* default, was stored in multiple places, may override later */ - imf->depth= R_IMF_CHAN_DEPTH_8; + imf->depth = R_IMF_CHAN_DEPTH_8; /* openexr */ imf->exr_codec = rd->quality & 7; /* strange but true! 0-4 are valid values, OPENEXR_COMPRESS */ switch (imf->imtype) { case R_IMF_IMTYPE_OPENEXR: - imf->depth= (rd->subimtype & R_OPENEXR_HALF) ? R_IMF_CHAN_DEPTH_16 : R_IMF_CHAN_DEPTH_32; + imf->depth = (rd->subimtype & R_OPENEXR_HALF) ? R_IMF_CHAN_DEPTH_16 : R_IMF_CHAN_DEPTH_32; if (rd->subimtype & R_PREVIEW_JPG) { imf->flag |= R_IMF_FLAG_PREVIEW_JPG; } @@ -6700,18 +6685,18 @@ static void do_versions_nodetree_socket_use_flags_2_62(bNodeTree *ntree) bNodeSocket *sock; bNodeLink *link; - for (node=ntree->nodes.first; node; node=node->next) { - for (sock=node->inputs.first; sock; sock=sock->next) + for (node = ntree->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) + for (sock = node->outputs.first; sock; sock = sock->next) sock->flag &= ~SOCK_IN_USE; } - for (sock=ntree->inputs.first; sock; sock=sock->next) + for (sock = ntree->inputs.first; sock; sock = sock->next) sock->flag &= ~SOCK_IN_USE; - for (sock=ntree->outputs.first; sock; sock=sock->next) + for (sock = ntree->outputs.first; sock; sock = sock->next) sock->flag &= ~SOCK_IN_USE; - for (link=ntree->links.first; link; link=link->next) { + for (link = ntree->links.first; link; link = link->next) { link->fromsock->flag |= SOCK_IN_USE; link->tosock->flag |= SOCK_IN_USE; } @@ -6722,8 +6707,8 @@ static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNo bNode *node; bNodeSocket *sock; - for (node=ntree->nodes.first; node; node=node->next) { - if (node->type==CMP_NODE_OUTPUT_FILE) { + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_OUTPUT_FILE) { /* previous CMP_NODE_OUTPUT_FILE nodes get converted to multi-file outputs */ NodeImageFile *old_data = node->storage; NodeImageMultiFile *nimf= MEM_callocN(sizeof(NodeImageMultiFile), "node image multi file"); @@ -6733,7 +6718,7 @@ static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNo char basepath[FILE_MAXDIR]; char filename[FILE_MAXFILE]; - node->storage= nimf; + node->storage = nimf; /* split off filename from the old path, to be used as socket sub-path */ BLI_split_dirfile(old_data->name, basepath, filename, sizeof(basepath), sizeof(filename)); @@ -6811,10 +6796,10 @@ static void do_versions_mesh_mloopcol_swap_2_62_1(Mesh *me) MLoopCol *mloopcol; int a; int i; - + for (a = 0; a < me->ldata.totlayer; a++) { layer = &me->ldata.layers[a]; - + if (layer->type == CD_MLOOPCOL) { mloopcol = (MLoopCol *)layer->data; for (i = 0; i < me->totloop; i++, mloopcol++) { @@ -6829,9 +6814,9 @@ static void do_versions_nodetree_multi_file_output_path_2_64_0(bNodeTree *ntree) bNode *node; for (node=ntree->nodes.first; node; node=node->next) { - if (node->type==CMP_NODE_OUTPUT_FILE) { + if (node->type == CMP_NODE_OUTPUT_FILE) { bNodeSocket *sock; - for (sock=node->inputs.first; sock; sock=sock->next) { + for (sock = node->inputs.first; sock; sock = sock->next) { NodeImageMultiFileSocket *input = sock->storage; /* input file path is stored in dedicated struct now instead socket name */ BLI_strncpy(input->path, sock->name, sizeof(input->path)); @@ -6846,7 +6831,7 @@ static void do_versions_nodetree_file_output_layers_2_64_5(bNodeTree *ntree) bNode *node; for (node=ntree->nodes.first; node; node=node->next) { - if (node->type==CMP_NODE_OUTPUT_FILE) { + if (node->type == CMP_NODE_OUTPUT_FILE) { bNodeSocket *sock; for (sock=node->inputs.first; sock; sock=sock->next) { NodeImageMultiFileSocket *input = sock->storage; @@ -6868,11 +6853,11 @@ static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree) { bNode *node; - for (node=ntree->nodes.first; node; node=node->next) { - if (node->type==CMP_NODE_IMAGE) { - ImageUser *iuser= (ImageUser *)node->storage; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_IMAGE) { + ImageUser *iuser = (ImageUser *)node->storage; bNodeSocket *sock; - for (sock=node->outputs.first; sock; sock=sock->next) { + for (sock = node->outputs.first; sock; sock = sock->next) { NodeImageLayer *output = MEM_callocN(sizeof(NodeImageLayer), "node image layer"); /* take layer index from image user (this is ignored from now on) */ @@ -6890,70 +6875,70 @@ static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree) static void do_versions(FileData *fd, Library *lib, Main *main) { /* WATCH IT!!!: pointers from libdata have not been converted */ - + if (G.debug & G_DEBUG) printf("read file %s\n Version %d sub %d svn r%d\n", fd->relabase, main->versionfile, main->subversionfile, main->revision); - + blo_do_versions_pre250(fd, lib, main); blo_do_versions_250(fd, lib, main); - + if (main->versionfile < 260) { { /* set default alpha value of Image outputs in image and render layer nodes to 0 */ Scene *sce; bNodeTree *ntree; - for (sce=main->scene.first; sce; sce=sce->id.next) { + for (sce = main->scene.first; sce; sce = sce->id.next) { /* there are files with invalid audio_channels value, the real cause * is unknown, but we fix it here anyway to avoid crashes */ if (sce->r.ffcodecdata.audio_channels == 0) sce->r.ffcodecdata.audio_channels = 2; - + if (sce->nodetree) do_versions_nodetree_image_default_alpha_output(sce->nodetree); } - for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) do_versions_nodetree_image_default_alpha_output(ntree); } - + { /* support old particle dupliobject rotation settings */ ParticleSettings *part; - + for (part=main->particle.first; part; part=part->id.next) { if (ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) { part->draw |= PART_DRAW_ROTATE_OB; - + if (part->rotmode == 0) part->rotmode = PART_ROT_VEL; } } } } - + if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 1)) { Object *ob; - - for (ob= main->object.first; ob; ob= ob->id.next) { + + for (ob = main->object.first; ob; ob = ob->id.next) { ob->collision_boundtype= ob->boundtype; } - + { Camera *cam; - for (cam= main->camera.first; cam; cam= cam->id.next) { + for (cam = main->camera.first; cam; cam = cam->id.next) { if (cam->sensor_x < 0.01f) cam->sensor_x = DEFAULT_SENSOR_WIDTH; - + if (cam->sensor_y < 0.01f) cam->sensor_y = DEFAULT_SENSOR_HEIGHT; } } } - + if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 2)) { - bNodeTreeType *ntreetype= ntreeGetType(NTREE_SHADER); - + bNodeTreeType *ntreetype = ntreeGetType(NTREE_SHADER); + if (ntreetype && ntreetype->foreach_nodetree) ntreetype->foreach_nodetree(main, NULL, do_version_ntree_tex_mapping_260); } @@ -6964,122 +6949,122 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Scene *sce; Material *mat; bNodeTree *ntree; - - for (sce=main->scene.first; sce; sce=sce->id.next) { + + for (sce = main->scene.first; sce; sce = sce->id.next) { if (sce->nodetree) do_versions_nodetree_convert_angle(sce->nodetree); } - - for (mat=main->mat.first; mat; mat=mat->id.next) { + + for (mat = main->mat.first; mat; mat = mat->id.next) { if (mat->nodetree) do_versions_nodetree_convert_angle(mat->nodetree); } - - for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) + + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) do_versions_nodetree_convert_angle(ntree); } - + { /* Tomato compatibility code. */ bScreen *sc; MovieClip *clip; - - for (sc= main->screen.first; sc; sc= sc->id.next) { + + for (sc = main->screen.first; sc; sc = sc->id.next) { ScrArea *sa; - for (sa= sc->areabase.first; sa; sa= sa->next) { + for (sa = sc->areabase.first; sa; sa = sa->next) { SpaceLink *sl; - for (sl= sa->spacedata.first; sl; sl= sl->next) { - if (sl->spacetype==SPACE_VIEW3D) { + for (sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { View3D *v3d= (View3D *)sl; - if (v3d->bundle_size==0.0f) { - v3d->bundle_size= 0.2f; + if (v3d->bundle_size == 0.0f) { + v3d->bundle_size = 0.2f; v3d->flag2 |= V3D_SHOW_RECONSTRUCTION; } - - if (v3d->bundle_drawtype==0) - v3d->bundle_drawtype= OB_PLAINAXES; + + if (v3d->bundle_drawtype == 0) + v3d->bundle_drawtype = OB_PLAINAXES; } - else if (sl->spacetype==SPACE_CLIP) { - SpaceClip *sc= (SpaceClip *)sl; - if (sc->scopes.track_preview_height==0) - sc->scopes.track_preview_height= 120; + else if (sl->spacetype == SPACE_CLIP) { + SpaceClip *sc = (SpaceClip *)sl; + if (sc->scopes.track_preview_height == 0) + sc->scopes.track_preview_height = 120; } } } } - - for (clip= main->movieclip.first; clip; clip= clip->id.next) { + + for (clip = main->movieclip.first; clip; clip = clip->id.next) { MovieTrackingTrack *track; - - if (clip->aspx<1.0f) { - clip->aspx= 1.0f; - clip->aspy= 1.0f; + + if (clip->aspx < 1.0f) { + clip->aspx = 1.0f; + clip->aspy = 1.0f; } - - clip->proxy.build_tc_flag= IMB_TC_RECORD_RUN | - IMB_TC_FREE_RUN | - IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN; - - if (clip->proxy.build_size_flag==0) - clip->proxy.build_size_flag= IMB_PROXY_25; - - if (clip->proxy.quality==0) - clip->proxy.quality= 90; - - if (clip->tracking.camera.pixel_aspect<0.01f) - clip->tracking.camera.pixel_aspect= 1.f; - - track= clip->tracking.tracks.first; + + clip->proxy.build_tc_flag = IMB_TC_RECORD_RUN | + IMB_TC_FREE_RUN | + IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN; + + if (clip->proxy.build_size_flag == 0) + clip->proxy.build_size_flag = IMB_PROXY_25; + + if (clip->proxy.quality == 0) + clip->proxy.quality = 90; + + if (clip->tracking.camera.pixel_aspect < 0.01f) + clip->tracking.camera.pixel_aspect = 1.0f; + + track = clip->tracking.tracks.first; while (track) { - if (track->pyramid_levels==0) - track->pyramid_levels= 2; - - if (track->minimum_correlation==0.0f) - track->minimum_correlation= 0.75f; - - track= track->next; + if (track->pyramid_levels == 0) + track->pyramid_levels = 2; + + if (track->minimum_correlation == 0.0f) + track->minimum_correlation = 0.75f; + + track = track->next; } } } } - + if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 6)) { Scene *sce; MovieClip *clip; bScreen *sc; - + for (sce = main->scene.first; sce; sce = sce->id.next) { do_versions_image_settings_2_60(sce); } - + for (clip= main->movieclip.first; clip; clip= clip->id.next) { MovieTrackingSettings *settings= &clip->tracking.settings; - - if (settings->default_pyramid_levels==0) { + + if (settings->default_pyramid_levels == 0) { settings->default_tracker= TRACKER_KLT; - settings->default_pyramid_levels= 2; - settings->default_minimum_correlation= 0.75; - settings->default_pattern_size= 11; - settings->default_search_size= 51; + settings->default_pyramid_levels = 2; + settings->default_minimum_correlation = 0.75; + settings->default_pattern_size = 11; + settings->default_search_size = 51; } } - - for (sc= main->screen.first; sc; sc= sc->id.next) { + + for (sc = main->screen.first; sc; sc = sc->id.next) { ScrArea *sa; - for (sa= sc->areabase.first; sa; sa= sa->next) { + for (sa = sc->areabase.first; sa; sa = sa->next) { SpaceLink *sl; - for (sl= sa->spacedata.first; sl; sl= sl->next) { - if (sl->spacetype==SPACE_VIEW3D) { - View3D *v3d= (View3D *)sl; - v3d->flag2&= ~V3D_RENDER_SHADOW; + for (sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + v3d->flag2 &= ~V3D_RENDER_SHADOW; } } } } - + { Object *ob; - for (ob= main->object.first; ob; ob= ob->id.next) { + for (ob = main->object.first; ob; ob = ob->id.next) { /* convert delta addition into delta scale */ int i; for (i= 0; i < 3; i++) { @@ -7100,17 +7085,17 @@ static void do_versions(FileData *fd, Library *lib, Main *main) * at some point this could be removed. */ else if (main->versionfile == 260 && main->subversionfile == 6) { Object *ob; - for (ob = main->object.first; ob; ob= ob->id.next) { + for (ob = main->object.first; ob; ob = ob->id.next) { if (is_zero_v3(ob->dscale)) { fill_vn_fl(ob->dscale, 3, 1.0f); } } } - + if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 8)) { Brush *brush; - - for (brush= main->brush.first; brush; brush= brush->id.next) { + + for (brush = main->brush.first; brush; brush = brush->id.next) { if (brush->sculpt_tool == SCULPT_TOOL_ROTATE) brush->alpha= 1.0f; } @@ -7125,34 +7110,40 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Lamp *lamp; World *world; bNodeTree *ntree; - - for (sce=main->scene.first; sce; sce=sce->id.next) + + for (sce = main->scene.first; sce; sce = sce->id.next) { if (sce->nodetree) do_versions_nodetree_socket_use_flags_2_62(sce->nodetree); - - for (mat=main->mat.first; mat; mat=mat->id.next) + } + + for (mat = main->mat.first; mat; mat = mat->id.next) { if (mat->nodetree) do_versions_nodetree_socket_use_flags_2_62(mat->nodetree); - - for (tex=main->tex.first; tex; tex=tex->id.next) + } + + for (tex = main->tex.first; tex; tex = tex->id.next) { if (tex->nodetree) do_versions_nodetree_socket_use_flags_2_62(tex->nodetree); - - for (lamp=main->lamp.first; lamp; lamp=lamp->id.next) + } + + for (lamp = main->lamp.first; lamp; lamp = lamp->id.next) { if (lamp->nodetree) do_versions_nodetree_socket_use_flags_2_62(lamp->nodetree); - - for (world=main->world.first; world; world=world->id.next) + } + + for (world = main->world.first; world; world = world->id.next) { if (world->nodetree) do_versions_nodetree_socket_use_flags_2_62(world->nodetree); - - for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) + } + + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) { do_versions_nodetree_socket_use_flags_2_62(ntree); + } } { /* Initialize BGE exit key to esc key */ Scene *scene; - for (scene= main->scene.first; scene; scene= scene->id.next) { + for (scene = main->scene.first; scene; scene = scene->id.next) { if (!scene->gm.exitkey) scene->gm.exitkey = 218; // Blender key code for ESC } @@ -7160,39 +7151,39 @@ static void do_versions(FileData *fd, Library *lib, Main *main) { MovieClip *clip; Object *ob; - - for (clip= main->movieclip.first; clip; clip= clip->id.next) { - MovieTracking *tracking= &clip->tracking; - MovieTrackingObject *tracking_object= tracking->objects.first; - - clip->proxy.build_tc_flag|= IMB_TC_RECORD_RUN_NO_GAPS; - + + for (clip = main->movieclip.first; clip; clip = clip->id.next) { + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *tracking_object = tracking->objects.first; + + clip->proxy.build_tc_flag |= IMB_TC_RECORD_RUN_NO_GAPS; + if (!tracking->settings.object_distance) - tracking->settings.object_distance= 1.0f; - + tracking->settings.object_distance = 1.0f; + if (tracking->objects.first == NULL) BKE_tracking_new_object(tracking, "Camera"); - + while (tracking_object) { if (!tracking_object->scale) - tracking_object->scale= 1.0f; - - tracking_object= tracking_object->next; + tracking_object->scale = 1.0f; + + tracking_object = tracking_object->next; } } - - for (ob= main->object.first; ob; ob= ob->id.next) { + + for (ob = main->object.first; ob; ob = ob->id.next) { bConstraint *con; - for (con= ob->constraints.first; con; con=con->next) { - bConstraintTypeInfo *cti= constraint_get_typeinfo(con); - + for (con = ob->constraints.first; con; con = con->next) { + bConstraintTypeInfo *cti = constraint_get_typeinfo(con); + if (!cti) continue; - - if (cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) { - bObjectSolverConstraint *data= (bObjectSolverConstraint *)con->data; - - if (data->invmat[3][3]==0.0f) + + if (cti->type == CONSTRAINT_TYPE_OBJECTSOLVER) { + bObjectSolverConstraint *data = (bObjectSolverConstraint *)con->data; + + if (data->invmat[3][3] == 0.0f) unit_m4(data->invmat); } } @@ -7202,7 +7193,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* Warn the user if he is using ["Text"] properties for Font objects */ Object *ob; bProperty *prop; - + for (ob= main->object.first; ob; ob= ob->id.next) { if (ob->type == OB_FONT) { prop = get_ob_property(ob, "Text"); @@ -7216,7 +7207,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } - + if (main->versionfile < 261 || (main->versionfile == 261 && main->subversionfile < 2)) { { /* convert Camera Actuator values to defines */ @@ -7226,7 +7217,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) for (act= ob->actuators.first; act; act= act->next) { if (act->type == ACT_CAMERA) { bCameraActuator *ba= act->data; - + if (ba->axis==(float) 'x') ba->axis=OB_POSX; else if (ba->axis==(float)'y') ba->axis=OB_POSY; /* don't do an if/else to avoid imediate subversion bump*/ @@ -7235,7 +7226,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } - + { /* convert deprecated sculpt_paint_unified_* fields to * UnifiedPaintSettings */ @@ -7296,7 +7287,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Object *ob; for (ob=main->object.first; ob; ob= ob->id.next) { ModifierData *md; - + for (md=ob->modifiers.first; md; md=md->next) { if (md->type==eModifierType_Cloth) { ClothModifierData *clmd = (ClothModifierData*) md; @@ -7311,7 +7302,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* set fluidsim rate. the version patch for this in 2.62 was wrong, so * try to correct it, if rate is 0.0 that's likely not intentional */ Object *ob; - + for (ob = main->object.first; ob; ob = ob->id.next) { ModifierData *md; for (md = ob->modifiers.first; md; md = md->next) { @@ -7329,9 +7320,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Scene *sce; bNodeTree *ntree; - for (sce=main->scene.first; sce; sce=sce->id.next) + for (sce=main->scene.first; sce; sce=sce->id.next) { if (sce->nodetree) do_versions_nodetree_multi_file_output_format_2_62_1(sce, sce->nodetree); + } /* XXX can't associate with scene for group nodes, image format will stay uninitialized */ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) @@ -7346,19 +7338,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main) do_versions_mesh_mloopcol_swap_2_62_1(me); } } - } if (main->versionfile < 262 || (main->versionfile == 262 && main->subversionfile < 2)) { - { - /* Set new idname of keyingsets from their now "label-only" name. */ - Scene *scene; - for (scene = main->scene.first; scene; scene = scene->id.next) { - KeyingSet *ks; - for (ks = scene->keyingsets.first; ks; ks = ks->next) { - if (!ks->idname[0]) - BLI_strncpy(ks->idname, ks->name, sizeof(ks->idname)); - } + /* Set new idname of keyingsets from their now "label-only" name. */ + Scene *scene; + for (scene = main->scene.first; scene; scene = scene->id.next) { + KeyingSet *ks; + for (ks = scene->keyingsets.first; ks; ks = ks->next) { + if (!ks->idname[0]) + BLI_strncpy(ks->idname, ks->name, sizeof(ks->idname)); } } } @@ -7366,9 +7355,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if (main->versionfile < 262 || (main->versionfile == 262 && main->subversionfile < 3)) { Object *ob; ModifierData *md; - + for (ob = main->object.first; ob; ob = ob->id.next) { - for (md=ob->modifiers.first; md; md=md->next) { + for (md = ob->modifiers.first; md; md = md->next) { if (md->type == eModifierType_Lattice) { LatticeModifierData *lmd = (LatticeModifierData *)md; lmd->strength = 1.0f; @@ -7431,7 +7420,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 3)) { Scene *scene; Brush *brush; - + /* For weight paint, each brush now gets its own weight; * unified paint settings also have weight. Update unified * paint settings and brushes with a default weight value. */ @@ -7443,38 +7432,38 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ts->unified_paint_settings.flag |= UNIFIED_PAINT_WEIGHT; } } - + for (brush = main->brush.first; brush; brush = brush->id.next) { brush->weight = 0.5; } } - + if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 2)) { bScreen *sc; - + for (sc = main->screen.first; sc; sc = sc->id.next) { ScrArea *sa; for (sa = sc->areabase.first; sa; sa = sa->next) { SpaceLink *sl; - + for (sl = sa->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_CLIP) { SpaceClip *sclip = (SpaceClip *)sl; ARegion *ar; int hide = FALSE; - + for (ar = sa->regionbase.first; ar; ar = ar->next) { if (ar->regiontype == RGN_TYPE_PREVIEW) { if (ar->alignment != RGN_ALIGN_NONE) { ar->flag |= RGN_FLAG_HIDDEN; ar->v2d.flag &= ~V2D_IS_INITIALISED; ar->alignment = RGN_ALIGN_NONE; - + hide = TRUE; } } } - + if (hide) { sclip->view = SC_VIEW_CLIP; } @@ -7489,27 +7478,27 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Lamp *la; Camera *cam; Curve *cu; - - for (la= main->lamp.first; la; la= la->id.next) { + + for (la = main->lamp.first; la; la = la->id.next) { if (la->shadow_frustum_size == 0.0f) la->shadow_frustum_size= 10.0f; } - + for (cam = main->camera.first; cam; cam = cam->id.next) { if (cam->flag & CAM_PANORAMA) { cam->type = CAM_PANO; cam->flag &= ~CAM_PANORAMA; } } - - for(cu= main->curve.first; cu; cu= cu->id.next) { - if(cu->bevfac2 == 0.0f) { + + for(cu = main->curve.first; cu; cu = cu->id.next) { + if (cu->bevfac2 == 0.0f) { cu->bevfac1 = 0.0f; cu->bevfac2 = 1.0f; } } } - + if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 5)) { { @@ -7529,18 +7518,21 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } - + /* 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! */ { Scene *scene; // composite redesign - for (scene=main->scene.first; scene; scene=scene->id.next) - if (scene->nodetree) - if ( scene->nodetree->chunksize == 0) { + for (scene=main->scene.first; scene; scene=scene->id.next) { + if (scene->nodetree) { + if (scene->nodetree->chunksize == 0) { scene->nodetree->chunksize = 256; } + } + } } + /* don't forget to set version number in blender.c! */ } @@ -7583,18 +7575,18 @@ static void lib_link_all(FileData *fd, Main *main) lib_link_brush(fd, main); lib_link_particlesettings(fd, main); lib_link_movieclip(fd, main); - + lib_link_mesh(fd, main); /* as last: tpage images with users at zero */ - + lib_link_library(fd, main); /* only init users */ } static void direct_link_keymapitem(FileData *fd, wmKeyMapItem *kmi) { - kmi->properties= newdataadr(fd, kmi->properties); + kmi->properties = newdataadr(fd, kmi->properties); if (kmi->properties) IDP_DirectLinkProperty(kmi->properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); - kmi->ptr= NULL; + kmi->ptr = NULL; kmi->flag &= ~KMI_UPDATE; } @@ -7604,68 +7596,68 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead) wmKeyMap *keymap; wmKeyMapItem *kmi; wmKeyMapDiffItem *kmdi; - - bfd->user= user= read_struct(fd, bhead, "user def"); - + + bfd->user = user= read_struct(fd, bhead, "user def"); + /* read all data into fd->datamap */ - bhead= read_data_into_oldnewmap(fd, bhead, "user def"); - + bhead = read_data_into_oldnewmap(fd, bhead, "user def"); + if (user->keymaps.first) { /* backwards compatibility */ user->user_keymaps= user->keymaps; user->keymaps.first= user->keymaps.last= NULL; } - + link_list(fd, &user->themes); link_list(fd, &user->user_keymaps); link_list(fd, &user->addons); - + for (keymap=user->user_keymaps.first; keymap; keymap=keymap->next) { keymap->modal_items= NULL; keymap->poll = NULL; keymap->flag &= ~KEYMAP_UPDATE; - + link_list(fd, &keymap->diff_items); link_list(fd, &keymap->items); for (kmdi=keymap->diff_items.first; kmdi; kmdi=kmdi->next) { kmdi->remove_item= newdataadr(fd, kmdi->remove_item); kmdi->add_item= newdataadr(fd, kmdi->add_item); - + if (kmdi->remove_item) direct_link_keymapitem(fd, kmdi->remove_item); if (kmdi->add_item) direct_link_keymapitem(fd, kmdi->add_item); } - + for (kmi=keymap->items.first; kmi; kmi=kmi->next) direct_link_keymapitem(fd, kmi); } - + // XXX - user->uifonts.first= user->uifonts.last= NULL; + user->uifonts.first = user->uifonts.last= NULL; link_list(fd, &user->uistyles); - + /* free fd->datamap again */ oldnewmap_free_unused(fd->datamap); oldnewmap_clear(fd->datamap); - + return bhead; } BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) { - BHead *bhead= blo_firstbhead(fd); + BHead *bhead = blo_firstbhead(fd); BlendFileData *bfd; - - bfd= MEM_callocN(sizeof(BlendFileData), "blendfiledata"); - bfd->main= MEM_callocN(sizeof(Main), "readfile_Main"); - BLI_addtail(&fd->mainlist, bfd->main); - - bfd->main->versionfile= fd->fileversion; - bfd->type= BLENFILETYPE_BLEND; + bfd = MEM_callocN(sizeof(BlendFileData), "blendfiledata"); + bfd->main = MEM_callocN(sizeof(Main), "readfile_Main"); + BLI_addtail(&fd->mainlist, bfd->main); + + bfd->main->versionfile = fd->fileversion; + + bfd->type = BLENFILETYPE_BLEND; BLI_strncpy(bfd->main->name, filepath, sizeof(bfd->main->name)); while (bhead) { @@ -7677,15 +7669,15 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) bhead = blo_nextbhead(fd, bhead); break; case GLOB: - bhead= read_global(bfd, fd, bhead); + bhead = read_global(bfd, fd, bhead); break; case USER: - bhead= read_userdef(bfd, fd, bhead); + bhead = read_userdef(bfd, fd, bhead); break; case ENDB: bhead = NULL; break; - + case ID_LI: /* skip library datablocks in undo, this works together with * BLO_read_from_memfile, where the old main->library is restored @@ -7693,14 +7685,14 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) * it did not save ID_LI/ID_ID blocks in this case, but they are * needed to make quit.blend recover them correctly. */ if (fd->memfile) - bhead= blo_nextbhead(fd, bhead); + bhead = blo_nextbhead(fd, bhead); else - bhead= read_libblock(fd, bfd->main, bhead, LIB_LOCAL, NULL); + bhead = read_libblock(fd, bfd->main, bhead, LIB_LOCAL, NULL); break; case ID_ID: /* same as above */ if (fd->memfile) - bhead= blo_nextbhead(fd, bhead); + bhead = blo_nextbhead(fd, bhead); else /* always adds to the most recently loaded * ID_LI block, see direct_link_library. @@ -7710,21 +7702,21 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */ case ID_SCRN: - bhead->code= ID_SCR; + bhead->code = ID_SCR; /* deliberate pass on to default */ default: bhead = read_libblock(fd, bfd->main, bhead, LIB_LOCAL, NULL); } } - + /* do before read_libraries, but skip undo case */ // if (fd->memfile==NULL) (the mesh shuffle hacks don't work yet? ton) do_versions(fd, NULL, bfd->main); - + read_libraries(fd, &fd->mainlist); blo_join_main(&fd->mainlist); - + lib_link_all(fd, bfd->main); //do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010) lib_verify_nodetree(bfd->main, TRUE); @@ -7746,8 +7738,8 @@ static int verg_bheadsort(const void *v1, const void *v2) { const struct bheadsort *x1=v1, *x2=v2; - if ( x1->old > x2->old) return 1; - else if ( x1->old < x2->old) return -1; + if (x1->old > x2->old) return 1; + else if (x1->old < x2->old) return -1; return 0; } @@ -7755,23 +7747,22 @@ static void sort_bhead_old_map(FileData *fd) { BHead *bhead; struct bheadsort *bhs; - int tot= 0; + int tot = 0; - for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) + for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) tot++; - fd->tot_bheadmap= tot; - if (tot==0) return; + fd->tot_bheadmap = tot; + if (tot == 0) return; - bhs= fd->bheadmap= MEM_mallocN(tot*sizeof(struct bheadsort), "bheadsort"); + bhs = fd->bheadmap= MEM_mallocN(tot*sizeof(struct bheadsort), "bheadsort"); - for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead), bhs++) { - bhs->bhead= bhead; - bhs->old= bhead->old; + for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead), bhs++) { + bhs->bhead = bhead; + bhs->old = bhead->old; } qsort(fd->bheadmap, tot, sizeof(struct bheadsort), verg_bheadsort); - } static BHead *find_previous_lib(FileData *fd, BHead *bhead) @@ -7780,9 +7771,10 @@ static BHead *find_previous_lib(FileData *fd, BHead *bhead) if (fd->memfile) return NULL; - for (; bhead; bhead= blo_prevbhead(fd, bhead)) - if (bhead->code==ID_LI) + for (; bhead; bhead = blo_prevbhead(fd, bhead)) { + if (bhead->code == ID_LI) break; + } return bhead; } @@ -7797,19 +7789,20 @@ static BHead *find_bhead(FileData *fd, void *old) if (!old) return NULL; - if (fd->bheadmap==NULL) + if (fd->bheadmap == NULL) sort_bhead_old_map(fd); - bhs_s.old= old; - bhs= bsearch(&bhs_s, fd->bheadmap, fd->tot_bheadmap, sizeof(struct bheadsort), verg_bheadsort); + bhs_s.old = old; + bhs = bsearch(&bhs_s, fd->bheadmap, fd->tot_bheadmap, sizeof(struct bheadsort), verg_bheadsort); if (bhs) return bhs->bhead; #if 0 - for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) - if (bhead->old==old) + for (bhead = blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { + if (bhead->old == old) return bhead; + } #endif return NULL; @@ -7831,26 +7824,26 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old) { BHead *bhead; ID *id; - - bhead= find_bhead(fd, old); + + bhead = find_bhead(fd, old); if (bhead) { - /* from another library? */ - if (bhead->code==ID_ID) { + /* from another library? */ + if (bhead->code == ID_ID) { BHead *bheadlib= find_previous_lib(fd, bhead); - + if (bheadlib) { - Library *lib= read_struct(fd, bheadlib, "Library"); - Main *ptr= blo_find_main(fd, &fd->mainlist, lib->name, fd->relabase); - - id= is_yet_read(fd, ptr, bhead); - - if (id==NULL) { + Library *lib = read_struct(fd, bheadlib, "Library"); + Main *ptr = blo_find_main(fd, &fd->mainlist, lib->name, fd->relabase); + + id = is_yet_read(fd, ptr, bhead); + + if (id == NULL) { read_libblock(fd, ptr, bhead, LIB_READ+LIB_INDIRECT, NULL); // commented because this can print way too much // if (G.debug & G_DEBUG) printf("expand_doit: other lib %s\n", lib->name); /* for outliner dependency only */ - ptr->curlib->parent= mainvar->curlib; + ptr->curlib->parent = mainvar->curlib; } else { /* The line below was commented by Ton (I assume), when Hos did the merge from the orange branch. rev 6568 @@ -7874,8 +7867,8 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old) } } else { - id= is_yet_read(fd, mainvar, bhead); - if (id==NULL) { + id = is_yet_read(fd, mainvar, bhead); + if (id == NULL) { read_libblock(fd, mainvar, bhead, LIB_TESTIND, NULL); } else { @@ -7895,7 +7888,7 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old) static void expand_ipo(FileData *fd, Main *mainvar, Ipo *ipo) { IpoCurve *icu; - for (icu= ipo->curve.first; icu; icu= icu->next) { + for (icu = ipo->curve.first; icu; icu = icu->next) { if (icu->driver) expand_doit(fd, mainvar, icu->driver->ob); } @@ -7905,7 +7898,7 @@ static void expand_ipo(FileData *fd, Main *mainvar, Ipo *ipo) static void expand_constraint_channels(FileData *fd, Main *mainvar, ListBase *chanbase) { bConstraintChannel *chan; - for (chan=chanbase->first; chan; chan=chan->next) { + for (chan = chanbase->first; chan; chan = chan->next) { expand_doit(fd, mainvar, chan->ipo); } } @@ -7914,12 +7907,12 @@ static void expand_fmodifiers(FileData *fd, Main *mainvar, ListBase *list) { FModifier *fcm; - for (fcm= list->first; fcm; fcm= fcm->next) { + for (fcm = list->first; fcm; fcm = fcm->next) { /* library data for specific F-Modifier types */ switch (fcm->type) { case FMODIFIER_TYPE_PYTHON: { - FMod_Python *data= (FMod_Python *)fcm->data; + FMod_Python *data = (FMod_Python *)fcm->data; expand_doit(fd, mainvar, data->script); } @@ -7932,13 +7925,13 @@ static void expand_fcurves(FileData *fd, Main *mainvar, ListBase *list) { FCurve *fcu; - for (fcu= list->first; fcu; fcu= fcu->next) { + for (fcu = list->first; fcu; fcu = fcu->next) { /* Driver targets if there is a driver */ if (fcu->driver) { - ChannelDriver *driver= fcu->driver; + ChannelDriver *driver = fcu->driver; DriverVar *dvar; - for (dvar= driver->variables.first; dvar; dvar= dvar->next) { + for (dvar = driver->variables.first; dvar; dvar = dvar->next) { DRIVER_TARGETS_LOOPER(dvar) { // TODO: only expand those that are going to get used? @@ -7974,8 +7967,8 @@ static void expand_keyingsets(FileData *fd, Main *mainvar, ListBase *list) KS_Path *ksp; /* expand the ID-pointers in KeyingSets's paths */ - for (ks= list->first; ks; ks= ks->next) { - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + for (ks = list->first; ks; ks = ks->next) { + for (ksp = ks->paths.first; ksp; ksp = ksp->next) { expand_doit(fd, mainvar, ksp->id); } } @@ -8012,14 +8005,14 @@ static void expand_animdata(FileData *fd, Main *mainvar, AnimData *adt) expand_fcurves(fd, mainvar, &adt->drivers); /* nla-data - referenced actions */ - for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) + for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) expand_animdata_nlastrips(fd, mainvar, &nlt->strips); } static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSettings *part) { int a; - + expand_doit(fd, mainvar, part->dup_ob); expand_doit(fd, mainvar, part->dup_group); expand_doit(fd, mainvar, part->eff_group); @@ -8027,8 +8020,8 @@ static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSetting if (part->adt) expand_animdata(fd, mainvar, part->adt); - - for (a=0; amtex[a]) { expand_doit(fd, mainvar, part->mtex[a]->tex); expand_doit(fd, mainvar, part->mtex[a]->object); @@ -8040,7 +8033,7 @@ static void expand_group(FileData *fd, Main *mainvar, Group *group) { GroupObject *go; - for (go= group->gobject.first; go; go= go->next) { + for (go = group->gobject.first; go; go = go->next) { expand_doit(fd, mainvar, go->ob); } } @@ -8063,9 +8056,10 @@ static void expand_nodetree(FileData *fd, Main *mainvar, bNodeTree *ntree) if (ntree->gpd) expand_doit(fd, mainvar, ntree->gpd); - for (node= ntree->nodes.first; node; node= node->next) - if (node->id && node->type!=CMP_NODE_R_LAYERS) + for (node = ntree->nodes.first; node; node = node->next) { + if (node->id && node->type != CMP_NODE_R_LAYERS) expand_doit(fd, mainvar, node->id); + } } @@ -8090,8 +8084,8 @@ static void expand_brush(FileData *fd, Main *mainvar, Brush *brush) static void expand_material(FileData *fd, Main *mainvar, Material *ma) { int a; - - for (a=0; amtex[a]) { expand_doit(fd, mainvar, ma->mtex[a]->tex); expand_doit(fd, mainvar, ma->mtex[a]->object); @@ -8113,8 +8107,8 @@ static void expand_material(FileData *fd, Main *mainvar, Material *ma) static void expand_lamp(FileData *fd, Main *mainvar, Lamp *la) { int a; - - for (a=0; amtex[a]) { expand_doit(fd, mainvar, la->mtex[a]->tex); expand_doit(fd, mainvar, la->mtex[a]->object); @@ -8125,7 +8119,7 @@ static void expand_lamp(FileData *fd, Main *mainvar, Lamp *la) if (la->adt) expand_animdata(fd, mainvar, la->adt); - + if (la->nodetree) expand_nodetree(fd, mainvar, la->nodetree); } @@ -8143,8 +8137,8 @@ static void expand_lattice(FileData *fd, Main *mainvar, Lattice *lt) static void expand_world(FileData *fd, Main *mainvar, World *wrld) { int a; - - for (a=0; amtex[a]) { expand_doit(fd, mainvar, wrld->mtex[a]->tex); expand_doit(fd, mainvar, wrld->mtex[a]->object); @@ -8155,7 +8149,7 @@ static void expand_world(FileData *fd, Main *mainvar, World *wrld) if (wrld->adt) expand_animdata(fd, mainvar, wrld->adt); - + if (wrld->nodetree) expand_nodetree(fd, mainvar, wrld->nodetree); } @@ -8164,8 +8158,8 @@ static void expand_world(FileData *fd, Main *mainvar, World *wrld) static void expand_mball(FileData *fd, Main *mainvar, MetaBall *mb) { int a; - - for (a=0; atotcol; a++) { + + for (a = 0; a < mb->totcol; a++) { expand_doit(fd, mainvar, mb->mat[a]); } @@ -8176,8 +8170,8 @@ static void expand_mball(FileData *fd, Main *mainvar, MetaBall *mb) static void expand_curve(FileData *fd, Main *mainvar, Curve *cu) { int a; - - for (a=0; atotcol; a++) { + + for (a = 0; a < cu->totcol; a++) { expand_doit(fd, mainvar, cu->mat[a]); } @@ -8205,28 +8199,30 @@ static void expand_mesh(FileData *fd, Main *mainvar, Mesh *me) if (me->adt) expand_animdata(fd, mainvar, me->adt); - for (a=0; atotcol; a++) { + for (a = 0; a < me->totcol; a++) { expand_doit(fd, mainvar, me->mat[a]); } - + expand_doit(fd, mainvar, me->key); expand_doit(fd, mainvar, me->texcomesh); - + if (me->tface) { - tf= me->tface; - for (i=0; itotface; i++, tf++) + tf = me->tface; + for (i=0; itotface; i++, tf++) { if (tf->tpage) expand_doit(fd, mainvar, tf->tpage); + } } - for (a=0; afdata.totlayer; a++) { - layer= &me->fdata.layers[a]; - + for (a = 0; a < me->fdata.totlayer; a++) { + layer = &me->fdata.layers[a]; + if (layer->type == CD_MTFACE) { - mtf= (MTFace*)layer->data; - for (i=0; itotface; i++, mtf++) + mtf = (MTFace*)layer->data; + for (i = 0; i < me->totface; i++, mtf++) { if (mtf->tpage) expand_doit(fd, mainvar, mtf->tpage); + } } } } @@ -8239,7 +8235,7 @@ typedef struct tConstraintExpandData { /* callback function used to expand constraint ID-links */ static void expand_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, short UNUSED(isReference), void *userdata) { - tConstraintExpandData *ced= (tConstraintExpandData *)userdata; + tConstraintExpandData *ced = (tConstraintExpandData *)userdata; expand_doit(ced->fd, ced->mainvar, *idpoin); } @@ -8249,13 +8245,13 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb) bConstraint *curcon; /* relink all ID-blocks used by the constraints */ - ced.fd= fd; - ced.mainvar= mainvar; + ced.fd = fd; + ced.mainvar = mainvar; id_loop_constraints(lb, expand_constraint_cb, &ced); /* depreceated manual expansion stuff */ - for (curcon=lb->first; curcon; curcon=curcon->next) { + for (curcon = lb->first; curcon; curcon = curcon->next) { if (curcon->ipo) expand_doit(fd, mainvar, curcon->ipo); // XXX depreceated - old animation system } @@ -8264,21 +8260,20 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb) static void expand_bones(FileData *fd, Main *mainvar, Bone *bone) { Bone *curBone; - + for (curBone = bone->childbase.first; curBone; curBone=curBone->next) { expand_bones(fd, mainvar, curBone); } - } static void expand_pose(FileData *fd, Main *mainvar, bPose *pose) { bPoseChannel *chan; - + if (!pose) return; - - for (chan = pose->chanbase.first; chan; chan=chan->next) { + + for (chan = pose->chanbase.first; chan; chan = chan->next) { expand_constraints(fd, mainvar, &chan->constraints); expand_doit(fd, mainvar, chan->custom); } @@ -8287,10 +8282,10 @@ static void expand_pose(FileData *fd, Main *mainvar, bPose *pose) static void expand_armature(FileData *fd, Main *mainvar, bArmature *arm) { Bone *curBone; - + if (arm->adt) expand_animdata(fd, mainvar, arm->adt); - + for (curBone = arm->bonebase.first; curBone; curBone=curBone->next) { expand_bones(fd, mainvar, curBone); } @@ -8300,10 +8295,10 @@ static void expand_object_expandModifiers(void *userData, Object *UNUSED(ob), ID **idpoin) { struct { FileData *fd; Main *mainvar; } *data= userData; - - FileData *fd= data->fd; - Main *mainvar= data->mainvar; - + + FileData *fd = data->fd; + Main *mainvar = data->mainvar; + expand_doit(fd, mainvar, *idpoin); } @@ -8316,18 +8311,18 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) bActionStrip *strip; PartEff *paf; int a; - + expand_doit(fd, mainvar, ob->data); - + /* expand_object_expandModifier() */ if (ob->modifiers.first) { struct { FileData *fd; Main *mainvar; } data; - data.fd= fd; - data.mainvar= mainvar; - + data.fd = fd; + data.mainvar = mainvar; + modifiers_foreachIDLink(ob, expand_object_expandModifiers, (void *)&data); } - + expand_pose(fd, mainvar, ob->pose); expand_doit(fd, mainvar, ob->poselib); expand_constraints(fd, mainvar, &ob->constraints); @@ -8339,7 +8334,7 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) expand_doit(fd, mainvar, ob->action); expand_constraint_channels(fd, mainvar, &ob->constraintChannels); - + for (strip=ob->nlastrips.first; strip; strip=strip->next) { expand_doit(fd, mainvar, strip->object); expand_doit(fd, mainvar, strip->act); @@ -8350,14 +8345,14 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) if (ob->adt) expand_animdata(fd, mainvar, ob->adt); - for (a=0; atotcol; a++) { + for (a = 0; a < ob->totcol; a++) { expand_doit(fd, mainvar, ob->mat[a]); } paf = blo_do_version_give_parteff_245(ob); if (paf && paf->group) expand_doit(fd, mainvar, paf->group); - + if (ob->dup_group) expand_doit(fd, mainvar, ob->dup_group); @@ -8365,98 +8360,92 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) expand_doit(fd, mainvar, ob->proxy); if (ob->proxy_group) expand_doit(fd, mainvar, ob->proxy_group); - - for (psys=ob->particlesystem.first; psys; psys=psys->next) + + for (psys = ob->particlesystem.first; psys; psys = psys->next) expand_doit(fd, mainvar, psys->part); - - sens= ob->sensors.first; - while (sens) { - if (sens->type==SENS_TOUCH) { - bTouchSensor *ts= sens->data; + + for (sens = ob->sensors.first; sens; sens = sens->next) { + if (sens->type == SENS_TOUCH) { + bTouchSensor *ts = sens->data; expand_doit(fd, mainvar, ts->ma); } - else if (sens->type==SENS_MESSAGE) { - bMessageSensor *ms= sens->data; + else if (sens->type == SENS_MESSAGE) { + bMessageSensor *ms = sens->data; expand_doit(fd, mainvar, ms->fromObject); } - sens= sens->next; } - - cont= ob->controllers.first; - while (cont) { - if (cont->type==CONT_PYTHON) { - bPythonCont *pc= cont->data; + + for (cont = ob->controllers.first; cont; cont = cont->next) { + if (cont->type == CONT_PYTHON) { + bPythonCont *pc = cont->data; expand_doit(fd, mainvar, pc->text); } - cont= cont->next; } - - act= ob->actuators.first; - while (act) { - if (act->type==ACT_SOUND) { - bSoundActuator *sa= act->data; + + for (act = ob->actuators.first; act; act = act->next) { + if (act->type == ACT_SOUND) { + bSoundActuator *sa = act->data; expand_doit(fd, mainvar, sa->sound); } - else if (act->type==ACT_CAMERA) { - bCameraActuator *ca= act->data; + else if (act->type == ACT_CAMERA) { + bCameraActuator *ca = act->data; expand_doit(fd, mainvar, ca->ob); } - else if (act->type==ACT_EDIT_OBJECT) { - bEditObjectActuator *eoa= act->data; + else if (act->type == ACT_EDIT_OBJECT) { + bEditObjectActuator *eoa = act->data; if (eoa) { expand_doit(fd, mainvar, eoa->ob); expand_doit(fd, mainvar, eoa->me); } } - else if (act->type==ACT_OBJECT) { - bObjectActuator *oa= act->data; + else if (act->type == ACT_OBJECT) { + bObjectActuator *oa = act->data; expand_doit(fd, mainvar, oa->reference); } - else if (act->type==ACT_ADD_OBJECT) { - bAddObjectActuator *aoa= act->data; + else if (act->type == ACT_ADD_OBJECT) { + bAddObjectActuator *aoa = act->data; expand_doit(fd, mainvar, aoa->ob); } - else if (act->type==ACT_SCENE) { - bSceneActuator *sa= act->data; + else if (act->type == ACT_SCENE) { + bSceneActuator *sa = act->data; expand_doit(fd, mainvar, sa->camera); expand_doit(fd, mainvar, sa->scene); } - else if (act->type==ACT_2DFILTER) { - bTwoDFilterActuator *tdfa= act->data; + else if (act->type == ACT_2DFILTER) { + bTwoDFilterActuator *tdfa = act->data; expand_doit(fd, mainvar, tdfa->text); } - else if (act->type==ACT_ACTION) { - bActionActuator *aa= act->data; + else if (act->type == ACT_ACTION) { + bActionActuator *aa = act->data; expand_doit(fd, mainvar, aa->act); } - else if (act->type==ACT_SHAPEACTION) { - bActionActuator *aa= act->data; + else if (act->type == ACT_SHAPEACTION) { + bActionActuator *aa = act->data; expand_doit(fd, mainvar, aa->act); } - else if (act->type==ACT_PROPERTY) { - bPropertyActuator *pa= act->data; + else if (act->type == ACT_PROPERTY) { + bPropertyActuator *pa = act->data; expand_doit(fd, mainvar, pa->ob); } - else if (act->type==ACT_MESSAGE) { - bMessageActuator *ma= act->data; + else if (act->type == ACT_MESSAGE) { + bMessageActuator *ma = act->data; expand_doit(fd, mainvar, ma->toObject); } else if (act->type==ACT_PARENT) { - bParentActuator *pa= act->data; + bParentActuator *pa = act->data; expand_doit(fd, mainvar, pa->ob); } - else if (act->type==ACT_ARMATURE) { - bArmatureActuator *arma= act->data; + else if (act->type == ACT_ARMATURE) { + bArmatureActuator *arma = act->data; expand_doit(fd, mainvar, arma->target); } - else if (act->type==ACT_STEERING) { - bSteeringActuator *sta= act->data; + 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; } - + if (ob->pd && ob->pd->tex) expand_doit(fd, mainvar, ob->pd->tex); @@ -8466,8 +8455,8 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) { Base *base; SceneRenderLayer *srl; - - for (base= sce->base.first; base; base= base->next) { + + for (base = sce->base.first; base; base = base->next) { expand_doit(fd, mainvar, base->object); } expand_doit(fd, mainvar, sce->camera); @@ -8483,20 +8472,20 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) if (sce->nodetree) expand_nodetree(fd, mainvar, sce->nodetree); - for (srl= sce->r.layers.first; srl; srl= srl->next) { + for (srl = sce->r.layers.first; srl; srl = srl->next) { expand_doit(fd, mainvar, srl->mat_override); expand_doit(fd, mainvar, srl->light_override); } - + if (sce->r.dometext) expand_doit(fd, mainvar, sce->gm.dome.warptext); - + if (sce->gpd) expand_doit(fd, mainvar, sce->gpd); - + if (sce->ed) { Sequence *seq; - + SEQ_BEGIN (sce->ed, seq) { if (seq->scene) expand_doit(fd, mainvar, seq->scene); @@ -8510,7 +8499,7 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) { TimeMarker *marker; - for (marker= sce->markers.first; marker; marker= marker->next) { + for (marker = sce->markers.first; marker; marker = marker->next) { if (marker->camera) { expand_doit(fd, mainvar, marker->camera); } @@ -8552,22 +8541,19 @@ static void expand_main(FileData *fd, Main *mainvar) { ListBase *lbarray[MAX_LIBARRAY]; ID *id; - int a, doit= 1; - - if (fd==NULL) return; - + int a, doit = 1; + + if (fd == NULL) return; + while (doit) { - doit= 0; - - a= set_listbasepointers(mainvar, lbarray); + doit = 0; + + a = set_listbasepointers(mainvar, lbarray); while (a--) { id= lbarray[a]->first; - while (id) { if (id->flag & LIB_TEST) { - switch (GS(id->name)) { - case ID_OB: expand_object(fd, mainvar, (Object *)id); break; @@ -8635,12 +8621,12 @@ static void expand_main(FileData *fd, Main *mainvar) expand_movieclip(fd, mainvar, (MovieClip *)id); break; } - - doit= 1; + + doit = 1; id->flag -= LIB_TEST; - + } - id= id->next; + id = id->next; } } } @@ -8650,9 +8636,11 @@ static int object_in_any_scene(Main *mainvar, Object *ob) { Scene *sce; - for (sce= mainvar->scene.first; sce; sce= sce->id.next) + for (sce= mainvar->scene.first; sce; sce= sce->id.next) { if (BKE_scene_base_find(sce, ob)) return 1; + } + return 0; } @@ -8660,29 +8648,26 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, const { Object *ob; Base *base; - const short is_group_append= (is_link==FALSE && idcode==ID_GR); + const short is_group_append = (is_link==FALSE && idcode==ID_GR); /* give all objects which are LIB_INDIRECT a base, or for a group when *lib has been set */ for (ob= mainvar->object.first; ob; ob= ob->id.next) { - if ( ob->id.flag & LIB_INDIRECT ) { - /* IF below is quite confusing! * if we are appending, but this object wasnt just added along with a group, * then this is already used indirectly in the scene somewhere else and we didnt just append it. * * (ob->id.flag & LIB_PRE_EXISTING)==0 means that this is a newly appended object - Campbell */ if (is_group_append==0 || (ob->id.flag & LIB_PRE_EXISTING)==0) { - int do_it= 0; - if (ob->id.us==0) { - do_it= 1; + if (ob->id.us == 0) { + do_it = 1; } else if (idcode==ID_GR) { if (ob->id.us==1 && is_link==FALSE && ob->id.lib==lib) { if ((ob->flag & OB_FROMGROUP) && object_in_any_scene(mainvar, ob)==0) { - do_it= 1; + do_it = 1; } } } @@ -8690,25 +8675,23 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, const /* when appending, make sure any indirectly loaded objects * get a base else they cant be accessed at all [#27437] */ if (ob->id.us==1 && is_link==FALSE && ob->id.lib==lib) { - /* we may be appending from a scene where we already * have a linked object which is not in any scene [#27616] */ if ((ob->id.flag & LIB_PRE_EXISTING)==0) { - if (object_in_any_scene(mainvar, ob)==0) { - do_it= 1; + do_it = 1; } } } } - + if (do_it) { - base= MEM_callocN(sizeof(Base), "add_ext_base"); + base = MEM_callocN(sizeof(Base), "add_ext_base"); BLI_addtail(&(sce->base), base); - base->lay= ob->lay; - base->object= ob; - base->flag= ob->flag; - ob->id.us= 1; + base->lay = ob->lay; + base->object = ob; + base->flag = ob->flag; + ob->id.us = 1; ob->id.flag -= LIB_INDIRECT; ob->id.flag |= LIB_EXTERN; @@ -8721,26 +8704,26 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, const static void give_base_to_groups(Main *mainvar, Scene *scene) { Group *group; - + /* give all objects which are LIB_INDIRECT a base, or for a group when *lib has been set */ - for (group= mainvar->group.first; group; group= group->id.next) { + for (group = mainvar->group.first; group; group = group->id.next) { if (((group->id.flag & LIB_INDIRECT)==0 && (group->id.flag & LIB_PRE_EXISTING)==0)) { Base *base; - + /* BKE_object_add(...) messes with the selection */ - Object *ob= BKE_object_add_only_object(OB_EMPTY, group->id.name+2); - ob->type= OB_EMPTY; - ob->lay= scene->lay; - + Object *ob = BKE_object_add_only_object(OB_EMPTY, group->id.name+2); + ob->type = OB_EMPTY; + ob->lay = scene->lay; + /* assign the base */ - base= BKE_scene_base_add(scene, ob); + base = BKE_scene_base_add(scene, ob); base->flag |= SELECT; base->object->flag= base->flag; ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; - scene->basact= base; - + scene->basact = base; + /* assign the group */ - ob->dup_group= group; + ob->dup_group = group; ob->transflag |= OB_DUPLIGROUP; rename_id(&ob->id, group->id.name+2); copy_v3_v3(ob->loc, scene->cursor); @@ -8753,23 +8736,23 @@ static void give_base_to_groups(Main *mainvar, Scene *scene) static ID *append_named_part(Main *mainl, FileData *fd, const char *idname, const short idcode) { BHead *bhead; - ID *id= NULL; - int found=0; + ID *id = NULL; + int found = 0; - for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { - if (bhead->code==idcode) { + for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) { + if (bhead->code == idcode) { const char *idname_test= bhead_id_name(fd, bhead); - - if (strcmp(idname_test + 2, idname)==0) { - found= 1; - id= is_yet_read(fd, mainl, bhead); - if (id==NULL) { + + if (strcmp(idname_test + 2, idname) == 0) { + found = 1; + id = is_yet_read(fd, mainl, bhead); + if (id == NULL) { /* not read yet */ read_libblock(fd, mainl, bhead, LIB_TESTEXT, &id); - + if (id) { /* sort by name in list */ - ListBase *lb= which_libbase(mainl, idcode); + ListBase *lb = which_libbase(mainl, idcode); id_sort_by_name(lb, id); } } @@ -8782,19 +8765,19 @@ static ID *append_named_part(Main *mainl, FileData *fd, const char *idname, cons id->flag |= LIB_EXTERN; } } - + break; } } - else if (bhead->code==ENDB) { + else if (bhead->code == ENDB) { break; } } - + /* if we found the id but the id is NULL, this is really bad */ BLI_assert((found != 0) == (id != NULL)); - - return found ? id : NULL; + + return (found) ? id : NULL; } static ID *append_named_part_ex(const bContext *C, Main *mainl, FileData *fd, const char *idname, const int idcode, const int flag) @@ -8802,27 +8785,27 @@ static ID *append_named_part_ex(const bContext *C, Main *mainl, FileData *fd, co ID *id= append_named_part(mainl, fd, idname, idcode); if (id && (GS(id->name) == ID_OB)) { /* loose object: give a base */ - Scene *scene= CTX_data_scene(C); /* can be NULL */ + Scene *scene = CTX_data_scene(C); /* can be NULL */ if (scene) { Base *base; Object *ob; - + base= MEM_callocN(sizeof(Base), "app_nam_part"); BLI_addtail(&scene->base, base); - - ob= (Object *)id; - + + ob = (Object *)id; + /* link at active layer (view3d->lay if in context, else scene->lay */ if ((flag & FILE_ACTIVELAY)) { View3D *v3d = CTX_wm_view3d(C); ob->lay = v3d ? v3d->layact : scene->lay; } - - ob->mode= 0; - base->lay= ob->lay; - base->object= ob; + + ob->mode = 0; + base->lay = ob->lay; + base->object = ob; ob->id.us++; - + if (flag & FILE_AUTOSELECT) { base->flag |= SELECT; base->object->flag = base->flag; @@ -8830,35 +8813,35 @@ static ID *append_named_part_ex(const bContext *C, Main *mainl, FileData *fd, co } } } - + return id; } ID *BLO_library_append_named_part(Main *mainl, BlendHandle** bh, const char *idname, const int idcode) { - FileData *fd= (FileData*)(*bh); + FileData *fd = (FileData*)(*bh); return append_named_part(mainl, fd, idname, idcode); } ID *BLO_library_append_named_part_ex(const bContext *C, Main *mainl, BlendHandle** bh, const char *idname, const int idcode, const short flag) { - FileData *fd= (FileData*)(*bh); + FileData *fd = (FileData*)(*bh); return append_named_part_ex(C, mainl, fd, idname, idcode, flag); } static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r) { BHead *bhead; - - for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { + + for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead)) { if (bhead->code == GS(id->name)) { - + if (strcmp(id->name, bhead_id_name(fd, bhead))==0) { id->flag &= ~LIB_READ; id->flag |= LIB_TEST; // printf("read lib block %s\n", id->name); read_libblock(fd, mainvar, bhead, id->flag, id_r); - + break; } } @@ -8872,15 +8855,15 @@ static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r) static Main* library_append_begin(Main *mainvar, FileData **fd, const char *filepath) { Main *mainl; - + /* make mains */ blo_split_main(&(*fd)->mainlist, mainvar); - + /* which one do we need? */ mainl = blo_find_main(*fd, &(*fd)->mainlist, filepath, G.main->name); /* needed for do_version */ - mainl->versionfile= (*fd)->fileversion; + mainl->versionfile = (*fd)->fileversion; read_file_version(*fd, mainl); return mainl; @@ -8888,7 +8871,7 @@ static Main* library_append_begin(Main *mainvar, FileData **fd, const char *file Main* BLO_library_append_begin(Main *mainvar, BlendHandle** bh, const char *filepath) { - FileData *fd= (FileData*)(*bh); + FileData *fd = (FileData*)(*bh); return library_append_begin(mainvar, &fd, filepath); } @@ -8898,45 +8881,44 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in { Main *mainvar; Library *curlib; - + /* make main consistent */ expand_main(*fd, mainl); - + /* do this when expand found other libs */ read_libraries(*fd, &(*fd)->mainlist); - curlib= mainl->curlib; - + curlib = mainl->curlib; + /* make the lib path relative if required */ if (flag & FILE_RELPATH) { - /* use the full path, this could have been read by other library even */ BLI_strncpy(curlib->name, curlib->filepath, sizeof(curlib->name)); /* uses current .blend file as reference */ BLI_path_rel(curlib->name, G.main->name); } - + blo_join_main(&(*fd)->mainlist); - mainvar= (*fd)->mainlist.first; - mainl= NULL; /* blo_join_main free's mainl, cant use anymore */ - + mainvar = (*fd)->mainlist.first; + mainl = NULL; /* blo_join_main free's mainl, cant use anymore */ + lib_link_all(*fd, mainvar); lib_verify_nodetree(mainvar, FALSE); fix_relpaths_library(G.main->name, mainvar); /* make all relative paths, relative to the open blend file */ - + if (C) { - Scene *scene= CTX_data_scene(C); - + Scene *scene = CTX_data_scene(C); + /* give a base to loose objects. If group append, do it for objects too */ if (scene) { - const short is_link= (flag & FILE_LINK) != 0; - if (idcode==ID_SCE) { + const short is_link = (flag & FILE_LINK) != 0; + if (idcode == ID_SCE) { /* don't instance anything when linking in scenes, assume the scene its self instances the data */ } else { give_base_to_objects(mainvar, scene, curlib, idcode, is_link); - + if (flag & FILE_GROUP_INSTANCE) { give_base_to_groups(mainvar, scene); } @@ -8959,9 +8941,9 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in void BLO_library_append_end(const bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag) { - FileData *fd= (FileData*)(*bh); + FileData *fd = (FileData*)(*bh); library_append_end(C, mainl, &fd, idcode, flag); - *bh= (BlendHandle*)fd; + *bh = (BlendHandle*)fd; } void *BLO_library_read_struct(FileData *fd, BHead *bh, const char *blockname) @@ -8974,105 +8956,105 @@ void *BLO_library_read_struct(FileData *fd, BHead *bh, const char *blockname) static int mainvar_count_libread_blocks(Main *mainvar) { ListBase *lbarray[MAX_LIBARRAY]; - int a, tot= 0; - - a= set_listbasepointers(mainvar, lbarray); + int a, tot = 0; + + a = set_listbasepointers(mainvar, lbarray); while (a--) { ID *id; - - for (id= lbarray[a]->first; id; id= id->next) + + for (id = lbarray[a]->first; id; id = id->next) { if (id->flag & LIB_READ) tot++; + } } return tot; } static void read_libraries(FileData *basefd, ListBase *mainlist) { - Main *mainl= mainlist->first; + Main *mainl = mainlist->first; Main *mainptr; ListBase *lbarray[MAX_LIBARRAY]; int a, doit= 1; - + while (doit) { - doit= 0; - + doit = 0; + /* test 1: read libdata */ mainptr= mainl->next; while (mainptr) { - int tot= mainvar_count_libread_blocks(mainptr); + int tot = mainvar_count_libread_blocks(mainptr); // printf("found LIB_READ %s\n", mainptr->curlib->name); if (tot) { - FileData *fd= mainptr->curlib->filedata; - - if (fd==NULL) { - + FileData *fd = mainptr->curlib->filedata; + + if (fd == NULL) { /* printf and reports for now... its important users know this */ BKE_reportf_wrap(basefd->reports, RPT_INFO, "read library: '%s', '%s'", mainptr->curlib->filepath, mainptr->curlib->name); - - fd= blo_openblenderfile(mainptr->curlib->filepath, basefd->reports); + + fd = blo_openblenderfile(mainptr->curlib->filepath, basefd->reports); /* allow typing in a new lib path */ - if (G.rt==-666) { - while (fd==NULL) { - char newlib_path[FILE_MAX] = { 0 }; + if (G.rt == -666) { + while (fd == NULL) { + char newlib_path[FILE_MAX] = {0}; printf("Missing library...'\n"); printf(" current file: %s\n", G.main->name); printf(" absolute lib: %s\n", mainptr->curlib->filepath); printf(" relative lib: %s\n", mainptr->curlib->name); printf(" enter a new path:\n"); - + if (scanf("%s", newlib_path) > 0) { BLI_strncpy(mainptr->curlib->name, newlib_path, sizeof(mainptr->curlib->name)); BLI_strncpy(mainptr->curlib->filepath, newlib_path, sizeof(mainptr->curlib->filepath)); cleanup_path(G.main->name, mainptr->curlib->filepath); - fd= blo_openblenderfile(mainptr->curlib->filepath, basefd->reports); - + fd = blo_openblenderfile(mainptr->curlib->filepath, basefd->reports); + if (fd) { printf("found: '%s', party on macuno!\n", mainptr->curlib->filepath); } } } } - + if (fd) { - fd->reports= basefd->reports; + fd->reports = basefd->reports; if (fd->libmap) oldnewmap_free(fd->libmap); - + fd->libmap = oldnewmap_new(); - mainptr->curlib->filedata= fd; - mainptr->versionfile= fd->fileversion; + mainptr->curlib->filedata = fd; + mainptr->versionfile= fd->fileversion; /* subversion */ read_file_version(fd, mainptr); } - else mainptr->curlib->filedata= NULL; - - if (fd==NULL) { + else mainptr->curlib->filedata = NULL; + + if (fd == NULL) { BKE_reportf_wrap(basefd->reports, RPT_ERROR, "Can't find lib '%s'", mainptr->curlib->filepath); } } if (fd) { - doit= 1; - a= set_listbasepointers(mainptr, lbarray); + doit = 1; + a = set_listbasepointers(mainptr, lbarray); while (a--) { - ID *id= lbarray[a]->first; - + ID *id = lbarray[a]->first; + while (id) { - ID *idn= id->next; + ID *idn = id->next; if (id->flag & LIB_READ) { - ID *realid= NULL; + ID *realid = NULL; BLI_remlink(lbarray[a], id); - + append_id_part(fd, mainptr, id, &realid); if (!realid) { BKE_reportf_wrap(fd->reports, RPT_ERROR, @@ -9082,52 +9064,52 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) } change_idid_adr(mainlist, basefd, id, realid); - + MEM_freeN(id); } - id= idn; + id = idn; } } - + expand_main(fd, mainptr); /* dang FileData... now new libraries need to be appended to original filedata, * it is not a good replacement for the old global (ton) */ - while ( fd->mainlist.first ) { - Main *mp= fd->mainlist.first; + while (fd->mainlist.first) { + Main *mp = fd->mainlist.first; BLI_remlink(&fd->mainlist, mp); BLI_addtail(&basefd->mainlist, mp); } } } - - mainptr= mainptr->next; + + mainptr = mainptr->next; } } /* test if there are unread libblocks */ - for (mainptr= mainl->next; mainptr; mainptr= mainptr->next) { - a= set_listbasepointers(mainptr, lbarray); + for (mainptr = mainl->next; mainptr; mainptr = mainptr->next) { + a = set_listbasepointers(mainptr, lbarray); while (a--) { - ID *id= lbarray[a]->first; + ID *id = lbarray[a]->first; while (id) { - ID *idn= id->next; + ID *idn = id->next; if (id->flag & LIB_READ) { BLI_remlink(lbarray[a], id); BKE_reportf_wrap(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'", BKE_idcode_to_name(GS(id->name)), id->name + 2, mainptr->curlib->filepath); change_idid_adr(mainlist, basefd, id, NULL); - + MEM_freeN(id); } - id= idn; + id = idn; } } } /* do versions, link, and free */ - for (mainptr= mainl->next; mainptr; mainptr= mainptr->next) { + for (mainptr = mainl->next; mainptr; mainptr = mainptr->next) { /* some mains still have to be read, then * versionfile is still zero! */ if (mainptr->versionfile) { @@ -9141,7 +9123,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) lib_link_all(mainptr->curlib->filedata, mainptr); if (mainptr->curlib->filedata) blo_freefiledata(mainptr->curlib->filedata); - mainptr->curlib->filedata= NULL; + mainptr->curlib->filedata = NULL; } } @@ -9155,17 +9137,17 @@ BlendFileData *blo_read_blendafterruntime(int file, const char *name, int actual fd->filedes = file; fd->buffersize = actualsize; fd->read = fd_read_from_file; - + /* needed for library_append and read_libraries */ BLI_strncpy(fd->relabase, name, sizeof(fd->relabase)); - + fd = blo_decode_and_check(fd, reports); if (!fd) return NULL; - - fd->reports= reports; - bfd= blo_read_file_internal(fd, ""); + + fd->reports = reports; + bfd = blo_read_file_internal(fd, ""); blo_freefiledata(fd); - + return bfd; } From 463898014f86d79ed096e10fa178d56641375456 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 13:10:34 +0000 Subject: [PATCH 003/159] code cleanup: quiet warnings from compositor merge (builds with -Werror now in cmake) --- source/blender/compositor/nodes/COM_BlurNode.cpp | 4 +++- source/blender/compositor/nodes/COM_MuteNode.cpp | 4 ++++ .../blender/compositor/nodes/COM_SocketProxyNode.cpp | 3 +++ .../compositor/operations/COM_LensGhostOperation.cpp | 10 ++++++---- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/source/blender/compositor/nodes/COM_BlurNode.cpp b/source/blender/compositor/nodes/COM_BlurNode.cpp index c278ea877ba..8c1923b3236 100644 --- a/source/blender/compositor/nodes/COM_BlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BlurNode.cpp @@ -35,8 +35,10 @@ BlurNode::BlurNode(bNode *editorNode): Node(editorNode) { void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { bNode* editorNode = this->getbNode(); NodeBlurData * data = (NodeBlurData*)editorNode->storage; +#if 0 const bNodeSocket *sock = this->getInputSocket(1)->getbNodeSocket(); - //const float size = ((const bNodeSocketValueFloat*)sock->default_value)->value; + const float size = ((const bNodeSocketValueFloat*)sock->default_value)->value; +#endif CompositorQuality quality = context->getQuality(); diff --git a/source/blender/compositor/nodes/COM_MuteNode.cpp b/source/blender/compositor/nodes/COM_MuteNode.cpp index 44accf42f6a..cb3d4be8834 100644 --- a/source/blender/compositor/nodes/COM_MuteNode.cpp +++ b/source/blender/compositor/nodes/COM_MuteNode.cpp @@ -70,7 +70,11 @@ void MuteNode::reconnect(ExecutionSystem * graph, OutputSocket * output) { operation = coloroperation; break; } + /* quiet warnings */ + case COM_DT_UNKNOWN: + break; } + if (operation) { output->relinkConnections(operation->getOutputSocket(), false); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp index 0622ed0ea84..6730036baf6 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp @@ -84,6 +84,9 @@ void OutputSocketProxyNode::convertToOperations(ExecutionSystem *graph, Composit graph->addOperation(operation); break; } + /* quiet warnings */ + case COM_DT_UNKNOWN: + break; } } } diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp index eb957ca4756..37f0c776d9f 100644 --- a/source/blender/compositor/operations/COM_LensGhostOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp @@ -723,10 +723,12 @@ void LensGhostProjectionOperation::executePixel(float* color, float x, float y, void LensGhostOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { vector* faces = (vector*)data; - const float bokehWidth = bokehReader->getWidth(); - const float bokehHeight = bokehReader->getHeight(); - float bokeh[4]; - color[0] = 0.0f; +#if 0 /* UNUSED */ + const float bokehWidth = bokehReader->getWidth(); + const float bokehHeight = bokehReader->getHeight(); + float bokeh[4]; +#endif + color[0] = 0.0f; color[1] = 0.0f; color[2] = 0.0f; color[3] = 1.0f; From 9b42b996493d0202247fc245c873e20d13ce92be Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Thu, 17 May 2012 13:15:58 +0000 Subject: [PATCH 004/159] MinGW64 and possibly gcc 4.7 doesn't like interface as identifier. --- .../blender/compositor/operations/COM_LensGhostOperation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp index 37f0c776d9f..6236708c9e1 100644 --- a/source/blender/compositor/operations/COM_LensGhostOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp @@ -229,8 +229,8 @@ public: } - void addInterface(LensInterface* interface) { - this->interfaces.push_back(interface); + void addInterface(LensInterface* pinterface) { + this->interfaces.push_back(pinterface); this->lensIndex = this->interfaces.size()-1; } From ef3be824a05b81ca0a11a9996a62b0b01c5ca54c Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 17 May 2012 13:22:19 +0000 Subject: [PATCH 005/159] Fix [#31495] Modifiers in Text objects don't respect edit mode flag. Need to also check for cu->editfont for text edit mode... Also use modifier_isEnabled() to make general tests whether a modifier should be applied or skipped. --- source/blender/blenkernel/intern/displist.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 9b172b50bca..9274d7aefcb 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -752,7 +752,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl Curve *cu = ob->data; ListBase *nurb = BKE_curve_nurbs_get(cu); int numVerts = 0; - const int editmode = (!forRender && cu->editnurb); + const int editmode = (!forRender && (cu->editnurb || cu->editfont)); ModifierApplyFlag app_flag = 0; float (*originalVerts)[3] = NULL; float (*deformedVerts)[3] = NULL; @@ -793,9 +793,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl md->scene = scene; - if ((md->mode & required_mode) != required_mode) - continue; - if (mti->isDisabled && mti->isDisabled(md, forRender)) + if (!modifier_isEnabled(scene, md, required_mode)) continue; if (mti->type != eModifierTypeType_OnlyDeform) continue; @@ -867,7 +865,7 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba Curve *cu = ob->data; ListBase *nurb = BKE_curve_nurbs_get(cu); int required_mode = 0, totvert = 0; - int editmode = (!forRender && cu->editnurb); + int editmode = (!forRender && (cu->editnurb || cu->editfont)); DerivedMesh *dm = NULL, *ndm; float (*vertCos)[3] = NULL; int useCache = !forRender; @@ -899,9 +897,7 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba md->scene = scene; - if ((md->mode & required_mode) != required_mode) - continue; - if (mti->isDisabled && mti->isDisabled(md, forRender)) + if (!modifier_isEnabled(scene, md, required_mode)) continue; if (mti->type == eModifierTypeType_OnlyDeform || @@ -1095,7 +1091,7 @@ static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFina ModifierData *pretessellatePoint; Curve *cu = ob->data; int required_mode; - int editmode = (!forRender && cu->editnurb); + int editmode = (!forRender && (cu->editnurb || cu->editfont)); DerivedMesh *ndm, *orcodm = NULL; const ModifierApplyFlag app_flag = forRender ? MOD_APPLY_RENDER : 0; @@ -1118,9 +1114,7 @@ static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFina md->scene = scene; - if ((md->mode & required_mode) != required_mode) - continue; - if (mti->isDisabled && mti->isDisabled(md, forRender)) + if (!modifier_isEnabled(scene, md, required_mode)) continue; if (mti->type != eModifierTypeType_Constructive) continue; From aeb3c0f70eb912aefbf7adb95f53347f97f42fe6 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 17 May 2012 13:25:41 +0000 Subject: [PATCH 006/159] Fix for MSVC float conversion --- .../operations/COM_ScreenLensDistortionOperation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp index 4a4ac6c6833..87ef015384d 100644 --- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp @@ -93,7 +93,7 @@ void ScreenLensDistortionOperation::executePixel(float* outputColor, int x, int { // RG const int dx = ln[2] - ln[0], dy = ln[3] - ln[1]; - const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; + const float dsf = sqrtf((float)dx*dx + dy*dy) + 1.f; const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); const float sd = 1.f/(float)ds; @@ -111,7 +111,7 @@ void ScreenLensDistortionOperation::executePixel(float* outputColor, int x, int { // GB const int dx = ln[4] - ln[2], dy = ln[5] - ln[3]; - const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; + const float dsf = sqrtf((float)dx*dx + dy*dy) + 1.f; const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); const float sd = 1.f/(float)ds; From fe0d1a381003408dedcd3142a727c77806617150 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Thu, 17 May 2012 13:30:20 +0000 Subject: [PATCH 007/159] Fix blenderplayr compilation --- source/blenderplayer/bad_level_call_stubs/stubs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 87e51a0233c..f732edce20d 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -74,6 +74,7 @@ struct NodeBlurData; struct Nurb; struct Object; struct PBVHNode; +struct PyObject; struct Render; struct RenderEngine; struct RenderEngineType; @@ -519,7 +520,7 @@ struct CCLDeviceInfo; struct CCLDeviceInfo *CCL_compute_device_list(int opencl) { return NULL; } /* compositor */ -void COM_execute(bNodeTree *editingtree, int rendering) {} +void COM_execute(struct bNodeTree *editingtree, int rendering) {} char blender_path[] = ""; From 979f6bab9c1aba27b8d018d1481987d841f68ee1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 13:44:15 +0000 Subject: [PATCH 008/159] style cleanup: braces, compositor --- .../intern/COM_CompositorContext.cpp | 6 +- .../compositor/intern/COM_Converter.cpp | 20 +- .../compositor/intern/COM_ExecutionGroup.cpp | 20 +- .../compositor/intern/COM_ExecutionSystem.cpp | 23 +- .../intern/COM_ExecutionSystemHelper.cpp | 34 +- .../compositor/intern/COM_InputSocket.cpp | 29 +- .../compositor/intern/COM_MemoryBuffer.cpp | 2 +- .../compositor/intern/COM_MemoryManager.cpp | 2 +- .../intern/COM_MemoryManagerState.cpp | 9 +- source/blender/compositor/intern/COM_Node.cpp | 2 +- .../compositor/intern/COM_NodeBase.cpp | 5 +- .../compositor/intern/COM_NodeOperation.cpp | 3 +- .../compositor/intern/COM_OpenCLDevice.cpp | 8 +- .../compositor/intern/COM_OutputSocket.cpp | 3 +- .../intern/COM_SocketConnection.cpp | 8 +- .../compositor/intern/COM_WorkScheduler.cpp | 15 +- .../compositor/nodes/COM_AlphaOverNode.cpp | 12 +- .../blender/compositor/nodes/COM_BlurNode.cpp | 6 +- .../compositor/nodes/COM_BokehBlurNode.cpp | 3 +- .../compositor/nodes/COM_ChannelMatteNode.cpp | 2 +- .../compositor/nodes/COM_ColorBalanceNode.cpp | 3 +- .../compositor/nodes/COM_ColorSpillNode.cpp | 3 +- .../compositor/nodes/COM_CombineRGBANode.cpp | 9 +- .../compositor/nodes/COM_ConvertAlphaNode.cpp | 2 +- .../blender/compositor/nodes/COM_CropNode.cpp | 7 +- .../compositor/nodes/COM_DefocusNode.cpp | 6 +- .../compositor/nodes/COM_FilterNode.cpp | 2 +- .../compositor/nodes/COM_GroupNode.cpp | 3 +- .../compositor/nodes/COM_IDMaskNode.cpp | 3 +- .../compositor/nodes/COM_ImageNode.cpp | 7 +- .../nodes/COM_LensDistortionNode.cpp | 3 +- .../blender/compositor/nodes/COM_MathNode.cpp | 2 +- .../compositor/nodes/COM_MovieClipNode.cpp | 5 +- .../compositor/nodes/COM_RenderLayersNode.cpp | 6 +- .../compositor/nodes/COM_SwitchNode.cpp | 3 +- .../blender/compositor/nodes/COM_TimeNode.cpp | 6 +- .../compositor/nodes/COM_ViewLevelsNode.cpp | 3 +- .../compositor/nodes/COM_ZCombineNode.cpp | 6 +- .../operations/COM_AlphaOverKeyOperation.cpp | 4 +- .../COM_AlphaOverMixedOperation.cpp | 4 +- .../COM_AlphaOverPremultiplyOperation.cpp | 4 +- .../operations/COM_AntiAliasOperation.cpp | 6 +- .../operations/COM_BilateralBlurOperation.cpp | 3 +- .../operations/COM_BlurBaseOperation.cpp | 6 +- .../operations/COM_BokehBlurOperation.cpp | 6 +- .../operations/COM_BokehImageOperation.cpp | 9 +- .../operations/COM_BoxMaskOperation.cpp | 15 +- .../operations/COM_BrightnessOperation.cpp | 6 +- .../operations/COM_CalculateMeanOperation.cpp | 2 +- ...OM_CalculateStandardDeviationOperation.cpp | 2 +- .../operations/COM_ChangeHSVOperation.cpp | 2 +- .../operations/COM_ChannelMatteOperation.cpp | 4 +- .../operations/COM_ChromaMatteOperation.cpp | 4 +- .../COM_ColorCorrectionOperation.cpp | 21 +- .../operations/COM_ColorCurveOperation.cpp | 4 +- .../operations/COM_ColorMatteOperation.cpp | 2 +- .../operations/COM_ColorSpillOperation.cpp | 8 +- .../operations/COM_CompositorOperation.cpp | 4 +- .../COM_ConvertDepthToRadiusOperation.cpp | 3 +- .../COM_ConvertPremulToKeyOperation.cpp | 2 +- .../COM_ConvertRGBToYCCOperation.cpp | 2 +- .../COM_ConvertYCCToRGBOperation.cpp | 2 +- .../operations/COM_CropOperation.cpp | 25 +- .../COM_DifferenceMatteOperation.cpp | 6 +- .../operations/COM_DilateErodeOperation.cpp | 24 +- .../COM_DirectionalBlurOperation.cpp | 2 +- .../operations/COM_DistanceMatteOperation.cpp | 6 +- .../COM_DoubleEdgeMaskOperation.cpp | 536 ++++++++++-------- .../operations/COM_EllipseMaskOperation.cpp | 15 +- .../COM_FastGaussianBlurOperation.cpp | 16 +- .../operations/COM_FlipOperation.cpp | 6 +- .../COM_GaussianBokehBlurOperation.cpp | 22 +- .../operations/COM_GaussianXBlurOperation.cpp | 8 +- .../operations/COM_GaussianYBlurOperation.cpp | 8 +- .../operations/COM_ImageOperation.cpp | 11 +- .../operations/COM_InvertOperation.cpp | 7 +- .../operations/COM_LensGhostOperation.cpp | 41 +- .../COM_LuminanceMatteOperation.cpp | 4 +- .../operations/COM_MapUVOperation.cpp | 2 +- .../operations/COM_MapValueOperation.cpp | 8 +- .../operations/COM_MathBaseOperation.cpp | 16 +- .../operations/COM_MixBaseOperation.cpp | 12 +- .../operations/COM_MixColorOperation.cpp | 2 +- .../operations/COM_MixDarkenOperation.cpp | 6 +- .../operations/COM_MixDivideOperation.cpp | 6 +- .../operations/COM_MixHueOperation.cpp | 2 +- .../operations/COM_MixLightenOperation.cpp | 6 +- .../operations/COM_MixOverlayOperation.cpp | 15 +- .../operations/COM_MixSaturationOperation.cpp | 2 +- .../operations/COM_MovieClipOperation.cpp | 3 +- .../COM_MovieDistortionOperation.cpp | 3 +- .../COM_MultilayerImageOperation.cpp | 14 +- .../operations/COM_OpenCLKernels.cl.cpp | 2 +- .../operations/COM_PreviewOperation.cpp | 8 +- .../operations/COM_ReadBufferOperation.cpp | 3 +- .../operations/COM_RenderLayersAlphaProg.cpp | 3 +- .../operations/COM_RenderLayersBaseProg.cpp | 27 +- .../operations/COM_RotateOperation.cpp | 3 +- .../COM_ScreenLensDistortionOperation.cpp | 3 +- .../operations/COM_SetVectorOperation.cpp | 3 +- .../operations/COM_SplitViewerOperation.cpp | 11 +- .../operations/COM_TextureOperation.cpp | 7 +- .../COM_VariableSizeBokehBlurOperation.cpp | 4 +- .../operations/COM_VectorBlurOperation.cpp | 3 +- .../operations/COM_ViewerBaseOperation.cpp | 3 +- .../operations/COM_ViewerOperation.cpp | 8 +- .../operations/COM_WriteBufferOperation.cpp | 3 +- .../operations/COM_ZCombineOperation.cpp | 6 +- 108 files changed, 802 insertions(+), 545 deletions(-) diff --git a/source/blender/compositor/intern/COM_CompositorContext.cpp b/source/blender/compositor/intern/COM_CompositorContext.cpp index dbb05d4f493..abab4edfc3f 100644 --- a/source/blender/compositor/intern/COM_CompositorContext.cpp +++ b/source/blender/compositor/intern/COM_CompositorContext.cpp @@ -33,7 +33,8 @@ CompositorContext::CompositorContext() { const int CompositorContext::getFramenumber() const { if (this->scene) { return this->scene->r.cfra; - } else { + } + else { return -1; /* this should never happen */ } } @@ -41,7 +42,8 @@ const int CompositorContext::getFramenumber() const { const int CompositorContext::isColorManaged() const { if (this->scene) { return this->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT; - } else { + } + else { return 0; /* this should never happen */ } } diff --git a/source/blender/compositor/intern/COM_Converter.cpp b/source/blender/compositor/intern/COM_Converter.cpp index 56b1da97df8..ac57bf1cadc 100644 --- a/source/blender/compositor/intern/COM_Converter.cpp +++ b/source/blender/compositor/intern/COM_Converter.cpp @@ -361,15 +361,20 @@ void Converter::convertDataType(SocketConnection* connection, ExecutionSystem *s NodeOperation * converter = NULL; if (fromDatatype == COM_DT_VALUE && toDatatype == COM_DT_COLOR) { converter = new ConvertValueToColourProg(); - } else if (fromDatatype == COM_DT_VALUE && toDatatype == COM_DT_VECTOR) { + } + else if (fromDatatype == COM_DT_VALUE && toDatatype == COM_DT_VECTOR) { converter = new ConvertValueToVectorOperation(); - } else if (fromDatatype == COM_DT_COLOR && toDatatype == COM_DT_VALUE) { + } + else if (fromDatatype == COM_DT_COLOR && toDatatype == COM_DT_VALUE) { converter = new ConvertColourToValueProg(); - } else if (fromDatatype == COM_DT_COLOR && toDatatype == COM_DT_VECTOR) { + } + else if (fromDatatype == COM_DT_COLOR && toDatatype == COM_DT_VECTOR) { converter = new ConvertColorToVectorOperation(); - } else if (fromDatatype == COM_DT_VECTOR && toDatatype == COM_DT_VALUE) { + } + else if (fromDatatype == COM_DT_VECTOR && toDatatype == COM_DT_VALUE) { converter = new ConvertVectorToValueOperation(); - } else if (fromDatatype == COM_DT_VECTOR && toDatatype == COM_DT_COLOR) { + } + else if (fromDatatype == COM_DT_VECTOR && toDatatype == COM_DT_COLOR) { converter = new ConvertVectorToColorOperation(); } if (converter != NULL) { @@ -418,7 +423,8 @@ void Converter::convertResolution(SocketConnection *connection, ExecutionSystem scaleY = toHeight/fromHeight; if (scaleX < scaleY) { scaleX = scaleY; - } else { + } + else { scaleY = scaleX; } break; @@ -435,7 +441,7 @@ void Converter::convertResolution(SocketConnection *connection, ExecutionSystem NodeOperation *first = NULL; SocketConnection *c; ScaleOperation * scaleOperation = NULL; - if(doScale) { + if (doScale) { scaleOperation = new ScaleOperation(); first = scaleOperation; SetValueOperation * sxop = new SetValueOperation(); diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp index 22d4366a1a8..bce31658a8d 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -83,7 +83,8 @@ bool ExecutionGroup::canContainOperation(NodeOperation* operation) { if (!this->isComplex()) { return (!operation->isComplex()); - } else { + } + else { return false; } } @@ -101,7 +102,8 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat ReadBufferOperation* readOperation = (ReadBufferOperation*)operation; WriteBufferOperation* writeOperation = readOperation->getMemoryProxy()->getWriteBufferOperation(); this->addOperation(system, writeOperation); - } else { + } + else { unsigned int index; for (index = 0 ; index < operation->getNumberOfInputSockets(); index ++) { InputSocket * inputSocket = operation->getInputSocket(index); @@ -111,7 +113,8 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat } } } - } else { + } + else { if (operation->isWriteBufferOperation()) { WriteBufferOperation * writeoperation = (WriteBufferOperation*)operation; if (writeoperation->getMemoryProxy()->getExecutor() == NULL) { @@ -124,7 +127,7 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat } } -NodeOperation* ExecutionGroup::getOutputNodeOperation() const{ +NodeOperation* ExecutionGroup::getOutputNodeOperation() const { return this->operations[0]; // the first operation of the group is always the output operation. } @@ -328,11 +331,13 @@ void ExecutionGroup::execute(ExecutionSystem* graph) { finished=false; startEvaluated = true; numberEvaluated++; - } else if (state == COM_ES_SCHEDULED) { + } + else if (state == COM_ES_SCHEDULED) { finished=false; startEvaluated = true; numberEvaluated++; - } else if (state == COM_ES_EXECUTED && !startEvaluated) { + } + else if (state == COM_ES_EXECUTED && !startEvaluated) { startIndex = index+1; } } @@ -533,7 +538,8 @@ bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem * graph, int xChu if (!group->scheduleAreaWhenPossible(graph, &area)) { canBeExecuted = false; } - } else { + } + else { throw "ERROR"; } } diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp index d82d725d234..b66a6a036b5 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp @@ -46,7 +46,8 @@ ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { /* initialize the CompositorContext */ if (rendering) { context.setQuality((CompositorQuality)editingtree->render_quality); - } else { + } + else { context.setQuality((CompositorQuality)editingtree->edit_quality); } context.setRendering(rendering); @@ -77,22 +78,22 @@ ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { ExecutionSystem::~ExecutionSystem() { unsigned int index; - for(index = 0; index < this->connections.size(); index++) { + for (index = 0; index < this->connections.size(); index++) { SocketConnection* connection = this->connections[index]; delete connection; } this->connections.clear(); - for(index = 0; index < this->nodes.size(); index++) { + for (index = 0; index < this->nodes.size(); index++) { Node* node = this->nodes[index]; delete node; } this->nodes.clear(); - for(index = 0; index < this->operations.size(); index++) { + for (index = 0; index < this->operations.size(); index++) { NodeOperation* operation = this->operations[index]; delete operation; } this->operations.clear(); - for(index = 0; index < this->groups.size(); index++) { + for (index = 0; index < this->groups.size(); index++) { ExecutionGroup* group = this->groups[index]; delete group; } @@ -101,7 +102,7 @@ ExecutionSystem::~ExecutionSystem() { void ExecutionSystem::execute() { unsigned int order = 0; - for( vector::iterator iter = this->operations.begin(); iter != operations.end(); ++iter ) { + for ( vector::iterator iter = this->operations.begin(); iter != operations.end(); ++iter ) { NodeBase* node = *iter; NodeOperation *operation = (NodeOperation*) node; if (operation->isReadBufferOperation()) { @@ -214,7 +215,7 @@ void ExecutionSystem::convertToOperations() { unsigned int index; // first determine data types of the nodes, this can be used by the node to convert to a different operation system this->determineActualSocketDataTypes((vector&)this->nodes); - for(index = 0; index < this->nodes.size(); index++) { + for (index = 0; index < this->nodes.size(); index++) { Node* node = (Node*)this->nodes[index]; node->convertToOperations(this, &this->context); } @@ -258,14 +259,14 @@ void ExecutionSystem::groupOperations() { NodeOperation * operation; unsigned int index; // surround complex operations with ReadBufferOperation and WriteBufferOperation - for(index = 0; index < this->operations.size(); index++) { + for (index = 0; index < this->operations.size(); index++) { operation = this->operations[index]; if (operation->isComplex()) { this->addReadWriteBufferOperations(operation); } } ExecutionSystemHelper::findOutputNodeOperations(&outputOperations, this->getOperations(), this->context.isRendering()); - for( vector::iterator iter = outputOperations.begin(); iter != outputOperations.end(); ++iter ) { + for ( vector::iterator iter = outputOperations.begin(); iter != outputOperations.end(); ++iter ) { operation = *iter; ExecutionGroup *group = new ExecutionGroup(); group->addOperation(this, operation); @@ -283,7 +284,7 @@ void ExecutionSystem::addSocketConnection(SocketConnection *connection) void ExecutionSystem::determineActualSocketDataTypes(vector &nodes) { unsigned int index; /* first do all input nodes */ - for(index = 0; index < nodes.size(); index++) { + for (index = 0; index < nodes.size(); index++) { NodeBase* node = nodes[index]; if (node->isInputNode()) { node->determineActualSocketDataTypes(); @@ -291,7 +292,7 @@ void ExecutionSystem::determineActualSocketDataTypes(vector &nodes) { } /* then all other nodes */ - for(index = 0; index < nodes.size(); index++) { + for (index = 0; index < nodes.size(); index++) { NodeBase* node = nodes[index]; if (!node->isInputNode()) { node->determineActualSocketDataTypes(); diff --git a/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp b/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp index d6b03b41105..4a739ba6a9d 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp @@ -107,13 +107,14 @@ void ExecutionSystemHelper::findOutputNodeOperations(vector* res static InputSocket* find_input(NodeRange &node_range, bNode *bnode, bNodeSocket* bsocket) { if (bnode != NULL) { - for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { Node* node = *it; if (node->getbNode() == bnode) return node->findInputSocketBybNodeSocket(bsocket); } - } else { - for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + } + else { + for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { Node* node = *it; if (node->isProxyNode()) { InputSocket *proxySocket = node->getInputSocket(0); @@ -126,13 +127,14 @@ static InputSocket* find_input(NodeRange &node_range, bNode *bnode, bNodeSocket* } static OutputSocket* find_output(NodeRange &node_range, bNode *bnode, bNodeSocket* bsocket) { if (bnode != NULL) { - for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { Node* node = *it; if (node->getbNode() == bnode) return node->findOutputSocketBybNodeSocket(bsocket); } - } else { - for(NodeIterator it=node_range.first; it!=node_range.second; ++it) { + } + else { + for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { Node* node = *it; if (node->isProxyNode()) { OutputSocket *proxySocket = node->getOutputSocket(0); @@ -146,7 +148,7 @@ static OutputSocket* find_output(NodeRange &node_range, bNode *bnode, bNodeSocke SocketConnection* ExecutionSystemHelper::addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink) { /// @note: cyclic lines will be ignored. This has been copied from node.c if (bNodeLink->tonode != 0 && bNodeLink->fromnode != 0) { - if(!(bNodeLink->fromnode->level >= bNodeLink->tonode->level && bNodeLink->tonode->level!=0xFFF)) { // only add non cyclic lines! so execution will procede + if (!(bNodeLink->fromnode->level >= bNodeLink->tonode->level && bNodeLink->tonode->level!=0xFFF)) { // only add non cyclic lines! so execution will procede return NULL; } } @@ -221,15 +223,20 @@ void ExecutionSystemHelper::debugDump(ExecutionSystem* system) { } if (operation->isViewerOperation()) { printf("Viewer"); - } else if (operation->isOutputOperation(system->getContext().isRendering())) { + } + else if (operation->isOutputOperation(system->getContext().isRendering())) { printf("Output"); - } else if (operation->isSetOperation()) { + } + else if (operation->isSetOperation()) { printf("Set"); - } else if (operation->isReadBufferOperation()) { + } + else if (operation->isReadBufferOperation()) { printf("ReadBuffer"); - } else if (operation->isWriteBufferOperation()) { + } + else if (operation->isWriteBufferOperation()) { printf("WriteBuffer"); - } else { + } + else { printf("O_%p", operation); } tot2 = operation->getNumberOfOutputSockets(); @@ -287,7 +294,8 @@ void ExecutionSystemHelper::debugDump(ExecutionSystem* system) { printf("\t\"O_%p\":\"OUT_%p\" -> \"O_%p\":\"IN_%p\"", connection->getFromNode(), connection->getFromSocket(), connection->getToNode(), connection->getToSocket()); if (!connection->isValid()) { printf(" [color=red]"); - } else { + } + else { switch (connection->getFromSocket()->getActualDataType()) { case COM_DT_VALUE: printf(" [color=grey]"); diff --git a/source/blender/compositor/intern/COM_InputSocket.cpp b/source/blender/compositor/intern/COM_InputSocket.cpp index 9596d5b73b0..8428544cbc2 100644 --- a/source/blender/compositor/intern/COM_InputSocket.cpp +++ b/source/blender/compositor/intern/COM_InputSocket.cpp @@ -48,9 +48,10 @@ void InputSocket::setConnection(SocketConnection *connection) { SocketConnection* InputSocket::getConnection() {return this->connection;} void InputSocket::determineResolution(unsigned int resolution[],unsigned int preferredResolution[]) { - if (this->isConnected()){ + if (this->isConnected()) { this->connection->getFromSocket()->determineResolution(resolution, preferredResolution); - } else { + } + else { return; } } @@ -67,19 +68,24 @@ DataType InputSocket::convertToSupportedDataType(DataType datatype) { if (datatype == COM_DT_VALUE) { if (candoColor) { return COM_DT_COLOR; - } else if (candoVector) { + } + else if (candoVector) { return COM_DT_VECTOR; } - } else if (datatype == COM_DT_VECTOR) { + } + else if (datatype == COM_DT_VECTOR) { if (candoColor) { return COM_DT_COLOR; - } else if (candoValue) { + } + else if (candoValue) { return COM_DT_VALUE; } - } else if (datatype == COM_DT_COLOR) { + } + else if (datatype == COM_DT_COLOR) { if (candoVector) { return COM_DT_VECTOR; - } else if (candoValue) { + } + else if (candoValue) { return COM_DT_VALUE; } } @@ -115,7 +121,8 @@ void InputSocket::relinkConnections(InputSocket *relinkToSocket) { void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem* graph) { if (!duplicate) { this->relinkConnections(relinkToSocket, autoconnect, editorNodeInputSocketIndex, graph); - } else { + } + else { if (!this->isConnected() && autoconnect) { Node* node = (Node*)this->getNode(); switch (this->getActualDataType()) { @@ -170,7 +177,8 @@ void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnec const ChannelInfo* InputSocket::getChannelInfo(const int channelnumber) { if (this->isConnected() && this->connection->getFromSocket()) { return this->connection->getFromSocket()->getChannelInfo(channelnumber); - } else { + } + else { return NULL; } } @@ -191,7 +199,8 @@ SocketReader* InputSocket::getReader() { NodeOperation* InputSocket::getOperation() const { if (isConnected()) { return (NodeOperation*)this->connection->getFromSocket()->getNode(); - } else { + } + else { return NULL; } } diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cpp b/source/blender/compositor/intern/COM_MemoryBuffer.cpp index 53357b8ec50..bfa20656277 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.cpp +++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp @@ -247,7 +247,7 @@ static void imp2radangle(float A, float B, float C, float F, float* a, float* b, } } -float clipuv(float x, float limit){ +float clipuv(float x, float limit) { x = (x < 0) ? 0 : ((x >= limit) ? (limit - 1) : x); return x; } diff --git a/source/blender/compositor/intern/COM_MemoryManager.cpp b/source/blender/compositor/intern/COM_MemoryManager.cpp index fa587e8c7d6..661afb20d53 100644 --- a/source/blender/compositor/intern/COM_MemoryManager.cpp +++ b/source/blender/compositor/intern/COM_MemoryManager.cpp @@ -46,7 +46,7 @@ void MemoryManager::addMemoryProxy(MemoryProxy *memoryProxy) { memoryProxy->setState(state); } } -MemoryBuffer* MemoryManager::getMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber){ +MemoryBuffer* MemoryManager::getMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber) { MemoryManagerState * state = MemoryManager::getState(id); if (!state) { return NULL; diff --git a/source/blender/compositor/intern/COM_MemoryManagerState.cpp b/source/blender/compositor/intern/COM_MemoryManagerState.cpp index 56946c3f0f2..620092b2825 100644 --- a/source/blender/compositor/intern/COM_MemoryManagerState.cpp +++ b/source/blender/compositor/intern/COM_MemoryManagerState.cpp @@ -36,7 +36,7 @@ MemoryProxy * MemoryManagerState::getMemoryProxy() { MemoryManagerState::~MemoryManagerState() { this->memoryProxy = NULL; unsigned int index; - for (index = 0 ; index < this->currentSize; index ++){ + for (index = 0 ; index < this->currentSize; index ++) { MemoryBuffer* buffer = this->chunkBuffers[index]; if (buffer) { delete buffer; @@ -69,7 +69,8 @@ void MemoryManagerState::addMemoryBuffer(MemoryBuffer *buffer) { if (this->chunkBuffers[chunkNumber] == NULL) { this->chunkBuffers[chunkNumber] = buffer; - } else { + } + else { throw "ALREADY ALLOCATED!"; } BLI_mutex_unlock(&this->mutex); @@ -77,7 +78,7 @@ void MemoryManagerState::addMemoryBuffer(MemoryBuffer *buffer) { MemoryBuffer* MemoryManagerState::getMemoryBuffer(unsigned int chunkNumber) { MemoryBuffer* result = NULL; - if (chunkNumber< this->currentSize){ + if (chunkNumber< this->currentSize) { result = this->chunkBuffers[chunkNumber]; if (result) { return result; @@ -85,7 +86,7 @@ MemoryBuffer* MemoryManagerState::getMemoryBuffer(unsigned int chunkNumber) { } BLI_mutex_lock(&this->mutex); - if (chunkNumber< this->currentSize){ + if (chunkNumber< this->currentSize) { result = this->chunkBuffers[chunkNumber]; } diff --git a/source/blender/compositor/intern/COM_Node.cpp b/source/blender/compositor/intern/COM_Node.cpp index 2587eaa5195..4e127c61d4e 100644 --- a/source/blender/compositor/intern/COM_Node.cpp +++ b/source/blender/compositor/intern/COM_Node.cpp @@ -52,7 +52,7 @@ Node::Node(bNode* editorNode, bool create_sockets) { input = (bNodeSocket*)input->next; } bNodeSocket *output = (bNodeSocket*)editorNode->outputs.first; - while(output != NULL) { + while (output != NULL) { DataType dt = COM_DT_VALUE; if (output->type == SOCK_RGBA) dt = COM_DT_COLOR; if (output->type == SOCK_VECTOR) dt = COM_DT_VECTOR; diff --git a/source/blender/compositor/intern/COM_NodeBase.cpp b/source/blender/compositor/intern/COM_NodeBase.cpp index 6e6be889572..b6990ec0d79 100644 --- a/source/blender/compositor/intern/COM_NodeBase.cpp +++ b/source/blender/compositor/intern/COM_NodeBase.cpp @@ -33,7 +33,7 @@ NodeBase::NodeBase() { } -NodeBase::~NodeBase(){ +NodeBase::~NodeBase() { while (!this->outputsockets.empty()) { delete (this->outputsockets.back()); this->outputsockets.pop_back(); @@ -101,7 +101,8 @@ DataType NodeBase::determineActualDataType(OutputSocket *outputsocket) { const int inputIndex = outputsocket->getInputSocketDataTypeDeterminatorIndex(); if (inputIndex != -1) { return this->getInputSocket(inputIndex)->getActualDataType(); - } else { + } + else { return outputsocket->getDataType(); } } diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp index b02bcb6676e..71aaceb1b48 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cpp +++ b/source/blender/compositor/intern/COM_NodeOperation.cpp @@ -95,7 +95,8 @@ bool NodeOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOpe if (this->isInputNode()) { BLI_init_rcti(output, input->xmin, input->xmax, input->ymin, input->ymax); return false; - } else { + } + else { unsigned int index; vector &inputsockets = this->getInputSockets(); diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.cpp b/source/blender/compositor/intern/COM_OpenCLDevice.cpp index acf3bf3789d..b986865ecf3 100644 --- a/source/blender/compositor/intern/COM_OpenCLDevice.cpp +++ b/source/blender/compositor/intern/COM_OpenCLDevice.cpp @@ -24,21 +24,21 @@ #include "COM_WorkScheduler.h" -OpenCLDevice::OpenCLDevice(cl_context context, cl_device_id device, cl_program program){ +OpenCLDevice::OpenCLDevice(cl_context context, cl_device_id device, cl_program program) { this->device = device; this->context = context; this->program = program; this->queue = NULL; } -bool OpenCLDevice::initialize(){ +bool OpenCLDevice::initialize() { cl_int error; queue = clCreateCommandQueue(context, device, 0, &error); return false; } -void OpenCLDevice::deinitialize(){ - if(queue){ +void OpenCLDevice::deinitialize() { + if (queue) { clReleaseCommandQueue(queue); } } diff --git a/source/blender/compositor/intern/COM_OutputSocket.cpp b/source/blender/compositor/intern/COM_OutputSocket.cpp index a262ad5f6ea..5380a7ec492 100644 --- a/source/blender/compositor/intern/COM_OutputSocket.cpp +++ b/source/blender/compositor/intern/COM_OutputSocket.cpp @@ -98,7 +98,8 @@ void OutputSocket::relinkConnections(OutputSocket *relinkToSocket, bool single) relinkToSocket->addConnection(connection); // relinkToSocket->setActualDataType(this->getActualDataType()); this->connections.erase(this->connections.begin()); - } else { + } + else { unsigned int index; for (index = 0 ; index < this->connections.size();index ++) { SocketConnection *connection = this->connections[index]; diff --git a/source/blender/compositor/intern/COM_SocketConnection.cpp b/source/blender/compositor/intern/COM_SocketConnection.cpp index 6c6c673501a..e3e52005add 100644 --- a/source/blender/compositor/intern/COM_SocketConnection.cpp +++ b/source/blender/compositor/intern/COM_SocketConnection.cpp @@ -29,7 +29,7 @@ SocketConnection::SocketConnection() { this->setIgnoreResizeCheck(false); } -void SocketConnection::setFromSocket(OutputSocket* fromsocket){ +void SocketConnection::setFromSocket(OutputSocket* fromsocket) { if (fromsocket == NULL) { throw "ERROR"; } @@ -49,14 +49,16 @@ InputSocket* SocketConnection::getToSocket() const {return this->toSocket;} NodeBase* SocketConnection::getFromNode() const { if (this->getFromSocket() == NULL) { return NULL; - } else { + } + else { return this->getFromSocket()->getNode(); } } NodeBase* SocketConnection::getToNode() const { if (this->getToSocket() == NULL) { return NULL; - } else { + } + else { return this->getToSocket()->getNode(); } } diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index e7c1e00dd96..5130525853b 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -114,9 +114,10 @@ void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) { delete package; #elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE #ifdef COM_OPENCL_ENABLED - if (group->isOpenCL() && openclActive){ + if (group->isOpenCL() && openclActive) { BLI_thread_queue_push(gpuqueue, package); - } else{ + } + else { BLI_thread_queue_push(cpuqueue, package); } #else @@ -145,7 +146,8 @@ void WorkScheduler::start(CompositorContext &context) { BLI_insert_thread(&gputhreads, device); } openclActive = true; - } else { + } + else { openclActive = false; } #endif @@ -159,7 +161,8 @@ void WorkScheduler::finish() { while (BLI_thread_queue_size(gpuqueue) + BLI_thread_queue_size(cpuqueue) > 0) { PIL_sleep_ms(10); } - } else { + } + else { while (BLI_thread_queue_size(cpuqueue) > 0) { PIL_sleep_ms(10); } @@ -286,14 +289,14 @@ void WorkScheduler::initialize() { void WorkScheduler::deinitialize() { #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE Device* device; - while(cpudevices.size()>0) { + while (cpudevices.size()>0) { device = cpudevices.back(); cpudevices.pop_back(); device->deinitialize(); delete device; } #ifdef COM_OPENCL_ENABLED - while(gpudevices.size()>0) { + while (gpudevices.size()>0) { device = gpudevices.back(); gpudevices.pop_back(); device->deinitialize(); diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp index 7cd26bc79b7..23acaee7b93 100644 --- a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp +++ b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp @@ -45,18 +45,22 @@ void AlphaOverNode::convertToOperations(ExecutionSystem *graph, CompositorContex mixOperation->setX(ntf->x); convertProg = mixOperation; - } else if (editorNode->custom1) { + } + else if (editorNode->custom1) { convertProg = new AlphaOverKeyOperation(); - } else { + } + else { convertProg = new AlphaOverPremultiplyOperation(); } convertProg->setUseValueAlphaMultiply(false); if (color1Socket->isConnected()) { convertProg->setResolutionInputSocketIndex(1); - } else if (color2Socket->isConnected()) { + } + else if (color2Socket->isConnected()) { convertProg->setResolutionInputSocketIndex(2); - } else { + } + else { convertProg->setResolutionInputSocketIndex(0); } valueSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_BlurNode.cpp b/source/blender/compositor/nodes/COM_BlurNode.cpp index 8c1923b3236..5e29650a5ca 100644 --- a/source/blender/compositor/nodes/COM_BlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BlurNode.cpp @@ -53,7 +53,8 @@ void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c this->getOutputSocket(0)->relinkConnections(operationfgb->getOutputSocket(0)); graph->addOperation(operationfgb); addPreviewOperation(graph, operationfgb->getOutputSocket(), 5); - }else if (!data->bokeh) { + } + else if (!data->bokeh) { GaussianXBlurOperation *operationx = new GaussianXBlurOperation(); operationx->setData(data); operationx->setQuality(quality); @@ -68,7 +69,8 @@ void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0)); addLink(graph, operationx->getInputSocket(1)->getConnection()->getFromSocket(), operationy->getInputSocket(1)); addPreviewOperation(graph, operationy->getOutputSocket(), 5); - } else { + } + else { GaussianBokehBlurOperation *operation = new GaussianBokehBlurOperation(); operation->setData(data); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp index c40bcab3ffb..68e9b067f07 100644 --- a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp @@ -50,7 +50,8 @@ void BokehBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContex graph->addOperation(operation); graph->addOperation(converter); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); - } else { + } + else { BokehBlurOperation *operation = new BokehBlurOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); diff --git a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp index bf3def05643..9ab6c6250db 100644 --- a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp @@ -39,7 +39,7 @@ void ChannelMatteNode::convertToOperations(ExecutionSystem *graph, CompositorCon bNode* node = this->getbNode(); /* colorspace */ - switch(node->custom1) { + switch (node->custom1) { case CMP_NODE_CHANNEL_MATTE_CS_RGB: break; case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp index 73d10d4b1ca..8d5e8a2788e 100644 --- a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp @@ -53,7 +53,8 @@ void ColorBalanceNode::convertToOperations(ExecutionSystem *graph, CompositorCon operationLGG->setLift(n->lift_lgg); operationLGG->setGammaInv(n->gamma_inv); operation = operationLGG; - } else { + } + else { ColorBalanceASCCDLOperation *operationCDL = new ColorBalanceASCCDLOperation(); operationCDL->setGain(n->gain); operationCDL->setLift(n->lift); diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp index 011a2cb12cc..5935167d88e 100644 --- a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp @@ -39,7 +39,8 @@ void ColorSpillNode::convertToOperations(ExecutionSystem *graph, CompositorConte if (editorsnode->custom2 == 0) { // Simple color spill operation = new ColorSpillOperation(); - } else { + } + else { // Average color spill operation = new ColorSpillAverageOperation(); } diff --git a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp index 8a1a34589a5..6bef0441e5e 100644 --- a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp +++ b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp @@ -43,11 +43,14 @@ void CombineRGBANode::convertToOperations(ExecutionSystem *graph, CompositorCont CombineChannelsOperation *operation = new CombineChannelsOperation(); if (inputRSocket->isConnected()) { operation->setResolutionInputSocketIndex(0); - } else if (inputGSocket->isConnected()) { + } + else if (inputGSocket->isConnected()) { operation->setResolutionInputSocketIndex(1); - } else if (inputBSocket->isConnected()) { + } + else if (inputBSocket->isConnected()) { operation->setResolutionInputSocketIndex(2); - } else { + } + else { operation->setResolutionInputSocketIndex(3); } inputRSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp index 4e20b3a5d3a..775fa1ad0fd 100644 --- a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp +++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp @@ -29,7 +29,7 @@ void ConvertAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorCon bNode* node = this->getbNode(); /* value hardcoded in rna_nodetree.c */ - if (node->custom1 == 1){ + if (node->custom1 == 1) { operation = new ConvertPremulToKeyOperation(); } else { diff --git a/source/blender/compositor/nodes/COM_CropNode.cpp b/source/blender/compositor/nodes/COM_CropNode.cpp index fdbb1529c60..9d48922d0d6 100644 --- a/source/blender/compositor/nodes/COM_CropNode.cpp +++ b/source/blender/compositor/nodes/COM_CropNode.cpp @@ -27,15 +27,16 @@ CropNode::CropNode(bNode *editorNode) : Node(editorNode) { } -void CropNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context){ +void CropNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { bNode* node = getbNode(); NodeTwoXYs *cropSettings = (NodeTwoXYs*)node->storage; bool relative = (bool)node->custom2; bool cropImage = (bool)node->custom1; CropBaseOperation *operation; - if (cropImage){ + if (cropImage) { operation = new CropImageOperation(); - } else { + } + else { operation = new CropOperation(); } operation->setCropSettings(cropSettings); diff --git a/source/blender/compositor/nodes/COM_DefocusNode.cpp b/source/blender/compositor/nodes/COM_DefocusNode.cpp index 7f5c9896bbe..40adc3793b0 100644 --- a/source/blender/compositor/nodes/COM_DefocusNode.cpp +++ b/source/blender/compositor/nodes/COM_DefocusNode.cpp @@ -60,7 +60,8 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext graph->addOperation(maxRadius); graph->addOperation(minimize); radiusOperation = minimize; - } else { + } + else { ConvertDepthToRadiusOperation *converter = new ConvertDepthToRadiusOperation(); converter->setCameraObject(camob); converter->setfStop(data->fstop); @@ -101,7 +102,8 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext this->getOutputSocket()->relinkConnections(inverse->getOutputSocket()); graph->addOperation(correct); graph->addOperation(inverse); - } else { + } + else { this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, true, graph); this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); } diff --git a/source/blender/compositor/nodes/COM_FilterNode.cpp b/source/blender/compositor/nodes/COM_FilterNode.cpp index ce78e451f30..f10d0391317 100644 --- a/source/blender/compositor/nodes/COM_FilterNode.cpp +++ b/source/blender/compositor/nodes/COM_FilterNode.cpp @@ -37,7 +37,7 @@ void FilterNode::convertToOperations(ExecutionSystem *graph, CompositorContext * OutputSocket *outputSocket = this->getOutputSocket(0); ConvolutionFilterOperation *operation = NULL; - switch(this->getbNode()->custom1) { + switch (this->getbNode()->custom1) { case CMP_FILT_SOFT: operation = new ConvolutionFilterOperation(); operation->set3x3Filter(1/16.0f, 2/16.0f, 1/16.0f, 2/16.0f, 4/16.0f, 2/16.0f, 1/16.0f, 2/16.0f, 1/16.0f); diff --git a/source/blender/compositor/nodes/COM_GroupNode.cpp b/source/blender/compositor/nodes/COM_GroupNode.cpp index dcb8691524a..14718909de9 100644 --- a/source/blender/compositor/nodes/COM_GroupNode.cpp +++ b/source/blender/compositor/nodes/COM_GroupNode.cpp @@ -46,7 +46,8 @@ void GroupNode::ungroup(ExecutionSystem &system) { SocketProxyNode * proxy = new SocketProxyNode(this->getbNode(), editorInput, editorInput->groupsock); inputSocket->relinkConnections(proxy->getInputSocket(0), true, index, &system); ExecutionSystemHelper::addNode(system.getNodes(), proxy); - } else { + } + else { OutputSocketProxyNode * proxy = new OutputSocketProxyNode(this->getbNode(), editorInput, editorInput->groupsock); inputSocket->relinkConnections(proxy->getInputSocket(0), true, index, &system); ExecutionSystemHelper::addNode(system.getNodes(), proxy); diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.cpp b/source/blender/compositor/nodes/COM_IDMaskNode.cpp index 440468afd46..d66657e489c 100644 --- a/source/blender/compositor/nodes/COM_IDMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_IDMaskNode.cpp @@ -37,7 +37,8 @@ void IDMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); if (bnode->custom2==0 || context->getScene()->r.scemode & R_FULL_SAMPLE) { this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); - } else { + } + else { AntiAliasOperation * antiAliasOperation = new AntiAliasOperation(); addLink(graph, operation->getOutputSocket(), antiAliasOperation->getInputSocket(0)); this->getOutputSocket(0)->relinkConnections(antiAliasOperation->getOutputSocket(0)); diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp index 20e6069b60a..ea2e99ed686 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.cpp +++ b/source/blender/compositor/nodes/COM_ImageNode.cpp @@ -65,9 +65,9 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * int numberOfOutputs = this->getNumberOfOutputSockets(); /* force a load, we assume iuser index will be set OK anyway */ - if(image && image->type==IMA_TYPE_MULTILAYER) { + if (image && image->type==IMA_TYPE_MULTILAYER) { BKE_image_get_ibuf(image, imageuser); - if(image->rr) { + if (image->rr) { OutputSocket * socket; int index; for (index = 0 ; index < numberOfOutputs ; index ++) { @@ -110,7 +110,8 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * } } } - } else { + } + else { if (numberOfOutputs > 0) { ImageOperation *operation = new ImageOperation(); if (outputImage->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp index edaa0a9009e..cee2b133eee 100644 --- a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp +++ b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp @@ -42,7 +42,8 @@ void LensDistortionNode::convertToOperations(ExecutionSystem *graph, CompositorC operation->setData(data); graph->addOperation(operation); - } else { + } + else { ScreenLensDistortionOperation *operation = new ScreenLensDistortionOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_MathNode.cpp b/source/blender/compositor/nodes/COM_MathNode.cpp index 075b90c0f2b..e90767703a5 100644 --- a/source/blender/compositor/nodes/COM_MathNode.cpp +++ b/source/blender/compositor/nodes/COM_MathNode.cpp @@ -27,7 +27,7 @@ void MathNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { MathBaseOperation* operation=NULL; - switch(this->getbNode()->custom1) + switch (this->getbNode()->custom1) { case 0: /* Add */ operation = new MathAddOperation(); diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.cpp b/source/blender/compositor/nodes/COM_MovieClipNode.cpp index 7d11a06a24d..475a538670d 100644 --- a/source/blender/compositor/nodes/COM_MovieClipNode.cpp +++ b/source/blender/compositor/nodes/COM_MovieClipNode.cpp @@ -67,7 +67,8 @@ void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContex if (ibuf) { converter->setPredivided(ibuf->flags & IB_cm_predivide); } - } else { + } + else { addPreviewOperation(graph, operation->getOutputSocket(), 9); if (outputMovieClip->isConnected()) { outputMovieClip->relinkConnections(operation->getOutputSocket()); @@ -86,7 +87,7 @@ void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContex angle = 0.0f; if (ibuf) { - if(stab->flag&TRACKING_2D_STABILIZATION) { + if (stab->flag&TRACKING_2D_STABILIZATION) { BKE_tracking_stabilization_data(&movieClip->tracking, context->getFramenumber(), ibuf->x, ibuf->y, loc, &scale, &angle); } } diff --git a/source/blender/compositor/nodes/COM_RenderLayersNode.cpp b/source/blender/compositor/nodes/COM_RenderLayersNode.cpp index e22c2fd5910..e4ce63e9193 100644 --- a/source/blender/compositor/nodes/COM_RenderLayersNode.cpp +++ b/source/blender/compositor/nodes/COM_RenderLayersNode.cpp @@ -63,13 +63,15 @@ void RenderLayersNode::testSocketConnection(ExecutionSystem* system, int outputS if (outputSocketNumber == 0) { // only do for image socket if connected addPreviewOperation(system, operation->getOutputSocket(), 9); } - } else { + } + else { if (outputSocketNumber == 0) { system->addOperation(operation); operation->setScene(scene); operation->setLayerId(layerId); addPreviewOperation(system, operation->getOutputSocket(), 9); - } else { + } + else { delete operation; } } diff --git a/source/blender/compositor/nodes/COM_SwitchNode.cpp b/source/blender/compositor/nodes/COM_SwitchNode.cpp index 1b15ae0e890..83e0be7d3c0 100644 --- a/source/blender/compositor/nodes/COM_SwitchNode.cpp +++ b/source/blender/compositor/nodes/COM_SwitchNode.cpp @@ -34,7 +34,8 @@ void SwitchNode::convertToOperations(ExecutionSystem *graph, CompositorContext * if (!switchFrame) { this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - } else { + } + else { this->getInputSocket(1)->relinkConnections(operation->getInputSocket(0), true, 1, graph); } this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_TimeNode.cpp b/source/blender/compositor/nodes/COM_TimeNode.cpp index 3e2c750d3aa..481840cbd58 100644 --- a/source/blender/compositor/nodes/COM_TimeNode.cpp +++ b/source/blender/compositor/nodes/COM_TimeNode.cpp @@ -43,9 +43,11 @@ void TimeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c if (framenumber < node->custom1) { fac = 0.0f; - } else if (framenumber > node->custom2) { + } + else if (framenumber > node->custom2) { fac = 1.0f; - } else if(node->custom1 < node->custom2) { + } + else if (node->custom1 < node->custom2) { fac= (context->getFramenumber() - node->custom1)/(float)(node->custom2-node->custom1); } diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp index b5b15b2ba70..42d019c4e93 100644 --- a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp @@ -52,7 +52,8 @@ void ViewLevelsNode::convertToOperations(ExecutionSystem *graph, CompositorConte CalculateStandardDeviationOperation * operation = new CalculateStandardDeviationOperation(); if (firstOperationConnected) { addLink(graph, inputSocket, operation->getInputSocket(0)); - }else{ + } + else { input->relinkConnections(operation->getInputSocket(0), true, 0, graph); } operation->setSetting(this->getbNode()->custom1); diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.cpp b/source/blender/compositor/nodes/COM_ZCombineNode.cpp index be7b6ebdc45..8f512769d63 100644 --- a/source/blender/compositor/nodes/COM_ZCombineNode.cpp +++ b/source/blender/compositor/nodes/COM_ZCombineNode.cpp @@ -35,7 +35,8 @@ void ZCombineNode::convertToOperations(ExecutionSystem* system, CompositorContex ZCombineOperation * operation = NULL; if (this->getbNode()->custom1) { operation = new ZCombineAlphaOperation(); - } else { + } + else { operation = new ZCombineOperation(); } @@ -52,7 +53,8 @@ void ZCombineNode::convertToOperations(ExecutionSystem* system, CompositorContex this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); system->addOperation(zoperation); } - } else { + } + else { if (this->getOutputSocket(1)->isConnected()) { MathMinimumOperation * zoperation = new MathMinimumOperation(); this->getInputSocket(1)->relinkConnections(zoperation->getInputSocket(0), true, 1, system); diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp index 2dba9572ee8..3e80de78223 100644 --- a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp @@ -34,13 +34,13 @@ void AlphaOverKeyOperation::executePixel(float* outputValue, float x, float y, P inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); - if(inputOverColor[3]<=0.0f) { + if (inputOverColor[3]<=0.0f) { outputValue[0] = inputColor1[0]; outputValue[1] = inputColor1[1]; outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } - else if(value[0]==1.0f && inputOverColor[3]>=1.0f) { + else if (value[0]==1.0f && inputOverColor[3]>=1.0f) { outputValue[0] = inputOverColor[0]; outputValue[1] = inputOverColor[1]; outputValue[2] = inputOverColor[2]; diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp index 9deb00ae71a..48762e6370e 100644 --- a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp @@ -35,13 +35,13 @@ void AlphaOverMixedOperation::executePixel(float* outputValue, float x, float y, inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); - if(inputOverColor[3]<=0.0f) { + if (inputOverColor[3]<=0.0f) { outputValue[0] = inputColor1[0]; outputValue[1] = inputColor1[1]; outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } - else if(value[0]==1.0f && inputOverColor[3]>=1.0f) { + else if (value[0]==1.0f && inputOverColor[3]>=1.0f) { outputValue[0] = inputOverColor[0]; outputValue[1] = inputOverColor[1]; outputValue[2] = inputOverColor[2]; diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp index 635a6308601..c46f3a04113 100644 --- a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp @@ -35,13 +35,13 @@ void AlphaOverPremultiplyOperation::executePixel(float* outputValue, float x, fl inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); /* Zero alpha values should still permit an add of RGB data */ - if(inputOverColor[3]<0.0f) { + if (inputOverColor[3]<0.0f) { outputValue[0] = inputColor1[0]; outputValue[1] = inputColor1[1]; outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } - else if(value[0]==1.0f && inputOverColor[3]>=1.0f) { + else if (value[0]==1.0f && inputOverColor[3]>=1.0f) { outputValue[0] = inputOverColor[0]; outputValue[1] = inputOverColor[1]; outputValue[2] = inputOverColor[2]; diff --git a/source/blender/compositor/operations/COM_AntiAliasOperation.cpp b/source/blender/compositor/operations/COM_AntiAliasOperation.cpp index 729d04c182e..3d8cd13229f 100644 --- a/source/blender/compositor/operations/COM_AntiAliasOperation.cpp +++ b/source/blender/compositor/operations/COM_AntiAliasOperation.cpp @@ -43,7 +43,8 @@ void AntiAliasOperation::initExecution() { void AntiAliasOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { if (y < 0 || y >= this->height || x < 0 || x >= this->width) { color[0] = 0.0f; - } else { + } + else { int offset = y*this->width + x; color[0] = buffer[offset]/255.0f; } @@ -62,7 +63,8 @@ bool AntiAliasOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe rcti imageInput; if (this->buffer) { return false; - } else { + } + else { NodeOperation* operation = getInputOperation(0); imageInput.xmax = operation->getWidth(); imageInput.xmin = 0; diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp b/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp index 5743b388705..8d507a754d5 100644 --- a/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp @@ -89,7 +89,8 @@ void BilateralBlurOperation::executePixel(float* color, int x, int y, MemoryBuff color[1] = blurColor[1]/blurDivider; color[2] = blurColor[2]/blurDivider; color[3] = blurColor[3]/blurDivider; - } else { + } + else { color[0] = 0.0f; color[1] = 0.0f; color[2] = 0.0f; diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp index b18c0762c1a..60954503949 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp @@ -42,7 +42,7 @@ void BlurBaseOperation::initExecution() { this->inputSize = this->getInputSocketReader(1); this->data->image_in_width= this->getWidth(); this->data->image_in_height= this->getHeight(); - if(this->data->relative) { + if (this->data->relative) { switch (this->data->aspect) { case CMP_NODE_BLUR_ASPECT_NONE: this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_width); @@ -80,7 +80,7 @@ float* BlurBaseOperation::make_gausstab(int rad) } sum= 1.0f/sum; - for(i=0; idata = NULL; } -void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers){ +void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers) { float result[4]; this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, memoryBuffers); this->size = result[0]; diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.cpp b/source/blender/compositor/operations/COM_BokehBlurOperation.cpp index 31345dbaeff..1d5f4852340 100644 --- a/source/blender/compositor/operations/COM_BokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.cpp @@ -57,7 +57,8 @@ void BokehBlurOperation::initExecution() { float dimension; if (widthbokehMidX = width/2.0f; @@ -119,7 +120,8 @@ void BokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer * color[1] = tempColor[1]*(1.0/overallmultiplyerg); color[2] = tempColor[2]*(1.0/overallmultiplyerb); color[3] = 1.0f; - } else { + } + else { inputProgram->read(color, x, y, COM_PS_NEAREST, inputBuffers); } } diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cpp b/source/blender/compositor/operations/COM_BokehImageOperation.cpp index 3286217e71d..22b73417778 100644 --- a/source/blender/compositor/operations/COM_BokehImageOperation.cpp +++ b/source/blender/compositor/operations/COM_BokehImageOperation.cpp @@ -70,9 +70,11 @@ float BokehImageOperation::isInsideBokeh(float distance, float x, float y) { if (distanceRoundingToCenter>=distanceToCenter && catadioptricDistanceToCenter<=distanceToCenter) { if (distanceRoundingToCenter-distanceToCenter<1.0) { insideBokeh = (distanceRoundingToCenter-distanceToCenter); - } else if (this->data->catadioptric != 0.0 && distanceToCenter-catadioptricDistanceToCenter<1.0) { + } + else if (this->data->catadioptric != 0.0 && distanceToCenter-catadioptricDistanceToCenter<1.0) { insideBokeh = (distanceToCenter-catadioptricDistanceToCenter); - } else { + } + else { insideBokeh = 1.0; } } @@ -89,7 +91,8 @@ void BokehImageOperation::executePixel(float* color, float x, float y, PixelSamp color[0] = insideBokehMax; color[1] = insideBokehMed; color[2] = insideBokehMin; - } else { + } + else { color[0] = insideBokehMin; color[1] = insideBokehMed; color[2] = insideBokehMax; diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.cpp b/source/blender/compositor/operations/COM_BoxMaskOperation.cpp index 44157051089..5b769fef3ef 100644 --- a/source/blender/compositor/operations/COM_BoxMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.cpp @@ -68,7 +68,8 @@ void BoxMaskOperation::executePixel(float* color, float x, float y, PixelSampler case CMP_NODE_MASKTYPE_ADD: if (inside) { color[0] = max(inputMask[0],inputValue[0]); - } else { + } + else { color[0] = inputMask[0]; } break; @@ -76,14 +77,16 @@ void BoxMaskOperation::executePixel(float* color, float x, float y, PixelSampler if (inside) { color[0] = inputMask[0]-inputValue[0]; CLAMP(color[0], 0, 1); - } else { + } + else { color[0] = inputMask[0]; } break; case CMP_NODE_MASKTYPE_MULTIPLY: if (inside) { color[0] = inputMask[0]*inputValue[0]; - } else { + } + else { color[0] = 0; } break; @@ -91,10 +94,12 @@ void BoxMaskOperation::executePixel(float* color, float x, float y, PixelSampler if (inside) { if (inputMask[0]>0.0f) { color[0] = 0; - } else { + } + else { color[0] = inputValue[0]; } - } else { + } + else { color[0] = inputMask[0]; } break; diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.cpp b/source/blender/compositor/operations/COM_BrightnessOperation.cpp index bb481f71cc1..a62470e5b1d 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.cpp +++ b/source/blender/compositor/operations/COM_BrightnessOperation.cpp @@ -53,13 +53,11 @@ void BrightnessOperation::executePixel(float* color, float x, float y, PixelSamp * (http://visca.com/ffactory/archives/5-99/msg00021.html) * Extracted of OpenCV demhist.c */ - if( contrast > 0 ) - { + if (contrast > 0) { a = 1.0f / a; b = a * (brightness - delta); } - else - { + else { delta *= -1; b = a * (brightness + delta); } diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp index 062e7fc69fe..7a1fc5e511c 100644 --- a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp @@ -86,7 +86,7 @@ void CalculateMeanOperation::calculateMean(MemoryBuffer * tile) { if (buffer[offset+3] > 0) { pixels ++; - switch(this->setting) + switch (this->setting) { case 1: { diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp index 4cd990e417e..9d9dc46eb6c 100644 --- a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp @@ -48,7 +48,7 @@ void* CalculateStandardDeviationOperation::initializeTileData(rcti *rect, Memory if (buffer[offset+3] > 0) { pixels ++; - switch(this->setting) + switch (this->setting) { case 1: { diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp b/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp index fd2bd3991ec..da59524586c 100644 --- a/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp @@ -42,7 +42,7 @@ void ChangeHSVOperation::executePixel(float* outputValue, float x, float y, Pixe inputOperation->read(inputColor1, x, y, sampler, inputBuffers); outputValue[0] = inputColor1[0] + (this->hue - 0.5f); - if (outputValue[0]>1.0f) outputValue[0]-=1.0; else if(outputValue[0]<0.0) outputValue[0]+= 1.0; + if (outputValue[0]>1.0f) outputValue[0]-=1.0; else if (outputValue[0]<0.0) outputValue[0]+= 1.0; outputValue[1] = inputColor1[1] * this->saturation; outputValue[2] = inputColor1[2] * this->value; outputValue[3] = inputColor1[3]; diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp b/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp index b595aca3c46..10ff140f8be 100644 --- a/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp @@ -97,10 +97,10 @@ void ChannelMatteOperation::executePixel(float* outputValue, float x, float y, P alpha = 1.f - alpha; /* test range*/ - if(alpha > limit_max) { + if (alpha > limit_max) { alpha = inColor[3]; /*whatever it was prior */ } - else if(alpha < limit_min){ + else if (alpha < limit_min) { alpha = 0.f; } else {/*blend */ diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp index 8e793f08a3b..9556b673c0f 100644 --- a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp @@ -72,13 +72,13 @@ void ChromaMatteOperation::executePixel(float* outputValue, float x, float y, Pi /* if kfg is <0 then the pixel is outside of the key color */ kfg= x_angle-(fabsf(z_angle)/tanf(acceptance/2.f)); - if(kfg>0.f) { /* found a pixel that is within key color */ + if (kfg>0.f) { /* found a pixel that is within key color */ alpha=(1.f-kfg)*(gain); beta=atan2(z_angle,x_angle); /* if beta is within the cutoff angle */ - if(fabsf(beta) < (cutoff/2.f)) { + if (fabsf(beta) < (cutoff/2.f)) { alpha=0.f; } diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp index fef045481f7..fb617549b1c 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp @@ -63,15 +63,19 @@ void ColorCorrectionOperation::executePixel(float* output, float x, float y, Pix #define MARGIN_DIV (0.5/MARGIN) if ( level < this->data->startmidtones-MARGIN) { levelShadows = 1.0f; - } else if (level < this->data->startmidtones+MARGIN) { + } + else if (level < this->data->startmidtones+MARGIN) { levelMidtones = ((level-this->data->startmidtones)*MARGIN_DIV)+0.5; levelShadows = 1.0- levelMidtones; - } else if (level < this->data->endmidtones-MARGIN) { + } + else if (level < this->data->endmidtones-MARGIN) { levelMidtones = 1.0f; - } else if (level < this->data->endmidtones+MARGIN) { + } + else if (level < this->data->endmidtones+MARGIN) { levelHighlights = ((level-this->data->endmidtones)*MARGIN_DIV)+0.5; levelMidtones = 1.0- levelHighlights; - } else { + } + else { levelHighlights = 1.0f; } #undef MARGIN @@ -111,17 +115,20 @@ void ColorCorrectionOperation::executePixel(float* output, float x, float y, Pix if (this->redChannelEnabled) { output[0] = r; - } else { + } + else { output[0] = inputImageColor[0]; } if (this->greenChannelEnabled) { output[1] = g; - } else { + } + else { output[1] = inputImageColor[1]; } if (this->blueChannelEnabled) { output[2] = b; - } else { + } + else { output[2] = inputImageColor[2]; } output[3] = inputImageColor[3]; diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.cpp b/source/blender/compositor/operations/COM_ColorCurveOperation.cpp index cb16b99f06b..375d7269124 100644 --- a/source/blender/compositor/operations/COM_ColorCurveOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.cpp @@ -69,9 +69,9 @@ void ColorCurveOperation::executePixel(float* color, float x, float y, PixelSamp this->inputFacProgram->read(fac, x, y, sampler, inputBuffers); this->inputImageProgram->read(image, x, y, sampler, inputBuffers); - if(fac[0]>=1.0) + if (fac[0]>=1.0) curvemapping_evaluate_premulRGBF(this->curveMapping, color, image); - else if(*fac<=0.0) { + else if (*fac<=0.0) { color[0]= image[0]; color[1]= image[1]; color[2]= image[2]; diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.cpp b/source/blender/compositor/operations/COM_ColorMatteOperation.cpp index a80788ddd33..6e9c1b0d48a 100644 --- a/source/blender/compositor/operations/COM_ColorMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.cpp @@ -59,7 +59,7 @@ void ColorMatteOperation::executePixel(float* outputValue, float x, float y, Pix * COM_SetAlphaOperation and the Value output */ - if( + if ( /* do hue last because it needs to wrap, and does some more checks */ /* sat */ (fabsf(inColor[1]-inKey[1]) < sat) && diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.cpp b/source/blender/compositor/operations/COM_ColorSpillOperation.cpp index 9f054540332..56f45c0fdeb 100644 --- a/source/blender/compositor/operations/COM_ColorSpillOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.cpp @@ -48,7 +48,8 @@ void ColorSpillOperation::initExecution() { settings->uspillg = 0.0f; settings->uspillb = 0.0f; } - } else if (spillChannel == 1) { + } + else if (spillChannel == 1) { rmut = 1.0f; gmut = -1.0f; bmut = 1.0f; @@ -59,7 +60,8 @@ void ColorSpillOperation::initExecution() { settings->uspillg = 1.0f; settings->uspillb = 0.0f; } - } else { + } + else { rmut = 1.0f; gmut = 1.0f; bmut = -1.0f; @@ -87,7 +89,7 @@ void ColorSpillOperation::executePixel(float* outputValue, float x, float y, Pix this->inputImageReader->read(input, x, y, sampler, inputBuffers); float rfac = min(1.0f, fac[0]); map = calculateMapValue(rfac, input); - if(map>0) { + if (map>0) { outputValue[0]=input[0]+rmut*(settings->uspillr*map); outputValue[1]=input[1]+gmut*(settings->uspillg*map); outputValue[2]=input[2]+bmut*(settings->uspillb*map); diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp index 7590b4be299..6391fa2537d 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cpp +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -56,8 +56,8 @@ void CompositorOperation::initExecution() { const Scene * scene = this->scene; Render* re= RE_GetRender(scene->id.name); RenderResult *rr= RE_AcquireResultWrite(re); - if(rr) { - if(rr->rectf != NULL) { + if (rr) { + if (rr->rectf != NULL) { MEM_freeN(rr->rectf); } rr->rectf= outputBuffer; diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp index 345fc37b340..e262533b2f7 100644 --- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp @@ -37,7 +37,8 @@ float ConvertDepthToRadiusOperation::determineFocalDistance() { if (cameraObject == NULL || cameraObject->type != OB_CAMERA) { return 10.0f; - } else { + } + else { Camera *camera= (Camera*)this->cameraObject->data; cam_lens = camera->lens; if (camera->dof_ob) { diff --git a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp index 6f676b1c404..c800587ab0c 100644 --- a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp @@ -40,7 +40,7 @@ void ConvertPremulToKeyOperation::executePixel(float* outputValue, float x, floa this->inputColor->read(inputValue, x, y, sampler, inputBuffers); alpha = inputValue[3]; - if(fabsf(alpha) < 1e-5f) { + if (fabsf(alpha) < 1e-5f) { outputValue[0]= 0.f; outputValue[1]= 0.f; outputValue[2]= 0.f; diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp index 623376d532f..e1aa91e35da 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp @@ -33,7 +33,7 @@ void ConvertRGBToYCCOperation::initExecution() { } void ConvertRGBToYCCOperation::setMode(int mode) { - switch(mode) + switch (mode) { case 1: this->mode = BLI_YCC_ITU_BT709; diff --git a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp index 1d8ee944915..6f9c5244c29 100644 --- a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp @@ -33,7 +33,7 @@ void ConvertYCCToRGBOperation::initExecution() { } void ConvertYCCToRGBOperation::setMode(int mode) { - switch(mode) + switch (mode) { case 1: this->mode = BLI_YCC_ITU_BT709; diff --git a/source/blender/compositor/operations/COM_CropOperation.cpp b/source/blender/compositor/operations/COM_CropOperation.cpp index a763ded7f52..3c4e3428ec2 100644 --- a/source/blender/compositor/operations/COM_CropOperation.cpp +++ b/source/blender/compositor/operations/COM_CropOperation.cpp @@ -23,7 +23,7 @@ #include "COM_CropOperation.h" #include "BLI_math.h" -CropBaseOperation::CropBaseOperation() :NodeOperation(){ +CropBaseOperation::CropBaseOperation() :NodeOperation() { this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; @@ -34,7 +34,7 @@ void CropBaseOperation::updateArea() { SocketReader * inputReference = this->getInputSocketReader(0); float width = inputReference->getWidth(); float height = inputReference->getHeight(); - if (this->relative){ + if (this->relative) { settings->x1= width * settings->fac_x1; settings->x2= width * settings->fac_x2; settings->y1= height * settings->fac_y1; @@ -55,22 +55,23 @@ void CropBaseOperation::updateArea() { this->ymin = MIN2(settings->y1, settings->y2); } -void CropBaseOperation::initExecution(){ +void CropBaseOperation::initExecution() { this->inputOperation = this->getInputSocketReader(0); updateArea(); } -void CropBaseOperation::deinitExecution(){ +void CropBaseOperation::deinitExecution() { this->inputOperation = NULL; } -CropOperation::CropOperation() :CropBaseOperation(){ +CropOperation::CropOperation() :CropBaseOperation() { } -void CropOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]){ - if ((x < this->xmax && x >= xmin) && (y < ymax && y >= ymin)){ +void CropOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + if ((x < this->xmax && x >= xmin) && (y < ymax && y >= ymin)) { inputOperation->read(color, x, y, sampler, inputBuffers); - } else { + } + else { color[0] = 0.0f; color[1] = 0.0f; color[2] = 0.0f; @@ -78,10 +79,10 @@ void CropOperation::executePixel(float *color, float x, float y, PixelSampler sa } } -CropImageOperation::CropImageOperation() :CropBaseOperation(){ +CropImageOperation::CropImageOperation() :CropBaseOperation() { } -bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output){ +bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { rcti newInput; newInput.xmax = input->xmax + this->xmin; @@ -92,13 +93,13 @@ bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } -void CropImageOperation::determineResolution(unsigned int resolution[], unsigned int preferedResolution[]){ +void CropImageOperation::determineResolution(unsigned int resolution[], unsigned int preferedResolution[]) { NodeOperation::determineResolution(resolution, preferedResolution); updateArea(); resolution[0] = this->xmax - this->xmin; resolution[1] = this->ymax - this->ymin; } -void CropImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]){ +void CropImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { this->inputOperation->read(color, (x + this->xmin), (y + this->ymin), sampler, inputBuffers); } diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp index 92d9e29dcec..c64f2593318 100644 --- a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp @@ -61,15 +61,15 @@ void DifferenceMatteOperation::executePixel(float* outputValue, float x, float y difference=difference/3.0; /*make 100% transparent*/ - if(difference < tolerence) { + if (difference < tolerence) { outputValue[0]=0.0; } /*in the falloff region, make partially transparent */ - else if(difference < falloff+tolerence) { + else if (difference < falloff+tolerence) { difference=difference-tolerence; alpha=difference/falloff; /*only change if more transparent than before */ - if(alpha < inColor1[3]) { + if (alpha < inColor1[3]) { outputValue[0]=alpha; } else { /* leave as before */ diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp index df3bf996c96..c34d8976719 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -36,10 +36,12 @@ void DilateErodeOperation::initExecution() { this->inputProgram = this->getInputSocketReader(0); if (this->distance < 0.0f) { this->scope = - this->distance + this->inset; - } else { + } + else { if (this->inset*2 > this->distance) { this->scope = max(this->inset*2 - this->distance, this->distance); - } else { + } + else { this->scope = distance; } } @@ -87,7 +89,8 @@ void DilateErodeOperation::executePixel(float* color, int x, int y, MemoryBuffer } } pixelvalue = -sqrtf(mindist); - } else { + } + else { for (int yi = miny ; yiymin)*bufferWidth+(minx-rect->xmin))*4; for (int xi = minx ; xi= 0.0f) { if (delta >= inset) { color[0] = 1.0f; - } else { + } + else { color[0] = delta/inset; } - } else { + } + else { color[0] = 0.0f; } - } else { + } + else { const float delta = -distance+pixelvalue; if (delta < 0.0f) { if (delta < -inset) { color[0] = 1.0f; - } else { + } + else { color[0] = (-delta)/inset; } - } else { + } + else { color[0] = 0.0f; } } diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp index 5b066d8f16e..4b4e9ce851a 100644 --- a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp @@ -73,7 +73,7 @@ void DirectionalBlurOperation::executePixel(float* color, int x, int y, MemoryBu float lsc = sc; float lrot = rot; /* blur the image */ - for(int i= 0; i < iterations; ++i) { + for (int i= 0; i < iterations; ++i) { const float cs= cos(lrot), ss= sin(lrot); const float isc= 1.f / (1.f + lsc); diff --git a/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp b/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp index bef470ca9de..ab4df7bf1ac 100644 --- a/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp @@ -63,15 +63,15 @@ void DistanceMatteOperation::executePixel(float* outputValue, float x, float y, */ /*make 100% transparent */ - if(distance < tolerence) { + if (distance < tolerence) { outputValue[0]=0.f; } /*in the falloff region, make partially transparent */ - else if(distance < falloff+tolerence){ + else if (distance < falloff+tolerence) { distance=distance-tolerence; alpha=distance/falloff; /*only change if more transparent than before */ - if(alpha < inImage[3]) { + if (alpha < inImage[3]) { outputValue[0]=alpha; } else { /* leave as before */ diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp index cb6b27b9da1..b42e676893a 100644 --- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp @@ -26,7 +26,7 @@ // this part has been copied from the double edge mask // Contributor(s): Peter Larabell. -static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ +static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -35,134 +35,150 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int /* upper left corner */ x=t-rw+1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel underneath, or to the right, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])){ + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { - res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + else { + res[x] = 1.0f; // pixel is just part of inner mask, and it's not an edge + } + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size - lres[x]=3; // flag pixel as outer edge + lres[x] = 3; // flag pixel as outer edge } /* upper right corner */ x=t; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel underneath, or to the left, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])){ + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* lower left corner */ x=0; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel above, or to the right, are empty in the inner mask, // but filled in the outer mask - if((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])){ + if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* lower right corner */ x=rw-1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel above, or to the left, are empty in the inner mask, // but filled in the outer mask - if((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])){ + if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* Test the TOP row of pixels in buffer, except corners */ - for(x= t-1; x>=(t-rw)+2; x--) { + for (x= t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel to the right, or to the left, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } } /* Test the BOTTOM row of pixels in buffer, except corners */ - for(x= rw-2; x; x--) { + for (x= rw-2; x; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel to the right, or to the left, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } } /* Test the LEFT edge of pixels in buffer, except corners */ - for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x= t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } } /* Test the RIGHT edge of pixels in buffer, except corners */ - for(x= t-rw; x>rw; x-=rw) { + for (x= t-rw; x>rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } @@ -173,7 +189,7 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int rsize[2]=gsz; } -static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ +static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -182,20 +198,23 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in /* upper left corner */ x=t-rw+1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel underneath, or to the right, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])){ + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -203,20 +222,23 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in /* upper right corner */ x=t; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel underneath, or to the left, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])){ + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x-1] && lomask[x-1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -224,20 +246,23 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in /* lower left corner */ x=0; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel above, or to the right, are empty in the inner mask, // but filled in the outer mask - if((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])){ + if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty above or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty above or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -245,41 +270,47 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in /* lower right corner */ x=rw-1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if pixel above, or to the left, are empty in the inner mask, // but filled in the outer mask - if((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])){ + if ((!limask[x+rw] && lomask[x+rw]) || (!limask[x-1] && lomask[x-1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } } /* Test the TOP row of pixels in buffer, except corners */ - for(x= t-1; x>=(t-rw)+2; x--) { + for (x= t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel to the left, or to the right, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -287,44 +318,50 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in } /* Test the BOTTOM row of pixels in buffer, except corners */ - for(x= rw-2; x; x--) { + for (x= rw-2; x; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel to the left, or to the right, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { + if ((!limask[x-1] && lomask[x-1]) || (!limask[x+1] && lomask[x+1])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } } } /* Test the LEFT edge of pixels in buffer, except corners */ - for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x= t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -332,22 +369,25 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in } /* Test the RIGHT edge of pixels in buffer, except corners */ - for(x= t-rw; x>rw; x-=rw) { + for (x= t-rw; x>rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, // but filled in the outer mask - if((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { + if ((!limask[x-rw] && lomask[x-rw]) || (!limask[x+rw] && lomask[x+rw])) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -359,7 +399,7 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in rsize[2]=gsz; } -static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ +static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -368,126 +408,142 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim /* upper left corner */ x=t-rw+1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if the inner mask is empty underneath or to the right - if(!limask[x-rw] || !limask[x+1]){ + if (!limask[x-rw] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* upper right corner */ x=t; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if the inner mask is empty underneath or to the left - if(!limask[x-rw] || !limask[x-1]){ + if (!limask[x-rw] || !limask[x-1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* lower left corner */ x=0; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if inner mask is empty above or to the right - if(!limask[x+rw] || !limask[x+1]){ + if (!limask[x+rw] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* lower right corner */ x=rw-1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if inner mask is empty above or to the left - if(!limask[x+rw] || !limask[x-1]){ + if (!limask[x+rw] || !limask[x-1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } /* Test the TOP row of pixels in buffer, except corners */ - for(x= t-1; x>=(t-rw)+2; x--) { + for (x= t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty to the left or to the right - if(!limask[x-1] || !limask[x+1]) { + if (!limask[x-1] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } } /* Test the BOTTOM row of pixels in buffer, except corners */ - for(x= rw-2; x; x--) { + for (x= rw-2; x; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty to the left or to the right - if(!limask[x-1] || !limask[x+1]) { + if (!limask[x-1] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } } /* Test the LEFT edge of pixels in buffer, except corners */ - for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x= t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty underneath or above - if(!limask[x-rw] || !limask[x+rw]) { + if (!limask[x-rw] || !limask[x+rw]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } } /* Test the RIGHT edge of pixels in buffer, except corners */ - for(x= t-rw; x>rw; x-=rw) { + for (x= t-rw; x>rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty underneath or above - if(!limask[x-rw] || !limask[x+rw]) { + if (!limask[x-rw] || !limask[x+rw]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge } @@ -498,7 +554,7 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim rsize[2]=gsz; } -static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize){ +static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -507,19 +563,22 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li /* upper left corner */ x=t-rw+1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if the inner mask is empty underneath or to the right - if(!limask[x-rw] || !limask[x+1]){ + if (!limask[x-rw] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -527,19 +586,22 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li /* upper right corner */ x=t; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if the inner mask is empty underneath or to the left - if(!limask[x-rw] || !limask[x-1]){ + if (!limask[x-rw] || !limask[x-1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x-1]) { // test if outer mask is empty above or to the left osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -547,19 +609,22 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li /* lower left corner */ x=0; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if inner mask is empty above or to the right - if(!limask[x+rw] || !limask[x+1]){ + if (!limask[x+rw] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x+rw] || !lomask[x+1]) { // test if outer mask is empty underneath or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -567,39 +632,45 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li /* lower right corner */ x=rw-1; // test if inner mask is filled - if(limask[x]){ + if (limask[x]) { // test if inner mask is empty above or to the left - if(!limask[x+rw] || !limask[x-1]){ + if (!limask[x+rw] || !limask[x-1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]){ // inner mask was empty, test if outer mask is filled - if(!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x+rw] || !lomask[x-1]) { // test if outer mask is empty underneath or to the left osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } } /* Test the TOP row of pixels in buffer, except corners */ - for(x= t-1; x>=(t-rw)+2; x--) { + for (x= t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty to the left or to the right - if(!limask[x-1] || !limask[x+1]) { + if (!limask[x-1] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -607,42 +678,48 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li } /* Test the BOTTOM row of pixels in buffer, except corners */ - for(x= rw-2; x; x--) { + for (x= rw-2; x; x--) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty to the left or to the right - if(!limask[x-1] || !limask[x+1]) { + if (!limask[x-1] || !limask[x+1]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-1] || !lomask[x+1]) { // test if outer mask is empty to the left or to the right osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } } } /* Test the LEFT edge of pixels in buffer, except corners */ - for(x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x= t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty underneath or above - if(!limask[x-rw] || !limask[x+rw]) { + if (!limask[x-rw] || !limask[x+rw]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -650,21 +727,24 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li } /* Test the RIGHT edge of pixels in buffer, except corners */ - for(x= t-rw; x>rw; x-=rw) { + for (x= t-rw; x>rw; x-=rw) { // test if inner mask is filled - if(limask[x]) { + if (limask[x]) { // test if inner mask is empty underneath or above - if(!limask[x-rw] || !limask[x+rw]) { + if (!limask[x-rw] || !limask[x+rw]) { isz++; // increment inner edge size lres[x]=4; // flag pixel as inner edge - } else { + } + else { res[x]=1.0f; // pixel is just part of inner mask, and it's not an edge } - } else if(lomask[x]) { // inner mask was empty, test if outer mask is filled - if(!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above + } + else if (lomask[x]) { // inner mask was empty, test if outer mask is filled + if (!lomask[x-rw] || !lomask[x+rw]) { // test if outer mask is empty underneath or above osz++; // increment outer edge size lres[x]=3; // flag pixel as outer edge - } else { + } + else { gsz++; // increment the gradient pixel count lres[x]=2; // flag pixel as gradient } @@ -676,7 +756,7 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li rsize[2]=gsz; } -static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz){ +static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) { int x; // x = pixel loop counter int a; // a = pixel loop counter int dx; // dx = delta x @@ -685,39 +765,42 @@ static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *l int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ - for(x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { + for (x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { a=x-2; pix_prevRow=a+rw; pix_nextRow=a-rw; pix_prevCol=a+1; pix_nextCol=a-1; - while(a>dx-2) { - if(!limask[a]) { // if the inner mask is empty - if(lomask[a]) { // if the outer mask is full + while (a>dx-2) { + if (!limask[a]) { // if the inner mask is empty + if (lomask[a]) { // if the outer mask is full /* Next we test all 4 directions around the current pixel: next/prev/up/down The test ensures that the outer mask is empty and that the inner mask is also empty. If both conditions are true for any one of the 4 adjacent pixels then the current pixel is counted as being a true outer edge pixel. */ - if((!lomask[pix_nextCol] && !limask[pix_nextCol]) || + if ((!lomask[pix_nextCol] && !limask[pix_nextCol]) || (!lomask[pix_prevCol] && !limask[pix_prevCol]) || (!lomask[pix_nextRow] && !limask[pix_nextRow]) || (!lomask[pix_prevRow] && !limask[pix_prevRow])) { in_osz++; // increment the outer boundary pixel count lres[a]=3; // flag pixel as part of outer edge - } else { // it's not a boundary pixel, but it is a gradient pixel + } + else { // it's not a boundary pixel, but it is a gradient pixel in_gsz++; // increment the gradient pixel count lres[a]=2; // flag pixel as gradient } } - } else { - if(!limask[pix_nextCol] || !limask[pix_prevCol] || !limask[pix_nextRow] || !limask[pix_prevRow]) { + } + else { + if (!limask[pix_nextCol] || !limask[pix_prevCol] || !limask[pix_nextRow] || !limask[pix_prevRow]) { in_isz++; // increment the inner boundary pixel count lres[a]=4; // flag pixel as part of inner edge - } else { + } + else { res[a]=1.0f; // pixel is part of inner mask, but not at an edge } } @@ -734,7 +817,7 @@ static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *l rsize[2]=in_gsz; } -static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz){ +static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) { int x; // x = pixel loop counter int a; // a = pixel loop counter int dx; // dx = delta x @@ -743,43 +826,46 @@ static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned i int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ - for(x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { + for (x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { a=x-2; pix_prevRow=a+rw; pix_nextRow=a-rw; pix_prevCol=a+1; pix_nextCol=a-1; - while(a>dx-2) { - if(!limask[a]) { // if the inner mask is empty - if(lomask[a]) { // if the outer mask is full + while (a>dx-2) { + if (!limask[a]) { // if the inner mask is empty + if (lomask[a]) { // if the outer mask is full /* Next we test all 4 directions around the current pixel: next/prev/up/down The test ensures that the outer mask is empty and that the inner mask is also empty. If both conditions are true for any one of the 4 adjacent pixels then the current pixel is counted as being a true outer edge pixel. */ - if((!lomask[pix_nextCol] && !limask[pix_nextCol]) || + if ((!lomask[pix_nextCol] && !limask[pix_nextCol]) || (!lomask[pix_prevCol] && !limask[pix_prevCol]) || (!lomask[pix_nextRow] && !limask[pix_nextRow]) || (!lomask[pix_prevRow] && !limask[pix_prevRow])) { in_osz++; // increment the outer boundary pixel count lres[a]=3; // flag pixel as part of outer edge - } else { // it's not a boundary pixel, but it is a gradient pixel + } + else { // it's not a boundary pixel, but it is a gradient pixel in_gsz++; // increment the gradient pixel count lres[a]=2; // flag pixel as gradient } } - } else { - if((!limask[pix_nextCol] && lomask[pix_nextCol]) || + } + else { + if ((!limask[pix_nextCol] && lomask[pix_nextCol]) || (!limask[pix_prevCol] && lomask[pix_prevCol]) || (!limask[pix_nextRow] && lomask[pix_nextRow]) || (!limask[pix_prevRow] && lomask[pix_prevRow])) { in_isz++; // increment the inner boundary pixel count lres[a]=4; // flag pixel as part of inner edge - } else { + } + else { res[a]=1.0f; // pixel is part of inner mask, but not at an edge } } @@ -796,7 +882,7 @@ static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned i rsize[2]=in_gsz; } -static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigned int *lres, float *res, unsigned short *gbuf, unsigned int *innerEdgeOffset, unsigned int *outerEdgeOffset, unsigned int isz, unsigned int gsz){ +static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigned int *lres, float *res, unsigned short *gbuf, unsigned int *innerEdgeOffset, unsigned int *outerEdgeOffset, unsigned int isz, unsigned int gsz) { int x; // x = pixel loop counter int a; // a = temporary pixel index buffer loop counter unsigned int ud; // ud = unscaled edge distance @@ -878,21 +964,23 @@ static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigne innerAccum = *innerEdgeOffset; // section's offset so when we start filling, each outerAccum = *outerEdgeOffset; // section fills up it's allocated space in gbuf //uses dmin=row, rsl=col - for(x=0,dmin=0; x=0; x--) { + for (x= gsz-1; x>=0; x--) { gradientFillOffset=x<<1; t=gbuf[gradientFillOffset]; // calculate column of pixel indexed by gbuf[x] fsz=gbuf[gradientFillOffset+1]; // calculate row of pixel indexed by gbuf[x] dmin=0xffffffff; // reset min distance to edge pixel - for(a=outerEdgeOffset+osz-1; a>=outerEdgeOffset; a--) { // loop through all outer edge buffer pixels + for (a=outerEdgeOffset+osz-1; a>=outerEdgeOffset; a--) { // loop through all outer edge buffer pixels ud=a<<1; dy=t-gbuf[ud]; // set dx to gradient pixel column - outer edge pixel row dx=fsz-gbuf[ud+1]; // set dy to gradient pixel row - outer edge pixel column ud=dx*dx+dy*dy; // compute sum of squares - if(ud=innerEdgeOffset; a--) { // loop through all inside edge pixels + for (a= innerEdgeOffset+isz-1; a>=innerEdgeOffset; a--) { // loop through all inside edge pixels ud=a<<1; dy=t-gbuf[ud]; // compute delta in Y from gradient pixel to inside edge pixel dx=fsz-gbuf[ud+1]; // compute delta in X from gradient pixel to inside edge pixel ud=dx*dx+dy*dy; // compute sum of squares - if(udgetWidth()*this->getHeight())-1; // determine size of the frame @@ -1087,10 +1175,11 @@ void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float Each version has slightly different criteria for detecting an edge pixel. */ - if(this->adjecentOnly) { // if "adjacent only" inner edge mode is turned on - if(this->keepInside) { // if "keep inside" buffer edge mode is turned on + if (this->adjecentOnly) { // if "adjacent only" inner edge mode is turned on + if (this->keepInside) { // if "keep inside" buffer edge mode is turned on do_adjacentKeepBorders(t,rw,limask,lomask,lres,res,rsize); - }else{ // "bleed out" buffer edge mode is turned on + } + else { // "bleed out" buffer edge mode is turned on do_adjacentBleedBorders(t,rw,limask,lomask,lres,res,rsize); } isz=rsize[0]; // set up inner edge, outer edge, and gradient buffer sizes after border pass @@ -1098,10 +1187,12 @@ void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float gsz=rsize[2]; // detect edges in all non-border pixels in the buffer do_adjacentEdgeDetection(t,rw,limask,lomask,lres,res,rsize,isz,osz,gsz); - }else{ // "all" inner edge mode is turned on - if(this->keepInside) { // if "keep inside" buffer edge mode is turned on + } + else { // "all" inner edge mode is turned on + if (this->keepInside) { // if "keep inside" buffer edge mode is turned on do_allKeepBorders(t,rw,limask,lomask,lres,res,rsize); - }else{ // "bleed out" buffer edge mode is turned on + } + else { // "bleed out" buffer edge mode is turned on do_allBleedBorders(t,rw,limask,lomask,lres,res,rsize); } isz=rsize[0]; // set up inner edge, outer edge, and gradient buffer sizes after border pass @@ -1144,7 +1235,8 @@ bool DoubleEdgeMaskOperation::determineDependingAreaOfInterest(rcti *input, Read newInput.ymax = this->getHeight(); newInput.ymin = 0; return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); - } else { + } + else { return false; } } diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp b/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp index 033cb4da84d..bc15523c149 100644 --- a/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp @@ -72,7 +72,8 @@ void EllipseMaskOperation::executePixel(float* color, float x, float y, PixelSam case CMP_NODE_MASKTYPE_ADD: if (inside) { color[0] = max(inputMask[0],inputValue[0]); - } else { + } + else { color[0] = inputMask[0]; } break; @@ -80,14 +81,16 @@ void EllipseMaskOperation::executePixel(float* color, float x, float y, PixelSam if (inside) { color[0] = inputMask[0]-inputValue[0]; CLAMP(color[0], 0, 1); - } else { + } + else { color[0] = inputMask[0]; } break; case CMP_NODE_MASKTYPE_MULTIPLY: if (inside) { color[0] = inputMask[0]*inputValue[0]; - } else { + } + else { color[0] = 0; } break; @@ -95,10 +98,12 @@ void EllipseMaskOperation::executePixel(float* color, float x, float y, PixelSam if (inside) { if (inputMask[0]>0.0f) { color[0] = 0; - } else { + } + else { color[0] = inputValue[0]; } - } else { + } + else { color[0] = inputMask[0]; } break; diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp index aae39694220..6194e1d6699 100644 --- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp @@ -24,7 +24,7 @@ #include "MEM_guardedalloc.h" #include "BLI_utildefines.h" -FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation(){ +FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation() { this->iirgaus = false; } @@ -34,7 +34,7 @@ void FastGaussianBlurOperation::executePixel(float *color,int x, int y, MemoryBu newData->read(color, x, y); } -bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output){ +bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { rcti newInput; rcti sizeInput; sizeInput.xmin = 0; @@ -45,13 +45,15 @@ bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, Re NodeOperation * operation = this->getInputOperation(1); if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { return true; - }else { - if(this->iirgaus){ + } + else { + if (this->iirgaus) { newInput.xmax = input->xmax + (sx); newInput.xmin = input->xmin - (sx); newInput.ymax = input->ymax + (sy); newInput.ymin = input->ymin - (sy); - }else { + } + else { newInput.xmin = 0; newInput.ymin = 0; newInput.xmax = this->getWidth(); @@ -61,7 +63,7 @@ bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, Re } } -void* FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers){ +void* FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { MemoryBuffer *newBuf = (MemoryBuffer*)this->inputProgram->initializeTileData(rect, memoryBuffers); MemoryBuffer *copy = newBuf->duplicate(); updateSize(memoryBuffers); @@ -88,7 +90,7 @@ void* FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **m return copy; } -void FastGaussianBlurOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data){ +void FastGaussianBlurOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { MemoryBuffer *newData = (MemoryBuffer*)data; delete newData; } diff --git a/source/blender/compositor/operations/COM_FlipOperation.cpp b/source/blender/compositor/operations/COM_FlipOperation.cpp index afe3173ab0f..98acb4cfb5d 100644 --- a/source/blender/compositor/operations/COM_FlipOperation.cpp +++ b/source/blender/compositor/operations/COM_FlipOperation.cpp @@ -52,14 +52,16 @@ bool FlipOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOper if (this->flipX) { newInput.xmax = (this->getWidth()- 1 - input->xmin)+1; newInput.xmin = (this->getWidth()- 1 - input->xmax)-1; - } else { + } + else { newInput.xmin = input->xmin; newInput.xmax = input->xmax; } if (this->flipY) { newInput.ymax = (this->getHeight()- 1 - input->ymin)+1; newInput.ymin = (this->getHeight()- 1 - input->ymax)-1; - } else { + } + else { newInput.ymin = input->ymin; newInput.ymax = input->ymax; } diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp index 9b7df61143e..faadad27a55 100644 --- a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp @@ -51,16 +51,16 @@ void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { updateSize(memoryBuffers); radxf = size*(float)this->data->sizex; - if(radxf>width/2.0f) + if (radxf>width/2.0f) radxf= width/2.0f; - else if(radxf<1.0f) + else if (radxf<1.0f) radxf= 1.0f; /* vertical */ radyf = size*(float)this->data->sizey; - if(radyf>height/2.0f) + if (radyf>height/2.0f) radyf= height/2.0f; - else if(radyf<1.0f) + else if (radyf<1.0f) radyf= 1.0f; radx= ceil(radxf); @@ -72,8 +72,8 @@ void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { ddgauss= new float[n]; dgauss= ddgauss; val= 0.0f; - for(j=-rady; j<=rady; j++) { - for(i=-radx; i<=radx; i++, dgauss++) { + for (j=-rady; j<=rady; j++) { + for (i=-radx; i<=radx; i++, dgauss++) { float fj= (float)j/radyf; float fi= (float)i/radxf; float dist= sqrt(fj*fj + fi*fi); @@ -82,9 +82,9 @@ void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { val+= *dgauss; } } - if(val!=0.0f) { + if (val!=0.0f) { val= 1.0f/val; - for(j= n -1; j>=0; j--) + for (j= n -1; j>=0; j--) ddgauss[j]*= val; } else ddgauss[4]= 1.0f; @@ -155,7 +155,8 @@ bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, R if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { return true; - } else { + } + else { if (this->gausstab) { int addx = radx; int addy = rady; @@ -163,7 +164,8 @@ bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, R newInput.xmin = input->xmin - addx; newInput.ymax = input->ymax + addy; newInput.ymin = input->ymin - addy; - } else { + } + else { newInput.xmin = 0; newInput.ymin = 0; newInput.xmax = this->getWidth(); diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index a93c0e44d18..7ac8fcb2d64 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -43,7 +43,7 @@ void GaussianXBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { if (this->gausstab == NULL) { updateSize(memoryBuffers); float rad = size*this->data->sizex; - if(rad<1) + if (rad<1) rad= 1; this->rad = rad; @@ -111,13 +111,15 @@ bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB NodeOperation * operation = this->getInputOperation(1); if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { return true; - }else { + } + else { if (this->gausstab == NULL) { newInput.xmax = this->getWidth(); newInput.xmin = 0; newInput.ymax = this->getHeight(); newInput.ymin = 0; - }else{ + } + else { newInput.xmax = input->xmax + rad; newInput.xmin = input->xmin - rad; newInput.ymax = input->ymax; diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 86f9dbf5c40..2218334bec8 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -42,7 +42,7 @@ void GaussianYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { if (this->gausstab == NULL) { updateSize(memoryBuffers); float rad = size*this->data->sizey; - if(rad<1) + if (rad<1) rad= 1; this->rad = rad; @@ -108,13 +108,15 @@ bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB NodeOperation * operation = this->getInputOperation(1); if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) { return true; - }else { + } + else { if (this->gausstab == NULL) { newInput.xmax = this->getWidth(); newInput.xmin = 0; newInput.ymax = this->getHeight(); newInput.ymin = 0; - } else { + } + else { newInput.xmax = input->xmax; newInput.xmin = input->xmin; newInput.ymax = input->ymax + rad; diff --git a/source/blender/compositor/operations/COM_ImageOperation.cpp b/source/blender/compositor/operations/COM_ImageOperation.cpp index 52c2e44f7d4..f4cea24cb20 100644 --- a/source/blender/compositor/operations/COM_ImageOperation.cpp +++ b/source/blender/compositor/operations/COM_ImageOperation.cpp @@ -61,7 +61,7 @@ ImBuf* BaseImageOperation::getImBuf() { ImBuf *ibuf; ibuf= BKE_image_get_ibuf(this->image, this->imageUser); - if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) { + if (ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) { return NULL; } @@ -102,7 +102,8 @@ void ImageOperation::executePixel(float *color, float x, float y, PixelSampler s color[1] = 0.0f; color[2] = 0.0f; color[3] = 0.0f; - } else { + } + else { switch (sampler) { case COM_PS_NEAREST: neareast_interpolation_color(this->buffer, NULL, color, x, y); @@ -122,7 +123,8 @@ void ImageAlphaOperation::executePixel(float *color, float x, float y, PixelSamp if (this->imageBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { color[0] = 0.0f; - } else { + } + else { tempcolor[3] = 1.0f; switch (sampler) { case COM_PS_NEAREST: @@ -142,7 +144,8 @@ void ImageAlphaOperation::executePixel(float *color, float x, float y, PixelSamp void ImageDepthOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { if (this->depthBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { color[0] = 0.0f; - } else { + } + else { int offset = y * width + x; color[0] = this->depthBuffer[offset]; } diff --git a/source/blender/compositor/operations/COM_InvertOperation.cpp b/source/blender/compositor/operations/COM_InvertOperation.cpp index a90c7b6b8d2..baf8699603c 100644 --- a/source/blender/compositor/operations/COM_InvertOperation.cpp +++ b/source/blender/compositor/operations/COM_InvertOperation.cpp @@ -46,17 +46,18 @@ void InvertOperation::executePixel(float* out, float x, float y, PixelSampler sa const float value = inputValue[0]; const float invertedValue = 1.0f - value; - if(color) { + if (color) { out[0] = (1.0f - inputColor[0])*value + inputColor[0]*invertedValue; out[1] = (1.0f - inputColor[1])*value + inputColor[1]*invertedValue; out[2] = (1.0f - inputColor[2])*value + inputColor[2]*invertedValue; - } else { + } + else { out[0] = inputColor[0]; out[1] = inputColor[1]; out[2] = inputColor[2]; } - if(alpha) + if (alpha) out[3] = (1.0f - inputColor[3])*value + inputColor[3]*invertedValue; else out[3] = inputColor[3]; diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp index 6236708c9e1..89387675090 100644 --- a/source/blender/compositor/operations/COM_LensGhostOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp @@ -119,7 +119,8 @@ public: float b2c = b*b-c; if (b2c < 0) { result->hit = false; - } else { + } + else { float sgn = (this->radius*ray->direction[2])>0?1.0f:-1.0f; float t = sqrtf(b2c)*sgn-b; result->position[0] = ray->direction[0]*t+ray->position[0]; @@ -137,7 +138,8 @@ public: result->normal[0] = -p[0]; result->normal[1] = -p[1]; result->normal[2] = -p[2]; - } else { + } + else { result->normal[0] = p[0]; result->normal[1] = p[1]; result->normal[2] = p[2]; @@ -168,7 +170,7 @@ public: bool valid; bool hasIntensity; }; -class Bounce{ +class Bounce { public: LensInterface *interface1; LensInterface *interface2; @@ -245,15 +247,15 @@ public: // dot= view[0]*n[0] + view[1]*n[1] + view[2]*n[2]; -// if(dot>0.0f) { +// if (dot>0.0f) { // index = 1.0f/index; // fac= 1.0f - (1.0f - dot*dot)*index*index; -// if(fac<= 0.0f) return 0; +// if (fac<= 0.0f) return 0; // fac= -dot*index + sqrt(fac); // } // else { // fac= 1.0f - (1.0f - dot*dot)*index*index; -// if(fac<= 0.0f) return 0; +// if (fac<= 0.0f) return 0; // fac= -dot*index - sqrt(fac); // } @@ -281,7 +283,8 @@ public: // double test = 1.0f - index*index*(1.0f-ni*ni); // if (test < 0) { // return 0; -// } else { +// } +// else { // double mul = index*ni + sqrt(test); // refract[0] = index * view[0] - mul*n[0]; // refract[1] = index * view[1] - mul*n[1]; @@ -348,7 +351,8 @@ public: delta = -delta; if (phase == 0) { next = bounce->interface2; - } else { + } + else { next = NULL; } phase ++; @@ -399,7 +403,8 @@ public: if (ref == 0) { break; } - } else { + } + else { this->reflection(result->direction, intersection.normal, result->direction); float fresnelMultiplyer = fresnelAR(intersection.theta, result->wavelength, f->thicknessCoathing, n0, n1, n2); if (isnan(fresnelMultiplyer)) { @@ -412,7 +417,8 @@ public: } if (k < bounce->length-1) { result->intensity = 0; - } else { + } + else { result->valid = true; } } @@ -446,7 +452,8 @@ void LensGhostProjectionOperation::initExecution() { visualLampPosition[0] = 0; visualLampPosition[1] = 0; visualLampPosition[2] = 0; - } else { + } + else { /* too simple, better to return the distance on the view axis only * return len_v3v3(ob->obmat[3], cam->dof_ob->obmat[3]); */ float matt[4][4], imat[4][4], obmat[4][4]; @@ -612,21 +619,25 @@ void* LensGhostOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBu face->v2 = vertex4; face->v3 = vertex1; result->push_back(face); - } else if (number == 3) { + } + else if (number == 3) { LensFace *face = new LensFace(); if (!vertex1->hasIntensity) { face->v1 = vertex2; face->v2 = vertex3; face->v3 = vertex4; - } else if (!vertex2->hasIntensity) { + } + else if (!vertex2->hasIntensity) { face->v1 = vertex1; face->v2 = vertex3; face->v3 = vertex4; - } else if (!vertex3->hasIntensity) { + } + else if (!vertex3->hasIntensity) { face->v1 = vertex1; face->v2 = vertex2; face->v3 = vertex4; - } else { + } + else { face->v1 = vertex1; face->v2 = vertex2; face->v3 = vertex3; diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp index 7850a631212..3e8a5ed3344 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp @@ -52,10 +52,10 @@ void LuminanceMatteOperation::executePixel(float* outputValue, float x, float y, */ /* test range*/ - if(inColor[0] > high) { + if (inColor[0] > high) { alpha=1.f; } - else if(inColor[0] < low){ + else if (inColor[0] < low) { alpha=0.f; } else {/*blend */ diff --git a/source/blender/compositor/operations/COM_MapUVOperation.cpp b/source/blender/compositor/operations/COM_MapUVOperation.cpp index ef0c9004a7d..08790955d03 100644 --- a/source/blender/compositor/operations/COM_MapUVOperation.cpp +++ b/source/blender/compositor/operations/COM_MapUVOperation.cpp @@ -110,7 +110,7 @@ void MapUVOperation::executePixel(float* color, float x, float y, PixelSampler s this->inputColorProgram->read(color, u, v, dx, dy, inputBuffers); /* "premul" */ - if(alpha < 1.0f) { + if (alpha < 1.0f) { color[0]*= alpha; color[1]*= alpha; color[2]*= alpha; diff --git a/source/blender/compositor/operations/COM_MapValueOperation.cpp b/source/blender/compositor/operations/COM_MapValueOperation.cpp index 33d38b8475d..5a7005af382 100644 --- a/source/blender/compositor/operations/COM_MapValueOperation.cpp +++ b/source/blender/compositor/operations/COM_MapValueOperation.cpp @@ -37,11 +37,11 @@ void MapValueOperation::executePixel(float* outputValue, float x, float y, Pixel inputOperation->read(src, x, y, sampler, inputBuffers); TexMapping *texmap= this->settings; float value = (src[0] + texmap->loc[0])*texmap->size[0]; - if(texmap->flag & TEXMAP_CLIP_MIN) - if(valuemin[0]) + if (texmap->flag & TEXMAP_CLIP_MIN) + if (valuemin[0]) value= texmap->min[0]; - if(texmap->flag & TEXMAP_CLIP_MAX) - if(value>texmap->max[0]) + if (texmap->flag & TEXMAP_CLIP_MAX) + if (value>texmap->max[0]) value= texmap->max[0]; outputValue[0] = value; diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.cpp b/source/blender/compositor/operations/COM_MathBaseOperation.cpp index 55880566bf2..d612361a7fe 100644 --- a/source/blender/compositor/operations/COM_MathBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_MathBaseOperation.cpp @@ -81,7 +81,7 @@ void MathDivideOperation::executePixel(float* outputValue, float x, float y, Pix inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if(inputValue2[0]==0) /* We don't want to divide by zero. */ + if (inputValue2[0]==0) /* We don't want to divide by zero. */ outputValue[0]= 0.0; else outputValue[0]= inputValue1[0] / inputValue2[0]; @@ -124,7 +124,7 @@ void MathArcSineOperation::executePixel(float* outputValue, float x, float y, Pi inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if(inputValue1[0] <= 1 && inputValue1[0] >= -1 ) + if (inputValue1[0] <= 1 && inputValue1[0] >= -1 ) outputValue[0]= asin(inputValue1[0]); else outputValue[0]= 0.0; @@ -137,7 +137,7 @@ void MathArcCosineOperation::executePixel(float* outputValue, float x, float y, inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if(inputValue1[0] <= 1 && inputValue1[0] >= -1 ) + if (inputValue1[0] <= 1 && inputValue1[0] >= -1 ) outputValue[0]= acos(inputValue1[0]); else outputValue[0]= 0.0; @@ -160,14 +160,16 @@ void MathPowerOperation::executePixel(float* outputValue, float x, float y, Pixe inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if( inputValue1[0] >= 0 ) { + if ( inputValue1[0] >= 0 ) { outputValue[0]= pow(inputValue1[0], inputValue2[0]); - } else { + } + else { float y_mod_1 = fmod(inputValue2[0], 1); /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { outputValue[0]= pow(inputValue1[0], (float)floor(inputValue2[0] + 0.5)); - } else { + } + else { outputValue[0] = 0.0; } } @@ -180,7 +182,7 @@ void MathLogarithmOperation::executePixel(float* outputValue, float x, float y, inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if( inputValue1[0] > 0 && inputValue2[0] > 0 ) + if ( inputValue1[0] > 0 && inputValue2[0] > 0 ) outputValue[0]= log(inputValue1[0]) / log(inputValue2[0]); else outputValue[0]= 0.0; diff --git a/source/blender/compositor/operations/COM_MixBaseOperation.cpp b/source/blender/compositor/operations/COM_MixBaseOperation.cpp index 9f8378defe9..a84ecc6edf8 100644 --- a/source/blender/compositor/operations/COM_MixBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_MixBaseOperation.cpp @@ -64,23 +64,25 @@ void MixBaseOperation::deinitExecution() { this->inputColor2Operation = NULL; } -void MixBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]){ +void MixBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { InputSocket* socket; unsigned int tempPreferredResolution[] = {0,0}; unsigned int tempResolution[2]; socket = this->getInputSocket(1); socket->determineResolution(tempResolution, tempPreferredResolution); - if((tempResolution[0] != 0) && (tempResolution[1] != 0)){ + if ((tempResolution[0] != 0) && (tempResolution[1] != 0)) { this->setResolutionInputSocketIndex(1); - }else { + } + else { socket = this->getInputSocket(2); tempPreferredResolution[0] = 0; tempPreferredResolution[1] = 0; socket->determineResolution(tempResolution, tempPreferredResolution); - if((tempResolution[0] != 0) && (tempResolution[1] != 0)){ + if ((tempResolution[0] != 0) && (tempResolution[1] != 0)) { this->setResolutionInputSocketIndex(2); - }else { + } + else { this->setResolutionInputSocketIndex(0); } } diff --git a/source/blender/compositor/operations/COM_MixColorOperation.cpp b/source/blender/compositor/operations/COM_MixColorOperation.cpp index ebcb7056570..d5ec55daf07 100644 --- a/source/blender/compositor/operations/COM_MixColorOperation.cpp +++ b/source/blender/compositor/operations/COM_MixColorOperation.cpp @@ -45,7 +45,7 @@ void MixColorOperation::executePixel(float* outputValue, float x, float y, Pixel float colH,colS,colV; rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); - if(colS!=0.0f){ + if (colS!=0.0f) { float rH,rS,rV; float tmpr,tmpg,tmpb; rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); diff --git a/source/blender/compositor/operations/COM_MixDarkenOperation.cpp b/source/blender/compositor/operations/COM_MixDarkenOperation.cpp index 773a51e92cb..7e8271a9c96 100644 --- a/source/blender/compositor/operations/COM_MixDarkenOperation.cpp +++ b/source/blender/compositor/operations/COM_MixDarkenOperation.cpp @@ -40,13 +40,13 @@ void MixDarkenOperation::executePixel(float* outputValue, float x, float y, Pixe float valuem = 1.0f-value; float tmp; tmp=inputColor2[0]+((1.0f-inputColor2[0])*valuem); - if(tmp < inputColor1[0]) outputValue[0]= tmp; + if (tmp < inputColor1[0]) outputValue[0]= tmp; else outputValue[0] = inputColor1[0]; tmp=inputColor2[1]+((1.0f-inputColor2[1])*valuem); - if(tmp < inputColor1[1]) outputValue[1]= tmp; + if (tmp < inputColor1[1]) outputValue[1]= tmp; else outputValue[1] = inputColor1[1]; tmp=inputColor2[2]+((1.0f-inputColor2[2])*valuem); - if(tmp < inputColor1[2]) outputValue[2]= tmp; + if (tmp < inputColor1[2]) outputValue[2]= tmp; else outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; diff --git a/source/blender/compositor/operations/COM_MixDivideOperation.cpp b/source/blender/compositor/operations/COM_MixDivideOperation.cpp index c2579c6a89c..6bab381c706 100644 --- a/source/blender/compositor/operations/COM_MixDivideOperation.cpp +++ b/source/blender/compositor/operations/COM_MixDivideOperation.cpp @@ -39,15 +39,15 @@ void MixDivideOperation::executePixel(float* outputValue, float x, float y, Pixe } float valuem= 1.0f-value; - if(inputColor2[0]!=0.0f) + if (inputColor2[0]!=0.0f) outputValue[0] = valuem*(inputColor1[0]) + value*(inputColor1[0])/inputColor2[0]; else outputValue[0] = 0.0f; - if(inputColor2[1]!=0.0f) + if (inputColor2[1]!=0.0f) outputValue[1] = valuem*(inputColor1[1]) + value*(inputColor1[1])/inputColor2[1]; else outputValue[1] = 0.0f; - if(inputColor2[2]!=0.0f) + if (inputColor2[2]!=0.0f) outputValue[2] = valuem*(inputColor1[2]) + value*(inputColor1[2])/inputColor2[2]; else outputValue[2] = 0.0f; diff --git a/source/blender/compositor/operations/COM_MixHueOperation.cpp b/source/blender/compositor/operations/COM_MixHueOperation.cpp index 386bd02ba2a..8454c694f65 100644 --- a/source/blender/compositor/operations/COM_MixHueOperation.cpp +++ b/source/blender/compositor/operations/COM_MixHueOperation.cpp @@ -45,7 +45,7 @@ void MixHueOperation::executePixel(float* outputValue, float x, float y, PixelSa float colH,colS,colV; rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); - if(colS!=0.0f){ + if (colS!=0.0f) { float rH,rS,rV; float tmpr,tmpg,tmpb; rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); diff --git a/source/blender/compositor/operations/COM_MixLightenOperation.cpp b/source/blender/compositor/operations/COM_MixLightenOperation.cpp index 32d28b785b7..6a06d5ab6e1 100644 --- a/source/blender/compositor/operations/COM_MixLightenOperation.cpp +++ b/source/blender/compositor/operations/COM_MixLightenOperation.cpp @@ -39,13 +39,13 @@ void MixLightenOperation::executePixel(float* outputValue, float x, float y, Pix } float tmp; tmp=value * inputColor2[0]; - if(tmp > inputColor1[0]) outputValue[0]= tmp; + if (tmp > inputColor1[0]) outputValue[0]= tmp; else outputValue[0] = inputColor1[0]; tmp=value * inputColor2[1]; - if(tmp > inputColor1[1]) outputValue[1]= tmp; + if (tmp > inputColor1[1]) outputValue[1]= tmp; else outputValue[1] = inputColor1[1]; tmp=value * inputColor2[2]; - if(tmp > inputColor1[2]) outputValue[2]= tmp; + if (tmp > inputColor1[2]) outputValue[2]= tmp; else outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } diff --git a/source/blender/compositor/operations/COM_MixOverlayOperation.cpp b/source/blender/compositor/operations/COM_MixOverlayOperation.cpp index 8254701adad..7a3030b9262 100644 --- a/source/blender/compositor/operations/COM_MixOverlayOperation.cpp +++ b/source/blender/compositor/operations/COM_MixOverlayOperation.cpp @@ -40,19 +40,22 @@ void MixOverlayOperation::executePixel(float* outputValue, float x, float y, Pix float valuem= 1.0f-value; - if(inputColor1[0] < 0.5f) { + if (inputColor1[0] < 0.5f) { outputValue[0] = inputColor1[0] * (valuem + 2.0f*value*inputColor2[0]); - } else { + } + else { outputValue[0] = 1.0f - (valuem + 2.0f*value*(1.0f - inputColor2[0])) * (1.0f - inputColor1[0]); } - if(inputColor1[1] < 0.5f) { + if (inputColor1[1] < 0.5f) { outputValue[1] = inputColor1[1] * (valuem + 2.0f*value*inputColor2[1]); - } else { + } + else { outputValue[1] = 1.0f - (valuem + 2.0f*value*(1.0f - inputColor2[1])) * (1.0f - inputColor1[1]); } - if(inputColor1[2] < 0.5f) { + if (inputColor1[2] < 0.5f) { outputValue[2] = inputColor1[2] * (valuem + 2.0f*value*inputColor2[2]); - } else { + } + else { outputValue[2] = 1.0f - (valuem + 2.0f*value*(1.0f - inputColor2[2])) * (1.0f - inputColor1[2]); } outputValue[3] = inputColor1[3]; diff --git a/source/blender/compositor/operations/COM_MixSaturationOperation.cpp b/source/blender/compositor/operations/COM_MixSaturationOperation.cpp index 18ff6f46c46..a8fe647828b 100644 --- a/source/blender/compositor/operations/COM_MixSaturationOperation.cpp +++ b/source/blender/compositor/operations/COM_MixSaturationOperation.cpp @@ -45,7 +45,7 @@ void MixSaturationOperation::executePixel(float* outputValue, float x, float y, float rH,rS,rV; rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); - if(rS!=0.0f){ + if (rS!=0.0f) { float colH,colS,colV; rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); hsv_to_rgb(rH , (valuem*rS+value*colS), rV, &outputValue[0], &outputValue[1], &outputValue[2]); diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.cpp b/source/blender/compositor/operations/COM_MovieClipOperation.cpp index 74179293c6c..7597497acc7 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieClipOperation.cpp @@ -78,7 +78,8 @@ void MovieClipOperation::executePixel(float *color, float x, float y, PixelSampl color[1] = 0.0f; color[2] = 0.0f; color[3] = 0.0f; - } else { + } + else { switch (sampler) { case COM_PS_NEAREST: neareast_interpolation_color(this->movieClipBuffer, NULL, color, x, y); diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp index 360719aa59f..b848192d40b 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp @@ -54,7 +54,8 @@ void MovieDistortionOperation::initExecution() { DistortionCache* newC = new DistortionCache(this->movieClip, this->width, this->height, this->distortion); s_cache.push_back(newC); this->cache = newC; - } else { + } + else { this->cache = NULL; } } diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp index 53b71ed528e..df2b762b563 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp @@ -33,7 +33,7 @@ MultilayerBaseOperation::MultilayerBaseOperation(int pass): BaseImageOperation() ImBuf* MultilayerBaseOperation::getImBuf() { RenderPass *rpass; rpass = (RenderPass *)BLI_findlink(&this->renderlayer->passes, this->passId); - if(rpass) { + if (rpass) { this->imageUser->pass= this->passId; BKE_image_multilayer_index(image->rr, this->imageUser); return BaseImageOperation::getImBuf(); @@ -49,7 +49,8 @@ void MultilayerColorOperation::executePixel(float *color, float x, float y, Pixe color[1] = 0.0f; color[2] = 0.0f; color[3] = 0.0f; - } else { + } + else { if (this->numberOfChannels == 4) { switch (sampler) { case COM_PS_NEAREST: @@ -62,7 +63,8 @@ void MultilayerColorOperation::executePixel(float *color, float x, float y, Pixe bicubic_interpolation_color(this->buffer, NULL, color, x, y); break; } - } else { + } + else { int offset = (yi*this->getWidth()+xi)*3; color[0] = this->imageBuffer[offset]; color[1] = this->imageBuffer[offset+1]; @@ -76,7 +78,8 @@ void MultilayerValueOperation::executePixel(float *color, float x, float y, Pixe int xi = x; if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { color[0] = 0.0f; - } else { + } + else { float result = this->imageBuffer[yi*this->getWidth()+xi]; color[0] = result; } @@ -87,7 +90,8 @@ void MultilayerVectorOperation::executePixel(float *color, float x, float y, Pix int xi = x; if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { color[0] = 0.0f; - } else { + } + else { int offset = (yi*this->getWidth()+xi)*3; color[0] = this->imageBuffer[offset]; color[1] = this->imageBuffer[offset+1]; diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp index 4cf50823c00..adaba8e3330 100644 --- a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp @@ -3,7 +3,7 @@ const char* sourcecode = "/// This file contains all opencl kernels for node-operation implementations \n" \ "\n" \ -"__kernel void testKernel(__global __write_only image2d_t output){\n" \ +"__kernel void testKernel(__global __write_only image2d_t output) {\n" \ " int x = get_global_id(0);\n" \ " int y = get_global_id(1);\n" \ " int2 coords = {x, y}; \n" \ diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cpp b/source/blender/compositor/operations/COM_PreviewOperation.cpp index 5191c940f70..4a9d08380ea 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.cpp +++ b/source/blender/compositor/operations/COM_PreviewOperation.cpp @@ -52,7 +52,8 @@ void PreviewOperation::initExecution() { this->input = getInputSocketReader(0); if (!this->node->preview) { this->node->preview = (bNodePreview*)MEM_callocN(sizeof(bNodePreview), "node preview"); - } else { + } + else { if (this->getWidth() == (unsigned int)this->node->preview->xsize && this->getHeight() == (unsigned int)this->node->preview->ysize) { this->outputBuffer = this->node->preview->rect; } @@ -60,7 +61,7 @@ void PreviewOperation::initExecution() { if (this->outputBuffer == NULL) { this->outputBuffer = (unsigned char*)MEM_callocN(sizeof(unsigned char)*4*getWidth()*getHeight(), "PreviewOperation"); - if(this->node->preview->rect) { + if (this->node->preview->rect) { MEM_freeN(this->node->preview->rect); } this->node->preview->xsize= getWidth(); @@ -112,7 +113,8 @@ void PreviewOperation::determineResolution(unsigned int resolution[], unsigned i this->divider = 0.0f; if (width > height) { divider = COM_PREVIEW_SIZE / (width-1); - } else { + } + else { divider = COM_PREVIEW_SIZE / (height-1); } width = width * divider; diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp index 483a75a69d2..69405ef6d23 100644 --- a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp @@ -48,7 +48,8 @@ void ReadBufferOperation::executePixel(float* color, float x, float y, PixelSamp if (inputBuffer) { if (sampler == COM_PS_NEAREST) { inputBuffer->read(color, x, y); - } else { + } + else { inputBuffer->readCubic(color, x, y); } } diff --git a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp index d85d54489ac..d18915c593b 100644 --- a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp @@ -36,7 +36,8 @@ void RenderLayersAlphaProg::executePixel(float* output, float x, float y, PixelS output[1] = 0.0f; output[2] = 0.0f; output[3] = 0.0f; - } else { + } + else { unsigned int offset = (iy*this->getWidth()+ix) * 4; output[0] = inputBuffer[offset+3]; output[1] = 0.0f; diff --git a/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp b/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp index e63fcd5df4d..94ba8973314 100644 --- a/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp @@ -44,15 +44,15 @@ void RenderLayersBaseProg::initExecution() { Render *re= (scene)? RE_GetRender(scene->id.name): NULL; RenderResult *rr= NULL; - if(re) + if (re) rr= RE_AcquireResultRead(re); - if(rr) { + if (rr) { SceneRenderLayer *srl= (SceneRenderLayer*)BLI_findlink(&scene->r.layers, getLayerId()); - if(srl) { + if (srl) { RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if(rl && rl->rectf) { + if (rl && rl->rectf) { this->inputBuffer = RE_RenderLayerGetPass(rl, renderpass); if (this->inputBuffer == NULL || renderpass == SCE_PASS_COMBINED) { @@ -76,19 +76,22 @@ void RenderLayersBaseProg::executePixel(float* output, float x, float y, PixelSa output[1] = 0.0f; output[2] = 0.0f; output[3] = 0.0f; - } else { + } + else { unsigned int offset = (iy*this->getWidth()+ix) * elementsize; if (elementsize == 1) { output[0] = inputBuffer[offset]; output[1] = 0.0f; output[2] = 0.0f; output[3] = 0.0f; - } else if (elementsize == 3){ + } + else if (elementsize == 3) { output[0] = inputBuffer[offset]; output[1] = inputBuffer[offset+1]; output[2] = inputBuffer[offset+2]; output[3] = 1.0f; - } else { + } + else { output[0] = inputBuffer[offset]; output[1] = inputBuffer[offset+1]; output[2] = inputBuffer[offset+2]; @@ -109,21 +112,21 @@ void RenderLayersBaseProg::determineResolution(unsigned int resolution[], unsign resolution[0] = 0; resolution[1] = 0; - if(re) + if (re) rr= RE_AcquireResultRead(re); - if(rr) { + if (rr) { SceneRenderLayer *srl= (SceneRenderLayer*)BLI_findlink(&sce->r.layers, getLayerId()); - if(srl) { + if (srl) { RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if(rl && rl->rectf) { + if (rl && rl->rectf) { resolution[0]=rl->rectx; resolution[1]=rl->recty; } } } - if(re) + if (re) RE_ReleaseResult(re); } diff --git a/source/blender/compositor/operations/COM_RotateOperation.cpp b/source/blender/compositor/operations/COM_RotateOperation.cpp index ef6c5bee90a..ac2e8c5e8a9 100644 --- a/source/blender/compositor/operations/COM_RotateOperation.cpp +++ b/source/blender/compositor/operations/COM_RotateOperation.cpp @@ -42,7 +42,8 @@ void RotateOperation::initExecution() { double rad; if (this->doDegree2RadConversion) { rad = DEG2RAD(degree[0]); - } else { + } + else { rad = degree[0]; } this->cosine = cos(rad); diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp index 87ef015384d..474874d4bb4 100644 --- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp @@ -133,7 +133,8 @@ void ScreenLensDistortionOperation::executePixel(float* outputColor, int x, int /* set alpha */ outputColor[3]= 1.0f; - } else { + } + else { outputColor[0]= 0.0f; outputColor[1]= 0.0f; outputColor[2]= 0.0f; diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.cpp b/source/blender/compositor/operations/COM_SetVectorOperation.cpp index b9c8f4bc369..3e9b68ac971 100644 --- a/source/blender/compositor/operations/COM_SetVectorOperation.cpp +++ b/source/blender/compositor/operations/COM_SetVectorOperation.cpp @@ -38,7 +38,8 @@ void SetVectorOperation::determineResolution(unsigned int resolution[], unsigned if (preferredResolution[0] == 0 ||preferredResolution[1]==0) { resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; - } else { + } + else { resolution[0] = preferredResolution[0]; resolution[1] = preferredResolution[1]; } diff --git a/source/blender/compositor/operations/COM_SplitViewerOperation.cpp b/source/blender/compositor/operations/COM_SplitViewerOperation.cpp index f9000cc63da..f2d5e491001 100644 --- a/source/blender/compositor/operations/COM_SplitViewerOperation.cpp +++ b/source/blender/compositor/operations/COM_SplitViewerOperation.cpp @@ -77,17 +77,20 @@ void SplitViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, Me image1 = xSplit?x>perc:y>perc; if (image1) { image1Input->read(&(buffer[offset]), x, y, COM_PS_NEAREST, memoryBuffers); - } else { + } + else { image2Input->read(&(buffer[offset]), x, y, COM_PS_NEAREST, memoryBuffers); } /// @todo: linear conversion only when scene color management is selected, also check predivide. if (this->doColorManagement) { - if(this->doColorPredivide) { + if (this->doColorPredivide) { linearrgb_to_srgb_predivide_v4(srgb, buffer+offset); - } else { + } + else { linearrgb_to_srgb_v4(srgb, buffer+offset); } - } else { + } + else { copy_v4_v4(srgb, buffer+offset); } diff --git a/source/blender/compositor/operations/COM_TextureOperation.cpp b/source/blender/compositor/operations/COM_TextureOperation.cpp index 1ca986f8893..3eb08140914 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.cpp +++ b/source/blender/compositor/operations/COM_TextureOperation.cpp @@ -52,7 +52,8 @@ void TextureBaseOperation::determineResolution(unsigned int resolution[], unsign if (preferredResolution[0] == 0 || preferredResolution[1] == 0) { resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; - } else { + } + else { resolution[0] = preferredResolution[0]; resolution[1] = preferredResolution[1]; } @@ -86,12 +87,12 @@ void TextureBaseOperation::executePixel(float *color, float x, float y, PixelSam retval= multitex_ext(this->texture, vec, NULL, NULL, 0, &texres); - if(texres.talpha) + if (texres.talpha) color[3]= texres.ta; else color[3]= texres.tin; - if((retval & TEX_RGB)) { + if ((retval & TEX_RGB)) { color[0]= texres.tr; color[1]= texres.tg; color[2]= texres.tb; diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp index e97b1155e22..83b9f55b431 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp @@ -84,7 +84,9 @@ void VariableSizeBokehBlurOperation::executePixel(float* color, int x, int y, Me float dx = nx - x; float dy = ny - y; if (nx == x && ny == y) { - } else if (size>= fabs(dx) && size >= fabs(dy)) { + /* pass */ + } + else if (size>= fabs(dx) && size >= fabs(dy)) { float u = 256+ dx*256/size; float v = 256+ dy*256/size; inputBokehProgram->read(bokeh, u, v, COM_PS_NEAREST, inputBuffers); diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp index 7d660177fbb..7b6ebe9728f 100644 --- a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp @@ -94,7 +94,8 @@ bool VectorBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBuff newInput.ymax = this->getHeight(); newInput.ymin = 0; return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); - } else { + } + else { return false; } } diff --git a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp index 16143af7165..85b5cc4c3a8 100644 --- a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp @@ -86,7 +86,8 @@ void ViewerBaseOperation::deinitExecution() { const int ViewerBaseOperation::getRenderPriority() const { if (this->isActiveViewerOutput()) { return 8; - } else { + } + else { return 0; } } diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cpp b/source/blender/compositor/operations/COM_ViewerOperation.cpp index b0d443f1cbd..8fa63329e1f 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.cpp +++ b/source/blender/compositor/operations/COM_ViewerOperation.cpp @@ -85,12 +85,14 @@ void ViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryB } /// @todo: linear conversion only when scene color management is selected, also check predivide. if (this->doColorManagement) { - if(this->doColorPredivide) { + if (this->doColorPredivide) { linearrgb_to_srgb_predivide_v4(srgb, buffer+offset); - } else { + } + else { linearrgb_to_srgb_v4(srgb, buffer+offset); } - } else { + } + else { copy_v4_v4(srgb, buffer+offset); } diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.cpp b/source/blender/compositor/operations/COM_WriteBufferOperation.cpp index 44a769ee947..6bb38c007ef 100644 --- a/source/blender/compositor/operations/COM_WriteBufferOperation.cpp +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.cpp @@ -80,7 +80,8 @@ void WriteBufferOperation::executeRegion(rcti *rect, unsigned int tileNumber, Me this->input->deinitializeTileData(rect, memoryBuffers, data); data = NULL; } - } else { + } + else { int x1 = rect->xmin; int y1 = rect->ymin; int x2 = rect->xmax; diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.cpp b/source/blender/compositor/operations/COM_ZCombineOperation.cpp index 9aa06df1ead..e45d66dd597 100644 --- a/source/blender/compositor/operations/COM_ZCombineOperation.cpp +++ b/source/blender/compositor/operations/COM_ZCombineOperation.cpp @@ -52,7 +52,8 @@ void ZCombineOperation::executePixel(float* color, float x, float y, PixelSample this->depth2Reader->read(depth2, x, y, sampler, inputBuffers); if (depth1[0]image1Reader->read(color, x, y, sampler, inputBuffers); - } else { + } + else { this->image2Reader->read(color, x, y, sampler, inputBuffers); } } @@ -67,7 +68,8 @@ void ZCombineAlphaOperation::executePixel(float* color, float x, float y, PixelS if (depth1[0]image1Reader->read(color1, x, y, sampler, inputBuffers); this->image2Reader->read(color2, x, y, sampler, inputBuffers); - } else { + } + else { this->image1Reader->read(color2, x, y, sampler, inputBuffers); this->image2Reader->read(color1, x, y, sampler, inputBuffers); } From 69dc5d094a6dfa42d2a9812c6cf99721f9a2fe4b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 14:00:54 +0000 Subject: [PATCH 009/159] attempt to fix osx build error --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 552cf77e8a6..69812be1e50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,8 +291,9 @@ if(APPLE) message(STATUS "Setting compiler to: " ${CMAKE_XCODE_ATTRIBUTE_GCC_VERSION}) endif() else() # unix makefile generator does not fill XCODE_VERSION var, so we get it with a command - execute_process(COMMAND xcodebuild -version OUTPUT_VARIABLE XCODE_VERS_BUILDNR ) - STRING(SUBSTRING ${XCODE_VERS_BUILDNR} 6 3 XCODE_VERSION) # truncate away build-nr + execute_process(COMMAND xcodebuild -version OUTPUT_VARIABLE XCODE_VERS_BUILD_NR) + string(SUBSTRING "${XCODE_VERS_BUILD_NR}" 6 3 XCODE_VERSION) # truncate away build-nr + unset(XCODE_VERS_BUILD_NR) endif() message(STATUS "Detected Xcode-version: " ${XCODE_VERSION}) From 29e407d37b908088d885f0c2a29af260c0762ed8 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 17 May 2012 14:02:01 +0000 Subject: [PATCH 010/159] Moved switch node to layout --- source/blender/nodes/composite/nodes/node_composite_switch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/composite/nodes/node_composite_switch.c b/source/blender/nodes/composite/nodes/node_composite_switch.c index f7b1f9e09e4..ee7e3124a7b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_switch.c +++ b/source/blender/nodes/composite/nodes/node_composite_switch.c @@ -50,7 +50,7 @@ void register_node_type_cmp_switch(bNodeTreeType *ttype) { static bNodeType ntype; - node_type_base(ttype, &ntype, CMP_NODE_SWITCH, "Switch", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_base(ttype, &ntype, CMP_NODE_SWITCH, "Switch", NODE_CLASS_LAYOUT, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_switch_in, cmp_node_switch_out); node_type_size(&ntype, 110, 60, 120); nodeRegisterType(ttype, &ntype); From 22942ac74bf67ef20a6882f766ba4c1d2d722ca1 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Thu, 17 May 2012 14:55:01 +0000 Subject: [PATCH 011/159] Compositor / Box and Ellipse Mask: * "X/Y position" label -> "X/Y". The longer text was barely visible in the UI. --- source/blender/editors/space_node/drawnode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 0a64c102150..d9fc793adb3 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2068,8 +2068,8 @@ static void node_composit_buts_boxmask(uiLayout *layout, bContext *UNUSED(C), Po uiLayout *row; row= uiLayoutRow(layout, 1); - uiItemR(row, ptr, "x", 0, NULL, ICON_NONE); - uiItemR(row, ptr, "y", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "x", 0, "X", ICON_NONE); + uiItemR(row, ptr, "y", 0, "Y", ICON_NONE); row= uiLayoutRow(layout, 1); uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE); @@ -2195,8 +2195,8 @@ static void node_composit_buts_ellipsemask(uiLayout *layout, bContext *UNUSED(C) { uiLayout *row; row= uiLayoutRow(layout, 1); - uiItemR(row, ptr, "x", 0, NULL, ICON_NONE); - uiItemR(row, ptr, "y", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "x", 0, "X", ICON_NONE); + uiItemR(row, ptr, "y", 0, "Y", ICON_NONE); row= uiLayoutRow(layout, 1); uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE); From a31de14b2e5972bf8ff6723f5dbce0053088937a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 14:59:11 +0000 Subject: [PATCH 012/159] fix for building without AUD --- source/blender/makesrna/intern/rna_sequencer_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c index 748c66499d8..4d471ae4b41 100644 --- a/source/blender/makesrna/intern/rna_sequencer_api.c +++ b/source/blender/makesrna/intern/rna_sequencer_api.c @@ -213,8 +213,8 @@ static Sequence *rna_Sequences_new_sound(ID *id, Editing *ed, Main *bmain, Repor return seq; } #else /* WITH_AUDASPACE */ -static Sequence *rna_Sequences_new_sound(ID *UNUSED(id), Editing *UNUSED(ed), bMain *UNUSED(main), ReportList *UNUSED(reports), - const char *UNUSED(name), bSound *UNUSED(sound), int UNUSED(channel), int UNUSED(start_frame)) +static Sequence *rna_Sequences_new_sound(ID *UNUSED(id), Editing *UNUSED(ed), Main *UNUSED(bmain), ReportList *reports, + const char *UNUSED(name), const char *UNUSED(file), int UNUSED(channel), int UNUSED(start_frame)) { BKE_report(reports, RPT_ERROR, "Blender compiled without Audaspace support."); return NULL; From bb2b1694abca9e1a2a130647aca642020ccd502f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 15:24:26 +0000 Subject: [PATCH 013/159] workaround for python3.3 alpha with the console. --- release/scripts/startup/bl_operators/console.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_operators/console.py b/release/scripts/startup/bl_operators/console.py index 099cb02564d..ff87f98658d 100644 --- a/release/scripts/startup/bl_operators/console.py +++ b/release/scripts/startup/bl_operators/console.py @@ -24,7 +24,9 @@ from bpy.props import StringProperty def _lang_module_get(sc): - return __import__("console_" + sc.language) + return __import__("console_" + sc.language, + # for python 3.3, maybe a bug??? + level=0) class ConsoleExec(Operator): From 2c23bb838979131667c922df1f01738e02e6ca16 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 15:26:11 +0000 Subject: [PATCH 014/159] rna function Image.scale(w, h), useful for utility functions to open/scale/save images. --- source/blender/blenkernel/BKE_image.h | 3 +++ source/blender/blenkernel/intern/image.c | 14 ++++++++++++++ source/blender/makesrna/intern/rna_image_api.c | 12 ++++++++++++ 3 files changed, 29 insertions(+) diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 97b724c09e4..91e3e9edbf0 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -183,6 +183,9 @@ struct Image *BKE_image_copy(struct Image *ima); /* merge source into dest, and free source */ void BKE_image_merge(struct Image *dest, struct Image *source); +/* scale the image */ +void BKE_image_scale(struct Image *image, int width, int height); + /* check if texture has alpha (depth=32) */ int BKE_image_has_alpha(struct Image *image); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 6ee15409857..91eed8b0b60 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -505,6 +505,20 @@ void BKE_image_merge(Image *dest, Image *source) } } +/* note, we could be clever and scale all imbuf's but since some are mipmaps its not so simple */ +void BKE_image_scale(Image *image, int width, int height) +{ + ImBuf *ibuf; + void *lock; + + ibuf = BKE_image_acquire_ibuf(image, NULL, &lock); + + IMB_scaleImBuf(ibuf, width, height); + ibuf->userflags |= IB_BITMAPDIRTY; + + BKE_image_release_ibuf(image, lock); +} + Image *BKE_image_load(const char *filepath) { Image *ima; diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c index f191303a92c..3d937fc561d 100644 --- a/source/blender/makesrna/intern/rna_image_api.c +++ b/source/blender/makesrna/intern/rna_image_api.c @@ -178,6 +178,11 @@ static void rna_Image_update(Image *image, ReportList *reports) IMB_rect_from_float(ibuf); } +static void rna_Image_scale(Image *image, int width, int height) +{ + BKE_image_scale(image, width, height); +} + static int rna_Image_gl_load(Image *image, ReportList *reports, int filter, int mag) { ImBuf *ibuf; @@ -262,6 +267,13 @@ void RNA_api_image(StructRNA *srna) RNA_def_function_ui_description(func, "Update the display image from the floating point buffer"); RNA_def_function_flag(func, FUNC_USE_REPORTS); + func = RNA_def_function(srna, "scale", "rna_Image_scale"); + RNA_def_function_ui_description(func, "Scale the image in pixels"); + parm = RNA_def_int(func, "width", 0, 1, 10000, "", "Width", 1, 10000); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm = RNA_def_int(func, "height", 0, 1, 10000, "", "Height", 1, 10000); + RNA_def_property_flag(parm, PROP_REQUIRED); + func = RNA_def_function(srna, "gl_load", "rna_Image_gl_load"); RNA_def_function_ui_description(func, "Load the image into OpenGL graphics memory"); RNA_def_function_flag(func, FUNC_USE_REPORTS); From b5a6afd7678f0388341b1684fba8e23c506acce7 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Thu, 17 May 2012 17:16:51 +0000 Subject: [PATCH 015/159] Enable remesh modifier for curves. --- source/blender/modifiers/intern/MOD_remesh.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c index 37bfd0e6f45..517791e3e73 100644 --- a/source/blender/modifiers/intern/MOD_remesh.c +++ b/source/blender/modifiers/intern/MOD_remesh.c @@ -212,6 +212,7 @@ ModifierTypeInfo modifierType_Remesh = { /* structSize */ sizeof(RemeshModifierData), /* type */ eModifierTypeType_Nonconstructive, /* flags */ eModifierTypeFlag_AcceptsMesh | + eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, /* deformVerts */ NULL, From 18b795b476d7189834b5e85d1aef0016752904d1 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Thu, 17 May 2012 22:47:05 +0000 Subject: [PATCH 016/159] Don't link compositor with blender player. --- source/blender/compositor/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/compositor/SConscript b/source/blender/compositor/SConscript index 08fe1ea5e19..af0d4109acc 100644 --- a/source/blender/compositor/SConscript +++ b/source/blender/compositor/SConscript @@ -11,4 +11,4 @@ incs += '../opencl ../nodes ../nodes/intern ../nodes/composite ' if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] -env.BlenderLib ( 'bf_composite', sources, Split(incs), defines=defs, libtype=['core','player'], priority = [191,191] ) +env.BlenderLib ( 'bf_composite', sources, Split(incs), defines=defs, libtype=['core'], priority = [191] ) From 69b95e1a8a00c9ff146d803b8ec11183d7a68908 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Thu, 17 May 2012 22:52:42 +0000 Subject: [PATCH 017/159] Code cleanup: de-duplicate some transform constraint code. No functional changes. --- source/blender/editors/transform/transform.c | 152 ++++++++----------- 1 file changed, 67 insertions(+), 85 deletions(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 88888e2169b..d07ae468f35 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -606,6 +606,72 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) return keymap; } +static void transform_event_xyz_constraint(TransInfo *t, short key_type, char cmode) +{ + if (!(t->flag & T_NO_CONSTRAINT)) { + int constraint_axis, constraint_plane; + int edit_2d = (t->flag & T_2D_EDIT); + char msg1[] = "along _"; + char msg2[] = "along %s _"; + char msg3[] = "locking %s _"; + char axis; + + /* Initialize */ + switch(key_type) { + case XKEY: + axis = 'X'; + constraint_axis = CON_AXIS0; + break; + case YKEY: + axis = 'Y'; + constraint_axis = CON_AXIS1; + break; + case ZKEY: + axis = 'Z'; + constraint_axis = CON_AXIS2; + break; + default: + /* Invalid key */ + return; + } + msg1[sizeof(msg1) - 2] = axis; + msg2[sizeof(msg2) - 2] = axis; + msg3[sizeof(msg3) - 2] = axis; + constraint_plane = ((CON_AXIS0 | CON_AXIS1 | CON_AXIS2) & + (~constraint_axis)); + + if (edit_2d && (key_type != ZKEY)) { + if (cmode == axis) { + stopConstraint(t); + } + else { + setUserConstraint(t, V3D_MANIP_GLOBAL, constraint_axis, msg1); + } + } + else if (!edit_2d) { + if (cmode == axis) { + if (t->con.orientation != V3D_MANIP_GLOBAL) { + stopConstraint(t); + } + else { + short orientation = (t->current_orientation != V3D_MANIP_GLOBAL ? + t->current_orientation : V3D_MANIP_LOCAL); + if (!(t->modifiers & MOD_CONSTRAINT_PLANE)) + setUserConstraint(t, orientation, constraint_axis, msg2); + else if (t->modifiers & MOD_CONSTRAINT_PLANE) + setUserConstraint(t, orientation, constraint_plane, msg3); + } + } + else { + if (!(t->modifiers & MOD_CONSTRAINT_PLANE)) + setUserConstraint(t, V3D_MANIP_GLOBAL, constraint_axis, msg2); + else if (t->modifiers & MOD_CONSTRAINT_PLANE) + setUserConstraint(t, V3D_MANIP_GLOBAL, constraint_plane, msg3); + } + } + t->redraw |= TREDRAW_HARD; + } +} int transformEvent(TransInfo *t, wmEvent *event) { @@ -950,93 +1016,9 @@ int transformEvent(TransInfo *t, wmEvent *event) } break; case XKEY: - if ((t->flag & T_NO_CONSTRAINT)==0) { - if (t->flag & T_2D_EDIT) { - if (cmode == 'X') { - stopConstraint(t); - } - else { - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0), "along X"); - } - } - else { - if (cmode == 'X') { - if (t->con.orientation != V3D_MANIP_GLOBAL) { - stopConstraint(t); - } - else { - short orientation = t->current_orientation != V3D_MANIP_GLOBAL ? t->current_orientation : V3D_MANIP_LOCAL; - if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0) - setUserConstraint(t, orientation, (CON_AXIS0), "along %s X"); - else if (t->modifiers & MOD_CONSTRAINT_PLANE) - setUserConstraint(t, orientation, (CON_AXIS1|CON_AXIS2), "locking %s X"); - } - } - else { - if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0) - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0), "along %s X"); - else if (t->modifiers & MOD_CONSTRAINT_PLANE) - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1|CON_AXIS2), "locking %s X"); - } - } - t->redraw |= TREDRAW_HARD; - } - break; case YKEY: - if ((t->flag & T_NO_CONSTRAINT)==0) { - if (t->flag & T_2D_EDIT) { - if (cmode == 'Y') { - stopConstraint(t); - } - else { - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1), "along Y"); - } - } - else { - if (cmode == 'Y') { - if (t->con.orientation != V3D_MANIP_GLOBAL) { - stopConstraint(t); - } - else { - short orientation = t->current_orientation != V3D_MANIP_GLOBAL ? t->current_orientation : V3D_MANIP_LOCAL; - if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0) - setUserConstraint(t, orientation, (CON_AXIS1), "along %s Y"); - else if (t->modifiers & MOD_CONSTRAINT_PLANE) - setUserConstraint(t, orientation, (CON_AXIS0|CON_AXIS2), "locking %s Y"); - } - } - else { - if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0) - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1), "along %s Y"); - else if (t->modifiers & MOD_CONSTRAINT_PLANE) - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0|CON_AXIS2), "locking %s Y"); - } - } - t->redraw |= TREDRAW_HARD; - } - break; case ZKEY: - if ((t->flag & (T_NO_CONSTRAINT|T_2D_EDIT))==0) { - if (cmode == 'Z') { - if (t->con.orientation != V3D_MANIP_GLOBAL) { - stopConstraint(t); - } - else { - short orientation = t->current_orientation != V3D_MANIP_GLOBAL ? t->current_orientation : V3D_MANIP_LOCAL; - if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0) - setUserConstraint(t, orientation, (CON_AXIS2), "along %s Z"); - else if (t->modifiers & MOD_CONSTRAINT_PLANE) - setUserConstraint(t, orientation, (CON_AXIS0|CON_AXIS1), "locking %s Z"); - } - } - else { - if ((t->modifiers & MOD_CONSTRAINT_PLANE) == 0) - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS2), "along %s Z"); - else if (t->modifiers & MOD_CONSTRAINT_PLANE) - setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0|CON_AXIS1), "locking %s Z"); - } - t->redraw |= TREDRAW_HARD; - } + transform_event_xyz_constraint(t, event->type, cmode); break; case OKEY: if (t->flag & T_PROP_EDIT && event->shift) { From 7862b2fa13c0437d9c17eae78e7b79a421dacf05 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 22:55:28 +0000 Subject: [PATCH 018/159] style cleanup: compositor, pointer syntax, function brace placement, line length --- source/blender/compositor/COM_compositor.h | 78 +++++++---- .../compositor/intern/COM_CPUDevice.cpp | 3 +- .../compositor/intern/COM_ChannelInfo.cpp | 3 +- .../compositor/intern/COM_ChunkOrder.cpp | 11 +- .../intern/COM_ChunkOrderHotspot.cpp | 6 +- .../intern/COM_CompositorContext.cpp | 9 +- .../compositor/intern/COM_CompositorContext.h | 10 +- .../compositor/intern/COM_Converter.cpp | 13 +- .../blender/compositor/intern/COM_Converter.h | 6 +- .../compositor/intern/COM_ExecutionGroup.cpp | 100 ++++++++------ .../compositor/intern/COM_ExecutionGroup.h | 24 ++-- .../compositor/intern/COM_ExecutionSystem.cpp | 61 +++++---- .../compositor/intern/COM_ExecutionSystem.h | 10 +- .../intern/COM_ExecutionSystemHelper.cpp | 65 +++++---- .../intern/COM_ExecutionSystemHelper.h | 14 +- .../compositor/intern/COM_InputSocket.cpp | 62 ++++++--- .../compositor/intern/COM_InputSocket.h | 20 +-- .../compositor/intern/COM_MemoryBuffer.cpp | 51 ++++--- .../compositor/intern/COM_MemoryBuffer.h | 20 +-- .../compositor/intern/COM_MemoryManager.cpp | 20 ++- .../compositor/intern/COM_MemoryManager.h | 6 +- .../intern/COM_MemoryManagerState.cpp | 19 ++- .../intern/COM_MemoryManagerState.h | 4 +- .../compositor/intern/COM_MemoryProxy.cpp | 6 +- .../compositor/intern/COM_MemoryProxy.h | 8 +- source/blender/compositor/intern/COM_Node.cpp | 45 ++++--- source/blender/compositor/intern/COM_Node.h | 28 ++-- .../compositor/intern/COM_NodeBase.cpp | 48 ++++--- .../blender/compositor/intern/COM_NodeBase.h | 14 +- .../compositor/intern/COM_NodeOperation.cpp | 41 +++--- .../compositor/intern/COM_NodeOperation.h | 12 +- .../compositor/intern/COM_OpenCLDevice.cpp | 12 +- .../compositor/intern/COM_OutputSocket.cpp | 48 ++++--- .../compositor/intern/COM_OutputSocket.h | 6 +- .../blender/compositor/intern/COM_Socket.cpp | 11 +- source/blender/compositor/intern/COM_Socket.h | 12 +- .../intern/COM_SocketConnection.cpp | 29 ++-- .../compositor/intern/COM_SocketConnection.h | 8 +- .../compositor/intern/COM_SocketReader.h | 18 +-- .../compositor/intern/COM_WorkPackage.cpp | 3 +- .../compositor/intern/COM_WorkPackage.h | 6 +- .../compositor/intern/COM_WorkScheduler.cpp | 54 ++++---- .../compositor/intern/COM_WorkScheduler.h | 6 +- .../compositor/intern/COM_compositor.cpp | 5 +- .../compositor/nodes/COM_AlphaOverNode.cpp | 7 +- .../compositor/nodes/COM_AlphaOverNode.h | 2 +- .../nodes/COM_BilateralBlurNode.cpp | 6 +- .../compositor/nodes/COM_BilateralBlurNode.h | 2 +- .../blender/compositor/nodes/COM_BlurNode.cpp | 8 +- .../blender/compositor/nodes/COM_BlurNode.h | 2 +- .../compositor/nodes/COM_BokehBlurNode.cpp | 8 +- .../compositor/nodes/COM_BokehBlurNode.h | 2 +- .../compositor/nodes/COM_BokehImageNode.cpp | 6 +- .../compositor/nodes/COM_BokehImageNode.h | 2 +- .../compositor/nodes/COM_BoxMaskNode.cpp | 6 +- .../compositor/nodes/COM_BoxMaskNode.h | 2 +- .../compositor/nodes/COM_BrightnessNode.cpp | 6 +- .../compositor/nodes/COM_BrightnessNode.h | 2 +- .../compositor/nodes/COM_ChannelMatteNode.cpp | 5 +- .../compositor/nodes/COM_ChromaMatteNode.cpp | 5 +- .../compositor/nodes/COM_ColorBalanceNode.cpp | 11 +- .../compositor/nodes/COM_ColorBalanceNode.h | 4 +- .../nodes/COM_ColorCorrectionNode.cpp | 8 +- .../nodes/COM_ColorCorrectionNode.h | 2 +- .../compositor/nodes/COM_ColorCurveNode.cpp | 6 +- .../compositor/nodes/COM_ColorCurveNode.h | 2 +- .../compositor/nodes/COM_ColorMatteNode.cpp | 5 +- .../compositor/nodes/COM_ColorNode.cpp | 8 +- .../blender/compositor/nodes/COM_ColorNode.h | 2 +- .../compositor/nodes/COM_ColorRampNode.cpp | 9 +- .../compositor/nodes/COM_ColorRampNode.h | 4 +- .../compositor/nodes/COM_ColorSpillNode.cpp | 5 +- .../compositor/nodes/COM_ColorToBWNode.cpp | 6 +- .../compositor/nodes/COM_CombineHSVANode.cpp | 6 +- .../compositor/nodes/COM_CombineRGBANode.cpp | 6 +- .../compositor/nodes/COM_CombineYCCANode.cpp | 6 +- .../compositor/nodes/COM_CombineYUVANode.cpp | 6 +- .../compositor/nodes/COM_CompositorNode.cpp | 6 +- .../compositor/nodes/COM_ConvertAlphaNode.cpp | 7 +- .../compositor/nodes/COM_ConvertAlphaNode.h | 2 +- .../blender/compositor/nodes/COM_CropNode.cpp | 8 +- .../blender/compositor/nodes/COM_CropNode.h | 2 +- .../compositor/nodes/COM_DefocusNode.cpp | 12 +- .../compositor/nodes/COM_DefocusNode.h | 2 +- .../nodes/COM_DifferenceMatteNode.cpp | 7 +- .../nodes/COM_DifferenceMatteNode.h | 4 +- .../compositor/nodes/COM_DilateErodeNode.cpp | 8 +- .../compositor/nodes/COM_DilateErodeNode.h | 2 +- .../nodes/COM_DirectionalBlurNode.cpp | 6 +- .../nodes/COM_DirectionalBlurNode.h | 2 +- .../compositor/nodes/COM_DisplaceNode.cpp | 3 +- .../nodes/COM_DistanceMatteNode.cpp | 5 +- .../nodes/COM_DoubleEdgeMaskNode.cpp | 8 +- .../compositor/nodes/COM_DoubleEdgeMaskNode.h | 2 +- .../compositor/nodes/COM_EllipseMaskNode.cpp | 6 +- .../compositor/nodes/COM_EllipseMaskNode.h | 2 +- .../compositor/nodes/COM_FilterNode.cpp | 5 +- .../blender/compositor/nodes/COM_FilterNode.h | 4 +- .../blender/compositor/nodes/COM_FlipNode.cpp | 6 +- .../blender/compositor/nodes/COM_FlipNode.h | 2 +- .../compositor/nodes/COM_GammaNode.cpp | 6 +- .../blender/compositor/nodes/COM_GammaNode.h | 2 +- .../compositor/nodes/COM_GlareNode.cpp | 10 +- .../blender/compositor/nodes/COM_GlareNode.h | 2 +- .../compositor/nodes/COM_GroupNode.cpp | 11 +- .../blender/compositor/nodes/COM_GroupNode.h | 2 +- .../COM_HueSaturationValueCorrectNode.cpp | 8 +- .../nodes/COM_HueSaturationValueNode.cpp | 8 +- .../compositor/nodes/COM_IDMaskNode.cpp | 8 +- .../blender/compositor/nodes/COM_IDMaskNode.h | 2 +- .../compositor/nodes/COM_ImageNode.cpp | 11 +- .../blender/compositor/nodes/COM_ImageNode.h | 4 +- .../compositor/nodes/COM_InvertNode.cpp | 8 +- .../blender/compositor/nodes/COM_InvertNode.h | 2 +- .../nodes/COM_LensDistortionNode.cpp | 8 +- .../compositor/nodes/COM_LensDistortionNode.h | 2 +- .../nodes/COM_LuminanceMatteNode.cpp | 5 +- .../compositor/nodes/COM_MapUVNode.cpp | 8 +- .../compositor/nodes/COM_MapValueNode.cpp | 8 +- .../blender/compositor/nodes/COM_MathNode.cpp | 5 +- .../blender/compositor/nodes/COM_MathNode.h | 2 +- .../blender/compositor/nodes/COM_MixNode.cpp | 8 +- .../compositor/nodes/COM_MovieClipNode.cpp | 10 +- .../compositor/nodes/COM_MovieClipNode.h | 2 +- .../nodes/COM_MovieDistortionNode.cpp | 8 +- .../nodes/COM_MovieDistortionNode.h | 2 +- .../blender/compositor/nodes/COM_MuteNode.cpp | 9 +- .../blender/compositor/nodes/COM_MuteNode.h | 4 +- .../compositor/nodes/COM_NormalNode.cpp | 7 +- .../blender/compositor/nodes/COM_NormalNode.h | 4 +- .../compositor/nodes/COM_NormalizeNode.cpp | 6 +- .../compositor/nodes/COM_NormalizeNode.h | 2 +- .../compositor/nodes/COM_OutputFileNode.cpp | 8 +- .../compositor/nodes/COM_RenderLayersNode.cpp | 11 +- .../compositor/nodes/COM_RenderLayersNode.h | 4 +- .../compositor/nodes/COM_RotateNode.cpp | 6 +- .../blender/compositor/nodes/COM_RotateNode.h | 2 +- .../compositor/nodes/COM_ScaleNode.cpp | 10 +- .../blender/compositor/nodes/COM_ScaleNode.h | 2 +- .../compositor/nodes/COM_SeparateHSVANode.cpp | 6 +- .../compositor/nodes/COM_SeparateRGBANode.cpp | 14 +- .../compositor/nodes/COM_SeparateYCCANode.cpp | 6 +- .../compositor/nodes/COM_SeparateYUVANode.cpp | 6 +- .../compositor/nodes/COM_SetAlphaNode.cpp | 5 +- .../compositor/nodes/COM_SetAlphaNode.h | 2 +- .../compositor/nodes/COM_SocketProxyNode.cpp | 9 +- .../compositor/nodes/COM_SocketProxyNode.h | 4 +- .../compositor/nodes/COM_SplitViewerNode.cpp | 8 +- .../compositor/nodes/COM_Stabilize2dNode.cpp | 8 +- .../compositor/nodes/COM_Stabilize2dNode.h | 2 +- .../compositor/nodes/COM_SwitchNode.cpp | 6 +- .../compositor/nodes/COM_TextureNode.cpp | 14 +- .../compositor/nodes/COM_TextureNode.h | 2 +- .../blender/compositor/nodes/COM_TimeNode.cpp | 14 +- .../blender/compositor/nodes/COM_TimeNode.h | 2 +- .../compositor/nodes/COM_TonemapNode.cpp | 8 +- .../compositor/nodes/COM_TonemapNode.h | 2 +- .../compositor/nodes/COM_TransformNode.cpp | 6 +- .../compositor/nodes/COM_TransformNode.h | 2 +- .../compositor/nodes/COM_TranslateNode.cpp | 6 +- .../compositor/nodes/COM_TranslateNode.h | 2 +- .../compositor/nodes/COM_ValueNode.cpp | 8 +- .../blender/compositor/nodes/COM_ValueNode.h | 2 +- .../compositor/nodes/COM_VectorBlurNode.cpp | 10 +- .../compositor/nodes/COM_VectorBlurNode.h | 2 +- .../compositor/nodes/COM_VectorCurveNode.cpp | 6 +- .../compositor/nodes/COM_VectorCurveNode.h | 2 +- .../compositor/nodes/COM_ViewLevelsNode.cpp | 8 +- .../compositor/nodes/COM_ViewLevelsNode.h | 2 +- .../compositor/nodes/COM_ViewerNode.cpp | 10 +- .../compositor/nodes/COM_ZCombineNode.cpp | 3 +- .../compositor/nodes/COM_ZCombineNode.h | 2 +- .../operations/COM_AlphaOverKeyOperation.cpp | 22 ++-- .../operations/COM_AlphaOverKeyOperation.h | 2 +- .../COM_AlphaOverMixedOperation.cpp | 24 ++-- .../operations/COM_AlphaOverMixedOperation.h | 2 +- .../COM_AlphaOverPremultiplyOperation.cpp | 18 +-- .../COM_AlphaOverPremultiplyOperation.h | 2 +- .../operations/COM_AntiAliasOperation.cpp | 26 ++-- .../operations/COM_AntiAliasOperation.h | 4 +- .../operations/COM_BilateralBlurOperation.cpp | 15 ++- .../operations/COM_BilateralBlurOperation.h | 8 +- .../operations/COM_BlurBaseOperation.cpp | 34 ++--- .../operations/COM_BlurBaseOperation.h | 8 +- .../operations/COM_BokehBlurOperation.cpp | 26 ++-- .../operations/COM_BokehBlurOperation.h | 10 +- .../operations/COM_BokehImageOperation.cpp | 21 ++- .../operations/COM_BokehImageOperation.h | 2 +- .../operations/COM_BoxMaskOperation.cpp | 12 +- .../operations/COM_BoxMaskOperation.h | 2 +- .../operations/COM_BrightnessOperation.cpp | 12 +- .../operations/COM_BrightnessOperation.h | 8 +- .../operations/COM_CalculateMeanOperation.cpp | 27 ++-- .../operations/COM_CalculateMeanOperation.h | 6 +- ...OM_CalculateStandardDeviationOperation.cpp | 13 +- .../COM_CalculateStandardDeviationOperation.h | 4 +- .../operations/COM_ChangeHSVOperation.cpp | 12 +- .../operations/COM_ChangeHSVOperation.h | 2 +- .../operations/COM_ChannelMatteOperation.cpp | 14 +- .../operations/COM_ChannelMatteOperation.h | 4 +- .../operations/COM_ChromaMatteOperation.cpp | 18 ++- .../operations/COM_ChromaMatteOperation.h | 4 +- .../COM_ColorBalanceASCCDLOperation.cpp | 14 +- .../COM_ColorBalanceASCCDLOperation.h | 2 +- .../COM_ColorBalanceLGGOperation.cpp | 16 ++- .../operations/COM_ColorBalanceLGGOperation.h | 2 +- .../COM_ColorCorrectionOperation.cpp | 20 +-- .../operations/COM_ColorCorrectionOperation.h | 6 +- .../operations/COM_ColorCurveOperation.cpp | 30 +++-- .../operations/COM_ColorCurveOperation.h | 2 +- .../operations/COM_ColorMatteOperation.cpp | 32 +++-- .../operations/COM_ColorMatteOperation.h | 4 +- .../operations/COM_ColorRampOperation.cpp | 12 +- .../operations/COM_ColorRampOperation.h | 6 +- .../operations/COM_ColorSpillOperation.cpp | 20 ++- .../operations/COM_ColorSpillOperation.h | 4 +- .../COM_CombineChannelsOperation.cpp | 12 +- .../operations/COM_CompositorOperation.cpp | 25 ++-- .../operations/COM_CompositorOperation.h | 12 +- .../COM_ConvertColorProfileOperation.cpp | 12 +- .../COM_ConvertColorProfileOperation.h | 2 +- .../COM_ConvertColorToBWOperation.cpp | 12 +- .../COM_ConvertColorToBWOperation.h | 2 +- .../COM_ConvertColorToVectorOperation.cpp | 12 +- .../COM_ConvertColorToVectorOperation.h | 2 +- .../COM_ConvertColourToValueProg.cpp | 12 +- .../operations/COM_ConvertColourToValueProg.h | 2 +- .../COM_ConvertDepthToRadiusOperation.cpp | 19 ++- .../COM_ConvertDepthToRadiusOperation.h | 4 +- .../COM_ConvertHSVToRGBOperation.cpp | 12 +- .../operations/COM_ConvertHSVToRGBOperation.h | 2 +- .../COM_ConvertKeyToPremulOperation.cpp | 12 +- .../COM_ConvertKeyToPremulOperation.h | 2 +- .../COM_ConvertPremulToKeyOperation.cpp | 18 ++- .../COM_ConvertPremulToKeyOperation.h | 2 +- .../COM_ConvertRGBToHSVOperation.cpp | 12 +- .../operations/COM_ConvertRGBToHSVOperation.h | 2 +- .../COM_ConvertRGBToYCCOperation.cpp | 15 ++- .../operations/COM_ConvertRGBToYCCOperation.h | 2 +- .../COM_ConvertRGBToYUVOperation.cpp | 12 +- .../operations/COM_ConvertRGBToYUVOperation.h | 2 +- .../COM_ConvertValueToColourProg.cpp | 12 +- .../operations/COM_ConvertValueToColourProg.h | 4 +- .../COM_ConvertValueToVectorOperation.cpp | 12 +- .../COM_ConvertValueToVectorOperation.h | 2 +- .../COM_ConvertVectorToColorOperation.cpp | 12 +- .../COM_ConvertVectorToColorOperation.h | 2 +- .../COM_ConvertVectorToValueOperation.cpp | 12 +- .../COM_ConvertVectorToValueOperation.h | 2 +- .../COM_ConvertYCCToRGBOperation.cpp | 15 ++- .../operations/COM_ConvertYCCToRGBOperation.h | 2 +- .../COM_ConvertYUVToRGBOperation.cpp | 12 +- .../operations/COM_ConvertYUVToRGBOperation.h | 2 +- .../COM_ConvolutionEdgeFilterOperation.cpp | 9 +- .../COM_ConvolutionEdgeFilterOperation.h | 2 +- .../COM_ConvolutionFilterOperation.cpp | 18 ++- .../COM_ConvolutionFilterOperation.h | 4 +- .../operations/COM_CropOperation.cpp | 38 ++++-- .../compositor/operations/COM_CropOperation.h | 2 +- .../operations/COM_CurveBaseOperation.cpp | 6 +- .../operations/COM_CurveBaseOperation.h | 2 +- .../COM_DifferenceMatteOperation.cpp | 24 ++-- .../operations/COM_DifferenceMatteOperation.h | 8 +- .../operations/COM_DilateErodeOperation.cpp | 26 ++-- .../operations/COM_DilateErodeOperation.h | 4 +- .../COM_DirectionalBlurOperation.cpp | 41 +++--- .../operations/COM_DirectionalBlurOperation.h | 6 +- .../operations/COM_DisplaceOperation.cpp | 14 +- .../operations/COM_DisplaceOperation.h | 10 +- .../COM_DisplaceSimpleOperation.cpp | 14 +- .../operations/COM_DisplaceSimpleOperation.h | 10 +- .../operations/COM_DistanceMatteOperation.cpp | 16 ++- .../operations/COM_DistanceMatteOperation.h | 4 +- .../operations/COM_DotproductOperation.cpp | 12 +- .../COM_DoubleEdgeMaskOperation.cpp | 124 ++++++++++-------- .../operations/COM_DoubleEdgeMaskOperation.h | 8 +- .../operations/COM_EllipseMaskOperation.cpp | 12 +- .../operations/COM_EllipseMaskOperation.h | 2 +- .../COM_FastGaussianBlurOperation.cpp | 18 ++- .../COM_FastGaussianBlurOperation.h | 2 +- .../operations/COM_FlipOperation.cpp | 15 ++- .../operations/COM_FogGlowImageOperation.cpp | 9 +- .../operations/COM_FogGlowImageOperation.h | 2 +- .../operations/COM_GammaCorrectOperation.cpp | 24 ++-- .../operations/COM_GammaCorrectOperation.h | 4 +- .../operations/COM_GammaOperation.cpp | 12 +- .../operations/COM_GammaOperation.h | 4 +- .../COM_GaussianBokehBlurOperation.cpp | 60 +++++---- .../COM_GaussianBokehBlurOperation.h | 6 +- .../operations/COM_GaussianXBlurOperation.cpp | 27 ++-- .../operations/COM_GaussianXBlurOperation.h | 6 +- .../operations/COM_GaussianYBlurOperation.cpp | 27 ++-- .../operations/COM_GaussianYBlurOperation.h | 6 +- .../operations/COM_GlareBaseOperation.cpp | 24 ++-- .../operations/COM_GlareBaseOperation.h | 8 +- .../COM_GlareSimpleStarOperation.cpp | 7 +- .../operations/COM_GlareStreaksOperation.cpp | 11 +- .../COM_GlareThresholdOperation.cpp | 12 +- .../operations/COM_GlareThresholdOperation.h | 2 +- ...COM_HueSaturationValueCorrectOperation.cpp | 20 +-- .../COM_HueSaturationValueCorrectOperation.h | 2 +- .../operations/COM_IDMaskOperation.cpp | 12 +- .../operations/COM_IDMaskOperation.h | 4 +- .../operations/COM_ImageOperation.cpp | 41 +++--- .../operations/COM_ImageOperation.h | 12 +- .../operations/COM_InvertOperation.cpp | 12 +- .../operations/COM_InvertOperation.h | 2 +- .../operations/COM_LensGhostOperation.cpp | 104 ++++++++------- .../operations/COM_LensGhostOperation.h | 18 +-- .../operations/COM_LensGlowImageOperation.cpp | 15 ++- .../operations/COM_LensGlowImageOperation.h | 2 +- .../operations/COM_LensGlowOperation.cpp | 12 +- .../operations/COM_LensGlowOperation.h | 6 +- .../COM_LuminanceMatteOperation.cpp | 14 +- .../operations/COM_LuminanceMatteOperation.h | 4 +- .../operations/COM_MapUVOperation.cpp | 49 +++---- .../operations/COM_MapUVOperation.h | 6 +- .../operations/COM_MapValueOperation.cpp | 18 ++- .../operations/COM_MapValueOperation.h | 4 +- .../operations/COM_MathBaseOperation.cpp | 80 ++++++----- .../operations/COM_MathBaseOperation.h | 36 ++--- .../operations/COM_MixAddOperation.cpp | 6 +- .../operations/COM_MixAddOperation.h | 2 +- .../operations/COM_MixBaseOperation.cpp | 19 ++- .../operations/COM_MixBaseOperation.h | 8 +- .../operations/COM_MixBlendOperation.cpp | 8 +- .../operations/COM_MixBlendOperation.h | 2 +- .../operations/COM_MixBurnOperation.cpp | 8 +- .../operations/COM_MixBurnOperation.h | 2 +- .../operations/COM_MixColorOperation.cpp | 8 +- .../operations/COM_MixColorOperation.h | 2 +- .../operations/COM_MixDarkenOperation.cpp | 14 +- .../operations/COM_MixDarkenOperation.h | 2 +- .../operations/COM_MixDifferenceOperation.cpp | 8 +- .../operations/COM_MixDifferenceOperation.h | 2 +- .../operations/COM_MixDivideOperation.cpp | 14 +- .../operations/COM_MixDivideOperation.h | 2 +- .../operations/COM_MixDodgeOperation.cpp | 6 +- .../operations/COM_MixDodgeOperation.h | 2 +- .../operations/COM_MixHueOperation.cpp | 8 +- .../operations/COM_MixHueOperation.h | 2 +- .../operations/COM_MixLightenOperation.cpp | 12 +- .../operations/COM_MixLightenOperation.h | 2 +- .../COM_MixLinearLightOperation.cpp | 6 +- .../operations/COM_MixLinearLightOperation.h | 2 +- .../operations/COM_MixMultiplyOperation.cpp | 8 +- .../operations/COM_MixMultiplyOperation.h | 2 +- .../operations/COM_MixOverlayOperation.cpp | 8 +- .../operations/COM_MixOverlayOperation.h | 2 +- .../operations/COM_MixSaturationOperation.cpp | 8 +- .../operations/COM_MixSaturationOperation.h | 2 +- .../operations/COM_MixScreenOperation.cpp | 8 +- .../operations/COM_MixScreenOperation.h | 2 +- .../operations/COM_MixSoftLightOperation.cpp | 8 +- .../operations/COM_MixSoftLightOperation.h | 2 +- .../operations/COM_MixSubtractOperation.cpp | 6 +- .../operations/COM_MixSubtractOperation.h | 2 +- .../operations/COM_MixValueOperation.cpp | 8 +- .../operations/COM_MixValueOperation.h | 2 +- .../COM_MovieClipAttributeOperation.cpp | 9 +- .../COM_MovieClipAttributeOperation.h | 4 +- .../operations/COM_MovieClipOperation.cpp | 19 ++- .../operations/COM_MovieClipOperation.h | 8 +- .../COM_MovieDistortionOperation.cpp | 19 ++- .../operations/COM_MovieDistortionOperation.h | 8 +- .../COM_MultilayerImageOperation.cpp | 17 ++- .../operations/COM_MultilayerImageOperation.h | 4 +- .../operations/COM_NormalizeOperation.cpp | 26 ++-- .../operations/COM_NormalizeOperation.h | 4 +- .../operations/COM_OpenCLKernels.cl.cpp | 2 +- .../operations/COM_OutputFileOperation.cpp | 23 ++-- .../operations/COM_OutputFileOperation.h | 8 +- .../operations/COM_PreviewOperation.cpp | 27 ++-- .../operations/COM_PreviewOperation.h | 10 +- .../COM_ProjectorLensDistortionOperation.cpp | 20 ++- .../COM_ProjectorLensDistortionOperation.h | 6 +- .../operations/COM_QualityStepHelper.cpp | 6 +- .../operations/COM_QualityStepHelper.h | 10 +- .../operations/COM_ReadBufferOperation.cpp | 18 ++- .../operations/COM_ReadBufferOperation.h | 12 +- .../COM_RenderLayersAOOperation.cpp | 3 +- .../operations/COM_RenderLayersAlphaProg.cpp | 6 +- .../operations/COM_RenderLayersAlphaProg.h | 2 +- .../operations/COM_RenderLayersBaseProg.cpp | 65 ++++----- .../operations/COM_RenderLayersBaseProg.h | 12 +- .../COM_RenderLayersColorOperation.cpp | 3 +- .../COM_RenderLayersCyclesOperation.cpp | 3 +- .../operations/COM_RenderLayersDepthProg.cpp | 3 +- .../COM_RenderLayersDiffuseOperation.cpp | 3 +- .../COM_RenderLayersEmitOperation.cpp | 3 +- .../COM_RenderLayersEnvironmentOperation.cpp | 3 +- .../operations/COM_RenderLayersImageProg.cpp | 3 +- .../COM_RenderLayersIndirectOperation.cpp | 3 +- ...COM_RenderLayersMaterialIndexOperation.cpp | 3 +- .../COM_RenderLayersMistOperation.cpp | 3 +- .../COM_RenderLayersNormalOperation.cpp | 3 +- .../COM_RenderLayersObjectIndexOperation.cpp | 3 +- .../COM_RenderLayersReflectionOperation.cpp | 3 +- .../COM_RenderLayersRefractionOperation.cpp | 3 +- .../COM_RenderLayersShadowOperation.cpp | 3 +- .../COM_RenderLayersSpecularOperation.cpp | 3 +- .../COM_RenderLayersSpeedOperation.cpp | 3 +- .../COM_RenderLayersUVOperation.cpp | 3 +- .../operations/COM_RotateOperation.cpp | 15 ++- .../operations/COM_ScaleOperation.cpp | 50 ++++--- .../COM_ScreenLensDistortionOperation.cpp | 35 +++-- .../COM_ScreenLensDistortionOperation.h | 10 +- .../COM_SeparateChannelOperation.cpp | 12 +- .../operations/COM_SetAlphaOperation.cpp | 12 +- .../operations/COM_SetAlphaOperation.h | 2 +- .../operations/COM_SetColorOperation.cpp | 9 +- .../operations/COM_SetColorOperation.h | 2 +- .../operations/COM_SetSamplerOperation.cpp | 12 +- .../operations/COM_SetSamplerOperation.h | 2 +- .../operations/COM_SetValueOperation.cpp | 9 +- .../operations/COM_SetValueOperation.h | 2 +- .../operations/COM_SetVectorOperation.cpp | 9 +- .../operations/COM_SetVectorOperation.h | 2 +- .../operations/COM_SocketProxyOperation.cpp | 12 +- .../operations/COM_SplitViewerOperation.cpp | 16 ++- .../operations/COM_SplitViewerOperation.h | 4 +- .../operations/COM_TextureOperation.cpp | 44 ++++--- .../operations/COM_TextureOperation.h | 4 +- .../operations/COM_TonemapOperation.cpp | 30 +++-- .../operations/COM_TonemapOperation.h | 8 +- .../operations/COM_TranslateOperation.cpp | 15 ++- .../COM_VariableSizeBokehBlurOperation.cpp | 21 +-- .../COM_VariableSizeBokehBlurOperation.h | 8 +- .../operations/COM_VectorBlurOperation.cpp | 31 +++-- .../operations/COM_VectorBlurOperation.h | 8 +- .../operations/COM_VectorCurveOperation.cpp | 14 +- .../operations/COM_VectorCurveOperation.h | 2 +- .../operations/COM_ViewerBaseOperation.cpp | 28 ++-- .../operations/COM_ViewerBaseOperation.h | 8 +- .../operations/COM_ViewerOperation.cpp | 16 ++- .../operations/COM_ViewerOperation.h | 4 +- .../operations/COM_WriteBufferOperation.cpp | 45 ++++--- .../operations/COM_WriteBufferOperation.h | 6 +- .../operations/COM_ZCombineOperation.cpp | 15 ++- .../operations/COM_ZCombineOperation.h | 12 +- .../blender/editors/sculpt_paint/paint_hide.c | 2 +- 441 files changed, 2927 insertions(+), 1972 deletions(-) diff --git a/source/blender/compositor/COM_compositor.h b/source/blender/compositor/COM_compositor.h index 2891d8cdfa0..b33a48464e1 100644 --- a/source/blender/compositor/COM_compositor.h +++ b/source/blender/compositor/COM_compositor.h @@ -26,7 +26,6 @@ #include "DNA_node_types.h" - /** * @defgroup Model The data model of the compositor * @defgroup Memory The memory management stuff @@ -38,7 +37,8 @@ * @mainpage Introduction of the Blender Compositor * * @section bcomp Blender compositor - * This project redesigns the interals of Blender's compositor. The project has been executed in 2011 by At Mind. At Mind is a technology company located in Amsterdam, The Netherlands. + * This project redesigns the interals of Blender's compositor. The project has been executed in 2011 by At Mind. + * At Mind is a technology company located in Amsterdam, The Netherlands. * The project has been crowdfunded. This code has been released under GPL2 to be used in Blender. * * @section goals The goals of the project @@ -47,32 +47,41 @@ * - Make the compositor work faster for you (workflow) * * @section speed Faster compositor - * The speedup has been done by making better use of the hardware Blenders is working on. The previous compositor only used a single threaded model to calculate a node. The only exception to this is the Defocus node. - * Only when it is possible to calculate two full nodes in parallel a second thread was used. Current workstations have 8-16 threads available, and most of the time these are idle. + * The speedup has been done by making better use of the hardware Blenders is working on. The previous compositor only + * used a single threaded model to calculate a node. The only exception to this is the Defocus node. + * Only when it is possible to calculate two full nodes in parallel a second thread was used. + * Current workstations have 8-16 threads available, and most of the time these are idle. * - * In the new compositor we want to use as much of threads as possible. Even new OpenCL capable GPU-hardware can be used for calculation. + * In the new compositor we want to use as much of threads as possible. Even new OpenCL capable GPU-hardware can be + * used for calculation. * * @section workflow Work faster - * The previous compositor only showed the final image. The compositor could wait a long time before seeing the result of his work. The new compositor will work in a way that it will focus on getting information back to the user. + * The previous compositor only showed the final image. The compositor could wait a long time before seeing the result + * of his work. The new compositor will work in a way that it will focus on getting information back to the user. * It will prioritise its work to get earlier user feedback. * * @page memory Memory model - * The main issue is the type of memory model to use. Blender is used by consumers and professionals. Ranging from low-end machines to very high-end machines. The system should work on high-end machines and on low-end machines. + * The main issue is the type of memory model to use. Blender is used by consumers and professionals. + * Ranging from low-end machines to very high-end machines. + * The system should work on high-end machines and on low-end machines. * * * @page executing Executing * @section prepare Prepare execution * - * during the preparation of the execution All ReadBufferOperation will receive an offset. this offset is used during execution as an optimization trick + * during the preparation of the execution All ReadBufferOperation will receive an offset. + * This offset is used during execution as an optimization trick * Next all operations will be initialized for execution @see NodeOperation.initExecution * Next all ExecutionGroup's will be initialized for execution @see ExecutionGroup.initExecution * this all is controlled from @see ExecutionSystem.execute * * @section priority Render priority - * Render priority is an priority of an output node. A user has a different need of Render priorities of output nodes than during editing. + * Render priority is an priority of an output node. A user has a different need of Render priorities of output nodes + * than during editing. * for example. the Active ViewerNode has top priority during editing, but during rendering a CompositeNode has. * All NodeOperation has a setting for their renderpriority, but only for output NodeOperation these have effect. - * In ExecutionSystem.execute all priorities are checked. For every priority the ExecutionGroup's are check if the priority do match. + * In ExecutionSystem.execute all priorities are checked. For every priority the ExecutionGroup's are check if the + * priority do match. * When match the ExecutionGroup will be executed (this happens in serial) * * @see ExecutionSystem.execute control of the Render priority @@ -82,7 +91,8 @@ * @section order Chunk order * * When a ExecutionGroup is executed, first the order of chunks are determined. - * The settings are stored in the ViewerNode inside the ExecutionGroup. ExecutionGroups that have no viewernode, will use a default one. + * The settings are stored in the ViewerNode inside the ExecutionGroup. ExecutionGroups that have no viewernode, + * will use a default one. * There are several possible chunk orders * - [@ref OrderOfChunks.COM_TO_CENTER_OUT]: Start calculating from a configurable point and order by nearest chunk * - [@ref OrderOfChunks.COM_TO_RANDOM]: Randomize all chunks. @@ -100,7 +110,8 @@ * @see OrderOfChunks * * @section interest Area of interest - * An ExecutionGroup can have dependancies to other ExecutionGroup's. Data passing from one ExecutionGroup to another one are stored in 'chunks'. + * An ExecutionGroup can have dependancies to other ExecutionGroup's. Data passing from one ExecutionGroup to another + * one are stored in 'chunks'. * If not all input chunks are available the chunk execution will not be scheduled. *
   * +-------------------------------------+              +--------------------------------------+
@@ -125,9 +136,12 @@
   * 
* * In the above example ExecutionGroup B has an outputoperation (ViewerOperation) and is being executed. - * The first chunk is evaluated [@ref ExecutionGroup.scheduleChunkWhenPossible], but not all input chunks are available. The relevant ExecutionGroup (that can calculate the missing chunks; ExecutionGroup A) is - * Asked to calculate the area ExecutionGroup B is missing. [@ref ExecutionGroup.scheduleAreaWhenPossible] - * ExecutionGroup B checks what chunks the area spans, and tries to schedule these chunks. If all input data is available these chunks are scheduled [@ref ExecutionGroup.scheduleChunk] + * The first chunk is evaluated [@ref ExecutionGroup.scheduleChunkWhenPossible], + * but not all input chunks are available. The relevant ExecutionGroup (that can calculate the missing chunks; + * ExecutionGroup A) is asked to calculate the area ExecutionGroup B is missing. + * [@ref ExecutionGroup.scheduleAreaWhenPossible] + * ExecutionGroup B checks what chunks the area spans, and tries to schedule these chunks. + * If all input data is available these chunks are scheduled [@ref ExecutionGroup.scheduleChunk] * *
   *
@@ -166,7 +180,8 @@
   *
   * This happens until all chunks of (ExecutionGroup B) are finished executing or the user break's the process.
   *
-  * NodeOperation like the ScaleOperation can influence the area of interest by reimplementing the [@ref NodeOperation.determineAreaOfInterest] method
+  * NodeOperation like the ScaleOperation can influence the area of interest by reimplementing the
+  * [@ref NodeOperation.determineAreaOfInterest] method
   *
   * 
   *
@@ -188,8 +203,10 @@
   * 
* * @see ExecutionGroup.execute Execute a complete ExecutionGroup. Halts until finished or breaked by user - * @see ExecutionGroup.scheduleChunkWhenPossible Tries to schedule a single chunk, checks if all input data is available. Can trigger dependant chunks to be calculated - * @see ExecutionGroup.scheduleAreaWhenPossible Tries to schedule an area. This can be multiple chunks (is called from [@ref ExecutionGroup.scheduleChunkWhenPossible]) + * @see ExecutionGroup.scheduleChunkWhenPossible Tries to schedule a single chunk, + * checks if all input data is available. Can trigger dependant chunks to be calculated + * @see ExecutionGroup.scheduleAreaWhenPossible Tries to schedule an area. This can be multiple chunks + * (is called from [@ref ExecutionGroup.scheduleChunkWhenPossible]) * @see ExecutionGroup.scheduleChunk Schedule a chunk on the WorkScheduler * @see NodeOperation.determineDependingAreaOfInterest Influence the area of interest of a chunk. * @see WriteBufferOperation NodeOperation to write to a MemoryProxy/MemoryBuffer @@ -198,27 +215,34 @@ * @see MemoryBuffer Allocated memory for a single chunk * * @section workscheduler WorkScheduler - * the WorkScheduler is implemented as a static class. the responsibility of the WorkScheduler is to balance WorkPackages to the available and free devices. + * the WorkScheduler is implemented as a static class. the responsibility of the WorkScheduler is to balance + * WorkPackages to the available and free devices. * the workscheduler can work in 2 states. For witching these between the state you need to recompile blender * * @subsection multithread Multi threaded * Default the workscheduler will place all work as WorkPackage in a queue. - * For every CPUcore a working thread is created. These working threads will ask the WorkScheduler if there is work for a specific Device. + * For every CPUcore a working thread is created. These working threads will ask the WorkScheduler if there is work + * for a specific Device. * the workscheduler will find work for the device and the device will be asked to execute the WorkPackage * @subsection singlethread Single threaded - * For debugging reasons the multi-threading can be disabled. This is done by changing the COM_CURRENT_THREADING_MODEL to COM_TM_NOTHREAD. When compiling the workscheduler + * For debugging reasons the multi-threading can be disabled. This is done by changing the COM_CURRENT_THREADING_MODEL + * to COM_TM_NOTHREAD. When compiling the workscheduler * will be changes to support no threading and run everything on the CPU. * * @section devices Devices - * A Device within the compositor context is a Hardware component that can used to calculate chunks. This chunk is encapseled in a WorkPackage. + * A Device within the compositor context is a Hardware component that can used to calculate chunks. + * This chunk is encapseled in a WorkPackage. * the WorkScheduler controls the devices and selects the device where a WorkPackage will be calculated. * * @subsection WS_Devices Workscheduler - * The WorkScheduler controls all Devices. When initializing the compositor the WorkScheduler selects all devices that will be used during compositor. + * The WorkScheduler controls all Devices. When initializing the compositor the WorkScheduler selects + * all devices that will be used during compositor. * There are two types of Devices, CPUDevice and OpenCLDevice. * When an ExecutionGroup schedules a Chunk the schedule method of the WorkScheduler - * The Workscheduler determines if the chunk can be run on an OpenCLDevice (and that there are available OpenCLDevice). If this is the case the chunk will be added to the worklist for OpenCLDevice's + * The Workscheduler determines if the chunk can be run on an OpenCLDevice + * (and that there are available OpenCLDevice). If this is the case the chunk will be added to the worklist for + * OpenCLDevice's * otherwise the chunk will be added to the worklist of CPUDevices. * * A thread will read the work-list and sends a workpackage to its device. @@ -227,7 +251,8 @@ * @see Device.execute method called to execute a chunk * * @subsection CPUDevice CPUDevice - * When a CPUDevice gets a WorkPackage the Device will get the inputbuffer that is needed to calculate the chunk. Allocation is already done by the ExecutionGroup. + * When a CPUDevice gets a WorkPackage the Device will get the inputbuffer that is needed to calculate the chunk. + * Allocation is already done by the ExecutionGroup. * The outputbuffer of the chunk is being created. * The OutputOperation of the ExecutionGroup is called to execute the area of the outputbuffer. * @@ -269,7 +294,8 @@ * @see bNodeTree.edit_quality * @see bNodeTree.render_quality * - * - output nodes can have different priorities in the WorkScheduler. This is implemented in the COM_execute function. + * - output nodes can have different priorities in the WorkScheduler. + * This is implemented in the COM_execute function. */ void COM_execute(bNodeTree *editingtree, int rendering); diff --git a/source/blender/compositor/intern/COM_CPUDevice.cpp b/source/blender/compositor/intern/COM_CPUDevice.cpp index 2e74fbf19b3..43ec892985a 100644 --- a/source/blender/compositor/intern/COM_CPUDevice.cpp +++ b/source/blender/compositor/intern/COM_CPUDevice.cpp @@ -22,7 +22,8 @@ #include "COM_CPUDevice.h" -void CPUDevice::execute(WorkPackage *work) { +void CPUDevice::execute(WorkPackage *work) +{ const unsigned int chunkNumber = work->getChunkNumber(); ExecutionGroup * executionGroup = work->getExecutionGroup(); rcti rect; diff --git a/source/blender/compositor/intern/COM_ChannelInfo.cpp b/source/blender/compositor/intern/COM_ChannelInfo.cpp index e945babe9c3..7dafee5f955 100644 --- a/source/blender/compositor/intern/COM_ChannelInfo.cpp +++ b/source/blender/compositor/intern/COM_ChannelInfo.cpp @@ -27,7 +27,8 @@ /** * @brief create new ChannelInfo instance and sets the defaults. */ -ChannelInfo::ChannelInfo() { +ChannelInfo::ChannelInfo() +{ this->number = 0; this->premultiplied = true; this->type = COM_CT_UNUSED; diff --git a/source/blender/compositor/intern/COM_ChunkOrder.cpp b/source/blender/compositor/intern/COM_ChunkOrder.cpp index 784b848a2f9..387e4a6ba70 100644 --- a/source/blender/compositor/intern/COM_ChunkOrder.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrder.cpp @@ -23,18 +23,20 @@ #include "COM_ChunkOrder.h" #include "BLI_math.h" -ChunkOrder::ChunkOrder() { +ChunkOrder::ChunkOrder() +{ this->distance = 0.0; this->number = 0; this->x = 0; this->y = 0; } -void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots) { +void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int numberOfHotspots) +{ unsigned int index; double distance = MAXFLOAT; for (index = 0 ; index < numberOfHotspots ; index ++) { - ChunkOrderHotspot* hotspot = hotspots[index]; + ChunkOrderHotspot *hotspot = hotspots[index]; double ndistance = hotspot->determineDistance(this->x, this->y); if (ndistance < distance) { distance = ndistance; @@ -43,6 +45,7 @@ void ChunkOrder::determineDistance(ChunkOrderHotspot **hotspots, unsigned int nu this->distance = distance; } -bool operator<(const ChunkOrder& a, const ChunkOrder& b) { +bool operator<(const ChunkOrder& a, const ChunkOrder& b) +{ return a.distance < b.distance; } diff --git a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp index 11079878b4f..94110f0bcfe 100644 --- a/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp +++ b/source/blender/compositor/intern/COM_ChunkOrderHotspot.cpp @@ -23,13 +23,15 @@ #include "COM_ChunkOrderHotspot.h" #include -ChunkOrderHotspot::ChunkOrderHotspot(int x, int y, float addition) { +ChunkOrderHotspot::ChunkOrderHotspot(int x, int y, float addition) +{ this->x = x; this->y = y; this->addition = addition; } -double ChunkOrderHotspot::determineDistance(int x, int y) { +double ChunkOrderHotspot::determineDistance(int x, int y) +{ int dx = x-this->x; int dy = y-this->y; double result = sqrt((double)(dx*dx+dy*dy)); diff --git a/source/blender/compositor/intern/COM_CompositorContext.cpp b/source/blender/compositor/intern/COM_CompositorContext.cpp index abab4edfc3f..911de822f80 100644 --- a/source/blender/compositor/intern/COM_CompositorContext.cpp +++ b/source/blender/compositor/intern/COM_CompositorContext.cpp @@ -24,13 +24,15 @@ #include "COM_defines.h" #include -CompositorContext::CompositorContext() { +CompositorContext::CompositorContext() +{ this->scene = NULL; this->quality = COM_QUALITY_HIGH; this->hasActiveOpenCLDevices = false; } -const int CompositorContext::getFramenumber() const { +const int CompositorContext::getFramenumber() const +{ if (this->scene) { return this->scene->r.cfra; } @@ -39,7 +41,8 @@ const int CompositorContext::getFramenumber() const { } } -const int CompositorContext::isColorManaged() const { +const int CompositorContext::isColorManaged() const +{ if (this->scene) { return this->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT; } diff --git a/source/blender/compositor/intern/COM_CompositorContext.h b/source/blender/compositor/intern/COM_CompositorContext.h index dc5b248f777..2889f43290e 100644 --- a/source/blender/compositor/intern/COM_CompositorContext.h +++ b/source/blender/compositor/intern/COM_CompositorContext.h @@ -55,14 +55,14 @@ private: * This field is initialized in ExecutionSystem and must only be read from that point on. * @see ExecutionSystem */ - Scene* scene; + Scene *scene; /** * @brief reference to the bNodeTree * This field is initialized in ExecutionSystem and must only be read from that point on. * @see ExecutionSystem */ - bNodeTree* bnodetree; + bNodeTree *bnodetree; /** * @brief does this system have active opencl devices? @@ -88,12 +88,12 @@ public: /** * @brief set the scene of the context */ - void setScene(Scene* scene) {this->scene = scene;} + void setScene(Scene *scene) {this->scene = scene;} /** * @brief set the bnodetree of the context */ - void setbNodeTree(bNodeTree* bnodetree) {this->bnodetree = bnodetree;} + void setbNodeTree(bNodeTree *bnodetree) {this->bnodetree = bnodetree;} /** * @brief get the bnodetree of the context @@ -103,7 +103,7 @@ public: /** * @brief get the scene of the context */ - const Scene* getScene() const {return this->scene;} + const Scene *getScene() const {return this->scene;} /** * @brief set the quality diff --git a/source/blender/compositor/intern/COM_Converter.cpp b/source/blender/compositor/intern/COM_Converter.cpp index ac57bf1cadc..3cb297801ca 100644 --- a/source/blender/compositor/intern/COM_Converter.cpp +++ b/source/blender/compositor/intern/COM_Converter.cpp @@ -112,7 +112,8 @@ #include "COM_DoubleEdgeMaskNode.h" #include "COM_CropNode.h" -Node* Converter::convert(bNode *bNode) { +Node *Converter::convert(bNode *bNode) +{ Node * node; if (bNode->flag & NODE_MUTED) { @@ -353,9 +354,10 @@ case CMP_NODE_OUTPUT_FILE: } return node; } -void Converter::convertDataType(SocketConnection* connection, ExecutionSystem *system) { - OutputSocket* outputSocket = connection->getFromSocket(); - InputSocket* inputSocket = connection->getToSocket(); +void Converter::convertDataType(SocketConnection *connection, ExecutionSystem *system) +{ + OutputSocket *outputSocket = connection->getFromSocket(); + InputSocket *inputSocket = connection->getToSocket(); DataType fromDatatype = outputSocket->getActualDataType(); DataType toDatatype = inputSocket->getActualDataType(); NodeOperation * converter = NULL; @@ -384,7 +386,8 @@ void Converter::convertDataType(SocketConnection* connection, ExecutionSystem *s } } -void Converter::convertResolution(SocketConnection *connection, ExecutionSystem *system) { +void Converter::convertResolution(SocketConnection *connection, ExecutionSystem *system) +{ InputSocketResizeMode mode = connection->getToSocket()->getResizeMode(); NodeOperation * toOperation = (NodeOperation*)connection->getToNode(); diff --git a/source/blender/compositor/intern/COM_Converter.h b/source/blender/compositor/intern/COM_Converter.h index f5144d1bfed..fa12be4e79a 100644 --- a/source/blender/compositor/intern/COM_Converter.h +++ b/source/blender/compositor/intern/COM_Converter.h @@ -42,7 +42,7 @@ public: * @see Node * @see MuteNode */ - static Node* convert(bNode* bNode); + static Node *convert(bNode *bNode); /** * @brief This method will add a datetype conversion rule when the to-socket does not support the from-socket actual data type. @@ -53,7 +53,7 @@ public: * @param system the ExecutionSystem to add the conversion to. * @see SocketConnection - a link between two sockets */ - static void convertDataType(SocketConnection* connection, ExecutionSystem *system); + static void convertDataType(SocketConnection *connection, ExecutionSystem *system); /** * @brief This method will add a resolution rule based on the settings of the InputSocket. @@ -65,6 +65,6 @@ public: * @param system the ExecutionSystem to add the conversion to. * @see SocketConnection - a link between two sockets */ - static void convertResolution(SocketConnection* connection, ExecutionSystem *system); + static void convertResolution(SocketConnection *connection, ExecutionSystem *system); }; #endif diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp index bce31658a8d..e4fefa6a904 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -41,7 +41,8 @@ #include "BLI_math.h" #include "COM_ExecutionSystemHelper.h" -ExecutionGroup::ExecutionGroup() { +ExecutionGroup::ExecutionGroup() +{ this->isOutput = false; this->complex = false; this->chunkExecutionStates = NULL; @@ -57,13 +58,15 @@ ExecutionGroup::ExecutionGroup() { this->chunksFinished = 0; } -int ExecutionGroup::getRenderPriotrity() { +int ExecutionGroup::getRenderPriotrity() +{ return this->getOutputNodeOperation()->getRenderPriority(); } -bool ExecutionGroup::containsOperation(NodeOperation* operation) { +bool ExecutionGroup::containsOperation(NodeOperation *operation) +{ for (vector::const_iterator iterator = this->operations.begin() ; iterator != this->operations.end() ; ++iterator) { - NodeOperation* inListOperation = *iterator; + NodeOperation *inListOperation = *iterator; if (inListOperation == operation) { return true; } @@ -71,11 +74,13 @@ bool ExecutionGroup::containsOperation(NodeOperation* operation) { return false; } -const bool ExecutionGroup::isComplex() const { +const bool ExecutionGroup::isComplex() const +{ return this->complex; } -bool ExecutionGroup::canContainOperation(NodeOperation* operation) { +bool ExecutionGroup::canContainOperation(NodeOperation *operation) +{ if (!this->initialized) {return true;} if (operation->isReadBufferOperation()) {return true;} if (operation->isWriteBufferOperation()) {return false;} @@ -89,7 +94,8 @@ bool ExecutionGroup::canContainOperation(NodeOperation* operation) { } } -void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operation) { +void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operation) +{ if (containsOperation(operation)) return; if (canContainOperation(operation)) { if (!operation->isBufferOperation()) { @@ -99,8 +105,8 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat } this->operations.push_back(operation); if (operation->isReadBufferOperation()) { - ReadBufferOperation* readOperation = (ReadBufferOperation*)operation; - WriteBufferOperation* writeOperation = readOperation->getMemoryProxy()->getWriteBufferOperation(); + ReadBufferOperation *readOperation = (ReadBufferOperation*)operation; + WriteBufferOperation *writeOperation = readOperation->getMemoryProxy()->getWriteBufferOperation(); this->addOperation(system, writeOperation); } else { @@ -108,7 +114,7 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat for (index = 0 ; index < operation->getNumberOfInputSockets(); index ++) { InputSocket * inputSocket = operation->getInputSocket(index); if (inputSocket->isConnected()) { - NodeOperation* node = (NodeOperation*)inputSocket->getConnection()->getFromNode(); + NodeOperation *node = (NodeOperation*)inputSocket->getConnection()->getFromNode(); this->addOperation(system, node); } } @@ -118,7 +124,7 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat if (operation->isWriteBufferOperation()) { WriteBufferOperation * writeoperation = (WriteBufferOperation*)operation; if (writeoperation->getMemoryProxy()->getExecutor() == NULL) { - ExecutionGroup* newGroup = new ExecutionGroup(); + ExecutionGroup *newGroup = new ExecutionGroup(); writeoperation->getMemoryProxy()->setExecutor(newGroup); newGroup->addOperation(system, operation); ExecutionSystemHelper::addExecutionGroup(system->getExecutionGroups(), newGroup); @@ -127,7 +133,8 @@ void ExecutionGroup::addOperation(ExecutionSystem *system, NodeOperation *operat } } -NodeOperation* ExecutionGroup::getOutputNodeOperation() const { +NodeOperation *ExecutionGroup::getOutputNodeOperation() const +{ return this->operations[0]; // the first operation of the group is always the output operation. } @@ -151,7 +158,7 @@ void ExecutionGroup::initExecution() unsigned int maxNumber = 0; for (index = 0 ; index < this->operations.size(); index ++) { - NodeOperation* operation = this->operations[index]; + NodeOperation *operation = this->operations[index]; if (operation->isReadBufferOperation()) { ReadBufferOperation *readOperation = (ReadBufferOperation*)operation; this->cachedReadOperations.push_back(readOperation); @@ -163,7 +170,8 @@ void ExecutionGroup::initExecution() } -void ExecutionGroup::deinitExecution() { +void ExecutionGroup::deinitExecution() +{ if (this->chunkExecutionStates != NULL) { delete[] this->chunkExecutionStates; this->chunkExecutionStates = NULL; @@ -174,8 +182,9 @@ void ExecutionGroup::deinitExecution() { this->cachedReadOperations.clear(); this->bTree = NULL; } -void ExecutionGroup::determineResolution(unsigned int resolution[]) { - NodeOperation* operation = this->getOutputNodeOperation(); +void ExecutionGroup::determineResolution(unsigned int resolution[]) +{ + NodeOperation *operation = this->getOutputNodeOperation(); unsigned int preferredResolution[2]; preferredResolution[0] = 0; preferredResolution[1] = 0; @@ -184,7 +193,8 @@ void ExecutionGroup::determineResolution(unsigned int resolution[]) { this->setResolution(resolution); } -void ExecutionGroup::determineNumberOfChunks() { +void ExecutionGroup::determineNumberOfChunks() +{ const float chunkSizef = this->chunkSize; this->numberOfXChunks = ceil(this->width / chunkSizef); this->numberOfYChunks = ceil(this->height / chunkSizef); @@ -194,9 +204,10 @@ void ExecutionGroup::determineNumberOfChunks() { /** * this method is called for the top execution groups. containing the compositor node or the preview node or the viewer node) */ -void ExecutionGroup::execute(ExecutionSystem* graph) { +void ExecutionGroup::execute(ExecutionSystem *graph) +{ CompositorContext& context = graph->getContext(); - const bNodeTree* bTree = context.getbNodeTree(); + const bNodeTree *bTree = context.getbNodeTree(); if (this->width == 0 || this->height == 0) {return;} /// @note: break out... no pixels to calculate. if (bTree->test_break && bTree->test_break(bTree->tbh)) {return;} /// @note: early break out for blur and preview nodes if (this->numberOfChunks == 0) {return;} /// @note: early break out @@ -216,7 +227,7 @@ void ExecutionGroup::execute(ExecutionSystem* graph) { int chunkorder = COM_TO_CENTER_OUT; if (operation->isViewerOperation()) { - ViewerBaseOperation* viewer = (ViewerBaseOperation*)operation; + ViewerBaseOperation *viewer = (ViewerBaseOperation*)operation; centerX = viewer->getCenterX(); centerY = viewer->getCenterY(); chunkorder = viewer->getChunkOrder(); @@ -224,7 +235,7 @@ void ExecutionGroup::execute(ExecutionSystem* graph) { switch (chunkorder) { case COM_TO_RANDOM: - for (index = 0 ; index < 2* numberOfChunks ; index ++) { + for (index = 0 ; index < 2 * numberOfChunks ; index ++) { int index1 = rand()%numberOfChunks; int index2 = rand()%numberOfChunks; int s = chunkOrder[index1]; @@ -351,7 +362,8 @@ void ExecutionGroup::execute(ExecutionSystem* graph) { delete[] chunkOrder; } -MemoryBuffer** ExecutionGroup::getInputBuffers(int chunkNumber) { +MemoryBuffer** ExecutionGroup::getInputBuffers(int chunkNumber) +{ rcti rect; vector memoryproxies; unsigned int index; @@ -359,7 +371,7 @@ MemoryBuffer** ExecutionGroup::getInputBuffers(int chunkNumber) { this->determineDependingMemoryProxies(&memoryproxies); MemoryBuffer **memoryBuffers = new MemoryBuffer*[this->cachedMaxReadBufferOffset]; - for (index= 0 ; index < this->cachedMaxReadBufferOffset ; index ++) { + for (index = 0 ; index < this->cachedMaxReadBufferOffset ; index ++) { memoryBuffers[index] = NULL; } rcti output; @@ -367,13 +379,14 @@ MemoryBuffer** ExecutionGroup::getInputBuffers(int chunkNumber) { ReadBufferOperation *readOperation = (ReadBufferOperation*)this->cachedReadOperations[index]; MemoryProxy * memoryProxy = readOperation->getMemoryProxy(); this->determineDependingAreaOfInterest(&rect, readOperation, &output); - MemoryBuffer* memoryBuffer = memoryProxy->getExecutor()->constructConsolidatedMemoryBuffer(memoryProxy, &output); + MemoryBuffer *memoryBuffer = memoryProxy->getExecutor()->constructConsolidatedMemoryBuffer(memoryProxy, &output); memoryBuffers[readOperation->getOffset()] = memoryBuffer; } return memoryBuffers; } -MemoryBuffer* ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *rect) { +MemoryBuffer *ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *rect) +{ // find all chunks inside the rect // determine minxchunk, minychunk, maxxchunk, maxychunk where x and y are chunknumbers float chunkSizef = this->chunkSize; @@ -415,7 +428,8 @@ MemoryBuffer* ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *mem return result; } -void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer** memoryBuffers) { +void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer** memoryBuffers) +{ if (this->chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED) this->chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED; else @@ -442,31 +456,35 @@ void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer** memo } } -inline void ExecutionGroup::determineChunkRect(rcti* rect, const unsigned int xChunk, const unsigned int yChunk ) const { +inline void ExecutionGroup::determineChunkRect(rcti *rect, const unsigned int xChunk, const unsigned int yChunk ) const +{ const unsigned int minx = xChunk * chunkSize; const unsigned int miny = yChunk * chunkSize; BLI_init_rcti(rect, minx, min(minx + this->chunkSize, this->width), miny, min(miny + this->chunkSize, this->height)); } -void ExecutionGroup::determineChunkRect(rcti* rect, const unsigned int chunkNumber) const { +void ExecutionGroup::determineChunkRect(rcti *rect, const unsigned int chunkNumber) const +{ const unsigned int yChunk = chunkNumber / numberOfXChunks; const unsigned int xChunk = chunkNumber - (yChunk * numberOfXChunks); determineChunkRect(rect, xChunk, yChunk); } -MemoryBuffer* ExecutionGroup::allocateOutputBuffer(int chunkNumber, rcti* rect) { - MemoryBuffer* outputBuffer = NULL; +MemoryBuffer *ExecutionGroup::allocateOutputBuffer(int chunkNumber, rcti *rect) +{ + MemoryBuffer *outputBuffer = NULL; // output allocation is only valid when our outputoperation is a memorywriter NodeOperation * operation = this->getOutputNodeOperation(); if (operation->isWriteBufferOperation()) { - WriteBufferOperation* writeOperation = (WriteBufferOperation*)operation; + WriteBufferOperation *writeOperation = (WriteBufferOperation*)operation; outputBuffer = MemoryManager::allocateMemoryBuffer(writeOperation->getMemoryProxy(), chunkNumber, rect); } return outputBuffer; } -bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem * graph, rcti *area) { +bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem * graph, rcti *area) +{ // find all chunks inside the rect // determine minxchunk, minychunk, maxxchunk, maxychunk where x and y are chunknumbers @@ -490,7 +508,8 @@ bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem * graph, rcti *are return result; } -bool ExecutionGroup::scheduleChunk(unsigned int chunkNumber) { +bool ExecutionGroup::scheduleChunk(unsigned int chunkNumber) +{ if (this->chunkExecutionStates[chunkNumber] == COM_ES_NOT_SCHEDULED) { this->chunkExecutionStates[chunkNumber] = COM_ES_SCHEDULED; WorkScheduler::schedule(this, chunkNumber); @@ -499,7 +518,8 @@ bool ExecutionGroup::scheduleChunk(unsigned int chunkNumber) { return false; } -bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem * graph, int xChunk, int yChunk) { +bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem * graph, int xChunk, int yChunk) +{ if (xChunk < 0 || xChunk >= (int)this->numberOfXChunks) { return true; } @@ -551,11 +571,13 @@ bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem * graph, int xChu return false; } -void ExecutionGroup::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output) { +void ExecutionGroup::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti *output) +{ this->getOutputNodeOperation()->determineDependingAreaOfInterest(input, readOperation, output); } -void ExecutionGroup::determineDependingMemoryProxies(vector *memoryProxies) { +void ExecutionGroup::determineDependingMemoryProxies(vector *memoryProxies) +{ unsigned int index; for (index = 0 ; index < this->cachedReadOperations.size() ; index ++) { ReadBufferOperation * readOperation = (ReadBufferOperation*) this->cachedReadOperations[index]; @@ -563,10 +585,12 @@ void ExecutionGroup::determineDependingMemoryProxies(vector *memor } } -bool ExecutionGroup::operator ==(const ExecutionGroup & executionGroup) const { +bool ExecutionGroup::operator ==(const ExecutionGroup & executionGroup) const +{ return this->getOutputNodeOperation() == executionGroup.getOutputNodeOperation(); } -bool ExecutionGroup::isOpenCL() { +bool ExecutionGroup::isOpenCL() +{ return this->openCL; } diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.h b/source/blender/compositor/intern/COM_ExecutionGroup.h index 2d5e0965297..adab7df4690 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.h +++ b/source/blender/compositor/intern/COM_ExecutionGroup.h @@ -166,7 +166,7 @@ private: * @brief check whether parameter operation can be added to the execution group * @param operation the operation to be added */ - bool canContainOperation(NodeOperation* operation); + bool canContainOperation(NodeOperation *operation); /** * @brief get the Render priority of this ExecutionGroup @@ -188,7 +188,7 @@ private: * @note Only gives usefull results ater the determination of the chunksize * @see determineChunkSize() */ - void determineChunkRect(rcti* rect, const unsigned int xChunk, const unsigned int yChunk) const; + void determineChunkRect(rcti *rect, const unsigned int xChunk, const unsigned int yChunk) const; /** * @brief determine the number of chunks, based on the chunkSize, width and height. @@ -233,7 +233,7 @@ private: * @param readOperation The ReadBufferOperation where the area needs to be evaluated * @param output the area needed of the ReadBufferOperation. Result */ - void determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output); + void determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti *output); public: @@ -257,7 +257,7 @@ public: * @param operation the NodeOperation to check * @return [true,false] */ - bool containsOperation(NodeOperation* operation); + bool containsOperation(NodeOperation *operation); /** * @brief add an operation to this ExecutionGroup @@ -266,7 +266,7 @@ public: * @param system * @param operation */ - void addOperation(ExecutionSystem* system, NodeOperation *operation); + void addOperation(ExecutionSystem *system, NodeOperation *operation); /** * @brief is this ExecutionGroup an output ExecutionGroup @@ -312,15 +312,15 @@ public: /** * @brief get the output operation of this ExecutionGroup - * @return NodeOperation* output operation + * @return NodeOperation *output operation */ - NodeOperation* getOutputNodeOperation() const; + NodeOperation *getOutputNodeOperation() const; /** * @brief compose multiple chunks into a single chunk - * @return Memorybuffer* consolidated chunk + * @return Memorybuffer *consolidated chunk */ - MemoryBuffer* constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *output); + MemoryBuffer *constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *output); /** * @brief initExecution is called just before the execution of the whole graph will be done. @@ -342,7 +342,7 @@ public: * @param rect the rect of that chunk * @see determineChunkRect */ - MemoryBuffer* allocateOutputBuffer(int chunkNumber, rcti *rect); + MemoryBuffer *allocateOutputBuffer(int chunkNumber, rcti *rect); /** * @brief after a chunk is executed the needed resources can be freed or unlocked. @@ -372,7 +372,7 @@ public: * @see ViewerOperation * @param system */ - void execute(ExecutionSystem* system); + void execute(ExecutionSystem *system); /** * @brief this method determines the MemoryProxy's where this execution group depends on. @@ -387,7 +387,7 @@ public: * @note Only gives usefull results ater the determination of the chunksize * @see determineChunkSize() */ - void determineChunkRect(rcti* rect, const unsigned int chunkNumber) const; + void determineChunkRect(rcti *rect, const unsigned int chunkNumber) const; bool operator ==(const ExecutionGroup &executionGroup) const; diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp index b66a6a036b5..84b5bb8f5fc 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp @@ -40,7 +40,8 @@ #include "BKE_global.h" -ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { +ExecutionSystem::ExecutionSystem(bNodeTree *editingtree, bool rendering) +{ this->context.setbNodeTree(editingtree); /* initialize the CompositorContext */ @@ -53,7 +54,7 @@ ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { context.setRendering(rendering); context.setHasActiveOpenCLDevices(WorkScheduler::hasGPUDevices() && (editingtree->flag & NTREE_COM_OPENCL)); - Node* mainOutputNode=NULL; + Node *mainOutputNode=NULL; mainOutputNode = ExecutionSystemHelper::addbNodeTree(*this, 0, editingtree); @@ -68,7 +69,7 @@ ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { for (index = 0 ; index < executionGroups.size(); index ++) { resolution[0]=0; resolution[1]=0; - ExecutionGroup* executionGroup = executionGroups[index]; + ExecutionGroup *executionGroup = executionGroups[index]; executionGroup->determineResolution(resolution); } } @@ -76,34 +77,36 @@ ExecutionSystem::ExecutionSystem(bNodeTree* editingtree, bool rendering) { if (G.f & G_DEBUG) ExecutionSystemHelper::debugDump(this); } -ExecutionSystem::~ExecutionSystem() { +ExecutionSystem::~ExecutionSystem() +{ unsigned int index; for (index = 0; index < this->connections.size(); index++) { - SocketConnection* connection = this->connections[index]; + SocketConnection *connection = this->connections[index]; delete connection; } this->connections.clear(); for (index = 0; index < this->nodes.size(); index++) { - Node* node = this->nodes[index]; + Node *node = this->nodes[index]; delete node; } this->nodes.clear(); for (index = 0; index < this->operations.size(); index++) { - NodeOperation* operation = this->operations[index]; + NodeOperation *operation = this->operations[index]; delete operation; } this->operations.clear(); for (index = 0; index < this->groups.size(); index++) { - ExecutionGroup* group = this->groups[index]; + ExecutionGroup *group = this->groups[index]; delete group; } this->groups.clear(); } -void ExecutionSystem::execute() { +void ExecutionSystem::execute() +{ unsigned int order = 0; for ( vector::iterator iter = this->operations.begin(); iter != operations.end(); ++iter ) { - NodeBase* node = *iter; + NodeBase *node = *iter; NodeOperation *operation = (NodeOperation*) node; if (operation->isReadBufferOperation()) { ReadBufferOperation * readOperation = (ReadBufferOperation*)operation; @@ -134,8 +137,8 @@ void ExecutionSystem::execute() { /* start execution of the ExecutionGroups based on priority of their output node */ for (int priority = 9 ; priority>=0 ; priority--) { for (index = 0 ; index < executionGroups.size(); index ++) { - ExecutionGroup* group = executionGroups[index]; - NodeOperation* output = group->getOutputNodeOperation(); + ExecutionGroup *group = executionGroups[index]; + NodeOperation *output = group->getOutputNodeOperation(); if (output->getRenderPriority() == priority) { group->execute(this); } @@ -156,19 +159,21 @@ void ExecutionSystem::execute() { MemoryManager::clear(); } -void ExecutionSystem::addOperation(NodeOperation *operation) { +void ExecutionSystem::addOperation(NodeOperation *operation) +{ ExecutionSystemHelper::addOperation(this->operations, operation); } -void ExecutionSystem::addReadWriteBufferOperations(NodeOperation *operation) { +void ExecutionSystem::addReadWriteBufferOperations(NodeOperation *operation) +{ // for every input add write and read operation if input is not a read operation // only add read operation to other links when they are attached to buffered operations. unsigned int index; for (index = 0 ; index < operation->getNumberOfInputSockets();index++) { - InputSocket* inputsocket = operation->getInputSocket(index); + InputSocket *inputsocket = operation->getInputSocket(index); if (inputsocket->isConnected()) { SocketConnection *connection = inputsocket->getConnection(); - NodeOperation* otherEnd = (NodeOperation*)connection->getFromNode(); + NodeOperation *otherEnd = (NodeOperation*)connection->getFromNode(); if (!otherEnd->isReadBufferOperation()) { // check of other end already has write operation OutputSocket *fromsocket = connection->getFromSocket(); @@ -201,7 +206,7 @@ void ExecutionSystem::addReadWriteBufferOperations(NodeOperation *operation) { this->addOperation(writeOperation); for (index = 0 ; index < outputsocket->getNumberOfConnections();index ++) { SocketConnection * connection = outputsocket->getConnection(index); - ReadBufferOperation* readoperation = new ReadBufferOperation(); + ReadBufferOperation *readoperation = new ReadBufferOperation(); readoperation->setMemoryProxy(writeOperation->getMemoryProxy()); connection->setFromSocket(readoperation->getOutputSocket()); readoperation->getOutputSocket()->addConnection(connection); @@ -211,12 +216,13 @@ void ExecutionSystem::addReadWriteBufferOperations(NodeOperation *operation) { } } -void ExecutionSystem::convertToOperations() { +void ExecutionSystem::convertToOperations() +{ unsigned int index; // first determine data types of the nodes, this can be used by the node to convert to a different operation system this->determineActualSocketDataTypes((vector&)this->nodes); for (index = 0; index < this->nodes.size(); index++) { - Node* node = (Node*)this->nodes[index]; + Node *node = (Node*)this->nodes[index]; node->convertToOperations(this, &this->context); } @@ -233,7 +239,7 @@ void ExecutionSystem::convertToOperations() { // determine all resolutions of the operations (Width/Height) for (index = 0 ; index < this->operations.size(); index ++) { - NodeOperation* operation= this->operations[index]; + NodeOperation *operation = this->operations[index]; if (operation->isOutputOperation(context.isRendering())) { unsigned int resolution[2] = {0,0}; unsigned int preferredResolution[2] = {0,0}; @@ -254,7 +260,8 @@ void ExecutionSystem::convertToOperations() { } -void ExecutionSystem::groupOperations() { +void ExecutionSystem::groupOperations() +{ vector outputOperations; NodeOperation * operation; unsigned int index; @@ -281,11 +288,12 @@ void ExecutionSystem::addSocketConnection(SocketConnection *connection) } -void ExecutionSystem::determineActualSocketDataTypes(vector &nodes) { +void ExecutionSystem::determineActualSocketDataTypes(vector &nodes) +{ unsigned int index; /* first do all input nodes */ for (index = 0; index < nodes.size(); index++) { - NodeBase* node = nodes[index]; + NodeBase *node = nodes[index]; if (node->isInputNode()) { node->determineActualSocketDataTypes(); } @@ -293,17 +301,18 @@ void ExecutionSystem::determineActualSocketDataTypes(vector &nodes) { /* then all other nodes */ for (index = 0; index < nodes.size(); index++) { - NodeBase* node = nodes[index]; + NodeBase *node = nodes[index]; if (!node->isInputNode()) { node->determineActualSocketDataTypes(); } } } -void ExecutionSystem::findOutputExecutionGroup(vector *result) const { +void ExecutionSystem::findOutputExecutionGroup(vector *result) const +{ unsigned int index; for (index = 0 ; index < this->groups.size() ; index ++) { - ExecutionGroup* group = this->groups[index]; + ExecutionGroup *group = this->groups[index]; if (group->isOutputExecutionGroup()) { result->push_back(group); } diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.h b/source/blender/compositor/intern/COM_ExecutionSystem.h index 7d0830491f3..85fec8b6145 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.h +++ b/source/blender/compositor/intern/COM_ExecutionSystem.h @@ -135,7 +135,7 @@ private: //methods * @brief add ReadBufferOperation and WriteBufferOperation around an operation * @param operation the operation to add the bufferoperations around. */ - void addReadWriteBufferOperations(NodeOperation* operation); + void addReadWriteBufferOperations(NodeOperation *operation); /** @@ -151,7 +151,7 @@ public: * @param editingtree [bNodeTree*] * @param rendering [true false] */ - ExecutionSystem(bNodeTree* editingtree, bool rendering); + ExecutionSystem(bNodeTree *editingtree, bool rendering); /** * Destructor @@ -172,14 +172,14 @@ public: * * @param operation the operation to add */ - void addOperation(NodeOperation* operation); + void addOperation(NodeOperation *operation); /** * Add an editor link to the system. convert it to an socketconnection (CPP-representative) * this converted socket is returned. */ - SocketConnection* addNodeLink(bNodeLink* bNodeLink); - void addSocketConnection(SocketConnection* connection); + SocketConnection *addNodeLink(bNodeLink *bNodeLink); + void addSocketConnection(SocketConnection *connection); /** * @brief Convert all nodes to operations diff --git a/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp b/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp index 4a739ba6a9d..94376f73de9 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp @@ -37,14 +37,15 @@ #include "COM_WriteBufferOperation.h" #include "COM_ReadBufferOperation.h" -Node* ExecutionSystemHelper::addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree *tree) { +Node *ExecutionSystemHelper::addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree *tree) +{ vector& nodes = system.getNodes(); vector& links = system.getConnections(); - Node* mainnode = NULL; + Node *mainnode = NULL; /* add all nodes of the tree to the node list */ - bNode* node = (bNode*)tree->nodes.first; + bNode *node = (bNode*)tree->nodes.first; while (node != NULL) { - Node* execnode = addNode(nodes, node); + Node *execnode = addNode(nodes, node); if (node->type == CMP_NODE_COMPOSITE) { mainnode = execnode; } @@ -54,7 +55,7 @@ Node* ExecutionSystemHelper::addbNodeTree(ExecutionSystem &system, int nodes_sta NodeRange node_range(nodes.begin()+nodes_start, nodes.end()); /* add all nodelinks of the tree to the link list */ - bNodeLink* nodelink = (bNodeLink*)tree->links.first; + bNodeLink *nodelink = (bNodeLink*)tree->links.first; while (nodelink != NULL) { addNodeLink(node_range, links, nodelink); nodelink = (bNodeLink*)nodelink->next; @@ -72,11 +73,13 @@ Node* ExecutionSystemHelper::addbNodeTree(ExecutionSystem &system, int nodes_sta return mainnode; } -void ExecutionSystemHelper::addNode(vector& nodes, Node *node) { +void ExecutionSystemHelper::addNode(vector& nodes, Node *node) +{ nodes.push_back(node); } -Node* ExecutionSystemHelper::addNode(vector& nodes, bNode *bNode) { +Node *ExecutionSystemHelper::addNode(vector& nodes, bNode *bNode) +{ Converter converter; Node * node; node = converter.convert(bNode); @@ -86,36 +89,40 @@ Node* ExecutionSystemHelper::addNode(vector& nodes, bNode *bNode) { } return NULL; } -void ExecutionSystemHelper::addOperation(vector& operations, NodeOperation *operation) { +void ExecutionSystemHelper::addOperation(vector& operations, NodeOperation *operation) +{ operations.push_back(operation); } -void ExecutionSystemHelper::addExecutionGroup(vector& executionGroups, ExecutionGroup *executionGroup) { +void ExecutionSystemHelper::addExecutionGroup(vector& executionGroups, ExecutionGroup *executionGroup) +{ executionGroups.push_back(executionGroup); } -void ExecutionSystemHelper::findOutputNodeOperations(vector* result, vector& operations, bool rendering) { +void ExecutionSystemHelper::findOutputNodeOperations(vector* result, vector& operations, bool rendering) +{ unsigned int index; for (index = 0 ; index < operations.size() ; index ++) { - NodeOperation* operation = operations[index]; + NodeOperation *operation = operations[index]; if (operation->isOutputOperation(rendering)) { result->push_back(operation); - } + } } } -static InputSocket* find_input(NodeRange &node_range, bNode *bnode, bNodeSocket* bsocket) { +static InputSocket *find_input(NodeRange &node_range, bNode *bnode, bNodeSocket *bsocket) +{ if (bnode != NULL) { for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { - Node* node = *it; + Node *node = *it; if (node->getbNode() == bnode) return node->findInputSocketBybNodeSocket(bsocket); } } else { for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { - Node* node = *it; + Node *node = *it; if (node->isProxyNode()) { InputSocket *proxySocket = node->getInputSocket(0); if (proxySocket->getbNodeSocket()==bsocket) @@ -125,17 +132,18 @@ static InputSocket* find_input(NodeRange &node_range, bNode *bnode, bNodeSocket* } return NULL; } -static OutputSocket* find_output(NodeRange &node_range, bNode *bnode, bNodeSocket* bsocket) { +static OutputSocket *find_output(NodeRange &node_range, bNode *bnode, bNodeSocket *bsocket) +{ if (bnode != NULL) { for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { - Node* node = *it; + Node *node = *it; if (node->getbNode() == bnode) return node->findOutputSocketBybNodeSocket(bsocket); } } else { for (NodeIterator it=node_range.first; it!=node_range.second; ++it) { - Node* node = *it; + Node *node = *it; if (node->isProxyNode()) { OutputSocket *proxySocket = node->getOutputSocket(0); if (proxySocket->getbNodeSocket()==bsocket) @@ -145,7 +153,8 @@ static OutputSocket* find_output(NodeRange &node_range, bNode *bnode, bNodeSocke } return NULL; } -SocketConnection* ExecutionSystemHelper::addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink) { +SocketConnection *ExecutionSystemHelper::addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink) +{ /// @note: cyclic lines will be ignored. This has been copied from node.c if (bNodeLink->tonode != 0 && bNodeLink->fromnode != 0) { if (!(bNodeLink->fromnode->level >= bNodeLink->tonode->level && bNodeLink->tonode->level!=0xFFF)) { // only add non cyclic lines! so execution will procede @@ -161,11 +170,12 @@ SocketConnection* ExecutionSystemHelper::addNodeLink(NodeRange &node_range, vect if (inputSocket->isConnected()) { return NULL; } - SocketConnection* connection = addLink(links, outputSocket, inputSocket); + SocketConnection *connection = addLink(links, outputSocket, inputSocket); return connection; } -SocketConnection* ExecutionSystemHelper::addLink(vector& links, OutputSocket* fromSocket, InputSocket* toSocket) { +SocketConnection *ExecutionSystemHelper::addLink(vector& links, OutputSocket *fromSocket, InputSocket *toSocket) +{ SocketConnection * newconnection = new SocketConnection(); newconnection->setFromSocket(fromSocket); newconnection->setToSocket(toSocket); @@ -175,11 +185,12 @@ SocketConnection* ExecutionSystemHelper::addLink(vector& link return newconnection; } -void ExecutionSystemHelper::debugDump(ExecutionSystem* system) { - Node* node; - NodeOperation* operation; - ExecutionGroup* group; - SocketConnection* connection; +void ExecutionSystemHelper::debugDump(ExecutionSystem *system) +{ + Node *node; + NodeOperation *operation; + ExecutionGroup *group; + SocketConnection *connection; int tot, tot2; printf("-- BEGIN COMPOSITOR DUMP --\r\n"); printf("digraph compositorexecution {\r\n"); @@ -283,7 +294,7 @@ void ExecutionSystemHelper::debugDump(ExecutionSystem* system) { operation = system->getOperations()[i]; if (operation->isReadBufferOperation()) { ReadBufferOperation * read = (ReadBufferOperation*)operation; - WriteBufferOperation * write= read->getMemoryProxy()->getWriteBufferOperation(); + WriteBufferOperation * write = read->getMemoryProxy()->getWriteBufferOperation(); printf("\t\"O_%p\" -> \"O_%p\" [style=dotted]\r\n", write, read); } } diff --git a/source/blender/compositor/intern/COM_ExecutionSystemHelper.h b/source/blender/compositor/intern/COM_ExecutionSystemHelper.h index e6b11c4043f..a72e269115e 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystemHelper.h +++ b/source/blender/compositor/intern/COM_ExecutionSystemHelper.h @@ -48,7 +48,7 @@ public: * @param tree bNodeTree to add * @return Node representing the "Compositor node" of the maintree. or NULL when a subtree is added */ - static Node* addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree * tree); + static Node *addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree * tree); /** * @brief add an editor node to the system. @@ -58,7 +58,7 @@ public: * @param bNode node to add * @return Node that represents the bNode or null when not able to convert. */ - static Node* addNode(vector& nodes, bNode* bNode); + static Node *addNode(vector& nodes, bNode *bNode); /** * @brief Add a Node to a list @@ -66,7 +66,7 @@ public: * @param nodes the list where the node needs to be added to * @param node the node to be added */ - static void addNode(vector& nodes, Node* node); + static void addNode(vector& nodes, Node *node); /** * @brief Add an operation to the operation list @@ -76,7 +76,7 @@ public: * @param operations the list where the operation need to be added to * @param operation the operation to add */ - static void addOperation(vector &operations, NodeOperation* operation); + static void addOperation(vector &operations, NodeOperation *operation); /** * @brief Add an ExecutionGroup to a list @@ -107,7 +107,7 @@ public: * @param bNodeLink the link to be added * @return the created SocketConnection or NULL */ - static SocketConnection* addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink); + static SocketConnection *addNodeLink(NodeRange &node_range, vector& links, bNodeLink *bNodeLink); /** * @brief create a new SocketConnection and add to a vector of links @@ -116,12 +116,12 @@ public: * @param toSocket the endpoint of the connection * @return the new created SocketConnection */ - static SocketConnection* addLink(vector& links, OutputSocket* fromSocket, InputSocket* toSocket); + static SocketConnection *addLink(vector& links, OutputSocket *fromSocket, InputSocket *toSocket); /** * @brief dumps the content of the execution system to standard out * @param system the execution system to dump */ - static void debugDump(ExecutionSystem* system); + static void debugDump(ExecutionSystem *system); }; #endif diff --git a/source/blender/compositor/intern/COM_InputSocket.cpp b/source/blender/compositor/intern/COM_InputSocket.cpp index 8428544cbc2..881aa58ec6b 100644 --- a/source/blender/compositor/intern/COM_InputSocket.cpp +++ b/source/blender/compositor/intern/COM_InputSocket.cpp @@ -25,16 +25,19 @@ #include "COM_SocketConnection.h" #include "COM_ExecutionSystem.h" -InputSocket::InputSocket(DataType datatype) :Socket(datatype) { +InputSocket::InputSocket(DataType datatype) :Socket(datatype) +{ this->connection = NULL; this->resizeMode = COM_SC_CENTER; } -InputSocket::InputSocket(DataType datatype, InputSocketResizeMode resizeMode) :Socket(datatype) { +InputSocket::InputSocket(DataType datatype, InputSocketResizeMode resizeMode) :Socket(datatype) +{ this->connection = NULL; this->resizeMode = resizeMode; } -InputSocket::InputSocket(InputSocket* from) :Socket(from->getDataType()) { +InputSocket::InputSocket(InputSocket *from) :Socket(from->getDataType()) +{ this->connection = NULL; this->resizeMode = from->getResizeMode(); } @@ -42,12 +45,17 @@ InputSocket::InputSocket(InputSocket* from) :Socket(from->getDataType()) { int InputSocket::isInputSocket() const { return true; } const int InputSocket::isConnected() const { return this->connection != NULL; } -void InputSocket::setConnection(SocketConnection *connection) { +void InputSocket::setConnection(SocketConnection *connection) +{ this->connection = connection; } -SocketConnection* InputSocket::getConnection() {return this->connection;} +SocketConnection *InputSocket::getConnection() +{ + return this->connection; +} -void InputSocket::determineResolution(unsigned int resolution[],unsigned int preferredResolution[]) { +void InputSocket::determineResolution(unsigned int resolution[],unsigned int preferredResolution[]) +{ if (this->isConnected()) { this->connection->getFromSocket()->determineResolution(resolution, preferredResolution); } @@ -56,7 +64,8 @@ void InputSocket::determineResolution(unsigned int resolution[],unsigned int pre } } -DataType InputSocket::convertToSupportedDataType(DataType datatype) { +DataType InputSocket::convertToSupportedDataType(DataType datatype) +{ int supportedDataTypes = getDataType(); if (supportedDataTypes&datatype) { return datatype; @@ -92,7 +101,8 @@ DataType InputSocket::convertToSupportedDataType(DataType datatype) { return this->getDataType(); } -void InputSocket::determineActualDataType() { +void InputSocket::determineActualDataType() +{ /// @note: this method is only called for inputsocket that are not connected. /// @note: passes COM_DT_COLOR, the convertToSupportedDataType converts this to a capable DataType this->setActualDataType(this->convertToSupportedDataType(COM_DT_COLOR)); @@ -105,26 +115,30 @@ void InputSocket::determineActualDataType() { #endif } -void InputSocket::notifyActualInputType(DataType datatype) { +void InputSocket::notifyActualInputType(DataType datatype) +{ DataType supportedDataType = convertToSupportedDataType(datatype); this->setActualDataType(supportedDataType); this->fireActualDataTypeSet(); } -void InputSocket::fireActualDataTypeSet() { +void InputSocket::fireActualDataTypeSet() +{ this->getNode()->notifyActualDataTypeSet(this, this->getActualDataType()); } -void InputSocket::relinkConnections(InputSocket *relinkToSocket) { +void InputSocket::relinkConnections(InputSocket *relinkToSocket) +{ this->relinkConnections(relinkToSocket, false, -1, NULL); } -void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem* graph) { +void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem *graph) +{ if (!duplicate) { this->relinkConnections(relinkToSocket, autoconnect, editorNodeInputSocketIndex, graph); } else { if (!this->isConnected() && autoconnect) { - Node* node = (Node*)this->getNode(); + Node *node = (Node*)this->getNode(); switch (this->getActualDataType()) { case COM_DT_UNKNOWN: case COM_DT_COLOR: @@ -149,10 +163,11 @@ void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnec } } -void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem* graph) { +void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem *graph) +{ if (!isConnected()) { if (autoconnect) { - Node* node = (Node*)this->getNode(); + Node *node = (Node*)this->getNode(); switch (this->getActualDataType()) { case COM_DT_UNKNOWN: case COM_DT_COLOR: @@ -174,7 +189,8 @@ void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnec this->setConnection(NULL); } -const ChannelInfo* InputSocket::getChannelInfo(const int channelnumber) { +const ChannelInfo *InputSocket::getChannelInfo(const int channelnumber) +{ if (this->isConnected() && this->connection->getFromSocket()) { return this->connection->getFromSocket()->getChannelInfo(channelnumber); } @@ -183,20 +199,23 @@ const ChannelInfo* InputSocket::getChannelInfo(const int channelnumber) { } } -bool InputSocket::isStatic() { +bool InputSocket::isStatic() +{ if (isConnected()) { - NodeBase* node = this->getConnection()->getFromNode(); + NodeBase *node = this->getConnection()->getFromNode(); if (node) { return node->isStatic(); } } return true; } -SocketReader* InputSocket::getReader() { +SocketReader *InputSocket::getReader() +{ return this->getOperation(); } -NodeOperation* InputSocket::getOperation() const { +NodeOperation *InputSocket::getOperation() const +{ if (isConnected()) { return (NodeOperation*)this->connection->getFromSocket()->getNode(); } @@ -205,7 +224,8 @@ NodeOperation* InputSocket::getOperation() const { } } -float* InputSocket::getStaticValues() { +float *InputSocket::getStaticValues() +{ /* XXX only works for socket types with actual float input values. * currently all compositor socket types (value, rgba, vector) support this. */ diff --git a/source/blender/compositor/intern/COM_InputSocket.h b/source/blender/compositor/intern/COM_InputSocket.h index 340cfa98ef6..e01793317a5 100644 --- a/source/blender/compositor/intern/COM_InputSocket.h +++ b/source/blender/compositor/intern/COM_InputSocket.h @@ -65,7 +65,7 @@ private: * @brief connection connected to this InputSocket. * An input socket can only have a single connection */ - SocketConnection* connection; + SocketConnection *connection; /** * @brief resize mode of this socket @@ -89,10 +89,10 @@ private: public: InputSocket(DataType datatype); InputSocket(DataType datatype, InputSocketResizeMode resizeMode); - InputSocket(InputSocket* from); + InputSocket(InputSocket *from); - void setConnection(SocketConnection* connection); - SocketConnection* getConnection(); + void setConnection(SocketConnection *connection); + SocketConnection *getConnection(); const int isConnected() const; int isInputSocket() const; @@ -126,7 +126,7 @@ public: * @param editorNodeInputSocketIndex index of the socket number of the bNode (used to retrieve the value for autoconnection) * @param system ExecutionSystem to update to */ - void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem* system); + void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem *system); /** * @brief move all connections of this input socket to another socket @@ -136,7 +136,7 @@ public: * @param duplicate instead of move do a copy of the connection. * @param system ExecutionSystem to update to */ - void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem* system); + void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem *system); /** * @brief set the resize mode @@ -150,13 +150,13 @@ public: */ InputSocketResizeMode getResizeMode() const {return this->resizeMode;} - const ChannelInfo* getChannelInfo(const int channelnumber); + const ChannelInfo *getChannelInfo(const int channelnumber); bool isStatic(); - float* getStaticValues(); - SocketReader* getReader(); - NodeOperation* getOperation() const; + float *getStaticValues(); + SocketReader *getReader(); + NodeOperation *getOperation() const; }; #endif diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cpp b/source/blender/compositor/intern/COM_MemoryBuffer.cpp index bfa20656277..19c2c96a8f2 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.cpp +++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp @@ -25,18 +25,22 @@ #include "BLI_math.h" #include "BKE_global.h" -unsigned int MemoryBuffer::determineBufferSize() { +unsigned int MemoryBuffer::determineBufferSize() +{ return getWidth() * getHeight(); } -int MemoryBuffer::getWidth() const { +int MemoryBuffer::getWidth() const +{ return this->rect.xmax-this->rect.xmin; } -int MemoryBuffer::getHeight() const { +int MemoryBuffer::getHeight() const +{ return this->rect.ymax-this->rect.ymin; } -MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, unsigned int chunkNumber, rcti* rect) { +MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, unsigned int chunkNumber, rcti *rect) +{ BLI_init_rcti(&this->rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax); this->memoryProxy = memoryProxy; this->chunkNumber = chunkNumber; @@ -46,7 +50,8 @@ MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, unsigned int chunkNumber, this->chunkWidth = this->rect.xmax - this->rect.xmin; } -MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, rcti* rect) { +MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, rcti *rect) +{ BLI_init_rcti(&this->rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax); this->memoryProxy = memoryProxy; this->chunkNumber = -1; @@ -55,20 +60,23 @@ MemoryBuffer::MemoryBuffer(MemoryProxy * memoryProxy, rcti* rect) { this->datatype = COM_DT_COLOR; this->chunkWidth = this->rect.xmax - this->rect.xmin; } -MemoryBuffer* MemoryBuffer::duplicate() { +MemoryBuffer *MemoryBuffer::duplicate() +{ MemoryBuffer *result = new MemoryBuffer(this->memoryProxy, &this->rect); memcpy(result->buffer, this->buffer, this->determineBufferSize()*4*sizeof(float)); return result; } -void MemoryBuffer::clear() { +void MemoryBuffer::clear() +{ memset(this->buffer, 0, this->determineBufferSize()*4*sizeof(float)); } -float* MemoryBuffer::convertToValueBuffer() { +float *MemoryBuffer::convertToValueBuffer() +{ int size = this->determineBufferSize(); int i; int offset4; - float* result = new float[size]; + float *result = new float[size]; for (i = 0, offset4 = 0 ; i < size ; i ++, offset4 +=4) { result[i] = this->buffer[offset4]; } @@ -76,14 +84,16 @@ float* MemoryBuffer::convertToValueBuffer() { return result; } -MemoryBuffer::~MemoryBuffer() { +MemoryBuffer::~MemoryBuffer() +{ if (this->buffer) { MEM_freeN(this->buffer); this->buffer = NULL; } } -void MemoryBuffer::copyContentFrom(MemoryBuffer *otherBuffer) { +void MemoryBuffer::copyContentFrom(MemoryBuffer *otherBuffer) +{ if (!otherBuffer) { return; } @@ -103,7 +113,8 @@ void MemoryBuffer::copyContentFrom(MemoryBuffer *otherBuffer) { } } -void MemoryBuffer::read(float* result, int x, int y) { +void MemoryBuffer::read(float *result, int x, int y) +{ if (x>=this->rect.xmin && x < this->rect.xmax && y>=this->rect.ymin && y < this->rect.ymax) { int dx = x-this->rect.xmin; @@ -121,7 +132,8 @@ void MemoryBuffer::read(float* result, int x, int y) { result[3] = 0.0f; } } -void MemoryBuffer::writePixel(int x, int y, float color[4]) { +void MemoryBuffer::writePixel(int x, int y, float color[4]) +{ if (x>=this->rect.xmin && x < this->rect.xmax && y>=this->rect.ymin && y < this->rect.ymax) { int offset = (this->chunkWidth*y+x)*4; @@ -132,7 +144,8 @@ void MemoryBuffer::writePixel(int x, int y, float color[4]) { } } -void MemoryBuffer::readCubic(float* result, float x, float y) { +void MemoryBuffer::readCubic(float *result, float x, float y) +{ int x1 = floor(x); int x2 = x1 + 1; int y1 = floor(y); @@ -208,7 +221,7 @@ static float EWA_WTS[EWA_MAXIDX + 1] = 0.00754159f, 0.00625989f, 0.00498819f, 0.00372644f, 0.00247454f, 0.00123242f, 0.f }; -static void radangle2imp(float a2, float b2, float th, float* A, float* B, float* C, float* F) +static void radangle2imp(float a2, float b2, float th, float *A, float *B, float *C, float *F) { float ct2 = cosf(th); const float st2 = 1.f - ct2*ct2; // <- sin(th)^2 @@ -220,7 +233,7 @@ static void radangle2imp(float a2, float b2, float th, float* A, float* B, float } // all tests here are done to make sure possible overflows are hopefully minimized -static void imp2radangle(float A, float B, float C, float F, float* a, float* b, float* th, float* ecc) +static void imp2radangle(float A, float B, float C, float F, float *a, float *b, float *th, float *ecc) { if (F <= 1e-5f) { // use arbitrary major radius, zero minor, infinite eccentricity *a = sqrtf(A > C ? A : C); @@ -247,12 +260,14 @@ static void imp2radangle(float A, float B, float C, float F, float* a, float* b, } } -float clipuv(float x, float limit) { +float clipuv(float x, float limit) +{ x = (x < 0) ? 0 : ((x >= limit) ? (limit - 1) : x); return x; } -void MemoryBuffer::readEWA(float* result, float fx, float fy, float dx, float dy) { +void MemoryBuffer::readEWA(float *result, float fx, float fy, float dx, float dy) +{ int width = this->getWidth(), height = this->getHeight(); // scaling dxt/dyt by full resolution can cause overflow because of huge A/B/C and esp. F values, diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h index 78fb16a7b12..bfc18424570 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.h +++ b/source/blender/compositor/intern/COM_MemoryBuffer.h @@ -88,18 +88,18 @@ private: /** * @brief the actual float buffer/data */ - float* buffer; + float *buffer; public: /** * @brief construct new MemoryBuffer for a chunk */ - MemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti* rect); + MemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti *rect); /** * @brief construct new temporarily MemoryBuffer for an area */ - MemoryBuffer(MemoryProxy *memoryProxy, rcti* rect); + MemoryBuffer(MemoryProxy *memoryProxy, rcti *rect); /** * @brief destructor @@ -115,7 +115,7 @@ public: * @brief get the data of this MemoryBuffer * @note buffer should already be available in memory */ - float* getBuffer() {return this->buffer;} + float *getBuffer() {return this->buffer;} /** * @brief after execution the state will be set to available by calling this method @@ -124,9 +124,9 @@ public: this->state = COM_MB_AVAILABLE; } - void read(float* result, int x, int y); + void read(float *result, int x, int y); void writePixel(int x, int y, float color[4]); - void readCubic(float* result, float x, float y); + void readCubic(float *result, float x, float y); void readEWA(float *result, float fx, float fy, float dx, float dy); /** @@ -138,12 +138,12 @@ public: * @brief add the content from otherBuffer to this MemoryBuffer * @param otherBuffer source buffer */ - void copyContentFrom(MemoryBuffer* otherBuffer); + void copyContentFrom(MemoryBuffer *otherBuffer); /** * @brief get the rect of this MemoryBuffer */ - rcti* getRect() {return &this->rect;} + rcti *getRect() {return &this->rect;} /** * @brief get the width of this MemoryBuffer @@ -160,9 +160,9 @@ public: */ void clear(); - MemoryBuffer* duplicate(); + MemoryBuffer *duplicate(); - float* convertToValueBuffer(); + float *convertToValueBuffer(); private: unsigned int determineBufferSize(); }; diff --git a/source/blender/compositor/intern/COM_MemoryManager.cpp b/source/blender/compositor/intern/COM_MemoryManager.cpp index 661afb20d53..4f97b0b1e80 100644 --- a/source/blender/compositor/intern/COM_MemoryManager.cpp +++ b/source/blender/compositor/intern/COM_MemoryManager.cpp @@ -29,7 +29,8 @@ vector buffers; ThreadMutex mutex; -MemoryBuffer* MemoryManager::allocateMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber, rcti *rect) { +MemoryBuffer *MemoryManager::allocateMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber, rcti *rect) +{ MemoryBuffer *result = new MemoryBuffer(id, chunkNumber, rect); MemoryManagerState * state = MemoryManager::getState(id); state->addMemoryBuffer(result); @@ -39,30 +40,35 @@ MemoryBuffer* MemoryManager::allocateMemoryBuffer(MemoryProxy *id, unsigned int return result; } -void MemoryManager::addMemoryProxy(MemoryProxy *memoryProxy) { +void MemoryManager::addMemoryProxy(MemoryProxy *memoryProxy) +{ MemoryManagerState * state = MemoryManager::getState(memoryProxy); if (!state) { state = new MemoryManagerState(memoryProxy); memoryProxy->setState(state); } } -MemoryBuffer* MemoryManager::getMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber) { +MemoryBuffer *MemoryManager::getMemoryBuffer(MemoryProxy *id, unsigned int chunkNumber) +{ MemoryManagerState * state = MemoryManager::getState(id); if (!state) { return NULL; } - MemoryBuffer* buffer = state->getMemoryBuffer(chunkNumber); + MemoryBuffer *buffer = state->getMemoryBuffer(chunkNumber); if (!buffer) return NULL; return buffer; } -MemoryManagerState* MemoryManager::getState(MemoryProxy* memoryProxy) { +MemoryManagerState *MemoryManager::getState(MemoryProxy *memoryProxy) +{ return memoryProxy->getState(); } -void MemoryManager::initialize() { +void MemoryManager::initialize() +{ BLI_mutex_init(&mutex); } -void MemoryManager::clear() { +void MemoryManager::clear() +{ buffers.clear(); BLI_mutex_end(&mutex); } diff --git a/source/blender/compositor/intern/COM_MemoryManager.h b/source/blender/compositor/intern/COM_MemoryManager.h index 506bf2a8c24..6194d40d9a5 100644 --- a/source/blender/compositor/intern/COM_MemoryManager.h +++ b/source/blender/compositor/intern/COM_MemoryManager.h @@ -109,7 +109,7 @@ private: * @brief retrieve the state of a certain MemoryProxy; * @param memoryProxy the MemoryProxy to retrieve the state from */ - static MemoryManagerState* getState(MemoryProxy* memoryProxy); + static MemoryManagerState *getState(MemoryProxy *memoryProxy); public: /** * @brief allocate a memory buffer @@ -117,7 +117,7 @@ public: * @param chunkNumber number of the chunk to receive * @param rect size + position of the chunk */ - static MemoryBuffer* allocateMemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti* rect); + static MemoryBuffer *allocateMemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti *rect); /** * @brief get a memory buffer @@ -125,7 +125,7 @@ public: * @param chunkNumber number of the chunk to receive * @param addUser must we add a user to the chunk. */ - static MemoryBuffer* getMemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber); + static MemoryBuffer *getMemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber); /** * @brief add a MemoryProxy to the scope of the memory manager diff --git a/source/blender/compositor/intern/COM_MemoryManagerState.cpp b/source/blender/compositor/intern/COM_MemoryManagerState.cpp index 620092b2825..b40ae146f9e 100644 --- a/source/blender/compositor/intern/COM_MemoryManagerState.cpp +++ b/source/blender/compositor/intern/COM_MemoryManagerState.cpp @@ -22,22 +22,25 @@ #include "COM_MemoryManagerState.h" -MemoryManagerState::MemoryManagerState(MemoryProxy *memoryProxy) { +MemoryManagerState::MemoryManagerState(MemoryProxy *memoryProxy) +{ this->memoryProxy = memoryProxy; this->currentSize = 0; this->chunkBuffers = NULL; BLI_mutex_init(&this->mutex); } -MemoryProxy * MemoryManagerState::getMemoryProxy() { +MemoryProxy * MemoryManagerState::getMemoryProxy() +{ return this->memoryProxy; } -MemoryManagerState::~MemoryManagerState() { +MemoryManagerState::~MemoryManagerState() +{ this->memoryProxy = NULL; unsigned int index; for (index = 0 ; index < this->currentSize; index ++) { - MemoryBuffer* buffer = this->chunkBuffers[index]; + MemoryBuffer *buffer = this->chunkBuffers[index]; if (buffer) { delete buffer; } @@ -46,7 +49,8 @@ MemoryManagerState::~MemoryManagerState() { BLI_mutex_end(&this->mutex); } -void MemoryManagerState::addMemoryBuffer(MemoryBuffer *buffer) { +void MemoryManagerState::addMemoryBuffer(MemoryBuffer *buffer) +{ BLI_mutex_lock(&this->mutex); unsigned int chunkNumber = buffer->getChunkNumber(); unsigned int index; @@ -76,8 +80,9 @@ void MemoryManagerState::addMemoryBuffer(MemoryBuffer *buffer) { BLI_mutex_unlock(&this->mutex); } -MemoryBuffer* MemoryManagerState::getMemoryBuffer(unsigned int chunkNumber) { - MemoryBuffer* result = NULL; +MemoryBuffer *MemoryManagerState::getMemoryBuffer(unsigned int chunkNumber) +{ + MemoryBuffer *result = NULL; if (chunkNumber< this->currentSize) { result = this->chunkBuffers[chunkNumber]; if (result) { diff --git a/source/blender/compositor/intern/COM_MemoryManagerState.h b/source/blender/compositor/intern/COM_MemoryManagerState.h index 4b4f0a112a8..8e8cb484d1a 100644 --- a/source/blender/compositor/intern/COM_MemoryManagerState.h +++ b/source/blender/compositor/intern/COM_MemoryManagerState.h @@ -75,13 +75,13 @@ public: /** * @brief add a new memorybuffer to the state */ - void addMemoryBuffer(MemoryBuffer* buffer); + void addMemoryBuffer(MemoryBuffer *buffer); /** * @brief get the MemoryBuffer assiciated to a chunk. * @param chunkNumber the chunknumber */ - MemoryBuffer* getMemoryBuffer(unsigned int chunkNumber); + MemoryBuffer *getMemoryBuffer(unsigned int chunkNumber); }; #endif diff --git a/source/blender/compositor/intern/COM_MemoryProxy.cpp b/source/blender/compositor/intern/COM_MemoryProxy.cpp index 0880af9833c..7ff4f4949f0 100644 --- a/source/blender/compositor/intern/COM_MemoryProxy.cpp +++ b/source/blender/compositor/intern/COM_MemoryProxy.cpp @@ -23,13 +23,15 @@ #include "COM_MemoryProxy.h" -MemoryProxy::MemoryProxy() { +MemoryProxy::MemoryProxy() +{ this->state = NULL; this->writeBufferOperation = NULL; this->executor = NULL; } -MemoryProxy::~MemoryProxy() { +MemoryProxy::~MemoryProxy() +{ if (this->state) { delete this->state; this->state = NULL; diff --git a/source/blender/compositor/intern/COM_MemoryProxy.h b/source/blender/compositor/intern/COM_MemoryProxy.h index 9424ea9a3e5..276ebeed1e2 100644 --- a/source/blender/compositor/intern/COM_MemoryProxy.h +++ b/source/blender/compositor/intern/COM_MemoryProxy.h @@ -76,19 +76,19 @@ public: /** * @brief get the ExecutionGroup that can be scheduled to calculate a certain chunk. */ - ExecutionGroup* getExecutor() {return this->executor;} + ExecutionGroup *getExecutor() {return this->executor;} /** * @brief set the WriteBufferOperation that is responsible for writing to this MemoryProxy * @param operation */ - void setWriteBufferOperation(WriteBufferOperation* operation) {this->writeBufferOperation = operation;} + void setWriteBufferOperation(WriteBufferOperation *operation) {this->writeBufferOperation = operation;} /** * @brief get the WriteBufferOperation that is responsible for writing to this MemoryProxy * @return WriteBufferOperation */ - WriteBufferOperation* getWriteBufferOperation() {return this->writeBufferOperation;} + WriteBufferOperation *getWriteBufferOperation() {return this->writeBufferOperation;} /** * @brief set the memorymanager state of this MemoryProxy, this is set from the MemoryManager @@ -100,7 +100,7 @@ public: * @brief get the state of this MemoryProxy * @return MemoryManagerState reference to the state of this MemoryProxy. */ - MemoryManagerState* getState() {return this->state;} + MemoryManagerState *getState() {return this->state;} }; #endif diff --git a/source/blender/compositor/intern/COM_Node.cpp b/source/blender/compositor/intern/COM_Node.cpp index 4e127c61d4e..f06672ac80b 100644 --- a/source/blender/compositor/intern/COM_Node.cpp +++ b/source/blender/compositor/intern/COM_Node.cpp @@ -38,7 +38,8 @@ //#include "stdio.h" #include "COM_defines.h" -Node::Node(bNode* editorNode, bool create_sockets) { +Node::Node(bNode *editorNode, bool create_sockets) +{ this->editorNode = editorNode; if (create_sockets) { @@ -62,13 +63,18 @@ Node::Node(bNode* editorNode, bool create_sockets) { } } } -Node::Node() { +Node::Node() +{ this->editorNode = NULL; } -bNode* Node::getbNode() {return this->editorNode;} +bNode *Node::getbNode() +{ + return this->editorNode; +} -void Node::addSetValueOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex) { +void Node::addSetValueOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex) +{ bNodeSocket *bSock = (bNodeSocket*)this->getEditorInputSocket(editorNodeInputSocketIndex); SetValueOperation *operation = new SetValueOperation(); bNodeSocketValueFloat *val = (bNodeSocketValueFloat*)bSock->default_value; @@ -77,7 +83,8 @@ void Node::addSetValueOperation(ExecutionSystem *graph, InputSocket* inputsocket graph->addOperation(operation); } -void Node::addPreviewOperation(ExecutionSystem *system, OutputSocket *outputSocket, int priority) { +void Node::addPreviewOperation(ExecutionSystem *system, OutputSocket *outputSocket, int priority) +{ #ifdef COM_PREVIEW_ENABLED PreviewOperation *operation = new PreviewOperation(); system->addOperation(operation); @@ -88,14 +95,16 @@ void Node::addPreviewOperation(ExecutionSystem *system, OutputSocket *outputSock #endif } -void Node::addPreviewOperation(ExecutionSystem *system, InputSocket *inputSocket, int priority) { +void Node::addPreviewOperation(ExecutionSystem *system, InputSocket *inputSocket, int priority) +{ if (inputSocket->isConnected()) { OutputSocket *outputsocket = inputSocket->getConnection()->getFromSocket(); this->addPreviewOperation(system, outputsocket, priority); } } -SocketConnection* Node::addLink(ExecutionSystem *graph, OutputSocket* outputSocket, InputSocket* inputsocket) { +SocketConnection *Node::addLink(ExecutionSystem *graph, OutputSocket *outputSocket, InputSocket *inputsocket) +{ if (inputsocket->isConnected()) { return NULL; } @@ -108,7 +117,8 @@ SocketConnection* Node::addLink(ExecutionSystem *graph, OutputSocket* outputSock return connection; } -void Node::addSetColorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex) { +void Node::addSetColorOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex) +{ bNodeSocket *bSock = (bNodeSocket*)this->getEditorInputSocket(editorNodeInputSocketIndex); SetColorOperation *operation = new SetColorOperation(); bNodeSocketValueRGBA *val = (bNodeSocketValueRGBA*)bSock->default_value; @@ -120,7 +130,8 @@ void Node::addSetColorOperation(ExecutionSystem *graph, InputSocket* inputsocket graph->addOperation(operation); } -void Node::addSetVectorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex) { +void Node::addSetVectorOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex) +{ bNodeSocket *bSock = (bNodeSocket*)this->getEditorInputSocket(editorNodeInputSocketIndex); bNodeSocketValueVector *val = (bNodeSocketValueVector*)bSock->default_value; SetVectorOperation *operation = new SetVectorOperation(); @@ -132,7 +143,8 @@ void Node::addSetVectorOperation(ExecutionSystem *graph, InputSocket* inputsocke graph->addOperation(operation); } -bNodeSocket* Node::getEditorInputSocket(int editorNodeInputSocketIndex) { +bNodeSocket *Node::getEditorInputSocket(int editorNodeInputSocketIndex) +{ bNodeSocket *bSock = (bNodeSocket*)this->getbNode()->inputs.first; int index = 0; while (bSock != NULL) { @@ -144,7 +156,8 @@ bNodeSocket* Node::getEditorInputSocket(int editorNodeInputSocketIndex) { } return NULL; } -bNodeSocket* Node::getEditorOutputSocket(int editorNodeInputSocketIndex) { +bNodeSocket *Node::getEditorOutputSocket(int editorNodeInputSocketIndex) +{ bNodeSocket *bSock = (bNodeSocket*)this->getbNode()->outputs.first; int index = 0; while (bSock != NULL) { @@ -157,11 +170,12 @@ bNodeSocket* Node::getEditorOutputSocket(int editorNodeInputSocketIndex) { return NULL; } -InputSocket* Node::findInputSocketBybNodeSocket(bNodeSocket* socket) { +InputSocket *Node::findInputSocketBybNodeSocket(bNodeSocket *socket) +{ vector &inputsockets = this->getInputSockets(); unsigned int index; for (index = 0 ; index < inputsockets.size(); index ++) { - InputSocket* input = inputsockets[index]; + InputSocket *input = inputsockets[index]; if (input->getbNodeSocket() == socket) { return input; } @@ -169,11 +183,12 @@ InputSocket* Node::findInputSocketBybNodeSocket(bNodeSocket* socket) { return NULL; } -OutputSocket* Node::findOutputSocketBybNodeSocket(bNodeSocket* socket) { +OutputSocket *Node::findOutputSocketBybNodeSocket(bNodeSocket *socket) +{ vector &outputsockets = this->getOutputSockets(); unsigned int index; for (index = 0 ; index < outputsockets.size(); index ++) { - OutputSocket* output = outputsockets[index]; + OutputSocket *output = outputsockets[index]; if (output->getbNodeSocket() == socket) { return output; } diff --git a/source/blender/compositor/intern/COM_Node.h b/source/blender/compositor/intern/COM_Node.h index 3706592a585..2666d0a6980 100644 --- a/source/blender/compositor/intern/COM_Node.h +++ b/source/blender/compositor/intern/COM_Node.h @@ -50,15 +50,15 @@ private: /** * @brief stores the reference to the SDNA bNode struct */ - bNode* editorNode; + bNode *editorNode; public: - Node(bNode* editorNode, bool create_sockets=true); + Node(bNode *editorNode, bool create_sockets=true); /** * @brief get the reference to the SDNA bNode struct */ - bNode* getbNode(); + bNode *getbNode(); /** * @brief convert node to operation @@ -68,31 +68,31 @@ public: * @param system the ExecutionSystem where the operations need to be added * @param context reference to the CompositorContext */ - virtual void convertToOperations(ExecutionSystem* system, CompositorContext * context) =0; + virtual void convertToOperations(ExecutionSystem *system, CompositorContext * context) =0; /** * this method adds a SetValueOperation as input of the input socket. * This can only be used from the convertToOperation method. all other usages are not allowed */ - void addSetValueOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex); + void addSetValueOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex); /** * this method adds a SetColorOperation as input of the input socket. * This can only be used from the convertToOperation method. all other usages are not allowed */ - void addSetColorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex); + void addSetColorOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex); /** * this method adds a SetVectorOperation as input of the input socket. * This can only be used from the convertToOperation method. all other usages are not allowed */ - void addSetVectorOperation(ExecutionSystem *graph, InputSocket* inputsocket, int editorNodeInputSocketIndex); + void addSetVectorOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex); /** * Creates a new link between an outputSocket and inputSocket and registrates the link to the graph * @return the new created link */ - SocketConnection* addLink(ExecutionSystem *graph, OutputSocket* outputSocket, InputSocket* inputsocket); + SocketConnection *addLink(ExecutionSystem *graph, OutputSocket *outputSocket, InputSocket *inputsocket); /** * is this node a group node. @@ -108,23 +108,23 @@ public: * * @param socket */ - InputSocket* findInputSocketBybNodeSocket(bNodeSocket* socket); + InputSocket *findInputSocketBybNodeSocket(bNodeSocket *socket); /** * @brief find the OutputSocket by bNodeSocket * * @param socket */ - OutputSocket* findOutputSocketBybNodeSocket(bNodeSocket* socket); + OutputSocket *findOutputSocketBybNodeSocket(bNodeSocket *socket); protected: Node(); - void addPreviewOperation(ExecutionSystem *system, InputSocket* inputSocket, int priority); - void addPreviewOperation(ExecutionSystem *system, OutputSocket* inputSocket, int priority); + void addPreviewOperation(ExecutionSystem *system, InputSocket *inputSocket, int priority); + void addPreviewOperation(ExecutionSystem *system, OutputSocket *inputSocket, int priority); - bNodeSocket* getEditorInputSocket(int editorNodeInputSocketIndex); - bNodeSocket* getEditorOutputSocket(int editorNodeOutputSocketIndex); + bNodeSocket *getEditorInputSocket(int editorNodeInputSocketIndex); + bNodeSocket *getEditorOutputSocket(int editorNodeOutputSocketIndex); private: }; diff --git a/source/blender/compositor/intern/COM_NodeBase.cpp b/source/blender/compositor/intern/COM_NodeBase.cpp index b6990ec0d79..17a623c9c81 100644 --- a/source/blender/compositor/intern/COM_NodeBase.cpp +++ b/source/blender/compositor/intern/COM_NodeBase.cpp @@ -29,11 +29,13 @@ #include "COM_SocketConnection.h" #include "COM_ExecutionSystem.h" -NodeBase::NodeBase() { +NodeBase::NodeBase() +{ } -NodeBase::~NodeBase() { +NodeBase::~NodeBase() +{ while (!this->outputsockets.empty()) { delete (this->outputsockets.back()); this->outputsockets.pop_back(); @@ -44,60 +46,70 @@ NodeBase::~NodeBase() { } } -void NodeBase::addInputSocket(DataType datatype) { +void NodeBase::addInputSocket(DataType datatype) +{ this->addInputSocket(datatype, COM_SC_CENTER, NULL); } -void NodeBase::addInputSocket(DataType datatype, InputSocketResizeMode resizeMode) { +void NodeBase::addInputSocket(DataType datatype, InputSocketResizeMode resizeMode) +{ this->addInputSocket(datatype, resizeMode, NULL); } -void NodeBase::addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket* bSocket) { +void NodeBase::addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket *bSocket) +{ InputSocket *socket = new InputSocket(datatype, resizeMode); socket->setEditorSocket(bSocket); socket->setNode(this); this->inputsockets.push_back(socket); } -void NodeBase::addOutputSocket(DataType datatype) { +void NodeBase::addOutputSocket(DataType datatype) +{ this->addOutputSocket(datatype, NULL); } -void NodeBase::addOutputSocket(DataType datatype, bNodeSocket* bSocket) { +void NodeBase::addOutputSocket(DataType datatype, bNodeSocket *bSocket) +{ OutputSocket *socket = new OutputSocket(datatype); socket->setEditorSocket(bSocket); socket->setNode(this); this->outputsockets.push_back(socket); } -const bool NodeBase::isInputNode() const { +const bool NodeBase::isInputNode() const +{ return this->inputsockets.size() == 0; } -OutputSocket* NodeBase::getOutputSocket(int index) { +OutputSocket *NodeBase::getOutputSocket(int index) +{ return this->outputsockets[index]; } -InputSocket* NodeBase::getInputSocket(int index) { +InputSocket *NodeBase::getInputSocket(int index) +{ return this->inputsockets[index]; } -void NodeBase::determineActualSocketDataTypes() { +void NodeBase::determineActualSocketDataTypes() +{ unsigned int index; for (index = 0 ; index < this->outputsockets.size() ; index ++) { - OutputSocket* socket = this->outputsockets[index]; + OutputSocket *socket = this->outputsockets[index]; if (socket->getActualDataType() ==COM_DT_UNKNOWN && socket->isConnected()) { socket->determineActualDataType(); } } for (index = 0 ; index < this->inputsockets.size() ; index ++) { - InputSocket* socket = this->inputsockets[index]; + InputSocket *socket = this->inputsockets[index]; if (socket->getActualDataType() ==COM_DT_UNKNOWN) { socket->determineActualDataType(); } } } -DataType NodeBase::determineActualDataType(OutputSocket *outputsocket) { +DataType NodeBase::determineActualDataType(OutputSocket *outputsocket) +{ const int inputIndex = outputsocket->getInputSocketDataTypeDeterminatorIndex(); if (inputIndex != -1) { return this->getInputSocket(inputIndex)->getActualDataType(); @@ -107,7 +119,8 @@ DataType NodeBase::determineActualDataType(OutputSocket *outputsocket) { } } -void NodeBase::notifyActualDataTypeSet(InputSocket *socket, DataType actualType) { +void NodeBase::notifyActualDataTypeSet(InputSocket *socket, DataType actualType) +{ unsigned int index; int socketIndex = -1; for (index = 0 ; index < this->inputsockets.size() ; index ++) { @@ -119,9 +132,10 @@ void NodeBase::notifyActualDataTypeSet(InputSocket *socket, DataType actualType) if (socketIndex == -1) return; for (index = 0 ; index < this->outputsockets.size() ; index ++) { - OutputSocket* socket = this->outputsockets[index]; + OutputSocket *socket = this->outputsockets[index]; if (socket->isActualDataTypeDeterminedByInputSocket() && - socket->getInputSocketDataTypeDeterminatorIndex() == socketIndex) { + socket->getInputSocketDataTypeDeterminatorIndex() == socketIndex) + { socket->setActualDataType(actualType); socket->fireActualDataType(); } diff --git a/source/blender/compositor/intern/COM_NodeBase.h b/source/blender/compositor/intern/COM_NodeBase.h index 10028324d91..123797c780a 100644 --- a/source/blender/compositor/intern/COM_NodeBase.h +++ b/source/blender/compositor/intern/COM_NodeBase.h @@ -124,32 +124,32 @@ public: * @param actualType [COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR] * the actual data type that is coming from the connected output socket */ - virtual void notifyActualDataTypeSet(InputSocket* socket, const DataType actualType); + virtual void notifyActualDataTypeSet(InputSocket *socket, const DataType actualType); /** * get the reference to a certain outputsocket * @param index * the index of the needed outputsocket */ - OutputSocket* getOutputSocket(const int index); + OutputSocket *getOutputSocket(const int index); /** * get the reference to the first outputsocket * @param index * the index of the needed outputsocket */ - inline OutputSocket* getOutputSocket() {return getOutputSocket(0);} + inline OutputSocket *getOutputSocket() {return getOutputSocket(0);} /** * get the reference to a certain inputsocket * @param index * the index of the needed inputsocket */ - InputSocket* getInputSocket(const int index); + InputSocket *getInputSocket(const int index); virtual bool isStatic() const {return false;} - void getStaticValues(float* result) const {} + void getStaticValues(float *result) const {} protected: NodeBase(); @@ -160,7 +160,7 @@ protected: */ void addInputSocket(DataType datatype); void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode); - void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket* socket); + void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket *socket); /** * @brief add an OutputSocket to the collection of outputsockets @@ -168,7 +168,7 @@ protected: * @param socket the OutputSocket to add */ void addOutputSocket(DataType datatype); - void addOutputSocket(DataType datatype, bNodeSocket* socket); + void addOutputSocket(DataType datatype, bNodeSocket *socket); }; #endif diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp index 71aaceb1b48..fae652e39d7 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cpp +++ b/source/blender/compositor/intern/COM_NodeOperation.cpp @@ -27,7 +27,8 @@ #include "COM_defines.h" #include "stdio.h" -NodeOperation::NodeOperation() { +NodeOperation::NodeOperation() +{ this->resolutionInputSocketIndex = 0; this->complex = false; this->width = 0; @@ -35,13 +36,14 @@ NodeOperation::NodeOperation() { this->openCL = false; } -void NodeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void NodeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ unsigned int temp[2]; unsigned int temp2[2]; vector &inputsockets = this->getInputSockets(); for (unsigned int index = 0 ; index < inputsockets.size();index++) { - InputSocket* inputSocket = inputsockets[index]; + InputSocket *inputSocket = inputsockets[index]; if (inputSocket->isConnected()) { if (index == this->resolutionInputSocketIndex) { inputSocket->determineResolution(resolution, preferredResolution); @@ -52,7 +54,7 @@ void NodeOperation::determineResolution(unsigned int resolution[], unsigned int } } for (unsigned int index = 0 ; index < inputsockets.size();index++) { - InputSocket* inputSocket = inputsockets[index]; + InputSocket *inputSocket = inputsockets[index]; if (inputSocket->isConnected()) { if (index != resolutionInputSocketIndex) { inputSocket->determineResolution(temp, temp2); @@ -60,28 +62,36 @@ void NodeOperation::determineResolution(unsigned int resolution[], unsigned int } } } -void NodeOperation::setResolutionInputSocketIndex(unsigned int index) { +void NodeOperation::setResolutionInputSocketIndex(unsigned int index) +{ this->resolutionInputSocketIndex = index; } -void NodeOperation::initExecution() { +void NodeOperation::initExecution() +{ } -void NodeOperation::initMutex() { +void NodeOperation::initMutex() +{ BLI_mutex_init(&mutex); } -void NodeOperation::deinitMutex() { +void NodeOperation::deinitMutex() +{ BLI_mutex_end(&mutex); } -void NodeOperation::deinitExecution() { +void NodeOperation::deinitExecution() +{ } -SocketReader* NodeOperation::getInputSocketReader(unsigned int inputSocketIndex) { +SocketReader *NodeOperation::getInputSocketReader(unsigned int inputSocketIndex) +{ return this->getInputSocket(inputSocketIndex)->getReader(); } -NodeOperation* NodeOperation::getInputOperation(unsigned int inputSocketIndex) { +NodeOperation *NodeOperation::getInputOperation(unsigned int inputSocketIndex) +{ return this->getInputSocket(inputSocketIndex)->getOperation(); } -void NodeOperation::getConnectedInputSockets(vector *sockets) { +void NodeOperation::getConnectedInputSockets(vector *sockets) +{ vector &inputsockets = this->getInputSockets(); for (vector::iterator iterator = inputsockets.begin() ; iterator!= inputsockets.end() ; iterator++) { InputSocket *socket = *iterator; @@ -91,7 +101,8 @@ void NodeOperation::getConnectedInputSockets(vector *sockets) { } } -bool NodeOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti* output) { +bool NodeOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti *output) +{ if (this->isInputNode()) { BLI_init_rcti(output, input->xmin, input->xmax, input->ymin, input->ymax); return false; @@ -101,9 +112,9 @@ bool NodeOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOpe vector &inputsockets = this->getInputSockets(); for (index = 0 ; index < inputsockets.size() ; index++) { - InputSocket* inputsocket = inputsockets[index]; + InputSocket *inputsocket = inputsockets[index]; if (inputsocket->isConnected()) { - NodeOperation* inputoperation = (NodeOperation*)inputsocket->getConnection()->getFromNode(); + NodeOperation *inputoperation = (NodeOperation*)inputsocket->getConnection()->getFromNode(); bool result = inputoperation->determineDependingAreaOfInterest(input, readOperation, output); if (result) { return true; diff --git a/source/blender/compositor/intern/COM_NodeOperation.h b/source/blender/compositor/intern/COM_NodeOperation.h index 5dabc4db840..bba3de2ec98 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.h +++ b/source/blender/compositor/intern/COM_NodeOperation.h @@ -153,7 +153,7 @@ public: * @param clMemToCleanUp all created cl_mem references must be added to this list. Framework will clean this after execution * @param clKernelsToCleanUp all created cl_kernel references must be added to this list. Framework will clean this after execution */ - virtual void executeOpenCL(cl_context context,cl_program program, cl_command_queue queue, MemoryBuffer* outputMemoryBuffer, cl_mem clOutputBuffer, MemoryBuffer** inputMemoryBuffers, list *clMemToCleanUp, list *clKernelsToCleanUp) {} + virtual void executeOpenCL(cl_context context,cl_program program, cl_command_queue queue, MemoryBuffer *outputMemoryBuffer, cl_mem clOutputBuffer, MemoryBuffer** inputMemoryBuffers, list *clMemToCleanUp, list *clKernelsToCleanUp) {} virtual void deinitExecution(); void deinitMutex(); @@ -195,7 +195,7 @@ public: */ virtual const bool isActiveViewerOutput() const {return false;} - virtual bool determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output); + virtual bool determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti *output); /** * @brief set the index of the input socket that will determine the resolution of this operation @@ -222,11 +222,11 @@ protected: NodeOperation(); void setWidth(unsigned int width) {this->width = width;} - void setHeight(unsigned int height) {this->height= height;} - SocketReader* getInputSocketReader(unsigned int inputSocketindex); - NodeOperation* getInputOperation(unsigned int inputSocketindex); + void setHeight(unsigned int height) {this->height = height;} + SocketReader *getInputSocketReader(unsigned int inputSocketindex); + NodeOperation *getInputOperation(unsigned int inputSocketindex); - inline ThreadMutex* getMutex() {return &this->mutex;} + inline ThreadMutex *getMutex() {return &this->mutex;} /** * @brief set whether this operation is complex diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.cpp b/source/blender/compositor/intern/COM_OpenCLDevice.cpp index b986865ecf3..0945b426a4e 100644 --- a/source/blender/compositor/intern/COM_OpenCLDevice.cpp +++ b/source/blender/compositor/intern/COM_OpenCLDevice.cpp @@ -24,26 +24,30 @@ #include "COM_WorkScheduler.h" -OpenCLDevice::OpenCLDevice(cl_context context, cl_device_id device, cl_program program) { +OpenCLDevice::OpenCLDevice(cl_context context, cl_device_id device, cl_program program) +{ this->device = device; this->context = context; this->program = program; this->queue = NULL; } -bool OpenCLDevice::initialize() { +bool OpenCLDevice::initialize() +{ cl_int error; queue = clCreateCommandQueue(context, device, 0, &error); return false; } -void OpenCLDevice::deinitialize() { +void OpenCLDevice::deinitialize() +{ if (queue) { clReleaseCommandQueue(queue); } } -void OpenCLDevice::execute(WorkPackage *work) { +void OpenCLDevice::execute(WorkPackage *work) +{ const unsigned int chunkNumber = work->getChunkNumber(); ExecutionGroup * executionGroup = work->getExecutionGroup(); rcti rect; diff --git a/source/blender/compositor/intern/COM_OutputSocket.cpp b/source/blender/compositor/intern/COM_OutputSocket.cpp index 5380a7ec492..00d3518cd15 100644 --- a/source/blender/compositor/intern/COM_OutputSocket.cpp +++ b/source/blender/compositor/intern/COM_OutputSocket.cpp @@ -25,30 +25,35 @@ #include "COM_SocketConnection.h" #include "COM_NodeOperation.h" -OutputSocket::OutputSocket(DataType datatype) :Socket(datatype) { +OutputSocket::OutputSocket(DataType datatype) :Socket(datatype) +{ this->inputSocketDataTypeDeterminatorIndex = -1; } -OutputSocket::OutputSocket(DataType datatype, int inputSocketDataTypeDeterminatorIndex) :Socket(datatype) { +OutputSocket::OutputSocket(DataType datatype, int inputSocketDataTypeDeterminatorIndex) :Socket(datatype) +{ this->inputSocketDataTypeDeterminatorIndex = inputSocketDataTypeDeterminatorIndex; } -OutputSocket::OutputSocket(OutputSocket *from): Socket(from->getDataType()) { +OutputSocket::OutputSocket(OutputSocket *from): Socket(from->getDataType()) +{ this->inputSocketDataTypeDeterminatorIndex = from->getInputSocketDataTypeDeterminatorIndex(); } int OutputSocket::isOutputSocket() const { return true; } const int OutputSocket::isConnected() const { return this->connections.size()!=0; } -void OutputSocket::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { - NodeBase* node = this->getNode(); +void OutputSocket::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ + NodeBase *node = this->getNode(); if (node->isOperation()) { - NodeOperation* operation = (NodeOperation*)node; + NodeOperation *operation = (NodeOperation*)node; operation->determineResolution(resolution, preferredResolution); operation->setResolution(resolution); } } -void OutputSocket::determineActualDataType() { +void OutputSocket::determineActualDataType() +{ DataType actualDatatype = this->getNode()->determineActualDataType(this); /** @todo: set the channel info needs to be moved after integration with OCIO */ @@ -79,18 +84,21 @@ void OutputSocket::determineActualDataType() { this->fireActualDataType(); } -void OutputSocket::addConnection(SocketConnection *connection) { +void OutputSocket::addConnection(SocketConnection *connection) +{ this->connections.push_back(connection); } -void OutputSocket::fireActualDataType() { +void OutputSocket::fireActualDataType() +{ unsigned int index; for (index = 0 ; index < this->connections.size();index ++) { SocketConnection *connection = this->connections[index]; connection->getToSocket()->notifyActualInputType(this->getActualDataType()); } } -void OutputSocket::relinkConnections(OutputSocket *relinkToSocket, bool single) { +void OutputSocket::relinkConnections(OutputSocket *relinkToSocket, bool single) +{ if (isConnected()) { if (single) { SocketConnection *connection = this->connections[0]; @@ -111,28 +119,31 @@ void OutputSocket::relinkConnections(OutputSocket *relinkToSocket, bool single) } } } -void OutputSocket::removeFirstConnection() { +void OutputSocket::removeFirstConnection() +{ SocketConnection *connection = this->connections[0]; - InputSocket* inputSocket = connection->getToSocket(); + InputSocket *inputSocket = connection->getToSocket(); if (inputSocket != NULL) { inputSocket->setConnection(NULL); } this->connections.erase(this->connections.begin()); } -void OutputSocket::clearConnections() { +void OutputSocket::clearConnections() +{ while (this->isConnected()) { removeFirstConnection(); } } -WriteBufferOperation* OutputSocket::findAttachedWriteBufferOperation() const { +WriteBufferOperation *OutputSocket::findAttachedWriteBufferOperation() const +{ unsigned int index; for (index = 0 ; index < this->connections.size();index++) { - SocketConnection* connection = this->connections[index]; - NodeBase* node = connection->getToNode(); + SocketConnection *connection = this->connections[index]; + NodeBase *node = connection->getToNode(); if (node->isOperation()) { - NodeOperation* operation = (NodeOperation*)node; + NodeOperation *operation = (NodeOperation*)node; if (operation->isWriteBufferOperation()) { return (WriteBufferOperation*)operation; } @@ -141,7 +152,8 @@ WriteBufferOperation* OutputSocket::findAttachedWriteBufferOperation() const { return NULL; } -ChannelInfo* OutputSocket::getChannelInfo(const int channelnumber) { +ChannelInfo *OutputSocket::getChannelInfo(const int channelnumber) +{ return &this->channelinfo[channelnumber]; } diff --git a/source/blender/compositor/intern/COM_OutputSocket.h b/source/blender/compositor/intern/COM_OutputSocket.h index 8815f0bb3a8..640588417b4 100644 --- a/source/blender/compositor/intern/COM_OutputSocket.h +++ b/source/blender/compositor/intern/COM_OutputSocket.h @@ -58,7 +58,7 @@ public: OutputSocket(DataType datatype, int inputSocketDataTypeDeterminatorIndex); OutputSocket(OutputSocket * from); void addConnection(SocketConnection *connection); - SocketConnection* getConnection(unsigned int index) {return this->connections[index];} + SocketConnection *getConnection(unsigned int index) {return this->connections[index];} const int isConnected() const; int isOutputSocket() const; @@ -90,8 +90,8 @@ public: * @brief find a connected write buffer operation to this OutputSocket * @return WriteBufferOperation or NULL */ - WriteBufferOperation* findAttachedWriteBufferOperation() const; - ChannelInfo* getChannelInfo(const int channelnumber); + WriteBufferOperation *findAttachedWriteBufferOperation() const; + ChannelInfo *getChannelInfo(const int channelnumber); /** * @brief trigger determine actual data type to all connected sockets diff --git a/source/blender/compositor/intern/COM_Socket.cpp b/source/blender/compositor/intern/COM_Socket.cpp index cb429c9df4a..a5336ac1202 100644 --- a/source/blender/compositor/intern/COM_Socket.cpp +++ b/source/blender/compositor/intern/COM_Socket.cpp @@ -24,14 +24,16 @@ #include "COM_Node.h" #include "COM_SocketConnection.h" -Socket::Socket(DataType datatype) { +Socket::Socket(DataType datatype) +{ this->datatype = datatype; this->actualType = COM_DT_UNKNOWN; this->editorSocket = NULL; this->node = NULL; } -DataType Socket::getDataType() const { +DataType Socket::getDataType() const +{ return this->datatype; } @@ -39,9 +41,10 @@ int Socket::isInputSocket() const { return false; } int Socket::isOutputSocket() const { return false; } const int Socket::isConnected() const {return false;} void Socket::setNode(NodeBase *node) {this->node = node;} -NodeBase* Socket::getNode() const {return this->node;} +NodeBase *Socket::getNode() const {return this->node;} DataType Socket::getActualDataType() const {return this->actualType;} -void Socket::setActualDataType(DataType actualType) { +void Socket::setActualDataType(DataType actualType) +{ this->actualType = actualType; } diff --git a/source/blender/compositor/intern/COM_Socket.h b/source/blender/compositor/intern/COM_Socket.h index 3243a371cda..8ad7a5c7fde 100644 --- a/source/blender/compositor/intern/COM_Socket.h +++ b/source/blender/compositor/intern/COM_Socket.h @@ -49,7 +49,7 @@ private: /** * Reference to the node where this Socket belongs to */ - NodeBase* node; + NodeBase *node; /** * the datatype of this socket. Is used for automatically data transformation. @@ -63,13 +63,13 @@ private: */ DataType actualType; - bNodeSocket* editorSocket; + bNodeSocket *editorSocket; public: Socket(DataType datatype); DataType getDataType() const; - void setNode(NodeBase* node); - NodeBase* getNode() const; + void setNode(NodeBase *node); + NodeBase *getNode() const; /** * @brief get the actual data type @@ -91,8 +91,8 @@ public: virtual void determineResolution(int resolution[], unsigned int preferredResolution[]) {} virtual void determineActualDataType() {} - void setEditorSocket(bNodeSocket* editorSocket) {this->editorSocket = editorSocket;} - bNodeSocket* getbNodeSocket() const {return this->editorSocket;} + void setEditorSocket(bNodeSocket *editorSocket) {this->editorSocket = editorSocket;} + bNodeSocket *getbNodeSocket() const {return this->editorSocket;} }; diff --git a/source/blender/compositor/intern/COM_SocketConnection.cpp b/source/blender/compositor/intern/COM_SocketConnection.cpp index e3e52005add..9f0c736392a 100644 --- a/source/blender/compositor/intern/COM_SocketConnection.cpp +++ b/source/blender/compositor/intern/COM_SocketConnection.cpp @@ -23,30 +23,34 @@ #include "COM_SocketConnection.h" #include "COM_NodeOperation.h" -SocketConnection::SocketConnection() { +SocketConnection::SocketConnection() +{ this->fromSocket = NULL; this->toSocket = NULL; this->setIgnoreResizeCheck(false); } -void SocketConnection::setFromSocket(OutputSocket* fromsocket) { +void SocketConnection::setFromSocket(OutputSocket *fromsocket) +{ if (fromsocket == NULL) { throw "ERROR"; } this->fromSocket = fromsocket; } -OutputSocket* SocketConnection::getFromSocket() const {return this->fromSocket;} -void SocketConnection::setToSocket(InputSocket* tosocket) { +OutputSocket *SocketConnection::getFromSocket() const {return this->fromSocket;} +void SocketConnection::setToSocket(InputSocket *tosocket) +{ if (tosocket == NULL) { throw "ERROR"; } this->toSocket = tosocket; } -InputSocket* SocketConnection::getToSocket() const {return this->toSocket;} +InputSocket *SocketConnection::getToSocket() const {return this->toSocket;} -NodeBase* SocketConnection::getFromNode() const { +NodeBase *SocketConnection::getFromNode() const +{ if (this->getFromSocket() == NULL) { return NULL; } @@ -54,7 +58,8 @@ NodeBase* SocketConnection::getFromNode() const { return this->getFromSocket()->getNode(); } } -NodeBase* SocketConnection::getToNode() const { +NodeBase *SocketConnection::getToNode() const +{ if (this->getToSocket() == NULL) { return NULL; } @@ -62,7 +67,8 @@ NodeBase* SocketConnection::getToNode() const { return this->getToSocket()->getNode(); } } -bool SocketConnection::isValid() const { +bool SocketConnection::isValid() const +{ if ((this->getToSocket() != NULL && this->getFromSocket() != NULL)) { if (this->getFromNode()->isOperation() && this->getToNode()->isOperation()) { return true; @@ -71,10 +77,11 @@ bool SocketConnection::isValid() const { return false; } -bool SocketConnection::needsResolutionConversion() const { +bool SocketConnection::needsResolutionConversion() const +{ if (this->ignoreResizeCheck) {return false;} - NodeOperation* fromOperation = (NodeOperation*)this->getFromNode(); - NodeOperation* toOperation = (NodeOperation*)this->getToNode(); + NodeOperation *fromOperation = (NodeOperation*)this->getFromNode(); + NodeOperation *toOperation = (NodeOperation*)this->getToNode(); if (this->toSocket->getResizeMode() == COM_SC_NO_RESIZE) {return false;} const unsigned int fromWidth = fromOperation->getWidth(); const unsigned int fromHeight = fromOperation->getHeight(); diff --git a/source/blender/compositor/intern/COM_SocketConnection.h b/source/blender/compositor/intern/COM_SocketConnection.h index 55811cc6ebe..1c4dcebfe07 100644 --- a/source/blender/compositor/intern/COM_SocketConnection.h +++ b/source/blender/compositor/intern/COM_SocketConnection.h @@ -66,25 +66,25 @@ public: * @brief set the startpoint of the connection * @param fromsocket */ - void setFromSocket(OutputSocket* fromsocket); + void setFromSocket(OutputSocket *fromsocket); /** * @brief get the startpoint of the connection * @return from OutputSocket */ - OutputSocket* getFromSocket() const; + OutputSocket *getFromSocket() const; /** * @brief set the endpoint of the connection * @param tosocket */ - void setToSocket(InputSocket* tosocket); + void setToSocket(InputSocket *tosocket); /** * @brief get the endpoint of the connection * @return to InputSocket */ - InputSocket* getToSocket() const; + InputSocket *getToSocket() const; /** * @brief check if this connection is valid diff --git a/source/blender/compositor/intern/COM_SocketReader.h b/source/blender/compositor/intern/COM_SocketReader.h index fd07726a939..24322847517 100644 --- a/source/blender/compositor/intern/COM_SocketReader.h +++ b/source/blender/compositor/intern/COM_SocketReader.h @@ -59,7 +59,7 @@ protected: * @param y the y-coordinate of the pixel to calculate in image space * @param inputBuffers chunks that can be read by their ReadBufferOperation. */ - virtual void executePixel(float* result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) {} + virtual void executePixel(float *result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) {} /** * @brief calculate a single pixel @@ -70,7 +70,7 @@ protected: * @param inputBuffers chunks that can be read by their ReadBufferOperation. * @param chunkData chunk specific data a during execution time. */ - virtual void executePixel(float* result, int x, int y, MemoryBuffer *inputBuffers[], void* chunkData) { + virtual void executePixel(float *result, int x, int y, MemoryBuffer *inputBuffers[], void *chunkData) { executePixel(result, x, y, COM_PS_NEAREST, inputBuffers); } @@ -84,26 +84,26 @@ protected: * @param dy * @param inputBuffers chunks that can be read by their ReadBufferOperation. */ - virtual void executePixel(float* result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) {} + virtual void executePixel(float *result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) {} public: - inline void read(float* result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { + inline void read(float *result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { executePixel(result, x, y, sampler, inputBuffers); } - inline void read(float* result, int x, int y, MemoryBuffer *inputBuffers[], void* chunkData) { + inline void read(float *result, int x, int y, MemoryBuffer *inputBuffers[], void *chunkData) { executePixel(result, x, y, inputBuffers, chunkData); } - inline void read(float* result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) { + inline void read(float *result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) { executePixel(result, x, y, dx, dy, inputBuffers); } - virtual void* initializeTileData(rcti *rect, MemoryBuffer** memoryBuffers) { + virtual void *initializeTileData(rcti *rect, MemoryBuffer** memoryBuffers) { return 0; } - virtual void deinitializeTileData(rcti *rect, MemoryBuffer** memoryBuffers, void* data) { + virtual void deinitializeTileData(rcti *rect, MemoryBuffer** memoryBuffers, void *data) { } - virtual MemoryBuffer* getInputMemoryBuffer(MemoryBuffer** memoryBuffers) {return 0;} + virtual MemoryBuffer *getInputMemoryBuffer(MemoryBuffer** memoryBuffers) {return 0;} inline const unsigned int getWidth() const {return this->width;} diff --git a/source/blender/compositor/intern/COM_WorkPackage.cpp b/source/blender/compositor/intern/COM_WorkPackage.cpp index d606e845b00..07974b9aafc 100644 --- a/source/blender/compositor/intern/COM_WorkPackage.cpp +++ b/source/blender/compositor/intern/COM_WorkPackage.cpp @@ -22,7 +22,8 @@ #include "COM_WorkPackage.h" -WorkPackage::WorkPackage(ExecutionGroup *group, unsigned int chunkNumber) { +WorkPackage::WorkPackage(ExecutionGroup *group, unsigned int chunkNumber) +{ this->executionGroup = group; this->chunkNumber = chunkNumber; } diff --git a/source/blender/compositor/intern/COM_WorkPackage.h b/source/blender/compositor/intern/COM_WorkPackage.h index 3169a9dcc30..8bdf21499cf 100644 --- a/source/blender/compositor/intern/COM_WorkPackage.h +++ b/source/blender/compositor/intern/COM_WorkPackage.h @@ -36,7 +36,7 @@ private: /** * @brief executionGroup with the operations-setup to be evaluated */ - ExecutionGroup* executionGroup; + ExecutionGroup *executionGroup; /** * @brief number of the chunk to be executed @@ -48,12 +48,12 @@ public: * @param group the ExecutionGroup * @param chunkNumber the number of the chunk */ - WorkPackage(ExecutionGroup* group, unsigned int chunkNumber); + WorkPackage(ExecutionGroup *group, unsigned int chunkNumber); /** * @brief get the ExecutionGroup */ - ExecutionGroup* getExecutionGroup() const {return this->executionGroup;} + ExecutionGroup *getExecutionGroup() const {return this->executionGroup;} /** * @brief get the number of the chunk diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index 5130525853b..c82a01a1e0a 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -65,14 +65,15 @@ static bool openclActive = false; #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE -void* WorkScheduler::thread_execute_cpu(void* data) { +void *WorkScheduler::thread_execute_cpu(void *data) +{ bool continueLoop = true; - Device* device = (Device*)data; + Device *device = (Device*)data; while (continueLoop) { - WorkPackage* work = (WorkPackage*)BLI_thread_queue_pop(cpuqueue); + WorkPackage *work = (WorkPackage*)BLI_thread_queue_pop(cpuqueue); if (work) { - device->execute(work); - delete work; + device->execute(work); + delete work; } PIL_sleep_ms(10); @@ -83,11 +84,12 @@ void* WorkScheduler::thread_execute_cpu(void* data) { return NULL; } -void* WorkScheduler::thread_execute_gpu(void* data) { +void *WorkScheduler::thread_execute_gpu(void *data) +{ bool continueLoop = true; - Device* device = (Device*)data; + Device *device = (Device*)data; while (continueLoop) { - WorkPackage* work = (WorkPackage*)BLI_thread_queue_pop(gpuqueue); + WorkPackage *work = (WorkPackage*)BLI_thread_queue_pop(gpuqueue); if (work) { device->execute(work); delete work; @@ -106,8 +108,9 @@ bool WorkScheduler::isStopping() {return state == COM_WSS_STOPPING;} -void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) { - WorkPackage* package = new WorkPackage(group, chunkNumber); +void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) +{ + WorkPackage *package = new WorkPackage(group, chunkNumber); #if COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD CPUDevice device; device.execute(package); @@ -126,14 +129,15 @@ void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) { #endif } -void WorkScheduler::start(CompositorContext &context) { +void WorkScheduler::start(CompositorContext &context) +{ #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE unsigned int index; cpuqueue = BLI_thread_queue_init(); BLI_thread_queue_nowait(cpuqueue); BLI_init_threads(&cputhreads, thread_execute_cpu, cpudevices.size()); for (index = 0 ; index < cpudevices.size() ; index ++) { - Device* device = cpudevices[index]; + Device *device = cpudevices[index]; BLI_insert_thread(&cputhreads, device); } #ifdef COM_OPENCL_ENABLED @@ -142,7 +146,7 @@ void WorkScheduler::start(CompositorContext &context) { BLI_thread_queue_nowait(gpuqueue); BLI_init_threads(&gputhreads, thread_execute_gpu, gpudevices.size()); for (index = 0 ; index < gpudevices.size() ; index ++) { - Device* device = gpudevices[index]; + Device *device = gpudevices[index]; BLI_insert_thread(&gputhreads, device); } openclActive = true; @@ -154,7 +158,8 @@ void WorkScheduler::start(CompositorContext &context) { #endif state = COM_WSS_STARTED; } -void WorkScheduler::finish() { +void WorkScheduler::finish() +{ #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE #ifdef COM_OPENCL_ENABLED if (openclActive) { @@ -174,7 +179,8 @@ void WorkScheduler::finish() { #endif #endif } -void WorkScheduler::stop() { +void WorkScheduler::stop() +{ state = COM_WSS_STOPPING; #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE BLI_end_threads(&cputhreads); @@ -191,7 +197,8 @@ void WorkScheduler::stop() { state = COM_WSS_STOPPED; } -bool WorkScheduler::hasGPUDevices() { +bool WorkScheduler::hasGPUDevices() +{ #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE #ifdef COM_OPENCL_ENABLED return gpudevices.size()>0; @@ -203,11 +210,13 @@ bool WorkScheduler::hasGPUDevices() { #endif } -extern void clContextError(const char *errinfo, const void *private_info, size_t cb, void *user_data) { +extern void clContextError(const char *errinfo, const void *private_info, size_t cb, void *user_data) +{ printf("OPENCL error: %s\n", errinfo); } -void WorkScheduler::initialize() { +void WorkScheduler::initialize() +{ state = COM_WSS_UNKNOWN; #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE @@ -257,7 +266,7 @@ void WorkScheduler::initialize() { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); error2 = clGetProgramBuildInfo(program, cldevices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size); if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } - char* build_log = new char[ret_val_size+1]; + char *build_log = new char[ret_val_size+1]; error2 = clGetProgramBuildInfo(program, cldevices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL); if (error2 != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } build_log[ret_val_size] = '\0'; @@ -268,7 +277,7 @@ void WorkScheduler::initialize() { unsigned int indexDevices; for (indexDevices = 0 ; indexDevices < totalNumberOfDevices ; indexDevices ++) { cl_device_id device = cldevices[indexDevices]; - OpenCLDevice* clDevice = new OpenCLDevice(context, device, program); + OpenCLDevice *clDevice = new OpenCLDevice(context, device, program); clDevice->initialize(), gpudevices.push_back(clDevice); char resultString[32]; @@ -286,9 +295,10 @@ void WorkScheduler::initialize() { state = COM_WSS_INITIALIZED; } -void WorkScheduler::deinitialize() { +void WorkScheduler::deinitialize() +{ #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE - Device* device; + Device *device; while (cpudevices.size()>0) { device = cpudevices.back(); cpudevices.pop_back(); diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 0befa209e47..0de1763749e 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -59,13 +59,13 @@ class WorkScheduler { * @brief main thread loop for cpudevices * inside this loop new work is queried and being executed */ - static void* thread_execute_cpu(void* data); + static void *thread_execute_cpu(void *data); /** * @brief main thread loop for gpudevices * inside this loop new work is queried and being executed */ - static void* thread_execute_gpu(void* data); + static void *thread_execute_gpu(void *data); #endif public: /** @@ -77,7 +77,7 @@ public: * @param group the execution group * @param chunkNumber the number of the chunk in the group to be executed */ - static void schedule(ExecutionGroup* group, int chunkNumber); + static void schedule(ExecutionGroup *group, int chunkNumber); /** * @brief initialize the WorkScheduler diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index 5707fc2c2fe..bd967190987 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -31,7 +31,8 @@ extern "C" { #include "COM_WorkScheduler.h" static ThreadMutex *compositorMutex; -void COM_execute(bNodeTree *editingtree, int rendering) { +void COM_execute(bNodeTree *editingtree, int rendering) +{ if (compositorMutex == NULL) { /// TODO: move to blender startup phase compositorMutex = new ThreadMutex(); BLI_mutex_init(compositorMutex); @@ -51,7 +52,7 @@ void COM_execute(bNodeTree *editingtree, int rendering) { editingtree->stats_draw(editingtree->sdh, (char*)"Compositing"); /* initialize execution system */ - ExecutionSystem* system = new ExecutionSystem(editingtree, rendering); + ExecutionSystem *system = new ExecutionSystem(editingtree, rendering); system->execute(); delete system; diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp index 23acaee7b93..0037480d2e9 100644 --- a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp +++ b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp @@ -31,15 +31,16 @@ #include "COM_SetValueOperation.h" #include "DNA_material_types.h" // the ramp types -void AlphaOverNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void AlphaOverNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *valueSocket = this->getInputSocket(0); InputSocket *color1Socket = this->getInputSocket(1); InputSocket *color2Socket = this->getInputSocket(2); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* editorNode = this->getbNode(); + bNode *editorNode = this->getbNode(); MixBaseOperation *convertProg; - NodeTwoFloats *ntf= (NodeTwoFloats*)editorNode->storage; + NodeTwoFloats *ntf = (NodeTwoFloats*)editorNode->storage; if (ntf->x!= 0.0f) { AlphaOverMixedOperation *mixOperation = new AlphaOverMixedOperation(); mixOperation->setX(ntf->x); diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.h b/source/blender/compositor/nodes/COM_AlphaOverNode.h index b9840f89d3a..64f78e76837 100644 --- a/source/blender/compositor/nodes/COM_AlphaOverNode.h +++ b/source/blender/compositor/nodes/COM_AlphaOverNode.h @@ -31,7 +31,7 @@ */ class AlphaOverNode: public Node { public: - AlphaOverNode(bNode* editorNode) :Node(editorNode) {} + AlphaOverNode(bNode *editorNode) :Node(editorNode) {} void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp b/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp index 5302fb01f1c..436d92df7f8 100644 --- a/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp @@ -26,10 +26,12 @@ #include "COM_ExecutionSystem.h" #include "COM_BilateralBlurOperation.h" -BilateralBlurNode::BilateralBlurNode(bNode *editorNode): Node(editorNode) { +BilateralBlurNode::BilateralBlurNode(bNode *editorNode): Node(editorNode) +{ } -void BilateralBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void BilateralBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ NodeBilateralBlurData *data = (NodeBilateralBlurData*)this->getbNode()->storage; BilateralBlurOperation *operation = new BilateralBlurOperation(); operation->setQuality(context->getQuality()); diff --git a/source/blender/compositor/nodes/COM_BilateralBlurNode.h b/source/blender/compositor/nodes/COM_BilateralBlurNode.h index d5d9b7367a4..a92de0eaa62 100644 --- a/source/blender/compositor/nodes/COM_BilateralBlurNode.h +++ b/source/blender/compositor/nodes/COM_BilateralBlurNode.h @@ -32,7 +32,7 @@ class BilateralBlurNode: public Node { public: BilateralBlurNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_BlurNode.cpp b/source/blender/compositor/nodes/COM_BlurNode.cpp index 5e29650a5ca..789a6a6eee2 100644 --- a/source/blender/compositor/nodes/COM_BlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BlurNode.cpp @@ -29,11 +29,13 @@ #include "COM_GaussianBokehBlurOperation.h" #include "COM_FastGaussianBlurOperation.h" -BlurNode::BlurNode(bNode *editorNode): Node(editorNode) { +BlurNode::BlurNode(bNode *editorNode): Node(editorNode) +{ } -void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - bNode* editorNode = this->getbNode(); +void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + bNode *editorNode = this->getbNode(); NodeBlurData * data = (NodeBlurData*)editorNode->storage; #if 0 const bNodeSocket *sock = this->getInputSocket(1)->getbNodeSocket(); diff --git a/source/blender/compositor/nodes/COM_BlurNode.h b/source/blender/compositor/nodes/COM_BlurNode.h index 087e2be208f..04a680c32cf 100644 --- a/source/blender/compositor/nodes/COM_BlurNode.h +++ b/source/blender/compositor/nodes/COM_BlurNode.h @@ -33,7 +33,7 @@ class BlurNode: public Node { public: BlurNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp index 68e9b067f07..9e80d024bd2 100644 --- a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp @@ -30,11 +30,13 @@ #include "COM_VariableSizeBokehBlurOperation.h" #include "COM_ConvertDepthToRadiusOperation.h" -BokehBlurNode::BokehBlurNode(bNode *editorNode): Node(editorNode) { +BokehBlurNode::BokehBlurNode(bNode *editorNode): Node(editorNode) +{ } -void BokehBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - Object* camob = context->getScene()->camera; +void BokehBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + Object *camob = context->getScene()->camera; if (this->getInputSocket(2)->isConnected()) { VariableSizeBokehBlurOperation *operation = new VariableSizeBokehBlurOperation(); diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.h b/source/blender/compositor/nodes/COM_BokehBlurNode.h index cb9d117c8ae..eb9fada5112 100644 --- a/source/blender/compositor/nodes/COM_BokehBlurNode.h +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.h @@ -33,7 +33,7 @@ class BokehBlurNode: public Node { public: BokehBlurNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_BokehImageNode.cpp b/source/blender/compositor/nodes/COM_BokehImageNode.cpp index 511727636b5..35511d213f5 100644 --- a/source/blender/compositor/nodes/COM_BokehImageNode.cpp +++ b/source/blender/compositor/nodes/COM_BokehImageNode.cpp @@ -25,10 +25,12 @@ #include "COM_BokehImageOperation.h" #include "COM_ExecutionSystem.h" -BokehImageNode::BokehImageNode(bNode *editorNode): Node(editorNode) { +BokehImageNode::BokehImageNode(bNode *editorNode): Node(editorNode) +{ } -void BokehImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void BokehImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ BokehImageOperation *operation = new BokehImageOperation(); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_BokehImageNode.h b/source/blender/compositor/nodes/COM_BokehImageNode.h index f3322077c47..d4fabf0e516 100644 --- a/source/blender/compositor/nodes/COM_BokehImageNode.h +++ b/source/blender/compositor/nodes/COM_BokehImageNode.h @@ -32,7 +32,7 @@ class BokehImageNode: public Node { public: BokehImageNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_BoxMaskNode.cpp b/source/blender/compositor/nodes/COM_BoxMaskNode.cpp index 7f904f1acc0..322b5893096 100644 --- a/source/blender/compositor/nodes/COM_BoxMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_BoxMaskNode.cpp @@ -25,10 +25,12 @@ #include "COM_BoxMaskOperation.h" #include "COM_ExecutionSystem.h" -BoxMaskNode::BoxMaskNode(bNode *editorNode): Node(editorNode) { +BoxMaskNode::BoxMaskNode(bNode *editorNode): Node(editorNode) +{ } -void BoxMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void BoxMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ BoxMaskOperation *operation; operation = new BoxMaskOperation(); operation->setData((NodeBoxMask*)this->getbNode()->storage); diff --git a/source/blender/compositor/nodes/COM_BoxMaskNode.h b/source/blender/compositor/nodes/COM_BoxMaskNode.h index c91730fdbb8..c71c6a18388 100644 --- a/source/blender/compositor/nodes/COM_BoxMaskNode.h +++ b/source/blender/compositor/nodes/COM_BoxMaskNode.h @@ -32,7 +32,7 @@ class BoxMaskNode: public Node { public: BoxMaskNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.cpp b/source/blender/compositor/nodes/COM_BrightnessNode.cpp index 3ff5538f13e..2bcf7250173 100644 --- a/source/blender/compositor/nodes/COM_BrightnessNode.cpp +++ b/source/blender/compositor/nodes/COM_BrightnessNode.cpp @@ -25,10 +25,12 @@ #include "COM_BrightnessOperation.h" #include "COM_ExecutionSystem.h" -BrightnessNode::BrightnessNode(bNode *editorNode): Node(editorNode) { +BrightnessNode::BrightnessNode(bNode *editorNode): Node(editorNode) +{ } /// @todo: add anti alias when not FSA -void BrightnessNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void BrightnessNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ BrightnessOperation *operation = new BrightnessOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.h b/source/blender/compositor/nodes/COM_BrightnessNode.h index 8f1c9ccda86..4c3b6421322 100644 --- a/source/blender/compositor/nodes/COM_BrightnessNode.h +++ b/source/blender/compositor/nodes/COM_BrightnessNode.h @@ -32,7 +32,7 @@ class BrightnessNode: public Node { public: BrightnessNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp index 9ab6c6250db..08980de8d98 100644 --- a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp @@ -30,13 +30,14 @@ ChannelMatteNode::ChannelMatteNode(bNode *editorNode): Node(editorNode) {} -void ChannelMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void ChannelMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ InputSocket *inputSocketImage = this->getInputSocket(0); OutputSocket *outputSocketImage = this->getOutputSocket(0); OutputSocket *outputSocketMatte = this->getOutputSocket(1); NodeOperation *convert=NULL; - bNode* node = this->getbNode(); + bNode *node = this->getbNode(); /* colorspace */ switch (node->custom1) { diff --git a/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp b/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp index 36d315c3a4b..45176cb007c 100644 --- a/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp @@ -28,7 +28,8 @@ ChromaMatteNode::ChromaMatteNode(bNode *editorNode): Node(editorNode) {} -void ChromaMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void ChromaMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ InputSocket *inputSocketImage = this->getInputSocket(0); InputSocket *inputSocketKey = this->getInputSocket(1); OutputSocket *outputSocketImage = this->getOutputSocket(0); @@ -40,7 +41,7 @@ void ChromaMatteNode::convertToOperations(ExecutionSystem *graph, CompositorCont operationRGBToYCC_Key->setMode(0); /* BLI_YCC_ITU_BT601 */ ChromaMatteOperation *operation = new ChromaMatteOperation(); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); operation->setSettings((NodeChroma*)editorsnode->storage); inputSocketImage->relinkConnections(operationRGBToYCC_Image->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp index 8d5e8a2788e..32c9e50874e 100644 --- a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp @@ -27,19 +27,20 @@ #include "BKE_node.h" #include "COM_MixBlendOperation.h" -ColorBalanceNode::ColorBalanceNode(bNode* editorNode): Node(editorNode) +ColorBalanceNode::ColorBalanceNode(bNode *editorNode): Node(editorNode) { } -void ColorBalanceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ColorBalanceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); InputSocket *inputImageSocket = this->getInputSocket(1); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* node = this->getbNode(); - NodeColorBalance *n= (NodeColorBalance *)node->storage; + bNode *node = this->getbNode(); + NodeColorBalance *n = (NodeColorBalance *)node->storage; NodeOperation*operation; if (node->custom1 == 0) { - ColorBalanceLGGOperation* operationLGG = new ColorBalanceLGGOperation(); + ColorBalanceLGGOperation *operationLGG = new ColorBalanceLGGOperation(); { int c; diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.h b/source/blender/compositor/nodes/COM_ColorBalanceNode.h index 6de431a764f..61a09d28c01 100644 --- a/source/blender/compositor/nodes/COM_ColorBalanceNode.h +++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.h @@ -32,8 +32,8 @@ class ColorBalanceNode : public Node { public: - ColorBalanceNode(bNode* editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + ColorBalanceNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext *context); }; #endif // COM_ColorBalanceNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp index ac3e1285e75..995d66fcf23 100644 --- a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp @@ -25,12 +25,14 @@ #include "COM_ColorCorrectionOperation.h" #include "COM_ExecutionSystem.h" -ColorCorrectionNode::ColorCorrectionNode(bNode *editorNode): Node(editorNode) { +ColorCorrectionNode::ColorCorrectionNode(bNode *editorNode): Node(editorNode) +{ } -void ColorCorrectionNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ColorCorrectionNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ ColorCorrectionOperation *operation = new ColorCorrectionOperation(); - bNode* editorNode = getbNode(); + bNode *editorNode = getbNode(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.h b/source/blender/compositor/nodes/COM_ColorCorrectionNode.h index e5c35476931..46b7fe5e0bc 100644 --- a/source/blender/compositor/nodes/COM_ColorCorrectionNode.h +++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.h @@ -32,7 +32,7 @@ class ColorCorrectionNode: public Node { public: ColorCorrectionNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ColorCurveNode.cpp b/source/blender/compositor/nodes/COM_ColorCurveNode.cpp index 55837a35b59..a96fdf72b11 100644 --- a/source/blender/compositor/nodes/COM_ColorCurveNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorCurveNode.cpp @@ -25,10 +25,12 @@ #include "COM_ColorCurveOperation.h" #include "COM_ExecutionSystem.h" -ColorCurveNode::ColorCurveNode(bNode *editorNode): Node(editorNode) { +ColorCurveNode::ColorCurveNode(bNode *editorNode): Node(editorNode) +{ } -void ColorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ColorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ ColorCurveOperation *operation = new ColorCurveOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_ColorCurveNode.h b/source/blender/compositor/nodes/COM_ColorCurveNode.h index aade20860c2..264e2691566 100644 --- a/source/blender/compositor/nodes/COM_ColorCurveNode.h +++ b/source/blender/compositor/nodes/COM_ColorCurveNode.h @@ -32,7 +32,7 @@ class ColorCurveNode: public Node { public: ColorCurveNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ColorMatteNode.cpp b/source/blender/compositor/nodes/COM_ColorMatteNode.cpp index fa00c95f50b..e5231a48e05 100644 --- a/source/blender/compositor/nodes/COM_ColorMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorMatteNode.cpp @@ -28,7 +28,8 @@ ColorMatteNode::ColorMatteNode(bNode *editorNode): Node(editorNode) {} -void ColorMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void ColorMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ InputSocket *inputSocketImage = this->getInputSocket(0); InputSocket *inputSocketKey = this->getInputSocket(1); OutputSocket *outputSocketImage = this->getOutputSocket(0); @@ -38,7 +39,7 @@ void ColorMatteNode::convertToOperations(ExecutionSystem *graph, CompositorConte ConvertRGBToHSVOperation *operationRGBToHSV_Key = new ConvertRGBToHSVOperation(); ColorMatteOperation *operation = new ColorMatteOperation(); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); operation->setSettings((NodeChroma*)editorsnode->storage); inputSocketImage->relinkConnections(operationRGBToHSV_Image->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_ColorNode.cpp b/source/blender/compositor/nodes/COM_ColorNode.cpp index 0eee305a7e6..f5fcb0177f7 100644 --- a/source/blender/compositor/nodes/COM_ColorNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorNode.cpp @@ -25,12 +25,14 @@ #include "COM_SetColorOperation.h" #include "COM_ExecutionSystem.h" -ColorNode::ColorNode(bNode *editorNode): Node(editorNode) { +ColorNode::ColorNode(bNode *editorNode): Node(editorNode) +{ } -void ColorNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ColorNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ SetColorOperation *operation = new SetColorOperation(); - bNodeSocket* socket = this->getEditorOutputSocket(0); + bNodeSocket *socket = this->getEditorOutputSocket(0); bNodeSocketValueRGBA *dval = (bNodeSocketValueRGBA*)socket->default_value; this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); operation->setChannels(dval->value); diff --git a/source/blender/compositor/nodes/COM_ColorNode.h b/source/blender/compositor/nodes/COM_ColorNode.h index 6a9f3062676..937979dd961 100644 --- a/source/blender/compositor/nodes/COM_ColorNode.h +++ b/source/blender/compositor/nodes/COM_ColorNode.h @@ -32,7 +32,7 @@ class ColorNode: public Node { public: ColorNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ColorRampNode.cpp b/source/blender/compositor/nodes/COM_ColorRampNode.cpp index bd1b3b5a35e..1873cad5d57 100644 --- a/source/blender/compositor/nodes/COM_ColorRampNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorRampNode.cpp @@ -27,16 +27,17 @@ #include "COM_SeparateChannelOperation.h" #include "DNA_texture_types.h" -ColorRampNode::ColorRampNode(bNode* editorNode): Node(editorNode) +ColorRampNode::ColorRampNode(bNode *editorNode): Node(editorNode) {} -void ColorRampNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ColorRampNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); OutputSocket *outputSocket = this->getOutputSocket(0); OutputSocket *outputSocketAlpha = this->getOutputSocket(1); - bNode* editorNode = this->getbNode(); + bNode *editorNode = this->getbNode(); - ColorRampOperation * operation = new ColorRampOperation(); + ColorRampOperation *operation = new ColorRampOperation(); outputSocket->relinkConnections(operation->getOutputSocket(0)); if (outputSocketAlpha->isConnected()) { SeparateChannelOperation *operation2 = new SeparateChannelOperation(); diff --git a/source/blender/compositor/nodes/COM_ColorRampNode.h b/source/blender/compositor/nodes/COM_ColorRampNode.h index de0f2a5395e..53fff2b0d98 100644 --- a/source/blender/compositor/nodes/COM_ColorRampNode.h +++ b/source/blender/compositor/nodes/COM_ColorRampNode.h @@ -32,8 +32,8 @@ class ColorRampNode : public Node { public: - ColorRampNode(bNode* editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + ColorRampNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif // COM_ColorRampNODE_H diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp index 5935167d88e..88043653b4f 100644 --- a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp @@ -27,12 +27,13 @@ ColorSpillNode::ColorSpillNode(bNode *editorNode): Node(editorNode) {} -void ColorSpillNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void ColorSpillNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ InputSocket *inputSocketImage = this->getInputSocket(0); InputSocket *inputSocketFac = this->getInputSocket(1); OutputSocket *outputSocketImage = this->getOutputSocket(0); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); ColorSpillOperation *operation; diff --git a/source/blender/compositor/nodes/COM_ColorToBWNode.cpp b/source/blender/compositor/nodes/COM_ColorToBWNode.cpp index a58c2e9fd19..7ff7ee1c13e 100644 --- a/source/blender/compositor/nodes/COM_ColorToBWNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorToBWNode.cpp @@ -25,10 +25,12 @@ #include "COM_ConvertColorToBWOperation.h" #include "COM_ExecutionSystem.h" -ColourToBWNode::ColourToBWNode(bNode *editorNode): Node(editorNode) { +ColourToBWNode::ColourToBWNode(bNode *editorNode): Node(editorNode) +{ } -void ColourToBWNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ColourToBWNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *colourSocket = this->getInputSocket(0); OutputSocket *valueSocket = this->getOutputSocket(0); diff --git a/source/blender/compositor/nodes/COM_CombineHSVANode.cpp b/source/blender/compositor/nodes/COM_CombineHSVANode.cpp index bd43f207fc7..a0f46ad6b6c 100644 --- a/source/blender/compositor/nodes/COM_CombineHSVANode.cpp +++ b/source/blender/compositor/nodes/COM_CombineHSVANode.cpp @@ -28,10 +28,12 @@ #include "COM_SetValueOperation.h" #include "COM_ConvertHSVToRGBOperation.h" -CombineHSVANode::CombineHSVANode(bNode *editorNode): CombineRGBANode(editorNode) { +CombineHSVANode::CombineHSVANode(bNode *editorNode): CombineRGBANode(editorNode) +{ } -void CombineHSVANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void CombineHSVANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ ConvertHSVToRGBOperation *operation = new ConvertHSVToRGBOperation(); OutputSocket *outputSocket = this->getOutputSocket(0); if (outputSocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp index 6bef0441e5e..d5fef1e756a 100644 --- a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp +++ b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp @@ -29,11 +29,13 @@ #include "DNA_material_types.h" // the ramp types -CombineRGBANode::CombineRGBANode(bNode *editorNode): Node(editorNode) { +CombineRGBANode::CombineRGBANode(bNode *editorNode): Node(editorNode) +{ } -void CombineRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void CombineRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputRSocket = this->getInputSocket(0); InputSocket *inputGSocket = this->getInputSocket(1); InputSocket *inputBSocket = this->getInputSocket(2); diff --git a/source/blender/compositor/nodes/COM_CombineYCCANode.cpp b/source/blender/compositor/nodes/COM_CombineYCCANode.cpp index bf31daf5852..ad6203ea85a 100644 --- a/source/blender/compositor/nodes/COM_CombineYCCANode.cpp +++ b/source/blender/compositor/nodes/COM_CombineYCCANode.cpp @@ -22,10 +22,12 @@ #include "COM_CombineYCCANode.h" #include "COM_ConvertYCCToRGBOperation.h" -CombineYCCANode::CombineYCCANode(bNode *editorNode): CombineRGBANode(editorNode) { +CombineYCCANode::CombineYCCANode(bNode *editorNode): CombineRGBANode(editorNode) +{ } -void CombineYCCANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void CombineYCCANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ ConvertYCCToRGBOperation *operation = new ConvertYCCToRGBOperation(); OutputSocket *outputSocket = this->getOutputSocket(0); diff --git a/source/blender/compositor/nodes/COM_CombineYUVANode.cpp b/source/blender/compositor/nodes/COM_CombineYUVANode.cpp index 3348eacc86f..ea92a40f803 100644 --- a/source/blender/compositor/nodes/COM_CombineYUVANode.cpp +++ b/source/blender/compositor/nodes/COM_CombineYUVANode.cpp @@ -22,10 +22,12 @@ #include "COM_CombineYUVANode.h" #include "COM_ConvertYUVToRGBOperation.h" -CombineYUVANode::CombineYUVANode(bNode *editorNode): CombineRGBANode(editorNode) { +CombineYUVANode::CombineYUVANode(bNode *editorNode): CombineRGBANode(editorNode) +{ } -void CombineYUVANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void CombineYUVANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ ConvertYUVToRGBOperation *operation = new ConvertYUVToRGBOperation(); OutputSocket *outputSocket = this->getOutputSocket(0); if (outputSocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_CompositorNode.cpp b/source/blender/compositor/nodes/COM_CompositorNode.cpp index 95db41b322c..57821e7fe27 100644 --- a/source/blender/compositor/nodes/COM_CompositorNode.cpp +++ b/source/blender/compositor/nodes/COM_CompositorNode.cpp @@ -24,10 +24,12 @@ #include "COM_CompositorOperation.h" #include "COM_ExecutionSystem.h" -CompositorNode::CompositorNode(bNode *editorNode): Node(editorNode) { +CompositorNode::CompositorNode(bNode *editorNode): Node(editorNode) +{ } -void CompositorNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void CompositorNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *imageSocket = this->getInputSocket(0); InputSocket *alphaSocket = this->getInputSocket(1); if (imageSocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp index 775fa1ad0fd..94139c132fb 100644 --- a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp +++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp @@ -24,9 +24,10 @@ #include "COM_ConvertKeyToPremulOperation.h" #include "COM_ExecutionSystem.h" -void ConvertAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - NodeOperation* operation = NULL; - bNode* node = this->getbNode(); +void ConvertAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + NodeOperation *operation = NULL; + bNode *node = this->getbNode(); /* value hardcoded in rna_nodetree.c */ if (node->custom1 == 1) { diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.h b/source/blender/compositor/nodes/COM_ConvertAlphaNode.h index 04834a45c45..2e3fe743f4e 100644 --- a/source/blender/compositor/nodes/COM_ConvertAlphaNode.h +++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.h @@ -30,7 +30,7 @@ */ class ConvertAlphaNode: public Node { public: - ConvertAlphaNode(bNode* editorNode) :Node(editorNode) {} + ConvertAlphaNode(bNode *editorNode) :Node(editorNode) {} void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_CropNode.cpp b/source/blender/compositor/nodes/COM_CropNode.cpp index 9d48922d0d6..52329be3034 100644 --- a/source/blender/compositor/nodes/COM_CropNode.cpp +++ b/source/blender/compositor/nodes/COM_CropNode.cpp @@ -24,11 +24,13 @@ #include "COM_CropOperation.h" -CropNode::CropNode(bNode *editorNode) : Node(editorNode) { +CropNode::CropNode(bNode *editorNode) : Node(editorNode) +{ } -void CropNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - bNode* node = getbNode(); +void CropNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + bNode *node = getbNode(); NodeTwoXYs *cropSettings = (NodeTwoXYs*)node->storage; bool relative = (bool)node->custom2; bool cropImage = (bool)node->custom1; diff --git a/source/blender/compositor/nodes/COM_CropNode.h b/source/blender/compositor/nodes/COM_CropNode.h index a39bd47f22a..0bdfffc8fec 100644 --- a/source/blender/compositor/nodes/COM_CropNode.h +++ b/source/blender/compositor/nodes/COM_CropNode.h @@ -28,7 +28,7 @@ class CropNode: public Node { public: CropNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_DefocusNode.cpp b/source/blender/compositor/nodes/COM_DefocusNode.cpp index 40adc3793b0..77f7baaef98 100644 --- a/source/blender/compositor/nodes/COM_DefocusNode.cpp +++ b/source/blender/compositor/nodes/COM_DefocusNode.cpp @@ -33,16 +33,18 @@ #include "COM_SetValueOperation.h" #include "COM_GammaCorrectOperation.h" -DefocusNode::DefocusNode(bNode *editorNode): Node(editorNode) { +DefocusNode::DefocusNode(bNode *editorNode): Node(editorNode) +{ } -void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ bNode *node = this->getbNode(); - Scene *scene= (Scene*)node->id; - Object* camob = (scene)? scene->camera: NULL; + Scene *scene = (Scene*)node->id; + Object *camob = (scene)? scene->camera: NULL; NodeDefocus *data = (NodeDefocus*)node->storage; - NodeOperation* radiusOperation; + NodeOperation *radiusOperation; if (data->no_zbuf) { MathMultiplyOperation *multiply = new MathMultiplyOperation(); SetValueOperation *multiplier = new SetValueOperation(); diff --git a/source/blender/compositor/nodes/COM_DefocusNode.h b/source/blender/compositor/nodes/COM_DefocusNode.h index 3d2ff7eb4de..d52ee3da77b 100644 --- a/source/blender/compositor/nodes/COM_DefocusNode.h +++ b/source/blender/compositor/nodes/COM_DefocusNode.h @@ -33,7 +33,7 @@ class DefocusNode: public Node { public: DefocusNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp b/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp index 8327813cf05..ab6917f3a59 100644 --- a/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp @@ -25,15 +25,16 @@ #include "COM_DifferenceMatteOperation.h" #include "COM_SetAlphaOperation.h" -DifferenceMatteNode::DifferenceMatteNode(bNode* editorNode): Node(editorNode) +DifferenceMatteNode::DifferenceMatteNode(bNode *editorNode): Node(editorNode) {} -void DifferenceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void DifferenceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); InputSocket *inputSocket2 = this->getInputSocket(1); OutputSocket *outputSocketImage = this->getOutputSocket(0); OutputSocket *outputSocketMatte = this->getOutputSocket(1); - bNode* editorNode = this->getbNode(); + bNode *editorNode = this->getbNode(); DifferenceMatteOperation * operationSet = new DifferenceMatteOperation(); operationSet->setSettings((NodeChroma*)editorNode->storage); diff --git a/source/blender/compositor/nodes/COM_DifferenceMatteNode.h b/source/blender/compositor/nodes/COM_DifferenceMatteNode.h index 2adce752f49..3b270ebc3b7 100644 --- a/source/blender/compositor/nodes/COM_DifferenceMatteNode.h +++ b/source/blender/compositor/nodes/COM_DifferenceMatteNode.h @@ -32,8 +32,8 @@ class DifferenceMatteNode : public Node { public: - DifferenceMatteNode(bNode* editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + DifferenceMatteNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif // COM_DifferenceMatteNODE_H diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp index 185eb6475bf..2118f5b8e47 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp @@ -27,11 +27,13 @@ #include "COM_AntiAliasOperation.h" #include "BLI_math.h" -DilateErodeNode::DilateErodeNode(bNode *editorNode): Node(editorNode) { +DilateErodeNode::DilateErodeNode(bNode *editorNode): Node(editorNode) +{ } -void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - bNode* editorNode = this->getbNode(); +void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + bNode *editorNode = this->getbNode(); DilateErodeOperation *operation = new DilateErodeOperation(); operation->setDistance(editorNode->custom2); operation->setInset(2.0f); diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.h b/source/blender/compositor/nodes/COM_DilateErodeNode.h index 1ebf7e0b4c8..496bd0203dd 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.h +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.h @@ -32,7 +32,7 @@ class DilateErodeNode: public Node { public: DilateErodeNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp b/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp index ef3e4918048..cefeffcfc07 100644 --- a/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp @@ -26,10 +26,12 @@ #include "COM_ExecutionSystem.h" #include "COM_DirectionalBlurOperation.h" -DirectionalBlurNode::DirectionalBlurNode(bNode *editorNode): Node(editorNode) { +DirectionalBlurNode::DirectionalBlurNode(bNode *editorNode): Node(editorNode) +{ } -void DirectionalBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void DirectionalBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ NodeDBlurData *data = (NodeDBlurData*)this->getbNode()->storage; DirectionalBlurOperation *operation = new DirectionalBlurOperation(); operation->setQuality(context->getQuality()); diff --git a/source/blender/compositor/nodes/COM_DirectionalBlurNode.h b/source/blender/compositor/nodes/COM_DirectionalBlurNode.h index 842e330d6d0..1cf36fdeae7 100644 --- a/source/blender/compositor/nodes/COM_DirectionalBlurNode.h +++ b/source/blender/compositor/nodes/COM_DirectionalBlurNode.h @@ -32,7 +32,7 @@ class DirectionalBlurNode: public Node { public: DirectionalBlurNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_DisplaceNode.cpp b/source/blender/compositor/nodes/COM_DisplaceNode.cpp index ff5dd413468..5fe9591bfd4 100644 --- a/source/blender/compositor/nodes/COM_DisplaceNode.cpp +++ b/source/blender/compositor/nodes/COM_DisplaceNode.cpp @@ -24,7 +24,8 @@ #include "COM_DisplaceSimpleOperation.h" #include "COM_ExecutionSystem.h" -DisplaceNode::DisplaceNode(bNode *editorNode): Node(editorNode) { +DisplaceNode::DisplaceNode(bNode *editorNode): Node(editorNode) +{ } void DisplaceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) diff --git a/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp b/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp index c55ce803f97..3fc4a882eaf 100644 --- a/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp @@ -27,14 +27,15 @@ DistanceMatteNode::DistanceMatteNode(bNode *editorNode): Node(editorNode) {} -void DistanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void DistanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ InputSocket *inputSocketImage = this->getInputSocket(0); InputSocket *inputSocketKey = this->getInputSocket(1); OutputSocket *outputSocketImage = this->getOutputSocket(0); OutputSocket *outputSocketMatte = this->getOutputSocket(1); DistanceMatteOperation *operation = new DistanceMatteOperation(); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); operation->setSettings((NodeChroma*)editorsnode->storage); inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp index f1ec4ab9b23..1ac273a52cb 100644 --- a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp @@ -25,12 +25,14 @@ #include "DNA_scene_types.h" #include "COM_ExecutionSystem.h" -DoubleEdgeMaskNode::DoubleEdgeMaskNode(bNode *editorNode): Node(editorNode) { +DoubleEdgeMaskNode::DoubleEdgeMaskNode(bNode *editorNode): Node(editorNode) +{ } -void DoubleEdgeMaskNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { +void DoubleEdgeMaskNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ DoubleEdgeMaskOperation *operation; - bNode* bnode = this->getbNode(); + bNode *bnode = this->getbNode(); operation = new DoubleEdgeMaskOperation(); operation->setAdjecentOnly(bnode->custom1); diff --git a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h index 26d553a1422..2c52e988946 100644 --- a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h +++ b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h @@ -32,7 +32,7 @@ class DoubleEdgeMaskNode: public Node { public: DoubleEdgeMaskNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp b/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp index 89996f0e590..7e327a306b6 100644 --- a/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp @@ -25,10 +25,12 @@ #include "COM_EllipseMaskOperation.h" #include "COM_ExecutionSystem.h" -EllipseMaskNode::EllipseMaskNode(bNode *editorNode): Node(editorNode) { +EllipseMaskNode::EllipseMaskNode(bNode *editorNode): Node(editorNode) +{ } -void EllipseMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void EllipseMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ EllipseMaskOperation *operation; operation = new EllipseMaskOperation(); operation->setData((NodeEllipseMask*)this->getbNode()->storage); diff --git a/source/blender/compositor/nodes/COM_EllipseMaskNode.h b/source/blender/compositor/nodes/COM_EllipseMaskNode.h index 4fecf6946cc..be6956e30b5 100644 --- a/source/blender/compositor/nodes/COM_EllipseMaskNode.h +++ b/source/blender/compositor/nodes/COM_EllipseMaskNode.h @@ -32,7 +32,7 @@ class EllipseMaskNode: public Node { public: EllipseMaskNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_FilterNode.cpp b/source/blender/compositor/nodes/COM_FilterNode.cpp index f10d0391317..a1d405c0dff 100644 --- a/source/blender/compositor/nodes/COM_FilterNode.cpp +++ b/source/blender/compositor/nodes/COM_FilterNode.cpp @@ -27,11 +27,12 @@ #include "BKE_node.h" #include "COM_MixBlendOperation.h" -FilterNode::FilterNode(bNode* editorNode): Node(editorNode) +FilterNode::FilterNode(bNode *editorNode): Node(editorNode) { } -void FilterNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void FilterNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); InputSocket *inputImageSocket = this->getInputSocket(1); OutputSocket *outputSocket = this->getOutputSocket(0); diff --git a/source/blender/compositor/nodes/COM_FilterNode.h b/source/blender/compositor/nodes/COM_FilterNode.h index c77846ef2fe..080682dcefe 100644 --- a/source/blender/compositor/nodes/COM_FilterNode.h +++ b/source/blender/compositor/nodes/COM_FilterNode.h @@ -32,8 +32,8 @@ class FilterNode : public Node { public: - FilterNode(bNode* editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + FilterNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif // COM_FILTERNODE_H diff --git a/source/blender/compositor/nodes/COM_FlipNode.cpp b/source/blender/compositor/nodes/COM_FlipNode.cpp index 7fbb21478ec..a4924aaae40 100644 --- a/source/blender/compositor/nodes/COM_FlipNode.cpp +++ b/source/blender/compositor/nodes/COM_FlipNode.cpp @@ -25,10 +25,12 @@ #include "COM_FlipOperation.h" #include "COM_ExecutionSystem.h" -FlipNode::FlipNode(bNode *editorNode) : Node(editorNode) { +FlipNode::FlipNode(bNode *editorNode) : Node(editorNode) +{ } -void FlipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void FlipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); OutputSocket *outputSocket = this->getOutputSocket(0); FlipOperation *operation = new FlipOperation(); diff --git a/source/blender/compositor/nodes/COM_FlipNode.h b/source/blender/compositor/nodes/COM_FlipNode.h index 593fed452af..53bcc504f80 100644 --- a/source/blender/compositor/nodes/COM_FlipNode.h +++ b/source/blender/compositor/nodes/COM_FlipNode.h @@ -32,7 +32,7 @@ class FlipNode: public Node { public: FlipNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_GammaNode.cpp b/source/blender/compositor/nodes/COM_GammaNode.cpp index e61f9245f40..e5391e54e72 100644 --- a/source/blender/compositor/nodes/COM_GammaNode.cpp +++ b/source/blender/compositor/nodes/COM_GammaNode.cpp @@ -25,10 +25,12 @@ #include "COM_GammaOperation.h" #include "COM_ExecutionSystem.h" -GammaNode::GammaNode(bNode *editorNode): Node(editorNode) { +GammaNode::GammaNode(bNode *editorNode): Node(editorNode) +{ } -void GammaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void GammaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ GammaOperation *operation = new GammaOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_GammaNode.h b/source/blender/compositor/nodes/COM_GammaNode.h index 56f2374467d..121d99cbd57 100644 --- a/source/blender/compositor/nodes/COM_GammaNode.h +++ b/source/blender/compositor/nodes/COM_GammaNode.h @@ -32,7 +32,7 @@ class GammaNode: public Node { public: GammaNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_GlareNode.cpp b/source/blender/compositor/nodes/COM_GlareNode.cpp index c0fcad1a5b3..c65adc862b1 100644 --- a/source/blender/compositor/nodes/COM_GlareNode.cpp +++ b/source/blender/compositor/nodes/COM_GlareNode.cpp @@ -30,12 +30,14 @@ #include "COM_SetValueOperation.h" #include "COM_MixBlendOperation.h" -GlareNode::GlareNode(bNode *editorNode): Node(editorNode) { +GlareNode::GlareNode(bNode *editorNode): Node(editorNode) +{ } -void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { - bNode* node = this->getbNode(); - NodeGlare* glare = (NodeGlare*)node->storage; +void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * context)\ +{ + bNode *node = this->getbNode(); + NodeGlare *glare = (NodeGlare*)node->storage; switch (glare->type) { diff --git a/source/blender/compositor/nodes/COM_GlareNode.h b/source/blender/compositor/nodes/COM_GlareNode.h index b3e965fa72d..97a75445db7 100644 --- a/source/blender/compositor/nodes/COM_GlareNode.h +++ b/source/blender/compositor/nodes/COM_GlareNode.h @@ -32,7 +32,7 @@ class GlareNode: public Node { public: GlareNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_GroupNode.cpp b/source/blender/compositor/nodes/COM_GroupNode.cpp index 14718909de9..67e829a5cf6 100644 --- a/source/blender/compositor/nodes/COM_GroupNode.cpp +++ b/source/blender/compositor/nodes/COM_GroupNode.cpp @@ -24,13 +24,16 @@ #include "COM_SocketProxyNode.h" #include "COM_ExecutionSystemHelper.h" -GroupNode::GroupNode(bNode *editorNode): Node(editorNode) { +GroupNode::GroupNode(bNode *editorNode): Node(editorNode) +{ } -void GroupNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void GroupNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ } -void GroupNode::ungroup(ExecutionSystem &system) { +void GroupNode::ungroup(ExecutionSystem &system) +{ vector &inputsockets = this->getInputSockets(); vector &outputsockets = this->getOutputSockets(); unsigned int index; @@ -65,6 +68,6 @@ void GroupNode::ungroup(ExecutionSystem &system) { } } - bNodeTree* subtree = (bNodeTree*)this->getbNode()->id; + bNodeTree *subtree = (bNodeTree*)this->getbNode()->id; ExecutionSystemHelper::addbNodeTree(system, nodes_start, subtree); } diff --git a/source/blender/compositor/nodes/COM_GroupNode.h b/source/blender/compositor/nodes/COM_GroupNode.h index a3a46ad2c33..e35c9cbce33 100644 --- a/source/blender/compositor/nodes/COM_GroupNode.h +++ b/source/blender/compositor/nodes/COM_GroupNode.h @@ -33,7 +33,7 @@ class GroupNode: public Node { public: GroupNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); /** * @brief check if this node a group node. diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp index 88ba24498bb..80c786ef6d7 100644 --- a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp +++ b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp @@ -33,14 +33,16 @@ #include "DNA_node_types.h" #include "COM_HueSaturationValueCorrectOperation.h" -HueSaturationValueCorrectNode::HueSaturationValueCorrectNode(bNode *editorNode): Node(editorNode) { +HueSaturationValueCorrectNode::HueSaturationValueCorrectNode(bNode *editorNode): Node(editorNode) +{ } -void HueSaturationValueCorrectNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void HueSaturationValueCorrectNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *valueSocket = this->getInputSocket(0); InputSocket *colourSocket = this->getInputSocket(1); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); CurveMapping *storage = (CurveMapping*)editorsnode->storage; if (colourSocket->isConnected() && outputSocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp b/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp index b4b9b55cf8b..d78592884c6 100644 --- a/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp +++ b/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp @@ -32,14 +32,16 @@ #include "COM_ChangeHSVOperation.h" #include "DNA_node_types.h" -HueSaturationValueNode::HueSaturationValueNode(bNode *editorNode): Node(editorNode) { +HueSaturationValueNode::HueSaturationValueNode(bNode *editorNode): Node(editorNode) +{ } -void HueSaturationValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void HueSaturationValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *valueSocket = this->getInputSocket(0); InputSocket *colourSocket = this->getInputSocket(1); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); NodeHueSat *storage = (NodeHueSat*)editorsnode->storage; ConvertRGBToHSVOperation * rgbToHSV = new ConvertRGBToHSVOperation(); diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.cpp b/source/blender/compositor/nodes/COM_IDMaskNode.cpp index d66657e489c..ea9e279009c 100644 --- a/source/blender/compositor/nodes/COM_IDMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_IDMaskNode.cpp @@ -26,10 +26,12 @@ #include "COM_ExecutionSystem.h" #include "COM_AntiAliasOperation.h" -IDMaskNode::IDMaskNode(bNode *editorNode): Node(editorNode) { +IDMaskNode::IDMaskNode(bNode *editorNode): Node(editorNode) +{ } -void IDMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - bNode* bnode = this->getbNode(); +void IDMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + bNode *bnode = this->getbNode(); IDMaskOperation *operation; operation = new IDMaskOperation(); operation->setObjectIndex(bnode->custom1); diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.h b/source/blender/compositor/nodes/COM_IDMaskNode.h index 5559044df4e..2ccbbc08f9a 100644 --- a/source/blender/compositor/nodes/COM_IDMaskNode.h +++ b/source/blender/compositor/nodes/COM_IDMaskNode.h @@ -32,7 +32,7 @@ class IDMaskNode: public Node { public: IDMaskNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp index ea2e99ed686..cc2f5f699a5 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.cpp +++ b/source/blender/compositor/nodes/COM_ImageNode.cpp @@ -28,9 +28,11 @@ #include "BKE_node.h" #include "BLI_utildefines.h" -ImageNode::ImageNode(bNode *editorNode): Node(editorNode) { +ImageNode::ImageNode(bNode *editorNode): Node(editorNode) +{ } -NodeOperation* ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer* rl, Image* image, ImageUser* user, int framenumber, int outputsocketIndex, int pass, DataType datatype) { +NodeOperation *ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int pass, DataType datatype) +{ OutputSocket *outputSocket = this->getOutputSocket(outputsocketIndex); MultilayerBaseOperation * operation = NULL; switch (datatype) { @@ -55,7 +57,8 @@ NodeOperation* ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer return operation; } -void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ /// Image output OutputSocket *outputImage = this->getOutputSocket(0); bNode *editorNode = this->getbNode(); @@ -77,7 +80,7 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * NodeImageLayer *storage = (NodeImageLayer*)bnodeSocket->storage; int passindex = storage->pass_index; int layerindex = storage->layer_index; - RenderLayer *rl= (RenderLayer*)BLI_findlink(&image->rr->layers, layerindex); + RenderLayer *rl = (RenderLayer*)BLI_findlink(&image->rr->layers, layerindex); if (rl) { RenderPass *rpass = (RenderPass *)BLI_findlink(&rl->passes, passindex); diff --git a/source/blender/compositor/nodes/COM_ImageNode.h b/source/blender/compositor/nodes/COM_ImageNode.h index cfbfbd119f9..70c3ab7f4b0 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.h +++ b/source/blender/compositor/nodes/COM_ImageNode.h @@ -36,9 +36,9 @@ extern "C" { class ImageNode : public Node { private: - NodeOperation* doMultilayerCheck(ExecutionSystem *system, RenderLayer* rl, Image* image, ImageUser* user, int framenumber, int outputsocketIndex, int pass, DataType datatype); + NodeOperation *doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int pass, DataType datatype); public: - ImageNode(bNode* editorNode); + ImageNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_InvertNode.cpp b/source/blender/compositor/nodes/COM_InvertNode.cpp index 2c47b467537..616a63ae948 100644 --- a/source/blender/compositor/nodes/COM_InvertNode.cpp +++ b/source/blender/compositor/nodes/COM_InvertNode.cpp @@ -26,12 +26,14 @@ #include "COM_ExecutionSystem.h" #include "BKE_node.h" -InvertNode::InvertNode(bNode *editorNode): Node(editorNode) { +InvertNode::InvertNode(bNode *editorNode): Node(editorNode) +{ } -void InvertNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void InvertNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InvertOperation *operation = new InvertOperation(); - bNode* node = this->getbNode(); + bNode *node = this->getbNode(); operation->setColor(node->custom1 & CMP_CHAN_RGB); operation->setAlpha(node->custom1 & CMP_CHAN_A); diff --git a/source/blender/compositor/nodes/COM_InvertNode.h b/source/blender/compositor/nodes/COM_InvertNode.h index ec70be3ba31..570e86445e6 100644 --- a/source/blender/compositor/nodes/COM_InvertNode.h +++ b/source/blender/compositor/nodes/COM_InvertNode.h @@ -32,7 +32,7 @@ class InvertNode: public Node { public: InvertNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp index cee2b133eee..5719f31180b 100644 --- a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp +++ b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp @@ -26,11 +26,13 @@ #include "COM_ProjectorLensDistortionOperation.h" #include "COM_ScreenLensDistortionOperation.h" -LensDistortionNode::LensDistortionNode(bNode *editorNode): Node(editorNode) { +LensDistortionNode::LensDistortionNode(bNode *editorNode): Node(editorNode) +{ } -void LensDistortionNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - bNode* editorNode = this->getbNode(); +void LensDistortionNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + bNode *editorNode = this->getbNode(); NodeLensDist * data = (NodeLensDist*)editorNode->storage; if (data->proj) { ProjectorLensDistortionOperation *operation = new ProjectorLensDistortionOperation(); diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.h b/source/blender/compositor/nodes/COM_LensDistortionNode.h index 41b84d4baff..64de740fde8 100644 --- a/source/blender/compositor/nodes/COM_LensDistortionNode.h +++ b/source/blender/compositor/nodes/COM_LensDistortionNode.h @@ -32,7 +32,7 @@ class LensDistortionNode: public Node { public: LensDistortionNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp b/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp index 010688b6c2a..8c9ebeed1cf 100644 --- a/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp @@ -28,14 +28,15 @@ LuminanceMatteNode::LuminanceMatteNode(bNode *editorNode): Node(editorNode) {} -void LuminanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void LuminanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ InputSocket *inputSocket = this->getInputSocket(0); OutputSocket *outputSocketImage = this->getOutputSocket(0); OutputSocket *outputSocketMatte = this->getOutputSocket(1); ConvertRGBToYUVOperation *rgbToYUV = new ConvertRGBToYUVOperation(); LuminanceMatteOperation *operationSet = new LuminanceMatteOperation(); - bNode* editorsnode = getbNode(); + bNode *editorsnode = getbNode(); operationSet->setSettings((NodeChroma*)editorsnode->storage); inputSocket->relinkConnections(rgbToYUV->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_MapUVNode.cpp b/source/blender/compositor/nodes/COM_MapUVNode.cpp index 14129eb7064..32db5ac13a8 100644 --- a/source/blender/compositor/nodes/COM_MapUVNode.cpp +++ b/source/blender/compositor/nodes/COM_MapUVNode.cpp @@ -23,17 +23,19 @@ #include "COM_MapUVOperation.h" #include "COM_ExecutionSystem.h" -MapUVNode::MapUVNode(bNode *editorNode): Node(editorNode) { +MapUVNode::MapUVNode(bNode *editorNode): Node(editorNode) +{ } -void MapUVNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void MapUVNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ MapUVOperation *operation = new MapUVOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); - bNode* node = this->getbNode(); + bNode *node = this->getbNode(); operation->setAlpha((float)node->custom1); operation->setResolutionInputSocketIndex(1); diff --git a/source/blender/compositor/nodes/COM_MapValueNode.cpp b/source/blender/compositor/nodes/COM_MapValueNode.cpp index 834b74a552d..4ca93113dd5 100644 --- a/source/blender/compositor/nodes/COM_MapValueNode.cpp +++ b/source/blender/compositor/nodes/COM_MapValueNode.cpp @@ -25,13 +25,15 @@ #include "COM_MapValueOperation.h" #include "COM_ExecutionSystem.h" -MapValueNode::MapValueNode(bNode *editorNode): Node(editorNode) { +MapValueNode::MapValueNode(bNode *editorNode): Node(editorNode) +{ } -void MapValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void MapValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *colourSocket = this->getInputSocket(0); OutputSocket *valueSocket = this->getOutputSocket(0); - TexMapping* storage = (TexMapping*)this->getbNode()->storage; + TexMapping *storage = (TexMapping*)this->getbNode()->storage; MapValueOperation *convertProg = new MapValueOperation(); convertProg->setSettings(storage); colourSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_MathNode.cpp b/source/blender/compositor/nodes/COM_MathNode.cpp index e90767703a5..a5c4aa01721 100644 --- a/source/blender/compositor/nodes/COM_MathNode.cpp +++ b/source/blender/compositor/nodes/COM_MathNode.cpp @@ -24,8 +24,9 @@ #include "COM_MathBaseOperation.h" #include "COM_ExecutionSystem.h" -void MathNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - MathBaseOperation* operation=NULL; +void MathNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + MathBaseOperation *operation=NULL; switch (this->getbNode()->custom1) { diff --git a/source/blender/compositor/nodes/COM_MathNode.h b/source/blender/compositor/nodes/COM_MathNode.h index f5e6b5daebe..1e2cccda396 100644 --- a/source/blender/compositor/nodes/COM_MathNode.h +++ b/source/blender/compositor/nodes/COM_MathNode.h @@ -31,7 +31,7 @@ */ class MathNode: public Node { public: - MathNode(bNode* editorNode) :Node(editorNode) {} + MathNode(bNode *editorNode) :Node(editorNode) {} void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_MixNode.cpp b/source/blender/compositor/nodes/COM_MixNode.cpp index 1477163d1fc..63ab83834f2 100644 --- a/source/blender/compositor/nodes/COM_MixNode.cpp +++ b/source/blender/compositor/nodes/COM_MixNode.cpp @@ -46,16 +46,18 @@ #include "DNA_material_types.h" // the ramp types -MixNode::MixNode(bNode *editorNode): Node(editorNode) { +MixNode::MixNode(bNode *editorNode): Node(editorNode) +{ } -void MixNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void MixNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *valueSocket = this->getInputSocket(0); InputSocket *color1Socket = this->getInputSocket(1); InputSocket *color2Socket = this->getInputSocket(2); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* editorNode = this->getbNode(); + bNode *editorNode = this->getbNode(); MixBaseOperation *convertProg; diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.cpp b/source/blender/compositor/nodes/COM_MovieClipNode.cpp index 475a538670d..0bddd328007 100644 --- a/source/blender/compositor/nodes/COM_MovieClipNode.cpp +++ b/source/blender/compositor/nodes/COM_MovieClipNode.cpp @@ -32,10 +32,12 @@ extern "C" { #include "BKE_tracking.h" } -MovieClipNode::MovieClipNode(bNode *editorNode): Node(editorNode) { +MovieClipNode::MovieClipNode(bNode *editorNode): Node(editorNode) +{ } -void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ OutputSocket *outputMovieClip = this->getOutputSocket(0); OutputSocket *offsetXMovieClip = this->getOutputSocket(1); OutputSocket *offsetYMovieClip = this->getOutputSocket(2); @@ -46,7 +48,7 @@ void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContex MovieClip *movieClip = (MovieClip*)editorNode->id; MovieClipUser *movieClipUser = (MovieClipUser*)editorNode->storage; - ImBuf * ibuf= NULL; + ImBuf * ibuf = NULL; if (movieClip) { ibuf = BKE_movieclip_get_ibuf(movieClip, movieClipUser); } @@ -79,7 +81,7 @@ void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContex operation->setFramenumber(context->getFramenumber()); graph->addOperation(operation); - MovieTrackingStabilization *stab= &movieClip->tracking.stabilization; + MovieTrackingStabilization *stab = &movieClip->tracking.stabilization; float loc[2], scale, angle; loc[0] = 0.0f; loc[1] = 0.0f; diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.h b/source/blender/compositor/nodes/COM_MovieClipNode.h index 883ebe486f8..8ad2fa8cbb0 100644 --- a/source/blender/compositor/nodes/COM_MovieClipNode.h +++ b/source/blender/compositor/nodes/COM_MovieClipNode.h @@ -31,7 +31,7 @@ class MovieClipNode : public Node { public: - MovieClipNode(bNode* editorNode); + MovieClipNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp index 4233f313a87..82949fe10f9 100644 --- a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp +++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp @@ -26,13 +26,15 @@ #include "COM_ExecutionSystem.h" #include "DNA_movieclip_types.h" -MovieDistortionNode::MovieDistortionNode(bNode *editorNode) : Node(editorNode) { +MovieDistortionNode::MovieDistortionNode(bNode *editorNode) : Node(editorNode) +{ } -void MovieDistortionNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { +void MovieDistortionNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* bnode = this->getbNode(); + bNode *bnode = this->getbNode(); MovieClip * clip = (MovieClip*)bnode->id; MovieDistortionOperation * operation = new MovieDistortionOperation(bnode->custom1 == 1); diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.h b/source/blender/compositor/nodes/COM_MovieDistortionNode.h index 28eec5011a2..5ee328c9df3 100644 --- a/source/blender/compositor/nodes/COM_MovieDistortionNode.h +++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.h @@ -32,7 +32,7 @@ class MovieDistortionNode: public Node { public: MovieDistortionNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_MuteNode.cpp b/source/blender/compositor/nodes/COM_MuteNode.cpp index cb3d4be8834..72303a4d6ee 100644 --- a/source/blender/compositor/nodes/COM_MuteNode.cpp +++ b/source/blender/compositor/nodes/COM_MuteNode.cpp @@ -27,10 +27,12 @@ #include "COM_SetVectorOperation.h" #include "COM_SetColorOperation.h" -MuteNode::MuteNode(bNode *editorNode): Node(editorNode) { +MuteNode::MuteNode(bNode *editorNode): Node(editorNode) +{ } -void MuteNode::reconnect(ExecutionSystem * graph, OutputSocket * output) { +void MuteNode::reconnect(ExecutionSystem * graph, OutputSocket * output) +{ vector &inputsockets = this->getInputSockets(); for (unsigned int index = 0; index < inputsockets.size() ; index ++) { InputSocket *input = inputsockets[index]; @@ -83,7 +85,8 @@ void MuteNode::reconnect(ExecutionSystem * graph, OutputSocket * output) { output->clearConnections(); } -void MuteNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void MuteNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ vector &outputsockets = this->getOutputSockets(); for (unsigned int index = 0 ; index < outputsockets.size() ; index ++) { diff --git a/source/blender/compositor/nodes/COM_MuteNode.h b/source/blender/compositor/nodes/COM_MuteNode.h index c2d1f283c62..2dfc786ef2b 100644 --- a/source/blender/compositor/nodes/COM_MuteNode.h +++ b/source/blender/compositor/nodes/COM_MuteNode.h @@ -32,9 +32,9 @@ class MuteNode: public Node { public: MuteNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); private: - void reconnect(ExecutionSystem* graph, OutputSocket * output); + void reconnect(ExecutionSystem *graph, OutputSocket * output); }; #endif diff --git a/source/blender/compositor/nodes/COM_NormalNode.cpp b/source/blender/compositor/nodes/COM_NormalNode.cpp index b54d8b8aab6..58b6ba1f410 100644 --- a/source/blender/compositor/nodes/COM_NormalNode.cpp +++ b/source/blender/compositor/nodes/COM_NormalNode.cpp @@ -26,14 +26,15 @@ #include "COM_DotproductOperation.h" #include "COM_SetVectorOperation.h" -NormalNode::NormalNode(bNode* editorNode): Node(editorNode) +NormalNode::NormalNode(bNode *editorNode): Node(editorNode) {} -void NormalNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void NormalNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); OutputSocket *outputSocket = this->getOutputSocket(0); OutputSocket *outputSocketDotproduct = this->getOutputSocket(1); - bNode* editorNode = this->getbNode(); + bNode *editorNode = this->getbNode(); SetVectorOperation * operationSet = new SetVectorOperation(); bNodeSocket * insock = (bNodeSocket*)editorNode->outputs.first; diff --git a/source/blender/compositor/nodes/COM_NormalNode.h b/source/blender/compositor/nodes/COM_NormalNode.h index 97a2f4bdd06..1e7c7c584c3 100644 --- a/source/blender/compositor/nodes/COM_NormalNode.h +++ b/source/blender/compositor/nodes/COM_NormalNode.h @@ -32,8 +32,8 @@ class NormalNode : public Node { public: - NormalNode(bNode* editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + NormalNode(bNode *editorNode); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif // COM_NormalNODE_H diff --git a/source/blender/compositor/nodes/COM_NormalizeNode.cpp b/source/blender/compositor/nodes/COM_NormalizeNode.cpp index dbe8278af0f..f3fe8579a86 100644 --- a/source/blender/compositor/nodes/COM_NormalizeNode.cpp +++ b/source/blender/compositor/nodes/COM_NormalizeNode.cpp @@ -23,10 +23,12 @@ #include "COM_NormalizeOperation.h" #include "COM_ExecutionSystem.h" -NormalizeNode::NormalizeNode(bNode *editorNode): Node(editorNode) { +NormalizeNode::NormalizeNode(bNode *editorNode): Node(editorNode) +{ } -void NormalizeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void NormalizeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ NormalizeOperation *operation = new NormalizeOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_NormalizeNode.h b/source/blender/compositor/nodes/COM_NormalizeNode.h index b955b52391e..ce7a6e1f7ab 100644 --- a/source/blender/compositor/nodes/COM_NormalizeNode.h +++ b/source/blender/compositor/nodes/COM_NormalizeNode.h @@ -31,7 +31,7 @@ class NormalizeNode: public Node { public: NormalizeNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.cpp b/source/blender/compositor/nodes/COM_OutputFileNode.cpp index d844861cdd5..e70e4f296d6 100644 --- a/source/blender/compositor/nodes/COM_OutputFileNode.cpp +++ b/source/blender/compositor/nodes/COM_OutputFileNode.cpp @@ -27,11 +27,13 @@ #include "BLI_path_util.h" #include "BKE_utildefines.h" -OutputFileNode::OutputFileNode(bNode *editorNode): Node(editorNode) { +OutputFileNode::OutputFileNode(bNode *editorNode): Node(editorNode) +{ } -void OutputFileNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - NodeImageMultiFile* storage = (NodeImageMultiFile*)this->getbNode()->storage; +void OutputFileNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + NodeImageMultiFile *storage = (NodeImageMultiFile*)this->getbNode()->storage; if (!context->isRendering()) { /* XXX TODO as in previous implementation? diff --git a/source/blender/compositor/nodes/COM_RenderLayersNode.cpp b/source/blender/compositor/nodes/COM_RenderLayersNode.cpp index e4ce63e9193..4e99db090e1 100644 --- a/source/blender/compositor/nodes/COM_RenderLayersNode.cpp +++ b/source/blender/compositor/nodes/COM_RenderLayersNode.cpp @@ -47,12 +47,14 @@ #include "COM_ScaleOperation.h" #include "COM_SetValueOperation.h" -RenderLayersNode::RenderLayersNode(bNode *editorNode): Node(editorNode) { +RenderLayersNode::RenderLayersNode(bNode *editorNode): Node(editorNode) +{ } -void RenderLayersNode::testSocketConnection(ExecutionSystem* system, int outputSocketNumber, RenderLayersBaseProg * operation) { +void RenderLayersNode::testSocketConnection(ExecutionSystem *system, int outputSocketNumber, RenderLayersBaseProg * operation) +{ OutputSocket *outputSocket = this->getOutputSocket(outputSocketNumber); - Scene* scene = (Scene*)this->getbNode()->id; + Scene *scene = (Scene*)this->getbNode()->id; short layerId = this->getbNode()->custom1; if (outputSocket->isConnected()) { @@ -77,7 +79,8 @@ void RenderLayersNode::testSocketConnection(ExecutionSystem* system, int outputS } } -void RenderLayersNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void RenderLayersNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ testSocketConnection(graph, 0, new RenderLayersColourProg()); testSocketConnection(graph, 1, new RenderLayersAlphaProg()); testSocketConnection(graph, 2, new RenderLayersDepthProg()); diff --git a/source/blender/compositor/nodes/COM_RenderLayersNode.h b/source/blender/compositor/nodes/COM_RenderLayersNode.h index 285b6f6d007..f796a7147d9 100644 --- a/source/blender/compositor/nodes/COM_RenderLayersNode.h +++ b/source/blender/compositor/nodes/COM_RenderLayersNode.h @@ -30,8 +30,8 @@ */ class RenderLayersNode : public Node { public: - RenderLayersNode(bNode* editorNode); + RenderLayersNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext * context); private: - void testSocketConnection(ExecutionSystem* graph, int outputSocketNumber, RenderLayersBaseProg * operation); + void testSocketConnection(ExecutionSystem *graph, int outputSocketNumber, RenderLayersBaseProg * operation); }; diff --git a/source/blender/compositor/nodes/COM_RotateNode.cpp b/source/blender/compositor/nodes/COM_RotateNode.cpp index 059a62874bb..f5fdf19398d 100644 --- a/source/blender/compositor/nodes/COM_RotateNode.cpp +++ b/source/blender/compositor/nodes/COM_RotateNode.cpp @@ -26,10 +26,12 @@ #include "COM_ExecutionSystem.h" #include "COM_SetSamplerOperation.h" -RotateNode::RotateNode(bNode *editorNode) : Node(editorNode) { +RotateNode::RotateNode(bNode *editorNode) : Node(editorNode) +{ } -void RotateNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { +void RotateNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); InputSocket *inputDegreeSocket = this->getInputSocket(1); OutputSocket *outputSocket = this->getOutputSocket(0); diff --git a/source/blender/compositor/nodes/COM_RotateNode.h b/source/blender/compositor/nodes/COM_RotateNode.h index 7e4f7a1a546..9b471742aab 100644 --- a/source/blender/compositor/nodes/COM_RotateNode.h +++ b/source/blender/compositor/nodes/COM_RotateNode.h @@ -32,7 +32,7 @@ class RotateNode: public Node { public: RotateNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ScaleNode.cpp b/source/blender/compositor/nodes/COM_ScaleNode.cpp index b281ed64d79..fe5862da018 100644 --- a/source/blender/compositor/nodes/COM_ScaleNode.cpp +++ b/source/blender/compositor/nodes/COM_ScaleNode.cpp @@ -27,15 +27,17 @@ #include "BKE_node.h" #include "COM_SetValueOperation.h" -ScaleNode::ScaleNode(bNode *editorNode) : Node(editorNode) { +ScaleNode::ScaleNode(bNode *editorNode) : Node(editorNode) +{ } -void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); InputSocket *inputXSocket = this->getInputSocket(1); InputSocket *inputYSocket = this->getInputSocket(2); OutputSocket *outputSocket = this->getOutputSocket(0); - bNode* bnode = this->getbNode(); + bNode *bnode = this->getbNode(); switch (bnode->custom1) { case CMP_SCALE_RELATIVE: { ScaleOperation *operation = new ScaleOperation(); @@ -61,7 +63,7 @@ void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * break; case CMP_SCALE_RENDERPERCENT: { - const RenderData* data = &context->getScene()->r; + const RenderData *data = &context->getScene()->r; ScaleFixedSizeOperation * operation = new ScaleFixedSizeOperation(); operation->setNewWidth(data->xsch*data->size/100.0f); operation->setNewHeight(data->ysch*data->size/100.0f); diff --git a/source/blender/compositor/nodes/COM_ScaleNode.h b/source/blender/compositor/nodes/COM_ScaleNode.h index b6a1a56d8c9..310ae96a65e 100644 --- a/source/blender/compositor/nodes/COM_ScaleNode.h +++ b/source/blender/compositor/nodes/COM_ScaleNode.h @@ -32,7 +32,7 @@ class ScaleNode: public Node { public: ScaleNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp b/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp index 922b9c051d5..cfce56a080a 100644 --- a/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp +++ b/source/blender/compositor/nodes/COM_SeparateHSVANode.cpp @@ -27,10 +27,12 @@ #include "COM_SetValueOperation.h" #include "COM_ConvertRGBToHSVOperation.h" -SeparateHSVANode::SeparateHSVANode(bNode *editorNode): SeparateRGBANode(editorNode) { +SeparateHSVANode::SeparateHSVANode(bNode *editorNode): SeparateRGBANode(editorNode) +{ } -void SeparateHSVANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void SeparateHSVANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ ConvertRGBToHSVOperation *operation = new ConvertRGBToHSVOperation(); InputSocket *inputSocket = this->getInputSocket(0); if (inputSocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp b/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp index 08b3c87cbf9..7079762d465 100644 --- a/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp +++ b/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp @@ -28,11 +28,13 @@ #include "DNA_material_types.h" // the ramp types -SeparateRGBANode::SeparateRGBANode(bNode *editorNode): Node(editorNode) { +SeparateRGBANode::SeparateRGBANode(bNode *editorNode): Node(editorNode) +{ } -void SeparateRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void SeparateRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *imageSocket = this->getInputSocket(0); OutputSocket *outputRSocket = this->getOutputSocket(0); OutputSocket *outputGSocket = this->getOutputSocket(1); @@ -45,26 +47,26 @@ void SeparateRGBANode::convertToOperations(ExecutionSystem *graph, CompositorCon imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); outputRSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - } + } if (outputGSocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(1); imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); outputGSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - } + } if (outputBSocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(2); imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); outputBSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - } + } if (outputASocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(3); imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); outputASocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - } + } } diff --git a/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp b/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp index 854f74cda4c..68d20235de7 100644 --- a/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp +++ b/source/blender/compositor/nodes/COM_SeparateYCCANode.cpp @@ -25,10 +25,12 @@ #include "COM_SetValueOperation.h" #include "COM_ConvertRGBToYCCOperation.h" -SeparateYCCANode::SeparateYCCANode(bNode *editorNode): SeparateRGBANode(editorNode) { +SeparateYCCANode::SeparateYCCANode(bNode *editorNode): SeparateRGBANode(editorNode) +{ } -void SeparateYCCANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void SeparateYCCANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ ConvertRGBToYCCOperation *operation = new ConvertRGBToYCCOperation(); InputSocket *inputSocket = this->getInputSocket(0); diff --git a/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp b/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp index db8a8bd2697..650e5d1340b 100644 --- a/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp +++ b/source/blender/compositor/nodes/COM_SeparateYUVANode.cpp @@ -25,10 +25,12 @@ #include "COM_SetValueOperation.h" #include "COM_ConvertRGBToYUVOperation.h" -SeparateYUVANode::SeparateYUVANode(bNode *editorNode): SeparateRGBANode(editorNode) { +SeparateYUVANode::SeparateYUVANode(bNode *editorNode): SeparateRGBANode(editorNode) +{ } -void SeparateYUVANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) { +void SeparateYUVANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +{ ConvertRGBToYUVOperation *operation = new ConvertRGBToYUVOperation(); InputSocket *inputSocket = this->getInputSocket(0); if (inputSocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp index 5dd7dea1fa8..90db6682184 100644 --- a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp +++ b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp @@ -24,8 +24,9 @@ #include "COM_SetAlphaOperation.h" #include "COM_ExecutionSystem.h" -void SetAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - SetAlphaOperation* operation = new SetAlphaOperation(); +void SetAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ + SetAlphaOperation *operation = new SetAlphaOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.h b/source/blender/compositor/nodes/COM_SetAlphaNode.h index c9d819d172e..c6b603049c5 100644 --- a/source/blender/compositor/nodes/COM_SetAlphaNode.h +++ b/source/blender/compositor/nodes/COM_SetAlphaNode.h @@ -31,7 +31,7 @@ */ class SetAlphaNode: public Node { public: - SetAlphaNode(bNode* editorNode) :Node(editorNode) {} + SetAlphaNode(bNode *editorNode) :Node(editorNode) {} void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp index 6730036baf6..42dd49bd1da 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.cpp +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.cpp @@ -28,7 +28,8 @@ #include "COM_SetVectorOperation.h" #include "COM_SetColorOperation.h" -SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput): Node(editorNode, false) { +SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput): Node(editorNode, false) +{ DataType dt; dt = COM_DT_VALUE; @@ -42,7 +43,8 @@ SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bN this->addOutputSocket(dt, editorOutput); } -void SocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void SocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ OutputSocket * outputsocket = this->getOutputSocket(0); if (outputsocket->isConnected()) { SocketProxyOperation *operation = new SocketProxyOperation(); @@ -52,7 +54,8 @@ void SocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorCont } } -void OutputSocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void OutputSocketProxyNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ OutputSocket * outputsocket = this->getOutputSocket(0); InputSocket * inputsocket = this->getInputSocket(0); if (outputsocket->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.h b/source/blender/compositor/nodes/COM_SocketProxyNode.h index eb14f84c46a..1b5ee699211 100644 --- a/source/blender/compositor/nodes/COM_SocketProxyNode.h +++ b/source/blender/compositor/nodes/COM_SocketProxyNode.h @@ -32,7 +32,7 @@ class SocketProxyNode: public Node { public: SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); virtual bool isProxyNode() const { return true; } }; @@ -40,7 +40,7 @@ public: class OutputSocketProxyNode: public SocketProxyNode { public: OutputSocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput): SocketProxyNode(editorNode, editorInput, editorOutput) {} - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp index 12204c65112..d1a2cccf758 100644 --- a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp +++ b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp @@ -26,13 +26,15 @@ #include "COM_SplitViewerOperation.h" #include "COM_ExecutionSystem.h" -SplitViewerNode::SplitViewerNode(bNode *editorNode): Node(editorNode) { +SplitViewerNode::SplitViewerNode(bNode *editorNode): Node(editorNode) +{ } -void SplitViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void SplitViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *image1Socket = this->getInputSocket(0); InputSocket *image2Socket = this->getInputSocket(1); - Image* image = (Image*)this->getbNode()->id; + Image *image = (Image*)this->getbNode()->id; ImageUser * imageUser = (ImageUser*) this->getbNode()->storage; if (image1Socket->isConnected() && image2Socket->isConnected()) { SplitViewerOperation *splitViewerOperation = new SplitViewerOperation(); diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp index 74fde974784..047b4fa4bf6 100644 --- a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp @@ -32,12 +32,14 @@ extern "C" { #include "BKE_tracking.h" } -Stabilize2dNode::Stabilize2dNode(bNode *editorNode): Node(editorNode) { +Stabilize2dNode::Stabilize2dNode(bNode *editorNode): Node(editorNode) +{ } -void Stabilize2dNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void Stabilize2dNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *imageInput = this->getInputSocket(0); - MovieClip *clip= (MovieClip *)getbNode()->id; + MovieClip *clip = (MovieClip *)getbNode()->id; ScaleOperation * scaleOperation = new ScaleOperation(); RotateOperation * rotateOperation = new RotateOperation(); diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.h b/source/blender/compositor/nodes/COM_Stabilize2dNode.h index 613bb97b994..63bf50b4d69 100644 --- a/source/blender/compositor/nodes/COM_Stabilize2dNode.h +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.h @@ -29,6 +29,6 @@ */ class Stabilize2dNode : public Node { public: - Stabilize2dNode(bNode* editorNode); + Stabilize2dNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_SwitchNode.cpp b/source/blender/compositor/nodes/COM_SwitchNode.cpp index 83e0be7d3c0..c65d7fbdc61 100644 --- a/source/blender/compositor/nodes/COM_SwitchNode.cpp +++ b/source/blender/compositor/nodes/COM_SwitchNode.cpp @@ -24,11 +24,13 @@ #include "COM_ExecutionSystem.h" #include "COM_SocketProxyOperation.h" -SwitchNode::SwitchNode(bNode *editorNode): Node(editorNode) { +SwitchNode::SwitchNode(bNode *editorNode): Node(editorNode) +{ } -void SwitchNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void SwitchNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ SocketProxyOperation * operation = new SocketProxyOperation(); int switchFrame = this->getbNode()->custom1; diff --git a/source/blender/compositor/nodes/COM_TextureNode.cpp b/source/blender/compositor/nodes/COM_TextureNode.cpp index ac78c1afd7d..0f9a2ca4c26 100644 --- a/source/blender/compositor/nodes/COM_TextureNode.cpp +++ b/source/blender/compositor/nodes/COM_TextureNode.cpp @@ -24,13 +24,15 @@ #include "COM_ExecutionSystem.h" #include "COM_TextureOperation.h" -TextureNode::TextureNode(bNode *editorNode): Node(editorNode) { +TextureNode::TextureNode(bNode *editorNode): Node(editorNode) +{ } -void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { - bNode* editorNode = this->getbNode(); - Tex* texture = (Tex*)editorNode->id; - TextureOperation* operation = new TextureOperation(); +void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ + bNode *editorNode = this->getbNode(); + Tex *texture = (Tex*)editorNode->id; + TextureOperation *operation = new TextureOperation(); this->getOutputSocket(1)->relinkConnections(operation->getOutputSocket()); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); @@ -39,7 +41,7 @@ void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext addPreviewOperation(system, operation->getOutputSocket(), 9); if (this->getOutputSocket(0)->isConnected()) { - TextureAlphaOperation* alphaOperation = new TextureAlphaOperation(); + TextureAlphaOperation *alphaOperation = new TextureAlphaOperation(); this->getOutputSocket(0)->relinkConnections(alphaOperation->getOutputSocket()); addLink(system, operation->getInputSocket(0)->getConnection()->getFromSocket(), alphaOperation->getInputSocket(0)); addLink(system, operation->getInputSocket(1)->getConnection()->getFromSocket(), alphaOperation->getInputSocket(1)); diff --git a/source/blender/compositor/nodes/COM_TextureNode.h b/source/blender/compositor/nodes/COM_TextureNode.h index 493c94ddb19..15c39db9077 100644 --- a/source/blender/compositor/nodes/COM_TextureNode.h +++ b/source/blender/compositor/nodes/COM_TextureNode.h @@ -29,6 +29,6 @@ */ class TextureNode : public Node { public: - TextureNode(bNode* editorNode); + TextureNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_TimeNode.cpp b/source/blender/compositor/nodes/COM_TimeNode.cpp index 481840cbd58..11bc29679b9 100644 --- a/source/blender/compositor/nodes/COM_TimeNode.cpp +++ b/source/blender/compositor/nodes/COM_TimeNode.cpp @@ -29,16 +29,18 @@ extern "C" { } #include "BLI_utildefines.h" -TimeNode::TimeNode(bNode *editorNode): Node(editorNode) { +TimeNode::TimeNode(bNode *editorNode): Node(editorNode) +{ } -void TimeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void TimeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ SetValueOperation *operation = new SetValueOperation(); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); - bNode* node = this->getbNode(); + bNode *node = this->getbNode(); /* stack order output: fac */ - float fac= 0.0f; + float fac = 0.0f; const int framenumber = context->getFramenumber(); if (framenumber < node->custom1) { @@ -48,10 +50,10 @@ void TimeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c fac = 1.0f; } else if (node->custom1 < node->custom2) { - fac= (context->getFramenumber() - node->custom1)/(float)(node->custom2-node->custom1); + fac = (context->getFramenumber() - node->custom1)/(float)(node->custom2-node->custom1); } - fac= curvemapping_evaluateF((CurveMapping*)node->storage, 0, fac); + fac = curvemapping_evaluateF((CurveMapping*)node->storage, 0, fac); operation->setValue(CLAMPIS(fac, 0.0f, 1.0f)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_TimeNode.h b/source/blender/compositor/nodes/COM_TimeNode.h index 25134db8528..26751f6f104 100644 --- a/source/blender/compositor/nodes/COM_TimeNode.h +++ b/source/blender/compositor/nodes/COM_TimeNode.h @@ -32,7 +32,7 @@ class TimeNode: public Node { public: TimeNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_TonemapNode.cpp b/source/blender/compositor/nodes/COM_TonemapNode.cpp index a610146a495..7e170ea1704 100644 --- a/source/blender/compositor/nodes/COM_TonemapNode.cpp +++ b/source/blender/compositor/nodes/COM_TonemapNode.cpp @@ -25,11 +25,13 @@ #include "COM_TonemapOperation.h" #include "COM_ExecutionSystem.h" -TonemapNode::TonemapNode(bNode *editorNode): Node(editorNode) { +TonemapNode::TonemapNode(bNode *editorNode): Node(editorNode) +{ } -void TonemapNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { - NodeTonemap* data = (NodeTonemap*)this->getbNode()->storage; +void TonemapNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ + NodeTonemap *data = (NodeTonemap*)this->getbNode()->storage; TonemapOperation *operation = data->type==1?new PhotoreceptorTonemapOperation():new TonemapOperation(); operation->setData(data); diff --git a/source/blender/compositor/nodes/COM_TonemapNode.h b/source/blender/compositor/nodes/COM_TonemapNode.h index 2140d7deb6a..d6dd8474afa 100644 --- a/source/blender/compositor/nodes/COM_TonemapNode.h +++ b/source/blender/compositor/nodes/COM_TonemapNode.h @@ -32,7 +32,7 @@ class TonemapNode: public Node { public: TonemapNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_TransformNode.cpp b/source/blender/compositor/nodes/COM_TransformNode.cpp index 9b6d5ec35c5..6762cb0687a 100644 --- a/source/blender/compositor/nodes/COM_TransformNode.cpp +++ b/source/blender/compositor/nodes/COM_TransformNode.cpp @@ -28,10 +28,12 @@ #include "COM_SetValueOperation.h" #include "COM_SetSamplerOperation.h" -TransformNode::TransformNode(bNode *editorNode): Node(editorNode) { +TransformNode::TransformNode(bNode *editorNode): Node(editorNode) +{ } -void TransformNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void TransformNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *imageInput = this->getInputSocket(0); InputSocket *xInput = this->getInputSocket(1); InputSocket *yInput = this->getInputSocket(2); diff --git a/source/blender/compositor/nodes/COM_TransformNode.h b/source/blender/compositor/nodes/COM_TransformNode.h index bcb71ba8e5d..237da44afd9 100644 --- a/source/blender/compositor/nodes/COM_TransformNode.h +++ b/source/blender/compositor/nodes/COM_TransformNode.h @@ -29,6 +29,6 @@ */ class TransformNode : public Node { public: - TransformNode(bNode* editorNode); + TransformNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp index 4dfa901610c..f594db3c160 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cpp +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -25,10 +25,12 @@ #include "COM_TranslateOperation.h" #include "COM_ExecutionSystem.h" -TranslateNode::TranslateNode(bNode *editorNode) : Node(editorNode) { +TranslateNode::TranslateNode(bNode *editorNode) : Node(editorNode) +{ } -void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket *inputSocket = this->getInputSocket(0); InputSocket *inputXSocket = this->getInputSocket(1); InputSocket *inputYSocket = this->getInputSocket(2); diff --git a/source/blender/compositor/nodes/COM_TranslateNode.h b/source/blender/compositor/nodes/COM_TranslateNode.h index 8f7558ea468..295024d6beb 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.h +++ b/source/blender/compositor/nodes/COM_TranslateNode.h @@ -32,7 +32,7 @@ class TranslateNode: public Node { public: TranslateNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ValueNode.cpp b/source/blender/compositor/nodes/COM_ValueNode.cpp index 0b40872bed4..39245e75a2f 100644 --- a/source/blender/compositor/nodes/COM_ValueNode.cpp +++ b/source/blender/compositor/nodes/COM_ValueNode.cpp @@ -25,12 +25,14 @@ #include "COM_SetValueOperation.h" #include "COM_ExecutionSystem.h" -ValueNode::ValueNode(bNode *editorNode): Node(editorNode) { +ValueNode::ValueNode(bNode *editorNode): Node(editorNode) +{ } -void ValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ SetValueOperation *operation = new SetValueOperation(); - bNodeSocket* socket = this->getEditorOutputSocket(0); + bNodeSocket *socket = this->getEditorOutputSocket(0); bNodeSocketValueFloat *dval = (bNodeSocketValueFloat*)socket->default_value; this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); operation->setValue(dval->value); diff --git a/source/blender/compositor/nodes/COM_ValueNode.h b/source/blender/compositor/nodes/COM_ValueNode.h index f0322a9704c..4faf193fc8e 100644 --- a/source/blender/compositor/nodes/COM_ValueNode.h +++ b/source/blender/compositor/nodes/COM_ValueNode.h @@ -32,7 +32,7 @@ class ValueNode: public Node { public: ValueNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_VectorBlurNode.cpp b/source/blender/compositor/nodes/COM_VectorBlurNode.cpp index 2063f21c785..4baa2315799 100644 --- a/source/blender/compositor/nodes/COM_VectorBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_VectorBlurNode.cpp @@ -28,12 +28,14 @@ #include "COM_SetValueOperation.h" #include "COM_MixBlendOperation.h" -VectorBlurNode::VectorBlurNode(bNode *editorNode): Node(editorNode) { +VectorBlurNode::VectorBlurNode(bNode *editorNode): Node(editorNode) +{ } -void VectorBlurNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) { - bNode* node = this->getbNode(); - NodeBlurData* vectorBlurSettings = (NodeBlurData*)node->storage; +void VectorBlurNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ + bNode *node = this->getbNode(); + NodeBlurData *vectorBlurSettings = (NodeBlurData*)node->storage; VectorBlurOperation *operation = new VectorBlurOperation(); operation->setVectorBlurSettings(vectorBlurSettings); operation->setQuality(context->getQuality()); diff --git a/source/blender/compositor/nodes/COM_VectorBlurNode.h b/source/blender/compositor/nodes/COM_VectorBlurNode.h index 54449bde1d3..1df945731ce 100644 --- a/source/blender/compositor/nodes/COM_VectorBlurNode.h +++ b/source/blender/compositor/nodes/COM_VectorBlurNode.h @@ -32,7 +32,7 @@ class VectorBlurNode: public Node { public: VectorBlurNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_VectorCurveNode.cpp b/source/blender/compositor/nodes/COM_VectorCurveNode.cpp index c62906a82a6..2f216b5d5bd 100644 --- a/source/blender/compositor/nodes/COM_VectorCurveNode.cpp +++ b/source/blender/compositor/nodes/COM_VectorCurveNode.cpp @@ -25,10 +25,12 @@ #include "COM_VectorCurveOperation.h" #include "COM_ExecutionSystem.h" -VectorCurveNode::VectorCurveNode(bNode *editorNode): Node(editorNode) { +VectorCurveNode::VectorCurveNode(bNode *editorNode): Node(editorNode) +{ } -void VectorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void VectorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ VectorCurveOperation *operation = new VectorCurveOperation(); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); diff --git a/source/blender/compositor/nodes/COM_VectorCurveNode.h b/source/blender/compositor/nodes/COM_VectorCurveNode.h index e18dac54c2c..9fbcfd50156 100644 --- a/source/blender/compositor/nodes/COM_VectorCurveNode.h +++ b/source/blender/compositor/nodes/COM_VectorCurveNode.h @@ -32,7 +32,7 @@ class VectorCurveNode: public Node { public: VectorCurveNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp index 42d019c4e93..9aa922faa5d 100644 --- a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp @@ -26,13 +26,15 @@ #include "COM_CalculateMeanOperation.h" #include "COM_CalculateStandardDeviationOperation.h" -ViewLevelsNode::ViewLevelsNode(bNode *editorNode): Node(editorNode) { +ViewLevelsNode::ViewLevelsNode(bNode *editorNode): Node(editorNode) +{ } -void ViewLevelsNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ViewLevelsNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) +{ InputSocket * input = this->getInputSocket(0); bool firstOperationConnected = false; if (input->isConnected()) { - OutputSocket* inputSocket= input->getConnection()->getFromSocket(); + OutputSocket *inputSocket = input->getConnection()->getFromSocket(); // add preview to inputSocket; OutputSocket * socket = this->getOutputSocket(0); diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.h b/source/blender/compositor/nodes/COM_ViewLevelsNode.h index 9d6b764a2a9..11be6216cba 100644 --- a/source/blender/compositor/nodes/COM_ViewLevelsNode.h +++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.h @@ -32,7 +32,7 @@ class ViewLevelsNode: public Node { public: ViewLevelsNode(bNode *editorNode); - void convertToOperations(ExecutionSystem* graph, CompositorContext * context); + void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; #endif diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp index 0148fac47f9..d518976143d 100644 --- a/source/blender/compositor/nodes/COM_ViewerNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp @@ -26,16 +26,18 @@ #include "COM_ViewerOperation.h" #include "COM_ExecutionSystem.h" -ViewerNode::ViewerNode(bNode *editorNode): Node(editorNode) { +ViewerNode::ViewerNode(bNode *editorNode): Node(editorNode) +{ } -void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { +void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context)\ +{ InputSocket *imageSocket = this->getInputSocket(0); InputSocket *alphaSocket = this->getInputSocket(1); - Image* image = (Image*)this->getbNode()->id; + Image *image = (Image*)this->getbNode()->id; ImageUser * imageUser = (ImageUser*) this->getbNode()->storage; if (imageSocket->isConnected()) { - bNode* editorNode = this->getbNode(); + bNode *editorNode = this->getbNode(); ViewerOperation *viewerOperation = new ViewerOperation(); viewerOperation->setColorManagement( context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT); viewerOperation->setColorPredivide( context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE); diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.cpp b/source/blender/compositor/nodes/COM_ZCombineNode.cpp index 8f512769d63..25d9a6e97d2 100644 --- a/source/blender/compositor/nodes/COM_ZCombineNode.cpp +++ b/source/blender/compositor/nodes/COM_ZCombineNode.cpp @@ -30,7 +30,8 @@ #include "DNA_material_types.h" // the ramp types -void ZCombineNode::convertToOperations(ExecutionSystem* system, CompositorContext * context) { +void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +{ if (this->getOutputSocket(0)->isConnected()) { ZCombineOperation * operation = NULL; if (this->getbNode()->custom1) { diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.h b/source/blender/compositor/nodes/COM_ZCombineNode.h index 0faf7df8725..e9ce2f27469 100644 --- a/source/blender/compositor/nodes/COM_ZCombineNode.h +++ b/source/blender/compositor/nodes/COM_ZCombineNode.h @@ -31,7 +31,7 @@ */ class ZCombineNode: public Node { public: - ZCombineNode(bNode* editorNode) :Node(editorNode) {} + ZCombineNode(bNode *editorNode) :Node(editorNode) {} void convertToOperations(ExecutionSystem *graph, CompositorContext * context); }; diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp index 3e80de78223..c891142b808 100644 --- a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.cpp @@ -22,10 +22,12 @@ #include "COM_AlphaOverKeyOperation.h" -AlphaOverKeyOperation::AlphaOverKeyOperation(): MixBaseOperation() { +AlphaOverKeyOperation::AlphaOverKeyOperation(): MixBaseOperation() +{ } -void AlphaOverKeyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void AlphaOverKeyOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputOverColor[4]; float value[4]; @@ -34,25 +36,25 @@ void AlphaOverKeyOperation::executePixel(float* outputValue, float x, float y, P inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); - if (inputOverColor[3]<=0.0f) { + if (inputOverColor[3] <= 0.0f) { outputValue[0] = inputColor1[0]; outputValue[1] = inputColor1[1]; outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } - else if (value[0]==1.0f && inputOverColor[3]>=1.0f) { + else if (value[0] == 1.0f && inputOverColor[3] >= 1.0f) { outputValue[0] = inputOverColor[0]; outputValue[1] = inputOverColor[1]; outputValue[2] = inputOverColor[2]; outputValue[3] = inputOverColor[3]; } else { - float premul= value[0]*inputOverColor[3]; - float mul= 1.0f - premul; + float premul = value[0]*inputOverColor[3]; + float mul = 1.0f - premul; - outputValue[0]= (mul*inputColor1[0]) + premul*inputOverColor[0]; - outputValue[1]= (mul*inputColor1[1]) + premul*inputOverColor[1]; - outputValue[2]= (mul*inputColor1[2]) + premul*inputOverColor[2]; - outputValue[3]= (mul*inputColor1[3]) + value[0]*inputOverColor[3]; + outputValue[0] = (mul*inputColor1[0]) + premul*inputOverColor[0]; + outputValue[1] = (mul*inputColor1[1]) + premul*inputOverColor[1]; + outputValue[2] = (mul*inputColor1[2]) + premul*inputOverColor[2]; + outputValue[3] = (mul*inputColor1[3]) + value[0]*inputOverColor[3]; } } diff --git a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h index 5ed99d0dbc6..d3077a05706 100644 --- a/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h +++ b/source/blender/compositor/operations/COM_AlphaOverKeyOperation.h @@ -39,6 +39,6 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp index 48762e6370e..aedf6ec5e9e 100644 --- a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.cpp @@ -22,11 +22,13 @@ #include "COM_AlphaOverMixedOperation.h" -AlphaOverMixedOperation::AlphaOverMixedOperation(): MixBaseOperation() { +AlphaOverMixedOperation::AlphaOverMixedOperation(): MixBaseOperation() +{ this->x = 0.0f; } -void AlphaOverMixedOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void AlphaOverMixedOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputOverColor[4]; float value[4]; @@ -35,27 +37,27 @@ void AlphaOverMixedOperation::executePixel(float* outputValue, float x, float y, inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers); inputColor2Operation->read(inputOverColor, x, y, sampler, inputBuffers); - if (inputOverColor[3]<=0.0f) { + if (inputOverColor[3] <= 0.0f) { outputValue[0] = inputColor1[0]; outputValue[1] = inputColor1[1]; outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } - else if (value[0]==1.0f && inputOverColor[3]>=1.0f) { + else if (value[0] == 1.0f && inputOverColor[3] >= 1.0f) { outputValue[0] = inputOverColor[0]; outputValue[1] = inputOverColor[1]; outputValue[2] = inputOverColor[2]; outputValue[3] = inputOverColor[3]; } else { - float addfac= 1.0f - this->x + inputOverColor[3]*this->x; - float premul= value[0]*addfac; - float mul= 1.0f - value[0]*inputOverColor[3]; + float addfac = 1.0f - this->x + inputOverColor[3]*this->x; + float premul = value[0]*addfac; + float mul = 1.0f - value[0]*inputOverColor[3]; - outputValue[0]= (mul*inputColor1[0]) + premul*inputOverColor[0]; - outputValue[1]= (mul*inputColor1[1]) + premul*inputOverColor[1]; - outputValue[2]= (mul*inputColor1[2]) + premul*inputOverColor[2]; - outputValue[3]= (mul*inputColor1[3]) + value[0]*inputOverColor[3]; + outputValue[0] = (mul*inputColor1[0]) + premul*inputOverColor[0]; + outputValue[1] = (mul*inputColor1[1]) + premul*inputOverColor[1]; + outputValue[2] = (mul*inputColor1[2]) + premul*inputOverColor[2]; + outputValue[3] = (mul*inputColor1[3]) + value[0]*inputOverColor[3]; } } diff --git a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h index 3ee5f243303..92936a20b79 100644 --- a/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h +++ b/source/blender/compositor/operations/COM_AlphaOverMixedOperation.h @@ -41,7 +41,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void setX(float x) {this->x = x;} }; diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp index c46f3a04113..6cc33387917 100644 --- a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.cpp @@ -22,10 +22,12 @@ #include "COM_AlphaOverPremultiplyOperation.h" -AlphaOverPremultiplyOperation::AlphaOverPremultiplyOperation(): MixBaseOperation() { +AlphaOverPremultiplyOperation::AlphaOverPremultiplyOperation(): MixBaseOperation() +{ } -void AlphaOverPremultiplyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void AlphaOverPremultiplyOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputOverColor[4]; float value[4]; @@ -41,19 +43,19 @@ void AlphaOverPremultiplyOperation::executePixel(float* outputValue, float x, fl outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } - else if (value[0]==1.0f && inputOverColor[3]>=1.0f) { + else if (value[0] == 1.0f && inputOverColor[3] >= 1.0f) { outputValue[0] = inputOverColor[0]; outputValue[1] = inputOverColor[1]; outputValue[2] = inputOverColor[2]; outputValue[3] = inputOverColor[3]; } else { - float mul= 1.0f - value[0]*inputOverColor[3]; + float mul = 1.0f - value[0]*inputOverColor[3]; - outputValue[0]= (mul*inputColor1[0]) + value[0]*inputOverColor[0]; - outputValue[1]= (mul*inputColor1[1]) + value[0]*inputOverColor[1]; - outputValue[2]= (mul*inputColor1[2]) + value[0]*inputOverColor[2]; - outputValue[3]= (mul*inputColor1[3]) + value[0]*inputOverColor[3]; + outputValue[0] = (mul*inputColor1[0]) + value[0]*inputOverColor[0]; + outputValue[1] = (mul*inputColor1[1]) + value[0]*inputOverColor[1]; + outputValue[2] = (mul*inputColor1[2]) + value[0]*inputOverColor[2]; + outputValue[3] = (mul*inputColor1[3]) + value[0]*inputOverColor[3]; } } diff --git a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h index 4fc3b482942..2fe4422d03e 100644 --- a/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h +++ b/source/blender/compositor/operations/COM_AlphaOverPremultiplyOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_AntiAliasOperation.cpp b/source/blender/compositor/operations/COM_AntiAliasOperation.cpp index 3d8cd13229f..62639eeb24a 100644 --- a/source/blender/compositor/operations/COM_AntiAliasOperation.cpp +++ b/source/blender/compositor/operations/COM_AntiAliasOperation.cpp @@ -28,19 +28,22 @@ extern "C" { } -AntiAliasOperation::AntiAliasOperation(): NodeOperation() { +AntiAliasOperation::AntiAliasOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->valueReader = NULL; this->buffer = NULL; this->setComplex(true); } -void AntiAliasOperation::initExecution() { +void AntiAliasOperation::initExecution() +{ this->valueReader = this->getInputSocketReader(0); NodeOperation::initMutex(); } -void AntiAliasOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { +void AntiAliasOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data) +{ if (y < 0 || y >= this->height || x < 0 || x >= this->width) { color[0] = 0.0f; } @@ -51,7 +54,8 @@ void AntiAliasOperation::executePixel(float* color, int x, int y, MemoryBuffer * } -void AntiAliasOperation::deinitExecution() { +void AntiAliasOperation::deinitExecution() +{ this->valueReader = NULL; if (this->buffer) { delete buffer; @@ -59,13 +63,14 @@ void AntiAliasOperation::deinitExecution() { NodeOperation::deinitMutex(); } -bool AntiAliasOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool AntiAliasOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti imageInput; if (this->buffer) { return false; } else { - NodeOperation* operation = getInputOperation(0); + NodeOperation *operation = getInputOperation(0); imageInput.xmax = operation->getWidth(); imageInput.xmin = 0; imageInput.ymax = operation->getHeight(); @@ -77,16 +82,17 @@ bool AntiAliasOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe return false; } -void* AntiAliasOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *AntiAliasOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ if (this->buffer) {return buffer;} BLI_mutex_lock(getMutex()); if (this->buffer == NULL) { - MemoryBuffer* tile = (MemoryBuffer*)valueReader->initializeTileData(rect, memoryBuffers); + MemoryBuffer *tile = (MemoryBuffer*)valueReader->initializeTileData(rect, memoryBuffers); int size = tile->getHeight()*tile->getWidth(); float * input = tile->getBuffer(); - char* valuebuffer = new char[size]; + char *valuebuffer = new char[size]; for (int i = 0 ; i < size ; i ++) { - float in = input[i* COM_NUMBER_OF_CHANNELS]; + float in = input[i * COM_NUMBER_OF_CHANNELS]; if (in < 0.0f) { in = 0.0f;} if (in > 1.0f) {in = 1.0f;} valuebuffer[i] = in * 255; diff --git a/source/blender/compositor/operations/COM_AntiAliasOperation.h b/source/blender/compositor/operations/COM_AntiAliasOperation.h index 1b8b4c42ff9..fe160763828 100644 --- a/source/blender/compositor/operations/COM_AntiAliasOperation.h +++ b/source/blender/compositor/operations/COM_AntiAliasOperation.h @@ -43,14 +43,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * Deinitialize the execution diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp b/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp index 8d507a754d5..88fe17f633e 100644 --- a/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.cpp @@ -27,7 +27,8 @@ extern "C" { #include "RE_pipeline.h" } -BilateralBlurOperation::BilateralBlurOperation() : NodeOperation() { +BilateralBlurOperation::BilateralBlurOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); @@ -37,14 +38,16 @@ BilateralBlurOperation::BilateralBlurOperation() : NodeOperation() { this->inputDeterminatorProgram = NULL; } -void BilateralBlurOperation::initExecution() { +void BilateralBlurOperation::initExecution() +{ this->inputColorProgram = getInputSocketReader(0); this->inputDeterminatorProgram = getInputSocketReader(1); this->space = this->data->sigma_space + this->data->iter; QualityStepHelper::initExecution(COM_QH_INCREASE); } -void BilateralBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void BilateralBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ // read the determinator color at x, y, this will be used as the reference color for the determinator float determinatorReferenceColor[4]; float determinator[4]; @@ -98,12 +101,14 @@ void BilateralBlurOperation::executePixel(float* color, int x, int y, MemoryBuff } } -void BilateralBlurOperation::deinitExecution() { +void BilateralBlurOperation::deinitExecution() +{ this->inputColorProgram = NULL; this->inputDeterminatorProgram = NULL; } -bool BilateralBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool BilateralBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; int add = ceil(this->space)+1; diff --git a/source/blender/compositor/operations/COM_BilateralBlurOperation.h b/source/blender/compositor/operations/COM_BilateralBlurOperation.h index 295797fb0b8..8ec1ba8df99 100644 --- a/source/blender/compositor/operations/COM_BilateralBlurOperation.h +++ b/source/blender/compositor/operations/COM_BilateralBlurOperation.h @@ -27,9 +27,9 @@ class BilateralBlurOperation : public NodeOperation, public QualityStepHelper { private: - SocketReader* inputColorProgram; - SocketReader* inputDeterminatorProgram; - NodeBilateralBlurData* data; + SocketReader *inputColorProgram; + SocketReader *inputDeterminatorProgram; + NodeBilateralBlurData *data; float space; public: @@ -38,7 +38,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp index 60954503949..6e1a7e2a908 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.cpp @@ -27,7 +27,8 @@ extern "C" { #include "RE_pipeline.h" } -BlurBaseOperation::BlurBaseOperation(): NodeOperation() { +BlurBaseOperation::BlurBaseOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); @@ -37,24 +38,25 @@ BlurBaseOperation::BlurBaseOperation(): NodeOperation() { this->size = 1.0f; this->deleteData = false; } -void BlurBaseOperation::initExecution() { +void BlurBaseOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); this->inputSize = this->getInputSocketReader(1); - this->data->image_in_width= this->getWidth(); - this->data->image_in_height= this->getHeight(); + this->data->image_in_width = this->getWidth(); + this->data->image_in_height = this->getHeight(); if (this->data->relative) { switch (this->data->aspect) { case CMP_NODE_BLUR_ASPECT_NONE: - this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_width); - this->data->sizey= (int)(this->data->percenty*0.01f*this->data->image_in_height); + this->data->sizex = (int)(this->data->percentx*0.01f*this->data->image_in_width); + this->data->sizey = (int)(this->data->percenty*0.01f*this->data->image_in_height); break; case CMP_NODE_BLUR_ASPECT_Y: - this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_width); - this->data->sizey= (int)(this->data->percenty*0.01f*this->data->image_in_width); + this->data->sizex = (int)(this->data->percentx*0.01f*this->data->image_in_width); + this->data->sizey = (int)(this->data->percenty*0.01f*this->data->image_in_width); break; case CMP_NODE_BLUR_ASPECT_X: - this->data->sizex= (int)(this->data->percentx*0.01f*this->data->image_in_height); - this->data->sizey= (int)(this->data->percenty*0.01f*this->data->image_in_height); + this->data->sizex = (int)(this->data->percentx*0.01f*this->data->image_in_height); + this->data->sizey = (int)(this->data->percenty*0.01f*this->data->image_in_height); break; } } @@ -63,7 +65,7 @@ void BlurBaseOperation::initExecution() { } -float* BlurBaseOperation::make_gausstab(int rad) +float *BlurBaseOperation::make_gausstab(int rad) { float *gausstab, sum, val; int i, n; @@ -74,19 +76,20 @@ float* BlurBaseOperation::make_gausstab(int rad) sum = 0.0f; for (i = -rad; i <= rad; i++) { - val= RE_filter_value(this->data->filtertype, (float)i/(float)rad); + val = RE_filter_value(this->data->filtertype, (float)i/(float)rad); sum += val; gausstab[i+rad] = val; } - sum= 1.0f/sum; + sum = 1.0f/sum; for (i=0; iinputProgram = NULL; this->inputSize = NULL; if (this->deleteData) { @@ -95,7 +98,8 @@ void BlurBaseOperation::deinitExecution() { this->data = NULL; } -void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers) { +void BlurBaseOperation::updateSize(MemoryBuffer **memoryBuffers) +{ float result[4]; this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, memoryBuffers); this->size = result[0]; diff --git a/source/blender/compositor/operations/COM_BlurBaseOperation.h b/source/blender/compositor/operations/COM_BlurBaseOperation.h index 3eb36f29865..13e7eb52b77 100644 --- a/source/blender/compositor/operations/COM_BlurBaseOperation.h +++ b/source/blender/compositor/operations/COM_BlurBaseOperation.h @@ -32,11 +32,11 @@ protected: /** * Cached reference to the inputProgram */ - SocketReader* inputProgram; - SocketReader* inputSize; + SocketReader *inputProgram; + SocketReader *inputSize; NodeBlurData * data; BlurBaseOperation(); - float* make_gausstab(int rad); + float *make_gausstab(int rad); float size; bool deleteData; void updateSize(MemoryBuffer **memoryBuffers); @@ -51,7 +51,7 @@ public: */ void deinitExecution(); - void setData(NodeBlurData* data) {this->data= data;} + void setData(NodeBlurData *data) {this->data = data;} void deleteDataWhenFinished() {this->deleteData = true;} }; diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.cpp b/source/blender/compositor/operations/COM_BokehBlurOperation.cpp index 1d5f4852340..1050fc57194 100644 --- a/source/blender/compositor/operations/COM_BokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.cpp @@ -27,7 +27,8 @@ extern "C" { #include "RE_pipeline.h" } -BokehBlurOperation::BokehBlurOperation() : NodeOperation() { +BokehBlurOperation::BokehBlurOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->addInputSocket(COM_DT_VALUE); @@ -41,12 +42,14 @@ BokehBlurOperation::BokehBlurOperation() : NodeOperation() { this->inputBoundingBoxReader = NULL; } -void* BokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { - void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); +void *BokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ + void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); return buffer; } -void BokehBlurOperation::initExecution() { +void BokehBlurOperation::initExecution() +{ this->inputProgram = getInputSocketReader(0); this->inputBokehProgram = getInputSocketReader(1); this->inputBoundingBoxReader = getInputSocketReader(2); @@ -67,7 +70,8 @@ void BokehBlurOperation::initExecution() { QualityStepHelper::initExecution(COM_QH_INCREASE); } -void BokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void BokehBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float tempColor[4]; float tempBoundingBox[4]; float bokeh[4]; @@ -81,8 +85,8 @@ void BokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer * float overallmultiplyerr = 0; float overallmultiplyerg = 0; float overallmultiplyerb = 0; - MemoryBuffer* inputBuffer = (MemoryBuffer*)data; - float* buffer = inputBuffer->getBuffer(); + MemoryBuffer *inputBuffer = (MemoryBuffer*)data; + float *buffer = inputBuffer->getBuffer(); int bufferwidth = inputBuffer->getWidth(); int bufferstartx = inputBuffer->getRect()->xmin; int bufferstarty = inputBuffer->getRect()->ymin; @@ -126,13 +130,15 @@ void BokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer * } } -void BokehBlurOperation::deinitExecution() { +void BokehBlurOperation::deinitExecution() +{ this->inputProgram = NULL; this->inputBokehProgram = NULL; this->inputBoundingBoxReader = NULL; } -bool BokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool BokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; rcti bokehInput; @@ -141,7 +147,7 @@ bool BokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe newInput.ymax = input->ymax + (size*this->getWidth()); newInput.ymin = input->ymin - (size*this->getWidth()); - NodeOperation* operation = getInputOperation(1); + NodeOperation *operation = getInputOperation(1); bokehInput.xmax = operation->getWidth(); bokehInput.xmin = 0; bokehInput.ymax = operation->getHeight(); diff --git a/source/blender/compositor/operations/COM_BokehBlurOperation.h b/source/blender/compositor/operations/COM_BokehBlurOperation.h index c782c421966..ce14faa8596 100644 --- a/source/blender/compositor/operations/COM_BokehBlurOperation.h +++ b/source/blender/compositor/operations/COM_BokehBlurOperation.h @@ -27,9 +27,9 @@ class BokehBlurOperation : public NodeOperation, public QualityStepHelper { private: - SocketReader* inputProgram; - SocketReader* inputBokehProgram; - SocketReader* inputBoundingBoxReader; + SocketReader *inputProgram; + SocketReader *inputBokehProgram; + SocketReader *inputBoundingBoxReader; float size; float bokehMidX; float bokehMidY; @@ -37,11 +37,11 @@ private: public: BokehBlurOperation(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cpp b/source/blender/compositor/operations/COM_BokehImageOperation.cpp index 22b73417778..4bc738052f6 100644 --- a/source/blender/compositor/operations/COM_BokehImageOperation.cpp +++ b/source/blender/compositor/operations/COM_BokehImageOperation.cpp @@ -23,11 +23,13 @@ #include "COM_BokehImageOperation.h" #include "BLI_math.h" -BokehImageOperation::BokehImageOperation(): NodeOperation() { +BokehImageOperation::BokehImageOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_COLOR); this->deleteData = false; } -void BokehImageOperation::initExecution() { +void BokehImageOperation::initExecution() +{ this->centerX = getWidth() / 2; this->centerY = getHeight() / 2; this->center[0] = this->centerX; @@ -40,11 +42,13 @@ void BokehImageOperation::initExecution() { this->flapRadAdd-=M_PI*2; } } -void BokehImageOperation::detemineStartPointOfFlap(float r[2], int flapNumber, float distance) { +void BokehImageOperation::detemineStartPointOfFlap(float r[2], int flapNumber, float distance) +{ r[0] = sin(flapRad*flapNumber + flapRadAdd)*distance+centerX; r[1] = cos(flapRad*flapNumber + flapRadAdd)*distance+centerY; } -float BokehImageOperation::isInsideBokeh(float distance, float x, float y) { +float BokehImageOperation::isInsideBokeh(float distance, float x, float y) +{ float insideBokeh = 0.0; const float deltaX = x - centerX; const float deltaY = y - centerY; @@ -80,7 +84,8 @@ float BokehImageOperation::isInsideBokeh(float distance, float x, float y) { } return insideBokeh; } -void BokehImageOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void BokehImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float shift = this->data->lensshift; float shift2 = shift/2.0f; float distance = this->circularDistance; @@ -100,7 +105,8 @@ void BokehImageOperation::executePixel(float* color, float x, float y, PixelSamp color[3] = 1.0f; } -void BokehImageOperation::deinitExecution() { +void BokehImageOperation::deinitExecution() +{ if (deleteData) { if (data) { delete data; @@ -109,7 +115,8 @@ void BokehImageOperation::deinitExecution() { } } -void BokehImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void BokehImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ resolution[0] = 512; resolution[1] = 512; } diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h index 3089ca6f12e..516cc1da4f0 100644 --- a/source/blender/compositor/operations/COM_BokehImageOperation.h +++ b/source/blender/compositor/operations/COM_BokehImageOperation.h @@ -47,7 +47,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.cpp b/source/blender/compositor/operations/COM_BoxMaskOperation.cpp index 5b769fef3ef..0244be4cad3 100644 --- a/source/blender/compositor/operations/COM_BoxMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.cpp @@ -24,7 +24,8 @@ #include "BLI_math.h" #include "DNA_node_types.h" -BoxMaskOperation::BoxMaskOperation(): NodeOperation() { +BoxMaskOperation::BoxMaskOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); @@ -33,7 +34,8 @@ BoxMaskOperation::BoxMaskOperation(): NodeOperation() { this->cosine = 0.0f; this->sine = 0.0f; } -void BoxMaskOperation::initExecution() { +void BoxMaskOperation::initExecution() +{ this->inputMask = this->getInputSocketReader(0); this->inputValue = this->getInputSocketReader(1); const double rad = DEG2RAD(this->data->rotation); @@ -42,7 +44,8 @@ void BoxMaskOperation::initExecution() { this->aspectRatio = ((float)this->getWidth())/this->getHeight(); } -void BoxMaskOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void BoxMaskOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputMask[4]; float inputValue[4]; @@ -108,7 +111,8 @@ void BoxMaskOperation::executePixel(float* color, float x, float y, PixelSampler } -void BoxMaskOperation::deinitExecution() { +void BoxMaskOperation::deinitExecution() +{ this->inputMask = NULL; this->inputValue = NULL; } diff --git a/source/blender/compositor/operations/COM_BoxMaskOperation.h b/source/blender/compositor/operations/COM_BoxMaskOperation.h index 3436eec8b4c..c3af95578d4 100644 --- a/source/blender/compositor/operations/COM_BoxMaskOperation.h +++ b/source/blender/compositor/operations/COM_BoxMaskOperation.h @@ -45,7 +45,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.cpp b/source/blender/compositor/operations/COM_BrightnessOperation.cpp index a62470e5b1d..a4396a43cf7 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.cpp +++ b/source/blender/compositor/operations/COM_BrightnessOperation.cpp @@ -22,20 +22,23 @@ #include "COM_BrightnessOperation.h" -BrightnessOperation::BrightnessOperation(): NodeOperation() { +BrightnessOperation::BrightnessOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; } -void BrightnessOperation::initExecution() { +void BrightnessOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); this->inputBrightnessProgram = this->getInputSocketReader(1); this->inputContrastProgram = this->getInputSocketReader(2); } -void BrightnessOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void BrightnessOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; float a, b; float inputBrightness[4]; @@ -68,7 +71,8 @@ void BrightnessOperation::executePixel(float* color, float x, float y, PixelSamp color[3] = inputValue[3]; } -void BrightnessOperation::deinitExecution() { +void BrightnessOperation::deinitExecution() +{ this->inputProgram = NULL; this->inputBrightnessProgram = NULL; this->inputContrastProgram = NULL; diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.h b/source/blender/compositor/operations/COM_BrightnessOperation.h index 60666098bc1..0c718a8b131 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.h +++ b/source/blender/compositor/operations/COM_BrightnessOperation.h @@ -30,9 +30,9 @@ private: /** * Cached reference to the inputProgram */ - SocketReader * inputProgram; - SocketReader * inputBrightnessProgram; - SocketReader* inputContrastProgram; + SocketReader *inputProgram; + SocketReader *inputBrightnessProgram; + SocketReader *inputContrastProgram; public: BrightnessOperation(); @@ -40,7 +40,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp index 7a1fc5e511c..a3438cea27b 100644 --- a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp @@ -26,7 +26,8 @@ -CalculateMeanOperation::CalculateMeanOperation(): NodeOperation() { +CalculateMeanOperation::CalculateMeanOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->addOutputSocket(COM_DT_VALUE); this->imageReader = NULL; @@ -34,27 +35,31 @@ CalculateMeanOperation::CalculateMeanOperation(): NodeOperation() { this->setting = 1; this->setComplex(true); } -void CalculateMeanOperation::initExecution() { +void CalculateMeanOperation::initExecution() +{ this->imageReader = this->getInputSocketReader(0); this->iscalculated = false; NodeOperation::initMutex(); } -void CalculateMeanOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { +void CalculateMeanOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data) +{ color[0] = this->result; } -void CalculateMeanOperation::deinitExecution() { +void CalculateMeanOperation::deinitExecution() +{ this->imageReader = NULL; NodeOperation::deinitMutex(); } -bool CalculateMeanOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool CalculateMeanOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti imageInput; if (iscalculated) { return false; } - NodeOperation* operation = getInputOperation(0); + NodeOperation *operation = getInputOperation(0); imageInput.xmax = operation->getWidth(); imageInput.xmin = 0; imageInput.ymax = operation->getHeight(); @@ -65,10 +70,11 @@ bool CalculateMeanOperation::determineDependingAreaOfInterest(rcti *input, ReadB return false; } -void* CalculateMeanOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *CalculateMeanOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ BLI_mutex_lock(getMutex()); if (!this->iscalculated) { - MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + MemoryBuffer *tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); calculateMean(tile); this->iscalculated = true; } @@ -76,9 +82,10 @@ void* CalculateMeanOperation::initializeTileData(rcti *rect, MemoryBuffer **memo return NULL; } -void CalculateMeanOperation::calculateMean(MemoryBuffer * tile) { +void CalculateMeanOperation::calculateMean(MemoryBuffer * tile) +{ this->result = 0.0f; - float* buffer = tile->getBuffer(); + float *buffer = tile->getBuffer(); int size = tile->getWidth()*tile->getHeight(); int pixels = 0; float sum; diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.h b/source/blender/compositor/operations/COM_CalculateMeanOperation.h index e77b864c5c8..b21743aa8bc 100644 --- a/source/blender/compositor/operations/COM_CalculateMeanOperation.h +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.h @@ -46,14 +46,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * Deinitialize the execution @@ -64,6 +64,6 @@ public: void setSetting(int setting) {this->setting = setting;} protected: - void calculateMean(MemoryBuffer* tile); + void calculateMean(MemoryBuffer *tile); }; #endif diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp index 9d9dc46eb6c..651c6674fdb 100644 --- a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.cpp @@ -26,20 +26,23 @@ -CalculateStandardDeviationOperation::CalculateStandardDeviationOperation(): CalculateMeanOperation() { +CalculateStandardDeviationOperation::CalculateStandardDeviationOperation(): CalculateMeanOperation() +{ } -void CalculateStandardDeviationOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { +void CalculateStandardDeviationOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data) +{ color[0] = this->standardDeviation; } -void* CalculateStandardDeviationOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *CalculateStandardDeviationOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ BLI_mutex_lock(getMutex()); if (!this->iscalculated) { - MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + MemoryBuffer *tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); CalculateMeanOperation::calculateMean(tile); this->standardDeviation = 0.0f; - float* buffer = tile->getBuffer(); + float *buffer = tile->getBuffer(); int size = tile->getWidth()*tile->getHeight(); int pixels = 0; float sum; diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h index 9da8823acd1..05c94401c86 100644 --- a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h +++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h @@ -39,9 +39,9 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); }; #endif diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp b/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp index da59524586c..9b7f87e38bc 100644 --- a/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.cpp @@ -22,21 +22,25 @@ #include "COM_ChangeHSVOperation.h" -ChangeHSVOperation::ChangeHSVOperation(): NodeOperation() { +ChangeHSVOperation::ChangeHSVOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ChangeHSVOperation::initExecution() { +void ChangeHSVOperation::initExecution() +{ this->inputOperation = getInputSocketReader(0); } -void ChangeHSVOperation::deinitExecution() { +void ChangeHSVOperation::deinitExecution() +{ this->inputOperation = NULL; } -void ChangeHSVOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ChangeHSVOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; inputOperation->read(inputColor1, x, y, sampler, inputBuffers); diff --git a/source/blender/compositor/operations/COM_ChangeHSVOperation.h b/source/blender/compositor/operations/COM_ChangeHSVOperation.h index 8adae8e8ce7..a89487f9d7b 100644 --- a/source/blender/compositor/operations/COM_ChangeHSVOperation.h +++ b/source/blender/compositor/operations/COM_ChangeHSVOperation.h @@ -49,7 +49,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void setHue(float hue) {this->hue = hue;} void setSaturation(float saturation) {this->saturation = saturation;} diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp b/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp index 10ff140f8be..70bfc8f8cfa 100644 --- a/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.cpp @@ -22,14 +22,16 @@ #include "COM_ChannelMatteOperation.h" #include "BLI_math.h" -ChannelMatteOperation::ChannelMatteOperation(): NodeOperation() { +ChannelMatteOperation::ChannelMatteOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addOutputSocket(COM_DT_VALUE); inputImageProgram = NULL; } -void ChannelMatteOperation::initExecution() { +void ChannelMatteOperation::initExecution() +{ this->inputImageProgram = this->getInputSocketReader(0); this->limit_range = this->limit_max - this->limit_min; @@ -76,11 +78,13 @@ void ChannelMatteOperation::initExecution() { } } -void ChannelMatteOperation::deinitExecution() { - this->inputImageProgram= NULL; +void ChannelMatteOperation::deinitExecution() +{ + this->inputImageProgram = NULL; } -void ChannelMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ChannelMatteOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inColor[4]; float alpha; diff --git a/source/blender/compositor/operations/COM_ChannelMatteOperation.h b/source/blender/compositor/operations/COM_ChannelMatteOperation.h index 33e502fe565..a4b5f454f92 100644 --- a/source/blender/compositor/operations/COM_ChannelMatteOperation.h +++ b/source/blender/compositor/operations/COM_ChannelMatteOperation.h @@ -59,12 +59,12 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeChroma* nodeChroma, const int custom2) + void setSettings(NodeChroma *nodeChroma, const int custom2) { this->limit_max = nodeChroma->t1; this->limit_min = nodeChroma->t2; diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp index 9556b673c0f..e082ffed2b6 100644 --- a/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.cpp @@ -22,7 +22,8 @@ #include "COM_ChromaMatteOperation.h" #include "BLI_math.h" -ChromaMatteOperation::ChromaMatteOperation(): NodeOperation() { +ChromaMatteOperation::ChromaMatteOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addInputSocket(COM_DT_COLOR); addOutputSocket(COM_DT_VALUE); @@ -31,17 +32,20 @@ ChromaMatteOperation::ChromaMatteOperation(): NodeOperation() { inputKeyProgram = NULL; } -void ChromaMatteOperation::initExecution() { +void ChromaMatteOperation::initExecution() +{ this->inputImageProgram = this->getInputSocketReader(0); this->inputKeyProgram = this->getInputSocketReader(1); } -void ChromaMatteOperation::deinitExecution() { - this->inputImageProgram= NULL; - this->inputKeyProgram= NULL; +void ChromaMatteOperation::deinitExecution() +{ + this->inputImageProgram = NULL; + this->inputKeyProgram = NULL; } -void ChromaMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ChromaMatteOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inKey[4]; float inImage[4]; @@ -70,7 +74,7 @@ void ChromaMatteOperation::executePixel(float* outputValue, float x, float y, Pi /*if within the acceptance angle */ /* if kfg is <0 then the pixel is outside of the key color */ - kfg= x_angle-(fabsf(z_angle)/tanf(acceptance/2.f)); + kfg = x_angle-(fabsf(z_angle)/tanf(acceptance/2.f)); if (kfg>0.f) { /* found a pixel that is within key color */ alpha=(1.f-kfg)*(gain); diff --git a/source/blender/compositor/operations/COM_ChromaMatteOperation.h b/source/blender/compositor/operations/COM_ChromaMatteOperation.h index 21f0f4b4fe6..9c5a5ff997b 100644 --- a/source/blender/compositor/operations/COM_ChromaMatteOperation.h +++ b/source/blender/compositor/operations/COM_ChromaMatteOperation.h @@ -42,11 +42,11 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} + void setSettings(NodeChroma *nodeChroma) {this->settings = nodeChroma;} }; #endif diff --git a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp index 317d84b0299..cc535cd95df 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.cpp @@ -33,7 +33,8 @@ inline float colorbalance_cdl(float in, float offset, float power, float slope) return powf(x, power); } -ColorBalanceASCCDLOperation::ColorBalanceASCCDLOperation(): NodeOperation() { +ColorBalanceASCCDLOperation::ColorBalanceASCCDLOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); @@ -42,12 +43,14 @@ ColorBalanceASCCDLOperation::ColorBalanceASCCDLOperation(): NodeOperation() { this->setResolutionInputSocketIndex(1); } -void ColorBalanceASCCDLOperation::initExecution() { +void ColorBalanceASCCDLOperation::initExecution() +{ this->inputValueOperation = this->getInputSocketReader(0); this->inputColorOperation = this->getInputSocketReader(1); } -void ColorBalanceASCCDLOperation::executePixel(float* outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorBalanceASCCDLOperation::executePixel(float *outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; float value[4]; @@ -56,7 +59,7 @@ void ColorBalanceASCCDLOperation::executePixel(float* outputColor, float x, floa float fac = value[0]; fac = min(1.0f, fac); - const float mfac= 1.0f - fac; + const float mfac = 1.0f - fac; outputColor[0] = mfac*inputColor[0] + fac * colorbalance_cdl(inputColor[0], this->lift[0], this->gamma[0], this->gain[0]); outputColor[1] = mfac*inputColor[1] + fac * colorbalance_cdl(inputColor[1], this->lift[1], this->gamma[1], this->gain[1]); @@ -65,7 +68,8 @@ void ColorBalanceASCCDLOperation::executePixel(float* outputColor, float x, floa } -void ColorBalanceASCCDLOperation::deinitExecution() { +void ColorBalanceASCCDLOperation::deinitExecution() +{ this->inputValueOperation = NULL; this->inputColorOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h index a7e9680c98d..fb973e75c15 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h +++ b/source/blender/compositor/operations/COM_ColorBalanceASCCDLOperation.h @@ -50,7 +50,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp index b853c28136f..82958a7086e 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.cpp @@ -30,7 +30,7 @@ inline float colorbalance_lgg(float in, float lift_lgg, float gamma_inv, float g * but best keep it this way, sice testing for durian shows a similar calculation * without lin/srgb conversions gives bad results (over-saturated shadows) with colors * slightly below 1.0. some correction can be done but it ends up looking bad for shadows or lighter tones - campbell */ - float x= (((linearrgb_to_srgb(in) - 1.0f) * lift_lgg) + 1.0f) * gain; + float x = (((linearrgb_to_srgb(in) - 1.0f) * lift_lgg) + 1.0f) * gain; /* prevent NaN */ if (x < 0.f) x = 0.f; @@ -38,7 +38,8 @@ inline float colorbalance_lgg(float in, float lift_lgg, float gamma_inv, float g return powf(srgb_to_linearrgb(x), gamma_inv); } -ColorBalanceLGGOperation::ColorBalanceLGGOperation(): NodeOperation() { +ColorBalanceLGGOperation::ColorBalanceLGGOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); @@ -47,12 +48,14 @@ ColorBalanceLGGOperation::ColorBalanceLGGOperation(): NodeOperation() { this->setResolutionInputSocketIndex(1); } -void ColorBalanceLGGOperation::initExecution() { +void ColorBalanceLGGOperation::initExecution() +{ this->inputValueOperation = this->getInputSocketReader(0); this->inputColorOperation = this->getInputSocketReader(1); } -void ColorBalanceLGGOperation::executePixel(float* outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorBalanceLGGOperation::executePixel(float *outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; float value[4]; @@ -61,7 +64,7 @@ void ColorBalanceLGGOperation::executePixel(float* outputColor, float x, float y float fac = value[0]; fac = min(1.0f, fac); - const float mfac= 1.0f - fac; + const float mfac = 1.0f - fac; outputColor[0] = mfac*inputColor[0] + fac * colorbalance_lgg(inputColor[0], this->lift[0], this->gamma_inv[0], this->gain[0]); outputColor[1] = mfac*inputColor[1] + fac * colorbalance_lgg(inputColor[1], this->lift[1], this->gamma_inv[1], this->gain[1]); @@ -70,7 +73,8 @@ void ColorBalanceLGGOperation::executePixel(float* outputColor, float x, float y } -void ColorBalanceLGGOperation::deinitExecution() { +void ColorBalanceLGGOperation::deinitExecution() +{ this->inputValueOperation = NULL; this->inputColorOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h index ebaabfeb736..e0df76cf2c5 100644 --- a/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h +++ b/source/blender/compositor/operations/COM_ColorBalanceLGGOperation.h @@ -50,7 +50,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp index fb617549b1c..0a257b22ab8 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp @@ -23,7 +23,8 @@ #include "COM_ColorCorrectionOperation.h" #include "BLI_math.h" -ColorCorrectionOperation::ColorCorrectionOperation(): NodeOperation() { +ColorCorrectionOperation::ColorCorrectionOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); @@ -33,19 +34,21 @@ ColorCorrectionOperation::ColorCorrectionOperation(): NodeOperation() { this->greenChannelEnabled = true; this->blueChannelEnabled = true; } -void ColorCorrectionOperation::initExecution() { +void ColorCorrectionOperation::initExecution() +{ this->inputImage = this->getInputSocketReader(0); this->inputMask = this->getInputSocketReader(1); } -void ColorCorrectionOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorCorrectionOperation::executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputImageColor[4]; float inputMask[4]; this->inputImage->read(inputImageColor, x, y, sampler, inputBuffers); this->inputMask->read(inputMask, x, y, sampler, inputBuffers); float level = (inputImageColor[0] + inputImageColor[1] + inputImageColor[2])/3.0f; - float contrast= this->data->master.contrast; + float contrast = this->data->master.contrast; float saturation = this->data->master.saturation; float gamma = this->data->master.gamma; float gain = this->data->master.gain; @@ -54,7 +57,7 @@ void ColorCorrectionOperation::executePixel(float* output, float x, float y, Pix float value = inputMask[0]; value = min(1.0f, value); - const float mvalue= 1.0f - value; + const float mvalue = 1.0f - value; float levelShadows = 0.0; float levelMidtones = 0.0; @@ -66,14 +69,14 @@ void ColorCorrectionOperation::executePixel(float* output, float x, float y, Pix } else if (level < this->data->startmidtones+MARGIN) { levelMidtones = ((level-this->data->startmidtones)*MARGIN_DIV)+0.5; - levelShadows = 1.0- levelMidtones; + levelShadows = 1.0 - levelMidtones; } else if (level < this->data->endmidtones-MARGIN) { levelMidtones = 1.0f; } else if (level < this->data->endmidtones+MARGIN) { levelHighlights = ((level-this->data->endmidtones)*MARGIN_DIV)+0.5; - levelMidtones = 1.0- levelHighlights; + levelMidtones = 1.0 - levelHighlights; } else { levelHighlights = 1.0f; @@ -134,7 +137,8 @@ void ColorCorrectionOperation::executePixel(float* output, float x, float y, Pix output[3] = inputImageColor[3]; } -void ColorCorrectionOperation::deinitExecution() { +void ColorCorrectionOperation::deinitExecution() +{ this->inputImage = NULL; this->inputMask = NULL; } diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.h b/source/blender/compositor/operations/COM_ColorCorrectionOperation.h index 9a3eefe30c6..89107150ebd 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.h +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.h @@ -30,8 +30,8 @@ private: /** * Cached reference to the inputProgram */ - SocketReader * inputImage; - SocketReader* inputMask; + SocketReader *inputImage; + SocketReader *inputMask; NodeColorCorrection *data; bool redChannelEnabled; @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.cpp b/source/blender/compositor/operations/COM_ColorCurveOperation.cpp index 375d7269124..8aee54013b1 100644 --- a/source/blender/compositor/operations/COM_ColorCurveOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.cpp @@ -30,7 +30,8 @@ extern "C" { } #endif -ColorCurveOperation::ColorCurveOperation(): CurveBaseOperation() { +ColorCurveOperation::ColorCurveOperation(): CurveBaseOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR); @@ -44,7 +45,8 @@ ColorCurveOperation::ColorCurveOperation(): CurveBaseOperation() { this->setResolutionInputSocketIndex(1); } -void ColorCurveOperation::initExecution() { +void ColorCurveOperation::initExecution() +{ CurveBaseOperation::initExecution(); this->inputFacProgram = this->getInputSocketReader(0); this->inputImageProgram = this->getInputSocketReader(1); @@ -55,7 +57,8 @@ void ColorCurveOperation::initExecution() { } -void ColorCurveOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorCurveOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float black[4]; float white[4]; float fac[4]; @@ -69,24 +72,25 @@ void ColorCurveOperation::executePixel(float* color, float x, float y, PixelSamp this->inputFacProgram->read(fac, x, y, sampler, inputBuffers); this->inputImageProgram->read(image, x, y, sampler, inputBuffers); - if (fac[0]>=1.0) + if (fac[0] >= 1.0) curvemapping_evaluate_premulRGBF(this->curveMapping, color, image); else if (*fac<=0.0) { - color[0]= image[0]; - color[1]= image[1]; - color[2]= image[2]; + color[0] = image[0]; + color[1] = image[1]; + color[2] = image[2]; } else { - float col[4], mfac= 1.0f-*fac; + float col[4], mfac = 1.0f-*fac; curvemapping_evaluate_premulRGBF(this->curveMapping, col, image); - color[0]= mfac*image[0] + *fac*col[0]; - color[1]= mfac*image[1] + *fac*col[1]; - color[2]= mfac*image[2] + *fac*col[2]; + color[0] = mfac*image[0] + *fac*col[0]; + color[1] = mfac*image[1] + *fac*col[1]; + color[2] = mfac*image[2] + *fac*col[2]; } - color[3]= image[3]; + color[3] = image[3]; } -void ColorCurveOperation::deinitExecution() { +void ColorCurveOperation::deinitExecution() +{ this->inputFacProgram = NULL; this->inputImageProgram = NULL; this->inputBlackProgram = NULL; diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.h b/source/blender/compositor/operations/COM_ColorCurveOperation.h index 986f6fcfcc2..15f9fd25e81 100644 --- a/source/blender/compositor/operations/COM_ColorCurveOperation.h +++ b/source/blender/compositor/operations/COM_ColorCurveOperation.h @@ -41,7 +41,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.cpp b/source/blender/compositor/operations/COM_ColorMatteOperation.cpp index 6e9c1b0d48a..7706559be00 100644 --- a/source/blender/compositor/operations/COM_ColorMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.cpp @@ -22,7 +22,8 @@ #include "COM_ColorMatteOperation.h" #include "BLI_math.h" -ColorMatteOperation::ColorMatteOperation(): NodeOperation() { +ColorMatteOperation::ColorMatteOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addInputSocket(COM_DT_COLOR); addOutputSocket(COM_DT_VALUE); @@ -31,23 +32,26 @@ ColorMatteOperation::ColorMatteOperation(): NodeOperation() { inputKeyProgram = NULL; } -void ColorMatteOperation::initExecution() { +void ColorMatteOperation::initExecution() +{ this->inputImageProgram = this->getInputSocketReader(0); this->inputKeyProgram = this->getInputSocketReader(1); } -void ColorMatteOperation::deinitExecution() { - this->inputImageProgram= NULL; - this->inputKeyProgram= NULL; +void ColorMatteOperation::deinitExecution() +{ + this->inputImageProgram = NULL; + this->inputKeyProgram = NULL; } -void ColorMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorMatteOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inColor[4]; float inKey[4]; - const float hue=this->settings->t1; - const float sat=this->settings->t2; - const float val=this->settings->t3; + const float hue = this->settings->t1; + const float sat = this->settings->t2; + const float val = this->settings->t3; float h_wrap; @@ -62,19 +66,19 @@ void ColorMatteOperation::executePixel(float* outputValue, float x, float y, Pix if ( /* do hue last because it needs to wrap, and does some more checks */ - /* sat */ (fabsf(inColor[1]-inKey[1]) < sat) && - /* val */ (fabsf(inColor[2]-inKey[2]) < val) && + /* sat */ (fabsf(inColor[1] - inKey[1]) < sat) && + /* val */ (fabsf(inColor[2] - inKey[2]) < val) && /* multiply by 2 because it wraps on both sides of the hue, * otherwise 0.5 would key all hue's */ - /* hue */ ((h_wrap= 2.f * fabsf(inColor[0]-inKey[0])) < hue || (2.f - h_wrap) < hue) + /* hue */ ((h_wrap = 2.f * fabsf(inColor[0]-inKey[0])) < hue || (2.f - h_wrap) < hue) ) { - outputValue[0]=0.f; /*make transparent*/ + outputValue[0] = 0.0f; /*make transparent*/ } else { /*pixel is outside key color */ - outputValue[0]=inColor[3]; /* make pixel just as transparent as it was before */ + outputValue[0] = inColor[3]; /* make pixel just as transparent as it was before */ } } diff --git a/source/blender/compositor/operations/COM_ColorMatteOperation.h b/source/blender/compositor/operations/COM_ColorMatteOperation.h index 954a5bbb3e8..904a51128c8 100644 --- a/source/blender/compositor/operations/COM_ColorMatteOperation.h +++ b/source/blender/compositor/operations/COM_ColorMatteOperation.h @@ -42,11 +42,11 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} + void setSettings(NodeChroma *nodeChroma) {this->settings = nodeChroma;} }; #endif diff --git a/source/blender/compositor/operations/COM_ColorRampOperation.cpp b/source/blender/compositor/operations/COM_ColorRampOperation.cpp index a7cfb30b439..992bf3b9d1d 100644 --- a/source/blender/compositor/operations/COM_ColorRampOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorRampOperation.cpp @@ -30,24 +30,28 @@ extern "C" { } #endif -ColorRampOperation::ColorRampOperation(): NodeOperation() { +ColorRampOperation::ColorRampOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; this->colorBand = NULL; } -void ColorRampOperation::initExecution() { +void ColorRampOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void ColorRampOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorRampOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float values[4]; this->inputProgram->read(values, x, y, sampler, inputBuffers); do_colorband(this->colorBand, values[0], color); } -void ColorRampOperation::deinitExecution() { +void ColorRampOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_ColorRampOperation.h b/source/blender/compositor/operations/COM_ColorRampOperation.h index 08a6c26a8bf..8b8635cc5cd 100644 --- a/source/blender/compositor/operations/COM_ColorRampOperation.h +++ b/source/blender/compositor/operations/COM_ColorRampOperation.h @@ -31,14 +31,14 @@ private: * Cached reference to the inputProgram */ SocketReader * inputProgram; - ColorBand* colorBand; + ColorBand *colorBand; public: ColorRampOperation(); /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution @@ -50,7 +50,7 @@ public: */ void deinitExecution(); - void setColorBand(ColorBand* colorBand) {this->colorBand = colorBand;} + void setColorBand(ColorBand *colorBand) {this->colorBand = colorBand;} }; diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.cpp b/source/blender/compositor/operations/COM_ColorSpillOperation.cpp index 56f45c0fdeb..56141efe681 100644 --- a/source/blender/compositor/operations/COM_ColorSpillOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.cpp @@ -24,7 +24,8 @@ #include "BLI_math.h" #define avg(a,b) ((a+b)/2) -ColorSpillOperation::ColorSpillOperation(): NodeOperation() { +ColorSpillOperation::ColorSpillOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addInputSocket(COM_DT_VALUE); addOutputSocket(COM_DT_COLOR); @@ -34,7 +35,8 @@ ColorSpillOperation::ColorSpillOperation(): NodeOperation() { this->spillChannel = 1; // GREEN } -void ColorSpillOperation::initExecution() { +void ColorSpillOperation::initExecution() +{ this->inputImageReader = this->getInputSocketReader(0); this->inputFacReader = this->getInputSocketReader(1); if (spillChannel == 0) { @@ -76,12 +78,14 @@ void ColorSpillOperation::initExecution() { } } -void ColorSpillOperation::deinitExecution() { - this->inputImageReader= NULL; +void ColorSpillOperation::deinitExecution() +{ + this->inputImageReader = NULL; this->inputFacReader = NULL; } -void ColorSpillOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ColorSpillOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float fac[4]; float input[4]; float map; @@ -102,11 +106,13 @@ void ColorSpillOperation::executePixel(float* outputValue, float x, float y, Pix outputValue[3]=input[3]; } } -float ColorSpillOperation::calculateMapValue(float fac, float *input) { +float ColorSpillOperation::calculateMapValue(float fac, float *input) +{ return fac * (input[this->spillChannel]-(this->settings->limscale*input[settings->limchan])); } -float ColorSpillAverageOperation::calculateMapValue(float fac, float *input) { +float ColorSpillAverageOperation::calculateMapValue(float fac, float *input) +{ return fac * (input[this->spillChannel]-(this->settings->limscale*avg(input[this->channel2], input[this->channel3]))); } diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.h b/source/blender/compositor/operations/COM_ColorSpillOperation.h index 963eaae3076..69f51882496 100644 --- a/source/blender/compositor/operations/COM_ColorSpillOperation.h +++ b/source/blender/compositor/operations/COM_ColorSpillOperation.h @@ -46,12 +46,12 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeColorspill* nodeColorSpill) {this->settings= nodeColorSpill;} + void setSettings(NodeColorspill *nodeColorSpill) {this->settings = nodeColorSpill;} void setSpillChannel(int channel) {this->spillChannel = channel;} float calculateMapValue(float fac, float *input); diff --git a/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp b/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp index efeac9db410..6b64934f0b8 100644 --- a/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp +++ b/source/blender/compositor/operations/COM_CombineChannelsOperation.cpp @@ -23,7 +23,8 @@ #include "COM_CombineChannelsOperation.h" #include -CombineChannelsOperation::CombineChannelsOperation() : NodeOperation() { +CombineChannelsOperation::CombineChannelsOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); @@ -35,14 +36,16 @@ CombineChannelsOperation::CombineChannelsOperation() : NodeOperation() { this->inputChannel3Operation = NULL; this->inputChannel4Operation = NULL; } -void CombineChannelsOperation::initExecution() { +void CombineChannelsOperation::initExecution() +{ this->inputChannel1Operation = this->getInputSocketReader(0); this->inputChannel2Operation = this->getInputSocketReader(1); this->inputChannel3Operation = this->getInputSocketReader(2); this->inputChannel4Operation = this->getInputSocketReader(3); } -void CombineChannelsOperation::deinitExecution() { +void CombineChannelsOperation::deinitExecution() +{ this->inputChannel1Operation = NULL; this->inputChannel2Operation = NULL; this->inputChannel3Operation = NULL; @@ -50,7 +53,8 @@ void CombineChannelsOperation::deinitExecution() { } -void CombineChannelsOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void CombineChannelsOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float input[4]; /// @todo: remove if statements if (this->inputChannel1Operation) { diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp index 6391fa2537d..ce9484d0d9f 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cpp +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -36,7 +36,8 @@ extern "C" { #include "PIL_time.h" -CompositorOperation::CompositorOperation() : NodeOperation() { +CompositorOperation::CompositorOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); @@ -46,7 +47,8 @@ CompositorOperation::CompositorOperation() : NodeOperation() { this->alphaInput = NULL; } -void CompositorOperation::initExecution() { +void CompositorOperation::initExecution() +{ // When initializing the tree during initial load the width and height can be zero. this->imageInput = getInputSocketReader(0); this->alphaInput = getInputSocketReader(1); @@ -54,13 +56,13 @@ void CompositorOperation::initExecution() { this->outputBuffer=(float*) MEM_callocN(this->getWidth()*this->getHeight()*4*sizeof(float), "CompositorOperation"); } const Scene * scene = this->scene; - Render* re= RE_GetRender(scene->id.name); - RenderResult *rr= RE_AcquireResultWrite(re); + Render *re = RE_GetRender(scene->id.name); + RenderResult *rr = RE_AcquireResultWrite(re); if (rr) { if (rr->rectf != NULL) { MEM_freeN(rr->rectf); } - rr->rectf= outputBuffer; + rr->rectf = outputBuffer; } if (re) { RE_ReleaseResult(re); @@ -69,16 +71,18 @@ void CompositorOperation::initExecution() { } -void CompositorOperation::deinitExecution() { +void CompositorOperation::deinitExecution() +{ this->outputBuffer = NULL; this->imageInput = NULL; this->alphaInput = NULL; } -void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { +void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) +{ float color[8]; // 7 is enough - float* buffer = this->outputBuffer; + float *buffer = this->outputBuffer; if (!buffer) return; int x1 = rect->xmin; @@ -109,9 +113,10 @@ void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber, Mem } } -void CompositorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void CompositorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ int width = this->scene->r.xsch*this->scene->r.size/100; - int height= this->scene->r.ysch*this->scene->r.size/100; + int height = this->scene->r.ysch*this->scene->r.size/100; preferredResolution[0] = width; preferredResolution[1] = height; diff --git a/source/blender/compositor/operations/COM_CompositorOperation.h b/source/blender/compositor/operations/COM_CompositorOperation.h index 6f71fdff7b4..39c81b8292a 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.h +++ b/source/blender/compositor/operations/COM_CompositorOperation.h @@ -34,12 +34,12 @@ private: /** * @brief local reference to the scene */ - const Scene* scene; + const Scene *scene; /** * @brief local reference to the node tree */ - const bNodeTree* tree; + const bNodeTree *tree; /** * @brief reference to the output float buffer @@ -49,17 +49,17 @@ private: /** * @brief local reference to the input image operation */ - SocketReader* imageInput; + SocketReader *imageInput; /** * @brief local reference to the input alpha operation */ - SocketReader* alphaInput; + SocketReader *alphaInput; public: CompositorOperation(); void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); - void setScene(const Scene* scene) {this->scene = scene;} - void setbNodeTree(const bNodeTree* tree) {this->tree= tree;} + void setScene(const Scene *scene) {this->scene = scene;} + void setbNodeTree(const bNodeTree *tree) {this->tree = tree;} bool isOutputOperation(bool rendering) const {return rendering;} void initExecution(); void deinitExecution(); diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp index 3267994feea..df12a7d6b49 100644 --- a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.cpp @@ -25,23 +25,27 @@ extern "C" { #include "IMB_imbuf.h" } -ConvertColorProfileOperation::ConvertColorProfileOperation(): NodeOperation() { +ConvertColorProfileOperation::ConvertColorProfileOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; this->predivided = false; } -void ConvertColorProfileOperation::initExecution() { +void ConvertColorProfileOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertColorProfileOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertColorProfileOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float color[4]; inputOperation->read(color, x, y, sampler, inputBuffers); IMB_buffer_float_from_float(outputValue, color, 4, this->toProfile, this->fromProfile, this->predivided, 1, 1, 0, 0); } -void ConvertColorProfileOperation::deinitExecution() { +void ConvertColorProfileOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h index 9781795b952..1868de6d815 100644 --- a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h +++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h @@ -59,7 +59,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp index 8c48c5c0d14..4421dec319a 100644 --- a/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.cpp @@ -22,22 +22,26 @@ #include "COM_ConvertColorToBWOperation.h" -ConvertColorToBWOperation::ConvertColorToBWOperation(): NodeOperation() { +ConvertColorToBWOperation::ConvertColorToBWOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_VALUE); this->inputOperation = NULL; } -void ConvertColorToBWOperation::initExecution() { +void ConvertColorToBWOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertColorToBWOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertColorToBWOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(&inputColor[0], x, y, sampler, inputBuffers); outputValue[0] = (inputColor[0]*0.35f + inputColor[1]*0.45f + inputColor[2]*0.2f)*inputColor[3]; } -void ConvertColorToBWOperation::deinitExecution() { +void ConvertColorToBWOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h index 82d71453e1e..616cf0f2d01 100644 --- a/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h +++ b/source/blender/compositor/operations/COM_ConvertColorToBWOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp index af86f3ea5e8..ce45266ace0 100644 --- a/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.cpp @@ -22,20 +22,24 @@ #include "COM_ConvertColorToVectorOperation.h" -ConvertColorToVectorOperation::ConvertColorToVectorOperation(): NodeOperation() { +ConvertColorToVectorOperation::ConvertColorToVectorOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_VECTOR); this->inputOperation = NULL; } -void ConvertColorToVectorOperation::initExecution() { +void ConvertColorToVectorOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertColorToVectorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertColorToVectorOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ inputOperation->read(outputValue, x, y, sampler, inputBuffers); } -void ConvertColorToVectorOperation::deinitExecution() { +void ConvertColorToVectorOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h index de7315da02f..11a1bf30a07 100644 --- a/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h +++ b/source/blender/compositor/operations/COM_ConvertColorToVectorOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp b/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp index caf41419668..84a33f652cd 100644 --- a/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp +++ b/source/blender/compositor/operations/COM_ConvertColourToValueProg.cpp @@ -22,22 +22,26 @@ #include "COM_ConvertColourToValueProg.h" -ConvertColourToValueProg::ConvertColourToValueProg(): NodeOperation() { +ConvertColourToValueProg::ConvertColourToValueProg(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_VALUE); this->inputOperation = NULL; } -void ConvertColourToValueProg::initExecution() { +void ConvertColourToValueProg::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertColourToValueProg::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertColourToValueProg::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(&inputColor[0], x, y, sampler, inputBuffers); outputValue[0] = ((inputColor[0] + inputColor[1] + inputColor[2])/3.0f)*inputColor[3]; } -void ConvertColourToValueProg::deinitExecution() { +void ConvertColourToValueProg::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertColourToValueProg.h b/source/blender/compositor/operations/COM_ConvertColourToValueProg.h index 73e71b5665a..7aa07dd46f2 100644 --- a/source/blender/compositor/operations/COM_ConvertColourToValueProg.h +++ b/source/blender/compositor/operations/COM_ConvertColourToValueProg.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp index e262533b2f7..f64f0c054b1 100644 --- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp @@ -24,7 +24,8 @@ #include "BLI_math.h" #include "DNA_camera_types.h" -ConvertDepthToRadiusOperation::ConvertDepthToRadiusOperation(): NodeOperation() { +ConvertDepthToRadiusOperation::ConvertDepthToRadiusOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->inputOperation = NULL; @@ -33,13 +34,14 @@ ConvertDepthToRadiusOperation::ConvertDepthToRadiusOperation(): NodeOperation() this->maxRadius = 32.0f; } -float ConvertDepthToRadiusOperation::determineFocalDistance() { +float ConvertDepthToRadiusOperation::determineFocalDistance() +{ if (cameraObject == NULL || cameraObject->type != OB_CAMERA) { return 10.0f; } else { - Camera *camera= (Camera*)this->cameraObject->data; + Camera *camera = (Camera*)this->cameraObject->data; cam_lens = camera->lens; if (camera->dof_ob) { /* too simple, better to return the distance on the view axis only @@ -56,10 +58,11 @@ float ConvertDepthToRadiusOperation::determineFocalDistance() { } } -void ConvertDepthToRadiusOperation::initExecution() { +void ConvertDepthToRadiusOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); float focalDistance = determineFocalDistance(); - if (focalDistance==0.0f) focalDistance = 1e10f; /* if the dof is 0.0 then set it be be far away */ + if (focalDistance == 0.0f) focalDistance = 1e10f; /* if the dof is 0.0 then set it be be far away */ inverseFocalDistance = 1.f/focalDistance; this->aspect = (this->getWidth() > this->getHeight()) ? (this->getHeight() / (float)this->getWidth()) : (this->getWidth() / (float)this->getHeight()); this->aperture = 0.5f*(this->cam_lens / (this->aspect*32.f)) / this->fStop; @@ -67,7 +70,8 @@ void ConvertDepthToRadiusOperation::initExecution() { this->dof_sp = (float)minsz / (16.f / cam_lens); // <- == aspect * MIN2(img->x, img->y) / tan(0.5f * fov); } -void ConvertDepthToRadiusOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertDepthToRadiusOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; float z; float radius; @@ -93,6 +97,7 @@ void ConvertDepthToRadiusOperation::executePixel(float* outputValue, float x, fl else outputValue[0] = 0.0f; } -void ConvertDepthToRadiusOperation::deinitExecution() { +void ConvertDepthToRadiusOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h index 80a56122565..c199ea87fe3 100644 --- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h +++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h @@ -52,7 +52,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution @@ -66,7 +66,7 @@ public: void setfStop(float fStop) {this->fStop = fStop;} void setMaxRadius(float maxRadius) {this->maxRadius = maxRadius;} - void setCameraObject(Object* camera) {this->cameraObject = camera;} + void setCameraObject(Object *camera) {this->cameraObject = camera;} float determineFocalDistance(); }; #endif diff --git a/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp index 8de98fef28b..97dd7e69092 100644 --- a/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.cpp @@ -23,24 +23,28 @@ #include "COM_ConvertHSVToRGBOperation.h" #include "BLI_math_color.h" -ConvertHSVToRGBOperation::ConvertHSVToRGBOperation(): NodeOperation() { +ConvertHSVToRGBOperation::ConvertHSVToRGBOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertHSVToRGBOperation::initExecution() { +void ConvertHSVToRGBOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertHSVToRGBOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertHSVToRGBOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(inputColor, x, y, sampler, inputBuffers); hsv_to_rgb(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); outputValue[3] = inputColor[3]; } -void ConvertHSVToRGBOperation::deinitExecution() { +void ConvertHSVToRGBOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h index f2f61250aad..327b4089934 100644 --- a/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h +++ b/source/blender/compositor/operations/COM_ConvertHSVToRGBOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp index 509093f4d5f..547915f58c9 100644 --- a/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.cpp @@ -22,18 +22,21 @@ #include "COM_ConvertKeyToPremulOperation.h" #include "BLI_math.h" -ConvertKeyToPremulOperation::ConvertKeyToPremulOperation(): NodeOperation() { +ConvertKeyToPremulOperation::ConvertKeyToPremulOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputColor = NULL; } -void ConvertKeyToPremulOperation::initExecution() { +void ConvertKeyToPremulOperation::initExecution() +{ this->inputColor = getInputSocketReader(0); } -void ConvertKeyToPremulOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertKeyToPremulOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; float alpha; @@ -48,6 +51,7 @@ void ConvertKeyToPremulOperation::executePixel(float* outputValue, float x, floa outputValue[3] = alpha; } -void ConvertKeyToPremulOperation::deinitExecution() { +void ConvertKeyToPremulOperation::deinitExecution() +{ this->inputColor = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h index 15195b37f49..1d5a1c1c4a6 100644 --- a/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h +++ b/source/blender/compositor/operations/COM_ConvertKeyToPremulOperation.h @@ -40,7 +40,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); diff --git a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp index c800587ab0c..16636ee2afc 100644 --- a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.cpp @@ -22,18 +22,21 @@ #include "COM_ConvertPremulToKeyOperation.h" #include "BLI_math.h" -ConvertPremulToKeyOperation::ConvertPremulToKeyOperation(): NodeOperation() { +ConvertPremulToKeyOperation::ConvertPremulToKeyOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputColor = NULL; } -void ConvertPremulToKeyOperation::initExecution() { +void ConvertPremulToKeyOperation::initExecution() +{ this->inputColor = getInputSocketReader(0); } -void ConvertPremulToKeyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertPremulToKeyOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; float alpha; @@ -41,9 +44,9 @@ void ConvertPremulToKeyOperation::executePixel(float* outputValue, float x, floa alpha = inputValue[3]; if (fabsf(alpha) < 1e-5f) { - outputValue[0]= 0.f; - outputValue[1]= 0.f; - outputValue[2]= 0.f; + outputValue[0] = 0.f; + outputValue[1] = 0.f; + outputValue[2] = 0.f; } else { outputValue[0] = inputValue[0] / alpha; @@ -55,6 +58,7 @@ void ConvertPremulToKeyOperation::executePixel(float* outputValue, float x, floa outputValue[3] = alpha; } -void ConvertPremulToKeyOperation::deinitExecution() { +void ConvertPremulToKeyOperation::deinitExecution() +{ this->inputColor = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h index 431dcfe5742..17597fa8f15 100644 --- a/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h +++ b/source/blender/compositor/operations/COM_ConvertPremulToKeyOperation.h @@ -40,7 +40,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); diff --git a/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp index b8208a864ff..99054efc267 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.cpp @@ -23,23 +23,27 @@ #include "COM_ConvertRGBToHSVOperation.h" #include "BLI_math_color.h" -ConvertRGBToHSVOperation::ConvertRGBToHSVOperation(): NodeOperation() { +ConvertRGBToHSVOperation::ConvertRGBToHSVOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertRGBToHSVOperation::initExecution() { +void ConvertRGBToHSVOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertRGBToHSVOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertRGBToHSVOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(inputColor, x, y, sampler, inputBuffers); rgb_to_hsv(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); outputValue[3] = inputColor[3]; } -void ConvertRGBToHSVOperation::deinitExecution() { +void ConvertRGBToHSVOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h index a36092640e8..5064bd06993 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h +++ b/source/blender/compositor/operations/COM_ConvertRGBToHSVOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp index e1aa91e35da..c626dc03000 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.cpp @@ -22,17 +22,20 @@ #include "COM_ConvertRGBToYCCOperation.h" #include "BLI_math_color.h" -ConvertRGBToYCCOperation::ConvertRGBToYCCOperation(): NodeOperation() { +ConvertRGBToYCCOperation::ConvertRGBToYCCOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertRGBToYCCOperation::initExecution() { +void ConvertRGBToYCCOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertRGBToYCCOperation::setMode(int mode) { +void ConvertRGBToYCCOperation::setMode(int mode) +{ switch (mode) { case 1: @@ -48,7 +51,8 @@ void ConvertRGBToYCCOperation::setMode(int mode) { } } -void ConvertRGBToYCCOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertRGBToYCCOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; float color[3]; @@ -62,6 +66,7 @@ void ConvertRGBToYCCOperation::executePixel(float* outputValue, float x, float y outputValue[3] = inputColor[3]; } -void ConvertRGBToYCCOperation::deinitExecution() { +void ConvertRGBToYCCOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h index 76825061c19..a952627893b 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h +++ b/source/blender/compositor/operations/COM_ConvertRGBToYCCOperation.h @@ -48,7 +48,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp index c8ab3dd5a4b..c4b870d6ad5 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.cpp @@ -22,23 +22,27 @@ #include "COM_ConvertRGBToYUVOperation.h" #include "BLI_math_color.h" -ConvertRGBToYUVOperation::ConvertRGBToYUVOperation(): NodeOperation() { +ConvertRGBToYUVOperation::ConvertRGBToYUVOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertRGBToYUVOperation::initExecution() { +void ConvertRGBToYUVOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertRGBToYUVOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertRGBToYUVOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(inputColor, x, y, sampler, inputBuffers); rgb_to_yuv(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); outputValue[3] = inputColor[3]; } -void ConvertRGBToYUVOperation::deinitExecution() { +void ConvertRGBToYUVOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h index aba759b6b97..5bc763dde00 100644 --- a/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h +++ b/source/blender/compositor/operations/COM_ConvertRGBToYUVOperation.h @@ -43,7 +43,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp b/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp index 622163739d6..dce554efbac 100644 --- a/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp +++ b/source/blender/compositor/operations/COM_ConvertValueToColourProg.cpp @@ -22,16 +22,19 @@ #include "COM_ConvertValueToColourProg.h" -ConvertValueToColourProg::ConvertValueToColourProg(): NodeOperation() { +ConvertValueToColourProg::ConvertValueToColourProg(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; } -void ConvertValueToColourProg::initExecution() { +void ConvertValueToColourProg::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void ConvertValueToColourProg::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertValueToColourProg::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; this->inputProgram->read(inputValue, x, y, sampler, inputBuffers); color[0] = inputValue[0]; @@ -40,6 +43,7 @@ void ConvertValueToColourProg::executePixel(float* color, float x, float y, Pixe color[3] = 1.0f; } -void ConvertValueToColourProg::deinitExecution() { +void ConvertValueToColourProg::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertValueToColourProg.h b/source/blender/compositor/operations/COM_ConvertValueToColourProg.h index 25643a74f35..4956f7196f5 100644 --- a/source/blender/compositor/operations/COM_ConvertValueToColourProg.h +++ b/source/blender/compositor/operations/COM_ConvertValueToColourProg.h @@ -30,14 +30,14 @@ private: /** * Cached reference to the inputProgram */ - SocketReader* inputProgram; + SocketReader *inputProgram; public: ConvertValueToColourProg(); /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp index c675ea16fdb..ba7913d24ee 100644 --- a/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.cpp @@ -22,17 +22,20 @@ #include "COM_ConvertValueToVectorOperation.h" -ConvertValueToVectorOperation::ConvertValueToVectorOperation(): NodeOperation() { +ConvertValueToVectorOperation::ConvertValueToVectorOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VECTOR); this->inputOperation = NULL; } -void ConvertValueToVectorOperation::initExecution() { +void ConvertValueToVectorOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertValueToVectorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertValueToVectorOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float input[4]; inputOperation->read(input, x, y, sampler, inputBuffers); outputValue[0] = input[0]; @@ -41,6 +44,7 @@ void ConvertValueToVectorOperation::executePixel(float* outputValue, float x, fl outputValue[3] = 0.0f; } -void ConvertValueToVectorOperation::deinitExecution() { +void ConvertValueToVectorOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h index 0824bb0e4fe..1e6a7d4b3e7 100644 --- a/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h +++ b/source/blender/compositor/operations/COM_ConvertValueToVectorOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp index 517fc56e93e..5a4cc4d3549 100644 --- a/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.cpp @@ -22,21 +22,25 @@ #include "COM_ConvertVectorToColorOperation.h" -ConvertVectorToColorOperation::ConvertVectorToColorOperation(): NodeOperation() { +ConvertVectorToColorOperation::ConvertVectorToColorOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VECTOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertVectorToColorOperation::initExecution() { +void ConvertVectorToColorOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertVectorToColorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertVectorToColorOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ inputOperation->read(outputValue, x, y, sampler, inputBuffers); outputValue[3] = 1.0f; } -void ConvertVectorToColorOperation::deinitExecution() { +void ConvertVectorToColorOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h index 4ebaf5b9230..45ffd0675bd 100644 --- a/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h +++ b/source/blender/compositor/operations/COM_ConvertVectorToColorOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp index a57cd229e1f..67cc42ac8fc 100644 --- a/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.cpp @@ -22,22 +22,26 @@ #include "COM_ConvertVectorToValueOperation.h" -ConvertVectorToValueOperation::ConvertVectorToValueOperation(): NodeOperation() { +ConvertVectorToValueOperation::ConvertVectorToValueOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VECTOR); this->addOutputSocket(COM_DT_VALUE); this->inputOperation = NULL; } -void ConvertVectorToValueOperation::initExecution() { +void ConvertVectorToValueOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertVectorToValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertVectorToValueOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float input[4]; inputOperation->read(input, x, y, sampler, inputBuffers); outputValue[0] = (input[0]+input[1]+input[2])/3.0f; } -void ConvertVectorToValueOperation::deinitExecution() { +void ConvertVectorToValueOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h index ede7853f57e..59bae18ed26 100644 --- a/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h +++ b/source/blender/compositor/operations/COM_ConvertVectorToValueOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp index 6f9c5244c29..d3048c131e4 100644 --- a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.cpp @@ -22,17 +22,20 @@ #include "COM_ConvertYCCToRGBOperation.h" #include "BLI_math_color.h" -ConvertYCCToRGBOperation::ConvertYCCToRGBOperation(): NodeOperation() { +ConvertYCCToRGBOperation::ConvertYCCToRGBOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertYCCToRGBOperation::initExecution() { +void ConvertYCCToRGBOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertYCCToRGBOperation::setMode(int mode) { +void ConvertYCCToRGBOperation::setMode(int mode) +{ switch (mode) { case 1: @@ -48,7 +51,8 @@ void ConvertYCCToRGBOperation::setMode(int mode) { } } -void ConvertYCCToRGBOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertYCCToRGBOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(inputColor, x, y, sampler, inputBuffers); @@ -61,7 +65,8 @@ void ConvertYCCToRGBOperation::executePixel(float* outputValue, float x, float y outputValue[3] = inputColor[3]; } -void ConvertYCCToRGBOperation::deinitExecution() { +void ConvertYCCToRGBOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h index c3702de3b48..a13c2826a79 100644 --- a/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h +++ b/source/blender/compositor/operations/COM_ConvertYCCToRGBOperation.h @@ -48,7 +48,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp index a807030cb8a..d7037a2c2d1 100644 --- a/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.cpp @@ -22,24 +22,28 @@ #include "COM_ConvertYUVToRGBOperation.h" #include "BLI_math_color.h" -ConvertYUVToRGBOperation::ConvertYUVToRGBOperation(): NodeOperation() { +ConvertYUVToRGBOperation::ConvertYUVToRGBOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void ConvertYUVToRGBOperation::initExecution() { +void ConvertYUVToRGBOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void ConvertYUVToRGBOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ConvertYUVToRGBOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; inputOperation->read(inputColor, x, y, sampler, inputBuffers); yuv_to_rgb(inputColor[0], inputColor[1], inputColor[2], &outputValue[0], &outputValue[1], &outputValue[2]); outputValue[3] = inputColor[3]; } -void ConvertYUVToRGBOperation::deinitExecution() { +void ConvertYUVToRGBOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h index 6d82d36fe5c..380510d0100 100644 --- a/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h +++ b/source/blender/compositor/operations/COM_ConvertYUVToRGBOperation.h @@ -43,7 +43,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp index 6505e1be83e..0daa2b9c08a 100644 --- a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp @@ -23,15 +23,18 @@ #include "COM_ConvolutionEdgeFilterOperation.h" #include "BLI_math.h" -ConvolutionEdgeFilterOperation::ConvolutionEdgeFilterOperation() : ConvolutionFilterOperation() { +ConvolutionEdgeFilterOperation::ConvolutionEdgeFilterOperation() : ConvolutionFilterOperation() +{ } -inline void addFilter(float* result, float*input, float value) { +inline void addFilter(float *result, float*input, float value) +{ result[0] += input[0] * value; result[1] += input[1] * value; result[2] += input[2] * value; } -void ConvolutionEdgeFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void ConvolutionEdgeFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float in1[4],in2[4], res1[4], res2[4]; float value[4]; diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h index 64a52d1a925..a0f9c1b3452 100644 --- a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h +++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.h @@ -28,7 +28,7 @@ class ConvolutionEdgeFilterOperation: public ConvolutionFilterOperation { public: ConvolutionEdgeFilterOperation(); - void executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data); }; #endif diff --git a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp index 1bf53260e23..05cd570feaa 100644 --- a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp +++ b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp @@ -22,7 +22,8 @@ #include "COM_ConvolutionFilterOperation.h" -ConvolutionFilterOperation::ConvolutionFilterOperation() : NodeOperation() { +ConvolutionFilterOperation::ConvolutionFilterOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); @@ -31,12 +32,14 @@ ConvolutionFilterOperation::ConvolutionFilterOperation() : NodeOperation() { this->filter = NULL; this->setComplex(true); } -void ConvolutionFilterOperation::initExecution() { +void ConvolutionFilterOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); this->inputValueOperation = this->getInputSocketReader(1); } -void ConvolutionFilterOperation::set3x3Filter(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) { +void ConvolutionFilterOperation::set3x3Filter(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) +{ this->filter = new float[9]; this->filter[0] = f1; this->filter[1] = f2; @@ -51,7 +54,8 @@ void ConvolutionFilterOperation::set3x3Filter(float f1, float f2, float f3, floa this->filterWidth = 3; } -void ConvolutionFilterOperation::deinitExecution() { +void ConvolutionFilterOperation::deinitExecution() +{ this->inputOperation = NULL; this->inputValueOperation = NULL; if (this->filter) { @@ -61,7 +65,8 @@ void ConvolutionFilterOperation::deinitExecution() { } -void ConvolutionFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void ConvolutionFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ color[0] = 0.0; color[1] = 0.0; color[2] = 0.0; @@ -123,7 +128,8 @@ void ConvolutionFilterOperation::executePixel(float *color,int x, int y, MemoryB color[2] = color[2]*value[0] + in2[2] * mval; } -bool ConvolutionFilterOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool ConvolutionFilterOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; int addx = (this->filterWidth-1)/2+1; int addy = (this->filterHeight-1)/2+1; diff --git a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h index 732b3d3699e..3276038726b 100644 --- a/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h +++ b/source/blender/compositor/operations/COM_ConvolutionFilterOperation.h @@ -33,13 +33,13 @@ private: protected: SocketReader *inputOperation; SocketReader *inputValueOperation; - float* filter; + float *filter; public: ConvolutionFilterOperation(); void set3x3Filter(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); - void executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data); void initExecution(); void deinitExecution(); diff --git a/source/blender/compositor/operations/COM_CropOperation.cpp b/source/blender/compositor/operations/COM_CropOperation.cpp index 3c4e3428ec2..192ad8d0bda 100644 --- a/source/blender/compositor/operations/COM_CropOperation.cpp +++ b/source/blender/compositor/operations/COM_CropOperation.cpp @@ -23,22 +23,24 @@ #include "COM_CropOperation.h" #include "BLI_math.h" -CropBaseOperation::CropBaseOperation() :NodeOperation() { +CropBaseOperation::CropBaseOperation() :NodeOperation() +{ this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; this->settings = NULL; } -void CropBaseOperation::updateArea() { +void CropBaseOperation::updateArea() +{ SocketReader * inputReference = this->getInputSocketReader(0); float width = inputReference->getWidth(); float height = inputReference->getHeight(); if (this->relative) { - settings->x1= width * settings->fac_x1; - settings->x2= width * settings->fac_x2; - settings->y1= height * settings->fac_y1; - settings->y2= height * settings->fac_y2; + settings->x1 = width * settings->fac_x1; + settings->x2 = width * settings->fac_x2; + settings->y1 = height * settings->fac_y1; + settings->y2 = height * settings->fac_y2; } if (width <= settings->x1 + 1) settings->x1 = width - 1; @@ -55,19 +57,23 @@ void CropBaseOperation::updateArea() { this->ymin = MIN2(settings->y1, settings->y2); } -void CropBaseOperation::initExecution() { +void CropBaseOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); updateArea(); } -void CropBaseOperation::deinitExecution() { +void CropBaseOperation::deinitExecution() +{ this->inputOperation = NULL; } -CropOperation::CropOperation() :CropBaseOperation() { +CropOperation::CropOperation() :CropBaseOperation() +{ } -void CropOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void CropOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ if ((x < this->xmax && x >= xmin) && (y < ymax && y >= ymin)) { inputOperation->read(color, x, y, sampler, inputBuffers); } @@ -79,10 +85,12 @@ void CropOperation::executePixel(float *color, float x, float y, PixelSampler sa } } -CropImageOperation::CropImageOperation() :CropBaseOperation() { +CropImageOperation::CropImageOperation() :CropBaseOperation() +{ } -bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = input->xmax + this->xmin; @@ -93,13 +101,15 @@ bool CropImageOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } -void CropImageOperation::determineResolution(unsigned int resolution[], unsigned int preferedResolution[]) { +void CropImageOperation::determineResolution(unsigned int resolution[], unsigned int preferedResolution[]) +{ NodeOperation::determineResolution(resolution, preferedResolution); updateArea(); resolution[0] = this->xmax - this->xmin; resolution[1] = this->ymax - this->ymin; } -void CropImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void CropImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ this->inputOperation->read(color, (x + this->xmin), (y + this->ymin), sampler, inputBuffers); } diff --git a/source/blender/compositor/operations/COM_CropOperation.h b/source/blender/compositor/operations/COM_CropOperation.h index a728212d221..e8edabf08ed 100644 --- a/source/blender/compositor/operations/COM_CropOperation.h +++ b/source/blender/compositor/operations/COM_CropOperation.h @@ -41,7 +41,7 @@ public: void initExecution(); void deinitExecution(); void setCropSettings(NodeTwoXYs *settings) {this->settings = settings;} - void setRelative(bool rel) {this->relative =rel;} + void setRelative(bool rel) {this->relative = rel;} }; class CropOperation: public CropBaseOperation { diff --git a/source/blender/compositor/operations/COM_CurveBaseOperation.cpp b/source/blender/compositor/operations/COM_CurveBaseOperation.cpp index ddccff01772..fda5b00e2a0 100644 --- a/source/blender/compositor/operations/COM_CurveBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_CurveBaseOperation.cpp @@ -30,9 +30,11 @@ extern "C" { } #endif -CurveBaseOperation::CurveBaseOperation(): NodeOperation() { +CurveBaseOperation::CurveBaseOperation(): NodeOperation() +{ this->curveMapping = NULL; } -void CurveBaseOperation::initExecution() { +void CurveBaseOperation::initExecution() +{ curvemapping_initialize(this->curveMapping); } diff --git a/source/blender/compositor/operations/COM_CurveBaseOperation.h b/source/blender/compositor/operations/COM_CurveBaseOperation.h index bd4ee2ef2ed..366af5b07cb 100644 --- a/source/blender/compositor/operations/COM_CurveBaseOperation.h +++ b/source/blender/compositor/operations/COM_CurveBaseOperation.h @@ -39,6 +39,6 @@ public: */ void initExecution(); - void setCurveMapping(CurveMapping* mapping) {this->curveMapping = mapping;} + void setCurveMapping(CurveMapping *mapping) {this->curveMapping = mapping;} }; #endif diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp index c64f2593318..628daa7c775 100644 --- a/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.cpp @@ -23,7 +23,8 @@ #include "COM_DifferenceMatteOperation.h" #include "BLI_math.h" -DifferenceMatteOperation::DifferenceMatteOperation(): NodeOperation() { +DifferenceMatteOperation::DifferenceMatteOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addInputSocket(COM_DT_COLOR); addOutputSocket(COM_DT_VALUE); @@ -32,16 +33,19 @@ DifferenceMatteOperation::DifferenceMatteOperation(): NodeOperation() { inputImage2Program = NULL; } -void DifferenceMatteOperation::initExecution() { +void DifferenceMatteOperation::initExecution() +{ this->inputImage1Program = this->getInputSocketReader(0); this->inputImage2Program = this->getInputSocketReader(1); } -void DifferenceMatteOperation::deinitExecution() { - this->inputImage1Program= NULL; - this->inputImage2Program= NULL; +void DifferenceMatteOperation::deinitExecution() +{ + this->inputImage1Program = NULL; + this->inputImage2Program = NULL; } -void DifferenceMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void DifferenceMatteOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inColor1[4]; float inColor2[4]; @@ -53,9 +57,9 @@ void DifferenceMatteOperation::executePixel(float* outputValue, float x, float y this->inputImage1Program->read(inColor1, x, y, sampler, inputBuffers); this->inputImage2Program->read(inColor2, x, y, sampler, inputBuffers); - difference= fabs(inColor2[0]-inColor1[0])+ - fabs(inColor2[1]-inColor1[1])+ - fabs(inColor2[2]-inColor1[2]); + difference = (fabs(inColor2[0] - inColor1[0]) + + fabs(inColor2[1] - inColor1[1]) + + fabs(inColor2[2] - inColor1[2])); /*average together the distances*/ difference=difference/3.0; @@ -78,7 +82,7 @@ void DifferenceMatteOperation::executePixel(float* outputValue, float x, float y } else { /*foreground object*/ - outputValue[0]= inColor1[3]; + outputValue[0] = inColor1[3]; } } diff --git a/source/blender/compositor/operations/COM_DifferenceMatteOperation.h b/source/blender/compositor/operations/COM_DifferenceMatteOperation.h index 2b63bfd7a15..95ebed6f63d 100644 --- a/source/blender/compositor/operations/COM_DifferenceMatteOperation.h +++ b/source/blender/compositor/operations/COM_DifferenceMatteOperation.h @@ -31,9 +31,9 @@ */ class DifferenceMatteOperation : public NodeOperation { private: - NodeChroma* settings; + NodeChroma *settings; SocketReader * inputImage1Program; - SocketReader* inputImage2Program; + SocketReader *inputImage2Program; public: /** * Default constructor @@ -43,11 +43,11 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} + void setSettings(NodeChroma *nodeChroma) {this->settings = nodeChroma;} }; #endif diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp index c34d8976719..d9c0350eb09 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -23,7 +23,8 @@ #include "COM_DilateErodeOperation.h" #include "BLI_math.h" -DilateErodeOperation::DilateErodeOperation(): NodeOperation() { +DilateErodeOperation::DilateErodeOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->setComplex(true); @@ -32,7 +33,8 @@ DilateErodeOperation::DilateErodeOperation(): NodeOperation() { this->_switch = 0.5f; this->distance = 0.0f; } -void DilateErodeOperation::initExecution() { +void DilateErodeOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); if (this->distance < 0.0f) { this->scope = - this->distance + this->inset; @@ -50,12 +52,14 @@ void DilateErodeOperation::initExecution() { } } -void* DilateErodeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { - void* buffer = inputProgram->initializeTileData(NULL, memoryBuffers); +void *DilateErodeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ + void *buffer = inputProgram->initializeTileData(NULL, memoryBuffers); return buffer; } -void DilateErodeOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void DilateErodeOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float inputValue[4]; const float sw = this->_switch; const float distance = this->distance; @@ -64,9 +68,9 @@ void DilateErodeOperation::executePixel(float* color, int x, int y, MemoryBuffer const float inset = this->inset; float mindist = rd*2; - MemoryBuffer* inputBuffer = (MemoryBuffer*)data; - float* buffer = inputBuffer->getBuffer(); - rcti* rect = inputBuffer->getRect(); + MemoryBuffer *inputBuffer = (MemoryBuffer*)data; + float *buffer = inputBuffer->getBuffer(); + rcti *rect = inputBuffer->getRect(); const int minx = max(x - scope, rect->xmin); const int miny = max(y - scope, rect->ymin); const int maxx = min(x + scope, rect->xmax); @@ -137,11 +141,13 @@ void DilateErodeOperation::executePixel(float* color, int x, int y, MemoryBuffer } } -void DilateErodeOperation::deinitExecution() { +void DilateErodeOperation::deinitExecution() +{ this->inputProgram = NULL; } -bool DilateErodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool DilateErodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = input->xmax + scope; diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.h b/source/blender/compositor/operations/COM_DilateErodeOperation.h index af554fa0d16..102d1165bc8 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.h +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.h @@ -47,14 +47,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * Deinitialize the execution */ diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp index 4b4e9ce851a..30a09a45ade 100644 --- a/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.cpp @@ -27,7 +27,8 @@ extern "C" { #include "RE_pipeline.h" } -DirectionalBlurOperation::DirectionalBlurOperation() : NodeOperation() { +DirectionalBlurOperation::DirectionalBlurOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->setComplex(true); @@ -35,7 +36,8 @@ DirectionalBlurOperation::DirectionalBlurOperation() : NodeOperation() { this->inputProgram = NULL; } -void DirectionalBlurOperation::initExecution() { +void DirectionalBlurOperation::initExecution() +{ this->inputProgram = getInputSocketReader(0); QualityStepHelper::initExecution(COM_QH_INCREASE); const float angle = this->data->angle; @@ -48,37 +50,38 @@ void DirectionalBlurOperation::initExecution() { const float width = getWidth(); const float height = getHeight(); - const float a= angle; - const float itsc= 1.f / pow(2.f, (float)iterations); + const float a = angle; + const float itsc = 1.f / pow(2.f, (float)iterations); float D; - D= distance * sqrtf(width*width + height*height); - center_x_pix= center_x * width; - center_y_pix= center_y * height; + D = distance * sqrtf(width*width + height*height); + center_x_pix = center_x * width; + center_y_pix = center_y * height; tx= itsc * D * cos(a); ty= -itsc * D * sin(a); sc= itsc * zoom; - rot= itsc * spin; + rot = itsc * spin; } -void DirectionalBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void DirectionalBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ const int iterations = pow(2.f, this->data->iter); - float col[4]= {0,0,0,0}; - float col2[4]= {0,0,0,0}; + float col[4] = {0,0,0,0}; + float col2[4] = {0,0,0,0}; this->inputProgram->read(col2, x, y, COM_PS_NEAREST, inputBuffers); float ltx = tx; float lty = ty; float lsc = sc; float lrot = rot; /* blur the image */ - for (int i= 0; i < iterations; ++i) { - const float cs= cos(lrot), ss= sin(lrot); - const float isc= 1.f / (1.f + lsc); + for (int i = 0; i < iterations; ++i) { + const float cs = cos(lrot), ss = sin(lrot); + const float isc = 1.f / (1.f + lsc); - const float v= isc * (y - center_y_pix) + lty; - const float u= isc * (x - center_x_pix) + ltx; + const float v = isc * (y - center_y_pix) + lty; + const float u = isc * (x - center_x_pix) + ltx; this->inputProgram->read(col, cs * u + ss * v + center_x_pix, cs * v - ss * u + center_y_pix, COM_PS_NEAREST, inputBuffers); @@ -99,11 +102,13 @@ void DirectionalBlurOperation::executePixel(float* color, int x, int y, MemoryBu color[3] = col2[3]/iterations; } -void DirectionalBlurOperation::deinitExecution() { +void DirectionalBlurOperation::deinitExecution() +{ this->inputProgram = NULL; } -bool DirectionalBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool DirectionalBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = this->getWidth(); diff --git a/source/blender/compositor/operations/COM_DirectionalBlurOperation.h b/source/blender/compositor/operations/COM_DirectionalBlurOperation.h index e82b451c102..280e9247c1b 100644 --- a/source/blender/compositor/operations/COM_DirectionalBlurOperation.h +++ b/source/blender/compositor/operations/COM_DirectionalBlurOperation.h @@ -27,8 +27,8 @@ class DirectionalBlurOperation : public NodeOperation, public QualityStepHelper { private: - SocketReader* inputProgram; - NodeDBlurData* data; + SocketReader *inputProgram; + NodeDBlurData *data; float center_x_pix, center_y_pix; float tx, ty; @@ -40,7 +40,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_DisplaceOperation.cpp b/source/blender/compositor/operations/COM_DisplaceOperation.cpp index b30ce5ac5b5..2add367f39e 100644 --- a/source/blender/compositor/operations/COM_DisplaceOperation.cpp +++ b/source/blender/compositor/operations/COM_DisplaceOperation.cpp @@ -23,7 +23,8 @@ #include "BLI_math.h" #include "BLI_utildefines.h" -DisplaceOperation::DisplaceOperation(): NodeOperation() { +DisplaceOperation::DisplaceOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VECTOR); this->addInputSocket(COM_DT_VALUE); @@ -37,7 +38,8 @@ DisplaceOperation::DisplaceOperation(): NodeOperation() { this->inputScaleYProgram = NULL; } -void DisplaceOperation::initExecution() { +void DisplaceOperation::initExecution() +{ this->inputColorProgram = this->getInputSocketReader(0); this->inputVectorProgram = this->getInputSocketReader(1); this->inputScaleXProgram = this->getInputSocketReader(2); @@ -52,7 +54,7 @@ void DisplaceOperation::initExecution() { * in order to take effect */ #define DISPLACE_EPSILON 0.01f -void DisplaceOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) +void DisplaceOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) { float inVector[4]; float inScale[4]; @@ -97,14 +99,16 @@ void DisplaceOperation::executePixel(float* color, int x, int y, MemoryBuffer *i this->inputColorProgram->read(color, u, v, dxt, dyt, inputBuffers); } -void DisplaceOperation::deinitExecution() { +void DisplaceOperation::deinitExecution() +{ this->inputColorProgram = NULL; this->inputVectorProgram = NULL; this->inputScaleXProgram = NULL; this->inputScaleYProgram = NULL; } -bool DisplaceOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool DisplaceOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti colorInput; rcti vectorInput; NodeOperation *operation=NULL; diff --git a/source/blender/compositor/operations/COM_DisplaceOperation.h b/source/blender/compositor/operations/COM_DisplaceOperation.h index 17f65eea20f..9c59c928854 100644 --- a/source/blender/compositor/operations/COM_DisplaceOperation.h +++ b/source/blender/compositor/operations/COM_DisplaceOperation.h @@ -29,10 +29,10 @@ private: /** * Cached reference to the inputProgram */ - SocketReader* inputColorProgram; - SocketReader* inputVectorProgram; - SocketReader* inputScaleXProgram; - SocketReader* inputScaleYProgram; + SocketReader *inputColorProgram; + SocketReader *inputVectorProgram; + SocketReader *inputScaleXProgram; + SocketReader *inputScaleYProgram; float width_x4; float height_x4; @@ -48,7 +48,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp index 99d1eb1cd14..8675caca1e2 100644 --- a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp +++ b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp @@ -23,7 +23,8 @@ #include "BLI_math.h" #include "BLI_utildefines.h" -DisplaceSimpleOperation::DisplaceSimpleOperation(): NodeOperation() { +DisplaceSimpleOperation::DisplaceSimpleOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VECTOR); this->addInputSocket(COM_DT_VALUE); @@ -36,7 +37,8 @@ DisplaceSimpleOperation::DisplaceSimpleOperation(): NodeOperation() { this->inputScaleYProgram = NULL; } -void DisplaceSimpleOperation::initExecution() { +void DisplaceSimpleOperation::initExecution() +{ this->inputColorProgram = this->getInputSocketReader(0); this->inputVectorProgram = this->getInputSocketReader(1); this->inputScaleXProgram = this->getInputSocketReader(2); @@ -51,7 +53,7 @@ void DisplaceSimpleOperation::initExecution() { * in order to take effect */ #define DISPLACE_EPSILON 0.01f -void DisplaceSimpleOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +void DisplaceSimpleOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { float inVector[4]; float inScale[4]; @@ -83,14 +85,16 @@ void DisplaceSimpleOperation::executePixel(float* color, float x, float y, Pixel this->inputColorProgram->read(color, u, v, sampler, inputBuffers); } -void DisplaceSimpleOperation::deinitExecution() { +void DisplaceSimpleOperation::deinitExecution() +{ this->inputColorProgram = NULL; this->inputVectorProgram = NULL; this->inputScaleXProgram = NULL; this->inputScaleYProgram = NULL; } -bool DisplaceSimpleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool DisplaceSimpleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti colorInput; NodeOperation *operation=NULL; diff --git a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h index 88569954305..0e3bcc1b1f0 100644 --- a/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h +++ b/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h @@ -29,10 +29,10 @@ private: /** * Cached reference to the inputProgram */ - SocketReader* inputColorProgram; - SocketReader* inputVectorProgram; - SocketReader* inputScaleXProgram; - SocketReader* inputScaleYProgram; + SocketReader *inputColorProgram; + SocketReader *inputVectorProgram; + SocketReader *inputScaleXProgram; + SocketReader *inputScaleYProgram; float width_x4; float height_x4; @@ -48,7 +48,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp b/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp index ab4df7bf1ac..304f7fa5066 100644 --- a/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp @@ -22,7 +22,8 @@ #include "COM_DistanceMatteOperation.h" #include "BLI_math.h" -DistanceMatteOperation::DistanceMatteOperation(): NodeOperation() { +DistanceMatteOperation::DistanceMatteOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addInputSocket(COM_DT_COLOR); addOutputSocket(COM_DT_VALUE); @@ -31,17 +32,20 @@ DistanceMatteOperation::DistanceMatteOperation(): NodeOperation() { inputKeyProgram = NULL; } -void DistanceMatteOperation::initExecution() { +void DistanceMatteOperation::initExecution() +{ this->inputImageProgram = this->getInputSocketReader(0); this->inputKeyProgram = this->getInputSocketReader(1); } -void DistanceMatteOperation::deinitExecution() { - this->inputImageProgram= NULL; - this->inputKeyProgram= NULL; +void DistanceMatteOperation::deinitExecution() +{ + this->inputImageProgram = NULL; + this->inputKeyProgram = NULL; } -void DistanceMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void DistanceMatteOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inKey[4]; float inImage[4]; diff --git a/source/blender/compositor/operations/COM_DistanceMatteOperation.h b/source/blender/compositor/operations/COM_DistanceMatteOperation.h index efa735445fa..2a668f31f8f 100644 --- a/source/blender/compositor/operations/COM_DistanceMatteOperation.h +++ b/source/blender/compositor/operations/COM_DistanceMatteOperation.h @@ -42,11 +42,11 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} + void setSettings(NodeChroma *nodeChroma) {this->settings = nodeChroma;} }; #endif diff --git a/source/blender/compositor/operations/COM_DotproductOperation.cpp b/source/blender/compositor/operations/COM_DotproductOperation.cpp index 284fb0ddca4..b03b176f08a 100644 --- a/source/blender/compositor/operations/COM_DotproductOperation.cpp +++ b/source/blender/compositor/operations/COM_DotproductOperation.cpp @@ -22,7 +22,8 @@ #include "COM_DotproductOperation.h" -DotproductOperation::DotproductOperation() : NodeOperation() { +DotproductOperation::DotproductOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_VECTOR); this->addInputSocket(COM_DT_VECTOR); this->addOutputSocket(COM_DT_VALUE); @@ -30,19 +31,22 @@ DotproductOperation::DotproductOperation() : NodeOperation() { this->input1Operation = NULL; this->input2Operation = NULL; } -void DotproductOperation::initExecution() { +void DotproductOperation::initExecution() +{ this->input1Operation = this->getInputSocketReader(0); this->input2Operation = this->getInputSocketReader(1); } -void DotproductOperation::deinitExecution() { +void DotproductOperation::deinitExecution() +{ this->input1Operation = NULL; this->input2Operation = NULL; } /** @todo: current implementation is the inverse of a dotproduct. not 'logically' correct */ -void DotproductOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void DotproductOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float input1[4]; float input2[4]; this->input1Operation->read(input1, x, y, sampler, inputBuffers); diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp index b42e676893a..9e911e7ba40 100644 --- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.cpp @@ -26,7 +26,8 @@ // this part has been copied from the double edge mask // Contributor(s): Peter Larabell. -static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { +static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) +{ int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -106,7 +107,7 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int } /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { + for (x = t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled if (limask[x]) { // test if pixel to the right, or to the left, are empty in the inner mask, @@ -126,7 +127,7 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int } /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { + for (x = rw-2; x; x--) { // test if inner mask is filled if (limask[x]) { // test if pixel to the right, or to the left, are empty in the inner mask, @@ -145,7 +146,7 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int } } /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x = t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, @@ -165,7 +166,7 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int } /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { + for (x = t-rw; x>rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, @@ -189,7 +190,8 @@ static void do_adjacentKeepBorders(unsigned int t, unsigned int rw, unsigned int rsize[2]=gsz; } -static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { +static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) +{ int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -292,7 +294,7 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in } } /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { + for (x = t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled if (limask[x]) { // test if pixel to the left, or to the right, are empty in the inner mask, @@ -318,7 +320,7 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in } /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { + for (x = rw-2; x; x--) { // test if inner mask is filled if (limask[x]) { // test if pixel to the left, or to the right, are empty in the inner mask, @@ -343,7 +345,7 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in } } /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x = t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, @@ -369,7 +371,7 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in } /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { + for (x = t-rw; x>rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if pixel underneath, or above, are empty in the inner mask, @@ -399,7 +401,8 @@ static void do_adjacentBleedBorders(unsigned int t, unsigned int rw, unsigned in rsize[2]=gsz; } -static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { +static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) +{ int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -475,7 +478,7 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim } /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { + for (x = t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty to the left or to the right @@ -494,7 +497,7 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim } /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { + for (x = rw-2; x; x--) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty to the left or to the right @@ -512,7 +515,7 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim } } /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x = t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty underneath or above @@ -531,7 +534,7 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim } /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { + for (x = t-rw; x>rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty underneath or above @@ -554,7 +557,8 @@ static void do_allKeepBorders(unsigned int t, unsigned int rw, unsigned int *lim rsize[2]=gsz; } -static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) { +static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize) +{ int x; unsigned int isz=0; // inner edge size unsigned int osz=0; // outer edge size @@ -653,7 +657,7 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li } } /* Test the TOP row of pixels in buffer, except corners */ - for (x= t-1; x>=(t-rw)+2; x--) { + for (x = t-1; x>=(t-rw)+2; x--) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty to the left or to the right @@ -678,7 +682,7 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li } /* Test the BOTTOM row of pixels in buffer, except corners */ - for (x= rw-2; x; x--) { + for (x = rw-2; x; x--) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty to the left or to the right @@ -702,7 +706,7 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li } } /* Test the LEFT edge of pixels in buffer, except corners */ - for (x= t-(rw<<1)+1; x>=rw; x-=rw) { + for (x = t-(rw<<1)+1; x>=rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty underneath or above @@ -727,7 +731,7 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li } /* Test the RIGHT edge of pixels in buffer, except corners */ - for (x= t-rw; x>rw; x-=rw) { + for (x = t-rw; x>rw; x-=rw) { // test if inner mask is filled if (limask[x]) { // test if inner mask is empty underneath or above @@ -756,7 +760,8 @@ static void do_allBleedBorders(unsigned int t, unsigned int rw, unsigned int *li rsize[2]=gsz; } -static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) { +static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) +{ int x; // x = pixel loop counter int a; // a = pixel loop counter int dx; // dx = delta x @@ -765,7 +770,7 @@ static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *l int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ - for (x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { + for (x = (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { a=x-2; pix_prevRow=a+rw; pix_nextRow=a-rw; @@ -781,9 +786,9 @@ static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *l then the current pixel is counted as being a true outer edge pixel. */ if ((!lomask[pix_nextCol] && !limask[pix_nextCol]) || - (!lomask[pix_prevCol] && !limask[pix_prevCol]) || - (!lomask[pix_nextRow] && !limask[pix_nextRow]) || - (!lomask[pix_prevRow] && !limask[pix_prevRow])) + (!lomask[pix_prevCol] && !limask[pix_prevCol]) || + (!lomask[pix_nextRow] && !limask[pix_nextRow]) || + (!lomask[pix_prevRow] && !limask[pix_prevRow])) { in_osz++; // increment the outer boundary pixel count lres[a]=3; // flag pixel as part of outer edge @@ -817,7 +822,8 @@ static void do_allEdgeDetection(unsigned int t, unsigned int rw, unsigned int *l rsize[2]=in_gsz; } -static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) { +static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned int *limask, unsigned int *lomask, unsigned int *lres, float *res, unsigned int *rsize, unsigned int in_isz, unsigned int in_osz, unsigned int in_gsz) +{ int x; // x = pixel loop counter int a; // a = pixel loop counter int dx; // dx = delta x @@ -826,7 +832,7 @@ static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned i int pix_prevCol; // pix_prevCol = pixel one column behind the one we are testing in a loop int pix_nextCol; // pix_nextCol = pixel one column in front of the one we are testing in a loop /* Test all rows between the FIRST and LAST rows, excluding left and right edges */ - for (x= (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { + for (x = (t-rw)+1, dx=x-(rw-2); dx>rw; x-=rw,dx-=rw) { a=x-2; pix_prevRow=a+rw; pix_nextRow=a-rw; @@ -842,9 +848,9 @@ static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned i then the current pixel is counted as being a true outer edge pixel. */ if ((!lomask[pix_nextCol] && !limask[pix_nextCol]) || - (!lomask[pix_prevCol] && !limask[pix_prevCol]) || - (!lomask[pix_nextRow] && !limask[pix_nextRow]) || - (!lomask[pix_prevRow] && !limask[pix_prevRow])) + (!lomask[pix_prevCol] && !limask[pix_prevCol]) || + (!lomask[pix_nextRow] && !limask[pix_nextRow]) || + (!lomask[pix_prevRow] && !limask[pix_prevRow])) { in_osz++; // increment the outer boundary pixel count lres[a]=3; // flag pixel as part of outer edge @@ -858,9 +864,9 @@ static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned i } else { if ((!limask[pix_nextCol] && lomask[pix_nextCol]) || - (!limask[pix_prevCol] && lomask[pix_prevCol]) || - (!limask[pix_nextRow] && lomask[pix_nextRow]) || - (!limask[pix_prevRow] && lomask[pix_prevRow])) + (!limask[pix_prevCol] && lomask[pix_prevCol]) || + (!limask[pix_nextRow] && lomask[pix_nextRow]) || + (!limask[pix_prevRow] && lomask[pix_prevRow])) { in_isz++; // increment the inner boundary pixel count lres[a]=4; // flag pixel as part of inner edge @@ -882,7 +888,8 @@ static void do_adjacentEdgeDetection(unsigned int t, unsigned int rw, unsigned i rsize[2]=in_gsz; } -static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigned int *lres, float *res, unsigned short *gbuf, unsigned int *innerEdgeOffset, unsigned int *outerEdgeOffset, unsigned int isz, unsigned int gsz) { +static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigned int *lres, float *res, unsigned short *gbuf, unsigned int *innerEdgeOffset, unsigned int *outerEdgeOffset, unsigned int isz, unsigned int gsz) +{ int x; // x = pixel loop counter int a; // a = temporary pixel index buffer loop counter unsigned int ud; // ud = unscaled edge distance @@ -904,7 +911,7 @@ static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigne This does make the assumption that x and y can fit in 16 unsigned bits so if Blender starts doing renders greater than 65536 in either direction - this will need to allocate gbuf[] as unsigned int* and allocate 8 bytes + this will need to allocate gbuf[] as unsigned int *and allocate 8 bytes per flagged pixel. In general, the buffer on-screen: @@ -992,7 +999,8 @@ static void do_createEdgeLocationBuffer(unsigned int t, unsigned int rw, unsigne } -static void do_fillGradientBuffer(unsigned int rw, float *res, unsigned short *gbuf, unsigned int isz, unsigned int osz, unsigned int gsz, unsigned int innerEdgeOffset, unsigned int outerEdgeOffset) { +static void do_fillGradientBuffer(unsigned int rw, float *res, unsigned short *gbuf, unsigned int isz, unsigned int osz, unsigned int gsz, unsigned int innerEdgeOffset, unsigned int outerEdgeOffset) +{ int x; // x = pixel loop counter int a; // a = temporary pixel index buffer loop counter int fsz; // size of the frame @@ -1068,7 +1076,7 @@ static void do_fillGradientBuffer(unsigned int rw, float *res, unsigned short *g Loop through all gradient pixels. */ - for (x= gsz-1; x>=0; x--) { + for (x = gsz-1; x>=0; x--) { gradientFillOffset=x<<1; t=gbuf[gradientFillOffset]; // calculate column of pixel indexed by gbuf[x] fsz=gbuf[gradientFillOffset+1]; // calculate row of pixel indexed by gbuf[x] @@ -1089,7 +1097,7 @@ static void do_fillGradientBuffer(unsigned int rw, float *res, unsigned short *g odist=*(float*)&rsl; // reciprocal square root odist=odist*(rsopf-(rsf*odist*odist)); // -- ** this line can be iterated for more accuracy ** -- dmin=0xffffffff; // reset min distance to edge pixel - for (a= innerEdgeOffset+isz-1; a>=innerEdgeOffset; a--) { // loop through all inside edge pixels + for (a = innerEdgeOffset+isz-1; a>=innerEdgeOffset; a--) { // loop through all inside edge pixels ud=a<<1; dy=t-gbuf[ud]; // compute delta in Y from gradient pixel to inside edge pixel dx=fsz-gbuf[ud+1]; // compute delta in X from gradient pixel to inside edge pixel @@ -1121,8 +1129,8 @@ static void do_fillGradientBuffer(unsigned int rw, float *res, unsigned short *g // end of copy -void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float *res) { - +void DoubleEdgeMaskOperation::doDoubleEdgeMask(float *imask, float *omask, float *res) +{ unsigned int *lres; // lres = unsigned int pointer to output pixel buffer (for bit operations) unsigned int *limask; // limask = unsigned int pointer to inner mask (for bit operations) unsigned int *lomask; // lomask = unsigned int pointer to outer mask (for bit operations) @@ -1144,10 +1152,10 @@ void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float t=(this->getWidth()*this->getHeight())-1; // determine size of the frame - lres= (unsigned int*)res; // unsigned int pointer to output buffer (for bit level ops) + lres = (unsigned int*)res; // unsigned int pointer to output buffer (for bit level ops) limask=(unsigned int*)imask; // unsigned int pointer to input mask (for bit level ops) lomask=(unsigned int*)omask; // unsigned int pointer to output mask (for bit level ops) - rw= this->getWidth(); // width of a row of pixels + rw = this->getWidth(); // width of a row of pixels /* @@ -1207,7 +1215,7 @@ void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float gsz=rsize[2]; // by the do_*EdgeDetection() function. fsz=gsz+isz+osz; // calculate size of pixel index buffer needed - gbuf= new unsigned short[fsz*2]; // allocate edge/gradient pixel index buffer + gbuf = new unsigned short[fsz*2]; // allocate edge/gradient pixel index buffer do_createEdgeLocationBuffer(t,rw,lres,res,gbuf,&innerEdgeOffset,&outerEdgeOffset,isz,gsz); do_fillGradientBuffer(rw,res,gbuf,isz,osz,gsz,innerEdgeOffset,outerEdgeOffset); @@ -1216,7 +1224,8 @@ void DoubleEdgeMaskOperation::doDoubleEdgeMask(float* imask, float *omask, float } } -DoubleEdgeMaskOperation::DoubleEdgeMaskOperation(): NodeOperation() { +DoubleEdgeMaskOperation::DoubleEdgeMaskOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); @@ -1227,7 +1236,8 @@ DoubleEdgeMaskOperation::DoubleEdgeMaskOperation(): NodeOperation() { this->setComplex(true); } -bool DoubleEdgeMaskOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool DoubleEdgeMaskOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ if (this->cachedInstance == NULL) { rcti newInput; newInput.xmax = this->getWidth(); @@ -1241,23 +1251,25 @@ bool DoubleEdgeMaskOperation::determineDependingAreaOfInterest(rcti *input, Read } } -void DoubleEdgeMaskOperation::initExecution() { +void DoubleEdgeMaskOperation::initExecution() +{ this->inputInnerMask = this->getInputSocketReader(0); this->inputOuterMask = this->getInputSocketReader(1); initMutex(); this->cachedInstance = NULL; } -void* DoubleEdgeMaskOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *DoubleEdgeMaskOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ if (this->cachedInstance) return this->cachedInstance; BLI_mutex_lock(getMutex()); if (this->cachedInstance == NULL) { - MemoryBuffer* innerMask = (MemoryBuffer*)inputInnerMask->initializeTileData(rect, memoryBuffers); - MemoryBuffer* outerMask= (MemoryBuffer*)inputOuterMask->initializeTileData(rect, memoryBuffers); - float* data = new float[this->getWidth()*this->getHeight()]; - float* imask = innerMask->convertToValueBuffer(); - float* omask = outerMask->convertToValueBuffer(); + MemoryBuffer *innerMask = (MemoryBuffer*)inputInnerMask->initializeTileData(rect, memoryBuffers); + MemoryBuffer *outerMask = (MemoryBuffer*)inputOuterMask->initializeTileData(rect, memoryBuffers); + float *data = new float[this->getWidth()*this->getHeight()]; + float *imask = innerMask->convertToValueBuffer(); + float *omask = outerMask->convertToValueBuffer(); doDoubleEdgeMask(imask, omask, data); delete imask; delete omask; @@ -1266,8 +1278,9 @@ void* DoubleEdgeMaskOperation::initializeTileData(rcti *rect, MemoryBuffer **mem BLI_mutex_unlock(getMutex()); return this->cachedInstance; } -void DoubleEdgeMaskOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { - float* buffer = (float*) data; +void DoubleEdgeMaskOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ + float *buffer = (float*) data; int index = (y*this->getWidth() + x); color[0] = buffer[index]; color[1] = buffer[index+1]; @@ -1275,7 +1288,8 @@ void DoubleEdgeMaskOperation::executePixel(float* color, int x, int y, MemoryBuf color[3] = buffer[index+3]; } -void DoubleEdgeMaskOperation::deinitExecution() { +void DoubleEdgeMaskOperation::deinitExecution() +{ this->inputInnerMask = NULL; this->inputOuterMask = NULL; deinitMutex(); diff --git a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h index f233570800a..85c4fd9e5b7 100644 --- a/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h +++ b/source/blender/compositor/operations/COM_DoubleEdgeMaskOperation.h @@ -34,15 +34,15 @@ private: SocketReader * inputInnerMask; bool adjecentOnly; bool keepInside; - float* cachedInstance; + float *cachedInstance; public: DoubleEdgeMaskOperation(); - void doDoubleEdgeMask(float* inner, float *outer, float *res); + void doDoubleEdgeMask(float *inner, float *outer, float *res); /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution @@ -54,7 +54,7 @@ public: */ void deinitExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp b/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp index bc15523c149..85a629f7365 100644 --- a/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.cpp @@ -24,7 +24,8 @@ #include "BLI_math.h" #include "DNA_node_types.h" -EllipseMaskOperation::EllipseMaskOperation(): NodeOperation() { +EllipseMaskOperation::EllipseMaskOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); @@ -33,7 +34,8 @@ EllipseMaskOperation::EllipseMaskOperation(): NodeOperation() { this->cosine = 0.0f; this->sine = 0.0f; } -void EllipseMaskOperation::initExecution() { +void EllipseMaskOperation::initExecution() +{ this->inputMask = this->getInputSocketReader(0); this->inputValue = this->getInputSocketReader(1); const double rad = DEG2RAD(this->data->rotation); @@ -42,7 +44,8 @@ void EllipseMaskOperation::initExecution() { this->aspectRatio = ((float)this->getWidth())/this->getHeight(); } -void EllipseMaskOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void EllipseMaskOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputMask[4]; float inputValue[4]; @@ -112,7 +115,8 @@ void EllipseMaskOperation::executePixel(float* color, float x, float y, PixelSam } -void EllipseMaskOperation::deinitExecution() { +void EllipseMaskOperation::deinitExecution() +{ this->inputMask = NULL; this->inputValue = NULL; } diff --git a/source/blender/compositor/operations/COM_EllipseMaskOperation.h b/source/blender/compositor/operations/COM_EllipseMaskOperation.h index 969013782e6..bff94941190 100644 --- a/source/blender/compositor/operations/COM_EllipseMaskOperation.h +++ b/source/blender/compositor/operations/COM_EllipseMaskOperation.h @@ -45,7 +45,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp index 6194e1d6699..ad8f3b12387 100644 --- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp @@ -24,17 +24,20 @@ #include "MEM_guardedalloc.h" #include "BLI_utildefines.h" -FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation() { +FastGaussianBlurOperation::FastGaussianBlurOperation(): BlurBaseOperation() +{ this->iirgaus = false; } -void FastGaussianBlurOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data) { +void FastGaussianBlurOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ MemoryBuffer *newData = (MemoryBuffer*)data; newData->read(color, x, y); } -bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; rcti sizeInput; sizeInput.xmin = 0; @@ -63,7 +66,8 @@ bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, Re } } -void* FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ MemoryBuffer *newBuf = (MemoryBuffer*)this->inputProgram->initializeTileData(rect, memoryBuffers); MemoryBuffer *copy = newBuf->duplicate(); updateSize(memoryBuffers); @@ -90,12 +94,14 @@ void* FastGaussianBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **m return copy; } -void FastGaussianBlurOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { +void FastGaussianBlurOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) +{ MemoryBuffer *newData = (MemoryBuffer*)data; delete newData; } -void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, int chan, int xy) { +void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, int chan, int xy) +{ double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3]; double *X, *Y, *W; int i, x, y, sz; diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h index 3e1d5416ca7..cf36e7f6ebe 100644 --- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h +++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h @@ -37,7 +37,7 @@ public: void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); void IIR_gauss(MemoryBuffer *src, float sigma, int channel, int xy); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); }; diff --git a/source/blender/compositor/operations/COM_FlipOperation.cpp b/source/blender/compositor/operations/COM_FlipOperation.cpp index 98acb4cfb5d..38018ffc3f7 100644 --- a/source/blender/compositor/operations/COM_FlipOperation.cpp +++ b/source/blender/compositor/operations/COM_FlipOperation.cpp @@ -22,7 +22,8 @@ #include "COM_FlipOperation.h" -FlipOperation::FlipOperation() : NodeOperation() { +FlipOperation::FlipOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->setResolutionInputSocketIndex(0); @@ -30,23 +31,27 @@ FlipOperation::FlipOperation() : NodeOperation() { this->flipX = true; this->flipY = false; } -void FlipOperation::initExecution() { +void FlipOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void FlipOperation::deinitExecution() { +void FlipOperation::deinitExecution() +{ this->inputOperation = NULL; } -void FlipOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void FlipOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float nx = this->flipX?this->getWidth()-1-x:x; float ny = this->flipY?this->getHeight()-1-y:y; this->inputOperation->read(color, nx, ny, sampler, inputBuffers); } -bool FlipOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool FlipOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; if (this->flipX) { diff --git a/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp b/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp index a81597322a0..600bfde64d9 100644 --- a/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp +++ b/source/blender/compositor/operations/COM_FogGlowImageOperation.cpp @@ -23,10 +23,12 @@ #include "COM_FogGlowImageOperation.h" #include "BLI_math.h" -FogGlowImageOperation::FogGlowImageOperation(): NodeOperation() { +FogGlowImageOperation::FogGlowImageOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_COLOR); } -void FogGlowImageOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void FogGlowImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ const float cs_r = 1.f, cs_g = 1.f, cs_b = 1.f; float u, v, w, d, r; @@ -42,7 +44,8 @@ void FogGlowImageOperation::executePixel(float* color, float x, float y, PixelSa color[3] = 1.0f; } -void FogGlowImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void FogGlowImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ resolution[0] = 512; resolution[1] = 512; } diff --git a/source/blender/compositor/operations/COM_FogGlowImageOperation.h b/source/blender/compositor/operations/COM_FogGlowImageOperation.h index f68346eeb8d..d0fc107638e 100644 --- a/source/blender/compositor/operations/COM_FogGlowImageOperation.h +++ b/source/blender/compositor/operations/COM_FogGlowImageOperation.h @@ -32,7 +32,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); }; diff --git a/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp b/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp index c83c5d0ecb6..a4fb20402a4 100644 --- a/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp +++ b/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp @@ -23,16 +23,19 @@ #include "COM_GammaCorrectOperation.h" #include "BLI_math.h" -GammaCorrectOperation::GammaCorrectOperation(): NodeOperation() { +GammaCorrectOperation::GammaCorrectOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; } -void GammaCorrectOperation::initExecution() { +void GammaCorrectOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void GammaCorrectOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void GammaCorrectOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; this->inputProgram->read(inputColor, x, y, sampler, inputBuffers); if (inputColor[3] > 0.0f) { @@ -56,20 +59,24 @@ void GammaCorrectOperation::executePixel(float* color, float x, float y, PixelSa color[3] = inputColor[3]; } -void GammaCorrectOperation::deinitExecution() { +void GammaCorrectOperation::deinitExecution() +{ this->inputProgram = NULL; } -GammaUncorrectOperation::GammaUncorrectOperation(): NodeOperation() { +GammaUncorrectOperation::GammaUncorrectOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; } -void GammaUncorrectOperation::initExecution() { +void GammaUncorrectOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void GammaUncorrectOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void GammaUncorrectOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor[4]; this->inputProgram->read(inputColor, x, y, sampler, inputBuffers); @@ -93,6 +100,7 @@ void GammaUncorrectOperation::executePixel(float* color, float x, float y, Pixel color[3] = inputColor[3]; } -void GammaUncorrectOperation::deinitExecution() { +void GammaUncorrectOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_GammaCorrectOperation.h b/source/blender/compositor/operations/COM_GammaCorrectOperation.h index bcf78f4508a..6132f04edba 100644 --- a/source/blender/compositor/operations/COM_GammaCorrectOperation.h +++ b/source/blender/compositor/operations/COM_GammaCorrectOperation.h @@ -38,7 +38,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution @@ -64,7 +64,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_GammaOperation.cpp b/source/blender/compositor/operations/COM_GammaOperation.cpp index eaa56c2f31a..f0887d4adee 100644 --- a/source/blender/compositor/operations/COM_GammaOperation.cpp +++ b/source/blender/compositor/operations/COM_GammaOperation.cpp @@ -23,19 +23,22 @@ #include "COM_GammaOperation.h" #include "BLI_math.h" -GammaOperation::GammaOperation(): NodeOperation() { +GammaOperation::GammaOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; this->inputGammaProgram = NULL; } -void GammaOperation::initExecution() { +void GammaOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); this->inputGammaProgram = this->getInputSocketReader(1); } -void GammaOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void GammaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; float inputGamma[4]; @@ -50,7 +53,8 @@ void GammaOperation::executePixel(float* color, float x, float y, PixelSampler s color[3] = inputValue[3]; } -void GammaOperation::deinitExecution() { +void GammaOperation::deinitExecution() +{ this->inputProgram = NULL; this->inputGammaProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_GammaOperation.h b/source/blender/compositor/operations/COM_GammaOperation.h index 0fbbf58bad6..2f3d8cdf9f7 100644 --- a/source/blender/compositor/operations/COM_GammaOperation.h +++ b/source/blender/compositor/operations/COM_GammaOperation.h @@ -31,7 +31,7 @@ private: * Cached reference to the inputProgram */ SocketReader * inputProgram; - SocketReader* inputGammaProgram; + SocketReader *inputGammaProgram; public: GammaOperation(); @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp index faadad27a55..af10791590b 100644 --- a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp @@ -27,23 +27,26 @@ extern "C" { #include "RE_pipeline.h" } -GaussianBokehBlurOperation::GaussianBokehBlurOperation(): BlurBaseOperation() { +GaussianBokehBlurOperation::GaussianBokehBlurOperation(): BlurBaseOperation() +{ this->gausstab = NULL; } -void* GaussianBokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *GaussianBokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ updateGauss(memoryBuffers); - void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); return buffer; } -void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { +void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) +{ if (this->gausstab == NULL) { float radxf; float radyf; int n; - float* dgauss; - float* ddgauss; + float *dgauss; + float *ddgauss; float val; int j, i; const float width = this->getWidth(); @@ -52,56 +55,57 @@ void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { radxf = size*(float)this->data->sizex; if (radxf>width/2.0f) - radxf= width/2.0f; + radxf = width/2.0f; else if (radxf<1.0f) - radxf= 1.0f; + radxf = 1.0f; /* vertical */ radyf = size*(float)this->data->sizey; if (radyf>height/2.0f) - radyf= height/2.0f; + radyf = height/2.0f; else if (radyf<1.0f) - radyf= 1.0f; + radyf = 1.0f; - radx= ceil(radxf); - rady= ceil(radyf); + radx = ceil(radxf); + rady = ceil(radyf); n = (2*radx+1)*(2*rady+1); /* create a full filter image */ - ddgauss= new float[n]; - dgauss= ddgauss; - val= 0.0f; + ddgauss = new float[n]; + dgauss = ddgauss; + val = 0.0f; for (j=-rady; j<=rady; j++) { for (i=-radx; i<=radx; i++, dgauss++) { - float fj= (float)j/radyf; - float fi= (float)i/radxf; - float dist= sqrt(fj*fj + fi*fi); - *dgauss= RE_filter_value(this->data->filtertype, dist); + float fj = (float)j / radyf; + float fi = (float)i / radxf; + float dist = sqrt(fj * fj + fi * fi); + *dgauss = RE_filter_value(this->data->filtertype, dist); val+= *dgauss; } } if (val!=0.0f) { - val= 1.0f/val; - for (j= n -1; j>=0; j--) + val = 1.0f/val; + for (j = n - 1; j>=0; j--) ddgauss[j]*= val; } - else ddgauss[4]= 1.0f; + else ddgauss[4] = 1.0f; gausstab = ddgauss; } } -void GaussianBokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void GaussianBokehBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float tempColor[4]; tempColor[0] = 0; tempColor[1] = 0; tempColor[2] = 0; tempColor[3] = 0; float overallmultiplyer = 0; - MemoryBuffer* inputBuffer = (MemoryBuffer*)data; - float* buffer = inputBuffer->getBuffer(); + MemoryBuffer *inputBuffer = (MemoryBuffer*)data; + float *buffer = inputBuffer->getBuffer(); int bufferwidth = inputBuffer->getWidth(); int bufferstartx = inputBuffer->getRect()->xmin; int bufferstarty = inputBuffer->getRect()->ymin; @@ -138,13 +142,15 @@ void GaussianBokehBlurOperation::executePixel(float* color, int x, int y, Memory color[3] = tempColor[3]*divider; } -void GaussianBokehBlurOperation::deinitExecution() { +void GaussianBokehBlurOperation::deinitExecution() +{ BlurBaseOperation::deinitExecution(); delete this->gausstab; this->gausstab = NULL; } -bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; rcti sizeInput; sizeInput.xmin = 0; diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h index 806f77fd375..a7a0ee74364 100644 --- a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h @@ -28,18 +28,18 @@ class GaussianBokehBlurOperation : public BlurBaseOperation { private: - float* gausstab; + float *gausstab; int radx, rady; void updateGauss(MemoryBuffer **memoryBuffers); public: GaussianBokehBlurOperation(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Deinitialize the execution diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index 7ac8fcb2d64..276efd90740 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -27,40 +27,43 @@ extern "C" { #include "RE_pipeline.h" } -GaussianXBlurOperation::GaussianXBlurOperation(): BlurBaseOperation() { +GaussianXBlurOperation::GaussianXBlurOperation(): BlurBaseOperation() +{ this->gausstab = NULL; this->rad = 0; } -void* GaussianXBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *GaussianXBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ updateGauss(memoryBuffers); - void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); return buffer; } -void GaussianXBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { +void GaussianXBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) +{ if (this->gausstab == NULL) { updateSize(memoryBuffers); float rad = size*this->data->sizex; if (rad<1) - rad= 1; + rad = 1; this->rad = rad; this->gausstab = BlurBaseOperation::make_gausstab(rad); } } -void GaussianXBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data) { - +void GaussianXBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float tempColor[4]; tempColor[0] = 0; tempColor[1] = 0; tempColor[2] = 0; tempColor[3] = 0; float overallmultiplyer = 0; - MemoryBuffer* inputBuffer = (MemoryBuffer*)data; - float* buffer = inputBuffer->getBuffer(); + MemoryBuffer *inputBuffer = (MemoryBuffer*)data; + float *buffer = inputBuffer->getBuffer(); int bufferwidth = inputBuffer->getWidth(); int bufferstartx = inputBuffer->getRect()->xmin; int bufferstarty = inputBuffer->getRect()->ymin; @@ -94,13 +97,15 @@ void GaussianXBlurOperation::executePixel(float* color, int x, int y, MemoryBuff color[3] = tempColor[3]*divider; } -void GaussianXBlurOperation::deinitExecution() { +void GaussianXBlurOperation::deinitExecution() +{ BlurBaseOperation::deinitExecution(); delete this->gausstab; this->gausstab = NULL; } -bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; rcti sizeInput; sizeInput.xmin = 0; diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h index 6b6eb4d80f9..704d063d28f 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h @@ -27,7 +27,7 @@ class GaussianXBlurOperation : public BlurBaseOperation { private: - float* gausstab; + float *gausstab; int rad; void updateGauss(MemoryBuffer **memoryBuffers); public: @@ -36,14 +36,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Deinitialize the execution */ void deinitExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); }; #endif diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 2218334bec8..faef152dc31 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -27,39 +27,42 @@ extern "C" { #include "RE_pipeline.h" } -GaussianYBlurOperation::GaussianYBlurOperation(): BlurBaseOperation() { +GaussianYBlurOperation::GaussianYBlurOperation(): BlurBaseOperation() +{ this->gausstab = NULL; this->rad = 0; } -void* GaussianYBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *GaussianYBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ updateGauss(memoryBuffers); - void* buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); + void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers); return buffer; } -void GaussianYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) { +void GaussianYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) +{ if (this->gausstab == NULL) { updateSize(memoryBuffers); float rad = size*this->data->sizey; if (rad<1) - rad= 1; + rad = 1; this->rad = rad; this->gausstab = BlurBaseOperation::make_gausstab(rad); } } -void GaussianYBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data) { - +void GaussianYBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float tempColor[4]; tempColor[0] = 0; tempColor[1] = 0; tempColor[2] = 0; tempColor[3] = 0; float overallmultiplyer = 0; - MemoryBuffer* inputBuffer = (MemoryBuffer*)data; - float* buffer = inputBuffer->getBuffer(); + MemoryBuffer *inputBuffer = (MemoryBuffer*)data; + float *buffer = inputBuffer->getBuffer(); int bufferwidth = inputBuffer->getWidth(); int bufferstartx = inputBuffer->getRect()->xmin; int bufferstarty = inputBuffer->getRect()->ymin; @@ -91,13 +94,15 @@ void GaussianYBlurOperation::executePixel(float* color, int x, int y, MemoryBuff color[3] = tempColor[3]*divider; } -void GaussianYBlurOperation::deinitExecution() { +void GaussianYBlurOperation::deinitExecution() +{ BlurBaseOperation::deinitExecution(); delete this->gausstab; this->gausstab = NULL; } -bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; rcti sizeInput; sizeInput.xmin = 0; diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h index 5c116e80a71..c9baf27b1d6 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h @@ -27,7 +27,7 @@ class GaussianYBlurOperation : public BlurBaseOperation { private: - float* gausstab; + float *gausstab; int rad; void updateGauss(MemoryBuffer **memoryBuffers); public: @@ -36,14 +36,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void *data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Deinitialize the execution */ void deinitExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); }; #endif diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp index b86c61ea9da..6715d50bb95 100644 --- a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp @@ -23,21 +23,24 @@ #include "COM_GlareBaseOperation.h" #include "BLI_math.h" -GlareBaseOperation::GlareBaseOperation(): NodeOperation() { +GlareBaseOperation::GlareBaseOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->settings = NULL; this->cachedInstance = NULL; setComplex(true); } -void GlareBaseOperation::initExecution() { +void GlareBaseOperation::initExecution() +{ initMutex(); this->inputProgram = getInputSocketReader(0); this->cachedInstance = NULL; } -void GlareBaseOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { - float* buffer = (float*) data; +void GlareBaseOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)\ +{ + float *buffer = (float*) data; int index = (y*this->getWidth() + x) * COM_NUMBER_OF_CHANNELS; color[0] = buffer[index]; color[1] = buffer[index+1]; @@ -45,7 +48,8 @@ void GlareBaseOperation::executePixel(float* color, int x, int y, MemoryBuffer * color[3] = buffer[index+3]; } -void GlareBaseOperation::deinitExecution() { +void GlareBaseOperation::deinitExecution() +{ deinitMutex(); this->inputProgram = NULL; if (this->cachedInstance) { @@ -53,11 +57,12 @@ void GlareBaseOperation::deinitExecution() { this->cachedInstance = NULL; } } -void* GlareBaseOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *GlareBaseOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ BLI_mutex_lock(getMutex()); if (this->cachedInstance == NULL) { - MemoryBuffer* tile = (MemoryBuffer*)inputProgram->initializeTileData(rect, memoryBuffers); - float* data = new float[this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS]; + MemoryBuffer *tile = (MemoryBuffer*)inputProgram->initializeTileData(rect, memoryBuffers); + float *data = new float[this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS]; this->generateGlare(data, tile, this->settings); this->cachedInstance = data; } @@ -65,7 +70,8 @@ void* GlareBaseOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBu return this->cachedInstance; } -bool GlareBaseOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool GlareBaseOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = this->getWidth(); newInput.xmin = 0; diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.h b/source/blender/compositor/operations/COM_GlareBaseOperation.h index 4233e6150a2..e06244d3cdd 100644 --- a/source/blender/compositor/operations/COM_GlareBaseOperation.h +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.h @@ -37,14 +37,14 @@ private: */ NodeGlare * settings; - float* cachedInstance; + float *cachedInstance; public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution @@ -56,14 +56,14 @@ public: */ void deinitExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void setGlareSettings(NodeGlare * settings) {this->settings = settings;} bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); protected: GlareBaseOperation(); - virtual void generateGlare(float* data, MemoryBuffer* inputTile, NodeGlare* settings) = 0; + virtual void generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) = 0; }; diff --git a/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp b/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp index ce3fd82acf0..602e18521ee 100644 --- a/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareSimpleStarOperation.cpp @@ -22,14 +22,15 @@ #include "COM_GlareSimpleStarOperation.h" -void GlareSimpleStarOperation::generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) { +void GlareSimpleStarOperation::generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) +{ int i, x, y, ym, yp, xm, xp; float c[4] = {0,0,0,0}, tc[4] = {0,0,0,0}; const float f1 = 1.f - settings->fade, f2 = (1.f - f1)*0.5f; - MemoryBuffer* tbuf1 = inputTile->duplicate(); - MemoryBuffer* tbuf2 = inputTile->duplicate(); + MemoryBuffer *tbuf1 = inputTile->duplicate(); + MemoryBuffer *tbuf2 = inputTile->duplicate(); for (i=0; iiter; i++) { // // (x || x-1, y-1) to (x || x+1, y+1) diff --git a/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp b/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp index 177bb6e0730..42b6a2b5e50 100644 --- a/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareStreaksOperation.cpp @@ -23,7 +23,8 @@ #include "COM_GlareStreaksOperation.h" #include "BLI_math.h" -void GlareStreaksOperation::generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) { +void GlareStreaksOperation::generateGlare(float *data, MemoryBuffer *inputTile, NodeGlare *settings) +{ int x, y, n; unsigned int nump=0; float c1[4], c2[4], c3[4], c4[4]; @@ -33,8 +34,8 @@ void GlareStreaksOperation::generateGlare(float *data, MemoryBuffer *inputTile, int size4 = size*4; - MemoryBuffer* tsrc = inputTile->duplicate(); - MemoryBuffer* tdst = new MemoryBuffer(NULL, inputTile->getRect()); + MemoryBuffer *tsrc = inputTile->duplicate(); + MemoryBuffer *tdst = new MemoryBuffer(NULL, inputTile->getRect()); tdst->clear(); memset(data, 0, size4*sizeof(float)); @@ -46,7 +47,7 @@ void GlareStreaksOperation::generateGlare(float *data, MemoryBuffer *inputTile, const float vxp = vx*p4, vyp = vy*p4; const float wt = pow((double)settings->fade, (double)p4); const float cmo = 1.f - (float)pow((double)settings->colmod, (double)n+1); // colormodulation amount relative to current pass - float* tdstcol = tdst->getBuffer(); + float *tdstcol = tdst->getBuffer(); for (y=0; ygetHeight(); ++y) { for (x=0; xgetWidth(); ++x, tdstcol+=4) { // first pass no offset, always same for every pass, exact copy, @@ -75,7 +76,7 @@ void GlareStreaksOperation::generateGlare(float *data, MemoryBuffer *inputTile, } // addImage(sbuf, tsrc, 1.f/(float)(6 - ndg->iter)); // add result to data @todo - float* sourcebuffer = tsrc->getBuffer(); + float *sourcebuffer = tsrc->getBuffer(); float factor = 1.f/(float)(6 - settings->iter); for (int i = 0 ; i < size4; i ++) { data[i] += sourcebuffer[i] * factor; diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp b/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp index cc8bda2730e..e8def72b7da 100644 --- a/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp @@ -23,16 +23,19 @@ #include "COM_GlareThresholdOperation.h" #include "BLI_math.h" -GlareThresholdOperation::GlareThresholdOperation(): NodeOperation() { +GlareThresholdOperation::GlareThresholdOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; } -void GlareThresholdOperation::initExecution() { +void GlareThresholdOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void GlareThresholdOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void GlareThresholdOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ this->inputProgram->read(color, x, y, sampler, inputBuffers); if ((0.212671f*color[0] + 0.71516f*color[1] + 0.072169f*color[2]) >= threshold) { color[0] -= threshold, color[1] -= threshold, color[2] -= threshold; @@ -43,6 +46,7 @@ void GlareThresholdOperation::executePixel(float* color, float x, float y, Pixel else color[0] = color[1] = color[2] = 0.f; } -void GlareThresholdOperation::deinitExecution() { +void GlareThresholdOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.h b/source/blender/compositor/operations/COM_GlareThresholdOperation.h index 3d68181ae47..3dfa2f44339 100644 --- a/source/blender/compositor/operations/COM_GlareThresholdOperation.h +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.h @@ -40,7 +40,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp index d5d577e91a9..2970c396493 100644 --- a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp +++ b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.cpp @@ -32,18 +32,21 @@ extern "C" { } #endif -HueSaturationValueCorrectOperation::HueSaturationValueCorrectOperation(): CurveBaseOperation() { +HueSaturationValueCorrectOperation::HueSaturationValueCorrectOperation(): CurveBaseOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; } -void HueSaturationValueCorrectOperation::initExecution() { +void HueSaturationValueCorrectOperation::initExecution() +{ CurveBaseOperation::initExecution(); this->inputProgram = this->getInputSocketReader(0); } -void HueSaturationValueCorrectOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void HueSaturationValueCorrectOperation::executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float hsv[4], f; this->inputProgram->read(hsv, x, y, sampler, inputBuffers); @@ -63,12 +66,13 @@ void HueSaturationValueCorrectOperation::executePixel(float* output, float x, fl hsv[0] = hsv[0] - floor(hsv[0]); /* mod 1.0 */ CLAMP(hsv[1], 0.f, 1.f); - output[0]= hsv[0]; - output[1]= hsv[1]; - output[2]= hsv[2]; - output[3]= hsv[3]; + output[0] = hsv[0]; + output[1] = hsv[1]; + output[2] = hsv[2]; + output[3] = hsv[3]; } -void HueSaturationValueCorrectOperation::deinitExecution() { +void HueSaturationValueCorrectOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h index 472a85f5531..860bb71a0f1 100644 --- a/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h +++ b/source/blender/compositor/operations/COM_HueSaturationValueCorrectOperation.h @@ -37,7 +37,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* Vector, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *Vector, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_IDMaskOperation.cpp b/source/blender/compositor/operations/COM_IDMaskOperation.cpp index 198248e35a3..834ca4fc5ed 100644 --- a/source/blender/compositor/operations/COM_IDMaskOperation.cpp +++ b/source/blender/compositor/operations/COM_IDMaskOperation.cpp @@ -22,16 +22,19 @@ #include "COM_IDMaskOperation.h" -IDMaskOperation::IDMaskOperation(): NodeOperation() { +IDMaskOperation::IDMaskOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->inputProgram = NULL; } -void IDMaskOperation::initExecution() { +void IDMaskOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void IDMaskOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void IDMaskOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; this->inputProgram->read(inputValue, x, y, sampler, inputBuffers); @@ -39,7 +42,8 @@ void IDMaskOperation::executePixel(float* color, float x, float y, PixelSampler color[0] = a; } -void IDMaskOperation::deinitExecution() { +void IDMaskOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_IDMaskOperation.h b/source/blender/compositor/operations/COM_IDMaskOperation.h index 3b22be16d8a..9f897c53d18 100644 --- a/source/blender/compositor/operations/COM_IDMaskOperation.h +++ b/source/blender/compositor/operations/COM_IDMaskOperation.h @@ -30,7 +30,7 @@ private: /** * Cached reference to the inputProgram */ - SocketReader* inputProgram; + SocketReader *inputProgram; float objectIndex; public: @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ImageOperation.cpp b/source/blender/compositor/operations/COM_ImageOperation.cpp index f4cea24cb20..be3d9e80337 100644 --- a/source/blender/compositor/operations/COM_ImageOperation.cpp +++ b/source/blender/compositor/operations/COM_ImageOperation.cpp @@ -36,7 +36,8 @@ extern "C" { #include "IMB_imbuf_types.h" } -BaseImageOperation::BaseImageOperation(): NodeOperation() { +BaseImageOperation::BaseImageOperation(): NodeOperation() +{ this->image = NULL; this->buffer = NULL; this->imageBuffer = NULL; @@ -47,20 +48,24 @@ BaseImageOperation::BaseImageOperation(): NodeOperation() { this->depthBuffer = NULL; this->numberOfChannels = 0; } -ImageOperation::ImageOperation(): BaseImageOperation() { +ImageOperation::ImageOperation(): BaseImageOperation() +{ this->addOutputSocket(COM_DT_COLOR); } -ImageAlphaOperation::ImageAlphaOperation(): BaseImageOperation() { +ImageAlphaOperation::ImageAlphaOperation(): BaseImageOperation() +{ this->addOutputSocket(COM_DT_VALUE); } -ImageDepthOperation::ImageDepthOperation(): BaseImageOperation() { +ImageDepthOperation::ImageDepthOperation(): BaseImageOperation() +{ this->addOutputSocket(COM_DT_VALUE); } -ImBuf* BaseImageOperation::getImBuf() { +ImBuf *BaseImageOperation::getImBuf() +{ ImBuf *ibuf; - ibuf= BKE_image_get_ibuf(this->image, this->imageUser); + ibuf = BKE_image_get_ibuf(this->image, this->imageUser); if (ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) { return NULL; } @@ -72,8 +77,9 @@ ImBuf* BaseImageOperation::getImBuf() { } -void BaseImageOperation::initExecution() { - ImBuf *stackbuf= getImBuf(); +void BaseImageOperation::initExecution() +{ + ImBuf *stackbuf = getImBuf(); this->buffer = stackbuf; if (stackbuf) { this->imageBuffer = stackbuf->rect_float; @@ -84,19 +90,22 @@ void BaseImageOperation::initExecution() { } } -void BaseImageOperation::deinitExecution() { - this->imageBuffer= NULL; +void BaseImageOperation::deinitExecution() +{ + this->imageBuffer = NULL; } -void BaseImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { - ImBuf *stackbuf= getImBuf(); +void BaseImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ + ImBuf *stackbuf = getImBuf(); if (stackbuf) { resolution[0] = stackbuf->x; resolution[1] = stackbuf->y; } } -void ImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])\ +{ if (this->imageBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { color[0] = 0.0f; color[1] = 0.0f; @@ -118,7 +127,8 @@ void ImageOperation::executePixel(float *color, float x, float y, PixelSampler s } } -void ImageAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ImageAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float tempcolor[4]; if (this->imageBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { @@ -141,7 +151,8 @@ void ImageAlphaOperation::executePixel(float *color, float x, float y, PixelSamp } } -void ImageDepthOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ImageDepthOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ if (this->depthBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { color[0] = 0.0f; } diff --git a/source/blender/compositor/operations/COM_ImageOperation.h b/source/blender/compositor/operations/COM_ImageOperation.h index a5e2c753b59..0bd112304a8 100644 --- a/source/blender/compositor/operations/COM_ImageOperation.h +++ b/source/blender/compositor/operations/COM_ImageOperation.h @@ -40,9 +40,9 @@ extern "C" { */ class BaseImageOperation : public NodeOperation { protected: - ImBuf* buffer; - Image* image; - ImageUser* imageUser; + ImBuf *buffer; + Image *image; + ImageUser *imageUser; float *imageBuffer; float *depthBuffer; int imageheight; @@ -56,14 +56,14 @@ protected: */ void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); - virtual ImBuf* getImBuf(); + virtual ImBuf *getImBuf(); public: void initExecution(); void deinitExecution(); - void setImage(Image* image) {this->image = image;} - void setImageUser(ImageUser* imageuser) {this->imageUser = imageuser;} + void setImage(Image *image) {this->image = image;} + void setImageUser(ImageUser *imageuser) {this->imageUser = imageuser;} void setFramenumber(int framenumber) {this->framenumber = framenumber;} }; diff --git a/source/blender/compositor/operations/COM_InvertOperation.cpp b/source/blender/compositor/operations/COM_InvertOperation.cpp index baf8699603c..982fe1a5450 100644 --- a/source/blender/compositor/operations/COM_InvertOperation.cpp +++ b/source/blender/compositor/operations/COM_InvertOperation.cpp @@ -22,7 +22,8 @@ #include "COM_InvertOperation.h" -InvertOperation::InvertOperation(): NodeOperation() { +InvertOperation::InvertOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); @@ -32,12 +33,14 @@ InvertOperation::InvertOperation(): NodeOperation() { this->alpha = false; setResolutionInputSocketIndex(1); } -void InvertOperation::initExecution() { +void InvertOperation::initExecution() +{ this->inputValueProgram = this->getInputSocketReader(0); this->inputColorProgram = this->getInputSocketReader(1); } -void InvertOperation::executePixel(float* out, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void InvertOperation::executePixel(float *out, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue[4]; float inputColor[4]; this->inputValueProgram->read(inputValue, x, y, sampler, inputBuffers); @@ -64,7 +67,8 @@ void InvertOperation::executePixel(float* out, float x, float y, PixelSampler sa } -void InvertOperation::deinitExecution() { +void InvertOperation::deinitExecution() +{ this->inputValueProgram = NULL; this->inputColorProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_InvertOperation.h b/source/blender/compositor/operations/COM_InvertOperation.h index 6baa10a3d62..27a995238c7 100644 --- a/source/blender/compositor/operations/COM_InvertOperation.h +++ b/source/blender/compositor/operations/COM_InvertOperation.h @@ -42,7 +42,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp index 89387675090..e99bbb536f7 100644 --- a/source/blender/compositor/operations/COM_LensGhostOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp @@ -33,7 +33,7 @@ public: double wavelength; float intensity; bool valid; - void copyFrom(Ray* other) { + void copyFrom(Ray *other) { copy_v3_v3(position, other->position); copy_v3_v3(direction, other->direction); copy_v2_v2(uv, other->uv); @@ -62,7 +62,7 @@ public: double refraction3; float thicknessCoathing; virtual bool isFlat() = 0; - virtual void intersect(Intersection* result, Ray* ray) = 0; + virtual void intersect(Intersection *result, Ray *ray) = 0; }; class FlatInterface: public LensInterface { @@ -80,7 +80,7 @@ public: this->thicknessCoathing = 0.0f; } - void intersect(Intersection* result, Ray* ray) { + void intersect(Intersection *result, Ray *ray) { const float dz = this->position[2]-ray->position[2]; result->position[0] = ray->position[0] + ray->direction[0]*(dz)/ray->direction[2]; result->position[1] = ray->position[1] + ray->direction[1]*(dz)/ray->direction[2]; @@ -110,7 +110,7 @@ public: this->thicknessCoathing = coatingPhase/4/this->refraction2; } bool isFlat() {return false;} - void intersect(Intersection* result, Ray* ray) { + void intersect(Intersection *result, Ray *ray) { float delta[3] ={ray->position[0] - this->position[0], ray->position[1] - this->position[1], ray->position[2] - this->position[2]}; @@ -200,7 +200,7 @@ public: } - RayResult* getRayResult(int x, int y) { + RayResult *getRayResult(int x, int y) { return &(raster[x+y*rasterLength]); } }; @@ -222,7 +222,7 @@ public: for (int j = i+1; j < interfaces.size()-1 ; j ++) { if (!interfaces[j]->isFlat()) { int length = interfaces.size()+2*(j-i); - Bounce* bounce = new Bounce(interfaces[j], interfaces[i], length, step); + Bounce *bounce = new Bounce(interfaces[j], interfaces[i], length, step); bounces.push_back(bounce); } } @@ -231,7 +231,7 @@ public: } - void addInterface(LensInterface* pinterface) { + void addInterface(LensInterface *pinterface) { this->interfaces.push_back(pinterface); this->lensIndex = this->interfaces.size()-1; } @@ -245,23 +245,23 @@ public: // VECCOPY(refract, view); -// dot= view[0]*n[0] + view[1]*n[1] + view[2]*n[2]; +// dot = view[0]*n[0] + view[1]*n[1] + view[2]*n[2]; // if (dot>0.0f) { // index = 1.0f/index; -// fac= 1.0f - (1.0f - dot*dot)*index*index; +// fac = 1.0f - (1.0f - dot*dot)*index*index; // if (fac<= 0.0f) return 0; // fac= -dot*index + sqrt(fac); // } // else { -// fac= 1.0f - (1.0f - dot*dot)*index*index; +// fac = 1.0f - (1.0f - dot*dot)*index*index; // if (fac<= 0.0f) return 0; // fac= -dot*index - sqrt(fac); // } -// refract[0]= index*view[0] + fac*n[0]; -// refract[1]= index*view[1] + fac*n[1]; -// refract[2]= index*view[2] + fac*n[2]; +// refract[0] = index*view[0] + fac*n[0]; +// refract[1] = index*view[1] + fac*n[1]; +// refract[2] = index*view[2] + fac*n[2]; // normalize_v3(refract); // return 1; @@ -301,9 +301,9 @@ public: f1= -2.0f*dot_v3v3(n, view); - ref[0]= (view[0]+f1*n[0]); - ref[1]= (view[1]+f1*n[1]); - ref[2]= (view[2]+f1*n[2]); + ref[0] = (view[0]+f1*n[0]); + ref[1] = (view[1]+f1*n[1]); + ref[2] = (view[2]+f1*n[2]); normalize_v3(ref); } @@ -334,15 +334,15 @@ public: return ( out_s2+out_p2 ) / 2 ; } - void detectHit(Ray* result, Ray* inputRay, Bounce *bounce) { + void detectHit(Ray *result, Ray *inputRay, Bounce *bounce) { int phase = 0; int delta = 1; int t = 1; int k; result->copyFrom(inputRay); result->valid = false; - LensInterface* next = bounce->interface1; - LensInterface* f = NULL; + LensInterface *next = bounce->interface1; + LensInterface *f = NULL; Intersection intersection; for (k = 0 ; k < bounce->length-1;k++, t+=delta) { f = this->interfaces[t]; @@ -425,12 +425,13 @@ public: }; typedef struct LensFace { - RayResult* v1; - RayResult* v2; - RayResult* v3; + RayResult *v1; + RayResult *v2; + RayResult *v3; } LensFace; -LensGhostProjectionOperation::LensGhostProjectionOperation(): NodeOperation() { +LensGhostProjectionOperation::LensGhostProjectionOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->addOutputSocket(COM_DT_COLOR); @@ -441,12 +442,14 @@ LensGhostProjectionOperation::LensGhostProjectionOperation(): NodeOperation() { this->setComplex(false); } -LensGhostOperation::LensGhostOperation(): LensGhostProjectionOperation() { +LensGhostOperation::LensGhostOperation(): LensGhostProjectionOperation() +{ this->setComplex(true); } -void LensGhostProjectionOperation::initExecution() { +void LensGhostProjectionOperation::initExecution() +{ if (this->cameraObject != NULL && this->lampObject != NULL) { if (lampObject == NULL || cameraObject == NULL) { visualLampPosition[0] = 0; @@ -491,7 +494,7 @@ void LensGhostProjectionOperation::initExecution() { system->addInterface(new SphereInterface(0.0f,0.0f, 6 CM, 3 CM, 2 CM, AIR, GLASS, 0.0f)); system->addInterface(new SphereInterface(0.0f,0.0f, 5.5 CM, 3 CM, 2 CM, GLASS, AIR, 0.f)); system->addInterface(new FlatInterface(0.0f,0.0f,0 CM, 30 MM)); // SENSOR - system->bokehIndex =3; + system->bokehIndex = 3; // determine interfaces // LensSystem *system = new LensSystem(); @@ -510,7 +513,8 @@ void LensGhostProjectionOperation::initExecution() { this->system = system; } -void LensGhostOperation::initExecution() { +void LensGhostOperation::initExecution() +{ LensGhostProjectionOperation::initExecution(); LensSystem *system = (LensSystem*)this->system; LensInterface *interface1 = system->interfaces[0]; @@ -521,7 +525,7 @@ void LensGhostOperation::initExecution() { float wavelength = HERZ[iw]; // for every bounce for (int ib = 0 ; ib < system->bounces.size() ; ib++) { - Bounce* bounce = system->bounces[ib]; + Bounce *bounce = system->bounces[ib]; // based on quality setting the number of iteration will be different (128^2, 64^2, 32^2) for (int xi = 0 ; xi < step ; xi ++) { float x = -interface1->radius+xi*(interface1->radius*2/step); @@ -572,11 +576,11 @@ void LensGhostOperation::initExecution() { // LensSystem *system = (LensSystem*)this->system; LensInterface * lens = system->interfaces[system->lensIndex]; for (int i = 0 ; i < system->bounces.size() ; i ++) { - Bounce* bounce = system->bounces[i]; + Bounce *bounce = system->bounces[i]; for (int r = 0 ; r < bounce->rasterLength*bounce->rasterLength ; r ++) { RayResult *result = &bounce->raster[r]; // if (result->valid) { - float ru= result->x/lens->nominalRadius*width2+width2; + float ru = result->x/lens->nominalRadius*width2+width2; float rv = result->y/lens->nominalRadius*height2+height2; result->screenX = ru; result->screenY = rv; @@ -586,7 +590,8 @@ void LensGhostOperation::initExecution() { } } -void* LensGhostOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *LensGhostOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ vector* result = new vector(); LensSystem *system = (LensSystem*)this->system; const float minx = rect->xmin; @@ -594,22 +599,22 @@ void* LensGhostOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBu const float maxx = rect->xmax; const float maxy = rect->ymax; for (int i = 0 ; i < system->bounces.size() ; i ++) { - Bounce* bounce = system->bounces[i]; + Bounce *bounce = system->bounces[i]; int faceX, faceY; for (faceX = 0 ; faceX < bounce->rasterLength-1 ; faceX++) { for (faceY = 0 ; faceY < bounce->rasterLength-1 ; faceY++) { - RayResult* vertex1 = bounce->getRayResult(faceX, faceY); - RayResult* vertex2 = bounce->getRayResult(faceX+1, faceY); - RayResult* vertex3 = bounce->getRayResult(faceX+1, faceY+1); - RayResult* vertex4 = bounce->getRayResult(faceX, faceY+1); + RayResult *vertex1 = bounce->getRayResult(faceX, faceY); + RayResult *vertex2 = bounce->getRayResult(faceX+1, faceY); + RayResult *vertex3 = bounce->getRayResult(faceX+1, faceY+1); + RayResult *vertex4 = bounce->getRayResult(faceX, faceY+1); // early hit test if (!((vertex1->screenX < minx && vertex2->screenX < minx && vertex3->screenX < minx && vertex4->screenX < minx) || (vertex1->screenX > maxx && vertex2->screenX > maxx && vertex3->screenX > maxx && vertex4->screenX > maxx) || (vertex1->screenY < miny && vertex2->screenY < miny && vertex3->screenY < miny && vertex4->screenY < miny) || (vertex1->screenY > maxy && vertex2->screenY > maxy && vertex3->screenY > maxy && vertex4->screenY > maxy))) { - int number = vertex1->hasIntensity +vertex2->hasIntensity +vertex3->hasIntensity +vertex4->hasIntensity; + int number = vertex1->hasIntensity + vertex2->hasIntensity + vertex3->hasIntensity + vertex4->hasIntensity; if (number == 4) { - LensFace* face = new LensFace(); + LensFace *face = new LensFace(); face->v1 = vertex1; face->v2 = vertex2; face->v3 = vertex3; @@ -652,7 +657,8 @@ void* LensGhostOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBu return result; } -void LensGhostOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { +void LensGhostOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) +{ if (data) { vector* faces = (vector*)data; while (faces->size() != 0) { @@ -665,7 +671,8 @@ void LensGhostOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryB } -void LensGhostProjectionOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void LensGhostProjectionOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float bokeh[4]; LensSystem *system = (LensSystem*)this->system; LensInterface *interface1 = system->interfaces[0]; @@ -696,7 +703,7 @@ void LensGhostProjectionOperation::executePixel(float* color, float x, float y, // for every bounce for (int ib = 0 ; ib < system->bounces.size() ; ib++) { - Bounce* bounce = system->bounces[ib]; + Bounce *bounce = system->bounces[ib]; // based on quality setting the number of iteration will be different (128^2, 64^2, 32^2) Ray r; @@ -732,7 +739,8 @@ void LensGhostProjectionOperation::executePixel(float* color, float x, float y, -void LensGhostOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void LensGhostOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ vector* faces = (vector*)data; #if 0 /* UNUSED */ const float bokehWidth = bokehReader->getWidth(); @@ -747,9 +755,9 @@ void LensGhostOperation::executePixel(float* color, int x, int y, MemoryBuffer * unsigned int index; for (index = 0 ; index < faces->size() ; index ++) { LensFace * face = faces->operator [](index); - RayResult* vertex1 = face->v1; - RayResult* vertex2 = face->v2; - RayResult* vertex3 = face->v3; + RayResult *vertex1 = face->v1; + RayResult *vertex2 = face->v2; + RayResult *vertex3 = face->v3; if (!((vertex1->screenX < x && vertex2->screenX < x && vertex3->screenX < x) || (vertex1->screenX > x && vertex2->screenX > x && vertex3->screenX > x) || (vertex1->screenY < y && vertex2->screenY < y && vertex3->screenY < y) || @@ -783,13 +791,15 @@ void LensGhostOperation::executePixel(float* color, int x, int y, MemoryBuffer * } -void LensGhostProjectionOperation::deinitExecution() { +void LensGhostProjectionOperation::deinitExecution() +{ if (this->system) delete (LensSystem*)this->system; this->system = NULL; this->bokehReader = NULL; } -bool LensGhostProjectionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool LensGhostProjectionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti bokehInput; NodeOperation *operation = this->getInputOperation(1); diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.h b/source/blender/compositor/operations/COM_LensGhostOperation.h index 396f681e797..5546ce96fd1 100644 --- a/source/blender/compositor/operations/COM_LensGhostOperation.h +++ b/source/blender/compositor/operations/COM_LensGhostOperation.h @@ -29,11 +29,11 @@ class LensGhostProjectionOperation : public NodeOperation { protected: - Object* lampObject; - Lamp* lamp; - Object* cameraObject; + Object *lampObject; + Lamp *lamp; + Object *cameraObject; - void* system; + void *system; float visualLampPosition[3]; CompositorQuality quality; int step; @@ -45,7 +45,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution @@ -58,8 +58,8 @@ public: void deinitExecution(); bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); - void setLampObject(Object* lampObject) {this->lampObject = lampObject;} - void setCameraObject(Object* cameraObject) {this->cameraObject = cameraObject;} + void setLampObject(Object *lampObject) {this->lampObject = lampObject;} + void setCameraObject(Object *cameraObject) {this->cameraObject = cameraObject;} void setQuality(CompositorQuality quality) {this->quality = quality;} }; @@ -68,12 +68,12 @@ class LensGhostOperation : public LensGhostProjectionOperation { public: LensGhostOperation(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); /** * Initialize the execution */ diff --git a/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp b/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp index 935844a84f1..ee0a02e5fae 100644 --- a/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGlowImageOperation.cpp @@ -23,13 +23,16 @@ #include "COM_LensGlowImageOperation.h" #include "BLI_math.h" -LensGlowImageOperation::LensGlowImageOperation(): NodeOperation() { +LensGlowImageOperation::LensGlowImageOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_COLOR); } -void LensGlowImageOperation::initExecution() { +void LensGlowImageOperation::initExecution() +{ this->scale = 1/20000.0f; } -void LensGlowImageOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void LensGlowImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ const float cs_r = 1.f, cs_g = 1.f, cs_b = 1.f; const float v = 2.f*(y / (float)512.0f) - 1.f; const float u = 2.f*(x / (float)512.0f) - 1.f; @@ -42,10 +45,12 @@ void LensGlowImageOperation::executePixel(float* color, float x, float y, PixelS color[3] = 1.0f; } -void LensGlowImageOperation::deinitExecution() { +void LensGlowImageOperation::deinitExecution() +{ } -void LensGlowImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void LensGlowImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ resolution[0] = 512; resolution[1] = 512; } diff --git a/source/blender/compositor/operations/COM_LensGlowImageOperation.h b/source/blender/compositor/operations/COM_LensGlowImageOperation.h index 2943f8957a6..424b4d4fc3d 100644 --- a/source/blender/compositor/operations/COM_LensGlowImageOperation.h +++ b/source/blender/compositor/operations/COM_LensGlowImageOperation.h @@ -35,7 +35,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_LensGlowOperation.cpp b/source/blender/compositor/operations/COM_LensGlowOperation.cpp index ecaef52d8e1..492dc715f10 100644 --- a/source/blender/compositor/operations/COM_LensGlowOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGlowOperation.cpp @@ -23,17 +23,20 @@ #include "COM_LensGlowOperation.h" #include "BLI_math.h" -LensGlowOperation::LensGlowOperation(): NodeOperation() { +LensGlowOperation::LensGlowOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->inputProgram = NULL; this->lamp = NULL; } -void LensGlowOperation::initExecution() { +void LensGlowOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); } -void LensGlowOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void LensGlowOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ // const float emit100 = this->lamp->energy*100; // const float emit200 = emit100*2; // const float deltaX = 160-x; @@ -49,6 +52,7 @@ void LensGlowOperation::executePixel(float* color, float x, float y, PixelSample // color[3] = 1.0f; } -void LensGlowOperation::deinitExecution() { +void LensGlowOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_LensGlowOperation.h b/source/blender/compositor/operations/COM_LensGlowOperation.h index 9a18f605cda..77e13e88418 100644 --- a/source/blender/compositor/operations/COM_LensGlowOperation.h +++ b/source/blender/compositor/operations/COM_LensGlowOperation.h @@ -31,7 +31,7 @@ private: * Cached reference to the inputProgram */ SocketReader * inputProgram; - Lamp* lamp; + Lamp *lamp; public: LensGlowOperation(); @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution @@ -51,6 +51,6 @@ public: */ void deinitExecution(); - void setLamp(Lamp* lamp) {this->lamp = lamp;} + void setLamp(Lamp *lamp) {this->lamp = lamp;} }; #endif diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp index 3e8a5ed3344..f206bf4df8e 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp @@ -22,22 +22,26 @@ #include "COM_LuminanceMatteOperation.h" #include "BLI_math.h" -LuminanceMatteOperation::LuminanceMatteOperation(): NodeOperation() { +LuminanceMatteOperation::LuminanceMatteOperation(): NodeOperation() +{ addInputSocket(COM_DT_COLOR); addOutputSocket(COM_DT_VALUE); inputImageProgram = NULL; } -void LuminanceMatteOperation::initExecution() { +void LuminanceMatteOperation::initExecution() +{ this->inputImageProgram = this->getInputSocketReader(0); } -void LuminanceMatteOperation::deinitExecution() { - this->inputImageProgram= NULL; +void LuminanceMatteOperation::deinitExecution() +{ + this->inputImageProgram = NULL; } -void LuminanceMatteOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void LuminanceMatteOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inColor[4]; const float high=this->settings->t1; diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.h b/source/blender/compositor/operations/COM_LuminanceMatteOperation.h index 3c33cee71e9..1c2cd2dca51 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.h +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.h @@ -41,11 +41,11 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); - void setSettings(NodeChroma* nodeChroma) {this->settings= nodeChroma;} + void setSettings(NodeChroma *nodeChroma) {this->settings = nodeChroma;} }; #endif diff --git a/source/blender/compositor/operations/COM_MapUVOperation.cpp b/source/blender/compositor/operations/COM_MapUVOperation.cpp index 08790955d03..7b393cc04a8 100644 --- a/source/blender/compositor/operations/COM_MapUVOperation.cpp +++ b/source/blender/compositor/operations/COM_MapUVOperation.cpp @@ -22,7 +22,8 @@ #include "COM_MapUVOperation.h" #include "BLI_math.h" -MapUVOperation::MapUVOperation(): NodeOperation() { +MapUVOperation::MapUVOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VECTOR); this->addOutputSocket(COM_DT_COLOR); @@ -33,12 +34,14 @@ MapUVOperation::MapUVOperation(): NodeOperation() { this->inputColorProgram = NULL; } -void MapUVOperation::initExecution() { +void MapUVOperation::initExecution() +{ this->inputColorProgram = this->getInputSocketReader(0); this->inputUVProgram = this->getInputSocketReader(1); } -void MapUVOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MapUVOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputUV[4]; float uv_a[4], uv_b[4]; float u,v; @@ -58,36 +61,36 @@ void MapUVOperation::executePixel(float* color, float x, float y, PixelSampler s /* adaptive sampling, red (U) channel */ this->inputUVProgram->read(uv_a, x-1, y, COM_PS_NEAREST, inputBuffers); this->inputUVProgram->read(uv_b, x+1, y, COM_PS_NEAREST, inputBuffers); - uv_l= uv_a[2]!=0.f? fabs(inputUV[0] - uv_a[0]) : 0.f; - uv_r= uv_b[2]!=0.f? fabs(inputUV[0] - uv_b[0]) : 0.f; + uv_l = uv_a[2]!=0.f? fabs(inputUV[0] - uv_a[0]) : 0.f; + uv_r = uv_b[2]!=0.f? fabs(inputUV[0] - uv_b[0]) : 0.f; - dx= 0.5f * (uv_l + uv_r); + dx = 0.5f * (uv_l + uv_r); /* adaptive sampling, green (V) channel */ this->inputUVProgram->read(uv_a, x, y-1, COM_PS_NEAREST, inputBuffers); this->inputUVProgram->read(uv_b, x, y+1, COM_PS_NEAREST, inputBuffers); - uv_u= uv_a[2]!=0.f? fabs(inputUV[1] - uv_a[1]) : 0.f; - uv_d= uv_b[2]!=0.f? fabs(inputUV[1] - uv_b[1]) : 0.f; + uv_u = uv_a[2]!=0.f? fabs(inputUV[1] - uv_a[1]) : 0.f; + uv_d = uv_b[2]!=0.f? fabs(inputUV[1] - uv_b[1]) : 0.f; - dy= 0.5f * (uv_u + uv_d); + dy = 0.5f * (uv_u + uv_d); /* more adaptive sampling, red and green (UV) channels */ this->inputUVProgram->read(uv_a, x-1, y-1, COM_PS_NEAREST, inputBuffers); this->inputUVProgram->read(uv_b, x-1, y+1, COM_PS_NEAREST, inputBuffers); - uv_l= uv_a[2]!=0.f? fabsf(inputUV[0] - uv_a[0]) : 0.f; - uv_r= uv_b[2]!=0.f? fabsf(inputUV[0] - uv_b[0]) : 0.f; - uv_u= uv_a[2]!=0.f? fabsf(inputUV[1] - uv_a[1]) : 0.f; - uv_d= uv_b[2]!=0.f? fabsf(inputUV[1] - uv_b[1]) : 0.f; + uv_l = uv_a[2]!=0.f? fabsf(inputUV[0] - uv_a[0]) : 0.f; + uv_r = uv_b[2]!=0.f? fabsf(inputUV[0] - uv_b[0]) : 0.f; + uv_u = uv_a[2]!=0.f? fabsf(inputUV[1] - uv_a[1]) : 0.f; + uv_d = uv_b[2]!=0.f? fabsf(inputUV[1] - uv_b[1]) : 0.f; dx+= 0.25f * (uv_l + uv_r); dy+= 0.25f * (uv_u + uv_d); this->inputUVProgram->read(uv_a, x+1, y-1, COM_PS_NEAREST, inputBuffers); this->inputUVProgram->read(uv_b, x+1, y+1, COM_PS_NEAREST, inputBuffers); - uv_l= uv_a[2]!=0.f? fabsf(inputUV[0] - uv_a[0]) : 0.f; - uv_r= uv_b[2]!=0.f? fabsf(inputUV[0] - uv_b[0]) : 0.f; - uv_u= uv_a[2]!=0.f? fabsf(inputUV[1] - uv_a[1]) : 0.f; - uv_d= uv_b[2]!=0.f? fabsf(inputUV[1] - uv_b[1]) : 0.f; + uv_l = uv_a[2]!=0.f? fabsf(inputUV[0] - uv_a[0]) : 0.f; + uv_r = uv_b[2]!=0.f? fabsf(inputUV[0] - uv_b[0]) : 0.f; + uv_u = uv_a[2]!=0.f? fabsf(inputUV[1] - uv_a[1]) : 0.f; + uv_d = uv_b[2]!=0.f? fabsf(inputUV[1] - uv_b[1]) : 0.f; dx+= 0.25f * (uv_l + uv_r); dy+= 0.25f * (uv_u + uv_d); @@ -95,12 +98,12 @@ void MapUVOperation::executePixel(float* color, float x, float y, PixelSampler s /* UV to alpha threshold */ const float threshold = this->alpha * 0.05f; float alpha = 1.0f - threshold * (dx + dy); - if (alpha < 0.f) alpha= 0.f; + if (alpha < 0.f) alpha = 0.f; else alpha *= inputUV[2]; /* should use mipmap */ - dx= min(dx, 0.2f); - dy= min(dy, 0.2f); + dx = min(dx, 0.2f); + dy = min(dy, 0.2f); /* EWA filtering */ @@ -118,12 +121,14 @@ void MapUVOperation::executePixel(float* color, float x, float y, PixelSampler s } } -void MapUVOperation::deinitExecution() { +void MapUVOperation::deinitExecution() +{ this->inputUVProgram = NULL; this->inputColorProgram = NULL; } -bool MapUVOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool MapUVOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti colorInput; rcti uvInput; NodeOperation *operation=NULL; diff --git a/source/blender/compositor/operations/COM_MapUVOperation.h b/source/blender/compositor/operations/COM_MapUVOperation.h index 58c962eb17c..069f454895d 100644 --- a/source/blender/compositor/operations/COM_MapUVOperation.h +++ b/source/blender/compositor/operations/COM_MapUVOperation.h @@ -29,8 +29,8 @@ private: /** * Cached reference to the inputProgram */ - SocketReader* inputUVProgram; - SocketReader* inputColorProgram; + SocketReader *inputUVProgram; + SocketReader *inputColorProgram; float alpha; @@ -45,7 +45,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_MapValueOperation.cpp b/source/blender/compositor/operations/COM_MapValueOperation.cpp index 5a7005af382..bf6d29c0456 100644 --- a/source/blender/compositor/operations/COM_MapValueOperation.cpp +++ b/source/blender/compositor/operations/COM_MapValueOperation.cpp @@ -22,31 +22,35 @@ #include "COM_MapValueOperation.h" -MapValueOperation::MapValueOperation(): NodeOperation() { +MapValueOperation::MapValueOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->inputOperation = NULL; } -void MapValueOperation::initExecution() { +void MapValueOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void MapValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MapValueOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float src[4]; inputOperation->read(src, x, y, sampler, inputBuffers); - TexMapping *texmap= this->settings; + TexMapping *texmap = this->settings; float value = (src[0] + texmap->loc[0])*texmap->size[0]; if (texmap->flag & TEXMAP_CLIP_MIN) if (valuemin[0]) - value= texmap->min[0]; + value = texmap->min[0]; if (texmap->flag & TEXMAP_CLIP_MAX) if (value>texmap->max[0]) - value= texmap->max[0]; + value = texmap->max[0]; outputValue[0] = value; } -void MapValueOperation::deinitExecution() { +void MapValueOperation::deinitExecution() +{ this->inputOperation = NULL; } diff --git a/source/blender/compositor/operations/COM_MapValueOperation.h b/source/blender/compositor/operations/COM_MapValueOperation.h index 93274a12493..ac320256fe4 100644 --- a/source/blender/compositor/operations/COM_MapValueOperation.h +++ b/source/blender/compositor/operations/COM_MapValueOperation.h @@ -45,7 +45,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution @@ -60,7 +60,7 @@ public: /** * @brief set the TexMapping settings */ - void setSettings(TexMapping* settings) {this->settings = settings;} + void setSettings(TexMapping *settings) {this->settings = settings;} }; #endif diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.cpp b/source/blender/compositor/operations/COM_MathBaseOperation.cpp index d612361a7fe..2f315855652 100644 --- a/source/blender/compositor/operations/COM_MathBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_MathBaseOperation.cpp @@ -25,7 +25,8 @@ extern "C" { #include "BLI_math.h" } -MathBaseOperation::MathBaseOperation(): NodeOperation() { +MathBaseOperation::MathBaseOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); @@ -33,18 +34,21 @@ MathBaseOperation::MathBaseOperation(): NodeOperation() { this->inputValue2Operation = NULL; } -void MathBaseOperation::initExecution() { +void MathBaseOperation::initExecution() +{ this->inputValue1Operation = this->getInputSocketReader(0); this->inputValue2Operation = this->getInputSocketReader(1); } -void MathBaseOperation::deinitExecution() { +void MathBaseOperation::deinitExecution() +{ this->inputValue1Operation = NULL; this->inputValue2Operation = NULL; } -void MathAddOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathAddOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -54,7 +58,8 @@ void MathAddOperation::executePixel(float* outputValue, float x, float y, PixelS outputValue[0] = inputValue1[0] + inputValue2[0]; } -void MathSubtractOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathSubtractOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -64,7 +69,8 @@ void MathSubtractOperation::executePixel(float* outputValue, float x, float y, P outputValue[0] = inputValue1[0] - inputValue2[0]; } -void MathMultiplyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathMultiplyOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -74,7 +80,8 @@ void MathMultiplyOperation::executePixel(float* outputValue, float x, float y, P outputValue[0] = inputValue1[0] * inputValue2[0]; } -void MathDivideOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathDivideOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -82,12 +89,13 @@ void MathDivideOperation::executePixel(float* outputValue, float x, float y, Pix inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); if (inputValue2[0]==0) /* We don't want to divide by zero. */ - outputValue[0]= 0.0; + outputValue[0] = 0.0; else - outputValue[0]= inputValue1[0] / inputValue2[0]; + outputValue[0] = inputValue1[0] / inputValue2[0]; } -void MathSineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathSineOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -97,7 +105,8 @@ void MathSineOperation::executePixel(float* outputValue, float x, float y, Pixel outputValue[0] = sin(inputValue1[0]); } -void MathCosineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathCosineOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -107,7 +116,8 @@ void MathCosineOperation::executePixel(float* outputValue, float x, float y, Pix outputValue[0] = cos(inputValue1[0]); } -void MathTangentOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathTangentOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -117,7 +127,8 @@ void MathTangentOperation::executePixel(float* outputValue, float x, float y, Pi outputValue[0] = tan(inputValue1[0]); } -void MathArcSineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathArcSineOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -125,12 +136,13 @@ void MathArcSineOperation::executePixel(float* outputValue, float x, float y, Pi inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); if (inputValue1[0] <= 1 && inputValue1[0] >= -1 ) - outputValue[0]= asin(inputValue1[0]); + outputValue[0] = asin(inputValue1[0]); else - outputValue[0]= 0.0; + outputValue[0] = 0.0; } -void MathArcCosineOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathArcCosineOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -138,12 +150,13 @@ void MathArcCosineOperation::executePixel(float* outputValue, float x, float y, inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); if (inputValue1[0] <= 1 && inputValue1[0] >= -1 ) - outputValue[0]= acos(inputValue1[0]); + outputValue[0] = acos(inputValue1[0]); else - outputValue[0]= 0.0; + outputValue[0] = 0.0; } -void MathArcTangentOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathArcTangentOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -153,7 +166,8 @@ void MathArcTangentOperation::executePixel(float* outputValue, float x, float y, outputValue[0] = atan(inputValue1[0]); } -void MathPowerOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathPowerOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -161,13 +175,13 @@ void MathPowerOperation::executePixel(float* outputValue, float x, float y, Pixe inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); if ( inputValue1[0] >= 0 ) { - outputValue[0]= pow(inputValue1[0], inputValue2[0]); + outputValue[0] = pow(inputValue1[0], inputValue2[0]); } else { float y_mod_1 = fmod(inputValue2[0], 1); /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { - outputValue[0]= pow(inputValue1[0], (float)floor(inputValue2[0] + 0.5)); + outputValue[0] = pow(inputValue1[0], (float)floor(inputValue2[0] + 0.5)); } else { outputValue[0] = 0.0; @@ -175,7 +189,8 @@ void MathPowerOperation::executePixel(float* outputValue, float x, float y, Pixe } } -void MathLogarithmOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathLogarithmOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -183,12 +198,13 @@ void MathLogarithmOperation::executePixel(float* outputValue, float x, float y, inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); if ( inputValue1[0] > 0 && inputValue2[0] > 0 ) - outputValue[0]= log(inputValue1[0]) / log(inputValue2[0]); + outputValue[0] = log(inputValue1[0]) / log(inputValue2[0]); else - outputValue[0]= 0.0; + outputValue[0] = 0.0; } -void MathMinimumOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathMinimumOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -198,7 +214,8 @@ void MathMinimumOperation::executePixel(float* outputValue, float x, float y, Pi outputValue[0] = min(inputValue1[0], inputValue2[0]); } -void MathMaximumOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathMaximumOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -208,7 +225,8 @@ void MathMaximumOperation::executePixel(float* outputValue, float x, float y, Pi outputValue[0] = max(inputValue1[0], inputValue2[0]); } -void MathRoundOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathRoundOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -218,7 +236,8 @@ void MathRoundOperation::executePixel(float* outputValue, float x, float y, Pixe outputValue[0] = round(inputValue1[0]); } -void MathLessThanOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MathLessThanOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputValue1[4]; float inputValue2[4]; @@ -228,7 +247,8 @@ void MathLessThanOperation::executePixel(float* outputValue, float x, float y, P outputValue[0] = inputValue1[0]addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR); @@ -33,13 +34,15 @@ MixBaseOperation::MixBaseOperation(): NodeOperation() { this->setUseValueAlphaMultiply(false); } -void MixBaseOperation::initExecution() { +void MixBaseOperation::initExecution() +{ this->inputValueOperation = this->getInputSocketReader(0); this->inputColor1Operation = this->getInputSocketReader(1); this->inputColor2Operation = this->getInputSocketReader(2); } -void MixBaseOperation::executePixel(float* outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixBaseOperation::executePixel(float *outputColor, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -51,21 +54,23 @@ void MixBaseOperation::executePixel(float* outputColor, float x, float y, PixelS if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; outputColor[0] = valuem*(inputColor1[0])+value*(inputColor2[0]); outputColor[1] = valuem*(inputColor1[1])+value*(inputColor2[1]); outputColor[2] = valuem*(inputColor1[2])+value*(inputColor2[2]); outputColor[3] = inputColor1[3]; } -void MixBaseOperation::deinitExecution() { +void MixBaseOperation::deinitExecution() +{ this->inputValueOperation = NULL; this->inputColor1Operation = NULL; this->inputColor2Operation = NULL; } -void MixBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { - InputSocket* socket; +void MixBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ + InputSocket *socket; unsigned int tempPreferredResolution[] = {0,0}; unsigned int tempResolution[2]; diff --git a/source/blender/compositor/operations/COM_MixBaseOperation.h b/source/blender/compositor/operations/COM_MixBaseOperation.h index 171cde080eb..b9bb94d58d8 100644 --- a/source/blender/compositor/operations/COM_MixBaseOperation.h +++ b/source/blender/compositor/operations/COM_MixBaseOperation.h @@ -34,9 +34,9 @@ protected: /** * Prefetched reference to the inputProgram */ - SocketReader * inputValueOperation; - SocketReader* inputColor1Operation; - SocketReader* inputColor2Operation; + SocketReader *inputValueOperation; + SocketReader *inputColor1Operation; + SocketReader *inputColor2Operation; bool valueAlphaMultiply; public: /** @@ -47,7 +47,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_MixBlendOperation.cpp b/source/blender/compositor/operations/COM_MixBlendOperation.cpp index 7b12393bb20..579f15bcc27 100644 --- a/source/blender/compositor/operations/COM_MixBlendOperation.cpp +++ b/source/blender/compositor/operations/COM_MixBlendOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixBlendOperation.h" -MixBlendOperation::MixBlendOperation(): MixBaseOperation() { +MixBlendOperation::MixBlendOperation(): MixBaseOperation() +{ } -void MixBlendOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixBlendOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float inputValue[4]; @@ -39,7 +41,7 @@ void MixBlendOperation::executePixel(float* outputValue, float x, float y, Pixel if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; outputValue[0] = valuem*(inputColor1[0])+value*(inputColor2[0]); outputValue[1] = valuem*(inputColor1[1])+value*(inputColor2[1]); outputValue[2] = valuem*(inputColor1[2])+value*(inputColor2[2]); diff --git a/source/blender/compositor/operations/COM_MixBlendOperation.h b/source/blender/compositor/operations/COM_MixBlendOperation.h index 5cf31ee9151..da3342c0e4a 100644 --- a/source/blender/compositor/operations/COM_MixBlendOperation.h +++ b/source/blender/compositor/operations/COM_MixBlendOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixBurnOperation.cpp b/source/blender/compositor/operations/COM_MixBurnOperation.cpp index 28b86be5e1e..7cad107c5e9 100644 --- a/source/blender/compositor/operations/COM_MixBurnOperation.cpp +++ b/source/blender/compositor/operations/COM_MixBurnOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixBurnOperation.h" -MixBurnOperation::MixBurnOperation(): MixBaseOperation() { +MixBurnOperation::MixBurnOperation(): MixBaseOperation() +{ } -void MixBurnOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixBurnOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -38,7 +40,7 @@ void MixBurnOperation::executePixel(float* outputValue, float x, float y, PixelS if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; tmp = valuem + value*inputColor2[0]; if (tmp <= 0.0f) diff --git a/source/blender/compositor/operations/COM_MixBurnOperation.h b/source/blender/compositor/operations/COM_MixBurnOperation.h index 132db3d25e7..ff7de119605 100644 --- a/source/blender/compositor/operations/COM_MixBurnOperation.h +++ b/source/blender/compositor/operations/COM_MixBurnOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixColorOperation.cpp b/source/blender/compositor/operations/COM_MixColorOperation.cpp index d5ec55daf07..e14b10b305e 100644 --- a/source/blender/compositor/operations/COM_MixColorOperation.cpp +++ b/source/blender/compositor/operations/COM_MixColorOperation.cpp @@ -26,10 +26,12 @@ extern "C" { #include "BLI_math.h" } -MixColorOperation::MixColorOperation(): MixBaseOperation() { +MixColorOperation::MixColorOperation(): MixBaseOperation() +{ } -void MixColorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixColorOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -41,7 +43,7 @@ void MixColorOperation::executePixel(float* outputValue, float x, float y, Pixel if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; float colH,colS,colV; rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); diff --git a/source/blender/compositor/operations/COM_MixColorOperation.h b/source/blender/compositor/operations/COM_MixColorOperation.h index dfbdcfc0368..1a98e847ccd 100644 --- a/source/blender/compositor/operations/COM_MixColorOperation.h +++ b/source/blender/compositor/operations/COM_MixColorOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixDarkenOperation.cpp b/source/blender/compositor/operations/COM_MixDarkenOperation.cpp index 7e8271a9c96..666db9d8f32 100644 --- a/source/blender/compositor/operations/COM_MixDarkenOperation.cpp +++ b/source/blender/compositor/operations/COM_MixDarkenOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixDarkenOperation.h" -MixDarkenOperation::MixDarkenOperation(): MixBaseOperation() { +MixDarkenOperation::MixDarkenOperation(): MixBaseOperation() +{ } -void MixDarkenOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixDarkenOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -37,16 +39,16 @@ void MixDarkenOperation::executePixel(float* outputValue, float x, float y, Pixe if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem = 1.0f-value; + float valuem = 1.0f - value; float tmp; tmp=inputColor2[0]+((1.0f-inputColor2[0])*valuem); - if (tmp < inputColor1[0]) outputValue[0]= tmp; + if (tmp < inputColor1[0]) outputValue[0] = tmp; else outputValue[0] = inputColor1[0]; tmp=inputColor2[1]+((1.0f-inputColor2[1])*valuem); - if (tmp < inputColor1[1]) outputValue[1]= tmp; + if (tmp < inputColor1[1]) outputValue[1] = tmp; else outputValue[1] = inputColor1[1]; tmp=inputColor2[2]+((1.0f-inputColor2[2])*valuem); - if (tmp < inputColor1[2]) outputValue[2]= tmp; + if (tmp < inputColor1[2]) outputValue[2] = tmp; else outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; diff --git a/source/blender/compositor/operations/COM_MixDarkenOperation.h b/source/blender/compositor/operations/COM_MixDarkenOperation.h index 7ead435212d..b1792d4930e 100644 --- a/source/blender/compositor/operations/COM_MixDarkenOperation.h +++ b/source/blender/compositor/operations/COM_MixDarkenOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp b/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp index 4ea1428b387..497bb9c2bb5 100644 --- a/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp +++ b/source/blender/compositor/operations/COM_MixDifferenceOperation.cpp @@ -23,10 +23,12 @@ #include "COM_MixDifferenceOperation.h" #include "BLI_math.h" -MixDifferenceOperation::MixDifferenceOperation(): MixBaseOperation() { +MixDifferenceOperation::MixDifferenceOperation(): MixBaseOperation() +{ } -void MixDifferenceOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixDifferenceOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -38,7 +40,7 @@ void MixDifferenceOperation::executePixel(float* outputValue, float x, float y, if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; outputValue[0] = valuem*inputColor1[0] + value*fabsf(inputColor1[0]-inputColor2[0]); outputValue[1] = valuem*inputColor1[1] + value*fabsf(inputColor1[1]-inputColor2[1]); outputValue[2] = valuem*inputColor1[2] + value*fabsf(inputColor1[2]-inputColor2[2]); diff --git a/source/blender/compositor/operations/COM_MixDifferenceOperation.h b/source/blender/compositor/operations/COM_MixDifferenceOperation.h index 9b95d5a91ad..554d7b2f1fe 100644 --- a/source/blender/compositor/operations/COM_MixDifferenceOperation.h +++ b/source/blender/compositor/operations/COM_MixDifferenceOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixDivideOperation.cpp b/source/blender/compositor/operations/COM_MixDivideOperation.cpp index 6bab381c706..c522fcf225a 100644 --- a/source/blender/compositor/operations/COM_MixDivideOperation.cpp +++ b/source/blender/compositor/operations/COM_MixDivideOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixDivideOperation.h" -MixDivideOperation::MixDivideOperation(): MixBaseOperation() { +MixDivideOperation::MixDivideOperation(): MixBaseOperation() +{ } -void MixDivideOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixDivideOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -37,17 +39,17 @@ void MixDivideOperation::executePixel(float* outputValue, float x, float y, Pixe if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; - if (inputColor2[0]!=0.0f) + if (inputColor2[0] != 0.0f) outputValue[0] = valuem*(inputColor1[0]) + value*(inputColor1[0])/inputColor2[0]; else outputValue[0] = 0.0f; - if (inputColor2[1]!=0.0f) + if (inputColor2[1] != 0.0f) outputValue[1] = valuem*(inputColor1[1]) + value*(inputColor1[1])/inputColor2[1]; else outputValue[1] = 0.0f; - if (inputColor2[2]!=0.0f) + if (inputColor2[2] != 0.0f) outputValue[2] = valuem*(inputColor1[2]) + value*(inputColor1[2])/inputColor2[2]; else outputValue[2] = 0.0f; diff --git a/source/blender/compositor/operations/COM_MixDivideOperation.h b/source/blender/compositor/operations/COM_MixDivideOperation.h index d43ddb49c91..e9c4cf81cd3 100644 --- a/source/blender/compositor/operations/COM_MixDivideOperation.h +++ b/source/blender/compositor/operations/COM_MixDivideOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixDodgeOperation.cpp b/source/blender/compositor/operations/COM_MixDodgeOperation.cpp index 7e6ddeee5e6..10c04ba376b 100644 --- a/source/blender/compositor/operations/COM_MixDodgeOperation.cpp +++ b/source/blender/compositor/operations/COM_MixDodgeOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixDodgeOperation.h" -MixDodgeOperation::MixDodgeOperation(): MixBaseOperation() { +MixDodgeOperation::MixDodgeOperation(): MixBaseOperation() +{ } -void MixDodgeOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixDodgeOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; diff --git a/source/blender/compositor/operations/COM_MixDodgeOperation.h b/source/blender/compositor/operations/COM_MixDodgeOperation.h index 0a910c167ba..6baa73e8f6f 100644 --- a/source/blender/compositor/operations/COM_MixDodgeOperation.h +++ b/source/blender/compositor/operations/COM_MixDodgeOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixHueOperation.cpp b/source/blender/compositor/operations/COM_MixHueOperation.cpp index 8454c694f65..de376f3500c 100644 --- a/source/blender/compositor/operations/COM_MixHueOperation.cpp +++ b/source/blender/compositor/operations/COM_MixHueOperation.cpp @@ -26,10 +26,12 @@ extern "C" { #include "BLI_math.h" } -MixHueOperation::MixHueOperation(): MixBaseOperation() { +MixHueOperation::MixHueOperation(): MixBaseOperation() +{ } -void MixHueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixHueOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -41,7 +43,7 @@ void MixHueOperation::executePixel(float* outputValue, float x, float y, PixelSa if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; float colH,colS,colV; rgb_to_hsv(inputColor2[0], inputColor2[1], inputColor2[2], &colH, &colS, &colV); diff --git a/source/blender/compositor/operations/COM_MixHueOperation.h b/source/blender/compositor/operations/COM_MixHueOperation.h index 5e46b625385..d3d1717f448 100644 --- a/source/blender/compositor/operations/COM_MixHueOperation.h +++ b/source/blender/compositor/operations/COM_MixHueOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixLightenOperation.cpp b/source/blender/compositor/operations/COM_MixLightenOperation.cpp index 6a06d5ab6e1..bc3e5090bd8 100644 --- a/source/blender/compositor/operations/COM_MixLightenOperation.cpp +++ b/source/blender/compositor/operations/COM_MixLightenOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixLightenOperation.h" -MixLightenOperation::MixLightenOperation(): MixBaseOperation() { +MixLightenOperation::MixLightenOperation(): MixBaseOperation() +{ } -void MixLightenOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixLightenOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -39,13 +41,13 @@ void MixLightenOperation::executePixel(float* outputValue, float x, float y, Pix } float tmp; tmp=value * inputColor2[0]; - if (tmp > inputColor1[0]) outputValue[0]= tmp; + if (tmp > inputColor1[0]) outputValue[0] = tmp; else outputValue[0] = inputColor1[0]; tmp=value * inputColor2[1]; - if (tmp > inputColor1[1]) outputValue[1]= tmp; + if (tmp > inputColor1[1]) outputValue[1] = tmp; else outputValue[1] = inputColor1[1]; tmp=value * inputColor2[2]; - if (tmp > inputColor1[2]) outputValue[2]= tmp; + if (tmp > inputColor1[2]) outputValue[2] = tmp; else outputValue[2] = inputColor1[2]; outputValue[3] = inputColor1[3]; } diff --git a/source/blender/compositor/operations/COM_MixLightenOperation.h b/source/blender/compositor/operations/COM_MixLightenOperation.h index 64b1bf9bbc9..73ac3e6e165 100644 --- a/source/blender/compositor/operations/COM_MixLightenOperation.h +++ b/source/blender/compositor/operations/COM_MixLightenOperation.h @@ -39,6 +39,6 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp b/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp index 413b09d7242..b68064f0e47 100644 --- a/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp +++ b/source/blender/compositor/operations/COM_MixLinearLightOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixLinearLightOperation.h" -MixLinearLightOperation::MixLinearLightOperation(): MixBaseOperation() { +MixLinearLightOperation::MixLinearLightOperation(): MixBaseOperation() +{ } -void MixLinearLightOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixLinearLightOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; diff --git a/source/blender/compositor/operations/COM_MixLinearLightOperation.h b/source/blender/compositor/operations/COM_MixLinearLightOperation.h index 9fb2a433104..7e26b25e5c0 100644 --- a/source/blender/compositor/operations/COM_MixLinearLightOperation.h +++ b/source/blender/compositor/operations/COM_MixLinearLightOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp b/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp index 82c6c2e9c1f..fdf8c1ca51b 100644 --- a/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp +++ b/source/blender/compositor/operations/COM_MixMultiplyOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixMultiplyOperation.h" -MixMultiplyOperation::MixMultiplyOperation(): MixBaseOperation() { +MixMultiplyOperation::MixMultiplyOperation(): MixBaseOperation() +{ } -void MixMultiplyOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixMultiplyOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float inputValue[4]; @@ -38,7 +40,7 @@ void MixMultiplyOperation::executePixel(float* outputValue, float x, float y, Pi if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; outputValue[0] = inputColor1[0] *(valuem+value*inputColor2[0]); outputValue[1] = inputColor1[1] *(valuem+value*inputColor2[1]); outputValue[2] = inputColor1[2] *(valuem+value*inputColor2[2]); diff --git a/source/blender/compositor/operations/COM_MixMultiplyOperation.h b/source/blender/compositor/operations/COM_MixMultiplyOperation.h index c35e4bbf64b..5d4468e7271 100644 --- a/source/blender/compositor/operations/COM_MixMultiplyOperation.h +++ b/source/blender/compositor/operations/COM_MixMultiplyOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixOverlayOperation.cpp b/source/blender/compositor/operations/COM_MixOverlayOperation.cpp index 7a3030b9262..0025daeb3f5 100644 --- a/source/blender/compositor/operations/COM_MixOverlayOperation.cpp +++ b/source/blender/compositor/operations/COM_MixOverlayOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixOverlayOperation.h" -MixOverlayOperation::MixOverlayOperation(): MixBaseOperation() { +MixOverlayOperation::MixOverlayOperation(): MixBaseOperation() +{ } -void MixOverlayOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixOverlayOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -38,7 +40,7 @@ void MixOverlayOperation::executePixel(float* outputValue, float x, float y, Pix value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; if (inputColor1[0] < 0.5f) { outputValue[0] = inputColor1[0] * (valuem + 2.0f*value*inputColor2[0]); diff --git a/source/blender/compositor/operations/COM_MixOverlayOperation.h b/source/blender/compositor/operations/COM_MixOverlayOperation.h index 1a0e865b0e8..dd1d16a53d3 100644 --- a/source/blender/compositor/operations/COM_MixOverlayOperation.h +++ b/source/blender/compositor/operations/COM_MixOverlayOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixSaturationOperation.cpp b/source/blender/compositor/operations/COM_MixSaturationOperation.cpp index a8fe647828b..f6f6ec73c6e 100644 --- a/source/blender/compositor/operations/COM_MixSaturationOperation.cpp +++ b/source/blender/compositor/operations/COM_MixSaturationOperation.cpp @@ -26,10 +26,12 @@ extern "C" { #include "BLI_math.h" } -MixSaturationOperation::MixSaturationOperation(): MixBaseOperation() { +MixSaturationOperation::MixSaturationOperation(): MixBaseOperation() +{ } -void MixSaturationOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixSaturationOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -41,7 +43,7 @@ void MixSaturationOperation::executePixel(float* outputValue, float x, float y, if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; float rH,rS,rV; rgb_to_hsv(inputColor1[0], inputColor1[1], inputColor1[2], &rH, &rS, &rV); diff --git a/source/blender/compositor/operations/COM_MixSaturationOperation.h b/source/blender/compositor/operations/COM_MixSaturationOperation.h index cea2c886a06..7e746c02e09 100644 --- a/source/blender/compositor/operations/COM_MixSaturationOperation.h +++ b/source/blender/compositor/operations/COM_MixSaturationOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixScreenOperation.cpp b/source/blender/compositor/operations/COM_MixScreenOperation.cpp index 25004ca7257..a1a98bd82a2 100644 --- a/source/blender/compositor/operations/COM_MixScreenOperation.cpp +++ b/source/blender/compositor/operations/COM_MixScreenOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixScreenOperation.h" -MixScreenOperation::MixScreenOperation(): MixBaseOperation() { +MixScreenOperation::MixScreenOperation(): MixBaseOperation() +{ } -void MixScreenOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixScreenOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float valuev[4]; @@ -38,7 +40,7 @@ void MixScreenOperation::executePixel(float* outputValue, float x, float y, Pixe if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; outputValue[0] = 1.0f - (valuem + value*(1.0f-inputColor2[0])) *(1.0f-inputColor1[0]); outputValue[1] = 1.0f - (valuem + value*(1.0f-inputColor2[1])) *(1.0f-inputColor1[1]); diff --git a/source/blender/compositor/operations/COM_MixScreenOperation.h b/source/blender/compositor/operations/COM_MixScreenOperation.h index 5fb99c7582f..6522907f295 100644 --- a/source/blender/compositor/operations/COM_MixScreenOperation.h +++ b/source/blender/compositor/operations/COM_MixScreenOperation.h @@ -39,6 +39,6 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp b/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp index 3195b3440ec..ea6a3ddd498 100644 --- a/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp +++ b/source/blender/compositor/operations/COM_MixSoftLightOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixSoftLightOperation.h" -MixSoftLightOperation::MixSoftLightOperation(): MixBaseOperation() { +MixSoftLightOperation::MixSoftLightOperation(): MixBaseOperation() +{ } -void MixSoftLightOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixSoftLightOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])\ +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -37,7 +39,7 @@ void MixSoftLightOperation::executePixel(float* outputValue, float x, float y, P if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem = 1.0f-value; + float valuem = 1.0f - value; float scr, scg, scb; /* first calculate non-fac based Screen mix */ diff --git a/source/blender/compositor/operations/COM_MixSoftLightOperation.h b/source/blender/compositor/operations/COM_MixSoftLightOperation.h index 1f5e9a24f07..fcbd8dab8b8 100644 --- a/source/blender/compositor/operations/COM_MixSoftLightOperation.h +++ b/source/blender/compositor/operations/COM_MixSoftLightOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixSubtractOperation.cpp b/source/blender/compositor/operations/COM_MixSubtractOperation.cpp index 49792c99c27..57320dcd611 100644 --- a/source/blender/compositor/operations/COM_MixSubtractOperation.cpp +++ b/source/blender/compositor/operations/COM_MixSubtractOperation.cpp @@ -22,10 +22,12 @@ #include "COM_MixSubtractOperation.h" -MixSubtractOperation::MixSubtractOperation(): MixBaseOperation() { +MixSubtractOperation::MixSubtractOperation(): MixBaseOperation() +{ } -void MixSubtractOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixSubtractOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; diff --git a/source/blender/compositor/operations/COM_MixSubtractOperation.h b/source/blender/compositor/operations/COM_MixSubtractOperation.h index 119d614081f..441857a8aca 100644 --- a/source/blender/compositor/operations/COM_MixSubtractOperation.h +++ b/source/blender/compositor/operations/COM_MixSubtractOperation.h @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MixValueOperation.cpp b/source/blender/compositor/operations/COM_MixValueOperation.cpp index 93bb7b59b5f..8c43bb6af8c 100644 --- a/source/blender/compositor/operations/COM_MixValueOperation.cpp +++ b/source/blender/compositor/operations/COM_MixValueOperation.cpp @@ -26,10 +26,12 @@ extern "C" { #include "BLI_math.h" } -MixValueOperation::MixValueOperation(): MixBaseOperation() { +MixValueOperation::MixValueOperation(): MixBaseOperation() +{ } -void MixValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MixValueOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float inputColor1[4]; float inputColor2[4]; float value; @@ -41,7 +43,7 @@ void MixValueOperation::executePixel(float* outputValue, float x, float y, Pixel if (this->useValueAlphaMultiply()) { value *= inputColor2[3]; } - float valuem= 1.0f-value; + float valuem = 1.0f - value; float rH,rS,rV; float colH,colS,colV; diff --git a/source/blender/compositor/operations/COM_MixValueOperation.h b/source/blender/compositor/operations/COM_MixValueOperation.h index ce358ebb506..89461b3ba40 100644 --- a/source/blender/compositor/operations/COM_MixValueOperation.h +++ b/source/blender/compositor/operations/COM_MixValueOperation.h @@ -39,6 +39,6 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp index 5d0e7e4a4fe..a81288be3f7 100644 --- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp @@ -24,14 +24,16 @@ extern "C" { #include "BKE_tracking.h" } -MovieClipAttributeOperation::MovieClipAttributeOperation(): NodeOperation() { +MovieClipAttributeOperation::MovieClipAttributeOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_VALUE); this->valueSet = false; this->framenumber = 0; this->attribute = MCA_X; } -void MovieClipAttributeOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MovieClipAttributeOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ if (!valueSet) { float loc[2], scale, angle; loc[0] = 0.0f; @@ -60,7 +62,8 @@ void MovieClipAttributeOperation::executePixel(float* outputValue, float x, floa outputValue[0] = this->value; } -void MovieClipAttributeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void MovieClipAttributeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ resolution[0] = preferredResolution[0]; resolution[1] = preferredResolution[1]; } diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h index 960d837dd7e..aca2ec2eff7 100644 --- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h @@ -51,10 +51,10 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); - void setMovieClip(MovieClip* clip) {this->clip = clip;} + void setMovieClip(MovieClip *clip) {this->clip = clip;} void setFramenumber(int framenumber) {this->framenumber = framenumber;} void setAttribute(MovieClipAttribute attribute) {this->attribute = attribute;} }; diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.cpp b/source/blender/compositor/operations/COM_MovieClipOperation.cpp index 7597497acc7..14687133194 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieClipOperation.cpp @@ -31,7 +31,8 @@ extern "C" { } #include "BKE_image.h" -MovieClipOperation::MovieClipOperation(): NodeOperation() { +MovieClipOperation::MovieClipOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_COLOR); this->movieClip = NULL; this->movieClipBuffer = NULL; @@ -42,11 +43,12 @@ MovieClipOperation::MovieClipOperation(): NodeOperation() { } -void MovieClipOperation::initExecution() { +void MovieClipOperation::initExecution() +{ if (this->movieClip) { BKE_movieclip_user_set_frame(this->movieClipUser, this->framenumber); ImBuf *ibuf; - ibuf= BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); + ibuf = BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); if (ibuf) { this->movieClipBuffer = ibuf; if (ibuf->rect_float == NULL || ibuf->userflags&IB_RECT_INVALID) { @@ -57,14 +59,16 @@ void MovieClipOperation::initExecution() { } } -void MovieClipOperation::deinitExecution() { +void MovieClipOperation::deinitExecution() +{ this->movieClipBuffer = NULL; } -void MovieClipOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void MovieClipOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ ImBuf *ibuf; if (this->movieClip) { - ibuf= BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); + ibuf = BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); if (ibuf) { resolution[0] = ibuf->x; resolution[1] = ibuf->y; @@ -72,7 +76,8 @@ void MovieClipOperation::determineResolution(unsigned int resolution[], unsigned } } -void MovieClipOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MovieClipOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ if (this->movieClipBuffer == NULL || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight() ) { color[0] = 0.0f; color[1] = 0.0f; diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.h b/source/blender/compositor/operations/COM_MovieClipOperation.h index c861115dee8..f52a9973fc5 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.h +++ b/source/blender/compositor/operations/COM_MovieClipOperation.h @@ -37,8 +37,8 @@ */ class MovieClipOperation : public NodeOperation { protected: - MovieClip* movieClip; - MovieClipUser* movieClipUser; + MovieClip *movieClip; + MovieClipUser *movieClipUser; ImBuf *movieClipBuffer; int movieClipheight; int movieClipwidth; @@ -54,8 +54,8 @@ public: void initExecution(); void deinitExecution(); - void setMovieClip(MovieClip* image) {this->movieClip = image;} - void setMovieClipUser(MovieClipUser* imageuser) {this->movieClipUser = imageuser;} + void setMovieClip(MovieClip *image) {this->movieClip = image;} + void setMovieClipUser(MovieClipUser *imageuser) {this->movieClipUser = imageuser;} void setFramenumber(int framenumber) {this->framenumber = framenumber;} void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp index b848192d40b..1699707ab3a 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp @@ -32,7 +32,8 @@ extern "C" { vector s_cache; -MovieDistortionOperation::MovieDistortionOperation(bool distortion) : NodeOperation() { +MovieDistortionOperation::MovieDistortionOperation(bool distortion) : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->setResolutionInputSocketIndex(0); @@ -41,17 +42,18 @@ MovieDistortionOperation::MovieDistortionOperation(bool distortion) : NodeOperat this->cache = NULL; this->distortion = distortion; } -void MovieDistortionOperation::initExecution() { +void MovieDistortionOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); if (this->movieClip) { for (int i = 0 ; i < s_cache.size() ; i ++) { - DistortionCache* c = (DistortionCache*)s_cache[i]; + DistortionCache *c = (DistortionCache*)s_cache[i]; if (c->isCacheFor(this->movieClip, this->width, this->height, this->distortion)) { this->cache = c; return; } } - DistortionCache* newC = new DistortionCache(this->movieClip, this->width, this->height, this->distortion); + DistortionCache *newC = new DistortionCache(this->movieClip, this->width, this->height, this->distortion); s_cache.push_back(newC); this->cache = newC; } @@ -60,13 +62,15 @@ void MovieDistortionOperation::initExecution() { } } -void MovieDistortionOperation::deinitExecution() { +void MovieDistortionOperation::deinitExecution() +{ this->inputOperation = NULL; this->movieClip = NULL; } -void MovieDistortionOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MovieDistortionOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ if (this->cache != NULL) { float u, v; @@ -78,7 +82,8 @@ void MovieDistortionOperation::executePixel(float *color,float x, float y, Pixel } } -bool MovieDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool MovieDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = input->xmax + 100; diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.h b/source/blender/compositor/operations/COM_MovieDistortionOperation.h index 21aa955075d..fcdf7090566 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.h +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.h @@ -40,7 +40,7 @@ private: float *buffer; int *bufferCalculated; public: - DistortionCache(MovieClip* movieclip, int width, int height, bool inverted) { + DistortionCache(MovieClip *movieclip, int width, int height, bool inverted) { this->k1 = movieclip->tracking.camera.k1; this->k2 = movieclip->tracking.camera.k2; this->k3 = movieclip->tracking.camera.k3; @@ -53,7 +53,7 @@ public: this->bufferCalculated[i] = 0; } } - bool isCacheFor(MovieClip* movieclip, int width, int height, bool inverted) { + bool isCacheFor(MovieClip *movieclip, int width, int height, bool inverted) { return this->k1 == movieclip->tracking.camera.k1 && this->k2 == movieclip->tracking.camera.k2 && this->k3 == movieclip->tracking.camera.k3 && @@ -62,7 +62,7 @@ public: this->height == height; } - void getUV(MovieTracking* trackingData, int x, int y, float *u, float*v) { + void getUV(MovieTracking *trackingData, int x, int y, float *u, float*v) { if (x<0 || x >= this->width || y <0 || y >= this->height) { *u = x; *v = y; @@ -106,7 +106,7 @@ public: void initExecution(); void deinitExecution(); - void setMovieClip(MovieClip* clip) {this->movieClip = clip;} + void setMovieClip(MovieClip *clip) {this->movieClip = clip;} }; diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp index df2b762b563..f95dd12a81a 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp @@ -27,21 +27,24 @@ extern "C" { #include "IMB_imbuf_types.h" } -MultilayerBaseOperation::MultilayerBaseOperation(int pass): BaseImageOperation() { +MultilayerBaseOperation::MultilayerBaseOperation(int pass): BaseImageOperation() +{ this->passId = pass; } -ImBuf* MultilayerBaseOperation::getImBuf() { +ImBuf *MultilayerBaseOperation::getImBuf() +{ RenderPass *rpass; rpass = (RenderPass *)BLI_findlink(&this->renderlayer->passes, this->passId); if (rpass) { - this->imageUser->pass= this->passId; + this->imageUser->pass = this->passId; BKE_image_multilayer_index(image->rr, this->imageUser); return BaseImageOperation::getImBuf(); } return NULL; } -void MultilayerColorOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MultilayerColorOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ int yi = y; int xi = x; if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { @@ -73,7 +76,8 @@ void MultilayerColorOperation::executePixel(float *color, float x, float y, Pixe } } -void MultilayerValueOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MultilayerValueOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ int yi = y; int xi = x; if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { @@ -85,7 +89,8 @@ void MultilayerValueOperation::executePixel(float *color, float x, float y, Pixe } } -void MultilayerVectorOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void MultilayerVectorOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ int yi = y; int xi = x; if (this->imageBuffer == NULL || xi < 0 || yi < 0 || xi >= this->getWidth() || yi >= this->getHeight() ) { diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.h b/source/blender/compositor/operations/COM_MultilayerImageOperation.h index 37e8020d56c..809253e532a 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.h +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.h @@ -30,9 +30,9 @@ class MultilayerBaseOperation: public BaseImageOperation { private: int passId; - RenderLayer* renderlayer; + RenderLayer *renderlayer; protected: - ImBuf* getImBuf(); + ImBuf *getImBuf(); public: /** * Constructor diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.cpp b/source/blender/compositor/operations/COM_NormalizeOperation.cpp index ade2fde8d07..d144739f845 100644 --- a/source/blender/compositor/operations/COM_NormalizeOperation.cpp +++ b/source/blender/compositor/operations/COM_NormalizeOperation.cpp @@ -21,19 +21,22 @@ #include "COM_NormalizeOperation.h" -NormalizeOperation::NormalizeOperation(): NodeOperation() { +NormalizeOperation::NormalizeOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->imageReader = NULL; this->cachedInstance = NULL; this->setComplex(true); } -void NormalizeOperation::initExecution() { +void NormalizeOperation::initExecution() +{ this->imageReader = this->getInputSocketReader(0); NodeOperation::initMutex(); } -void NormalizeOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { +void NormalizeOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data) +{ /* using generic two floats struct to store x: min y: mult */ NodeTwoFloats *minmult = (NodeTwoFloats *)data; @@ -43,7 +46,8 @@ void NormalizeOperation::executePixel(float* color, int x, int y, MemoryBuffer * color[0] = (output[0] - minmult->x) * minmult->y; } -void NormalizeOperation::deinitExecution() { +void NormalizeOperation::deinitExecution() +{ this->imageReader = NULL; if (this->cachedInstance) { delete cachedInstance; @@ -51,10 +55,11 @@ void NormalizeOperation::deinitExecution() { NodeOperation::deinitMutex(); } -bool NormalizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool NormalizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti imageInput; - NodeOperation* operation = getInputOperation(0); + NodeOperation *operation = getInputOperation(0); imageInput.xmax = operation->getWidth(); imageInput.xmin = 0; imageInput.ymax = operation->getHeight(); @@ -69,12 +74,12 @@ bool NormalizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe /* The code below assumes all data is inside range +- this, and that input buffer is single channel */ #define BLENDER_ZMAX 10000.0f -void* NormalizeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { - +void *NormalizeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ BLI_mutex_lock(getMutex()); if (this->cachedInstance == NULL) { - MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + MemoryBuffer *tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); /* using generic two floats struct to store x: min y: mult */ NodeTwoFloats *minmult = new NodeTwoFloats(); @@ -104,5 +109,6 @@ void* NormalizeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBu return this->cachedInstance; } -void NormalizeOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { +void NormalizeOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) +{ } diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.h b/source/blender/compositor/operations/COM_NormalizeOperation.h index 9475cd3852a..765b8847384 100644 --- a/source/blender/compositor/operations/COM_NormalizeOperation.h +++ b/source/blender/compositor/operations/COM_NormalizeOperation.h @@ -47,14 +47,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); /** diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp index adaba8e3330..66db4a1c86b 100644 --- a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp @@ -1,7 +1,7 @@ /// @todo: this source needs to be generated from COM_OpenCLKernels.cl. /// not implemented yet. new data to h -const char* sourcecode = "/// This file contains all opencl kernels for node-operation implementations \n" \ +const char *sourcecode = "/// This file contains all opencl kernels for node-operation implementations \n" \ "\n" \ "__kernel void testKernel(__global __write_only image2d_t output) {\n" \ " int x = get_global_id(0);\n" \ diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp index e410dd966c8..8d39e987bd4 100644 --- a/source/blender/compositor/operations/COM_OutputFileOperation.cpp +++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp @@ -48,7 +48,8 @@ static int get_datatype_size(DataType datatype) } } -static float *init_buffer(unsigned int width, unsigned int height, DataType datatype) { +static float *init_buffer(unsigned int width, unsigned int height, DataType datatype) +{ // When initializing the tree during initial load the width and height can be zero. if (width != 0 && height != 0) { int size = get_datatype_size(datatype); @@ -59,7 +60,7 @@ static float *init_buffer(unsigned int width, unsigned int height, DataType data } static void write_buffer_rect(rcti *rect, MemoryBuffer** memoryBuffers, const bNodeTree *tree, - SocketReader *reader, float* buffer, unsigned int width, DataType datatype) + SocketReader *reader, float *buffer, unsigned int width, DataType datatype) { float color[4]; int i, size = get_datatype_size(datatype); @@ -106,12 +107,14 @@ OutputSingleLayerOperation::OutputSingleLayerOperation( BLI_strncpy(this->path, path, sizeof(this->path)); } -void OutputSingleLayerOperation::initExecution() { +void OutputSingleLayerOperation::initExecution() +{ this->imageInput = getInputSocketReader(0); this->outputBuffer = init_buffer(this->getWidth(), this->getHeight(), this->datatype); } -void OutputSingleLayerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { +void OutputSingleLayerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) +{ write_buffer_rect(rect, memoryBuffers, this->tree, imageInput, this->outputBuffer, this->getWidth(), this->datatype); } @@ -120,14 +123,14 @@ void OutputSingleLayerOperation::deinitExecution() if (this->getWidth() * this->getHeight() != 0) { int size = get_datatype_size(this->datatype); - ImBuf *ibuf= IMB_allocImBuf(this->getWidth(), this->getHeight(), size*8, 0); - Main *bmain= G.main; /* TODO, have this passed along */ + ImBuf *ibuf = IMB_allocImBuf(this->getWidth(), this->getHeight(), size*8, 0); + Main *bmain = G.main; /* TODO, have this passed along */ char filename[FILE_MAX]; ibuf->channels = size; - ibuf->rect_float= this->outputBuffer; + ibuf->rect_float = this->outputBuffer; ibuf->mall |= IB_rectfloat; - ibuf->dither= scene->r.dither_intensity; + ibuf->dither = scene->r.dither_intensity; if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) ibuf->profile = IB_PROFILE_LINEAR_RGB; @@ -192,9 +195,9 @@ void OutputOpenExrMultiLayerOperation::deinitExecution() unsigned int width = this->getWidth(); unsigned int height = this->getHeight(); if (width != 0 && height != 0) { - Main *bmain= G.main; /* TODO, have this passed along */ + Main *bmain = G.main; /* TODO, have this passed along */ char filename[FILE_MAX]; - void *exrhandle= IMB_exr_get_handle(); + void *exrhandle = IMB_exr_get_handle(); BKE_makepicstring(filename, this->path, bmain->name, this->scene->r.cfra, R_IMF_IMTYPE_MULTILAYER, (this->scene->r.scemode & R_EXTENSION), true); diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.h b/source/blender/compositor/operations/COM_OutputFileOperation.h index 0fbe874e9e0..0e37432ca5b 100644 --- a/source/blender/compositor/operations/COM_OutputFileOperation.h +++ b/source/blender/compositor/operations/COM_OutputFileOperation.h @@ -33,14 +33,14 @@ class OutputSingleLayerOperation : public NodeOperation { private: const Scene *scene; - const bNodeTree* tree; + const bNodeTree *tree; ImageFormatData *format; char path[FILE_MAX]; float *outputBuffer; DataType datatype; - SocketReader* imageInput; + SocketReader *imageInput; public: OutputSingleLayerOperation(const Scene *scene, const bNodeTree *tree, DataType datatype, ImageFormatData *format, const char *path); @@ -59,7 +59,7 @@ struct OutputOpenExrLayer { char name[EXR_TOT_MAXNAME-2]; float *outputBuffer; DataType datatype; - SocketReader* imageInput; + SocketReader *imageInput; }; /* Writes inputs into OpenEXR multilayer channels. */ @@ -68,7 +68,7 @@ private: typedef std::vector LayerList; const Scene *scene; - const bNodeTree* tree; + const bNodeTree *tree; char path[FILE_MAX]; char exr_codec; diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cpp b/source/blender/compositor/operations/COM_PreviewOperation.cpp index 4a9d08380ea..2b02546a8f9 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.cpp +++ b/source/blender/compositor/operations/COM_PreviewOperation.cpp @@ -39,7 +39,8 @@ extern "C" { } -PreviewOperation::PreviewOperation() : NodeOperation() { +PreviewOperation::PreviewOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->outputBuffer = NULL; this->input = NULL; @@ -48,7 +49,8 @@ PreviewOperation::PreviewOperation() : NodeOperation() { this->priority = 0; } -void PreviewOperation::initExecution() { +void PreviewOperation::initExecution() +{ this->input = getInputSocketReader(0); if (!this->node->preview) { this->node->preview = (bNodePreview*)MEM_callocN(sizeof(bNodePreview), "node preview"); @@ -64,18 +66,20 @@ void PreviewOperation::initExecution() { if (this->node->preview->rect) { MEM_freeN(this->node->preview->rect); } - this->node->preview->xsize= getWidth(); - this->node->preview->ysize= getHeight(); - this->node->preview->rect= outputBuffer; + this->node->preview->xsize = getWidth(); + this->node->preview->ysize = getHeight(); + this->node->preview->rect = outputBuffer; } } -void PreviewOperation::deinitExecution() { +void PreviewOperation::deinitExecution() +{ this->outputBuffer = NULL; this->input = NULL; } -void PreviewOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer **memoryBuffers) { +void PreviewOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer **memoryBuffers) +{ int offset; float color[4]; for (int y = rect->ymin ; y < rect->ymax ; y++) { @@ -96,7 +100,8 @@ void PreviewOperation::executeRegion(rcti *rect, unsigned int tileNumber, Memory } } } -bool PreviewOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool PreviewOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmin = input->xmin/divider; @@ -106,7 +111,8 @@ bool PreviewOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferO return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } -void PreviewOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void PreviewOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ NodeOperation::determineResolution(resolution, preferredResolution); int width = resolution[0]; int height = resolution[1]; @@ -124,6 +130,7 @@ void PreviewOperation::determineResolution(unsigned int resolution[], unsigned i resolution[1] = height; } -const int PreviewOperation::getRenderPriority() const { +const int PreviewOperation::getRenderPriority() const +{ return this->priority; } diff --git a/source/blender/compositor/operations/COM_PreviewOperation.h b/source/blender/compositor/operations/COM_PreviewOperation.h index c36c85ad746..8450b7fc556 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.h +++ b/source/blender/compositor/operations/COM_PreviewOperation.h @@ -33,9 +33,9 @@ protected: /** * @brief holds reference to the SDNA bNode, where this nodes will render the preview image for */ - bNode* node; - const bNodeTree* tree; - SocketReader* input; + bNode *node; + const bNodeTree *tree; + SocketReader *input; float divider; int priority; @@ -48,8 +48,8 @@ public: void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer **memoryBuffers); void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); - void setbNode(bNode* node) { this->node = node;} - void setbNodeTree(const bNodeTree* tree) { this->tree = tree;} + void setbNode(bNode *node) { this->node = node;} + void setbNodeTree(const bNodeTree *tree) { this->tree = tree;} bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); void setPriority(int priority) { this->priority = priority; } }; diff --git a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp index adb72f9abb3..7695e0f63c2 100644 --- a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp @@ -24,24 +24,28 @@ #include "BLI_math.h" #include "BLI_utildefines.h" -ProjectorLensDistortionOperation::ProjectorLensDistortionOperation(): NodeOperation() { +ProjectorLensDistortionOperation::ProjectorLensDistortionOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->setComplex(true); this->inputProgram = NULL; } -void ProjectorLensDistortionOperation::initExecution() { +void ProjectorLensDistortionOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); kr = 0.25f*MAX2(MIN2(this->dispersion, 1.f), 0.f); kr2 = kr * 20; } -void* ProjectorLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { - void* buffer = inputProgram->initializeTileData(NULL, memoryBuffers); +void *ProjectorLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ + void *buffer = inputProgram->initializeTileData(NULL, memoryBuffers); return buffer; } -void ProjectorLensDistortionOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void ProjectorLensDistortionOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float inputValue[4]; const float height = this->getHeight(); const float width = this->getWidth(); @@ -57,11 +61,13 @@ void ProjectorLensDistortionOperation::executePixel(float* color, int x, int y, color[3] = 1.0f; } -void ProjectorLensDistortionOperation::deinitExecution() { +void ProjectorLensDistortionOperation::deinitExecution() +{ this->inputProgram = NULL; } -bool ProjectorLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool ProjectorLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.ymax = input->ymax; newInput.ymin = input->ymin; diff --git a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h index 6b05dbfcd41..c8788e100c8 100644 --- a/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h +++ b/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h @@ -42,20 +42,20 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * Deinitialize the execution */ void deinitExecution(); - void setData(NodeLensDist* data) {this->data = data;} + void setData(NodeLensDist *data) {this->data = data;} void setDispertion(float dispersion) {this->dispersion = dispersion;} bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); diff --git a/source/blender/compositor/operations/COM_QualityStepHelper.cpp b/source/blender/compositor/operations/COM_QualityStepHelper.cpp index c21163e03ac..f2d700292a4 100644 --- a/source/blender/compositor/operations/COM_QualityStepHelper.cpp +++ b/source/blender/compositor/operations/COM_QualityStepHelper.cpp @@ -22,13 +22,15 @@ #include "COM_QualityStepHelper.h" -QualityStepHelper::QualityStepHelper() { +QualityStepHelper::QualityStepHelper() +{ this->quality = COM_QUALITY_HIGH; this->step = 1; this->offsetadd = 4; } -void QualityStepHelper::initExecution(QualityHelper helper) { +void QualityStepHelper::initExecution(QualityHelper helper) +{ switch (helper) { case COM_QH_INCREASE: switch (this->quality) { diff --git a/source/blender/compositor/operations/COM_QualityStepHelper.h b/source/blender/compositor/operations/COM_QualityStepHelper.h index ff4870f03bd..80b25684c5e 100644 --- a/source/blender/compositor/operations/COM_QualityStepHelper.h +++ b/source/blender/compositor/operations/COM_QualityStepHelper.h @@ -37,12 +37,12 @@ private: protected: /** - * Initialize the execution - */ - void initExecution(QualityHelper helper); + * Initialize the execution + */ + void initExecution(QualityHelper helper); - inline int getStep() const {return this->step;} - inline int getOffsetAdd() const {return this->offsetadd;} + inline int getStep() const {return this->step;} + inline int getOffsetAdd() const {return this->offsetadd;} public: QualityStepHelper(); diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp index 69405ef6d23..d7f95c10cfb 100644 --- a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp @@ -24,16 +24,19 @@ #include "COM_WriteBufferOperation.h" #include "COM_defines.h" -ReadBufferOperation::ReadBufferOperation():NodeOperation() { +ReadBufferOperation::ReadBufferOperation():NodeOperation() +{ this->addOutputSocket(COM_DT_COLOR); this->offset = 0; } -void* ReadBufferOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *ReadBufferOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ return getInputMemoryBuffer(memoryBuffers); } -void ReadBufferOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void ReadBufferOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ if (this->memoryProxy != NULL) { WriteBufferOperation * operation = memoryProxy->getWriteBufferOperation(); operation->determineResolution(resolution, preferredResolution); @@ -43,7 +46,8 @@ void ReadBufferOperation::determineResolution(unsigned int resolution[], unsigne if (memoryProxy->getExecutor()) memoryProxy->getExecutor()->setResolution(resolution); } } -void ReadBufferOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ReadBufferOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ MemoryBuffer *inputBuffer = inputBuffers[this->offset]; if (inputBuffer) { if (sampler == COM_PS_NEAREST) { @@ -55,14 +59,16 @@ void ReadBufferOperation::executePixel(float* color, float x, float y, PixelSamp } } -void ReadBufferOperation::executePixel(float *color, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) { +void ReadBufferOperation::executePixel(float *color, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) +{ MemoryBuffer *inputBuffer = inputBuffers[this->offset]; if (inputBuffer) { inputBuffer->readEWA(color, x, y, dx, dy); } } -bool ReadBufferOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation* readOperation, rcti* output) { +bool ReadBufferOperation::determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti *output) +{ if (this==readOperation) { BLI_init_rcti(output, input->xmin, input->xmax, input->ymin, input->ymax); return true; diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.h b/source/blender/compositor/operations/COM_ReadBufferOperation.h index 807f615f2e1..d58d131264b 100644 --- a/source/blender/compositor/operations/COM_ReadBufferOperation.h +++ b/source/blender/compositor/operations/COM_ReadBufferOperation.h @@ -33,18 +33,18 @@ private: public: ReadBufferOperation(); int isBufferOperation() {return true;} - void setMemoryProxy(MemoryProxy* memoryProxy) {this->memoryProxy = memoryProxy;} - MemoryProxy* getMemoryProxy() {return this->memoryProxy;} + void setMemoryProxy(MemoryProxy *memoryProxy) {this->memoryProxy = memoryProxy;} + MemoryProxy *getMemoryProxy() {return this->memoryProxy;} void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void executePixel(float *color, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]); const bool isReadBufferOperation() const {return true;} void setOffset(unsigned int offset) {this->offset = offset;} unsigned int getOffset() {return this->offset;} - bool determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti* output); - MemoryBuffer* getInputMemoryBuffer(MemoryBuffer** memoryBuffers) {return memoryBuffers[offset];} + bool determineDependingAreaOfInterest(rcti * input, ReadBufferOperation *readOperation, rcti *output); + MemoryBuffer *getInputMemoryBuffer(MemoryBuffer** memoryBuffers) {return memoryBuffers[offset];} }; diff --git a/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp index a73f29c3615..dad082cf0ca 100644 --- a/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersAOOperation.cpp @@ -22,7 +22,8 @@ #include "COM_RenderLayersAOOperation.h" -RenderLayersAOOperation::RenderLayersAOOperation() :RenderLayersBaseProg(SCE_PASS_AO, 3) { +RenderLayersAOOperation::RenderLayersAOOperation() :RenderLayersBaseProg(SCE_PASS_AO, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp index d18915c593b..ccb7dd91c04 100644 --- a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.cpp @@ -22,11 +22,13 @@ #include "COM_RenderLayersAlphaProg.h" -RenderLayersAlphaProg::RenderLayersAlphaProg() :RenderLayersBaseProg(SCE_PASS_COMBINED, 4) { +RenderLayersAlphaProg::RenderLayersAlphaProg() :RenderLayersBaseProg(SCE_PASS_COMBINED, 4) +{ this->addOutputSocket(COM_DT_VALUE); } -void RenderLayersAlphaProg::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void RenderLayersAlphaProg::executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ int ix = x; int iy = y; float * inputBuffer = this->getInputBuffer(); diff --git a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h index 6386915230c..da808f49fdf 100644 --- a/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h +++ b/source/blender/compositor/operations/COM_RenderLayersAlphaProg.h @@ -28,7 +28,7 @@ class RenderLayersAlphaProg : public RenderLayersBaseProg { public: RenderLayersAlphaProg(); - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; diff --git a/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp b/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp index 94ba8973314..35c8753ded6 100644 --- a/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersBaseProg.cpp @@ -31,7 +31,8 @@ extern "C" { #include "RE_render_ext.h" } -RenderLayersBaseProg::RenderLayersBaseProg(int renderpass, int elementsize): NodeOperation() { +RenderLayersBaseProg::RenderLayersBaseProg(int renderpass, int elementsize): NodeOperation() +{ this->renderpass = renderpass; this->setScene(NULL); this->inputBuffer = NULL; @@ -39,27 +40,28 @@ RenderLayersBaseProg::RenderLayersBaseProg(int renderpass, int elementsize): Nod } -void RenderLayersBaseProg::initExecution() { +void RenderLayersBaseProg::initExecution() +{ Scene * scene = this->getScene(); - Render *re= (scene)? RE_GetRender(scene->id.name): NULL; - RenderResult *rr= NULL; + Render *re = (scene)? RE_GetRender(scene->id.name): NULL; + RenderResult *rr = NULL; if (re) - rr= RE_AcquireResultRead(re); + rr = RE_AcquireResultRead(re); if (rr) { - SceneRenderLayer *srl= (SceneRenderLayer*)BLI_findlink(&scene->r.layers, getLayerId()); + SceneRenderLayer *srl = (SceneRenderLayer*)BLI_findlink(&scene->r.layers, getLayerId()); if (srl) { - - RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if (rl && rl->rectf) { - this->inputBuffer = RE_RenderLayerGetPass(rl, renderpass); - - if (this->inputBuffer == NULL || renderpass == SCE_PASS_COMBINED) { - this->inputBuffer = rl->rectf; - } - } - } + + RenderLayer *rl = RE_GetRenderLayer(rr, srl->name); + if (rl && rl->rectf) { + this->inputBuffer = RE_RenderLayerGetPass(rl, renderpass); + + if (this->inputBuffer == NULL || renderpass == SCE_PASS_COMBINED) { + this->inputBuffer = rl->rectf; + } + } + } } if (re) { RE_ReleaseResult(re); @@ -67,7 +69,8 @@ void RenderLayersBaseProg::initExecution() { } } -void RenderLayersBaseProg::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void RenderLayersBaseProg::executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ int ix = x; int iy = y; @@ -100,34 +103,36 @@ void RenderLayersBaseProg::executePixel(float* output, float x, float y, PixelSa } } -void RenderLayersBaseProg::deinitExecution() { +void RenderLayersBaseProg::deinitExecution() +{ this->inputBuffer = NULL; } -void RenderLayersBaseProg::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { - Scene *sce= this->getScene(); - Render *re= (sce)? RE_GetRender(sce->id.name): NULL; - RenderResult *rr= NULL; +void RenderLayersBaseProg::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ + Scene *sce = this->getScene(); + Render *re = (sce) ? RE_GetRender(sce->id.name) : NULL; + RenderResult *rr = NULL; resolution[0] = 0; resolution[1] = 0; if (re) - rr= RE_AcquireResultRead(re); + rr = RE_AcquireResultRead(re); if (rr) { - SceneRenderLayer *srl= (SceneRenderLayer*)BLI_findlink(&sce->r.layers, getLayerId()); + SceneRenderLayer *srl = (SceneRenderLayer*)BLI_findlink(&sce->r.layers, getLayerId()); if (srl) { - RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if (rl && rl->rectf) { - resolution[0]=rl->rectx; - resolution[1]=rl->recty; - } + RenderLayer *rl = RE_GetRenderLayer(rr, srl->name); + if (rl && rl->rectf) { + resolution[0]=rl->rectx; + resolution[1]=rl->recty; + } } } if (re) - RE_ReleaseResult(re); + RE_ReleaseResult(re); } diff --git a/source/blender/compositor/operations/COM_RenderLayersBaseProg.h b/source/blender/compositor/operations/COM_RenderLayersBaseProg.h index a1802d1db65..64e2496621f 100644 --- a/source/blender/compositor/operations/COM_RenderLayersBaseProg.h +++ b/source/blender/compositor/operations/COM_RenderLayersBaseProg.h @@ -45,7 +45,7 @@ private: /** * Reference to the scene object. */ - Scene* scene; + Scene *scene; /** * layerId of the layer where this operation needs to get its data from @@ -55,7 +55,7 @@ private: /** * cached instance to the float buffer inside the layer */ - float* inputBuffer; + float *inputBuffer; /** * renderpass where this operation needs to get its data from @@ -78,7 +78,7 @@ protected: /** * retrieve the reference to the float buffer of the renderer. */ - inline float* getInputBuffer() {return this->inputBuffer;} + inline float *getInputBuffer() {return this->inputBuffer;} public: /** @@ -86,13 +86,13 @@ public: * @see RenderLayerNode to set the actual scene where * the data will be retrieved from. */ - void setScene(Scene* scene) {this->scene = scene;} - Scene* getScene() {return this->scene;} + void setScene(Scene *scene) {this->scene = scene;} + Scene *getScene() {return this->scene;} void setLayerId(short layerId) {this->layerId = layerId;} short getLayerId() {return this->layerId;} void initExecution(); void deinitExecution(); - void executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; diff --git a/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp index 71461ac0e3f..aee68afe55d 100644 --- a/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersColorOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersColorOperation.h" -RenderLayersColorOperation::RenderLayersColorOperation() :RenderLayersBaseProg(SCE_PASS_RGBA, 4) { +RenderLayersColorOperation::RenderLayersColorOperation() :RenderLayersBaseProg(SCE_PASS_RGBA, 4) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp index 17e2c6683d9..fc1df884181 100644 --- a/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersCyclesOperation.h" -RenderLayersCyclesOperation::RenderLayersCyclesOperation(int pass) :RenderLayersBaseProg(pass, 3) { +RenderLayersCyclesOperation::RenderLayersCyclesOperation(int pass) :RenderLayersBaseProg(pass, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp b/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp index badb9189206..985b1c1bee8 100644 --- a/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersDepthProg.cpp @@ -22,7 +22,8 @@ #include "COM_RenderLayersDepthProg.h" -RenderLayersDepthProg::RenderLayersDepthProg() :RenderLayersBaseProg(SCE_PASS_Z, 1) { +RenderLayersDepthProg::RenderLayersDepthProg() :RenderLayersBaseProg(SCE_PASS_Z, 1) +{ this->addOutputSocket(COM_DT_VALUE); } diff --git a/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp index 6c3359ed063..ad73490b92d 100644 --- a/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersDiffuseOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersDiffuseOperation.h" -RenderLayersDiffuseOperation::RenderLayersDiffuseOperation() :RenderLayersBaseProg(SCE_PASS_DIFFUSE, 3) { +RenderLayersDiffuseOperation::RenderLayersDiffuseOperation() :RenderLayersBaseProg(SCE_PASS_DIFFUSE, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp index 936b1f0c59a..7537e2d10fc 100644 --- a/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersEmitOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersEmitOperation.h" -RenderLayersEmitOperation::RenderLayersEmitOperation() :RenderLayersBaseProg(SCE_PASS_EMIT, 3) { +RenderLayersEmitOperation::RenderLayersEmitOperation() :RenderLayersBaseProg(SCE_PASS_EMIT, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp index 642f07d7e16..0ace9a7c58f 100644 --- a/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersEnvironmentOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersEnvironmentOperation.h" -RenderLayersEnvironmentOperation::RenderLayersEnvironmentOperation() :RenderLayersBaseProg(SCE_PASS_ENVIRONMENT, 3) { +RenderLayersEnvironmentOperation::RenderLayersEnvironmentOperation() :RenderLayersBaseProg(SCE_PASS_ENVIRONMENT, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp b/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp index a58f16b10a1..264e2f0fd79 100644 --- a/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersImageProg.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersImageProg.h" -RenderLayersColourProg::RenderLayersColourProg() :RenderLayersBaseProg(SCE_PASS_COMBINED, 4) { +RenderLayersColourProg::RenderLayersColourProg() :RenderLayersBaseProg(SCE_PASS_COMBINED, 4) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp index db61c237c61..645f9768eb2 100644 --- a/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersIndirectOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersIndirectOperation.h" -RenderLayersIndirectOperation::RenderLayersIndirectOperation() :RenderLayersBaseProg(SCE_PASS_INDIRECT, 3) { +RenderLayersIndirectOperation::RenderLayersIndirectOperation() :RenderLayersBaseProg(SCE_PASS_INDIRECT, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp index 96bab2569dd..e5cef7753f2 100644 --- a/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersMaterialIndexOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersMaterialIndexOperation.h" -RenderLayersMaterialIndexOperation::RenderLayersMaterialIndexOperation() :RenderLayersBaseProg(SCE_PASS_INDEXMA, 1) { +RenderLayersMaterialIndexOperation::RenderLayersMaterialIndexOperation() :RenderLayersBaseProg(SCE_PASS_INDEXMA, 1) +{ this->addOutputSocket(COM_DT_VALUE); } diff --git a/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp index d3be993b3f9..fae6c73f747 100644 --- a/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersMistOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersMistOperation.h" -RenderLayersMistOperation::RenderLayersMistOperation() :RenderLayersBaseProg(SCE_PASS_MIST, 1) { +RenderLayersMistOperation::RenderLayersMistOperation() :RenderLayersBaseProg(SCE_PASS_MIST, 1) +{ this->addOutputSocket(COM_DT_VALUE); } diff --git a/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp index dba40e3cc7a..67ea4d68204 100644 --- a/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersNormalOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersNormalOperation.h" -RenderLayersNormalOperation::RenderLayersNormalOperation() :RenderLayersBaseProg(SCE_PASS_NORMAL, 3) { +RenderLayersNormalOperation::RenderLayersNormalOperation() :RenderLayersBaseProg(SCE_PASS_NORMAL, 3) +{ this->addOutputSocket(COM_DT_VECTOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp index d4d14de6d98..821ff447112 100644 --- a/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersObjectIndexOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersObjectIndexOperation.h" -RenderLayersObjectIndexOperation::RenderLayersObjectIndexOperation() :RenderLayersBaseProg(SCE_PASS_INDEXOB, 1) { +RenderLayersObjectIndexOperation::RenderLayersObjectIndexOperation() :RenderLayersBaseProg(SCE_PASS_INDEXOB, 1) +{ this->addOutputSocket(COM_DT_VALUE); } diff --git a/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp index 0417a6fade2..e53144d3501 100644 --- a/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersReflectionOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersReflectionOperation.h" -RenderLayersReflectionOperation::RenderLayersReflectionOperation() :RenderLayersBaseProg(SCE_PASS_REFLECT, 3) { +RenderLayersReflectionOperation::RenderLayersReflectionOperation() :RenderLayersBaseProg(SCE_PASS_REFLECT, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp index 74042f46f78..6e333175220 100644 --- a/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersRefractionOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersRefractionOperation.h" -RenderLayersRefractionOperation::RenderLayersRefractionOperation() :RenderLayersBaseProg(SCE_PASS_REFRACT, 3) { +RenderLayersRefractionOperation::RenderLayersRefractionOperation() :RenderLayersBaseProg(SCE_PASS_REFRACT, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp index 87155607d82..ce492d54a79 100644 --- a/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersShadowOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersShadowOperation.h" -RenderLayersShadowOperation::RenderLayersShadowOperation() :RenderLayersBaseProg(SCE_PASS_SHADOW, 3) { +RenderLayersShadowOperation::RenderLayersShadowOperation() :RenderLayersBaseProg(SCE_PASS_SHADOW, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp index ed6a0853436..7b7d223680c 100644 --- a/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersSpecularOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersSpecularOperation.h" -RenderLayersSpecularOperation::RenderLayersSpecularOperation() :RenderLayersBaseProg(SCE_PASS_SPEC, 3) { +RenderLayersSpecularOperation::RenderLayersSpecularOperation() :RenderLayersBaseProg(SCE_PASS_SPEC, 3) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp index 0a76d04959e..213d044a9bd 100644 --- a/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersSpeedOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersSpeedOperation.h" -RenderLayersSpeedOperation::RenderLayersSpeedOperation() :RenderLayersBaseProg(SCE_PASS_VECTOR, 4) { +RenderLayersSpeedOperation::RenderLayersSpeedOperation() :RenderLayersBaseProg(SCE_PASS_VECTOR, 4) +{ this->addOutputSocket(COM_DT_COLOR); } diff --git a/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp b/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp index b15bbb0f3dd..e3917d7796b 100644 --- a/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersUVOperation.cpp @@ -22,6 +22,7 @@ #include "COM_RenderLayersUVOperation.h" -RenderLayersUVOperation::RenderLayersUVOperation() :RenderLayersBaseProg(SCE_PASS_UV, 3) { +RenderLayersUVOperation::RenderLayersUVOperation() :RenderLayersBaseProg(SCE_PASS_UV, 3) +{ this->addOutputSocket(COM_DT_VECTOR); } diff --git a/source/blender/compositor/operations/COM_RotateOperation.cpp b/source/blender/compositor/operations/COM_RotateOperation.cpp index ac2e8c5e8a9..313e49d8609 100644 --- a/source/blender/compositor/operations/COM_RotateOperation.cpp +++ b/source/blender/compositor/operations/COM_RotateOperation.cpp @@ -23,7 +23,8 @@ #include "COM_RotateOperation.h" #include "BLI_math.h" -RotateOperation::RotateOperation() : NodeOperation() { +RotateOperation::RotateOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); @@ -32,7 +33,8 @@ RotateOperation::RotateOperation() : NodeOperation() { this->degreeSocket = NULL; this->doDegree2RadConversion = false; } -void RotateOperation::initExecution() { +void RotateOperation::initExecution() +{ this->imageSocket = this->getInputSocketReader(0); this->degreeSocket = this->getInputSocketReader(1); this->centerX = this->getWidth()/2.0; @@ -50,13 +52,15 @@ void RotateOperation::initExecution() { this->sine = sin(rad); } -void RotateOperation::deinitExecution() { +void RotateOperation::deinitExecution() +{ this->imageSocket = NULL; this->degreeSocket = NULL; } -void RotateOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void RotateOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ const float dy = y - this->centerY; const float dx = x - this->centerX; const float nx = this->centerX+(this->cosine*dx + this->sine*dy); @@ -64,7 +68,8 @@ void RotateOperation::executePixel(float *color,float x, float y, PixelSampler s this->imageSocket->read(color, nx, ny, sampler, inputBuffers); } -bool RotateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool RotateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; const float dxmin = input->xmin - this->centerX; diff --git a/source/blender/compositor/operations/COM_ScaleOperation.cpp b/source/blender/compositor/operations/COM_ScaleOperation.cpp index ef3d8250bab..ca2095c3170 100644 --- a/source/blender/compositor/operations/COM_ScaleOperation.cpp +++ b/source/blender/compositor/operations/COM_ScaleOperation.cpp @@ -22,7 +22,8 @@ #include "COM_ScaleOperation.h" -ScaleOperation::ScaleOperation() : NodeOperation() { +ScaleOperation::ScaleOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); @@ -32,7 +33,8 @@ ScaleOperation::ScaleOperation() : NodeOperation() { this->inputXOperation = NULL; this->inputYOperation = NULL; } -void ScaleOperation::initExecution() { +void ScaleOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); this->inputXOperation = this->getInputSocketReader(1); this->inputYOperation = this->getInputSocketReader(2); @@ -40,14 +42,16 @@ void ScaleOperation::initExecution() { this->centerY = this->getHeight()/2.0; } -void ScaleOperation::deinitExecution() { +void ScaleOperation::deinitExecution() +{ this->inputOperation = NULL; this->inputXOperation = NULL; this->inputYOperation = NULL; } -void ScaleOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ScaleOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float scaleX[4]; float scaleY[4]; @@ -62,7 +66,8 @@ void ScaleOperation::executePixel(float *color,float x, float y, PixelSampler sa this->inputOperation->read(color, nx, ny, sampler, inputBuffers); } -bool ScaleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool ScaleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; float scaleX[4]; float scaleY[4]; @@ -83,17 +88,19 @@ bool ScaleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOpe // SCALE ABSOLUTE -ScaleAbsoluteOperation::ScaleAbsoluteOperation() : NodeOperation() { +ScaleAbsoluteOperation::ScaleAbsoluteOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); this->setResolutionInputSocketIndex(0); this->inputOperation = NULL; - this->inputXOperation= NULL; + this->inputXOperation = NULL; this->inputYOperation = NULL; } -void ScaleAbsoluteOperation::initExecution() { +void ScaleAbsoluteOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); this->inputXOperation = this->getInputSocketReader(1); this->inputYOperation = this->getInputSocketReader(2); @@ -101,14 +108,16 @@ void ScaleAbsoluteOperation::initExecution() { this->centerY = this->getHeight()/2.0; } -void ScaleAbsoluteOperation::deinitExecution() { +void ScaleAbsoluteOperation::deinitExecution() +{ this->inputOperation = NULL; this->inputXOperation = NULL; this->inputYOperation = NULL; } -void ScaleAbsoluteOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ScaleAbsoluteOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float scaleX[4]; float scaleY[4]; @@ -128,7 +137,8 @@ void ScaleAbsoluteOperation::executePixel(float *color,float x, float y, PixelSa this->inputOperation->read(color, nx, ny, sampler, inputBuffers); } -bool ScaleAbsoluteOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool ScaleAbsoluteOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; float scaleX[4]; float scaleY[4]; @@ -154,28 +164,33 @@ bool ScaleAbsoluteOperation::determineDependingAreaOfInterest(rcti *input, ReadB // Absolute fixed siez -ScaleFixedSizeOperation::ScaleFixedSizeOperation() : NodeOperation() { +ScaleFixedSizeOperation::ScaleFixedSizeOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->setResolutionInputSocketIndex(0); this->inputOperation = NULL; } -void ScaleFixedSizeOperation::initExecution() { +void ScaleFixedSizeOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); this->relX = inputOperation->getWidth() / (float)this->newWidth; this->relY = inputOperation->getHeight() / (float)this->newHeight; } -void ScaleFixedSizeOperation::deinitExecution() { +void ScaleFixedSizeOperation::deinitExecution() +{ this->inputOperation = NULL; } -void ScaleFixedSizeOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ScaleFixedSizeOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ this->inputOperation->read(color, x*relX, y*relY, sampler, inputBuffers); } -bool ScaleFixedSizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool ScaleFixedSizeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = input->xmax *relX; @@ -186,7 +201,8 @@ bool ScaleFixedSizeOperation::determineDependingAreaOfInterest(rcti *input, Read return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } -void ScaleFixedSizeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void ScaleFixedSizeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ unsigned int nr[2]; nr[0] = newWidth; nr[1] = newHeight; diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp index 474874d4bb4..4442fd9075e 100644 --- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp @@ -27,13 +27,15 @@ extern "C" { #include "BLI_rand.h" } -ScreenLensDistortionOperation::ScreenLensDistortionOperation(): NodeOperation() { +ScreenLensDistortionOperation::ScreenLensDistortionOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); this->setComplex(true); this->inputProgram = NULL; } -void ScreenLensDistortionOperation::initExecution() { +void ScreenLensDistortionOperation::initExecution() +{ this->inputProgram = this->getInputSocketReader(0); kg = MAX2(MIN2(this->distortion, 1.f), -0.999f); // smaller dispersion range for somewhat more control @@ -53,15 +55,17 @@ void ScreenLensDistortionOperation::initExecution() { } -void* ScreenLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { - void* buffer = inputProgram->initializeTileData(NULL, memoryBuffers); +void *ScreenLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ + void *buffer = inputProgram->initializeTileData(NULL, memoryBuffers); return buffer; } -void ScreenLensDistortionOperation::executePixel(float* outputColor, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void ScreenLensDistortionOperation::executePixel(float *outputColor, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ const float height = this->getHeight(); const float width = this->getWidth(); - MemoryBuffer* buffer = (MemoryBuffer*)data; + MemoryBuffer *buffer = (MemoryBuffer*)data; int dr = 0, dg = 0, db = 0; float d, t, ln[6] = {0, 0, 0, 0, 0, 0}; @@ -132,21 +136,23 @@ void ScreenLensDistortionOperation::executePixel(float* outputColor, int x, int if (db) outputColor[2] = 2.f*tc[2] / (float)db; /* set alpha */ - outputColor[3]= 1.0f; + outputColor[3] = 1.0f; } else { - outputColor[0]= 0.0f; - outputColor[1]= 0.0f; - outputColor[2]= 0.0f; - outputColor[3]= 0.0f; + outputColor[0] = 0.0f; + outputColor[1] = 0.0f; + outputColor[2] = 0.0f; + outputColor[3] = 0.0f; } } -void ScreenLensDistortionOperation::deinitExecution() { +void ScreenLensDistortionOperation::deinitExecution() +{ this->inputProgram = NULL; } -void ScreenLensDistortionOperation::determineUV(float result[2], float x, float y) const { +void ScreenLensDistortionOperation::determineUV(float result[2], float x, float y) const +{ const float v = sc*((y + 0.5f) - cy)/cy; const float u = sc*((x + 0.5f) - cx)/cx; const float t = ABS(MIN3(kr, kg, kb)*4); @@ -155,7 +161,8 @@ void ScreenLensDistortionOperation::determineUV(float result[2], float x, float result[1] = (v*d + 0.5f)*getHeight() - 0.5f; } -bool ScreenLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool ScreenLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmin = 0; newInput.ymin = 0; diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h index 65262cfd3dd..d2db55ea214 100644 --- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h +++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h @@ -30,7 +30,7 @@ private: /** * Cached reference to the inputProgram */ - SocketReader* inputProgram; + SocketReader *inputProgram; NodeLensDist * data; @@ -48,27 +48,27 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); /** * Deinitialize the execution */ void deinitExecution(); - void setData(NodeLensDist* data) {this->data = data;} + void setData(NodeLensDist *data) {this->data = data;} void setDispertion(float dispersion) {this->dispersion = dispersion;} void setDistortion(float distortion) {this->distortion = distortion;} bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); private: - void determineUV(float* result, float x, float y) const; + void determineUV(float *result, float x, float y) const; }; #endif diff --git a/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp b/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp index 4e0ad1580cd..680e1648ebd 100644 --- a/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp +++ b/source/blender/compositor/operations/COM_SeparateChannelOperation.cpp @@ -22,21 +22,25 @@ #include "COM_SeparateChannelOperation.h" -SeparateChannelOperation::SeparateChannelOperation() : NodeOperation() { +SeparateChannelOperation::SeparateChannelOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_VALUE); this->inputOperation = NULL; } -void SeparateChannelOperation::initExecution() { +void SeparateChannelOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void SeparateChannelOperation::deinitExecution() { +void SeparateChannelOperation::deinitExecution() +{ this->inputOperation = NULL; } -void SeparateChannelOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SeparateChannelOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float input[4]; this->inputOperation->read(input, x, y, sampler, inputBuffers); color[0] = input[this->channel]; diff --git a/source/blender/compositor/operations/COM_SetAlphaOperation.cpp b/source/blender/compositor/operations/COM_SetAlphaOperation.cpp index b6545912a80..0aefb075b64 100644 --- a/source/blender/compositor/operations/COM_SetAlphaOperation.cpp +++ b/source/blender/compositor/operations/COM_SetAlphaOperation.cpp @@ -22,7 +22,8 @@ #include "COM_SetAlphaOperation.h" -SetAlphaOperation::SetAlphaOperation(): NodeOperation() { +SetAlphaOperation::SetAlphaOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); @@ -31,12 +32,14 @@ SetAlphaOperation::SetAlphaOperation(): NodeOperation() { this->inputAlpha = NULL; } -void SetAlphaOperation::initExecution() { +void SetAlphaOperation::initExecution() +{ this->inputColor = getInputSocketReader(0); this->inputAlpha = getInputSocketReader(1); } -void SetAlphaOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SetAlphaOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float alphaInput[4]; this->inputColor->read(outputValue, x, y, sampler, inputBuffers); @@ -45,7 +48,8 @@ void SetAlphaOperation::executePixel(float* outputValue, float x, float y, Pixel outputValue[3] = alphaInput[0]; } -void SetAlphaOperation::deinitExecution() { +void SetAlphaOperation::deinitExecution() +{ this->inputColor = NULL; this->inputAlpha = NULL; } diff --git a/source/blender/compositor/operations/COM_SetAlphaOperation.h b/source/blender/compositor/operations/COM_SetAlphaOperation.h index 2cb42bf8cf3..3d9caabf880 100644 --- a/source/blender/compositor/operations/COM_SetAlphaOperation.h +++ b/source/blender/compositor/operations/COM_SetAlphaOperation.h @@ -43,7 +43,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); diff --git a/source/blender/compositor/operations/COM_SetColorOperation.cpp b/source/blender/compositor/operations/COM_SetColorOperation.cpp index 729a8073d7a..50ff2a87a72 100644 --- a/source/blender/compositor/operations/COM_SetColorOperation.cpp +++ b/source/blender/compositor/operations/COM_SetColorOperation.cpp @@ -22,18 +22,21 @@ #include "COM_SetColorOperation.h" -SetColorOperation::SetColorOperation(): NodeOperation() { +SetColorOperation::SetColorOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_COLOR); } -void SetColorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SetColorOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ outputValue[0] = this->channel1; outputValue[1] = this->channel2; outputValue[2] = this->channel3; outputValue[3] = this->channel4; } -void SetColorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void SetColorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ resolution[0] = preferredResolution[0]; resolution[1] = preferredResolution[1]; } diff --git a/source/blender/compositor/operations/COM_SetColorOperation.h b/source/blender/compositor/operations/COM_SetColorOperation.h index 13d4bc21392..dad3cfd7fc9 100644 --- a/source/blender/compositor/operations/COM_SetColorOperation.h +++ b/source/blender/compositor/operations/COM_SetColorOperation.h @@ -55,7 +55,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); const bool isSetOperation() const {return true;} diff --git a/source/blender/compositor/operations/COM_SetSamplerOperation.cpp b/source/blender/compositor/operations/COM_SetSamplerOperation.cpp index d5fda4a8827..8974554e700 100644 --- a/source/blender/compositor/operations/COM_SetSamplerOperation.cpp +++ b/source/blender/compositor/operations/COM_SetSamplerOperation.cpp @@ -22,18 +22,22 @@ #include "COM_SetSamplerOperation.h" -SetSamplerOperation::SetSamplerOperation(): NodeOperation() { +SetSamplerOperation::SetSamplerOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR); } -void SetSamplerOperation::initExecution() { +void SetSamplerOperation::initExecution() +{ this->reader = this->getInputSocketReader(0); } -void SetSamplerOperation::deinitExecution() { +void SetSamplerOperation::deinitExecution() +{ this->reader = NULL; } -void SetSamplerOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SetSamplerOperation::executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ reader->read(output, x, y, this->sampler, inputBuffers); } diff --git a/source/blender/compositor/operations/COM_SetSamplerOperation.h b/source/blender/compositor/operations/COM_SetSamplerOperation.h index f7b850fcfe9..49bbae7e4ff 100644 --- a/source/blender/compositor/operations/COM_SetSamplerOperation.h +++ b/source/blender/compositor/operations/COM_SetSamplerOperation.h @@ -44,7 +44,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void initExecution(); void deinitExecution(); }; diff --git a/source/blender/compositor/operations/COM_SetValueOperation.cpp b/source/blender/compositor/operations/COM_SetValueOperation.cpp index a8a681a6659..abd4acafea6 100644 --- a/source/blender/compositor/operations/COM_SetValueOperation.cpp +++ b/source/blender/compositor/operations/COM_SetValueOperation.cpp @@ -22,15 +22,18 @@ #include "COM_SetValueOperation.h" -SetValueOperation::SetValueOperation(): NodeOperation() { +SetValueOperation::SetValueOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_VALUE); } -void SetValueOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SetValueOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ outputValue[0] = this->value; } -void SetValueOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void SetValueOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ resolution[0] = preferredResolution[0]; resolution[1] = preferredResolution[1]; } diff --git a/source/blender/compositor/operations/COM_SetValueOperation.h b/source/blender/compositor/operations/COM_SetValueOperation.h index 30a8de16dc4..25810cd7ee5 100644 --- a/source/blender/compositor/operations/COM_SetValueOperation.h +++ b/source/blender/compositor/operations/COM_SetValueOperation.h @@ -46,7 +46,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); const bool isSetOperation() const {return true;} diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.cpp b/source/blender/compositor/operations/COM_SetVectorOperation.cpp index 3e9b68ac971..70477de0514 100644 --- a/source/blender/compositor/operations/COM_SetVectorOperation.cpp +++ b/source/blender/compositor/operations/COM_SetVectorOperation.cpp @@ -23,18 +23,21 @@ #include "COM_SetVectorOperation.h" #include "COM_defines.h" -SetVectorOperation::SetVectorOperation(): NodeOperation() { +SetVectorOperation::SetVectorOperation(): NodeOperation() +{ this->addOutputSocket(COM_DT_VECTOR); } -void SetVectorOperation::executePixel(float* outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SetVectorOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ outputValue[0] = this->x; outputValue[1] = this->y; outputValue[2] = this->z; outputValue[3] = this->w; } -void SetVectorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void SetVectorOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ if (preferredResolution[0] == 0 ||preferredResolution[1]==0) { resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.h b/source/blender/compositor/operations/COM_SetVectorOperation.h index c1f3c679b5b..9b5dd3ce674 100644 --- a/source/blender/compositor/operations/COM_SetVectorOperation.h +++ b/source/blender/compositor/operations/COM_SetVectorOperation.h @@ -54,7 +54,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]); const bool isSetOperation() const {return true;} diff --git a/source/blender/compositor/operations/COM_SocketProxyOperation.cpp b/source/blender/compositor/operations/COM_SocketProxyOperation.cpp index 161bdb3e295..6ed877523d1 100644 --- a/source/blender/compositor/operations/COM_SocketProxyOperation.cpp +++ b/source/blender/compositor/operations/COM_SocketProxyOperation.cpp @@ -22,20 +22,24 @@ #include "COM_SocketProxyOperation.h" -SocketProxyOperation::SocketProxyOperation() : NodeOperation() { +SocketProxyOperation::SocketProxyOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR/*|COM_DT_VECTOR|COM_DT_VALUE*/); this->addOutputSocket(COM_DT_COLOR); this->inputOperation = NULL; } -void SocketProxyOperation::initExecution() { +void SocketProxyOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); } -void SocketProxyOperation::deinitExecution() { +void SocketProxyOperation::deinitExecution() +{ this->inputOperation = NULL; } -void SocketProxyOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void SocketProxyOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ this->inputOperation->read(color, x, y, sampler, inputBuffers); } diff --git a/source/blender/compositor/operations/COM_SplitViewerOperation.cpp b/source/blender/compositor/operations/COM_SplitViewerOperation.cpp index f2d5e491001..4601bebb49f 100644 --- a/source/blender/compositor/operations/COM_SplitViewerOperation.cpp +++ b/source/blender/compositor/operations/COM_SplitViewerOperation.cpp @@ -36,30 +36,34 @@ extern "C" { } -SplitViewerOperation::SplitViewerOperation() : ViewerBaseOperation() { +SplitViewerOperation::SplitViewerOperation() : ViewerBaseOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR); this->image1Input = NULL; this->image2Input = NULL; } -void SplitViewerOperation::initExecution() { +void SplitViewerOperation::initExecution() +{ // When initializing the tree during initial load the width and height can be zero. this->image1Input = getInputSocketReader(0); this->image2Input = getInputSocketReader(1); ViewerBaseOperation::initExecution(); } -void SplitViewerOperation::deinitExecution() { +void SplitViewerOperation::deinitExecution() +{ this->image1Input = NULL; this->image2Input = NULL; ViewerBaseOperation::deinitExecution(); } -void SplitViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { - float* buffer = this->outputBuffer; - unsigned char* bufferDisplay = this->outputBufferDisplay; +void SplitViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) +{ + float *buffer = this->outputBuffer; + unsigned char *bufferDisplay = this->outputBufferDisplay; if (!buffer) return; int x1 = rect->xmin; diff --git a/source/blender/compositor/operations/COM_SplitViewerOperation.h b/source/blender/compositor/operations/COM_SplitViewerOperation.h index 61e4b027cec..2c3163f0b0a 100644 --- a/source/blender/compositor/operations/COM_SplitViewerOperation.h +++ b/source/blender/compositor/operations/COM_SplitViewerOperation.h @@ -28,8 +28,8 @@ class SplitViewerOperation : public ViewerBaseOperation { private: - SocketReader* image1Input; - SocketReader* image2Input; + SocketReader *image1Input; + SocketReader *image2Input; float splitPercentage; bool xSplit; diff --git a/source/blender/compositor/operations/COM_TextureOperation.cpp b/source/blender/compositor/operations/COM_TextureOperation.cpp index 3eb08140914..f7edd922376 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.cpp +++ b/source/blender/compositor/operations/COM_TextureOperation.cpp @@ -25,30 +25,36 @@ #include "BLI_listbase.h" #include "DNA_scene_types.h" -TextureBaseOperation::TextureBaseOperation(): NodeOperation() { +TextureBaseOperation::TextureBaseOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_VECTOR);//offset this->addInputSocket(COM_DT_VECTOR);//size this->texture = NULL; this->inputSize = NULL; this->inputOffset = NULL; } -TextureOperation::TextureOperation() : TextureBaseOperation() { +TextureOperation::TextureOperation() : TextureBaseOperation() +{ this->addOutputSocket(COM_DT_COLOR); } -TextureAlphaOperation::TextureAlphaOperation() : TextureBaseOperation() { +TextureAlphaOperation::TextureAlphaOperation() : TextureBaseOperation() +{ this->addOutputSocket(COM_DT_VALUE); } -void TextureBaseOperation::initExecution() { +void TextureBaseOperation::initExecution() +{ this->inputOffset = getInputSocketReader(0); this->inputSize = getInputSocketReader(1); } -void TextureBaseOperation::deinitExecution() { +void TextureBaseOperation::deinitExecution() +{ this->inputSize = NULL; this->inputOffset = NULL; } -void TextureBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { +void TextureBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) +{ if (preferredResolution[0] == 0 || preferredResolution[1] == 0) { resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; @@ -59,7 +65,8 @@ void TextureBaseOperation::determineResolution(unsigned int resolution[], unsign } } -void TextureAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void TextureAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ TextureBaseOperation::executePixel(color, x, y, sampler, inputBuffers); color[0] = color[3]; color[1] = 0.0f; @@ -67,7 +74,8 @@ void TextureAlphaOperation::executePixel(float *color, float x, float y, PixelSa color[3] = 0.0f; } -void TextureBaseOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void TextureBaseOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; float textureSize[4]; float textureOffset[4]; @@ -81,21 +89,21 @@ void TextureBaseOperation::executePixel(float *color, float x, float y, PixelSam this->inputSize->read(textureSize, x, y, sampler, inputBuffers); this->inputOffset->read(textureOffset, x, y, sampler, inputBuffers); - vec[0]= textureSize[0]*(u + textureOffset[0]); - vec[1]= textureSize[1]*(v + textureOffset[1]); - vec[2]= textureSize[2]*textureOffset[2]; + vec[0] = textureSize[0]*(u + textureOffset[0]); + vec[1] = textureSize[1]*(v + textureOffset[1]); + vec[2] = textureSize[2]*textureOffset[2]; - retval= multitex_ext(this->texture, vec, NULL, NULL, 0, &texres); + retval = multitex_ext(this->texture, vec, NULL, NULL, 0, &texres); if (texres.talpha) - color[3]= texres.ta; + color[3] = texres.ta; else - color[3]= texres.tin; + color[3] = texres.tin; if ((retval & TEX_RGB)) { - color[0]= texres.tr; - color[1]= texres.tg; - color[2]= texres.tb; + color[0] = texres.tr; + color[1] = texres.tg; + color[2] = texres.tb; } - else color[0]= color[1]= color[2]= color[3]; + else color[0] = color[1] = color[2] = color[3]; } diff --git a/source/blender/compositor/operations/COM_TextureOperation.h b/source/blender/compositor/operations/COM_TextureOperation.h index a545a5eea97..ee067df2c64 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.h +++ b/source/blender/compositor/operations/COM_TextureOperation.h @@ -42,7 +42,7 @@ extern "C" { */ class TextureBaseOperation : public NodeOperation { private: - Tex* texture; + Tex *texture; SocketReader *inputSize; SocketReader *inputOffset; @@ -61,7 +61,7 @@ protected: public: void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); - void setTexture(Tex* texture) {this->texture = texture;} + void setTexture(Tex *texture) {this->texture = texture;} void initExecution(); void deinitExecution(); }; diff --git a/source/blender/compositor/operations/COM_TonemapOperation.cpp b/source/blender/compositor/operations/COM_TonemapOperation.cpp index 84e893d0b2e..56830f4970d 100644 --- a/source/blender/compositor/operations/COM_TonemapOperation.cpp +++ b/source/blender/compositor/operations/COM_TonemapOperation.cpp @@ -26,7 +26,8 @@ -TonemapOperation::TonemapOperation(): NodeOperation() { +TonemapOperation::TonemapOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); this->addOutputSocket(COM_DT_COLOR); this->imageReader = NULL; @@ -34,12 +35,14 @@ TonemapOperation::TonemapOperation(): NodeOperation() { this->cachedInstance = NULL; this->setComplex(true); } -void TonemapOperation::initExecution() { +void TonemapOperation::initExecution() +{ this->imageReader = this->getInputSocketReader(0); NodeOperation::initMutex(); } -void TonemapOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { +void TonemapOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data) +{ AvgLogLum * avg = (AvgLogLum*)data; float output[4]; @@ -65,7 +68,8 @@ void TonemapOperation::executePixel(float* color, int x, int y, MemoryBuffer *in color[2] = output[2]; color[3] = output[3]; } -void PhotoreceptorTonemapOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data) { +void PhotoreceptorTonemapOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data) +{ AvgLogLum * avg = (AvgLogLum*)data; NodeTonemap *ntm = this->data; @@ -96,7 +100,8 @@ void PhotoreceptorTonemapOperation::executePixel(float* color, int x, int y, Mem color[3] = output[3]; } -void TonemapOperation::deinitExecution() { +void TonemapOperation::deinitExecution() +{ this->imageReader = NULL; if (this->cachedInstance) { delete cachedInstance; @@ -104,10 +109,11 @@ void TonemapOperation::deinitExecution() { NodeOperation::deinitMutex(); } -bool TonemapOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool TonemapOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti imageInput; - NodeOperation* operation = getInputOperation(0); + NodeOperation *operation = getInputOperation(0); imageInput.xmax = operation->getWidth(); imageInput.xmin = 0; imageInput.ymax = operation->getHeight(); @@ -118,17 +124,18 @@ bool TonemapOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferO return false; } -void* TonemapOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *TonemapOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ BLI_mutex_lock(getMutex()); if (this->cachedInstance == NULL) { - MemoryBuffer* tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); + MemoryBuffer *tile = (MemoryBuffer*)imageReader->initializeTileData(rect, memoryBuffers); AvgLogLum *data = new AvgLogLum(); float * buffer = tile->getBuffer(); float lsum = 0; int p = tile->getWidth() * tile->getHeight(); - float* bc = buffer; + float *bc = buffer; float avl, maxl = -1e10f, minl = 1e10f; const float sc = 1.f/(p); float Lav = 0.f; @@ -159,5 +166,6 @@ void* TonemapOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuff return this->cachedInstance; } -void TonemapOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) { +void TonemapOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) +{ } diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h index c895fdcba77..e7ea4f039f2 100644 --- a/source/blender/compositor/operations/COM_TonemapOperation.h +++ b/source/blender/compositor/operations/COM_TonemapOperation.h @@ -64,14 +64,14 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); /** * Initialize the execution */ void initExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data); /** @@ -79,7 +79,7 @@ public: */ void deinitExecution(); - void setData(NodeTonemap* data) {this->data = data;} + void setData(NodeTonemap *data) {this->data = data;} bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); @@ -97,7 +97,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void * data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void * data); }; #endif diff --git a/source/blender/compositor/operations/COM_TranslateOperation.cpp b/source/blender/compositor/operations/COM_TranslateOperation.cpp index 48774833e14..6d2fdfc11d0 100644 --- a/source/blender/compositor/operations/COM_TranslateOperation.cpp +++ b/source/blender/compositor/operations/COM_TranslateOperation.cpp @@ -22,7 +22,8 @@ #include "COM_TranslateOperation.h" -TranslateOperation::TranslateOperation() : NodeOperation() { +TranslateOperation::TranslateOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_VALUE); @@ -32,7 +33,8 @@ TranslateOperation::TranslateOperation() : NodeOperation() { this->inputXOperation = NULL; this->inputYOperation = NULL; } -void TranslateOperation::initExecution() { +void TranslateOperation::initExecution() +{ this->inputOperation = this->getInputSocketReader(0); this->inputXOperation = this->getInputSocketReader(1); this->inputYOperation = this->getInputSocketReader(2); @@ -44,18 +46,21 @@ void TranslateOperation::initExecution() { this->deltaY = tempDelta[0]; } -void TranslateOperation::deinitExecution() { +void TranslateOperation::deinitExecution() +{ this->inputOperation = NULL; this->inputXOperation = NULL; this->inputYOperation = NULL; } -void TranslateOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void TranslateOperation::executePixel(float *color,float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ this->inputOperation->read(color, x-this->getDeltaX(), y-this->getDeltaY(), sampler, inputBuffers); } -bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool TranslateOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; newInput.xmax = input->xmax - this->getDeltaX(); diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp index 83b9f55b431..f14de097dfd 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp @@ -27,7 +27,8 @@ extern "C" { #include "RE_pipeline.h" } -VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() : NodeOperation() { +VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() : NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); // do not resize the bokeh image. this->addInputSocket(COM_DT_VALUE); @@ -42,14 +43,16 @@ VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() : NodeOperation } -void VariableSizeBokehBlurOperation::initExecution() { +void VariableSizeBokehBlurOperation::initExecution() +{ this->inputProgram = getInputSocketReader(0); this->inputBokehProgram = getInputSocketReader(1); this->inputSizeProgram = getInputSocketReader(2); QualityStepHelper::initExecution(COM_QH_INCREASE); } -void VariableSizeBokehBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { +void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ float tempColor[4]; float readColor[4]; float bokeh[4]; @@ -87,8 +90,8 @@ void VariableSizeBokehBlurOperation::executePixel(float* color, int x, int y, Me /* pass */ } else if (size>= fabs(dx) && size >= fabs(dy)) { - float u = 256+ dx*256/size; - float v = 256+ dy*256/size; + float u = 256 + dx*256/size; + float v = 256 + dy*256/size; inputBokehProgram->read(bokeh, u, v, COM_PS_NEAREST, inputBuffers); inputProgram->read(readColor, nx, ny, COM_PS_NEAREST, inputBuffers); tempColor[0] += bokeh[0] * readColor[0]; @@ -109,13 +112,15 @@ void VariableSizeBokehBlurOperation::executePixel(float* color, int x, int y, Me } -void VariableSizeBokehBlurOperation::deinitExecution() { +void VariableSizeBokehBlurOperation::deinitExecution() +{ this->inputProgram = NULL; this->inputBokehProgram = NULL; this->inputSizeProgram = NULL; } -bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ rcti newInput; rcti bokehInput; @@ -128,7 +133,7 @@ bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest(rcti *inpu bokehInput.ymax = 512; bokehInput.ymin = 0; - NodeOperation* operation = getInputOperation(2); + NodeOperation *operation = getInputOperation(2); if (operation->determineDependingAreaOfInterest(&newInput, readOperation, output) ) { return true; } diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h index 6c3159a8092..9c2c4b4bf68 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h @@ -29,9 +29,9 @@ class VariableSizeBokehBlurOperation : public NodeOperation, public QualityStepH private: int maxBlur; float threshold; - SocketReader* inputProgram; - SocketReader* inputBokehProgram; - SocketReader* inputSizeProgram; + SocketReader *inputProgram; + SocketReader *inputBokehProgram; + SocketReader *inputSizeProgram; public: VariableSizeBokehBlurOperation(); @@ -39,7 +39,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp index 7b6ebe9728f..e6305dc26a2 100644 --- a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp @@ -28,7 +28,8 @@ extern "C" { #include "RE_pipeline.h" } -VectorBlurOperation::VectorBlurOperation(): NodeOperation() { +VectorBlurOperation::VectorBlurOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); // ZBUF this->addInputSocket(COM_DT_COLOR); //SPEED @@ -40,7 +41,8 @@ VectorBlurOperation::VectorBlurOperation(): NodeOperation() { this->inputZProgram = NULL; setComplex(true); } -void VectorBlurOperation::initExecution() { +void VectorBlurOperation::initExecution() +{ initMutex(); this->inputImageProgram = getInputSocketReader(0); this->inputZProgram = getInputSocketReader(1); @@ -50,8 +52,9 @@ void VectorBlurOperation::initExecution() { } -void VectorBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data) { - float* buffer = (float*) data; +void VectorBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ + float *buffer = (float*) data; int index = (y*this->getWidth() + x) * COM_NUMBER_OF_CHANNELS; color[0] = buffer[index]; color[1] = buffer[index+1]; @@ -59,7 +62,8 @@ void VectorBlurOperation::executePixel(float* color, int x, int y, MemoryBuffer color[3] = buffer[index+3]; } -void VectorBlurOperation::deinitExecution() { +void VectorBlurOperation::deinitExecution() +{ deinitMutex(); this->inputImageProgram = NULL; this->inputSpeedProgram = NULL; @@ -69,15 +73,16 @@ void VectorBlurOperation::deinitExecution() { this->cachedInstance = NULL; } } -void* VectorBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { +void *VectorBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ if (this->cachedInstance) return this->cachedInstance; BLI_mutex_lock(getMutex()); if (this->cachedInstance == NULL) { - MemoryBuffer* tile = (MemoryBuffer*)inputImageProgram->initializeTileData(rect, memoryBuffers); - MemoryBuffer* speed= (MemoryBuffer*)inputSpeedProgram->initializeTileData(rect, memoryBuffers); - MemoryBuffer* z = (MemoryBuffer*)inputZProgram->initializeTileData(rect, memoryBuffers); - float* data = new float[this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS]; + MemoryBuffer *tile = (MemoryBuffer*)inputImageProgram->initializeTileData(rect, memoryBuffers); + MemoryBuffer *speed = (MemoryBuffer*)inputSpeedProgram->initializeTileData(rect, memoryBuffers); + MemoryBuffer *z = (MemoryBuffer*)inputZProgram->initializeTileData(rect, memoryBuffers); + float *data = new float[this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS]; memcpy(data, tile->getBuffer(),this->getWidth()*this->getHeight()*COM_NUMBER_OF_CHANNELS*sizeof(float)); this->generateVectorBlur(data, tile, speed, z); this->cachedInstance = data; @@ -86,7 +91,8 @@ void* VectorBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryB return this->cachedInstance; } -bool VectorBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { +bool VectorBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ if (this->cachedInstance == NULL) { rcti newInput; newInput.xmax = this->getWidth(); @@ -100,7 +106,8 @@ bool VectorBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBuff } } -void VectorBlurOperation::generateVectorBlur(float* data, MemoryBuffer* inputImage, MemoryBuffer* inputSpeed, MemoryBuffer* inputZ) { +void VectorBlurOperation::generateVectorBlur(float *data, MemoryBuffer *inputImage, MemoryBuffer *inputSpeed, MemoryBuffer *inputZ) +{ float *zbuf = inputZ->convertToValueBuffer(); NodeBlurData blurdata; blurdata.samples = this->settings->samples/QualityStepHelper::getStep(); diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.h b/source/blender/compositor/operations/COM_VectorBlurOperation.h index e3275f1bc15..2c45628726d 100644 --- a/source/blender/compositor/operations/COM_VectorBlurOperation.h +++ b/source/blender/compositor/operations/COM_VectorBlurOperation.h @@ -40,7 +40,7 @@ private: */ NodeBlurData * settings; - float* cachedInstance; + float *cachedInstance; public: VectorBlurOperation(); @@ -48,7 +48,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, int x, int y, MemoryBuffer *inputBuffers[], void* data); + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); /** * Initialize the execution @@ -60,13 +60,13 @@ public: */ void deinitExecution(); - void* initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); void setVectorBlurSettings(NodeBlurData * settings) {this->settings = settings;} bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); protected: - void generateVectorBlur(float* data, MemoryBuffer* inputImage, MemoryBuffer* inputSpeed, MemoryBuffer* inputZ); + void generateVectorBlur(float *data, MemoryBuffer *inputImage, MemoryBuffer *inputSpeed, MemoryBuffer *inputZ); }; diff --git a/source/blender/compositor/operations/COM_VectorCurveOperation.cpp b/source/blender/compositor/operations/COM_VectorCurveOperation.cpp index 697d082c33e..e9045b126e2 100644 --- a/source/blender/compositor/operations/COM_VectorCurveOperation.cpp +++ b/source/blender/compositor/operations/COM_VectorCurveOperation.cpp @@ -30,27 +30,31 @@ extern "C" { } #endif -VectorCurveOperation::VectorCurveOperation(): CurveBaseOperation() { +VectorCurveOperation::VectorCurveOperation(): CurveBaseOperation() +{ this->addInputSocket(COM_DT_VECTOR); this->addOutputSocket(COM_DT_VECTOR); this->inputProgram = NULL; } -void VectorCurveOperation::initExecution() { +void VectorCurveOperation::initExecution() +{ CurveBaseOperation::initExecution(); this->inputProgram = this->getInputSocketReader(0); } -void VectorCurveOperation::executePixel(float* output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void VectorCurveOperation::executePixel(float *output, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float input[4]; this->inputProgram->read(input, x, y, sampler, inputBuffers); curvemapping_evaluate_premulRGBF(this->curveMapping, output, input); - output[3]= input[3]; + output[3] = input[3]; } -void VectorCurveOperation::deinitExecution() { +void VectorCurveOperation::deinitExecution() +{ this->inputProgram = NULL; } diff --git a/source/blender/compositor/operations/COM_VectorCurveOperation.h b/source/blender/compositor/operations/COM_VectorCurveOperation.h index d3097345ae5..759e265220f 100644 --- a/source/blender/compositor/operations/COM_VectorCurveOperation.h +++ b/source/blender/compositor/operations/COM_VectorCurveOperation.h @@ -37,7 +37,7 @@ public: /** * the inner loop of this program */ - void executePixel(float* Vector, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *Vector, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); /** * Initialize the execution diff --git a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp index 85b5cc4c3a8..44b4c26fb64 100644 --- a/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_ViewerBaseOperation.cpp @@ -38,7 +38,8 @@ extern "C" { } -ViewerBaseOperation::ViewerBaseOperation() : NodeOperation() { +ViewerBaseOperation::ViewerBaseOperation() : NodeOperation() +{ this->setImage(NULL); this->setImageUser(NULL); this->outputBuffer = NULL; @@ -47,25 +48,27 @@ ViewerBaseOperation::ViewerBaseOperation() : NodeOperation() { this->doColorManagement = true; } -void ViewerBaseOperation::initExecution() { +void ViewerBaseOperation::initExecution() +{ // When initializing the tree during initial load the width and height can be zero. initImage(); } -void ViewerBaseOperation::initImage() { - Image* anImage = this->image; - ImBuf *ibuf= BKE_image_acquire_ibuf(anImage, this->imageUser, &this->lock); +void ViewerBaseOperation::initImage() +{ + Image *anImage = this->image; + ImBuf *ibuf = BKE_image_acquire_ibuf(anImage, this->imageUser, &this->lock); if (!ibuf) return; if (ibuf->x != (int)getWidth() || ibuf->y != (int)getHeight()) { imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); - ibuf->x= getWidth(); - ibuf->y= getHeight(); + ibuf->x = getWidth(); + ibuf->y = getHeight(); imb_addrectImBuf(ibuf); imb_addrectfloatImBuf(ibuf); - anImage->ok= IMA_OK_LOADED; + anImage->ok = IMA_OK_LOADED; } /* now we combine the input with ibuf */ @@ -74,16 +77,19 @@ void ViewerBaseOperation::initImage() { BKE_image_release_ibuf(this->image, this->lock); } -void ViewerBaseOperation:: updateImage(rcti *rect) { +void ViewerBaseOperation:: updateImage(rcti *rect) +{ /// @todo: introduce new event to update smaller area WM_main_add_notifier(NC_WINDOW|ND_DRAW, NULL); } -void ViewerBaseOperation::deinitExecution() { +void ViewerBaseOperation::deinitExecution() +{ this->outputBuffer = NULL; } -const int ViewerBaseOperation::getRenderPriority() const { +const int ViewerBaseOperation::getRenderPriority() const +{ if (this->isActiveViewerOutput()) { return 8; } diff --git a/source/blender/compositor/operations/COM_ViewerBaseOperation.h b/source/blender/compositor/operations/COM_ViewerBaseOperation.h index e94d2644e36..58101911550 100644 --- a/source/blender/compositor/operations/COM_ViewerBaseOperation.h +++ b/source/blender/compositor/operations/COM_ViewerBaseOperation.h @@ -34,7 +34,7 @@ protected: ImageUser * imageUser; void *lock; bool active; - const bNodeTree* tree; + const bNodeTree *tree; float centerX; float centerY; OrderOfChunks chunkOrder; @@ -45,11 +45,11 @@ public: bool isOutputOperation(bool rendering) const {return true;} void initExecution(); void deinitExecution(); - void setImage(Image* image) {this->image = image;} - void setImageUser(ImageUser* imageUser) {this->imageUser = imageUser;} + void setImage(Image *image) {this->image = image;} + void setImageUser(ImageUser *imageUser) {this->imageUser = imageUser;} const bool isActiveViewerOutput() const {return active;} void setActive(bool active) {this->active = active;} - void setbNodeTree(const bNodeTree* tree) {this->tree = tree;} + void setbNodeTree(const bNodeTree *tree) {this->tree = tree;} void setCenterX(float centerX) {this->centerX = centerX;} void setCenterY(float centerY) {this->centerY = centerY;} void setChunkOrder(OrderOfChunks tileOrder) {this->chunkOrder = tileOrder;} diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cpp b/source/blender/compositor/operations/COM_ViewerOperation.cpp index 8fa63329e1f..22e6511fbe7 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.cpp +++ b/source/blender/compositor/operations/COM_ViewerOperation.cpp @@ -39,7 +39,8 @@ extern "C" { } -ViewerOperation::ViewerOperation() : ViewerBaseOperation() { +ViewerOperation::ViewerOperation() : ViewerBaseOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); @@ -47,23 +48,26 @@ ViewerOperation::ViewerOperation() : ViewerBaseOperation() { this->alphaInput = NULL; } -void ViewerOperation::initExecution() { +void ViewerOperation::initExecution() +{ // When initializing the tree during initial load the width and height can be zero. this->imageInput = getInputSocketReader(0); this->alphaInput = getInputSocketReader(1); ViewerBaseOperation::initExecution(); } -void ViewerOperation::deinitExecution() { +void ViewerOperation::deinitExecution() +{ this->imageInput = NULL; this->alphaInput = NULL; ViewerBaseOperation::deinitExecution(); } -void ViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { - float* buffer = this->outputBuffer; - unsigned char* bufferDisplay = this->outputBufferDisplay; +void ViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) +{ + float *buffer = this->outputBuffer; + unsigned char *bufferDisplay = this->outputBufferDisplay; if (!buffer) return; const int x1 = rect->xmin; const int y1 = rect->ymin; diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h index 951e9ff6fc3..4ffae31c131 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.h +++ b/source/blender/compositor/operations/COM_ViewerOperation.h @@ -29,8 +29,8 @@ class ViewerOperation : public ViewerBaseOperation { private: - SocketReader* imageInput; - SocketReader* alphaInput; + SocketReader *imageInput; + SocketReader *alphaInput; public: ViewerOperation(); diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.cpp b/source/blender/compositor/operations/COM_WriteBufferOperation.cpp index 6bb38c007ef..3af914f8d0e 100644 --- a/source/blender/compositor/operations/COM_WriteBufferOperation.cpp +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.cpp @@ -26,37 +26,43 @@ #include /// @TODO: writebuffers don't have an actual data type set. -WriteBufferOperation::WriteBufferOperation() :NodeOperation() { +WriteBufferOperation::WriteBufferOperation() :NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->memoryProxy = new MemoryProxy(); this->memoryProxy->setWriteBufferOperation(this); this->memoryProxy->setExecutor(NULL); this->tree = NULL; } -WriteBufferOperation::~WriteBufferOperation() { +WriteBufferOperation::~WriteBufferOperation() +{ if (this->memoryProxy) { delete this->memoryProxy; this->memoryProxy = NULL; } } -void WriteBufferOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void WriteBufferOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ input->read(color, x, y, sampler, inputBuffers); } -void WriteBufferOperation::initExecution() { +void WriteBufferOperation::initExecution() +{ this->input = this->getInputOperation(0); MemoryManager::addMemoryProxy(this->memoryProxy); } -void WriteBufferOperation::deinitExecution() { +void WriteBufferOperation::deinitExecution() +{ this->input = NULL; } -void WriteBufferOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) { - MemoryBuffer* memoryBuffer = MemoryManager::getMemoryBuffer(this->getMemoryProxy(), tileNumber); - float* buffer = memoryBuffer->getBuffer(); +void WriteBufferOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) +{ + MemoryBuffer *memoryBuffer = MemoryManager::getMemoryBuffer(this->getMemoryProxy(), tileNumber); + float *buffer = memoryBuffer->getBuffer(); if (this->input->isComplex()) { - void* data = this->input->initializeTileData(rect, memoryBuffers); + void *data = this->input->initializeTileData(rect, memoryBuffers); int x1 = rect->xmin; int y1 = rect->ymin; int x2 = rect->xmax; @@ -103,18 +109,19 @@ void WriteBufferOperation::executeRegion(rcti *rect, unsigned int tileNumber, Me memoryBuffer->setCreatedState(); } -void WriteBufferOperation::executeOpenCLRegion(cl_context context, cl_program program, cl_command_queue queue, rcti *rect, unsigned int chunkNumber, MemoryBuffer** inputMemoryBuffers) { - MemoryBuffer* outputMemoryBuffer = MemoryManager::getMemoryBuffer(this->getMemoryProxy(), chunkNumber); - float* outputFloatBuffer = outputMemoryBuffer->getBuffer(); +void WriteBufferOperation::executeOpenCLRegion(cl_context context, cl_program program, cl_command_queue queue, rcti *rect, unsigned int chunkNumber, MemoryBuffer** inputMemoryBuffers) +{ + MemoryBuffer *outputMemoryBuffer = MemoryManager::getMemoryBuffer(this->getMemoryProxy(), chunkNumber); + float *outputFloatBuffer = outputMemoryBuffer->getBuffer(); cl_int error; /* - 1. create cl_mem from outputbuffer - 2. call NodeOperation (input) executeOpenCLChunk(.....) - 3. schedule readback from opencl to main device (outputbuffer) - 4. schedule native callback - - note: list of cl_mem will be filled by 2, and needs to be cleaned up by 4 - */ + * 1. create cl_mem from outputbuffer + * 2. call NodeOperation (input) executeOpenCLChunk(.....) + * 3. schedule readback from opencl to main device (outputbuffer) + * 4. schedule native callback + * + * note: list of cl_mem will be filled by 2, and needs to be cleaned up by 4 + */ // STEP 1 const unsigned int outputBufferWidth = outputMemoryBuffer->getWidth(); const unsigned int outputBufferHeight = outputMemoryBuffer->getHeight(); diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.h b/source/blender/compositor/operations/COM_WriteBufferOperation.h index 3b28ffd4f63..b17122d68f0 100644 --- a/source/blender/compositor/operations/COM_WriteBufferOperation.h +++ b/source/blender/compositor/operations/COM_WriteBufferOperation.h @@ -38,14 +38,14 @@ public: WriteBufferOperation(); ~WriteBufferOperation(); int isBufferOperation() {return true;} - MemoryProxy* getMemoryProxy() {return this->memoryProxy;} - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + MemoryProxy *getMemoryProxy() {return this->memoryProxy;} + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); const bool isWriteBufferOperation() const {return true;} void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); void initExecution(); void deinitExecution(); - void setbNodeTree(const bNodeTree* tree) {this->tree = tree;} + void setbNodeTree(const bNodeTree *tree) {this->tree = tree;} void executeOpenCLRegion(cl_context context, cl_program program, cl_command_queue queue, rcti *rect, unsigned int chunkNumber, MemoryBuffer** memoryBuffers); }; diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.cpp b/source/blender/compositor/operations/COM_ZCombineOperation.cpp index e45d66dd597..7f32bac2e64 100644 --- a/source/blender/compositor/operations/COM_ZCombineOperation.cpp +++ b/source/blender/compositor/operations/COM_ZCombineOperation.cpp @@ -23,7 +23,8 @@ #include "COM_ZCombineOperation.h" #include "BLI_utildefines.h" -ZCombineOperation::ZCombineOperation(): NodeOperation() { +ZCombineOperation::ZCombineOperation(): NodeOperation() +{ this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); this->addInputSocket(COM_DT_COLOR); @@ -37,14 +38,16 @@ ZCombineOperation::ZCombineOperation(): NodeOperation() { } -void ZCombineOperation::initExecution() { +void ZCombineOperation::initExecution() +{ this->image1Reader = this->getInputSocketReader(0); this->depth1Reader = this->getInputSocketReader(1); this->image2Reader = this->getInputSocketReader(2); this->depth2Reader = this->getInputSocketReader(3); } -void ZCombineOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ZCombineOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float depth1[4]; float depth2[4]; @@ -57,7 +60,8 @@ void ZCombineOperation::executePixel(float* color, float x, float y, PixelSample this->image2Reader->read(color, x, y, sampler, inputBuffers); } } -void ZCombineAlphaOperation::executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) { +void ZCombineAlphaOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) +{ float depth1[4]; float depth2[4]; float color1[4]; @@ -81,7 +85,8 @@ void ZCombineAlphaOperation::executePixel(float* color, float x, float y, PixelS color[3] = MAX2(color1[3], color2[3]); } -void ZCombineOperation::deinitExecution() { +void ZCombineOperation::deinitExecution() +{ this->image1Reader = NULL; this->depth1Reader = NULL; this->image2Reader = NULL; diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.h b/source/blender/compositor/operations/COM_ZCombineOperation.h index d5a3f02fea2..f9de916fce0 100644 --- a/source/blender/compositor/operations/COM_ZCombineOperation.h +++ b/source/blender/compositor/operations/COM_ZCombineOperation.h @@ -31,10 +31,10 @@ */ class ZCombineOperation : public NodeOperation { protected: - SocketReader* image1Reader; - SocketReader* depth1Reader; - SocketReader* image2Reader; - SocketReader* depth2Reader; + SocketReader *image1Reader; + SocketReader *depth1Reader; + SocketReader *image2Reader; + SocketReader *depth2Reader; public: /** * Default constructor @@ -47,11 +47,11 @@ public: /** * the inner loop of this program */ - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; class ZCombineAlphaOperation: public ZCombineOperation { - void executePixel(float* color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); + void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]); }; #endif diff --git a/source/blender/editors/sculpt_paint/paint_hide.c b/source/blender/editors/sculpt_paint/paint_hide.c index 87bc89f810c..cd8b9164862 100644 --- a/source/blender/editors/sculpt_paint/paint_hide.c +++ b/source/blender/editors/sculpt_paint/paint_hide.c @@ -90,7 +90,7 @@ static int is_effected(PartialVisArea area, if (area == PARTIALVIS_ALL) return 1; else if (area == PARTIALVIS_MASKED) { - return mask > 0.5; + return mask > 0.5f; } else { int inside = planes_contain_v3(planes, 4, co); From c0bd076bfd27fab3f2d468c85206b59d1c7ab29e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 23:12:15 +0000 Subject: [PATCH 019/159] style cleanup: and add missing files to cmake --- source/blender/blenkernel/CMakeLists.txt | 1 + .../blenloader/intern/versioning_legacy.c | 2 +- source/blender/bmesh/operators/bmo_create.c | 4 +-- source/blender/compositor/CMakeLists.txt | 1 + .../blender/compositor/nodes/COM_TimeNode.cpp | 2 +- source/blender/python/intern/bpy_rna.c | 2 +- source/blender/render/intern/source/zbuf.c | 28 +++++++++---------- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index c2a83b5c048..a791d6f269f 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -157,6 +157,7 @@ set(SRC BKE_bullet.h BKE_bvhutils.h BKE_camera.h + BKE_ccg.h BKE_cdderivedmesh.h BKE_cloth.h BKE_collision.h diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c index 2f7ff055b91..799dc82482d 100644 --- a/source/blender/blenloader/intern/versioning_legacy.c +++ b/source/blender/blenloader/intern/versioning_legacy.c @@ -3559,7 +3559,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *main) { SpaceNla *snla = (SpaceNla *)sl; snla->autosnap = SACTSNAP_FRAME; - } + } break; } } diff --git a/source/blender/bmesh/operators/bmo_create.c b/source/blender/bmesh/operators/bmo_create.c index 7ef6068247d..ebdff8bf7aa 100644 --- a/source/blender/bmesh/operators/bmo_create.c +++ b/source/blender/bmesh/operators/bmo_create.c @@ -83,8 +83,8 @@ static int count_edge_faces(BMesh *bm, BMEdge *e); BLI_INLINE BMDiskLink *rs_edge_link_get(BMEdge *e, BMVert *v, EdgeData *e_data) { - return v == ((BMEdge *)e)->v1 ? &(((EdgeData *)e_data)->v1_disk_link) : - &(((EdgeData *)e_data)->v2_disk_link) ; + return v == ((BMEdge *)e)->v1 ? &(((EdgeData *)e_data)->v1_disk_link) : + &(((EdgeData *)e_data)->v2_disk_link) ; } static int rotsys_append_edge(BMEdge *e, BMVert *v, diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 6c26c481977..3230c0ec33d 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -65,6 +65,7 @@ set(SRC intern/COM_NodeBase.h intern/COM_NodeOperation.cpp intern/COM_NodeOperation.h + intern/COM_NodeProgram.h intern/COM_Socket.cpp intern/COM_Socket.h intern/COM_SocketReader.cpp diff --git a/source/blender/compositor/nodes/COM_TimeNode.cpp b/source/blender/compositor/nodes/COM_TimeNode.cpp index 11bc29679b9..b3ce27a3829 100644 --- a/source/blender/compositor/nodes/COM_TimeNode.cpp +++ b/source/blender/compositor/nodes/COM_TimeNode.cpp @@ -49,7 +49,7 @@ void TimeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c else if (framenumber > node->custom2) { fac = 1.0f; } - else if (node->custom1 < node->custom2) { + else if (node->custom1 < node->custom2) { fac = (context->getFramenumber() - node->custom1)/(float)(node->custom2-node->custom1); } diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index f20e029c7b6..e9b6f15033c 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -986,7 +986,7 @@ static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self) ret = PyUnicode_FromFormat("bpy.data.%s[%R].%s", BKE_idcode_to_name_plural(GS(id->name)), tmp_str, - path); + path); } MEM_freeN((void *)path); diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 78e0810fb77..cfbdf04d75a 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -1703,13 +1703,13 @@ void projectverto(const float v1[3], float winmat[][4], float adr[4]) /* calcs homogenic coord of vertex v1 */ float x, y, z; - x= v1[0]; - y= v1[1]; - z= v1[2]; - adr[0]= x*winmat[0][0] + z*winmat[2][0] + winmat[3][0]; - adr[1]= y*winmat[1][1] + z*winmat[2][1] + winmat[3][1]; - adr[2]= z*winmat[2][2] + winmat[3][2]; - adr[3]= z*winmat[2][3] + winmat[3][3]; + x = v1[0]; + y = v1[1]; + z = v1[2]; + adr[0] = x * winmat[0][0] + z * winmat[2][0] + winmat[3][0]; + adr[1] = y * winmat[1][1] + z * winmat[2][1] + winmat[3][1]; + adr[2] = z * winmat[2][2] + winmat[3][2]; + adr[3] = z * winmat[2][3] + winmat[3][3]; //printf("hoco %f %f %f %f\n", adr[0], adr[1], adr[2], adr[3]); } @@ -1721,13 +1721,13 @@ void projectvert(const float v1[3], float winmat[][4], float adr[4]) /* calcs homogenic coord of vertex v1 */ float x, y, z; - x= v1[0]; - y= v1[1]; - z= v1[2]; - adr[0]= x*winmat[0][0]+ y*winmat[1][0]+ z*winmat[2][0]+ winmat[3][0]; - adr[1]= x*winmat[0][1]+ y*winmat[1][1]+ z*winmat[2][1]+ winmat[3][1]; - adr[2]= x*winmat[0][2]+ y*winmat[1][2]+ z*winmat[2][2]+ winmat[3][2]; - adr[3]= x*winmat[0][3]+ y*winmat[1][3]+ z*winmat[2][3]+ winmat[3][3]; + x = v1[0]; + y = v1[1]; + z = v1[2]; + adr[0] = x * winmat[0][0] + y * winmat[1][0] + z * winmat[2][0] + winmat[3][0]; + adr[1] = x * winmat[0][1] + y * winmat[1][1] + z * winmat[2][1] + winmat[3][1]; + adr[2] = x * winmat[0][2] + y * winmat[1][2] + z * winmat[2][2] + winmat[3][2]; + adr[3] = x * winmat[0][3] + y * winmat[1][3] + z * winmat[2][3] + winmat[3][3]; } /* ------------------------------------------------------------------------- */ From 5fe5a8c2838edc62585e0ed72da23fbeb08ae5e1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 17 May 2012 23:21:11 +0000 Subject: [PATCH 020/159] style cleanup: function definitions --- source/blender/blenkernel/intern/depsgraph.c | 12 +- .../blender/blenkernel/intern/dynamicpaint.c | 16 ++- source/blender/blenkernel/intern/font.c | 3 +- source/blender/blenkernel/intern/image.c | 3 +- source/blender/blenkernel/intern/ocean.c | 11 +- source/blender/blenkernel/intern/seqeffects.c | 122 ++++++++++-------- source/blender/blenlib/intern/winstuff.c | 3 +- source/blender/imbuf/intern/anim_movie.c | 8 +- .../blender/imbuf/intern/cineon/cineon_dpx.c | 2 +- source/blender/imbuf/intern/moviecache.c | 5 +- source/blender/imbuf/intern/png.c | 3 +- source/blender/imbuf/intern/scaling.c | 11 +- source/blender/imbuf/intern/targa.c | 3 +- source/blender/makesrna/intern/rna_access.c | 6 +- .../blender/makesrna/intern/rna_controller.c | 3 +- source/blender/makesrna/intern/rna_main_api.c | 6 +- 16 files changed, 126 insertions(+), 91 deletions(-) diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index edef2b1a662..e44264c8d4b 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -718,7 +718,8 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O dag_add_relation(dag, scenenode, node, DAG_RL_SCENE, "Scene Relation"); } -struct DagForest *build_dag(Main *bmain, Scene *sce, short mask){ +DagForest *build_dag(Main *bmain, Scene *sce, short mask) +{ Base *base; Object *ob; Group *group; @@ -1458,7 +1459,8 @@ int pre_and_post_source_DFS(DagForest *dag, short mask, DagNode *source, graph_a // used to get the obs owning a datablock -struct DagNodeQueue *get_obparents(struct DagForest *dag, void *ob){ +DagNodeQueue *get_obparents(struct DagForest *dag, void *ob) +{ DagNode *node, *node1; DagNodeQueue *nqueue; DagAdjList *itA; @@ -1491,7 +1493,8 @@ struct DagNodeQueue *get_obparents(struct DagForest *dag, void *ob){ return nqueue; } -struct DagNodeQueue *get_first_ancestors(struct DagForest *dag, void *ob){ +DagNodeQueue *get_first_ancestors(struct DagForest *dag, void *ob) +{ DagNode *node, *node1; DagNodeQueue *nqueue; DagAdjList *itA; @@ -1519,7 +1522,8 @@ struct DagNodeQueue *get_first_ancestors(struct DagForest *dag, void *ob){ } // standard DFS list -struct DagNodeQueue *get_all_childs(struct DagForest *dag, void *ob){ +DagNodeQueue *get_all_childs(struct DagForest *dag, void *ob) +{ DagNode *node; DagNodeQueue *nqueue; DagNodeQueue *retqueue; diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 2a2451c4ac9..b3ed3dcaf1d 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -259,7 +259,8 @@ int dynamicPaint_surfaceHasColorPreview(DynamicPaintSurface *surface) } /* get currently active surface (in user interface) */ -struct DynamicPaintSurface *get_activeSurface(DynamicPaintCanvasSettings *canvas){ +DynamicPaintSurface *get_activeSurface(DynamicPaintCanvasSettings *canvas) +{ DynamicPaintSurface *surface = canvas->surfaces.first; int i; @@ -993,7 +994,8 @@ void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd) * If scene is null, frame range of 1-250 is used * A pointer to this surface is returned */ -struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSettings *canvas, Scene *scene){ +DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSettings *canvas, Scene *scene) +{ DynamicPaintSurface *surface = MEM_callocN(sizeof(DynamicPaintSurface), "DynamicPaintSurface"); if (!surface) return NULL; @@ -1594,9 +1596,10 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri /* * Apply canvas data to the object derived mesh */ -static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, - Object *ob, - DerivedMesh *dm){ +struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, + Object *ob, + DerivedMesh *dm) +{ DerivedMesh *result = CDDM_copy(dm); if (pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING)) { @@ -1901,7 +1904,8 @@ static void dynamicPaint_frameUpdate(DynamicPaintModifierData *pmd, Scene *scene } /* Modifier call. Processes dynamic paint modifier step. */ -struct DerivedMesh *dynamicPaint_Modifier_do(DynamicPaintModifierData *pmd, Scene *scene, Object *ob, DerivedMesh *dm){ +DerivedMesh *dynamicPaint_Modifier_do(DynamicPaintModifierData *pmd, Scene *scene, Object *ob, DerivedMesh *dm) +{ /* For now generate tessfaces in every case * XXX - move/remove when most of dpaint functions are converted to use bmesh types */ DM_ensure_tessface(dm); diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index fda078f5c42..07c5d6d0329 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -520,7 +520,8 @@ static float char_width(Curve *cu, VChar *che, CharInfo *info) } } -struct chartrans *BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int mode){ +struct chartrans *BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int mode) +{ VFont *vfont, *oldvfont; VFontData *vfd = NULL; Curve *cu; diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 91eed8b0b60..797a2093729 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -1743,7 +1743,8 @@ void BKE_makepicstring(char *string, const char *base, const char *relbase, int } /* used by sequencer too */ -struct anim *openanim(const char *name, int flags, int streamindex){ +struct anim *openanim(const char *name, int flags, int streamindex) +{ struct anim *anim; struct ImBuf *ibuf; diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c index b2096ca97d4..e76cde652c8 100644 --- a/source/blender/blenkernel/intern/ocean.c +++ b/source/blender/blenkernel/intern/ocean.c @@ -735,7 +735,8 @@ static void set_height_normalize_factor(struct Ocean *oc) oc->normalize_factor = res; } -struct Ocean *BKE_add_ocean(void){ +struct Ocean *BKE_add_ocean(void) +{ Ocean *oc = MEM_callocN(sizeof(Ocean), "ocean sim data"); BLI_rw_mutex_init(&oc->oceanmutex); @@ -1079,7 +1080,8 @@ void BKE_ocean_cache_eval_ij(struct OceanCache *och, struct OceanResult *ocr, in struct OceanCache *BKE_init_ocean_cache(const char *bakepath, const char *relbase, int start, int end, float wave_scale, - float chop_amount, float foam_coverage, float foam_fade, int resolution){ + float chop_amount, float foam_coverage, float foam_fade, int resolution) +{ OceanCache *och = MEM_callocN(sizeof(OceanCache), "ocean cache data"); och->bakepath = bakepath; @@ -1360,9 +1362,10 @@ void BKE_ocean_cache_eval_ij(struct OceanCache *UNUSED(och), struct OceanResult { } -struct OceanCache *BKE_init_ocean_cache(const char *UNUSED(bakepath), const char *UNUSED(relbase), +OceanCache *BKE_init_ocean_cache(const char *UNUSED(bakepath), const char *UNUSED(relbase), int UNUSED(start), int UNUSED(end), float UNUSED(wave_scale), - float UNUSED(chop_amount), float UNUSED(foam_coverage), float UNUSED(foam_fade), int UNUSED(resolution)){ + float UNUSED(chop_amount), float UNUSED(foam_coverage), float UNUSED(foam_fade), int UNUSED(resolution)) +{ OceanCache *och = MEM_callocN(sizeof(OceanCache), "ocean cache data"); return och; diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index 9358b786472..ca851fd4c81 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -74,10 +74,11 @@ enum { GlowA = 3 }; -static struct ImBuf *prepare_effect_imbufs( - SeqRenderData context, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *prepare_effect_imbufs( + SeqRenderData context, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out; int x = context.rectx; int y = context.recty; @@ -282,7 +283,7 @@ static ImBuf *IMB_cast_away_list(ImBuf *i) return (ImBuf *) (((void **) i) + 2); } -static struct ImBuf *do_plugin_effect( +static ImBuf *do_plugin_effect( SeqRenderData context, Sequence *seq, float cfra, float facf0, float facf1, struct ImBuf *ibuf1, struct ImBuf *ibuf2, @@ -541,7 +542,7 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y, } } -static struct ImBuf *do_alphaover_effect( +static ImBuf *do_alphaover_effect( SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1, struct ImBuf *ibuf1, struct ImBuf *ibuf2, @@ -719,7 +720,7 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, } } -static struct ImBuf *do_alphaunder_effect( +static ImBuf *do_alphaunder_effect( SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1, struct ImBuf *ibuf1, struct ImBuf *ibuf2, @@ -845,7 +846,7 @@ static void do_cross_effect_float(float facf0, float facf1, int x, int y, /* careful: also used by speed effect! */ -static struct ImBuf *do_cross_effect( +static ImBuf *do_cross_effect( SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1, struct ImBuf *ibuf1, struct ImBuf *ibuf2, @@ -1111,7 +1112,7 @@ static void do_gammacross_effect_float(float facf0, float UNUSED(facf1), } } -static struct ImBuf *do_gammacross_effect( +static ImBuf *do_gammacross_effect( SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1, @@ -1231,11 +1232,12 @@ static void do_add_effect_float(float facf0, float facf1, int x, int y, } } -static struct ImBuf *do_add_effect(SeqRenderData context, - Sequence *UNUSED(seq), float UNUSED(cfra), - float facf0, float facf1, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *do_add_effect(SeqRenderData context, + Sequence *UNUSED(seq), float UNUSED(cfra), + float facf0, float facf1, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); if (out->rect_float) { @@ -1347,11 +1349,12 @@ static void do_sub_effect_float(float facf0, float facf1, int x, int y, } } -static struct ImBuf *do_sub_effect( - SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), - float facf0, float facf1, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *do_sub_effect( + SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), + float facf0, float facf1, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); if (out->rect_float) { @@ -1560,7 +1563,7 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y, } } -static struct ImBuf *do_mul_effect( +static ImBuf *do_mul_effect( SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1, struct ImBuf *ibuf1, struct ImBuf *ibuf2, @@ -2008,11 +2011,12 @@ static void do_wipe_effect_float(Sequence *seq, float facf0, float UNUSED(facf1) } } -static struct ImBuf *do_wipe_effect( - SeqRenderData context, Sequence *seq, float UNUSED(cfra), - float facf0, float facf1, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *do_wipe_effect( + SeqRenderData context, Sequence *seq, float UNUSED(cfra), + float facf0, float facf1, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); if (out->rect_float) { @@ -2155,11 +2159,12 @@ static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x } -static struct ImBuf *do_transform_effect( - SeqRenderData context, Sequence *seq, float UNUSED(cfra), - float facf0, float UNUSED(facf1), - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *do_transform_effect( + SeqRenderData context, Sequence *seq, float UNUSED(cfra), + float facf0, float UNUSED(facf1), + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); do_transform(context.scene, seq, facf0, @@ -2671,7 +2676,7 @@ static void do_glow_effect_float(Sequence *seq, int render_size, float facf0, fl RVAddBitmaps_float(inbuf, outbuf, outbuf, x, y); } -static struct ImBuf *do_glow_effect( +static ImBuf *do_glow_effect( SeqRenderData context, Sequence *seq, float UNUSED(cfra), float facf0, float facf1, struct ImBuf *ibuf1, struct ImBuf *ibuf2, @@ -2736,11 +2741,12 @@ static int early_out_color(struct Sequence *UNUSED(seq), return -1; } -static struct ImBuf *do_solid_color( - SeqRenderData context, Sequence *seq, float UNUSED(cfra), - float facf0, float facf1, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *do_solid_color( + SeqRenderData context, Sequence *seq, float UNUSED(cfra), + float facf0, float facf1, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); SolidColorVars *cv = (SolidColorVars *)seq->effectdata; @@ -2833,11 +2839,12 @@ static int early_out_multicam(struct Sequence *UNUSED(seq), float UNUSED(facf0), return -1; } -static struct ImBuf *do_multicam( - SeqRenderData context, Sequence *seq, float cfra, - float UNUSED(facf0), float UNUSED(facf1), - struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2), - struct ImBuf *UNUSED(ibuf3)){ +static ImBuf *do_multicam( + SeqRenderData context, Sequence *seq, float cfra, + float UNUSED(facf0), float UNUSED(facf1), + struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2), + struct ImBuf *UNUSED(ibuf3)) +{ struct ImBuf *i; struct ImBuf *out; Editing *ed; @@ -2887,8 +2894,8 @@ static int early_out_adjustment(struct Sequence *UNUSED(seq), float UNUSED(facf0 return -1; } -static struct ImBuf *do_adjustment_impl(SeqRenderData context, Sequence *seq, - float cfra){ +static ImBuf *do_adjustment_impl(SeqRenderData context, Sequence *seq, float cfra) +{ Editing *ed; ListBase *seqbasep; struct ImBuf *i = NULL; @@ -2920,11 +2927,12 @@ static struct ImBuf *do_adjustment_impl(SeqRenderData context, Sequence *seq, return i; } -static struct ImBuf *do_adjustment( - SeqRenderData context, Sequence *seq, float cfra, - float UNUSED(facf0), float UNUSED(facf1), - struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2), - struct ImBuf *UNUSED(ibuf3)){ +static ImBuf *do_adjustment( + SeqRenderData context, Sequence *seq, float cfra, + float UNUSED(facf0), float UNUSED(facf1), + struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2), + struct ImBuf *UNUSED(ibuf3)) +{ struct ImBuf *i = NULL; struct ImBuf *out; Editing *ed; @@ -3214,13 +3222,14 @@ static void get_default_fac_fade(struct Sequence *seq, float cfra, *facf1 /= seq->len; } -static struct ImBuf *do_overdrop_effect(SeqRenderData context, - Sequence *UNUSED(seq), - float UNUSED(cfra), - float facf0, float facf1, - struct ImBuf *ibuf1, - struct ImBuf *ibuf2, - struct ImBuf *ibuf3){ +static ImBuf *do_overdrop_effect(SeqRenderData context, + Sequence *UNUSED(seq), + float UNUSED(cfra), + float facf0, float facf1, + struct ImBuf *ibuf1, + struct ImBuf *ibuf2, + struct ImBuf *ibuf3) +{ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); int x = context.rectx; int y = context.recty; @@ -3250,7 +3259,8 @@ static struct ImBuf *do_overdrop_effect(SeqRenderData context, return out; } -static struct SeqEffectHandle get_sequence_effect_impl(int seq_type){ +static struct SeqEffectHandle get_sequence_effect_impl(int seq_type) +{ struct SeqEffectHandle rval; int sequence_type = seq_type; diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c index 3eb62228aad..efb5ca98185 100644 --- a/source/blender/blenlib/intern/winstuff.c +++ b/source/blender/blenlib/intern/winstuff.c @@ -217,7 +217,8 @@ static wchar_t *UNUSED_FUNCTION(BLI_alloc_utf16_from_8) (char *in8, size_t add) -struct dirent *readdir(DIR *dp){ +struct dirent *readdir(DIR *dp) +{ if (dp->direntry.d_name) { MEM_freeN(dp->direntry.d_name); dp->direntry.d_name = NULL; diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index d8efdc3b870..a0856533335 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -261,7 +261,8 @@ void IMB_close_anim_proxies(struct anim *anim) IMB_free_indices(anim); } -struct anim *IMB_open_anim(const char *name, int ib_flags, int streamindex){ +struct anim *IMB_open_anim(const char *name, int ib_flags, int streamindex) +{ struct anim *anim; anim = (struct anim *)MEM_callocN(sizeof(struct anim), "anim struct"); @@ -1159,7 +1160,7 @@ static void free_anim_redcode(struct anim *anim) /* Geen plaatje, probeer dan volgende animatie te openen */ /* gelukt, haal dan eerste plaatje van animatie */ -static struct ImBuf *anim_getnew(struct anim *anim) +static ImBuf *anim_getnew(struct anim *anim) { struct ImBuf *ibuf = NULL; @@ -1222,7 +1223,8 @@ static struct ImBuf *anim_getnew(struct anim *anim) return(ibuf); } -struct ImBuf *IMB_anim_previewframe(struct anim *anim){ +struct ImBuf *IMB_anim_previewframe(struct anim *anim) +{ struct ImBuf *ibuf = NULL; int position = 0; diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c index a7d168d42a2..8e996b97622 100644 --- a/source/blender/imbuf/intern/cineon/cineon_dpx.c +++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c @@ -63,7 +63,7 @@ static void cineon_conversion_parameters(LogImageByteConversionParameters *param } #endif -static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int size, int flags) +static ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int size, int flags) { ImBuf *ibuf; LogImageFile *image; diff --git a/source/blender/imbuf/intern/moviecache.c b/source/blender/imbuf/intern/moviecache.c index ee358f6e4ba..2992e4a0aa7 100644 --- a/source/blender/imbuf/intern/moviecache.c +++ b/source/blender/imbuf/intern/moviecache.c @@ -198,8 +198,9 @@ void IMB_moviecache_destruct(void) delete_MEM_CacheLimiter(limitor); } -struct MovieCache *IMB_moviecache_create(int keysize, GHashHashFP hashfp, GHashCmpFP cmpfp, - MovieCacheGetKeyDataFP getdatafp){ +MovieCache *IMB_moviecache_create(int keysize, GHashHashFP hashfp, GHashCmpFP cmpfp, + MovieCacheGetKeyDataFP getdatafp) +{ MovieCache *cache; cache = MEM_callocN(sizeof(MovieCache), "MovieCache"); diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c index 35a44635727..2aed1485700 100644 --- a/source/blender/imbuf/intern/png.c +++ b/source/blender/imbuf/intern/png.c @@ -301,7 +301,8 @@ int imb_savepng(struct ImBuf *ibuf, const char *name, int flags) return(1); } -struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags){ +ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags) +{ struct ImBuf *ibuf = NULL; png_structp png_ptr; png_infop info_ptr; diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index 5a652a50cbb..ef057784a28 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -343,7 +343,8 @@ void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1) } -struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1){ +ImBuf *IMB_onehalf(struct ImBuf *ibuf1) +{ struct ImBuf *ibuf2; if (ibuf1 == NULL) return (NULL); @@ -810,7 +811,7 @@ static int q_scale_linear_interpolation( return TRUE; } -static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx) +static ImBuf *scaledownx(struct ImBuf *ibuf, int newx) { const int do_rect = (ibuf->rect != NULL); const int do_float = (ibuf->rect_float != NULL); @@ -940,7 +941,7 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx) } -static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy) +static ImBuf *scaledowny(struct ImBuf *ibuf, int newy) { const int do_rect = (ibuf->rect != NULL); const int do_float = (ibuf->rect_float != NULL); @@ -1071,7 +1072,7 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy) } -static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) +static ImBuf *scaleupx(struct ImBuf *ibuf, int newx) { uchar *rect, *_newrect = NULL, *newrect; float *rectf, *_newrectf = NULL, *newrectf; @@ -1238,7 +1239,7 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx) return(ibuf); } -static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy) +static ImBuf *scaleupy(struct ImBuf *ibuf, int newy) { uchar *rect, *_newrect = NULL, *newrect; float *rectf, *_newrectf = NULL, *newrectf; diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c index c690995d28a..bf75995fd9c 100644 --- a/source/blender/imbuf/intern/targa.c +++ b/source/blender/imbuf/intern/targa.c @@ -544,7 +544,8 @@ partial_load: } -struct ImBuf *imb_loadtarga(unsigned char *mem, size_t mem_size, int flags){ +ImBuf *imb_loadtarga(unsigned char *mem, size_t mem_size, int flags) +{ TARGA tga; struct ImBuf *ibuf; int col, count, size; diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 0a07887f196..70f6afd664d 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -701,7 +701,8 @@ FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier) #endif } -const struct ListBase *RNA_struct_type_functions(StructRNA *srna){ +const ListBase *RNA_struct_type_functions(StructRNA *srna) +{ return &srna->functions; } @@ -4851,7 +4852,8 @@ PropertyRNA *RNA_function_find_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *f return BLI_findstring(&func->cont.properties, identifier, offsetof(PropertyRNA, identifier)); } -const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func){ +const ListBase *RNA_function_defined_parameters(FunctionRNA *func) +{ return &func->cont.properties; } diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c index 6936c5b4324..44c8a2b412b 100644 --- a/source/blender/makesrna/intern/rna_controller.c +++ b/source/blender/makesrna/intern/rna_controller.c @@ -51,7 +51,8 @@ EnumPropertyItem controller_type_items[] = { #include "BKE_sca.h" #include "DNA_actuator_types.h" -static struct StructRNA *rna_Controller_refine(struct PointerRNA *ptr){ +static StructRNA *rna_Controller_refine(struct PointerRNA *ptr) +{ bController *controller = (bController *)ptr->data; switch (controller->type) { diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index cecd890ef13..024265c3d18 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -196,7 +196,8 @@ void rna_Main_objects_remove(Main *bmain, ReportList *reports, struct Object *ob } } -struct Material *rna_Main_materials_new(Main *UNUSED(bmain), const char *name){ +Material *rna_Main_materials_new(Main *UNUSED(bmain), const char *name) +{ ID *id = (ID *)BKE_material_add(name); id_us_min(id); return (Material *)id; @@ -212,7 +213,8 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material /* XXX python now has invalid pointer? */ } -struct bNodeTree *rna_Main_nodetree_new(Main *UNUSED(bmain), const char *name, int type){ +bNodeTree *rna_Main_nodetree_new(Main *UNUSED(bmain), const char *name, int type) +{ bNodeTree *tree = ntreeAddTree(name, type, NODE_GROUP); id_us_min(&tree->id); From b5a6be37f1f3ab7bd3d9e27f1bc88657296c4f5c Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Fri, 18 May 2012 06:10:47 +0000 Subject: [PATCH 021/159] Add smooth-shading option for remesh modifier. The remesh modifier doesn't currently get any data from original faces, so even if the input mesh was entirely smooth none of the output faces would be. Solved by adding a new dna-flag/rna-bool/UI-checkbox to smooth shade the output. Requested by Daniel Salazar. --- .../scripts/startup/bl_ui/properties_data_modifier.py | 1 + source/blender/makesdna/DNA_modifier_types.h | 1 + source/blender/makesrna/intern/rna_modifier.c | 5 +++++ source/blender/modifiers/intern/MOD_remesh.c | 10 ++++++++++ 4 files changed, 17 insertions(+) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index b46f0fc8923..9919865ca3a 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -838,6 +838,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): if md.mode == 'SHARP': layout.prop(md, "sharpness") + layout.prop(md, "smooth_shading") layout.prop(md, "remove_disconnected_pieces") row = layout.row() row.active = md.remove_disconnected_pieces diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 30280e95646..8e39ded84d5 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1032,6 +1032,7 @@ typedef struct DynamicPaintModifierData { typedef enum RemeshModifierFlags { MOD_REMESH_FLOOD_FILL = 1, + MOD_REMESH_SMOOTH_SHADING = 2, } RemeshModifierFlags; typedef enum RemeshModifierMode { diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 07ea69fc260..38a0147b07c 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -3000,6 +3000,11 @@ static void rna_def_modifier_remesh(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_REMESH_FLOOD_FILL); RNA_def_property_ui_text(prop, "Remove Disconnected Pieces", ""); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "smooth_shading", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_REMESH_SMOOTH_SHADING); + RNA_def_property_ui_text(prop, "Smooth Shading", "Output faces with smooth shading rather than flat shaded"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); } static void rna_def_modifier_ocean(BlenderRNA *brna) diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c index 517791e3e73..57966b5824b 100644 --- a/source/blender/modifiers/intern/MOD_remesh.c +++ b/source/blender/modifiers/intern/MOD_remesh.c @@ -190,6 +190,16 @@ static DerivedMesh *applyModifier(ModifierData *md, result = output->dm; MEM_freeN(output); + if (rmd->flag & MOD_REMESH_SMOOTH_SHADING) { + MPoly *mpoly = CDDM_get_polys(result); + int i, totpoly = result->getNumPolys(result); + + /* Apply smooth shading to output faces */ + for (i = 0; i < totpoly; i++) { + mpoly[i].flag |= ME_SMOOTH; + } + } + CDDM_calc_edges(result); CDDM_calc_normals(result); return result; From ef876762628a7f4b1d411a79fa78f57b338361e2 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Fri, 18 May 2012 09:26:55 +0000 Subject: [PATCH 022/159] Partial revert of r46542. Displaying image layers with flattened names (render_layer.render_pass) can lead to extremely long socket lists, especially with older files that were used with distinct render layers before. In general the flattening of names would be preferable, but it needs a sensible way of limiting the number of displayed outputs. For now the render layer dropdown selection is the best option to ensure usability. --- source/blender/blenloader/intern/readfile.c | 3 - .../compositor/nodes/COM_ImageNode.cpp | 24 +++-- source/blender/editors/space_node/drawnode.c | 3 + source/blender/makesdna/DNA_node_types.h | 4 +- source/blender/makesrna/intern/rna_nodetree.c | 41 ++++++++ .../composite/nodes/node_composite_image.c | 95 ++++++++----------- 6 files changed, 98 insertions(+), 72 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 20f53afd69e..62e2cd8b3b7 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -6855,13 +6855,10 @@ static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree) for (node = ntree->nodes.first; node; node = node->next) { if (node->type == CMP_NODE_IMAGE) { - ImageUser *iuser = (ImageUser *)node->storage; bNodeSocket *sock; for (sock = node->outputs.first; sock; sock = sock->next) { NodeImageLayer *output = MEM_callocN(sizeof(NodeImageLayer), "node image layer"); - /* take layer index from image user (this is ignored from now on) */ - output->layer_index = iuser->layer; /* take pass index both from current storage ptr (actually an int) */ output->pass_index = GET_INT_FROM_POINTER(sock->storage); diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp index cc2f5f699a5..5300d2deffc 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.cpp +++ b/source/blender/compositor/nodes/COM_ImageNode.cpp @@ -71,23 +71,21 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * if (image && image->type==IMA_TYPE_MULTILAYER) { BKE_image_get_ibuf(image, imageuser); if (image->rr) { - OutputSocket * socket; - int index; - for (index = 0 ; index < numberOfOutputs ; index ++) { - socket = this->getOutputSocket(index); - if (socket->isConnected() || index == 0) { - bNodeSocket *bnodeSocket = socket->getbNodeSocket(); - NodeImageLayer *storage = (NodeImageLayer*)bnodeSocket->storage; - int passindex = storage->pass_index; - int layerindex = storage->layer_index; - RenderLayer *rl = (RenderLayer*)BLI_findlink(&image->rr->layers, layerindex); - if (rl) { - + RenderLayer *rl = (RenderLayer*)BLI_findlink(&image->rr->layers, imageuser->layer); + if (rl) { + OutputSocket * socket; + int index; + for (index = 0 ; index < numberOfOutputs ; index ++) { + socket = this->getOutputSocket(index); + if (socket->isConnected() || index == 0) { + bNodeSocket *bnodeSocket = socket->getbNodeSocket(); + NodeImageLayer *storage = (NodeImageLayer*)bnodeSocket->storage; + int passindex = storage->pass_index; + RenderPass *rpass = (RenderPass *)BLI_findlink(&rl->passes, passindex); if (rpass) { NodeOperation * operation = NULL; imageuser->pass = passindex; - imageuser->layer = layerindex; switch (rpass->channels) { case 1: operation = doMultilayerCheck(graph, rl, image, imageuser, framenumber, index, passindex, COM_DT_VALUE); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index d9fc793adb3..ac12f2ffd31 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1262,6 +1262,9 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA * } col= uiLayoutColumn(layout, 0); + + if (RNA_enum_get(&imaptr, "type")== IMA_TYPE_MULTILAYER) + uiItemR(col, ptr, "layer", 0, NULL, ICON_NONE); } static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr) diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 077c4011f4f..4bbd1e20973 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -398,8 +398,8 @@ typedef struct NodeEllipseMask { /* layer info for image node outputs */ typedef struct NodeImageLayer { - /* index in the Image->layers and Image->layers->passes lists */ - int layer_index, pass_index; + /* index in the Image->layers->passes lists */ + int pass_index; /* render pass flag, in case this is an original render pass */ int pass_flag; } NodeImageLayer; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 6c8293f8dae..b3412498ccc 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -492,6 +492,18 @@ static void rna_NodeSocketVector_range(PointerRNA *ptr, float *min, float *max, *softmax = val->max; } +static void rna_Node_image_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + bNode *node = (bNode*)ptr->data; + Image *ima = (Image *)node->id; + ImageUser *iuser = node->storage; + + BKE_image_multilayer_index(ima->rr, iuser); + BKE_image_signal(ima, iuser, IMA_SIGNAL_SRC_CHANGE); + + rna_Node_update(bmain, scene, ptr); +} + static EnumPropertyItem *renderresult_layers_add_enum(RenderLayer *rl) { EnumPropertyItem *item = NULL; @@ -511,6 +523,24 @@ static EnumPropertyItem *renderresult_layers_add_enum(RenderLayer *rl) return item; } +static EnumPropertyItem *rna_Node_image_layer_itemf(bContext *UNUSED(C), PointerRNA *ptr, + PropertyRNA *UNUSED(prop), int *free) +{ + bNode *node = (bNode*)ptr->data; + Image *ima = (Image *)node->id; + EnumPropertyItem *item = NULL; + RenderLayer *rl; + + if (!ima || !(ima->rr)) return NULL; + + rl = ima->rr->layers.first; + item = renderresult_layers_add_enum(rl); + + *free = 1; + + return item; +} + static EnumPropertyItem *rna_Node_scene_layer_itemf(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { @@ -897,6 +927,10 @@ static void rna_NodeOutputFileSlotLayer_name_set(PointerRNA *ptr, const char *va #else +static EnumPropertyItem prop_image_layer_items[] = { +{ 0, "PLACEHOLDER", 0, "Placeholder", ""}, +{0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem prop_scene_layer_items[] = { { 0, "PLACEHOLDER", 0, "Placeholder", ""}, {0, NULL, 0, NULL, NULL}}; @@ -1816,6 +1850,13 @@ static void def_cmp_image(StructRNA *srna) /* copied from the rna_image.c */ RNA_def_property_ui_text(prop, "Auto-Refresh", "Always refresh image on frame changes"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "layer", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "layer"); + RNA_def_property_enum_items(prop, prop_image_layer_items); + RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_image_layer_itemf"); + RNA_def_property_ui_text(prop, "Layer", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_image_layer_update"); } static void def_cmp_render_layers(StructRNA *srna) diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c index ad1264a7b6b..70d68737032 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.c +++ b/source/blender/nodes/composite/nodes/node_composite_image.c @@ -145,37 +145,26 @@ static void cmp_node_image_add_render_pass_outputs(bNodeTree *ntree, bNode *node cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_COLOR, RRES_OUT_TRANSM_COLOR); } -static void cmp_node_image_add_multilayer_outputs(bNodeTree *ntree, bNode *node, ListBase *layers) +static void cmp_node_image_add_multilayer_outputs(bNodeTree *ntree, bNode *node, RenderLayer *rl) { bNodeSocket *sock; NodeImageLayer *sockdata; - RenderLayer *rl; RenderPass *rpass; - int layer_index, pass_index; - char name[30]; /* EXR_TOT_MAXNAME-2 ('.' and channel char are appended) */ - int type; - - for (rl=layers->first, layer_index=0; rl; rl=rl->next, ++layer_index) { - for (rpass=rl->passes.first, pass_index=0; rpass; rpass=rpass->next, ++pass_index) { - /* reconstruct layer name from . strings */ - if (rl->name[0] != '\0') - BLI_snprintf(name, sizeof(name), "%s.%s", rl->name, rpass->name); - else - BLI_strncpy(name, rpass->name, sizeof(name)); - - if (rpass->channels == 1) - type = SOCK_FLOAT; - else - type = SOCK_RGBA; - - sock = nodeAddSocket(ntree, node, SOCK_OUT, name, type); - /* extra socket info */ - sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer"); - sock->storage = sockdata; - - sockdata->layer_index = layer_index; - sockdata->pass_index = pass_index; - } + int index; + for (rpass=rl->passes.first, index=0; rpass; rpass=rpass->next, ++index) { + int type; + if (rpass->channels == 1) + type = SOCK_FLOAT; + else + type = SOCK_RGBA; + + sock = nodeAddSocket(ntree, node, SOCK_OUT, rpass->name, type); + /* extra socket info */ + sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer"); + sock->storage = sockdata; + + sockdata->pass_index = index; + sockdata->pass_flag = rpass->passtype; } } @@ -189,16 +178,16 @@ static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node) BKE_image_get_ibuf(ima, iuser); if (ima->rr) { - if (ima->type == IMA_TYPE_MULTILAYER) { - cmp_node_image_add_multilayer_outputs(ntree, node, &ima->rr->layers); - } - else { - RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer); - if (rl) + RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer); + + if (rl) { + if (ima->type!=IMA_TYPE_MULTILAYER) cmp_node_image_add_render_pass_outputs(ntree, node, rl->passflag); else - cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA); + cmp_node_image_add_multilayer_outputs(ntree, node, rl); } + else + cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA); } else cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA|RRES_OUT_Z); @@ -415,28 +404,23 @@ static CompBuf *node_composit_get_zimage(bNode *node, RenderData *rd) } /* check if layer is available, returns pass buffer */ -static CompBuf *compbuf_multilayer_get(RenderData *rd, Image *ima, ImageUser *iuser, int layer_index, int pass_index) +static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *ima, ImageUser *iuser, int passindex) { - RenderLayer *rl = BLI_findlink(&ima->rr->layers, layer_index); - if (rl) { - RenderPass *rpass = BLI_findlink(&rl->passes, pass_index); - if (rpass) { - CompBuf *cbuf; - - iuser->layer = layer_index; - iuser->pass = pass_index; - BKE_image_multilayer_index(ima->rr, iuser); - cbuf = node_composit_get_image(rd, ima, iuser); - - return cbuf; - } + RenderPass *rpass = BLI_findlink(&rl->passes, passindex); + if (rpass) { + CompBuf *cbuf; + + iuser->pass = passindex; + BKE_image_multilayer_index(ima->rr, iuser); + cbuf = node_composit_get_image(rd, ima, iuser); + + return cbuf; } return NULL; } static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) { - /* image assigned to output */ /* stack order input sockets: col, alpha */ if (node->id) { @@ -447,11 +431,14 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE /* first set the right frame number in iuser */ BKE_image_user_frame_calc(iuser, rd->cfra, 0); - if (ima->type==IMA_TYPE_MULTILAYER) { - /* force a load, we assume iuser index will be set OK anyway */ + /* force a load, we assume iuser index will be set OK anyway */ + if (ima->type==IMA_TYPE_MULTILAYER) BKE_image_get_ibuf(ima, iuser); - if (ima->rr) { + if (ima->type==IMA_TYPE_MULTILAYER && ima->rr) { + RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer); + + if (rl) { bNodeSocket *sock; NodeImageLayer *sockdata; int out_index; @@ -460,7 +447,7 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE for (sock=node->outputs.first, out_index=0; sock; sock=sock->next, ++out_index) { sockdata = sock->storage; if (out[out_index]->hasoutput) { - CompBuf *stackbuf = out[out_index]->data = compbuf_multilayer_get(rd, ima, iuser, sockdata->layer_index, sockdata->pass_index); + CompBuf *stackbuf = out[out_index]->data = compbuf_multilayer_get(rd, rl, ima, iuser, sockdata->pass_index); if (stackbuf) { /* preview policy: take first 'Combined' pass if available, * otherwise just use the first layer. @@ -469,7 +456,7 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE firstbuf = stackbuf; } if (!combinedbuf && - (strcmp(sock->name, "Combined") == 0 || strcmp(sock->name, "Image") == 0)) + (strcmp(sock->name, "Combined") == 0 || strcmp(sock->name, "Image") == 0)) { combinedbuf = stackbuf; } From e74de72b96cb56f4f97c60e07ce6dea3509ec175 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Fri, 18 May 2012 10:00:28 +0000 Subject: [PATCH 023/159] When generating enums for the image node render layers, replace empty strings with a simple space character. This little hack allows the enum item to be selected from the dropdown list. --- source/blender/makesrna/intern/rna_nodetree.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index b3412498ccc..9dcdce61cea 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -512,7 +512,11 @@ static EnumPropertyItem *renderresult_layers_add_enum(RenderLayer *rl) while (rl) { tmp.identifier = rl->name; - tmp.name = rl->name; + /* little trick: using space char instead empty string makes the item selectable in the dropdown */ + if (rl->name[0] == '\0') + tmp.name = " "; + else + tmp.name = rl->name; tmp.value = i++; RNA_enum_item_add(&item, &totitem, &tmp); rl = rl->next; From f55b6a53316de21fc080fd3538b84376a6d4e41a Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Fri, 18 May 2012 10:00:31 +0000 Subject: [PATCH 024/159] Fix for Tile image node. This was still using the path string for multilayer output instead of the dedicated layer name string. --- source/blender/compositor/nodes/COM_OutputFileNode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.cpp b/source/blender/compositor/nodes/COM_OutputFileNode.cpp index e70e4f296d6..cc060e9f7cd 100644 --- a/source/blender/compositor/nodes/COM_OutputFileNode.cpp +++ b/source/blender/compositor/nodes/COM_OutputFileNode.cpp @@ -54,7 +54,7 @@ void OutputFileNode::convertToOperations(ExecutionSystem *graph, CompositorConte hasConnections = true; NodeImageMultiFileSocket *sockdata = (NodeImageMultiFileSocket *)input->getbNodeSocket()->storage; - outputOperation->add_layer(sockdata->path, input->getDataType()); + outputOperation->add_layer(sockdata->layer, input->getDataType()); input->relinkConnections(outputOperation->getInputSocket(i)); } From 181f3670c904efe662444d0e542ea8234f7571a9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 18 May 2012 10:19:49 +0000 Subject: [PATCH 025/159] patch [#31507] site not automatically imported when using external python package made some modificatons to normal python startup also. --- source/blender/python/intern/bpy_interface.c | 9 +++++++-- source/gameengine/Ketsji/KX_PythonInit.cpp | 15 +++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index f3f05e93930..b9d4c1ae94f 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -223,6 +223,7 @@ void BPY_python_start(int argc, const char **argv) { #ifndef WITH_PYTHON_MODULE PyThreadState *py_tstate = NULL; + const char *py_path_bundle = BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL); /* not essential but nice to set our name */ static wchar_t program_path_wchar[FILE_MAX]; /* python holds a reference */ @@ -233,7 +234,7 @@ void BPY_python_start(int argc, const char **argv) PyImport_ExtendInittab(bpy_internal_modules); /* allow to use our own included python */ - PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL)); + PyC_SetHomePath(py_path_bundle); /* without this the sys.stdout may be set to 'ascii' * (it is on my system at least), where printing unicode values will raise @@ -245,7 +246,11 @@ void BPY_python_start(int argc, const char **argv) /* Python 3.2 now looks for '2.xx/python/include/python3.2d/pyconfig.h' to * parse from the 'sysconfig' module which is used by 'site', * so for now disable site. alternatively we could copy the file. */ - Py_NoSiteFlag = 1; + if (py_path_bundle) { + Py_NoSiteFlag = 1; + } + + Py_FrozenFlag = 1; Py_Initialize(); diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index a7078860da3..28c4630c43e 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1843,19 +1843,24 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur * somehow it remembers the sys.path - Campbell */ static bool first_time = true; - + char *py_path_bundle = BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL); + #if 0 // TODO - py3 STR_String pname = progname; Py_SetProgramName(pname.Ptr()); #endif - Py_NoSiteFlag=1; - Py_FrozenFlag=1; + + if (py_path_bundle != NULL) { + Py_NoSiteFlag = 1; + } + + Py_FrozenFlag = 1; /* must run before python initializes */ PyImport_ExtendInittab(bge_internal_modules); /* find local python installation */ - PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL)); + PyC_SetHomePath(py_path_bundle); Py_Initialize(); @@ -1929,8 +1934,6 @@ PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLev STR_String pname = progname; Py_SetProgramName(pname.Ptr()); #endif - Py_NoSiteFlag=1; - Py_FrozenFlag=1; #ifdef WITH_AUDASPACE /* accessing a SoundActuator's sound results in a crash if aud is not initialized... */ From 76f28921dc9757da9ba04b195dd66acda2e4acf2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 18 May 2012 10:37:49 +0000 Subject: [PATCH 026/159] add option for screw modifier to smooth shade. (renamed smooth_shading to use_smooth_shade for remesh modifier too) --- .../scripts/startup/bl_ui/properties_data_modifier.py | 3 ++- source/blender/makesdna/DNA_modifier_types.h | 9 +++++---- source/blender/makesrna/intern/rna_modifier.c | 7 ++++++- source/blender/modifiers/intern/MOD_screw.c | 6 ++++-- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 9919865ca3a..218585c320f 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -547,6 +547,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "angle") col.prop(md, "steps") col.prop(md, "render_steps") + col.prop(md, "use_smooth_shade") col = split.column() row = col.row() @@ -838,7 +839,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): if md.mode == 'SHARP': layout.prop(md, "sharpness") - layout.prop(md, "smooth_shading") + layout.prop(md, "use_smooth_shade") layout.prop(md, "remove_disconnected_pieces") row = layout.row() row.active = md.remove_disconnected_pieces diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 8e39ded84d5..971ce613edc 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -745,10 +745,11 @@ typedef struct ScrewModifierData { short flag; } ScrewModifierData; -#define MOD_SCREW_NORMAL_FLIP (1<<0) -#define MOD_SCREW_NORMAL_CALC (1<<1) -#define MOD_SCREW_OBJECT_OFFSET (1<<2) -// #define MOD_SCREW_OBJECT_ANGLE (1<<4) +#define MOD_SCREW_NORMAL_FLIP (1 << 0) +#define MOD_SCREW_NORMAL_CALC (1 << 1) +#define MOD_SCREW_OBJECT_OFFSET (1 << 2) +// #define MOD_SCREW_OBJECT_ANGLE (1 << 4) +#define MOD_SCREW_SMOOTH_SHADING (1 << 5) typedef struct OceanModifierData { ModifierData modifier; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 38a0147b07c..4a7050b47e9 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2627,6 +2627,11 @@ static void rna_def_modifier_screw(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Object Screw", "Use the distance between the objects to make a screw"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop = RNA_def_property(srna, "use_smooth_shade", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SCREW_SMOOTH_SHADING); + RNA_def_property_ui_text(prop, "Smooth Shading", "Output faces with smooth shading rather than flat shaded"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + #if 0 prop= RNA_def_property(srna, "use_angle_object", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SCREW_OBJECT_ANGLE); @@ -3001,7 +3006,7 @@ static void rna_def_modifier_remesh(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Remove Disconnected Pieces", ""); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop = RNA_def_property(srna, "smooth_shading", PROP_BOOLEAN, PROP_NONE); + prop = RNA_def_property(srna, "use_smooth_shade", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_REMESH_SMOOTH_SHADING); RNA_def_property_ui_text(prop, "Smooth Shading", "Output faces with smooth shading rather than flat shaded"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c index 6a57cd82b50..f45cc9c2ade 100644 --- a/source/blender/modifiers/intern/MOD_screw.c +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -111,7 +111,7 @@ static void initData(ModifierData *md) ltmd->ob_axis = NULL; ltmd->angle = M_PI * 2.0; ltmd->axis = 2; - ltmd->flag = 0; + ltmd->flag = MOD_SCREW_SMOOTH_SHADING; ltmd->steps = 16; ltmd->render_steps = 16; ltmd->iter = 1; @@ -175,6 +175,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, ScrewVertConnect *vc, *vc_tmp, *vert_connect = NULL; + const char mpoly_flag = (ltmd->flag & MOD_SCREW_SMOOTH_SHADING) ? ME_SMOOTH : 0; + /* don't do anything? */ if (!totvert) return CDDM_from_template(dm, 0, 0, 0, 0, 0); @@ -810,7 +812,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, mp_new->loopstart = mpoly_index * 4; mp_new->totloop = 4; - mp_new->flag = ME_SMOOTH; + mp_new->flag = mpoly_flag; origindex[mpoly_index] = ORIGINDEX_NONE; mp_new++; ml_new += 4; From 3e83fd441d84617855dfdcfab50fd8f4fb041f00 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 12:49:22 +0000 Subject: [PATCH 027/159] Fix #31486: cycles texture coordinate reflection output has wrong direction. --- intern/cycles/kernel/svm/svm_tex_coord.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index aa924bcc38b..9952557d614 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -87,7 +87,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack } case NODE_TEXCO_REFLECTION: { if(sd->object != ~0) - data = sd->I - 2.0f*dot(sd->N, sd->I)*sd->N; + data = 2.0f*dot(sd->N, sd->I)*sd->N - sd->I; else data = sd->I; break; @@ -136,7 +136,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa } case NODE_TEXCO_REFLECTION: { if(sd->object != ~0) - data = sd->I - 2.0f*dot(sd->N, sd->I)*sd->N; + data = 2.0f*dot(sd->N, sd->I)*sd->N - sd->I; else data = sd->I; break; @@ -188,7 +188,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa } case NODE_TEXCO_REFLECTION: { if(sd->object != ~0) - data = sd->I - 2.0f*dot(sd->N, sd->I)*sd->N; + data = 2.0f*dot(sd->N, sd->I)*sd->N - sd->I; else data = sd->I; break; From adb567f6b3f21f820e6b40d8530b374ee5cc2d7a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 12:49:25 +0000 Subject: [PATCH 028/159] File browser: list of system directories is now refreshed on pressing the refresh button or opening the file browser, in case e.g. a USB stick was inserted. Patch #31211 by Julien Duroure. --- source/blender/editors/space_file/file_ops.c | 4 + source/blender/editors/space_file/fsmenu.c | 73 +++++++++++-------- source/blender/editors/space_file/fsmenu.h | 5 +- .../blender/editors/space_file/space_file.c | 5 +- 4 files changed, 55 insertions(+), 32 deletions(-) diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 3ff9c3c0520..9629fd7da0c 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -820,9 +820,13 @@ void FILE_OT_parent(struct wmOperatorType *ot) static int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused)) { SpaceFile *sfile= CTX_wm_space_file(C); + struct FSMenu* fsmenu = fsmenu_get(); ED_fileselect_clear(C, sfile); + /* refresh system directory menu */ + fsmenu_refresh_system_category(fsmenu); + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c index 50261175852..a91b3669219 100644 --- a/source/blender/editors/space_file/fsmenu.c +++ b/source/blender/editors/space_file/fsmenu.c @@ -295,7 +295,7 @@ void fsmenu_read_bookmarks(struct FSMenu *fsmenu, const char *filename) fclose(fp); } -void fsmenu_read_system(struct FSMenu *fsmenu) +void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks) { char line[256]; #ifdef WIN32 @@ -319,10 +319,12 @@ void fsmenu_read_system(struct FSMenu *fsmenu) } /* Adding Desktop and My Documents */ - SHGetSpecialFolderPath(0, line, CSIDL_PERSONAL, 0); - fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); - SHGetSpecialFolderPath(0, line, CSIDL_DESKTOPDIRECTORY, 0); - fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); + if (read_bookmarks) { + SHGetSpecialFolderPath(0, line, CSIDL_PERSONAL, 0); + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); + SHGetSpecialFolderPath(0, line, CSIDL_DESKTOPDIRECTORY, 0); + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); + } } #else #ifdef __APPLE__ @@ -352,7 +354,7 @@ void fsmenu_read_system(struct FSMenu *fsmenu) * assume they are the standard ones * TODO : replace hardcoded paths with proper BLI_get_folder calls */ home = getenv("HOME"); - if (home) { + if (read_bookmarks && home) { BLI_snprintf(line, 256, "%s/", home); fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); BLI_snprintf(line, 256, "%s/Desktop/", home); @@ -437,32 +439,34 @@ void fsmenu_read_system(struct FSMenu *fsmenu) } /* Finally get user favorite places */ - list = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); - pathesArray = LSSharedFileListCopySnapshot(list, &seed); - pathesCount = CFArrayGetCount(pathesArray); - - for (i = 0; i < pathesCount; i++) { - itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(pathesArray, i); + if(read_bookmarks) { + list = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); + pathesArray = LSSharedFileListCopySnapshot(list, &seed); + pathesCount = CFArrayGetCount(pathesArray); - err = LSSharedFileListItemResolve(itemRef, - kLSSharedFileListNoUserInteraction | - kLSSharedFileListDoNotMountVolumes, - &cfURL, NULL); - if (err != noErr) - continue; + for (i = 0; i < pathesCount; i++) { + itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(pathesArray, i); + + err = LSSharedFileListItemResolve(itemRef, + kLSSharedFileListNoUserInteraction | + kLSSharedFileListDoNotMountVolumes, + &cfURL, NULL); + if (err != noErr) + continue; + + pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle); + + if (!CFStringGetCString(pathString, line, 256, kCFStringEncodingASCII)) + continue; + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); + + CFRelease(pathString); + CFRelease(cfURL); + } - pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle); - - if (!CFStringGetCString(pathString, line, 256, kCFStringEncodingASCII)) - continue; - fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); - - CFRelease(pathString); - CFRelease(cfURL); + CFRelease(pathesArray); + CFRelease(list); } - - CFRelease(pathesArray); - CFRelease(list); #endif /* OSX 10.5+ */ } #else @@ -470,7 +474,7 @@ void fsmenu_read_system(struct FSMenu *fsmenu) { const char *home = getenv("HOME"); - if (home) { + if (read_bookmarks && home) { BLI_snprintf(line, FILE_MAXDIR, "%s/", home); fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); BLI_snprintf(line, FILE_MAXDIR, "%s/Desktop/", home); @@ -537,6 +541,15 @@ static void fsmenu_free_category(struct FSMenu *fsmenu, FSMenuCategory category) } } +void fsmenu_refresh_system_category(struct FSMenu *fsmenu) +{ + fsmenu_free_category(fsmenu, FS_CATEGORY_SYSTEM); + fsmenu_set_category(fsmenu, FS_CATEGORY_SYSTEM, NULL); + + /* Add all entries to system category */ + fsmenu_read_system(fsmenu, FALSE); +} + void fsmenu_free(struct FSMenu *fsmenu) { fsmenu_free_category(fsmenu, FS_CATEGORY_SYSTEM); diff --git a/source/blender/editors/space_file/fsmenu.h b/source/blender/editors/space_file/fsmenu.h index c926a4f382c..e5b3d54ac9f 100644 --- a/source/blender/editors/space_file/fsmenu.h +++ b/source/blender/editors/space_file/fsmenu.h @@ -74,10 +74,13 @@ void fsmenu_write_file (struct FSMenu* fsmenu, const char *filename); void fsmenu_read_bookmarks (struct FSMenu* fsmenu, const char *filename); /** adds system specific directories */ -void fsmenu_read_system (struct FSMenu* fsmenu); +void fsmenu_read_system (struct FSMenu* fsmenu, int read_bookmarks); /** Free's all the memory associated with the fsmenu */ void fsmenu_free (struct FSMenu* fsmenu); + /** Refresh system directory menu */ +void fsmenu_refresh_system_category (struct FSMenu* fsmenu); + #endif diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index dac5d1e1347..a90daa7e1e9 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -151,6 +151,9 @@ static void file_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) SpaceFile *sfile= (SpaceFile*)sa->spacedata.first; //printf("file_init\n"); + /* refresh system directory list */ + fsmenu_refresh_system_category(fsmenu_get()); + if (sfile->layout) sfile->layout->dirty= TRUE; } @@ -613,7 +616,7 @@ void ED_file_init(void) { char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL); - fsmenu_read_system(fsmenu_get()); + fsmenu_read_system(fsmenu_get(), TRUE); if (cfgdir) { char name[FILE_MAX]; From 03222143c0cbd690fa125f5c3da36ca878d95e21 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 12:49:27 +0000 Subject: [PATCH 029/159] Add "Install Theme" button in user preferences, patch #31505 by Julien Duroure. --- release/scripts/startup/bl_operators/wm.py | 59 +++++++++++++++++++ .../scripts/startup/bl_ui/space_userpref.py | 1 + 2 files changed, 60 insertions(+) diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index c3638da5814..883bac84e78 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1545,6 +1545,65 @@ class WM_OT_addon_disable(Operator): addon_utils.disable(self.module) return {'FINISHED'} +class WM_OT_theme_install(Operator): + "Install a theme" + bl_idname = "wm.theme_install" + bl_label = "Install Theme..." + + overwrite = BoolProperty( + name="Overwrite", + description="Remove existing theme file if exists", + default=True, + ) + filepath = StringProperty( + subtype='FILE_PATH', + ) + filter_folder = BoolProperty( + name="Filter folders", + default=True, + options={'HIDDEN'}, + ) + filter_glob = StringProperty( + default="*.xml", + options={'HIDDEN'}, + ) + + def execute(self, context): + import os + import shutil + import traceback + + xmlfile = self.filepath + + path_themes = bpy.utils.user_resource('SCRIPTS','presets/interface_theme',create=True) + + if not path_themes: + self.report({'ERROR'}, "Failed to get themes path") + return {'CANCELLED'} + + path_dest = os.path.join(path_themes, os.path.basename(xmlfile)) + + if not self.overwrite: + if os.path.exists(path_dest): + self.report({'WARNING'}, "File already installed to %r\n" % path_dest) + return {'CANCELLED'} + + try: + shutil.copyfile(xmlfile, path_dest) + bpy.ops.script.execute_preset(filepath=path_dest,menu_idname="USERPREF_MT_interface_theme_presets") + + except: + traceback.print_exc() + return {'CANCELLED'} + + return {'FINISHED'} + + + def invoke(self, context, event): + wm = context.window_manager + wm.fileselect_add(self) + return {'RUNNING_MODAL'} + class WM_OT_addon_install(Operator): "Install an addon" diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 01a8f1c6dcb..dec3960f376 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -96,6 +96,7 @@ class USERPREF_HT_header(Header): layout.menu("USERPREF_MT_addons_dev_guides") elif userpref.active_section == 'THEMES': layout.operator("ui.reset_default_theme") + layout.operator("wm.theme_install") class USERPREF_PT_tabs(Panel): From 894dd820ac6ffcb19ff74cf662ff2d4ce3e5179b Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Fri, 18 May 2012 13:27:33 +0000 Subject: [PATCH 030/159] Fix bug in controller list scan (introduced in recent code cleanup) --- source/blender/blenloader/intern/readfile.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 62e2cd8b3b7..01303eeb735 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4747,7 +4747,6 @@ static void direct_link_object(FileData *fd, Object *ob) test_pointer_array(fd, (void **)&cont->links); if (cont->state_mask == 0) cont->state_mask = 1; - cont= cont->next; } link_glob_list(fd, &ob->actuators); From 578864180b1e40a8689064763437247ff7a5826b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 13:30:34 +0000 Subject: [PATCH 031/159] Fix related to #31446: cycles glsl error with empty image texture node. --- .../gpu/shaders/gpu_shader_material.glsl | 11 +++++++++++ .../gpu/shaders/gpu_shader_material.glsl.c | 18 ++++++++++++------ .../shader/nodes/node_shader_tex_environment.c | 7 ++----- .../nodes/shader/nodes/node_shader_tex_image.c | 7 ++----- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 9498bf92446..7e4312e21e0 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2127,12 +2127,23 @@ void node_tex_environment(vec3 co, sampler2D ima, out vec4 color) color = texture2D(ima, vec2(u, v)); } +void node_tex_environment_empty(vec3 co, out vec4 color) +{ + color = vec4(0.0); +} + void node_tex_image(vec3 co, sampler2D ima, out vec4 color, out float alpha) { color = texture2D(ima, co.xy); alpha = color.a; } +void node_tex_image_empty(vec3 co, out vec4 color, out float alpha) +{ + color = vec4(0.0); + alpha = 0.0; +} + void node_tex_magic(vec3 p, float scale, float distortion, out vec4 color, out float fac) { color = vec4(1.0); diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl.c b/source/blender/gpu/shaders/gpu_shader_material.glsl.c index 6d08d4c8cec..91b2b13ea1a 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl.c +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl.c @@ -1,6 +1,6 @@ /* DataToC output of file */ -int datatoc_gpu_shader_material_glsl_size = 50823; +int datatoc_gpu_shader_material_glsl_size = 51015; 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, @@ -1539,11 +1539,17 @@ char datatoc_gpu_shader_material_glsl[] = { 41, 47, 40, 50, 46, 48, 42, 77, 95, 80, 73, 41, 59, 10, 9,102,108,111, 97,116, 32,118, 32, 61, 32, 97,116, 97,110, 40, 99,111, 46,122, 44, 32,104,121,112,111,116, 40, 99,111, 46,120, 44, 32, 99,111, 46,121, 41, 41, 47, 77, 95, 80, 73, 32, 43, 32, 48, 46, 53, 59, 10, 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,118,101, 99, 50, - 40,117, 44, 32,118, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 40, -118,101, 99, 51, 32, 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, 52, - 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 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, 99,111, 46,120,121, 41, 59, 10, 32, 32, 32, 32, 97, -108,112,104, 97, 32, 61, 32, 99,111,108,111,114, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, + 40,117, 44, 32,118, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,101,110,118,105,114,111, +110,109,101,110,116, 95,101,109,112,116,121, 40,118,101, 99, 51, 32, 99,111, 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,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111, +105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32, 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, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32, 97,108,112,104, 97, 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, 99,111, 46,120,121, 41, 59, 10, 32, 32, 32, 32, 97,108,112,104, 97, 32, 61, 32, 99,111,108,111,114, 46, 97, + 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 95,101,109,112,116,121, 40,118, +101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10, 32, + 32, 32, 32, 97,108,112,104, 97, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109, 97,103,105, 99, 40,118,101, 99, 51, 32,112, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97, 116, 32,100,105,115,116,111,114,116,105,111,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117, 116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_environment.c b/source/blender/nodes/shader/nodes/node_shader_tex_environment.c index 852c056dc28..9e80f79b0c5 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_environment.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_environment.c @@ -55,11 +55,8 @@ static int node_shader_gpu_tex_environment(GPUMaterial *mat, bNode *node, GPUNod Image *ima= (Image*)node->id; ImageUser *iuser= NULL; - if (!ima) { - float black[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - GPUNodeLink *vec = GPU_uniform(black); - return GPU_stack_link(mat, "set_rgba", out, out, vec); - } + if (!ima) + return GPU_stack_link(mat, "node_tex_environment_empty", in, out); if (!in[0].link) in[0].link = GPU_builtin(GPU_VIEW_POSITION); diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.c b/source/blender/nodes/shader/nodes/node_shader_tex_image.c index 28dcada3d33..e00467a52ef 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_image.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.c @@ -55,11 +55,8 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, bNode *node, GPUNodeStack Image *ima= (Image*)node->id; ImageUser *iuser= NULL; - if (!ima) { - float black[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - GPUNodeLink *vec = GPU_uniform(black); - return GPU_stack_link(mat, "set_rgba", out, out, vec); - } + if (!ima) + return GPU_stack_link(mat, "node_tex_image_empty", in, out); if (!in[0].link) in[0].link = GPU_attribute(CD_MTFACE, ""); From 74367ae091c110dda14f94a7695b6e5f1e1d43d9 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 14:05:59 +0000 Subject: [PATCH 032/159] Fix #31400: opengl offscreen render not respecting theme settings. --- source/blender/editors/space_view3d/view3d_draw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index fe142ced7fa..d9126b3809a 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2434,7 +2434,9 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, ar->winrct.ymin = 0; ar->winrct.xmax = winx; ar->winrct.ymax = winy; - + + /* set theme */ + UI_SetTheme(SPACE_VIEW3D, RGN_TYPE_WINDOW); /* set flags */ G.f |= G_RENDER_OGL; From 93aa83f0a37019ce733d2b372cbd301812670fc4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 14:06:53 +0000 Subject: [PATCH 033/159] Fix #31518: changing cycles exposure did unnecessary rerender in viewport. --- intern/cycles/blender/blender_session.cpp | 1 + intern/cycles/render/film.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index f79b9995165..997909f1b92 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -220,6 +220,7 @@ void BlenderSession::render() buffer_params.passes = passes; scene->film->passes = passes; scene->film->tag_update(scene); + scene->integrator->tag_update(scene); /* update scene */ sync->sync_data(b_v3d, b_engine.camera_override(), b_iter->name().c_str()); diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp index 55c89b7b1b2..878aa87510e 100644 --- a/intern/cycles/render/film.cpp +++ b/intern/cycles/render/film.cpp @@ -298,7 +298,6 @@ bool Film::modified(const Film& film) void Film::tag_update(Scene *scene) { - scene->integrator->tag_update(scene); need_update = true; } From f53e6166fb4eb4885e7cabbe6c54cae7418f020e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 14:08:54 +0000 Subject: [PATCH 034/159] add missing include --- source/blender/editors/space_file/fsmenu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c index a91b3669219..ac3cc15fe88 100644 --- a/source/blender/editors/space_file/fsmenu.c +++ b/source/blender/editors/space_file/fsmenu.c @@ -39,6 +39,7 @@ #include "DNA_space_types.h" /* FILE_MAX */ +#include "BLI_utildefines.h" #include "BLI_blenlib.h" #include "BLI_linklist.h" #include "BLI_dynstr.h" From 29a1a05aa595ccd7f8c1943543e8431f85a27773 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 15:06:23 +0000 Subject: [PATCH 035/159] Fix #31430: itasc solver assertion failure with debug builds. --- source/blender/ikplugin/intern/itasc_plugin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp index d94529b6104..3be096b8935 100644 --- a/source/blender/ikplugin/intern/itasc_plugin.cpp +++ b/source/blender/ikplugin/intern/itasc_plugin.cpp @@ -996,7 +996,7 @@ static void convert_pose(IK_Scene *ikscene) // assume uniform scaling and take Y scale as general scale for the armature scale = len_v3(ikscene->blArmature->obmat[1]); - rot = &ikscene->jointArray(0); + rot = (ikscene->jointArray.rows() > 0) ? &ikscene->jointArray(0) : NULL; for (joint=a=0, ikchan = ikscene->channels; anumchan && jointnumjoint; ++a, ++ikchan) { pchan= ikchan->pchan; bone= pchan->bone; @@ -1037,7 +1037,7 @@ static void BKE_pose_rest(IK_Scene *ikscene) // rest pose is 0 SetToZero(ikscene->jointArray); // except for transY joints - rot = &ikscene->jointArray(0); + rot = (ikscene->jointArray.rows() > 0) ? &ikscene->jointArray(0) : NULL; for (joint=a=0, ikchan = ikscene->channels; anumchan && jointnumjoint; ++a, ++ikchan) { pchan= ikchan->pchan; bone= pchan->bone; @@ -1135,7 +1135,7 @@ static IK_Scene* convert_tree(Scene *blscene, Object *ob, bPoseChannel *pchan) // in Blender, the rest pose is always 0 for joints BKE_pose_rest(ikscene); } - rot = &ikscene->jointArray(0); + rot = (ikscene->jointArray.rows() > 0) ? &ikscene->jointArray(0) : NULL; for (a=0, ikchan = ikscene->channels; atotchannel; ++a, ++ikchan) { pchan= ikchan->pchan; bone= pchan->bone; From d2895f0a598c0e79a61f682544de988b981e2879 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 15:06:26 +0000 Subject: [PATCH 036/159] Fix #31395: setting mesh.uv_textures['uvmap'].active did not update correctly. --- source/blender/makesrna/intern/rna_mesh.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 01726ea2dda..466cf0ed412 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -503,6 +503,7 @@ static int rna_CustomDataLayer_clone_get(PointerRNA *ptr, CustomData *data, int static void rna_CustomDataLayer_active_set(PointerRNA *ptr, CustomData *data, int value, int type, int render) { + Mesh *me = ptr->id.data; int n = (((CustomDataLayer *)ptr->data) - data->layers) - CustomData_get_layer_index(data, type); if (value == 0) @@ -517,6 +518,8 @@ static void rna_CustomDataLayer_active_set(PointerRNA *ptr, CustomData *data, in if (render) CustomData_set_layer_render(ldata, CD_MLOOPUV, n); else CustomData_set_layer_active(ldata, CD_MLOOPUV, n); } + + mesh_update_customdata_pointers(me, TRUE); } static void rna_CustomDataLayer_clone_set(PointerRNA *ptr, CustomData *data, int value, int type, int render) From e499df7b390e9f7ef6b2052e98c32043a81ce47f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 18 May 2012 15:20:45 +0000 Subject: [PATCH 037/159] Fix #31504: uv unwrap incorrectly scaling pinned islands. --- source/blender/editors/uvedit/uvedit_parametrizer.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index d596c553f7e..4a6de737e7a 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -4457,6 +4457,9 @@ void param_average(ParamHandle *handle) for (i = 0; i < phandle->ncharts; i++) { PFace *f; chart = phandle->charts[i]; + + if (chart->flag & PCHART_NOPACK) + continue; chart->u.pack.area = 0.0f; /* 3d area */ chart->u.pack.rescale = 0.0f; /* UV area, abusing rescale for tmp storage, oh well :/ */ @@ -4479,6 +4482,10 @@ void param_average(ParamHandle *handle) for (i = 0; i < phandle->ncharts; i++) { chart = phandle->charts[i]; + + if (chart->flag & PCHART_NOPACK) + continue; + if (chart->u.pack.area != 0.0f && chart->u.pack.rescale != 0.0f) { fac = chart->u.pack.area / chart->u.pack.rescale; From 65228807725d57aa4d33bcb8c3e3966d1acf0b8a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 18 May 2012 20:13:40 +0000 Subject: [PATCH 038/159] style cleanup: ghost/x11 --- .../ghost/intern/GHOST_DisplayManagerX11.cpp | 62 +- intern/ghost/intern/GHOST_DisplayManagerX11.h | 48 +- intern/ghost/intern/GHOST_DropTargetX11.cpp | 30 +- intern/ghost/intern/GHOST_DropTargetX11.h | 52 +- intern/ghost/intern/GHOST_NDOFManagerX11.cpp | 8 +- intern/ghost/intern/GHOST_SystemPathsX11.cpp | 18 +- intern/ghost/intern/GHOST_SystemPathsX11.h | 14 +- intern/ghost/intern/GHOST_SystemX11.cpp | 952 +++++++++--------- intern/ghost/intern/GHOST_SystemX11.h | 128 +-- intern/ghost/intern/GHOST_WindowX11.cpp | 849 ++++++++-------- intern/ghost/intern/GHOST_WindowX11.h | 258 ++--- 11 files changed, 1219 insertions(+), 1200 deletions(-) diff --git a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp index b8fe271fd4d..d719a4caa55 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp @@ -43,30 +43,29 @@ GHOST_DisplayManagerX11:: GHOST_DisplayManagerX11( - GHOST_SystemX11 *system -) : + GHOST_SystemX11 *system + ) : GHOST_DisplayManager(), m_system(system) { //nothing to do. } - GHOST_TSuccess +GHOST_TSuccess GHOST_DisplayManagerX11:: -getNumDisplays( - GHOST_TUns8& numDisplays -) const{ +getNumDisplays(GHOST_TUns8& numDisplays) const +{ numDisplays = m_system->getNumDisplays(); return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_DisplayManagerX11:: getNumDisplaySettings( - GHOST_TUns8 display, - GHOST_TInt32& numSettings -) const{ + GHOST_TUns8 display, + GHOST_TInt32& numSettings) const +{ #ifdef WITH_X11_XF86VMODE int majorVersion, minorVersion; XF86VidModeModeInfo **vidmodes; @@ -96,13 +95,13 @@ getNumDisplaySettings( return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_DisplayManagerX11:: getDisplaySetting( - GHOST_TUns8 display, - GHOST_TInt32 index, - GHOST_DisplaySetting& setting -) const { + GHOST_TUns8 display, + GHOST_TInt32 index, + GHOST_DisplaySetting& setting) const +{ #ifdef WITH_X11_XF86VMODE int majorVersion, minorVersion; @@ -128,13 +127,13 @@ getDisplaySetting( setting.xPixels = vidmodes[index]->hdisplay; setting.yPixels = vidmodes[index]->vdisplay; - setting.bpp = DefaultDepth(dpy,DefaultScreen(dpy)); + setting.bpp = DefaultDepth(dpy, DefaultScreen(dpy)); #else GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n"); GHOST_ASSERT(index < 1, "Requested setting outside of valid range.\n"); - Display * x_display = m_system->getXDisplay(); + Display *x_display = m_system->getXDisplay(); if (x_display == NULL) { return GHOST_kFailure; @@ -142,7 +141,7 @@ getDisplaySetting( setting.xPixels = DisplayWidth(x_display, DefaultScreen(x_display)); setting.yPixels = DisplayHeight(x_display, DefaultScreen(x_display)); - setting.bpp = DefaultDepth(x_display,DefaultScreen(x_display)); + setting.bpp = DefaultDepth(x_display, DefaultScreen(x_display)); #endif // Don't think it's possible to get this value from X! @@ -152,25 +151,25 @@ getDisplaySetting( return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_DisplayManagerX11:: getCurrentDisplaySetting( - GHOST_TUns8 display, - GHOST_DisplaySetting& setting -) const { + GHOST_TUns8 display, + GHOST_DisplaySetting& setting) const +{ /* According to the xf86vidmodegetallmodelines man page, * "The first element of the array corresponds to the current video mode." */ - return getDisplaySetting(display,GHOST_TInt32(0),setting); + return getDisplaySetting(display, GHOST_TInt32(0), setting); } - GHOST_TSuccess +GHOST_TSuccess GHOST_DisplayManagerX11:: setCurrentDisplaySetting( - GHOST_TUns8 display, - const GHOST_DisplaySetting& setting -){ + GHOST_TUns8 display, + const GHOST_DisplaySetting& setting) +{ #ifdef WITH_X11_XF86VMODE // // Mode switching code ported from Quake 2: @@ -196,7 +195,7 @@ setCurrentDisplaySetting( } # ifdef _DEBUG printf("Using XFree86-VidModeExtension Version %d.%d\n", - majorVersion, minorVersion); + majorVersion, minorVersion); # endif /* The X11 man page says vidmodes needs to be freed, but doing so causes a @@ -208,7 +207,7 @@ setCurrentDisplaySetting( for (int i = 0; i < num_vidmodes; i++) { if (setting.xPixels > vidmodes[i]->hdisplay || - setting.yPixels > vidmodes[i]->vdisplay) + setting.yPixels > vidmodes[i]->vdisplay) continue; x = setting.xPixels - vidmodes[i]->hdisplay; @@ -226,7 +225,7 @@ setCurrentDisplaySetting( actualWidth = vidmodes[best_fit]->hdisplay; actualHeight = vidmodes[best_fit]->vdisplay; printf("Switching to video mode %dx%d\n", - actualWidth, actualHeight); + actualWidth, actualHeight); # endif // change to the mode @@ -234,7 +233,8 @@ setCurrentDisplaySetting( // Move the viewport to top left XF86VidModeSetViewPort(dpy, scrnum, 0, 0); - } else + } + else return GHOST_kFailure; XFlush(dpy); diff --git a/intern/ghost/intern/GHOST_DisplayManagerX11.h b/intern/ghost/intern/GHOST_DisplayManagerX11.h index c4d2b6dbb0a..61b4578cac3 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerX11.h +++ b/intern/ghost/intern/GHOST_DisplayManagerX11.h @@ -50,18 +50,18 @@ public: * Constructor. */ GHOST_DisplayManagerX11( - GHOST_SystemX11 *system - ); + GHOST_SystemX11 *system + ); /** * Returns the number of display devices on this system. * @param numDisplays The number of displays on this system. * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess getNumDisplays( - GHOST_TUns8& numDisplays - ) const; + GHOST_TUns8& numDisplays + ) const; /** * Returns the number of display settings for this display device. @@ -69,11 +69,11 @@ public: * @param setting The number of settings of the display device with this index. * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess getNumDisplaySettings( - GHOST_TUns8 display, - GHOST_TInt32& numSettings - ) const; + GHOST_TUns8 display, + GHOST_TInt32& numSettings + ) const; /** * Returns the current setting for this display device. @@ -82,12 +82,12 @@ public: * @param setting The setting of the display device with this index. * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess getDisplaySetting( - GHOST_TUns8 display, - GHOST_TInt32 index, - GHOST_DisplaySetting& setting - ) const; + GHOST_TUns8 display, + GHOST_TInt32 index, + GHOST_DisplaySetting& setting + ) const; /** * Returns the current setting for this display device. @@ -95,11 +95,11 @@ public: * @param setting The current setting of the display device with this index. * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess getCurrentDisplaySetting( - GHOST_TUns8 display, - GHOST_DisplaySetting& setting - ) const; + GHOST_TUns8 display, + GHOST_DisplaySetting& setting + ) const; /** * Changes the current setting for this display device. @@ -107,15 +107,15 @@ public: * @param setting The current setting of the display device with this index. * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess setCurrentDisplaySetting( - GHOST_TUns8 display, - const GHOST_DisplaySetting& setting - ); + GHOST_TUns8 display, + const GHOST_DisplaySetting& setting + ); -private : +private: - GHOST_SystemX11 * m_system; + GHOST_SystemX11 *m_system; }; diff --git a/intern/ghost/intern/GHOST_DropTargetX11.cpp b/intern/ghost/intern/GHOST_DropTargetX11.cpp index 2239ac63d33..c1cc55b332a 100644 --- a/intern/ghost/intern/GHOST_DropTargetX11.cpp +++ b/intern/ghost/intern/GHOST_DropTargetX11.cpp @@ -37,8 +37,8 @@ bool GHOST_DropTargetX11::m_xdndInitialized = false; DndClass GHOST_DropTargetX11::m_dndClass; -Atom * GHOST_DropTargetX11::m_dndTypes = NULL; -Atom * GHOST_DropTargetX11::m_dndActions = NULL; +Atom *GHOST_DropTargetX11::m_dndTypes = NULL; +Atom *GHOST_DropTargetX11::m_dndActions = NULL; const char *GHOST_DropTargetX11::m_dndMimeTypes[] = {"url/url", "text/uri-list", "text/plain", "application/octet-stream"}; int GHOST_DropTargetX11::m_refCounter = 0; @@ -55,13 +55,13 @@ int GHOST_DropTargetX11::m_refCounter = 0; void GHOST_DropTargetX11::Initialize(void) { Display *display = m_system->getXDisplay(); - int dndTypesCount = sizeof(m_dndMimeTypes) / sizeof(char*); + int dndTypesCount = sizeof(m_dndMimeTypes) / sizeof(char *); int counter; xdnd_init(&m_dndClass, display); m_dndTypes = new Atom[dndTypesCount + 1]; - XInternAtoms(display, (char**)m_dndMimeTypes, dndTypesCount, 0, m_dndTypes); + XInternAtoms(display, (char **)m_dndMimeTypes, dndTypesCount, 0, m_dndTypes); m_dndTypes[dndTypesCount] = 0; m_dndActions = new Atom[8]; @@ -86,10 +86,10 @@ void GHOST_DropTargetX11::Uninitialize(void) xdnd_shut(&m_dndClass); } -GHOST_DropTargetX11::GHOST_DropTargetX11(GHOST_WindowX11 * window, GHOST_SystemX11 * system) -: -m_window(window), -m_system(system) +GHOST_DropTargetX11::GHOST_DropTargetX11(GHOST_WindowX11 *window, GHOST_SystemX11 *system) + : + m_window(window), + m_system(system) { if (!m_xdndInitialized) { Initialize(); @@ -177,7 +177,7 @@ void GHOST_DropTargetX11::UrlDecode(char *decodedOut, int bufferSize, const char assert(strlen(decodedOut) < bufferSize); // Concatenate this character onto the output - strncat(decodedOut, (char*)&asciiCharacter, 1); + strncat(decodedOut, (char *)&asciiCharacter, 1); // Skip the next character i++; @@ -188,7 +188,7 @@ void GHOST_DropTargetX11::UrlDecode(char *decodedOut, int bufferSize, const char char *GHOST_DropTargetX11::FileUrlDecode(char *fileUrl) { - if(!strncpy(fileUrl, "file://", 7) == 0) { + if (!strncpy(fileUrl, "file://", 7) == 0) { /* assume one character of encoded URL can be expanded to 4 chars max */ int decodedSize = 4 * strlen(fileUrl) + 1; char *decodedPath = (char *)malloc(decodedSize); @@ -217,9 +217,9 @@ void *GHOST_DropTargetX11::getURIListGhostData(unsigned char *dropBuffer, int dr else curLength++; } - strArray = (GHOST_TStringArray*)malloc(sizeof(GHOST_TStringArray)); + strArray = (GHOST_TStringArray *)malloc(sizeof(GHOST_TStringArray)); strArray->count = 0; - strArray->strings = (GHOST_TUns8**)malloc(totPaths*sizeof(GHOST_TUns8*)); + strArray->strings = (GHOST_TUns8 **)malloc(totPaths * sizeof(GHOST_TUns8 *)); curLength = 0; for (int i = 0; i <= dropBufferSize; i++) { @@ -228,12 +228,12 @@ void *GHOST_DropTargetX11::getURIListGhostData(unsigned char *dropBuffer, int dr char *curPath = (char *)malloc(curLength + 1); char *decodedPath; - strncpy(curPath, (char*)dropBuffer + i - curLength, curLength); + strncpy(curPath, (char *)dropBuffer + i - curLength, curLength); curPath[curLength] = 0; decodedPath = FileUrlDecode(curPath); - if(decodedPath) { - strArray->strings[strArray->count] = (GHOST_TUns8*)decodedPath; + if (decodedPath) { + strArray->strings[strArray->count] = (GHOST_TUns8 *)decodedPath; strArray->count++; } diff --git a/intern/ghost/intern/GHOST_DropTargetX11.h b/intern/ghost/intern/GHOST_DropTargetX11.h index b9e17dcc93b..10d76bbb165 100644 --- a/intern/ghost/intern/GHOST_DropTargetX11.h +++ b/intern/ghost/intern/GHOST_DropTargetX11.h @@ -47,7 +47,7 @@ public: * @param window The window to register as drop target. * @param system The associated system. */ - GHOST_DropTargetX11(GHOST_WindowX11 * window, GHOST_SystemX11 * system); + GHOST_DropTargetX11(GHOST_WindowX11 *window, GHOST_SystemX11 *system); /** * Destructor @@ -55,8 +55,8 @@ public: ~GHOST_DropTargetX11(); /** - * Handler of ClientMessage X11 event - */ + * Handler of ClientMessage X11 event + */ bool GHOST_HandleClientMessage(XEvent *event); /** @@ -73,42 +73,42 @@ private: /* Internal helper functions */ /** - * Initiailize XDND and all related X atoms - */ + * Initiailize XDND and all related X atoms + */ void Initialize(void); /** - * Uninitiailize XDND and all related X atoms - */ + * Uninitiailize XDND and all related X atoms + */ void Uninitialize(void); /** - * Get data to be passed to event from text/uri-list mime type - * @param dropBuffer - buffer returned from source application - * @param dropBufferSize - size of dropped buffer - * @return pointer to newly created GHOST data - */ - void * getURIListGhostData(unsigned char *dropBuffer, int dropBufferSize); + * Get data to be passed to event from text/uri-list mime type + * @param dropBuffer - buffer returned from source application + * @param dropBufferSize - size of dropped buffer + * @return pointer to newly created GHOST data + */ + void *getURIListGhostData(unsigned char *dropBuffer, int dropBufferSize); /** - * Decode URL (i.e. converts "file:///a%20b/test" to "file:///a b/test") - * @param decodedOut - buffer for decoded URL - * @param bufferSize - size of output buffer - * @param encodedIn - input encoded buffer to be decoded - */ + * Decode URL (i.e. converts "file:///a%20b/test" to "file:///a b/test") + * @param decodedOut - buffer for decoded URL + * @param bufferSize - size of output buffer + * @param encodedIn - input encoded buffer to be decoded + */ void UrlDecode(char *decodedOut, int bufferSize, const char *encodedIn); /** - * Fully decode file URL (i.e. converts "file:///a%20b/test" to "/a b/test") - * @param fileUrl - file path URL to be fully decoded - * @return decoded file path (resutl shold be free-d) - */ + * Fully decode file URL (i.e. converts "file:///a%20b/test" to "/a b/test") + * @param fileUrl - file path URL to be fully decoded + * @return decoded file path (resutl shold be free-d) + */ char *FileUrlDecode(char *fileUrl); /* The associated GHOST_WindowWin32. */ - GHOST_WindowX11 * m_window; + GHOST_WindowX11 *m_window; /* The System. */ - GHOST_SystemX11 * m_system; + GHOST_SystemX11 *m_system; /* Data type of the dragged object */ GHOST_TDragnDropTypes m_draggedObjectType; @@ -120,10 +120,10 @@ private: static DndClass m_dndClass; /* list of supported types to eb draggeg into */ - static Atom * m_dndTypes; + static Atom *m_dndTypes; /* list of supported dran'n'drop actions */ - static Atom * m_dndActions; + static Atom *m_dndActions; /* List of supported MIME types to be dragged into */ static const char *m_dndMimeTypes[]; diff --git a/intern/ghost/intern/GHOST_NDOFManagerX11.cpp b/intern/ghost/intern/GHOST_NDOFManagerX11.cpp index 565324ae211..bd285bc7a27 100644 --- a/intern/ghost/intern/GHOST_NDOFManagerX11.cpp +++ b/intern/ghost/intern/GHOST_NDOFManagerX11.cpp @@ -30,9 +30,9 @@ GHOST_NDOFManagerX11::GHOST_NDOFManagerX11(GHOST_System& sys) - : - GHOST_NDOFManager(sys), - m_available(false) + : + GHOST_NDOFManager(sys), + m_available(false) { setDeadZone(0.1f); /* how to calibrate on Linux? throw away slight motion! */ @@ -44,7 +44,7 @@ GHOST_NDOFManagerX11::GHOST_NDOFManagerX11(GHOST_System& sys) #define MAX_LINE_LENGTH 100 /* look for USB devices with Logitech's vendor ID */ - FILE* command_output = popen("lsusb -d 046d:","r"); + FILE *command_output = popen("lsusb -d 046d:", "r"); if (command_output) { char line[MAX_LINE_LENGTH] = {0}; while (fgets(line, MAX_LINE_LENGTH, command_output)) { diff --git a/intern/ghost/intern/GHOST_SystemPathsX11.cpp b/intern/ghost/intern/GHOST_SystemPathsX11.cpp index 6dad3661a57..c148a16d5fc 100644 --- a/intern/ghost/intern/GHOST_SystemPathsX11.cpp +++ b/intern/ghost/intern/GHOST_SystemPathsX11.cpp @@ -47,9 +47,9 @@ #endif #ifdef PREFIX -static const char *static_path= PREFIX "/share"; +static const char *static_path = PREFIX "/share"; #else -static const char *static_path= NULL; +static const char *static_path = NULL; #endif GHOST_SystemPathsX11::GHOST_SystemPathsX11() @@ -60,18 +60,18 @@ GHOST_SystemPathsX11::~GHOST_SystemPathsX11() { } -const GHOST_TUns8* GHOST_SystemPathsX11::getSystemDir() const +const GHOST_TUns8 *GHOST_SystemPathsX11::getSystemDir() const { /* no prefix assumes a portable build which only uses bundled scripts */ return (const GHOST_TUns8 *)static_path; } -const GHOST_TUns8* GHOST_SystemPathsX11::getUserDir() const +const GHOST_TUns8 *GHOST_SystemPathsX11::getUserDir() const { #ifndef WITH_XDG_USER_DIRS return (const GHOST_TUns8 *)getenv("HOME"); #else /* WITH_XDG_USER_DIRS */ - const char *home= getenv("XDG_CONFIG_HOME"); + const char *home = getenv("XDG_CONFIG_HOME"); if (home) { return (const GHOST_TUns8 *)home; @@ -79,10 +79,10 @@ const GHOST_TUns8* GHOST_SystemPathsX11::getUserDir() const else { static char user_path[PATH_MAX]; - home= getenv("HOME"); + home = getenv("HOME"); if (home == NULL) { - home= getpwuid(getuid())->pw_dir; + home = getpwuid(getuid())->pw_dir; } snprintf(user_path, sizeof(user_path), "%s/.config", home); @@ -91,12 +91,12 @@ const GHOST_TUns8* GHOST_SystemPathsX11::getUserDir() const #endif /* WITH_XDG_USER_DIRS */ } -const GHOST_TUns8* GHOST_SystemPathsX11::getBinaryDir() const +const GHOST_TUns8 *GHOST_SystemPathsX11::getBinaryDir() const { return NULL; } -void GHOST_SystemPathsX11::addToSystemRecentFiles(const char* filename) const +void GHOST_SystemPathsX11::addToSystemRecentFiles(const char *filename) const { /* XXXXX TODO: Implementation for X11 if possible */ diff --git a/intern/ghost/intern/GHOST_SystemPathsX11.h b/intern/ghost/intern/GHOST_SystemPathsX11.h index d05cab5de75..8ded9a35276 100644 --- a/intern/ghost/intern/GHOST_SystemPathsX11.h +++ b/intern/ghost/intern/GHOST_SystemPathsX11.h @@ -55,25 +55,25 @@ public: * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). */ - const GHOST_TUns8* getSystemDir() const; + const GHOST_TUns8 *getSystemDir() const; /** * Determine the base dir in which user configuration is stored, not including versioning. * If needed, it will create the base directory. * @return Unsigned char string pointing to user dir (eg ~/.blender/). */ - const GHOST_TUns8* getUserDir() const; + const GHOST_TUns8 *getUserDir() const; /** - * Determine the directory of the current binary - * @return Unsigned char string pointing to the binary dir - */ - const GHOST_TUns8* getBinaryDir() const; + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + const GHOST_TUns8 *getBinaryDir() const; /** * Add the file to the operating system most recently used files */ - void addToSystemRecentFiles(const char* filename) const; + void addToSystemRecentFiles(const char *filename) const; }; #endif diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index cabec06301a..c58ed93425d 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -75,14 +75,14 @@ static GHOST_TKey convertXKey(KeySym key); //these are for copy and select copy -static char *txt_cut_buffer= NULL; -static char *txt_select_buffer= NULL; +static char *txt_cut_buffer = NULL; +static char *txt_select_buffer = NULL; using namespace std; GHOST_SystemX11:: GHOST_SystemX11( -) : + ) : GHOST_System(), m_start_time(0) { @@ -99,40 +99,40 @@ GHOST_SystemX11( #endif m_delete_window_atom - = XInternAtom(m_display, "WM_DELETE_WINDOW", True); + = XInternAtom(m_display, "WM_DELETE_WINDOW", True); - m_wm_protocols= XInternAtom(m_display, "WM_PROTOCOLS", False); - m_wm_take_focus= XInternAtom(m_display, "WM_TAKE_FOCUS", False); - m_wm_state= XInternAtom(m_display, "WM_STATE", False); - m_wm_change_state= XInternAtom(m_display, "WM_CHANGE_STATE", False); - m_net_state= XInternAtom(m_display, "_NET_WM_STATE", False); - m_net_max_horz= XInternAtom(m_display, - "_NET_WM_STATE_MAXIMIZED_HORZ", False); - m_net_max_vert= XInternAtom(m_display, - "_NET_WM_STATE_MAXIMIZED_VERT", False); - m_net_fullscreen= XInternAtom(m_display, - "_NET_WM_STATE_FULLSCREEN", False); - m_motif= XInternAtom(m_display, "_MOTIF_WM_HINTS", False); - m_targets= XInternAtom(m_display, "TARGETS", False); - m_string= XInternAtom(m_display, "STRING", False); - m_compound_text= XInternAtom(m_display, "COMPOUND_TEXT", False); - m_text= XInternAtom(m_display, "TEXT", False); - m_clipboard= XInternAtom(m_display, "CLIPBOARD", False); - m_primary= XInternAtom(m_display, "PRIMARY", False); - m_xclip_out= XInternAtom(m_display, "XCLIP_OUT", False); - m_incr= XInternAtom(m_display, "INCR", False); - m_utf8_string= XInternAtom(m_display, "UTF8_STRING", False); + m_wm_protocols = XInternAtom(m_display, "WM_PROTOCOLS", False); + m_wm_take_focus = XInternAtom(m_display, "WM_TAKE_FOCUS", False); + m_wm_state = XInternAtom(m_display, "WM_STATE", False); + m_wm_change_state = XInternAtom(m_display, "WM_CHANGE_STATE", False); + m_net_state = XInternAtom(m_display, "_NET_WM_STATE", False); + m_net_max_horz = XInternAtom(m_display, + "_NET_WM_STATE_MAXIMIZED_HORZ", False); + m_net_max_vert = XInternAtom(m_display, + "_NET_WM_STATE_MAXIMIZED_VERT", False); + m_net_fullscreen = XInternAtom(m_display, + "_NET_WM_STATE_FULLSCREEN", False); + m_motif = XInternAtom(m_display, "_MOTIF_WM_HINTS", False); + m_targets = XInternAtom(m_display, "TARGETS", False); + m_string = XInternAtom(m_display, "STRING", False); + m_compound_text = XInternAtom(m_display, "COMPOUND_TEXT", False); + m_text = XInternAtom(m_display, "TEXT", False); + m_clipboard = XInternAtom(m_display, "CLIPBOARD", False); + m_primary = XInternAtom(m_display, "PRIMARY", False); + m_xclip_out = XInternAtom(m_display, "XCLIP_OUT", False); + m_incr = XInternAtom(m_display, "INCR", False); + m_utf8_string = XInternAtom(m_display, "UTF8_STRING", False); m_last_warp = 0; // compute the initial time timeval tv; - if (gettimeofday(&tv,NULL) == -1) { - GHOST_ASSERT(false,"Could not instantiate timer!"); + if (gettimeofday(&tv, NULL) == -1) { + GHOST_ASSERT(false, "Could not instantiate timer!"); } // Taking care not to overflow the tv.tv_sec*1000 - m_start_time = GHOST_TUns64(tv.tv_sec)*1000 + tv.tv_usec/1000; + m_start_time = GHOST_TUns64(tv.tv_sec) * 1000 + tv.tv_usec / 1000; /* use detectable autorepeate, mac and windows also do this */ @@ -158,10 +158,10 @@ GHOST_SystemX11:: } - GHOST_TSuccess +GHOST_TSuccess GHOST_SystemX11:: -init( -){ +init() +{ GHOST_TSuccess success = GHOST_System::init(); if (success) { @@ -178,82 +178,82 @@ init( return GHOST_kFailure; } - GHOST_TUns64 +GHOST_TUns64 GHOST_SystemX11:: -getMilliSeconds( -) const { +getMilliSeconds() const +{ timeval tv; - if (gettimeofday(&tv,NULL) == -1) { - GHOST_ASSERT(false,"Could not compute time!"); + if (gettimeofday(&tv, NULL) == -1) { + GHOST_ASSERT(false, "Could not compute time!"); } // Taking care not to overflow the tv.tv_sec*1000 - return GHOST_TUns64(tv.tv_sec)*1000 + tv.tv_usec/1000 - m_start_time; + return GHOST_TUns64(tv.tv_sec) * 1000 + tv.tv_usec / 1000 - m_start_time; } - GHOST_TUns8 +GHOST_TUns8 GHOST_SystemX11:: -getNumDisplays( -) const { +getNumDisplays() const +{ return GHOST_TUns8(1); } - /** - * Returns the dimensions of the main display on this system. - * @return The dimension of the main display. - */ - void +/** + * Returns the dimensions of the main display on this system. + * @return The dimension of the main display. + */ +void GHOST_SystemX11:: getMainDisplayDimensions( - GHOST_TUns32& width, - GHOST_TUns32& height -) const { + GHOST_TUns32& width, + GHOST_TUns32& height) const +{ if (m_display) { width = DisplayWidth(m_display, DefaultScreen(m_display)); height = DisplayHeight(m_display, DefaultScreen(m_display)); } } - /** - * Create a new window. - * The new window is added to the list of windows managed. - * Never explicitly delete the window, use disposeWindow() instead. - * @param title The name of the window (displayed in the title bar of the window if the OS supports it). - * @param left The coordinate of the left edge of the window. - * @param top The coordinate of the top edge of the window. - * @param width The width the window. - * @param height The height the window. - * @param state The state of the window when opened. - * @param type The type of drawing context installed in this window. - * @param stereoVisual Stereo visual for quad buffered stereo. - * @param numOfAASamples Number of samples used for AA (zero if no AA) - * @param parentWindow Parent (embedder) window - * @return The new window (or 0 if creation failed). - */ - GHOST_IWindow* +/** + * Create a new window. + * The new window is added to the list of windows managed. + * Never explicitly delete the window, use disposeWindow() instead. + * @param title The name of the window (displayed in the title bar of the window if the OS supports it). + * @param left The coordinate of the left edge of the window. + * @param top The coordinate of the top edge of the window. + * @param width The width the window. + * @param height The height the window. + * @param state The state of the window when opened. + * @param type The type of drawing context installed in this window. + * @param stereoVisual Stereo visual for quad buffered stereo. + * @param numOfAASamples Number of samples used for AA (zero if no AA) + * @param parentWindow Parent (embedder) window + * @return The new window (or 0 if creation failed). + */ +GHOST_IWindow * GHOST_SystemX11:: createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - bool stereoVisual, - const GHOST_TUns16 numOfAASamples, - const GHOST_TEmbedderWindowID parentWindow -){ - GHOST_WindowX11 * window = 0; + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + bool stereoVisual, + const GHOST_TUns16 numOfAASamples, + const GHOST_TEmbedderWindowID parentWindow) +{ + GHOST_WindowX11 *window = 0; if (!m_display) return 0; - window = new GHOST_WindowX11 ( - this,m_display,title, left, top, width, height, state, parentWindow, type, stereoVisual - ); + window = new GHOST_WindowX11( + this, m_display, title, left, top, width, height, state, parentWindow, type, stereoVisual + ); if (window) { // Both are now handle in GHOST_WindowX11.cpp @@ -263,7 +263,7 @@ createWindow( // Store the pointer to the window m_windowManager->addWindow(window); m_windowManager->setActiveWindow(window); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window) ); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window) ); } else { delete window; @@ -273,11 +273,11 @@ createWindow( return window; } - GHOST_WindowX11 * +GHOST_WindowX11 * GHOST_SystemX11:: findGhostWindow( - Window xwind -) const { + Window xwind) const +{ if (xwind == 0) return NULL; @@ -292,7 +292,7 @@ findGhostWindow( vector::const_iterator win_end = win_vec.end(); for (; win_it != win_end; ++win_it) { - GHOST_WindowX11 * window = static_cast(*win_it); + GHOST_WindowX11 *window = static_cast(*win_it); if (window->getXWindow() == xwind) { return window; } @@ -315,8 +315,8 @@ static void SleepTillEvent(Display *display, GHOST_TInt64 maxSleep) else { timeval tv; - tv.tv_sec = maxSleep/1000; - tv.tv_usec = (maxSleep - tv.tv_sec*1000)*1000; + tv.tv_sec = maxSleep / 1000; + tv.tv_usec = (maxSleep - tv.tv_sec * 1000) * 1000; select(fd + 1, &fds, NULL, NULL, &tv); } @@ -325,78 +325,78 @@ static void SleepTillEvent(Display *display, GHOST_TInt64 maxSleep) /* This function borrowed from Qt's X11 support * qclipboard_x11.cpp * */ -struct init_timestamp_data -{ - Time timestamp; +struct init_timestamp_data { + Time timestamp; }; -static Bool init_timestamp_scanner(Display*, XEvent *event, XPointer arg) +static Bool init_timestamp_scanner(Display *, XEvent *event, XPointer arg) { init_timestamp_data *data = - reinterpret_cast(arg); - switch(event->type) - { - case ButtonPress: - case ButtonRelease: - data->timestamp = event->xbutton.time; - break; - case MotionNotify: - data->timestamp = event->xmotion.time; - break; - case KeyPress: - case KeyRelease: - data->timestamp = event->xkey.time; - break; - case PropertyNotify: - data->timestamp = event->xproperty.time; - break; - case EnterNotify: - case LeaveNotify: - data->timestamp = event->xcrossing.time; - break; - case SelectionClear: - data->timestamp = event->xselectionclear.time; - break; - default: - break; - } + reinterpret_cast(arg); + switch (event->type) + { + case ButtonPress: + case ButtonRelease: + data->timestamp = event->xbutton.time; + break; + case MotionNotify: + data->timestamp = event->xmotion.time; + break; + case KeyPress: + case KeyRelease: + data->timestamp = event->xkey.time; + break; + case PropertyNotify: + data->timestamp = event->xproperty.time; + break; + case EnterNotify: + case LeaveNotify: + data->timestamp = event->xcrossing.time; + break; + case SelectionClear: + data->timestamp = event->xselectionclear.time; + break; + default: + break; + } - return false; + return false; } Time GHOST_SystemX11:: lastEventTime(Time default_time) { - init_timestamp_data data; - data.timestamp = default_time; - XEvent ev; - XCheckIfEvent(m_display, &ev, &init_timestamp_scanner, (XPointer)&data); + init_timestamp_data data; + data.timestamp = default_time; + XEvent ev; + XCheckIfEvent(m_display, &ev, &init_timestamp_scanner, (XPointer) & data); - return data.timestamp; + return data.timestamp; } - bool +bool GHOST_SystemX11:: processEvents( - bool waitForEvent -){ + bool waitForEvent) +{ // Get all the current events -- translate them into // ghost events and call base class pushEvent() method. bool anyProcessed = false; do { - GHOST_TimerManager* timerMgr = getTimerManager(); + GHOST_TimerManager *timerMgr = getTimerManager(); if (waitForEvent && m_dirty_windows.empty() && !XPending(m_display)) { GHOST_TUns64 next = timerMgr->nextFireTime(); - if (next==GHOST_kFireTimeNever) { + if (next == GHOST_kFireTimeNever) { SleepTillEvent(m_display, -1); - } else { + } + else { GHOST_TInt64 maxSleep = next - getMilliSeconds(); - if(maxSleep >= 0) + if (maxSleep >= 0) SleepTillEvent(m_display, next - getMilliSeconds()); } } @@ -417,7 +417,7 @@ processEvents( } #ifdef WITH_INPUT_NDOF - if (dynamic_cast(m_ndofManager)->processEvents()) { + if (dynamic_cast(m_ndofManager)->processEvents()) { anyProcessed = true; } #endif @@ -430,20 +430,20 @@ processEvents( #ifdef WITH_X11_XINPUT /* set currently using tablet mode (stylus or eraser) depending on device ID */ -static void setTabletMode(GHOST_WindowX11 * window, XID deviceid) +static void setTabletMode(GHOST_WindowX11 *window, XID deviceid) { - if(deviceid == window->GetXTablet().StylusID) - window->GetXTablet().CommonData.Active= GHOST_kTabletModeStylus; - else if(deviceid == window->GetXTablet().EraserID) - window->GetXTablet().CommonData.Active= GHOST_kTabletModeEraser; + if (deviceid == window->GetXTablet().StylusID) + window->GetXTablet().CommonData.Active = GHOST_kTabletModeStylus; + else if (deviceid == window->GetXTablet().EraserID) + window->GetXTablet().CommonData.Active = GHOST_kTabletModeEraser; } #endif /* WITH_X11_XINPUT */ - void +void GHOST_SystemX11::processEvent(XEvent *xe) { - GHOST_WindowX11 * window = findGhostWindow(xe->xany.window); - GHOST_Event * g_event = NULL; + GHOST_WindowX11 *window = findGhostWindow(xe->xany.window); + GHOST_Event *g_event = NULL; if (!window) { return; @@ -459,11 +459,11 @@ GHOST_SystemX11::processEvent(XEvent *xe) // per read of the event queue. g_event = new - GHOST_Event( - getMilliSeconds(), - GHOST_kEventWindowUpdate, - window - ); + GHOST_Event( + getMilliSeconds(), + GHOST_kEventWindowUpdate, + window + ); } break; } @@ -479,13 +479,13 @@ GHOST_SystemX11::processEvent(XEvent *xe) #endif if (is_tablet == false && window->getCursorGrabModeIsWarp()) { - GHOST_TInt32 x_new= xme.x_root; - GHOST_TInt32 y_new= xme.y_root; + GHOST_TInt32 x_new = xme.x_root; + GHOST_TInt32 y_new = xme.y_root; GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; /* fallback to window bounds */ - if(window->getCursorGrabBounds(bounds)==GHOST_kFailure) + if (window->getCursorGrabBounds(bounds) == GHOST_kFailure) window->getClientBounds(bounds); /* could also clamp to screen bounds @@ -493,37 +493,38 @@ GHOST_SystemX11::processEvent(XEvent *xe) bounds.wrapPoint(x_new, y_new, 8); /* offset of one incase blender is at screen bounds */ window->getCursorGrabAccum(x_accum, y_accum); - if(x_new != xme.x_root || y_new != xme.y_root) { + if (x_new != xme.x_root || y_new != xme.y_root) { if (xme.time > m_last_warp) { /* when wrapping we don't need to add an event because the * setCursorPosition call will cause a new event after */ setCursorPosition(x_new, y_new); /* wrap */ window->setCursorGrabAccum(x_accum + (xme.x_root - x_new), y_accum + (xme.y_root - y_new)); m_last_warp = lastEventTime(xme.time); - } else { + } + else { setCursorPosition(x_new, y_new); /* wrap but don't accumulate */ } } else { g_event = new - GHOST_EventCursor( - getMilliSeconds(), - GHOST_kEventCursorMove, - window, - xme.x_root + x_accum, - xme.y_root + y_accum - ); + GHOST_EventCursor( + getMilliSeconds(), + GHOST_kEventCursorMove, + window, + xme.x_root + x_accum, + xme.y_root + y_accum + ); } } else { g_event = new - GHOST_EventCursor( - getMilliSeconds(), - GHOST_kEventCursorMove, - window, - xme.x_root, - xme.y_root - ); + GHOST_EventCursor( + getMilliSeconds(), + GHOST_kEventCursorMove, + window, + xme.x_root, + xme.y_root + ); } break; } @@ -532,13 +533,13 @@ GHOST_SystemX11::processEvent(XEvent *xe) case KeyRelease: { XKeyEvent *xke = &(xe->xkey); - KeySym key_sym = XLookupKeysym(xke,0); + KeySym key_sym = XLookupKeysym(xke, 0); char ascii; char utf8_buf[6]; /* 6 is enough for a utf8 char */ GHOST_TKey gkey = convertXKey(key_sym); GHOST_TEventType type = (xke->type == KeyPress) ? - GHOST_kEventKeyDown : GHOST_kEventKeyUp; + GHOST_kEventKeyDown : GHOST_kEventKeyUp; if (!XLookupString(xke, &ascii, 1, NULL, NULL)) { ascii = '\0'; @@ -551,8 +552,8 @@ GHOST_SystemX11::processEvent(XEvent *xe) int len; /* use utf8 because its not locale depentant, from xorg docs */ - if (!(len= Xutf8LookupString(window->getX11_XIC(), xke, utf8_buf, sizeof(utf8_buf), &key_sym, &status))) { - utf8_buf[0]= '\0'; + if (!(len = Xutf8LookupString(window->getX11_XIC(), xke, utf8_buf, sizeof(utf8_buf), &key_sym, &status))) { + utf8_buf[0] = '\0'; } if ((status == XLookupChars || status == XLookupBoth)) { @@ -560,7 +561,7 @@ GHOST_SystemX11::processEvent(XEvent *xe) /* do nothing for now, this is valid utf8 */ } else { - utf8_buf[0]= '\0'; + utf8_buf[0] = '\0'; } } else if (status == XLookupKeySym) { @@ -569,33 +570,33 @@ GHOST_SystemX11::processEvent(XEvent *xe) } else { printf("Bad keycode lookup. Keysym 0x%x Status: %s\n", - (unsigned int) key_sym, - (status == XBufferOverflow ? "BufferOverflow" : - status == XLookupNone ? "XLookupNone" : - status == XLookupKeySym ? "XLookupKeySym" : - "Unknown status")); + (unsigned int) key_sym, + (status == XBufferOverflow ? "BufferOverflow" : + status == XLookupNone ? "XLookupNone" : + status == XLookupKeySym ? "XLookupKeySym" : + "Unknown status")); printf("'%.*s' %p %p\n", len, utf8_buf, window->getX11_XIC(), m_xim); } } else { - utf8_buf[0]= '\0'; + utf8_buf[0] = '\0'; } #else - utf8_buf[0]= '\0'; + utf8_buf[0] = '\0'; #endif g_event = new - GHOST_EventKey( - getMilliSeconds(), - type, - window, - gkey, - ascii, + GHOST_EventKey( + getMilliSeconds(), + type, + window, + gkey, + ascii, utf8_buf - ); + ); - break; + break; } case ButtonPress: @@ -604,59 +605,59 @@ GHOST_SystemX11::processEvent(XEvent *xe) XButtonEvent & xbe = xe->xbutton; GHOST_TButtonMask gbmask = GHOST_kButtonMaskLeft; GHOST_TEventType type = (xbe.type == ButtonPress) ? - GHOST_kEventButtonDown : GHOST_kEventButtonUp; + GHOST_kEventButtonDown : GHOST_kEventButtonUp; /* process wheel mouse events and break, only pass on press events */ - if(xbe.button == Button4) { - if(xbe.type == ButtonPress) + if (xbe.button == Button4) { + if (xbe.type == ButtonPress) g_event = new GHOST_EventWheel(getMilliSeconds(), window, 1); break; } - else if(xbe.button == Button5) { - if(xbe.type == ButtonPress) + else if (xbe.button == Button5) { + if (xbe.type == ButtonPress) g_event = new GHOST_EventWheel(getMilliSeconds(), window, -1); break; } /* process rest of normal mouse buttons */ - if(xbe.button == Button1) + if (xbe.button == Button1) gbmask = GHOST_kButtonMaskLeft; - else if(xbe.button == Button2) + else if (xbe.button == Button2) gbmask = GHOST_kButtonMaskMiddle; - else if(xbe.button == Button3) + else if (xbe.button == Button3) gbmask = GHOST_kButtonMaskRight; /* It seems events 6 and 7 are for horizontal scrolling. - * you can re-order button mapping like this... (swaps 6,7 with 8,9) - * xmodmap -e "pointer = 1 2 3 4 5 8 9 6 7" - */ - else if(xbe.button == 8) + * you can re-order button mapping like this... (swaps 6,7 with 8,9) + * xmodmap -e "pointer = 1 2 3 4 5 8 9 6 7" + */ + else if (xbe.button == 8) gbmask = GHOST_kButtonMaskButton4; - else if(xbe.button == 9) + else if (xbe.button == 9) gbmask = GHOST_kButtonMaskButton5; else break; g_event = new - GHOST_EventButton( - getMilliSeconds(), - type, - window, - gbmask - ); + GHOST_EventButton( + getMilliSeconds(), + type, + window, + gbmask + ); break; } - // change of size, border, layer etc. + // change of size, border, layer etc. case ConfigureNotify: { /* XConfigureEvent & xce = xe->xconfigure; */ g_event = new - GHOST_Event( - getMilliSeconds(), - GHOST_kEventWindowSize, - window - ); + GHOST_Event( + getMilliSeconds(), + GHOST_kEventWindowSize, + window + ); break; } @@ -672,14 +673,14 @@ GHOST_SystemX11::processEvent(XEvent *xe) // out. GHOST_TEventType gtype = (xfe.type == FocusIn) ? - GHOST_kEventWindowActivate : GHOST_kEventWindowDeactivate; + GHOST_kEventWindowActivate : GHOST_kEventWindowDeactivate; g_event = new - GHOST_Event( - getMilliSeconds(), - gtype, - window - ); + GHOST_Event( + getMilliSeconds(), + gtype, + window + ); break; } @@ -689,11 +690,11 @@ GHOST_SystemX11::processEvent(XEvent *xe) if (((Atom)xcme.data.l[0]) == m_delete_window_atom) { g_event = new - GHOST_Event( - getMilliSeconds(), - GHOST_kEventWindowClose, - window - ); + GHOST_Event( + getMilliSeconds(), + GHOST_kEventWindowClose, + window + ); } else if (((Atom)xcme.data.l[0]) == m_wm_take_focus) { XWindowAttributes attr; @@ -718,7 +719,8 @@ GHOST_SystemX11::processEvent(XEvent *xe) } } } - } else { + } + else { #ifdef WITH_XDND /* try to handle drag event (if there's no such events, GHOST_HandleClientMessage will return zero) */ if (window->getDropTarget()->GHOST_HandleClientMessage(xe) == false) { @@ -735,8 +737,8 @@ GHOST_SystemX11::processEvent(XEvent *xe) case DestroyNotify: ::exit(-1); // We're not interested in the following things.(yet...) - case NoExpose : - case GraphicsExpose : + case NoExpose: + case GraphicsExpose: break; case EnterNotify: @@ -748,17 +750,17 @@ GHOST_SystemX11::processEvent(XEvent *xe) we only do moves when the crossing mode is 'normal' (really crossing between windows) since some windowmanagers also send grab/ungrab crossings for mousewheel events. - */ + */ XCrossingEvent &xce = xe->xcrossing; - if( xce.mode == NotifyNormal ) { + if (xce.mode == NotifyNormal) { g_event = new - GHOST_EventCursor( - getMilliSeconds(), - GHOST_kEventCursorMove, - window, - xce.x_root, - xce.y_root - ); + GHOST_EventCursor( + getMilliSeconds(), + GHOST_kEventCursorMove, + window, + xce.x_root, + xce.y_root + ); } // printf("X: %s window %d\n", xce.type == EnterNotify ? "entering" : "leaving", (int) xce.window); @@ -785,7 +787,7 @@ GHOST_SystemX11::processEvent(XEvent *xe) * Now we are sure that the window is * mapped, so only need change the state. */ - window->setState (window->m_post_state); + window->setState(window->m_post_state); window->m_post_init = False; } break; @@ -820,15 +822,17 @@ GHOST_SystemX11::processEvent(XEvent *xe) nxe.xselection.time = xse->time; /*Check to see if the requestor is asking for String*/ - if(xse->target == utf8_string || xse->target == string || xse->target == compound_text || xse->target == c_string) { + if (xse->target == utf8_string || xse->target == string || xse->target == compound_text || xse->target == c_string) { if (xse->selection == XInternAtom(m_display, "PRIMARY", False)) { XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace, - (unsigned char*)txt_select_buffer, strlen(txt_select_buffer)); - } else if (xse->selection == XInternAtom(m_display, "CLIPBOARD", False)) { - XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace, - (unsigned char*)txt_cut_buffer, strlen(txt_cut_buffer)); + (unsigned char *)txt_select_buffer, strlen(txt_select_buffer)); } - } else if (xse->target == target) { + else if (xse->selection == XInternAtom(m_display, "CLIPBOARD", False)) { + XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace, + (unsigned char *)txt_cut_buffer, strlen(txt_cut_buffer)); + } + } + else if (xse->target == target) { Atom alist[5]; alist[0] = target; alist[1] = utf8_string; @@ -836,9 +840,10 @@ GHOST_SystemX11::processEvent(XEvent *xe) alist[3] = compound_text; alist[4] = c_string; XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 32, PropModeReplace, - (unsigned char*)alist, 5); + (unsigned char *)alist, 5); XFlush(m_display); - } else { + } + else { //Change property to None because we do not support anything but STRING nxe.xselection.property = None; } @@ -851,33 +856,33 @@ GHOST_SystemX11::processEvent(XEvent *xe) default: { #ifdef WITH_X11_XINPUT - if(xe->type == window->GetXTablet().MotionEvent) + if (xe->type == window->GetXTablet().MotionEvent) { - XDeviceMotionEvent* data = (XDeviceMotionEvent*)xe; + XDeviceMotionEvent *data = (XDeviceMotionEvent *)xe; /* stroke might begin without leading ProxyIn event, * this happens when window is opened when stylus is already hovering * around tablet surface */ setTabletMode(window, data->deviceid); - window->GetXTablet().CommonData.Pressure= - data->axis_data[2]/((float)window->GetXTablet().PressureLevels); + window->GetXTablet().CommonData.Pressure = + data->axis_data[2] / ((float)window->GetXTablet().PressureLevels); - /* the (short) cast and the &0xffff is bizarre and unexplained anywhere, - * but I got garbage data without it. Found it in the xidump.c source --matt */ - window->GetXTablet().CommonData.Xtilt= - (short)(data->axis_data[3]&0xffff)/((float)window->GetXTablet().XtiltLevels); - window->GetXTablet().CommonData.Ytilt= - (short)(data->axis_data[4]&0xffff)/((float)window->GetXTablet().YtiltLevels); + /* the (short) cast and the &0xffff is bizarre and unexplained anywhere, + * but I got garbage data without it. Found it in the xidump.c source --matt */ + window->GetXTablet().CommonData.Xtilt = + (short)(data->axis_data[3] & 0xffff) / ((float)window->GetXTablet().XtiltLevels); + window->GetXTablet().CommonData.Ytilt = + (short)(data->axis_data[4] & 0xffff) / ((float)window->GetXTablet().YtiltLevels); } - else if(xe->type == window->GetXTablet().ProxInEvent) + else if (xe->type == window->GetXTablet().ProxInEvent) { - XProximityNotifyEvent* data = (XProximityNotifyEvent*)xe; + XProximityNotifyEvent *data = (XProximityNotifyEvent *)xe; setTabletMode(window, data->deviceid); } - else if(xe->type == window->GetXTablet().ProxOutEvent) - window->GetXTablet().CommonData.Active= GHOST_kTabletModeNone; + else if (xe->type == window->GetXTablet().ProxOutEvent) + window->GetXTablet().CommonData.Active = GHOST_kTabletModeNone; #endif // WITH_X11_XINPUT break; } @@ -888,29 +893,29 @@ GHOST_SystemX11::processEvent(XEvent *xe) } } - GHOST_TSuccess +GHOST_TSuccess GHOST_SystemX11:: getModifierKeys( - GHOST_ModifierKeys& keys -) const { + GHOST_ModifierKeys& keys) const +{ // analyse the masks retuned from XQueryPointer. - memset((void *)m_keyboard_vector,0,sizeof(m_keyboard_vector)); + memset((void *)m_keyboard_vector, 0, sizeof(m_keyboard_vector)); - XQueryKeymap(m_display,(char *)m_keyboard_vector); + XQueryKeymap(m_display, (char *)m_keyboard_vector); // now translate key symobols into keycodes and // test with vector. - const static KeyCode shift_l = XKeysymToKeycode(m_display,XK_Shift_L); - const static KeyCode shift_r = XKeysymToKeycode(m_display,XK_Shift_R); - const static KeyCode control_l = XKeysymToKeycode(m_display,XK_Control_L); - const static KeyCode control_r = XKeysymToKeycode(m_display,XK_Control_R); - const static KeyCode alt_l = XKeysymToKeycode(m_display,XK_Alt_L); - const static KeyCode alt_r = XKeysymToKeycode(m_display,XK_Alt_R); - const static KeyCode super_l = XKeysymToKeycode(m_display,XK_Super_L); - const static KeyCode super_r = XKeysymToKeycode(m_display,XK_Super_R); + const static KeyCode shift_l = XKeysymToKeycode(m_display, XK_Shift_L); + const static KeyCode shift_r = XKeysymToKeycode(m_display, XK_Shift_R); + const static KeyCode control_l = XKeysymToKeycode(m_display, XK_Control_L); + const static KeyCode control_r = XKeysymToKeycode(m_display, XK_Control_R); + const static KeyCode alt_l = XKeysymToKeycode(m_display, XK_Alt_L); + const static KeyCode alt_r = XKeysymToKeycode(m_display, XK_Alt_R); + const static KeyCode super_l = XKeysymToKeycode(m_display, XK_Super_L); + const static KeyCode super_r = XKeysymToKeycode(m_display, XK_Super_R); // shift keys.set(GHOST_kModifierKeyLeftShift, ((m_keyboard_vector[shift_l >> 3] >> (shift_l & 7)) & 1) != 0); @@ -928,22 +933,21 @@ getModifierKeys( return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_SystemX11:: getButtons( - GHOST_Buttons& buttons -) const { - + GHOST_Buttons& buttons) const +{ Window root_return, child_return; - int rx,ry,wx,wy; + int rx, ry, wx, wy; unsigned int mask_return; if (XQueryPointer(m_display, - RootWindow(m_display,DefaultScreen(m_display)), + RootWindow(m_display, DefaultScreen(m_display)), &root_return, &child_return, - &rx,&ry, - &wx,&wy, + &rx, &ry, + &wx, &wy, &mask_return) == True) { buttons.set(GHOST_kButtonMaskLeft, (mask_return & Button1Mask) != 0); @@ -958,28 +962,29 @@ getButtons( } - GHOST_TSuccess +GHOST_TSuccess GHOST_SystemX11:: getCursorPosition( - GHOST_TInt32& x, - GHOST_TInt32& y -) const { + GHOST_TInt32& x, + GHOST_TInt32& y) const +{ Window root_return, child_return; - int rx,ry,wx,wy; + int rx, ry, wx, wy; unsigned int mask_return; if (XQueryPointer( - m_display, - RootWindow(m_display,DefaultScreen(m_display)), - &root_return, - &child_return, - &rx,&ry, - &wx,&wy, - &mask_return - ) == False) { + m_display, + RootWindow(m_display, DefaultScreen(m_display)), + &root_return, + &child_return, + &rx, &ry, + &wx, &wy, + &mask_return + ) == False) { return GHOST_kFailure; - } else { + } + else { x = rx; y = ry; } @@ -987,60 +992,58 @@ getCursorPosition( } - GHOST_TSuccess +GHOST_TSuccess GHOST_SystemX11:: setCursorPosition( - GHOST_TInt32 x, - GHOST_TInt32 y -) { + GHOST_TInt32 x, + GHOST_TInt32 y + ) { // This is a brute force move in screen coordinates // XWarpPointer does relative moves so first determine the // current pointer position. - int cx,cy; - if (getCursorPosition(cx,cy) == GHOST_kFailure) { + int cx, cy; + if (getCursorPosition(cx, cy) == GHOST_kFailure) { return GHOST_kFailure; } - int relx = x-cx; - int rely = y-cy; + int relx = x - cx; + int rely = y - cy; - XWarpPointer(m_display,None,None,0,0,0,0,relx,rely); + XWarpPointer(m_display, None, None, 0, 0, 0, 0, relx, rely); XSync(m_display, 0); /* Sync to process all requests */ return GHOST_kSuccess; } - void +void GHOST_SystemX11:: addDirtyWindow( - GHOST_WindowX11 * bad_wind -){ - + GHOST_WindowX11 *bad_wind) +{ GHOST_ASSERT((bad_wind != NULL), "addDirtyWindow() NULL ptr trapped (window)"); m_dirty_windows.push_back(bad_wind); } - bool +bool GHOST_SystemX11:: -generateWindowExposeEvents( -){ - +generateWindowExposeEvents() +{ vector::iterator w_start = m_dirty_windows.begin(); vector::const_iterator w_end = m_dirty_windows.end(); bool anyProcessed = false; - for (;w_start != w_end; ++w_start) { - GHOST_Event * g_event = new - GHOST_Event( - getMilliSeconds(), - GHOST_kEventWindowUpdate, - *w_start - ); + for (; w_start != w_end; ++w_start) { + GHOST_Event *g_event = new + GHOST_Event( + getMilliSeconds(), + GHOST_kEventWindowUpdate, + *w_start + ); (*w_start)->validate(); @@ -1054,7 +1057,7 @@ generateWindowExposeEvents( return anyProcessed; } -#define GXMAP(k,x,y) case x: k = y; break; +#define GXMAP(k, x, y) case x: k = y; break static GHOST_TKey convertXKey(KeySym key) @@ -1062,12 +1065,15 @@ convertXKey(KeySym key) GHOST_TKey type; if ((key >= XK_A) && (key <= XK_Z)) { - type = GHOST_TKey( key - XK_A + int(GHOST_kKeyA)); - } else if ((key >= XK_a) && (key <= XK_z)) { + type = GHOST_TKey(key - XK_A + int(GHOST_kKeyA)); + } + else if ((key >= XK_a) && (key <= XK_z)) { type = GHOST_TKey(key - XK_a + int(GHOST_kKeyA)); - } else if ((key >= XK_0) && (key <= XK_9)) { + } + else if ((key >= XK_0) && (key <= XK_9)) { type = GHOST_TKey(key - XK_0 + int(GHOST_kKey0)); - } else if ((key >= XK_F1) && (key <= XK_F24)) { + } + else if ((key >= XK_F1) && (key <= XK_F24)) { type = GHOST_TKey(key - XK_F1 + int(GHOST_kKeyF1)); #if defined(__sun) || defined(__sun__) /* This is a bit of a hack, but it looks like sun @@ -1076,121 +1082,124 @@ convertXKey(KeySym key) following link has documentation on it: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4734408 also from /usr/include/X11/Sunkeysym.h -#define SunXK_F36 0x1005FF10 // Labeled F11 -#define SunXK_F37 0x1005FF11 // Labeled F12 + #define SunXK_F36 0x1005FF10 // Labeled F11 + #define SunXK_F37 0x1005FF11 // Labeled F12 - mein@cs.umn.edu + mein@cs.umn.edu */ - } else if (key == 268828432) { + } + else if (key == 268828432) { type = GHOST_kKeyF11; - } else if (key == 268828433) { + } + else if (key == 268828433) { type = GHOST_kKeyF12; #endif - } else { - switch(key) { - GXMAP(type,XK_BackSpace, GHOST_kKeyBackSpace); - GXMAP(type,XK_Tab, GHOST_kKeyTab); - GXMAP(type,XK_Return, GHOST_kKeyEnter); - GXMAP(type,XK_Escape, GHOST_kKeyEsc); - GXMAP(type,XK_space, GHOST_kKeySpace); - - GXMAP(type,XK_Linefeed, GHOST_kKeyLinefeed); - GXMAP(type,XK_semicolon, GHOST_kKeySemicolon); - GXMAP(type,XK_period, GHOST_kKeyPeriod); - GXMAP(type,XK_comma, GHOST_kKeyComma); - GXMAP(type,XK_quoteright, GHOST_kKeyQuote); - GXMAP(type,XK_quoteleft, GHOST_kKeyAccentGrave); - GXMAP(type,XK_minus, GHOST_kKeyMinus); - GXMAP(type,XK_slash, GHOST_kKeySlash); - GXMAP(type,XK_backslash, GHOST_kKeyBackslash); - GXMAP(type,XK_equal, GHOST_kKeyEqual); - GXMAP(type,XK_bracketleft, GHOST_kKeyLeftBracket); - GXMAP(type,XK_bracketright, GHOST_kKeyRightBracket); - GXMAP(type,XK_Pause, GHOST_kKeyPause); - - GXMAP(type,XK_Shift_L, GHOST_kKeyLeftShift); - GXMAP(type,XK_Shift_R, GHOST_kKeyRightShift); - GXMAP(type,XK_Control_L, GHOST_kKeyLeftControl); - GXMAP(type,XK_Control_R, GHOST_kKeyRightControl); - GXMAP(type,XK_Alt_L, GHOST_kKeyLeftAlt); - GXMAP(type,XK_Alt_R, GHOST_kKeyRightAlt); - GXMAP(type,XK_Super_L, GHOST_kKeyOS); - GXMAP(type,XK_Super_R, GHOST_kKeyOS); + } + else { + switch (key) { + GXMAP(type, XK_BackSpace, GHOST_kKeyBackSpace); + GXMAP(type, XK_Tab, GHOST_kKeyTab); + GXMAP(type, XK_Return, GHOST_kKeyEnter); + GXMAP(type, XK_Escape, GHOST_kKeyEsc); + GXMAP(type, XK_space, GHOST_kKeySpace); - GXMAP(type,XK_Insert, GHOST_kKeyInsert); - GXMAP(type,XK_Delete, GHOST_kKeyDelete); - GXMAP(type,XK_Home, GHOST_kKeyHome); - GXMAP(type,XK_End, GHOST_kKeyEnd); - GXMAP(type,XK_Page_Up, GHOST_kKeyUpPage); - GXMAP(type,XK_Page_Down, GHOST_kKeyDownPage); + GXMAP(type, XK_Linefeed, GHOST_kKeyLinefeed); + GXMAP(type, XK_semicolon, GHOST_kKeySemicolon); + GXMAP(type, XK_period, GHOST_kKeyPeriod); + GXMAP(type, XK_comma, GHOST_kKeyComma); + GXMAP(type, XK_quoteright, GHOST_kKeyQuote); + GXMAP(type, XK_quoteleft, GHOST_kKeyAccentGrave); + GXMAP(type, XK_minus, GHOST_kKeyMinus); + GXMAP(type, XK_slash, GHOST_kKeySlash); + GXMAP(type, XK_backslash, GHOST_kKeyBackslash); + GXMAP(type, XK_equal, GHOST_kKeyEqual); + GXMAP(type, XK_bracketleft, GHOST_kKeyLeftBracket); + GXMAP(type, XK_bracketright, GHOST_kKeyRightBracket); + GXMAP(type, XK_Pause, GHOST_kKeyPause); - GXMAP(type,XK_Left, GHOST_kKeyLeftArrow); - GXMAP(type,XK_Right, GHOST_kKeyRightArrow); - GXMAP(type,XK_Up, GHOST_kKeyUpArrow); - GXMAP(type,XK_Down, GHOST_kKeyDownArrow); + GXMAP(type, XK_Shift_L, GHOST_kKeyLeftShift); + GXMAP(type, XK_Shift_R, GHOST_kKeyRightShift); + GXMAP(type, XK_Control_L, GHOST_kKeyLeftControl); + GXMAP(type, XK_Control_R, GHOST_kKeyRightControl); + GXMAP(type, XK_Alt_L, GHOST_kKeyLeftAlt); + GXMAP(type, XK_Alt_R, GHOST_kKeyRightAlt); + GXMAP(type, XK_Super_L, GHOST_kKeyOS); + GXMAP(type, XK_Super_R, GHOST_kKeyOS); - GXMAP(type,XK_Caps_Lock, GHOST_kKeyCapsLock); - GXMAP(type,XK_Scroll_Lock, GHOST_kKeyScrollLock); - GXMAP(type,XK_Num_Lock, GHOST_kKeyNumLock); - - /* keypad events */ - - GXMAP(type,XK_KP_0, GHOST_kKeyNumpad0); - GXMAP(type,XK_KP_1, GHOST_kKeyNumpad1); - GXMAP(type,XK_KP_2, GHOST_kKeyNumpad2); - GXMAP(type,XK_KP_3, GHOST_kKeyNumpad3); - GXMAP(type,XK_KP_4, GHOST_kKeyNumpad4); - GXMAP(type,XK_KP_5, GHOST_kKeyNumpad5); - GXMAP(type,XK_KP_6, GHOST_kKeyNumpad6); - GXMAP(type,XK_KP_7, GHOST_kKeyNumpad7); - GXMAP(type,XK_KP_8, GHOST_kKeyNumpad8); - GXMAP(type,XK_KP_9, GHOST_kKeyNumpad9); - GXMAP(type,XK_KP_Decimal, GHOST_kKeyNumpadPeriod); + GXMAP(type, XK_Insert, GHOST_kKeyInsert); + GXMAP(type, XK_Delete, GHOST_kKeyDelete); + GXMAP(type, XK_Home, GHOST_kKeyHome); + GXMAP(type, XK_End, GHOST_kKeyEnd); + GXMAP(type, XK_Page_Up, GHOST_kKeyUpPage); + GXMAP(type, XK_Page_Down, GHOST_kKeyDownPage); - GXMAP(type,XK_KP_Insert, GHOST_kKeyNumpad0); - GXMAP(type,XK_KP_End, GHOST_kKeyNumpad1); - GXMAP(type,XK_KP_Down, GHOST_kKeyNumpad2); - GXMAP(type,XK_KP_Page_Down, GHOST_kKeyNumpad3); - GXMAP(type,XK_KP_Left, GHOST_kKeyNumpad4); - GXMAP(type,XK_KP_Begin, GHOST_kKeyNumpad5); - GXMAP(type,XK_KP_Right, GHOST_kKeyNumpad6); - GXMAP(type,XK_KP_Home, GHOST_kKeyNumpad7); - GXMAP(type,XK_KP_Up, GHOST_kKeyNumpad8); - GXMAP(type,XK_KP_Page_Up, GHOST_kKeyNumpad9); - GXMAP(type,XK_KP_Delete, GHOST_kKeyNumpadPeriod); + GXMAP(type, XK_Left, GHOST_kKeyLeftArrow); + GXMAP(type, XK_Right, GHOST_kKeyRightArrow); + GXMAP(type, XK_Up, GHOST_kKeyUpArrow); + GXMAP(type, XK_Down, GHOST_kKeyDownArrow); - GXMAP(type,XK_KP_Enter, GHOST_kKeyNumpadEnter); - GXMAP(type,XK_KP_Add, GHOST_kKeyNumpadPlus); - GXMAP(type,XK_KP_Subtract, GHOST_kKeyNumpadMinus); - GXMAP(type,XK_KP_Multiply, GHOST_kKeyNumpadAsterisk); - GXMAP(type,XK_KP_Divide, GHOST_kKeyNumpadSlash); + GXMAP(type, XK_Caps_Lock, GHOST_kKeyCapsLock); + GXMAP(type, XK_Scroll_Lock, GHOST_kKeyScrollLock); + GXMAP(type, XK_Num_Lock, GHOST_kKeyNumLock); + + /* keypad events */ + + GXMAP(type, XK_KP_0, GHOST_kKeyNumpad0); + GXMAP(type, XK_KP_1, GHOST_kKeyNumpad1); + GXMAP(type, XK_KP_2, GHOST_kKeyNumpad2); + GXMAP(type, XK_KP_3, GHOST_kKeyNumpad3); + GXMAP(type, XK_KP_4, GHOST_kKeyNumpad4); + GXMAP(type, XK_KP_5, GHOST_kKeyNumpad5); + GXMAP(type, XK_KP_6, GHOST_kKeyNumpad6); + GXMAP(type, XK_KP_7, GHOST_kKeyNumpad7); + GXMAP(type, XK_KP_8, GHOST_kKeyNumpad8); + GXMAP(type, XK_KP_9, GHOST_kKeyNumpad9); + GXMAP(type, XK_KP_Decimal, GHOST_kKeyNumpadPeriod); + + GXMAP(type, XK_KP_Insert, GHOST_kKeyNumpad0); + GXMAP(type, XK_KP_End, GHOST_kKeyNumpad1); + GXMAP(type, XK_KP_Down, GHOST_kKeyNumpad2); + GXMAP(type, XK_KP_Page_Down, GHOST_kKeyNumpad3); + GXMAP(type, XK_KP_Left, GHOST_kKeyNumpad4); + GXMAP(type, XK_KP_Begin, GHOST_kKeyNumpad5); + GXMAP(type, XK_KP_Right, GHOST_kKeyNumpad6); + GXMAP(type, XK_KP_Home, GHOST_kKeyNumpad7); + GXMAP(type, XK_KP_Up, GHOST_kKeyNumpad8); + GXMAP(type, XK_KP_Page_Up, GHOST_kKeyNumpad9); + GXMAP(type, XK_KP_Delete, GHOST_kKeyNumpadPeriod); + + GXMAP(type, XK_KP_Enter, GHOST_kKeyNumpadEnter); + GXMAP(type, XK_KP_Add, GHOST_kKeyNumpadPlus); + GXMAP(type, XK_KP_Subtract, GHOST_kKeyNumpadMinus); + GXMAP(type, XK_KP_Multiply, GHOST_kKeyNumpadAsterisk); + GXMAP(type, XK_KP_Divide, GHOST_kKeyNumpadSlash); /* Media keys in some keyboards and laptops with XFree86/Xorg */ #ifdef WITH_XF86KEYSYM - GXMAP(type,XF86XK_AudioPlay, GHOST_kKeyMediaPlay); - GXMAP(type,XF86XK_AudioStop, GHOST_kKeyMediaStop); - GXMAP(type,XF86XK_AudioPrev, GHOST_kKeyMediaFirst); - GXMAP(type,XF86XK_AudioRewind, GHOST_kKeyMediaFirst); - GXMAP(type,XF86XK_AudioNext, GHOST_kKeyMediaLast); + GXMAP(type, XF86XK_AudioPlay, GHOST_kKeyMediaPlay); + GXMAP(type, XF86XK_AudioStop, GHOST_kKeyMediaStop); + GXMAP(type, XF86XK_AudioPrev, GHOST_kKeyMediaFirst); + GXMAP(type, XF86XK_AudioRewind, GHOST_kKeyMediaFirst); + GXMAP(type, XF86XK_AudioNext, GHOST_kKeyMediaLast); #ifdef XF86XK_AudioForward /* Debian lenny's XF86keysym.h has no XF86XK_AudioForward define */ - GXMAP(type,XF86XK_AudioForward, GHOST_kKeyMediaLast); + GXMAP(type, XF86XK_AudioForward, GHOST_kKeyMediaLast); #endif #endif - /* some extra sun cruft (NICE KEYBOARD!) */ + /* some extra sun cruft (NICE KEYBOARD!) */ #ifdef __sun__ - GXMAP(type,0xffde, GHOST_kKeyNumpad1); - GXMAP(type,0xffe0, GHOST_kKeyNumpad3); - GXMAP(type,0xffdc, GHOST_kKeyNumpad5); - GXMAP(type,0xffd8, GHOST_kKeyNumpad7); - GXMAP(type,0xffda, GHOST_kKeyNumpad9); + GXMAP(type, 0xffde, GHOST_kKeyNumpad1); + GXMAP(type, 0xffe0, GHOST_kKeyNumpad3); + GXMAP(type, 0xffdc, GHOST_kKeyNumpad5); + GXMAP(type, 0xffd8, GHOST_kKeyNumpad7); + GXMAP(type, 0xffda, GHOST_kKeyNumpad9); - GXMAP(type,0xffd6, GHOST_kKeyNumpadSlash); - GXMAP(type,0xffd7, GHOST_kKeyNumpadAsterisk); + GXMAP(type, 0xffd6, GHOST_kKeyNumpadSlash); + GXMAP(type, 0xffd7, GHOST_kKeyNumpadAsterisk); #endif - default : + default: type = GHOST_kKeyUnknown; break; } @@ -1203,28 +1212,28 @@ convertXKey(KeySym key) /* from xclip.c xcout() v0.11 */ -#define XCLIB_XCOUT_NONE 0 /* no context */ -#define XCLIB_XCOUT_SENTCONVSEL 1 /* sent a request */ -#define XCLIB_XCOUT_INCR 2 /* in an incr loop */ -#define XCLIB_XCOUT_FALLBACK 3 /* STRING failed, need fallback to UTF8 */ -#define XCLIB_XCOUT_FALLBACK_UTF8 4 /* UTF8 failed, move to compouned */ -#define XCLIB_XCOUT_FALLBACK_COMP 5 /* compouned failed, move to text. */ -#define XCLIB_XCOUT_FALLBACK_TEXT 6 +#define XCLIB_XCOUT_NONE 0 /* no context */ +#define XCLIB_XCOUT_SENTCONVSEL 1 /* sent a request */ +#define XCLIB_XCOUT_INCR 2 /* in an incr loop */ +#define XCLIB_XCOUT_FALLBACK 3 /* STRING failed, need fallback to UTF8 */ +#define XCLIB_XCOUT_FALLBACK_UTF8 4 /* UTF8 failed, move to compouned */ +#define XCLIB_XCOUT_FALLBACK_COMP 5 /* compouned failed, move to text. */ +#define XCLIB_XCOUT_FALLBACK_TEXT 6 // Retrieves the contents of a selections. void GHOST_SystemX11::getClipboard_xcout(XEvent evt, - Atom sel, Atom target, unsigned char **txt, - unsigned long *len, unsigned int *context) const + Atom sel, Atom target, unsigned char **txt, + unsigned long *len, unsigned int *context) const { Atom pty_type; int pty_format; unsigned char *buffer; unsigned long pty_size, pty_items; - unsigned char *ltxt= *txt; + unsigned char *ltxt = *txt; vector & win_vec = m_windowManager->getWindows(); vector::iterator win_it = win_vec.begin(); - GHOST_WindowX11 * window = static_cast(*win_it); + GHOST_WindowX11 *window = static_cast(*win_it); Window win = window->getXWindow(); switch (*context) { @@ -1246,22 +1255,22 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, return; if (target == m_utf8_string && evt.xselection.property == None) { - *context= XCLIB_XCOUT_FALLBACK_UTF8; + *context = XCLIB_XCOUT_FALLBACK_UTF8; return; } else if (target == m_compound_text && evt.xselection.property == None) { - *context= XCLIB_XCOUT_FALLBACK_COMP; + *context = XCLIB_XCOUT_FALLBACK_COMP; return; } else if (target == m_text && evt.xselection.property == None) { - *context= XCLIB_XCOUT_FALLBACK_TEXT; + *context = XCLIB_XCOUT_FALLBACK_TEXT; return; } // find the size and format of the data in property XGetWindowProperty(m_display, win, m_xclip_out, 0, 0, False, - AnyPropertyType, &pty_type, &pty_format, - &pty_items, &pty_size, &buffer); + AnyPropertyType, &pty_type, &pty_format, + &pty_items, &pty_size, &buffer); XFree(buffer); if (pty_type == m_incr) { @@ -1282,8 +1291,8 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, // not using INCR mechanism, just read the property XGetWindowProperty(m_display, win, m_xclip_out, 0, (long) pty_size, - False, AnyPropertyType, &pty_type, - &pty_format, &pty_items, &pty_size, &buffer); + False, AnyPropertyType, &pty_type, + &pty_format, &pty_items, &pty_size, &buffer); // finished with property, delete it XDeleteProperty(m_display, win, m_xclip_out); @@ -1320,8 +1329,8 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, // check size and format of the property XGetWindowProperty(m_display, win, m_xclip_out, 0, 0, False, - AnyPropertyType, &pty_type, &pty_format, - &pty_items, &pty_size, (unsigned char **) &buffer); + AnyPropertyType, &pty_type, &pty_format, + &pty_items, &pty_size, (unsigned char **) &buffer); if (pty_format != 8) { // property does not contain text, delete it @@ -1348,8 +1357,8 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, // if we have come this far, the propery contains // text, we know the size. XGetWindowProperty(m_display, win, m_xclip_out, 0, (long) pty_size, - False, AnyPropertyType, &pty_type, &pty_format, - &pty_items, &pty_size, (unsigned char **) &buffer); + False, AnyPropertyType, &pty_type, &pty_format, + &pty_items, &pty_size, (unsigned char **) &buffer); // allocate memory to accommodate data in *txt if (*len == 0) { @@ -1378,37 +1387,37 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const { Atom sseln; - Atom target= m_utf8_string; + Atom target = m_utf8_string; Window owner; // from xclip.c doOut() v0.11 unsigned char *sel_buf; - unsigned long sel_len= 0; + unsigned long sel_len = 0; XEvent evt; - unsigned int context= XCLIB_XCOUT_NONE; + unsigned int context = XCLIB_XCOUT_NONE; if (selection == True) - sseln= m_primary; + sseln = m_primary; else - sseln= m_clipboard; + sseln = m_clipboard; vector & win_vec = m_windowManager->getWindows(); vector::iterator win_it = win_vec.begin(); - GHOST_WindowX11 * window = static_cast(*win_it); + GHOST_WindowX11 *window = static_cast(*win_it); Window win = window->getXWindow(); /* check if we are the owner. */ - owner= XGetSelectionOwner(m_display, sseln); + owner = XGetSelectionOwner(m_display, sseln); if (owner == win) { if (sseln == m_clipboard) { - sel_buf= (unsigned char *)malloc(strlen(txt_cut_buffer)+1); + sel_buf = (unsigned char *)malloc(strlen(txt_cut_buffer) + 1); strcpy((char *)sel_buf, txt_cut_buffer); - return((GHOST_TUns8*)sel_buf); + return((GHOST_TUns8 *)sel_buf); } else { - sel_buf= (unsigned char *)malloc(strlen(txt_select_buffer)+1); + sel_buf = (unsigned char *)malloc(strlen(txt_select_buffer) + 1); strcpy((char *)sel_buf, txt_select_buffer); - return((GHOST_TUns8*)sel_buf); + return((GHOST_TUns8 *)sel_buf); } } else if (owner == None) @@ -1424,20 +1433,20 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const /* fallback is needed. set XA_STRING to target and restart the loop. */ if (context == XCLIB_XCOUT_FALLBACK) { - context= XCLIB_XCOUT_NONE; - target= m_string; + context = XCLIB_XCOUT_NONE; + target = m_string; continue; } else if (context == XCLIB_XCOUT_FALLBACK_UTF8) { /* utf8 fail, move to compouned text. */ - context= XCLIB_XCOUT_NONE; - target= m_compound_text; + context = XCLIB_XCOUT_NONE; + target = m_compound_text; continue; } else if (context == XCLIB_XCOUT_FALLBACK_COMP) { /* compouned text faile, move to text. */ - context= XCLIB_XCOUT_NONE; - target= m_text; + context = XCLIB_XCOUT_NONE; + target = m_text; continue; } @@ -1450,8 +1459,8 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const /* only print the buffer out, and free it, if it's not * empty */ - unsigned char *tmp_data = (unsigned char*) malloc(sel_len+1); - memcpy((char*)tmp_data, (char*)sel_buf, sel_len); + unsigned char *tmp_data = (unsigned char *) malloc(sel_len + 1); + memcpy((char *)tmp_data, (char *)sel_buf, sel_len); tmp_data[sel_len] = '\0'; if (sseln == m_string) @@ -1459,7 +1468,7 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const else free(sel_buf); - return (GHOST_TUns8*)tmp_data; + return (GHOST_TUns8 *)tmp_data; } return(NULL); } @@ -1470,25 +1479,26 @@ void GHOST_SystemX11::putClipboard(GHOST_TInt8 *buffer, bool selection) const vector & win_vec = m_windowManager->getWindows(); vector::iterator win_it = win_vec.begin(); - GHOST_WindowX11 * window = static_cast(*win_it); + GHOST_WindowX11 *window = static_cast(*win_it); m_window = window->getXWindow(); if (buffer) { if (selection == False) { XSetSelectionOwner(m_display, m_clipboard, m_window, CurrentTime); - owner= XGetSelectionOwner(m_display, m_clipboard); + owner = XGetSelectionOwner(m_display, m_clipboard); if (txt_cut_buffer) - free((void*)txt_cut_buffer); + free((void *)txt_cut_buffer); - txt_cut_buffer = (char*) malloc(strlen(buffer)+1); + txt_cut_buffer = (char *) malloc(strlen(buffer) + 1); strcpy(txt_cut_buffer, buffer); - } else { + } + else { XSetSelectionOwner(m_display, m_primary, m_window, CurrentTime); - owner= XGetSelectionOwner(m_display, m_primary); + owner = XGetSelectionOwner(m_display, m_primary); if (txt_select_buffer) - free((void*)txt_select_buffer); + free((void *)txt_select_buffer); - txt_select_buffer = (char*) malloc(strlen(buffer)+1); + txt_select_buffer = (char *) malloc(strlen(buffer) + 1); strcpy(txt_select_buffer, buffer); } @@ -1499,16 +1509,16 @@ void GHOST_SystemX11::putClipboard(GHOST_TInt8 *buffer, bool selection) const #ifdef WITH_XDND GHOST_TSuccess GHOST_SystemX11::pushDragDropEvent(GHOST_TEventType eventType, - GHOST_TDragnDropTypes draggedObjectType, - GHOST_IWindow* window, - int mouseX, int mouseY, - void* data) + GHOST_TDragnDropTypes draggedObjectType, + GHOST_IWindow *window, + int mouseX, int mouseY, + void *data) { - GHOST_SystemX11* system = ((GHOST_SystemX11*)getSystem()); + GHOST_SystemX11 *system = ((GHOST_SystemX11 *)getSystem()); return system->pushEvent(new GHOST_EventDragnDrop(system->getMilliSeconds(), - eventType, - draggedObjectType, - window,mouseX,mouseY,data) - ); + eventType, + draggedObjectType, + window, mouseX, mouseY, data) + ); } #endif diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h index d236c73dabd..fd5a33c02d7 100644 --- a/intern/ghost/intern/GHOST_SystemX11.h +++ b/intern/ghost/intern/GHOST_SystemX11.h @@ -63,7 +63,7 @@ public: */ GHOST_SystemX11( - ); + ); /** * Destructor. @@ -71,9 +71,9 @@ public: virtual ~GHOST_SystemX11(); - GHOST_TSuccess + GHOST_TSuccess init( - ); + ); /** @@ -85,28 +85,28 @@ public: * Returns the number of milliseconds since the start of the system process. * @return The number of milliseconds. */ - GHOST_TUns64 + GHOST_TUns64 getMilliSeconds( - ) const; + ) const; /** * Returns the number of displays on this system. * @return The number of displays. */ - GHOST_TUns8 + GHOST_TUns8 getNumDisplays( - ) const; + ) const; /** * Returns the dimensions of the main display on this system. * @return The dimension of the main display. */ - void + void getMainDisplayDimensions( - GHOST_TUns32& width, - GHOST_TUns32& height - ) const; + GHOST_TUns32& width, + GHOST_TUns32& height + ) const; /** * Create a new window. @@ -120,22 +120,22 @@ public: * @param state The state of the window when opened. * @param type The type of drawing context installed in this window. * @param stereoVisual Create a stereo visual for quad buffered stereo. - * @param parentWindow Parent (embedder) window + * @param parentWindow Parent (embedder) window * @return The new window (or 0 if creation failed). */ - GHOST_IWindow* + GHOST_IWindow * createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples = 0, - const GHOST_TEmbedderWindowID parentWindow = 0 - ); + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples = 0, + const GHOST_TEmbedderWindowID parentWindow = 0 + ); /** * @section Interface Inherited from GHOST_ISystem @@ -146,45 +146,45 @@ public: * @param waitForEvent Flag to wait for an event (or return immediately). * @return Indication of the presence of events. */ - bool + bool processEvents( - bool waitForEvent - ); + bool waitForEvent + ); /** * @section Interface Inherited from GHOST_System */ - GHOST_TSuccess + GHOST_TSuccess getCursorPosition( - GHOST_TInt32& x, - GHOST_TInt32& y - ) const; + GHOST_TInt32& x, + GHOST_TInt32& y + ) const; - GHOST_TSuccess + GHOST_TSuccess setCursorPosition( - GHOST_TInt32 x, - GHOST_TInt32 y - ); + GHOST_TInt32 x, + GHOST_TInt32 y + ); /** * Returns the state of all modifier keys. * @param keys The state of all modifier keys (true == pressed). * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess getModifierKeys( - GHOST_ModifierKeys& keys - ) const; + GHOST_ModifierKeys& keys + ) const; /** * Returns the state of the mouse buttons (ouside the message queue). * @param buttons The state of the buttons. * @return Indication of success. */ - GHOST_TSuccess + GHOST_TSuccess getButtons( - GHOST_Buttons& buttons - ) const; + GHOST_Buttons& buttons + ) const; /** * @section Interface Dirty @@ -192,26 +192,26 @@ public: * generate a GHOST window update event on a call to processEvents() */ - void + void addDirtyWindow( - GHOST_WindowX11 * bad_wind - ); + GHOST_WindowX11 *bad_wind + ); /** * return a pointer to the X11 display structure */ - Display * + Display * getXDisplay( - ) { + ) { return m_display; } #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) - XIM + XIM getX11_XIM( - ) { + ) { return m_xim; } #endif @@ -246,13 +246,15 @@ public: * @param window The window on which the event occurred * @return Indication whether the event was handled. */ - static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,GHOST_IWindow* window, int mouseX, int mouseY, void* data); + static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, GHOST_IWindow *window, int mouseX, int mouseY, void *data); #endif /** * @see GHOST_ISystem */ - int toggleConsole(int action) { return 0; } + int toggleConsole(int action) { + return 0; + } /** * Atom used for ICCCM, WM-spec and Motif. @@ -282,9 +284,9 @@ public: Atom m_incr; Atom m_utf8_string; -private : +private: - Display * m_display; + Display *m_display; #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) XIM m_xim; #endif @@ -307,24 +309,24 @@ private : * X11 window xwind */ - GHOST_WindowX11 * + GHOST_WindowX11 * findGhostWindow( - Window xwind - ) const; + Window xwind + ) const; - void + void processEvent( - XEvent *xe - ); + XEvent *xe + ); - Time + Time lastEventTime( - Time default_time - ); + Time default_time + ); - bool + bool generateWindowExposeEvents( - ); + ); }; #endif diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 85a9163ec91..12990064621 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -43,7 +43,7 @@ #include #include -#if defined(__sun__) || defined( __sun ) || defined (__sparc) || defined (__sparc__) || defined (_AIX) +#if defined(__sun__) || defined(__sun) || defined(__sparc) || defined(__sparc__) || defined(_AIX) #include #endif @@ -79,13 +79,13 @@ typedef struct { #define _NET_WM_STATE_TOGGLE 2 /* -import bpy -I = bpy.data.images['blender.png'] # the 48x48 icon + import bpy + I = bpy.data.images['blender.png'] # the 48x48 icon -# Write to a file that can be -# used within static unsigned char BLENDER_ICON_48x48x24[] = {...} -f = open('/myicon.txt', 'w') -for j in xrange(48): + # Write to a file that can be + # used within static unsigned char BLENDER_ICON_48x48x24[] = {...} + f = open('/myicon.txt', 'w') + for j in xrange(48): for k in xrange(48): v = I.getPixelI(j,47-k) v.pop() @@ -93,60 +93,60 @@ for j in xrange(48): f.write(str(hex(p))+',') f.write('\n') -*/ + */ // See the python script above to regenerate the 48x48 icon within blender #define BLENDER_ICON_WIDTH 48 #define BLENDER_ICON_HEIGHT 48 static unsigned char BLENDER_ICON_48x48x24[] = { -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x4f,0x2a,0xd,0xa7,0x5b,0x1f,0xb8,0x66,0x22,0x6c,0x3b,0x14,0x5,0x3,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x6f,0x3a,0x13,0xea,0x7f,0x2c,0xee,0x7e,0x2b,0xee,0x7e,0x2b,0xef,0x85,0x2e,0x5f,0x35,0x12,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x43,0x22,0xb,0xed,0x7f,0x2c,0xed,0x7c,0x2b,0xee,0x7f,0x2c,0xee,0x80,0x2c,0xee,0x80,0x2c,0xa8,0x5f,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x2e,0x16,0x6,0xd0,0x6f,0x26,0xed,0x7b,0x2a,0xed,0x7d,0x2b,0xee,0x7f,0x2c,0xee,0x80,0x2c,0xee,0x82,0x2d,0x9a,0x57,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x17,0xb,0x4,0xb9,0x60,0x21,0xed,0x7a,0x2a,0xed,0x7b,0x2a,0xed,0x7e,0x2b,0xee,0x7f,0x2c,0xee,0x7f,0x2c,0xee,0x86,0x2e,0x4e,0x2b,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x1,0x0,0x0,0x96,0x4d,0x19,0xee,0x7a,0x2a,0xed,0x79,0x2a,0xed,0x7c,0x2b,0xed,0x7e,0x2b,0xed,0x7e,0x2b,0xef,0x83,0x2d,0x98,0x55,0x1c,0x3,0x1,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x20,0xf,0x5,0x4b,0x27,0xe,0x21,0x11,0x5,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x67,0x34,0x11,0xed,0x7b,0x2a,0xec,0x79,0x29,0xed,0x7b,0x2a,0xed,0x7c,0x2b,0xed,0x7d,0x2b,0xee,0x7f,0x2c,0xbb,0x69,0x24,0x11,0x9,0x3,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x38,0x1c,0x9,0xc9,0x6d,0x2c,0xf1,0x86,0x36,0xd7,0x79,0x2a,0x22,0x12,0x5,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x3b,0x1d,0x9,0xe0,0x74,0x27,0xed,0x7a,0x2a,0xed,0x7c,0x2a,0xed,0x7d,0x2b,0xed,0x7d,0x2b,0xed,0x7d,0x2b,0xdc,0x7a,0x2a,0x1e,0xf,0x5,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xa6,0x56,0x23,0xee,0x83,0x3b,0xed,0x7d,0x2c,0xf0,0x85,0x2e,0x75,0x43,0x17,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x25,0x12,0x5,0xc9,0x68,0x24,0xed,0x7b,0x2a,0xed,0x7d,0x2b,0xed,0x7e,0x2b,0xee,0x7e,0x2c,0xed,0x7d,0x2b,0xe3,0x7d,0x2b,0x3b,0x1f,0xa,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x1c,0xd,0x4,0xd9,0x74,0x35,0xee,0x83,0x3a,0xee,0x7f,0x2b,0xf0,0x86,0x2e,0x83,0x4d,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xa,0x5,0x1,0xa1,0x54,0x1c,0xee,0x7e,0x2c,0xed,0x7e,0x2c,0xed,0x7f,0x2c,0xed,0x80,0x2c,0xed,0x7f,0x2b,0xec,0x81,0x2d,0x60,0x33,0x11,0x1,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x24,0x11,0x5,0xe0,0x7a,0x38,0xee,0x84,0x3a,0xee,0x82,0x2c,0xf0,0x88,0x2f,0x82,0x4d,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x6f,0x39,0x13,0xef,0x82,0x30,0xed,0x82,0x2f,0xee,0x82,0x2e,0xee,0x82,0x2d,0xee,0x81,0x2c,0xf0,0x83,0x2d,0x88,0x49,0x18,0x3,0x2,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x24,0x11,0x5,0xe0,0x7c,0x3a,0xee,0x86,0x3b,0xee,0x84,0x2d,0xf1,0x8b,0x30,0x82,0x4d,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0x54,0x2b,0xf,0xe9,0x80,0x30,0xee,0x87,0x33,0xef,0x88,0x32,0xef,0x88,0x30,0xee,0x85,0x2f,0xef,0x83,0x2e,0xae,0x5f,0x20,0x4,0x2,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x24,0x11,0x5,0xe0,0x7e,0x3d,0xef,0x8a,0x3d,0xef,0x88,0x2e,0xf1,0x8d,0x31,0x81,0x4d,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0x29,0x15,0x7,0xd2,0x74,0x2d,0xf0,0x8b,0x36,0xf0,0x8d,0x35,0xef,0x8d,0x35,0xef,0x8b,0x33,0xef,0x88,0x30,0xc4,0x6d,0x26,0x18,0xc,0x4,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x24,0x11,0x5,0xe1,0x80,0x3f,0xf0,0x8d,0x3f,0xef,0x8a,0x2f,0xf1,0x8f,0x32,0x81,0x4e,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0x9,0x3,0x0,0xb1,0x61,0x26,0xf1,0x8e,0x3a,0xf1,0x90,0x3a,0xf0,0x90,0x38,0xf0,0x90,0x36,0xef,0x8e,0x35,0xd3,0x7a,0x2c,0x22,0x11,0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x24,0x12,0x5,0xe1,0x83,0x42,0xf0,0x90,0x42,0xf0,0x8d,0x30,0xf2,0x92,0x33,0x80,0x4e,0x1b,0x0,0x0,0x0,0x3,0x2,0x0,0x81,0x45,0x1b,0xf1,0x90,0x3e,0xf1,0x94,0x3d,0xf1,0x95,0x3c,0xf0,0x94,0x3b,0xf0,0x92,0x39,0xf0,0x90,0x35,0xd0,0x7b,0x2b,0xc2,0x6e,0x26,0xbe,0x6c,0x25,0x94,0x54,0x1c,0x5b,0x33,0x11,0x1a,0xe,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x25,0x14,0x6,0xe2,0x86,0x44,0xf1,0x94,0x45,0xf0,0x90,0x31,0xf2,0x94,0x33,0x80,0x4e,0x1b,0x0,0x0,0x0,0x60,0x34,0x14,0xed,0x8c,0x3e,0xf0,0x96,0x42,0xf1,0x97,0x40,0xf1,0x95,0x3f,0xf0,0x91,0x39,0xef,0x8e,0x33,0xef,0x8d,0x31,0xf0,0x8d,0x31,0xef,0x8c,0x30,0xef,0x8c,0x30,0xf0,0x8d,0x31,0xf1,0x8e,0x31,0xe1,0x85,0x2e,0x92,0x55,0x1d,0x25,0x14,0x7,0x1,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x26,0x14,0x6,0xe2,0x89,0x46,0xf2,0x97,0x47,0xf1,0x92,0x32,0xf2,0x96,0x34,0x80,0x4e,0x1a,0x32,0x1a,0xa,0xe3,0x87,0x3d,0xf1,0x97,0x45,0xf1,0x98,0x44,0xf1,0x95,0x41,0xf0,0x90,0x39,0xef,0x8d,0x30,0xef,0x8f,0x31,0xf0,0x90,0x32,0xf0,0x92,0x33,0xf1,0x93,0x33,0xf1,0x94,0x34,0xf1,0x94,0x34,0xf0,0x93,0x34,0xf0,0x91,0x32,0xf1,0x91,0x33,0xe2,0x8a,0x30,0x6b,0x3f,0x15,0x1,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x26,0x14,0x6,0xe3,0x8b,0x49,0xf2,0x9a,0x49,0xf1,0x93,0x32,0xf2,0x98,0x35,0x8f,0x57,0x1d,0xcf,0x7c,0x38,0xf2,0x99,0x48,0xf1,0x98,0x47,0xf1,0x96,0x44,0xf0,0x90,0x39,0xef,0x8d,0x31,0xf0,0x90,0x31,0xf0,0x92,0x33,0xf1,0x94,0x33,0xf1,0x96,0x35,0xf1,0x98,0x35,0xf1,0x9a,0x36,0xf1,0x9c,0x37,0xf2,0x9d,0x37,0xf2,0x9c,0x37,0xf2,0x99,0x36,0xf0,0x94,0x34,0xf3,0x97,0x35,0x9f,0x60,0x21,0x13,0xb,0x3,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x26,0x14,0x6,0xe3,0x8d,0x4b,0xf2,0x9b,0x4c,0xf1,0x93,0x32,0xf1,0x97,0x35,0xea,0x98,0x43,0xf2,0x9d,0x4d,0xf1,0x9a,0x4b,0xf1,0x99,0x49,0xf0,0x93,0x3d,0xf0,0x8d,0x30,0xf0,0x90,0x32,0xf0,0x92,0x32,0xf0,0x94,0x34,0xf1,0x96,0x34,0xf1,0x98,0x36,0xf1,0x9a,0x36,0xf2,0x9c,0x38,0xf2,0x9f,0x38,0xf2,0xa2,0x39,0xf3,0xa2,0x39,0xf3,0xa2,0x39,0xf2,0x9f,0x38,0xf1,0x99,0x35,0xf2,0x97,0x35,0xba,0x74,0x29,0x13,0xb,0x4,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x26,0x14,0x6,0xe4,0x8e,0x4d,0xf2,0x9d,0x4e,0xf1,0x93,0x32,0xf2,0x9d,0x3f,0xf3,0xa4,0x54,0xf2,0x9d,0x50,0xf1,0x9b,0x4d,0xf2,0x98,0x46,0xef,0x8d,0x31,0xf0,0x8f,0x31,0xf0,0x91,0x32,0xf0,0x93,0x32,0xf1,0x94,0x32,0xf1,0x95,0x32,0xf1,0x98,0x34,0xf1,0x9b,0x36,0xf2,0x9e,0x38,0xf2,0xa1,0x39,0xf2,0xa4,0x3a,0xf3,0xa6,0x3b,0xf4,0xa8,0x3c,0xf3,0xa7,0x3c,0xf3,0xa4,0x3a,0xf2,0x9c,0x37,0xf2,0x99,0x36,0xa9,0x69,0x25,0x2,0x1,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x26,0x14,0x6,0xe4,0x90,0x50,0xf2,0x9e,0x51,0xf1,0x95,0x35,0xf4,0xa6,0x54,0xf3,0xa2,0x55,0xf2,0x9e,0x51,0xf2,0x9c,0x4e,0xf0,0x8f,0x35,0xf0,0x8e,0x31,0xf0,0x90,0x32,0xf3,0xa5,0x56,0xf7,0xc4,0x8e,0xfa,0xd8,0xb6,0xfb,0xdf,0xc2,0xfa,0xd8,0xb2,0xf7,0xc4,0x89,0xf4,0xae,0x59,0xf2,0xa1,0x38,0xf3,0xa5,0x3b,0xf4,0xa8,0x3c,0xf4,0xab,0x3d,0xf4,0xac,0x3e,0xf4,0xab,0x3d,0xf3,0xa7,0x3b,0xf2,0x9e,0x38,0xf4,0x9e,0x38,0x6f,0x45,0x17,0x1,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x19,0xc,0x5,0x63,0x36,0x18,0x3f,0x20,0x9,0x2,0x1,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x26,0x14,0x6,0xe4,0x91,0x52,0xf3,0xa2,0x55,0xf2,0x9d,0x43,0xf4,0xa7,0x5b,0xf3,0xa2,0x57,0xf3,0xa0,0x55,0xf1,0x97,0x43,0xf0,0x8d,0x30,0xf2,0x9d,0x4c,0xfa,0xda,0xbc,0xfe,0xfb,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfb,0xf6,0xfa,0xdc,0xb5,0xf4,0xae,0x4e,0xf4,0xa9,0x3c,0xf4,0xac,0x3d,0xf4,0xae,0x3f,0xf4,0xaf,0x3f,0xf4,0xad,0x3f,0xf3,0xa8,0x3d,0xf2,0x9d,0x38,0xe2,0x94,0x34,0x23,0x14,0x6,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x11,0x8,0x3,0x9e,0x62,0x39,0xf2,0x91,0x4e,0xe7,0x79,0x29,0x48,0x25,0xc,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0x27,0x13,0x6,0xe5,0x93,0x54,0xf3,0xa7,0x59,0xf4,0xa6,0x56,0xf4,0xa7,0x5d,0xf3,0xa4,0x59,0xf3,0xa2,0x57,0xf1,0x90,0x36,0xf4,0xa7,0x5d,0xfe,0xf4,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xf2,0xe3,0xf6,0xb8,0x5f,0xf4,0xac,0x3e,0xf4,0xaf,0x3f,0xf4,0xb1,0x40,0xf4,0xb2,0x40,0xf5,0xaf,0x3f,0xf3,0xa6,0x3c,0xf3,0x9f,0x38,0x90,0x5d,0x21,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x3d,0x1f,0xf,0xed,0x9c,0x6a,0xef,0x8b,0x4a,0xec,0x78,0x29,0xe4,0x79,0x2a,0x29,0x15,0x7,0x0,0x0,0x0,0xff,0x0,0xff,0x28,0x14,0x6,0xe6,0x97,0x57,0xf5,0xad,0x63,0xf5,0xac,0x62,0xf4,0xa8,0x5f,0xf4,0xa6,0x5c,0xf3,0xa0,0x53,0xf4,0xa9,0x64,0xfe,0xf8,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xf2,0xf7,0xfa,0xed,0xf4,0xf8,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf7,0xed,0xf5,0xb5,0x53,0xf5,0xb0,0x3f,0xf5,0xb3,0x41,0xf5,0xb4,0x42,0xf5,0xb3,0x41,0xf4,0xad,0x3f,0xf3,0xa1,0x39,0xe4,0x98,0x37,0x1d,0x11,0x5,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x43,0x23,0x10,0xf2,0xa1,0x70,0xf1,0x99,0x61,0xec,0x78,0x2a,0xed,0x7b,0x2a,0xc4,0x69,0x23,0x15,0xa,0x3,0x0,0x0,0x0,0x1d,0xf,0x5,0xe7,0x9b,0x5b,0xf5,0xb1,0x68,0xf5,0xad,0x65,0xf4,0xaa,0x62,0xf4,0xa8,0x5f,0xf3,0xa4,0x59,0xfd,0xec,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfd,0xfe,0xc3,0xda,0xe9,0x5c,0x9a,0xc5,0x2a,0x7b,0xb4,0x17,0x6f,0xae,0x36,0x81,0xb8,0x91,0xbb,0xd9,0xf0,0xf6,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xe7,0xc7,0xf5,0xb2,0x43,0xf6,0xb3,0x41,0xf5,0xb5,0x43,0xf5,0xb6,0x43,0xf5,0xb3,0x42,0xf4,0xa8,0x3c,0xf4,0xa2,0x3a,0x66,0x41,0x17,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x22,0x10,0x7,0xd6,0x88,0x5b,0xf2,0xa5,0x76,0xee,0x84,0x3f,0xed,0x7a,0x2a,0xee,0x80,0x2c,0xa5,0x59,0x1e,0x7,0x3,0x1,0x19,0xd,0x4,0xe7,0x9e,0x5e,0xf6,0xb2,0x6b,0xf5,0xae,0x67,0xf5,0xac,0x65,0xf4,0xa9,0x61,0xf8,0xcc,0xa1,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xfe,0xfe,0x97,0xbf,0xdb,0x33,0x83,0xbb,0x24,0x7e,0xb9,0x3,0x6a,0xae,0x0,0x66,0xab,0x0,0x64,0xa9,0x1,0x63,0xa9,0x3c,0x87,0xbd,0xee,0xf5,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xf8,0xc7,0x76,0xf6,0xb4,0x41,0xf5,0xb7,0x43,0xf6,0xb8,0x44,0xf6,0xb6,0x43,0xf5,0xae,0x3f,0xf3,0xa2,0x3a,0xac,0x71,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x52,0x2c,0x16,0xf0,0xa1,0x71,0xf2,0xa2,0x6f,0xed,0x7e,0x32,0xed,0x7e,0x2b,0xef,0x82,0x2d,0x8a,0x49,0x18,0x1b,0xe,0x4,0xe7,0xa2,0x61,0xf6,0xb3,0x6e,0xf6,0xb0,0x6a,0xf5,0xae,0x67,0xf5,0xab,0x64,0xfe,0xf4,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xb4,0xd1,0xe5,0x3e,0x8d,0xc3,0x37,0x8e,0xc5,0x16,0x7a,0xb9,0x0,0x6b,0xaf,0x0,0x68,0xac,0x0,0x65,0xaa,0x0,0x65,0xab,0x0,0x66,0xac,0x4d,0x93,0xc4,0xf8,0xfb,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xe7,0xc5,0xf6,0xb3,0x40,0xf6,0xb7,0x43,0xf6,0xb9,0x44,0xf6,0xb8,0x45,0xf5,0xb2,0x41,0xf3,0xa5,0x3b,0xe2,0x98,0x37,0x3,0x1,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x86,0x4e,0x2e,0xf3,0xa6,0x77,0xf1,0x9e,0x66,0xed,0x7e,0x2d,0xee,0x82,0x2c,0xf0,0x85,0x2d,0x7e,0x47,0x17,0xe8,0xa6,0x64,0xf6,0xb5,0x70,0xf6,0xb2,0x6d,0xf5,0xb0,0x6a,0xf7,0xbb,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xfb,0xfd,0x5b,0x9c,0xca,0x42,0x96,0xcb,0x3c,0x93,0xc9,0x9,0x73,0xb6,0x0,0x6b,0xb0,0x0,0x69,0xad,0x0,0x66,0xab,0x0,0x66,0xab,0x0,0x67,0xad,0x4,0x6a,0xaf,0xbb,0xd7,0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf8,0xee,0xf6,0xb9,0x4f,0xf6,0xb7,0x44,0xf6,0xba,0x45,0xf6,0xba,0x45,0xf5,0xb5,0x43,0xf4,0xa8,0x3d,0xf5,0xa7,0x3d,0x1b,0xf,0x4,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x11,0x8,0x3,0xb0,0x6d,0x45,0xf4,0xaa,0x7b,0xf1,0x9a,0x5b,0xee,0x82,0x2d,0xef,0x86,0x2e,0xee,0x91,0x36,0xf5,0xb5,0x70,0xf6,0xb7,0x73,0xf6,0xb4,0x70,0xf5,0xb1,0x6c,0xf9,0xcc,0xa1,0xff,0xff,0xff,0xff,0xff,0xff,0xd1,0xe2,0xef,0x4b,0x97,0xca,0x47,0x9a,0xce,0x3f,0x95,0xcb,0x3,0x71,0xb5,0x0,0x6c,0xb0,0x0,0x69,0xae,0x0,0x67,0xac,0x0,0x66,0xac,0x0,0x67,0xad,0x0,0x69,0xaf,0x66,0xa5,0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfa,0xf8,0xc3,0x67,0xf6,0xb8,0x44,0xf6,0xba,0x45,0xf6,0xbb,0x46,0xf6,0xb7,0x44,0xf4,0xab,0x3e,0xf8,0xab,0x3f,0x2a,0x19,0x8,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x2b,0x15,0x9,0xd4,0x8a,0x5c,0xf4,0xac,0x7c,0xf1,0x98,0x54,0xee,0x85,0x2e,0xf1,0x93,0x38,0xf6,0xba,0x75,0xf6,0xb9,0x75,0xf6,0xb6,0x72,0xf6,0xb3,0x6f,0xfa,0xd5,0xb1,0xff,0xff,0xff,0xff,0xff,0xff,0xb0,0xcf,0xe5,0x51,0x9e,0xcf,0x4b,0x9d,0xd0,0x43,0x97,0xcc,0x3,0x71,0xb5,0x0,0x6d,0xb1,0x0,0x6a,0xae,0x0,0x67,0xac,0x0,0x67,0xad,0x0,0x68,0xae,0x0,0x6a,0xb0,0x3b,0x8c,0xc2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf9,0xc9,0x77,0xf6,0xb8,0x44,0xf6,0xba,0x45,0xf6,0xbc,0x46,0xf6,0xb8,0x44,0xf4,0xad,0x3f,0xf8,0xac,0x3f,0x2a,0x1a,0x8,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x47,0x26,0x12,0xee,0xa3,0x72,0xf4,0xae,0x7b,0xf1,0x97,0x4e,0xf1,0x92,0x38,0xf6,0xbb,0x78,0xf6,0xbb,0x78,0xf6,0xb7,0x75,0xf6,0xb5,0x71,0xfa,0xd6,0xb2,0xff,0xff,0xff,0xff,0xff,0xff,0xad,0xcd,0xe4,0x54,0xa0,0xd1,0x4e,0xa0,0xd1,0x48,0x9b,0xce,0xb,0x76,0xb8,0x0,0x6d,0xb2,0x0,0x6a,0xaf,0x0,0x68,0xad,0x0,0x68,0xad,0x0,0x69,0xae,0x0,0x6b,0xb1,0x36,0x89,0xc1,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xf9,0xc9,0x76,0xf6,0xb9,0x44,0xf6,0xbb,0x46,0xf6,0xbc,0x47,0xf6,0xb9,0x44,0xf4,0xad,0x3f,0xf8,0xad,0x40,0x2a,0x1a,0x8,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x70,0x42,0x26,0xf4,0xad,0x7b,0xf5,0xb1,0x7d,0xf3,0x9f,0x50,0xf7,0xbc,0x7b,0xf7,0xbc,0x7b,0xf6,0xb9,0x78,0xf6,0xb7,0x74,0xf9,0xd0,0xa6,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xda,0xeb,0x56,0xa0,0xd0,0x51,0xa1,0xd2,0x4a,0x9c,0xcf,0x20,0x82,0xbf,0x0,0x6e,0xb2,0x0,0x6b,0xb0,0x0,0x68,0xae,0x0,0x68,0xae,0x0,0x69,0xaf,0x0,0x6b,0xb1,0x50,0x98,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xf9,0xf8,0xc3,0x66,0xf6,0xb9,0x45,0xf7,0xbb,0x46,0xf6,0xbc,0x47,0xf6,0xb8,0x45,0xf4,0xad,0x3f,0xf8,0xac,0x3f,0x2a,0x19,0x7,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xc,0x5,0x0,0xa5,0x67,0x40,0xf5,0xb1,0x7f,0xf5,0xb7,0x7e,0xf7,0xbf,0x80,0xf7,0xbe,0x7d,0xf7,0xbb,0x7b,0xf6,0xb9,0x78,0xf8,0xc2,0x8b,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xf5,0xf9,0x5b,0xa0,0xce,0x53,0xa2,0xd2,0x4c,0x9e,0xd0,0x3c,0x93,0xc8,0x6,0x71,0xb4,0x0,0x6c,0xb0,0x0,0x69,0xae,0x0,0x69,0xae,0x0,0x6a,0xaf,0x0,0x6b,0xb1,0x9b,0xc5,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf7,0xec,0xf6,0xba,0x4e,0xf6,0xb9,0x45,0xf7,0xbb,0x46,0xf6,0xbc,0x47,0xf5,0xb7,0x44,0xf4,0xab,0x3e,0xf5,0xa8,0x3e,0x18,0xd,0x4,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x1f,0x10,0x7,0xc9,0x84,0x56,0xf5,0xb5,0x81,0xf7,0xbf,0x82,0xf8,0xc0,0x80,0xf7,0xbd,0x7d,0xf7,0xba,0x7a,0xf6,0xb8,0x77,0xfe,0xf5,0xec,0xff,0xff,0xff,0xff,0xff,0xff,0x9a,0xc2,0xdf,0x55,0x9f,0xd0,0x4e,0x9f,0xd0,0x47,0x99,0xcc,0x2a,0x87,0xc1,0x3,0x6d,0xb1,0x0,0x69,0xaf,0x0,0x6a,0xaf,0x0,0x6a,0xb0,0x27,0x80,0xbc,0xec,0xf4,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xe5,0xbf,0xf6,0xb6,0x42,0xf6,0xba,0x46,0xf7,0xbb,0x46,0xf7,0xbb,0x47,0xf5,0xb5,0x43,0xf3,0xa8,0x3d,0xdd,0x97,0x37,0x2,0x1,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x32,0x1a,0xb,0xe4,0x9d,0x6a,0xf7,0xbd,0x84,0xf8,0xc1,0x83,0xf8,0xbe,0x80,0xf7,0xbd,0x7d,0xf7,0xba,0x79,0xfa,0xd9,0xb6,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xf6,0xfa,0x74,0xac,0xd4,0x4f,0x9b,0xcd,0x48,0x99,0xcc,0x41,0x94,0xc8,0x2c,0x85,0xbe,0xb,0x70,0xb3,0x1,0x6a,0xb0,0xb,0x6e,0xb2,0xbf,0xd9,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xf8,0xc8,0x74,0xf6,0xb7,0x44,0xf6,0xba,0x46,0xf7,0xbb,0x46,0xf7,0xb9,0x46,0xf6,0xb2,0x42,0xf4,0xa7,0x3d,0xa6,0x70,0x29,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x4f,0x2e,0x18,0xef,0xaf,0x78,0xf8,0xc1,0x85,0xf8,0xc0,0x82,0xf7,0xbe,0x7f,0xf7,0xbc,0x7d,0xf7,0xbe,0x81,0xfe,0xf3,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0xf2,0xf7,0xfa,0x91,0xbd,0xdb,0x4f,0x97,0xc8,0x40,0x8e,0xc3,0x37,0x8a,0xc0,0x34,0x88,0xbf,0x57,0x9c,0xca,0xcc,0xe1,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xe4,0xbf,0xf5,0xb6,0x45,0xf6,0xb8,0x45,0xf6,0xba,0x46,0xf7,0xba,0x46,0xf6,0xb7,0x45,0xf5,0xad,0x3f,0xf4,0xa9,0x40,0x5c,0x3d,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x85,0x55,0x31,0xf7,0xbd,0x84,0xf8,0xc2,0x85,0xf8,0xc0,0x82,0xf7,0xbe,0x80,0xf7,0xbc,0x7d,0xf9,0xcb,0x99,0xfe,0xf9,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xfe,0xe5,0xef,0xf6,0xc1,0xda,0xeb,0xba,0xd5,0xe9,0xd8,0xe8,0xf2,0xf9,0xfb,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf3,0xe4,0xf6,0xb9,0x51,0xf5,0xb5,0x43,0xf6,0xb8,0x45,0xf6,0xb9,0x46,0xf6,0xb8,0x46,0xf6,0xb3,0x43,0xf4,0xa7,0x3e,0xdf,0x9d,0x43,0x17,0xd,0x4,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x14,0xa,0x4,0xb2,0x7b,0x4b,0xf8,0xc2,0x88,0xf8,0xc1,0x85,0xf7,0xbf,0x82,0xf7,0xbe,0x80,0xf7,0xbd,0x7d,0xf9,0xca,0x97,0xfe,0xf9,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xf2,0xe1,0xf7,0xbc,0x5d,0xf5,0xb3,0x42,0xf5,0xb6,0x44,0xf5,0xb7,0x45,0xf6,0xb8,0x45,0xf6,0xb5,0x44,0xf5,0xad,0x40,0xf6,0xae,0x4c,0x88,0x5d,0x27,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x1d,0x10,0x6,0xdb,0xa0,0x68,0xf8,0xc3,0x88,0xf7,0xc1,0x85,0xf7,0xc0,0x82,0xf7,0xbf,0x80,0xf7,0xbe,0x7e,0xf8,0xc4,0x88,0xfc,0xe6,0xcc,0xfe,0xfb,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfa,0xf3,0xfa,0xda,0xa9,0xf5,0xb3,0x4a,0xf5,0xb2,0x42,0xf5,0xb3,0x43,0xf5,0xb6,0x44,0xf5,0xb7,0x45,0xf5,0xb5,0x44,0xf5,0xb0,0x42,0xf5,0xad,0x4d,0xdd,0x9e,0x4a,0x19,0xf,0x5,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x50,0x33,0x19,0xec,0xb4,0x7a,0xf8,0xc2,0x87,0xf7,0xc1,0x85,0xf7,0xc1,0x83,0xf7,0xc0,0x80,0xf7,0xc0,0x7f,0xf7,0xc0,0x7c,0xf7,0xc2,0x7e,0xf8,0xcc,0x92,0xfa,0xda,0xb0,0xfb,0xdf,0xb9,0xfa,0xd9,0xad,0xf7,0xc8,0x84,0xf5,0xb4,0x54,0xf4,0xad,0x3f,0xf4,0xaf,0x41,0xf5,0xb2,0x42,0xf5,0xb4,0x43,0xf5,0xb5,0x44,0xf5,0xb4,0x44,0xf5,0xb2,0x46,0xf5,0xb2,0x54,0xf5,0xb4,0x5a,0x5e,0x3e,0x1a,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x71,0x4b,0x29,0xf8,0xc0,0x86,0xf7,0xc3,0x87,0xf7,0xc2,0x85,0xf7,0xc1,0x83,0xf7,0xc2,0x82,0xf7,0xc2,0x7f,0xf7,0xc2,0x7e,0xf6,0xc0,0x76,0xf4,0xb4,0x59,0xf3,0xa8,0x3e,0xf3,0xa7,0x39,0xf3,0xa9,0x3d,0xf4,0xab,0x3e,0xf4,0xad,0x40,0xf4,0xb0,0x41,0xf4,0xb2,0x42,0xf5,0xb2,0x42,0xf5,0xb3,0x45,0xf6,0xb7,0x54,0xf6,0xb7,0x60,0xf6,0xb5,0x5f,0x9d,0x6b,0x31,0x2,0x1,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x8b,0x5f,0x36,0xf9,0xc1,0x87,0xf7,0xc3,0x88,0xf8,0xc3,0x86,0xf7,0xc3,0x84,0xf8,0xc3,0x81,0xf7,0xc4,0x80,0xf7,0xc4,0x7e,0xf7,0xc4,0x7d,0xf7,0xc3,0x7a,0xf6,0xbd,0x6c,0xf5,0xb7,0x5c,0xf5,0xb5,0x54,0xf5,0xb4,0x50,0xf5,0xb6,0x52,0xf6,0xb9,0x58,0xf6,0xbd,0x62,0xf7,0xbf,0x6a,0xf6,0xba,0x66,0xf6,0xb6,0x63,0xab,0x78,0x39,0xa,0x6,0x2,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x83,0x58,0x32,0xf0,0xb9,0x7f,0xf7,0xc3,0x88,0xf7,0xc3,0x86,0xf8,0xc4,0x84,0xf7,0xc5,0x82,0xf7,0xc5,0x80,0xf7,0xc5,0x7f,0xf8,0xc5,0x7d,0xf7,0xc4,0x7b,0xf7,0xc4,0x79,0xf7,0xc4,0x78,0xf7,0xc3,0x76,0xf7,0xc3,0x74,0xf7,0xc2,0x71,0xf6,0xbe,0x6d,0xf6,0xba,0x6a,0xf4,0xb6,0x65,0x8a,0x5e,0x2c,0xc,0x7,0x3,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x4f,0x33,0x1a,0xd2,0x99,0x60,0xf8,0xc4,0x89,0xf8,0xc3,0x86,0xf8,0xc4,0x84,0xf7,0xc5,0x82,0xf7,0xc5,0x80,0xf7,0xc5,0x7f,0xf7,0xc4,0x7e,0xf7,0xc4,0x7b,0xf7,0xc3,0x79,0xf7,0xc2,0x77,0xf6,0xc0,0x74,0xf6,0xbd,0x71,0xf6,0xbb,0x6e,0xe1,0xa4,0x59,0x5c,0x3d,0x1b,0x1,0x1,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xe,0x6,0x0,0x72,0x4b,0x28,0xd0,0x9a,0x62,0xf7,0xbf,0x80,0xf8,0xc4,0x85,0xf7,0xc3,0x82,0xf7,0xc3,0x80,0xf7,0xc3,0x7e,0xf7,0xc1,0x7c,0xf6,0xc0,0x7a,0xf7,0xbf,0x78,0xf8,0xbc,0x72,0xde,0xa2,0x5d,0x80,0x57,0x2b,0x13,0xb,0x4,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x19,0xe,0x5,0x44,0x2c,0x15,0x81,0x59,0x32,0xb2,0x80,0x4c,0xcb,0x95,0x5b,0xd2,0x9c,0x5f,0xcd,0x97,0x5a,0xb9,0x86,0x4d,0x8b,0x61,0x34,0x4a,0x30,0x17,0x15,0xc,0x5,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, -0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0x0,0x0,0x0,0x1,0x0,0x0,0x3,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff,0xff,0x0,0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x4f, 0x2a, 0xd, 0xa7, 0x5b, 0x1f, 0xb8, 0x66, 0x22, 0x6c, 0x3b, 0x14, 0x5, 0x3, 0x1, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x6f, 0x3a, 0x13, 0xea, 0x7f, 0x2c, 0xee, 0x7e, 0x2b, 0xee, 0x7e, 0x2b, 0xef, 0x85, 0x2e, 0x5f, 0x35, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x43, 0x22, 0xb, 0xed, 0x7f, 0x2c, 0xed, 0x7c, 0x2b, 0xee, 0x7f, 0x2c, 0xee, 0x80, 0x2c, 0xee, 0x80, 0x2c, 0xa8, 0x5f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x2e, 0x16, 0x6, 0xd0, 0x6f, 0x26, 0xed, 0x7b, 0x2a, 0xed, 0x7d, 0x2b, 0xee, 0x7f, 0x2c, 0xee, 0x80, 0x2c, 0xee, 0x82, 0x2d, 0x9a, 0x57, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x17, 0xb, 0x4, 0xb9, 0x60, 0x21, 0xed, 0x7a, 0x2a, 0xed, 0x7b, 0x2a, 0xed, 0x7e, 0x2b, 0xee, 0x7f, 0x2c, 0xee, 0x7f, 0x2c, 0xee, 0x86, 0x2e, 0x4e, 0x2b, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1, 0x0, 0x0, 0x96, 0x4d, 0x19, 0xee, 0x7a, 0x2a, 0xed, 0x79, 0x2a, 0xed, 0x7c, 0x2b, 0xed, 0x7e, 0x2b, 0xed, 0x7e, 0x2b, 0xef, 0x83, 0x2d, 0x98, 0x55, 0x1c, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x20, 0xf, 0x5, 0x4b, 0x27, 0xe, 0x21, 0x11, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x67, 0x34, 0x11, 0xed, 0x7b, 0x2a, 0xec, 0x79, 0x29, 0xed, 0x7b, 0x2a, 0xed, 0x7c, 0x2b, 0xed, 0x7d, 0x2b, 0xee, 0x7f, 0x2c, 0xbb, 0x69, 0x24, 0x11, 0x9, 0x3, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x38, 0x1c, 0x9, 0xc9, 0x6d, 0x2c, 0xf1, 0x86, 0x36, 0xd7, 0x79, 0x2a, 0x22, 0x12, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x3b, 0x1d, 0x9, 0xe0, 0x74, 0x27, 0xed, 0x7a, 0x2a, 0xed, 0x7c, 0x2a, 0xed, 0x7d, 0x2b, 0xed, 0x7d, 0x2b, 0xed, 0x7d, 0x2b, 0xdc, 0x7a, 0x2a, 0x1e, 0xf, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xa6, 0x56, 0x23, 0xee, 0x83, 0x3b, 0xed, 0x7d, 0x2c, 0xf0, 0x85, 0x2e, 0x75, 0x43, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x25, 0x12, 0x5, 0xc9, 0x68, 0x24, 0xed, 0x7b, 0x2a, 0xed, 0x7d, 0x2b, 0xed, 0x7e, 0x2b, 0xee, 0x7e, 0x2c, 0xed, 0x7d, 0x2b, 0xe3, 0x7d, 0x2b, 0x3b, 0x1f, 0xa, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1c, 0xd, 0x4, 0xd9, 0x74, 0x35, 0xee, 0x83, 0x3a, 0xee, 0x7f, 0x2b, 0xf0, 0x86, 0x2e, 0x83, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xa, 0x5, 0x1, 0xa1, 0x54, 0x1c, 0xee, 0x7e, 0x2c, 0xed, 0x7e, 0x2c, 0xed, 0x7f, 0x2c, 0xed, 0x80, 0x2c, 0xed, 0x7f, 0x2b, 0xec, 0x81, 0x2d, 0x60, 0x33, 0x11, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe0, 0x7a, 0x38, 0xee, 0x84, 0x3a, 0xee, 0x82, 0x2c, 0xf0, 0x88, 0x2f, 0x82, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x6f, 0x39, 0x13, 0xef, 0x82, 0x30, 0xed, 0x82, 0x2f, 0xee, 0x82, 0x2e, 0xee, 0x82, 0x2d, 0xee, 0x81, 0x2c, 0xf0, 0x83, 0x2d, 0x88, 0x49, 0x18, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe0, 0x7c, 0x3a, 0xee, 0x86, 0x3b, 0xee, 0x84, 0x2d, 0xf1, 0x8b, 0x30, 0x82, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x54, 0x2b, 0xf, 0xe9, 0x80, 0x30, 0xee, 0x87, 0x33, 0xef, 0x88, 0x32, 0xef, 0x88, 0x30, 0xee, 0x85, 0x2f, 0xef, 0x83, 0x2e, 0xae, 0x5f, 0x20, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe0, 0x7e, 0x3d, 0xef, 0x8a, 0x3d, 0xef, 0x88, 0x2e, 0xf1, 0x8d, 0x31, 0x81, 0x4d, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x29, 0x15, 0x7, 0xd2, 0x74, 0x2d, 0xf0, 0x8b, 0x36, 0xf0, 0x8d, 0x35, 0xef, 0x8d, 0x35, 0xef, 0x8b, 0x33, 0xef, 0x88, 0x30, 0xc4, 0x6d, 0x26, 0x18, 0xc, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x11, 0x5, 0xe1, 0x80, 0x3f, 0xf0, 0x8d, 0x3f, 0xef, 0x8a, 0x2f, 0xf1, 0x8f, 0x32, 0x81, 0x4e, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x3, 0x0, 0xb1, 0x61, 0x26, 0xf1, 0x8e, 0x3a, 0xf1, 0x90, 0x3a, 0xf0, 0x90, 0x38, 0xf0, 0x90, 0x36, 0xef, 0x8e, 0x35, 0xd3, 0x7a, 0x2c, 0x22, 0x11, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x24, 0x12, 0x5, 0xe1, 0x83, 0x42, 0xf0, 0x90, 0x42, 0xf0, 0x8d, 0x30, 0xf2, 0x92, 0x33, 0x80, 0x4e, 0x1b, 0x0, 0x0, 0x0, 0x3, 0x2, 0x0, 0x81, 0x45, 0x1b, 0xf1, 0x90, 0x3e, 0xf1, 0x94, 0x3d, 0xf1, 0x95, 0x3c, 0xf0, 0x94, 0x3b, 0xf0, 0x92, 0x39, 0xf0, 0x90, 0x35, 0xd0, 0x7b, 0x2b, 0xc2, 0x6e, 0x26, 0xbe, 0x6c, 0x25, 0x94, 0x54, 0x1c, 0x5b, 0x33, 0x11, 0x1a, 0xe, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x25, 0x14, 0x6, 0xe2, 0x86, 0x44, 0xf1, 0x94, 0x45, 0xf0, 0x90, 0x31, 0xf2, 0x94, 0x33, 0x80, 0x4e, 0x1b, 0x0, 0x0, 0x0, 0x60, 0x34, 0x14, 0xed, 0x8c, 0x3e, 0xf0, 0x96, 0x42, 0xf1, 0x97, 0x40, 0xf1, 0x95, 0x3f, 0xf0, 0x91, 0x39, 0xef, 0x8e, 0x33, 0xef, 0x8d, 0x31, 0xf0, 0x8d, 0x31, 0xef, 0x8c, 0x30, 0xef, 0x8c, 0x30, 0xf0, 0x8d, 0x31, 0xf1, 0x8e, 0x31, 0xe1, 0x85, 0x2e, 0x92, 0x55, 0x1d, 0x25, 0x14, 0x7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe2, 0x89, 0x46, 0xf2, 0x97, 0x47, 0xf1, 0x92, 0x32, 0xf2, 0x96, 0x34, 0x80, 0x4e, 0x1a, 0x32, 0x1a, 0xa, 0xe3, 0x87, 0x3d, 0xf1, 0x97, 0x45, 0xf1, 0x98, 0x44, 0xf1, 0x95, 0x41, 0xf0, 0x90, 0x39, 0xef, 0x8d, 0x30, 0xef, 0x8f, 0x31, 0xf0, 0x90, 0x32, 0xf0, 0x92, 0x33, 0xf1, 0x93, 0x33, 0xf1, 0x94, 0x34, 0xf1, 0x94, 0x34, 0xf0, 0x93, 0x34, 0xf0, 0x91, 0x32, 0xf1, 0x91, 0x33, 0xe2, 0x8a, 0x30, 0x6b, 0x3f, 0x15, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe3, 0x8b, 0x49, 0xf2, 0x9a, 0x49, 0xf1, 0x93, 0x32, 0xf2, 0x98, 0x35, 0x8f, 0x57, 0x1d, 0xcf, 0x7c, 0x38, 0xf2, 0x99, 0x48, 0xf1, 0x98, 0x47, 0xf1, 0x96, 0x44, 0xf0, 0x90, 0x39, 0xef, 0x8d, 0x31, 0xf0, 0x90, 0x31, 0xf0, 0x92, 0x33, 0xf1, 0x94, 0x33, 0xf1, 0x96, 0x35, 0xf1, 0x98, 0x35, 0xf1, 0x9a, 0x36, 0xf1, 0x9c, 0x37, 0xf2, 0x9d, 0x37, 0xf2, 0x9c, 0x37, 0xf2, 0x99, 0x36, 0xf0, 0x94, 0x34, 0xf3, 0x97, 0x35, 0x9f, 0x60, 0x21, 0x13, 0xb, 0x3, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe3, 0x8d, 0x4b, 0xf2, 0x9b, 0x4c, 0xf1, 0x93, 0x32, 0xf1, 0x97, 0x35, 0xea, 0x98, 0x43, 0xf2, 0x9d, 0x4d, 0xf1, 0x9a, 0x4b, 0xf1, 0x99, 0x49, 0xf0, 0x93, 0x3d, 0xf0, 0x8d, 0x30, 0xf0, 0x90, 0x32, 0xf0, 0x92, 0x32, 0xf0, 0x94, 0x34, 0xf1, 0x96, 0x34, 0xf1, 0x98, 0x36, 0xf1, 0x9a, 0x36, 0xf2, 0x9c, 0x38, 0xf2, 0x9f, 0x38, 0xf2, 0xa2, 0x39, 0xf3, 0xa2, 0x39, 0xf3, 0xa2, 0x39, 0xf2, 0x9f, 0x38, 0xf1, 0x99, 0x35, 0xf2, 0x97, 0x35, 0xba, 0x74, 0x29, 0x13, 0xb, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe4, 0x8e, 0x4d, 0xf2, 0x9d, 0x4e, 0xf1, 0x93, 0x32, 0xf2, 0x9d, 0x3f, 0xf3, 0xa4, 0x54, 0xf2, 0x9d, 0x50, 0xf1, 0x9b, 0x4d, 0xf2, 0x98, 0x46, 0xef, 0x8d, 0x31, 0xf0, 0x8f, 0x31, 0xf0, 0x91, 0x32, 0xf0, 0x93, 0x32, 0xf1, 0x94, 0x32, 0xf1, 0x95, 0x32, 0xf1, 0x98, 0x34, 0xf1, 0x9b, 0x36, 0xf2, 0x9e, 0x38, 0xf2, 0xa1, 0x39, 0xf2, 0xa4, 0x3a, 0xf3, 0xa6, 0x3b, 0xf4, 0xa8, 0x3c, 0xf3, 0xa7, 0x3c, 0xf3, 0xa4, 0x3a, 0xf2, 0x9c, 0x37, 0xf2, 0x99, 0x36, 0xa9, 0x69, 0x25, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe4, 0x90, 0x50, 0xf2, 0x9e, 0x51, 0xf1, 0x95, 0x35, 0xf4, 0xa6, 0x54, 0xf3, 0xa2, 0x55, 0xf2, 0x9e, 0x51, 0xf2, 0x9c, 0x4e, 0xf0, 0x8f, 0x35, 0xf0, 0x8e, 0x31, 0xf0, 0x90, 0x32, 0xf3, 0xa5, 0x56, 0xf7, 0xc4, 0x8e, 0xfa, 0xd8, 0xb6, 0xfb, 0xdf, 0xc2, 0xfa, 0xd8, 0xb2, 0xf7, 0xc4, 0x89, 0xf4, 0xae, 0x59, 0xf2, 0xa1, 0x38, 0xf3, 0xa5, 0x3b, 0xf4, 0xa8, 0x3c, 0xf4, 0xab, 0x3d, 0xf4, 0xac, 0x3e, 0xf4, 0xab, 0x3d, 0xf3, 0xa7, 0x3b, 0xf2, 0x9e, 0x38, 0xf4, 0x9e, 0x38, 0x6f, 0x45, 0x17, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x19, 0xc, 0x5, 0x63, 0x36, 0x18, 0x3f, 0x20, 0x9, 0x2, 0x1, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x26, 0x14, 0x6, 0xe4, 0x91, 0x52, 0xf3, 0xa2, 0x55, 0xf2, 0x9d, 0x43, 0xf4, 0xa7, 0x5b, 0xf3, 0xa2, 0x57, 0xf3, 0xa0, 0x55, 0xf1, 0x97, 0x43, 0xf0, 0x8d, 0x30, 0xf2, 0x9d, 0x4c, 0xfa, 0xda, 0xbc, 0xfe, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xf6, 0xfa, 0xdc, 0xb5, 0xf4, 0xae, 0x4e, 0xf4, 0xa9, 0x3c, 0xf4, 0xac, 0x3d, 0xf4, 0xae, 0x3f, 0xf4, 0xaf, 0x3f, 0xf4, 0xad, 0x3f, 0xf3, 0xa8, 0x3d, 0xf2, 0x9d, 0x38, 0xe2, 0x94, 0x34, 0x23, 0x14, 0x6, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x11, 0x8, 0x3, 0x9e, 0x62, 0x39, 0xf2, 0x91, 0x4e, 0xe7, 0x79, 0x29, 0x48, 0x25, 0xc, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x27, 0x13, 0x6, 0xe5, 0x93, 0x54, 0xf3, 0xa7, 0x59, 0xf4, 0xa6, 0x56, 0xf4, 0xa7, 0x5d, 0xf3, 0xa4, 0x59, 0xf3, 0xa2, 0x57, 0xf1, 0x90, 0x36, 0xf4, 0xa7, 0x5d, 0xfe, 0xf4, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf2, 0xe3, 0xf6, 0xb8, 0x5f, 0xf4, 0xac, 0x3e, 0xf4, 0xaf, 0x3f, 0xf4, 0xb1, 0x40, 0xf4, 0xb2, 0x40, 0xf5, 0xaf, 0x3f, 0xf3, 0xa6, 0x3c, 0xf3, 0x9f, 0x38, 0x90, 0x5d, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x3d, 0x1f, 0xf, 0xed, 0x9c, 0x6a, 0xef, 0x8b, 0x4a, 0xec, 0x78, 0x29, 0xe4, 0x79, 0x2a, 0x29, 0x15, 0x7, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x28, 0x14, 0x6, 0xe6, 0x97, 0x57, 0xf5, 0xad, 0x63, 0xf5, 0xac, 0x62, 0xf4, 0xa8, 0x5f, 0xf4, 0xa6, 0x5c, 0xf3, 0xa0, 0x53, 0xf4, 0xa9, 0x64, 0xfe, 0xf8, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xf2, 0xf7, 0xfa, 0xed, 0xf4, 0xf8, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xed, 0xf5, 0xb5, 0x53, 0xf5, 0xb0, 0x3f, 0xf5, 0xb3, 0x41, 0xf5, 0xb4, 0x42, 0xf5, 0xb3, 0x41, 0xf4, 0xad, 0x3f, 0xf3, 0xa1, 0x39, 0xe4, 0x98, 0x37, 0x1d, 0x11, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x43, 0x23, 0x10, 0xf2, 0xa1, 0x70, 0xf1, 0x99, 0x61, 0xec, 0x78, 0x2a, 0xed, 0x7b, 0x2a, 0xc4, 0x69, 0x23, 0x15, 0xa, 0x3, 0x0, 0x0, 0x0, 0x1d, 0xf, 0x5, 0xe7, 0x9b, 0x5b, 0xf5, 0xb1, 0x68, 0xf5, 0xad, 0x65, 0xf4, 0xaa, 0x62, 0xf4, 0xa8, 0x5f, 0xf3, 0xa4, 0x59, 0xfd, 0xec, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfd, 0xfe, 0xc3, 0xda, 0xe9, 0x5c, 0x9a, 0xc5, 0x2a, 0x7b, 0xb4, 0x17, 0x6f, 0xae, 0x36, 0x81, 0xb8, 0x91, 0xbb, 0xd9, 0xf0, 0xf6, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe7, 0xc7, 0xf5, 0xb2, 0x43, 0xf6, 0xb3, 0x41, 0xf5, 0xb5, 0x43, 0xf5, 0xb6, 0x43, 0xf5, 0xb3, 0x42, 0xf4, 0xa8, 0x3c, 0xf4, 0xa2, 0x3a, 0x66, 0x41, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x22, 0x10, 0x7, 0xd6, 0x88, 0x5b, 0xf2, 0xa5, 0x76, 0xee, 0x84, 0x3f, 0xed, 0x7a, 0x2a, 0xee, 0x80, 0x2c, 0xa5, 0x59, 0x1e, 0x7, 0x3, 0x1, 0x19, 0xd, 0x4, 0xe7, 0x9e, 0x5e, 0xf6, 0xb2, 0x6b, 0xf5, 0xae, 0x67, 0xf5, 0xac, 0x65, 0xf4, 0xa9, 0x61, 0xf8, 0xcc, 0xa1, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfe, 0x97, 0xbf, 0xdb, 0x33, 0x83, 0xbb, 0x24, 0x7e, 0xb9, 0x3, 0x6a, 0xae, 0x0, 0x66, 0xab, 0x0, 0x64, 0xa9, 0x1, 0x63, 0xa9, 0x3c, 0x87, 0xbd, 0xee, 0xf5, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xc7, 0x76, 0xf6, 0xb4, 0x41, 0xf5, 0xb7, 0x43, 0xf6, 0xb8, 0x44, 0xf6, 0xb6, 0x43, 0xf5, 0xae, 0x3f, 0xf3, 0xa2, 0x3a, 0xac, 0x71, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x52, 0x2c, 0x16, 0xf0, 0xa1, 0x71, 0xf2, 0xa2, 0x6f, 0xed, 0x7e, 0x32, 0xed, 0x7e, 0x2b, 0xef, 0x82, 0x2d, 0x8a, 0x49, 0x18, 0x1b, 0xe, 0x4, 0xe7, 0xa2, 0x61, 0xf6, 0xb3, 0x6e, 0xf6, 0xb0, 0x6a, 0xf5, 0xae, 0x67, 0xf5, 0xab, 0x64, 0xfe, 0xf4, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0xd1, 0xe5, 0x3e, 0x8d, 0xc3, 0x37, 0x8e, 0xc5, 0x16, 0x7a, 0xb9, 0x0, 0x6b, 0xaf, 0x0, 0x68, 0xac, 0x0, 0x65, 0xaa, 0x0, 0x65, 0xab, 0x0, 0x66, 0xac, 0x4d, 0x93, 0xc4, 0xf8, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe7, 0xc5, 0xf6, 0xb3, 0x40, 0xf6, 0xb7, 0x43, 0xf6, 0xb9, 0x44, 0xf6, 0xb8, 0x45, 0xf5, 0xb2, 0x41, 0xf3, 0xa5, 0x3b, 0xe2, 0x98, 0x37, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x86, 0x4e, 0x2e, 0xf3, 0xa6, 0x77, 0xf1, 0x9e, 0x66, 0xed, 0x7e, 0x2d, 0xee, 0x82, 0x2c, 0xf0, 0x85, 0x2d, 0x7e, 0x47, 0x17, 0xe8, 0xa6, 0x64, 0xf6, 0xb5, 0x70, 0xf6, 0xb2, 0x6d, 0xf5, 0xb0, 0x6a, 0xf7, 0xbb, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xfb, 0xfd, 0x5b, 0x9c, 0xca, 0x42, 0x96, 0xcb, 0x3c, 0x93, 0xc9, 0x9, 0x73, 0xb6, 0x0, 0x6b, 0xb0, 0x0, 0x69, 0xad, 0x0, 0x66, 0xab, 0x0, 0x66, 0xab, 0x0, 0x67, 0xad, 0x4, 0x6a, 0xaf, 0xbb, 0xd7, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf8, 0xee, 0xf6, 0xb9, 0x4f, 0xf6, 0xb7, 0x44, 0xf6, 0xba, 0x45, 0xf6, 0xba, 0x45, 0xf5, 0xb5, 0x43, 0xf4, 0xa8, 0x3d, 0xf5, 0xa7, 0x3d, 0x1b, 0xf, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x11, 0x8, 0x3, 0xb0, 0x6d, 0x45, 0xf4, 0xaa, 0x7b, 0xf1, 0x9a, 0x5b, 0xee, 0x82, 0x2d, 0xef, 0x86, 0x2e, 0xee, 0x91, 0x36, 0xf5, 0xb5, 0x70, 0xf6, 0xb7, 0x73, 0xf6, 0xb4, 0x70, 0xf5, 0xb1, 0x6c, 0xf9, 0xcc, 0xa1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xe2, 0xef, 0x4b, 0x97, 0xca, 0x47, 0x9a, 0xce, 0x3f, 0x95, 0xcb, 0x3, 0x71, 0xb5, 0x0, 0x6c, 0xb0, 0x0, 0x69, 0xae, 0x0, 0x67, 0xac, 0x0, 0x66, 0xac, 0x0, 0x67, 0xad, 0x0, 0x69, 0xaf, 0x66, 0xa5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfa, 0xf8, 0xc3, 0x67, 0xf6, 0xb8, 0x44, 0xf6, 0xba, 0x45, 0xf6, 0xbb, 0x46, 0xf6, 0xb7, 0x44, 0xf4, 0xab, 0x3e, 0xf8, 0xab, 0x3f, 0x2a, 0x19, 0x8, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x2b, 0x15, 0x9, 0xd4, 0x8a, 0x5c, 0xf4, 0xac, 0x7c, 0xf1, 0x98, 0x54, 0xee, 0x85, 0x2e, 0xf1, 0x93, 0x38, 0xf6, 0xba, 0x75, 0xf6, 0xb9, 0x75, 0xf6, 0xb6, 0x72, 0xf6, 0xb3, 0x6f, 0xfa, 0xd5, 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, 0xe5, 0x51, 0x9e, 0xcf, 0x4b, 0x9d, 0xd0, 0x43, 0x97, 0xcc, 0x3, 0x71, 0xb5, 0x0, 0x6d, 0xb1, 0x0, 0x6a, 0xae, 0x0, 0x67, 0xac, 0x0, 0x67, 0xad, 0x0, 0x68, 0xae, 0x0, 0x6a, 0xb0, 0x3b, 0x8c, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xc9, 0x77, 0xf6, 0xb8, 0x44, 0xf6, 0xba, 0x45, 0xf6, 0xbc, 0x46, 0xf6, 0xb8, 0x44, 0xf4, 0xad, 0x3f, 0xf8, 0xac, 0x3f, 0x2a, 0x1a, 0x8, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x47, 0x26, 0x12, 0xee, 0xa3, 0x72, 0xf4, 0xae, 0x7b, 0xf1, 0x97, 0x4e, 0xf1, 0x92, 0x38, 0xf6, 0xbb, 0x78, 0xf6, 0xbb, 0x78, 0xf6, 0xb7, 0x75, 0xf6, 0xb5, 0x71, 0xfa, 0xd6, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xcd, 0xe4, 0x54, 0xa0, 0xd1, 0x4e, 0xa0, 0xd1, 0x48, 0x9b, 0xce, 0xb, 0x76, 0xb8, 0x0, 0x6d, 0xb2, 0x0, 0x6a, 0xaf, 0x0, 0x68, 0xad, 0x0, 0x68, 0xad, 0x0, 0x69, 0xae, 0x0, 0x6b, 0xb1, 0x36, 0x89, 0xc1, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xc9, 0x76, 0xf6, 0xb9, 0x44, 0xf6, 0xbb, 0x46, 0xf6, 0xbc, 0x47, 0xf6, 0xb9, 0x44, 0xf4, 0xad, 0x3f, 0xf8, 0xad, 0x40, 0x2a, 0x1a, 0x8, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x70, 0x42, 0x26, 0xf4, 0xad, 0x7b, 0xf5, 0xb1, 0x7d, 0xf3, 0x9f, 0x50, 0xf7, 0xbc, 0x7b, 0xf7, 0xbc, 0x7b, 0xf6, 0xb9, 0x78, 0xf6, 0xb7, 0x74, 0xf9, 0xd0, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xda, 0xeb, 0x56, 0xa0, 0xd0, 0x51, 0xa1, 0xd2, 0x4a, 0x9c, 0xcf, 0x20, 0x82, 0xbf, 0x0, 0x6e, 0xb2, 0x0, 0x6b, 0xb0, 0x0, 0x68, 0xae, 0x0, 0x68, 0xae, 0x0, 0x69, 0xaf, 0x0, 0x6b, 0xb1, 0x50, 0x98, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf9, 0xf8, 0xc3, 0x66, 0xf6, 0xb9, 0x45, 0xf7, 0xbb, 0x46, 0xf6, 0xbc, 0x47, 0xf6, 0xb8, 0x45, 0xf4, 0xad, 0x3f, 0xf8, 0xac, 0x3f, 0x2a, 0x19, 0x7, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xc, 0x5, 0x0, 0xa5, 0x67, 0x40, 0xf5, 0xb1, 0x7f, 0xf5, 0xb7, 0x7e, 0xf7, 0xbf, 0x80, 0xf7, 0xbe, 0x7d, 0xf7, 0xbb, 0x7b, 0xf6, 0xb9, 0x78, 0xf8, 0xc2, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xf5, 0xf9, 0x5b, 0xa0, 0xce, 0x53, 0xa2, 0xd2, 0x4c, 0x9e, 0xd0, 0x3c, 0x93, 0xc8, 0x6, 0x71, 0xb4, 0x0, 0x6c, 0xb0, 0x0, 0x69, 0xae, 0x0, 0x69, 0xae, 0x0, 0x6a, 0xaf, 0x0, 0x6b, 0xb1, 0x9b, 0xc5, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xec, 0xf6, 0xba, 0x4e, 0xf6, 0xb9, 0x45, 0xf7, 0xbb, 0x46, 0xf6, 0xbc, 0x47, 0xf5, 0xb7, 0x44, 0xf4, 0xab, 0x3e, 0xf5, 0xa8, 0x3e, 0x18, 0xd, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1f, 0x10, 0x7, 0xc9, 0x84, 0x56, 0xf5, 0xb5, 0x81, 0xf7, 0xbf, 0x82, 0xf8, 0xc0, 0x80, 0xf7, 0xbd, 0x7d, 0xf7, 0xba, 0x7a, 0xf6, 0xb8, 0x77, 0xfe, 0xf5, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xc2, 0xdf, 0x55, 0x9f, 0xd0, 0x4e, 0x9f, 0xd0, 0x47, 0x99, 0xcc, 0x2a, 0x87, 0xc1, 0x3, 0x6d, 0xb1, 0x0, 0x69, 0xaf, 0x0, 0x6a, 0xaf, 0x0, 0x6a, 0xb0, 0x27, 0x80, 0xbc, 0xec, 0xf4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0xbf, 0xf6, 0xb6, 0x42, 0xf6, 0xba, 0x46, 0xf7, 0xbb, 0x46, 0xf7, 0xbb, 0x47, 0xf5, 0xb5, 0x43, 0xf3, 0xa8, 0x3d, 0xdd, 0x97, 0x37, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x32, 0x1a, 0xb, 0xe4, 0x9d, 0x6a, 0xf7, 0xbd, 0x84, 0xf8, 0xc1, 0x83, 0xf8, 0xbe, 0x80, 0xf7, 0xbd, 0x7d, 0xf7, 0xba, 0x79, 0xfa, 0xd9, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf6, 0xfa, 0x74, 0xac, 0xd4, 0x4f, 0x9b, 0xcd, 0x48, 0x99, 0xcc, 0x41, 0x94, 0xc8, 0x2c, 0x85, 0xbe, 0xb, 0x70, 0xb3, 0x1, 0x6a, 0xb0, 0xb, 0x6e, 0xb2, 0xbf, 0xd9, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xc8, 0x74, 0xf6, 0xb7, 0x44, 0xf6, 0xba, 0x46, 0xf7, 0xbb, 0x46, 0xf7, 0xb9, 0x46, 0xf6, 0xb2, 0x42, 0xf4, 0xa7, 0x3d, 0xa6, 0x70, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x4f, 0x2e, 0x18, 0xef, 0xaf, 0x78, 0xf8, 0xc1, 0x85, 0xf8, 0xc0, 0x82, 0xf7, 0xbe, 0x7f, 0xf7, 0xbc, 0x7d, 0xf7, 0xbe, 0x81, 0xfe, 0xf3, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf7, 0xfa, 0x91, 0xbd, 0xdb, 0x4f, 0x97, 0xc8, 0x40, 0x8e, 0xc3, 0x37, 0x8a, 0xc0, 0x34, 0x88, 0xbf, 0x57, 0x9c, 0xca, 0xcc, 0xe1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe4, 0xbf, 0xf5, 0xb6, 0x45, 0xf6, 0xb8, 0x45, 0xf6, 0xba, 0x46, 0xf7, 0xba, 0x46, 0xf6, 0xb7, 0x45, 0xf5, 0xad, 0x3f, 0xf4, 0xa9, 0x40, 0x5c, 0x3d, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x85, 0x55, 0x31, 0xf7, 0xbd, 0x84, 0xf8, 0xc2, 0x85, 0xf8, 0xc0, 0x82, 0xf7, 0xbe, 0x80, 0xf7, 0xbc, 0x7d, 0xf9, 0xcb, 0x99, 0xfe, 0xf9, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xfe, 0xe5, 0xef, 0xf6, 0xc1, 0xda, 0xeb, 0xba, 0xd5, 0xe9, 0xd8, 0xe8, 0xf2, 0xf9, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0xe4, 0xf6, 0xb9, 0x51, 0xf5, 0xb5, 0x43, 0xf6, 0xb8, 0x45, 0xf6, 0xb9, 0x46, 0xf6, 0xb8, 0x46, 0xf6, 0xb3, 0x43, 0xf4, 0xa7, 0x3e, 0xdf, 0x9d, 0x43, 0x17, 0xd, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x14, 0xa, 0x4, 0xb2, 0x7b, 0x4b, 0xf8, 0xc2, 0x88, 0xf8, 0xc1, 0x85, 0xf7, 0xbf, 0x82, 0xf7, 0xbe, 0x80, 0xf7, 0xbd, 0x7d, 0xf9, 0xca, 0x97, 0xfe, 0xf9, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf2, 0xe1, 0xf7, 0xbc, 0x5d, 0xf5, 0xb3, 0x42, 0xf5, 0xb6, 0x44, 0xf5, 0xb7, 0x45, 0xf6, 0xb8, 0x45, 0xf6, 0xb5, 0x44, 0xf5, 0xad, 0x40, 0xf6, 0xae, 0x4c, 0x88, 0x5d, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x1d, 0x10, 0x6, 0xdb, 0xa0, 0x68, 0xf8, 0xc3, 0x88, 0xf7, 0xc1, 0x85, 0xf7, 0xc0, 0x82, 0xf7, 0xbf, 0x80, 0xf7, 0xbe, 0x7e, 0xf8, 0xc4, 0x88, 0xfc, 0xe6, 0xcc, 0xfe, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfa, 0xf3, 0xfa, 0xda, 0xa9, 0xf5, 0xb3, 0x4a, 0xf5, 0xb2, 0x42, 0xf5, 0xb3, 0x43, 0xf5, 0xb6, 0x44, 0xf5, 0xb7, 0x45, 0xf5, 0xb5, 0x44, 0xf5, 0xb0, 0x42, 0xf5, 0xad, 0x4d, 0xdd, 0x9e, 0x4a, 0x19, 0xf, 0x5, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x50, 0x33, 0x19, 0xec, 0xb4, 0x7a, 0xf8, 0xc2, 0x87, 0xf7, 0xc1, 0x85, 0xf7, 0xc1, 0x83, 0xf7, 0xc0, 0x80, 0xf7, 0xc0, 0x7f, 0xf7, 0xc0, 0x7c, 0xf7, 0xc2, 0x7e, 0xf8, 0xcc, 0x92, 0xfa, 0xda, 0xb0, 0xfb, 0xdf, 0xb9, 0xfa, 0xd9, 0xad, 0xf7, 0xc8, 0x84, 0xf5, 0xb4, 0x54, 0xf4, 0xad, 0x3f, 0xf4, 0xaf, 0x41, 0xf5, 0xb2, 0x42, 0xf5, 0xb4, 0x43, 0xf5, 0xb5, 0x44, 0xf5, 0xb4, 0x44, 0xf5, 0xb2, 0x46, 0xf5, 0xb2, 0x54, 0xf5, 0xb4, 0x5a, 0x5e, 0x3e, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x71, 0x4b, 0x29, 0xf8, 0xc0, 0x86, 0xf7, 0xc3, 0x87, 0xf7, 0xc2, 0x85, 0xf7, 0xc1, 0x83, 0xf7, 0xc2, 0x82, 0xf7, 0xc2, 0x7f, 0xf7, 0xc2, 0x7e, 0xf6, 0xc0, 0x76, 0xf4, 0xb4, 0x59, 0xf3, 0xa8, 0x3e, 0xf3, 0xa7, 0x39, 0xf3, 0xa9, 0x3d, 0xf4, 0xab, 0x3e, 0xf4, 0xad, 0x40, 0xf4, 0xb0, 0x41, 0xf4, 0xb2, 0x42, 0xf5, 0xb2, 0x42, 0xf5, 0xb3, 0x45, 0xf6, 0xb7, 0x54, 0xf6, 0xb7, 0x60, 0xf6, 0xb5, 0x5f, 0x9d, 0x6b, 0x31, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x8b, 0x5f, 0x36, 0xf9, 0xc1, 0x87, 0xf7, 0xc3, 0x88, 0xf8, 0xc3, 0x86, 0xf7, 0xc3, 0x84, 0xf8, 0xc3, 0x81, 0xf7, 0xc4, 0x80, 0xf7, 0xc4, 0x7e, 0xf7, 0xc4, 0x7d, 0xf7, 0xc3, 0x7a, 0xf6, 0xbd, 0x6c, 0xf5, 0xb7, 0x5c, 0xf5, 0xb5, 0x54, 0xf5, 0xb4, 0x50, 0xf5, 0xb6, 0x52, 0xf6, 0xb9, 0x58, 0xf6, 0xbd, 0x62, 0xf7, 0xbf, 0x6a, 0xf6, 0xba, 0x66, 0xf6, 0xb6, 0x63, 0xab, 0x78, 0x39, 0xa, 0x6, 0x2, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x83, 0x58, 0x32, 0xf0, 0xb9, 0x7f, 0xf7, 0xc3, 0x88, 0xf7, 0xc3, 0x86, 0xf8, 0xc4, 0x84, 0xf7, 0xc5, 0x82, 0xf7, 0xc5, 0x80, 0xf7, 0xc5, 0x7f, 0xf8, 0xc5, 0x7d, 0xf7, 0xc4, 0x7b, 0xf7, 0xc4, 0x79, 0xf7, 0xc4, 0x78, 0xf7, 0xc3, 0x76, 0xf7, 0xc3, 0x74, 0xf7, 0xc2, 0x71, 0xf6, 0xbe, 0x6d, 0xf6, 0xba, 0x6a, 0xf4, 0xb6, 0x65, 0x8a, 0x5e, 0x2c, 0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x4f, 0x33, 0x1a, 0xd2, 0x99, 0x60, 0xf8, 0xc4, 0x89, 0xf8, 0xc3, 0x86, 0xf8, 0xc4, 0x84, 0xf7, 0xc5, 0x82, 0xf7, 0xc5, 0x80, 0xf7, 0xc5, 0x7f, 0xf7, 0xc4, 0x7e, 0xf7, 0xc4, 0x7b, 0xf7, 0xc3, 0x79, 0xf7, 0xc2, 0x77, 0xf6, 0xc0, 0x74, 0xf6, 0xbd, 0x71, 0xf6, 0xbb, 0x6e, 0xe1, 0xa4, 0x59, 0x5c, 0x3d, 0x1b, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xe, 0x6, 0x0, 0x72, 0x4b, 0x28, 0xd0, 0x9a, 0x62, 0xf7, 0xbf, 0x80, 0xf8, 0xc4, 0x85, 0xf7, 0xc3, 0x82, 0xf7, 0xc3, 0x80, 0xf7, 0xc3, 0x7e, 0xf7, 0xc1, 0x7c, 0xf6, 0xc0, 0x7a, 0xf7, 0xbf, 0x78, 0xf8, 0xbc, 0x72, 0xde, 0xa2, 0x5d, 0x80, 0x57, 0x2b, 0x13, 0xb, 0x4, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x19, 0xe, 0x5, 0x44, 0x2c, 0x15, 0x81, 0x59, 0x32, 0xb2, 0x80, 0x4c, 0xcb, 0x95, 0x5b, 0xd2, 0x9c, 0x5f, 0xcd, 0x97, 0x5a, 0xb9, 0x86, 0x4d, 0x8b, 0x61, 0x34, 0x4a, 0x30, 0x17, 0x15, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, }; @@ -154,25 +154,25 @@ GLXContext GHOST_WindowX11::s_firstContext = NULL; GHOST_WindowX11:: GHOST_WindowX11( - GHOST_SystemX11 *system, - Display * display, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - const GHOST_TEmbedderWindowID parentWindow, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples -) : - GHOST_Window(width,height,state,type,stereoVisual,numOfAASamples), + GHOST_SystemX11 *system, + Display *display, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + const GHOST_TEmbedderWindowID parentWindow, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples + ) : + GHOST_Window(width, height, state, type, stereoVisual, numOfAASamples), m_context(NULL), m_display(display), m_normal_state(GHOST_kWindowStateNormal), - m_system (system), - m_valid_setup (false), + m_system(system), + m_valid_setup(false), m_invalid_window(false), m_empty_cursor(None), m_custom_cursor(None) @@ -191,13 +191,13 @@ GHOST_WindowX11( memset(&m_xtablet, 0, sizeof(m_xtablet)); #endif - m_visual= NULL; + m_visual = NULL; if (!glXQueryVersion(m_display, &glxVersionMajor, &glxVersionMinor)) { printf("%s:%d: X11 glXQueryVersion() failed, verify working openGL system!\n", __FILE__, __LINE__); /* exit if this is the first window */ - if(s_firstContext==NULL) { + if (s_firstContext == NULL) { printf("initial window could not find the GLX extension, exit!\n"); exit(1); } @@ -209,7 +209,7 @@ GHOST_WindowX11( for (samples = m_numOfAASamples; samples >= 0; samples--) { i = 0; /* Reusing attributes array, so reset counter */ - if(m_stereoVisual) + if (m_stereoVisual) attributes[i++] = GLX_STEREO; attributes[i++] = GLX_RGBA; @@ -219,7 +219,7 @@ GHOST_WindowX11( attributes[i++] = GLX_GREEN_SIZE; attributes[i++] = 1; attributes[i++] = GLX_DEPTH_SIZE; attributes[i++] = 1; /* GLX >= 1.4 required for multi-sample */ - if(samples && (glxVersionMajor >= 1) && (glxVersionMinor >= 4)) { + if (samples && (glxVersionMajor >= 1) && (glxVersionMinor >= 4)) { attributes[i++] = GLX_SAMPLE_BUFFERS; attributes[i++] = 1; attributes[i++] = GLX_SAMPLES; attributes[i++] = samples; } @@ -234,14 +234,15 @@ GHOST_WindowX11( /* All options exhausted, cannot continue */ printf("%s:%d: X11 glXChooseVisual() failed, verify working openGL system!\n", __FILE__, __LINE__); - if(s_firstContext==NULL) { + if (s_firstContext == NULL) { printf("initial window could not find the GLX extension, exit!\n"); exit(1); } return; } - } else { + } + else { if (m_numOfAASamples && (m_numOfAASamples > samples)) { printf("%s:%d: oversampling requested %i but using %i samples\n", __FILE__, __LINE__, m_numOfAASamples, samples); @@ -259,51 +260,49 @@ GHOST_WindowX11( XSetWindowAttributes xattributes; memset(&xattributes, 0, sizeof(xattributes)); - xattributes.colormap= XCreateColormap( - m_display, - RootWindow(m_display, m_visual->screen), - m_visual->visual, - AllocNone - ); + xattributes.colormap = XCreateColormap(m_display, + RootWindow(m_display, m_visual->screen), + m_visual->visual, + AllocNone + ); - xattributes.border_pixel= 0; + xattributes.border_pixel = 0; // Specify which events we are interested in hearing. - xattributes.event_mask= - ExposureMask | StructureNotifyMask | - KeyPressMask | KeyReleaseMask | - EnterWindowMask | LeaveWindowMask | - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | FocusChangeMask | PropertyChangeMask; + xattributes.event_mask = + ExposureMask | StructureNotifyMask | + KeyPressMask | KeyReleaseMask | + EnterWindowMask | LeaveWindowMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | FocusChangeMask | PropertyChangeMask; // create the window! ; if (parentWindow == 0) { - m_window = - XCreateWindow( - m_display, - RootWindow(m_display, m_visual->screen), - left, - top, - width, - height, - 0, // no border. - m_visual->depth, - InputOutput, - m_visual->visual, - CWBorderPixel|CWColormap|CWEventMask, - &xattributes - ); - } else { + m_window = XCreateWindow(m_display, + RootWindow(m_display, m_visual->screen), + left, + top, + width, + height, + 0, // no border. + m_visual->depth, + InputOutput, + m_visual->visual, + CWBorderPixel | CWColormap | CWEventMask, + &xattributes + ); + } + else { Window root_return; - int x_return,y_return; - unsigned int w_return,h_return,border_w_return,depth_return; + int x_return, y_return; + unsigned int w_return, h_return, border_w_return, depth_return; XGetGeometry(m_display, parentWindow, &root_return, &x_return, &y_return, - &w_return, &h_return, &border_w_return, &depth_return ); + &w_return, &h_return, &border_w_return, &depth_return); left = 0; top = 0; @@ -311,22 +310,21 @@ GHOST_WindowX11( height = h_return; - m_window = XCreateWindow( - m_display, - parentWindow, // reparent against embedder - left, - top, - width, - height, - 0, // no border. - m_visual->depth, - InputOutput, - m_visual->visual, - CWBorderPixel|CWColormap|CWEventMask, - &xattributes - ); + m_window = XCreateWindow(m_display, + parentWindow, // reparent against embedder + left, + top, + width, + height, + 0, // no border. + m_visual->depth, + InputOutput, + m_visual->visual, + CWBorderPixel | CWColormap | CWEventMask, + &xattributes + ); - XSelectInput(m_display , parentWindow, SubstructureNotifyMask); + XSelectInput(m_display, parentWindow, SubstructureNotifyMask); } @@ -359,23 +357,23 @@ GHOST_WindowX11( // Create some hints for the window manager on how // we want this window treated. - XSizeHints * xsizehints = XAllocSizeHints(); + XSizeHints *xsizehints = XAllocSizeHints(); xsizehints->flags = PPosition | PSize | PMinSize | PMaxSize; xsizehints->x = left; xsizehints->y = top; xsizehints->width = width; xsizehints->height = height; - xsizehints->min_width= 320; // size hints, could be made apart of the ghost api - xsizehints->min_height= 240; // limits are also arbitrary, but should not allow 1x1 window - xsizehints->max_width= 65535; - xsizehints->max_height= 65535; + xsizehints->min_width = 320; // size hints, could be made apart of the ghost api + xsizehints->min_height = 240; // limits are also arbitrary, but should not allow 1x1 window + xsizehints->max_width = 65535; + xsizehints->max_height = 65535; XSetWMNormalHints(m_display, m_window, xsizehints); XFree(xsizehints); - XClassHint * xclasshint = XAllocClassHint(); + XClassHint *xclasshint = XAllocClassHint(); const int len = title.Length() + 1; char *wmclass = (char *)malloc(sizeof(char) * len); - strncpy(wmclass, (const char*)title, sizeof(char) * len); + strncpy(wmclass, (const char *)title, sizeof(char) * len); xclasshint->res_name = wmclass; xclasshint->res_class = wmclass; XSetClassHint(m_display, m_window, xclasshint); @@ -384,15 +382,15 @@ GHOST_WindowX11( /* The basic for a good ICCCM "work" */ if (m_system->m_wm_protocols) { - natom= 0; + natom = 0; if (m_system->m_delete_window_atom) { - atoms[natom]= m_system->m_delete_window_atom; + atoms[natom] = m_system->m_delete_window_atom; natom++; } if (m_system->m_wm_take_focus) { - atoms[natom]= m_system->m_wm_take_focus; + atoms[natom] = m_system->m_wm_take_focus; natom++; } @@ -418,23 +416,24 @@ GHOST_WindowX11( GC gc_icon = XCreateGC(display, icon_pixmap, 0, NULL); GC gc_mask = XCreateGC(display, mask_pixmap, 0, NULL); - x_image = XCreateImage( display, m_visual->visual, 24, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 32, 0 ); - mask_image = XCreateImage( display, m_visual->visual, 1, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 8, 0); + x_image = XCreateImage(display, m_visual->visual, 24, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 32, 0); + mask_image = XCreateImage(display, m_visual->visual, 1, ZPixmap, 0, NULL, BLENDER_ICON_WIDTH, BLENDER_ICON_HEIGHT, 8, 0); x_image->data = (char *)malloc(x_image->bytes_per_line * BLENDER_ICON_HEIGHT); - mask_image->data = (char *)malloc( mask_image->bytes_per_line * BLENDER_ICON_HEIGHT); + mask_image->data = (char *)malloc(mask_image->bytes_per_line * BLENDER_ICON_HEIGHT); /* copy the BLENDER_ICON_48x48x24 into the XImage */ unsigned char *col = BLENDER_ICON_48x48x24; int px, py; - for (px=0; pxicon_pixmap = icon_pixmap; xwmhints->icon_mask = mask_pixmap; - XFreeGC (display, gc_icon); - XFreeGC (display, gc_mask); - XDestroyImage( x_image ); /* frees x_image->data too */ - XDestroyImage( mask_image ); + XFreeGC(display, gc_icon); + XFreeGC(display, gc_mask); + XDestroyImage(x_image); /* frees x_image->data too */ + XDestroyImage(mask_image); xwmhints->initial_state = NormalState; - xwmhints->input= True; - xwmhints->flags= InputHint|IconPixmapHint|IconMaskHint|StateHint; - XSetWMHints(display, m_window, xwmhints ); + xwmhints->input = True; + xwmhints->flags = InputHint | IconPixmapHint | IconMaskHint | StateHint; + XSetWMHints(display, m_window, xwmhints); XFree(xwmhints); // done setting the icon @@ -477,15 +476,14 @@ GHOST_WindowX11( #ifdef WITH_X11_XINPUT /* - Dummy function to get around IO Handler exiting if device invalid - Basically it will not crash blender now if you have a X device that - is configured but not plugged in. - -*/ + * Dummy function to get around IO Handler exiting if device invalid + * Basically it will not crash blender now if you have a X device that + * is configured but not plugged in. + */ static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent) { fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n", - theEvent->error_code, theEvent->request_code); + theEvent->error_code, theEvent->request_code); /* No exit! - but keep lint happy */ return 0; @@ -503,31 +501,31 @@ static bool match_token(const char *haystack, const char *needle) { while (*p && isspace(*p)) p++; - if (! *p) + if (!*p) break; for (q = needle; *q && *p && tolower(*p) == tolower(*q); q++) p++; - if (! *q && (isspace(*p) || !*p)) + if (!*q && (isspace(*p) || !*p)) return TRUE; - while (*p && ! isspace(*p)) + while (*p && !isspace(*p)) p++; } return FALSE; } -/* Determining if an X device is a Tablet style device is an imperfect science. -** We rely on common conventions around device names as well as the type reported -** by Wacom tablets. This code will likely need to be expanded for alternate tablet types -** -** Wintab refers to any device that interacts with the tablet as a cursor, -** (stylus, eraser, tablet mouse, airbrush, etc) -** this is not to be confused with wacom x11 configuration "cursor" device. -** Wacoms x11 config "cursor" refers to its device slot (which we mirror with -** our gSysCursors) for puck like devices (tablet mice essentially). -*/ +/* Determining if an X device is a Tablet style device is an imperfect science. + * We rely on common conventions around device names as well as the type reported + * by Wacom tablets. This code will likely need to be expanded for alternate tablet types + * + * Wintab refers to any device that interacts with the tablet as a cursor, + * (stylus, eraser, tablet mouse, airbrush, etc) + * this is not to be confused with wacom x11 configuration "cursor" device. + * Wacoms x11 config "cursor" refers to its device slot (which we mirror with + * our gSysCursors) for puck like devices (tablet mice essentially). + */ #if 0 // unused static BOOL is_tablet_cursor(const char *name, const char *type) { @@ -544,7 +542,7 @@ static BOOL is_tablet_cursor(const char *name, const char *type) NULL }; - for (i=0; tablet_cursor_whitelist[i] != NULL; i++) { + for (i = 0; tablet_cursor_whitelist[i] != NULL; i++) { if (name && match_token(name, tablet_cursor_whitelist[i])) return TRUE; if (type && match_token(type, tablet_cursor_whitelist[i])) @@ -556,14 +554,14 @@ static BOOL is_tablet_cursor(const char *name, const char *type) static BOOL is_stylus(const char *name, const char *type) { int i; - static const char* tablet_stylus_whitelist[] = { + static const char *tablet_stylus_whitelist[] = { "stylus", "wizardpen", "acecad", NULL }; - for (i=0; tablet_stylus_whitelist[i] != NULL; i++) { + for (i = 0; tablet_stylus_whitelist[i] != NULL; i++) { if (name && match_token(name, tablet_stylus_whitelist[i])) return TRUE; if (type && match_token(type, tablet_stylus_whitelist[i])) @@ -591,35 +589,35 @@ void GHOST_WindowX11::initXInputDevices() static XErrorHandler old_handler = (XErrorHandler) 0; XExtensionVersion *version = XGetExtensionVersion(m_display, INAME); - if(version && (version != (XExtensionVersion*)NoSuchExtension)) { - if(version->present) { + if (version && (version != (XExtensionVersion *)NoSuchExtension)) { + if (version->present) { int device_count; - XDeviceInfo* device_info = XListInputDevices(m_display, &device_count); + XDeviceInfo *device_info = XListInputDevices(m_display, &device_count); m_xtablet.StylusDevice = NULL; m_xtablet.EraserDevice = NULL; - m_xtablet.CommonData.Active= GHOST_kTabletModeNone; + m_xtablet.CommonData.Active = GHOST_kTabletModeNone; /* Install our error handler to override Xlib's termination behavior */ old_handler = XSetErrorHandler(ApplicationErrorHandler); - for(int i=0; inum_classes; ++j) { - if(ici->c_class==ValuatorClass) { + for (int j = 0; j < m_xtablet.StylusDevice->num_classes; ++j) { + if (ici->c_class == ValuatorClass) { // printf("\t\tfound ValuatorClass\n"); - XValuatorInfo* xvi = (XValuatorInfo*)ici; + XValuatorInfo *xvi = (XValuatorInfo *)ici; m_xtablet.PressureLevels = xvi->axes[2].max_value; /* this is assuming that the tablet has the same tilt resolution in both @@ -631,19 +629,20 @@ void GHOST_WindowX11::initXInputDevices() ici = (XAnyClassPtr)(((char *)ici) + ici->length); } - } else { - m_xtablet.StylusID= 0; + } + else { + m_xtablet.StylusID = 0; } } - else if(m_xtablet.EraserDevice==NULL && is_eraser(device_info[i].name, device_type)) { + else if (m_xtablet.EraserDevice == NULL && is_eraser(device_info[i].name, device_type)) { // printf("\tfound eraser\n"); - m_xtablet.EraserID= device_info[i].id; + m_xtablet.EraserID = device_info[i].id; m_xtablet.EraserDevice = XOpenDevice(m_display, m_xtablet.EraserID); - if (m_xtablet.EraserDevice == NULL) m_xtablet.EraserID= 0; + if (m_xtablet.EraserDevice == NULL) m_xtablet.EraserID = 0; } - if(device_type) { - XFree((void*)device_type); + if (device_type) { + XFree((void *)device_type); } } @@ -656,21 +655,21 @@ void GHOST_WindowX11::initXInputDevices() XEventClass xevents[10], ev; int dcount = 0; - if(m_xtablet.StylusDevice) { + if (m_xtablet.StylusDevice) { DeviceMotionNotify(m_xtablet.StylusDevice, m_xtablet.MotionEvent, ev); - if(ev) xevents[dcount++] = ev; + if (ev) xevents[dcount++] = ev; ProximityIn(m_xtablet.StylusDevice, m_xtablet.ProxInEvent, ev); - if(ev) xevents[dcount++] = ev; + if (ev) xevents[dcount++] = ev; ProximityOut(m_xtablet.StylusDevice, m_xtablet.ProxOutEvent, ev); - if(ev) xevents[dcount++] = ev; + if (ev) xevents[dcount++] = ev; } - if(m_xtablet.EraserDevice) { + if (m_xtablet.EraserDevice) { DeviceMotionNotify(m_xtablet.EraserDevice, m_xtablet.MotionEvent, ev); - if(ev) xevents[dcount++] = ev; + if (ev) xevents[dcount++] = ev; ProximityIn(m_xtablet.EraserDevice, m_xtablet.ProxInEvent, ev); - if(ev) xevents[dcount++] = ev; + if (ev) xevents[dcount++] = ev; ProximityOut(m_xtablet.EraserDevice, m_xtablet.ProxOutEvent, ev); - if(ev) xevents[dcount++] = ev; + if (ev) xevents[dcount++] = ev; } XSelectExtensionEvent(m_display, m_window, xevents, dcount); @@ -681,73 +680,73 @@ void GHOST_WindowX11::initXInputDevices() #endif /* WITH_X11_XINPUT */ - Window +Window GHOST_WindowX11:: -getXWindow( -){ +getXWindow() +{ return m_window; } - bool +bool GHOST_WindowX11:: -getValid( -) const { +getValid() const +{ return m_valid_setup; } - void +void GHOST_WindowX11:: setTitle( - const STR_String& title -){ + const STR_String& title) +{ Atom name = XInternAtom(m_display, "_NET_WM_NAME", 0); Atom utf8str = XInternAtom(m_display, "UTF8_STRING", 0); XChangeProperty(m_display, m_window, name, utf8str, 8, PropModeReplace, - (const unsigned char*) title.ReadPtr(), + (const unsigned char *) title.ReadPtr(), title.Length()); // This should convert to valid x11 string // and getTitle would need matching change - XStoreName(m_display,m_window,title); + XStoreName(m_display, m_window, title); XFlush(m_display); } - void +void GHOST_WindowX11:: getTitle( - STR_String& title -) const { + STR_String& title) const +{ char *name = NULL; - XFetchName(m_display,m_window,&name); - title= name?name:"untitled"; + XFetchName(m_display, m_window, &name); + title = name ? name : "untitled"; XFree(name); } - void +void GHOST_WindowX11:: getWindowBounds( - GHOST_Rect& bounds -) const { - // Getting the window bounds under X11 is not - // really supported (nor should it be desired). + GHOST_Rect& bounds) const +{ + // Getting the window bounds under X11 is not + // really supported (nor should it be desired). getClientBounds(bounds); } - void +void GHOST_WindowX11:: getClientBounds( - GHOST_Rect& bounds -) const { + GHOST_Rect& bounds) const +{ Window root_return; - int x_return,y_return; - unsigned int w_return,h_return,border_w_return,depth_return; + int x_return, y_return; + unsigned int w_return, h_return, border_w_return, depth_return; GHOST_TInt32 screen_x, screen_y; - XGetGeometry(m_display,m_window,&root_return,&x_return,&y_return, - &w_return,&h_return,&border_w_return,&depth_return); + XGetGeometry(m_display, m_window, &root_return, &x_return, &y_return, + &w_return, &h_return, &border_w_return, &depth_return); clientToScreen(0, 0, screen_x, screen_y); @@ -758,95 +757,88 @@ getClientBounds( } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setClientWidth( - GHOST_TUns32 width -){ + GHOST_TUns32 width) +{ XWindowChanges values; - unsigned int value_mask= CWWidth; + unsigned int value_mask = CWWidth; values.width = width; - XConfigureWindow(m_display,m_window,value_mask,&values); + XConfigureWindow(m_display, m_window, value_mask, &values); return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setClientHeight( - GHOST_TUns32 height -){ + GHOST_TUns32 height) +{ XWindowChanges values; - unsigned int value_mask= CWHeight; + unsigned int value_mask = CWHeight; values.height = height; - XConfigureWindow(m_display,m_window,value_mask,&values); + XConfigureWindow(m_display, m_window, value_mask, &values); return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setClientSize( - GHOST_TUns32 width, - GHOST_TUns32 height -){ + GHOST_TUns32 width, + GHOST_TUns32 height) +{ XWindowChanges values; - unsigned int value_mask= CWWidth | CWHeight; + unsigned int value_mask = CWWidth | CWHeight; values.width = width; values.height = height; - XConfigureWindow(m_display,m_window,value_mask,&values); + XConfigureWindow(m_display, m_window, value_mask, &values); return GHOST_kSuccess; } - void +void GHOST_WindowX11:: screenToClient( - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32& outX, - GHOST_TInt32& outY -) const { + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32& outX, + GHOST_TInt32& outY) const +{ // This is correct! - int ax,ay; + int ax, ay; Window temp; - XTranslateCoordinates( - m_display, - RootWindow(m_display, m_visual->screen), - m_window, - inX, - inY, - &ax, - &ay, - &temp - ); + XTranslateCoordinates(m_display, + RootWindow(m_display, m_visual->screen), + m_window, + inX, inY, + &ax, &ay, + &temp); outX = ax; outY = ay; } - void +void GHOST_WindowX11:: clientToScreen( - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32& outX, - GHOST_TInt32& outY -) const { - int ax,ay; + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32& outX, + GHOST_TInt32& outY) const +{ + int ax, ay; Window temp; XTranslateCoordinates( - m_display, - m_window, - RootWindow(m_display, m_visual->screen), - inX, - inY, - &ax, - &ay, - &temp - ); + m_display, + m_window, + RootWindow(m_display, m_visual->screen), + inX, inY, + &ax, &ay, + &temp); outX = ax; outY = ay; } @@ -866,8 +858,8 @@ void GHOST_WindowX11::icccmSetState(int state) xev.xclient.format = 32; xev.xclient.message_type = m_system->m_wm_change_state; xev.xclient.data.l[0] = state; - XSendEvent (m_display, RootWindow(m_display, DefaultScreen(m_display)), - False, SubstructureNotifyMask | SubstructureRedirectMask, &xev); + XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)), + False, SubstructureNotifyMask | SubstructureRedirectMask, &xev); } int GHOST_WindowX11::icccmGetState(void) const @@ -879,8 +871,8 @@ int GHOST_WindowX11::icccmGetState(void) const prop_ret = NULL; st = XGetWindowProperty(m_display, m_window, m_system->m_wm_state, 0, - 0x7fffffff, False, m_system->m_wm_state, &type_ret, - &format_ret, &num_ret, &bytes_after, &prop_ret); + 0x7fffffff, False, m_system->m_wm_state, &type_ret, + &format_ret, &num_ret, &bytes_after, &prop_ret); if ((st == Success) && (prop_ret) && (num_ret == 2)) st = prop_ret[0]; @@ -913,7 +905,7 @@ void GHOST_WindowX11::netwmMaximized(bool set) xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)), - False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); + False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } bool GHOST_WindowX11::netwmIsMaximized(void) const @@ -927,8 +919,8 @@ bool GHOST_WindowX11::netwmIsMaximized(void) const prop_ret = NULL; st = False; ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0, - 0x7fffffff, False, XA_ATOM, &type_ret, &format_ret, - &num_ret, &bytes_after, &prop_ret); + 0x7fffffff, False, XA_ATOM, &type_ret, &format_ret, + &num_ret, &bytes_after, &prop_ret); if ((ret == Success) && (prop_ret) && (format_ret == 32)) { count = 0; for (i = 0; i < num_ret; i++) { @@ -969,7 +961,7 @@ void GHOST_WindowX11::netwmFullScreen(bool set) xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)), - False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); + False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } bool GHOST_WindowX11::netwmIsFullScreen(void) const @@ -983,8 +975,8 @@ bool GHOST_WindowX11::netwmIsFullScreen(void) const prop_ret = NULL; st = False; ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0, - 0x7fffffff, False, XA_ATOM, &type_ret, &format_ret, - &num_ret, &bytes_after, &prop_ret); + 0x7fffffff, False, XA_ATOM, &type_ret, &format_ret, + &num_ret, &bytes_after, &prop_ret); if ((ret == Success) && (prop_ret) && (format_ret == 32)) { for (i = 0; i < num_ret; i++) { if (((unsigned long *) prop_ret)[i] == m_system->m_net_fullscreen) { @@ -1010,8 +1002,8 @@ void GHOST_WindowX11::motifFullScreen(bool set) hints.decorations = 1; XChangeProperty(m_display, m_window, m_system->m_motif, - m_system->m_motif, 32, PropModeReplace, - (unsigned char *) &hints, 4); + m_system->m_motif, 32, PropModeReplace, + (unsigned char *) &hints, 4); } bool GHOST_WindowX11::motifIsFullScreen(void) const @@ -1026,9 +1018,9 @@ bool GHOST_WindowX11::motifIsFullScreen(void) const prop_ret = NULL; state = False; st = XGetWindowProperty(m_display, m_window, m_system->m_motif, 0, - 0x7fffffff, False, m_system->m_motif, - &type_ret, &format_ret, &num_ret, - &bytes_after, &prop_ret); + 0x7fffffff, False, m_system->m_motif, + &type_ret, &format_ret, &num_ret, + &bytes_after, &prop_ret); if ((st == Success) && (prop_ret)) { hints = (MotifWmHints *) prop_ret; if (hints->flags & MWM_HINTS_DECORATIONS) { @@ -1070,7 +1062,7 @@ GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state) bool is_max, is_full, is_motif_full; cur_state = getState(); - if (state == (int)cur_state) + if (state == (int)cur_state) return GHOST_kSuccess; if (cur_state != GHOST_kWindowStateMinimized) { @@ -1153,11 +1145,11 @@ GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state) #include using namespace std; - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setOrder( - GHOST_TWindowOrder order -){ + GHOST_TWindowOrder order) +{ if (order == GHOST_kWindowOrderTop) { XWindowAttributes attr; Atom atom; @@ -1199,46 +1191,48 @@ setOrder( /* iconized windows give bad match error */ if (attr.map_state == IsViewable) XSetInputFocus(m_display, m_window, RevertToPointerRoot, - CurrentTime); + CurrentTime); XFlush(m_display); - } else if (order == GHOST_kWindowOrderBottom) { - XLowerWindow(m_display,m_window); + } + else if (order == GHOST_kWindowOrderBottom) { + XLowerWindow(m_display, m_window); XFlush(m_display); - } else { + } + else { return GHOST_kFailure; } return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: -swapBuffers( -){ +swapBuffers() +{ if (getDrawingContextType() == GHOST_kDrawingContextTypeOpenGL) { - glXSwapBuffers(m_display,m_window); + glXSwapBuffers(m_display, m_window); return GHOST_kSuccess; - } else { + } + else { return GHOST_kFailure; } } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: -activateDrawingContext( -){ - if (m_context !=NULL) { - glXMakeCurrent(m_display, m_window,m_context); +activateDrawingContext() +{ + if (m_context != NULL) { + glXMakeCurrent(m_display, m_window, m_context); return GHOST_kSuccess; } return GHOST_kFailure; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: -invalidate( -){ - +invalidate() +{ // So the idea of this function is to generate an expose event // for the window. // Unfortunately X does not handle expose events for you and @@ -1265,10 +1259,10 @@ invalidate( * for the window have been pushed onto the GHOST queue */ - void +void GHOST_WindowX11:: -validate( -){ +validate() +{ m_invalid_window = false; } @@ -1280,7 +1274,7 @@ validate( GHOST_WindowX11:: ~GHOST_WindowX11( -){ + ){ static Atom Primary_atom, Clipboard_atom; Window p_owner, c_owner; /*Change the owner of the Atoms to None if we are the owner*/ @@ -1304,10 +1298,10 @@ GHOST_WindowX11:: #ifdef WITH_X11_XINPUT /* close tablet devices */ - if(m_xtablet.StylusDevice) + if (m_xtablet.StylusDevice) XCloseDevice(m_display, m_xtablet.StylusDevice); - if(m_xtablet.EraserDevice) + if (m_xtablet.EraserDevice) XCloseDevice(m_display, m_xtablet.EraserDevice); #endif /* WITH_X11_XINPUT */ @@ -1344,36 +1338,37 @@ GHOST_WindowX11:: * @param type The type of rendering context installed. * @return Indication as to whether installation has succeeded. */ - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: installDrawingContext( - GHOST_TDrawingContextType type -){ + GHOST_TDrawingContextType type) +{ // only support openGL for now. GHOST_TSuccess success; switch (type) { - case GHOST_kDrawingContextTypeOpenGL: - m_context = glXCreateContext(m_display, m_visual, s_firstContext, True); - if (m_context !=NULL) { - if (!s_firstContext) { - s_firstContext = m_context; + case GHOST_kDrawingContextTypeOpenGL: + m_context = glXCreateContext(m_display, m_visual, s_firstContext, True); + if (m_context != NULL) { + if (!s_firstContext) { + s_firstContext = m_context; + } + glXMakeCurrent(m_display, m_window, m_context); + glClearColor(0.447, 0.447, 0.447, 0); + glClear(GL_COLOR_BUFFER_BIT); + success = GHOST_kSuccess; } - glXMakeCurrent(m_display, m_window,m_context); - glClearColor(0.447, 0.447, 0.447, 0); - glClear(GL_COLOR_BUFFER_BIT); + else { + success = GHOST_kFailure; + } + + break; + + case GHOST_kDrawingContextTypeNone: success = GHOST_kSuccess; - } else { + break; + + default: success = GHOST_kFailure; - } - - break; - - case GHOST_kDrawingContextTypeNone: - success = GHOST_kSuccess; - break; - - default: - success = GHOST_kFailure; } return success; } @@ -1384,55 +1379,56 @@ installDrawingContext( * Removes the current drawing context. * @return Indication as to whether removal has succeeded. */ - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: -removeDrawingContext( -){ +removeDrawingContext() +{ GHOST_TSuccess success; if (m_context != NULL) { glXDestroyContext(m_display, m_context); success = GHOST_kSuccess; - } else { + } + else { success = GHOST_kFailure; } return success; } - Cursor +Cursor GHOST_WindowX11:: getStandardCursor( - GHOST_TStandardCursor g_cursor -){ + GHOST_TStandardCursor g_cursor) +{ unsigned int xcursor_id; -#define GtoX(gcurs, xcurs) case gcurs: xcursor_id = xcurs +#define GtoX(gcurs, xcurs) case gcurs: xcursor_id = xcurs switch (g_cursor) { - GtoX(GHOST_kStandardCursorRightArrow, XC_arrow); break; - GtoX(GHOST_kStandardCursorLeftArrow, XC_top_left_arrow); break; - GtoX(GHOST_kStandardCursorInfo, XC_hand1); break; - GtoX(GHOST_kStandardCursorDestroy, XC_pirate); break; - GtoX(GHOST_kStandardCursorHelp, XC_question_arrow); break; - GtoX(GHOST_kStandardCursorCycle, XC_exchange); break; - GtoX(GHOST_kStandardCursorSpray, XC_spraycan); break; - GtoX(GHOST_kStandardCursorWait, XC_watch); break; - GtoX(GHOST_kStandardCursorText, XC_xterm); break; - GtoX(GHOST_kStandardCursorCrosshair, XC_crosshair); break; - GtoX(GHOST_kStandardCursorUpDown, XC_sb_v_double_arrow); break; - GtoX(GHOST_kStandardCursorLeftRight, XC_sb_h_double_arrow); break; - GtoX(GHOST_kStandardCursorTopSide, XC_top_side); break; - GtoX(GHOST_kStandardCursorBottomSide, XC_bottom_side); break; - GtoX(GHOST_kStandardCursorLeftSide, XC_left_side); break; - GtoX(GHOST_kStandardCursorRightSide, XC_right_side); break; - GtoX(GHOST_kStandardCursorTopLeftCorner, XC_top_left_corner); break; - GtoX(GHOST_kStandardCursorTopRightCorner, XC_top_right_corner); break; - GtoX(GHOST_kStandardCursorBottomRightCorner, XC_bottom_right_corner); break; - GtoX(GHOST_kStandardCursorBottomLeftCorner, XC_bottom_left_corner); break; - GtoX(GHOST_kStandardCursorPencil, XC_pencil); break; - GtoX(GHOST_kStandardCursorCopy, XC_arrow); break; - default: - xcursor_id = 0; + GtoX(GHOST_kStandardCursorRightArrow, XC_arrow); break; + GtoX(GHOST_kStandardCursorLeftArrow, XC_top_left_arrow); break; + GtoX(GHOST_kStandardCursorInfo, XC_hand1); break; + GtoX(GHOST_kStandardCursorDestroy, XC_pirate); break; + GtoX(GHOST_kStandardCursorHelp, XC_question_arrow); break; + GtoX(GHOST_kStandardCursorCycle, XC_exchange); break; + GtoX(GHOST_kStandardCursorSpray, XC_spraycan); break; + GtoX(GHOST_kStandardCursorWait, XC_watch); break; + GtoX(GHOST_kStandardCursorText, XC_xterm); break; + GtoX(GHOST_kStandardCursorCrosshair, XC_crosshair); break; + GtoX(GHOST_kStandardCursorUpDown, XC_sb_v_double_arrow); break; + GtoX(GHOST_kStandardCursorLeftRight, XC_sb_h_double_arrow); break; + GtoX(GHOST_kStandardCursorTopSide, XC_top_side); break; + GtoX(GHOST_kStandardCursorBottomSide, XC_bottom_side); break; + GtoX(GHOST_kStandardCursorLeftSide, XC_left_side); break; + GtoX(GHOST_kStandardCursorRightSide, XC_right_side); break; + GtoX(GHOST_kStandardCursorTopLeftCorner, XC_top_left_corner); break; + GtoX(GHOST_kStandardCursorTopRightCorner, XC_top_right_corner); break; + GtoX(GHOST_kStandardCursorBottomRightCorner, XC_bottom_right_corner); break; + GtoX(GHOST_kStandardCursorBottomLeftCorner, XC_bottom_left_corner); break; + GtoX(GHOST_kStandardCursorPencil, XC_pencil); break; + GtoX(GHOST_kStandardCursorCopy, XC_arrow); break; + default: + xcursor_id = 0; } #undef GtoX @@ -1446,26 +1442,27 @@ getStandardCursor( } return xcursor; - } else { + } + else { return None; } } - Cursor +Cursor GHOST_WindowX11:: getEmptyCursor( -) { + ) { if (!m_empty_cursor) { Pixmap blank; XColor dummy; char data[1] = {0}; /* make a blank cursor */ - blank = XCreateBitmapFromData ( - m_display, - RootWindow(m_display,DefaultScreen(m_display)), - data, 1, 1 - ); + blank = XCreateBitmapFromData( + m_display, + RootWindow(m_display, DefaultScreen(m_display)), + data, 1, 1 + ); m_empty_cursor = XCreatePixmapCursor(m_display, blank, blank, &dummy, &dummy, 0, 0); XFreePixmap(m_display, blank); @@ -1474,16 +1471,17 @@ getEmptyCursor( return m_empty_cursor; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setWindowCursorVisibility( - bool visible -){ + bool visible) +{ Cursor xcursor; if (visible) { - xcursor = getStandardCursor( getCursorShape() ); - } else { + xcursor = getStandardCursor(getCursorShape() ); + } + else { xcursor = getEmptyCursor(); } @@ -1493,17 +1491,17 @@ setWindowCursorVisibility( return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setWindowCursorGrab( - GHOST_TGrabCursorMode mode -){ - if(mode != GHOST_kGrabDisable) { - if(mode != GHOST_kGrabNormal) { + GHOST_TGrabCursorMode mode) +{ + if (mode != GHOST_kGrabDisable) { + if (mode != GHOST_kGrabNormal) { m_system->getCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]); setCursorGrabAccum(0, 0); - if(mode == GHOST_kGrabHide) + if (mode == GHOST_kGrabHide) setWindowCursorVisibility(false); } @@ -1513,21 +1511,21 @@ setWindowCursorGrab( #endif } else { - if (m_cursorGrab==GHOST_kGrabHide) { + if (m_cursorGrab == GHOST_kGrabHide) { m_system->setCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]); setWindowCursorVisibility(true); } - if(m_cursorGrab != GHOST_kGrabNormal) { + if (m_cursorGrab != GHOST_kGrabNormal) { /* use to generate a mouse move event, otherwise the last event * blender gets can be outside the screen causing menus not to show * properly unless the user moves the mouse */ - XWarpPointer(m_display,None,None,0,0,0,0,0,0); + XWarpPointer(m_display, None, None, 0, 0, 0, 0, 0, 0); } /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */ setCursorGrabAccum(0, 0); - m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */ + m_cursorGrabBounds.m_l = m_cursorGrabBounds.m_r = -1; /* disable */ #ifdef GHOST_X11_GRAB XUngrabPointer(m_display, CurrentTime); #endif @@ -1538,12 +1536,12 @@ setWindowCursorGrab( return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setWindowCursorShape( - GHOST_TStandardCursor shape -){ - Cursor xcursor = getStandardCursor( shape ); + GHOST_TStandardCursor shape) +{ + Cursor xcursor = getStandardCursor(shape); XDefineCursor(m_display, m_window, xcursor); XFlush(m_display); @@ -1551,45 +1549,44 @@ setWindowCursorShape( return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setWindowCustomCursorShape( - GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], - int hotX, - int hotY -){ - -setWindowCustomCursorShape((GHOST_TUns8*)bitmap, (GHOST_TUns8*)mask, - 16, 16, hotX, hotY, 0, 1); + GHOST_TUns8 bitmap[16][2], + GHOST_TUns8 mask[16][2], + int hotX, + int hotY) +{ + setWindowCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask, + 16, 16, hotX, hotY, 0, 1); return GHOST_kSuccess; } - GHOST_TSuccess +GHOST_TSuccess GHOST_WindowX11:: setWindowCustomCursorShape( - GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, - int sizey, - int hotX, - int hotY, - int fg_color, - int bg_color -){ - Colormap colormap= DefaultColormap(m_display, DefaultScreen(m_display)); + GHOST_TUns8 *bitmap, + GHOST_TUns8 *mask, + int sizex, + int sizey, + int hotX, + int hotY, + int fg_color, + int bg_color) +{ + Colormap colormap = DefaultColormap(m_display, DefaultScreen(m_display)); Pixmap bitmap_pix, mask_pix; XColor fg, bg; - if(XAllocNamedColor(m_display, colormap, "White", &fg, &fg) == 0) return GHOST_kFailure; - if(XAllocNamedColor(m_display, colormap, "Black", &bg, &bg) == 0) return GHOST_kFailure; + if (XAllocNamedColor(m_display, colormap, "White", &fg, &fg) == 0) return GHOST_kFailure; + if (XAllocNamedColor(m_display, colormap, "Black", &bg, &bg) == 0) return GHOST_kFailure; if (m_custom_cursor) { XFreeCursor(m_display, m_custom_cursor); } - bitmap_pix = XCreateBitmapFromData(m_display, m_window, (char*) bitmap, sizex, sizey); - mask_pix = XCreateBitmapFromData(m_display, m_window, (char*) mask, sizex, sizey); + bitmap_pix = XCreateBitmapFromData(m_display, m_window, (char *) bitmap, sizex, sizey); + mask_pix = XCreateBitmapFromData(m_display, m_window, (char *) mask, sizex, sizey); m_custom_cursor = XCreatePixmapCursor(m_display, bitmap_pix, mask_pix, &fg, &bg, hotX, hotY); XDefineCursor(m_display, m_window, m_custom_cursor); @@ -1598,8 +1595,8 @@ setWindowCustomCursorShape( XFreePixmap(m_display, bitmap_pix); XFreePixmap(m_display, mask_pix); - XFreeColors(m_display, colormap, &fg.pixel, 1, 0L); - XFreeColors(m_display, colormap, &bg.pixel, 1, 0L); + XFreeColors(m_display, colormap, &fg.pixel, 1, 0L); + XFreeColors(m_display, colormap, &bg.pixel, 1, 0L); return GHOST_kSuccess; } diff --git a/intern/ghost/intern/GHOST_WindowX11.h b/intern/ghost/intern/GHOST_WindowX11.h index cb3c1415a28..a04a43bc33a 100644 --- a/intern/ghost/intern/GHOST_WindowX11.h +++ b/intern/ghost/intern/GHOST_WindowX11.h @@ -70,110 +70,110 @@ public: * @param width The width the window. * @param height The height the window. * @param state The state the window is initially opened with. - * @param parentWindow Parent (embedder) window + * @param parentWindow Parent (embedder) window * @param type The type of drawing context installed in this window. * @param stereoVisual Stereo visual for quad buffered stereo. * @param numOfAASamples Number of samples used for AA (zero if no AA) */ GHOST_WindowX11( - GHOST_SystemX11 *system, - Display * display, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - const GHOST_TEmbedderWindowID parentWindow, - GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0 - ); + GHOST_SystemX11 *system, + Display *display, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + const GHOST_TEmbedderWindowID parentWindow, + GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0 + ); - bool + bool getValid( - ) const; + ) const; - void + void setTitle(const STR_String& title); - void + void getTitle( - STR_String& title - ) const; + STR_String& title + ) const; - void + void getWindowBounds( - GHOST_Rect& bounds - ) const; + GHOST_Rect& bounds + ) const; - void + void getClientBounds( - GHOST_Rect& bounds - ) const; + GHOST_Rect& bounds + ) const; - GHOST_TSuccess + GHOST_TSuccess setClientWidth( - GHOST_TUns32 width - ); + GHOST_TUns32 width + ); - GHOST_TSuccess + GHOST_TSuccess setClientHeight( - GHOST_TUns32 height - ); + GHOST_TUns32 height + ); - GHOST_TSuccess + GHOST_TSuccess setClientSize( - GHOST_TUns32 width, - GHOST_TUns32 height - ); + GHOST_TUns32 width, + GHOST_TUns32 height + ); - void + void screenToClient( - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32& outX, - GHOST_TInt32& outY - ) const; + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32& outX, + GHOST_TInt32& outY + ) const; - void + void clientToScreen( - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32& outX, - GHOST_TInt32& outY - ) const; + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32& outX, + GHOST_TInt32& outY + ) const; - GHOST_TWindowState + GHOST_TWindowState getState( - ) const; + ) const; - GHOST_TSuccess + GHOST_TSuccess setState( - GHOST_TWindowState state - ); + GHOST_TWindowState state + ); - GHOST_TSuccess + GHOST_TSuccess setOrder( - GHOST_TWindowOrder order - ); + GHOST_TWindowOrder order + ); - GHOST_TSuccess + GHOST_TSuccess swapBuffers( - ); + ); - GHOST_TSuccess + GHOST_TSuccess activateDrawingContext( - ); - GHOST_TSuccess + ); + GHOST_TSuccess invalidate( - ); + ); /** * Destructor. * Closes the window and disposes resources allocated. */ - ~GHOST_WindowX11(); + ~GHOST_WindowX11(); /** * @section x11specific X11 system specific calls @@ -185,24 +185,24 @@ public: * the GHOST event queue. */ - void + void validate( - ); + ); /** * Return a handle to the x11 window type. */ - Window + Window getXWindow( - ); + ); #ifdef WITH_X11_XINPUT class XTablet { - public: +public: GHOST_TabletData CommonData; - XDevice* StylusDevice; - XDevice* EraserDevice; + XDevice *StylusDevice; + XDevice *EraserDevice; XID StylusID, EraserID; @@ -215,22 +215,32 @@ public: }; XTablet& GetXTablet() - { return m_xtablet; } + { + return m_xtablet; + } - const GHOST_TabletData* GetTabletData() - { return &m_xtablet.CommonData; } + const GHOST_TabletData *GetTabletData() + { + return &m_xtablet.CommonData; + } #else // WITH_X11_XINPUT - const GHOST_TabletData* GetTabletData() - { return NULL; } + const GHOST_TabletData *GetTabletData() + { + return NULL; + } #endif // WITH_X11_XINPUT #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING) - XIC getX11_XIC() { return m_xic; } + XIC getX11_XIC() { + return m_xic; + } #endif #ifdef WITH_XDND - GHOST_DropTargetX11* getDropTarget() - { return m_dropTarget; } + GHOST_DropTargetX11 *getDropTarget() + { + return m_dropTarget; + } #endif /* @@ -247,106 +257,106 @@ protected: * @param type The type of rendering context installed. * @return Indication as to whether installation has succeeded. */ - GHOST_TSuccess + GHOST_TSuccess installDrawingContext( - GHOST_TDrawingContextType type - ); + GHOST_TDrawingContextType type + ); /** * Removes the current drawing context. * @return Indication as to whether removal has succeeded. */ - GHOST_TSuccess + GHOST_TSuccess removeDrawingContext( - ); + ); /** * Sets the cursor visibility on the window using * native window system calls. */ - GHOST_TSuccess + GHOST_TSuccess setWindowCursorVisibility( - bool visible - ); + bool visible + ); /** * Sets the cursor grab on the window using * native window system calls. * @param warp Only used when grab is enabled, hides the mouse and allows gragging outside the screen. */ - GHOST_TSuccess + GHOST_TSuccess setWindowCursorGrab( - GHOST_TGrabCursorMode mode - ); + GHOST_TGrabCursorMode mode + ); - GHOST_TGrabCursorMode + GHOST_TGrabCursorMode getWindowCursorGrab() const; /** * Sets the cursor shape on the window using * native window system calls. */ - GHOST_TSuccess + GHOST_TSuccess setWindowCursorShape( - GHOST_TStandardCursor shape - ); + GHOST_TStandardCursor shape + ); /** * Sets the cursor shape on the window using * native window system calls. */ - GHOST_TSuccess + GHOST_TSuccess setWindowCustomCursorShape( - GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], - int hotX, - int hotY - ); + GHOST_TUns8 bitmap[16][2], + GHOST_TUns8 mask[16][2], + int hotX, + int hotY + ); /** * Sets the cursor shape on the window using * native window system calls (Arbitrary size/color). */ - GHOST_TSuccess + GHOST_TSuccess setWindowCustomCursorShape( - GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, - int sizey, - int hotX, - int hotY, - int fg_color, - int bg_color - ); + GHOST_TUns8 *bitmap, + GHOST_TUns8 *mask, + int sizex, + int sizey, + int hotX, + int hotY, + int fg_color, + int bg_color + ); -private : +private: /// Force use of public constructor. GHOST_WindowX11( - ); + ); GHOST_WindowX11( - const GHOST_WindowX11 & - ); + const GHOST_WindowX11 & + ); - Cursor + Cursor getStandardCursor( - GHOST_TStandardCursor g_cursor - ); + GHOST_TStandardCursor g_cursor + ); - Cursor + Cursor getEmptyCursor( - ); + ); #ifdef WITH_X11_XINPUT void initXInputDevices(); #endif - GLXContext m_context; - Window m_window; - Display *m_display; - XVisualInfo *m_visual; + GLXContext m_context; + Window m_window; + Display *m_display; + XVisualInfo *m_visual; GHOST_TWindowState m_normal_state; /** The first created OpenGL context (for sharing display lists) */ @@ -354,7 +364,7 @@ private : /// A pointer to the typed system class. - GHOST_SystemX11 * m_system; + GHOST_SystemX11 *m_system; bool m_valid_setup; @@ -371,7 +381,7 @@ private : std::map m_standard_cursors; #ifdef WITH_XDND - GHOST_DropTargetX11 * m_dropTarget; + GHOST_DropTargetX11 *m_dropTarget; #endif #ifdef WITH_X11_XINPUT From 03ed173fe6a9d286faacc2e66c5c654cd571f18c Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Fri, 18 May 2012 21:13:22 +0000 Subject: [PATCH 039/159] 3D View UI: * Remove redundant "Delete" for Edge Loop in the Delete (X) menu. --- release/scripts/startup/bl_ui/space_view3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index e069d78bff0..b375150d662 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -1906,7 +1906,7 @@ class VIEW3D_MT_edit_mesh_delete(Menu): layout.operator("mesh.dissolve") layout.operator("mesh.edge_collapse") - layout.operator("mesh.delete_edgeloop") + layout.operator("mesh.delete_edgeloop", text="Edge Loop") class VIEW3D_MT_edit_mesh_dissolve(Menu): From 112b1a0779d0e570f8b6726b2d3deb4f45d784a5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 19 May 2012 09:23:08 +0000 Subject: [PATCH 040/159] style cleanup: ghost headers --- intern/ghost/GHOST_C-api.h | 202 +++++++++--------- intern/ghost/GHOST_IEvent.h | 10 +- intern/ghost/GHOST_IEventConsumer.h | 2 +- intern/ghost/GHOST_ISystem.h | 94 ++++---- intern/ghost/GHOST_ISystemPaths.h | 24 ++- intern/ghost/GHOST_ITimerTask.h | 8 +- intern/ghost/GHOST_IWindow.h | 44 ++-- intern/ghost/GHOST_Path-api.h | 14 +- intern/ghost/GHOST_Rect.h | 33 +-- intern/ghost/GHOST_Types.h | 86 ++++---- intern/ghost/intern/GHOST_Buttons.h | 6 +- .../intern/GHOST_CallbackEventConsumer.h | 10 +- .../ghost/intern/GHOST_DisplayManagerCarbon.h | 2 +- .../ghost/intern/GHOST_DisplayManagerNULL.h | 2 +- intern/ghost/intern/GHOST_DisplayManagerSDL.h | 4 +- intern/ghost/intern/GHOST_DropTargetWin32.h | 51 +++-- intern/ghost/intern/GHOST_Event.h | 6 +- intern/ghost/intern/GHOST_EventButton.h | 2 +- intern/ghost/intern/GHOST_EventCursor.h | 2 +- intern/ghost/intern/GHOST_EventDragnDrop.h | 14 +- intern/ghost/intern/GHOST_EventKey.h | 8 +- intern/ghost/intern/GHOST_EventManager.h | 36 ++-- intern/ghost/intern/GHOST_EventNDOF.h | 41 ++-- intern/ghost/intern/GHOST_EventPrinter.h | 4 +- intern/ghost/intern/GHOST_EventString.h | 7 +- intern/ghost/intern/GHOST_EventTrackpad.h | 2 +- intern/ghost/intern/GHOST_EventWheel.h | 2 +- intern/ghost/intern/GHOST_ModifierKeys.h | 3 +- intern/ghost/intern/GHOST_NDOFManager.h | 10 +- intern/ghost/intern/GHOST_System.h | 98 ++++----- intern/ghost/intern/GHOST_SystemCarbon.h | 46 ++-- intern/ghost/intern/GHOST_SystemCocoa.h | 58 ++--- intern/ghost/intern/GHOST_SystemNULL.h | 26 +-- intern/ghost/intern/GHOST_SystemPaths.h | 30 +-- intern/ghost/intern/GHOST_SystemPathsCarbon.h | 18 +- intern/ghost/intern/GHOST_SystemPathsCocoa.h | 14 +- intern/ghost/intern/GHOST_SystemPathsWin32.h | 6 +- intern/ghost/intern/GHOST_SystemSDL.h | 2 +- intern/ghost/intern/GHOST_SystemWin32.h | 62 +++--- intern/ghost/intern/GHOST_TaskbarWin32.h | 76 +++---- intern/ghost/intern/GHOST_TimerManager.h | 12 +- intern/ghost/intern/GHOST_TimerTask.h | 10 +- intern/ghost/intern/GHOST_Window.h | 56 ++--- intern/ghost/intern/GHOST_WindowCarbon.h | 72 ++++--- intern/ghost/intern/GHOST_WindowCocoa.h | 58 ++--- intern/ghost/intern/GHOST_WindowManager.h | 28 +-- intern/ghost/intern/GHOST_WindowNULL.h | 32 +-- intern/ghost/intern/GHOST_WindowSDL.h | 22 +- intern/ghost/intern/GHOST_WindowWin32.h | 96 +++++---- 49 files changed, 798 insertions(+), 753 deletions(-) diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 3add5ccb60a..7f33f2bdcde 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -30,7 +30,7 @@ * \brief GHOST C-API function and type declarations. */ -#ifndef __GHOST_C_API_H__ +#ifndef __GHOST_C_API_H__ #define __GHOST_C_API_H__ #include "GHOST_Types.h" @@ -113,10 +113,10 @@ extern GHOST_TUns64 GHOST_GetMilliSeconds(GHOST_SystemHandle systemhandle); * @return A timer task (0 if timer task installation failed). */ extern GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle, - GHOST_TUns64 delay, - GHOST_TUns64 interval, - GHOST_TimerProcPtr timerProc, - GHOST_TUserDataPtr userData); + GHOST_TUns64 delay, + GHOST_TUns64 interval, + GHOST_TimerProcPtr timerProc, + GHOST_TUserDataPtr userData); /** * Removes a timer. @@ -125,11 +125,11 @@ extern GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_RemoveTimer(GHOST_SystemHandle systemhandle, - GHOST_TimerTaskHandle timertaskhandle); + GHOST_TimerTaskHandle timertaskhandle); /*************************************************************************************** - ** Display/window management functionality - ***************************************************************************************/ +** Display/window management functionality +***************************************************************************************/ /** * Returns the number of displays on this system. @@ -146,8 +146,8 @@ extern GHOST_TUns8 GHOST_GetNumDisplays(GHOST_SystemHandle systemhandle); * @return void. */ extern void GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, - GHOST_TUns32* width, - GHOST_TUns32* height); + GHOST_TUns32 *width, + GHOST_TUns32 *height); /** * Create a new window. @@ -166,15 +166,15 @@ extern void GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, * @return A handle to the new window ( == NULL if creation failed). */ extern GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, - const char* title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const int stereoVisual, - const GHOST_TUns16 numOfAASamples); + const char *title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const int stereoVisual, + const GHOST_TUns16 numOfAASamples); /** * Returns the window user data. @@ -189,7 +189,7 @@ extern GHOST_TUserDataPtr GHOST_GetWindowUserData(GHOST_WindowHandle windowhandl * @param data The window user data. */ extern void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, - GHOST_TUserDataPtr userdata); + GHOST_TUserDataPtr userdata); /** * Dispose a window. @@ -198,7 +198,7 @@ extern void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_DisposeWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle windowhandle); + GHOST_WindowHandle windowhandle); /** * Returns whether a window is valid. @@ -207,7 +207,7 @@ extern GHOST_TSuccess GHOST_DisposeWindow(GHOST_SystemHandle systemhandle, * @return Indication of validity. */ extern int GHOST_ValidWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle windowhandle); + GHOST_WindowHandle windowhandle); /** * Begins full screen mode. @@ -217,8 +217,8 @@ extern int GHOST_ValidWindow(GHOST_SystemHandle systemhandle, * This window is invalid after full screen has been ended. */ extern GHOST_WindowHandle GHOST_BeginFullScreen(GHOST_SystemHandle systemhandle, - GHOST_DisplaySetting* setting, - const int stereoVisual); + GHOST_DisplaySetting *setting, + const int stereoVisual); /** * Ends full screen mode. @@ -235,8 +235,8 @@ extern GHOST_TSuccess GHOST_EndFullScreen(GHOST_SystemHandle systemhandle); extern int GHOST_GetFullScreen(GHOST_SystemHandle systemhandle); /*************************************************************************************** - ** Event management functionality - ***************************************************************************************/ +** Event management functionality +***************************************************************************************/ /** * Retrieves events from the system and stores them in the queue. @@ -261,7 +261,7 @@ extern int GHOST_DispatchEvents(GHOST_SystemHandle systemhandle); * @return Indication of success. */ extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, - GHOST_EventConsumerHandle consumerhandle); + GHOST_EventConsumerHandle consumerhandle); /** * Remove the given event consumer to our list. @@ -270,11 +270,11 @@ extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_RemoveEventConsumer(GHOST_SystemHandle systemhandle, - GHOST_EventConsumerHandle consumerhandle); + GHOST_EventConsumerHandle consumerhandle); /*************************************************************************************** - ** Progress bar functionality - ***************************************************************************************/ +** Progress bar functionality +***************************************************************************************/ /** * Sets the progress bar value displayed in the window/application icon @@ -290,8 +290,8 @@ extern GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle, floa extern GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle); /*************************************************************************************** - ** Cursor management functionality - ***************************************************************************************/ +** Cursor management functionality +***************************************************************************************/ /** * Returns the current cursor shape. @@ -307,7 +307,7 @@ extern GHOST_TStandardCursor GHOST_GetCursorShape(GHOST_WindowHandle windowhandl * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetCursorShape(GHOST_WindowHandle windowhandle, - GHOST_TStandardCursor cursorshape); + GHOST_TStandardCursor cursorshape); /** * Set the shape of the cursor to a custom cursor. @@ -319,10 +319,10 @@ extern GHOST_TSuccess GHOST_SetCursorShape(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetCustomCursorShape(GHOST_WindowHandle windowhandle, - GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], - int hotX, - int hotY); + GHOST_TUns8 bitmap[16][2], + GHOST_TUns8 mask[16][2], + int hotX, + int hotY); /** * Set the shape of the cursor to a custom cursor of specified size. * @param windowhandle The handle to the window @@ -333,13 +333,13 @@ extern GHOST_TSuccess GHOST_SetCustomCursorShape(GHOST_WindowHandle windowhandle * @param hotY The Y coordinate of the cursor hotspot. * @param fg_color, bg_color Colors of the cursor * @return Indication of success. - */ + */ extern GHOST_TSuccess GHOST_SetCustomCursorShapeEx(GHOST_WindowHandle windowhandle, - GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, int sizey, - int hotX, int hotY, - int fg_color, int bg_color ); + GHOST_TUns8 *bitmap, + GHOST_TUns8 *mask, + int sizex, int sizey, + int hotX, int hotY, + int fg_color, int bg_color); /** * Returns the visibility state of the cursor. @@ -355,7 +355,7 @@ extern int GHOST_GetCursorVisibility(GHOST_WindowHandle windowhandle); * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetCursorVisibility(GHOST_WindowHandle windowhandle, - int visible); + int visible); /** * Returns the current location of the cursor (location in screen coordinates) @@ -365,8 +365,8 @@ extern GHOST_TSuccess GHOST_SetCursorVisibility(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_GetCursorPosition(GHOST_SystemHandle systemhandle, - GHOST_TInt32* x, - GHOST_TInt32* y); + GHOST_TInt32 *x, + GHOST_TInt32 *y); /** * Updates the location of the cursor (location in screen coordinates). @@ -377,8 +377,8 @@ extern GHOST_TSuccess GHOST_GetCursorPosition(GHOST_SystemHandle systemhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, - GHOST_TInt32 x, - GHOST_TInt32 y); + GHOST_TInt32 x, + GHOST_TInt32 y); /** * Grabs the cursor for a modal operation, to keep receiving @@ -390,12 +390,12 @@ extern GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, - GHOST_TGrabCursorMode mode, - int* bounds); + GHOST_TGrabCursorMode mode, + int *bounds); /*************************************************************************************** - ** Access to mouse button and keyboard states. - ***************************************************************************************/ +** Access to mouse button and keyboard states. +***************************************************************************************/ /** * Returns the state of a modifier key (ouside the message queue). @@ -405,8 +405,8 @@ extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_GetModifierKeyState(GHOST_SystemHandle systemhandle, - GHOST_TModifierKeyMask mask, - int* isDown); + GHOST_TModifierKeyMask mask, + int *isDown); /** * Returns the state of a mouse button (ouside the message queue). @@ -416,13 +416,13 @@ extern GHOST_TSuccess GHOST_GetModifierKeyState(GHOST_SystemHandle systemhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle, - GHOST_TButtonMask mask, - int* isDown); + GHOST_TButtonMask mask, + int *isDown); /*************************************************************************************** - ** Drag'n'drop operations - ***************************************************************************************/ +** Drag'n'drop operations +***************************************************************************************/ /** * Tells if the ongoing drag'n'drop object can be accepted upon mouse drop @@ -472,7 +472,7 @@ extern GHOST_TimerProcPtr GHOST_GetTimerProc(GHOST_TimerTaskHandle timertaskhand * @param timerProc The timer callback. */ extern void GHOST_SetTimerProc(GHOST_TimerTaskHandle timertaskhandle, - GHOST_TimerProcPtr timerProc); + GHOST_TimerProcPtr timerProc); /** * Returns the timer user data. @@ -487,7 +487,7 @@ extern GHOST_TUserDataPtr GHOST_GetTimerTaskUserData(GHOST_TimerTaskHandle timer * @param data The timer user data. */ extern void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle, - GHOST_TUserDataPtr userData); + GHOST_TUserDataPtr userData); /** * Returns indication as to whether the window is valid. @@ -510,7 +510,7 @@ extern GHOST_TDrawingContextType GHOST_GetDrawingContextType(GHOST_WindowHandle * @return Indication as to whether installation has succeeded. */ extern GHOST_TSuccess GHOST_SetDrawingContextType(GHOST_WindowHandle windowhandle, - GHOST_TDrawingContextType type); + GHOST_TDrawingContextType type); /** * Sets the title displayed in the title bar. @@ -518,7 +518,7 @@ extern GHOST_TSuccess GHOST_SetDrawingContextType(GHOST_WindowHandle windowhandl * @param title The title to display in the title bar. */ extern void GHOST_SetTitle(GHOST_WindowHandle windowhandle, - const char* title); + const char *title); /** * Returns the title displayed in the title bar. The title @@ -527,7 +527,7 @@ extern void GHOST_SetTitle(GHOST_WindowHandle windowhandle, * @param windowhandle The handle to the window * @return The title, free with free(). */ -extern char* GHOST_GetTitle(GHOST_WindowHandle windowhandle); +extern char *GHOST_GetTitle(GHOST_WindowHandle windowhandle); /** * Returns the window rectangle dimensions. @@ -558,7 +558,7 @@ void GHOST_DisposeRectangle(GHOST_RectangleHandle rectanglehandle); * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetClientWidth(GHOST_WindowHandle windowhandle, - GHOST_TUns32 width); + GHOST_TUns32 width); /** * Resizes client rectangle height. @@ -567,7 +567,7 @@ extern GHOST_TSuccess GHOST_SetClientWidth(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetClientHeight(GHOST_WindowHandle windowhandle, - GHOST_TUns32 height); + GHOST_TUns32 height); /** * Resizes client rectangle. @@ -577,8 +577,8 @@ extern GHOST_TSuccess GHOST_SetClientHeight(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetClientSize(GHOST_WindowHandle windowhandle, - GHOST_TUns32 width, - GHOST_TUns32 height); + GHOST_TUns32 width, + GHOST_TUns32 height); /** * Converts a point in screen coordinates to client rectangle coordinates @@ -589,10 +589,10 @@ extern GHOST_TSuccess GHOST_SetClientSize(GHOST_WindowHandle windowhandle, * @param outY The y-coordinate in the client rectangle. */ extern void GHOST_ScreenToClient(GHOST_WindowHandle windowhandle, - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32* outX, - GHOST_TInt32* outY); + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32 *outX, + GHOST_TInt32 *outY); /** * Converts a point in screen coordinates to client rectangle coordinates @@ -603,10 +603,10 @@ extern void GHOST_ScreenToClient(GHOST_WindowHandle windowhandle, * @param outY The y-coordinate on the screen. */ extern void GHOST_ClientToScreen(GHOST_WindowHandle windowhandle, - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32* outX, - GHOST_TInt32* outY); + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32 *outX, + GHOST_TInt32 *outY); /** * Returns the state of the window (normal, minimized, maximized). @@ -622,7 +622,7 @@ extern GHOST_TWindowState GHOST_GetWindowState(GHOST_WindowHandle windowhandle); * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetWindowState(GHOST_WindowHandle windowhandle, - GHOST_TWindowState state); + GHOST_TWindowState state); /** @@ -632,7 +632,7 @@ extern GHOST_TSuccess GHOST_SetWindowState(GHOST_WindowHandle windowhandle, * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetWindowModifiedState(GHOST_WindowHandle windowhandle, - GHOST_TUns8 isUnsavedChanges); + GHOST_TUns8 isUnsavedChanges); /** * Sets the order of the window (bottom, top). @@ -641,7 +641,7 @@ extern GHOST_TSuccess GHOST_SetWindowModifiedState(GHOST_WindowHandle windowhand * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetWindowOrder(GHOST_WindowHandle windowhandle, - GHOST_TWindowOrder order); + GHOST_TWindowOrder order); /** * Swaps front and back buffers of a window. @@ -694,10 +694,10 @@ extern GHOST_TInt32 GHOST_GetHeightRectangle(GHOST_RectangleHandle rectanglehand * @param b Pointer to return bottom coordinate in. */ extern void GHOST_GetRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32* l, - GHOST_TInt32* t, - GHOST_TInt32* r, - GHOST_TInt32* b); + GHOST_TInt32 *l, + GHOST_TInt32 *t, + GHOST_TInt32 *r, + GHOST_TInt32 *b); /** * Sets all members of the rectangle. @@ -708,10 +708,10 @@ extern void GHOST_GetRectangle(GHOST_RectangleHandle rectanglehandle, * @param b requested bottom coordinate of the rectangle */ extern void GHOST_SetRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 l, - GHOST_TInt32 t, - GHOST_TInt32 r, - GHOST_TInt32 b); + GHOST_TInt32 l, + GHOST_TInt32 t, + GHOST_TInt32 r, + GHOST_TInt32 b); /** * Returns whether this rectangle is empty. @@ -736,7 +736,7 @@ extern GHOST_TSuccess GHOST_IsValidRectangle(GHOST_RectangleHandle rectanglehand * @param i The amount of offset given to each extreme (negative values shrink the rectangle). */ extern void GHOST_InsetRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 i); + GHOST_TInt32 i); /** * Does a union of the rectangle given and this rectangle. @@ -745,7 +745,7 @@ extern void GHOST_InsetRectangle(GHOST_RectangleHandle rectanglehandle, * @param r The rectangle that is input for the union operation. */ extern void GHOST_UnionRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_RectangleHandle anotherrectanglehandle); + GHOST_RectangleHandle anotherrectanglehandle); /** * Grows the rectangle to included a point. @@ -754,8 +754,8 @@ extern void GHOST_UnionRectangle(GHOST_RectangleHandle rectanglehandle, * @param y The y-coordinate of the point. */ extern void GHOST_UnionPointRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 x, - GHOST_TInt32 y); + GHOST_TInt32 x, + GHOST_TInt32 y); /** * Returns whether the point is inside this rectangle. @@ -766,8 +766,8 @@ extern void GHOST_UnionPointRectangle(GHOST_RectangleHandle rectanglehandle, * @return intean value (true if point is inside). */ extern GHOST_TSuccess GHOST_IsInsideRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 x, - GHOST_TInt32 y); + GHOST_TInt32 x, + GHOST_TInt32 y); /** * Returns whether the rectangle is inside this rectangle. @@ -776,7 +776,7 @@ extern GHOST_TSuccess GHOST_IsInsideRectangle(GHOST_RectangleHandle rectanglehan * @return visibility (not, partially or fully visible). */ extern GHOST_TVisibility GHOST_GetRectangleVisibility(GHOST_RectangleHandle rectanglehandle, - GHOST_RectangleHandle anotherrectanglehandle); + GHOST_RectangleHandle anotherrectanglehandle); /** * Sets rectangle members. @@ -786,8 +786,8 @@ extern GHOST_TVisibility GHOST_GetRectangleVisibility(GHOST_RectangleHandle rect * @param cy requested center y-coordinate of the rectangle */ extern void GHOST_SetCenterRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 cx, - GHOST_TInt32 cy); + GHOST_TInt32 cx, + GHOST_TInt32 cy); /** * Sets rectangle members. @@ -800,10 +800,10 @@ extern void GHOST_SetCenterRectangle(GHOST_RectangleHandle rectanglehandle, * @param h requested height of the rectangle */ extern void GHOST_SetRectangleCenter(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 cx, - GHOST_TInt32 cy, - GHOST_TInt32 w, - GHOST_TInt32 h); + GHOST_TInt32 cx, + GHOST_TInt32 cy, + GHOST_TInt32 w, + GHOST_TInt32 h); /** * Clips a rectangle. @@ -814,14 +814,14 @@ extern void GHOST_SetRectangleCenter(GHOST_RectangleHandle rectanglehandle, * @return whether clipping has occurred */ extern GHOST_TSuccess GHOST_ClipRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_RectangleHandle anotherrectanglehandle); + GHOST_RectangleHandle anotherrectanglehandle); /** * Return the data from the clipboad * @param return the selection instead, X11 only feature * @return clipboard data */ -extern GHOST_TUns8* GHOST_getClipboard(int selection); +extern GHOST_TUns8 *GHOST_getClipboard(int selection); /** * Put data to the Clipboard diff --git a/intern/ghost/GHOST_IEvent.h b/intern/ghost/GHOST_IEvent.h index 05bd3553e01..3c3111a2e6d 100644 --- a/intern/ghost/GHOST_IEvent.h +++ b/intern/ghost/GHOST_IEvent.h @@ -77,7 +77,7 @@ public: * or NULL if it is a 'system' event. * @return The generating window. */ - virtual GHOST_IWindow* getWindow() = 0; + virtual GHOST_IWindow *getWindow() = 0; /** * Returns the event data. @@ -87,8 +87,12 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GHOST:GHOST_IEvent"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { + return MEM_mallocN(num_bytes, "GHOST:GHOST_IEvent"); + } + void operator delete(void *mem) { + MEM_freeN(mem); + } #endif }; diff --git a/intern/ghost/GHOST_IEventConsumer.h b/intern/ghost/GHOST_IEventConsumer.h index 043cb27d1b2..d437f219f8d 100644 --- a/intern/ghost/GHOST_IEventConsumer.h +++ b/intern/ghost/GHOST_IEventConsumer.h @@ -61,7 +61,7 @@ public: * @param event The event that can be handled or ignored. * @return Indication as to whether the event was handled. */ - virtual bool processEvent(GHOST_IEvent* event) = 0; + virtual bool processEvent(GHOST_IEvent *event) = 0; #ifdef WITH_CXX_GUARDEDALLOC public: diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h index 890917f9822..bd4f3aed5aa 100644 --- a/intern/ghost/GHOST_ISystem.h +++ b/intern/ghost/GHOST_ISystem.h @@ -129,12 +129,12 @@ class GHOST_IEventConsumer; * There should be only one system class in an application. * Therefore, the routines to create and dispose the system are static. * Provides: - * -# Time(r) management. - * -# Display/window management (windows are only created on the main display). - * -# Event management. - * -# Cursor shape management (no custom cursors for now). - * -# Access to the state of the mouse buttons and the keyboard. - * -# Menus for windows with events generated when they are accessed (this is + * -# Time(r) management. + * -# Display/window management (windows are only created on the main display). + * -# Event management. + * -# Cursor shape management (no custom cursors for now). + * -# Access to the state of the mouse buttons and the keyboard. + * -# Menus for windows with events generated when they are accessed (this is * work in progress). * @author Maarten Gribnau * @date May 30, 2001 @@ -158,25 +158,27 @@ public: * Returns a pointer to the one and only system (nil if it hasn't been created). * @return A pointer to the system. */ - static GHOST_ISystem* getSystem(); + static GHOST_ISystem *getSystem(); protected: /** * Constructor. * Protected default constructor to force use of static createSystem member. */ - GHOST_ISystem() {} + GHOST_ISystem() { + } /** * Destructor. * Protected default constructor to force use of static dispose member. */ - virtual ~GHOST_ISystem() {} + virtual ~GHOST_ISystem() { + } public: /*************************************************************************************** - ** Time(r) functionality - ***************************************************************************************/ + ** Time(r) functionality + ***************************************************************************************/ /** * Returns the system time. @@ -196,7 +198,7 @@ public: * @param userData Placeholder for user data. * @return A timer task (0 if timer task installation failed). */ - virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay, + virtual GHOST_ITimerTask *installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0) = 0; @@ -206,17 +208,17 @@ public: * @param timerTask Timer task to be removed. * @return Indication of success. */ - virtual GHOST_TSuccess removeTimer(GHOST_ITimerTask* timerTask) = 0; + virtual GHOST_TSuccess removeTimer(GHOST_ITimerTask *timerTask) = 0; /*************************************************************************************** - ** Display/window management functionality - ***************************************************************************************/ + ** Display/window management functionality + ***************************************************************************************/ /** * Returns the number of displays on this system. * @return The number of displays. */ - virtual GHOST_TUns8 getNumDisplays() const = 0; + virtual GHOST_TUns8 getNumDisplays() const = 0; /** * Returns the dimensions of the main display on this system. @@ -237,30 +239,30 @@ public: * @param type The type of drawing context installed in this window. * @param stereoVisual Create a stereo visual for quad buffered stereo. * @param numOfAASamples Number of samples used for AA (zero if no AA) - * @param parentWindow Parent (embedder) window + * @param parentWindow Parent (embedder) window * @return The new window (or 0 if creation failed). */ - virtual GHOST_IWindow* createWindow( - const STR_String& title, - GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, - GHOST_TWindowState state, GHOST_TDrawingContextType type, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0, - const GHOST_TEmbedderWindowID parentWindow = 0) = 0; + virtual GHOST_IWindow *createWindow( + const STR_String& title, + GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, + GHOST_TWindowState state, GHOST_TDrawingContextType type, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0, + const GHOST_TEmbedderWindowID parentWindow = 0) = 0; /** * Dispose a window. * @param window Pointer to the window to be disposed. * @return Indication of success. */ - virtual GHOST_TSuccess disposeWindow(GHOST_IWindow* window) = 0; + virtual GHOST_TSuccess disposeWindow(GHOST_IWindow *window) = 0; /** * Returns whether a window is valid. * @param window Pointer to the window to be checked. * @return Indication of validity. */ - virtual bool validWindow(GHOST_IWindow* window) = 0; + virtual bool validWindow(GHOST_IWindow *window) = 0; /** * Begins full screen mode. @@ -269,8 +271,8 @@ public: * This window is invalid after full screen has been ended. * @return Indication of success. */ - virtual GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, - const bool stereoVisual, const GHOST_TUns16 numOfAASamples=0) = 0; + virtual GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window, + const bool stereoVisual, const GHOST_TUns16 numOfAASamples = 0) = 0; /** * Updates the resolution while in fullscreen mode. @@ -279,7 +281,7 @@ public: * * @return Indication of success. */ - virtual GHOST_TSuccess updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window) = 0; + virtual GHOST_TSuccess updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window) = 0; /** * Ends full screen mode. @@ -294,8 +296,8 @@ public: virtual bool getFullScreen(void) = 0; /*************************************************************************************** - ** Event management functionality - ***************************************************************************************/ + ** Event management functionality + ***************************************************************************************/ /** * Retrieves events from the system and stores them in the queue. @@ -315,18 +317,18 @@ public: * @param consumer The event consumer to add. * @return Indication of success. */ - virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer) = 0; + virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer *consumer) = 0; /** * Removes the given event consumer to our list. * @param consumer The event consumer to remove. * @return Indication of success. */ - virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer* consumer) = 0; + virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer *consumer) = 0; /*************************************************************************************** - ** Cursor management functionality - ***************************************************************************************/ + ** Cursor management functionality + ***************************************************************************************/ /** * Returns the current location of the cursor (location in screen coordinates) @@ -346,8 +348,8 @@ public: virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) = 0; /*************************************************************************************** - ** Access to mouse button and keyboard states. - ***************************************************************************************/ + ** Access to mouse button and keyboard states. + ***************************************************************************************/ /** * Returns the state of a modifier key (ouside the message queue). @@ -377,15 +379,15 @@ public: virtual int toggleConsole(int action) = 0; /*************************************************************************************** - ** Access to clipboard. - ***************************************************************************************/ + ** Access to clipboard. + ***************************************************************************************/ /** * Returns the selection buffer * @return Returns "unsinged char" from X11 XA_CUT_BUFFER0 buffer * */ - virtual GHOST_TUns8* getClipboard(bool selection) const = 0; + virtual GHOST_TUns8 *getClipboard(bool selection) const = 0; /** * Put data to the Clipboard @@ -396,7 +398,7 @@ public: * Confirms quitting he program when there is just one window left open * in the application */ - virtual int confirmQuit(GHOST_IWindow * window) const = 0; + virtual int confirmQuit(GHOST_IWindow *window) const = 0; protected: /** * Initialize the system. @@ -411,12 +413,16 @@ protected: virtual GHOST_TSuccess exit() = 0; /** The one and only system */ - static GHOST_ISystem* m_system; + static GHOST_ISystem *m_system; #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GHOST:GHOST_ISystem"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { + return MEM_mallocN(num_bytes, "GHOST:GHOST_ISystem"); + } + void operator delete(void *mem) { + MEM_freeN(mem); + } #endif }; diff --git a/intern/ghost/GHOST_ISystemPaths.h b/intern/ghost/GHOST_ISystemPaths.h index dea5436c485..f610fde4582 100644 --- a/intern/ghost/GHOST_ISystemPaths.h +++ b/intern/ghost/GHOST_ISystemPaths.h @@ -52,20 +52,22 @@ public: * Returns a pointer to the one and only system (nil if it hasn't been created). * @return A pointer to the system. */ - static GHOST_ISystemPaths* get(); + static GHOST_ISystemPaths *get(); protected: /** * Constructor. * Protected default constructor to force use of static createSystem member. */ - GHOST_ISystemPaths() {} + GHOST_ISystemPaths() { + } /** * Destructor. * Protected default constructor to force use of static dispose member. */ - virtual ~GHOST_ISystemPaths() {} + virtual ~GHOST_ISystemPaths() { + } public: /** @@ -73,29 +75,29 @@ public: * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). */ - virtual const GHOST_TUns8* getSystemDir() const = 0; + virtual const GHOST_TUns8 *getSystemDir() const = 0; /** * Determine the base dir in which user configuration is stored, not including versioning. * If needed, it will create the base directory. * @return Unsigned char string pointing to user dir (eg ~/.blender/). */ - virtual const GHOST_TUns8* getUserDir() const = 0; + virtual const GHOST_TUns8 *getUserDir() const = 0; /** - * Determine the directory of the current binary - * @return Unsigned char string pointing to the binary dir - */ - virtual const GHOST_TUns8* getBinaryDir() const = 0; + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8 *getBinaryDir() const = 0; /** * Add the file to the operating system most recently used files */ - virtual void addToSystemRecentFiles(const char* filename) const = 0; + virtual void addToSystemRecentFiles(const char *filename) const = 0; private: /** The one and only system paths*/ - static GHOST_ISystemPaths* m_systemPaths; + static GHOST_ISystemPaths *m_systemPaths; }; #endif diff --git a/intern/ghost/GHOST_ITimerTask.h b/intern/ghost/GHOST_ITimerTask.h index bae41cf84d4..bb4a81be5f8 100644 --- a/intern/ghost/GHOST_ITimerTask.h +++ b/intern/ghost/GHOST_ITimerTask.h @@ -86,8 +86,12 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GHOST:GHOST_ITimerTask"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { + return MEM_mallocN(num_bytes, "GHOST:GHOST_ITimerTask"); + } + void operator delete(void *mem) { + MEM_freeN(mem); + } #endif }; diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h index 4ce8800fef6..e754883504d 100644 --- a/intern/ghost/GHOST_IWindow.h +++ b/intern/ghost/GHOST_IWindow.h @@ -70,13 +70,13 @@ public: * Returns indication as to whether the window is valid. * @return The validity of the window. */ - virtual bool getValid() const = 0; + virtual bool getValid() const = 0; /** * Returns the associated OS object/handle * @return The associated OS object/handle */ - virtual void* getOSWindow() const = 0; + virtual void *getOSWindow() const = 0; /** * Returns the type of drawing context used in this window. @@ -108,33 +108,33 @@ public: * These are screen coordinates. * @param bounds The bounding rectangle of the window. */ - virtual void getWindowBounds(GHOST_Rect& bounds) const = 0; + virtual void getWindowBounds(GHOST_Rect& bounds) const = 0; /** * Returns the client rectangle dimensions. * The left and top members of the rectangle are always zero. * @param bounds The bounding rectangle of the client area of the window. */ - virtual void getClientBounds(GHOST_Rect& bounds) const = 0; + virtual void getClientBounds(GHOST_Rect& bounds) const = 0; /** * Resizes client rectangle width. * @param width The new width of the client area of the window. */ - virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width) = 0; + virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width) = 0; /** * Resizes client rectangle height. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height) = 0; + virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height) = 0; /** * Resizes client rectangle. * @param width The new width of the client area of the window. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height) = 0; + virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height) = 0; /** * Converts a point in screen coordinates to client rectangle coordinates @@ -143,7 +143,7 @@ public: * @param outX The x-coordinate in the client rectangle. * @param outY The y-coordinate in the client rectangle. */ - virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const = 0; + virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const = 0; /** * Converts a point in screen coordinates to client rectangle coordinates @@ -152,7 +152,7 @@ public: * @param outX The x-coordinate on the screen. * @param outY The y-coordinate on the screen. */ - virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const = 0; + virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const = 0; /** * Tells if the ongoing drag'n'drop object can be accepted upon mouse drop @@ -232,14 +232,14 @@ public: * Returns the tablet data (pressure etc). * @return The tablet data (pressure etc). */ - virtual const GHOST_TabletData* GetTabletData() = 0; + virtual const GHOST_TabletData *GetTabletData() = 0; /*************************************************************************************** - ** Progress bar functionality - ***************************************************************************************/ + ** Progress bar functionality + ***************************************************************************************/ /** - * Sets the progress bar value displayed in the window/application icon + * Sets the progress bar value displayed in the window/application icon * @param progress The progress % */ virtual GHOST_TSuccess setProgressBar(float progress) = 0; @@ -250,8 +250,8 @@ public: virtual GHOST_TSuccess endProgressBar() = 0; /*************************************************************************************** - ** Cursor management functionality - ***************************************************************************************/ + ** Cursor management functionality + ***************************************************************************************/ /** * Returns the current cursor shape. @@ -275,15 +275,15 @@ public: * @return Indication of success. */ virtual GHOST_TSuccess setCustomCursorShape(GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], - int hotX, - int hotY) = 0; + GHOST_TUns8 mask[16][2], + int hotX, + int hotY) = 0; virtual GHOST_TSuccess setCustomCursorShape(GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, int sizey, - int hotX, int hotY, - int fg_color, int bg_color) = 0; + GHOST_TUns8 *mask, + int sizex, int sizey, + int hotX, int hotY, + int fg_color, int bg_color) = 0; /** * Returns the visibility state of the cursor. diff --git a/intern/ghost/GHOST_Path-api.h b/intern/ghost/GHOST_Path-api.h index f1b79a98082..811f39bb023 100644 --- a/intern/ghost/GHOST_Path-api.h +++ b/intern/ghost/GHOST_Path-api.h @@ -30,7 +30,7 @@ */ -#ifndef __GHOST_PATH_API_H__ +#ifndef __GHOST_PATH_API_H__ #define __GHOST_PATH_API_H__ #include "GHOST_Types.h" @@ -58,25 +58,25 @@ extern GHOST_TSuccess GHOST_DisposeSystemPaths(void); * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). */ -extern const GHOST_TUns8* GHOST_getSystemDir(void); +extern const GHOST_TUns8 *GHOST_getSystemDir(void); /** * Determine the base dir in which user configuration is stored, not including versioning. * @return Unsigned char string pointing to user dir (eg ~). */ -extern const GHOST_TUns8* GHOST_getUserDir(void); +extern const GHOST_TUns8 *GHOST_getUserDir(void); /** * Determine the dir in which the binary file is found. * @return Unsigned char string pointing to binary dir (eg ~/usr/local/bin/). */ -extern const GHOST_TUns8* GHOST_getBinaryDir(void); +extern const GHOST_TUns8 *GHOST_getBinaryDir(void); /** -* Add the file to the operating system most recently used files -*/ -extern void GHOST_addToSystemRecentFiles(const char* filename); + * Add the file to the operating system most recently used files + */ +extern void GHOST_addToSystemRecentFiles(const char *filename); #ifdef __cplusplus } diff --git a/intern/ghost/GHOST_Rect.h b/intern/ghost/GHOST_Rect.h index 30d9d16b701..90678c6dfa2 100644 --- a/intern/ghost/GHOST_Rect.h +++ b/intern/ghost/GHOST_Rect.h @@ -55,20 +55,23 @@ public: * @param r requested right coordinate of the rectangle * @param b requested bottom coordinate of the rectangle */ - GHOST_Rect(GHOST_TInt32 l=0, GHOST_TInt32 t=0, GHOST_TInt32 r=0, GHOST_TInt32 b=0) - : m_l(l), m_t(t), m_r(r), m_b(b) {} + GHOST_Rect(GHOST_TInt32 l = 0, GHOST_TInt32 t = 0, GHOST_TInt32 r = 0, GHOST_TInt32 b = 0) + : m_l(l), m_t(t), m_r(r), m_b(b) + {} /** * Copy constructor. * @param r rectangle to copy */ GHOST_Rect(const GHOST_Rect& r) - : m_l(r.m_l), m_t(r.m_t), m_r(r.m_r), m_b(r.m_b) {} + : m_l(r.m_l), m_t(r.m_t), m_r(r.m_r), m_b(r.m_b) + {} /** * Destructor. */ - virtual ~GHOST_Rect() {}; + virtual ~GHOST_Rect() + {}; /** * Access to rectangle width. @@ -155,7 +158,7 @@ public: * @param cx requested center x-coordinate of the rectangle * @param cy requested center y-coordinate of the rectangle */ - virtual void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy); + virtual void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy); /** * Sets rectangle members. @@ -166,7 +169,7 @@ public: * @param w requested width of the rectangle * @param h requested height of the rectangle */ - virtual void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy, GHOST_TInt32 w, GHOST_TInt32 h); + virtual void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy, GHOST_TInt32 w, GHOST_TInt32 h); /** * Clips a rectangle. @@ -175,7 +178,7 @@ public: * @param r the rectangle to clip * @return whether clipping has occurred */ - virtual bool clip(GHOST_Rect& r) const; + virtual bool clip(GHOST_Rect& r) const; /** Left coordinate of the rectangle */ GHOST_TInt32 m_l; @@ -209,7 +212,7 @@ inline void GHOST_Rect::set(GHOST_TInt32 l, GHOST_TInt32 t, GHOST_TInt32 r, GHOS m_l = l; m_t = t; m_r = r; m_b = b; } -inline bool GHOST_Rect::isEmpty() const +inline bool GHOST_Rect::isEmpty() const { return (getWidth() == 0) || (getHeight() == 0); } @@ -237,18 +240,18 @@ inline void GHOST_Rect::unionPoint(GHOST_TInt32 x, GHOST_TInt32 y) #include inline void GHOST_Rect::wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs) { - GHOST_TInt32 w= getWidth(); - GHOST_TInt32 h= getHeight(); + GHOST_TInt32 w = getWidth(); + GHOST_TInt32 h = getHeight(); /* highly unlikely but avoid eternal loop */ - if (w-ofs*2 <= 0 || h-ofs*2 <= 0) { + if (w - ofs * 2 <= 0 || h - ofs * 2 <= 0) { return; } - while(x-ofs < m_l) x+= w-(ofs*2); - while(y-ofs < m_t) y+= h-(ofs*2); - while(x+ofs > m_r) x-= w-(ofs*2); - while(y+ofs > m_b) y-= h-(ofs*2); + while (x - ofs < m_l) x += w - (ofs * 2); + while (y - ofs < m_t) y += h - (ofs * 2); + while (x + ofs > m_r) x -= w - (ofs * 2); + while (y + ofs > m_b) y -= h - (ofs * 2); } inline bool GHOST_Rect::isInside(GHOST_TInt32 x, GHOST_TInt32 y) const diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h index 583bfdf1f84..7614cb80e00 100644 --- a/intern/ghost/GHOST_Types.h +++ b/intern/ghost/GHOST_Types.h @@ -39,22 +39,22 @@ #define GHOST_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name -typedef char GHOST_TInt8; -typedef unsigned char GHOST_TUns8; -typedef short GHOST_TInt16; -typedef unsigned short GHOST_TUns16; -typedef int GHOST_TInt32; -typedef unsigned int GHOST_TUns32; +typedef char GHOST_TInt8; +typedef unsigned char GHOST_TUns8; +typedef short GHOST_TInt16; +typedef unsigned short GHOST_TUns16; +typedef int GHOST_TInt32; +typedef unsigned int GHOST_TUns32; #if defined(WIN32) && !defined(FREE_WINDOWS) -typedef __int64 GHOST_TInt64; -typedef unsigned __int64 GHOST_TUns64; +typedef __int64 GHOST_TInt64; +typedef unsigned __int64 GHOST_TUns64; #else -typedef long long GHOST_TInt64; -typedef unsigned long long GHOST_TUns64; +typedef long long GHOST_TInt64; +typedef unsigned long long GHOST_TUns64; #endif -typedef void* GHOST_TUserDataPtr; +typedef void *GHOST_TUserDataPtr; typedef enum { @@ -77,9 +77,9 @@ typedef enum { typedef struct GHOST_TabletData { GHOST_TTabletMode Active; /* 0=None, 1=Stylus, 2=Eraser */ - float Pressure; /* range 0.0 (not touching) to 1.0 (full pressure) */ - float Xtilt; /* range 0.0 (upright) to 1.0 (tilted fully against the tablet surface) */ - float Ytilt; /* as above */ + float Pressure; /* range 0.0 (not touching) to 1.0 (full pressure) */ + float Xtilt; /* range 0.0 (upright) to 1.0 (tilted fully against the tablet surface) */ + float Ytilt; /* as above */ } GHOST_TabletData; @@ -152,14 +152,14 @@ typedef enum { typedef enum { GHOST_kEventUnknown = 0, - GHOST_kEventCursorMove, /// Mouse move event - GHOST_kEventButtonDown, /// Mouse button event - GHOST_kEventButtonUp, /// Mouse button event - GHOST_kEventWheel, /// Mouse wheel event - GHOST_kEventTrackpad, /// Trackpad event + GHOST_kEventCursorMove, /// Mouse move event + GHOST_kEventButtonDown, /// Mouse button event + GHOST_kEventButtonUp, /// Mouse button event + GHOST_kEventWheel, /// Mouse wheel event + GHOST_kEventTrackpad, /// Trackpad event - GHOST_kEventNDOFMotion, /// N degree of freedom device motion event - GHOST_kEventNDOFButton, /// N degree of freedom device button event + GHOST_kEventNDOFMotion, /// N degree of freedom device motion event + GHOST_kEventNDOFButton, /// N degree of freedom device button event GHOST_kEventKeyDown, GHOST_kEventKeyUp, @@ -289,8 +289,8 @@ typedef enum { GHOST_kKeyRightControl, GHOST_kKeyLeftAlt, GHOST_kKeyRightAlt, - GHOST_kKeyOS, // Command key on Apple, Windows key(s) on Windows - GHOST_kKeyGrLess , // German PC only! + GHOST_kKeyOS, // Command key on Apple, Windows key(s) on Windows + GHOST_kKeyGrLess, // German PC only! GHOST_kKeyCapsLock, GHOST_kKeyNumLock, @@ -363,13 +363,13 @@ typedef enum { } GHOST_TKey; typedef enum { - GHOST_kGrabDisable = 0, /* grab not set */ - GHOST_kGrabNormal, /* no cursor adjustments */ - GHOST_kGrabWrap, /* wrap the mouse location to prevent limiting screen bounds */ - GHOST_kGrabHide, /* hide the mouse while grabbing and restore the original location on release (numbuts) */ + GHOST_kGrabDisable = 0, /* grab not set */ + GHOST_kGrabNormal, /* no cursor adjustments */ + GHOST_kGrabWrap, /* wrap the mouse location to prevent limiting screen bounds */ + GHOST_kGrabHide, /* hide the mouse while grabbing and restore the original location on release (numbuts) */ } GHOST_TGrabCursorMode; -typedef void* GHOST_TEventDataPtr; +typedef void *GHOST_TEventDataPtr; typedef struct { /** The x-coordinate of the cursor position. */ @@ -389,7 +389,7 @@ typedef struct { } GHOST_TEventWheelData; typedef enum { - GHOST_kTrackpadEventUnknown =0, + GHOST_kTrackpadEventUnknown = 0, GHOST_kTrackpadEventScroll, GHOST_kTrackpadEventRotate, GHOST_kTrackpadEventSwipe, /* Reserved, not used for now */ @@ -412,7 +412,7 @@ typedef struct { typedef enum { - GHOST_kDragnDropTypeUnknown =0, + GHOST_kDragnDropTypeUnknown = 0, GHOST_kDragnDropTypeFilenames, /*Array of strings representing file names (full path) */ GHOST_kDragnDropTypeString, /* Unformatted text UTF-8 string */ GHOST_kDragnDropTypeBitmap /*Bitmap image data */ @@ -440,7 +440,7 @@ typedef enum { GHOST_kInProgress, GHOST_kFinishing, GHOST_kFinished - } GHOST_TProgress; +} GHOST_TProgress; typedef struct { /** N-degree of freedom device data v3 [GSoC 2010] */ @@ -448,14 +448,14 @@ typedef struct { // These use blender standard view coordinates, with positive rotations being CCW about the axis. float tx, ty, tz; // translation float rx, ry, rz; // rotation: - // axis = (rx,ry,rz).normalized - // amount = (rx,ry,rz).magnitude [in revolutions, 1.0 = 360 deg] + // axis = (rx,ry,rz).normalized + // amount = (rx,ry,rz).magnitude [in revolutions, 1.0 = 360 deg] float dt; // time since previous NDOF Motion event GHOST_TProgress progress; // Starting, InProgress or Finishing (for modal handlers) } GHOST_TEventNDOFMotionData; typedef enum { GHOST_kPress, GHOST_kRelease } GHOST_TButtonAction; - // good for mouse or other buttons too, hmmm? +// good for mouse or other buttons too, hmmm? typedef struct { GHOST_TButtonAction action; @@ -464,7 +464,7 @@ typedef struct { typedef struct { /** The key code. */ - GHOST_TKey key; + GHOST_TKey key; /* ascii / utf8: both should always be set when possible, * - ascii may be '\0' however if the user presses a non ascii key @@ -476,20 +476,20 @@ typedef struct { * use ascii, unicode is ignored - campbell. */ /** The ascii code for the key event ('\0' if none). */ - char ascii; + char ascii; /** The unicode character. if the length is 6, not NULL terminated if all 6 are set */ - char utf8_buf[6]; + char utf8_buf[6]; } GHOST_TEventKeyData; typedef struct { /** Number of pixels on a line. */ - GHOST_TUns32 xPixels; + GHOST_TUns32 xPixels; /** Number of lines. */ - GHOST_TUns32 yPixels; + GHOST_TUns32 yPixels; /** Numberof bits per pixel. */ - GHOST_TUns32 bpp; + GHOST_TUns32 bpp; /** Refresh rate (in Hertz). */ - GHOST_TUns32 frequency; + GHOST_TUns32 frequency; } GHOST_DisplaySetting; @@ -509,10 +509,10 @@ typedef int GHOST_TEmbedderWindowID; */ #ifdef __cplusplus class GHOST_ITimerTask; -typedef void (*GHOST_TimerProcPtr)(GHOST_ITimerTask* task, GHOST_TUns64 time); +typedef void (*GHOST_TimerProcPtr)(GHOST_ITimerTask *task, GHOST_TUns64 time); #else struct GHOST_TimerTaskHandle__; -typedef void (*GHOST_TimerProcPtr)(struct GHOST_TimerTaskHandle__* task, GHOST_TUns64 time); +typedef void (*GHOST_TimerProcPtr)(struct GHOST_TimerTaskHandle__ *task, GHOST_TUns64 time); #endif #endif // __GHOST_TYPES_H__ diff --git a/intern/ghost/intern/GHOST_Buttons.h b/intern/ghost/intern/GHOST_Buttons.h index ea1cce574b8..edcf0102201 100644 --- a/intern/ghost/intern/GHOST_Buttons.h +++ b/intern/ghost/intern/GHOST_Buttons.h @@ -69,9 +69,9 @@ struct GHOST_Buttons { */ virtual void clear(); - GHOST_TUns8 m_ButtonLeft : 1; - GHOST_TUns8 m_ButtonMiddle : 1; - GHOST_TUns8 m_ButtonRight : 1; + GHOST_TUns8 m_ButtonLeft : 1; + GHOST_TUns8 m_ButtonMiddle : 1; + GHOST_TUns8 m_ButtonRight : 1; }; #endif // __GHOST_BUTTONS_H__ diff --git a/intern/ghost/intern/GHOST_CallbackEventConsumer.h b/intern/ghost/intern/GHOST_CallbackEventConsumer.h index e7a1aed507d..61aef742a48 100644 --- a/intern/ghost/intern/GHOST_CallbackEventConsumer.h +++ b/intern/ghost/intern/GHOST_CallbackEventConsumer.h @@ -51,8 +51,8 @@ public: * @param userData The data passed back though the call-back routine. */ GHOST_CallbackEventConsumer( - GHOST_EventCallbackProcPtr eventCallback, - GHOST_TUserDataPtr userData); + GHOST_EventCallbackProcPtr eventCallback, + GHOST_TUserDataPtr userData); /** * Destructor. @@ -66,13 +66,13 @@ public: * @param event The event that can be handled or ignored. * @return Indication as to whether the event was handled. */ - virtual bool processEvent(GHOST_IEvent* event); + virtual bool processEvent(GHOST_IEvent *event); protected: /** The call-back routine invoked. */ - GHOST_EventCallbackProcPtr m_eventCallback; + GHOST_EventCallbackProcPtr m_eventCallback; /** The data passed back though the call-back routine. */ - GHOST_TUserDataPtr m_userData; + GHOST_TUserDataPtr m_userData; }; #endif // __GHOST_CALLBACKEVENTCONSUMER_H__ diff --git a/intern/ghost/intern/GHOST_DisplayManagerCarbon.h b/intern/ghost/intern/GHOST_DisplayManagerCarbon.h index 93467b8f462..d9af12ba13f 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCarbon.h +++ b/intern/ghost/intern/GHOST_DisplayManagerCarbon.h @@ -108,7 +108,7 @@ protected: /** Cached number of displays. */ CGDisplayCount m_numDisplays; /** Cached display id's for each display. */ - CGDirectDisplayID* m_displayIDs; + CGDirectDisplayID *m_displayIDs; }; diff --git a/intern/ghost/intern/GHOST_DisplayManagerNULL.h b/intern/ghost/intern/GHOST_DisplayManagerNULL.h index 31fb9faf0cf..eb116e30d2d 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerNULL.h +++ b/intern/ghost/intern/GHOST_DisplayManagerNULL.h @@ -43,7 +43,7 @@ public: GHOST_TSuccess getCurrentDisplaySetting( GHOST_TUns8 display, GHOST_DisplaySetting& setting ) const { return getDisplaySetting(display,GHOST_TInt32(0),setting); } GHOST_TSuccess setCurrentDisplaySetting( GHOST_TUns8 display, const GHOST_DisplaySetting& setting ){ return GHOST_kSuccess; } -private : +private: GHOST_SystemNULL * m_system; }; diff --git a/intern/ghost/intern/GHOST_DisplayManagerSDL.h b/intern/ghost/intern/GHOST_DisplayManagerSDL.h index bfd8d1a77e6..2139e2d5e7b 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerSDL.h +++ b/intern/ghost/intern/GHOST_DisplayManagerSDL.h @@ -68,8 +68,8 @@ public: setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting); -private : - GHOST_SystemSDL * m_system; +private: + GHOST_SystemSDL *m_system; SDL_DisplayMode m_mode; }; diff --git a/intern/ghost/intern/GHOST_DropTargetWin32.h b/intern/ghost/intern/GHOST_DropTargetWin32.h index 9f80b82436e..88a4032ac23 100644 --- a/intern/ghost/intern/GHOST_DropTargetWin32.h +++ b/intern/ghost/intern/GHOST_DropTargetWin32.h @@ -47,22 +47,22 @@ public: * inherited, directly or indirectly, from IUnknown. Therefore, the three * methods in IUnknown are the first entries in the VTable for every interface. */ - HRESULT __stdcall QueryInterface (REFIID riid, void ** ppvObj); - ULONG __stdcall AddRef (void); - ULONG __stdcall Release (void); + HRESULT __stdcall QueryInterface(REFIID riid, void **ppvObj); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); /* IDropTarget implementation - + The IDropTarget interface is one of the interfaces you implement to - provide drag-and-drop operations in your application. It contains methods - used in any application that can be a target for data during a - drag-and-drop operation. A drop-target application is responsible for: + * + The IDropTarget interface is one of the interfaces you implement to + * provide drag-and-drop operations in your application. It contains methods + * used in any application that can be a target for data during a + * drag-and-drop operation. A drop-target application is responsible for: * - * - Determining the effect of the drop on the target application. - * - Incorporating any valid dropped data when the drop occurs. - * - Communicating target feedback to the source so the source application + * - Determining the effect of the drop on the target application. + * - Incorporating any valid dropped data when the drop occurs. + * - Communicating target feedback to the source so the source application * can provide appropriate visual feedback such as setting the cursor. - * - Implementing drag scrolling. - * - Registering and revoking its application windows as drop targets. + * - Implementing drag scrolling. + * - Registering and revoking its application windows as drop targets. * * The IDropTarget interface contains methods that handle all these * responsibilities except registering and revoking the application window @@ -70,10 +70,10 @@ public: * RevokeDragDrop functions. */ - HRESULT __stdcall DragEnter (IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect); - HRESULT __stdcall DragOver (DWORD grfKeyState, POINTL pt, DWORD * pdwEffect); - HRESULT __stdcall DragLeave (void); - HRESULT __stdcall Drop (IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect); + HRESULT __stdcall DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT __stdcall DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT __stdcall DragLeave(void); + HRESULT __stdcall Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); /** * Constructor @@ -83,7 +83,7 @@ public: * @param window The window to register as drop target. * @param system The associated system. */ - GHOST_DropTargetWin32(GHOST_WindowWin32 * window, GHOST_SystemWin32 * system); + GHOST_DropTargetWin32(GHOST_WindowWin32 *window, GHOST_SystemWin32 *system); /** * Destructor @@ -107,7 +107,7 @@ private: * @param pDataObject Pointer to the DataObject. * @return GHOST data type. */ - GHOST_TDragnDropTypes getGhostType(IDataObject * pDataObject); + GHOST_TDragnDropTypes getGhostType(IDataObject *pDataObject); /** * Get data to pass in event. @@ -115,21 +115,21 @@ private: * @param pDataObject Pointer to the DataObject. * @return Pointer to data. */ - void * getGhostData(IDataObject * pDataObject); + void *getGhostData(IDataObject *pDataObject); /** * Allocate data as file array to pass in event. * @param pDataObject Pointer to the DataObject. * @return Pointer to data. */ - void * getDropDataAsFilenames(IDataObject * pDataObject); + void *getDropDataAsFilenames(IDataObject *pDataObject); /** * Allocate data as string to pass in event. * @param pDataObject Pointer to the DataObject. * @return Pointer to data. */ - void * getDropDataAsString(IDataObject * pDataObject); + void *getDropDataAsString(IDataObject *pDataObject); /** * Convert Unicode to ANSI, replacing unconvertable chars with '?'. @@ -143,16 +143,15 @@ private: /* Private member variables */ /* COM reference count. */ - LONG m_cRef; + LONG m_cRef; /* Handle of the associated window. */ - HWND m_hWnd; + HWND m_hWnd; /* The associated GHOST_WindowWin32. */ - GHOST_WindowWin32 * m_window; + GHOST_WindowWin32 *m_window; /* The System. */ - GHOST_SystemWin32 * m_system; + GHOST_SystemWin32 *m_system; /* Data type of the dragged object */ GHOST_TDragnDropTypes m_draggedObjectType; - }; #endif // __GHOST_DROPTARGETWIN32_H__ diff --git a/intern/ghost/intern/GHOST_Event.h b/intern/ghost/intern/GHOST_Event.h index c7f86f2502d..6e12a34d149 100644 --- a/intern/ghost/intern/GHOST_Event.h +++ b/intern/ghost/intern/GHOST_Event.h @@ -50,7 +50,7 @@ public: * @param type The type of this event. * @param window The generating window (or NULL if system event). */ - GHOST_Event(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window) + GHOST_Event(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow *window) : m_type(type), m_time(msec), m_window(window), m_data(0) { } @@ -78,7 +78,7 @@ public: * or NULL if it is a 'system' event. * @return The generating window. */ - virtual GHOST_IWindow* getWindow() + virtual GHOST_IWindow *getWindow() { return m_window; } @@ -98,7 +98,7 @@ protected: /** The time this event was generated. */ GHOST_TUns64 m_time; /** Pointer to the generating window. */ - GHOST_IWindow* m_window; + GHOST_IWindow *m_window; /** Pointer to the event data. */ GHOST_TEventDataPtr m_data; }; diff --git a/intern/ghost/intern/GHOST_EventButton.h b/intern/ghost/intern/GHOST_EventButton.h index 7c869190b16..7ad840bb964 100644 --- a/intern/ghost/intern/GHOST_EventButton.h +++ b/intern/ghost/intern/GHOST_EventButton.h @@ -51,7 +51,7 @@ public: * @param y The y-coordinate of the location the cursor was at at the time of the event. * @param buttons The state of the buttons was at at the time of the event. */ - GHOST_EventButton(GHOST_TUns64 time, GHOST_TEventType type, GHOST_IWindow* window, GHOST_TButtonMask button) + GHOST_EventButton(GHOST_TUns64 time, GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask button) : GHOST_Event(time, type, window) { m_buttonEventData.button = button; diff --git a/intern/ghost/intern/GHOST_EventCursor.h b/intern/ghost/intern/GHOST_EventCursor.h index 749bd8a6922..0ff703ba254 100644 --- a/intern/ghost/intern/GHOST_EventCursor.h +++ b/intern/ghost/intern/GHOST_EventCursor.h @@ -50,7 +50,7 @@ public: * @param x The x-coordinate of the location the cursor was at at the time of the event. * @param y The y-coordinate of the location the cursor was at at the time of the event. */ - GHOST_EventCursor(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window, GHOST_TInt32 x, GHOST_TInt32 y) + GHOST_EventCursor(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow *window, GHOST_TInt32 x, GHOST_TInt32 y) : GHOST_Event(msec, type, window) { m_cursorEventData.x = x; diff --git a/intern/ghost/intern/GHOST_EventDragnDrop.h b/intern/ghost/intern/GHOST_EventDragnDrop.h index 4e256a386c0..1a05a4b9b68 100644 --- a/intern/ghost/intern/GHOST_EventDragnDrop.h +++ b/intern/ghost/intern/GHOST_EventDragnDrop.h @@ -83,8 +83,8 @@ public: GHOST_EventDragnDrop(GHOST_TUns64 time, GHOST_TEventType type, GHOST_TDragnDropTypes dataType, - GHOST_IWindow* window, - int x, int y, GHOST_TEventDataPtr data) + GHOST_IWindow *window, + int x, int y, GHOST_TEventDataPtr data) : GHOST_Event(time, type, window) { m_dragnDropEventData.x = x; @@ -102,22 +102,22 @@ public: switch (m_dragnDropEventData.dataType) { case GHOST_kDragnDropTypeBitmap: - IMB_freeImBuf((ImBuf*)m_dragnDropEventData.data); + IMB_freeImBuf((ImBuf *)m_dragnDropEventData.data); break; case GHOST_kDragnDropTypeFilenames: { - GHOST_TStringArray *strArray = (GHOST_TStringArray*)m_dragnDropEventData.data; + GHOST_TStringArray *strArray = (GHOST_TStringArray *)m_dragnDropEventData.data; int i; - for (i=0;icount;i++) + for (i = 0; i < strArray->count; i++) free(strArray->strings[i]); free(strArray); } - break; + break; case GHOST_kDragnDropTypeString: free(m_dragnDropEventData.data); - break; + break; default: break; diff --git a/intern/ghost/intern/GHOST_EventKey.h b/intern/ghost/intern/GHOST_EventKey.h index ae3ef374431..66817576f0f 100644 --- a/intern/ghost/intern/GHOST_EventKey.h +++ b/intern/ghost/intern/GHOST_EventKey.h @@ -51,13 +51,13 @@ public: */ GHOST_EventKey(GHOST_TUns64 msec, GHOST_TEventType type, - GHOST_IWindow* window, + GHOST_IWindow *window, GHOST_TKey key) : GHOST_Event(msec, type, window) { m_keyEventData.key = key; m_keyEventData.ascii = '\0'; - m_keyEventData.utf8_buf[0]= '\0'; + m_keyEventData.utf8_buf[0] = '\0'; m_data = &m_keyEventData; } @@ -70,7 +70,7 @@ public: */ GHOST_EventKey(GHOST_TUns64 msec, GHOST_TEventType type, - GHOST_IWindow* window, + GHOST_IWindow *window, GHOST_TKey key, char ascii, const char utf8_buf[6]) @@ -79,7 +79,7 @@ public: m_keyEventData.key = key; m_keyEventData.ascii = ascii; if (utf8_buf) memcpy(m_keyEventData.utf8_buf, utf8_buf, sizeof(m_keyEventData.utf8_buf)); - else m_keyEventData.utf8_buf[0]= '\0'; + else m_keyEventData.utf8_buf[0] = '\0'; m_data = &m_keyEventData; } diff --git a/intern/ghost/intern/GHOST_EventManager.h b/intern/ghost/intern/GHOST_EventManager.h index bc43a5c5d07..f941dac9fb4 100644 --- a/intern/ghost/intern/GHOST_EventManager.h +++ b/intern/ghost/intern/GHOST_EventManager.h @@ -64,21 +64,21 @@ public: * Returns the number of events currently on the stack. * @return The number of events on the stack. */ - virtual GHOST_TUns32 getNumEvents(); + virtual GHOST_TUns32 getNumEvents(); /** * Returns the number of events of a certain type currently on the stack. * @param type The type of events to be counted. * @return The number of events on the stack of this type. */ - virtual GHOST_TUns32 getNumEvents(GHOST_TEventType type); + virtual GHOST_TUns32 getNumEvents(GHOST_TEventType type); /** * Return the event at the top of the stack without removal. * Do not delete the event! * @return The event at the top of the stack. */ - virtual GHOST_IEvent* peekEvent(); + virtual GHOST_IEvent *peekEvent(); /** * Pushes an event on the stack. @@ -86,13 +86,13 @@ public: * Do not delete the event! * @param event The event to push on the stack. */ - virtual GHOST_TSuccess pushEvent(GHOST_IEvent* event); + virtual GHOST_TSuccess pushEvent(GHOST_IEvent *event); /** * Dispatches the given event directly, bypassing the event stack. * @return Indication as to whether any of the consumers handled the event. */ - virtual bool dispatchEvent(GHOST_IEvent* event); + virtual bool dispatchEvent(GHOST_IEvent *event); /** * Dispatches the event at the back of the stack. @@ -113,23 +113,23 @@ public: * @param consumer The consumer added to the list. * @return Indication as to whether addition has succeeded. */ - virtual GHOST_TSuccess addConsumer(GHOST_IEventConsumer* consumer); + virtual GHOST_TSuccess addConsumer(GHOST_IEventConsumer *consumer); /** * Removes a consumer from the list of event consumers. * @param consumer The consumer removed from the list. * @return Indication as to whether removal has succeeded. */ - virtual GHOST_TSuccess removeConsumer(GHOST_IEventConsumer* consumer); + virtual GHOST_TSuccess removeConsumer(GHOST_IEventConsumer *consumer); /** * Removes all events for a window from the stack. * @param window The window to remove events for. */ - virtual void + virtual void removeWindowEvents( - GHOST_IWindow* window - ); + GHOST_IWindow *window + ); /** * Removes all events of a certain type from the stack. @@ -138,11 +138,11 @@ public: * @param type The type of events to be removed. * @param window The window to remove the events for. */ - virtual void + virtual void removeTypeEvents( - GHOST_TEventType type, - GHOST_IWindow* window = 0 - ); + GHOST_TEventType type, + GHOST_IWindow *window = 0 + ); protected: /** @@ -150,7 +150,7 @@ protected: * Delete the event after use! * @return The event at the top of the stack. */ - virtual GHOST_IEvent* popEvent(); + virtual GHOST_IEvent *popEvent(); /** * Removes all events from the stack. @@ -158,13 +158,13 @@ protected: virtual void disposeEvents(); /** A stack with events. */ - typedef std::deque TEventStack; + typedef std::deque TEventStack; /** The event stack. */ - std::deque m_events; + std::deque m_events; /** A vector with event consumers. */ - typedef std::vector TConsumerVector; + typedef std::vector TConsumerVector; /** The list with event consumers. */ TConsumerVector m_consumers; diff --git a/intern/ghost/intern/GHOST_EventNDOF.h b/intern/ghost/intern/GHOST_EventNDOF.h index f256f343823..b4037896b93 100644 --- a/intern/ghost/intern/GHOST_EventNDOF.h +++ b/intern/ghost/intern/GHOST_EventNDOF.h @@ -32,31 +32,30 @@ class GHOST_EventNDOFMotion : public GHOST_Event +{ +protected: + GHOST_TEventNDOFMotionData m_axisData; + +public: + GHOST_EventNDOFMotion(GHOST_TUns64 time, GHOST_IWindow *window) + : GHOST_Event(time, GHOST_kEventNDOFMotion, window) { - protected: - GHOST_TEventNDOFMotionData m_axisData; - - public: - GHOST_EventNDOFMotion(GHOST_TUns64 time, GHOST_IWindow* window) - : GHOST_Event(time, GHOST_kEventNDOFMotion, window) - { - m_data = &m_axisData; - } - }; + m_data = &m_axisData; + } +}; class GHOST_EventNDOFButton : public GHOST_Event - { - protected: - GHOST_TEventNDOFButtonData m_buttonData; - - public: - GHOST_EventNDOFButton(GHOST_TUns64 time, GHOST_IWindow* window) - : GHOST_Event(time, GHOST_kEventNDOFButton, window) - { - m_data = &m_buttonData; - } - }; +{ +protected: + GHOST_TEventNDOFButtonData m_buttonData; +public: + GHOST_EventNDOFButton(GHOST_TUns64 time, GHOST_IWindow *window) + : GHOST_Event(time, GHOST_kEventNDOFButton, window) + { + m_data = &m_buttonData; + } +}; #endif // __GHOST_EVENTNDOF_H__ diff --git a/intern/ghost/intern/GHOST_EventPrinter.h b/intern/ghost/intern/GHOST_EventPrinter.h index 7c2378db301..f5fe303f9bc 100644 --- a/intern/ghost/intern/GHOST_EventPrinter.h +++ b/intern/ghost/intern/GHOST_EventPrinter.h @@ -49,7 +49,7 @@ public: * @param event The event that can be handled or not. * @return Indication as to whether the event was handled. */ - virtual bool processEvent(GHOST_IEvent* event); + virtual bool processEvent(GHOST_IEvent *event); protected: /** @@ -57,7 +57,7 @@ protected: * @param key The GHOST key code to convert. * @param str The GHOST key code converted to a readable string. */ - void getKeyString(GHOST_TKey key, char str[32]) const; + void getKeyString(GHOST_TKey key, char str[32]) const; }; #endif // __GHOST_EVENTPRINTER_H__ diff --git a/intern/ghost/intern/GHOST_EventString.h b/intern/ghost/intern/GHOST_EventString.h index 90e914e3b5c..8611944197d 100644 --- a/intern/ghost/intern/GHOST_EventString.h +++ b/intern/ghost/intern/GHOST_EventString.h @@ -51,9 +51,10 @@ public: * @param window The generating window (or NULL if system event). * @param data_ptr Pointer to the (unformatted) data associated with the event */ - GHOST_EventString(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window, GHOST_TEventDataPtr data_ptr) - : GHOST_Event(msec, type, window) { - m_data = data_ptr; + GHOST_EventString(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow *window, GHOST_TEventDataPtr data_ptr) + : GHOST_Event(msec, type, window) + { + m_data = data_ptr; } ~GHOST_EventString() diff --git a/intern/ghost/intern/GHOST_EventTrackpad.h b/intern/ghost/intern/GHOST_EventTrackpad.h index 9a3456bbb57..ab576fb9ec3 100644 --- a/intern/ghost/intern/GHOST_EventTrackpad.h +++ b/intern/ghost/intern/GHOST_EventTrackpad.h @@ -51,7 +51,7 @@ public: * @param y The y-delta of the pan event. */ GHOST_EventTrackpad(GHOST_TUns64 msec, - GHOST_IWindow* window, + GHOST_IWindow *window, GHOST_TTrackpadEventSubTypes subtype, GHOST_TInt32 x, GHOST_TInt32 y, GHOST_TInt32 deltaX, GHOST_TInt32 deltaY) diff --git a/intern/ghost/intern/GHOST_EventWheel.h b/intern/ghost/intern/GHOST_EventWheel.h index 1b7468dbc6e..7d6137af575 100644 --- a/intern/ghost/intern/GHOST_EventWheel.h +++ b/intern/ghost/intern/GHOST_EventWheel.h @@ -51,7 +51,7 @@ public: * @param type The type of this event. * @param z The displacement of the mouse wheel. */ - GHOST_EventWheel(GHOST_TUns64 msec, GHOST_IWindow* window, GHOST_TInt32 z) + GHOST_EventWheel(GHOST_TUns64 msec, GHOST_IWindow *window, GHOST_TInt32 z) : GHOST_Event(msec, GHOST_kEventWheel, window) { m_wheelEventData.z = z; diff --git a/intern/ghost/intern/GHOST_ModifierKeys.h b/intern/ghost/intern/GHOST_ModifierKeys.h index 0b690323022..064af8d2e6c 100644 --- a/intern/ghost/intern/GHOST_ModifierKeys.h +++ b/intern/ghost/intern/GHOST_ModifierKeys.h @@ -41,8 +41,7 @@ * @author Maarten Gribnau * @date May 17, 2001 */ -struct GHOST_ModifierKeys -{ +struct GHOST_ModifierKeys { /** * Constructor. */ diff --git a/intern/ghost/intern/GHOST_NDOFManager.h b/intern/ghost/intern/GHOST_NDOFManager.h index 5e16c3fc54c..2baf0f6fa42 100644 --- a/intern/ghost/intern/GHOST_NDOFManager.h +++ b/intern/ghost/intern/GHOST_NDOFManager.h @@ -44,7 +44,7 @@ typedef enum { NDOF_Spaceball5000, NDOF_SpaceTraveler - } NDOF_DeviceT; +} NDOF_DeviceT; // NDOF device button event types typedef enum { @@ -100,7 +100,7 @@ typedef enum { NDOF_BUTTON_C, // the end NDOF_BUTTON_LAST - } NDOF_ButtonT; +} NDOF_ButtonT; class GHOST_NDOFManager { @@ -149,13 +149,13 @@ protected: GHOST_System& m_system; private: - void sendButtonEvent(NDOF_ButtonT, bool press, GHOST_TUns64 time, GHOST_IWindow*); - void sendKeyEvent(GHOST_TKey, bool press, GHOST_TUns64 time, GHOST_IWindow*); + void sendButtonEvent(NDOF_ButtonT, bool press, GHOST_TUns64 time, GHOST_IWindow *); + void sendKeyEvent(GHOST_TKey, bool press, GHOST_TUns64 time, GHOST_IWindow *); NDOF_DeviceT m_deviceType; int m_buttonCount; int m_buttonMask; - const NDOF_ButtonT* m_hidMap; + const NDOF_ButtonT *m_hidMap; short m_translation[3]; short m_rotation[3]; diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h index 15a7cf1fdd9..b25f24e653c 100644 --- a/intern/ghost/intern/GHOST_System.h +++ b/intern/ghost/intern/GHOST_System.h @@ -76,8 +76,8 @@ protected: public: /*************************************************************************************** - ** Time(r) functionality - ***************************************************************************************/ + ** Time(r) functionality + ***************************************************************************************/ /** * Returns the system time. @@ -97,7 +97,7 @@ public: * @param userData Placeholder for user data. * @return A timer task (0 if timer task installation failed). */ - virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay, + virtual GHOST_ITimerTask *installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0); @@ -107,11 +107,11 @@ public: * @param timerTask Timer task to be removed. * @return Indication of success. */ - virtual GHOST_TSuccess removeTimer(GHOST_ITimerTask* timerTask); + virtual GHOST_TSuccess removeTimer(GHOST_ITimerTask *timerTask); /*************************************************************************************** - ** Display/window management functionality - ***************************************************************************************/ + ** Display/window management functionality + ***************************************************************************************/ /** * Inherited from GHOST_ISystem but left pure virtual @@ -126,14 +126,14 @@ public: * @param window Pointer to the window to be disposed. * @return Indication of success. */ - virtual GHOST_TSuccess disposeWindow(GHOST_IWindow* window); + virtual GHOST_TSuccess disposeWindow(GHOST_IWindow *window); /** * Returns whether a window is valid. * @param window Pointer to the window to be checked. * @return Indication of validity. */ - virtual bool validWindow(GHOST_IWindow* window); + virtual bool validWindow(GHOST_IWindow *window); /** * Begins full screen mode. @@ -143,8 +143,8 @@ public: * This window is invalid after full screen has been ended. * @return Indication of success. */ - virtual GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, - const bool stereoVisual, const GHOST_TUns16 numOfAASamples=0); + virtual GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window, + const bool stereoVisual, const GHOST_TUns16 numOfAASamples = 0); /** * Updates the resolution while in fullscreen mode. @@ -153,7 +153,7 @@ public: * * @return Indication of success. */ - virtual GHOST_TSuccess updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window); + virtual GHOST_TSuccess updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window); /** * Ends full screen mode. @@ -169,13 +169,13 @@ public: /*************************************************************************************** - ** Event management functionality - ***************************************************************************************/ + ** Event management functionality + ***************************************************************************************/ /** * Inherited from GHOST_ISystem but left pure virtual * - * virtual bool processEvents(bool waitForEvent) = 0; + * virtual bool processEvents(bool waitForEvent) = 0; */ @@ -192,18 +192,18 @@ public: * @param consumer The event consumer to add. * @return Indication of success. */ - virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer); + virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer *consumer); /** * Remove the given event consumer to our list. * @param consumer The event consumer to remove. * @return Indication of success. */ - virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer* consumer); + virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer *consumer); /*************************************************************************************** - ** Cursor management functionality - ***************************************************************************************/ + ** Cursor management functionality + ***************************************************************************************/ /** Inherited from GHOST_ISystem but left pure virtual * GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const = 0; @@ -211,8 +211,8 @@ public: */ /*************************************************************************************** - ** Access to mouse button and keyboard states. - ***************************************************************************************/ + ** Access to mouse button and keyboard states. + ***************************************************************************************/ /** * Returns the state of a modifier key (ouside the message queue). @@ -231,8 +231,8 @@ public: virtual GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool& isDown) const; /*************************************************************************************** - ** Other (internal) functionality. - ***************************************************************************************/ + ** Other (internal) functionality. + ***************************************************************************************/ /** * Pushes an event on the stack. @@ -240,32 +240,32 @@ public: * Do not delete the event! * @param event The event to push on the stack. */ - virtual GHOST_TSuccess pushEvent(GHOST_IEvent* event); + virtual GHOST_TSuccess pushEvent(GHOST_IEvent *event); /** * Returns the timer manager. * @return The timer manager. */ - inline virtual GHOST_TimerManager* getTimerManager() const; + inline virtual GHOST_TimerManager *getTimerManager() const; /** * Returns a pointer to our event manager. * @return A pointer to our event manager. */ - virtual inline GHOST_EventManager* getEventManager() const; + virtual inline GHOST_EventManager *getEventManager() const; /** * Returns a pointer to our window manager. * @return A pointer to our window manager. */ - virtual inline GHOST_WindowManager* getWindowManager() const; + virtual inline GHOST_WindowManager *getWindowManager() const; #ifdef WITH_INPUT_NDOF /** * Returns a pointer to our n-degree of freedeom manager. * @return A pointer to our n-degree of freedeom manager. */ - virtual inline GHOST_NDOFManager* getNDOFManager() const; + virtual inline GHOST_NDOFManager *getNDOFManager() const; #endif /** @@ -285,23 +285,23 @@ public: /** * Returns the selection buffer * @param selection Only used on X11 - * @return Returns the clipboard data + * @return Returns the clipboard data * */ - virtual GHOST_TUns8* getClipboard(bool selection) const = 0; + virtual GHOST_TUns8 *getClipboard(bool selection) const = 0; - /** - * Put data to the Clipboard - * @param buffer The buffer to copy to the clipboard - * @param selection The clipboard to copy too only used on X11 - */ - virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0; + /** + * Put data to the Clipboard + * @param buffer The buffer to copy to the clipboard + * @param selection The clipboard to copy too only used on X11 + */ + virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0; - /** + /** * Confirms quitting he program when there is just one window left open * in the application */ - virtual int confirmQuit(GHOST_IWindow * window) const; + virtual int confirmQuit(GHOST_IWindow *window) const; @@ -323,52 +323,52 @@ protected: * @param window The window created. * @return Indication of success. */ - virtual GHOST_TSuccess createFullScreenWindow(GHOST_Window** window, - const bool stereoVisual, const GHOST_TUns16 numOfAASamples=0); + virtual GHOST_TSuccess createFullScreenWindow(GHOST_Window **window, + const bool stereoVisual, const GHOST_TUns16 numOfAASamples = 0); /** The display manager (platform dependant). */ - GHOST_DisplayManager* m_displayManager; + GHOST_DisplayManager *m_displayManager; /** The timer manager. */ - GHOST_TimerManager* m_timerManager; + GHOST_TimerManager *m_timerManager; /** The window manager. */ - GHOST_WindowManager* m_windowManager; + GHOST_WindowManager *m_windowManager; /** The event manager. */ - GHOST_EventManager* m_eventManager; + GHOST_EventManager *m_eventManager; #ifdef WITH_INPUT_NDOF /** The N-degree of freedom device manager */ - GHOST_NDOFManager* m_ndofManager; + GHOST_NDOFManager *m_ndofManager; #endif /** Prints all the events. */ #ifdef GHOST_DEBUG - GHOST_EventPrinter* m_eventPrinter; + GHOST_EventPrinter *m_eventPrinter; #endif // GHOST_DEBUG /** Settings of the display before the display went fullscreen. */ GHOST_DisplaySetting m_preFullScreenSetting; }; -inline GHOST_TimerManager* GHOST_System::getTimerManager() const +inline GHOST_TimerManager *GHOST_System::getTimerManager() const { return m_timerManager; } -inline GHOST_EventManager* GHOST_System::getEventManager() const +inline GHOST_EventManager *GHOST_System::getEventManager() const { return m_eventManager; } -inline GHOST_WindowManager* GHOST_System::getWindowManager() const +inline GHOST_WindowManager *GHOST_System::getWindowManager() const { return m_windowManager; } #ifdef WITH_INPUT_NDOF -inline GHOST_NDOFManager* GHOST_System::getNDOFManager() const +inline GHOST_NDOFManager *GHOST_System::getNDOFManager() const { return m_ndofManager; } diff --git a/intern/ghost/intern/GHOST_SystemCarbon.h b/intern/ghost/intern/GHOST_SystemCarbon.h index cda09480788..2415c57e094 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.h +++ b/intern/ghost/intern/GHOST_SystemCarbon.h @@ -84,7 +84,7 @@ public: * Returns the number of displays on this system. * @return The number of displays. */ - virtual GHOST_TUns8 getNumDisplays() const; + virtual GHOST_TUns8 getNumDisplays() const; /** * Returns the dimensions of the main display on this system. @@ -103,29 +103,29 @@ public: * @param height The height the window. * @param state The state of the window when opened. * @param type The type of drawing context installed in this window. - * @param parentWindow Parent (embedder) window + * @param parentWindow Parent (embedder) window * @return The new window (or 0 if creation failed). */ - virtual GHOST_IWindow* createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples = 0, - const GHOST_TEmbedderWindowID parentWindow = 0 - ); + virtual GHOST_IWindow *createWindow( + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples = 0, + const GHOST_TEmbedderWindowID parentWindow = 0 + ); virtual GHOST_TSuccess beginFullScreen( - const GHOST_DisplaySetting& setting, - GHOST_IWindow** window, - const bool stereoVisual - ); + const GHOST_DisplaySetting& setting, + GHOST_IWindow **window, + const bool stereoVisual + ); - virtual GHOST_TSuccess endFullScreen( void ); + virtual GHOST_TSuccess endFullScreen(void); /*************************************************************************************** ** Event management functionality @@ -181,7 +181,7 @@ public: * @param selection Indicate which buffer to return * @return Returns the selected buffer */ - virtual GHOST_TUns8* getClipboard(bool selection) const; + virtual GHOST_TUns8 *getClipboard(bool selection) const; /** * Puts buffer to system clipboard @@ -193,7 +193,9 @@ public: /** * @see GHOST_ISystem */ - int toggleConsole(int action) { return 0; } + int toggleConsole(int action) { + return 0; + } protected: /** @@ -258,7 +260,7 @@ protected: /** * Callback for Carbon when it has events. */ - static OSStatus sEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData); + static OSStatus sEventHandlerProc(EventHandlerCallRef handler, EventRef event, void *userData); /** Apple Event Handlers */ static OSErr sAEHandlerLaunch(const AppleEvent *event, AppleEvent *reply, SInt32 refCon); diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h b/intern/ghost/intern/GHOST_SystemCocoa.h index ce7677aee7a..47a7a6a9a73 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.h +++ b/intern/ghost/intern/GHOST_SystemCocoa.h @@ -62,8 +62,8 @@ public: ~GHOST_SystemCocoa(); /*************************************************************************************** - ** Time(r) functionality - ***************************************************************************************/ + ** Time(r) functionality + ***************************************************************************************/ /** * Returns the system time. @@ -74,14 +74,14 @@ public: virtual GHOST_TUns64 getMilliSeconds() const; /*************************************************************************************** - ** Display/window management functionality - ***************************************************************************************/ + ** Display/window management functionality + ***************************************************************************************/ /** * Returns the number of displays on this system. * @return The number of displays. */ - virtual GHOST_TUns8 getNumDisplays() const; + virtual GHOST_TUns8 getNumDisplays() const; /** * Returns the dimensions of the main display on this system. @@ -102,25 +102,25 @@ public: * @param type The type of drawing context installed in this window. * @param stereoVisual Stereo visual for quad buffered stereo. * @param numOfAASamples Number of samples used for AA (zero if no AA) - * @param parentWindow Parent (embedder) window + * @param parentWindow Parent (embedder) window * @return The new window (or 0 if creation failed). */ - virtual GHOST_IWindow* createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0, - const GHOST_TEmbedderWindowID parentWindow = 0 - ); + virtual GHOST_IWindow *createWindow( + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0, + const GHOST_TEmbedderWindowID parentWindow = 0 + ); /*************************************************************************************** - ** Event management functionality - ***************************************************************************************/ + ** Event management functionality + ***************************************************************************************/ /** * Gets events from the system and stores them in the queue. @@ -151,11 +151,11 @@ public: * @return Indication whether the event was handled. */ GHOST_TSuccess handleDraggingEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, - GHOST_WindowCocoa* window, int mouseX, int mouseY, void* data); + GHOST_WindowCocoa *window, int mouseX, int mouseY, void *data); /*************************************************************************************** - ** Cursor management functionality - ***************************************************************************************/ + ** Cursor management functionality + ***************************************************************************************/ /** * Returns the current location of the cursor (location in screen coordinates) @@ -174,8 +174,8 @@ public: virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y); /*************************************************************************************** - ** Access to mouse button and keyboard states. - ***************************************************************************************/ + ** Access to mouse button and keyboard states. + ***************************************************************************************/ /** * Returns the state of all modifier keys. @@ -196,7 +196,7 @@ public: * @param selection Indicate which buffer to return * @return Returns the selected buffer */ - virtual GHOST_TUns8* getClipboard(bool selection) const; + virtual GHOST_TUns8 *getClipboard(bool selection) const; /** * Puts buffer to system clipboard @@ -211,7 +211,7 @@ public: * @param window The window on which the event occurred * @return Indication whether the event was handled. */ - GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa* window); + GHOST_TSuccess handleWindowEvent(GHOST_TEventType eventType, GHOST_WindowCocoa *window); /** * Handles the Cocoa event telling the application has become active (again) @@ -227,7 +227,9 @@ public: /** * @see GHOST_ISystem */ - int toggleConsole(int action) { return 0; } + int toggleConsole(int action) { + return 0; + } protected: diff --git a/intern/ghost/intern/GHOST_SystemNULL.h b/intern/ghost/intern/GHOST_SystemNULL.h index be16a8286d5..63e3b5bc828 100644 --- a/intern/ghost/intern/GHOST_SystemNULL.h +++ b/intern/ghost/intern/GHOST_SystemNULL.h @@ -66,19 +66,19 @@ public: return GHOST_kFailure; } - GHOST_IWindow* createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - bool stereoVisual, - const GHOST_TUns16 numOfAASamples, - const GHOST_TEmbedderWindowID parentWindow - ) { - return new GHOST_WindowNULL (this, title, left, top, width, height, state, parentWindow, type, stereoVisual, 1); + GHOST_IWindow *createWindow( + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + bool stereoVisual, + const GHOST_TUns16 numOfAASamples, + const GHOST_TEmbedderWindowID parentWindow) + { + return new GHOST_WindowNULL(this, title, left, top, width, height, state, parentWindow, type, stereoVisual, 1); } }; diff --git a/intern/ghost/intern/GHOST_SystemPaths.h b/intern/ghost/intern/GHOST_SystemPaths.h index 472d6369282..a8c43ff7e09 100644 --- a/intern/ghost/intern/GHOST_SystemPaths.h +++ b/intern/ghost/intern/GHOST_SystemPaths.h @@ -40,13 +40,13 @@ protected: * Constructor. * Protected default constructor to force use of static createSystem member. */ - GHOST_SystemPaths(){}; + GHOST_SystemPaths() {}; /** * Destructor. * Protected default constructor to force use of static dispose member. */ - virtual ~GHOST_SystemPaths(){}; + virtual ~GHOST_SystemPaths() {}; public: @@ -55,25 +55,25 @@ public: * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). */ - virtual const GHOST_TUns8* getSystemDir() const = 0; - - /** - * Determine the base dir in which user configuration is stored, not including versioning. - * If needed, it will create the base directory. - * @return Unsigned char string pointing to user dir (eg ~/.blender/). - */ - virtual const GHOST_TUns8* getUserDir() const = 0; + virtual const GHOST_TUns8 *getSystemDir() const = 0; /** - * Determine the directory of the current binary - * @return Unsigned char string pointing to the binary dir - */ - virtual const GHOST_TUns8* getBinaryDir() const = 0; + * Determine the base dir in which user configuration is stored, not including versioning. + * If needed, it will create the base directory. + * @return Unsigned char string pointing to user dir (eg ~/.blender/). + */ + virtual const GHOST_TUns8 *getUserDir() const = 0; + + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8 *getBinaryDir() const = 0; /** * Add the file to the operating system most recently used files */ - virtual void addToSystemRecentFiles(const char* filename) const = 0; + virtual void addToSystemRecentFiles(const char *filename) const = 0; }; diff --git a/intern/ghost/intern/GHOST_SystemPathsCarbon.h b/intern/ghost/intern/GHOST_SystemPathsCarbon.h index 4a1f68e9ba7..c005f373726 100644 --- a/intern/ghost/intern/GHOST_SystemPathsCarbon.h +++ b/intern/ghost/intern/GHOST_SystemPathsCarbon.h @@ -63,25 +63,25 @@ public: * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). */ - virtual const GHOST_TUns8* getSystemDir() const; + virtual const GHOST_TUns8 *getSystemDir() const; /** * Determine the base dir in which user configuration is stored, not including versioning. * If needed, it will create the base directory. * @return Unsigned char string pointing to user dir (eg ~/.blender/). */ - virtual const GHOST_TUns8* getUserDir() const; + virtual const GHOST_TUns8 *getUserDir() const; /** - * Determine the directory of the current binary - * @return Unsigned char string pointing to the binary dir - */ - virtual const GHOST_TUns8* getBinaryDir() const; + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8 *getBinaryDir() const; /** - * Add the file to the operating system most recently used files - */ - void addToSystemRecentFiles(const char* filename) const; + * Add the file to the operating system most recently used files + */ + void addToSystemRecentFiles(const char *filename) const; }; #endif // __GHOST_SYSTEMPATHSCARBON_H__ diff --git a/intern/ghost/intern/GHOST_SystemPathsCocoa.h b/intern/ghost/intern/GHOST_SystemPathsCocoa.h index 1936d705945..77efbf2dd1b 100644 --- a/intern/ghost/intern/GHOST_SystemPathsCocoa.h +++ b/intern/ghost/intern/GHOST_SystemPathsCocoa.h @@ -57,25 +57,25 @@ public: * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). */ - virtual const GHOST_TUns8* getSystemDir() const; + virtual const GHOST_TUns8 *getSystemDir() const; /** * Determine the base dir in which user configuration is stored, not including versioning. * If needed, it will create the base directory. * @return Unsigned char string pointing to user dir (eg ~/.blender/). */ - virtual const GHOST_TUns8* getUserDir() const; + virtual const GHOST_TUns8 *getUserDir() const; /** - * Determine the directory of the current binary - * @return Unsigned char string pointing to the binary dir - */ - virtual const GHOST_TUns8* getBinaryDir() const; + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8 *getBinaryDir() const; /** * Add the file to the operating system most recently used files */ - void addToSystemRecentFiles(const char* filename) const; + void addToSystemRecentFiles(const char *filename) const; }; #endif // __GHOST_SYSTEMPATHSCOCOA_H__ diff --git a/intern/ghost/intern/GHOST_SystemPathsWin32.h b/intern/ghost/intern/GHOST_SystemPathsWin32.h index f53b33da756..133aa2cacab 100644 --- a/intern/ghost/intern/GHOST_SystemPathsWin32.h +++ b/intern/ghost/intern/GHOST_SystemPathsWin32.h @@ -67,20 +67,20 @@ public: * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/). */ - const GHOST_TUns8* getSystemDir() const; + const GHOST_TUns8 *getSystemDir() const; /** * Determine the base dir in which user configuration is stored, not including versioning. * If needed, it will create the base directory. * @return Unsigned char string pointing to user dir (eg ~/). */ - const GHOST_TUns8* getUserDir() const; + const GHOST_TUns8 *getUserDir() const; /** * Determine the directory of the current binary * @return Unsigned char string pointing to the binary dir */ - const GHOST_TUns8* getBinaryDir() const; + const GHOST_TUns8 *getBinaryDir() const; /** * Add the file to the operating system most recently used files diff --git a/intern/ghost/intern/GHOST_SystemSDL.h b/intern/ghost/intern/GHOST_SystemSDL.h index 7610c594665..43c9129fdd8 100644 --- a/intern/ghost/intern/GHOST_SystemSDL.h +++ b/intern/ghost/intern/GHOST_SystemSDL.h @@ -110,7 +110,7 @@ private: ); /* SDL specific */ - GHOST_WindowSDL * findGhostWindow(SDL_Window *sdl_win); + GHOST_WindowSDL *findGhostWindow(SDL_Window *sdl_win); bool generateWindowExposeEvents(); diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index bc2044e549d..f63ad38d0cc 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -45,7 +45,7 @@ #include "GHOST_System.h" #if defined(__CYGWIN32__) -# define __int64 long long +# define __int64 long long #endif class GHOST_EventButton; @@ -93,7 +93,7 @@ public: * Returns the number of displays on this system. * @return The number of displays. */ - virtual GHOST_TUns8 getNumDisplays() const; + virtual GHOST_TUns8 getNumDisplays() const; /** * Returns the dimensions of the main display on this system. @@ -114,16 +114,16 @@ public: * @param type The type of drawing context installed in this window. * @param stereoVisual Stereo visual for quad buffered stereo. * @param numOfAASamples Number of samples used for AA (zero if no AA) - * @param parentWindow Parent (embedder) window + * @param parentWindow Parent (embedder) window * @return The new window (or 0 if creation failed). */ - virtual GHOST_IWindow* createWindow( - const STR_String& title, - GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, - GHOST_TWindowState state, GHOST_TDrawingContextType type, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0, - const GHOST_TEmbedderWindowID parentWindow = 0 ); + virtual GHOST_IWindow *createWindow( + const STR_String& title, + GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, + GHOST_TWindowState state, GHOST_TDrawingContextType type, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0, + const GHOST_TEmbedderWindowID parentWindow = 0); /*************************************************************************************** ** Event management functionality @@ -180,7 +180,7 @@ public: * @param selection Used by X11 only * @return Returns the Clipboard */ - virtual GHOST_TUns8* getClipboard(bool selection) const; + virtual GHOST_TUns8 *getClipboard(bool selection) const; /** * Puts buffer to system clipboard @@ -199,13 +199,13 @@ public: * @param window The window on which the event occurred * @return Indication whether the event was handled. */ - static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,GHOST_IWindow* window, int mouseX, int mouseY, void* data); + static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType, GHOST_IWindow *window, int mouseX, int mouseY, void *data); /** * Confirms quitting he program when there is just one window left open * in the application */ - virtual int confirmQuit(GHOST_IWindow * window) const; + virtual int confirmQuit(GHOST_IWindow *window) const; protected: /** @@ -239,7 +239,7 @@ protected: * @param vk Pointer to virtual key * @return The GHOST key (GHOST_kKeyUnknown if no match). */ - virtual GHOST_TKey hardKey(GHOST_IWindow *window, RAWINPUT const& raw, int * keyDown, char * vk); + virtual GHOST_TKey hardKey(GHOST_IWindow *window, RAWINPUT const& raw, int *keyDown, char *vk); /** * Creates modifier key event(s) and updates the key data stored locally (m_modifierKeys). @@ -248,7 +248,7 @@ protected: * events generated for both keys. * @param window The window receiving the event (the active window). */ - GHOST_EventKey* processModifierKeys(GHOST_IWindow *window); + GHOST_EventKey *processModifierKeys(GHOST_IWindow *window); /** * Creates mouse button event. @@ -257,7 +257,7 @@ protected: * @param mask The button mask of this event. * @return The event created. */ - static GHOST_EventButton* processButtonEvent(GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask mask); + static GHOST_EventButton *processButtonEvent(GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask mask); /** * Creates cursor event. @@ -265,7 +265,7 @@ protected: * @param window The window receiving the event (the active window). * @return The event created. */ - static GHOST_EventCursor* processCursorEvent(GHOST_TEventType type, GHOST_IWindow *Iwindow); + static GHOST_EventCursor *processCursorEvent(GHOST_TEventType type, GHOST_IWindow *Iwindow); /** * Creates a mouse wheel event. @@ -273,7 +273,7 @@ protected: * @param wParam The wParam from the wndproc * @param lParam The lParam from the wndproc */ - static GHOST_EventWheel* processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam); + static GHOST_EventWheel *processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam); /** * Creates a key event and updates the key data stored locally (m_modifierKeys). @@ -282,7 +282,7 @@ protected: * @param window The window receiving the event (the active window). * @param raw RawInput structure with detailed info about the key event */ - static GHOST_EventKey* processKeyEvent(GHOST_IWindow *window, RAWINPUT const& raw); + static GHOST_EventKey *processKeyEvent(GHOST_IWindow *window, RAWINPUT const& raw); /** * Process special keys (VK_OEM_*), to see if current key layout @@ -299,13 +299,13 @@ protected: * @param window The window receiving the event (the active window). * @return The event created. */ - static GHOST_Event* processWindowEvent(GHOST_TEventType type, GHOST_IWindow* window); + static GHOST_Event *processWindowEvent(GHOST_TEventType type, GHOST_IWindow *window); /** * Handles minimum window size. * @param minmax The MINMAXINFO structure. */ - static void processMinMaxInfo(MINMAXINFO * minmax); + static void processMinMaxInfo(MINMAXINFO *minmax); #ifdef WITH_INPUT_NDOF /** @@ -342,14 +342,14 @@ protected: static LRESULT WINAPI s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); /** - * Toggles console - * @action 0 - Hides - * 1 - Shows - * 2 - Toggles - * 3 - Hides if it runs not from command line - * * - Does nothing - * @return current status (1 -visible, 0 - hidden) - */ + * Toggles console + * @action 0 - Hides + * 1 - Shows + * 2 - Toggles + * 3 - Hides if it runs not from command line + * * - Does nothing + * @return current status (1 -visible, 0 - hidden) + */ int toggleConsole(int action); /** The current state of the modifier keys. */ @@ -390,12 +390,12 @@ inline void GHOST_SystemWin32::handleKeyboardChange(void) // save the language identifier. m_langId = LOWORD(m_keylayout); - for(m_hasAltGr = false, i = 32; i < 256; ++i) { + for (m_hasAltGr = false, i = 32; i < 256; ++i) { s = VkKeyScanEx((char)i, m_keylayout); // s == -1 means no key that translates passed char code // high byte contains shift state. bit 2 ctrl pressed, bit 4 alt pressed // if both are pressed, we have AltGr keycombo on keylayout - if(s!=-1 && (s & 0x600) == 0x600) { + if (s != -1 && (s & 0x600) == 0x600) { m_hasAltGr = true; break; } diff --git a/intern/ghost/intern/GHOST_TaskbarWin32.h b/intern/ghost/intern/GHOST_TaskbarWin32.h index a5d6fdc745f..34908a59b3a 100644 --- a/intern/ghost/intern/GHOST_TaskbarWin32.h +++ b/intern/ghost/intern/GHOST_TaskbarWin32.h @@ -19,54 +19,54 @@ // GHOST_WindowWin32 #ifndef __ITaskbarList_INTERFACE_DEFINED__ #define __ITaskbarList_INTERFACE_DEFINED__ - extern "C" {const GUID CLSID_TaskbarList = {0x56FDF344, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90} }; - const GUID IID_ITaskbarList = {0x56FDF342, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90} }; } - class ITaskbarList : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE HrInit (void) = 0; - virtual HRESULT STDMETHODCALLTYPE AddTab (HWND hwnd) = 0; - virtual HRESULT STDMETHODCALLTYPE DeleteTab (HWND hwnd) = 0; - virtual HRESULT STDMETHODCALLTYPE ActivateTab (HWND hwnd) = 0; - virtual HRESULT STDMETHODCALLTYPE SetActiveAlt (HWND hwnd) = 0; - }; -#endif /* ITaskbarList */ +extern "C" {const GUID CLSID_TaskbarList = {0x56FDF344, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90} }; + const GUID IID_ITaskbarList = {0x56FDF342, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90} }; } +class ITaskbarList : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE HrInit(void) = 0; + virtual HRESULT STDMETHODCALLTYPE AddTab(HWND hwnd) = 0; + virtual HRESULT STDMETHODCALLTYPE DeleteTab(HWND hwnd) = 0; + virtual HRESULT STDMETHODCALLTYPE ActivateTab(HWND hwnd) = 0; + virtual HRESULT STDMETHODCALLTYPE SetActiveAlt(HWND hwnd) = 0; +}; +#endif /* ITaskbarList */ #ifndef __ITaskbarList2_INTERFACE_DEFINED__ #define __ITaskbarList2_INTERFACE_DEFINED__ - extern "C" {const GUID IID_ITaskbarList2 = {0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17} }; } - class ITaskbarList2 : public ITaskbarList - { - public: - virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(HWND hwnd, BOOL fFullscreen) = 0; - }; -#endif /* ITaskbarList2 */ +extern "C" {const GUID IID_ITaskbarList2 = {0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17} }; } +class ITaskbarList2 : public ITaskbarList +{ +public: + virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(HWND hwnd, BOOL fFullscreen) = 0; +}; +#endif /* ITaskbarList2 */ #ifndef __ITaskbarList3_INTERFACE_DEFINED__ #define __ITaskbarList3_INTERFACE_DEFINED__ typedef enum THUMBBUTTONFLAGS {THBF_ENABLED = 0, THBF_DISABLED = 0x1, THBF_DISMISSONCLICK = 0x2, THBF_NOBACKGROUND = 0x4, THBF_HIDDEN = 0x8, THBF_NONINTERACTIVE = 0x10} THUMBBUTTONFLAGS; typedef enum THUMBBUTTONMASK {THB_BITMAP = 0x1, THB_ICON = 0x2, THB_TOOLTIP = 0x4, THB_FLAGS = 0x8} THUMBBUTTONMASK; typedef struct THUMBBUTTON {THUMBBUTTONMASK dwMask; UINT iId; UINT iBitmap; HICON hIcon; WCHAR szTip[260]; THUMBBUTTONFLAGS dwFlags; } THUMBBUTTON; -typedef enum TBPFLAG {TBPF_NOPROGRESS = 0, TBPF_INDETERMINATE = 0x1, TBPF_NORMAL = 0x2, TBPF_ERROR = 0x4, TBPF_PAUSED = 0x8 } TBPFLAG; +typedef enum TBPFLAG {TBPF_NOPROGRESS = 0, TBPF_INDETERMINATE = 0x1, TBPF_NORMAL = 0x2, TBPF_ERROR = 0x4, TBPF_PAUSED = 0x8 } TBPFLAG; #define THBN_CLICKED 0x1800 - extern "C" {const GUID IID_ITaskList3 = { 0xEA1AFB91, 0x9E28, 0x4B86, {0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF} };} +extern "C" {const GUID IID_ITaskList3 = { 0xEA1AFB91, 0x9E28, 0x4B86, {0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF} }; } - class ITaskbarList3 : public ITaskbarList2 - { - public: - virtual HRESULT STDMETHODCALLTYPE SetProgressValue (HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) = 0; - virtual HRESULT STDMETHODCALLTYPE SetProgressState (HWND hwnd, TBPFLAG tbpFlags) = 0; - virtual HRESULT STDMETHODCALLTYPE RegisterTab (HWND hwndTab, HWND hwndMDI) = 0; - virtual HRESULT STDMETHODCALLTYPE UnregisterTab (HWND hwndTab) = 0; - virtual HRESULT STDMETHODCALLTYPE SetTabOrder (HWND hwndTab, HWND hwndInsertBefore) = 0; - virtual HRESULT STDMETHODCALLTYPE SetTabActive (HWND hwndTab, HWND hwndMDI, DWORD dwReserved) = 0; - virtual HRESULT STDMETHODCALLTYPE ThumbBarAddButtons (HWND hwnd, UINT cButtons, THUMBBUTTON * pButton) = 0; - virtual HRESULT STDMETHODCALLTYPE ThumbBarUpdateButtons (HWND hwnd, UINT cButtons, THUMBBUTTON * pButton) = 0; - virtual HRESULT STDMETHODCALLTYPE ThumbBarSetImageList (HWND hwnd, HIMAGELIST himl) = 0; - virtual HRESULT STDMETHODCALLTYPE SetOverlayIcon (HWND hwnd, HICON hIcon, LPCWSTR pszDescription) = 0; - virtual HRESULT STDMETHODCALLTYPE SetThumbnailTooltip (HWND hwnd, LPCWSTR pszTip) = 0; - virtual HRESULT STDMETHODCALLTYPE SetThumbnailClip (HWND hwnd, RECT *prcClip) = 0; - }; -#endif /* ITaskbarList3 */ +class ITaskbarList3 : public ITaskbarList2 +{ +public: + virtual HRESULT STDMETHODCALLTYPE SetProgressValue(HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) = 0; + virtual HRESULT STDMETHODCALLTYPE SetProgressState(HWND hwnd, TBPFLAG tbpFlags) = 0; + virtual HRESULT STDMETHODCALLTYPE RegisterTab(HWND hwndTab, HWND hwndMDI) = 0; + virtual HRESULT STDMETHODCALLTYPE UnregisterTab(HWND hwndTab) = 0; + virtual HRESULT STDMETHODCALLTYPE SetTabOrder(HWND hwndTab, HWND hwndInsertBefore) = 0; + virtual HRESULT STDMETHODCALLTYPE SetTabActive(HWND hwndTab, HWND hwndMDI, DWORD dwReserved) = 0; + virtual HRESULT STDMETHODCALLTYPE ThumbBarAddButtons(HWND hwnd, UINT cButtons, THUMBBUTTON *pButton) = 0; + virtual HRESULT STDMETHODCALLTYPE ThumbBarUpdateButtons(HWND hwnd, UINT cButtons, THUMBBUTTON *pButton) = 0; + virtual HRESULT STDMETHODCALLTYPE ThumbBarSetImageList(HWND hwnd, HIMAGELIST himl) = 0; + virtual HRESULT STDMETHODCALLTYPE SetOverlayIcon(HWND hwnd, HICON hIcon, LPCWSTR pszDescription) = 0; + virtual HRESULT STDMETHODCALLTYPE SetThumbnailTooltip(HWND hwnd, LPCWSTR pszTip) = 0; + virtual HRESULT STDMETHODCALLTYPE SetThumbnailClip(HWND hwnd, RECT *prcClip) = 0; +}; +#endif /* ITaskbarList3 */ #endif /*__GHOST_TASKBARWIN32_H__*/ diff --git a/intern/ghost/intern/GHOST_TimerManager.h b/intern/ghost/intern/GHOST_TimerManager.h index ce4983ca105..0b189cf3aa9 100644 --- a/intern/ghost/intern/GHOST_TimerManager.h +++ b/intern/ghost/intern/GHOST_TimerManager.h @@ -64,13 +64,13 @@ public: * Returns the number of timer tasks. * @return The number of events on the stack. */ - virtual GHOST_TUns32 getNumTimers(); + virtual GHOST_TUns32 getNumTimers(); /** * Returns whther this timer task ins in our list. * @return Indication of presence. */ - virtual bool getTimerFound(GHOST_TimerTask* timer); + virtual bool getTimerFound(GHOST_TimerTask *timer); /** * Adds a timer task to the list. @@ -78,7 +78,7 @@ public: * @param timer The timer task added to the list. * @return Indication as to whether addition has succeeded. */ - virtual GHOST_TSuccess addTimer(GHOST_TimerTask* timer); + virtual GHOST_TSuccess addTimer(GHOST_TimerTask *timer); /** * Removes a timer task from the list. @@ -86,7 +86,7 @@ public: * @param timer The timer task to be removed from the list. * @return Indication as to whether removal has succeeded. */ - virtual GHOST_TSuccess removeTimer(GHOST_TimerTask* timer); + virtual GHOST_TSuccess removeTimer(GHOST_TimerTask *timer); /** * Finds the soonest time the next timer would fire. @@ -108,7 +108,7 @@ public: * @param task The timer task to check and optionally fire. * @return True if the timer fired. */ - virtual bool fireTimer(GHOST_TUns64 time, GHOST_TimerTask* task); + virtual bool fireTimer(GHOST_TUns64 time, GHOST_TimerTask *task); protected: /** @@ -116,7 +116,7 @@ protected: */ void disposeTimers(); - typedef std::vector TTimerVector; + typedef std::vector TTimerVector; /** The list with event consumers. */ TTimerVector m_timers; }; diff --git a/intern/ghost/intern/GHOST_TimerTask.h b/intern/ghost/intern/GHOST_TimerTask.h index e15082ac1ba..d74d705d511 100644 --- a/intern/ghost/intern/GHOST_TimerTask.h +++ b/intern/ghost/intern/GHOST_TimerTask.h @@ -56,11 +56,11 @@ public: GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0) : m_start(start), - m_interval(interval), - m_next(start), - m_timerProc(timerProc), - m_userData(userData), - m_auxData(0) + m_interval(interval), + m_next(start), + m_timerProc(timerProc), + m_userData(userData), + m_auxData(0) { } diff --git a/intern/ghost/intern/GHOST_Window.h b/intern/ghost/intern/GHOST_Window.h index 23f1b044b60..91a974bde19 100644 --- a/intern/ghost/intern/GHOST_Window.h +++ b/intern/ghost/intern/GHOST_Window.h @@ -83,12 +83,12 @@ public: * @param numOfAASamples Number of samples used for AA (zero if no AA) */ GHOST_Window( - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0); + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0); /** * @section Interface inherited from GHOST_IWindow left for derived class @@ -121,7 +121,7 @@ public: * Returns the associated OS object/handle * @return The associated OS object/handle */ - virtual void* getOSWindow() const; + virtual void *getOSWindow() const; /** * Returns the current cursor shape. @@ -145,15 +145,15 @@ public: * @return Indication of success. */ virtual GHOST_TSuccess setCustomCursorShape(GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], - int hotX, - int hotY); + GHOST_TUns8 mask[16][2], + int hotX, + int hotY); virtual GHOST_TSuccess setCustomCursorShape(GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, int sizey, - int hotX, int hotY, - int fg_color, int bg_color); + GHOST_TUns8 *mask, + int sizex, int sizey, + int hotX, int hotY, + int fg_color, int bg_color); /** * Returns the visibility state of the cursor. @@ -187,15 +187,19 @@ public: virtual GHOST_TSuccess getCursorGrabBounds(GHOST_Rect& bounds); /** - * Sets the progress bar value displayed in the window/application icon + * Sets the progress bar value displayed in the window/application icon * @param progress The progress % (0.0 to 1.0) */ - virtual GHOST_TSuccess setProgressBar(float progress) {return GHOST_kFailure;}; + virtual GHOST_TSuccess setProgressBar(float progress) { + return GHOST_kFailure; + }; /** * Hides the progress bar in the icon */ - virtual GHOST_TSuccess endProgressBar() {return GHOST_kFailure;}; + virtual GHOST_TSuccess endProgressBar() { + return GHOST_kFailure; + }; /** * Tells if the ongoing drag'n'drop object can be accepted upon mouse drop @@ -278,7 +282,9 @@ protected: * Sets the cursor grab on the window using * native window system calls. */ - virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode) { return GHOST_kSuccess; }; + virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode) { + return GHOST_kSuccess; + }; /** * Sets the cursor shape on the window using @@ -295,7 +301,7 @@ protected: int hotX, int hotY) = 0; virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, - int szx, int szy, int hotX, int hotY, int fg, int bg) = 0; + int szx, int szy, int hotX, int hotY, int fg, int bg) = 0; /** The the of drawing context installed in this window. */ GHOST_TDrawingContextType m_drawingContextType; @@ -365,8 +371,8 @@ inline GHOST_TGrabCursorMode GHOST_Window::getCursorGrabMode() const inline bool GHOST_Window::getCursorGrabModeIsWarp() const { - return (m_cursorGrab == GHOST_kGrabWrap) || - (m_cursorGrab == GHOST_kGrabHide); + return (m_cursorGrab == GHOST_kGrabWrap) || + (m_cursorGrab == GHOST_kGrabHide); } inline void GHOST_Window::getCursorGrabInitPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const @@ -377,14 +383,14 @@ inline void GHOST_Window::getCursorGrabInitPos(GHOST_TInt32 &x, GHOST_TInt32 &y) inline void GHOST_Window::getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const { - x= m_cursorGrabAccumPos[0]; - y= m_cursorGrabAccumPos[1]; + x = m_cursorGrabAccumPos[0]; + y = m_cursorGrabAccumPos[1]; } inline void GHOST_Window::setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y) { - m_cursorGrabAccumPos[0]= x; - m_cursorGrabAccumPos[1]= y; + m_cursorGrabAccumPos[0] = x; + m_cursorGrabAccumPos[1] = y; } inline GHOST_TStandardCursor GHOST_Window::getCursorShape() const diff --git a/intern/ghost/intern/GHOST_WindowCarbon.h b/intern/ghost/intern/GHOST_WindowCarbon.h index 2c1c827510a..1291fb1a2c4 100644 --- a/intern/ghost/intern/GHOST_WindowCarbon.h +++ b/intern/ghost/intern/GHOST_WindowCarbon.h @@ -73,16 +73,16 @@ public: * @param stereoVisual Stereo visual for quad buffered stereo. */ GHOST_WindowCarbon( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0 - ); + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0 + ); /** * Destructor. @@ -94,7 +94,7 @@ public: * Returns indication as to whether the window is valid. * @return The validity of the window. */ - virtual bool getValid() const; + virtual bool getValid() const; /** * Sets the title displayed in the title bar. @@ -113,33 +113,33 @@ public: * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. * @param bounds The bounding rectangle of the window. */ - virtual void getWindowBounds(GHOST_Rect& bounds) const; + virtual void getWindowBounds(GHOST_Rect& bounds) const; /** * Returns the client rectangle dimensions. * The left and top members of the rectangle are always zero. * @param bounds The bounding rectangle of the cleient area of the window. */ - virtual void getClientBounds(GHOST_Rect& bounds) const; + virtual void getClientBounds(GHOST_Rect& bounds) const; /** * Resizes client rectangle width. * @param width The new width of the client area of the window. */ - virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width); + virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width); /** * Resizes client rectangle height. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height); + virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height); /** * Resizes client rectangle. * @param width The new width of the client area of the window. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height); + virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height); /** * Returns the state of the window (normal, minimized, maximized). @@ -154,7 +154,7 @@ public: * @param outX The x-coordinate in the client rectangle. * @param outY The y-coordinate in the client rectangle. */ - virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; + virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; /** * Converts a point in screen coordinates to client rectangle coordinates @@ -163,7 +163,7 @@ public: * @param outX The x-coordinate on the screen. * @param outY The y-coordinate on the screen. */ - virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; + virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; /** * Sets the state of the window (normal, minimized, maximized). @@ -206,16 +206,20 @@ public: */ virtual bool getFullScreenDirty(); - /* accessor for fullscreen window */ + /* accessor for fullscreen window */ virtual void setMac_windowState(short value); virtual short getMac_windowState(); - const GHOST_TabletData* GetTabletData() - { return &m_tablet; } + const GHOST_TabletData *GetTabletData() + { + return &m_tablet; + } GHOST_TabletData& GetCarbonTabletData() - { return m_tablet; } + { + return m_tablet; + } protected: /** * Tries to install a rendering context in this window. @@ -232,7 +236,7 @@ protected: /** * Invalidates the contents of this window. - * @return Indication of success. + * @return Indication of success. */ virtual GHOST_TSuccess invalidate(); @@ -253,7 +257,7 @@ protected: * native window system calls. */ virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, - int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color); + int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color); virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY); @@ -278,7 +282,7 @@ protected: /** The first created OpenGL context (for sharing display lists) */ static AGLContext s_firstaglCtx; - Cursor* m_customCursor; + Cursor *m_customCursor; GHOST_TabletData m_tablet; @@ -286,15 +290,15 @@ protected: bool m_fullScreenDirty; /** specific MacOs X full screen window setting as we use partially system mechanism - values : 0 not maximizable default - 1 normal state - 2 maximized state - - this will be reworked when rebuilding GHOST carbon to use new OS X apis - in order to be unified with GHOST fullscreen/maximised settings - - (lukep) - **/ + * values : 0 not maximizable default + * 1 normal state + * 2 maximized state + * + * this will be reworked when rebuilding GHOST carbon to use new OS X apis + * in order to be unified with GHOST fullscreen/maximised settings + * + * (lukep) + **/ short mac_windowState; diff --git a/intern/ghost/intern/GHOST_WindowCocoa.h b/intern/ghost/intern/GHOST_WindowCocoa.h index fec97c2af97..d53dfa71d95 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.h +++ b/intern/ghost/intern/GHOST_WindowCocoa.h @@ -74,17 +74,17 @@ public: * @param numOfAASamples Number of samples used for AA (zero if no AA) */ GHOST_WindowCocoa( - GHOST_SystemCocoa *systemCocoa, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 bottom, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0 - ); + GHOST_SystemCocoa *systemCocoa, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 bottom, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0 + ); /** * Destructor. @@ -96,13 +96,13 @@ public: * Returns indication as to whether the window is valid. * @return The validity of the window. */ - virtual bool getValid() const; + virtual bool getValid() const; /** * Returns the associated NSWindow object * @return The associated NSWindow object */ - virtual void* getOSWindow() const; + virtual void *getOSWindow() const; /** * Sets the title displayed in the title bar. @@ -121,33 +121,33 @@ public: * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. * @param bounds The bounding rectangle of the window. */ - virtual void getWindowBounds(GHOST_Rect& bounds) const; + virtual void getWindowBounds(GHOST_Rect& bounds) const; /** * Returns the client rectangle dimensions. * The left and top members of the rectangle are always zero. * @param bounds The bounding rectangle of the cleient area of the window. */ - virtual void getClientBounds(GHOST_Rect& bounds) const; + virtual void getClientBounds(GHOST_Rect& bounds) const; /** * Resizes client rectangle width. * @param width The new width of the client area of the window. */ - virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width); + virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width); /** * Resizes client rectangle height. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height); + virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height); /** * Resizes client rectangle. * @param width The new width of the client area of the window. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height); + virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height); /** * Returns the state of the window (normal, minimized, maximized). @@ -169,7 +169,7 @@ public: * @param outX The x-coordinate in the client rectangle. * @param outY The y-coordinate in the client rectangle. */ - virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; + virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; /** * Converts a point in screen coordinates to client rectangle coordinates @@ -178,7 +178,7 @@ public: * @param outX The x-coordinate on the screen. * @param outY The y-coordinate on the screen. */ - virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; + virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; /** * Converts a point in screen coordinates to client rectangle coordinates @@ -204,7 +204,7 @@ public: * Gets the screen the window is displayed in * @return The NSScreen object */ - NSScreen* getScreen(); + NSScreen *getScreen(); /** * Sets the state of the window (normal, minimized, maximized). @@ -242,11 +242,15 @@ public: virtual void loadCursor(bool visible, GHOST_TStandardCursor cursor) const; - const GHOST_TabletData* GetTabletData() - { return &m_tablet; } + const GHOST_TabletData *GetTabletData() + { + return &m_tablet; + } GHOST_TabletData& GetCocoaTabletData() - { return m_tablet; } + { + return m_tablet; + } /** * Sets the progress bar value displayed in the window/application icon @@ -274,7 +278,7 @@ protected: /** * Invalidates the contents of this window. - * @return Indication of success. + * @return Indication of success. */ virtual GHOST_TSuccess invalidate(); @@ -301,7 +305,7 @@ protected: * native window system calls. */ virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, - int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color); + int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color); virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY); @@ -320,7 +324,7 @@ protected: /** The first created OpenGL context (for sharing display lists) */ static NSOpenGLContext *s_firstOpenGLcontext; - NSCursor* m_customCursor; + NSCursor *m_customCursor; GHOST_TabletData m_tablet; }; diff --git a/intern/ghost/intern/GHOST_WindowManager.h b/intern/ghost/intern/GHOST_WindowManager.h index cf27a3bde49..47931347ed6 100644 --- a/intern/ghost/intern/GHOST_WindowManager.h +++ b/intern/ghost/intern/GHOST_WindowManager.h @@ -63,40 +63,40 @@ public: * @param window Pointer to the window to be added. * @return Indication of success. */ - virtual GHOST_TSuccess addWindow(GHOST_IWindow* window); + virtual GHOST_TSuccess addWindow(GHOST_IWindow *window); /** * Remove a window from our list. * @param window Pointer to the window to be removed. * @return Indication of success. */ - virtual GHOST_TSuccess removeWindow(const GHOST_IWindow* window); + virtual GHOST_TSuccess removeWindow(const GHOST_IWindow *window); /** * Returns whether the window is in our list. * @param window Pointer to the window to query. * @return A boolean indicator. */ - virtual bool getWindowFound(const GHOST_IWindow* window) const; + virtual bool getWindowFound(const GHOST_IWindow *window) const; /** * Returns whether one of the windows is fullscreen. * @return A boolean indicator. */ - virtual bool getFullScreen(void) const; + virtual bool getFullScreen(void) const; /** * Returns pointer to the full-screen window. * @return The fll-screen window (0 if not in full-screen). */ - virtual GHOST_IWindow* getFullScreenWindow(void) const; + virtual GHOST_IWindow *getFullScreenWindow(void) const; /** * Activates fullscreen mode for a window. * @param window The window displayed fullscreen. * @return Indication of success. */ - virtual GHOST_TSuccess beginFullScreen(GHOST_IWindow* window, const bool stereoVisual); + virtual GHOST_TSuccess beginFullScreen(GHOST_IWindow *window, const bool stereoVisual); /** * Closes fullscreen mode down. @@ -109,21 +109,21 @@ public: * There can be only one window active which should be in the current window list. * @param window The new active window. */ - virtual GHOST_TSuccess setActiveWindow(GHOST_IWindow* window); + virtual GHOST_TSuccess setActiveWindow(GHOST_IWindow *window); /** * Returns the active window (the window receiving events). * There can be only one window active which should be in the current window list. * @return window The active window (or NULL if there is none). */ - virtual GHOST_IWindow* getActiveWindow(void) const; + virtual GHOST_IWindow *getActiveWindow(void) const; /** * Set this window to be inactive (not receiving events). * @param window The window to decativate. */ - virtual void setWindowInactive(const GHOST_IWindow* window); + virtual void setWindowInactive(const GHOST_IWindow *window); /** @@ -140,7 +140,7 @@ public: * @param osWindow The OS window object/handle * @return The associated window, null if none corresponds */ - virtual GHOST_IWindow* getWindowAssociatedWithOSWindow(void* osWindow); + virtual GHOST_IWindow *getWindowAssociatedWithOSWindow(void *osWindow); /** * Return true if any windows has a modified status @@ -150,16 +150,16 @@ public: protected: /** The list of windows managed */ - std::vector m_windows; + std::vector m_windows; /** Window in fullscreen state. There can be only one of this which is not in or window list. */ - GHOST_IWindow* m_fullScreenWindow; + GHOST_IWindow *m_fullScreenWindow; /** The active window. */ - GHOST_IWindow* m_activeWindow; + GHOST_IWindow *m_activeWindow; /** Window that was active before entering fullscreen state. */ - GHOST_IWindow* m_activeWindowBeforeFullScreen; + GHOST_IWindow *m_activeWindowBeforeFullScreen; #ifdef WITH_CXX_GUARDEDALLOC public: diff --git a/intern/ghost/intern/GHOST_WindowNULL.h b/intern/ghost/intern/GHOST_WindowNULL.h index 49f6d14552d..cde2cb0ba76 100644 --- a/intern/ghost/intern/GHOST_WindowNULL.h +++ b/intern/ghost/intern/GHOST_WindowNULL.h @@ -41,20 +41,20 @@ public: const GHOST_TabletData* GetTabletData() { return NULL; } GHOST_WindowNULL( - GHOST_SystemNULL *system, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - const GHOST_TEmbedderWindowID parentWindow, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples - ) : - GHOST_Window(width,height,state,type,stereoVisual,numOfAASamples), - m_system (system) + GHOST_SystemNULL *system, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + const GHOST_TEmbedderWindowID parentWindow, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples + ) : + GHOST_Window(width, height, state, type, stereoVisual, numOfAASamples), + m_system(system) { setTitle(title); } @@ -87,8 +87,8 @@ protected: GHOST_TSuccess setOrder(GHOST_TWindowOrder order) { return GHOST_kSuccess; } -private : - GHOST_SystemNULL * m_system; +private: + GHOST_SystemNULL *m_system; }; diff --git a/intern/ghost/intern/GHOST_WindowSDL.h b/intern/ghost/intern/GHOST_WindowSDL.h index e984aafc733..a39d9878ddd 100644 --- a/intern/ghost/intern/GHOST_WindowSDL.h +++ b/intern/ghost/intern/GHOST_WindowSDL.h @@ -44,17 +44,19 @@ class STR_String; class GHOST_WindowSDL : public GHOST_Window { -private : - GHOST_SystemSDL * m_system; - bool m_invalid_window; +private: + GHOST_SystemSDL *m_system; + bool m_invalid_window; - SDL_Window * m_sdl_win; - SDL_GLContext m_sdl_glcontext; - SDL_Cursor * m_sdl_custom_cursor; + SDL_Window *m_sdl_win; + SDL_GLContext m_sdl_glcontext; + SDL_Cursor *m_sdl_custom_cursor; public: - const GHOST_TabletData* GetTabletData() { return NULL; } + const GHOST_TabletData *GetTabletData() { + return NULL; + } GHOST_WindowSDL(GHOST_SystemSDL *system, const STR_String& title, @@ -158,7 +160,11 @@ protected: GHOST_TWindowState getState() const; - GHOST_TSuccess setOrder(GHOST_TWindowOrder order) { return GHOST_kSuccess; } // TODO + GHOST_TSuccess setOrder(GHOST_TWindowOrder order) + { + // TODO + return GHOST_kSuccess; + } }; diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index c8e88c8d844..28ba470f75a 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -46,18 +46,18 @@ #include -#define PACKETDATA (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR) -#define PACKETMODE PK_BUTTONS +#define PACKETDATA (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR) +#define PACKETMODE PK_BUTTONS #include class GHOST_SystemWin32; class GHOST_DropTargetWin32; // typedefs for WinTab functions to allow dynamic loading -typedef UINT (API * GHOST_WIN32_WTInfo) ( UINT, UINT, LPVOID ); -typedef HCTX (API * GHOST_WIN32_WTOpen) (HWND, LPLOGCONTEXTA, BOOL); -typedef BOOL (API * GHOST_WIN32_WTClose) (HCTX); -typedef BOOL (API * GHOST_WIN32_WTPacket) (HCTX, UINT, LPVOID); +typedef UINT (API * GHOST_WIN32_WTInfo)(UINT, UINT, LPVOID); +typedef HCTX (API * GHOST_WIN32_WTOpen)(HWND, LPLOGCONTEXTA, BOOL); +typedef BOOL (API * GHOST_WIN32_WTClose)(HCTX); +typedef BOOL (API * GHOST_WIN32_WTPacket)(HCTX, UINT, LPVOID); /** * GHOST window on M$ Windows OSs. @@ -81,20 +81,20 @@ public: * @param numOfAASamples Number of samples used for AA (zero if no AA) */ GHOST_WindowWin32( - GHOST_SystemWin32 * system, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, - const bool stereoVisual = false, - const GHOST_TUns16 numOfAASamples = 0, - GHOST_TEmbedderWindowID parentWindowHwnd=0, - GHOST_TSuccess msEnabled = GHOST_kFailure, - int msPixelFormat = 0 - ); + GHOST_SystemWin32 *system, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, + const bool stereoVisual = false, + const GHOST_TUns16 numOfAASamples = 0, + GHOST_TEmbedderWindowID parentWindowHwnd = 0, + GHOST_TSuccess msEnabled = GHOST_kFailure, + int msPixelFormat = 0 + ); /** * Destructor. @@ -113,7 +113,7 @@ public: * Returns indication as to whether the window is valid. * @return The validity of the window. */ - virtual bool getValid() const; + virtual bool getValid() const; /** * Access to the handle of the window. @@ -138,33 +138,33 @@ public: * The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. * @param bounds The bounding rectangle of the window. */ - virtual void getWindowBounds(GHOST_Rect& bounds) const; + virtual void getWindowBounds(GHOST_Rect& bounds) const; /** * Returns the client rectangle dimensions. * The left and top members of the rectangle are always zero. * @param bounds The bounding rectangle of the cleient area of the window. */ - virtual void getClientBounds(GHOST_Rect& bounds) const; + virtual void getClientBounds(GHOST_Rect& bounds) const; /** * Resizes client rectangle width. * @param width The new width of the client area of the window. */ - virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width); + virtual GHOST_TSuccess setClientWidth(GHOST_TUns32 width); /** * Resizes client rectangle height. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height); + virtual GHOST_TSuccess setClientHeight(GHOST_TUns32 height); /** * Resizes client rectangle. * @param width The new width of the client area of the window. * @param height The new height of the client area of the window. */ - virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height); + virtual GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height); /** * Returns the state of the window (normal, minimized, maximized). @@ -179,7 +179,7 @@ public: * @param outX The x-coordinate in the client rectangle. * @param outY The y-coordinate in the client rectangle. */ - virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; + virtual void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; /** * Converts a point in screen coordinates to client rectangle coordinates @@ -188,7 +188,7 @@ public: * @param outX The x-coordinate on the screen. * @param outY The y-coordinate on the screen. */ - virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; + virtual void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const; /** * Sets the state of the window (normal, minimized, maximized). @@ -222,7 +222,7 @@ public: virtual GHOST_TSuccess invalidate(); /** - * Sets the progress bar value displayed in the window/application icon + * Sets the progress bar value displayed in the window/application icon * @param progress The progress % */ virtual GHOST_TSuccess setProgressBar(float progress); @@ -236,7 +236,9 @@ public: * Returns the name of the window class. * @return The name of the window class. */ - static wchar_t* getWindowClassName() { return s_windowClassName; } + static wchar_t *getWindowClassName() { + return s_windowClassName; + } /** * Register a mouse click event (should be called @@ -264,8 +266,10 @@ public: */ void loadCursor(bool visible, GHOST_TStandardCursor cursorShape) const; - const GHOST_TabletData* GetTabletData() - { return m_tabletData; } + const GHOST_TabletData *GetTabletData() + { + return m_tabletData; + } void processWin32TabletInitEvent(); void processWin32TabletEvent(WPARAM wParam, LPARAM lParam); @@ -314,20 +318,20 @@ protected: int hotX, int hotY); virtual GHOST_TSuccess setWindowCustomCursorShape( - GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, - int sizey, - int hotX, - int hotY, - int fg_color, - int bg_color - ); + GHOST_TUns8 *bitmap, + GHOST_TUns8 *mask, + int sizex, + int sizey, + int hotX, + int hotY, + int fg_color, + int bg_color + ); /** Pointer to system */ - GHOST_SystemWin32 * m_system; + GHOST_SystemWin32 *m_system; /** Pointer to COM IDropTarget implementor */ - GHOST_DropTargetWin32 * m_dropTarget; + GHOST_DropTargetWin32 *m_dropTarget; /** Window handle. */ HWND m_hWnd; /** Device context handle. */ @@ -349,16 +353,16 @@ protected: HCURSOR m_customCursor; /** ITaskbarList3 structure for progress bar*/ - ITaskbarList3 * m_Bar; + ITaskbarList3 *m_Bar; - static wchar_t* s_windowClassName; + static wchar_t *s_windowClassName; static const int s_maxTitleLength; /** WinTab dll handle */ HMODULE m_wintab; /** Tablet data for GHOST */ - GHOST_TabletData* m_tabletData; + GHOST_TabletData *m_tabletData; /** Stores the Tablet context if detected Tablet features using WinTab.dll */ HCTX m_tablet; From f8f282fc96c4593bd7a0e1db7a095b2fc5205570 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 19 May 2012 09:46:41 +0000 Subject: [PATCH 041/159] =?UTF-8?q?Add=20i18n=20to=20=E2=80=9Cbutton?= =?UTF-8?q?=E2=80=9D=20and=20=E2=80=9CArea=20Options=E2=80=9D=20pop-up=20m?= =?UTF-8?q?enus.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editors/interface/interface_handlers.c | 113 ++++++++++++------ source/blender/editors/screen/screen_ops.c | 12 +- 2 files changed, 82 insertions(+), 43 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 8b0c3ecfcf3..82b6ef641b6 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -50,6 +50,8 @@ #include "BLI_utildefines.h" #include "BLI_string_cursor_utf8.h" +#include "BLF_translation.h" + #include "PIL_time.h" #include "BKE_colortools.h" @@ -4401,10 +4403,10 @@ static int ui_but_menu(bContext *C, uiBut *but) if (but->rnaprop) name = RNA_property_ui_name(but->rnaprop); - else if (but->optype) - name = but->optype->name; + else if (but->optype && but->optype->srna) + name = RNA_struct_ui_name(but->optype->srna); else - name = ""; // XXX - should never happen. + name = IFACE_(""); // XXX - should never happen. pup = uiPupMenuBegin(C, name, ICON_NONE); layout = uiPupMenuLayout(pup); @@ -4424,14 +4426,20 @@ static int ui_but_menu(bContext *C, uiBut *but) if (but->flag & UI_BUT_ANIMATED_KEY) { /* replace/delete keyfraemes */ if (length) { - uiItemBooleanO(layout, "Replace Keyframes", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); - uiItemBooleanO(layout, "Replace Single Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); - uiItemBooleanO(layout, "Delete Keyframes", ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 1); - uiItemBooleanO(layout, "Delete Single Keyframe", ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Replace Keyframes"), + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Replace Single Keyframe"), + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Keyframes"), + ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Single Keyframe"), + ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0); } else { - uiItemBooleanO(layout, "Replace Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); - uiItemBooleanO(layout, "Delete Keyframe", ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Replace Keyframe"), + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Keyframe"), + ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0); } /* keyframe settings */ @@ -4442,11 +4450,14 @@ static int ui_but_menu(bContext *C, uiBut *but) else if (but->flag & UI_BUT_DRIVEN) ; else if (is_anim) { if (length) { - uiItemBooleanO(layout, "Insert Keyframes", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); - uiItemBooleanO(layout, "Insert Single Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Insert Keyframes"), + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Insert Single Keyframe"), + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); } else - uiItemBooleanO(layout, "Insert Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Insert Keyframe"), + ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0); } /* Drivers */ @@ -4454,29 +4465,38 @@ static int ui_but_menu(bContext *C, uiBut *but) uiItemS(layout); if (length) { - uiItemBooleanO(layout, "Delete Drivers", ICON_NONE, "ANIM_OT_driver_button_remove", "all", 1); - uiItemBooleanO(layout, "Delete Single Driver", ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Drivers"), + ICON_NONE, "ANIM_OT_driver_button_remove", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Single Driver"), + ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0); } else - uiItemBooleanO(layout, "Delete Driver", ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Delete Driver"), + ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0); - uiItemO(layout, "Copy Driver", ICON_NONE, "ANIM_OT_copy_driver_button"); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Copy Driver"), + ICON_NONE, "ANIM_OT_copy_driver_button"); if (ANIM_driver_can_paste()) - uiItemO(layout, "Paste Driver", ICON_NONE, "ANIM_OT_paste_driver_button"); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Paste Driver"), + ICON_NONE, "ANIM_OT_paste_driver_button"); } else if (but->flag & (UI_BUT_ANIMATED_KEY | UI_BUT_ANIMATED)) ; else if (is_anim) { uiItemS(layout); if (length) { - uiItemBooleanO(layout, "Add Drivers", ICON_NONE, "ANIM_OT_driver_button_add", "all", 1); - uiItemBooleanO(layout, "Add Single Driver", ICON_NONE, "ANIM_OT_driver_button_add", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Drivers"), + ICON_NONE, "ANIM_OT_driver_button_add", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Single Driver"), + ICON_NONE, "ANIM_OT_driver_button_add", "all", 0); } else - uiItemBooleanO(layout, "Add Driver", ICON_NONE, "ANIM_OT_driver_button_add", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Driver"), + ICON_NONE, "ANIM_OT_driver_button_add", "all", 0); if (ANIM_driver_can_paste()) - uiItemO(layout, "Paste Driver", ICON_NONE, "ANIM_OT_paste_driver_button"); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Paste Driver"), + ICON_NONE, "ANIM_OT_paste_driver_button"); } /* Keying Sets */ @@ -4485,13 +4505,18 @@ static int ui_but_menu(bContext *C, uiBut *but) uiItemS(layout); if (length) { - uiItemBooleanO(layout, "Add All to Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 1); - uiItemBooleanO(layout, "Add Single to Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0); - uiItemO(layout, "Remove from Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_remove"); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add All to Keying Set"), + ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Single to Keying Set"), + ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Remove from Keying Set"), + ICON_NONE, "ANIM_OT_keyingset_button_remove"); } else { - uiItemBooleanO(layout, "Add to Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0); - uiItemO(layout, "Remove from Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_remove"); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add to Keying Set"), + ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Remove from Keying Set"), + ICON_NONE, "ANIM_OT_keyingset_button_remove"); } } @@ -4503,14 +4528,19 @@ static int ui_but_menu(bContext *C, uiBut *but) //Paste Property Value if (length) { - uiItemBooleanO(layout, "Reset All to Default Values", ICON_NONE, "UI_OT_reset_default_button", "all", 1); - uiItemBooleanO(layout, "Reset Single to Default Value", ICON_NONE, "UI_OT_reset_default_button", "all", 0); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset All to Default Values"), + ICON_NONE, "UI_OT_reset_default_button", "all", 1); + uiItemBooleanO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset Single to Default Value"), + ICON_NONE, "UI_OT_reset_default_button", "all", 0); } else - uiItemO(layout, "Reset to Default Value", ICON_NONE, "UI_OT_reset_default_button"); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Reset to Default Value"), + ICON_NONE, "UI_OT_reset_default_button"); - uiItemO(layout, "Copy Data Path", ICON_NONE, "UI_OT_copy_data_path_button"); - uiItemO(layout, "Copy To Selected", ICON_NONE, "UI_OT_copy_to_selected_button"); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Copy Data Path"), + ICON_NONE, "UI_OT_copy_data_path_button"); + uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Copy To Selected"), + ICON_NONE, "UI_OT_copy_to_selected_button"); uiItemS(layout); } @@ -4534,15 +4564,18 @@ static int ui_but_menu(bContext *C, uiBut *but) // would rather use a block but, but gets weirdly positioned... //uiDefBlockBut(block, menu_change_shortcut, but, "Change Shortcut", 0, 0, uiLayoutGetWidth(layout), UI_UNIT_Y, ""); - but2 = uiDefIconTextBut(block, BUT, 0, 0, "Change Shortcut", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + but2 = uiDefIconTextBut(block, BUT, 0, 0, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Change Shortcut"), + 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); uiButSetFunc(but2, popup_change_shortcut_func, but, NULL); - but2 = uiDefIconTextBut(block, BUT, 0, 0, "Remove Shortcut", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + but2 = uiDefIconTextBut(block, BUT, 0, 0, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Remove Shortcut"), + 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); uiButSetFunc(but2, remove_shortcut_func, but, NULL); } /* only show 'add' if there's a suitable key map for it to go in */ else if (WM_keymap_guess_opname(C, but->optype->idname)) { - but2 = uiDefIconTextBut(block, BUT, 0, 0, "Add Shortcut", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + but2 = uiDefIconTextBut(block, BUT, 0, 0, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Add Shortcut"), + 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); uiButSetFunc(but2, popup_add_shortcut_func, but, NULL); } @@ -4560,7 +4593,8 @@ static int ui_but_menu(bContext *C, uiBut *but) WM_operator_properties_create(&ptr_props, "WM_OT_doc_view"); RNA_string_set(&ptr_props, "doc_id", buf); - uiItemFullO(layout, "WM_OT_doc_view", "Python Documentation", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_view", CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Python Documentation"), + ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); /* XXX inactive option, not for public! */ #if 0 @@ -4576,19 +4610,22 @@ static int ui_but_menu(bContext *C, uiBut *but) WM_operator_properties_create(&ptr_props, "WM_OT_doc_view"); RNA_string_set(&ptr_props, "doc_id", buf); - uiItemFullO(layout, "WM_OT_doc_view", "Python Documentation", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_view", CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Python Documentation"), + ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit"); RNA_string_set(&ptr_props, "doc_id", buf); RNA_string_set(&ptr_props, "doc_new", but->optype->description); - uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NONE, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_edit", CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Submit Description"), + ICON_NONE, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0); } } /* perhaps we should move this into (G.debug & G_DEBUG) - campbell */ - uiItemFullO(layout, "UI_OT_editsource", "Edit Source", ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(layout, "UI_OT_editsource", CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Edit Source"), + ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 0d5aceb9870..9cbe69d29da 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -37,6 +37,8 @@ #include "BLI_dlrbTree.h" #include "BLI_utildefines.h" +#include "BLF_translation.h" + #include "DNA_armature_types.h" #include "DNA_lattice_types.h" #include "DNA_object_types.h" @@ -1535,7 +1537,7 @@ static EnumPropertyItem prop_direction_items[] = { static void SCREEN_OT_area_split(wmOperatorType *ot) { - ot->name = "Split area"; + ot->name = "Split Area"; ot->description = "Split selected area into new windows"; ot->idname = "SCREEN_OT_area_split"; @@ -2351,7 +2353,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event) static void SCREEN_OT_area_join(wmOperatorType *ot) { /* identifiers */ - ot->name = "Join area"; + ot->name = "Join Area"; ot->description = "Join selected areas into new window"; ot->idname = "SCREEN_OT_area_join"; @@ -2382,7 +2384,7 @@ static int screen_area_options_invoke(bContext *C, wmOperator *op, wmEvent *even if (actedge == NULL) return OPERATOR_CANCELLED; - pup = uiPupMenuBegin(C, op->type->name, ICON_NONE); + pup = uiPupMenuBegin(C, RNA_struct_ui_name(op->type->srna), ICON_NONE); layout = uiPupMenuLayout(pup); WM_operator_properties_create(&ptr1, "SCREEN_OT_area_join"); @@ -2399,8 +2401,8 @@ static int screen_area_options_invoke(bContext *C, wmOperator *op, wmEvent *even RNA_int_set(&ptr2, "mouse_x", event->x); RNA_int_set(&ptr2, "mouse_y", event->y); - uiItemFullO(layout, "SCREEN_OT_area_split", "Split Area", ICON_NONE, ptr2.data, WM_OP_INVOKE_DEFAULT, 0); - uiItemFullO(layout, "SCREEN_OT_area_join", "Join Area", ICON_NONE, ptr1.data, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(layout, "SCREEN_OT_area_split", NULL, ICON_NONE, ptr2.data, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(layout, "SCREEN_OT_area_join", NULL, ICON_NONE, ptr1.data, WM_OP_INVOKE_DEFAULT, 0); uiPupMenuEnd(C, pup); From 9c9a5b882d007c1b75136cfe9a0c4c3ec8769d26 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 19 May 2012 09:57:55 +0000 Subject: [PATCH 042/159] style cleanup: ghost --- intern/ghost/intern/GHOST_Buttons.cpp | 49 +- intern/ghost/intern/GHOST_C-api.cpp | 396 ++++----- .../intern/GHOST_CallbackEventConsumer.cpp | 2 +- intern/ghost/intern/GHOST_DisplayManager.cpp | 42 +- .../intern/GHOST_DisplayManagerCarbon.cpp | 64 +- .../ghost/intern/GHOST_DisplayManagerSDL.cpp | 8 +- .../intern/GHOST_DisplayManagerWin32.cpp | 87 +- intern/ghost/intern/GHOST_DropTargetWin32.cpp | 166 ++-- intern/ghost/intern/GHOST_EventManager.cpp | 43 +- intern/ghost/intern/GHOST_EventPrinter.cpp | 413 ++++----- intern/ghost/intern/GHOST_ISystem.cpp | 48 +- intern/ghost/intern/GHOST_ISystemPaths.cpp | 44 +- intern/ghost/intern/GHOST_ModifierKeys.cpp | 120 +-- intern/ghost/intern/GHOST_NDOFManager.cpp | 30 +- .../ghost/intern/GHOST_NDOFManagerWin32.cpp | 2 +- intern/ghost/intern/GHOST_Path-api.cpp | 16 +- intern/ghost/intern/GHOST_Rect.cpp | 4 +- intern/ghost/intern/GHOST_System.cpp | 65 +- intern/ghost/intern/GHOST_SystemCarbon.cpp | 823 ++++++++--------- .../ghost/intern/GHOST_SystemPathsCarbon.cpp | 18 +- .../ghost/intern/GHOST_SystemPathsWin32.cpp | 30 +- intern/ghost/intern/GHOST_SystemSDL.cpp | 484 +++++----- intern/ghost/intern/GHOST_SystemWin32.cpp | 718 +++++++-------- intern/ghost/intern/GHOST_TimerManager.cpp | 13 +- intern/ghost/intern/GHOST_Window.cpp | 47 +- intern/ghost/intern/GHOST_WindowCarbon.cpp | 490 +++++------ intern/ghost/intern/GHOST_WindowCocoa.mm | 4 +- intern/ghost/intern/GHOST_WindowManager.cpp | 46 +- intern/ghost/intern/GHOST_WindowSDL.cpp | 334 +++---- intern/ghost/intern/GHOST_WindowWin32.cpp | 825 +++++++++--------- intern/ghost/intern/GHOST_WindowX11.cpp | 22 +- intern/ghost/test/gears/GHOST_Test.cpp | 580 ++++++------ 32 files changed, 3034 insertions(+), 2999 deletions(-) diff --git a/intern/ghost/intern/GHOST_Buttons.cpp b/intern/ghost/intern/GHOST_Buttons.cpp index 1f56cf44b56..6b90383ee6b 100644 --- a/intern/ghost/intern/GHOST_Buttons.cpp +++ b/intern/ghost/intern/GHOST_Buttons.cpp @@ -42,37 +42,38 @@ GHOST_Buttons::GHOST_Buttons() bool GHOST_Buttons::get(GHOST_TButtonMask mask) const { - switch (mask) { - case GHOST_kButtonMaskLeft: - return m_ButtonLeft; - case GHOST_kButtonMaskMiddle: - return m_ButtonMiddle; - case GHOST_kButtonMaskRight: - return m_ButtonRight; - default: - return false; - } + switch (mask) { + case GHOST_kButtonMaskLeft: + return m_ButtonLeft; + case GHOST_kButtonMaskMiddle: + return m_ButtonMiddle; + case GHOST_kButtonMaskRight: + return m_ButtonRight; + default: + return false; + } } void GHOST_Buttons::set(GHOST_TButtonMask mask, bool down) { - switch (mask) { - case GHOST_kButtonMaskLeft: - m_ButtonLeft = down; break; - case GHOST_kButtonMaskMiddle: - m_ButtonMiddle = down; break; - case GHOST_kButtonMaskRight: - m_ButtonRight = down; break; - default: - break; - } + switch (mask) { + case GHOST_kButtonMaskLeft: + m_ButtonLeft = down; break; + case GHOST_kButtonMaskMiddle: + m_ButtonMiddle = down; break; + case GHOST_kButtonMaskRight: + m_ButtonRight = down; break; + default: + break; + } } void GHOST_Buttons::clear() { - m_ButtonLeft = false; - m_ButtonMiddle = false; - m_ButtonRight = false; + m_ButtonLeft = false; + m_ButtonMiddle = false; + m_ButtonRight = false; } -GHOST_Buttons::~GHOST_Buttons() {} +GHOST_Buttons::~GHOST_Buttons() { +} diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index 8442f82d886..ad43798bc60 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -50,7 +50,7 @@ GHOST_SystemHandle GHOST_CreateSystem(void) { GHOST_ISystem::createSystem(); - GHOST_ISystem* system = GHOST_ISystem::getSystem(); + GHOST_ISystem *system = GHOST_ISystem::getSystem(); return (GHOST_SystemHandle)system; } @@ -59,7 +59,7 @@ GHOST_SystemHandle GHOST_CreateSystem(void) GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return system->disposeSystem(); } @@ -68,20 +68,20 @@ GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle) GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback, GHOST_TUserDataPtr userdata) { - return (GHOST_EventConsumerHandle) new GHOST_CallbackEventConsumer (eventCallback, userdata); + return (GHOST_EventConsumerHandle) new GHOST_CallbackEventConsumer(eventCallback, userdata); } GHOST_TSuccess GHOST_DisposeEventConsumer(GHOST_EventConsumerHandle consumerhandle) { - delete ((GHOST_CallbackEventConsumer*)consumerhandle); + delete ((GHOST_CallbackEventConsumer *)consumerhandle); return GHOST_kSuccess; } GHOST_TUns64 GHOST_GetMilliSeconds(GHOST_SystemHandle systemhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return system->getMilliSeconds(); } @@ -89,12 +89,12 @@ GHOST_TUns64 GHOST_GetMilliSeconds(GHOST_SystemHandle systemhandle) GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle, - GHOST_TUns64 delay, - GHOST_TUns64 interval, - GHOST_TimerProcPtr timerproc, - GHOST_TUserDataPtr userdata) + GHOST_TUns64 delay, + GHOST_TUns64 interval, + GHOST_TimerProcPtr timerproc, + GHOST_TUserDataPtr userdata) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return (GHOST_TimerTaskHandle) system->installTimer(delay, interval, timerproc, userdata); } @@ -102,10 +102,10 @@ GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle, GHOST_TSuccess GHOST_RemoveTimer(GHOST_SystemHandle systemhandle, - GHOST_TimerTaskHandle timertaskhandle) + GHOST_TimerTaskHandle timertaskhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; - GHOST_ITimerTask* timertask = (GHOST_ITimerTask*) timertaskhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; + GHOST_ITimerTask *timertask = (GHOST_ITimerTask *) timertaskhandle; return system->removeTimer(timertask); } @@ -114,7 +114,7 @@ GHOST_TSuccess GHOST_RemoveTimer(GHOST_SystemHandle systemhandle, GHOST_TUns8 GHOST_GetNumDisplays(GHOST_SystemHandle systemhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return system->getNumDisplays(); } @@ -122,10 +122,10 @@ GHOST_TUns8 GHOST_GetNumDisplays(GHOST_SystemHandle systemhandle) void GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, - GHOST_TUns32* width, - GHOST_TUns32* height) + GHOST_TUns32 *width, + GHOST_TUns32 *height) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; system->getMainDisplayDimensions(*width, *height); } @@ -133,46 +133,46 @@ void GHOST_GetMainDisplayDimensions(GHOST_SystemHandle systemhandle, GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, - const char* title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const int stereoVisual, - const GHOST_TUns16 numOfAASamples) + const char *title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const int stereoVisual, + const GHOST_TUns16 numOfAASamples) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; bool bstereoVisual; - if(stereoVisual) + if (stereoVisual) bstereoVisual = true; else bstereoVisual = false; return (GHOST_WindowHandle) system->createWindow(title, left, top, width, height, - state, type, bstereoVisual, numOfAASamples); + state, type, bstereoVisual, numOfAASamples); } GHOST_TUserDataPtr GHOST_GetWindowUserData(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->getUserData(); } void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, GHOST_TUserDataPtr userdata) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; window->setUserData(userdata); } GHOST_TSuccess GHOST_DisposeWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle windowhandle) + GHOST_WindowHandle windowhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return system->disposeWindow(window); } @@ -180,10 +180,10 @@ GHOST_TSuccess GHOST_DisposeWindow(GHOST_SystemHandle systemhandle, int GHOST_ValidWindow(GHOST_SystemHandle systemhandle, - GHOST_WindowHandle windowhandle) + GHOST_WindowHandle windowhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return (int) system->validWindow(window); } @@ -191,14 +191,14 @@ int GHOST_ValidWindow(GHOST_SystemHandle systemhandle, GHOST_WindowHandle GHOST_BeginFullScreen(GHOST_SystemHandle systemhandle, - GHOST_DisplaySetting* setting, - const int stereoVisual) + GHOST_DisplaySetting *setting, + const int stereoVisual) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; - GHOST_IWindow* window = NULL; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; + GHOST_IWindow *window = NULL; bool bstereoVisual; - if(stereoVisual) + if (stereoVisual) bstereoVisual = true; else bstereoVisual = false; @@ -212,7 +212,7 @@ GHOST_WindowHandle GHOST_BeginFullScreen(GHOST_SystemHandle systemhandle, GHOST_TSuccess GHOST_EndFullScreen(GHOST_SystemHandle systemhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return system->endFullScreen(); } @@ -221,7 +221,7 @@ GHOST_TSuccess GHOST_EndFullScreen(GHOST_SystemHandle systemhandle) int GHOST_GetFullScreen(GHOST_SystemHandle systemhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return (int) system->getFullScreen(); } @@ -230,16 +230,16 @@ int GHOST_GetFullScreen(GHOST_SystemHandle systemhandle) int GHOST_ProcessEvents(GHOST_SystemHandle systemhandle, int waitForEvent) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; - return (int) system->processEvents(waitForEvent?true:false); + return (int) system->processEvents(waitForEvent ? true : false); } int GHOST_DispatchEvents(GHOST_SystemHandle systemhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return (int) system->dispatchEvents(); } @@ -247,28 +247,28 @@ int GHOST_DispatchEvents(GHOST_SystemHandle systemhandle) GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, GHOST_EventConsumerHandle consumerhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; - return system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle); + return system->addEventConsumer((GHOST_CallbackEventConsumer *)consumerhandle); } GHOST_TSuccess GHOST_RemoveEventConsumer(GHOST_SystemHandle systemhandle, GHOST_EventConsumerHandle consumerhandle) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; - return system->removeEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle); + return system->removeEventConsumer((GHOST_CallbackEventConsumer *)consumerhandle); } -GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle,float progress) +GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle, float progress) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setProgressBar(progress); } GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->endProgressBar(); } @@ -276,7 +276,7 @@ GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle) GHOST_TStandardCursor GHOST_GetCursorShape(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->getCursorShape(); } @@ -284,45 +284,45 @@ GHOST_TStandardCursor GHOST_GetCursorShape(GHOST_WindowHandle windowhandle) GHOST_TSuccess GHOST_SetCursorShape(GHOST_WindowHandle windowhandle, - GHOST_TStandardCursor cursorshape) + GHOST_TStandardCursor cursorshape) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setCursorShape(cursorshape); } GHOST_TSuccess GHOST_SetCustomCursorShape(GHOST_WindowHandle windowhandle, - GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], - int hotX, - int hotY) + GHOST_TUns8 bitmap[16][2], + GHOST_TUns8 mask[16][2], + int hotX, + int hotY) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setCustomCursorShape(bitmap, mask, hotX, hotY); } GHOST_TSuccess GHOST_SetCustomCursorShapeEx(GHOST_WindowHandle windowhandle, - GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, - int sizex, - int sizey, - int hotX, - int hotY, - int fg_color, - int bg_color) + GHOST_TUns8 *bitmap, + GHOST_TUns8 *mask, + int sizex, + int sizey, + int hotX, + int hotY, + int fg_color, + int bg_color) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; - return window->setCustomCursorShape(bitmap, mask, sizex, sizey, - hotX, hotY, fg_color, bg_color); + return window->setCustomCursorShape(bitmap, mask, sizex, sizey, + hotX, hotY, fg_color, bg_color); } int GHOST_GetCursorVisibility(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return (int) window->getCursorVisibility(); } @@ -330,20 +330,20 @@ int GHOST_GetCursorVisibility(GHOST_WindowHandle windowhandle) GHOST_TSuccess GHOST_SetCursorVisibility(GHOST_WindowHandle windowhandle, - int visible) + int visible) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; - return window->setCursorVisibility(visible?true:false); + return window->setCursorVisibility(visible ? true : false); } GHOST_TSuccess GHOST_GetCursorPosition(GHOST_SystemHandle systemhandle, - GHOST_TInt32* x, - GHOST_TInt32* y) + GHOST_TInt32 *x, + GHOST_TInt32 *y) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return system->getCursorPosition(*x, *y); } @@ -351,23 +351,23 @@ GHOST_TSuccess GHOST_GetCursorPosition(GHOST_SystemHandle systemhandle, GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, - GHOST_TInt32 x, - GHOST_TInt32 y) + GHOST_TInt32 x, + GHOST_TInt32 y) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; return system->setCursorPosition(x, y); } GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, - GHOST_TGrabCursorMode mode, - int *bounds) + GHOST_TGrabCursorMode mode, + int *bounds) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; GHOST_Rect bounds_rect, bounds_win; - if(bounds) { + if (bounds) { /* if this is X11 specific we need a function that converts */ window->getClientBounds(bounds_win); window->clientToScreen(bounds[0], bounds_win.getHeight() - bounds[1], bounds_rect.m_l, bounds_rect.m_t); @@ -375,17 +375,17 @@ GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, } - return window->setCursorGrab(mode, bounds ? &bounds_rect:NULL); + return window->setCursorGrab(mode, bounds ? &bounds_rect : NULL); } GHOST_TSuccess GHOST_GetModifierKeyState(GHOST_SystemHandle systemhandle, - GHOST_TModifierKeyMask mask, - int* isDown) + GHOST_TModifierKeyMask mask, + int *isDown) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; GHOST_TSuccess result; - bool isdown= false; + bool isdown = false; result = system->getModifierKeyState(mask, isdown); *isDown = (int) isdown; @@ -396,12 +396,12 @@ GHOST_TSuccess GHOST_GetModifierKeyState(GHOST_SystemHandle systemhandle, GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle, - GHOST_TButtonMask mask, - int* isDown) + GHOST_TButtonMask mask, + int *isDown) { - GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; + GHOST_ISystem *system = (GHOST_ISystem *) systemhandle; GHOST_TSuccess result; - bool isdown= false; + bool isdown = false; result = system->getButtonState(mask, isdown); *isDown = (int) isdown; @@ -412,7 +412,7 @@ GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle, void GHOST_setAcceptDragOperation(GHOST_WindowHandle windowhandle, GHOST_TInt8 canAccept) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; window->setAcceptDragOperation(canAccept); } @@ -420,7 +420,7 @@ void GHOST_setAcceptDragOperation(GHOST_WindowHandle windowhandle, GHOST_TInt8 c GHOST_TEventType GHOST_GetEventType(GHOST_EventHandle eventhandle) { - GHOST_IEvent* event = (GHOST_IEvent*) eventhandle; + GHOST_IEvent *event = (GHOST_IEvent *) eventhandle; return event->getType(); } @@ -429,7 +429,7 @@ GHOST_TEventType GHOST_GetEventType(GHOST_EventHandle eventhandle) GHOST_TUns64 GHOST_GetEventTime(GHOST_EventHandle eventhandle) { - GHOST_IEvent* event = (GHOST_IEvent*) eventhandle; + GHOST_IEvent *event = (GHOST_IEvent *) eventhandle; return event->getTime(); } @@ -437,7 +437,7 @@ GHOST_TUns64 GHOST_GetEventTime(GHOST_EventHandle eventhandle) GHOST_WindowHandle GHOST_GetEventWindow(GHOST_EventHandle eventhandle) { - GHOST_IEvent* event = (GHOST_IEvent*) eventhandle; + GHOST_IEvent *event = (GHOST_IEvent *) eventhandle; return (GHOST_WindowHandle) event->getWindow(); } @@ -445,7 +445,7 @@ GHOST_WindowHandle GHOST_GetEventWindow(GHOST_EventHandle eventhandle) GHOST_TEventDataPtr GHOST_GetEventData(GHOST_EventHandle eventhandle) { - GHOST_IEvent* event = (GHOST_IEvent*) eventhandle; + GHOST_IEvent *event = (GHOST_IEvent *) eventhandle; return event->getData(); } @@ -454,7 +454,7 @@ GHOST_TEventDataPtr GHOST_GetEventData(GHOST_EventHandle eventhandle) GHOST_TimerProcPtr GHOST_GetTimerProc(GHOST_TimerTaskHandle timertaskhandle) { - GHOST_ITimerTask* timertask = (GHOST_ITimerTask*) timertaskhandle; + GHOST_ITimerTask *timertask = (GHOST_ITimerTask *) timertaskhandle; return timertask->getTimerProc(); } @@ -462,9 +462,9 @@ GHOST_TimerProcPtr GHOST_GetTimerProc(GHOST_TimerTaskHandle timertaskhandle) void GHOST_SetTimerProc(GHOST_TimerTaskHandle timertaskhandle, - GHOST_TimerProcPtr timerproc) + GHOST_TimerProcPtr timerproc) { - GHOST_ITimerTask* timertask = (GHOST_ITimerTask*) timertaskhandle; + GHOST_ITimerTask *timertask = (GHOST_ITimerTask *) timertaskhandle; timertask->setTimerProc(timerproc); } @@ -473,17 +473,17 @@ void GHOST_SetTimerProc(GHOST_TimerTaskHandle timertaskhandle, GHOST_TUserDataPtr GHOST_GetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle) { - GHOST_ITimerTask* timertask = (GHOST_ITimerTask*) timertaskhandle; + GHOST_ITimerTask *timertask = (GHOST_ITimerTask *) timertaskhandle; return timertask->getUserData(); } - + void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle, - GHOST_TUserDataPtr userdata) + GHOST_TUserDataPtr userdata) { - GHOST_ITimerTask* timertask = (GHOST_ITimerTask*) timertaskhandle; + GHOST_ITimerTask *timertask = (GHOST_ITimerTask *) timertaskhandle; timertask->setUserData(userdata); } @@ -492,7 +492,7 @@ void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle, int GHOST_GetValid(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return (int) window->getValid(); } @@ -501,7 +501,7 @@ int GHOST_GetValid(GHOST_WindowHandle windowhandle) GHOST_TDrawingContextType GHOST_GetDrawingContextType(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->getDrawingContextType(); } @@ -509,9 +509,9 @@ GHOST_TDrawingContextType GHOST_GetDrawingContextType(GHOST_WindowHandle windowh GHOST_TSuccess GHOST_SetDrawingContextType(GHOST_WindowHandle windowhandle, - GHOST_TDrawingContextType type) + GHOST_TDrawingContextType type) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setDrawingContextType(type); } @@ -519,26 +519,26 @@ GHOST_TSuccess GHOST_SetDrawingContextType(GHOST_WindowHandle windowhandle, void GHOST_SetTitle(GHOST_WindowHandle windowhandle, - const char* title) + const char *title) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; window->setTitle(title); } -char* GHOST_GetTitle(GHOST_WindowHandle windowhandle) +char *GHOST_GetTitle(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; STR_String title; window->getTitle(title); - char *ctitle = (char*) malloc(title.Length() + 1); + char *ctitle = (char *) malloc(title.Length() + 1); if (ctitle == NULL) return NULL; strcpy(ctitle, title.Ptr()); - + return ctitle; } @@ -546,8 +546,8 @@ char* GHOST_GetTitle(GHOST_WindowHandle windowhandle) GHOST_RectangleHandle GHOST_GetWindowBounds(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; - GHOST_Rect* rectangle = NULL; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; + GHOST_Rect *rectangle = NULL; rectangle = new GHOST_Rect(); window->getWindowBounds(*rectangle); @@ -559,8 +559,8 @@ GHOST_RectangleHandle GHOST_GetWindowBounds(GHOST_WindowHandle windowhandle) GHOST_RectangleHandle GHOST_GetClientBounds(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; - GHOST_Rect* rectangle = NULL; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; + GHOST_Rect *rectangle = NULL; rectangle = new GHOST_Rect(); window->getClientBounds(*rectangle); @@ -572,15 +572,15 @@ GHOST_RectangleHandle GHOST_GetClientBounds(GHOST_WindowHandle windowhandle) void GHOST_DisposeRectangle(GHOST_RectangleHandle rectanglehandle) { - delete (GHOST_Rect*) rectanglehandle; + delete (GHOST_Rect *) rectanglehandle; } GHOST_TSuccess GHOST_SetClientWidth(GHOST_WindowHandle windowhandle, - GHOST_TUns32 width) + GHOST_TUns32 width) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setClientWidth(width); } @@ -588,9 +588,9 @@ GHOST_TSuccess GHOST_SetClientWidth(GHOST_WindowHandle windowhandle, GHOST_TSuccess GHOST_SetClientHeight(GHOST_WindowHandle windowhandle, - GHOST_TUns32 height) + GHOST_TUns32 height) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setClientHeight(height); } @@ -598,10 +598,10 @@ GHOST_TSuccess GHOST_SetClientHeight(GHOST_WindowHandle windowhandle, GHOST_TSuccess GHOST_SetClientSize(GHOST_WindowHandle windowhandle, - GHOST_TUns32 width, - GHOST_TUns32 height) + GHOST_TUns32 width, + GHOST_TUns32 height) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setClientSize(width, height); } @@ -609,12 +609,12 @@ GHOST_TSuccess GHOST_SetClientSize(GHOST_WindowHandle windowhandle, void GHOST_ScreenToClient(GHOST_WindowHandle windowhandle, - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32* outX, - GHOST_TInt32* outY) + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32 *outX, + GHOST_TInt32 *outY) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; window->screenToClient(inX, inY, *outX, *outY); } @@ -622,12 +622,12 @@ void GHOST_ScreenToClient(GHOST_WindowHandle windowhandle, void GHOST_ClientToScreen(GHOST_WindowHandle windowhandle, - GHOST_TInt32 inX, - GHOST_TInt32 inY, - GHOST_TInt32* outX, - GHOST_TInt32* outY) + GHOST_TInt32 inX, + GHOST_TInt32 inY, + GHOST_TInt32 *outX, + GHOST_TInt32 *outY) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; window->clientToScreen(inX, inY, *outX, *outY); } @@ -636,7 +636,7 @@ void GHOST_ClientToScreen(GHOST_WindowHandle windowhandle, GHOST_TWindowState GHOST_GetWindowState(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->getState(); } @@ -644,9 +644,9 @@ GHOST_TWindowState GHOST_GetWindowState(GHOST_WindowHandle windowhandle) GHOST_TSuccess GHOST_SetWindowState(GHOST_WindowHandle windowhandle, - GHOST_TWindowState state) + GHOST_TWindowState state) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setState(state); } @@ -654,16 +654,16 @@ GHOST_TSuccess GHOST_SetWindowState(GHOST_WindowHandle windowhandle, GHOST_TSuccess GHOST_SetWindowModifiedState(GHOST_WindowHandle windowhandle, GHOST_TUns8 isUnsavedChanges) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setModifiedState(isUnsavedChanges); } GHOST_TSuccess GHOST_SetWindowOrder(GHOST_WindowHandle windowhandle, - GHOST_TWindowOrder order) + GHOST_TWindowOrder order) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->setOrder(order); } @@ -672,7 +672,7 @@ GHOST_TSuccess GHOST_SetWindowOrder(GHOST_WindowHandle windowhandle, GHOST_TSuccess GHOST_SwapWindowBuffers(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->swapBuffers(); } @@ -681,7 +681,7 @@ GHOST_TSuccess GHOST_SwapWindowBuffers(GHOST_WindowHandle windowhandle) GHOST_TSuccess GHOST_ActivateWindowDrawingContext(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->activateDrawingContext(); } @@ -690,54 +690,54 @@ GHOST_TSuccess GHOST_ActivateWindowDrawingContext(GHOST_WindowHandle windowhandl GHOST_TSuccess GHOST_InvalidateWindow(GHOST_WindowHandle windowhandle) { - GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_IWindow *window = (GHOST_IWindow *) windowhandle; return window->invalidate(); } -extern const GHOST_TabletData* GHOST_GetTabletData(GHOST_WindowHandle windowhandle) +extern const GHOST_TabletData *GHOST_GetTabletData(GHOST_WindowHandle windowhandle) { - return ((GHOST_IWindow*)windowhandle)->GetTabletData(); + return ((GHOST_IWindow *)windowhandle)->GetTabletData(); } GHOST_TInt32 GHOST_GetWidthRectangle(GHOST_RectangleHandle rectanglehandle) { - return ((GHOST_Rect*)rectanglehandle)->getWidth(); + return ((GHOST_Rect *)rectanglehandle)->getWidth(); } GHOST_TInt32 GHOST_GetHeightRectangle(GHOST_RectangleHandle rectanglehandle) { - return ((GHOST_Rect*)rectanglehandle)->getHeight(); + return ((GHOST_Rect *)rectanglehandle)->getHeight(); } void GHOST_GetRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32* l, - GHOST_TInt32* t, - GHOST_TInt32* r, - GHOST_TInt32* b) + GHOST_TInt32 *l, + GHOST_TInt32 *t, + GHOST_TInt32 *r, + GHOST_TInt32 *b) { - GHOST_Rect *rect= (GHOST_Rect*) rectanglehandle; - - *l= rect->m_l; - *t= rect->m_t; - *r= rect->m_r; - *b= rect->m_b; + GHOST_Rect *rect = (GHOST_Rect *) rectanglehandle; + + *l = rect->m_l; + *t = rect->m_t; + *r = rect->m_r; + *b = rect->m_b; } void GHOST_SetRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 l, - GHOST_TInt32 t, - GHOST_TInt32 r, - GHOST_TInt32 b) + GHOST_TInt32 l, + GHOST_TInt32 t, + GHOST_TInt32 r, + GHOST_TInt32 b) { - ((GHOST_Rect*)rectanglehandle)->set(l, t, r, b); + ((GHOST_Rect *)rectanglehandle)->set(l, t, r, b); } @@ -746,7 +746,7 @@ GHOST_TSuccess GHOST_IsEmptyRectangle(GHOST_RectangleHandle rectanglehandle) { GHOST_TSuccess result = GHOST_kFailure; - if (((GHOST_Rect*)rectanglehandle)->isEmpty()) + if (((GHOST_Rect *)rectanglehandle)->isEmpty()) result = GHOST_kSuccess; return result; @@ -758,7 +758,7 @@ GHOST_TSuccess GHOST_IsValidRectangle(GHOST_RectangleHandle rectanglehandle) { GHOST_TSuccess result = GHOST_kFailure; - if(((GHOST_Rect*)rectanglehandle)->isValid()) + if (((GHOST_Rect *)rectanglehandle)->isValid()) result = GHOST_kSuccess; return result; @@ -767,37 +767,37 @@ GHOST_TSuccess GHOST_IsValidRectangle(GHOST_RectangleHandle rectanglehandle) void GHOST_InsetRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 i) + GHOST_TInt32 i) { - ((GHOST_Rect*)rectanglehandle)->inset(i); + ((GHOST_Rect *)rectanglehandle)->inset(i); } void GHOST_UnionRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_RectangleHandle anotherrectanglehandle) + GHOST_RectangleHandle anotherrectanglehandle) { - ((GHOST_Rect*)rectanglehandle)->unionRect(*(GHOST_Rect*)anotherrectanglehandle); + ((GHOST_Rect *)rectanglehandle)->unionRect(*(GHOST_Rect *)anotherrectanglehandle); } void GHOST_UnionPointRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 x, - GHOST_TInt32 y) + GHOST_TInt32 x, + GHOST_TInt32 y) { - ((GHOST_Rect*)rectanglehandle)->unionPoint(x, y); + ((GHOST_Rect *)rectanglehandle)->unionPoint(x, y); } GHOST_TSuccess GHOST_IsInsideRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 x, - GHOST_TInt32 y) + GHOST_TInt32 x, + GHOST_TInt32 y) { GHOST_TSuccess result = GHOST_kFailure; - if (((GHOST_Rect*)rectanglehandle)->isInside(x, y)) + if (((GHOST_Rect *)rectanglehandle)->isInside(x, y)) result = GHOST_kSuccess; return result; @@ -806,11 +806,11 @@ GHOST_TSuccess GHOST_IsInsideRectangle(GHOST_RectangleHandle rectanglehandle, GHOST_TVisibility GHOST_GetRectangleVisibility(GHOST_RectangleHandle rectanglehandle, - GHOST_RectangleHandle anotherrectanglehandle) + GHOST_RectangleHandle anotherrectanglehandle) { GHOST_TVisibility visible = GHOST_kNotVisible; - visible = ((GHOST_Rect*)rectanglehandle)->getVisibility(*(GHOST_Rect*)anotherrectanglehandle); + visible = ((GHOST_Rect *)rectanglehandle)->getVisibility(*(GHOST_Rect *)anotherrectanglehandle); return visible; } @@ -818,56 +818,56 @@ GHOST_TVisibility GHOST_GetRectangleVisibility(GHOST_RectangleHandle rectangleha void GHOST_SetCenterRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 cx, - GHOST_TInt32 cy) + GHOST_TInt32 cx, + GHOST_TInt32 cy) { - ((GHOST_Rect*)rectanglehandle)->setCenter(cx, cy); + ((GHOST_Rect *)rectanglehandle)->setCenter(cx, cy); } void GHOST_SetRectangleCenter(GHOST_RectangleHandle rectanglehandle, - GHOST_TInt32 cx, - GHOST_TInt32 cy, - GHOST_TInt32 w, - GHOST_TInt32 h) + GHOST_TInt32 cx, + GHOST_TInt32 cy, + GHOST_TInt32 w, + GHOST_TInt32 h) { - ((GHOST_Rect*)rectanglehandle)->setCenter(cx, cy, w, h); + ((GHOST_Rect *)rectanglehandle)->setCenter(cx, cy, w, h); } GHOST_TSuccess GHOST_ClipRectangle(GHOST_RectangleHandle rectanglehandle, - GHOST_RectangleHandle anotherrectanglehandle) + GHOST_RectangleHandle anotherrectanglehandle) { GHOST_TSuccess result = GHOST_kFailure; - if (((GHOST_Rect*)rectanglehandle)->clip(*(GHOST_Rect*)anotherrectanglehandle)) + if (((GHOST_Rect *)rectanglehandle)->clip(*(GHOST_Rect *)anotherrectanglehandle)) result = GHOST_kSuccess; return result; } -GHOST_TUns8* GHOST_getClipboard(int selection) +GHOST_TUns8 *GHOST_getClipboard(int selection) { - GHOST_ISystem* system = GHOST_ISystem::getSystem(); + GHOST_ISystem *system = GHOST_ISystem::getSystem(); return system->getClipboard(selection); } void GHOST_putClipboard(GHOST_TInt8 *buffer, int selection) { - GHOST_ISystem* system = GHOST_ISystem::getSystem(); + GHOST_ISystem *system = GHOST_ISystem::getSystem(); system->putClipboard(buffer, selection); } int GHOST_toggleConsole(int action) { - GHOST_ISystem* system = GHOST_ISystem::getSystem(); + GHOST_ISystem *system = GHOST_ISystem::getSystem(); return system->toggleConsole(action); } int GHOST_confirmQuit(GHOST_WindowHandle windowhandle){ - GHOST_ISystem* system = GHOST_ISystem::getSystem(); - return system->confirmQuit((GHOST_IWindow*) windowhandle); + GHOST_ISystem *system = GHOST_ISystem::getSystem(); + return system->confirmQuit((GHOST_IWindow *) windowhandle); } diff --git a/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp b/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp index 49590c77eaa..2e602f33b43 100644 --- a/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp +++ b/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp @@ -49,7 +49,7 @@ GHOST_CallbackEventConsumer::GHOST_CallbackEventConsumer(GHOST_EventCallbackProc } -bool GHOST_CallbackEventConsumer::processEvent(GHOST_IEvent* event) +bool GHOST_CallbackEventConsumer::processEvent(GHOST_IEvent *event) { return m_eventCallback((GHOST_EventHandle)event, m_userData) != 0; } diff --git a/intern/ghost/intern/GHOST_DisplayManager.cpp b/intern/ghost/intern/GHOST_DisplayManager.cpp index ca0d53b8297..380fb817ab0 100644 --- a/intern/ghost/intern/GHOST_DisplayManager.cpp +++ b/intern/ghost/intern/GHOST_DisplayManager.cpp @@ -41,8 +41,8 @@ GHOST_DisplayManager::GHOST_DisplayManager( - void) -: m_settingsInitialized(false) + void) + : m_settingsInitialized(false) { } @@ -54,7 +54,7 @@ GHOST_DisplayManager::~GHOST_DisplayManager(void) GHOST_TSuccess GHOST_DisplayManager::initialize( - void) + void) { GHOST_TSuccess success; if (!m_settingsInitialized) { @@ -70,7 +70,7 @@ GHOST_DisplayManager::initialize( GHOST_TSuccess GHOST_DisplayManager::getNumDisplays( - GHOST_TUns8& /*numDisplays*/) const + GHOST_TUns8& /*numDisplays*/) const { // Don't know if we have a display... return GHOST_kFailure; @@ -79,8 +79,8 @@ GHOST_DisplayManager::getNumDisplays( GHOST_TSuccess GHOST_DisplayManager::getNumDisplaySettings( - GHOST_TUns8 display, - GHOST_TInt32& numSettings) const + GHOST_TUns8 display, + GHOST_TInt32& numSettings) const { GHOST_TSuccess success; @@ -101,9 +101,9 @@ GHOST_DisplayManager::getNumDisplaySettings( GHOST_TSuccess GHOST_DisplayManager::getDisplaySetting( - GHOST_TUns8 display, - GHOST_TInt32 index, - GHOST_DisplaySetting& setting) const + GHOST_TUns8 display, + GHOST_TInt32 index, + GHOST_DisplaySetting& setting) const { GHOST_TSuccess success; @@ -124,8 +124,8 @@ GHOST_DisplayManager::getDisplaySetting( GHOST_TSuccess GHOST_DisplayManager::getCurrentDisplaySetting( - GHOST_TUns8 /*display*/, - GHOST_DisplaySetting& /*setting*/) const + GHOST_TUns8 /*display*/, + GHOST_DisplaySetting& /*setting*/) const { return GHOST_kFailure; } @@ -133,8 +133,8 @@ GHOST_DisplayManager::getCurrentDisplaySetting( GHOST_TSuccess GHOST_DisplayManager::setCurrentDisplaySetting( - GHOST_TUns8 /*display*/, - const GHOST_DisplaySetting& /*setting*/) + GHOST_TUns8 /*display*/, + const GHOST_DisplaySetting& /*setting*/) { return GHOST_kFailure; } @@ -142,18 +142,18 @@ GHOST_DisplayManager::setCurrentDisplaySetting( GHOST_TSuccess GHOST_DisplayManager::findMatch( - GHOST_TUns8 display, - const GHOST_DisplaySetting& setting, - GHOST_DisplaySetting& match) const + GHOST_TUns8 display, + const GHOST_DisplaySetting& setting, + GHOST_DisplaySetting& match) const { GHOST_TSuccess success = GHOST_kSuccess; GHOST_ASSERT(m_settingsInitialized, "GHOST_DisplayManager::findMatch(): m_settingsInitialized=false"); int criteria[4] = { - (int)setting.xPixels, - (int)setting.yPixels, - (int)setting.bpp, - (int)setting.frequency + (int)setting.xPixels, + (int)setting.yPixels, + (int)setting.bpp, + (int)setting.frequency }; int capabilities[4]; double field, score; @@ -195,7 +195,7 @@ GHOST_DisplayManager::findMatch( GHOST_TSuccess GHOST_DisplayManager::initializeSettings( - void) + void) { GHOST_TUns8 numDisplays; GHOST_TSuccess success = getNumDisplays(numDisplays); diff --git a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp index 1449da7b096..7752ae8cbc0 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp @@ -52,8 +52,8 @@ GHOST_DisplayManagerCarbon::GHOST_DisplayManagerCarbon(void) } if (m_numDisplays > 0) { - m_displayIDs = new CGDirectDisplayID [m_numDisplays]; - GHOST_ASSERT((m_displayIDs!=NULL), "GHOST_DisplayManagerCarbon::GHOST_DisplayManagerCarbon(): memory allocation failed"); + m_displayIDs = new CGDirectDisplayID[m_numDisplays]; + GHOST_ASSERT((m_displayIDs != NULL), "GHOST_DisplayManagerCarbon::GHOST_DisplayManagerCarbon(): memory allocation failed"); ::CGGetActiveDisplayList(m_numDisplays, m_displayIDs, &m_numDisplays); } } @@ -68,7 +68,7 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::getNumDisplays(GHOST_TUns8& numDispla GHOST_TSuccess GHOST_DisplayManagerCarbon::getNumDisplaySettings(GHOST_TUns8 display, GHOST_TInt32& numSettings) const { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCarbon::getNumDisplaySettings(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerCarbon::getNumDisplaySettings(): only main display is supported"); CFArrayRef displayModes; displayModes = ::CGDisplayAvailableModes(m_displayIDs[display]); @@ -81,19 +81,19 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::getNumDisplaySettings(GHOST_TUns8 dis GHOST_TSuccess GHOST_DisplayManagerCarbon::getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCarbon::getDisplaySetting(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerCarbon::getDisplaySetting(): only main display is supported"); CFArrayRef displayModes; CGDirectDisplayID d = m_displayIDs[display]; displayModes = ::CGDisplayAvailableModes(d); //CFIndex numModes = ::CFArrayGetCount(displayModes);/*unused*/ //GHOST_TInt32 numSettings = (GHOST_TInt32)numModes; /*unused*/ - CFDictionaryRef displayModeValues = (CFDictionaryRef)::CFArrayGetValueAtIndex(displayModes, index); + CFDictionaryRef displayModeValues = (CFDictionaryRef) ::CFArrayGetValueAtIndex(displayModes, index); - setting.xPixels = getValue(displayModeValues, kCGDisplayWidth); - setting.yPixels = getValue(displayModeValues, kCGDisplayHeight); - setting.bpp = getValue(displayModeValues, kCGDisplayBitsPerPixel); - setting.frequency = getValue(displayModeValues, kCGDisplayRefreshRate); + setting.xPixels = getValue(displayModeValues, kCGDisplayWidth); + setting.yPixels = getValue(displayModeValues, kCGDisplayHeight); + setting.bpp = getValue(displayModeValues, kCGDisplayBitsPerPixel); + setting.frequency = getValue(displayModeValues, kCGDisplayRefreshRate); #ifdef GHOST_DEBUG printf("display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency); @@ -105,14 +105,14 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::getDisplaySetting(GHOST_TUns8 display GHOST_TSuccess GHOST_DisplayManagerCarbon::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCarbon::getCurrentDisplaySetting(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerCarbon::getCurrentDisplaySetting(): only main display is supported"); CFDictionaryRef displayModeValues = ::CGDisplayCurrentMode(m_displayIDs[display]); - setting.xPixels = getValue(displayModeValues, kCGDisplayWidth); - setting.yPixels = getValue(displayModeValues, kCGDisplayHeight); - setting.bpp = getValue(displayModeValues, kCGDisplayBitsPerPixel); - setting.frequency = getValue(displayModeValues, kCGDisplayRefreshRate); + setting.xPixels = getValue(displayModeValues, kCGDisplayWidth); + setting.yPixels = getValue(displayModeValues, kCGDisplayHeight); + setting.bpp = getValue(displayModeValues, kCGDisplayBitsPerPixel); + setting.frequency = getValue(displayModeValues, kCGDisplayRefreshRate); #ifdef GHOST_DEBUG printf("current display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency); @@ -124,7 +124,7 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::getCurrentDisplaySetting(GHOST_TUns8 GHOST_TSuccess GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting) { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(): only main display is supported"); #ifdef GHOST_DEBUG printf("GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(): requested settings:\n"); @@ -135,12 +135,12 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(GHOST_TUns8 #endif // GHOST_DEBUG CFDictionaryRef displayModeValues = ::CGDisplayBestModeForParametersAndRefreshRate( - m_displayIDs[display], - (size_t)setting.bpp, - (size_t)setting.xPixels, - (size_t)setting.yPixels, - (CGRefreshRate)setting.frequency, - NULL); + m_displayIDs[display], + (size_t)setting.bpp, + (size_t)setting.xPixels, + (size_t)setting.yPixels, + (CGRefreshRate)setting.frequency, + NULL); #ifdef GHOST_DEBUG printf("GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(): switching to:\n"); @@ -158,20 +158,20 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::setCurrentDisplaySetting(GHOST_TUns8 long GHOST_DisplayManagerCarbon::getValue(CFDictionaryRef values, CFStringRef key) const { - CFNumberRef numberValue = (CFNumberRef) CFDictionaryGetValue(values, key); + CFNumberRef numberValue = (CFNumberRef) CFDictionaryGetValue(values, key); - if (!numberValue) - { - return -1; - } + if (!numberValue) + { + return -1; + } - long intValue; + long intValue; - if (!CFNumberGetValue(numberValue, kCFNumberLongType, &intValue)) - { - return -1; - } + if (!CFNumberGetValue(numberValue, kCFNumberLongType, &intValue)) + { + return -1; + } - return intValue; + return intValue; } diff --git a/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp b/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp index 8d2348dcf5c..fbfbce264a5 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp @@ -45,7 +45,7 @@ GHOST_DisplayManagerSDL::GHOST_DisplayManagerSDL(GHOST_SystemSDL *system) GHOST_TSuccess GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays) const { - numDisplays= SDL_GetNumVideoDisplays(); + numDisplays = SDL_GetNumVideoDisplays(); return GHOST_kSuccess; } @@ -140,8 +140,10 @@ GHOST_DisplayManagerSDL:: setCurrentDisplaySetting(GHOST_TUns8 display, SDL_GetDisplayMode(display, i, &mode); if (setting.xPixels > mode.w || - setting.yPixels > mode.h) + setting.yPixels > mode.h) + { continue; + } x = setting.xPixels - mode.w; y = setting.yPixels - mode.h; @@ -175,7 +177,7 @@ GHOST_DisplayManagerSDL:: setCurrentDisplaySetting(GHOST_TUns8 display, } else { /* this is a problem for the BGE player :S, perhaps SDL2 will resolve at some point. - * we really need SDL_SetDisplayModeForDisplay() to become an API func! - campbell */ + * we really need SDL_SetDisplayModeForDisplay() to become an API func! - campbell */ printf("no windows available, cant fullscreen"); /* do not fail, we will try again later when the window is created - wander */ diff --git a/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp b/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp index b7d62a8109e..83df9971158 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp @@ -67,7 +67,7 @@ GHOST_TSuccess GHOST_DisplayManagerWin32::getNumDisplays(GHOST_TUns8& numDisplay */ GHOST_TSuccess GHOST_DisplayManagerWin32::getNumDisplaySettings(GHOST_TUns8 display, GHOST_TInt32& numSettings) const { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerWin32::getNumDisplaySettings(): only main displlay is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerWin32::getNumDisplaySettings(): only main displlay is supported"); numSettings = 0; DEVMODE dm; while (::EnumDisplaySettings(NULL, numSettings, &dm)) { @@ -79,16 +79,16 @@ GHOST_TSuccess GHOST_DisplayManagerWin32::getNumDisplaySettings(GHOST_TUns8 disp GHOST_TSuccess GHOST_DisplayManagerWin32::getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerWin32::getDisplaySetting(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerWin32::getDisplaySetting(): only main display is supported"); GHOST_TSuccess success; DEVMODE dm; if (::EnumDisplaySettings(NULL, index, &dm)) { #ifdef GHOST_DEBUG printf("display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel, dm.dmDisplayFrequency); #endif // GHOST_DEBUG - setting.xPixels = dm.dmPelsWidth; - setting.yPixels = dm.dmPelsHeight; - setting.bpp = dm.dmBitsPerPel; + setting.xPixels = dm.dmPelsWidth; + setting.yPixels = dm.dmPelsHeight; + setting.bpp = dm.dmBitsPerPel; /* When you call the EnumDisplaySettings function, the dmDisplayFrequency member * may return with the value 0 or 1. These values represent the display hardware's * default refresh rate. This default rate is typically set by switches on a display @@ -112,14 +112,14 @@ GHOST_TSuccess GHOST_DisplayManagerWin32::getDisplaySetting(GHOST_TUns8 display, GHOST_TSuccess GHOST_DisplayManagerWin32::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerWin32::getCurrentDisplaySetting(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerWin32::getCurrentDisplaySetting(): only main display is supported"); return getDisplaySetting(kMainDisplay, ENUM_CURRENT_SETTINGS, setting); } GHOST_TSuccess GHOST_DisplayManagerWin32::setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting) { - GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerWin32::setCurrentDisplaySetting(): only main display is supported"); + GHOST_ASSERT((display == kMainDisplay), "GHOST_DisplayManagerWin32::setCurrentDisplaySetting(): only main display is supported"); GHOST_DisplaySetting match; findMatch(display, setting, match); @@ -127,21 +127,22 @@ GHOST_TSuccess GHOST_DisplayManagerWin32::setCurrentDisplaySetting(GHOST_TUns8 d int i = 0; while (::EnumDisplaySettings(NULL, i++, &dm)) { if ((dm.dmBitsPerPel == match.bpp) && - (dm.dmPelsWidth == match.xPixels) && - (dm.dmPelsHeight == match.yPixels) && - (dm.dmDisplayFrequency == match.frequency)) { + (dm.dmPelsWidth == match.xPixels) && + (dm.dmPelsHeight == match.yPixels) && + (dm.dmDisplayFrequency == match.frequency)) + { break; } } /* - dm.dmBitsPerPel = match.bpp; - dm.dmPelsWidth = match.xPixels; - dm.dmPelsHeight = match.yPixels; - dm.dmDisplayFrequency = match.frequency; - dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; - dm.dmSize = sizeof(DEVMODE); - dm.dmDriverExtra = 0; - */ + * dm.dmBitsPerPel = match.bpp; + * dm.dmPelsWidth = match.xPixels; + * dm.dmPelsHeight = match.yPixels; + * dm.dmDisplayFrequency = match.frequency; + * dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; + * dm.dmSize = sizeof(DEVMODE); + * dm.dmDriverExtra = 0; + */ #ifdef GHOST_DEBUG printf("display change: Requested settings:\n"); printf(" dmBitsPerPel=%d\n", dm.dmBitsPerPel); @@ -154,31 +155,31 @@ GHOST_TSuccess GHOST_DisplayManagerWin32::setCurrentDisplaySetting(GHOST_TUns8 d #ifdef GHOST_DEBUG switch (status) { - case DISP_CHANGE_SUCCESSFUL: - printf("display change: The settings change was successful.\n"); - break; - case DISP_CHANGE_RESTART: - printf("display change: The computer must be restarted in order for the graphics mode to work.\n"); - break; - case DISP_CHANGE_BADFLAGS: - printf("display change: An invalid set of flags was passed in.\n"); - break; - case DISP_CHANGE_BADPARAM: - printf("display change: An invalid parameter was passed in. This can include an invalid flag or combination of flags.\n"); - break; - case DISP_CHANGE_FAILED: - printf("display change: The display driver failed the specified graphics mode.\n"); - break; - case DISP_CHANGE_BADMODE: - printf("display change: The graphics mode is not supported.\n"); - break; - case DISP_CHANGE_NOTUPDATED: - printf("display change: Windows NT: Unable to write settings to the registry.\n"); - break; - default: - printf("display change: Return value invalid\n"); - break; + case DISP_CHANGE_SUCCESSFUL: + printf("display change: The settings change was successful.\n"); + break; + case DISP_CHANGE_RESTART: + printf("display change: The computer must be restarted in order for the graphics mode to work.\n"); + break; + case DISP_CHANGE_BADFLAGS: + printf("display change: An invalid set of flags was passed in.\n"); + break; + case DISP_CHANGE_BADPARAM: + printf("display change: An invalid parameter was passed in. This can include an invalid flag or combination of flags.\n"); + break; + case DISP_CHANGE_FAILED: + printf("display change: The display driver failed the specified graphics mode.\n"); + break; + case DISP_CHANGE_BADMODE: + printf("display change: The graphics mode is not supported.\n"); + break; + case DISP_CHANGE_NOTUPDATED: + printf("display change: Windows NT: Unable to write settings to the registry.\n"); + break; + default: + printf("display change: Return value invalid\n"); + break; } #endif // GHOST_DEBUG - return status == DISP_CHANGE_SUCCESSFUL? GHOST_kSuccess : GHOST_kFailure; + return status == DISP_CHANGE_SUCCESSFUL ? GHOST_kSuccess : GHOST_kFailure; } diff --git a/intern/ghost/intern/GHOST_DropTargetWin32.cpp b/intern/ghost/intern/GHOST_DropTargetWin32.cpp index c13c242bc7e..0f07435d417 100644 --- a/intern/ghost/intern/GHOST_DropTargetWin32.cpp +++ b/intern/ghost/intern/GHOST_DropTargetWin32.cpp @@ -43,10 +43,10 @@ void printLastError(void); #endif // GHOST_DEBUG -GHOST_DropTargetWin32::GHOST_DropTargetWin32(GHOST_WindowWin32 * window, GHOST_SystemWin32 * system) -: -m_window(window), -m_system(system) +GHOST_DropTargetWin32::GHOST_DropTargetWin32(GHOST_WindowWin32 *window, GHOST_SystemWin32 *system) + : + m_window(window), + m_system(system) { m_cRef = 1; m_hWnd = window->getHWND(); @@ -63,23 +63,22 @@ GHOST_DropTargetWin32::~GHOST_DropTargetWin32() /* - * IUnknown::QueryInterface + * IUnknown::QueryInterface */ -HRESULT __stdcall GHOST_DropTargetWin32::QueryInterface (REFIID riid, void ** ppvObj) +HRESULT __stdcall GHOST_DropTargetWin32::QueryInterface(REFIID riid, void **ppvObj) { if (!ppvObj) return E_INVALIDARG; *ppvObj = NULL; - if(riid == IID_IUnknown || riid == IID_IDropTarget) + if (riid == IID_IUnknown || riid == IID_IDropTarget) { AddRef(); - *ppvObj = (void*)this; + *ppvObj = (void *)this; return S_OK; } - else - { + else { *ppvObj = 0; return E_NOINTERFACE; } @@ -102,13 +101,12 @@ ULONG __stdcall GHOST_DropTargetWin32::Release(void) { ULONG refs = ::InterlockedDecrement(&m_cRef); - if(refs == 0) + if (refs == 0) { delete this; return 0; } - else - { + else { return refs; } } @@ -116,7 +114,7 @@ ULONG __stdcall GHOST_DropTargetWin32::Release(void) /* * Implementation of IDropTarget::DragEnter */ -HRESULT __stdcall GHOST_DropTargetWin32::DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect) +HRESULT __stdcall GHOST_DropTargetWin32::DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) { // we accept all drop by default m_window->setAcceptDragOperation(true); @@ -130,14 +128,13 @@ HRESULT __stdcall GHOST_DropTargetWin32::DragEnter(IDataObject * pDataObject, DW /* * Implementation of IDropTarget::DragOver */ -HRESULT __stdcall GHOST_DropTargetWin32::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect) +HRESULT __stdcall GHOST_DropTargetWin32::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) { - if(m_window->canAcceptDragOperation()) + if (m_window->canAcceptDragOperation()) { *pdwEffect = allowedDropEffect(*pdwEffect); } - else - { + else { *pdwEffect = DROPEFFECT_NONE; //*pdwEffect = DROPEFFECT_COPY; // XXX Uncomment to test drop. Drop will not be called if pdwEffect == DROPEFFECT_NONE. } @@ -159,20 +156,19 @@ HRESULT __stdcall GHOST_DropTargetWin32::DragLeave(void) * This function will not be called if pdwEffect is set to DROPEFFECT_NONE in * the implementation of IDropTarget::DragOver */ -HRESULT __stdcall GHOST_DropTargetWin32::Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect) +HRESULT __stdcall GHOST_DropTargetWin32::Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) { - void * data = getGhostData(pDataObject); - if(m_window->canAcceptDragOperation()) + void *data = getGhostData(pDataObject); + if (m_window->canAcceptDragOperation()) { *pdwEffect = allowedDropEffect(*pdwEffect); } - else - { + else { *pdwEffect = DROPEFFECT_NONE; } if (data) - m_system->pushDragDropEvent(GHOST_kEventDraggingDropDone, m_draggedObjectType, m_window, pt.x, pt.y, data ); + m_system->pushDragDropEvent(GHOST_kEventDraggingDropDone, m_draggedObjectType, m_window, pt.x, pt.y, data); m_draggedObjectType = GHOST_kDragnDropTypeUnknown; return S_OK; @@ -185,27 +181,27 @@ HRESULT __stdcall GHOST_DropTargetWin32::Drop(IDataObject * pDataObject, DWORD g DWORD GHOST_DropTargetWin32::allowedDropEffect(DWORD dwAllowed) { DWORD dwEffect = DROPEFFECT_NONE; - if(dwAllowed & DROPEFFECT_COPY) + if (dwAllowed & DROPEFFECT_COPY) dwEffect = DROPEFFECT_COPY; return dwEffect; } -GHOST_TDragnDropTypes GHOST_DropTargetWin32::getGhostType(IDataObject * pDataObject) +GHOST_TDragnDropTypes GHOST_DropTargetWin32::getGhostType(IDataObject *pDataObject) { /* Text * Note: Unicode text is aviable as CF_TEXT too, the system can do the * conversion, but we do the conversion ourself with WC_NO_BEST_FIT_CHARS. */ FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; - if(pDataObject->QueryGetData(&fmtetc) == S_OK) + if (pDataObject->QueryGetData(&fmtetc) == S_OK) { return GHOST_kDragnDropTypeString; } // Filesnames fmtetc.cfFormat = CF_HDROP; - if(pDataObject->QueryGetData(&fmtetc) == S_OK) + if (pDataObject->QueryGetData(&fmtetc) == S_OK) { return GHOST_kDragnDropTypeFilenames; } @@ -213,10 +209,10 @@ GHOST_TDragnDropTypes GHOST_DropTargetWin32::getGhostType(IDataObject * pDataObj return GHOST_kDragnDropTypeUnknown; } -void * GHOST_DropTargetWin32::getGhostData(IDataObject * pDataObject) +void *GHOST_DropTargetWin32::getGhostData(IDataObject *pDataObject) { GHOST_TDragnDropTypes type = getGhostType(pDataObject); - switch(type) + switch (type) { case GHOST_kDragnDropTypeFilenames: return getDropDataAsFilenames(pDataObject); @@ -237,11 +233,11 @@ void * GHOST_DropTargetWin32::getGhostData(IDataObject * pDataObject) return NULL; } -void * GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject * pDataObject) +void *GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject *pDataObject) { - UINT totfiles, nvalid=0; - WCHAR fpath [MAX_PATH]; - char * temp_path; + UINT totfiles, nvalid = 0; + WCHAR fpath[MAX_PATH]; + char *temp_path; GHOST_TStringArray *strArray = NULL; FORMATETC fmtetc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM stgmed; @@ -249,35 +245,35 @@ void * GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject * pDataObject) // Check if dataobject supplies the format we want. // Double checking here, first in getGhostType. - if(pDataObject->QueryGetData(&fmtetc) == S_OK) + if (pDataObject->QueryGetData(&fmtetc) == S_OK) { - if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK) + if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK) { - hdrop = (HDROP)::GlobalLock(stgmed.hGlobal); + hdrop = (HDROP) ::GlobalLock(stgmed.hGlobal); - totfiles = ::DragQueryFileW ( hdrop, -1, NULL, 0 ); + totfiles = ::DragQueryFileW(hdrop, -1, NULL, 0); if (!totfiles) { ::GlobalUnlock(stgmed.hGlobal); return NULL; } - strArray = (GHOST_TStringArray*) ::malloc(sizeof(GHOST_TStringArray)); + strArray = (GHOST_TStringArray *) ::malloc(sizeof(GHOST_TStringArray)); strArray->count = 0; - strArray->strings = (GHOST_TUns8**) ::malloc(totfiles*sizeof(GHOST_TUns8*)); + strArray->strings = (GHOST_TUns8 **) ::malloc(totfiles * sizeof(GHOST_TUns8 *)); - for ( UINT nfile = 0; nfile < totfiles; nfile++ ) + for (UINT nfile = 0; nfile < totfiles; nfile++) { - if ( ::DragQueryFileW ( hdrop, nfile, fpath, MAX_PATH ) > 0 ) + if (::DragQueryFileW(hdrop, nfile, fpath, MAX_PATH) > 0) { - if ( !(temp_path = alloc_utf_8_from_16(fpath, 0)) ) + if (!(temp_path = alloc_utf_8_from_16(fpath, 0)) ) { continue; } // Just ignore paths that could not be converted verbatim. - strArray->strings[nvalid] = (GHOST_TUns8*) temp_path; - strArray->count = nvalid+1; + strArray->strings[nvalid] = (GHOST_TUns8 *) temp_path; + strArray->count = nvalid + 1; nvalid++; } } @@ -291,20 +287,20 @@ void * GHOST_DropTargetWin32::getDropDataAsFilenames(IDataObject * pDataObject) return NULL; } -void * GHOST_DropTargetWin32::getDropDataAsString(IDataObject * pDataObject) +void *GHOST_DropTargetWin32::getDropDataAsString(IDataObject *pDataObject) { - char* tmp_string; + char *tmp_string; FORMATETC fmtetc = { CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM stgmed; // Try unicode first. // Check if dataobject supplies the format we want. - if(pDataObject->QueryGetData(&fmtetc) == S_OK) + if (pDataObject->QueryGetData(&fmtetc) == S_OK) { - if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK) + if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK) { - LPCWSTR wstr = (LPCWSTR)::GlobalLock(stgmed.hGlobal); - if ( !(tmp_string = alloc_utf_8_from_16((wchar_t*)wstr, 0)) ) + LPCWSTR wstr = (LPCWSTR) ::GlobalLock(stgmed.hGlobal); + if (!(tmp_string = alloc_utf_8_from_16((wchar_t *)wstr, 0)) ) { ::GlobalUnlock(stgmed.hGlobal); return NULL; @@ -313,7 +309,7 @@ void * GHOST_DropTargetWin32::getDropDataAsString(IDataObject * pDataObject) ::GlobalUnlock(stgmed.hGlobal); ::ReleaseStgMedium(&stgmed); #ifdef GHOST_DEBUG - ::printf("\n\n%s\n\n",tmp_string); + ::printf("\n\n%s\n\n", tmp_string); #endif // GHOST_DEBUG return tmp_string; } @@ -321,20 +317,20 @@ void * GHOST_DropTargetWin32::getDropDataAsString(IDataObject * pDataObject) fmtetc.cfFormat = CF_TEXT; - if(pDataObject->QueryGetData(&fmtetc) == S_OK) + if (pDataObject->QueryGetData(&fmtetc) == S_OK) { - if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK) + if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK) { - char * str = (char*)::GlobalLock(stgmed.hGlobal); + char *str = (char *)::GlobalLock(stgmed.hGlobal); - tmp_string = (char*)::malloc(::strlen(str)+1); - if ( !tmp_string ) + tmp_string = (char *)::malloc(::strlen(str) + 1); + if (!tmp_string) { ::GlobalUnlock(stgmed.hGlobal); return NULL; } - if ( !::strcpy(tmp_string, str) ) + if (!::strcpy(tmp_string, str) ) { ::free(tmp_string); ::GlobalUnlock(stgmed.hGlobal); @@ -357,16 +353,16 @@ int GHOST_DropTargetWin32::WideCharToANSI(LPCWSTR in, char * &out) out = NULL; //caller should free if != NULL // Get the required size. - size = ::WideCharToMultiByte(CP_ACP, //System Default Codepage - 0x00000400, // WC_NO_BEST_FIT_CHARS - in, - -1, //-1 null terminated, makes output null terminated too. - NULL, - 0, - NULL,NULL - ); + size = ::WideCharToMultiByte(CP_ACP, //System Default Codepage + 0x00000400, // WC_NO_BEST_FIT_CHARS + in, + -1, //-1 null terminated, makes output null terminated too. + NULL, + 0, + NULL, NULL + ); - if(!size) + if (!size) { #ifdef GHOST_DEBUG ::printLastError(); @@ -374,7 +370,7 @@ int GHOST_DropTargetWin32::WideCharToANSI(LPCWSTR in, char * &out) return 0; } - out = (char*)::malloc(size); + out = (char *)::malloc(size); if (!out) { ::printf("\nmalloc failed!!!"); @@ -382,15 +378,15 @@ int GHOST_DropTargetWin32::WideCharToANSI(LPCWSTR in, char * &out) } size = ::WideCharToMultiByte(CP_ACP, - 0x00000400, - in, - -1, - (LPSTR) out, - size, - NULL,NULL - ); + 0x00000400, + in, + -1, + (LPSTR) out, + size, + NULL, NULL + ); - if(!size) + if (!size) { #ifdef GHOST_DEBUG ::printLastError(); @@ -408,15 +404,15 @@ void printLastError(void) DWORD err; err = GetLastError(); - if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - err, - 0, - (LPTSTR)&s, - 0, - NULL) - ) + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + err, + 0, + (LPTSTR)&s, + 0, + NULL) + ) { printf("\nLastError: (%d) %s\n", (int)err, s); LocalFree(s); diff --git a/intern/ghost/intern/GHOST_EventManager.cpp b/intern/ghost/intern/GHOST_EventManager.cpp index 8c2a7f7d1e8..4c03dad2e73 100644 --- a/intern/ghost/intern/GHOST_EventManager.cpp +++ b/intern/ghost/intern/GHOST_EventManager.cpp @@ -51,10 +51,9 @@ GHOST_EventManager::~GHOST_EventManager() { disposeEvents(); - TConsumerVector::iterator iter= m_consumers.begin(); - while (iter != m_consumers.end()) - { - GHOST_IEventConsumer* consumer = *iter; + TConsumerVector::iterator iter = m_consumers.begin(); + while (iter != m_consumers.end()) { + GHOST_IEventConsumer *consumer = *iter; delete consumer; m_consumers.erase(iter); iter = m_consumers.begin(); @@ -81,9 +80,9 @@ GHOST_TUns32 GHOST_EventManager::getNumEvents(GHOST_TEventType type) } -GHOST_IEvent* GHOST_EventManager::peekEvent() +GHOST_IEvent *GHOST_EventManager::peekEvent() { - GHOST_IEvent* event = 0; + GHOST_IEvent *event = 0; if (m_events.size() > 0) { event = m_events.back(); } @@ -91,7 +90,7 @@ GHOST_IEvent* GHOST_EventManager::peekEvent() } -GHOST_TSuccess GHOST_EventManager::pushEvent(GHOST_IEvent* event) +GHOST_TSuccess GHOST_EventManager::pushEvent(GHOST_IEvent *event) { GHOST_TSuccess success; GHOST_ASSERT(event, "invalid event"); @@ -106,7 +105,7 @@ GHOST_TSuccess GHOST_EventManager::pushEvent(GHOST_IEvent* event) } -bool GHOST_EventManager::dispatchEvent(GHOST_IEvent* event) +bool GHOST_EventManager::dispatchEvent(GHOST_IEvent *event) { bool handled; if (event) { @@ -127,7 +126,7 @@ bool GHOST_EventManager::dispatchEvent(GHOST_IEvent* event) bool GHOST_EventManager::dispatchEvent() { - GHOST_IEvent* event = popEvent(); + GHOST_IEvent *event = popEvent(); bool handled = false; if (event) { handled = dispatchEvent(event); @@ -155,7 +154,7 @@ bool GHOST_EventManager::dispatchEvents() } -GHOST_TSuccess GHOST_EventManager::addConsumer(GHOST_IEventConsumer* consumer) +GHOST_TSuccess GHOST_EventManager::addConsumer(GHOST_IEventConsumer *consumer) { GHOST_TSuccess success; GHOST_ASSERT(consumer, "invalid consumer"); @@ -175,7 +174,7 @@ GHOST_TSuccess GHOST_EventManager::addConsumer(GHOST_IEventConsumer* consumer) } -GHOST_TSuccess GHOST_EventManager::removeConsumer(GHOST_IEventConsumer* consumer) +GHOST_TSuccess GHOST_EventManager::removeConsumer(GHOST_IEventConsumer *consumer) { GHOST_TSuccess success; GHOST_ASSERT(consumer, "invalid consumer"); @@ -195,16 +194,16 @@ GHOST_TSuccess GHOST_EventManager::removeConsumer(GHOST_IEventConsumer* consumer } -void GHOST_EventManager::removeWindowEvents(GHOST_IWindow* window) +void GHOST_EventManager::removeWindowEvents(GHOST_IWindow *window) { TEventStack::iterator iter; iter = m_events.begin(); while (iter != m_events.end()) { - GHOST_IEvent* event = *iter; + GHOST_IEvent *event = *iter; if (event->getWindow() == window) { - GHOST_PRINT("GHOST_EventManager::removeWindowEvents(): removing event\n"); + GHOST_PRINT("GHOST_EventManager::removeWindowEvents(): removing event\n"); /* * Found an event for this window, remove it. * The iterator will become invalid. @@ -213,23 +212,22 @@ void GHOST_EventManager::removeWindowEvents(GHOST_IWindow* window) m_events.erase(iter); iter = m_events.begin(); } - else - { + else { iter++; } } } -void GHOST_EventManager::removeTypeEvents(GHOST_TEventType type, GHOST_IWindow* window) +void GHOST_EventManager::removeTypeEvents(GHOST_TEventType type, GHOST_IWindow *window) { TEventStack::iterator iter; iter = m_events.begin(); while (iter != m_events.end()) { - GHOST_IEvent* event = *iter; + GHOST_IEvent *event = *iter; if ((event->getType() == type) && (!window || (event->getWindow() == window))) { - GHOST_PRINT("GHOST_EventManager::removeTypeEvents(): removing event\n"); + GHOST_PRINT("GHOST_EventManager::removeTypeEvents(): removing event\n"); /* * Found an event of this type for the window, remove it. * The iterator will become invalid. @@ -238,17 +236,16 @@ void GHOST_EventManager::removeTypeEvents(GHOST_TEventType type, GHOST_IWindow* m_events.erase(iter); iter = m_events.begin(); } - else - { + else { iter++; } } } -GHOST_IEvent* GHOST_EventManager::popEvent() +GHOST_IEvent *GHOST_EventManager::popEvent() { - GHOST_IEvent* event = peekEvent(); + GHOST_IEvent *event = peekEvent(); if (event) { m_events.pop_back(); } diff --git a/intern/ghost/intern/GHOST_EventPrinter.cpp b/intern/ghost/intern/GHOST_EventPrinter.cpp index 1b5f28aae3b..4b7be84ac81 100644 --- a/intern/ghost/intern/GHOST_EventPrinter.cpp +++ b/intern/ghost/intern/GHOST_EventPrinter.cpp @@ -38,7 +38,7 @@ #include -bool GHOST_EventPrinter::processEvent(GHOST_IEvent* event) +bool GHOST_EventPrinter::processEvent(GHOST_IEvent *event) { bool handled = true; @@ -48,136 +48,136 @@ bool GHOST_EventPrinter::processEvent(GHOST_IEvent* event) std::cout << "\nGHOST_EventPrinter::processEvent, time: " << (GHOST_TInt32)event->getTime() << ", type: "; switch (event->getType()) { - case GHOST_kEventUnknown: - std::cout << "GHOST_kEventUnknown"; handled = false; - break; + case GHOST_kEventUnknown: + std::cout << "GHOST_kEventUnknown"; handled = false; + break; - case GHOST_kEventButtonUp: + case GHOST_kEventButtonUp: { - GHOST_TEventButtonData* buttonData = (GHOST_TEventButtonData*)((GHOST_IEvent*)event)->getData(); - std::cout << "GHOST_kEventCursorButtonUp, button: " << buttonData->button; + GHOST_TEventButtonData *buttonData = (GHOST_TEventButtonData *)((GHOST_IEvent *)event)->getData(); + std::cout << "GHOST_kEventCursorButtonUp, button: " << buttonData->button; } break; - case GHOST_kEventButtonDown: + case GHOST_kEventButtonDown: { - GHOST_TEventButtonData* buttonData = (GHOST_TEventButtonData*)((GHOST_IEvent*)event)->getData(); - std::cout << "GHOST_kEventButtonDown, button: " << buttonData->button; + GHOST_TEventButtonData *buttonData = (GHOST_TEventButtonData *)((GHOST_IEvent *)event)->getData(); + std::cout << "GHOST_kEventButtonDown, button: " << buttonData->button; } break; - case GHOST_kEventWheel: + case GHOST_kEventWheel: { - GHOST_TEventWheelData* wheelData = (GHOST_TEventWheelData*)((GHOST_IEvent*)event)->getData(); - std::cout << "GHOST_kEventWheel, z: " << wheelData->z; + GHOST_TEventWheelData *wheelData = (GHOST_TEventWheelData *)((GHOST_IEvent *)event)->getData(); + std::cout << "GHOST_kEventWheel, z: " << wheelData->z; } break; - case GHOST_kEventCursorMove: + case GHOST_kEventCursorMove: { - GHOST_TEventCursorData* cursorData = (GHOST_TEventCursorData*)((GHOST_IEvent*)event)->getData(); - std::cout << "GHOST_kEventCursorMove, (x,y): (" << cursorData->x << "," << cursorData->y << ")"; + GHOST_TEventCursorData *cursorData = (GHOST_TEventCursorData *)((GHOST_IEvent *)event)->getData(); + std::cout << "GHOST_kEventCursorMove, (x,y): (" << cursorData->x << "," << cursorData->y << ")"; } break; - case GHOST_kEventKeyUp: + case GHOST_kEventKeyUp: { - GHOST_TEventKeyData* keyData = (GHOST_TEventKeyData*)((GHOST_IEvent*)event)->getData(); - char str[32]= {'\0'}; - getKeyString(keyData->key, str); - std::cout << "GHOST_kEventKeyUp, key: " << str; + GHOST_TEventKeyData *keyData = (GHOST_TEventKeyData *)((GHOST_IEvent *)event)->getData(); + char str[32] = {'\0'}; + getKeyString(keyData->key, str); + std::cout << "GHOST_kEventKeyUp, key: " << str; } break; - case GHOST_kEventKeyDown: + case GHOST_kEventKeyDown: { - GHOST_TEventKeyData* keyData = (GHOST_TEventKeyData*)((GHOST_IEvent*)event)->getData(); - char str[32]= {'\0'}; - getKeyString(keyData->key, str); - std::cout << "GHOST_kEventKeyDown, key: " << str; + GHOST_TEventKeyData *keyData = (GHOST_TEventKeyData *)((GHOST_IEvent *)event)->getData(); + char str[32] = {'\0'}; + getKeyString(keyData->key, str); + std::cout << "GHOST_kEventKeyDown, key: " << str; } break; - case GHOST_kEventDraggingEntered: + case GHOST_kEventDraggingEntered: { - GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData(); + GHOST_TEventDragnDropData *dragnDropData = (GHOST_TEventDragnDropData *)((GHOST_IEvent *)event)->getData(); std::cout << "GHOST_kEventDraggingEntered, dragged object type : " << dragnDropData->dataType; std::cout << " mouse at x=" << dragnDropData->x << " y=" << dragnDropData->y; } break; - case GHOST_kEventDraggingUpdated: + case GHOST_kEventDraggingUpdated: { - GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData(); + GHOST_TEventDragnDropData *dragnDropData = (GHOST_TEventDragnDropData *)((GHOST_IEvent *)event)->getData(); std::cout << "GHOST_kEventDraggingUpdated, dragged object type : " << dragnDropData->dataType; std::cout << " mouse at x=" << dragnDropData->x << " y=" << dragnDropData->y; } break; - case GHOST_kEventDraggingExited: + case GHOST_kEventDraggingExited: { - GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData(); + GHOST_TEventDragnDropData *dragnDropData = (GHOST_TEventDragnDropData *)((GHOST_IEvent *)event)->getData(); std::cout << "GHOST_kEventDraggingExited, dragged object type : " << dragnDropData->dataType; } break; - case GHOST_kEventDraggingDropDone: + case GHOST_kEventDraggingDropDone: { - GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData(); + GHOST_TEventDragnDropData *dragnDropData = (GHOST_TEventDragnDropData *)((GHOST_IEvent *)event)->getData(); std::cout << "GHOST_kEventDraggingDropDone,"; std::cout << " mouse at x=" << dragnDropData->x << " y=" << dragnDropData->y; switch (dragnDropData->dataType) { case GHOST_kDragnDropTypeString: std::cout << " type : GHOST_kDragnDropTypeString,"; - std::cout << "\n String received = " << (char*)dragnDropData->data; + std::cout << "\n String received = " << (char *)dragnDropData->data; break; case GHOST_kDragnDropTypeFilenames: { - GHOST_TStringArray *strArray = (GHOST_TStringArray*)dragnDropData->data; + GHOST_TStringArray *strArray = (GHOST_TStringArray *)dragnDropData->data; int i; std::cout << " type : GHOST_kDragnDropTypeFilenames,"; std::cout << "\n Received " << strArray->count << " filename" << (strArray->count > 1 ? "s:" : ":"); - for (i=0;icount;i++) - std::cout << "\n File[" << i << "] : " << strArray->strings[i]; + for (i = 0; i < strArray->count; i++) + std::cout << "\n File["<< i << "] : " << strArray->strings[i]; } - break; + break; default: break; } } break; - case GHOST_kEventOpenMainFile: + case GHOST_kEventOpenMainFile: { - GHOST_TEventDataPtr eventData = ((GHOST_IEvent*)event)->getData(); + GHOST_TEventDataPtr eventData = ((GHOST_IEvent *)event)->getData(); if (eventData) - std::cout << "GHOST_kEventOpenMainFile for path : " << (char*)eventData; + std::cout << "GHOST_kEventOpenMainFile for path : " << (char *)eventData; else std::cout << "GHOST_kEventOpenMainFile with no path specified!!"; } break; - case GHOST_kEventQuit: - std::cout << "GHOST_kEventQuit"; - break; - case GHOST_kEventWindowClose: - std::cout << "GHOST_kEventWindowClose"; - break; - case GHOST_kEventWindowActivate: - std::cout << "GHOST_kEventWindowActivate"; - break; - case GHOST_kEventWindowDeactivate: - std::cout << "GHOST_kEventWindowDeactivate"; - break; - case GHOST_kEventWindowUpdate: - std::cout << "GHOST_kEventWindowUpdate"; - break; - case GHOST_kEventWindowSize: - std::cout << "GHOST_kEventWindowSize"; - break; + case GHOST_kEventQuit: + std::cout << "GHOST_kEventQuit"; + break; + case GHOST_kEventWindowClose: + std::cout << "GHOST_kEventWindowClose"; + break; + case GHOST_kEventWindowActivate: + std::cout << "GHOST_kEventWindowActivate"; + break; + case GHOST_kEventWindowDeactivate: + std::cout << "GHOST_kEventWindowDeactivate"; + break; + case GHOST_kEventWindowUpdate: + std::cout << "GHOST_kEventWindowUpdate"; + break; + case GHOST_kEventWindowSize: + std::cout << "GHOST_kEventWindowSize"; + break; - default: - std::cout << "not found"; handled = false; - break; + default: + std::cout << "not found"; handled = false; + break; } return handled; } @@ -187,154 +187,159 @@ void GHOST_EventPrinter::getKeyString(GHOST_TKey key, char str[32]) const { if ((key >= GHOST_kKeyComma) && (key <= GHOST_kKeyRightBracket)) { sprintf(str, "%c", (char)key); - } else if ((key >= GHOST_kKeyNumpad0) && (key <= GHOST_kKeyNumpad9)) { + } + else if ((key >= GHOST_kKeyNumpad0) && (key <= GHOST_kKeyNumpad9)) { sprintf(str, "Numpad %d", (key - GHOST_kKeyNumpad0)); #if defined(__sun__) || defined(__sun) - } else if (key == 268828432) { /* solaris keyboards are messed up */ - /* This should really test XK_F11 but that doesn't work */ + } + else if (key == 268828432) { /* solaris keyboards are messed up */ + /* This should really test XK_F11 but that doesn't work */ strcpy(str, "F11"); - } else if (key == 268828433) { /* solaris keyboards are messed up */ - /* This should really test XK_F12 but that doesn't work */ + } + else if (key == 268828433) { /* solaris keyboards are messed up */ + /* This should really test XK_F12 but that doesn't work */ strcpy(str, "F12"); #endif - } else if ((key >= GHOST_kKeyF1) && (key <= GHOST_kKeyF24)) { + } + else if ((key >= GHOST_kKeyF1) && (key <= GHOST_kKeyF24)) { sprintf(str, "F%d", key - GHOST_kKeyF1 + 1); - } else { - const char *tstr= NULL; + } + else { + const char *tstr = NULL; switch (key) { - case GHOST_kKeyBackSpace: - tstr = "BackSpace"; - break; - case GHOST_kKeyTab: - tstr = "Tab"; - break; - case GHOST_kKeyLinefeed: - tstr = "Linefeed"; - break; - case GHOST_kKeyClear: - tstr = "Clear"; - break; - case GHOST_kKeyEnter: - tstr = "Enter"; - break; - case GHOST_kKeyEsc: - tstr = "Esc"; - break; - case GHOST_kKeySpace: - tstr = "Space"; - break; - case GHOST_kKeyQuote: - tstr = "Quote"; - break; - case GHOST_kKeyBackslash: - tstr = "\\"; - break; - case GHOST_kKeyAccentGrave: - tstr = "`"; - break; - case GHOST_kKeyLeftShift: - tstr = "LeftShift"; - break; - case GHOST_kKeyRightShift: - tstr = "RightShift"; - break; - case GHOST_kKeyLeftControl: - tstr = "LeftControl"; - break; - case GHOST_kKeyRightControl: - tstr = "RightControl"; - break; - case GHOST_kKeyLeftAlt: - tstr = "LeftAlt"; - break; - case GHOST_kKeyRightAlt: - tstr = "RightAlt"; - break; - case GHOST_kKeyOS: - tstr = "OS"; - break; - case GHOST_kKeyGrLess: - // PC german! - tstr = "GrLess"; - break; - case GHOST_kKeyCapsLock: - tstr = "CapsLock"; - break; - case GHOST_kKeyNumLock: - tstr = "NumLock"; - break; - case GHOST_kKeyScrollLock: - tstr = "ScrollLock"; - break; - case GHOST_kKeyLeftArrow: - tstr = "LeftArrow"; - break; - case GHOST_kKeyRightArrow: - tstr = "RightArrow"; - break; - case GHOST_kKeyUpArrow: - tstr = "UpArrow"; - break; - case GHOST_kKeyDownArrow: - tstr = "DownArrow"; - break; - case GHOST_kKeyPrintScreen: - tstr = "PrintScreen"; - break; - case GHOST_kKeyPause: - tstr = "Pause"; - break; - case GHOST_kKeyInsert: - tstr = "Insert"; - break; - case GHOST_kKeyDelete: - tstr = "Delete"; - break; - case GHOST_kKeyHome: - tstr = "Home"; - break; - case GHOST_kKeyEnd: - tstr = "End"; - break; - case GHOST_kKeyUpPage: - tstr = "UpPage"; - break; - case GHOST_kKeyDownPage: - tstr = "DownPage"; - break; - case GHOST_kKeyNumpadPeriod: - tstr = "NumpadPeriod"; - break; - case GHOST_kKeyNumpadEnter: - tstr = "NumpadEnter"; - break; - case GHOST_kKeyNumpadPlus: - tstr = "NumpadPlus"; - break; - case GHOST_kKeyNumpadMinus: - tstr = "NumpadMinus"; - break; - case GHOST_kKeyNumpadAsterisk: - tstr = "NumpadAsterisk"; - break; - case GHOST_kKeyNumpadSlash: - tstr = "NumpadSlash"; - break; - case GHOST_kKeyMediaPlay: - tstr = "MediaPlayPause"; - break; - case GHOST_kKeyMediaStop: - tstr = "MediaStop"; - break; - case GHOST_kKeyMediaFirst: - tstr = "MediaFirst"; - break; - case GHOST_kKeyMediaLast: - tstr = "MediaLast"; - break; - default: - tstr = "unknown"; - break; + case GHOST_kKeyBackSpace: + tstr = "BackSpace"; + break; + case GHOST_kKeyTab: + tstr = "Tab"; + break; + case GHOST_kKeyLinefeed: + tstr = "Linefeed"; + break; + case GHOST_kKeyClear: + tstr = "Clear"; + break; + case GHOST_kKeyEnter: + tstr = "Enter"; + break; + case GHOST_kKeyEsc: + tstr = "Esc"; + break; + case GHOST_kKeySpace: + tstr = "Space"; + break; + case GHOST_kKeyQuote: + tstr = "Quote"; + break; + case GHOST_kKeyBackslash: + tstr = "\\"; + break; + case GHOST_kKeyAccentGrave: + tstr = "`"; + break; + case GHOST_kKeyLeftShift: + tstr = "LeftShift"; + break; + case GHOST_kKeyRightShift: + tstr = "RightShift"; + break; + case GHOST_kKeyLeftControl: + tstr = "LeftControl"; + break; + case GHOST_kKeyRightControl: + tstr = "RightControl"; + break; + case GHOST_kKeyLeftAlt: + tstr = "LeftAlt"; + break; + case GHOST_kKeyRightAlt: + tstr = "RightAlt"; + break; + case GHOST_kKeyOS: + tstr = "OS"; + break; + case GHOST_kKeyGrLess: + // PC german! + tstr = "GrLess"; + break; + case GHOST_kKeyCapsLock: + tstr = "CapsLock"; + break; + case GHOST_kKeyNumLock: + tstr = "NumLock"; + break; + case GHOST_kKeyScrollLock: + tstr = "ScrollLock"; + break; + case GHOST_kKeyLeftArrow: + tstr = "LeftArrow"; + break; + case GHOST_kKeyRightArrow: + tstr = "RightArrow"; + break; + case GHOST_kKeyUpArrow: + tstr = "UpArrow"; + break; + case GHOST_kKeyDownArrow: + tstr = "DownArrow"; + break; + case GHOST_kKeyPrintScreen: + tstr = "PrintScreen"; + break; + case GHOST_kKeyPause: + tstr = "Pause"; + break; + case GHOST_kKeyInsert: + tstr = "Insert"; + break; + case GHOST_kKeyDelete: + tstr = "Delete"; + break; + case GHOST_kKeyHome: + tstr = "Home"; + break; + case GHOST_kKeyEnd: + tstr = "End"; + break; + case GHOST_kKeyUpPage: + tstr = "UpPage"; + break; + case GHOST_kKeyDownPage: + tstr = "DownPage"; + break; + case GHOST_kKeyNumpadPeriod: + tstr = "NumpadPeriod"; + break; + case GHOST_kKeyNumpadEnter: + tstr = "NumpadEnter"; + break; + case GHOST_kKeyNumpadPlus: + tstr = "NumpadPlus"; + break; + case GHOST_kKeyNumpadMinus: + tstr = "NumpadMinus"; + break; + case GHOST_kKeyNumpadAsterisk: + tstr = "NumpadAsterisk"; + break; + case GHOST_kKeyNumpadSlash: + tstr = "NumpadSlash"; + break; + case GHOST_kKeyMediaPlay: + tstr = "MediaPlayPause"; + break; + case GHOST_kKeyMediaStop: + tstr = "MediaStop"; + break; + case GHOST_kKeyMediaFirst: + tstr = "MediaFirst"; + break; + case GHOST_kKeyMediaLast: + tstr = "MediaLast"; + break; + default: + tstr = "unknown"; + break; } sprintf(str, "%s", tstr); diff --git a/intern/ghost/intern/GHOST_ISystem.cpp b/intern/ghost/intern/GHOST_ISystem.cpp index 66d8a3176bd..e983bd8214a 100644 --- a/intern/ghost/intern/GHOST_ISystem.cpp +++ b/intern/ghost/intern/GHOST_ISystem.cpp @@ -40,25 +40,25 @@ #include "GHOST_ISystem.h" #ifdef WITH_HEADLESS -# include "GHOST_SystemNULL.h" +# include "GHOST_SystemNULL.h" #elif defined(WITH_GHOST_SDL) -# include "GHOST_SystemSDL.h" +# include "GHOST_SystemSDL.h" #elif defined(WIN32) -# include "GHOST_SystemWin32.h" +# include "GHOST_SystemWin32.h" #else -# ifdef __APPLE__ -# ifdef GHOST_COCOA -# include "GHOST_SystemCocoa.h" -# else -# include "GHOST_SystemCarbon.h" -# endif -# else -# include "GHOST_SystemX11.h" -# endif +# ifdef __APPLE__ +# ifdef GHOST_COCOA +# include "GHOST_SystemCocoa.h" +# else +# include "GHOST_SystemCarbon.h" +# endif +# else +# include "GHOST_SystemX11.h" +# endif #endif -GHOST_ISystem* GHOST_ISystem::m_system = 0; +GHOST_ISystem *GHOST_ISystem::m_system = 0; GHOST_TSuccess GHOST_ISystem::createSystem() @@ -70,17 +70,17 @@ GHOST_TSuccess GHOST_ISystem::createSystem() #elif defined(WITH_GHOST_SDL) m_system = new GHOST_SystemSDL(); #elif defined(WIN32) - m_system = new GHOST_SystemWin32 (); + m_system = new GHOST_SystemWin32(); #else -# ifdef __APPLE__ -# ifdef GHOST_COCOA - m_system = new GHOST_SystemCocoa (); -# else - m_system = new GHOST_SystemCarbon (); -# endif -# else - m_system = new GHOST_SystemX11 (); -# endif +# ifdef __APPLE__ +# ifdef GHOST_COCOA + m_system = new GHOST_SystemCocoa(); +# else + m_system = new GHOST_SystemCarbon(); +# endif +# else + m_system = new GHOST_SystemX11(); +# endif #endif success = m_system != 0 ? GHOST_kSuccess : GHOST_kFailure; } @@ -107,7 +107,7 @@ GHOST_TSuccess GHOST_ISystem::disposeSystem() } -GHOST_ISystem* GHOST_ISystem::getSystem() +GHOST_ISystem *GHOST_ISystem::getSystem() { return m_system; } diff --git a/intern/ghost/intern/GHOST_ISystemPaths.cpp b/intern/ghost/intern/GHOST_ISystemPaths.cpp index 55fc2c3796f..0ad9dd48d2b 100644 --- a/intern/ghost/intern/GHOST_ISystemPaths.cpp +++ b/intern/ghost/intern/GHOST_ISystemPaths.cpp @@ -40,21 +40,21 @@ #include "GHOST_ISystemPaths.h" #ifdef WIN32 -# include "GHOST_SystemPathsWin32.h" +# include "GHOST_SystemPathsWin32.h" #else -# ifdef __APPLE__ -# ifdef GHOST_COCOA -# include "GHOST_SystemPathsCocoa.h" -# else -# include "GHOST_SystemPathsCarbon.h" -# endif -# else -# include "GHOST_SystemPathsX11.h" -# endif +# ifdef __APPLE__ +# ifdef GHOST_COCOA +# include "GHOST_SystemPathsCocoa.h" +# else +# include "GHOST_SystemPathsCarbon.h" +# endif +# else +# include "GHOST_SystemPathsX11.h" +# endif #endif -GHOST_ISystemPaths* GHOST_ISystemPaths::m_systemPaths = 0; +GHOST_ISystemPaths *GHOST_ISystemPaths::m_systemPaths = 0; GHOST_TSuccess GHOST_ISystemPaths::create() @@ -62,17 +62,17 @@ GHOST_TSuccess GHOST_ISystemPaths::create() GHOST_TSuccess success; if (!m_systemPaths) { #ifdef WIN32 - m_systemPaths = new GHOST_SystemPathsWin32 (); + m_systemPaths = new GHOST_SystemPathsWin32(); #else -# ifdef __APPLE__ -# ifdef GHOST_COCOA - m_systemPaths = new GHOST_SystemPathsCocoa (); -# else - m_systemPaths = new GHOST_SystemPathsCarbon (); -# endif -# else - m_systemPaths = new GHOST_SystemPathsX11 (); -# endif +# ifdef __APPLE__ +# ifdef GHOST_COCOA + m_systemPaths = new GHOST_SystemPathsCocoa(); +# else + m_systemPaths = new GHOST_SystemPathsCarbon(); +# endif +# else + m_systemPaths = new GHOST_SystemPathsX11(); +# endif #endif success = m_systemPaths != 0 ? GHOST_kSuccess : GHOST_kFailure; } @@ -95,7 +95,7 @@ GHOST_TSuccess GHOST_ISystemPaths::dispose() return success; } -GHOST_ISystemPaths* GHOST_ISystemPaths::get() +GHOST_ISystemPaths *GHOST_ISystemPaths::get() { if (!m_systemPaths) { create(); diff --git a/intern/ghost/intern/GHOST_ModifierKeys.cpp b/intern/ghost/intern/GHOST_ModifierKeys.cpp index 553a45fd948..a02e6218891 100644 --- a/intern/ghost/intern/GHOST_ModifierKeys.cpp +++ b/intern/ghost/intern/GHOST_ModifierKeys.cpp @@ -52,17 +52,17 @@ GHOST_TKey GHOST_ModifierKeys::getModifierKeyCode(GHOST_TModifierKeyMask mask) { GHOST_TKey key; switch (mask) { - case GHOST_kModifierKeyLeftShift: key = GHOST_kKeyLeftShift; break; - case GHOST_kModifierKeyRightShift: key = GHOST_kKeyRightShift; break; - case GHOST_kModifierKeyLeftAlt: key = GHOST_kKeyLeftAlt; break; - case GHOST_kModifierKeyRightAlt: key = GHOST_kKeyRightAlt; break; - case GHOST_kModifierKeyLeftControl: key = GHOST_kKeyLeftControl; break; - case GHOST_kModifierKeyRightControl: key = GHOST_kKeyRightControl; break; - case GHOST_kModifierKeyOS: key = GHOST_kKeyOS; break; - default: - // Should not happen - key = GHOST_kKeyUnknown; - break; + case GHOST_kModifierKeyLeftShift: key = GHOST_kKeyLeftShift; break; + case GHOST_kModifierKeyRightShift: key = GHOST_kKeyRightShift; break; + case GHOST_kModifierKeyLeftAlt: key = GHOST_kKeyLeftAlt; break; + case GHOST_kModifierKeyRightAlt: key = GHOST_kKeyRightAlt; break; + case GHOST_kModifierKeyLeftControl: key = GHOST_kKeyLeftControl; break; + case GHOST_kModifierKeyRightControl: key = GHOST_kKeyRightControl; break; + case GHOST_kModifierKeyOS: key = GHOST_kKeyOS; break; + default: + // Should not happen + key = GHOST_kKeyUnknown; + break; } return key; } @@ -70,69 +70,69 @@ GHOST_TKey GHOST_ModifierKeys::getModifierKeyCode(GHOST_TModifierKeyMask mask) bool GHOST_ModifierKeys::get(GHOST_TModifierKeyMask mask) const { - switch (mask) { - case GHOST_kModifierKeyLeftShift: - return m_LeftShift; - case GHOST_kModifierKeyRightShift: - return m_RightShift; - case GHOST_kModifierKeyLeftAlt: - return m_LeftAlt; - case GHOST_kModifierKeyRightAlt: - return m_RightAlt; - case GHOST_kModifierKeyLeftControl: - return m_LeftControl; - case GHOST_kModifierKeyRightControl: - return m_RightControl; - case GHOST_kModifierKeyOS: - return m_OS; - default: - return false; - } + switch (mask) { + case GHOST_kModifierKeyLeftShift: + return m_LeftShift; + case GHOST_kModifierKeyRightShift: + return m_RightShift; + case GHOST_kModifierKeyLeftAlt: + return m_LeftAlt; + case GHOST_kModifierKeyRightAlt: + return m_RightAlt; + case GHOST_kModifierKeyLeftControl: + return m_LeftControl; + case GHOST_kModifierKeyRightControl: + return m_RightControl; + case GHOST_kModifierKeyOS: + return m_OS; + default: + return false; + } } void GHOST_ModifierKeys::set(GHOST_TModifierKeyMask mask, bool down) { - switch (mask) { - case GHOST_kModifierKeyLeftShift: - m_LeftShift = down; break; - case GHOST_kModifierKeyRightShift: - m_RightShift = down; break; - case GHOST_kModifierKeyLeftAlt: - m_LeftAlt = down; break; - case GHOST_kModifierKeyRightAlt: - m_RightAlt = down; break; - case GHOST_kModifierKeyLeftControl: - m_LeftControl = down; break; - case GHOST_kModifierKeyRightControl: - m_RightControl = down; break; - case GHOST_kModifierKeyOS: - m_OS = down; break; - default: - break; - } + switch (mask) { + case GHOST_kModifierKeyLeftShift: + m_LeftShift = down; break; + case GHOST_kModifierKeyRightShift: + m_RightShift = down; break; + case GHOST_kModifierKeyLeftAlt: + m_LeftAlt = down; break; + case GHOST_kModifierKeyRightAlt: + m_RightAlt = down; break; + case GHOST_kModifierKeyLeftControl: + m_LeftControl = down; break; + case GHOST_kModifierKeyRightControl: + m_RightControl = down; break; + case GHOST_kModifierKeyOS: + m_OS = down; break; + default: + break; + } } void GHOST_ModifierKeys::clear() { - m_LeftShift = false; - m_RightShift = false; - m_LeftAlt = false; - m_RightAlt = false; - m_LeftControl = false; - m_RightControl = false; - m_OS = false; + m_LeftShift = false; + m_RightShift = false; + m_LeftAlt = false; + m_RightAlt = false; + m_LeftControl = false; + m_RightControl = false; + m_OS = false; } bool GHOST_ModifierKeys::equals(const GHOST_ModifierKeys& keys) const { return (m_LeftShift == keys.m_LeftShift) && - (m_RightShift == keys.m_RightShift) && - (m_LeftAlt == keys.m_LeftAlt) && - (m_RightAlt == keys.m_RightAlt) && - (m_LeftControl == keys.m_LeftControl) && - (m_RightControl == keys.m_RightControl) && - (m_OS == keys.m_OS); + (m_RightShift == keys.m_RightShift) && + (m_LeftAlt == keys.m_LeftAlt) && + (m_RightAlt == keys.m_RightAlt) && + (m_LeftControl == keys.m_LeftControl) && + (m_RightControl == keys.m_RightControl) && + (m_OS == keys.m_OS); } diff --git a/intern/ghost/intern/GHOST_NDOFManager.cpp b/intern/ghost/intern/GHOST_NDOFManager.cpp index e5f523ca8ef..79102967f3e 100644 --- a/intern/ghost/intern/GHOST_NDOFManager.cpp +++ b/intern/ghost/intern/GHOST_NDOFManager.cpp @@ -32,12 +32,12 @@ #ifdef DEBUG_NDOF_MOTION // printable version of each GHOST_TProgress value -static const char* progress_string[] = - {"not started","starting","in progress","finishing","finished"}; +static const char *progress_string[] = +{"not started", "starting", "in progress", "finishing", "finished"}; #endif #ifdef DEBUG_NDOF_BUTTONS -static const char* ndof_button_names[] = { +static const char *ndof_button_names[] = { // used internally, never sent "NDOF_BUTTON_NONE", // these two are available from any 3Dconnexion device @@ -309,13 +309,13 @@ void GHOST_NDOFManager::updateRotation(short r[3], GHOST_TUns64 time) m_motionEventPending = true; } -void GHOST_NDOFManager::sendButtonEvent(NDOF_ButtonT button, bool press, GHOST_TUns64 time, GHOST_IWindow* window) +void GHOST_NDOFManager::sendButtonEvent(NDOF_ButtonT button, bool press, GHOST_TUns64 time, GHOST_IWindow *window) { GHOST_ASSERT(button > NDOF_BUTTON_NONE && button < NDOF_BUTTON_LAST, - "rogue button trying to escape NDOF manager"); + "rogue button trying to escape NDOF manager"); - GHOST_EventNDOFButton* event = new GHOST_EventNDOFButton(time, window); - GHOST_TEventNDOFButtonData* data = (GHOST_TEventNDOFButtonData*) event->getData(); + GHOST_EventNDOFButton *event = new GHOST_EventNDOFButton(time, window); + GHOST_TEventNDOFButtonData *data = (GHOST_TEventNDOFButtonData *) event->getData(); data->action = press ? GHOST_kPress : GHOST_kRelease; data->button = button; @@ -327,10 +327,10 @@ void GHOST_NDOFManager::sendButtonEvent(NDOF_ButtonT button, bool press, GHOST_T m_system.pushEvent(event); } -void GHOST_NDOFManager::sendKeyEvent(GHOST_TKey key, bool press, GHOST_TUns64 time, GHOST_IWindow* window) +void GHOST_NDOFManager::sendKeyEvent(GHOST_TKey key, bool press, GHOST_TUns64 time, GHOST_IWindow *window) { GHOST_TEventType type = press ? GHOST_kEventKeyDown : GHOST_kEventKeyUp; - GHOST_EventKey* event = new GHOST_EventKey(time, type, window, key); + GHOST_EventKey *event = new GHOST_EventKey(time, type, window, key); #ifdef DEBUG_NDOF_BUTTONS printf("keyboard %s\n", press ? "down" : "up"); @@ -341,7 +341,7 @@ void GHOST_NDOFManager::sendKeyEvent(GHOST_TKey key, bool press, GHOST_TUns64 ti void GHOST_NDOFManager::updateButton(int button_number, bool press, GHOST_TUns64 time) { - GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow(); + GHOST_IWindow *window = m_system.getWindowManager()->getActiveWindow(); #ifdef DEBUG_NDOF_BUTTONS printf("ndof: button %d -> ", button_number); @@ -403,14 +403,14 @@ void GHOST_NDOFManager::setDeadZone(float dz) GHOST_PRINTF("ndof: dead zone set to %.2f\n", dz); } -static bool atHomePosition(GHOST_TEventNDOFMotionData* ndof) +static bool atHomePosition(GHOST_TEventNDOFMotionData *ndof) { #define HOME(foo) (ndof->foo == 0.f) return HOME(tx) && HOME(ty) && HOME(tz) && HOME(rx) && HOME(ry) && HOME(rz); #undef HOME } -static bool nearHomePosition(GHOST_TEventNDOFMotionData* ndof, float threshold) +static bool nearHomePosition(GHOST_TEventNDOFMotionData *ndof, float threshold) { if (threshold == 0.f) { return atHomePosition(ndof); @@ -429,14 +429,14 @@ bool GHOST_NDOFManager::sendMotionEvent() m_motionEventPending = false; // any pending motion is handled right now - GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow(); + GHOST_IWindow *window = m_system.getWindowManager()->getActiveWindow(); if (window == NULL) { return false; // delivery will fail, so don't bother sending } - GHOST_EventNDOFMotion* event = new GHOST_EventNDOFMotion(m_motionTime, window); - GHOST_TEventNDOFMotionData* data = (GHOST_TEventNDOFMotionData*) event->getData(); + GHOST_EventNDOFMotion *event = new GHOST_EventNDOFMotion(m_motionTime, window); + GHOST_TEventNDOFMotionData *data = (GHOST_TEventNDOFMotionData *) event->getData(); // scale axis values here to normalize them to around +/- 1 // they are scaled again for overall sensitivity in the WM based on user prefs diff --git a/intern/ghost/intern/GHOST_NDOFManagerWin32.cpp b/intern/ghost/intern/GHOST_NDOFManagerWin32.cpp index 6c1627905e0..939e1272434 100644 --- a/intern/ghost/intern/GHOST_NDOFManagerWin32.cpp +++ b/intern/ghost/intern/GHOST_NDOFManagerWin32.cpp @@ -28,7 +28,7 @@ GHOST_NDOFManagerWin32::GHOST_NDOFManagerWin32(GHOST_System& sys) - : GHOST_NDOFManager(sys) + : GHOST_NDOFManager(sys) { setDeadZone(0.1f); } diff --git a/intern/ghost/intern/GHOST_Path-api.cpp b/intern/ghost/intern/GHOST_Path-api.cpp index 1d5410700c6..e92623352b4 100644 --- a/intern/ghost/intern/GHOST_Path-api.cpp +++ b/intern/ghost/intern/GHOST_Path-api.cpp @@ -45,27 +45,27 @@ GHOST_TSuccess GHOST_DisposeSystemPaths(void) return GHOST_ISystemPaths::dispose(); } -const GHOST_TUns8* GHOST_getSystemDir() +const GHOST_TUns8 *GHOST_getSystemDir() { - GHOST_ISystemPaths* systemPaths = GHOST_ISystemPaths::get(); + GHOST_ISystemPaths *systemPaths = GHOST_ISystemPaths::get(); return systemPaths ? systemPaths->getSystemDir() : 0; } -const GHOST_TUns8* GHOST_getUserDir() +const GHOST_TUns8 *GHOST_getUserDir() { - GHOST_ISystemPaths* systemPaths = GHOST_ISystemPaths::get(); + GHOST_ISystemPaths *systemPaths = GHOST_ISystemPaths::get(); return systemPaths ? systemPaths->getUserDir() : 0; /* shouldn't be NULL */ } -const GHOST_TUns8* GHOST_getBinaryDir() +const GHOST_TUns8 *GHOST_getBinaryDir() { - GHOST_ISystemPaths* systemPaths = GHOST_ISystemPaths::get(); + GHOST_ISystemPaths *systemPaths = GHOST_ISystemPaths::get(); return systemPaths ? systemPaths->getBinaryDir() : 0; /* shouldn't be NULL */ } -void GHOST_addToSystemRecentFiles(const char* filename) +void GHOST_addToSystemRecentFiles(const char *filename) { - GHOST_ISystemPaths* systemPaths = GHOST_ISystemPaths::get(); + GHOST_ISystemPaths *systemPaths = GHOST_ISystemPaths::get(); if (systemPaths) { systemPaths->addToSystemRecentFiles(filename); } diff --git a/intern/ghost/intern/GHOST_Rect.cpp b/intern/ghost/intern/GHOST_Rect.cpp index 0717259b369..dc30b3eb220 100644 --- a/intern/ghost/intern/GHOST_Rect.cpp +++ b/intern/ghost/intern/GHOST_Rect.cpp @@ -97,10 +97,10 @@ GHOST_TVisibility GHOST_Rect::getVisibility(GHOST_Rect& r) const void GHOST_Rect::setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy) { - GHOST_TInt32 offset = cx - (m_l + (m_r - m_l)/2); + GHOST_TInt32 offset = cx - (m_l + (m_r - m_l) / 2); m_l += offset; m_r += offset; - offset = cy - (m_t + (m_b - m_t)/2); + offset = cy - (m_t + (m_b - m_t) / 2); m_t += offset; m_b += offset; } diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp index 974f66c666a..ee21128ecbb 100644 --- a/intern/ghost/intern/GHOST_System.cpp +++ b/intern/ghost/intern/GHOST_System.cpp @@ -45,12 +45,12 @@ GHOST_System::GHOST_System() - : m_displayManager(0), - m_timerManager(0), - m_windowManager(0), - m_eventManager(0) + : m_displayManager(0), + m_timerManager(0), + m_windowManager(0), + m_eventManager(0) #ifdef WITH_INPUT_NDOF - , m_ndofManager(0) + , m_ndofManager(0) #endif { } @@ -73,13 +73,13 @@ GHOST_TUns64 GHOST_System::getMilliSeconds() const } -GHOST_ITimerTask* GHOST_System::installTimer(GHOST_TUns64 delay, +GHOST_ITimerTask *GHOST_System::installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData) { GHOST_TUns64 millis = getMilliSeconds(); - GHOST_TimerTask* timer = new GHOST_TimerTask(millis+delay, interval, timerProc, userData); + GHOST_TimerTask *timer = new GHOST_TimerTask(millis + delay, interval, timerProc, userData); if (timer) { if (m_timerManager->addTimer(timer) == GHOST_kSuccess) { // Check to see whether we need to fire the timer right away @@ -94,17 +94,17 @@ GHOST_ITimerTask* GHOST_System::installTimer(GHOST_TUns64 delay, } -GHOST_TSuccess GHOST_System::removeTimer(GHOST_ITimerTask* timerTask) +GHOST_TSuccess GHOST_System::removeTimer(GHOST_ITimerTask *timerTask) { GHOST_TSuccess success = GHOST_kFailure; if (timerTask) { - success = m_timerManager->removeTimer((GHOST_TimerTask*)timerTask); + success = m_timerManager->removeTimer((GHOST_TimerTask *)timerTask); } return success; } -GHOST_TSuccess GHOST_System::disposeWindow(GHOST_IWindow* window) +GHOST_TSuccess GHOST_System::disposeWindow(GHOST_IWindow *window) { GHOST_TSuccess success; @@ -132,14 +132,14 @@ GHOST_TSuccess GHOST_System::disposeWindow(GHOST_IWindow* window) } -bool GHOST_System::validWindow(GHOST_IWindow* window) +bool GHOST_System::validWindow(GHOST_IWindow *window) { return m_windowManager->getWindowFound(window); } -GHOST_TSuccess GHOST_System::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, - const bool stereoVisual, const GHOST_TUns16 numOfAASamples) +GHOST_TSuccess GHOST_System::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window, + const bool stereoVisual, const GHOST_TUns16 numOfAASamples) { GHOST_TSuccess success = GHOST_kFailure; GHOST_ASSERT(m_windowManager, "GHOST_System::beginFullScreen(): invalid window manager") @@ -151,7 +151,7 @@ GHOST_TSuccess GHOST_System::beginFullScreen(const GHOST_DisplaySetting& setting success = m_displayManager->setCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, setting); if (success == GHOST_kSuccess) { //GHOST_PRINT("GHOST_System::beginFullScreen(): creating full-screen window\n"); - success = createFullScreenWindow((GHOST_Window**)window, stereoVisual, numOfAASamples); + success = createFullScreenWindow((GHOST_Window **)window, stereoVisual, numOfAASamples); if (success == GHOST_kSuccess) { m_windowManager->beginFullScreen(*window, stereoVisual); } @@ -168,11 +168,11 @@ GHOST_TSuccess GHOST_System::beginFullScreen(const GHOST_DisplaySetting& setting } -GHOST_TSuccess GHOST_System::updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window) +GHOST_TSuccess GHOST_System::updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window) { GHOST_TSuccess success = GHOST_kFailure; GHOST_ASSERT(m_windowManager, "GHOST_System::updateFullScreen(): invalid window manager"); - if(m_displayManager) { + if (m_displayManager) { if (m_windowManager->getFullScreen()) { success = m_displayManager->setCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, setting); } @@ -233,7 +233,7 @@ bool GHOST_System::dispatchEvents() } -GHOST_TSuccess GHOST_System::addEventConsumer(GHOST_IEventConsumer* consumer) +GHOST_TSuccess GHOST_System::addEventConsumer(GHOST_IEventConsumer *consumer) { GHOST_TSuccess success; if (m_eventManager) { @@ -245,7 +245,7 @@ GHOST_TSuccess GHOST_System::addEventConsumer(GHOST_IEventConsumer* consumer) return success; } -GHOST_TSuccess GHOST_System::removeEventConsumer(GHOST_IEventConsumer* consumer) +GHOST_TSuccess GHOST_System::removeEventConsumer(GHOST_IEventConsumer *consumer) { GHOST_TSuccess success; if (m_eventManager) { @@ -257,7 +257,7 @@ GHOST_TSuccess GHOST_System::removeEventConsumer(GHOST_IEventConsumer* consumer) return success; } -GHOST_TSuccess GHOST_System::pushEvent(GHOST_IEvent* event) +GHOST_TSuccess GHOST_System::pushEvent(GHOST_IEvent *event) { GHOST_TSuccess success; if (m_eventManager) { @@ -296,9 +296,9 @@ GHOST_TSuccess GHOST_System::getButtonState(GHOST_TButtonMask mask, bool& isDown GHOST_TSuccess GHOST_System::init() { - m_timerManager = new GHOST_TimerManager (); - m_windowManager = new GHOST_WindowManager (); - m_eventManager = new GHOST_EventManager (); + m_timerManager = new GHOST_TimerManager(); + m_windowManager = new GHOST_WindowManager(); + m_eventManager = new GHOST_EventManager(); #ifdef GHOST_DEBUG if (m_eventManager) { @@ -309,7 +309,8 @@ GHOST_TSuccess GHOST_System::init() if (m_timerManager && m_windowManager && m_eventManager) { return GHOST_kSuccess; - } else { + } + else { return GHOST_kFailure; } } @@ -346,7 +347,7 @@ GHOST_TSuccess GHOST_System::exit() } -GHOST_TSuccess GHOST_System::createFullScreenWindow(GHOST_Window** window, const bool stereoVisual, const GHOST_TUns16 numOfAASamples) +GHOST_TSuccess GHOST_System::createFullScreenWindow(GHOST_Window **window, const bool stereoVisual, const GHOST_TUns16 numOfAASamples) { GHOST_TSuccess success; GHOST_ASSERT(m_displayManager, "GHOST_System::createFullScreenWindow(): invalid display manager") @@ -355,20 +356,20 @@ GHOST_TSuccess GHOST_System::createFullScreenWindow(GHOST_Window** window, const success = m_displayManager->getCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, settings); if (success) { //GHOST_PRINT("GHOST_System::createFullScreenWindow(): creating full-screen window\n"); - *window = (GHOST_Window*)createWindow( - STR_String (""), - 0, 0, settings.xPixels, settings.yPixels, - GHOST_kWindowStateFullScreen, - GHOST_kDrawingContextTypeOpenGL, - stereoVisual, - numOfAASamples); + *window = (GHOST_Window *)createWindow( + STR_String(""), + 0, 0, settings.xPixels, settings.yPixels, + GHOST_kWindowStateFullScreen, + GHOST_kDrawingContextTypeOpenGL, + stereoVisual, + numOfAASamples); success = *window == 0 ? GHOST_kFailure : GHOST_kSuccess; } return success; } -int GHOST_System::confirmQuit(GHOST_IWindow * window) const +int GHOST_System::confirmQuit(GHOST_IWindow *window) const { return 1; } diff --git a/intern/ghost/intern/GHOST_SystemCarbon.cpp b/intern/ghost/intern/GHOST_SystemCarbon.cpp index 5db392e1706..fc4ca8f8f61 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.cpp +++ b/intern/ghost/intern/GHOST_SystemCarbon.cpp @@ -61,21 +61,21 @@ /* blender class and types events */ enum { - kEventClassBlender = 'blnd' + kEventClassBlender = 'blnd' }; enum { - kEventBlenderNdofAxis = 1, - kEventBlenderNdofButtons = 2 + kEventBlenderNdofAxis = 1, + kEventBlenderNdofButtons = 2 }; -const EventTypeSpec kEvents[] = +const EventTypeSpec kEvents[] = { { kEventClassAppleEvent, kEventAppleEvent }, /* - { kEventClassApplication, kEventAppActivated }, - { kEventClassApplication, kEventAppDeactivated }, -*/ + { kEventClassApplication, kEventAppActivated }, + { kEventClassApplication, kEventAppDeactivated }, + */ { kEventClassKeyboard, kEventRawKeyDown }, { kEventClassKeyboard, kEventRawKeyRepeat }, { kEventClassKeyboard, kEventRawKeyUp }, @@ -87,9 +87,9 @@ const EventTypeSpec kEvents[] = { kEventClassMouse, kEventMouseDragged }, { kEventClassMouse, kEventMouseWheelMoved }, - { kEventClassWindow, kEventWindowClickZoomRgn } , /* for new zoom behaviour */ + { kEventClassWindow, kEventWindowClickZoomRgn }, /* for new zoom behaviour */ { kEventClassWindow, kEventWindowZoom }, /* for new zoom behaviour */ - { kEventClassWindow, kEventWindowExpand } , /* for new zoom behaviour */ + { kEventClassWindow, kEventWindowExpand }, /* for new zoom behaviour */ { kEventClassWindow, kEventWindowExpandAll }, /* for new zoom behaviour */ { kEventClassWindow, kEventWindowClose }, @@ -110,111 +110,114 @@ const EventTypeSpec kEvents[] = static GHOST_TButtonMask convertButton(EventMouseButton button) { switch (button) { - case kEventMouseButtonPrimary: - return GHOST_kButtonMaskLeft; - case kEventMouseButtonSecondary: - return GHOST_kButtonMaskRight; - case kEventMouseButtonTertiary: - default: - return GHOST_kButtonMaskMiddle; + case kEventMouseButtonPrimary: + return GHOST_kButtonMaskLeft; + case kEventMouseButtonSecondary: + return GHOST_kButtonMaskRight; + case kEventMouseButtonTertiary: + default: + return GHOST_kButtonMaskMiddle; } } static GHOST_TKey convertKey(int rawCode) { - /* This bit of magic converts the rawCode into a virtual - * Mac key based on the current keyboard mapping, but - * without regard to the modifiers (so we don't get 'a' - * and 'A' for example. - */ - static UInt32 dummy= 0; + /* This bit of magic converts the rawCode into a virtual + * Mac key based on the current keyboard mapping, but + * without regard to the modifiers (so we don't get 'a' + * and 'A' for example. + */ + static UInt32 dummy = 0; Handle transData = (Handle) GetScriptManagerVariable(smKCHRCache); unsigned char vk = KeyTranslate(transData, rawCode, &dummy); - /* Map numpad based on rawcodes first, otherwise they - * look like non-numpad events. - * Added too: mapping the number keys, for french keyboards etc (ton) - */ + /* Map numpad based on rawcodes first, otherwise they + * look like non-numpad events. + * Added too: mapping the number keys, for french keyboards etc (ton) + */ // printf("GHOST: vk: %d %c raw: %d\n", vk, vk, rawCode); switch (rawCode) { - case 18: return GHOST_kKey1; - case 19: return GHOST_kKey2; - case 20: return GHOST_kKey3; - case 21: return GHOST_kKey4; - case 23: return GHOST_kKey5; - case 22: return GHOST_kKey6; - case 26: return GHOST_kKey7; - case 28: return GHOST_kKey8; - case 25: return GHOST_kKey9; - case 29: return GHOST_kKey0; - - case 82: return GHOST_kKeyNumpad0; - case 83: return GHOST_kKeyNumpad1; - case 84: return GHOST_kKeyNumpad2; - case 85: return GHOST_kKeyNumpad3; - case 86: return GHOST_kKeyNumpad4; - case 87: return GHOST_kKeyNumpad5; - case 88: return GHOST_kKeyNumpad6; - case 89: return GHOST_kKeyNumpad7; - case 91: return GHOST_kKeyNumpad8; - case 92: return GHOST_kKeyNumpad9; - case 65: return GHOST_kKeyNumpadPeriod; - case 76: return GHOST_kKeyNumpadEnter; - case 69: return GHOST_kKeyNumpadPlus; - case 78: return GHOST_kKeyNumpadMinus; - case 67: return GHOST_kKeyNumpadAsterisk; - case 75: return GHOST_kKeyNumpadSlash; + case 18: return GHOST_kKey1; + case 19: return GHOST_kKey2; + case 20: return GHOST_kKey3; + case 21: return GHOST_kKey4; + case 23: return GHOST_kKey5; + case 22: return GHOST_kKey6; + case 26: return GHOST_kKey7; + case 28: return GHOST_kKey8; + case 25: return GHOST_kKey9; + case 29: return GHOST_kKey0; + + case 82: return GHOST_kKeyNumpad0; + case 83: return GHOST_kKeyNumpad1; + case 84: return GHOST_kKeyNumpad2; + case 85: return GHOST_kKeyNumpad3; + case 86: return GHOST_kKeyNumpad4; + case 87: return GHOST_kKeyNumpad5; + case 88: return GHOST_kKeyNumpad6; + case 89: return GHOST_kKeyNumpad7; + case 91: return GHOST_kKeyNumpad8; + case 92: return GHOST_kKeyNumpad9; + case 65: return GHOST_kKeyNumpadPeriod; + case 76: return GHOST_kKeyNumpadEnter; + case 69: return GHOST_kKeyNumpadPlus; + case 78: return GHOST_kKeyNumpadMinus; + case 67: return GHOST_kKeyNumpadAsterisk; + case 75: return GHOST_kKeyNumpadSlash; } if ((vk >= 'a') && (vk <= 'z')) { return (GHOST_TKey) (vk - 'a' + GHOST_kKeyA); - } else if ((vk >= '0') && (vk <= '9')) { + } + else if ((vk >= '0') && (vk <= '9')) { return (GHOST_TKey) (vk - '0' + GHOST_kKey0); - } else if (vk==16) { + } + else if (vk == 16) { switch (rawCode) { - case 122: return GHOST_kKeyF1; - case 120: return GHOST_kKeyF2; - case 99: return GHOST_kKeyF3; - case 118: return GHOST_kKeyF4; - case 96: return GHOST_kKeyF5; - case 97: return GHOST_kKeyF6; - case 98: return GHOST_kKeyF7; - case 100: return GHOST_kKeyF8; - case 101: return GHOST_kKeyF9; - case 109: return GHOST_kKeyF10; - case 103: return GHOST_kKeyF11; - case 111: return GHOST_kKeyF12; // Never get, is used for ejecting the CD! + case 122: return GHOST_kKeyF1; + case 120: return GHOST_kKeyF2; + case 99: return GHOST_kKeyF3; + case 118: return GHOST_kKeyF4; + case 96: return GHOST_kKeyF5; + case 97: return GHOST_kKeyF6; + case 98: return GHOST_kKeyF7; + case 100: return GHOST_kKeyF8; + case 101: return GHOST_kKeyF9; + case 109: return GHOST_kKeyF10; + case 103: return GHOST_kKeyF11; + case 111: return GHOST_kKeyF12; // Never get, is used for ejecting the CD! } - } else { + } + else { switch (vk) { - case kUpArrowCharCode: return GHOST_kKeyUpArrow; - case kDownArrowCharCode: return GHOST_kKeyDownArrow; - case kLeftArrowCharCode: return GHOST_kKeyLeftArrow; - case kRightArrowCharCode: return GHOST_kKeyRightArrow; + case kUpArrowCharCode: return GHOST_kKeyUpArrow; + case kDownArrowCharCode: return GHOST_kKeyDownArrow; + case kLeftArrowCharCode: return GHOST_kKeyLeftArrow; + case kRightArrowCharCode: return GHOST_kKeyRightArrow; - case kReturnCharCode: return GHOST_kKeyEnter; - case kBackspaceCharCode: return GHOST_kKeyBackSpace; - case kDeleteCharCode: return GHOST_kKeyDelete; - case kEscapeCharCode: return GHOST_kKeyEsc; - case kTabCharCode: return GHOST_kKeyTab; - case kSpaceCharCode: return GHOST_kKeySpace; + case kReturnCharCode: return GHOST_kKeyEnter; + case kBackspaceCharCode: return GHOST_kKeyBackSpace; + case kDeleteCharCode: return GHOST_kKeyDelete; + case kEscapeCharCode: return GHOST_kKeyEsc; + case kTabCharCode: return GHOST_kKeyTab; + case kSpaceCharCode: return GHOST_kKeySpace; - case kHomeCharCode: return GHOST_kKeyHome; - case kEndCharCode: return GHOST_kKeyEnd; - case kPageUpCharCode: return GHOST_kKeyUpPage; - case kPageDownCharCode: return GHOST_kKeyDownPage; + case kHomeCharCode: return GHOST_kKeyHome; + case kEndCharCode: return GHOST_kKeyEnd; + case kPageUpCharCode: return GHOST_kKeyUpPage; + case kPageDownCharCode: return GHOST_kKeyDownPage; - case '-': return GHOST_kKeyMinus; - case '=': return GHOST_kKeyEqual; - case ',': return GHOST_kKeyComma; - case '.': return GHOST_kKeyPeriod; - case '/': return GHOST_kKeySlash; - case ';': return GHOST_kKeySemicolon; - case '\'': return GHOST_kKeyQuote; - case '\\': return GHOST_kKeyBackslash; - case '[': return GHOST_kKeyLeftBracket; - case ']': return GHOST_kKeyRightBracket; - case '`': return GHOST_kKeyAccentGrave; + case '-': return GHOST_kKeyMinus; + case '=': return GHOST_kKeyEqual; + case ',': return GHOST_kKeyComma; + case '.': return GHOST_kKeyPeriod; + case '/': return GHOST_kKeySlash; + case ';': return GHOST_kKeySemicolon; + case '\'': return GHOST_kKeyQuote; + case '\\': return GHOST_kKeyBackslash; + case '[': return GHOST_kKeyLeftBracket; + case ']': return GHOST_kKeyRightBracket; + case '`': return GHOST_kKeyAccentGrave; } } @@ -233,117 +236,117 @@ static GHOST_TKey convertKey(int rawCode) static unsigned char convertRomanToLatin(unsigned char ascii) { - if(ascii<128) return ascii; + if (ascii < 128) return ascii; - switch(ascii) { - case 128: return 142; - case 129: return 143; - case 130: return 128; - case 131: return 201; - case 132: return 209; - case 133: return 214; - case 134: return 220; - case 135: return 225; - case 136: return 224; - case 137: return 226; - case 138: return 228; - case 139: return 227; - case 140: return 229; - case 141: return 231; - case 142: return 233; - case 143: return 232; - case 144: return 234; - case 145: return 235; - case 146: return 237; - case 147: return 236; - case 148: return 238; - case 149: return 239; - case 150: return 241; - case 151: return 243; - case 152: return 242; - case 153: return 244; - case 154: return 246; - case 155: return 245; - case 156: return 250; - case 157: return 249; - case 158: return 251; - case 159: return 252; - case 160: return 0; - case 161: return 176; - case 162: return 162; - case 163: return 163; - case 164: return 167; - case 165: return 183; - case 166: return 182; - case 167: return 223; - case 168: return 174; - case 169: return 169; - case 170: return 174; - case 171: return 180; - case 172: return 168; - case 173: return 0; - case 174: return 198; - case 175: return 216; - case 176: return 0; - case 177: return 177; - case 178: return 0; - case 179: return 0; - case 180: return 165; - case 181: return 181; - case 182: return 0; - case 183: return 0; - case 184: return 215; - case 185: return 0; - case 186: return 0; - case 187: return 170; - case 188: return 186; - case 189: return 0; - case 190: return 230; - case 191: return 248; - case 192: return 191; - case 193: return 161; - case 194: return 172; - case 195: return 0; - case 196: return 0; - case 197: return 0; - case 198: return 0; - case 199: return 171; - case 200: return 187; - case 201: return 201; - case 202: return 0; - case 203: return 192; - case 204: return 195; - case 205: return 213; - case 206: return 0; - case 207: return 0; - case 208: return 0; - case 209: return 0; - case 210: return 0; - - case 214: return 247; + switch (ascii) { + case 128: return 142; + case 129: return 143; + case 130: return 128; + case 131: return 201; + case 132: return 209; + case 133: return 214; + case 134: return 220; + case 135: return 225; + case 136: return 224; + case 137: return 226; + case 138: return 228; + case 139: return 227; + case 140: return 229; + case 141: return 231; + case 142: return 233; + case 143: return 232; + case 144: return 234; + case 145: return 235; + case 146: return 237; + case 147: return 236; + case 148: return 238; + case 149: return 239; + case 150: return 241; + case 151: return 243; + case 152: return 242; + case 153: return 244; + case 154: return 246; + case 155: return 245; + case 156: return 250; + case 157: return 249; + case 158: return 251; + case 159: return 252; + case 160: return 0; + case 161: return 176; + case 162: return 162; + case 163: return 163; + case 164: return 167; + case 165: return 183; + case 166: return 182; + case 167: return 223; + case 168: return 174; + case 169: return 169; + case 170: return 174; + case 171: return 180; + case 172: return 168; + case 173: return 0; + case 174: return 198; + case 175: return 216; + case 176: return 0; + case 177: return 177; + case 178: return 0; + case 179: return 0; + case 180: return 165; + case 181: return 181; + case 182: return 0; + case 183: return 0; + case 184: return 215; + case 185: return 0; + case 186: return 0; + case 187: return 170; + case 188: return 186; + case 189: return 0; + case 190: return 230; + case 191: return 248; + case 192: return 191; + case 193: return 161; + case 194: return 172; + case 195: return 0; + case 196: return 0; + case 197: return 0; + case 198: return 0; + case 199: return 171; + case 200: return 187; + case 201: return 201; + case 202: return 0; + case 203: return 192; + case 204: return 195; + case 205: return 213; + case 206: return 0; + case 207: return 0; + case 208: return 0; + case 209: return 0; + case 210: return 0; - case 229: return 194; - case 230: return 202; - case 231: return 193; - case 232: return 203; - case 233: return 200; - case 234: return 205; - case 235: return 206; - case 236: return 207; - case 237: return 204; - case 238: return 211; - case 239: return 212; - case 240: return 0; - case 241: return 210; - case 242: return 218; - case 243: return 219; - case 244: return 217; - case 245: return 0; - case 246: return 0; - case 247: return 0; - case 248: return 0; - case 249: return 0; - case 250: return 0; + case 214: return 247; + + case 229: return 194; + case 230: return 202; + case 231: return 193; + case 232: return 203; + case 233: return 200; + case 234: return 205; + case 235: return 206; + case 236: return 207; + case 237: return 204; + case 238: return 211; + case 239: return 212; + case 240: return 0; + case 241: return 210; + case 242: return 218; + case 243: return 219; + case 244: return 217; + case 245: return 0; + case 246: return 0; + case 247: return 0; + case 248: return 0; + case 249: return 0; + case 250: return 0; default: return 0; @@ -357,13 +360,13 @@ static unsigned char convertRomanToLatin(unsigned char ascii) GHOST_SystemCarbon::GHOST_SystemCarbon() : m_modifierMask(0) { - m_displayManager = new GHOST_DisplayManagerCarbon (); + m_displayManager = new GHOST_DisplayManagerCarbon(); GHOST_ASSERT(m_displayManager, "GHOST_SystemCarbon::GHOST_SystemCarbon(): m_displayManager==0\n"); m_displayManager->initialize(); UnsignedWide micros; ::Microseconds(µs); - m_start_time = UnsignedWideToUInt64(micros)/1000; + m_start_time = UnsignedWideToUInt64(micros) / 1000; m_ignoreWindowSizedMessages = false; } @@ -381,7 +384,6 @@ GHOST_TUns64 GHOST_SystemCarbon::getMilliSeconds() const return (millis / 1000) - m_start_time; } - GHOST_TUns8 GHOST_SystemCarbon::getNumDisplays() const { // We do not support multiple monitors at the moment @@ -398,22 +400,21 @@ void GHOST_SystemCarbon::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUn } -GHOST_IWindow* GHOST_SystemCarbon::createWindow( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - bool stereoVisual, - const GHOST_TUns16 numOfAASamples, - const GHOST_TEmbedderWindowID parentWindow -) +GHOST_IWindow *GHOST_SystemCarbon::createWindow( + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + bool stereoVisual, + const GHOST_TUns16 numOfAASamples, + const GHOST_TEmbedderWindowID parentWindow) { - GHOST_IWindow* window = 0; + GHOST_IWindow *window = 0; - window = new GHOST_WindowCarbon (title, left, top, width, height, state, type); + window = new GHOST_WindowCarbon(title, left, top, width, height, state, type); if (window) { if (window->getValid()) { @@ -435,18 +436,18 @@ GHOST_IWindow* GHOST_SystemCarbon::createWindow( return window; } -GHOST_TSuccess GHOST_SystemCarbon::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, const bool stereoVisual) +GHOST_TSuccess GHOST_SystemCarbon::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window, const bool stereoVisual) { GHOST_TSuccess success = GHOST_kFailure; // need yo make this Carbon all on 10.5 for fullscreen to work correctly CGCaptureAllDisplays(); - success = GHOST_System::beginFullScreen( setting, window, stereoVisual); + success = GHOST_System::beginFullScreen(setting, window, stereoVisual); - if( success != GHOST_kSuccess ) { - // fullscreen failed for other reasons, release - CGReleaseAllDisplays(); + if (success != GHOST_kSuccess) { + // fullscreen failed for other reasons, release + CGReleaseAllDisplays(); } return success; @@ -459,8 +460,8 @@ GHOST_TSuccess GHOST_SystemCarbon::endFullScreen(void) } /* this is an old style low level event queue. - As we want to handle our own timers, this is ok. - the full screen hack should be removed */ + * As we want to handle our own timers, this is ok. + * the full screen hack should be removed */ bool GHOST_SystemCarbon::processEvents(bool waitForEvent) { bool anyProcessed = false; @@ -469,7 +470,7 @@ bool GHOST_SystemCarbon::processEvents(bool waitForEvent) // SetMouseCoalescingEnabled(false, NULL); do { - GHOST_TimerManager* timerMgr = getTimerManager(); + GHOST_TimerManager *timerMgr = getTimerManager(); if (waitForEvent) { GHOST_TUns64 next = timerMgr->nextFireTime(); @@ -477,8 +478,9 @@ bool GHOST_SystemCarbon::processEvents(bool waitForEvent) if (next == GHOST_kFireTimeNever) { timeOut = kEventDurationForever; - } else { - timeOut = (double)(next - getMilliSeconds())/1000.0; + } + else { + timeOut = (double)(next - getMilliSeconds()) / 1000.0; if (timeOut < 0.0) timeOut = 0.0; } @@ -492,26 +494,27 @@ bool GHOST_SystemCarbon::processEvents(bool waitForEvent) if (getFullScreen()) { // Check if the full-screen window is dirty - GHOST_IWindow* window = m_windowManager->getFullScreenWindow(); - if (((GHOST_WindowCarbon*)window)->getFullScreenDirty()) { - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) ); + GHOST_IWindow *window = m_windowManager->getFullScreenWindow(); + if (((GHOST_WindowCarbon *)window)->getFullScreenDirty()) { + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) ); anyProcessed = true; } } /* end loop when no more events available */ - while (::ReceiveNextEvent(0, NULL, 0, true, &event)==noErr) { - OSStatus status= ::SendEventToEventTarget(event, ::GetEventDispatcherTarget()); - if (status==noErr) { + while (::ReceiveNextEvent(0, NULL, 0, true, &event) == noErr) { + OSStatus status = ::SendEventToEventTarget(event, ::GetEventDispatcherTarget()); + if (status == noErr) { anyProcessed = true; - } else { - UInt32 i= ::GetEventClass(event); + } + else { + UInt32 i = ::GetEventClass(event); - /* Ignore 'cgs ' class, no documentation on what they - * are, but we get a lot of them - */ - if (i!='cgs ') { - if (i!='tblt') { // tablet event. we use the one packaged in the mouse event + /* Ignore 'cgs ' class, no documentation on what they + * are, but we get a lot of them + */ + if (i != 'cgs ') { + if (i != 'tblt') { // tablet event. we use the one packaged in the mouse event ; //printf("Missed - Class: '%.4s', Kind: %d\n", &i, ::GetEventKind(event)); } } @@ -538,7 +541,7 @@ GHOST_TSuccess GHOST_SystemCarbon::getCursorPosition(GHOST_TInt32& x, GHOST_TInt GHOST_TSuccess GHOST_SystemCarbon::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { - float xf=(float)x, yf=(float)y; + float xf = (float)x, yf = (float)y; CGAssociateMouseAndMouseCursorPosition(false); CGSetLocalEventsSuppressionInterval(0); @@ -585,7 +588,8 @@ extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG]) strncpy(buf, g_firstFileBuf, FIRSTFILEBUFLG - 1); buf[FIRSTFILEBUFLG - 1] = '\0'; return 1; - } else { + } + else { return 0; } } @@ -605,28 +609,28 @@ OSErr GHOST_SystemCarbon::sAEHandlerOpenDocs(const AppleEvent *event, AppleEvent OSErr err; err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docs); - if (err != noErr) return err; + if (err != noErr) return err; err = AECountItems(&docs, &ndocs); - if (err==noErr) { + if (err == noErr) { int i; - for (i=0; ipushEvent( new GHOST_Event(sys->getMilliSeconds(), GHOST_kEventQuit, NULL) ); + sys->pushEvent(new GHOST_Event(sys->getMilliSeconds(), GHOST_kEventQuit, NULL) ); return noErr; } @@ -698,47 +702,47 @@ OSStatus GHOST_SystemCarbon::handleWindowEvent(EventRef event) // Check if the event was send to a GHOST window ::GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &windowRef); - window = (GHOST_WindowCarbon*) ::GetWRefCon(windowRef); + window = (GHOST_WindowCarbon *) ::GetWRefCon(windowRef); if (!validWindow(window)) { return err; } //if (!getFullScreen()) { - err = noErr; - switch(::GetEventKind(event)) - { - case kEventWindowClose: - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window) ); - break; - case kEventWindowActivated: - m_windowManager->setActiveWindow(window); - window->loadCursor(window->getCursorVisibility(), window->getCursorShape()); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window) ); - break; - case kEventWindowDeactivated: - m_windowManager->setWindowInactive(window); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window) ); - break; - case kEventWindowUpdate: - //if (getFullScreen()) GHOST_PRINT("GHOST_SystemCarbon::handleWindowEvent(): full-screen update event\n"); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) ); - break; - case kEventWindowBoundsChanged: - if (!m_ignoreWindowSizedMessages) - { - window->updateDrawingContext(); - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window) ); - } - break; - default: - err = eventNotHandledErr; - break; - } + err = noErr; + switch (::GetEventKind(event)) + { + case kEventWindowClose: + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window) ); + break; + case kEventWindowActivated: + m_windowManager->setActiveWindow(window); + window->loadCursor(window->getCursorVisibility(), window->getCursorShape()); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window) ); + break; + case kEventWindowDeactivated: + m_windowManager->setWindowInactive(window); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window) ); + break; + case kEventWindowUpdate: + //if (getFullScreen()) GHOST_PRINT("GHOST_SystemCarbon::handleWindowEvent(): full-screen update event\n"); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) ); + break; + case kEventWindowBoundsChanged: + if (!m_ignoreWindowSizedMessages) + { + window->updateDrawingContext(); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window) ); + } + break; + default: + err = eventNotHandledErr; + break; + } // } //else { - //window = (GHOST_WindowCarbon*) m_windowManager->getFullScreenWindow(); - //GHOST_PRINT("GHOST_SystemCarbon::handleWindowEvent(): full-screen window event, " << window << "\n"); - //::RemoveEventFromQueue(::GetMainEventQueue(), event); + //window = (GHOST_WindowCarbon*) m_windowManager->getFullScreenWindow(); + //GHOST_PRINT("GHOST_SystemCarbon::handleWindowEvent(): full-screen window event, " << window << "\n"); + //::RemoveEventFromQueue(::GetMainEventQueue(), event); //} return err; @@ -746,11 +750,11 @@ OSStatus GHOST_SystemCarbon::handleWindowEvent(EventRef event) OSStatus GHOST_SystemCarbon::handleTabletEvent(EventRef event) { - GHOST_IWindow* window = m_windowManager->getActiveWindow(); + GHOST_IWindow *window = m_windowManager->getActiveWindow(); TabletPointRec tabletPointRecord; - TabletProximityRec tabletProximityRecord; + TabletProximityRec tabletProximityRecord; UInt32 anInt32; - GHOST_TabletData& ct=((GHOST_WindowCarbon*)window)->GetCarbonTabletData(); + GHOST_TabletData& ct = ((GHOST_WindowCarbon *)window)->GetCarbonTabletData(); OSStatus err = eventNotHandledErr; ct.Pressure = 0; @@ -758,11 +762,11 @@ OSStatus GHOST_SystemCarbon::handleTabletEvent(EventRef event) ct.Ytilt = 0; // is there an embedded tablet event inside this mouse event? - if(noErr == GetEventParameter(event, kEventParamTabletEventType, typeUInt32, NULL, sizeof(UInt32), NULL, (void *)&anInt32)) + if (noErr == GetEventParameter(event, kEventParamTabletEventType, typeUInt32, NULL, sizeof(UInt32), NULL, (void *)&anInt32)) { // yes there is one! // Embedded tablet events can either be a proximity or pointer event. - if(anInt32 == kEventTabletPoint) + if (anInt32 == kEventTabletPoint) { //GHOST_PRINT("Embedded pointer event!\n"); @@ -771,28 +775,29 @@ OSStatus GHOST_SystemCarbon::handleTabletEvent(EventRef event) // error and go on. This can occur when a proximity event is embedded in // a mouse event and you did not check the mouse event to see which type // of tablet event was embedded. - if(noErr == GetEventParameter(event, kEventParamTabletPointRec, - typeTabletPointRec, NULL, - sizeof(TabletPointRec), - NULL, (void *)&tabletPointRecord)) + if (noErr == GetEventParameter(event, kEventParamTabletPointRec, + typeTabletPointRec, NULL, + sizeof(TabletPointRec), + NULL, (void *)&tabletPointRecord)) { ct.Pressure = tabletPointRecord.pressure / 65535.0f; ct.Xtilt = tabletPointRecord.tiltX / 32767.0f; /* can be positive or negative */ ct.Ytilt = tabletPointRecord.tiltY / 32767.0f; /* can be positive or negative */ } - } else { + } + else { //GHOST_PRINT("Embedded proximity event\n"); // Extract the Tablet Proximity record from the event. - if(noErr == GetEventParameter(event, kEventParamTabletProximityRec, - typeTabletProximityRec, NULL, - sizeof(TabletProximityRec), - NULL, (void *)&tabletProximityRecord)) + if (noErr == GetEventParameter(event, kEventParamTabletProximityRec, + typeTabletProximityRec, NULL, + sizeof(TabletProximityRec), + NULL, (void *)&tabletProximityRecord)) { if (tabletProximityRecord.enterProximity) { //pointer is entering tablet area proximity - switch(tabletProximityRecord.pointerType) + switch (tabletProximityRecord.pointerType) { case 1: /* stylus */ ct.Active = GHOST_kTabletModeStylus; @@ -807,25 +812,26 @@ OSStatus GHOST_SystemCarbon::handleTabletEvent(EventRef event) ct.Active = GHOST_kTabletModeNone; break; } - } else { + } + else { // pointer is leaving - return to mouse ct.Active = GHOST_kTabletModeNone; } } } - err = noErr; + err = noErr; } return err; } OSStatus GHOST_SystemCarbon::handleMouseEvent(EventRef event) { - OSStatus err = eventNotHandledErr; - GHOST_IWindow* window = m_windowManager->getActiveWindow(); + OSStatus err = eventNotHandledErr; + GHOST_IWindow *window = m_windowManager->getActiveWindow(); UInt32 kind = ::GetEventKind(event); switch (kind) - { + { case kEventMouseDown: case kEventMouseUp: // Handle Mac application responsibilities @@ -863,29 +869,29 @@ OSStatus GHOST_SystemCarbon::handleMouseEvent(EventRef event) break; } case kEventMouseWheelMoved: + { + OSStatus status; + //UInt32 modifiers; + EventMouseWheelAxis axis; + SInt32 delta; + //status = ::GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); + //GHOST_ASSERT(status == noErr, "GHOST_SystemCarbon::handleMouseEvent(): GetEventParameter() failed"); + status = ::GetEventParameter(event, kEventParamMouseWheelAxis, typeMouseWheelAxis, NULL, sizeof(axis), NULL, &axis); + GHOST_ASSERT(status == noErr, "GHOST_SystemCarbon::handleMouseEvent(): GetEventParameter() failed"); + if (axis == kEventMouseWheelAxisY) { - OSStatus status; - //UInt32 modifiers; - EventMouseWheelAxis axis; - SInt32 delta; - //status = ::GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); - //GHOST_ASSERT(status == noErr, "GHOST_SystemCarbon::handleMouseEvent(): GetEventParameter() failed"); - status = ::GetEventParameter(event, kEventParamMouseWheelAxis, typeMouseWheelAxis, NULL, sizeof(axis), NULL, &axis); + status = ::GetEventParameter(event, kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(delta), NULL, &delta); GHOST_ASSERT(status == noErr, "GHOST_SystemCarbon::handleMouseEvent(): GetEventParameter() failed"); - if (axis == kEventMouseWheelAxisY) - { - status = ::GetEventParameter(event, kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(delta), NULL, &delta); - GHOST_ASSERT(status == noErr, "GHOST_SystemCarbon::handleMouseEvent(): GetEventParameter() failed"); - /* - * Limit mouse wheel delta to plus and minus one. - */ - delta = delta > 0 ? 1 : -1; - pushEvent(new GHOST_EventWheel(getMilliSeconds(), window, delta)); - err = noErr; - } + /* + * Limit mouse wheel delta to plus and minus one. + */ + delta = delta > 0 ? 1 : -1; + pushEvent(new GHOST_EventWheel(getMilliSeconds(), window, delta)); + err = noErr; } - break; } + break; + } return err; } @@ -893,8 +899,8 @@ OSStatus GHOST_SystemCarbon::handleMouseEvent(EventRef event) OSStatus GHOST_SystemCarbon::handleKeyEvent(EventRef event) { - OSStatus err = eventNotHandledErr; - GHOST_IWindow* window = m_windowManager->getActiveWindow(); + OSStatus err = eventNotHandledErr; + GHOST_IWindow *window = m_windowManager->getActiveWindow(); UInt32 kind = ::GetEventKind(event); UInt32 modifiers; UInt32 rawCode; @@ -919,35 +925,37 @@ OSStatus GHOST_SystemCarbon::handleKeyEvent(EventRef event) ::GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &ascii); key = convertKey(rawCode); - ascii= convertRomanToLatin(ascii); + ascii = convertRomanToLatin(ascii); - // if (key!=GHOST_kKeyUnknown) { - GHOST_TEventType type; - if (kind == kEventRawKeyDown) { - type = GHOST_kEventKeyDown; - } else if (kind == kEventRawKeyRepeat) { - type = GHOST_kEventKeyDown; /* XXX, fixme */ - } else { - type = GHOST_kEventKeyUp; - } - pushEvent( new GHOST_EventKey( getMilliSeconds(), type, window, key, ascii, NULL) ); + // if (key!=GHOST_kKeyUnknown) { + GHOST_TEventType type; + if (kind == kEventRawKeyDown) { + type = GHOST_kEventKeyDown; + } + else if (kind == kEventRawKeyRepeat) { + type = GHOST_kEventKeyDown; /* XXX, fixme */ + } + else { + type = GHOST_kEventKeyUp; + } + pushEvent(new GHOST_EventKey(getMilliSeconds(), type, window, key, ascii, NULL) ); // } break; case kEventRawKeyModifiersChanged: - /* ugh */ + /* ugh */ ::GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); if ((modifiers & shiftKey) != (m_modifierMask & shiftKey)) { - pushEvent( new GHOST_EventKey(getMilliSeconds(), (modifiers & shiftKey)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftShift) ); + pushEvent(new GHOST_EventKey(getMilliSeconds(), (modifiers & shiftKey) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, GHOST_kKeyLeftShift) ); } if ((modifiers & controlKey) != (m_modifierMask & controlKey)) { - pushEvent( new GHOST_EventKey(getMilliSeconds(), (modifiers & controlKey)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftControl) ); + pushEvent(new GHOST_EventKey(getMilliSeconds(), (modifiers & controlKey) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, GHOST_kKeyLeftControl) ); } if ((modifiers & optionKey) != (m_modifierMask & optionKey)) { - pushEvent( new GHOST_EventKey(getMilliSeconds(), (modifiers & optionKey)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftAlt) ); + pushEvent(new GHOST_EventKey(getMilliSeconds(), (modifiers & optionKey) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, GHOST_kKeyLeftAlt) ); } if ((modifiers & cmdKey) != (m_modifierMask & cmdKey)) { - pushEvent( new GHOST_EventKey(getMilliSeconds(), (modifiers & cmdKey)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyOS) ); + pushEvent(new GHOST_EventKey(getMilliSeconds(), (modifiers & cmdKey) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, GHOST_kKeyOS) ); } m_modifierMask = modifiers; @@ -964,17 +972,17 @@ OSStatus GHOST_SystemCarbon::handleKeyEvent(EventRef event) bool GHOST_SystemCarbon::handleMouseDown(EventRef event) { - WindowPtr window; - short part; - BitMap screenBits; - bool handled = true; - GHOST_WindowCarbon* ghostWindow; - Point mousePos = {0 , 0}; + WindowPtr window; + short part; + BitMap screenBits; + bool handled = true; + GHOST_WindowCarbon *ghostWindow; + Point mousePos = {0, 0}; ::GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &mousePos); part = ::FindWindow(mousePos, &window); - ghostWindow = (GHOST_WindowCarbon*) ::GetWRefCon(window); + ghostWindow = (GHOST_WindowCarbon *) ::GetWRefCon(window); switch (part) { case inMenuBar: @@ -995,7 +1003,7 @@ bool GHOST_SystemCarbon::handleMouseDown(EventRef event) ::DragWindow(window, mousePos, &GetQDGlobalsScreenBits(&screenBits)->bounds); m_ignoreWindowSizedMessages = false; - pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowMove, ghostWindow) ); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowMove, ghostWindow) ); break; @@ -1009,7 +1017,8 @@ bool GHOST_SystemCarbon::handleMouseDown(EventRef event) EventMouseButton button; ::GetEventParameter(event, kEventParamMouseButton, typeMouseButton, NULL, sizeof(button), NULL, &button); pushEvent(new GHOST_EventButton(getMilliSeconds(), GHOST_kEventButtonDown, ghostWindow, convertButton(button))); - } else { + } + else { handled = false; } break; @@ -1020,7 +1029,7 @@ bool GHOST_SystemCarbon::handleMouseDown(EventRef event) { // todo: add option-close, because itÿs in the HIG // if (event.modifiers & optionKey) { - // Close the clean documents, others will be confirmed one by one. + // Close the clean documents, others will be confirmed one by one. //} // else { pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, ghostWindow)); @@ -1040,23 +1049,24 @@ bool GHOST_SystemCarbon::handleMouseDown(EventRef event) int macState; macState = ghostWindow->getMac_windowState(); - if ( macState== 0) + if (macState == 0) ::ZoomWindow(window, part, true); else - if (macState == 2) { // always ok - ::ZoomWindow(window, part, true); - ghostWindow->setMac_windowState(1); - } else { // need to force size again + if (macState == 2) { // always ok + ::ZoomWindow(window, part, true); + ghostWindow->setMac_windowState(1); + } + else { // need to force size again // GHOST_TUns32 scr_x,scr_y; /*unused*/ - Rect outAvailableRect; + Rect outAvailableRect; - ghostWindow->setMac_windowState(2); - ::GetAvailableWindowPositioningBounds ( GetMainDevice(), &outAvailableRect); + ghostWindow->setMac_windowState(2); + ::GetAvailableWindowPositioningBounds(GetMainDevice(), &outAvailableRect); - //this->getMainDisplayDimensions(scr_x,scr_y); - ::SizeWindow (window, outAvailableRect.right-outAvailableRect.left,outAvailableRect.bottom-outAvailableRect.top-1,false); - ::MoveWindow (window, outAvailableRect.left, outAvailableRect.top,true); - } + //this->getMainDisplayDimensions(scr_x,scr_y); + ::SizeWindow(window, outAvailableRect.right - outAvailableRect.left, outAvailableRect.bottom - outAvailableRect.top - 1, false); + ::MoveWindow(window, outAvailableRect.left, outAvailableRect.top, true); + } } break; @@ -1072,11 +1082,11 @@ bool GHOST_SystemCarbon::handleMouseDown(EventRef event) bool GHOST_SystemCarbon::handleMenuCommand(GHOST_TInt32 menuResult) { - short menuID; - short menuItem; - UInt32 command; - bool handled; - OSErr err; + short menuID; + short menuItem; + UInt32 command; + bool handled; + OSErr err; menuID = HiWord(menuResult); menuItem = LoWord(menuResult); @@ -1088,7 +1098,7 @@ bool GHOST_SystemCarbon::handleMenuCommand(GHOST_TInt32 menuResult) if (err || command == 0) { } else { - switch(command) { + switch (command) { } } @@ -1097,11 +1107,11 @@ bool GHOST_SystemCarbon::handleMenuCommand(GHOST_TInt32 menuResult) } -OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData) +OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, EventRef event, void *userData) { - GHOST_SystemCarbon* sys = (GHOST_SystemCarbon*) userData; + GHOST_SystemCarbon *sys = (GHOST_SystemCarbon *) userData; OSStatus err = eventNotHandledErr; - GHOST_IWindow* window; + GHOST_IWindow *window; #ifdef WITH_INPUT_NDOF GHOST_TEventNDOFData data; #endif @@ -1124,7 +1134,7 @@ OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, Even case kEventClassKeyboard: err = sys->handleKeyEvent(event); break; - case kEventClassBlender : + case kEventClassBlender: #ifdef WITH_INPUT_NDOF window = sys->m_windowManager->getActiveWindow(); sys->m_ndofManager->GHOST_NDOFGetDatas(data); @@ -1134,7 +1144,7 @@ OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, Even { case 1: sys->m_eventManager->pushEvent(new GHOST_EventNDOF(sys->getMilliSeconds(), GHOST_kEventNDOFMotion, window, data)); - // printf("motion\n"); + // printf("motion\n"); break; case 2: sys->m_eventManager->pushEvent(new GHOST_EventNDOF(sys->getMilliSeconds(), GHOST_kEventNDOFButton, window, data)); @@ -1144,7 +1154,7 @@ OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, Even #endif err = noErr; break; - default : + default: ; break; } @@ -1152,48 +1162,49 @@ OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, Even return err; } -GHOST_TUns8* GHOST_SystemCarbon::getClipboard(bool selection) const +GHOST_TUns8 *GHOST_SystemCarbon::getClipboard(bool selection) const { PasteboardRef inPasteboard; PasteboardItemID itemID; CFDataRef flavorData; OSStatus err = noErr; - GHOST_TUns8 * temp_buff; + GHOST_TUns8 *temp_buff; CFRange range; OSStatus syncFlags; err = PasteboardCreate(kPasteboardClipboard, &inPasteboard); - if(err != noErr) { return NULL;} + if (err != noErr) { return NULL; } - syncFlags = PasteboardSynchronize( inPasteboard ); - /* as we always get in a new string, we can safely ignore sync flags if not an error*/ - if(syncFlags <0) { return NULL;} + syncFlags = PasteboardSynchronize(inPasteboard); + /* as we always get in a new string, we can safely ignore sync flags if not an error*/ + if (syncFlags < 0) { return NULL; } - err = PasteboardGetItemIdentifier( inPasteboard, 1, &itemID ); - if(err != noErr) { return NULL;} + err = PasteboardGetItemIdentifier(inPasteboard, 1, &itemID); + if (err != noErr) { return NULL; } - err = PasteboardCopyItemFlavorData( inPasteboard, itemID, CFSTR("public.utf8-plain-text"), &flavorData); - if(err != noErr) { return NULL;} + err = PasteboardCopyItemFlavorData(inPasteboard, itemID, CFSTR("public.utf8-plain-text"), &flavorData); + if (err != noErr) { return NULL; } range = CFRangeMake(0, CFDataGetLength(flavorData)); - temp_buff = (GHOST_TUns8*) malloc(range.length+1); + temp_buff = (GHOST_TUns8 *) malloc(range.length + 1); - CFDataGetBytes(flavorData, range, (UInt8*)temp_buff); + CFDataGetBytes(flavorData, range, (UInt8 *)temp_buff); temp_buff[range.length] = '\0'; - if(temp_buff) { + if (temp_buff) { return temp_buff; - } else { + } + else { return NULL; } } void GHOST_SystemCarbon::putClipboard(GHOST_TInt8 *buffer, bool selection) const { - if(selection) {return;} // for copying the selection, used on X11 + if (selection) {return; } // for copying the selection, used on X11 PasteboardRef inPasteboard; CFDataRef textData = NULL; @@ -1201,26 +1212,26 @@ void GHOST_SystemCarbon::putClipboard(GHOST_TInt8 *buffer, bool selection) const OSStatus syncFlags; err = PasteboardCreate(kPasteboardClipboard, &inPasteboard); - if(err != noErr) { return;} + if (err != noErr) { return; } - syncFlags = PasteboardSynchronize( inPasteboard ); + syncFlags = PasteboardSynchronize(inPasteboard); /* as we always put in a new string, we can safely ignore sync flags */ - if(syncFlags <0) { return;} + if (syncFlags < 0) { return; } - err = PasteboardClear( inPasteboard ); - if(err != noErr) { return;} + err = PasteboardClear(inPasteboard); + if (err != noErr) { return; } - textData = CFDataCreate(kCFAllocatorDefault, (UInt8*)buffer, strlen(buffer)); + textData = CFDataCreate(kCFAllocatorDefault, (UInt8 *)buffer, strlen(buffer)); if (textData) { - err = PasteboardPutItemFlavor( inPasteboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), textData, 0); - if(err != noErr) { - if(textData) { CFRelease(textData);} - return; - } + err = PasteboardPutItemFlavor(inPasteboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), textData, 0); + if (err != noErr) { + if (textData) { CFRelease(textData); } + return; + } } - if(textData) { + if (textData) { CFRelease(textData); } } diff --git a/intern/ghost/intern/GHOST_SystemPathsCarbon.cpp b/intern/ghost/intern/GHOST_SystemPathsCarbon.cpp index 02d45131f5a..f4be03ac2f3 100644 --- a/intern/ghost/intern/GHOST_SystemPathsCarbon.cpp +++ b/intern/ghost/intern/GHOST_SystemPathsCarbon.cpp @@ -44,27 +44,27 @@ GHOST_SystemPathsCarbon::~GHOST_SystemPathsCarbon() { } -const GHOST_TUns8* GHOST_SystemPathsCarbon::getSystemDir() const +const GHOST_TUns8 *GHOST_SystemPathsCarbon::getSystemDir() const { - return (GHOST_TUns8*)"/Library/Application Support"; + return (GHOST_TUns8 *)"/Library/Application Support"; } -const GHOST_TUns8* GHOST_SystemPathsCarbon::getUserDir() const +const GHOST_TUns8 *GHOST_SystemPathsCarbon::getUserDir() const { static char usrPath[256] = ""; - char* env = getenv("HOME"); + char *env = getenv("HOME"); if (env) { strncpy(usrPath, env, 245); - usrPath[245]=0; + usrPath[245] = 0; strcat(usrPath, "/Library/Application Support"); - return (GHOST_TUns8*) usrPath; + return (GHOST_TUns8 *) usrPath; } else return NULL; } -const GHOST_TUns8* GHOST_SystemPathsCarbon::getBinaryDir() const +const GHOST_TUns8 *GHOST_SystemPathsCarbon::getBinaryDir() const { CFURLRef bundleURL; CFStringRef pathStr; @@ -76,10 +76,10 @@ const GHOST_TUns8* GHOST_SystemPathsCarbon::getBinaryDir() const CFStringGetCString(pathStr, path, 255, kCFStringEncodingASCII); CFRelease(pathStr); CFRelease(bundleURL); - return (GHOST_TUns8*)path; + return (GHOST_TUns8 *)path; } -void GHOST_SystemPathsCarbon::addToSystemRecentFiles(const char* filename) const +void GHOST_SystemPathsCarbon::addToSystemRecentFiles(const char *filename) const { /* XXXXX TODO: Implementation for Carbon if possible */ diff --git a/intern/ghost/intern/GHOST_SystemPathsWin32.cpp b/intern/ghost/intern/GHOST_SystemPathsWin32.cpp index 0023ceb87f0..ecf10463079 100644 --- a/intern/ghost/intern/GHOST_SystemPathsWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemPathsWin32.cpp @@ -69,46 +69,46 @@ GHOST_SystemPathsWin32::~GHOST_SystemPathsWin32() { } -const GHOST_TUns8* GHOST_SystemPathsWin32::getSystemDir() const +const GHOST_TUns8 *GHOST_SystemPathsWin32::getSystemDir() const { - static char knownpath[MAX_PATH*3] = {0}; /* 1 utf-16 might translante into 3 utf-8. 2 utf-16 translates into 4 utf-8*/ + static char knownpath[MAX_PATH * 3] = {0}; /* 1 utf-16 might translante into 3 utf-8. 2 utf-16 translates into 4 utf-8*/ wchar_t knownpath_16[MAX_PATH]; HRESULT hResult = SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath_16); if (hResult == S_OK) { - conv_utf_16_to_8(knownpath_16,knownpath,MAX_PATH*3); - return (GHOST_TUns8*)knownpath; + conv_utf_16_to_8(knownpath_16, knownpath, MAX_PATH * 3); + return (GHOST_TUns8 *)knownpath; } return NULL; } -const GHOST_TUns8* GHOST_SystemPathsWin32::getUserDir() const +const GHOST_TUns8 *GHOST_SystemPathsWin32::getUserDir() const { - static char knownpath[MAX_PATH*3] = {0}; - wchar_t knownpath_16[MAX_PATH]; + static char knownpath[MAX_PATH * 3] = {0}; + wchar_t knownpath_16[MAX_PATH]; HRESULT hResult = SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath_16); if (hResult == S_OK) { - conv_utf_16_to_8(knownpath_16,knownpath,MAX_PATH*3); - return (GHOST_TUns8*)knownpath; + conv_utf_16_to_8(knownpath_16, knownpath, MAX_PATH * 3); + return (GHOST_TUns8 *)knownpath; } return NULL; } -const GHOST_TUns8* GHOST_SystemPathsWin32::getBinaryDir() const +const GHOST_TUns8 *GHOST_SystemPathsWin32::getBinaryDir() const { - static char fullname[MAX_PATH*3] = {0}; - wchar_t fullname_16[MAX_PATH*3]; + static char fullname[MAX_PATH * 3] = {0}; + wchar_t fullname_16[MAX_PATH * 3]; - if(GetModuleFileNameW(0, fullname_16, MAX_PATH)) { - conv_utf_16_to_8(fullname_16,fullname,MAX_PATH*3); - return (GHOST_TUns8*)fullname; + if (GetModuleFileNameW(0, fullname_16, MAX_PATH)) { + conv_utf_16_to_8(fullname_16, fullname, MAX_PATH * 3); + return (GHOST_TUns8 *)fullname; } return NULL; diff --git a/intern/ghost/intern/GHOST_SystemSDL.cpp b/intern/ghost/intern/GHOST_SystemSDL.cpp index a2b457cc262..237d4c0f787 100644 --- a/intern/ghost/intern/GHOST_SystemSDL.cpp +++ b/intern/ghost/intern/GHOST_SystemSDL.cpp @@ -39,18 +39,18 @@ GHOST_SystemSDL::GHOST_SystemSDL() : GHOST_System() { - if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) { - printf ("Error initializing SDL: %s\n", SDL_GetError()); + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) { + printf("Error initializing SDL: %s\n", SDL_GetError()); } /* SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); */ - /* SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); */ - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + /* SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); */ + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); } GHOST_SystemSDL::~GHOST_SystemSDL() @@ -71,9 +71,9 @@ GHOST_SystemSDL::createWindow(const STR_String& title, const GHOST_TEmbedderWindowID parentWindow ) { - GHOST_WindowSDL *window= NULL; + GHOST_WindowSDL *window = NULL; - window= new GHOST_WindowSDL (this, title, left, top, width, height, state, parentWindow, type, stereoVisual, 1); + window = new GHOST_WindowSDL(this, title, left, top, width, height, state, parentWindow, type, stereoVisual, 1); if (window) { if (GHOST_kWindowStateFullScreen == state) { @@ -93,7 +93,7 @@ GHOST_SystemSDL::createWindow(const STR_String& title, } else { delete window; - window= NULL; + window = NULL; } } return window; @@ -120,8 +120,8 @@ GHOST_SystemSDL::getMainDisplayDimensions(GHOST_TUns32& width, { SDL_DisplayMode mode; SDL_GetCurrentDisplayMode(0, &mode); /* note, always 0 display */ - width= mode.w; - height= mode.h; + width = mode.w; + height = mode.h; } GHOST_TUns8 @@ -133,7 +133,7 @@ GHOST_SystemSDL::getNumDisplays() const GHOST_TSuccess GHOST_SystemSDL::getModifierKeys(GHOST_ModifierKeys& keys) const { - SDL_Keymod mod= SDL_GetModState(); + SDL_Keymod mod = SDL_GetModState(); keys.set(GHOST_kModifierKeyLeftShift, (mod & KMOD_LSHIFT) != 0); keys.set(GHOST_kModifierKeyRightShift, (mod & KMOD_RSHIFT) != 0); @@ -141,12 +141,12 @@ GHOST_SystemSDL::getModifierKeys(GHOST_ModifierKeys& keys) const keys.set(GHOST_kModifierKeyRightControl, (mod & KMOD_RCTRL) != 0); keys.set(GHOST_kModifierKeyLeftAlt, (mod & KMOD_LALT) != 0); keys.set(GHOST_kModifierKeyRightAlt, (mod & KMOD_RALT) != 0); - keys.set(GHOST_kModifierKeyOS, (mod & (KMOD_LGUI|KMOD_RGUI)) != 0); + keys.set(GHOST_kModifierKeyOS, (mod & (KMOD_LGUI | KMOD_RGUI)) != 0); return GHOST_kSuccess; } -#define GXMAP(k,x,y) case x: k= y; break; +#define GXMAP(k, x, y) case x: k = y; break static GHOST_TKey convertSDLKey(SDL_Scancode key) @@ -154,97 +154,101 @@ convertSDLKey(SDL_Scancode key) GHOST_TKey type; if ((key >= SDL_SCANCODE_A) && (key <= SDL_SCANCODE_Z)) { - type= GHOST_TKey( key - SDL_SCANCODE_A + int(GHOST_kKeyA)); - } else if ((key >= SDL_SCANCODE_1) && (key <= SDL_SCANCODE_0)) { - type= (key == SDL_SCANCODE_0) ? GHOST_kKey0 : GHOST_TKey(key - SDL_SCANCODE_1 + int(GHOST_kKey1)); - } else if ((key >= SDL_SCANCODE_F1) && (key <= SDL_SCANCODE_F12)) { - type= GHOST_TKey(key - SDL_SCANCODE_F1 + int(GHOST_kKeyF1)); - } else if ((key >= SDL_SCANCODE_F13) && (key <= SDL_SCANCODE_F24)) { - type= GHOST_TKey(key - SDL_SCANCODE_F13 + int(GHOST_kKeyF13)); - } else { - switch(key) { + type = GHOST_TKey(key - SDL_SCANCODE_A + int(GHOST_kKeyA)); + } + else if ((key >= SDL_SCANCODE_1) && (key <= SDL_SCANCODE_0)) { + type = (key == SDL_SCANCODE_0) ? GHOST_kKey0 : GHOST_TKey(key - SDL_SCANCODE_1 + int(GHOST_kKey1)); + } + else if ((key >= SDL_SCANCODE_F1) && (key <= SDL_SCANCODE_F12)) { + type = GHOST_TKey(key - SDL_SCANCODE_F1 + int(GHOST_kKeyF1)); + } + else if ((key >= SDL_SCANCODE_F13) && (key <= SDL_SCANCODE_F24)) { + type = GHOST_TKey(key - SDL_SCANCODE_F13 + int(GHOST_kKeyF13)); + } + else { + switch (key) { /* TODO SDL_SCANCODE_NONUSBACKSLASH */ - GXMAP(type,SDL_SCANCODE_BACKSPACE, GHOST_kKeyBackSpace); - GXMAP(type,SDL_SCANCODE_TAB, GHOST_kKeyTab); - GXMAP(type,SDL_SCANCODE_RETURN, GHOST_kKeyEnter); - GXMAP(type,SDL_SCANCODE_ESCAPE, GHOST_kKeyEsc); - GXMAP(type,SDL_SCANCODE_SPACE, GHOST_kKeySpace); + GXMAP(type, SDL_SCANCODE_BACKSPACE, GHOST_kKeyBackSpace); + GXMAP(type, SDL_SCANCODE_TAB, GHOST_kKeyTab); + GXMAP(type, SDL_SCANCODE_RETURN, GHOST_kKeyEnter); + GXMAP(type, SDL_SCANCODE_ESCAPE, GHOST_kKeyEsc); + GXMAP(type, SDL_SCANCODE_SPACE, GHOST_kKeySpace); - GXMAP(type,SDL_SCANCODE_SEMICOLON, GHOST_kKeySemicolon); - GXMAP(type,SDL_SCANCODE_PERIOD, GHOST_kKeyPeriod); - GXMAP(type,SDL_SCANCODE_COMMA, GHOST_kKeyComma); - GXMAP(type,SDL_SCANCODE_APOSTROPHE, GHOST_kKeyQuote); - GXMAP(type,SDL_SCANCODE_GRAVE, GHOST_kKeyAccentGrave); - GXMAP(type,SDL_SCANCODE_MINUS, GHOST_kKeyMinus); - GXMAP(type,SDL_SCANCODE_EQUALS, GHOST_kKeyEqual); + GXMAP(type, SDL_SCANCODE_SEMICOLON, GHOST_kKeySemicolon); + GXMAP(type, SDL_SCANCODE_PERIOD, GHOST_kKeyPeriod); + GXMAP(type, SDL_SCANCODE_COMMA, GHOST_kKeyComma); + GXMAP(type, SDL_SCANCODE_APOSTROPHE, GHOST_kKeyQuote); + GXMAP(type, SDL_SCANCODE_GRAVE, GHOST_kKeyAccentGrave); + GXMAP(type, SDL_SCANCODE_MINUS, GHOST_kKeyMinus); + GXMAP(type, SDL_SCANCODE_EQUALS, GHOST_kKeyEqual); - GXMAP(type,SDL_SCANCODE_SLASH, GHOST_kKeySlash); - GXMAP(type,SDL_SCANCODE_BACKSLASH, GHOST_kKeyBackslash); - GXMAP(type,SDL_SCANCODE_KP_EQUALS, GHOST_kKeyEqual); - GXMAP(type,SDL_SCANCODE_LEFTBRACKET, GHOST_kKeyLeftBracket); - GXMAP(type,SDL_SCANCODE_RIGHTBRACKET, GHOST_kKeyRightBracket); - GXMAP(type,SDL_SCANCODE_PAUSE, GHOST_kKeyPause); + GXMAP(type, SDL_SCANCODE_SLASH, GHOST_kKeySlash); + GXMAP(type, SDL_SCANCODE_BACKSLASH, GHOST_kKeyBackslash); + GXMAP(type, SDL_SCANCODE_KP_EQUALS, GHOST_kKeyEqual); + GXMAP(type, SDL_SCANCODE_LEFTBRACKET, GHOST_kKeyLeftBracket); + GXMAP(type, SDL_SCANCODE_RIGHTBRACKET, GHOST_kKeyRightBracket); + GXMAP(type, SDL_SCANCODE_PAUSE, GHOST_kKeyPause); - GXMAP(type,SDL_SCANCODE_LSHIFT, GHOST_kKeyLeftShift); - GXMAP(type,SDL_SCANCODE_RSHIFT, GHOST_kKeyRightShift); - GXMAP(type,SDL_SCANCODE_LCTRL, GHOST_kKeyLeftControl); - GXMAP(type,SDL_SCANCODE_RCTRL, GHOST_kKeyRightControl); - GXMAP(type,SDL_SCANCODE_LALT, GHOST_kKeyLeftAlt); - GXMAP(type,SDL_SCANCODE_RALT, GHOST_kKeyRightAlt); - GXMAP(type,SDL_SCANCODE_LGUI, GHOST_kKeyOS); - GXMAP(type,SDL_SCANCODE_RGUI, GHOST_kKeyOS); + GXMAP(type, SDL_SCANCODE_LSHIFT, GHOST_kKeyLeftShift); + GXMAP(type, SDL_SCANCODE_RSHIFT, GHOST_kKeyRightShift); + GXMAP(type, SDL_SCANCODE_LCTRL, GHOST_kKeyLeftControl); + GXMAP(type, SDL_SCANCODE_RCTRL, GHOST_kKeyRightControl); + GXMAP(type, SDL_SCANCODE_LALT, GHOST_kKeyLeftAlt); + GXMAP(type, SDL_SCANCODE_RALT, GHOST_kKeyRightAlt); + GXMAP(type, SDL_SCANCODE_LGUI, GHOST_kKeyOS); + GXMAP(type, SDL_SCANCODE_RGUI, GHOST_kKeyOS); - GXMAP(type,SDL_SCANCODE_INSERT, GHOST_kKeyInsert); - GXMAP(type,SDL_SCANCODE_DELETE, GHOST_kKeyDelete); - GXMAP(type,SDL_SCANCODE_HOME, GHOST_kKeyHome); - GXMAP(type,SDL_SCANCODE_END, GHOST_kKeyEnd); - GXMAP(type,SDL_SCANCODE_PAGEUP, GHOST_kKeyUpPage); - GXMAP(type,SDL_SCANCODE_PAGEDOWN, GHOST_kKeyDownPage); + GXMAP(type, SDL_SCANCODE_INSERT, GHOST_kKeyInsert); + GXMAP(type, SDL_SCANCODE_DELETE, GHOST_kKeyDelete); + GXMAP(type, SDL_SCANCODE_HOME, GHOST_kKeyHome); + GXMAP(type, SDL_SCANCODE_END, GHOST_kKeyEnd); + GXMAP(type, SDL_SCANCODE_PAGEUP, GHOST_kKeyUpPage); + GXMAP(type, SDL_SCANCODE_PAGEDOWN, GHOST_kKeyDownPage); - GXMAP(type,SDL_SCANCODE_LEFT, GHOST_kKeyLeftArrow); - GXMAP(type,SDL_SCANCODE_RIGHT, GHOST_kKeyRightArrow); - GXMAP(type,SDL_SCANCODE_UP, GHOST_kKeyUpArrow); - GXMAP(type,SDL_SCANCODE_DOWN, GHOST_kKeyDownArrow); + GXMAP(type, SDL_SCANCODE_LEFT, GHOST_kKeyLeftArrow); + GXMAP(type, SDL_SCANCODE_RIGHT, GHOST_kKeyRightArrow); + GXMAP(type, SDL_SCANCODE_UP, GHOST_kKeyUpArrow); + GXMAP(type, SDL_SCANCODE_DOWN, GHOST_kKeyDownArrow); - GXMAP(type,SDL_SCANCODE_CAPSLOCK, GHOST_kKeyCapsLock); - GXMAP(type,SDL_SCANCODE_SCROLLLOCK, GHOST_kKeyScrollLock); - GXMAP(type,SDL_SCANCODE_NUMLOCKCLEAR, GHOST_kKeyNumLock); - GXMAP(type,SDL_SCANCODE_PRINTSCREEN, GHOST_kKeyPrintScreen); + GXMAP(type, SDL_SCANCODE_CAPSLOCK, GHOST_kKeyCapsLock); + GXMAP(type, SDL_SCANCODE_SCROLLLOCK, GHOST_kKeyScrollLock); + GXMAP(type, SDL_SCANCODE_NUMLOCKCLEAR, GHOST_kKeyNumLock); + GXMAP(type, SDL_SCANCODE_PRINTSCREEN, GHOST_kKeyPrintScreen); - /* keypad events */ + /* keypad events */ - /* note, sdl defines a bunch of kp defines I never saw before like - * SDL_SCANCODE_KP_PERCENT, SDL_SCANCODE_KP_XOR - campbell */ - GXMAP(type,SDL_SCANCODE_KP_0, GHOST_kKeyNumpad0); - GXMAP(type,SDL_SCANCODE_KP_1, GHOST_kKeyNumpad1); - GXMAP(type,SDL_SCANCODE_KP_2, GHOST_kKeyNumpad2); - GXMAP(type,SDL_SCANCODE_KP_3, GHOST_kKeyNumpad3); - GXMAP(type,SDL_SCANCODE_KP_4, GHOST_kKeyNumpad4); - GXMAP(type,SDL_SCANCODE_KP_5, GHOST_kKeyNumpad5); - GXMAP(type,SDL_SCANCODE_KP_6, GHOST_kKeyNumpad6); - GXMAP(type,SDL_SCANCODE_KP_7, GHOST_kKeyNumpad7); - GXMAP(type,SDL_SCANCODE_KP_8, GHOST_kKeyNumpad8); - GXMAP(type,SDL_SCANCODE_KP_9, GHOST_kKeyNumpad9); - GXMAP(type,SDL_SCANCODE_KP_PERIOD, GHOST_kKeyNumpadPeriod); + /* note, sdl defines a bunch of kp defines I never saw before like + * SDL_SCANCODE_KP_PERCENT, SDL_SCANCODE_KP_XOR - campbell */ + GXMAP(type, SDL_SCANCODE_KP_0, GHOST_kKeyNumpad0); + GXMAP(type, SDL_SCANCODE_KP_1, GHOST_kKeyNumpad1); + GXMAP(type, SDL_SCANCODE_KP_2, GHOST_kKeyNumpad2); + GXMAP(type, SDL_SCANCODE_KP_3, GHOST_kKeyNumpad3); + GXMAP(type, SDL_SCANCODE_KP_4, GHOST_kKeyNumpad4); + GXMAP(type, SDL_SCANCODE_KP_5, GHOST_kKeyNumpad5); + GXMAP(type, SDL_SCANCODE_KP_6, GHOST_kKeyNumpad6); + GXMAP(type, SDL_SCANCODE_KP_7, GHOST_kKeyNumpad7); + GXMAP(type, SDL_SCANCODE_KP_8, GHOST_kKeyNumpad8); + GXMAP(type, SDL_SCANCODE_KP_9, GHOST_kKeyNumpad9); + GXMAP(type, SDL_SCANCODE_KP_PERIOD, GHOST_kKeyNumpadPeriod); - GXMAP(type,SDL_SCANCODE_KP_ENTER, GHOST_kKeyNumpadEnter); - GXMAP(type,SDL_SCANCODE_KP_PLUS, GHOST_kKeyNumpadPlus); - GXMAP(type,SDL_SCANCODE_KP_MINUS, GHOST_kKeyNumpadMinus); - GXMAP(type,SDL_SCANCODE_KP_MULTIPLY, GHOST_kKeyNumpadAsterisk); - GXMAP(type,SDL_SCANCODE_KP_DIVIDE, GHOST_kKeyNumpadSlash); + GXMAP(type, SDL_SCANCODE_KP_ENTER, GHOST_kKeyNumpadEnter); + GXMAP(type, SDL_SCANCODE_KP_PLUS, GHOST_kKeyNumpadPlus); + GXMAP(type, SDL_SCANCODE_KP_MINUS, GHOST_kKeyNumpadMinus); + GXMAP(type, SDL_SCANCODE_KP_MULTIPLY, GHOST_kKeyNumpadAsterisk); + GXMAP(type, SDL_SCANCODE_KP_DIVIDE, GHOST_kKeyNumpadSlash); - /* Media keys in some keyboards and laptops with XFree86/Xorg */ - GXMAP(type,SDL_SCANCODE_AUDIOPLAY, GHOST_kKeyMediaPlay); - GXMAP(type,SDL_SCANCODE_AUDIOSTOP, GHOST_kKeyMediaStop); - GXMAP(type,SDL_SCANCODE_AUDIOPREV, GHOST_kKeyMediaFirst); - // GXMAP(type,XF86XK_AudioRewind, GHOST_kKeyMediaFirst); - GXMAP(type,SDL_SCANCODE_AUDIONEXT, GHOST_kKeyMediaLast); + /* Media keys in some keyboards and laptops with XFree86/Xorg */ + GXMAP(type, SDL_SCANCODE_AUDIOPLAY, GHOST_kKeyMediaPlay); + GXMAP(type, SDL_SCANCODE_AUDIOSTOP, GHOST_kKeyMediaStop); + GXMAP(type, SDL_SCANCODE_AUDIOPREV, GHOST_kKeyMediaFirst); + // GXMAP(type,XF86XK_AudioRewind, GHOST_kKeyMediaFirst); + GXMAP(type, SDL_SCANCODE_AUDIONEXT, GHOST_kKeyMediaLast); - default: - printf("Unknown\n"); - type= GHOST_kKeyUnknown; - break; + default: + printf("Unknown\n"); + type = GHOST_kKeyUnknown; + break; } } @@ -256,64 +260,64 @@ convertSDLKey(SDL_Scancode key) void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) { - GHOST_Event * g_event= NULL; + GHOST_Event *g_event = NULL; - switch(sdl_event->type) { - case SDL_WINDOWEVENT: + switch (sdl_event->type) { + case SDL_WINDOWEVENT: { - SDL_WindowEvent &sdl_sub_evt= sdl_event->window; - GHOST_WindowSDL *window= findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + SDL_WindowEvent &sdl_sub_evt = sdl_event->window; + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); //assert(window != NULL); // can be NULL on close window. switch (sdl_sub_evt.event) { - case SDL_WINDOWEVENT_EXPOSED: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window); - break; - case SDL_WINDOWEVENT_RESIZED: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window); - break; - case SDL_WINDOWEVENT_MOVED: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowMove, window); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window); - break; - case SDL_WINDOWEVENT_CLOSE: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window); - break; + case SDL_WINDOWEVENT_EXPOSED: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window); + break; + case SDL_WINDOWEVENT_RESIZED: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window); + break; + case SDL_WINDOWEVENT_MOVED: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowMove, window); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window); + break; + case SDL_WINDOWEVENT_CLOSE: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window); + break; } } - break; - case SDL_QUIT: - g_event= new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL); - break; + break; + case SDL_QUIT: + g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL); + break; - case SDL_MOUSEMOTION: + case SDL_MOUSEMOTION: { - SDL_MouseMotionEvent &sdl_sub_evt= sdl_event->motion; - SDL_Window *sdl_win= SDL_GetWindowFromID(sdl_sub_evt.windowID); - GHOST_WindowSDL *window= findGhostWindow(sdl_win); + SDL_MouseMotionEvent &sdl_sub_evt = sdl_event->motion; + SDL_Window *sdl_win = SDL_GetWindowFromID(sdl_sub_evt.windowID); + GHOST_WindowSDL *window = findGhostWindow(sdl_win); assert(window != NULL); int x_win, y_win; SDL_GetWindowPosition(sdl_win, &x_win, &y_win); - GHOST_TInt32 x_root= sdl_sub_evt.x + x_win; - GHOST_TInt32 y_root= sdl_sub_evt.y + y_win; + GHOST_TInt32 x_root = sdl_sub_evt.x + x_win; + GHOST_TInt32 y_root = sdl_sub_evt.y + y_win; #if 0 - if(window->getCursorGrabMode() != GHOST_kGrabDisable && window->getCursorGrabMode() != GHOST_kGrabNormal) + if (window->getCursorGrabMode() != GHOST_kGrabDisable && window->getCursorGrabMode() != GHOST_kGrabNormal) { - GHOST_TInt32 x_new= x_root; - GHOST_TInt32 y_new= y_root; + GHOST_TInt32 x_new = x_root; + GHOST_TInt32 y_new = y_root; GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; /* fallback to window bounds */ - if(window->getCursorGrabBounds(bounds)==GHOST_kFailure) + if (window->getCursorGrabBounds(bounds) == GHOST_kFailure) window->getClientBounds(bounds); /* could also clamp to screen bounds @@ -322,14 +326,15 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) window->getCursorGrabAccum(x_accum, y_accum); // cant use setCursorPosition because the mouse may have no focus! - if(x_new != x_root || y_new != y_root) { - if (1 ) { //xme.time > m_last_warp) { + if (x_new != x_root || y_new != y_root) { + if (1) { //xme.time > m_last_warp) { /* when wrapping we don't need to add an event because the * setCursorPosition call will cause a new event after */ SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win); /* wrap */ window->setCursorGrabAccum(x_accum + (x_root - x_new), y_accum + (y_root - y_new)); // m_last_warp= lastEventTime(xme.time); - } else { + } + else { // setCursorPosition(x_new, y_new); /* wrap but don't accumulate */ SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win); } @@ -343,117 +348,117 @@ GHOST_SystemSDL::processEvent(SDL_Event *sdl_event) else #endif { - g_event= new GHOST_EventCursor(getMilliSeconds(), GHOST_kEventCursorMove, window, x_root, y_root); + g_event = new GHOST_EventCursor(getMilliSeconds(), GHOST_kEventCursorMove, window, x_root, y_root); } break; } - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: { - SDL_MouseButtonEvent &sdl_sub_evt= sdl_event->button; - GHOST_TButtonMask gbmask= GHOST_kButtonMaskLeft; - GHOST_TEventType type= (sdl_sub_evt.state==SDL_PRESSED) ? GHOST_kEventButtonDown : GHOST_kEventButtonUp; + SDL_MouseButtonEvent &sdl_sub_evt = sdl_event->button; + GHOST_TButtonMask gbmask = GHOST_kButtonMaskLeft; + GHOST_TEventType type = (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventButtonDown : GHOST_kEventButtonUp; - GHOST_WindowSDL *window= findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); assert(window != NULL); /* process rest of normal mouse buttons */ - if(sdl_sub_evt.button == SDL_BUTTON_LEFT) - gbmask= GHOST_kButtonMaskLeft; - else if(sdl_sub_evt.button == SDL_BUTTON_MIDDLE) - gbmask= GHOST_kButtonMaskMiddle; - else if(sdl_sub_evt.button == SDL_BUTTON_RIGHT) - gbmask= GHOST_kButtonMaskRight; + if (sdl_sub_evt.button == SDL_BUTTON_LEFT) + gbmask = GHOST_kButtonMaskLeft; + else if (sdl_sub_evt.button == SDL_BUTTON_MIDDLE) + gbmask = GHOST_kButtonMaskMiddle; + else if (sdl_sub_evt.button == SDL_BUTTON_RIGHT) + gbmask = GHOST_kButtonMaskRight; /* these buttons are untested! */ - else if(sdl_sub_evt.button == SDL_BUTTON_X1) - gbmask= GHOST_kButtonMaskButton4; - else if(sdl_sub_evt.button == SDL_BUTTON_X2) - gbmask= GHOST_kButtonMaskButton5; + else if (sdl_sub_evt.button == SDL_BUTTON_X1) + gbmask = GHOST_kButtonMaskButton4; + else if (sdl_sub_evt.button == SDL_BUTTON_X2) + gbmask = GHOST_kButtonMaskButton5; else break; - g_event= new GHOST_EventButton(getMilliSeconds(), type, window, gbmask); + g_event = new GHOST_EventButton(getMilliSeconds(), type, window, gbmask); break; } - case SDL_MOUSEWHEEL: + case SDL_MOUSEWHEEL: { - SDL_MouseWheelEvent &sdl_sub_evt= sdl_event->wheel; - GHOST_WindowSDL *window= findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + SDL_MouseWheelEvent &sdl_sub_evt = sdl_event->wheel; + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); assert(window != NULL); - g_event= new GHOST_EventWheel(getMilliSeconds(), window, sdl_sub_evt.y); + g_event = new GHOST_EventWheel(getMilliSeconds(), window, sdl_sub_evt.y); } - break; - case SDL_KEYDOWN: - case SDL_KEYUP: + break; + case SDL_KEYDOWN: + case SDL_KEYUP: { - SDL_KeyboardEvent &sdl_sub_evt= sdl_event->key; - SDL_Keycode sym= sdl_sub_evt.keysym.sym; - GHOST_TEventType type= (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp; + SDL_KeyboardEvent &sdl_sub_evt = sdl_event->key; + SDL_Keycode sym = sdl_sub_evt.keysym.sym; + GHOST_TEventType type = (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp; - GHOST_WindowSDL *window= findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); + GHOST_WindowSDL *window = findGhostWindow(SDL_GetWindowFromID(sdl_sub_evt.windowID)); assert(window != NULL); - GHOST_TKey gkey= convertSDLKey(sdl_sub_evt.keysym.scancode); + GHOST_TKey gkey = convertSDLKey(sdl_sub_evt.keysym.scancode); /* note, the sdl_sub_evt.keysym.sym is truncated, for unicode support ghost has to be modified */ /* printf("%d\n", sym); */ - if(sym > 127) { - switch(sym) { - case SDLK_KP_DIVIDE: sym= '/'; break; - case SDLK_KP_MULTIPLY: sym= '*'; break; - case SDLK_KP_MINUS: sym= '-'; break; - case SDLK_KP_PLUS: sym= '+'; break; - case SDLK_KP_1: sym= '1'; break; - case SDLK_KP_2: sym= '2'; break; - case SDLK_KP_3: sym= '3'; break; - case SDLK_KP_4: sym= '4'; break; - case SDLK_KP_5: sym= '5'; break; - case SDLK_KP_6: sym= '6'; break; - case SDLK_KP_7: sym= '7'; break; - case SDLK_KP_8: sym= '8'; break; - case SDLK_KP_9: sym= '9'; break; - case SDLK_KP_0: sym= '0'; break; - case SDLK_KP_PERIOD: sym= '.'; break; - default: sym= 0; break; + if (sym > 127) { + switch (sym) { + case SDLK_KP_DIVIDE: sym = '/'; break; + case SDLK_KP_MULTIPLY: sym = '*'; break; + case SDLK_KP_MINUS: sym = '-'; break; + case SDLK_KP_PLUS: sym = '+'; break; + case SDLK_KP_1: sym = '1'; break; + case SDLK_KP_2: sym = '2'; break; + case SDLK_KP_3: sym = '3'; break; + case SDLK_KP_4: sym = '4'; break; + case SDLK_KP_5: sym = '5'; break; + case SDLK_KP_6: sym = '6'; break; + case SDLK_KP_7: sym = '7'; break; + case SDLK_KP_8: sym = '8'; break; + case SDLK_KP_9: sym = '9'; break; + case SDLK_KP_0: sym = '0'; break; + case SDLK_KP_PERIOD: sym = '.'; break; + default: sym = 0; break; } } else { - if(sdl_sub_evt.keysym.mod & (KMOD_LSHIFT|KMOD_RSHIFT)) { + if (sdl_sub_evt.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) { /* lame US keyboard assumptions */ - if(sym >= 'a' && sym <= ('a' + 32)) { + if (sym >= 'a' && sym <= ('a' + 32)) { sym -= 32; } else { - switch(sym) { - case '`': sym= '~'; break; - case '1': sym= '!'; break; - case '2': sym= '@'; break; - case '3': sym= '#'; break; - case '4': sym= '$'; break; - case '5': sym= '%'; break; - case '6': sym= '^'; break; - case '7': sym= '&'; break; - case '8': sym= '*'; break; - case '9': sym= '('; break; - case '0': sym= ')'; break; - case '-': sym= '_'; break; - case '=': sym= '+'; break; - case '[': sym= '{'; break; - case ']': sym= '}'; break; - case '\\': sym= '|'; break; - case ';': sym= ':'; break; - case '\'': sym= '"'; break; - case ',': sym= '<'; break; - case '.': sym= '>'; break; - case '/': sym= '?'; break; + switch (sym) { + case '`': sym = '~'; break; + case '1': sym = '!'; break; + case '2': sym = '@'; break; + case '3': sym = '#'; break; + case '4': sym = '$'; break; + case '5': sym = '%'; break; + case '6': sym = '^'; break; + case '7': sym = '&'; break; + case '8': sym = '*'; break; + case '9': sym = '('; break; + case '0': sym = ')'; break; + case '-': sym = '_'; break; + case '=': sym = '+'; break; + case '[': sym = '{'; break; + case ']': sym = '}'; break; + case '\\': sym = '|'; break; + case ';': sym = ':'; break; + case '\'': sym = '"'; break; + case ',': sym = '<'; break; + case '.': sym = '>'; break; + case '/': sym = '?'; break; default: break; } } } } - g_event= new GHOST_EventKey(getMilliSeconds(), type, window, gkey, sym, NULL); + g_event = new GHOST_EventKey(getMilliSeconds(), type, window, gkey, sym, NULL); } - break; + break; } if (g_event) { @@ -466,13 +471,13 @@ GHOST_SystemSDL::getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const { int x_win, y_win; - SDL_Window *win= SDL_GetMouseFocus(); + SDL_Window *win = SDL_GetMouseFocus(); SDL_GetWindowPosition(win, &x_win, &y_win); int xi, yi; SDL_GetMouseState(&xi, &yi); - x= xi + x_win; - y= yi + x_win; + x = xi + x_win; + y = yi + x_win; return GHOST_kSuccess; } @@ -482,7 +487,7 @@ GHOST_SystemSDL::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { int x_win, y_win; - SDL_Window *win= SDL_GetMouseFocus(); + SDL_Window *win = SDL_GetMouseFocus(); SDL_GetWindowPosition(win, &x_win, &y_win); SDL_WarpMouseInWindow(win, x - x_win, y - y_win); @@ -492,24 +497,24 @@ GHOST_SystemSDL::setCursorPosition(GHOST_TInt32 x, bool GHOST_SystemSDL::generateWindowExposeEvents() { - std::vector::iterator w_start= m_dirty_windows.begin(); - std::vector::const_iterator w_end= m_dirty_windows.end(); - bool anyProcessed= false; + std::vector::iterator w_start = m_dirty_windows.begin(); + std::vector::const_iterator w_end = m_dirty_windows.end(); + bool anyProcessed = false; - for (;w_start != w_end; ++w_start) { - GHOST_Event * g_event= new - GHOST_Event( - getMilliSeconds(), - GHOST_kEventWindowUpdate, - *w_start - ); + for (; w_start != w_end; ++w_start) { + GHOST_Event *g_event = new + GHOST_Event( + getMilliSeconds(), + GHOST_kEventWindowUpdate, + *w_start + ); (*w_start)->validate(); if (g_event) { printf("Expose events pushed\n"); pushEvent(g_event); - anyProcessed= true; + anyProcessed = true; } } @@ -524,21 +529,22 @@ GHOST_SystemSDL::processEvents(bool waitForEvent) // Get all the current events -- translate them into // ghost events and call base class pushEvent() method. - bool anyProcessed= false; + bool anyProcessed = false; do { - GHOST_TimerManager* timerMgr= getTimerManager(); + GHOST_TimerManager *timerMgr = getTimerManager(); if (waitForEvent && m_dirty_windows.empty() && !SDL_HasEvents(SDL_FIRSTEVENT, SDL_LASTEVENT)) { - GHOST_TUns64 next= timerMgr->nextFireTime(); + GHOST_TUns64 next = timerMgr->nextFireTime(); - if (next==GHOST_kFireTimeNever) { + if (next == GHOST_kFireTimeNever) { SDL_WaitEventTimeout(NULL, -1); //SleepTillEvent(m_display, -1); - } else { - GHOST_TInt64 maxSleep= next - getMilliSeconds(); + } + else { + GHOST_TInt64 maxSleep = next - getMilliSeconds(); - if(maxSleep >= 0) { + if (maxSleep >= 0) { SDL_WaitEventTimeout(NULL, next - getMilliSeconds()); // SleepTillEvent(m_display, next - getMilliSeconds()); // X11 } @@ -546,17 +552,17 @@ GHOST_SystemSDL::processEvents(bool waitForEvent) } if (timerMgr->fireTimers(getMilliSeconds())) { - anyProcessed= true; + anyProcessed = true; } SDL_Event sdl_event; while (SDL_PollEvent(&sdl_event)) { processEvent(&sdl_event); - anyProcessed= true; + anyProcessed = true; } if (generateWindowExposeEvents()) { - anyProcessed= true; + anyProcessed = true; } } while (waitForEvent && !anyProcessed); @@ -574,13 +580,13 @@ GHOST_SystemSDL::findGhostWindow(SDL_Window *sdl_win) // We should always check the window manager's list of windows // and only process events on these windows. - std::vector & win_vec= m_windowManager->getWindows(); + std::vector & win_vec = m_windowManager->getWindows(); - std::vector::iterator win_it= win_vec.begin(); - std::vector::const_iterator win_end= win_vec.end(); + std::vector::iterator win_it = win_vec.begin(); + std::vector::const_iterator win_end = win_vec.end(); for (; win_it != win_end; ++win_it) { - GHOST_WindowSDL * window= static_cast(*win_it); + GHOST_WindowSDL *window = static_cast(*win_it); if (window->getSDLWindow() == sdl_win) { return window; } @@ -600,7 +606,7 @@ GHOST_SystemSDL::addDirtyWindow(GHOST_WindowSDL *bad_wind) GHOST_TSuccess GHOST_SystemSDL::getButtons(GHOST_Buttons& buttons) const { - Uint8 state= SDL_GetMouseState(NULL, NULL); + Uint8 state = SDL_GetMouseState(NULL, NULL); buttons.set(GHOST_kButtonMaskLeft, (state & SDL_BUTTON_LMASK) != 0); buttons.set(GHOST_kButtonMaskMiddle, (state & SDL_BUTTON_MMASK) != 0); buttons.set(GHOST_kButtonMaskRight, (state & SDL_BUTTON_RMASK) != 0); diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 9f2728a581f..7a65c741532 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -115,16 +115,16 @@ #endif // VK_GR_LESS #ifndef VK_MEDIA_NEXT_TRACK -#define VK_MEDIA_NEXT_TRACK 0xB0 +#define VK_MEDIA_NEXT_TRACK 0xB0 #endif // VK_MEDIA_NEXT_TRACK #ifndef VK_MEDIA_PREV_TRACK -#define VK_MEDIA_PREV_TRACK 0xB1 +#define VK_MEDIA_PREV_TRACK 0xB1 #endif // VK_MEDIA_PREV_TRACK #ifndef VK_MEDIA_STOP -#define VK_MEDIA_STOP 0xB2 +#define VK_MEDIA_STOP 0xB2 #endif // VK_MEDIA_STOP #ifndef VK_MEDIA_PLAY_PAUSE -#define VK_MEDIA_PLAY_PAUSE 0xB3 +#define VK_MEDIA_PLAY_PAUSE 0xB3 #endif // VK_MEDIA_PLAY_PAUSE static void initRawInput() @@ -150,7 +150,7 @@ static void initRawInput() #endif if (RegisterRawInputDevices(devices, DEVICE_COUNT, sizeof(RAWINPUTDEVICE))) - ; // yay! + ; // yay! else printf("could not register for RawInput: %d\n", (int)GetLastError()); @@ -158,9 +158,9 @@ static void initRawInput() } GHOST_SystemWin32::GHOST_SystemWin32() -: m_hasPerformanceCounter(false), m_freq(0), m_start(0) + : m_hasPerformanceCounter(false), m_freq(0), m_start(0) { - m_displayManager = new GHOST_DisplayManagerWin32 (); + m_displayManager = new GHOST_DisplayManagerWin32(); GHOST_ASSERT(m_displayManager, "GHOST_SystemWin32::GHOST_SystemWin32(): m_displayManager==0\n"); m_displayManager->initialize(); @@ -195,12 +195,12 @@ GHOST_TUns64 GHOST_SystemWin32::getMilliSeconds() const // Retrieve current count __int64 count = 0; - ::QueryPerformanceCounter((LARGE_INTEGER*)&count); + ::QueryPerformanceCounter((LARGE_INTEGER *)&count); // Calculate the time passed since system initialization. - __int64 delta = 1000*(count-m_start); + __int64 delta = 1000 * (count - m_start); - GHOST_TUns64 t = (GHOST_TUns64)(delta/m_freq); + GHOST_TUns64 t = (GHOST_TUns64)(delta / m_freq); return t; } @@ -217,37 +217,37 @@ GHOST_TUns8 GHOST_SystemWin32::getNumDisplays() const void GHOST_SystemWin32::getMainDisplayDimensions(GHOST_TUns32& width, GHOST_TUns32& height) const { width = ::GetSystemMetrics(SM_CXSCREEN); - height= ::GetSystemMetrics(SM_CYSCREEN); + height = ::GetSystemMetrics(SM_CYSCREEN); } -GHOST_IWindow* GHOST_SystemWin32::createWindow( - const STR_String& title, - GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, - GHOST_TWindowState state, GHOST_TDrawingContextType type, - bool stereoVisual, const GHOST_TUns16 numOfAASamples, const GHOST_TEmbedderWindowID parentWindow ) +GHOST_IWindow *GHOST_SystemWin32::createWindow( + const STR_String& title, + GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 height, + GHOST_TWindowState state, GHOST_TDrawingContextType type, + bool stereoVisual, const GHOST_TUns16 numOfAASamples, const GHOST_TEmbedderWindowID parentWindow) { - GHOST_Window* window = 0; - window = new GHOST_WindowWin32 (this, title, left, top, width, height, state, type, stereoVisual, numOfAASamples, parentWindow); + GHOST_Window *window = 0; + window = new GHOST_WindowWin32(this, title, left, top, width, height, state, type, stereoVisual, numOfAASamples, parentWindow); if (window) { if (window->getValid()) { // Store the pointer to the window // if (state != GHOST_kWindowStateFullScreen) { - m_windowManager->addWindow(window); - m_windowManager->setActiveWindow(window); + m_windowManager->addWindow(window); + m_windowManager->setActiveWindow(window); // } } else { // Invalid parent window hwnd - if (((GHOST_WindowWin32*)window)->getNextWindow() == NULL) { + if (((GHOST_WindowWin32 *)window)->getNextWindow() == NULL) { delete window; window = 0; return window; } // An invalid window could be one that was used to test for AA - window = ((GHOST_WindowWin32*)window)->getNextWindow(); + window = ((GHOST_WindowWin32 *)window)->getNextWindow(); // If another window is found, let the wm know about that one, but not the old one if (window->getValid()) { @@ -270,7 +270,7 @@ bool GHOST_SystemWin32::processEvents(bool waitForEvent) bool anyProcessed = false; do { - GHOST_TimerManager* timerMgr = getTimerManager(); + GHOST_TimerManager *timerMgr = getTimerManager(); if (waitForEvent && !::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) { #if 1 @@ -281,7 +281,8 @@ bool GHOST_SystemWin32::processEvents(bool waitForEvent) if (next == GHOST_kFireTimeNever) { ::WaitMessage(); - } else if(maxSleep >= 0.0) { + } + else if (maxSleep >= 0.0) { ::SetTimer(NULL, 0, maxSleep, NULL); ::WaitMessage(); ::KillTimer(NULL, 0); @@ -307,7 +308,7 @@ bool GHOST_SystemWin32::processEvents(bool waitForEvent) GHOST_TSuccess GHOST_SystemWin32::getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const { POINT point; - if(::GetCursorPos(&point)){ + if (::GetCursorPos(&point)) { x = point.x; y = point.y; return GHOST_kSuccess; @@ -343,7 +344,7 @@ GHOST_TSuccess GHOST_SystemWin32::getModifierKeys(GHOST_ModifierKeys& keys) cons bool lwindown = HIBYTE(::GetKeyState(VK_LWIN)) != 0; bool rwindown = HIBYTE(::GetKeyState(VK_RWIN)) != 0; - if(lwindown || rwindown) + if (lwindown || rwindown) keys.set(GHOST_kModifierKeyOS, true); else keys.set(GHOST_kModifierKeyOS, false); @@ -376,20 +377,20 @@ GHOST_TSuccess GHOST_SystemWin32::init() /* Disable scaling on high DPI displays on Vista */ HMODULE - user32 = ::LoadLibraryA("user32.dll"); + user32 = ::LoadLibraryA("user32.dll"); typedef BOOL (WINAPI * LPFNSETPROCESSDPIAWARE)(); LPFNSETPROCESSDPIAWARE SetProcessDPIAware = - (LPFNSETPROCESSDPIAWARE)GetProcAddress(user32, "SetProcessDPIAware"); + (LPFNSETPROCESSDPIAWARE)GetProcAddress(user32, "SetProcessDPIAware"); if (SetProcessDPIAware) SetProcessDPIAware(); FreeLibrary(user32); initRawInput(); // Determine whether this system has a high frequency performance counter. */ - m_hasPerformanceCounter = ::QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq) == TRUE; + m_hasPerformanceCounter = ::QueryPerformanceFrequency((LARGE_INTEGER *)&m_freq) == TRUE; if (m_hasPerformanceCounter) { GHOST_PRINT("GHOST_SystemWin32::init: High Frequency Performance Timer available\n") - ::QueryPerformanceCounter((LARGE_INTEGER*)&m_start); + ::QueryPerformanceCounter((LARGE_INTEGER *)&m_start); } else { GHOST_PRINT("GHOST_SystemWin32::init: High Frequency Performance Timer not available\n") @@ -397,20 +398,20 @@ GHOST_TSuccess GHOST_SystemWin32::init() if (success) { WNDCLASSW wc; - wc.style= CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc= s_wndProc; - wc.cbClsExtra= 0; - wc.cbWndExtra= 0; - wc.hInstance= ::GetModuleHandle(0); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = s_wndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = ::GetModuleHandle(0); wc.hIcon = ::LoadIcon(wc.hInstance, "APPICON"); if (!wc.hIcon) { ::LoadIcon(NULL, IDI_APPLICATION); } wc.hCursor = ::LoadCursor(0, IDC_ARROW); - wc.hbrBackground= (HBRUSH)::GetStockObject(BLACK_BRUSH); + wc.hbrBackground = (HBRUSH) ::GetStockObject(BLACK_BRUSH); wc.lpszMenuName = 0; - wc.lpszClassName= L"GHOST_WindowClass"; + wc.lpszClassName = L"GHOST_WindowClass"; // Use RegisterClassEx for setting small icon if (::RegisterClassW(&wc) == 0) { @@ -427,12 +428,12 @@ GHOST_TSuccess GHOST_SystemWin32::exit() return GHOST_System::exit(); } -GHOST_TKey GHOST_SystemWin32::hardKey(GHOST_IWindow *window, RAWINPUT const& raw, int * keyDown, char * vk) +GHOST_TKey GHOST_SystemWin32::hardKey(GHOST_IWindow *window, RAWINPUT const& raw, int *keyDown, char *vk) { GHOST_TKey key = GHOST_kKeyUnknown; - if(!keyDown) + if (!keyDown) return GHOST_kKeyUnknown; @@ -446,66 +447,65 @@ GHOST_TKey GHOST_SystemWin32::hardKey(GHOST_IWindow *window, RAWINPUT const& raw unsigned int msg = raw.data.keyboard.Message; *keyDown = !(raw.data.keyboard.Flags & RI_KEY_BREAK) && msg != WM_KEYUP && msg != WM_SYSKEYUP; - key = this->convertKey(window, raw.data.keyboard.VKey, raw.data.keyboard.MakeCode, (raw.data.keyboard.Flags&(RI_KEY_E1|RI_KEY_E0))); + key = this->convertKey(window, raw.data.keyboard.VKey, raw.data.keyboard.MakeCode, (raw.data.keyboard.Flags & (RI_KEY_E1 | RI_KEY_E0))); // extra handling of modifier keys: don't send repeats out from GHOST - if(key >= GHOST_kKeyLeftShift && key <= GHOST_kKeyRightAlt) + if (key >= GHOST_kKeyLeftShift && key <= GHOST_kKeyRightAlt) { bool changed = false; GHOST_TModifierKeyMask modifier; - switch(key) { + switch (key) { case GHOST_kKeyLeftShift: - { - changed = (modifiers.get(GHOST_kModifierKeyLeftShift) != (bool)*keyDown); - modifier = GHOST_kModifierKeyLeftShift; - } - break; + { + changed = (modifiers.get(GHOST_kModifierKeyLeftShift) != (bool)*keyDown); + modifier = GHOST_kModifierKeyLeftShift; + } + break; case GHOST_kKeyRightShift: - { - changed = (modifiers.get(GHOST_kModifierKeyRightShift) != (bool)*keyDown); - modifier = GHOST_kModifierKeyRightShift; - } - break; + { + changed = (modifiers.get(GHOST_kModifierKeyRightShift) != (bool)*keyDown); + modifier = GHOST_kModifierKeyRightShift; + } + break; case GHOST_kKeyLeftControl: - { - changed = (modifiers.get(GHOST_kModifierKeyLeftControl) != (bool)*keyDown); - modifier = GHOST_kModifierKeyLeftControl; - } - break; + { + changed = (modifiers.get(GHOST_kModifierKeyLeftControl) != (bool)*keyDown); + modifier = GHOST_kModifierKeyLeftControl; + } + break; case GHOST_kKeyRightControl: - { - changed = (modifiers.get(GHOST_kModifierKeyRightControl) != (bool)*keyDown); - modifier = GHOST_kModifierKeyRightControl; - } - break; + { + changed = (modifiers.get(GHOST_kModifierKeyRightControl) != (bool)*keyDown); + modifier = GHOST_kModifierKeyRightControl; + } + break; case GHOST_kKeyLeftAlt: - { - changed = (modifiers.get(GHOST_kModifierKeyLeftAlt) != (bool)*keyDown); - modifier = GHOST_kModifierKeyLeftAlt; - } - break; + { + changed = (modifiers.get(GHOST_kModifierKeyLeftAlt) != (bool)*keyDown); + modifier = GHOST_kModifierKeyLeftAlt; + } + break; case GHOST_kKeyRightAlt: - { - changed = (modifiers.get(GHOST_kModifierKeyRightAlt) != (bool)*keyDown); - modifier = GHOST_kModifierKeyRightAlt; - } - break; + { + changed = (modifiers.get(GHOST_kModifierKeyRightAlt) != (bool)*keyDown); + modifier = GHOST_kModifierKeyRightAlt; + } + break; default: break; } - if(changed) + if (changed) { modifiers.set(modifier, (bool)*keyDown); system->storeModifierKeys(modifiers); } - else - { + else { key = GHOST_kKeyUnknown; } } - if(vk) *vk = raw.data.keyboard.VKey; + if (vk) *vk = raw.data.keyboard.VKey; return key; } @@ -515,9 +515,9 @@ GHOST_TKey GHOST_SystemWin32::hardKey(GHOST_IWindow *window, RAWINPUT const& raw GHOST_TKey GHOST_SystemWin32::processSpecialKey(GHOST_IWindow *window, short vKey, short scanCode) const { GHOST_TKey key = GHOST_kKeyUnknown; - switch(PRIMARYLANGID(m_langId)) { + switch (PRIMARYLANGID(m_langId)) { case LANG_FRENCH: - if(vKey==VK_OEM_8) key = GHOST_kKeyF13; // oem key; used purely for shortcuts . + if (vKey == VK_OEM_8) key = GHOST_kKeyF13; // oem key; used purely for shortcuts . break; } @@ -541,111 +541,111 @@ GHOST_TKey GHOST_SystemWin32::convertKey(GHOST_IWindow *window, short vKey, shor } else { switch (vKey) { - case VK_RETURN: - key = (extend)?GHOST_kKeyNumpadEnter : GHOST_kKeyEnter; break; + case VK_RETURN: + key = (extend) ? GHOST_kKeyNumpadEnter : GHOST_kKeyEnter; break; - case VK_BACK: key = GHOST_kKeyBackSpace; break; - case VK_TAB: key = GHOST_kKeyTab; break; - case VK_ESCAPE: key = GHOST_kKeyEsc; break; - case VK_SPACE: key = GHOST_kKeySpace; break; - - case VK_INSERT: - case VK_NUMPAD0: - key = (extend) ? GHOST_kKeyInsert : GHOST_kKeyNumpad0; break; - case VK_END: - case VK_NUMPAD1: - key = (extend) ? GHOST_kKeyEnd : GHOST_kKeyNumpad1; break; - case VK_DOWN: - case VK_NUMPAD2: - key = (extend) ? GHOST_kKeyDownArrow : GHOST_kKeyNumpad2; break; - case VK_NEXT: - case VK_NUMPAD3: - key = (extend) ? GHOST_kKeyDownPage : GHOST_kKeyNumpad3; break; - case VK_LEFT: - case VK_NUMPAD4: - key = (extend) ? GHOST_kKeyLeftArrow : GHOST_kKeyNumpad4; break; - case VK_CLEAR: - case VK_NUMPAD5: - key = (extend) ? GHOST_kKeyUnknown: GHOST_kKeyNumpad5; break; - case VK_RIGHT: - case VK_NUMPAD6: - key = (extend) ? GHOST_kKeyRightArrow : GHOST_kKeyNumpad6; break; - case VK_HOME: - case VK_NUMPAD7: - key = (extend) ? GHOST_kKeyHome : GHOST_kKeyNumpad7; break; - case VK_UP: - case VK_NUMPAD8: - key = (extend) ? GHOST_kKeyUpArrow : GHOST_kKeyNumpad8; break; - case VK_PRIOR: - case VK_NUMPAD9: - key = (extend) ? GHOST_kKeyUpPage : GHOST_kKeyNumpad9; break; - case VK_DECIMAL: - case VK_DELETE: - key = (extend) ? GHOST_kKeyDelete : GHOST_kKeyNumpadPeriod; break; + case VK_BACK: key = GHOST_kKeyBackSpace; break; + case VK_TAB: key = GHOST_kKeyTab; break; + case VK_ESCAPE: key = GHOST_kKeyEsc; break; + case VK_SPACE: key = GHOST_kKeySpace; break; - case VK_SNAPSHOT: key = GHOST_kKeyPrintScreen; break; - case VK_PAUSE: key = GHOST_kKeyPause; break; - case VK_MULTIPLY: key = GHOST_kKeyNumpadAsterisk; break; - case VK_SUBTRACT: key = GHOST_kKeyNumpadMinus; break; - case VK_DIVIDE: key = GHOST_kKeyNumpadSlash; break; - case VK_ADD: key = GHOST_kKeyNumpadPlus; break; + case VK_INSERT: + case VK_NUMPAD0: + key = (extend) ? GHOST_kKeyInsert : GHOST_kKeyNumpad0; break; + case VK_END: + case VK_NUMPAD1: + key = (extend) ? GHOST_kKeyEnd : GHOST_kKeyNumpad1; break; + case VK_DOWN: + case VK_NUMPAD2: + key = (extend) ? GHOST_kKeyDownArrow : GHOST_kKeyNumpad2; break; + case VK_NEXT: + case VK_NUMPAD3: + key = (extend) ? GHOST_kKeyDownPage : GHOST_kKeyNumpad3; break; + case VK_LEFT: + case VK_NUMPAD4: + key = (extend) ? GHOST_kKeyLeftArrow : GHOST_kKeyNumpad4; break; + case VK_CLEAR: + case VK_NUMPAD5: + key = (extend) ? GHOST_kKeyUnknown : GHOST_kKeyNumpad5; break; + case VK_RIGHT: + case VK_NUMPAD6: + key = (extend) ? GHOST_kKeyRightArrow : GHOST_kKeyNumpad6; break; + case VK_HOME: + case VK_NUMPAD7: + key = (extend) ? GHOST_kKeyHome : GHOST_kKeyNumpad7; break; + case VK_UP: + case VK_NUMPAD8: + key = (extend) ? GHOST_kKeyUpArrow : GHOST_kKeyNumpad8; break; + case VK_PRIOR: + case VK_NUMPAD9: + key = (extend) ? GHOST_kKeyUpPage : GHOST_kKeyNumpad9; break; + case VK_DECIMAL: + case VK_DELETE: + key = (extend) ? GHOST_kKeyDelete : GHOST_kKeyNumpadPeriod; break; - case VK_SEMICOLON: key = GHOST_kKeySemicolon; break; - case VK_EQUALS: key = GHOST_kKeyEqual; break; - case VK_COMMA: key = GHOST_kKeyComma; break; - case VK_MINUS: key = GHOST_kKeyMinus; break; - case VK_PERIOD: key = GHOST_kKeyPeriod; break; - case VK_SLASH: key = GHOST_kKeySlash; break; - case VK_BACK_QUOTE: key = GHOST_kKeyAccentGrave; break; - case VK_OPEN_BRACKET: key = GHOST_kKeyLeftBracket; break; - case VK_BACK_SLASH: key = GHOST_kKeyBackslash; break; - case VK_CLOSE_BRACKET: key = GHOST_kKeyRightBracket; break; - case VK_QUOTE: key = GHOST_kKeyQuote; break; - case VK_GR_LESS: key = GHOST_kKeyGrLess; break; + case VK_SNAPSHOT: key = GHOST_kKeyPrintScreen; break; + case VK_PAUSE: key = GHOST_kKeyPause; break; + case VK_MULTIPLY: key = GHOST_kKeyNumpadAsterisk; break; + case VK_SUBTRACT: key = GHOST_kKeyNumpadMinus; break; + case VK_DIVIDE: key = GHOST_kKeyNumpadSlash; break; + case VK_ADD: key = GHOST_kKeyNumpadPlus; break; - case VK_SHIFT: - key = (scanCode == 0x36)? GHOST_kKeyRightShift : GHOST_kKeyLeftShift; - break; - case VK_CONTROL: - key = (extend)? GHOST_kKeyRightControl : GHOST_kKeyLeftControl; - break; - case VK_MENU: - key = (extend)? GHOST_kKeyRightAlt : GHOST_kKeyLeftAlt; - break; - case VK_LWIN: - case VK_RWIN: - key = GHOST_kKeyOS; - break; - case VK_NUMLOCK: key = GHOST_kKeyNumLock; break; - case VK_SCROLL: key = GHOST_kKeyScrollLock; break; - case VK_CAPITAL: key = GHOST_kKeyCapsLock; break; - case VK_OEM_8: - key = ((GHOST_SystemWin32*)getSystem())->processSpecialKey(window, vKey, scanCode); - break; - case VK_MEDIA_PLAY_PAUSE: key = GHOST_kKeyMediaPlay; break; - case VK_MEDIA_STOP: key = GHOST_kKeyMediaStop; break; - case VK_MEDIA_PREV_TRACK: key = GHOST_kKeyMediaFirst; break; - case VK_MEDIA_NEXT_TRACK: key = GHOST_kKeyMediaLast; break; - default: - key = GHOST_kKeyUnknown; - break; + case VK_SEMICOLON: key = GHOST_kKeySemicolon; break; + case VK_EQUALS: key = GHOST_kKeyEqual; break; + case VK_COMMA: key = GHOST_kKeyComma; break; + case VK_MINUS: key = GHOST_kKeyMinus; break; + case VK_PERIOD: key = GHOST_kKeyPeriod; break; + case VK_SLASH: key = GHOST_kKeySlash; break; + case VK_BACK_QUOTE: key = GHOST_kKeyAccentGrave; break; + case VK_OPEN_BRACKET: key = GHOST_kKeyLeftBracket; break; + case VK_BACK_SLASH: key = GHOST_kKeyBackslash; break; + case VK_CLOSE_BRACKET: key = GHOST_kKeyRightBracket; break; + case VK_QUOTE: key = GHOST_kKeyQuote; break; + case VK_GR_LESS: key = GHOST_kKeyGrLess; break; + + case VK_SHIFT: + key = (scanCode == 0x36) ? GHOST_kKeyRightShift : GHOST_kKeyLeftShift; + break; + case VK_CONTROL: + key = (extend) ? GHOST_kKeyRightControl : GHOST_kKeyLeftControl; + break; + case VK_MENU: + key = (extend) ? GHOST_kKeyRightAlt : GHOST_kKeyLeftAlt; + break; + case VK_LWIN: + case VK_RWIN: + key = GHOST_kKeyOS; + break; + case VK_NUMLOCK: key = GHOST_kKeyNumLock; break; + case VK_SCROLL: key = GHOST_kKeyScrollLock; break; + case VK_CAPITAL: key = GHOST_kKeyCapsLock; break; + case VK_OEM_8: + key = ((GHOST_SystemWin32 *)getSystem())->processSpecialKey(window, vKey, scanCode); + break; + case VK_MEDIA_PLAY_PAUSE: key = GHOST_kKeyMediaPlay; break; + case VK_MEDIA_STOP: key = GHOST_kKeyMediaStop; break; + case VK_MEDIA_PREV_TRACK: key = GHOST_kKeyMediaFirst; break; + case VK_MEDIA_NEXT_TRACK: key = GHOST_kKeyMediaLast; break; + default: + key = GHOST_kKeyUnknown; + break; } } return key; } -GHOST_EventButton* GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask mask) +GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask mask) { - return new GHOST_EventButton (getSystem()->getMilliSeconds(), type, window, mask); + return new GHOST_EventButton(getSystem()->getMilliSeconds(), type, window, mask); } -GHOST_EventCursor* GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type, GHOST_IWindow *Iwindow) +GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type, GHOST_IWindow *Iwindow) { GHOST_TInt32 x_screen, y_screen; - GHOST_SystemWin32 * system = ((GHOST_SystemWin32 * ) getSystem()); - GHOST_WindowWin32 * window = ( GHOST_WindowWin32 * ) Iwindow; + GHOST_SystemWin32 *system = ((GHOST_SystemWin32 * ) getSystem()); + GHOST_WindowWin32 *window = ( GHOST_WindowWin32 * ) Iwindow; system->getCursorPosition(x_screen, y_screen); @@ -653,13 +653,13 @@ GHOST_EventCursor* GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type, bool is_tablet = false; if (is_tablet == false && window->getCursorGrabModeIsWarp()) { - GHOST_TInt32 x_new= x_screen; - GHOST_TInt32 y_new= y_screen; + GHOST_TInt32 x_new = x_screen; + GHOST_TInt32 y_new = y_screen; GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; /* fallback to window bounds */ - if(window->getCursorGrabBounds(bounds)==GHOST_kFailure){ + if (window->getCursorGrabBounds(bounds) == GHOST_kFailure) { window->getClientBounds(bounds); } @@ -669,86 +669,87 @@ GHOST_EventCursor* GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type, bounds.wrapPoint(x_new, y_new, 2); /* offset of one incase blender is at screen bounds */ window->getCursorGrabAccum(x_accum, y_accum); - if(x_new != x_screen|| y_new != y_screen) { + if (x_new != x_screen || y_new != y_screen) { /* when wrapping we don't need to add an event because the * setCursorPosition call will cause a new event after */ system->setCursorPosition(x_new, y_new); /* wrap */ window->setCursorGrabAccum(x_accum + (x_screen - x_new), y_accum + (y_screen - y_new)); - }else{ + } + else { return new GHOST_EventCursor(system->getMilliSeconds(), - GHOST_kEventCursorMove, - window, - x_screen + x_accum, - y_screen + y_accum - ); + GHOST_kEventCursorMove, + window, + x_screen + x_accum, + y_screen + y_accum + ); } } else { return new GHOST_EventCursor(system->getMilliSeconds(), - GHOST_kEventCursorMove, - window, - x_screen, - y_screen - ); + GHOST_kEventCursorMove, + window, + x_screen, + y_screen + ); } return NULL; } -GHOST_EventWheel* GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) +GHOST_EventWheel *GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) { // short fwKeys = LOWORD(wParam); // key flags - int zDelta = (short) HIWORD(wParam); // wheel rotation + int zDelta = (short) HIWORD(wParam); // wheel rotation // zDelta /= WHEEL_DELTA; // temporary fix below: microsoft now has added more precision, making the above division not work - if (zDelta <= 0 ) zDelta= -1; else zDelta= 1; + if (zDelta <= 0) zDelta = -1; else zDelta = 1; // short xPos = (short) LOWORD(lParam); // horizontal position of pointer // short yPos = (short) HIWORD(lParam); // vertical position of pointer - return new GHOST_EventWheel (getSystem()->getMilliSeconds(), window, zDelta); + return new GHOST_EventWheel(getSystem()->getMilliSeconds(), window, zDelta); } -GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, RAWINPUT const& raw) +GHOST_EventKey *GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, RAWINPUT const& raw) { - int keyDown=0; + int keyDown = 0; char vk; - GHOST_SystemWin32 * system = (GHOST_SystemWin32 *)getSystem(); + GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); GHOST_TKey key = system->hardKey(window, raw, &keyDown, &vk); - GHOST_EventKey* event; + GHOST_EventKey *event; if (key != GHOST_kKeyUnknown) { char utf8_char[6] = {0}; char ascii = 0; - wchar_t utf16[3]={0}; - BYTE state[256] ={0}; + wchar_t utf16[3] = {0}; + BYTE state[256] = {0}; int r; GetKeyboardState((PBYTE)state); - if(r = ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout)) { - if((r>0 && r<3)){ - utf16[r]=0; - conv_utf_16_to_8(utf16,utf8_char,6); + if (r = ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout)) { + if ((r > 0 && r < 3)) { + utf16[r] = 0; + conv_utf_16_to_8(utf16, utf8_char, 6); } - else if (r==-1) { + else if (r == -1) { utf8_char[0] = '\0'; } } - if(!keyDown) { + if (!keyDown) { utf8_char[0] = '\0'; - ascii='\0'; + ascii = '\0'; } else { - ascii = utf8_char[0]& 0x80?'?' : utf8_char[0]; + ascii = utf8_char[0] & 0x80 ? '?' : utf8_char[0]; } - if(0x80&state[VK_MENU]) utf8_char[0]='\0'; + if (0x80 & state[VK_MENU]) utf8_char[0] = '\0'; - event = new GHOST_EventKey(system->getMilliSeconds(), keyDown ? GHOST_kEventKeyDown: GHOST_kEventKeyUp, window, key, ascii, utf8_char); + event = new GHOST_EventKey(system->getMilliSeconds(), keyDown ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, key, ascii, utf8_char); #ifdef GHOST_DEBUG std::cout << ascii << std::endl; @@ -761,9 +762,9 @@ GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, RAWINP } -GHOST_Event* GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, GHOST_IWindow* window) +GHOST_Event *GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, GHOST_IWindow *window) { - GHOST_System* system = (GHOST_System*)getSystem(); + GHOST_System *system = (GHOST_System *)getSystem(); if (type == GHOST_kEventWindowActivate) { system->getWindowManager()->setActiveWindow(window); @@ -773,23 +774,23 @@ GHOST_Event* GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type, GHOST_ } GHOST_TSuccess GHOST_SystemWin32::pushDragDropEvent(GHOST_TEventType eventType, - GHOST_TDragnDropTypes draggedObjectType, - GHOST_IWindow* window, - int mouseX, int mouseY, - void* data) + GHOST_TDragnDropTypes draggedObjectType, + GHOST_IWindow *window, + int mouseX, int mouseY, + void *data) { - GHOST_SystemWin32* system = ((GHOST_SystemWin32*)getSystem()); + GHOST_SystemWin32 *system = ((GHOST_SystemWin32 *)getSystem()); return system->pushEvent(new GHOST_EventDragnDrop(system->getMilliSeconds(), - eventType, - draggedObjectType, - window,mouseX,mouseY,data) - ); + eventType, + draggedObjectType, + window, mouseX, mouseY, data) + ); } -void GHOST_SystemWin32::processMinMaxInfo(MINMAXINFO * minmax) +void GHOST_SystemWin32::processMinMaxInfo(MINMAXINFO *minmax) { - minmax->ptMinTrackSize.x=320; - minmax->ptMinTrackSize.y=240; + minmax->ptMinTrackSize.x = 320; + minmax->ptMinTrackSize.y = 240; } #ifdef WITH_INPUT_NDOF @@ -821,7 +822,7 @@ bool GHOST_SystemWin32::processNDOF(RAWINPUT const& raw) // using Microsoft compiler & header files // they invented the RawInput API, so this version is (probably) correct. // MinGW64 also works fine with this - BYTE const* data = raw.data.hid.bRawData; + BYTE const *data = raw.data.hid.bRawData; // struct RAWHID { // DWORD dwSizeHid; // DWORD dwCount; @@ -830,7 +831,7 @@ bool GHOST_SystemWin32::processNDOF(RAWINPUT const& raw) #else // MinGW's definition (below) doesn't agree, so we need a slight // workaround until it's fixed - BYTE const* data = &raw.data.hid.bRawData; + BYTE const *data = &raw.data.hid.bRawData; // struct RAWHID { // DWORD dwSizeHid; // DWORD dwCount; @@ -843,7 +844,7 @@ bool GHOST_SystemWin32::processNDOF(RAWINPUT const& raw) { case 1: // translation { - short* axis = (short*)(data + 1); + short *axis = (short *)(data + 1); // massage into blender view coords (same goes for rotation) short t[3] = {axis[0], -axis[2], axis[1]}; m_ndofManager->updateTranslation(t, now); @@ -860,7 +861,7 @@ bool GHOST_SystemWin32::processNDOF(RAWINPUT const& raw) } case 2: // rotation { - short* axis = (short*)(data + 1); + short *axis = (short *)(data + 1); short r[3] = {-axis[0], axis[2], -axis[1]}; m_ndofManager->updateRotation(r, now); break; @@ -879,15 +880,15 @@ bool GHOST_SystemWin32::processNDOF(RAWINPUT const& raw) LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - GHOST_Event* event = 0; + GHOST_Event *event = 0; bool eventHandled = false; LRESULT lResult = 0; - GHOST_SystemWin32* system = ((GHOST_SystemWin32*)getSystem()); + GHOST_SystemWin32 *system = ((GHOST_SystemWin32 *)getSystem()); GHOST_ASSERT(system, "GHOST_SystemWin32::s_wndProc(): system not initialized") if (hwnd) { - GHOST_WindowWin32* window = (GHOST_WindowWin32*)::GetWindowLong(hwnd, GWL_USERDATA); + GHOST_WindowWin32 *window = (GHOST_WindowWin32 *)::GetWindowLong(hwnd, GWL_USERDATA); if (window) { switch (msg) { // we need to check if new key layout has AltGr @@ -906,29 +907,29 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, } //else wParam == RIM_INPUT RAWINPUT raw; - RAWINPUT* raw_ptr = &raw; + RAWINPUT *raw_ptr = &raw; UINT rawSize = sizeof(RAWINPUT); GetRawInputData((HRAWINPUT)lParam, RID_INPUT, raw_ptr, &rawSize, sizeof(RAWINPUTHEADER)); switch (raw.header.dwType) { - case RIM_TYPEKEYBOARD: - event = processKeyEvent(window, raw); - if (!event) { - GHOST_PRINT("GHOST_SystemWin32::wndProc: key event ") - GHOST_PRINT(msg) - GHOST_PRINT(" key ignored\n") - } - break; + case RIM_TYPEKEYBOARD: + event = processKeyEvent(window, raw); + if (!event) { + GHOST_PRINT("GHOST_SystemWin32::wndProc: key event ") + GHOST_PRINT(msg) + GHOST_PRINT(" key ignored\n") + } + break; #ifdef WITH_INPUT_NDOF - case RIM_TYPEHID: - if (system->processNDOF(raw)) - eventHandled = true; - break; + case RIM_TYPEHID: + if (system->processNDOF(raw)) + eventHandled = true; + break; #endif } - break; + break; } //////////////////////////////////////////////////////////////////////// // Keyboard events, ignored @@ -937,12 +938,12 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: - /* These functions were replaced by WM_INPUT*/ + /* These functions were replaced by WM_INPUT*/ case WM_CHAR: - /* The WM_CHAR message is posted to the window with the keyboard focus when - * a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR - * contains the character code of the key that was pressed. - */ + /* The WM_CHAR message is posted to the window with the keyboard focus when + * a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR + * contains the character code of the key that was pressed. + */ case WM_DEADCHAR: /* The WM_DEADCHAR message is posted to the window with the keyboard focus when a * WM_KEYUP message is translated by the TranslateMessage function. WM_DEADCHAR @@ -954,11 +955,11 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, */ break; case WM_SYSDEADCHAR: - /* The WM_SYSDEADCHAR message is sent to the window with the keyboard focus when - * a WM_SYSKEYDOWN message is translated by the TranslateMessage function. - * WM_SYSDEADCHAR specifies the character code of a system dead key - that is, - * a dead key that is pressed while holding down the alt key. - */ + /* The WM_SYSDEADCHAR message is sent to the window with the keyboard focus when + * a WM_SYSKEYDOWN message is translated by the TranslateMessage function. + * WM_SYSDEADCHAR specifies the character code of a system dead key - that is, + * a dead key that is pressed while holding down the alt key. + */ case WM_SYSCHAR: /* The WM_SYSCHAR message is sent to the window with the keyboard focus when * a WM_SYSCHAR message is translated by the TranslateMessage function. @@ -972,17 +973,17 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * maximize, minimize or close the window are triggered. Also it is sent when ALT * button is press for menu. To prevent this we must return preventing DefWindowProc. */ - if(wParam==SC_KEYMENU) return 0; + if (wParam == SC_KEYMENU) return 0; break; //////////////////////////////////////////////////////////////////////// // Tablet events, processed //////////////////////////////////////////////////////////////////////// case WT_PACKET: - ((GHOST_WindowWin32*)window)->processWin32TabletEvent(wParam, lParam); + ((GHOST_WindowWin32 *)window)->processWin32TabletEvent(wParam, lParam); break; case WT_CSRCHANGE: case WT_PROXIMITY: - ((GHOST_WindowWin32*)window)->processWin32TabletInitEvent(); + ((GHOST_WindowWin32 *)window)->processWin32TabletInitEvent(); break; //////////////////////////////////////////////////////////////////////// // Mouse events, processed @@ -1001,9 +1002,10 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, break; case WM_XBUTTONDOWN: window->registerMouseClickEvent(0); - if ((short) HIWORD(wParam) == XBUTTON1){ + if ((short) HIWORD(wParam) == XBUTTON1) { event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4); - }else if((short) HIWORD(wParam) == XBUTTON2){ + } + else if ((short) HIWORD(wParam) == XBUTTON2) { event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton5); } break; @@ -1021,9 +1023,10 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, break; case WM_XBUTTONUP: window->registerMouseClickEvent(1); - if ((short) HIWORD(wParam) == XBUTTON1){ + if ((short) HIWORD(wParam) == XBUTTON1) { event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4); - }else if((short) HIWORD(wParam) == XBUTTON2){ + } + else if ((short) HIWORD(wParam) == XBUTTON2) { event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton5); } break; @@ -1063,10 +1066,10 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Mouse events, ignored //////////////////////////////////////////////////////////////////////// case WM_NCMOUSEMOVE: - /* The WM_NCMOUSEMOVE message is posted to a window when the cursor is moved - * within the nonclient area of the window. This message is posted to the window - * that contains the cursor. If a window has captured the mouse, this message is not posted. - */ + /* The WM_NCMOUSEMOVE message is posted to a window when the cursor is moved + * within the nonclient area of the window. This message is posted to the window + * that contains the cursor. If a window has captured the mouse, this message is not posted. + */ case WM_NCHITTEST: /* The WM_NCHITTEST message is sent to a window when the cursor moves, or * when a mouse button is pressed or released. If the mouse is not captured, @@ -1089,16 +1092,16 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * procedure of the top-level window being activated. If the windows use different input queues, * the message is sent asynchronously, so the window is activated immediately. */ - { + { GHOST_ModifierKeys modifiers; modifiers.clear(); system->storeModifierKeys(modifiers); event = processWindowEvent(LOWORD(wParam) ? GHOST_kEventWindowActivate : GHOST_kEventWindowDeactivate, window); /* WARNING: Let DefWindowProc handle WM_ACTIVATE, otherwise WM_MOUSEWHEEL - will not be dispatched to OUR active window if we minimize one of OUR windows. */ + will not be dispatched to OUR active window if we minimize one of OUR windows. */ lResult = ::DefWindowProc(hwnd, msg, wParam, lParam); break; - } + } case WM_PAINT: /* An application sends the WM_PAINT message when the system or another application * makes a request to paint a portion of an application's window. The message is sent @@ -1131,10 +1134,10 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, window->lostMouseCapture(); break; case WM_MOVING: - /* The WM_MOVING message is sent to a window that the user is moving. By processing - * this message, an application can monitor the size and position of the drag rectangle - * and, if needed, change its size or position. - */ + /* The WM_MOVING message is sent to a window that the user is moving. By processing + * this message, an application can monitor the size and position of the drag rectangle + * and, if needed, change its size or position. + */ case WM_MOVE: /* The WM_SIZE and WM_MOVE messages are not sent if an application handles the * WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient @@ -1147,32 +1150,32 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, // Window events, ignored //////////////////////////////////////////////////////////////////////// case WM_WINDOWPOSCHANGED: - /* The WM_WINDOWPOSCHANGED message is sent to a window whose size, position, or place - * in the Z order has changed as a result of a call to the SetWindowPos function or - * another window-management function. - * The WM_SIZE and WM_MOVE messages are not sent if an application handles the - * WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient - * to perform any move or size change processing during the WM_WINDOWPOSCHANGED - * message without calling DefWindowProc. - */ + /* The WM_WINDOWPOSCHANGED message is sent to a window whose size, position, or place + * in the Z order has changed as a result of a call to the SetWindowPos function or + * another window-management function. + * The WM_SIZE and WM_MOVE messages are not sent if an application handles the + * WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient + * to perform any move or size change processing during the WM_WINDOWPOSCHANGED + * message without calling DefWindowProc. + */ case WM_ERASEBKGND: - /* An application sends the WM_ERASEBKGND message when the window background must be - * erased (for example, when a window is resized). The message is sent to prepare an - * invalidated portion of a window for painting. - */ + /* An application sends the WM_ERASEBKGND message when the window background must be + * erased (for example, when a window is resized). The message is sent to prepare an + * invalidated portion of a window for painting. + */ case WM_NCPAINT: - /* An application sends the WM_NCPAINT message to a window when its frame must be painted. */ + /* An application sends the WM_NCPAINT message to a window when its frame must be painted. */ case WM_NCACTIVATE: - /* The WM_NCACTIVATE message is sent to a window when its nonclient area needs to be changed - * to indicate an active or inactive state. - */ + /* The WM_NCACTIVATE message is sent to a window when its nonclient area needs to be changed + * to indicate an active or inactive state. + */ case WM_DESTROY: - /* The WM_DESTROY message is sent when a window is being destroyed. It is sent to the window - * procedure of the window being destroyed after the window is removed from the screen. - * This message is sent first to the window being destroyed and then to the child windows - * (if any) as they are destroyed. During the processing of the message, it can be assumed - * that all child windows still exist. - */ + /* The WM_DESTROY message is sent when a window is being destroyed. It is sent to the window + * procedure of the window being destroyed after the window is removed from the screen. + * This message is sent first to the window being destroyed and then to the child windows + * (if any) as they are destroyed. During the processing of the message, it can be assumed + * that all child windows still exist. + */ case WM_NCDESTROY: /* The WM_NCDESTROY message informs a window that its nonclient area is being destroyed. The * DestroyWindow function sends the WM_NCDESTROY message to the window following the WM_DESTROY @@ -1182,17 +1185,17 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, case WM_KILLFOCUS: /* The WM_KILLFOCUS message is sent to a window immediately before it loses the keyboard focus. * We want to prevent this if a window is still active and it loses focus to nowhere*/ - if(!wParam && hwnd==GetActiveWindow()) + if (!wParam && hwnd == GetActiveWindow()) SetFocus(hwnd); case WM_SHOWWINDOW: - /* The WM_SHOWWINDOW message is sent to a window when the window is about to be hidden or shown. */ + /* The WM_SHOWWINDOW message is sent to a window when the window is about to be hidden or shown. */ case WM_WINDOWPOSCHANGING: - /* The WM_WINDOWPOSCHANGING message is sent to a window whose size, position, or place in - * the Z order is about to change as a result of a call to the SetWindowPos function or - * another window-management function. - */ + /* The WM_WINDOWPOSCHANGING message is sent to a window whose size, position, or place in + * the Z order is about to change as a result of a call to the SetWindowPos function or + * another window-management function. + */ case WM_SETFOCUS: - /* The WM_SETFOCUS message is sent to a window after it has gained the keyboard focus. */ + /* The WM_SETFOCUS message is sent to a window after it has gained the keyboard focus. */ case WM_ENTERSIZEMOVE: /* The WM_ENTERSIZEMOVE message is sent one time to a window after it enters the moving * or sizing modal loop. The window enters the moving or sizing modal loop when the user @@ -1202,19 +1205,19 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * DefWindowProc returns. */ break; - //////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////// // Other events //////////////////////////////////////////////////////////////////////// case WM_GETTEXT: - /* An application sends a WM_GETTEXT message to copy the text that - * corresponds to a window into a buffer provided by the caller. - */ + /* An application sends a WM_GETTEXT message to copy the text that + * corresponds to a window into a buffer provided by the caller. + */ case WM_ACTIVATEAPP: - /* The WM_ACTIVATEAPP message is sent when a window belonging to a - * different application than the active window is about to be activated. - * The message is sent to the application whose window is being activated - * and to the application whose window is being deactivated. - */ + /* The WM_ACTIVATEAPP message is sent when a window belonging to a + * different application than the active window is about to be activated. + * The message is sent to the application whose window is being activated + * and to the application whose window is being deactivated. + */ case WM_TIMER: /* The WIN32 docs say: * The WM_TIMER message is posted to the installing thread's message queue @@ -1237,7 +1240,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, WM_NCCALCSIZE 0x83 WM_CREATE 0x01 We let DefWindowProc do the work. - */ + */ } } else { @@ -1256,66 +1259,68 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, return lResult; } -GHOST_TUns8* GHOST_SystemWin32::getClipboard(bool selection) const +GHOST_TUns8 *GHOST_SystemWin32::getClipboard(bool selection) const { char *temp_buff; - if ( IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL) ) { + if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL) ) { wchar_t *buffer; - HANDLE hData = GetClipboardData( CF_UNICODETEXT ); + HANDLE hData = GetClipboardData(CF_UNICODETEXT); if (hData == NULL) { CloseClipboard(); return NULL; } - buffer = (wchar_t*)GlobalLock( hData ); + buffer = (wchar_t *)GlobalLock(hData); if (!buffer) { CloseClipboard(); return NULL; } - temp_buff = alloc_utf_8_from_16(buffer,0); + temp_buff = alloc_utf_8_from_16(buffer, 0); /* Buffer mustn't be accessed after CloseClipboard it would like accessing free-d memory */ - GlobalUnlock( hData ); + GlobalUnlock(hData); CloseClipboard(); - return (GHOST_TUns8*)temp_buff; - } else if ( IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL) ) { + return (GHOST_TUns8 *)temp_buff; + } + else if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL) ) { char *buffer; size_t len = 0; - HANDLE hData = GetClipboardData( CF_TEXT ); + HANDLE hData = GetClipboardData(CF_TEXT); if (hData == NULL) { CloseClipboard(); return NULL; } - buffer = (char*)GlobalLock( hData ); + buffer = (char *)GlobalLock(hData); if (!buffer) { CloseClipboard(); return NULL; } len = strlen(buffer); - temp_buff = (char*) malloc(len+1); + temp_buff = (char *) malloc(len + 1); strncpy(temp_buff, buffer, len); temp_buff[len] = '\0'; /* Buffer mustn't be accessed after CloseClipboard it would like accessing free-d memory */ - GlobalUnlock( hData ); + GlobalUnlock(hData); CloseClipboard(); - return (GHOST_TUns8*)temp_buff; - } else { + return (GHOST_TUns8 *)temp_buff; + } + else { return NULL; } } void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const { - if(selection) {return;} // for copying the selection, used on X11 + if (selection) {return; } // for copying the selection, used on X11 - if(OpenClipboard(NULL)) { + if (OpenClipboard(NULL)) { HLOCAL clipbuffer; wchar_t *data; @@ -1323,65 +1328,66 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const size_t len = count_utf_16_from_8(buffer); EmptyClipboard(); - clipbuffer = LocalAlloc(LMEM_FIXED,sizeof(wchar_t) * len); - data = (wchar_t*)GlobalLock(clipbuffer); + clipbuffer = LocalAlloc(LMEM_FIXED, sizeof(wchar_t) * len); + data = (wchar_t *)GlobalLock(clipbuffer); conv_utf_8_to_16(buffer, data, len); LocalUnlock(clipbuffer); - SetClipboardData(CF_UNICODETEXT,clipbuffer); + SetClipboardData(CF_UNICODETEXT, clipbuffer); } CloseClipboard(); - } else { + } + else { return; } } int GHOST_SystemWin32::toggleConsole(int action) { - switch(action) + switch (action) { case 3: //hide if no console - { - DWORD sp = GetCurrentProcessId(); - HANDLE ptree = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - PROCESSENTRY32 e = {0}; e.dwSize = sizeof(PROCESSENTRY32); - - if( Process32First(ptree, &e)) { - do { //Searches for Blender's PROCESSENTRY32 - if (e.th32ProcessID == sp) { - sp = e.th32ParentProcessID; - Process32First(ptree, &e); - do { //Got parent id, searches for its PROCESSENTRY32 - if (e.th32ProcessID == sp) { - if(strcmp("explorer.exe",e.szExeFile)==0) - { //If explorer, hide cmd - ShowWindow(GetConsoleWindow(),SW_HIDE); - m_consoleStatus = 0; - } - break; - } + { + DWORD sp = GetCurrentProcessId(); + HANDLE ptree = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + PROCESSENTRY32 e = {0}; e.dwSize = sizeof(PROCESSENTRY32); - } while( Process32Next(ptree, &e)); + if (Process32First(ptree, &e)) { + do { //Searches for Blender's PROCESSENTRY32 + if (e.th32ProcessID == sp) { + sp = e.th32ParentProcessID; + Process32First(ptree, &e); + do { //Got parent id, searches for its PROCESSENTRY32 + if (e.th32ProcessID == sp) { + if (strcmp("explorer.exe", e.szExeFile) == 0) + { //If explorer, hide cmd + ShowWindow(GetConsoleWindow(), SW_HIDE); + m_consoleStatus = 0; + } break; } - } while( Process32Next(ptree, &e)); - } - CloseHandle(ptree); - break; + } while (Process32Next(ptree, &e)); + break; + } + } while (Process32Next(ptree, &e)); } + + CloseHandle(ptree); + break; + } case 0: //hide - ShowWindow(GetConsoleWindow(),SW_HIDE); + ShowWindow(GetConsoleWindow(), SW_HIDE); m_consoleStatus = 0; break; case 1: //show - ShowWindow(GetConsoleWindow(),SW_SHOW); + ShowWindow(GetConsoleWindow(), SW_SHOW); m_consoleStatus = 1; break; case 2: //toggle - ShowWindow(GetConsoleWindow(),m_consoleStatus?SW_HIDE:SW_SHOW); - m_consoleStatus=!m_consoleStatus; + ShowWindow(GetConsoleWindow(), m_consoleStatus ? SW_HIDE : SW_SHOW); + m_consoleStatus = !m_consoleStatus; break; }; @@ -1390,8 +1396,8 @@ int GHOST_SystemWin32::toggleConsole(int action) return m_consoleStatus; } -int GHOST_SystemWin32::confirmQuit(GHOST_IWindow * window) const +int GHOST_SystemWin32::confirmQuit(GHOST_IWindow *window) const { - return (MessageBox(window ? ((GHOST_WindowWin32*)window)->getHWND() : 0, "Some changes have not been saved.\nDo you really want to quit ?", - "Exit Blender", MB_OKCANCEL | MB_ICONWARNING | MB_TOPMOST) == IDOK); + return (MessageBox(window ? ((GHOST_WindowWin32 *)window)->getHWND() : 0, "Some changes have not been saved.\nDo you really want to quit ?", + "Exit Blender", MB_OKCANCEL | MB_ICONWARNING | MB_TOPMOST) == IDOK); } diff --git a/intern/ghost/intern/GHOST_TimerManager.cpp b/intern/ghost/intern/GHOST_TimerManager.cpp index 19cfe61a260..4780a4a0d44 100644 --- a/intern/ghost/intern/GHOST_TimerManager.cpp +++ b/intern/ghost/intern/GHOST_TimerManager.cpp @@ -61,14 +61,14 @@ GHOST_TUns32 GHOST_TimerManager::getNumTimers() } -bool GHOST_TimerManager::getTimerFound(GHOST_TimerTask* timer) +bool GHOST_TimerManager::getTimerFound(GHOST_TimerTask *timer) { TTimerVector::const_iterator iter = std::find(m_timers.begin(), m_timers.end(), timer); return iter != m_timers.end(); } -GHOST_TSuccess GHOST_TimerManager::addTimer(GHOST_TimerTask* timer) +GHOST_TSuccess GHOST_TimerManager::addTimer(GHOST_TimerTask *timer) { GHOST_TSuccess success; if (!getTimerFound(timer)) { @@ -83,7 +83,7 @@ GHOST_TSuccess GHOST_TimerManager::addTimer(GHOST_TimerTask* timer) } -GHOST_TSuccess GHOST_TimerManager::removeTimer(GHOST_TimerTask* timer) +GHOST_TSuccess GHOST_TimerManager::removeTimer(GHOST_TimerTask *timer) { GHOST_TSuccess success; TTimerVector::iterator iter = std::find(m_timers.begin(), m_timers.end(), timer); @@ -108,7 +108,7 @@ GHOST_TUns64 GHOST_TimerManager::nextFireTime() for (iter = m_timers.begin(); iter != m_timers.end(); iter++) { GHOST_TUns64 next = (*iter)->getNext(); - if (nextgetNext(); @@ -148,7 +148,8 @@ bool GHOST_TimerManager::fireTimer(GHOST_TUns64 time, GHOST_TimerTask* task) task->setNext(next); return true; - } else { + } + else { return false; } } diff --git a/intern/ghost/intern/GHOST_Window.cpp b/intern/ghost/intern/GHOST_Window.cpp index b560b04b5df..c3244d1594d 100644 --- a/intern/ghost/intern/GHOST_Window.cpp +++ b/intern/ghost/intern/GHOST_Window.cpp @@ -40,12 +40,12 @@ GHOST_Window::GHOST_Window( - GHOST_TUns32 width, GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples) -: + GHOST_TUns32 width, GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples) + : m_drawingContextType(type), m_cursorVisible(true), m_cursorGrab(GHOST_kGrabDisable), @@ -58,14 +58,14 @@ GHOST_Window::GHOST_Window( m_progressBarVisible = false; - m_cursorGrabAccumPos[0] = 0; - m_cursorGrabAccumPos[1] = 0; + m_cursorGrabAccumPos[0] = 0; + m_cursorGrabAccumPos[1] = 0; - m_fullScreen = state == GHOST_kWindowStateFullScreen; - if (m_fullScreen) { - m_fullScreenWidth = width; - m_fullScreenHeight = height; - } + m_fullScreen = state == GHOST_kWindowStateFullScreen; + if (m_fullScreen) { + m_fullScreenWidth = width; + m_fullScreenHeight = height; + } } @@ -73,7 +73,7 @@ GHOST_Window::~GHOST_Window() { } -void* GHOST_Window::getOSWindow() const +void *GHOST_Window::getOSWindow() const { return NULL; } @@ -107,16 +107,17 @@ GHOST_TSuccess GHOST_Window::setCursorVisibility(bool visible) GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { - if(m_cursorGrab == mode) + if (m_cursorGrab == mode) return GHOST_kSuccess; if (setWindowCursorGrab(mode)) { - if(mode==GHOST_kGrabDisable) - m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; + if (mode == GHOST_kGrabDisable) + m_cursorGrabBounds.m_l = m_cursorGrabBounds.m_r = -1; else if (bounds) { - m_cursorGrabBounds= *bounds; - } else { /* if bounds not defined, use window */ + m_cursorGrabBounds = *bounds; + } + else { /* if bounds not defined, use window */ getClientBounds(m_cursorGrabBounds); } m_cursorGrab = mode; @@ -129,8 +130,8 @@ GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rec GHOST_TSuccess GHOST_Window::getCursorGrabBounds(GHOST_Rect& bounds) { - bounds= m_cursorGrabBounds; - return (bounds.m_l==-1 && bounds.m_r==-1) ? GHOST_kFailure : GHOST_kSuccess; + bounds = m_cursorGrabBounds; + return (bounds.m_l == -1 && bounds.m_r == -1) ? GHOST_kFailure : GHOST_kSuccess; } GHOST_TSuccess GHOST_Window::setCursorShape(GHOST_TStandardCursor cursorShape) @@ -148,14 +149,14 @@ GHOST_TSuccess GHOST_Window::setCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHO int hotX, int hotY) { return setCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask, - 16, 16, hotX, hotY, 0, 1 ); + 16, 16, hotX, hotY, 0, 1); } GHOST_TSuccess GHOST_Window::setCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) { - if (setWindowCustomCursorShape(bitmap, mask, sizex, sizey,hotX, hotY, fg_color, bg_color)) { + if (setWindowCustomCursorShape(bitmap, mask, sizex, sizey, hotX, hotY, fg_color, bg_color)) { m_cursorShape = GHOST_kStandardCursorCustom; return GHOST_kSuccess; } diff --git a/intern/ghost/intern/GHOST_WindowCarbon.cpp b/intern/ghost/intern/GHOST_WindowCarbon.cpp index ab7325fcef8..16e3cb49652 100644 --- a/intern/ghost/intern/GHOST_WindowCarbon.cpp +++ b/intern/ghost/intern/GHOST_WindowCarbon.cpp @@ -46,31 +46,31 @@ const GHOST_TInt32 GHOST_WindowCarbon::s_sizeRectSize = 16; #endif //GHOST_DRAW_CARBON_GUTTER static const GLint sPreferredFormatWindow[10] = { -AGL_RGBA, -AGL_DOUBLEBUFFER, -AGL_ACCELERATED, -AGL_DEPTH_SIZE, 32, -AGL_NONE, + AGL_RGBA, + AGL_DOUBLEBUFFER, + AGL_ACCELERATED, + AGL_DEPTH_SIZE, 32, + AGL_NONE, }; static const GLint sPreferredFormatFullScreen[11] = { -AGL_RGBA, -AGL_DOUBLEBUFFER, -AGL_ACCELERATED, -AGL_FULLSCREEN, -AGL_DEPTH_SIZE, 32, -AGL_NONE, + AGL_RGBA, + AGL_DOUBLEBUFFER, + AGL_ACCELERATED, + AGL_FULLSCREEN, + AGL_DEPTH_SIZE, 32, + AGL_NONE, }; -WindowRef ugly_hack=NULL; +WindowRef ugly_hack = NULL; -const EventTypeSpec kWEvents[] = { +const EventTypeSpec kWEvents[] = { { kEventClassWindow, kEventWindowZoom }, /* for new zoom behaviour */ }; -static OSStatus myWEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData) +static OSStatus myWEventHandlerProc(EventHandlerCallRef handler, EventRef event, void *userData) { WindowRef mywindow; GHOST_WindowCarbon *ghost_window; @@ -78,7 +78,7 @@ static OSStatus myWEventHandlerProc(EventHandlerCallRef handler, EventRef event, int theState; if (::GetEventKind(event) == kEventWindowZoom) { - err = ::GetEventParameter (event,kEventParamDirectObject,typeWindowRef,NULL,sizeof(mywindow),NULL, &mywindow); + err = ::GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(mywindow), NULL, &mywindow); ghost_window = (GHOST_WindowCarbon *) GetWRefCon(mywindow); theState = ghost_window->getMac_windowState(); if (theState == 1) @@ -91,16 +91,16 @@ static OSStatus myWEventHandlerProc(EventHandlerCallRef handler, EventRef event, } GHOST_WindowCarbon::GHOST_WindowCarbon( - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples -) : + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples + ) : GHOST_Window(width, height, state, GHOST_kDrawingContextTypeNone), m_windowRef(0), m_grafPtr(0), @@ -108,84 +108,87 @@ GHOST_WindowCarbon::GHOST_WindowCarbon( m_customCursor(0), m_fullScreenDirty(false) { - Str255 title255; + Str255 title255; OSStatus err; //fprintf(stderr," main screen top %i left %i height %i width %i\n", top, left, height, width); - if (state >= GHOST_kWindowState8Normal ) { - if(state == GHOST_kWindowState8Normal) state= GHOST_kWindowStateNormal; - else if(state == GHOST_kWindowState8Maximized) state= GHOST_kWindowStateMaximized; - else if(state == GHOST_kWindowState8Minimized) state= GHOST_kWindowStateMinimized; - else if(state == GHOST_kWindowState8FullScreen) state= GHOST_kWindowStateFullScreen; + if (state >= GHOST_kWindowState8Normal) { + if (state == GHOST_kWindowState8Normal) state = GHOST_kWindowStateNormal; + else if (state == GHOST_kWindowState8Maximized) state = GHOST_kWindowStateMaximized; + else if (state == GHOST_kWindowState8Minimized) state = GHOST_kWindowStateMinimized; + else if (state == GHOST_kWindowState8FullScreen) state = GHOST_kWindowStateFullScreen; // state = state - 8; this was the simple version of above code, doesnt work in gcc 4.0 setMac_windowState(1); - } else + } + else setMac_windowState(0); if (state != GHOST_kWindowStateFullScreen) { - Rect bnds = { top, left, top+height, left+width }; - // Boolean visible = (state == GHOST_kWindowStateNormal) || (state == GHOST_kWindowStateMaximized); /*unused*/ - gen2mac(title, title255); - - err = ::CreateNewWindow( kDocumentWindowClass, - kWindowStandardDocumentAttributes+kWindowLiveResizeAttribute, - &bnds, - &m_windowRef); - - if ( err != noErr) { - fprintf(stderr," error creating window %i \n",(int)err); - } else { + Rect bnds = { top, left, top + height, left + width }; + // Boolean visible = (state == GHOST_kWindowStateNormal) || (state == GHOST_kWindowStateMaximized); /*unused*/ + gen2mac(title, title255); + + err = ::CreateNewWindow(kDocumentWindowClass, + kWindowStandardDocumentAttributes + kWindowLiveResizeAttribute, + &bnds, + &m_windowRef); - ::SetWRefCon(m_windowRef,(SInt32)this); + if (err != noErr) { + fprintf(stderr, " error creating window %i \n", (int)err); + } + else { + + ::SetWRefCon(m_windowRef, (SInt32) this); setTitle(title); - err = InstallWindowEventHandler (m_windowRef, myWEventHandlerProc, GetEventTypeCount(kWEvents), kWEvents,NULL,NULL); - if ( err != noErr) { - fprintf(stderr," error creating handler %i \n",(int)err); - } else { + err = InstallWindowEventHandler(m_windowRef, myWEventHandlerProc, GetEventTypeCount(kWEvents), kWEvents, NULL, NULL); + if (err != noErr) { + fprintf(stderr, " error creating handler %i \n", (int)err); + } + else { // ::TransitionWindow (m_windowRef,kWindowZoomTransitionEffect,kWindowShowTransitionAction,NULL); ::ShowWindow(m_windowRef); - ::MoveWindow (m_windowRef, left, top,true); + ::MoveWindow(m_windowRef, left, top, true); } } - if (m_windowRef) { - m_grafPtr = ::GetWindowPort(m_windowRef); - setDrawingContextType(type); - updateDrawingContext(); - activateDrawingContext(); - } - if(ugly_hack==NULL) { - ugly_hack= m_windowRef; + if (m_windowRef) { + m_grafPtr = ::GetWindowPort(m_windowRef); + setDrawingContextType(type); + updateDrawingContext(); + activateDrawingContext(); + } + if (ugly_hack == NULL) { + ugly_hack = m_windowRef; // when started from commandline, window remains in the back... also for play anim ProcessSerialNumber psn; GetCurrentProcess(&psn); SetFrontProcess(&psn); } - } - else { - /* - Rect bnds = { top, left, top+height, left+width }; - gen2mac("", title255); - m_windowRef = ::NewCWindow( - nil, // Storage - &bnds, // Bounding rectangle of the window - title255, // Title of the window - 0, // Window initially visible - plainDBox, // procID - (WindowRef)-1L, // Put window before all other windows - 0, // Window has minimize box - (SInt32)this); // Store a pointer to the class in the refCon - */ - //GHOST_PRINT("GHOST_WindowCarbon::GHOST_WindowCarbon(): creating full-screen OpenGL context\n"); - setDrawingContextType(GHOST_kDrawingContextTypeOpenGL);;installDrawingContext(GHOST_kDrawingContextTypeOpenGL); - updateDrawingContext(); - activateDrawingContext(); + } + else { +#if 0 + Rect bnds = { top, left, top + height, left + width }; + gen2mac("", title255); + m_windowRef = ::NewCWindow( + nil, // Storage + &bnds, // Bounding rectangle of the window + title255, // Title of the window + 0, // Window initially visible + plainDBox, // procID + (WindowRef) - 1L, // Put window before all other windows + 0, // Window has minimize box + (SInt32) this); // Store a pointer to the class in the refCon +#endif + //GHOST_PRINT("GHOST_WindowCarbon::GHOST_WindowCarbon(): creating full-screen OpenGL context\n"); + setDrawingContextType(GHOST_kDrawingContextTypeOpenGL);; installDrawingContext(GHOST_kDrawingContextTypeOpenGL); + updateDrawingContext(); + activateDrawingContext(); - m_tablet.Active = GHOST_kTabletModeNone; - } + m_tablet.Active = GHOST_kTabletModeNone; + } } @@ -193,44 +196,44 @@ GHOST_WindowCarbon::~GHOST_WindowCarbon() { if (m_customCursor) delete m_customCursor; - if(ugly_hack==m_windowRef) ugly_hack= NULL; + if (ugly_hack == m_windowRef) ugly_hack = NULL; // printf("GHOST_WindowCarbon::~GHOST_WindowCarbon(): removing drawing context\n"); - if(ugly_hack==NULL) setDrawingContextType(GHOST_kDrawingContextTypeNone); - if (m_windowRef) { - ::DisposeWindow(m_windowRef); + if (ugly_hack == NULL) setDrawingContextType(GHOST_kDrawingContextTypeNone); + if (m_windowRef) { + ::DisposeWindow(m_windowRef); m_windowRef = 0; } } bool GHOST_WindowCarbon::getValid() const { - bool valid; - if (!m_fullScreen) { - valid = (m_windowRef != 0) && (m_grafPtr != 0) && ::IsValidWindowPtr(m_windowRef); - } - else { - valid = true; - } - return valid; + bool valid; + if (!m_fullScreen) { + valid = (m_windowRef != 0) && (m_grafPtr != 0) && ::IsValidWindowPtr(m_windowRef); + } + else { + valid = true; + } + return valid; } void GHOST_WindowCarbon::setTitle(const STR_String& title) { - GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::setTitle(): window invalid") - Str255 title255; - gen2mac(title, title255); + GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::setTitle(): window invalid") + Str255 title255; + gen2mac(title, title255); ::SetWTitle(m_windowRef, title255); } void GHOST_WindowCarbon::getTitle(STR_String& title) const { - GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::getTitle(): window invalid") - Str255 title255; - ::GetWTitle(m_windowRef, title255); - mac2gen(title255, title); + GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::getTitle(): window invalid") + Str255 title255; + ::GetWTitle(m_windowRef, title255); + mac2gen(title255, title); } @@ -265,8 +268,7 @@ void GHOST_WindowCarbon::getClientBounds(GHOST_Rect& bounds) const { bounds.m_b -= s_sizeRectSize; } - else - { + else { bounds.m_t = bounds.m_b; } #endif //GHOST_DRAW_CARBON_GUTTER @@ -291,8 +293,8 @@ GHOST_TSuccess GHOST_WindowCarbon::setClientHeight(GHOST_TUns32 height) GHOST_Rect cBnds, wBnds; getClientBounds(cBnds); #ifdef GHOST_DRAW_CARBON_GUTTER - if (((GHOST_TUns32)cBnds.getHeight()) != height+s_sizeRectSize) { - ::SizeWindow(m_windowRef, cBnds.getWidth(), height+s_sizeRectSize, true); + if (((GHOST_TUns32)cBnds.getHeight()) != height + s_sizeRectSize) { + ::SizeWindow(m_windowRef, cBnds.getWidth(), height + s_sizeRectSize, true); } #else //GHOST_DRAW_CARBON_GUTTER if (((GHOST_TUns32)cBnds.getHeight()) != height) { @@ -310,8 +312,9 @@ GHOST_TSuccess GHOST_WindowCarbon::setClientSize(GHOST_TUns32 width, GHOST_TUns3 getClientBounds(cBnds); #ifdef GHOST_DRAW_CARBON_GUTTER if ((((GHOST_TUns32)cBnds.getWidth()) != width) || - (((GHOST_TUns32)cBnds.getHeight()) != height+s_sizeRectSize)) { - ::SizeWindow(m_windowRef, width, height+s_sizeRectSize, true); + (((GHOST_TUns32)cBnds.getHeight()) != height + s_sizeRectSize)) + { + ::SizeWindow(m_windowRef, width, height + s_sizeRectSize, true); } #else //GHOST_DRAW_CARBON_GUTTER if ((((GHOST_TUns32)cBnds.getWidth()) != width) || @@ -346,11 +349,11 @@ void GHOST_WindowCarbon::screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOS Point point; point.h = inX; point.v = inY; - GrafPtr oldPort; - ::GetPort(&oldPort); - ::SetPort(m_grafPtr); + GrafPtr oldPort; + ::GetPort(&oldPort); + ::SetPort(m_grafPtr); ::GlobalToLocal(&point); - ::SetPort(oldPort); + ::SetPort(oldPort); outX = point.h; outY = point.v; } @@ -362,11 +365,11 @@ void GHOST_WindowCarbon::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOS Point point; point.h = inX; point.v = inY; - GrafPtr oldPort; - ::GetPort(&oldPort); - ::SetPort(m_grafPtr); + GrafPtr oldPort; + ::GetPort(&oldPort); + ::SetPort(m_grafPtr); ::LocalToGlobal(&point); - ::SetPort(oldPort); + ::SetPort(oldPort); outX = point.h; outY = point.v; } @@ -375,38 +378,38 @@ void GHOST_WindowCarbon::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOS GHOST_TSuccess GHOST_WindowCarbon::setState(GHOST_TWindowState state) { GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::setState(): window invalid") - switch (state) { - case GHOST_kWindowStateMinimized: - ::HideWindow(m_windowRef); - break; - case GHOST_kWindowStateModified: - SetWindowModified(m_windowRef, 1); - break; - case GHOST_kWindowStateUnModified: - SetWindowModified(m_windowRef, 0); - break; - case GHOST_kWindowStateMaximized: - case GHOST_kWindowStateNormal: - default: - ::ShowWindow(m_windowRef); - break; - } - return GHOST_kSuccess; + switch (state) { + case GHOST_kWindowStateMinimized: + ::HideWindow(m_windowRef); + break; + case GHOST_kWindowStateModified: + SetWindowModified(m_windowRef, 1); + break; + case GHOST_kWindowStateUnModified: + SetWindowModified(m_windowRef, 0); + break; + case GHOST_kWindowStateMaximized: + case GHOST_kWindowStateNormal: + default: + ::ShowWindow(m_windowRef); + break; + } + return GHOST_kSuccess; } GHOST_TSuccess GHOST_WindowCarbon::setOrder(GHOST_TWindowOrder order) { GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::setOrder(): window invalid") - if (order == GHOST_kWindowOrderTop) { - //::BringToFront(m_windowRef); is wrong, front window should be active for input too + if (order == GHOST_kWindowOrderTop) { + //::BringToFront(m_windowRef); is wrong, front window should be active for input too ::SelectWindow(m_windowRef); - } - else { + } + else { /* doesnt work if you do this with a mouseclick */ - ::SendBehind(m_windowRef, nil); - } - return GHOST_kSuccess; + ::SendBehind(m_windowRef, nil); + } + return GHOST_kSuccess; } /*#define WAIT_FOR_VSYNC 1*/ @@ -418,20 +421,20 @@ GHOST_TSuccess GHOST_WindowCarbon::swapBuffers() { #ifdef WAIT_FOR_VSYNC /* wait for vsync, to avoid tearing artifacts */ -long VBL = 1; -CGLSetParameter(CGLGetCurrentContext(), kCGLCPSwapInterval, &VBL); + long VBL = 1; + CGLSetParameter(CGLGetCurrentContext(), kCGLCPSwapInterval, &VBL); #endif - GHOST_TSuccess succeeded = GHOST_kSuccess; - if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { - if (m_aglCtx) { - ::aglSwapBuffers(m_aglCtx); - } - else { - succeeded = GHOST_kFailure; - } - } - return succeeded; + GHOST_TSuccess succeeded = GHOST_kSuccess; + if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) { + if (m_aglCtx) { + ::aglSwapBuffers(m_aglCtx); + } + else { + succeeded = GHOST_kFailure; + } + } + return succeeded; } GHOST_TSuccess GHOST_WindowCarbon::updateDrawingContext() @@ -462,9 +465,9 @@ GHOST_TSuccess GHOST_WindowCarbon::activateDrawingContext() GLint b[4] = { bnds.m_l, - bnds.m_t+s_sizeRectSize, - bnds.m_r-bnds.m_l, - bnds.m_b-bnds.m_t + bnds.m_t + s_sizeRectSize, + bnds.m_r - bnds.m_l, + bnds.m_b - bnds.m_t }; GLboolean result = ::aglSetInteger(m_aglCtx, AGL_BUFFER_RECT, b); #endif //GHOST_DRAW_CARBON_GUTTER @@ -482,38 +485,38 @@ GHOST_TSuccess GHOST_WindowCarbon::installDrawingContext(GHOST_TDrawingContextTy GHOST_TSuccess success = GHOST_kFailure; switch (type) { case GHOST_kDrawingContextTypeOpenGL: - { + { if (!getValid()) break; - - AGLPixelFormat pixelFormat; - if (!m_fullScreen) { - pixelFormat = ::aglChoosePixelFormat(0, 0, sPreferredFormatWindow); - m_aglCtx = ::aglCreateContext(pixelFormat, s_firstaglCtx); - if (!m_aglCtx) break; + + AGLPixelFormat pixelFormat; + if (!m_fullScreen) { + pixelFormat = ::aglChoosePixelFormat(0, 0, sPreferredFormatWindow); + m_aglCtx = ::aglCreateContext(pixelFormat, s_firstaglCtx); + if (!m_aglCtx) break; if (!s_firstaglCtx) s_firstaglCtx = m_aglCtx; - success = ::aglSetDrawable(m_aglCtx, m_grafPtr) == GL_TRUE ? GHOST_kSuccess : GHOST_kFailure; - } - else { - //GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): init full-screen OpenGL\n"); -GDHandle device=::GetMainDevice();pixelFormat=::aglChoosePixelFormat(&device,1,sPreferredFormatFullScreen); - m_aglCtx = ::aglCreateContext(pixelFormat, 0); - if (!m_aglCtx) break; - if (!s_firstaglCtx) s_firstaglCtx = m_aglCtx; - //GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): created OpenGL context\n"); - //::CGGetActiveDisplayList(0, NULL, &m_numDisplays) - success = ::aglSetFullScreen(m_aglCtx, m_fullScreenWidth, m_fullScreenHeight, 75, 0) == GL_TRUE ? GHOST_kSuccess : GHOST_kFailure; - /* - if (success == GHOST_kSuccess) { - GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): init full-screen OpenGL succeeded\n"); - } - else { - GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): init full-screen OpenGL failed\n"); - } - */ - } - ::aglDestroyPixelFormat(pixelFormat); + success = ::aglSetDrawable(m_aglCtx, m_grafPtr) == GL_TRUE ? GHOST_kSuccess : GHOST_kFailure; } - break; + else { + //GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): init full-screen OpenGL\n"); + GDHandle device = ::GetMainDevice(); pixelFormat = ::aglChoosePixelFormat(&device, 1, sPreferredFormatFullScreen); + m_aglCtx = ::aglCreateContext(pixelFormat, 0); + if (!m_aglCtx) break; + if (!s_firstaglCtx) s_firstaglCtx = m_aglCtx; + //GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): created OpenGL context\n"); + //::CGGetActiveDisplayList(0, NULL, &m_numDisplays) + success = ::aglSetFullScreen(m_aglCtx, m_fullScreenWidth, m_fullScreenHeight, 75, 0) == GL_TRUE ? GHOST_kSuccess : GHOST_kFailure; +#if 0 + if (success == GHOST_kSuccess) { + GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): init full-screen OpenGL succeeded\n"); + } + else { + GHOST_PRINT("GHOST_WindowCarbon::installDrawingContext(): init full-screen OpenGL failed\n"); + } +#endif + } + ::aglDestroyPixelFormat(pixelFormat); + } + break; case GHOST_kDrawingContextTypeNone: success = GHOST_kSuccess; @@ -532,9 +535,9 @@ GHOST_TSuccess GHOST_WindowCarbon::removeDrawingContext() switch (m_drawingContextType) { case GHOST_kDrawingContextTypeOpenGL: if (m_aglCtx) { - aglSetCurrentContext(NULL); - aglSetDrawable(m_aglCtx, NULL); - //aglDestroyContext(m_aglCtx); + aglSetCurrentContext(NULL); + aglSetDrawable(m_aglCtx, NULL); + //aglDestroyContext(m_aglCtx); if (s_firstaglCtx == m_aglCtx) s_firstaglCtx = NULL; success = ::aglDestroyContext(m_aglCtx) == GL_TRUE ? GHOST_kSuccess : GHOST_kFailure; m_aglCtx = 0; @@ -553,22 +556,22 @@ GHOST_TSuccess GHOST_WindowCarbon::removeDrawingContext() GHOST_TSuccess GHOST_WindowCarbon::invalidate() { GHOST_ASSERT(getValid(), "GHOST_WindowCarbon::invalidate(): window invalid") - if (!m_fullScreen) { - Rect rect; - ::GetPortBounds(m_grafPtr, &rect); - ::InvalWindowRect(m_windowRef, &rect); - } - else { - //EventRef event; - //OSStatus status = ::CreateEvent(NULL, kEventClassWindow, kEventWindowUpdate, 0, 0, &event); - //GHOST_PRINT("GHOST_WindowCarbon::invalidate(): created event " << status << " \n"); - //status = ::SetEventParameter(event, kEventParamDirectObject, typeWindowRef, sizeof(WindowRef), this); - //GHOST_PRINT("GHOST_WindowCarbon::invalidate(): set event parameter " << status << " \n"); - //status = ::PostEventToQueue(::GetMainEventQueue(), event, kEventPriorityStandard); - //status = ::SendEventToEventTarget(event, ::GetApplicationEventTarget()); - //GHOST_PRINT("GHOST_WindowCarbon::invalidate(): added event to queue " << status << " \n"); - m_fullScreenDirty = true; - } + if (!m_fullScreen) { + Rect rect; + ::GetPortBounds(m_grafPtr, &rect); + ::InvalWindowRect(m_windowRef, &rect); + } + else { + //EventRef event; + //OSStatus status = ::CreateEvent(NULL, kEventClassWindow, kEventWindowUpdate, 0, 0, &event); + //GHOST_PRINT("GHOST_WindowCarbon::invalidate(): created event " << status << " \n"); + //status = ::SetEventParameter(event, kEventParamDirectObject, typeWindowRef, sizeof(WindowRef), this); + //GHOST_PRINT("GHOST_WindowCarbon::invalidate(): set event parameter " << status << " \n"); + //status = ::PostEventToQueue(::GetMainEventQueue(), event, kEventPriorityStandard); + //status = ::SendEventToEventTarget(event, ::GetApplicationEventTarget()); + //GHOST_PRINT("GHOST_WindowCarbon::invalidate(): added event to queue " << status << " \n"); + m_fullScreenDirty = true; + } return GHOST_kSuccess; } @@ -578,7 +581,7 @@ void GHOST_WindowCarbon::gen2mac(const STR_String& in, Str255 out) const STR_String tempStr = in; int num = tempStr.Length(); if (num > 255) num = 255; - ::memcpy(out+1, tempStr.Ptr(), num); + ::memcpy(out + 1, tempStr.Ptr(), num); out[0] = num; } @@ -586,7 +589,7 @@ void GHOST_WindowCarbon::gen2mac(const STR_String& in, Str255 out) const void GHOST_WindowCarbon::mac2gen(const Str255 in, STR_String& out) const { char tmp[256]; - ::memcpy(tmp, in+1, in[0]); + ::memcpy(tmp, in + 1, in[0]); tmp[in[0]] = '\0'; out = tmp; } @@ -607,35 +610,36 @@ void GHOST_WindowCarbon::loadCursor(bool visible, GHOST_TStandardCursor cursor) } if (cursor == GHOST_kStandardCursorCustom && m_customCursor) { - ::SetCursor( m_customCursor ); - } else { + ::SetCursor(m_customCursor); + } + else { int carbon_cursor; -#define GCMAP(ghostCursor, carbonCursor) case ghostCursor: carbon_cursor = carbonCursor; break +#define GCMAP(ghostCursor, carbonCursor) case ghostCursor: carbon_cursor = carbonCursor; break switch (cursor) { - default: - GCMAP( GHOST_kStandardCursorDefault, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorRightArrow, kThemeAliasArrowCursor); - GCMAP( GHOST_kStandardCursorLeftArrow, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorInfo, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorDestroy, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorHelp, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorCycle, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorSpray, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorWait, kThemeWatchCursor); - GCMAP( GHOST_kStandardCursorText, kThemeIBeamCursor); - GCMAP( GHOST_kStandardCursorCrosshair, kThemeCrossCursor); - GCMAP( GHOST_kStandardCursorUpDown, kThemeClosedHandCursor); - GCMAP( GHOST_kStandardCursorLeftRight, kThemeClosedHandCursor); - GCMAP( GHOST_kStandardCursorTopSide, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorBottomSide, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorLeftSide, kThemeResizeLeftCursor); - GCMAP( GHOST_kStandardCursorRightSide, kThemeResizeRightCursor); - GCMAP( GHOST_kStandardCursorTopLeftCorner, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorTopRightCorner, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorBottomRightCorner, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorBottomLeftCorner, kThemeArrowCursor); - GCMAP( GHOST_kStandardCursorCopy, kThemeCopyArrowCursor); + default: + GCMAP(GHOST_kStandardCursorDefault, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorRightArrow, kThemeAliasArrowCursor); + GCMAP(GHOST_kStandardCursorLeftArrow, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorInfo, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorDestroy, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorHelp, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorCycle, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorSpray, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorWait, kThemeWatchCursor); + GCMAP(GHOST_kStandardCursorText, kThemeIBeamCursor); + GCMAP(GHOST_kStandardCursorCrosshair, kThemeCrossCursor); + GCMAP(GHOST_kStandardCursorUpDown, kThemeClosedHandCursor); + GCMAP(GHOST_kStandardCursorLeftRight, kThemeClosedHandCursor); + GCMAP(GHOST_kStandardCursorTopSide, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorBottomSide, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorLeftSide, kThemeResizeLeftCursor); + GCMAP(GHOST_kStandardCursorRightSide, kThemeResizeRightCursor); + GCMAP(GHOST_kStandardCursorTopLeftCorner, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorTopRightCorner, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorBottomRightCorner, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorBottomLeftCorner, kThemeArrowCursor); + GCMAP(GHOST_kStandardCursorCopy, kThemeCopyArrowCursor); }; #undef GCMAP @@ -646,7 +650,7 @@ void GHOST_WindowCarbon::loadCursor(bool visible, GHOST_TStandardCursor cursor) bool GHOST_WindowCarbon::getFullScreenDirty() { - return m_fullScreen && m_fullScreenDirty; + return m_fullScreen && m_fullScreenDirty; } @@ -677,9 +681,9 @@ GHOST_TSuccess GHOST_WindowCarbon::setWindowCursorShape(GHOST_TStandardCursor sh /** Reverse the bits in a GHOST_TUns8 */ static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch) { - ch= ((ch>>1)&0x55) | ((ch<<1)&0xAA); - ch= ((ch>>2)&0x33) | ((ch<<2)&0xCC); - ch= ((ch>>4)&0x0F) | ((ch<<4)&0xF0); + ch = ((ch >> 1) & 0x55) | ((ch << 1) & 0xAA); + ch = ((ch >> 2) & 0x33) | ((ch << 2) & 0xCC); + ch = ((ch >> 4) & 0x0F) | ((ch << 4) & 0xF0); return ch; } #endif @@ -688,15 +692,15 @@ static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch) /** Reverse the bits in a GHOST_TUns16 */ static GHOST_TUns16 uns16ReverseBits(GHOST_TUns16 shrt) { - shrt= ((shrt>>1)&0x5555) | ((shrt<<1)&0xAAAA); - shrt= ((shrt>>2)&0x3333) | ((shrt<<2)&0xCCCC); - shrt= ((shrt>>4)&0x0F0F) | ((shrt<<4)&0xF0F0); - shrt= ((shrt>>8)&0x00FF) | ((shrt<<8)&0xFF00); + shrt = ((shrt >> 1) & 0x5555) | ((shrt << 1) & 0xAAAA); + shrt = ((shrt >> 2) & 0x3333) | ((shrt << 2) & 0xCCCC); + shrt = ((shrt >> 4) & 0x0F0F) | ((shrt << 4) & 0xF0F0); + shrt = ((shrt >> 8) & 0x00FF) | ((shrt << 8) & 0xFF00); return shrt; } GHOST_TSuccess GHOST_WindowCarbon::setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, - int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) + int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) { int y; @@ -708,13 +712,13 @@ GHOST_TSuccess GHOST_WindowCarbon::setWindowCustomCursorShape(GHOST_TUns8 *bitma m_customCursor = new Cursor; if (!m_customCursor) return GHOST_kFailure; - for (y=0; y<16; y++) { + for (y = 0; y < 16; y++) { #if !defined(__LITTLE_ENDIAN__) - m_customCursor->data[y] = uns16ReverseBits((bitmap[2*y]<<0) | (bitmap[2*y+1]<<8)); - m_customCursor->mask[y] = uns16ReverseBits((mask[2*y]<<0) | (mask[2*y+1]<<8)); + m_customCursor->data[y] = uns16ReverseBits((bitmap[2 * y] << 0) | (bitmap[2 * y + 1] << 8)); + m_customCursor->mask[y] = uns16ReverseBits((mask[2 * y] << 0) | (mask[2 * y + 1] << 8)); #else - m_customCursor->data[y] = uns16ReverseBits((bitmap[2*y+1]<<0) | (bitmap[2*y]<<8)); - m_customCursor->mask[y] = uns16ReverseBits((mask[2*y+1]<<0) | (mask[2*y]<<8)); + m_customCursor->data[y] = uns16ReverseBits((bitmap[2 * y + 1] << 0) | (bitmap[2 * y] << 8)); + m_customCursor->mask[y] = uns16ReverseBits((mask[2 * y + 1] << 0) | (mask[2 * y] << 8)); #endif } @@ -730,9 +734,9 @@ GHOST_TSuccess GHOST_WindowCarbon::setWindowCustomCursorShape(GHOST_TUns8 *bitma } GHOST_TSuccess GHOST_WindowCarbon::setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], int hotX, int hotY) + GHOST_TUns8 mask[16][2], int hotX, int hotY) { - return setWindowCustomCursorShape((GHOST_TUns8*)bitmap, (GHOST_TUns8*) mask, 16, 16, hotX, hotY, 0, 1); + return setWindowCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *) mask, 16, 16, hotX, hotY, 0, 1); } diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index fbb474cb20a..b7d14873e7b 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -1441,7 +1441,7 @@ static GHOST_TUns16 uns16ReverseBits(GHOST_TUns16 shrt) } GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, - int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) + int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) { int y,nbUns16; NSPoint hotSpotPoint; @@ -1509,7 +1509,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 *bitmap } GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], - GHOST_TUns8 mask[16][2], int hotX, int hotY) + GHOST_TUns8 mask[16][2], int hotX, int hotY) { return setWindowCustomCursorShape((GHOST_TUns8*)bitmap, (GHOST_TUns8*) mask, 16, 16, hotX, hotY, 0, 1); } diff --git a/intern/ghost/intern/GHOST_WindowManager.cpp b/intern/ghost/intern/GHOST_WindowManager.cpp index cf236283b0f..a6211b42fe6 100644 --- a/intern/ghost/intern/GHOST_WindowManager.cpp +++ b/intern/ghost/intern/GHOST_WindowManager.cpp @@ -57,7 +57,7 @@ GHOST_WindowManager::~GHOST_WindowManager() } -GHOST_TSuccess GHOST_WindowManager::addWindow(GHOST_IWindow* window) +GHOST_TSuccess GHOST_WindowManager::addWindow(GHOST_IWindow *window) { GHOST_TSuccess success = GHOST_kFailure; if (window) { @@ -71,7 +71,7 @@ GHOST_TSuccess GHOST_WindowManager::addWindow(GHOST_IWindow* window) } -GHOST_TSuccess GHOST_WindowManager::removeWindow(const GHOST_IWindow* window) +GHOST_TSuccess GHOST_WindowManager::removeWindow(const GHOST_IWindow *window) { GHOST_TSuccess success = GHOST_kFailure; if (window) { @@ -79,7 +79,7 @@ GHOST_TSuccess GHOST_WindowManager::removeWindow(const GHOST_IWindow* window) endFullScreen(); } else { - std::vector::iterator result = find(m_windows.begin(), m_windows.end(), window); + std::vector::iterator result = find(m_windows.begin(), m_windows.end(), window); if (result != m_windows.end()) { setWindowInactive(window); m_windows.erase(result); @@ -91,19 +91,19 @@ GHOST_TSuccess GHOST_WindowManager::removeWindow(const GHOST_IWindow* window) } -bool GHOST_WindowManager::getWindowFound(const GHOST_IWindow* window) const +bool GHOST_WindowManager::getWindowFound(const GHOST_IWindow *window) const { bool found = false; if (window) { - if (getFullScreen() && (window == m_fullScreenWindow)) { - found = true; - } - else { - std::vector::const_iterator result = find(m_windows.begin(), m_windows.end(), window); - if (result != m_windows.end()) { - found = true; - } - } + if (getFullScreen() && (window == m_fullScreenWindow)) { + found = true; + } + else { + std::vector::const_iterator result = find(m_windows.begin(), m_windows.end(), window); + if (result != m_windows.end()) { + found = true; + } + } } return found; } @@ -115,13 +115,13 @@ bool GHOST_WindowManager::getFullScreen(void) const } -GHOST_IWindow* GHOST_WindowManager::getFullScreenWindow(void) const +GHOST_IWindow *GHOST_WindowManager::getFullScreenWindow(void) const { - return m_fullScreenWindow; + return m_fullScreenWindow; } -GHOST_TSuccess GHOST_WindowManager::beginFullScreen(GHOST_IWindow* window, +GHOST_TSuccess GHOST_WindowManager::beginFullScreen(GHOST_IWindow *window, bool stereoVisual) { GHOST_TSuccess success = GHOST_kFailure; @@ -151,13 +151,13 @@ GHOST_TSuccess GHOST_WindowManager::endFullScreen(void) setActiveWindow(m_activeWindowBeforeFullScreen); } } - success = GHOST_kSuccess; + success = GHOST_kSuccess; } return success; } -GHOST_TSuccess GHOST_WindowManager::setActiveWindow(GHOST_IWindow* window) +GHOST_TSuccess GHOST_WindowManager::setActiveWindow(GHOST_IWindow *window) { GHOST_TSuccess success = GHOST_kSuccess; if (window != m_activeWindow) { @@ -172,13 +172,13 @@ GHOST_TSuccess GHOST_WindowManager::setActiveWindow(GHOST_IWindow* window) } -GHOST_IWindow* GHOST_WindowManager::getActiveWindow(void) const +GHOST_IWindow *GHOST_WindowManager::getActiveWindow(void) const { return m_activeWindow; } -void GHOST_WindowManager::setWindowInactive(const GHOST_IWindow* window) +void GHOST_WindowManager::setWindowInactive(const GHOST_IWindow *window) { if (window == m_activeWindow) { m_activeWindow = 0; @@ -192,9 +192,9 @@ std::vector &GHOST_WindowManager::getWindows() } -GHOST_IWindow* GHOST_WindowManager::getWindowAssociatedWithOSWindow(void* osWindow) +GHOST_IWindow *GHOST_WindowManager::getWindowAssociatedWithOSWindow(void *osWindow) { - std::vector::iterator iter; + std::vector::iterator iter; for (iter = m_windows.begin(); iter != m_windows.end(); iter++) { if ((*iter)->getOSWindow() == osWindow) @@ -207,7 +207,7 @@ GHOST_IWindow* GHOST_WindowManager::getWindowAssociatedWithOSWindow(void* osWind bool GHOST_WindowManager::getAnyModifiedState() { bool isAnyModified = false; - std::vector::iterator iter; + std::vector::iterator iter; for (iter = m_windows.begin(); iter != m_windows.end(); iter++) { if ((*iter)->getModifiedState()) diff --git a/intern/ghost/intern/GHOST_WindowSDL.cpp b/intern/ghost/intern/GHOST_WindowSDL.cpp index b8cbf9b474d..369fc4ace14 100644 --- a/intern/ghost/intern/GHOST_WindowSDL.cpp +++ b/intern/ghost/intern/GHOST_WindowSDL.cpp @@ -28,7 +28,7 @@ #include "SDL_mouse.h" #include -static SDL_GLContext s_firstContext= NULL; +static SDL_GLContext s_firstContext = NULL; GHOST_WindowSDL::GHOST_WindowSDL(GHOST_SystemSDL *system, const STR_String& title, @@ -42,18 +42,18 @@ GHOST_WindowSDL::GHOST_WindowSDL(GHOST_SystemSDL *system, const bool stereoVisual, const GHOST_TUns16 numOfAASamples ) - : - GHOST_Window(width,height,state,type,stereoVisual,numOfAASamples), - m_system (system), - m_invalid_window(false), - m_sdl_custom_cursor(NULL) + : + GHOST_Window(width, height, state, type, stereoVisual, numOfAASamples), + m_system(system), + m_invalid_window(false), + m_sdl_custom_cursor(NULL) { - m_sdl_win= SDL_CreateWindow(title, - left, - top, - width, - height, - SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN); + m_sdl_win = SDL_CreateWindow(title, + left, + top, + width, + height, + SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); @@ -64,7 +64,7 @@ GHOST_WindowSDL::GHOST_WindowSDL(GHOST_SystemSDL *system, SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); - m_sdl_glcontext= SDL_GL_CreateContext(m_sdl_win); + m_sdl_glcontext = SDL_GL_CreateContext(m_sdl_win); //fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n", // theEvent->error_code, theEvent->request_code); @@ -74,7 +74,7 @@ GHOST_WindowSDL::GHOST_WindowSDL(GHOST_SystemSDL *system, GHOST_WindowSDL::~GHOST_WindowSDL() { - if(m_sdl_custom_cursor) { + if (m_sdl_custom_cursor) { SDL_FreeCursor(m_sdl_custom_cursor); } @@ -92,29 +92,29 @@ GHOST_WindowSDL::installDrawingContext(GHOST_TDrawingContextType type) // only support openGL for now. GHOST_TSuccess success; switch (type) { - case GHOST_kDrawingContextTypeOpenGL: - m_sdl_glcontext= SDL_GL_CreateContext(m_sdl_win); + case GHOST_kDrawingContextTypeOpenGL: + m_sdl_glcontext = SDL_GL_CreateContext(m_sdl_win); - if (m_sdl_glcontext != NULL) { - if (!s_firstContext) { - s_firstContext= m_sdl_glcontext; + if (m_sdl_glcontext != NULL) { + if (!s_firstContext) { + s_firstContext = m_sdl_glcontext; + } + + success = (SDL_GL_MakeCurrent(m_sdl_win, m_sdl_glcontext) < 0) ? + GHOST_kFailure : GHOST_kSuccess; + } + else { + success = GHOST_kFailure; } - success= (SDL_GL_MakeCurrent(m_sdl_win, m_sdl_glcontext) < 0) ? - GHOST_kFailure : GHOST_kSuccess; - } - else { - success= GHOST_kFailure; - } + break; - break; + case GHOST_kDrawingContextTypeNone: + success = GHOST_kSuccess; + break; - case GHOST_kDrawingContextTypeNone: - success= GHOST_kSuccess; - break; - - default: - success= GHOST_kFailure; + default: + success = GHOST_kFailure; } return success; } @@ -138,7 +138,7 @@ GHOST_WindowSDL::invalidate(void) if (m_invalid_window == false) { m_system->addDirtyWindow(this); - m_invalid_window= true; + m_invalid_window = true; } return GHOST_kSuccess; @@ -161,8 +161,8 @@ GHOST_WindowSDL::swapBuffers() GHOST_TSuccess GHOST_WindowSDL::activateDrawingContext() { - if (m_sdl_glcontext !=NULL) { - int status=SDL_GL_MakeCurrent(m_sdl_win, m_sdl_glcontext); + if (m_sdl_glcontext != NULL) { + int status = SDL_GL_MakeCurrent(m_sdl_win, m_sdl_glcontext); (void)status; return GHOST_kSuccess; } @@ -177,10 +177,10 @@ GHOST_WindowSDL::removeDrawingContext() if (m_sdl_glcontext != NULL) { SDL_GL_DeleteContext(m_sdl_glcontext); - success= GHOST_kSuccess; + success = GHOST_kSuccess; } else { - success= GHOST_kFailure; + success = GHOST_kFailure; } return success; } @@ -189,23 +189,23 @@ GHOST_WindowSDL::removeDrawingContext() GHOST_TSuccess GHOST_WindowSDL::setState(GHOST_TWindowState state) { - switch(state) { - case GHOST_kWindowStateNormal: - SDL_SetWindowFullscreen(m_sdl_win, SDL_FALSE); - SDL_RestoreWindow(m_sdl_win); - break; - case GHOST_kWindowStateMaximized: - SDL_SetWindowFullscreen(m_sdl_win, SDL_FALSE); - SDL_MaximizeWindow(m_sdl_win); - break; - case GHOST_kWindowStateMinimized: - SDL_MinimizeWindow(m_sdl_win); - break; - case GHOST_kWindowStateFullScreen: - SDL_SetWindowFullscreen(m_sdl_win, SDL_TRUE); - break; - default: - break; + switch (state) { + case GHOST_kWindowStateNormal: + SDL_SetWindowFullscreen(m_sdl_win, SDL_FALSE); + SDL_RestoreWindow(m_sdl_win); + break; + case GHOST_kWindowStateMaximized: + SDL_SetWindowFullscreen(m_sdl_win, SDL_FALSE); + SDL_MaximizeWindow(m_sdl_win); + break; + case GHOST_kWindowStateMinimized: + SDL_MinimizeWindow(m_sdl_win); + break; + case GHOST_kWindowStateFullScreen: + SDL_SetWindowFullscreen(m_sdl_win, SDL_TRUE); + break; + default: + break; } return GHOST_kSuccess; @@ -215,11 +215,11 @@ GHOST_WindowSDL::setState(GHOST_TWindowState state) GHOST_TWindowState GHOST_WindowSDL::getState() const { - Uint32 flags= SDL_GetWindowFlags(m_sdl_win); + Uint32 flags = SDL_GetWindowFlags(m_sdl_win); - if(flags & SDL_WINDOW_FULLSCREEN) return GHOST_kWindowStateFullScreen; - else if(flags & SDL_WINDOW_MAXIMIZED) return GHOST_kWindowStateMaximized; - else if(flags & SDL_WINDOW_MINIMIZED) return GHOST_kWindowStateMinimized; + if (flags & SDL_WINDOW_FULLSCREEN) return GHOST_kWindowStateFullScreen; + else if (flags & SDL_WINDOW_MAXIMIZED) return GHOST_kWindowStateMaximized; + else if (flags & SDL_WINDOW_MINIMIZED) return GHOST_kWindowStateMinimized; return GHOST_kWindowStateNormal; } @@ -234,7 +234,7 @@ GHOST_WindowSDL::setTitle(const STR_String& title) void GHOST_WindowSDL::getTitle(STR_String& title) const { - title= SDL_GetWindowTitle(m_sdl_win); + title = SDL_GetWindowTitle(m_sdl_win); } @@ -252,10 +252,10 @@ GHOST_WindowSDL::getClientBounds(GHOST_Rect& bounds) const SDL_GetWindowSize(m_sdl_win, &w, &h); SDL_GetWindowPosition(m_sdl_win, &x, &y); - bounds.m_l= x; - bounds.m_r= x + w; - bounds.m_t= y; - bounds.m_b= y + h; + bounds.m_l = x; + bounds.m_r = x + w; + bounds.m_t = y; + bounds.m_b = y + h; } GHOST_TSuccess @@ -278,14 +278,14 @@ GHOST_WindowSDL::setClientHeight(GHOST_TUns32 height) GHOST_TSuccess GHOST_WindowSDL::setClientSize(GHOST_TUns32 width, - GHOST_TUns32 height) + GHOST_TUns32 height) { SDL_SetWindowSize(m_sdl_win, width, height); return GHOST_kSuccess; } void -GHOST_WindowSDL::screenToClient( GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY ) const +GHOST_WindowSDL::screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const { /* XXXSDL_WEAK_ABS_COORDS */ int x_win, y_win; @@ -295,7 +295,7 @@ GHOST_WindowSDL::screenToClient( GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt3 outY = inY - y_win; } void -GHOST_WindowSDL::clientToScreen( GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY ) const +GHOST_WindowSDL::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const { /* XXXSDL_WEAK_ABS_COORDS */ int x_win, y_win; @@ -306,148 +306,148 @@ GHOST_WindowSDL::clientToScreen( GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt3 } /* mouse cursor */ -static unsigned char sdl_std_cursor_mask_xterm[]= {0xef,0x01,0xff,0x01,0xff,0x01,0x7c,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x7c,0x00,0xff,0x01,0xff,0x01,0xef,0x01,}; -static unsigned char sdl_std_cursor_xterm[]= {0x00,0x77,0x00,0x1c,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x1c,0x00,0x77,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_xterm[] = {0xef, 0x01, 0xff, 0x01, 0xff, 0x01, 0x7c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xff, 0x01, 0xff, 0x01, 0xef, 0x01, }; +static unsigned char sdl_std_cursor_xterm[] = {0x00, 0x77, 0x00, 0x1c, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_xterm 9 #define sdl_std_cursor_HEIGHT_xterm 16 #define sdl_std_cursor_HOT_X_xterm -3 #define sdl_std_cursor_HOT_Y_xterm -7 -static unsigned char sdl_std_cursor_mask_watch[]= {0xfc,0x0f,0xfc,0x0f,0xfc,0x0f,0xfe,0x1f,0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0x1f,0xfc,0x0f,0xfc,0x0f,0xfc,0x0f,}; -static unsigned char sdl_std_cursor_watch[]= {0xf8,0x07,0xf8,0x07,0xf8,0x07,0xfc,0x0f,0x86,0x18,0x83,0x30,0x81,0xe0,0xc1,0xe1,0xc1,0xe1,0x21,0xe0,0x13,0x30,0x06,0x18,0xfc,0x0f,0xf8,0x07,0xf8,0x07,0xf8,0x07,}; +static unsigned char sdl_std_cursor_mask_watch[] = {0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfe, 0x1f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0x1f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, }; +static unsigned char sdl_std_cursor_watch[] = {0xf8, 0x07, 0xf8, 0x07, 0xf8, 0x07, 0xfc, 0x0f, 0x86, 0x18, 0x83, 0x30, 0x81, 0xe0, 0xc1, 0xe1, 0xc1, 0xe1, 0x21, 0xe0, 0x13, 0x30, 0x06, 0x18, 0xfc, 0x0f, 0xf8, 0x07, 0xf8, 0x07, 0xf8, 0x07, }; #define sdl_std_cursor_WIDTH_watch 16 #define sdl_std_cursor_HEIGHT_watch 16 #define sdl_std_cursor_HOT_X_watch -15 #define sdl_std_cursor_HOT_Y_watch -7 -static unsigned char sdl_std_cursor_mask_umbrella[]= {0xe8,0x76,0xfb,0xdf,0xfd,0x3f,0xfe,0xff,0xff,0x3f,0xff,0xff,0xcf,0x79,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x07,0xc0,0x07,0xc0,0x07,0xc0,0x07,0x80,0x03,}; -static unsigned char sdl_std_cursor_umbrella[]= {0x88,0x04,0x20,0x0a,0xc9,0x32,0xf2,0x09,0x4c,0x06,0x43,0x18,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x01,0x40,0x01,0x80,0x00,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_umbrella[] = {0xe8, 0x76, 0xfb, 0xdf, 0xfd, 0x3f, 0xfe, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xcf, 0x79, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x07, 0x80, 0x03, }; +static unsigned char sdl_std_cursor_umbrella[] = {0x88, 0x04, 0x20, 0x0a, 0xc9, 0x32, 0xf2, 0x09, 0x4c, 0x06, 0x43, 0x18, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x01, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_umbrella 16 #define sdl_std_cursor_HEIGHT_umbrella 16 #define sdl_std_cursor_HOT_X_umbrella -7 #define sdl_std_cursor_HOT_Y_umbrella -12 -static unsigned char sdl_std_cursor_mask_top_side[]= {0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xc0,0x01,0xe0,0x03,0xf0,0x07,0xf8,0x0f,0xdc,0x1d,0xcc,0x19,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,}; -static unsigned char sdl_std_cursor_top_side[]= {0xff,0x1f,0xff,0x1f,0x00,0x00,0x40,0x00,0xe0,0x00,0x50,0x01,0x48,0x02,0x44,0x04,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_top_side[] = {0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0xdc, 0x1d, 0xcc, 0x19, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, }; +static unsigned char sdl_std_cursor_top_side[] = {0xff, 0x1f, 0xff, 0x1f, 0x00, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x50, 0x01, 0x48, 0x02, 0x44, 0x04, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_top_side 15 #define sdl_std_cursor_HEIGHT_top_side 16 #define sdl_std_cursor_HOT_X_top_side -6 #define sdl_std_cursor_HOT_Y_top_side -14 -static unsigned char sdl_std_cursor_mask_top_right_corner[]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf0,0xfc,0xf7,0xfc,0xf7,0xfc,0xf7,0xc0,0xf7,0xe0,0xf7,0x70,0xf7,0x38,0xf7,0x1c,0xf7,0x0c,0xf7,0x00,0xf0,0x00,0xf0,}; -static unsigned char sdl_std_cursor_top_right_corner[]= {0xff,0x3f,0xff,0x3f,0x00,0x30,0x00,0x30,0x00,0x30,0xfc,0x31,0x80,0x31,0x40,0x31,0x20,0x31,0x10,0x31,0x08,0x31,0x04,0x31,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_top_right_corner[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xfc, 0xf7, 0xfc, 0xf7, 0xfc, 0xf7, 0xc0, 0xf7, 0xe0, 0xf7, 0x70, 0xf7, 0x38, 0xf7, 0x1c, 0xf7, 0x0c, 0xf7, 0x00, 0xf0, 0x00, 0xf0, }; +static unsigned char sdl_std_cursor_top_right_corner[] = {0xff, 0x3f, 0xff, 0x3f, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0xfc, 0x31, 0x80, 0x31, 0x40, 0x31, 0x20, 0x31, 0x10, 0x31, 0x08, 0x31, 0x04, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_top_right_corner 16 #define sdl_std_cursor_HEIGHT_top_right_corner 16 #define sdl_std_cursor_HOT_X_top_right_corner -13 #define sdl_std_cursor_HOT_Y_top_right_corner -14 -static unsigned char sdl_std_cursor_mask_top_left_corner[]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xef,0x3f,0xef,0x3f,0xef,0x3f,0xef,0x03,0xef,0x07,0xef,0x0e,0xef,0x1c,0xef,0x38,0xef,0x30,0x0f,0x00,0x0f,0x00,}; -static unsigned char sdl_std_cursor_top_left_corner[]= {0xff,0x3f,0xff,0x3f,0x03,0x00,0x03,0x00,0x03,0x00,0xe3,0x0f,0x63,0x00,0xa3,0x00,0x23,0x01,0x23,0x02,0x23,0x04,0x23,0x08,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_top_left_corner[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xef, 0x3f, 0xef, 0x3f, 0xef, 0x3f, 0xef, 0x03, 0xef, 0x07, 0xef, 0x0e, 0xef, 0x1c, 0xef, 0x38, 0xef, 0x30, 0x0f, 0x00, 0x0f, 0x00, }; +static unsigned char sdl_std_cursor_top_left_corner[] = {0xff, 0x3f, 0xff, 0x3f, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xe3, 0x0f, 0x63, 0x00, 0xa3, 0x00, 0x23, 0x01, 0x23, 0x02, 0x23, 0x04, 0x23, 0x08, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_top_left_corner 16 #define sdl_std_cursor_HEIGHT_top_left_corner 16 #define sdl_std_cursor_HOT_X_top_left_corner 0 #define sdl_std_cursor_HOT_Y_top_left_corner -14 -static unsigned char sdl_std_cursor_mask_spraycan[]= {0x00,0x0c,0x18,0x0d,0x7c,0x0d,0x7c,0x0d,0x7e,0x0d,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,}; -static unsigned char sdl_std_cursor_spraycan[]= {0x00,0x06,0x80,0x00,0x2c,0x06,0x9e,0x00,0x16,0x06,0x3f,0x00,0x21,0x00,0x27,0x00,0x25,0x00,0x27,0x00,0x25,0x00,0x27,0x00,0x27,0x00,0x21,0x00,0x21,0x00,0x3f,0x00,}; +static unsigned char sdl_std_cursor_mask_spraycan[] = {0x00, 0x0c, 0x18, 0x0d, 0x7c, 0x0d, 0x7c, 0x0d, 0x7e, 0x0d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, }; +static unsigned char sdl_std_cursor_spraycan[] = {0x00, 0x06, 0x80, 0x00, 0x2c, 0x06, 0x9e, 0x00, 0x16, 0x06, 0x3f, 0x00, 0x21, 0x00, 0x27, 0x00, 0x25, 0x00, 0x27, 0x00, 0x25, 0x00, 0x27, 0x00, 0x27, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3f, 0x00, }; #define sdl_std_cursor_WIDTH_spraycan 12 #define sdl_std_cursor_HEIGHT_spraycan 16 #define sdl_std_cursor_HOT_X_spraycan -9 #define sdl_std_cursor_HOT_Y_spraycan -14 -static unsigned char sdl_std_cursor_mask_sb_v_double_arrow[]= {0x38,0x00,0x7c,0x00,0xfe,0x00,0xff,0x01,0xff,0x01,0x7c,0x00,0x7c,0x00,0x7c,0x00,0x7c,0x00,0x7c,0x00,0xff,0x01,0xff,0x01,0xfe,0x00,0x7c,0x00,0x38,0x00,}; -static unsigned char sdl_std_cursor_sb_v_double_arrow[]= {0x10,0x00,0x38,0x00,0x7c,0x00,0xfe,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0xfe,0x00,0x7c,0x00,0x38,0x00,0x10,0x00,}; +static unsigned char sdl_std_cursor_mask_sb_v_double_arrow[] = {0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0xff, 0x01, 0xff, 0x01, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0xff, 0x01, 0xff, 0x01, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, }; +static unsigned char sdl_std_cursor_sb_v_double_arrow[] = {0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00, }; #define sdl_std_cursor_WIDTH_sb_v_double_arrow 9 #define sdl_std_cursor_HEIGHT_sb_v_double_arrow 15 #define sdl_std_cursor_HOT_X_sb_v_double_arrow -3 #define sdl_std_cursor_HOT_Y_sb_v_double_arrow -8 -static unsigned char sdl_std_cursor_mask_sb_h_double_arrow[]= {0x18,0x0c,0x1c,0x1c,0xfe,0x3f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xfe,0x3f,0x1c,0x1c,0x18,0x0c,}; -static unsigned char sdl_std_cursor_sb_h_double_arrow[]= {0x00,0x00,0x08,0x08,0x0c,0x18,0xfe,0x3f,0x0f,0x78,0xfe,0x3f,0x0c,0x18,0x08,0x08,0x00,0x00}; +static unsigned char sdl_std_cursor_mask_sb_h_double_arrow[] = {0x18, 0x0c, 0x1c, 0x1c, 0xfe, 0x3f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x3f, 0x1c, 0x1c, 0x18, 0x0c, }; +static unsigned char sdl_std_cursor_sb_h_double_arrow[] = {0x00, 0x00, 0x08, 0x08, 0x0c, 0x18, 0xfe, 0x3f, 0x0f, 0x78, 0xfe, 0x3f, 0x0c, 0x18, 0x08, 0x08, 0x00, 0x00}; #define sdl_std_cursor_WIDTH_sb_h_double_arrow 15 #define sdl_std_cursor_HEIGHT_sb_h_double_arrow 9 #define sdl_std_cursor_HOT_X_sb_h_double_arrow -7 #define sdl_std_cursor_HOT_Y_sb_h_double_arrow -4 -static unsigned char sdl_std_cursor_mask_right_side[]= {0x00,0xf0,0x00,0xf0,0xc0,0xf0,0xc0,0xf1,0x80,0xf3,0x00,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf7,0x80,0xf3,0xc0,0xf1,0xc0,0xf0,0x00,0xf0,0x00,0xf0,}; -static unsigned char sdl_std_cursor_right_side[]= {0x00,0x30,0x00,0x30,0x40,0x30,0x80,0x30,0x00,0x31,0x00,0x32,0xff,0x37,0x00,0x32,0x00,0x31,0x80,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_right_side[] = {0x00, 0xf0, 0x00, 0xf0, 0xc0, 0xf0, 0xc0, 0xf1, 0x80, 0xf3, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf7, 0x80, 0xf3, 0xc0, 0xf1, 0xc0, 0xf0, 0x00, 0xf0, 0x00, 0xf0, }; +static unsigned char sdl_std_cursor_right_side[] = {0x00, 0x30, 0x00, 0x30, 0x40, 0x30, 0x80, 0x30, 0x00, 0x31, 0x00, 0x32, 0xff, 0x37, 0x00, 0x32, 0x00, 0x31, 0x80, 0x30, 0x40, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_right_side 16 #define sdl_std_cursor_HEIGHT_right_side 15 #define sdl_std_cursor_HOT_X_right_side -13 #define sdl_std_cursor_HOT_Y_right_side -7 -static unsigned char sdl_std_cursor_mask_right_ptr[]= {0x00,0x03,0x80,0x03,0xc0,0x03,0xe0,0x03,0xf0,0x03,0xf8,0x03,0xfc,0x03,0xfe,0x03,0xff,0x03,0xff,0x03,0xf8,0x03,0xbc,0x03,0x3c,0x03,0x1e,0x00,0x1e,0x00,0x0c,0x00,}; -static unsigned char sdl_std_cursor_right_ptr[]= {0x00,0x80,0x00,0xc0,0x00,0xe0,0x00,0xf0,0x00,0xf8,0x00,0xfc,0x00,0xfe,0x00,0xff,0x00,0xf8,0x00,0xd8,0x00,0x8c,0x00,0x0c,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_right_ptr[] = {0x00, 0x03, 0x80, 0x03, 0xc0, 0x03, 0xe0, 0x03, 0xf0, 0x03, 0xf8, 0x03, 0xfc, 0x03, 0xfe, 0x03, 0xff, 0x03, 0xff, 0x03, 0xf8, 0x03, 0xbc, 0x03, 0x3c, 0x03, 0x1e, 0x00, 0x1e, 0x00, 0x0c, 0x00, }; +static unsigned char sdl_std_cursor_right_ptr[] = {0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xf8, 0x00, 0xd8, 0x00, 0x8c, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_right_ptr 10 #define sdl_std_cursor_HEIGHT_right_ptr 16 #define sdl_std_cursor_HOT_X_right_ptr -7 #define sdl_std_cursor_HOT_Y_right_ptr -14 -static unsigned char sdl_std_cursor_mask_question_arrow[]= {0xf8,0x00,0xfc,0x01,0xfe,0x03,0xff,0x07,0x8f,0x07,0x9f,0x07,0xde,0x07,0xfc,0x03,0xf8,0x01,0xf8,0x00,0xf8,0x00,0xfc,0x01,0xfe,0x03,0xfc,0x01,0xf8,0x00,0x70,0x00,}; -static unsigned char sdl_std_cursor_question_arrow[]= {0x7c,0x00,0xfe,0x00,0xc7,0x01,0x83,0x01,0x87,0x01,0xc6,0x01,0xe0,0x00,0x78,0x00,0x38,0x00,0x28,0x00,0x28,0x00,0xee,0x00,0x6c,0x00,0x38,0x00,0x10,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_question_arrow[] = {0xf8, 0x00, 0xfc, 0x01, 0xfe, 0x03, 0xff, 0x07, 0x8f, 0x07, 0x9f, 0x07, 0xde, 0x07, 0xfc, 0x03, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xfc, 0x01, 0xfe, 0x03, 0xfc, 0x01, 0xf8, 0x00, 0x70, 0x00, }; +static unsigned char sdl_std_cursor_question_arrow[] = {0x7c, 0x00, 0xfe, 0x00, 0xc7, 0x01, 0x83, 0x01, 0x87, 0x01, 0xc6, 0x01, 0xe0, 0x00, 0x78, 0x00, 0x38, 0x00, 0x28, 0x00, 0x28, 0x00, 0xee, 0x00, 0x6c, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_question_arrow 11 #define sdl_std_cursor_HEIGHT_question_arrow 16 #define sdl_std_cursor_HOT_X_question_arrow -4 #define sdl_std_cursor_HOT_Y_question_arrow -8 -static unsigned char sdl_std_cursor_mask_pirate[]= {0xf0,0x03,0xf8,0x07,0xfc,0x0f,0xfe,0x1f,0xfe,0x1f,0xfc,0x0f,0xf8,0x07,0xf1,0x83,0xf1,0xe3,0xf3,0xf3,0xef,0x39,0x1e,0x1e,0xe0,0x01,0xfe,0xc7,0xff,0xff,0x0f,0x7c,}; -static unsigned char sdl_std_cursor_pirate[]= {0xe0,0x01,0xf0,0x03,0xf8,0x07,0xcc,0x0c,0xcc,0x0c,0xf8,0x07,0xf0,0x03,0xe0,0x01,0xe1,0x21,0xe1,0x61,0xc2,0x10,0x1c,0x0e,0xe0,0x01,0xf8,0x47,0x0f,0x7c,0x01,0x20,}; +static unsigned char sdl_std_cursor_mask_pirate[] = {0xf0, 0x03, 0xf8, 0x07, 0xfc, 0x0f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfc, 0x0f, 0xf8, 0x07, 0xf1, 0x83, 0xf1, 0xe3, 0xf3, 0xf3, 0xef, 0x39, 0x1e, 0x1e, 0xe0, 0x01, 0xfe, 0xc7, 0xff, 0xff, 0x0f, 0x7c, }; +static unsigned char sdl_std_cursor_pirate[] = {0xe0, 0x01, 0xf0, 0x03, 0xf8, 0x07, 0xcc, 0x0c, 0xcc, 0x0c, 0xf8, 0x07, 0xf0, 0x03, 0xe0, 0x01, 0xe1, 0x21, 0xe1, 0x61, 0xc2, 0x10, 0x1c, 0x0e, 0xe0, 0x01, 0xf8, 0x47, 0x0f, 0x7c, 0x01, 0x20, }; #define sdl_std_cursor_WIDTH_pirate 16 #define sdl_std_cursor_HEIGHT_pirate 16 #define sdl_std_cursor_HOT_X_pirate -7 #define sdl_std_cursor_HOT_Y_pirate -4 -static unsigned char sdl_std_cursor_mask_left_side[]= {0x0f,0x00,0x0f,0x00,0x0f,0x03,0x8f,0x03,0xcf,0x01,0xef,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0x00,0xcf,0x01,0x8f,0x03,0x0f,0x03,0x0f,0x00,0x0f,0x00,}; -static unsigned char sdl_std_cursor_left_side[]= {0x03,0x00,0x03,0x00,0x83,0x00,0x43,0x00,0x23,0x00,0x13,0x00,0xfb,0x3f,0x13,0x00,0x23,0x00,0x43,0x00,0x83,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_left_side[] = {0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x03, 0x8f, 0x03, 0xcf, 0x01, 0xef, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x00, 0xcf, 0x01, 0x8f, 0x03, 0x0f, 0x03, 0x0f, 0x00, 0x0f, 0x00, }; +static unsigned char sdl_std_cursor_left_side[] = {0x03, 0x00, 0x03, 0x00, 0x83, 0x00, 0x43, 0x00, 0x23, 0x00, 0x13, 0x00, 0xfb, 0x3f, 0x13, 0x00, 0x23, 0x00, 0x43, 0x00, 0x83, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_left_side 16 #define sdl_std_cursor_HEIGHT_left_side 15 #define sdl_std_cursor_HOT_X_left_side 0 #define sdl_std_cursor_HOT_Y_left_side -7 -static unsigned char sdl_std_cursor_mask_left_ptr[]= {0x03,0x00,0x07,0x00,0x0f,0x00,0x1f,0x00,0x3f,0x00,0x7f,0x00,0xff,0x00,0xff,0x01,0xff,0x03,0xff,0x03,0x7f,0x00,0xf7,0x00,0xf3,0x00,0xe0,0x01,0xe0,0x01,0xc0,0x00,}; -static unsigned char sdl_std_cursor_left_ptr[]= {0x00,0x00,0x02,0x00,0x06,0x00,0x0e,0x00,0x1e,0x00,0x3e,0x00,0x7e,0x00,0xfe,0x00,0xfe,0x00,0x3e,0x00,0x36,0x00,0x62,0x00,0x60,0x00,0xc0,0x00,0xc0,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_left_ptr[] = {0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x7f, 0x00, 0xff, 0x00, 0xff, 0x01, 0xff, 0x03, 0xff, 0x03, 0x7f, 0x00, 0xf7, 0x00, 0xf3, 0x00, 0xe0, 0x01, 0xe0, 0x01, 0xc0, 0x00, }; +static unsigned char sdl_std_cursor_left_ptr[] = {0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x3e, 0x00, 0x36, 0x00, 0x62, 0x00, 0x60, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_left_ptr 10 #define sdl_std_cursor_HEIGHT_left_ptr 16 #define sdl_std_cursor_HOT_X_left_ptr -8 #define sdl_std_cursor_HOT_Y_left_ptr -14 -static unsigned char sdl_std_cursor_mask_exchange[]= {0xe3,0x07,0xf7,0x0f,0xff,0x1f,0xff,0x3f,0x3f,0x38,0xff,0x30,0xff,0x00,0xff,0x00,0x00,0xff,0x00,0xff,0x0c,0xfe,0x1c,0xfc,0xfc,0xff,0xf8,0xff,0xf0,0xef,0xe0,0xc7,}; -static unsigned char sdl_std_cursor_exchange[]= {0xf1,0x03,0xfb,0x07,0x1f,0x0c,0x09,0x08,0x19,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x26,0x04,0x24,0x0c,0x3e,0xf8,0x37,0xf0,0x23,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_exchange[] = {0xe3, 0x07, 0xf7, 0x0f, 0xff, 0x1f, 0xff, 0x3f, 0x3f, 0x38, 0xff, 0x30, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x0c, 0xfe, 0x1c, 0xfc, 0xfc, 0xff, 0xf8, 0xff, 0xf0, 0xef, 0xe0, 0xc7, }; +static unsigned char sdl_std_cursor_exchange[] = {0xf1, 0x03, 0xfb, 0x07, 0x1f, 0x0c, 0x09, 0x08, 0x19, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x26, 0x04, 0x24, 0x0c, 0x3e, 0xf8, 0x37, 0xf0, 0x23, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_exchange 16 #define sdl_std_cursor_HEIGHT_exchange 16 #define sdl_std_cursor_HOT_X_exchange -6 #define sdl_std_cursor_HOT_Y_exchange -8 -static unsigned char sdl_std_cursor_mask_crosshair[]= {0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,}; -static unsigned char sdl_std_cursor_crosshair[]= {0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7f,0xff,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_crosshair[] = {0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, }; +static unsigned char sdl_std_cursor_crosshair[] = {0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_crosshair 16 #define sdl_std_cursor_HEIGHT_crosshair 16 #define sdl_std_cursor_HOT_X_crosshair -7 #define sdl_std_cursor_HOT_Y_crosshair -8 -static unsigned char sdl_std_cursor_mask_bottom_side[]= {0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xc0,0x01,0xcc,0x19,0xdc,0x1d,0xf8,0x0f,0xf0,0x07,0xe0,0x03,0xc0,0x01,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,}; -static unsigned char sdl_std_cursor_bottom_side[]= {0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x44,0x04,0x48,0x02,0x50,0x01,0xe0,0x00,0x40,0x00,0x00,0x00,0xff,0x1f,0xff,0x1f,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_bottom_side[] = {0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xcc, 0x19, 0xdc, 0x1d, 0xf8, 0x0f, 0xf0, 0x07, 0xe0, 0x03, 0xc0, 0x01, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, }; +static unsigned char sdl_std_cursor_bottom_side[] = {0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x04, 0x48, 0x02, 0x50, 0x01, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0xff, 0x1f, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_bottom_side 15 #define sdl_std_cursor_HEIGHT_bottom_side 16 #define sdl_std_cursor_HOT_X_bottom_side -6 #define sdl_std_cursor_HOT_Y_bottom_side -1 -static unsigned char sdl_std_cursor_mask_bottom_right_corner[]= {0x00,0xf0,0x00,0xf0,0x0c,0xf7,0x1c,0xf7,0x38,0xf7,0x70,0xf7,0xe0,0xf7,0xc0,0xf7,0xfc,0xf7,0xfc,0xf7,0xfc,0xf7,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}; -static unsigned char sdl_std_cursor_bottom_right_corner[]= {0x00,0x30,0x00,0x30,0x04,0x31,0x08,0x31,0x10,0x31,0x20,0x31,0x40,0x31,0x80,0x31,0xfc,0x31,0x00,0x30,0x00,0x30,0x00,0x30,0xff,0x3f,0xff,0x3f,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_bottom_right_corner[] = {0x00, 0xf0, 0x00, 0xf0, 0x0c, 0xf7, 0x1c, 0xf7, 0x38, 0xf7, 0x70, 0xf7, 0xe0, 0xf7, 0xc0, 0xf7, 0xfc, 0xf7, 0xfc, 0xf7, 0xfc, 0xf7, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; +static unsigned char sdl_std_cursor_bottom_right_corner[] = {0x00, 0x30, 0x00, 0x30, 0x04, 0x31, 0x08, 0x31, 0x10, 0x31, 0x20, 0x31, 0x40, 0x31, 0x80, 0x31, 0xfc, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_bottom_right_corner 16 #define sdl_std_cursor_HEIGHT_bottom_right_corner 16 #define sdl_std_cursor_HOT_X_bottom_right_corner -13 #define sdl_std_cursor_HOT_Y_bottom_right_corner -1 -static unsigned char sdl_std_cursor_mask_bottom_left_corner[]= {0x0f,0x00,0x0f,0x00,0xef,0x30,0xef,0x38,0xef,0x1c,0xef,0x0e,0xef,0x07,0xef,0x03,0xef,0x3f,0xef,0x3f,0xef,0x3f,0x0f,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}; -static unsigned char sdl_std_cursor_bottom_left_corner[]= {0x03,0x00,0x03,0x00,0x23,0x08,0x23,0x04,0x23,0x02,0x23,0x01,0xa3,0x00,0x63,0x00,0xe3,0x0f,0x03,0x00,0x03,0x00,0x03,0x00,0xff,0x3f,0xff,0x3f,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_bottom_left_corner[] = {0x0f, 0x00, 0x0f, 0x00, 0xef, 0x30, 0xef, 0x38, 0xef, 0x1c, 0xef, 0x0e, 0xef, 0x07, 0xef, 0x03, 0xef, 0x3f, 0xef, 0x3f, 0xef, 0x3f, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; +static unsigned char sdl_std_cursor_bottom_left_corner[] = {0x03, 0x00, 0x03, 0x00, 0x23, 0x08, 0x23, 0x04, 0x23, 0x02, 0x23, 0x01, 0xa3, 0x00, 0x63, 0x00, 0xe3, 0x0f, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_bottom_left_corner 16 #define sdl_std_cursor_HEIGHT_bottom_left_corner 16 #define sdl_std_cursor_HOT_X_bottom_left_corner 0 #define sdl_std_cursor_HOT_Y_bottom_left_corner -1 -static unsigned char sdl_std_cursor_mask_arrow[]= {0x00,0xe0,0x00,0xf8,0x00,0xfe,0x80,0x7f,0xe0,0x7f,0xf8,0x3f,0xfc,0x3f,0xfc,0x1f,0xe0,0x1f,0xf0,0x0f,0xf8,0x0f,0x7c,0x07,0x3e,0x07,0x1f,0x02,0x0e,0x00,0x04,0x00,}; -static unsigned char sdl_std_cursor_arrow[]= {0x00,0x30,0x00,0x3c,0x00,0x1f,0xc0,0x1f,0xf0,0x0f,0xfc,0x0f,0xc0,0x07,0xe0,0x07,0x70,0x03,0x38,0x03,0x1c,0x01,0x0e,0x01,0x07,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}; +static unsigned char sdl_std_cursor_mask_arrow[] = {0x00, 0xe0, 0x00, 0xf8, 0x00, 0xfe, 0x80, 0x7f, 0xe0, 0x7f, 0xf8, 0x3f, 0xfc, 0x3f, 0xfc, 0x1f, 0xe0, 0x1f, 0xf0, 0x0f, 0xf8, 0x0f, 0x7c, 0x07, 0x3e, 0x07, 0x1f, 0x02, 0x0e, 0x00, 0x04, 0x00, }; +static unsigned char sdl_std_cursor_arrow[] = {0x00, 0x30, 0x00, 0x3c, 0x00, 0x1f, 0xc0, 0x1f, 0xf0, 0x0f, 0xfc, 0x0f, 0xc0, 0x07, 0xe0, 0x07, 0x70, 0x03, 0x38, 0x03, 0x1c, 0x01, 0x0e, 0x01, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }; #define sdl_std_cursor_WIDTH_arrow 16 #define sdl_std_cursor_HEIGHT_arrow 16 #define sdl_std_cursor_HOT_X_arrow -13 @@ -455,7 +455,7 @@ static unsigned char sdl_std_cursor_arrow[]= {0x00,0x30,0x00,0x3c,0x00,0x1f,0xc0 /* end cursor data */ -static SDL_Cursor *sdl_std_cursor_array[(int)GHOST_kStandardCursorNumCursors]= {0}; +static SDL_Cursor *sdl_std_cursor_array[(int)GHOST_kStandardCursorNumCursors] = {0}; /* utility function mostly a copy of SDL_CreateCursor but allows us to change * color and supports blenders flipped bits */ @@ -467,54 +467,54 @@ sdl_ghost_CreateCursor(const Uint8 *data, int hot_x, int hot_y) { - SDL_Surface *surface; - SDL_Cursor *cursor; - int x, y; - Uint32 *pixel; - Uint8 datab= 0, maskb= 0; - const Uint32 black= 0xFF000000; - const Uint32 white= 0xFFFFFFFF; - const Uint32 transparent= 0x00000000; + SDL_Surface *surface; + SDL_Cursor *cursor; + int x, y; + Uint32 *pixel; + Uint8 datab = 0, maskb = 0; + const Uint32 black = 0xFF000000; + const Uint32 white = 0xFFFFFFFF; + const Uint32 transparent = 0x00000000; - /* Make sure the width is a multiple of 8 */ - w= ((w + 7) & ~7); + /* Make sure the width is a multiple of 8 */ + w = ((w + 7) & ~7); - /* Create the surface from a bitmap */ - surface= SDL_CreateRGBSurface(0, w, h, 32, - 0x00FF0000, - 0x0000FF00, - 0x000000FF, - 0xFF000000); - if (!surface) { - return NULL; - } - for (y= 0; y < h; ++y) { - pixel= (Uint32 *) ((Uint8 *) surface->pixels + y * surface->pitch); - for (x= 0; x < w; ++x) { - if ((x % 8) == 0) { - datab= *data++; - maskb= *mask++; + /* Create the surface from a bitmap */ + surface = SDL_CreateRGBSurface(0, w, h, 32, + 0x00FF0000, + 0x0000FF00, + 0x000000FF, + 0xFF000000); + if (!surface) { + return NULL; + } + for (y = 0; y < h; ++y) { + pixel = (Uint32 *) ((Uint8 *) surface->pixels + y * surface->pitch); + for (x = 0; x < w; ++x) { + if ((x % 8) == 0) { + datab = *data++; + maskb = *mask++; /* reverse bit order */ - datab= (datab * 0x0202020202ULL & 0x010884422010ULL) % 1023; - maskb= (maskb * 0x0202020202ULL & 0x010884422010ULL) % 1023; - } - if (maskb & 0x80) { - *pixel++= (datab & 0x80) ? white : black; - } + datab = (datab * 0x0202020202ULL & 0x010884422010ULL) % 1023; + maskb = (maskb * 0x0202020202ULL & 0x010884422010ULL) % 1023; + } + if (maskb & 0x80) { + *pixel++ = (datab & 0x80) ? white : black; + } else { - *pixel++= (datab & 0x80) ? white : transparent; - } - datab <<= 1; - maskb <<= 1; - } - } + *pixel++ = (datab & 0x80) ? white : transparent; + } + datab <<= 1; + maskb <<= 1; + } + } - cursor= SDL_CreateColorCursor(surface, hot_x, hot_y); + cursor = SDL_CreateColorCursor(surface, hot_x, hot_y); - SDL_FreeSurface(surface); + SDL_FreeSurface(surface); - return cursor; + return cursor; } /* TODO, this is currently never freed but it wont leak either. */ @@ -522,16 +522,16 @@ static void sdl_cursor_init(void) { #define DEF_CURSOR(name, ind) \ - assert(\ - (\ - sdl_std_cursor_array[(int)ind]= \ - sdl_ghost_CreateCursor(sdl_std_cursor_##name, \ - sdl_std_cursor_mask_##name, \ - sdl_std_cursor_WIDTH_##name, \ - sdl_std_cursor_HEIGHT_##name, \ - (sdl_std_cursor_WIDTH_##name + (sdl_std_cursor_HOT_X_##name)) - 1, \ - (sdl_std_cursor_HEIGHT_##name + (sdl_std_cursor_HOT_Y_##name)) - 1) \ - ) != NULL) \ + assert( \ + ( \ + sdl_std_cursor_array[(int)ind] = \ + sdl_ghost_CreateCursor(sdl_std_cursor_##name, \ + sdl_std_cursor_mask_##name, \ + sdl_std_cursor_WIDTH_##name, \ + sdl_std_cursor_HEIGHT_##name, \ + (sdl_std_cursor_WIDTH_##name + (sdl_std_cursor_HOT_X_##name)) - 1, \ + (sdl_std_cursor_HEIGHT_##name + (sdl_std_cursor_HOT_Y_##name)) - 1) \ + ) != NULL) \ DEF_CURSOR(left_ptr, GHOST_kStandardCursorDefault); @@ -554,8 +554,8 @@ static void sdl_cursor_init(void) DEF_CURSOR(top_left_corner, GHOST_kStandardCursorTopLeftCorner); DEF_CURSOR(top_right_corner, GHOST_kStandardCursorTopRightCorner); DEF_CURSOR(bottom_right_corner, GHOST_kStandardCursorBottomRightCorner); - DEF_CURSOR(bottom_left_corner , GHOST_kStandardCursorBottomLeftCorner); - DEF_CURSOR(arrow , GHOST_kStandardCursorCopy); + DEF_CURSOR(bottom_left_corner, GHOST_kStandardCursorBottomLeftCorner); + DEF_CURSOR(arrow, GHOST_kStandardCursorCopy); //DEF_CURSOR(arrow, GHOST_kStandardCursorCustom); DEF_CURSOR(arrow, GHOST_kStandardCursorPencil); @@ -575,7 +575,7 @@ GHOST_WindowSDL::setWindowCursorGrab(GHOST_TGrabCursorMode mode) GHOST_TSuccess GHOST_WindowSDL::setWindowCursorShape(GHOST_TStandardCursor shape) { - if(sdl_std_cursor_array[0] == NULL) { + if (sdl_std_cursor_array[0] == NULL) { sdl_cursor_init(); } @@ -605,14 +605,14 @@ GHOST_WindowSDL::setWindowCustomCursorShape(GHOST_TUns8 *bitmap, int hotX, int hotY, int fg_color, int bg_color) { - if(m_sdl_custom_cursor) { + if (m_sdl_custom_cursor) { SDL_FreeCursor(m_sdl_custom_cursor); } - m_sdl_custom_cursor= sdl_ghost_CreateCursor((const Uint8 *)bitmap, - (const Uint8 *)mask, - sizex, sizex, - hotX, hotY); + m_sdl_custom_cursor = sdl_ghost_CreateCursor((const Uint8 *)bitmap, + (const Uint8 *)mask, + sizex, sizex, + hotX, hotY); SDL_SetCursor(m_sdl_custom_cursor); return GHOST_kSuccess; diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 3715da12cd6..81eefdfdc9c 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -55,8 +55,8 @@ #endif // Some more multisample defines -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 // win64 doesn't define GWL_USERDATA #ifdef WIN32 @@ -66,7 +66,7 @@ #endif #endif -wchar_t* GHOST_WindowWin32::s_windowClassName = L"GHOST_WindowClass"; +wchar_t *GHOST_WindowWin32::s_windowClassName = L"GHOST_WindowClass"; const int GHOST_WindowWin32::s_maxTitleLength = 128; HGLRC GHOST_WindowWin32::s_firsthGLRc = NULL; HDC GHOST_WindowWin32::s_firstHDC = NULL; @@ -88,7 +88,7 @@ static PIXELFORMATDESCRIPTOR sPreferredFormat = { 1, /* version */ PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | - PFD_SWAP_COPY | /* support swap copy */ + PFD_SWAP_COPY | /* support swap copy */ PFD_DOUBLEBUFFER, /* support double-buffering */ PFD_TYPE_RGBA, /* color type */ 32, /* prefered color depth */ @@ -113,7 +113,7 @@ static PIXELFORMATDESCRIPTOR sPreferredFormat = { static int is_crappy_intel_card(void) { int crappy = 0; - const char *vendor = (const char*)glGetString(GL_VENDOR); + const char *vendor = (const char *)glGetString(GL_VENDOR); if (strstr(vendor, "Intel")) crappy = 1; @@ -122,22 +122,22 @@ static int is_crappy_intel_card(void) } GHOST_WindowWin32::GHOST_WindowWin32( - GHOST_SystemWin32 * system, - const STR_String& title, - GHOST_TInt32 left, - GHOST_TInt32 top, - GHOST_TUns32 width, - GHOST_TUns32 height, - GHOST_TWindowState state, - GHOST_TDrawingContextType type, - const bool stereoVisual, - const GHOST_TUns16 numOfAASamples, - GHOST_TEmbedderWindowID parentwindowhwnd, - GHOST_TSuccess msEnabled, - int msPixelFormat) -: + GHOST_SystemWin32 *system, + const STR_String& title, + GHOST_TInt32 left, + GHOST_TInt32 top, + GHOST_TUns32 width, + GHOST_TUns32 height, + GHOST_TWindowState state, + GHOST_TDrawingContextType type, + const bool stereoVisual, + const GHOST_TUns16 numOfAASamples, + GHOST_TEmbedderWindowID parentwindowhwnd, + GHOST_TSuccess msEnabled, + int msPixelFormat) + : GHOST_Window(width, height, state, GHOST_kDrawingContextTypeNone, - stereoVisual,numOfAASamples), + stereoVisual, numOfAASamples), m_system(system), m_hDC(0), m_hGlRc(0), @@ -170,15 +170,16 @@ GHOST_WindowWin32::GHOST_WindowWin32( versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - if(!GetVersionEx((OSVERSIONINFO *)&versionInfo)) { + if (!GetVersionEx((OSVERSIONINFO *)&versionInfo)) { versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if(GetVersionEx((OSVERSIONINFO*)&versionInfo)) { - if((versionInfo.dwMajorVersion==6 && versionInfo.dwMinorVersion>=1) || versionInfo.dwMajorVersion >= 7) { + if (GetVersionEx((OSVERSIONINFO *)&versionInfo)) { + if ((versionInfo.dwMajorVersion == 6 && versionInfo.dwMinorVersion >= 1) || versionInfo.dwMajorVersion >= 7) { hasMinVersionForTaskbar = true; } } - } else { - if((versionInfo.dwMajorVersion==6 && versionInfo.dwMinorVersion>=1) || versionInfo.dwMajorVersion >= 7) { + } + else { + if ((versionInfo.dwMajorVersion == 6 && versionInfo.dwMinorVersion >= 1) || versionInfo.dwMajorVersion >= 7) { hasMinVersionForTaskbar = true; } } @@ -188,41 +189,41 @@ GHOST_WindowWin32::GHOST_WindowWin32( MONITORINFO monitor; GHOST_TUns32 tw, th; - width += GetSystemMetrics(SM_CXSIZEFRAME)*2; - height += GetSystemMetrics(SM_CYSIZEFRAME)*2 + GetSystemMetrics(SM_CYCAPTION); + width += GetSystemMetrics(SM_CXSIZEFRAME) * 2; + height += GetSystemMetrics(SM_CYSIZEFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION); rect.left = left; rect.right = left + width; rect.top = top; rect.bottom = top + height; - monitor.cbSize=sizeof(monitor); - monitor.dwFlags=0; + monitor.cbSize = sizeof(monitor); + monitor.dwFlags = 0; // take taskbar into account - GetMonitorInfo(MonitorFromRect(&rect,MONITOR_DEFAULTTONEAREST),&monitor); + GetMonitorInfo(MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST), &monitor); th = monitor.rcWork.bottom - monitor.rcWork.top; tw = monitor.rcWork.right - monitor.rcWork.left; - if(tw < width) + if (tw < width) { width = tw; left = monitor.rcWork.left; } - else if(monitor.rcWork.right < left + (int)width) + else if (monitor.rcWork.right < left + (int)width) left = monitor.rcWork.right - width; - else if(left < monitor.rcWork.left) + else if (left < monitor.rcWork.left) left = monitor.rcWork.left; - if(th < height) + if (th < height) { height = th; top = monitor.rcWork.top; } - else if(monitor.rcWork.bottom < top + (int)height) + else if (monitor.rcWork.bottom < top + (int)height) top = monitor.rcWork.bottom - height; - else if(top < monitor.rcWork.top) + else if (top < monitor.rcWork.top) top = monitor.rcWork.top; int wintype = WS_OVERLAPPEDWINDOW; @@ -236,35 +237,35 @@ GHOST_WindowWin32::GHOST_WindowWin32( height = rect.bottom - rect.top; } - wchar_t * title_16 = alloc_utf16_from_8((char*)(const char*)title,0); + wchar_t *title_16 = alloc_utf16_from_8((char *)(const char *)title, 0); m_hWnd = ::CreateWindowW( - s_windowClassName, // pointer to registered class name - title_16, // pointer to window name - wintype, // window style - left, // horizontal position of window - top, // vertical position of window - width, // window width - height, // window height - (HWND) m_parentWindowHwnd, // handle to parent or owner window - 0, // handle to menu or child-window identifier - ::GetModuleHandle(0), // handle to application instance - 0); // pointer to window-creation data + s_windowClassName, // pointer to registered class name + title_16, // pointer to window name + wintype, // window style + left, // horizontal position of window + top, // vertical position of window + width, // window width + height, // window height + (HWND) m_parentWindowHwnd, // handle to parent or owner window + 0, // handle to menu or child-window identifier + ::GetModuleHandle(0), // handle to application instance + 0); // pointer to window-creation data free(title_16); } else { - wchar_t * title_16 = alloc_utf16_from_8((char*)(const char*)title,0); + wchar_t *title_16 = alloc_utf16_from_8((char *)(const char *)title, 0); m_hWnd = ::CreateWindowW( - s_windowClassName, // pointer to registered class name - title_16, // pointer to window name - WS_POPUP | WS_MAXIMIZE, // window style - left, // horizontal position of window - top, // vertical position of window - width, // window width - height, // window height - HWND_DESKTOP, // handle to parent or owner window - 0, // handle to menu or child-window identifier - ::GetModuleHandle(0), // handle to application instance - 0); // pointer to window-creation data + s_windowClassName, // pointer to registered class name + title_16, // pointer to window name + WS_POPUP | WS_MAXIMIZE, // window style + left, // horizontal position of window + top, // vertical position of window + width, // window width + height, // window height + HWND_DESKTOP, // handle to parent or owner window + 0, // handle to menu or child-window identifier + ::GetModuleHandle(0), // handle to application instance + 0); // pointer to window-creation data free(title_16); } if (m_hWnd) { @@ -272,12 +273,12 @@ GHOST_WindowWin32::GHOST_WindowWin32( // Note that OleInitialize(0) has to be called prior to this. Done in GHOST_SystemWin32. m_dropTarget = new GHOST_DropTargetWin32(this, m_system); // Store a pointer to this class in the window structure - ::SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LONG_PTR)this); + ::SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LONG_PTR) this); // Store the device context m_hDC = ::GetDC(m_hWnd); - if(!s_firstHDC) { + if (!s_firstHDC) { s_firstHDC = m_hDC; } @@ -304,8 +305,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( // Force an initial paint of the window ::UpdateWindow(m_hWnd); } - else - { + else { //invalidate the window m_hWnd = 0; } @@ -313,8 +313,8 @@ GHOST_WindowWin32::GHOST_WindowWin32( if (parentwindowhwnd != 0) { RAWINPUTDEVICE device = {0}; - device.usUsagePage = 0x01; /* usUsagePage & usUsage for keyboard*/ - device.usUsage = 0x06; /* http://msdn.microsoft.com/en-us/windows/hardware/gg487473.aspx */ + device.usUsagePage = 0x01; /* usUsagePage & usUsage for keyboard*/ + device.usUsage = 0x06; /* http://msdn.microsoft.com/en-us/windows/hardware/gg487473.aspx */ device.dwFlags |= RIDEV_INPUTSINK; // makes WM_INPUT is visible for ghost when has parent window device.hwndTarget = m_hWnd; RegisterRawInputDevices(&device, 1, sizeof(device)); @@ -322,8 +322,8 @@ GHOST_WindowWin32::GHOST_WindowWin32( m_wintab = ::LoadLibrary("Wintab32.dll"); if (m_wintab) { - GHOST_WIN32_WTInfo fpWTInfo = ( GHOST_WIN32_WTInfo ) ::GetProcAddress( m_wintab, "WTInfoA" ); - GHOST_WIN32_WTOpen fpWTOpen = ( GHOST_WIN32_WTOpen ) ::GetProcAddress( m_wintab, "WTOpenA" ); + GHOST_WIN32_WTInfo fpWTInfo = (GHOST_WIN32_WTInfo) ::GetProcAddress(m_wintab, "WTInfoA"); + GHOST_WIN32_WTOpen fpWTOpen = (GHOST_WIN32_WTOpen) ::GetProcAddress(m_wintab, "WTOpenA"); // let's see if we can initialize tablet here /* check if WinTab available. */ @@ -335,7 +335,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( // Open a Wintab context // Get default context information - fpWTInfo( WTI_DEFCONTEXT, 0, &lc ); + fpWTInfo(WTI_DEFCONTEXT, 0, &lc); // Open the context lc.lcPktData = PACKETDATA; @@ -343,18 +343,18 @@ GHOST_WindowWin32::GHOST_WindowWin32( lc.lcOptions |= CXO_MESSAGES | CXO_SYSTEM; /* Set the entire tablet as active */ - fpWTInfo(WTI_DEVICES,DVC_X,&TabletX); - fpWTInfo(WTI_DEVICES,DVC_Y,&TabletY); + fpWTInfo(WTI_DEVICES, DVC_X, &TabletX); + fpWTInfo(WTI_DEVICES, DVC_Y, &TabletY); /* get the max pressure, to divide into a float */ - BOOL pressureSupport = fpWTInfo (WTI_DEVICES, DVC_NPRESSURE, &Pressure); + BOOL pressureSupport = fpWTInfo(WTI_DEVICES, DVC_NPRESSURE, &Pressure); if (pressureSupport) m_maxPressure = Pressure.axMax; else m_maxPressure = 0; /* get the max tilt axes, to divide into floats */ - BOOL tiltSupport = fpWTInfo (WTI_DEVICES, DVC_ORIENTATION, &Orientation); + BOOL tiltSupport = fpWTInfo(WTI_DEVICES, DVC_ORIENTATION, &Orientation); if (tiltSupport) { /* does the tablet support azimuth ([0]) and altitude ([1]) */ if (Orientation[0].axResolution && Orientation[1].axResolution) { @@ -368,7 +368,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( } if (fpWTOpen) { - m_tablet = fpWTOpen( m_hWnd, &lc, TRUE ); + m_tablet = fpWTOpen(m_hWnd, &lc, TRUE); if (m_tablet) { m_tabletData = new GHOST_TabletData(); m_tabletData->Active = GHOST_kTabletModeNone; @@ -377,29 +377,29 @@ GHOST_WindowWin32::GHOST_WindowWin32( } } - if(hasMinVersionForTaskbar) - CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList ,(LPVOID*)&m_Bar); + if (hasMinVersionForTaskbar) + CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (LPVOID *)&m_Bar); else - m_Bar=NULL; + m_Bar = NULL; } GHOST_WindowWin32::~GHOST_WindowWin32() { - if(m_Bar) + if (m_Bar) { m_Bar->SetProgressState(m_hWnd, TBPF_NOPROGRESS); m_Bar->Release(); }; if (m_wintab) { - GHOST_WIN32_WTClose fpWTClose = ( GHOST_WIN32_WTClose ) ::GetProcAddress( m_wintab, "WTClose" ); + GHOST_WIN32_WTClose fpWTClose = (GHOST_WIN32_WTClose) ::GetProcAddress(m_wintab, "WTClose"); if (fpWTClose) { if (m_tablet) fpWTClose(m_tablet); if (m_tabletData) delete m_tabletData; - m_tabletData = NULL; + m_tabletData = NULL; } } if (m_customCursor) { @@ -439,17 +439,17 @@ HWND GHOST_WindowWin32::getHWND() const void GHOST_WindowWin32::setTitle(const STR_String& title) { - wchar_t * title_16 = alloc_utf16_from_8((char*)(const char*)title, 0); - ::SetWindowTextW(m_hWnd, (wchar_t*)title_16); + wchar_t *title_16 = alloc_utf16_from_8((char *)(const char *)title, 0); + ::SetWindowTextW(m_hWnd, (wchar_t *)title_16); free(title_16); } void GHOST_WindowWin32::getTitle(STR_String& title) const { - char buf[s_maxTitleLength];/*CHANGE + never used yet*/ + char buf[s_maxTitleLength]; /*CHANGE + never used yet*/ ::GetWindowText(m_hWnd, buf, s_maxTitleLength); - STR_String temp (buf); + STR_String temp(buf); title = buf; } @@ -468,30 +468,33 @@ void GHOST_WindowWin32::getWindowBounds(GHOST_Rect& bounds) const void GHOST_WindowWin32::getClientBounds(GHOST_Rect& bounds) const { RECT rect; - GHOST_TWindowState state= this->getState(); + GHOST_TWindowState state = this->getState(); LONG_PTR result = ::GetWindowLongPtr(m_hWnd, GWL_STYLE); int sm_cysizeframe = GetSystemMetrics(SM_CYSIZEFRAME); ::GetWindowRect(m_hWnd, &rect); - if((result & (WS_POPUP | WS_MAXIMIZE)) != (WS_POPUP | WS_MAXIMIZE)) { - if(state==GHOST_kWindowStateMaximized) { + if ((result & (WS_POPUP | WS_MAXIMIZE)) != (WS_POPUP | WS_MAXIMIZE)) { + if (state == GHOST_kWindowStateMaximized) { // in maximized state we don't have borders on the window - bounds.m_b = rect.bottom-GetSystemMetrics(SM_CYCAPTION)- sm_cysizeframe*2; + bounds.m_b = rect.bottom - GetSystemMetrics(SM_CYCAPTION) - sm_cysizeframe * 2; bounds.m_l = rect.left + sm_cysizeframe; bounds.m_r = rect.right - sm_cysizeframe; bounds.m_t = rect.top; - } else if (state == GHOST_kWindowStateEmbedded) { + } + else if (state == GHOST_kWindowStateEmbedded) { bounds.m_b = rect.bottom; bounds.m_l = rect.left; bounds.m_r = rect.right; bounds.m_t = rect.top; - } else { - bounds.m_b = rect.bottom-GetSystemMetrics(SM_CYCAPTION)-sm_cysizeframe*2; + } + else { + bounds.m_b = rect.bottom - GetSystemMetrics(SM_CYCAPTION) - sm_cysizeframe * 2; bounds.m_l = rect.left; - bounds.m_r = rect.right-sm_cysizeframe*2; + bounds.m_r = rect.right - sm_cysizeframe * 2; bounds.m_t = rect.top; } - } else { + } + else { bounds.m_b = rect.bottom; bounds.m_l = rect.left; bounds.m_r = rect.right; @@ -510,7 +513,7 @@ GHOST_TSuccess GHOST_WindowWin32::setClientWidth(GHOST_TUns32 width) int cx = wBnds.getWidth() + width - cBnds.getWidth(); int cy = wBnds.getHeight(); success = ::SetWindowPos(m_hWnd, HWND_TOP, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER) ? - GHOST_kSuccess : GHOST_kFailure; + GHOST_kSuccess : GHOST_kFailure; } else { success = GHOST_kSuccess; @@ -529,7 +532,7 @@ GHOST_TSuccess GHOST_WindowWin32::setClientHeight(GHOST_TUns32 height) int cx = wBnds.getWidth(); int cy = wBnds.getHeight() + height - cBnds.getHeight(); success = ::SetWindowPos(m_hWnd, HWND_TOP, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER) ? - GHOST_kSuccess : GHOST_kFailure; + GHOST_kSuccess : GHOST_kFailure; } else { success = GHOST_kSuccess; @@ -548,7 +551,7 @@ GHOST_TSuccess GHOST_WindowWin32::setClientSize(GHOST_TUns32 width, GHOST_TUns32 int cx = wBnds.getWidth() + width - cBnds.getWidth(); int cy = wBnds.getHeight() + height - cBnds.getHeight(); success = ::SetWindowPos(m_hWnd, HWND_TOP, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER) ? - GHOST_kSuccess : GHOST_kFailure; + GHOST_kSuccess : GHOST_kFailure; } else { success = GHOST_kSuccess; @@ -574,7 +577,7 @@ GHOST_TWindowState GHOST_WindowWin32::getState() const } else if (::IsZoomed(m_hWnd)) { LONG_PTR result = ::GetWindowLongPtr(m_hWnd, GWL_STYLE); - if((result & (WS_POPUP | WS_MAXIMIZE)) != (WS_POPUP | WS_MAXIMIZE)) + if ((result & (WS_POPUP | WS_MAXIMIZE)) != (WS_POPUP | WS_MAXIMIZE)) state = GHOST_kWindowStateMaximized; else state = GHOST_kWindowStateFullScreen; @@ -614,29 +617,29 @@ GHOST_TSuccess GHOST_WindowWin32::setState(GHOST_TWindowState state) if (state == GHOST_kWindowStateNormal) state = m_normal_state; switch (state) { - case GHOST_kWindowStateMinimized: - wp.showCmd = SW_SHOWMINIMIZED; - break; - case GHOST_kWindowStateMaximized: - wp.showCmd = SW_SHOWMAXIMIZED; - SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); - break; - case GHOST_kWindowStateFullScreen: - if (curstate != state && curstate != GHOST_kWindowStateMinimized) - m_normal_state = curstate; - wp.showCmd = SW_SHOWMAXIMIZED; - wp.ptMaxPosition.x = 0; - wp.ptMaxPosition.y = 0; - SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_POPUP | WS_MAXIMIZE); - break; - case GHOST_kWindowStateEmbedded: - SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_CHILD); - break; - case GHOST_kWindowStateNormal: - default: - wp.showCmd = SW_SHOWNORMAL; - SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); - break; + case GHOST_kWindowStateMinimized: + wp.showCmd = SW_SHOWMINIMIZED; + break; + case GHOST_kWindowStateMaximized: + wp.showCmd = SW_SHOWMAXIMIZED; + SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); + break; + case GHOST_kWindowStateFullScreen: + if (curstate != state && curstate != GHOST_kWindowStateMinimized) + m_normal_state = curstate; + wp.showCmd = SW_SHOWMAXIMIZED; + wp.ptMaxPosition.x = 0; + wp.ptMaxPosition.y = 0; + SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_POPUP | WS_MAXIMIZE); + break; + case GHOST_kWindowStateEmbedded: + SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_CHILD); + break; + case GHOST_kWindowStateNormal: + default: + wp.showCmd = SW_SHOWNORMAL; + SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); + break; } SetWindowPos(m_hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); /*Clears window cache for SetWindowLongPtr */ return ::SetWindowPlacement(m_hWnd, &wp) == TRUE ? GHOST_kSuccess : GHOST_kFailure; @@ -737,7 +740,7 @@ GHOST_TSuccess GHOST_WindowWin32::initMultisample(PIXELFORMATDESCRIPTOR pfd) iAttributes[17] -= 1; success = GHOST_kFailure; } - if (m_multisampleEnabled == GHOST_kSuccess) { + if (m_multisampleEnabled == GHOST_kSuccess) { return GHOST_kSuccess; } GHOST_PRINT("no available pixel format\n"); @@ -748,172 +751,172 @@ GHOST_TSuccess GHOST_WindowWin32::installDrawingContext(GHOST_TDrawingContextTyp { GHOST_TSuccess success; switch (type) { - case GHOST_kDrawingContextTypeOpenGL: + case GHOST_kDrawingContextTypeOpenGL: { - // If this window has multisample enabled, use the supplied format - if (m_multisampleEnabled) - { - if (SetPixelFormat(m_hDC, m_msPixelFormat, &sPreferredFormat)==FALSE) + // If this window has multisample enabled, use the supplied format + if (m_multisampleEnabled) { - success = GHOST_kFailure; - break; - } - - // Create the context - m_hGlRc = ::wglCreateContext(m_hDC); - if (m_hGlRc) { - if (::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE) { - if (s_firsthGLRc) { - if (is_crappy_intel_card()) { - if (::wglMakeCurrent(NULL, NULL) == TRUE) { - ::wglDeleteContext(m_hGlRc); - m_hGlRc = s_firsthGLRc; - } - else { - ::wglDeleteContext(m_hGlRc); - m_hGlRc = NULL; - } - } - else { - ::wglCopyContext(s_firsthGLRc, m_hGlRc, GL_ALL_ATTRIB_BITS); - ::wglShareLists(s_firsthGLRc, m_hGlRc); - } - } - else { - s_firsthGLRc = m_hGlRc; - } - - if (m_hGlRc) { - success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure; - } - else { - success = GHOST_kFailure; - } - } - else { - success = GHOST_kFailure; - } - } - else { - success = GHOST_kFailure; - } - - if (success == GHOST_kFailure) { - printf("Failed to get a context....\n"); - } - } - else - { - if(m_stereoVisual) - sPreferredFormat.dwFlags |= PFD_STEREO; - - // Attempt to match device context pixel format to the preferred format - int iPixelFormat = EnumPixelFormats(m_hDC); - if (iPixelFormat == 0) { - success = GHOST_kFailure; - break; - } - if (::SetPixelFormat(m_hDC, iPixelFormat, &sPreferredFormat) == FALSE) { - success = GHOST_kFailure; - break; - } - // For debugging only: retrieve the pixel format chosen - PIXELFORMATDESCRIPTOR preferredFormat; - ::DescribePixelFormat(m_hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &preferredFormat); - - // Create the context - m_hGlRc = ::wglCreateContext(m_hDC); - if (m_hGlRc) { - if (::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE) { - if (s_firsthGLRc) { - if (is_crappy_intel_card()) { - if (::wglMakeCurrent(NULL, NULL) == TRUE) { - ::wglDeleteContext(m_hGlRc); - m_hGlRc = s_firsthGLRc; - } - else { - ::wglDeleteContext(m_hGlRc); - m_hGlRc = NULL; - } - } - else { - ::wglShareLists(s_firsthGLRc, m_hGlRc); - } - } - else { - s_firsthGLRc = m_hGlRc; - } - - if (m_hGlRc) { - success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure; - } - else { - success = GHOST_kFailure; - } - } - else { - success = GHOST_kFailure; - } - } - else { - success = GHOST_kFailure; - } - - if (success == GHOST_kFailure) { - printf("Failed to get a context....\n"); - } - - // Attempt to enable multisample - if (m_multisample && WGL_ARB_multisample && !m_multisampleEnabled) - { - success = initMultisample(preferredFormat); - - if (success) + if (SetPixelFormat(m_hDC, m_msPixelFormat, &sPreferredFormat) == FALSE) { - - // Make sure we don't screw up the context - if (m_hGlRc == s_firsthGLRc) - s_firsthGLRc = NULL; - m_drawingContextType = GHOST_kDrawingContextTypeOpenGL; - removeDrawingContext(); - - // Create a new window - GHOST_TWindowState new_state = getState(); - - m_nextWindow = new GHOST_WindowWin32((GHOST_SystemWin32*)GHOST_ISystem::getSystem(), - m_title, - m_left, - m_top, - m_width, - m_height, - new_state, - type, - m_stereo, - m_multisample, - m_parentWindowHwnd, - m_multisampleEnabled, - m_msPixelFormat); - - // Return failure so we can trash this window. success = GHOST_kFailure; break; - } else { - m_multisampleEnabled = GHOST_kSuccess; - printf("Multisample failed to initialized\n"); - success = GHOST_kSuccess; + } + + // Create the context + m_hGlRc = ::wglCreateContext(m_hDC); + if (m_hGlRc) { + if (::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE) { + if (s_firsthGLRc) { + if (is_crappy_intel_card()) { + if (::wglMakeCurrent(NULL, NULL) == TRUE) { + ::wglDeleteContext(m_hGlRc); + m_hGlRc = s_firsthGLRc; + } + else { + ::wglDeleteContext(m_hGlRc); + m_hGlRc = NULL; + } + } + else { + ::wglCopyContext(s_firsthGLRc, m_hGlRc, GL_ALL_ATTRIB_BITS); + ::wglShareLists(s_firsthGLRc, m_hGlRc); + } + } + else { + s_firsthGLRc = m_hGlRc; + } + + if (m_hGlRc) { + success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure; + } + else { + success = GHOST_kFailure; + } + } + else { + success = GHOST_kFailure; + } + } + else { + success = GHOST_kFailure; + } + + if (success == GHOST_kFailure) { + printf("Failed to get a context....\n"); + } + } + else { + if (m_stereoVisual) + sPreferredFormat.dwFlags |= PFD_STEREO; + + // Attempt to match device context pixel format to the preferred format + int iPixelFormat = EnumPixelFormats(m_hDC); + if (iPixelFormat == 0) { + success = GHOST_kFailure; + break; + } + if (::SetPixelFormat(m_hDC, iPixelFormat, &sPreferredFormat) == FALSE) { + success = GHOST_kFailure; + break; + } + // For debugging only: retrieve the pixel format chosen + PIXELFORMATDESCRIPTOR preferredFormat; + ::DescribePixelFormat(m_hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &preferredFormat); + + // Create the context + m_hGlRc = ::wglCreateContext(m_hDC); + if (m_hGlRc) { + if (::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE) { + if (s_firsthGLRc) { + if (is_crappy_intel_card()) { + if (::wglMakeCurrent(NULL, NULL) == TRUE) { + ::wglDeleteContext(m_hGlRc); + m_hGlRc = s_firsthGLRc; + } + else { + ::wglDeleteContext(m_hGlRc); + m_hGlRc = NULL; + } + } + else { + ::wglShareLists(s_firsthGLRc, m_hGlRc); + } + } + else { + s_firsthGLRc = m_hGlRc; + } + + if (m_hGlRc) { + success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure; + } + else { + success = GHOST_kFailure; + } + } + else { + success = GHOST_kFailure; + } + } + else { + success = GHOST_kFailure; + } + + if (success == GHOST_kFailure) { + printf("Failed to get a context....\n"); + } + + // Attempt to enable multisample + if (m_multisample && WGL_ARB_multisample && !m_multisampleEnabled) + { + success = initMultisample(preferredFormat); + + if (success) + { + + // Make sure we don't screw up the context + if (m_hGlRc == s_firsthGLRc) + s_firsthGLRc = NULL; + m_drawingContextType = GHOST_kDrawingContextTypeOpenGL; + removeDrawingContext(); + + // Create a new window + GHOST_TWindowState new_state = getState(); + + m_nextWindow = new GHOST_WindowWin32((GHOST_SystemWin32 *)GHOST_ISystem::getSystem(), + m_title, + m_left, + m_top, + m_width, + m_height, + new_state, + type, + m_stereo, + m_multisample, + m_parentWindowHwnd, + m_multisampleEnabled, + m_msPixelFormat); + + // Return failure so we can trash this window. + success = GHOST_kFailure; + break; + } + else { + m_multisampleEnabled = GHOST_kSuccess; + printf("Multisample failed to initialized\n"); + success = GHOST_kSuccess; + } } } - } } break; - case GHOST_kDrawingContextTypeNone: - success = GHOST_kSuccess; - break; + case GHOST_kDrawingContextTypeNone: + success = GHOST_kSuccess; + break; - default: - success = GHOST_kFailure; + default: + success = GHOST_kFailure; } return success; } @@ -922,55 +925,54 @@ GHOST_TSuccess GHOST_WindowWin32::removeDrawingContext() { GHOST_TSuccess success; switch (m_drawingContextType) { - case GHOST_kDrawingContextTypeOpenGL: - // we shouldn't remove the drawing context if it's the first OpenGL context - // If we do, we get corrupted drawing. See #19997 - if (m_hGlRc && m_hGlRc!=s_firsthGLRc) { - success = ::wglDeleteContext(m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure; - m_hGlRc = 0; - } - else { + case GHOST_kDrawingContextTypeOpenGL: + // we shouldn't remove the drawing context if it's the first OpenGL context + // If we do, we get corrupted drawing. See #19997 + if (m_hGlRc && m_hGlRc != s_firsthGLRc) { + success = ::wglDeleteContext(m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure; + m_hGlRc = 0; + } + else { + success = GHOST_kFailure; + } + break; + case GHOST_kDrawingContextTypeNone: + success = GHOST_kSuccess; + break; + default: success = GHOST_kFailure; - } - break; - case GHOST_kDrawingContextTypeNone: - success = GHOST_kSuccess; - break; - default: - success = GHOST_kFailure; } return success; } void GHOST_WindowWin32::lostMouseCapture() { - if(m_hasMouseCaptured) - { m_hasGrabMouse = false; - m_nPressedButtons = 0; - m_hasMouseCaptured = false; - }; + if (m_hasMouseCaptured) + { m_hasGrabMouse = false; + m_nPressedButtons = 0; + m_hasMouseCaptured = false; }; } void GHOST_WindowWin32::registerMouseClickEvent(int press) { - switch(press) + switch (press) { - case 0: m_nPressedButtons++; break; - case 1: if(m_nPressedButtons) m_nPressedButtons--; break; - case 2: m_hasGrabMouse=true; break; - case 3: m_hasGrabMouse=false; break; + case 0: m_nPressedButtons++; break; + case 1: if (m_nPressedButtons) m_nPressedButtons--; break; + case 2: m_hasGrabMouse = true; break; + case 3: m_hasGrabMouse = false; break; } - if(!m_nPressedButtons && !m_hasGrabMouse && m_hasMouseCaptured) + if (!m_nPressedButtons && !m_hasGrabMouse && m_hasMouseCaptured) { - ::ReleaseCapture(); - m_hasMouseCaptured = false; + ::ReleaseCapture(); + m_hasMouseCaptured = false; } - else if((m_nPressedButtons || m_hasGrabMouse) && !m_hasMouseCaptured) + else if ((m_nPressedButtons || m_hasGrabMouse) && !m_hasMouseCaptured) { - ::SetCapture(m_hWnd); - m_hasMouseCaptured = true; + ::SetCapture(m_hWnd); + m_hasMouseCaptured = true; } } @@ -979,43 +981,44 @@ void GHOST_WindowWin32::registerMouseClickEvent(int press) void GHOST_WindowWin32::loadCursor(bool visible, GHOST_TStandardCursor cursor) const { if (!visible) { - while (::ShowCursor(FALSE) >= 0); + while (::ShowCursor(FALSE) >= 0) ; } else { - while (::ShowCursor(TRUE) < 0); + while (::ShowCursor(TRUE) < 0) ; } if (cursor == GHOST_kStandardCursorCustom && m_customCursor) { - ::SetCursor( m_customCursor ); - } else { + ::SetCursor(m_customCursor); + } + else { // Convert GHOST cursor to Windows OEM cursor bool success = true; LPCSTR id; switch (cursor) { - case GHOST_kStandardCursorDefault: id = IDC_ARROW; break; - case GHOST_kStandardCursorRightArrow: id = IDC_ARROW; break; - case GHOST_kStandardCursorLeftArrow: id = IDC_ARROW; break; - case GHOST_kStandardCursorInfo: id = IDC_SIZEALL; break; // Four-pointed arrow pointing north, south, east, and west - case GHOST_kStandardCursorDestroy: id = IDC_NO; break; // Slashed circle - case GHOST_kStandardCursorHelp: id = IDC_HELP; break; // Arrow and question mark - case GHOST_kStandardCursorCycle: id = IDC_NO; break; // Slashed circle - case GHOST_kStandardCursorSpray: id = IDC_SIZEALL; break; // Four-pointed arrow pointing north, south, east, and west - case GHOST_kStandardCursorWait: id = IDC_WAIT; break; // Hourglass - case GHOST_kStandardCursorText: id = IDC_IBEAM; break; // I-beam - case GHOST_kStandardCursorCrosshair: id = IDC_CROSS; break; // Crosshair - case GHOST_kStandardCursorUpDown: id = IDC_SIZENS; break; // Double-pointed arrow pointing north and south - case GHOST_kStandardCursorLeftRight: id = IDC_SIZEWE; break; // Double-pointed arrow pointing west and east - case GHOST_kStandardCursorTopSide: id = IDC_UPARROW; break; // Vertical arrow - case GHOST_kStandardCursorBottomSide: id = IDC_SIZENS; break; - case GHOST_kStandardCursorLeftSide: id = IDC_SIZEWE; break; - case GHOST_kStandardCursorTopLeftCorner: id = IDC_SIZENWSE; break; - case GHOST_kStandardCursorTopRightCorner: id = IDC_SIZENESW; break; - case GHOST_kStandardCursorBottomRightCorner: id = IDC_SIZENWSE; break; - case GHOST_kStandardCursorBottomLeftCorner: id = IDC_SIZENESW; break; - case GHOST_kStandardCursorPencil: id = IDC_ARROW; break; - case GHOST_kStandardCursorCopy: id = IDC_ARROW; break; + case GHOST_kStandardCursorDefault: id = IDC_ARROW; break; + case GHOST_kStandardCursorRightArrow: id = IDC_ARROW; break; + case GHOST_kStandardCursorLeftArrow: id = IDC_ARROW; break; + case GHOST_kStandardCursorInfo: id = IDC_SIZEALL; break; // Four-pointed arrow pointing north, south, east, and west + case GHOST_kStandardCursorDestroy: id = IDC_NO; break; // Slashed circle + case GHOST_kStandardCursorHelp: id = IDC_HELP; break; // Arrow and question mark + case GHOST_kStandardCursorCycle: id = IDC_NO; break; // Slashed circle + case GHOST_kStandardCursorSpray: id = IDC_SIZEALL; break; // Four-pointed arrow pointing north, south, east, and west + case GHOST_kStandardCursorWait: id = IDC_WAIT; break; // Hourglass + case GHOST_kStandardCursorText: id = IDC_IBEAM; break; // I-beam + case GHOST_kStandardCursorCrosshair: id = IDC_CROSS; break; // Crosshair + case GHOST_kStandardCursorUpDown: id = IDC_SIZENS; break; // Double-pointed arrow pointing north and south + case GHOST_kStandardCursorLeftRight: id = IDC_SIZEWE; break; // Double-pointed arrow pointing west and east + case GHOST_kStandardCursorTopSide: id = IDC_UPARROW; break; // Vertical arrow + case GHOST_kStandardCursorBottomSide: id = IDC_SIZENS; break; + case GHOST_kStandardCursorLeftSide: id = IDC_SIZEWE; break; + case GHOST_kStandardCursorTopLeftCorner: id = IDC_SIZENWSE; break; + case GHOST_kStandardCursorTopRightCorner: id = IDC_SIZENESW; break; + case GHOST_kStandardCursorBottomRightCorner: id = IDC_SIZENWSE; break; + case GHOST_kStandardCursorBottomLeftCorner: id = IDC_SIZENESW; break; + case GHOST_kStandardCursorPencil: id = IDC_ARROW; break; + case GHOST_kStandardCursorCopy: id = IDC_ARROW; break; default: - success = false; + success = false; } if (success) { @@ -1035,22 +1038,22 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorVisibility(bool visible) GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode) { - if(mode != GHOST_kGrabDisable) { - if(mode != GHOST_kGrabNormal) { + if (mode != GHOST_kGrabDisable) { + if (mode != GHOST_kGrabNormal) { m_system->getCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]); setCursorGrabAccum(0, 0); - if(mode == GHOST_kGrabHide) + if (mode == GHOST_kGrabHide) setWindowCursorVisibility(false); } registerMouseClickEvent(2); } else { - if (m_cursorGrab==GHOST_kGrabHide) { + if (m_cursorGrab == GHOST_kGrabHide) { m_system->setCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]); setWindowCursorVisibility(true); } - if(m_cursorGrab != GHOST_kGrabNormal) { + if (m_cursorGrab != GHOST_kGrabNormal) { /* use to generate a mouse move event, otherwise the last event * blender gets can be outside the screen causing menus not to show * properly unless the user moves the mouse */ @@ -1061,7 +1064,7 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */ setCursorGrabAccum(0, 0); - m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */ + m_cursorGrabBounds.m_l = m_cursorGrabBounds.m_r = -1; /* disable */ registerMouseClickEvent(3); } @@ -1085,20 +1088,20 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorShape(GHOST_TStandardCursor cur void GHOST_WindowWin32::processWin32TabletInitEvent() { if (m_wintab) { - GHOST_WIN32_WTInfo fpWTInfo = ( GHOST_WIN32_WTInfo ) ::GetProcAddress( m_wintab, "WTInfoA" ); + GHOST_WIN32_WTInfo fpWTInfo = (GHOST_WIN32_WTInfo) ::GetProcAddress(m_wintab, "WTInfoA"); // let's see if we can initialize tablet here /* check if WinTab available. */ if (fpWTInfo) { AXIS Pressure, Orientation[3]; /* The maximum tablet size */ - BOOL pressureSupport = fpWTInfo (WTI_DEVICES, DVC_NPRESSURE, &Pressure); + BOOL pressureSupport = fpWTInfo(WTI_DEVICES, DVC_NPRESSURE, &Pressure); if (pressureSupport) m_maxPressure = Pressure.axMax; else m_maxPressure = 0; - BOOL tiltSupport = fpWTInfo (WTI_DEVICES, DVC_ORIENTATION, &Orientation); + BOOL tiltSupport = fpWTInfo(WTI_DEVICES, DVC_ORIENTATION, &Orientation); if (tiltSupport) { /* does the tablet support azimuth ([0]) and altitude ([1]) */ if (Orientation[0].axResolution && Orientation[1].axResolution) { @@ -1119,7 +1122,7 @@ void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) { PACKET pkt; if (m_wintab) { - GHOST_WIN32_WTPacket fpWTPacket = ( GHOST_WIN32_WTPacket ) ::GetProcAddress( m_wintab, "WTPacket" ); + GHOST_WIN32_WTPacket fpWTPacket = (GHOST_WIN32_WTPacket) ::GetProcAddress(m_wintab, "WTPacket"); if (fpWTPacket) { if (fpWTPacket((HCTX)lParam, wParam, &pkt)) { if (m_tabletData) { @@ -1139,43 +1142,45 @@ void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) } if (m_maxPressure > 0) { m_tabletData->Pressure = (float)pkt.pkNormalPressure / (float)m_maxPressure; - } else { + } + else { m_tabletData->Pressure = 1.0f; } if ((m_maxAzimuth > 0) && (m_maxAltitude > 0)) { ORIENTATION ort = pkt.pkOrientation; float vecLen; - float altRad, azmRad; /* in radians */ + float altRad, azmRad; /* in radians */ /* - from the wintab spec: - orAzimuth Specifies the clockwise rotation of the - cursor about the z axis through a full circular range. - - orAltitude Specifies the angle with the x-y plane - through a signed, semicircular range. Positive values - specify an angle upward toward the positive z axis; - negative values specify an angle downward toward the negative z axis. - - wintab.h defines .orAltitude as a UINT but documents .orAltitude - as positive for upward angles and negative for downward angles. - WACOM uses negative altitude values to show that the pen is inverted; - therefore we cast .orAltitude as an (int) and then use the absolute value. - */ + * from the wintab spec: + * orAzimuth Specifies the clockwise rotation of the + * cursor about the z axis through a full circular range. + * + * orAltitude Specifies the angle with the x-y plane + * through a signed, semicircular range. Positive values + * specify an angle upward toward the positive z axis; + * negative values specify an angle downward toward the negative z axis. + * + * wintab.h defines .orAltitude as a UINT but documents .orAltitude + * as positive for upward angles and negative for downward angles. + * WACOM uses negative altitude values to show that the pen is inverted; + * therefore we cast .orAltitude as an (int) and then use the absolute value. + */ /* convert raw fixed point data to radians */ - altRad = (float)((fabs((float)ort.orAltitude)/(float)m_maxAltitude) * M_PI/2.0); - azmRad = (float)(((float)ort.orAzimuth/(float)m_maxAzimuth) * M_PI*2.0); + altRad = (float)((fabs((float)ort.orAltitude) / (float)m_maxAltitude) * M_PI / 2.0); + azmRad = (float)(((float)ort.orAzimuth / (float)m_maxAzimuth) * M_PI * 2.0); /* find length of the stylus' projected vector on the XY plane */ vecLen = cos(altRad); /* from there calculate X and Y components based on azimuth */ m_tabletData->Xtilt = sin(azmRad) * vecLen; - m_tabletData->Ytilt = (float)(sin(M_PI/2.0 - azmRad) * vecLen); + m_tabletData->Ytilt = (float)(sin(M_PI / 2.0 - azmRad) * vecLen); - } else { + } + else { m_tabletData->Xtilt = 0.0f; m_tabletData->Ytilt = 0.0f; } @@ -1188,40 +1193,40 @@ void GHOST_WindowWin32::processWin32TabletEvent(WPARAM wParam, LPARAM lParam) /** Reverse the bits in a GHOST_TUns8 */ static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch) { - ch= ((ch>>1)&0x55) | ((ch<<1)&0xAA); - ch= ((ch>>2)&0x33) | ((ch<<2)&0xCC); - ch= ((ch>>4)&0x0F) | ((ch<<4)&0xF0); + ch = ((ch >> 1) & 0x55) | ((ch << 1) & 0xAA); + ch = ((ch >> 2) & 0x33) | ((ch << 2) & 0xCC); + ch = ((ch >> 4) & 0x0F) | ((ch << 4) & 0xF0); return ch; } /** Reverse the bits in a GHOST_TUns16 */ static GHOST_TUns16 uns16ReverseBits(GHOST_TUns16 shrt) { - shrt= ((shrt>>1)&0x5555) | ((shrt<<1)&0xAAAA); - shrt= ((shrt>>2)&0x3333) | ((shrt<<2)&0xCCCC); - shrt= ((shrt>>4)&0x0F0F) | ((shrt<<4)&0xF0F0); - shrt= ((shrt>>8)&0x00FF) | ((shrt<<8)&0xFF00); + shrt = ((shrt >> 1) & 0x5555) | ((shrt << 1) & 0xAAAA); + shrt = ((shrt >> 2) & 0x3333) | ((shrt << 2) & 0xCCCC); + shrt = ((shrt >> 4) & 0x0F0F) | ((shrt << 4) & 0xF0F0); + shrt = ((shrt >> 8) & 0x00FF) | ((shrt << 8) & 0xFF00); return shrt; } GHOST_TSuccess GHOST_WindowWin32::setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY) { - return setWindowCustomCursorShape((GHOST_TUns8*)bitmap, (GHOST_TUns8*)mask, + return setWindowCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask, 16, 16, hotX, hotY, 0, 1); } GHOST_TSuccess GHOST_WindowWin32::setWindowCustomCursorShape(GHOST_TUns8 *bitmap, - GHOST_TUns8 *mask, int sizeX, int sizeY, int hotX, int hotY, - int fg_color, int bg_color) + GHOST_TUns8 *mask, int sizeX, int sizeY, int hotX, int hotY, + int fg_color, int bg_color) { GHOST_TUns32 andData[32]; GHOST_TUns32 xorData[32]; GHOST_TUns32 fullBitRow, fullMaskRow; int x, y, cols; - cols=sizeX/8; /* Num of whole bytes per row (width of bm/mask) */ - if (sizeX%8) cols++; + cols = sizeX / 8; /* Num of whole bytes per row (width of bm/mask) */ + if (sizeX % 8) cols++; if (m_customCursor) { DestroyCursor(m_customCursor); @@ -1231,17 +1236,17 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCustomCursorShape(GHOST_TUns8 *bitmap memset(&andData, 0xFF, sizeof(andData)); memset(&xorData, 0, sizeof(xorData)); - for (y=0; y=0; x--){ - fullBitRow<<=8; - fullMaskRow<<=8; - fullBitRow |= uns8ReverseBits(bitmap[cols*y + x]); - fullMaskRow |= uns8ReverseBits( mask[cols*y + x]); + for (y = 0; y < sizeY; y++) { + fullBitRow = 0; + fullMaskRow = 0; + for (x = cols - 1; x >= 0; x--) { + fullBitRow <<= 8; + fullMaskRow <<= 8; + fullBitRow |= uns8ReverseBits(bitmap[cols * y + x]); + fullMaskRow |= uns8ReverseBits(mask[cols * y + x]); } - xorData[y]= fullBitRow & fullMaskRow; - andData[y]= ~fullMaskRow; + xorData[y] = fullBitRow & fullMaskRow; + andData[y] = ~fullMaskRow; } m_customCursor = ::CreateCursor(::GetModuleHandle(0), hotX, hotY, 32, 32, andData, xorData); @@ -1260,7 +1265,7 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCustomCursorShape(GHOST_TUns8 *bitmap GHOST_TSuccess GHOST_WindowWin32::setProgressBar(float progress) { /*SetProgressValue sets state to TBPF_NORMAL automaticly*/ - if(m_Bar && S_OK == m_Bar->SetProgressValue(m_hWnd,10000*progress,10000)) + if (m_Bar && S_OK == m_Bar->SetProgressValue(m_hWnd, 10000 * progress, 10000)) return GHOST_kSuccess; return GHOST_kFailure; @@ -1268,14 +1273,14 @@ GHOST_TSuccess GHOST_WindowWin32::setProgressBar(float progress) GHOST_TSuccess GHOST_WindowWin32::endProgressBar() { - if(m_Bar && S_OK == m_Bar->SetProgressState(m_hWnd,TBPF_NOPROGRESS)) + if (m_Bar && S_OK == m_Bar->SetProgressState(m_hWnd, TBPF_NOPROGRESS)) return GHOST_kSuccess; return GHOST_kFailure; } /* Ron Fosner's code for weighting pixel formats and forcing software. - See http://www.opengl.org/resources/faq/technical/weight.cpp */ + See http://www.opengl.org/resources/faq/technical/weight.cpp */ static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd) { @@ -1285,12 +1290,14 @@ static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd) /* cull unusable pixel formats */ /* if no formats can be found, can we determine why it was rejected? */ - if( !(pfd.dwFlags & PFD_SUPPORT_OPENGL) || - !(pfd.dwFlags & PFD_DRAW_TO_WINDOW) || - !(pfd.dwFlags & PFD_DOUBLEBUFFER) || /* Blender _needs_ this */ - ( pfd.cDepthBits <= 8 ) || - !(pfd.iPixelType == PFD_TYPE_RGBA)) + if (!(pfd.dwFlags & PFD_SUPPORT_OPENGL) || + !(pfd.dwFlags & PFD_DRAW_TO_WINDOW) || + !(pfd.dwFlags & PFD_DOUBLEBUFFER) || /* Blender _needs_ this */ + (pfd.cDepthBits <= 8) || + !(pfd.iPixelType == PFD_TYPE_RGBA)) + { return 0; + } weight = 1; /* it's usable */ @@ -1301,10 +1308,10 @@ static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd) weight += pfd.cColorBits - 8; /* want swap copy capability -- it matters a lot */ - if(pfd.dwFlags & PFD_SWAP_COPY) weight += 16; + if (pfd.dwFlags & PFD_SWAP_COPY) weight += 16; /* but if it's a generic (not accelerated) view, it's really bad */ - if(pfd.dwFlags & PFD_GENERIC_FORMAT) weight /= 10; + if (pfd.dwFlags & PFD_GENERIC_FORMAT) weight /= 10; return weight; } @@ -1318,27 +1325,27 @@ static int EnumPixelFormats(HDC hdc) PIXELFORMATDESCRIPTOR pfd; /* we need a device context to do anything */ - if(!hdc) return 0; + if (!hdc) return 0; iPixelFormat = 1; /* careful! PFD numbers are 1 based, not zero based */ /* obtain detailed information about - the device context's first pixel format */ - n = 1+::DescribePixelFormat(hdc, iPixelFormat, - sizeof(PIXELFORMATDESCRIPTOR), &pfd); + * the device context's first pixel format */ + n = 1 + ::DescribePixelFormat(hdc, iPixelFormat, + sizeof(PIXELFORMATDESCRIPTOR), &pfd); /* choose a pixel format using the useless Windows function in case - we come up empty handed */ - iPixelFormat = ::ChoosePixelFormat( hdc, &sPreferredFormat ); + we come up empty handed */ + iPixelFormat = ::ChoosePixelFormat(hdc, &sPreferredFormat); - if(!iPixelFormat) return 0; /* couldn't find one to use */ + if (!iPixelFormat) return 0; /* couldn't find one to use */ - for(i=1; i<=n; i++) { /* not the idiom, but it's right */ - ::DescribePixelFormat( hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd ); + for (i = 1; i <= n; i++) { /* not the idiom, but it's right */ + ::DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd); w = WeightPixelFormat(pfd); // be strict on stereo - if (!((sPreferredFormat.dwFlags ^ pfd.dwFlags) & PFD_STEREO)) { - if(w > weight) { + if (!((sPreferredFormat.dwFlags ^ pfd.dwFlags) & PFD_STEREO)) { + if (w > weight) { weight = w; iPixelFormat = i; } @@ -1346,10 +1353,10 @@ static int EnumPixelFormats(HDC hdc) } if (weight == 0) { // we could find the correct stereo setting, just find any suitable format - for(i=1; i<=n; i++) { /* not the idiom, but it's right */ - ::DescribePixelFormat( hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd ); + for (i = 1; i <= n; i++) { /* not the idiom, but it's right */ + ::DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd); w = WeightPixelFormat(pfd); - if(w > weight) { + if (w > weight) { weight = w; iPixelFormat = i; } diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 12990064621..1f4111c8cf3 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -271,11 +271,11 @@ GHOST_WindowX11( // Specify which events we are interested in hearing. xattributes.event_mask = - ExposureMask | StructureNotifyMask | - KeyPressMask | KeyReleaseMask | - EnterWindowMask | LeaveWindowMask | - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | FocusChangeMask | PropertyChangeMask; + ExposureMask | StructureNotifyMask | + KeyPressMask | KeyReleaseMask | + EnterWindowMask | LeaveWindowMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | FocusChangeMask | PropertyChangeMask; // create the window! @@ -833,12 +833,12 @@ clientToScreen( Window temp; XTranslateCoordinates( - m_display, - m_window, - RootWindow(m_display, m_visual->screen), - inX, inY, - &ax, &ay, - &temp); + m_display, + m_window, + RootWindow(m_display, m_visual->screen), + inX, inY, + &ax, &ay, + &temp); outX = ax; outY = ay; } diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp index 1822f3539bd..2e8a9e88fd1 100644 --- a/intern/ghost/test/gears/GHOST_Test.cpp +++ b/intern/ghost/test/gears/GHOST_Test.cpp @@ -46,7 +46,7 @@ #include #else // WIN32 - // __APPLE__ is defined + // __APPLE__ is defined #include #endif // WIN32 #else // defined(WIN32) || defined(__APPLE__) @@ -66,20 +66,20 @@ static bool nVidiaWindows; // very dirty but hey, it's for testing only -static void gearsTimerProc(GHOST_ITimerTask* task, GHOST_TUns64 time); +static void gearsTimerProc(GHOST_ITimerTask *task, GHOST_TUns64 time); -static class Application* fApp; -static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0; +static class Application * fApp; +static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; static GLfloat fAngle = 0.0; -static GHOST_ISystem* fSystem = 0; +static GHOST_ISystem *fSystem = 0; void StereoProjection(float left, float right, float bottom, float top, float nearplane, float farplane, - float zero_plane, float dist, - float eye); + float zero_plane, float dist, + float eye); -static void testTimerProc(GHOST_ITimerTask* /*task*/, GHOST_TUns64 time) +static void testTimerProc(GHOST_ITimerTask * /*task*/, GHOST_TUns64 time) { std::cout << "timer1, time=" << (int)time << "\n"; } @@ -93,35 +93,35 @@ static void gearGL(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GL GLfloat u, v, len; r0 = inner_radius; - r1 = outer_radius - tooth_depth/2.0; - r2 = outer_radius + tooth_depth/2.0; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; const double pi = 3.14159264; - da = 2.0*pi / teeth / 4.0; + da = 2.0 * pi / teeth / 4.0; glShadeModel(GL_FLAT); glNormal3f(0.0, 0.0, 1.0); /* draw front face */ glBegin(GL_QUAD_STRIP); - for (i=0;i<=teeth;i++) { - angle = i * 2.0*pi / teeth; - glVertex3f(r0*cos(angle), r0*sin(angle), width*0.5); - glVertex3f(r1*cos(angle), r1*sin(angle), width*0.5); - glVertex3f(r0*cos(angle), r0*sin(angle), width*0.5); - glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0 * pi / teeth; + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); } glEnd(); /* draw front sides of teeth */ glBegin(GL_QUADS); - da = 2.0*pi / teeth / 4.0; - for (i=0;iactivateDrawingContext(); GHOST_Rect bnds; @@ -270,18 +270,17 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0) window->getClientBounds(bnds); // viewport - if(stereo) + if (stereo) { - if(nVidiaWindows) + if (nVidiaWindows) { // handled by nVidia driver so act as normal (explicitly put here since // it -is- stereo) glViewport(0, 0, bnds.getWidth(), bnds.getHeight()); } - else - { // generic cross platform above-below stereo + else { // generic cross platform above-below stereo noOfScanlines = (bnds.getHeight() - verticalBlankingInterval) / 2; - switch(eye) + switch (eye) { case LEFT_EYE: // upper half of window @@ -294,8 +293,7 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0) } } } - else - { + else { noOfScanlines = bnds.getHeight(); lowerScanline = 0; } @@ -310,11 +308,11 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0) nearplane = 5.0; farplane = 60.0; - if(stereo) + if (stereo) { zeroPlane = 0.0; distance = 14.5; - switch(eye) + switch (eye) { case LEFT_EYE: StereoProjection(left, right, bottom, top, nearplane, farplane, zeroPlane, distance, -eyeSeparation / 2.0); @@ -324,8 +322,7 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0) break; } } - else - { + else { // left = -w; // right = w; // bottom = -h; @@ -339,7 +336,7 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0) } - glClearColor(.2f,0.0f,0.0f,0.0f); + glClearColor(.2f, 0.0f, 0.0f, 0.0f); } @@ -347,31 +344,31 @@ void StereoProjection(float left, float right, float bottom, float top, float ne float zero_plane, float dist, float eye) /* Perform the perspective projection for one eye's subfield. -The projection is in the direction of the negative z axis. + The projection is in the direction of the negative z axis. --6.0, 6.0, -4.8, 4.8, -left, right, bottom, top = the coordinate range, in the plane of zero -parallax setting, which will be displayed on the screen. The -ratio between (right-left) and (top-bottom) should equal the aspect -ratio of the display. + -6.0, 6.0, -4.8, 4.8, + left, right, bottom, top = the coordinate range, in the plane of zero + parallax setting, which will be displayed on the screen. The + ratio between (right-left) and (top-bottom) should equal the aspect + ratio of the display. -6.0, -6.0, -near, far = the z-coordinate values of the clipping planes. + 6.0, -6.0, + near, far = the z-coordinate values of the clipping planes. -0.0, -zero_plane = the z-coordinate of the plane of zero parallax setting. + 0.0, + zero_plane = the z-coordinate of the plane of zero parallax setting. -14.5, -dist = the distance from the center of projection to the plane -of zero parallax. + 14.5, + dist = the distance from the center of projection to the plane + of zero parallax. --0.31 -eye = half the eye separation; positive for the right eye subfield, -negative for the left eye subfield. -*/ + -0.31 + eye = half the eye separation; positive for the right eye subfield, + negative for the left eye subfield. + */ { float xmid, ymid, clip_near, clip_far, topw, bottomw, leftw, rightw, - dx, dy, n_over_d; + dx, dy, n_over_d; dx = right - left; dy = top - bottom; @@ -387,7 +384,7 @@ negative for the left eye subfield. topw = n_over_d * dy / 2.0; bottomw = -topw; rightw = n_over_d * (dx / 2.0 - eye); - leftw = n_over_d *(-dx / 2.0 - eye); + leftw = n_over_d * (-dx / 2.0 - eye); /* Need to be in projection mode for this. */ glLoadIdentity(); @@ -400,15 +397,15 @@ negative for the left eye subfield. class Application : public GHOST_IEventConsumer { public: - Application(GHOST_ISystem* system); + Application(GHOST_ISystem *system); ~Application(void); - virtual bool processEvent(GHOST_IEvent* event); + virtual bool processEvent(GHOST_IEvent *event); - GHOST_ISystem* m_system; - GHOST_IWindow* m_mainWindow; - GHOST_IWindow* m_secondaryWindow; - GHOST_IWindow* m_fullScreenWindow; - GHOST_ITimerTask* m_gearsTimer, *m_testTimer; + GHOST_ISystem *m_system; + GHOST_IWindow *m_mainWindow; + GHOST_IWindow *m_secondaryWindow; + GHOST_IWindow *m_fullScreenWindow; + GHOST_ITimerTask *m_gearsTimer, *m_testTimer; GHOST_TStandardCursor m_cursor; bool m_exitRequested; @@ -416,34 +413,34 @@ public: }; -Application::Application(GHOST_ISystem* system) +Application::Application(GHOST_ISystem *system) : m_system(system), m_mainWindow(0), m_secondaryWindow(0), m_fullScreenWindow(0), - m_gearsTimer(0), m_testTimer(0), m_cursor(GHOST_kStandardCursorFirstCursor), - m_exitRequested(false), stereo(false) + m_gearsTimer(0), m_testTimer(0), m_cursor(GHOST_kStandardCursorFirstCursor), + m_exitRequested(false), stereo(false) { fApp = this; // Create the main window - STR_String title1 ("gears - main window"); + STR_String title1("gears - main window"); m_mainWindow = system->createWindow(title1, 10, 64, 320, 200, GHOST_kWindowStateNormal, - GHOST_kDrawingContextTypeOpenGL, false, false); + GHOST_kDrawingContextTypeOpenGL, false, false); - if (!m_mainWindow) { + if (!m_mainWindow) { std::cout << "could not create main window\n"; exit(-1); - } + } // Create a secondary window - STR_String title2 ("gears - secondary window"); + STR_String title2("gears - secondary window"); m_secondaryWindow = system->createWindow(title2, 340, 64, 320, 200, GHOST_kWindowStateNormal, - GHOST_kDrawingContextTypeOpenGL, false, false); + GHOST_kDrawingContextTypeOpenGL, false, false); if (!m_secondaryWindow) { cout << "could not create secondary window\n"; exit(-1); } // Install a timer to have the gears running - m_gearsTimer = system->installTimer(0 /*delay*/, 20/*interval*/, gearsTimerProc, m_mainWindow); + m_gearsTimer = system->installTimer(0 /*delay*/, 20 /*interval*/, gearsTimerProc, m_mainWindow); } @@ -459,183 +456,183 @@ Application::~Application(void) } -bool Application::processEvent(GHOST_IEvent* event) +bool Application::processEvent(GHOST_IEvent *event) { - GHOST_IWindow* window = event->getWindow(); + GHOST_IWindow *window = event->getWindow(); bool handled = true; switch (event->getType()) { /* case GHOST_kEventUnknown: - break; - case GHOST_kEventCursorButton: - std::cout << "GHOST_kEventCursorButton"; break; - case GHOST_kEventCursorMove: - std::cout << "GHOST_kEventCursorMove"; break; -*/ - case GHOST_kEventWheel: + break; + case GHOST_kEventCursorButton: + std::cout << "GHOST_kEventCursorButton"; break; + case GHOST_kEventCursorMove: + std::cout << "GHOST_kEventCursorMove"; break; + */ + case GHOST_kEventWheel: { - GHOST_TEventWheelData* wheelData = (GHOST_TEventWheelData*) event->getData(); - if (wheelData->z > 0) - { - view_rotz += 5.f; - } - else - { - view_rotz -= 5.f; - } - } - break; - - case GHOST_kEventKeyUp: - break; - - case GHOST_kEventKeyDown: - { - GHOST_TEventKeyData* keyData = (GHOST_TEventKeyData*) event->getData(); - switch (keyData->key) { - case GHOST_kKeyC: + GHOST_TEventWheelData *wheelData = (GHOST_TEventWheelData *) event->getData(); + if (wheelData->z > 0) { - int cursor = m_cursor; - cursor++; - if (cursor >= GHOST_kStandardCursorNumCursors) { - cursor = GHOST_kStandardCursorFirstCursor; - } - m_cursor = (GHOST_TStandardCursor)cursor; - window->setCursorShape(m_cursor); - } - break; - - case GHOST_kKeyE: - { - int x = 200, y= 200; - m_system->setCursorPosition(x,y); - break; - } - - case GHOST_kKeyF: - if (!m_system->getFullScreen()) { - // Begin fullscreen mode - GHOST_DisplaySetting setting; - - setting.bpp = 16; - setting.frequency = 50; - setting.xPixels = 640; - setting.yPixels = 480; - m_system->beginFullScreen(setting, &m_fullScreenWindow, false /* stereo flag */); + view_rotz += 5.f; } else { - m_system->endFullScreen(); - m_fullScreenWindow = 0; + view_rotz -= 5.f; } + } + break; + + case GHOST_kEventKeyUp: break; - case GHOST_kKeyH: - window->setCursorVisibility(!window->getCursorVisibility()); - break; + case GHOST_kEventKeyDown: + { + GHOST_TEventKeyData *keyData = (GHOST_TEventKeyData *) event->getData(); + switch (keyData->key) { + case GHOST_kKeyC: + { + int cursor = m_cursor; + cursor++; + if (cursor >= GHOST_kStandardCursorNumCursors) { + cursor = GHOST_kStandardCursorFirstCursor; + } + m_cursor = (GHOST_TStandardCursor)cursor; + window->setCursorShape(m_cursor); + } + break; - case GHOST_kKeyM: - { - bool down = false; - m_system->getModifierKeyState(GHOST_kModifierKeyLeftShift,down); - if (down) { - std::cout << "left shift down\n"; + case GHOST_kKeyE: + { + int x = 200, y = 200; + m_system->setCursorPosition(x, y); + break; } - m_system->getModifierKeyState(GHOST_kModifierKeyRightShift,down); - if (down) { - std::cout << "right shift down\n"; } - m_system->getModifierKeyState(GHOST_kModifierKeyLeftAlt,down); - if (down) { - std::cout << "left Alt down\n"; - } - m_system->getModifierKeyState(GHOST_kModifierKeyRightAlt,down); - if (down) { - std::cout << "right Alt down\n"; - } - m_system->getModifierKeyState(GHOST_kModifierKeyLeftControl,down); - if (down) { - std::cout << "left control down\n"; - } - m_system->getModifierKeyState(GHOST_kModifierKeyRightControl,down); - if (down) { - std::cout << "right control down\n"; + + case GHOST_kKeyF: + if (!m_system->getFullScreen()) { + // Begin fullscreen mode + GHOST_DisplaySetting setting; + + setting.bpp = 16; + setting.frequency = 50; + setting.xPixels = 640; + setting.yPixels = 480; + m_system->beginFullScreen(setting, &m_fullScreenWindow, false /* stereo flag */); + } + else { + m_system->endFullScreen(); + m_fullScreenWindow = 0; + } + break; + + case GHOST_kKeyH: + window->setCursorVisibility(!window->getCursorVisibility()); + break; + + case GHOST_kKeyM: + { + bool down = false; + m_system->getModifierKeyState(GHOST_kModifierKeyLeftShift, down); + if (down) { + std::cout << "left shift down\n"; + } + m_system->getModifierKeyState(GHOST_kModifierKeyRightShift, down); + if (down) { + std::cout << "right shift down\n"; + } + m_system->getModifierKeyState(GHOST_kModifierKeyLeftAlt, down); + if (down) { + std::cout << "left Alt down\n"; + } + m_system->getModifierKeyState(GHOST_kModifierKeyRightAlt, down); + if (down) { + std::cout << "right Alt down\n"; + } + m_system->getModifierKeyState(GHOST_kModifierKeyLeftControl, down); + if (down) { + std::cout << "left control down\n"; + } + m_system->getModifierKeyState(GHOST_kModifierKeyRightControl, down); + if (down) { + std::cout << "right control down\n"; + } } + break; + + case GHOST_kKeyQ: + if (m_system->getFullScreen()) + { + m_system->endFullScreen(); + m_fullScreenWindow = 0; + } + m_exitRequested = true; + break; + + case GHOST_kKeyS: // toggle mono and stereo + if (stereo) + stereo = false; + else + stereo = true; + break; + + case GHOST_kKeyT: + if (!m_testTimer) { + m_testTimer = m_system->installTimer(0, 1000, testTimerProc); + } + + else { + m_system->removeTimer(m_testTimer); + m_testTimer = 0; + } + + break; + + case GHOST_kKeyW: + if (m_mainWindow) + { + STR_String title; + m_mainWindow->getTitle(title); + title += "-"; + m_mainWindow->setTitle(title); + + } + break; + + default: + break; } - break; + } + break; - case GHOST_kKeyQ: - if (m_system->getFullScreen()) - { - m_system->endFullScreen(); - m_fullScreenWindow = 0; + case GHOST_kEventWindowClose: + { + GHOST_IWindow *window2 = event->getWindow(); + if (window2 == m_mainWindow) { + m_exitRequested = true; } - m_exitRequested = true; - break; - - case GHOST_kKeyS: // toggle mono and stereo - if(stereo) - stereo = false; - else - stereo = true; - break; - - case GHOST_kKeyT: - if (!m_testTimer) { - m_testTimer = m_system->installTimer(0, 1000, testTimerProc); - } - else { - m_system->removeTimer(m_testTimer); - m_testTimer = 0; + m_system->disposeWindow(window2); } - - break; - - case GHOST_kKeyW: - if (m_mainWindow) - { - STR_String title; - m_mainWindow->getTitle(title); - title += "-"; - m_mainWindow->setTitle(title); - - } - break; - - default: - break; - } } break; - case GHOST_kEventWindowClose: + case GHOST_kEventWindowActivate: + handled = false; + break; + + case GHOST_kEventWindowDeactivate: + handled = false; + break; + + case GHOST_kEventWindowUpdate: { - GHOST_IWindow* window2 = event->getWindow(); - if (window2 == m_mainWindow) { - m_exitRequested = true; - } - else { - m_system->disposeWindow(window2); - } - } - break; - - case GHOST_kEventWindowActivate: - handled = false; - break; - - case GHOST_kEventWindowDeactivate: - handled = false; - break; - - case GHOST_kEventWindowUpdate: - { - GHOST_IWindow* window2 = event->getWindow(); - if(!m_system->validWindow(window2)) + GHOST_IWindow *window2 = event->getWindow(); + if (!m_system->validWindow(window2)) break; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - if(stereo) + if (stereo) { View(window2, stereo, LEFT_EYE); glPushMatrix(); @@ -649,8 +646,7 @@ bool Application::processEvent(GHOST_IEvent* event) RenderScene(); glPopMatrix(); } - else - { + else { View(window2, stereo); glPushMatrix(); RenderCamera(); @@ -661,15 +657,15 @@ bool Application::processEvent(GHOST_IEvent* event) } break; - default: - handled = false; - break; + default: + handled = false; + break; } return handled; } -int main(int /*argc*/, char** /*argv*/) +int main(int /*argc*/, char ** /*argv*/) { nVidiaWindows = false; // nVidiaWindows = true; @@ -678,7 +674,7 @@ int main(int /*argc*/, char** /*argv*/) /* Set a couple of settings in the registry for the nVidia detonator driver. * So this is very specific... */ - if(nVidiaWindows) + if (nVidiaWindows) { LONG lresult; HKEY hkey = 0; @@ -691,19 +687,19 @@ int main(int /*argc*/, char** /*argv*/) lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable", KEY_ALL_ACCESS); - if(lresult == ERROR_SUCCESS) + if (lresult == ERROR_SUCCESS) printf("Succesfully opened key\n"); #if 0 lresult = regkey.QueryValue(&keyValue, "StereoEnable"); - if(lresult == ERROR_SUCCESS) + if (lresult == ERROR_SUCCESS) printf("Succesfully queried key\n"); #endif lresult = regkey.SetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable", - "1"); - if(lresult == ERROR_SUCCESS) + "1"); + if (lresult == ERROR_SUCCESS) printf("Succesfully set value for key\n"); regkey.Close(); - if(lresult == ERROR_SUCCESS) + if (lresult == ERROR_SUCCESS) printf("Succesfully closed key\n"); // regkey.Write("2"); } @@ -715,14 +711,14 @@ int main(int /*argc*/, char** /*argv*/) if (fSystem) { // Create an application object - Application app (fSystem); + Application app(fSystem); // Add the application as event consumer fSystem->addEventConsumer(&app); // Enter main loop while (!app.m_exitRequested) { - //printf("main: loop\n"); + //printf("main: loop\n"); fSystem->processEvents(true); fSystem->dispatchEvents(); } @@ -735,11 +731,11 @@ int main(int /*argc*/, char** /*argv*/) } -static void gearsTimerProc(GHOST_ITimerTask* task, GHOST_TUns64 /*time*/) +static void gearsTimerProc(GHOST_ITimerTask *task, GHOST_TUns64 /*time*/) { - fAngle += 2.0; - view_roty += 1.0; - GHOST_IWindow* window = (GHOST_IWindow*)task->getUserData(); + fAngle += 2.0; + view_roty += 1.0; + GHOST_IWindow *window = (GHOST_IWindow *)task->getUserData(); if (fApp->m_fullScreenWindow) { // Running full screen fApp->m_fullScreenWindow->invalidate(); From 2f5173887e0c7f6ba19664f16b177e575d82a241 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 19 May 2012 10:10:49 +0000 Subject: [PATCH 043/159] disable overwriting the PYTHONPATH for windows - reported as [#31506] --- source/blender/python/generic/py_capi_utils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 0e5122787b8..3a405575926 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -483,12 +483,15 @@ void PyC_SetHomePath(const char *py_path_bundle) \nThis may make python import function fail\n"); #endif + +#if 0 /* disable for now [#31506] - campbell */ #ifdef _WIN32 /* cmake/MSVC debug build crashes without this, why only * in this case is unknown.. */ { BLI_setenv("PYTHONPATH", py_path_bundle); } +#endif #endif { From af3e348430218e609c80d86c8dd418bed15e70e8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 19 May 2012 13:28:19 +0000 Subject: [PATCH 044/159] code cleanup: use TRUE/FALSE rather then 1/0 for better readability, also replace do prefix with do_ for bool vars. --- source/blender/blenkernel/BKE_sequencer.h | 8 ++-- source/blender/blenkernel/intern/anim.c | 12 ++--- source/blender/blenkernel/intern/armature.c | 31 +++++++------ .../blender/blenkernel/intern/cdderivedmesh.c | 24 +++++----- source/blender/blenkernel/intern/context.c | 5 +- source/blender/blenkernel/intern/curve.c | 12 ++--- source/blender/blenkernel/intern/depsgraph.c | 4 +- .../blender/blenkernel/intern/dynamicpaint.c | 4 +- .../blenkernel/intern/editderivedmesh.c | 10 ++-- source/blender/blenkernel/intern/fcurve.c | 16 +++---- source/blender/blenkernel/intern/group.c | 6 +-- source/blender/blenkernel/intern/lattice.c | 24 ++++++---- source/blender/blenkernel/intern/mball.c | 12 ++--- source/blender/blenkernel/intern/movieclip.c | 2 +- source/blender/blenkernel/intern/node.c | 6 +-- source/blender/blenkernel/intern/particle.c | 6 +-- source/blender/blenkernel/intern/pointcache.c | 8 ++-- source/blender/blenkernel/intern/screen.c | 5 +- source/blender/blenkernel/intern/seqeffects.c | 8 ++-- source/blender/blenkernel/intern/sequencer.c | 2 +- source/blender/blenkernel/intern/softbody.c | 2 +- .../blender/blenkernel/intern/subsurf_ccg.c | 10 ++-- source/blender/blenkernel/intern/text.c | 6 +-- source/blender/blenlib/intern/BLI_args.c | 2 +- source/blender/blenlib/intern/uvproject.c | 8 ++-- source/blender/blenloader/intern/readfile.c | 28 +++++------ .../blenloader/intern/versioning_250.c | 4 +- source/blender/blenloader/intern/writefile.c | 8 ++-- source/blender/bmesh/intern/bmesh_mods.c | 6 +-- source/blender/bmesh/intern/bmesh_polygon.c | 6 +-- source/blender/bmesh/tools/BME_bevel.c | 6 +-- .../editors/animation/anim_channels_defines.c | 4 +- .../editors/animation/anim_channels_edit.c | 4 +- source/blender/editors/animation/drivers.c | 2 +- .../blender/editors/armature/editarmature.c | 6 +-- source/blender/editors/armature/poseobject.c | 8 ++-- source/blender/editors/armature/reeb.c | 4 +- .../editors/interface/interface_handlers.c | 4 +- .../editors/interface/interface_layout.c | 2 +- .../blender/editors/interface/interface_ops.c | 4 +- .../editors/interface/interface_panel.c | 4 +- source/blender/editors/interface/resources.c | 2 +- source/blender/editors/interface/view2d.c | 14 +++--- source/blender/editors/mesh/editface.c | 8 ++-- source/blender/editors/mesh/editmesh_tools.c | 8 ++-- source/blender/editors/object/object_add.c | 6 +-- source/blender/editors/object/object_bake.c | 2 +- source/blender/editors/object/object_edit.c | 14 +++--- .../blender/editors/object/object_modifier.c | 4 +- source/blender/editors/object/object_ops.c | 2 +- .../blender/editors/object/object_relations.c | 6 +-- .../blender/editors/physics/physics_fluid.c | 6 +-- .../blender/editors/render/render_internal.c | 6 +-- .../blender/editors/render/render_preview.c | 10 ++-- .../blender/editors/render/render_shading.c | 4 +- source/blender/editors/screen/area.c | 10 ++-- source/blender/editors/screen/screen_edit.c | 16 +++---- source/blender/editors/screen/screen_ops.c | 6 +-- source/blender/editors/screen/screendump.c | 4 +- .../editors/sculpt_paint/paint_image.c | 21 +++++---- .../editors/space_console/console_ops.c | 8 ++-- source/blender/editors/space_file/filelist.c | 4 +- .../editors/space_logic/logic_window.c | 46 +++++++++---------- .../blender/editors/space_nla/nla_buttons.c | 6 +-- source/blender/editors/space_nla/nla_draw.c | 12 ++--- source/blender/editors/space_nla/nla_edit.c | 4 +- source/blender/editors/space_node/drawnode.c | 22 ++++----- source/blender/editors/space_node/node_edit.c | 18 ++++---- .../editors/space_sequencer/sequencer_edit.c | 6 +-- .../space_sequencer/sequencer_select.c | 4 +- source/blender/editors/space_text/text_ops.c | 2 +- .../blender/editors/space_time/space_time.c | 4 +- .../editors/space_view3d/drawarmature.c | 2 +- .../blender/editors/space_view3d/drawmesh.c | 20 ++++---- .../blender/editors/space_view3d/drawobject.c | 4 +- .../editors/space_view3d/view3d_draw.c | 6 +-- .../editors/space_view3d/view3d_edit.c | 4 +- .../editors/space_view3d/view3d_select.c | 16 +++---- source/blender/editors/transform/transform.c | 32 ++++++------- .../editors/transform/transform_conversions.c | 42 ++++++++--------- .../editors/transform/transform_manipulator.c | 8 ++-- .../transform/transform_orientations.c | 2 +- source/blender/editors/util/editmode_undo.c | 8 ++-- source/blender/editors/util/undo.c | 8 ++-- .../editors/uvedit/uvedit_smart_stitch.c | 2 +- source/blender/gpu/intern/gpu_draw.c | 6 +-- source/blender/gpu/intern/gpu_material.c | 4 +- source/blender/imbuf/intern/indexer.c | 4 +- source/blender/imbuf/intern/jp2.c | 4 +- source/blender/imbuf/intern/scaling.c | 20 ++++---- source/blender/makesrna/intern/rna_nodetree.c | 2 +- .../nodes/composite/node_composite_util.c | 4 +- .../composite/nodes/node_composite_defocus.c | 2 +- .../nodes/node_composite_outputFile.c | 2 +- source/blender/nodes/intern/node_common.c | 2 +- source/blender/nodes/intern/node_exec.c | 4 +- .../blender/nodes/shader/node_shader_util.c | 10 ++-- source/blender/python/intern/bpy_driver.c | 4 +- source/blender/python/intern/bpy_interface.c | 6 +-- .../render/intern/source/convertblender.c | 40 ++++++++-------- source/blender/render/intern/source/envmap.c | 4 +- .../blender/render/intern/source/initrender.c | 2 +- .../blender/render/intern/source/pipeline.c | 8 ++-- .../render/intern/source/pixelshading.c | 4 +- .../blender/render/intern/source/rayshade.c | 16 +++---- .../render/intern/source/render_texture.c | 34 +++++++------- .../blender/render/intern/source/rendercore.c | 28 +++++------ .../render/intern/source/renderdatabase.c | 4 +- .../render/intern/source/shadeoutput.c | 22 +++++---- source/blender/render/intern/source/sss.c | 10 ++-- source/blender/windowmanager/intern/wm_draw.c | 20 ++++---- .../windowmanager/intern/wm_event_system.c | 22 ++++----- .../blender/windowmanager/intern/wm_gesture.c | 2 +- source/blender/windowmanager/intern/wm_jobs.c | 3 +- .../windowmanager/intern/wm_operators.c | 2 +- .../blender/windowmanager/intern/wm_window.c | 4 +- 116 files changed, 545 insertions(+), 526 deletions(-) diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index 4ddafbbaae9..f06e0e2f71a 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -67,8 +67,8 @@ void seq_end(SeqIterator *iter); void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int use_pointer); #define SEQP_BEGIN(ed, _seq) \ - { \ - SeqIterator iter; \ + { \ + SeqIterator iter; \ for (seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \ _seq = iter.seq; @@ -79,8 +79,8 @@ void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int us _seq = iter.seq; #define SEQ_END \ - } \ - seq_end(&iter); \ + } \ + seq_end(&iter); \ } typedef struct SeqRenderData { diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index ed6eceb036b..6198a119ac4 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -751,14 +751,14 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i dob = new_dupli_object(lb, go->ob, mat, ob->lay, 0, OB_DUPLIGROUP, animated); /* check the group instance and object layers match, also that the object visible flags are ok. */ - if ( (dob->origlay & group->layer) == 0 || - (G.rendering == 0 && dob->ob->restrictflag & OB_RESTRICT_VIEW) || - (G.rendering && dob->ob->restrictflag & OB_RESTRICT_RENDER) - ) { - dob->no_draw = 1; + if ((dob->origlay & group->layer) == 0 || + (G.rendering == 0 && dob->ob->restrictflag & OB_RESTRICT_VIEW) || + (G.rendering && dob->ob->restrictflag & OB_RESTRICT_RENDER)) + { + dob->no_draw = TRUE; } else { - dob->no_draw = 0; + dob->no_draw = FALSE; } if (go->ob->transflag & OB_DUPLI) { diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index fe95d15f82e..752036c6b9f 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -437,7 +437,7 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest) float h1[3], h2[3], scale[3], length, hlength1, hlength2, roll1 = 0.0f, roll2; float mat3[3][3], imat[4][4], posemat[4][4], scalemat[4][4], iscalemat[4][4]; float data[MAX_BBONE_SUBDIV + 1][4], *fp; - int a, doscale = 0; + int a, do_scale = 0; length = bone->length; @@ -455,7 +455,7 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest) invert_m4_m4(iscalemat, scalemat); length *= scale[1]; - doscale = 1; + do_scale = 1; } } @@ -476,7 +476,7 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest) if (rest) { invert_m4_m4(imat, pchan->bone->arm_mat); } - else if (doscale) { + else if (do_scale) { copy_m4_m4(posemat, pchan->pose_mat); normalize_m4(posemat); invert_m4_m4(imat, posemat); @@ -581,7 +581,7 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest) copy_m4_m3(result_array[a].mat, mat3); copy_v3_v3(result_array[a].mat[3], fp); - if (doscale) { + if (do_scale) { /* correct for scaling when this matrix is used in scaled space */ mul_serie_m4(result_array[a].mat, iscalemat, result_array[a].mat, scalemat, NULL, NULL, NULL, NULL, NULL); } @@ -835,7 +835,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, float const short invert_vgroup = deformflag & ARM_DEF_INVERT_VGROUP; int defbase_tot = 0; /* safety for vertexgroup index overflow */ int i, target_totvert = 0; /* safety for vertexgroup overflow */ - int use_dverts = 0; + int use_dverts = FALSE; int armature_def_nr; int totchan; @@ -895,11 +895,12 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, float if (deformflag & ARM_DEF_VGROUP) { if (ELEM(target->type, OB_MESH, OB_LATTICE)) { /* if we have a DerivedMesh, only use dverts if it has them */ - if (dm) - if (dm->getVertData(dm, 0, CD_MDEFORMVERT)) - use_dverts = 1; - else use_dverts = 0; - else if (dverts) use_dverts = 1; + if (dm) { + use_dverts = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL); + } + else if (dverts) { + use_dverts = TRUE; + } if (use_dverts) { defnrToPC = MEM_callocN(sizeof(*defnrToPC) * defbase_tot, "defnrToBone"); @@ -2245,13 +2246,13 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha int do_modif; for (strip = armob->nlastrips.first; strip; strip = strip->next) { - do_modif = 0; + do_modif = FALSE; if (scene_cfra >= strip->start && scene_cfra <= strip->end) - do_modif = 1; + do_modif = TRUE; if ((scene_cfra > strip->end) && (strip->flag & ACTSTRIP_HOLDLASTFRAME)) { - do_modif = 1; + do_modif = TRUE; /* if there are any other strips active, ignore modifiers for this strip - * 'hold' option should only hold action modifiers if there are @@ -2261,7 +2262,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha if (scene_cfra >= strip2->start && scene_cfra <= strip2->end) { if (!(strip2->flag & ACTSTRIP_MUTE)) - do_modif = 0; + do_modif = FALSE; } } @@ -2270,7 +2271,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha for (strip2 = strip->next; strip2; strip2 = strip2->next) { if (scene_cfra < strip2->start) continue; if ((strip2->flag & ACTSTRIP_HOLDLASTFRAME) && !(strip2->flag & ACTSTRIP_MUTE)) { - do_modif = 0; + do_modif = FALSE; } } } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 3450408a0a0..cc49652d6e5 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1039,13 +1039,13 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, MFace *mface = cddm->mface; /* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */ float (*nors)[3] = dm->getTessFaceDataArray(dm, CD_NORMAL); - int a, b, dodraw, matnr, new_matnr; + int a, b, do_draw, matnr, new_matnr; int orig, *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX); cdDM_update_normals_from_pbvh(dm); matnr = -1; - dodraw = 0; + do_draw = FALSE; glShadeModel(GL_SMOOTH); @@ -1062,14 +1062,14 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, if (new_matnr != matnr) { glEnd(); - dodraw = setMaterial(matnr = new_matnr, &gattribs); - if (dodraw) + do_draw = setMaterial(matnr = new_matnr, &gattribs); + if (do_draw) DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs); glBegin(GL_QUADS); } - if (!dodraw) { + if (!do_draw) { continue; } else if (setDrawOptions) { @@ -1139,7 +1139,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, numfaces = curface - start; if (numfaces > 0) { - if (dodraw) { + if (do_draw) { if (numdata != 0) { @@ -1161,9 +1161,9 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } numdata = 0; start = curface; - /* prevdraw = dodraw; */ /* UNUSED */ - dodraw = setMaterial(matnr = new_matnr, &gattribs); - if (dodraw) { + /* prevdraw = do_draw; */ /* UNUSED */ + do_draw = setMaterial(matnr = new_matnr, &gattribs); + if (do_draw) { DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs); if (attribs.totorco) { @@ -1215,7 +1215,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } } - if (dodraw && numdata != 0) { + if (do_draw && numdata != 0) { offset = 0; if (attribs.totorco) { copy_v3_v3((float *)&varray[elementsize * curface * 3], (float *)attribs.orco.array[mface->v1]); @@ -1257,7 +1257,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } curface++; if (mface->v4) { - if (dodraw && numdata != 0) { + if (do_draw && numdata != 0) { offset = 0; if (attribs.totorco) { copy_v3_v3((float *)&varray[elementsize * curface * 3], (float *)attribs.orco.array[mface->v3]); @@ -1302,7 +1302,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } numfaces = curface - start; if (numfaces > 0) { - if (dodraw) { + if (do_draw) { if (numdata != 0) { GPU_buffer_unlock(buffer); GPU_interleaved_attrib_setup(buffer, datatypes, numdata); diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index d736309f605..4cdb4e1b66e 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -44,6 +44,7 @@ #include "BLI_listbase.h" #include "BLI_string.h" +#include "BLI_utildefines.h" #include "BKE_context.h" #include "BKE_main.h" @@ -251,7 +252,7 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res bScreen *sc; ScrArea *sa; ARegion *ar; - int done = 0, recursion = C->data.recursion; + int done = FALSE, recursion = C->data.recursion; int ret = 0; memset(result, 0, sizeof(bContextDataResult)); @@ -279,7 +280,7 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res entry = BLI_rfindstring(&C->wm.store->entries, member, offsetof(bContextStoreEntry, name)); if (entry) { result->ptr = entry->ptr; - done = 1; + done = TRUE; } } if (done != 1 && recursion < 2 && (ar = CTX_wm_region(C))) { diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 6a0991cf4e5..ce62b9c10dc 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -378,7 +378,7 @@ void BKE_curve_texspace_calc(Curve *cu) DispList *dl; BoundBox *bb; float *fp, min[3], max[3]; - int tot, doit = 0; + int tot, do_it = FALSE; if (cu->bb == NULL) cu->bb = MEM_callocN(sizeof(BoundBox), "boundbox"); @@ -390,7 +390,7 @@ void BKE_curve_texspace_calc(Curve *cu) while (dl) { tot = ELEM(dl->type, DL_INDEX3, DL_INDEX4) ? dl->nr : dl->nr * dl->parts; - if (tot) doit = 1; + if (tot) do_it = TRUE; fp = dl->verts; while (tot--) { minmax_v3v3_v3(min, max, fp); @@ -399,7 +399,7 @@ void BKE_curve_texspace_calc(Curve *cu) dl = dl->next; } - if (!doit) { + if (do_it == FALSE) { min[0] = min[1] = min[2] = -1.0f; max[0] = max[1] = max[2] = 1.0f; } @@ -1272,12 +1272,12 @@ float *BKE_curve_surf_make_orco(Object *ob) for (b = 0; b < sizeu; b++) { int use_b = b; if (b == sizeu - 1 && (nu->flagu & CU_NURB_CYCLIC)) - use_b = 0; + use_b = FALSE; for (a = 0; a < sizev; a++) { int use_a = a; if (a == sizev - 1 && (nu->flagv & CU_NURB_CYCLIC)) - use_a = 0; + use_a = FALSE; tdata = _tdata + 3 * (use_b * (nu->pntsv * resolv) + use_a); @@ -2216,7 +2216,7 @@ void BKE_curve_bevelList_make(Object *ob) /* check if we will calculate tilt data */ do_tilt = CU_DO_TILT(cu, nu); do_radius = CU_DO_RADIUS(cu, nu); /* normal display uses the radius, better just to calculate them */ - do_weight = 1; + do_weight = TRUE; /* check we are a single point? also check we are not a surface and that the orderu is sane, * enforced in the UI but can go wrong possibly */ diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index e44264c8d4b..2b08c085417 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -2631,7 +2631,7 @@ void DAG_ids_flush_tagged(Main *bmain) ListBase *lbarray[MAX_LIBARRAY]; Scene *sce; unsigned int lay; - int a, do_flush = 0; + int a, do_flush = FALSE; dag_current_scene_layers(bmain, &sce, &lay); @@ -2651,7 +2651,7 @@ void DAG_ids_flush_tagged(Main *bmain) for (; id; id = id->next) { if (id->flag & (LIB_ID_RECALC | LIB_ID_RECALC_DATA)) { dag_id_flush_update(sce, id); - do_flush = 1; + do_flush = TRUE; } } } diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index b3ed3dcaf1d..d526ce7afdc 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -276,12 +276,12 @@ DynamicPaintSurface *get_activeSurface(DynamicPaintCanvasSettings *canvas) void dynamicPaint_resetPreview(DynamicPaintCanvasSettings *canvas) { DynamicPaintSurface *surface = canvas->surfaces.first; - int done = 0; + int done = FALSE; for (; surface; surface = surface->next) { if (!done && dynamicPaint_surfaceHasColorPreview(surface)) { surface->flags |= MOD_DPAINT_PREVIEW; - done = 1; + done = TRUE; } else surface->flags &= ~MOD_DPAINT_PREVIEW; diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 3e25281dd08..f1000a95e95 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -980,9 +980,9 @@ static void emDM_drawMappedFacesGLSL(DerivedMesh *dm, DMVertexAttribs attribs; GPUVertexAttribs gattribs; - int i, b, matnr, new_matnr, dodraw; + int i, b, matnr, new_matnr, do_draw; - dodraw = 0; + do_draw = FALSE; matnr = -1; memset(&attribs, 0, sizeof(attribs)); @@ -1026,12 +1026,12 @@ static void emDM_drawMappedFacesGLSL(DerivedMesh *dm, new_matnr = efa->mat_nr + 1; if (new_matnr != matnr) { - dodraw = setMaterial(matnr = new_matnr, &gattribs); - if (dodraw) + do_draw = setMaterial(matnr = new_matnr, &gattribs); + if (do_draw) DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs); } - if (dodraw) { + if (do_draw) { glBegin(GL_TRIANGLES); if (!drawSmooth) { if (vertexCos) glNormal3fv(bmdm->polyNos[BM_elem_index_get(efa)]); diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 9d878cd185f..2a0f49262bc 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -505,7 +505,7 @@ void calc_fcurve_bounds(FCurve *fcu, float *xmin, float *xmax, float *ymin, floa BezTriple *bezt; for (bezt = fcu->bezt, i = 0; i < fcu->totvert; bezt++, i++) { - if ((do_sel_only == 0) || BEZSELECTED(bezt)) { + if ((do_sel_only == FALSE) || BEZSELECTED(bezt)) { if (bezt->vec[1][1] < yminv) yminv = bezt->vec[1][1]; if (bezt->vec[1][1] > ymaxv) @@ -1241,7 +1241,7 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar) bPoseChannel *pchan; float mat[4][4]; float oldEul[3] = {0.0f, 0.0f, 0.0f}; - short useEulers = 0, rotOrder = ROT_MODE_EUL; + short use_eulers = FALSE, rot_order = ROT_MODE_EUL; /* check if this target has valid data */ if ((ob == NULL) || (GS(ob->id.name) != ID_OB)) { @@ -1263,8 +1263,8 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar) /* bone */ if (pchan->rotmode > 0) { copy_v3_v3(oldEul, pchan->eul); - rotOrder = pchan->rotmode; - useEulers = 1; + rot_order = pchan->rotmode; + use_eulers = TRUE; } if (dtar->flag & DTAR_FLAG_LOCALSPACE) { @@ -1290,8 +1290,8 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar) /* object */ if (ob->rotmode > 0) { copy_v3_v3(oldEul, ob->rot); - rotOrder = ob->rotmode; - useEulers = 1; + rot_order = ob->rotmode; + use_eulers = TRUE; } if (dtar->flag & DTAR_FLAG_LOCALSPACE) { @@ -1334,9 +1334,9 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar) */ float eul[3]; - mat4_to_eulO(eul, rotOrder, mat); + mat4_to_eulO(eul, rot_order, mat); - if (useEulers) { + if (use_eulers) { compatible_eul(eul, oldEul); } diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c index 2fc436ab4de..8f077ab107c 100644 --- a/source/blender/blenkernel/intern/group.c +++ b/source/blender/blenkernel/intern/group.c @@ -300,7 +300,7 @@ static void group_replaces_nla(Object *parent, Object *target, char mode) { static ListBase nlastrips = {NULL, NULL}; static bAction *action = NULL; - static int done = 0; + static int done = FALSE; bActionStrip *strip, *nstrip; if (mode == 's') { @@ -314,7 +314,7 @@ static void group_replaces_nla(Object *parent, Object *target, char mode) action = target->action; target->action = NULL; target->nlaflag |= OB_NLA_OVERRIDE; - done = 1; + done = TRUE; } nstrip = MEM_dupallocN(strip); BLI_addtail(&target->nlastrips, nstrip); @@ -329,7 +329,7 @@ static void group_replaces_nla(Object *parent, Object *target, char mode) nlastrips.first = nlastrips.last = NULL; /* not needed, but yah... :) */ action = NULL; - done = 0; + done = FALSE; } } } diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 6a69ffb474a..025ea40e82b 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -658,13 +658,15 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, */ if (target && target->type == OB_MESH) { /* if there's derived data without deformverts, don't use vgroups */ - if (dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT)) - use_vgroups = 0; - else - use_vgroups = 1; + if (dm) { + use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL); + } + else { + use_vgroups = FALSE; + } } else { - use_vgroups = 0; + use_vgroups = FALSE; } if (vgroup && vgroup[0] && use_vgroups) { @@ -801,13 +803,15 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, */ if (target && target->type == OB_MESH) { /* if there's derived data without deformverts, don't use vgroups */ - if (dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT)) - use_vgroups = 0; - else - use_vgroups = 1; + if (dm) { + use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL); + } + else { + use_vgroups = FALSE; + } } else { - use_vgroups = 0; + use_vgroups = FALSE; } if (vgroup && vgroup[0] && use_vgroups) { diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 7da0661fef6..bef5f2e18a3 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -351,7 +351,7 @@ void BKE_mball_texspace_calc(Object *ob) DispList *dl; BoundBox *bb; float *data, min[3], max[3] /*, loc[3], size[3] */; - int tot, doit = 0; + int tot, do_it = FALSE; if (ob->bb == NULL) ob->bb = MEM_callocN(sizeof(BoundBox), "mb boundbox"); bb = ob->bb; @@ -364,7 +364,7 @@ void BKE_mball_texspace_calc(Object *ob) dl = ob->disp.first; while (dl) { tot = dl->nr; - if (tot) doit = 1; + if (tot) do_it = TRUE; data = dl->verts; while (tot--) { /* Also weird... but longer. From utildefines. */ @@ -374,7 +374,7 @@ void BKE_mball_texspace_calc(Object *ob) dl = dl->next; } - if (!doit) { + if (!do_it) { min[0] = min[1] = min[2] = -1.0f; max[0] = max[1] = max[2] = 1.0f; } @@ -1135,11 +1135,11 @@ static int otherface(int edge, int face) static void makecubetable(void) { - static int isdone = 0; + static int is_done = FALSE; int i, e, c, done[12], pos[8]; - if (isdone) return; - isdone = 1; + if (is_done) return; + is_done = TRUE; for (i = 0; i < 256; i++) { for (e = 0; e < 12; e++) done[e] = 0; diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index f07de7f0127..5dcec603b91 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -195,7 +195,7 @@ static ImBuf *movieclip_load_sequence_file(MovieClip *clip, MovieClipUser *user, { struct ImBuf *ibuf; char name[FILE_MAX]; - int loadflag, use_proxy = 0; + int loadflag, use_proxy = FALSE; use_proxy = (flag & MCLIP_USE_PROXY) && user->render_size != MCLIP_PROXY_RENDER_SIZE_FULL; if (use_proxy) { diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index c6424580a31..8771e8de67e 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1392,7 +1392,7 @@ static int node_get_deplist_recurs(bNode *node, bNode ***nsort) bNodeSocket *sock; int level = 0xFFF; - node->done= 1; + node->done = TRUE; /* check linked nodes */ for (sock= node->inputs.first; sock; sock= sock->next) { @@ -1431,7 +1431,7 @@ void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, in /* first clear data */ for (node= ntree->nodes.first; node; node= node->next) { - node->done= 0; + node->done = FALSE; (*totnodes)++; } if (*totnodes==0) { @@ -1456,7 +1456,7 @@ static void ntree_update_node_level(bNodeTree *ntree) /* first clear tag */ for (node= ntree->nodes.first; node; node= node->next) { - node->done= 0; + node->done = FALSE; } /* recursive check */ diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 8676a3e75a0..4ca9f9c281b 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -614,7 +614,7 @@ typedef struct ParticleRenderData { float viewmat[4][4], winmat[4][4]; int winx, winy; - int dosimplify; + int do_simplify; int timeoffset; ParticleRenderElem *elems; int *origindex; @@ -821,7 +821,7 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot) if (data->elems) MEM_freeN(data->elems); - data->dosimplify = 1; + data->do_simplify = TRUE; data->elems = elems; data->origindex = origindex; @@ -960,7 +960,7 @@ int psys_render_simplify_params(ParticleSystem *psys, ChildParticle *cpa, float return 0; data = psys->renderdata; - if (!data->dosimplify) + if (!data->do_simplify) return 0; b = (data->origindex) ? data->origindex[cpa->num] : cpa->num; diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 69808db52b6..f483fd7dc8a 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -2732,7 +2732,7 @@ static void ptcache_dt_to_str(char *str, double dtime) static void *ptcache_bake_thread(void *ptr) { - int usetimer = 0, sfra, efra; + int use_timer = FALSE, sfra, efra; double stime, ptime, ctime, fetd; char run[32], cur[32], etd[32]; @@ -2752,8 +2752,8 @@ static void *ptcache_bake_thread(void *ptr) fetd = (ctime-ptime)*(efra-*data->cfra_ptr)/data->step; - if (usetimer || fetd > 60.0) { - usetimer = 1; + if (use_timer || fetd > 60.0) { + use_timer = TRUE; ptcache_dt_to_str(cur, ctime-ptime); ptcache_dt_to_str(run, ctime-stime); @@ -2765,7 +2765,7 @@ static void *ptcache_bake_thread(void *ptr) } } - if (usetimer) { + if (use_timer) { ptcache_dt_to_str(run, PIL_check_seconds_timer()-stime); printf("Bake %s %s (%i frames simulated).\n", (data->break_operation ? "canceled after" : "finished in"), run, *data->cfra_ptr-sfra); } diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 1f129b1c547..4dfa9f7e12e 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -44,7 +44,8 @@ #include "DNA_space_types.h" #include "DNA_view3d_types.h" -#include "BLI_blenlib.h" +#include "BLI_listbase.h" +#include "BLI_utildefines.h" #include "BKE_screen.h" @@ -251,7 +252,7 @@ void BKE_spacedata_draw_locks(int set) if (set) art->do_lock = art->lock; else - art->do_lock = 0; + art->do_lock = FALSE; } } } diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index ca851fd4c81..fac74d27e0d 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -291,9 +291,9 @@ static ImBuf *do_plugin_effect( { char *cp; int float_rendering; - int use_temp_bufs = 0; /* Are needed since blur.c (and maybe some other - * old plugins) do very bad stuff - * with imbuf-internals */ + int use_temp_bufs = FALSE; /* Are needed since blur.c (and maybe some other + * old plugins) do very bad stuff + * with imbuf-internals */ struct ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); int x = context.rectx; @@ -319,7 +319,7 @@ static ImBuf *do_plugin_effect( float_rendering = (out->rect_float != NULL); if (seq->plugin->version <= 3 && float_rendering) { - use_temp_bufs = 1; + use_temp_bufs = TRUE; if (ibuf1) { ibuf1 = IMB_dupImBuf(ibuf1); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 41858eeecb4..a762af960a5 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1464,7 +1464,7 @@ void seq_proxy_rebuild(SeqIndexBuildContext *context, short *stop, short *do_upd *progress = (float)cfra / (seq->enddisp - seq->endstill - seq->startdisp + seq->startstill); - *do_update = 1; + *do_update = TRUE; if (*stop || G.afbreek) break; diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 1041fb12305..fe7ec83407b 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -1685,7 +1685,7 @@ static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow, else sb_threads[i].ifirst = 0; sb_threads[i].do_effector = do_effector; - sb_threads[i].do_deflector = 0;// not used here + sb_threads[i].do_deflector = FALSE;// not used here sb_threads[i].fieldfactor = 0.0f;// not used here sb_threads[i].windfactor = 0.0f;// not used here sb_threads[i].nr= i; diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index aec54ba827a..ad5bb24e541 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -1788,12 +1788,12 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int gridFaces = gridSize - 1; int edgeSize = ccgSubSurf_getEdgeSize(ss); DMFlagMat *faceFlags = ccgdm->faceFlags; - int a, b, i, doDraw, numVerts, matnr, new_matnr, totface; + int a, b, i, do_draw, numVerts, matnr, new_matnr, totface; CCG_key_top_level(&key, ss); ccgdm_pbvh_update(ccgdm); - doDraw = 0; + do_draw = 0; matnr = -1; #define PASSATTRIB(dx, dy, vert) { \ @@ -1837,12 +1837,12 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, } if (new_matnr != matnr) { - doDraw = setMaterial(matnr = new_matnr, &gattribs); - if (doDraw) + do_draw = setMaterial(matnr = new_matnr, &gattribs); + if (do_draw) DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs); } - if (!doDraw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && + if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP))) { a += gridFaces * gridFaces * numVerts; diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 7634528927a..32cf966b7fd 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -912,7 +912,7 @@ void txt_move_left(Text *text, short sel) void txt_move_right(Text *text, short sel) { TextLine **linep; - int *charp, oundoing = undoing, do_tab = 0, i; + int *charp, oundoing = undoing, do_tab = FALSE, i; if (!text) return; if (sel) txt_curs_sel(text, &linep, &charp); @@ -931,10 +931,10 @@ void txt_move_right(Text *text, short sel) // do nice right only if there are only spaces // spaces hardcoded in DNA_text_types.h if (text->flags & TXT_TABSTOSPACES && (*linep)->line[*charp] == ' ') { - do_tab = 1; + do_tab = TRUE; for (i = 0; i < *charp; i++) if ((*linep)->line[i] != ' ') { - do_tab = 0; + do_tab = FALSE; break; } } diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c index 4e194b24c1e..785c9f9f32b 100644 --- a/source/blender/blenlib/intern/BLI_args.c +++ b/source/blender/blenlib/intern/BLI_args.c @@ -240,7 +240,7 @@ void BLI_argsPrintArgDoc(struct bArgs *ba, const char *arg) internalDocPrint(d); - d->done = 1; + d->done = TRUE; } } diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index 18c69bd2ba8..1b59dc6a3f5 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -58,7 +58,7 @@ void BLI_uvproject_from_camera(float target[2], float source[3], ProjCameraInfo if (uci->do_pano) { float angle = atan2f(pv4[0], -pv4[2]) / ((float)M_PI * 2.0f); /* angle around the camera */ - if (uci->do_persp == 0) { + if (uci->do_persp == FALSE) { target[0] = angle; /* no correct method here, just map to 0-1 */ target[1] = pv4[1] / uci->camsize; } @@ -74,7 +74,7 @@ void BLI_uvproject_from_camera(float target[2], float source[3], ProjCameraInfo if (pv4[2] == 0.0f) pv4[2] = 0.00001f; /* don't allow div by 0 */ - if (uci->do_persp == 0) { + if (uci->do_persp == FALSE) { target[0] = (pv4[0] / uci->camsize); target[1] = (pv4[1] / uci->camsize); } @@ -154,10 +154,10 @@ ProjCameraInfo *BLI_uvproject_camera_info(Object *ob, float(*rotmat)[4], float w /* normal projection */ if (rotmat) { copy_m4_m4(uci.rotmat, rotmat); - uci.do_rotmat = 1; + uci.do_rotmat = TRUE; } else { - uci.do_rotmat = 0; + uci.do_rotmat = FALSE; } /* also make aspect ratio adjustment factors */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 01303eeb735..2b5eebb0f73 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5023,7 +5023,7 @@ static void direct_link_scene(FileData *fd, Scene *sce) seq->strip = newdataadr(fd, seq->strip); if (seq->strip && seq->strip->done==0) { - seq->strip->done = 1; + seq->strip->done = TRUE; if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE || @@ -5732,7 +5732,7 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype) ar->swinid = 0; ar->type = NULL; ar->swap = 0; - ar->do_draw = 0; + ar->do_draw = FALSE; memset(&ar->drawrct, 0, sizeof(ar->drawrct)); } @@ -8537,12 +8537,12 @@ static void expand_main(FileData *fd, Main *mainvar) { ListBase *lbarray[MAX_LIBARRAY]; ID *id; - int a, doit = 1; + int a, do_it = TRUE; if (fd == NULL) return; - while (doit) { - doit = 0; + while (do_it) { + do_it = FALSE; a = set_listbasepointers(mainvar, lbarray); while (a--) { @@ -8618,7 +8618,7 @@ static void expand_main(FileData *fd, Main *mainvar) break; } - doit = 1; + do_it = TRUE; id->flag -= LIB_TEST; } @@ -8655,15 +8655,15 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, const * * (ob->id.flag & LIB_PRE_EXISTING)==0 means that this is a newly appended object - Campbell */ if (is_group_append==0 || (ob->id.flag & LIB_PRE_EXISTING)==0) { - int do_it= 0; + int do_it = FALSE; if (ob->id.us == 0) { - do_it = 1; + do_it = TRUE; } else if (idcode==ID_GR) { if (ob->id.us==1 && is_link==FALSE && ob->id.lib==lib) { if ((ob->flag & OB_FROMGROUP) && object_in_any_scene(mainvar, ob)==0) { - do_it = 1; + do_it = TRUE; } } } @@ -8675,7 +8675,7 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, const * have a linked object which is not in any scene [#27616] */ if ((ob->id.flag & LIB_PRE_EXISTING)==0) { if (object_in_any_scene(mainvar, ob)==0) { - do_it = 1; + do_it = TRUE; } } } @@ -8971,10 +8971,10 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) Main *mainl = mainlist->first; Main *mainptr; ListBase *lbarray[MAX_LIBARRAY]; - int a, doit= 1; + int a, do_it = TRUE; - while (doit) { - doit = 0; + while (do_it) { + do_it = FALSE; /* test 1: read libdata */ mainptr= mainl->next; @@ -9040,7 +9040,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) } } if (fd) { - doit = 1; + do_it = TRUE; a = set_listbasepointers(mainptr, lbarray); while (a--) { ID *id = lbarray[a]->first; diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index 8a8705532cb..4cf17b2c24c 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -1084,7 +1084,7 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *main) World *wo; Tex *tex; ParticleSettings *part; - int do_gravity = 0; + int do_gravity = FALSE; for (sce = main->scene.first; sce; sce = sce->id.next) if (sce->unit.scale_length == 0.0f) @@ -1140,7 +1140,7 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *main) sce->physics_settings.gravity[0] = sce->physics_settings.gravity[1] = 0.0f; sce->physics_settings.gravity[2] = -9.81f; sce->physics_settings.flag = PHYS_GLOBAL_GRAVITY; - do_gravity = 1; + do_gravity = TRUE; } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index f065ae238a6..02ebc91f191 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2141,7 +2141,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase) SEQ_BEGIN (ed, seq) { - if (seq->strip) seq->strip->done= 0; + if (seq->strip) seq->strip->done = FALSE; writestruct(wd, DATA, "Sequence", 1, seq); } SEQ_END @@ -2191,7 +2191,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase) else if (seq->type==SEQ_MOVIE || seq->type==SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) writestruct(wd, DATA, "StripElem", 1, strip->stripdata); - strip->done= 1; + strip->done = TRUE; } } SEQ_END @@ -2467,11 +2467,11 @@ static void write_libraries(WriteData *wd, Main *main) a=tot= set_listbasepointers(main, lbarray); /* test: is lib being used */ - foundone= 0; + foundone = FALSE; while (tot--) { for (id= lbarray[tot]->first; id; id= id->next) { if (id->us>0 && (id->flag & LIB_EXTERN)) { - foundone= 1; + foundone = TRUE; break; } } diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index c4cbb19eef7..2c7007d1961 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -161,10 +161,10 @@ int BM_disk_dissolve(BMesh *bm, BMVert *v) } if (keepedge) { - int done = 0; + int done = FALSE; while (!done) { - done = 1; + done = TRUE; e = v->e; do { f = NULL; @@ -180,7 +180,7 @@ int BM_disk_dissolve(BMesh *bm, BMVert *v) } if (f) { - done = 0; + done = FALSE; break; } e = bmesh_disk_edge_next(e, v); diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 6f6db3ce239..72eb4cb89e9 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -776,12 +776,12 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3], projectverts[i][2] = 0.0f; } - done = 0; + done = FALSE; while (!done && f->len > 3) { - done = 1; + done = TRUE; l_iter = find_ear(f, projectverts, nvert, use_beauty); if (l_iter) { - done = 0; + done = FALSE; /* v = l->v; */ /* UNUSED */ f = BM_face_split(bm, l_iter->f, l_iter->prev->v, l_iter->next->v, diff --git a/source/blender/bmesh/tools/BME_bevel.c b/source/blender/bmesh/tools/BME_bevel.c index 101614d609c..07e413985bf 100644 --- a/source/blender/bmesh/tools/BME_bevel.c +++ b/source/blender/bmesh/tools/BME_bevel.c @@ -155,9 +155,9 @@ static void BME_Bevel_Dissolve_Disk(BMesh *bm, BMVert *v) int done; if (v->e) { - done = 0; + done = FALSE; while (!done) { - done = 1; + done = TRUE; e = v->e; /*loop the edge looking for a edge to dissolve*/ do { f = NULL; @@ -165,7 +165,7 @@ static void BME_Bevel_Dissolve_Disk(BMesh *bm, BMVert *v) f = bmesh_jfke(bm, e->l->f, e->l->radial_next->f, e); } if (f) { - done = 0; + done = FALSE; break; } e = bmesh_disk_edge_next(e, v); diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index 2e683d4d57b..dd9a0600725 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -2968,7 +2968,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi Scene *scene = CTX_data_scene(C); PointerRNA id_ptr, ptr; PropertyRNA *prop; - short flag = 0, done = 0; + short flag = 0, done = FALSE; float cfra; /* get current frame */ @@ -3006,7 +3006,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi Scene *scene = CTX_data_scene(C); PointerRNA id_ptr, ptr; PropertyRNA *prop; - short flag = 0, done = 0; + short flag = 0, done = FALSE; float cfra; /* get current frame */ diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index df8c1d29079..159c4681951 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -840,7 +840,7 @@ static short rearrange_animchannel_islands(ListBase *list, AnimChanRearrangeFp r { ListBase islands = {NULL, NULL}; Link *channel, *chanNext = NULL; - short done = 0; + short done = FALSE; /* don't waste effort on an empty list */ if (list->first == NULL) @@ -866,7 +866,7 @@ static short rearrange_animchannel_islands(ListBase *list, AnimChanRearrangeFp r /* perform rearranging */ if (rearrange_func(&islands, island)) { island->flag |= REORDER_ISLAND_MOVED; - done = 1; + done = TRUE; } } } diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c index 0cc92394a40..416df6bccba 100644 --- a/source/blender/editors/animation/drivers.c +++ b/source/blender/editors/animation/drivers.c @@ -141,7 +141,7 @@ short ANIM_add_driver(ReportList *reports, ID *id, const char rna_path[], int ar PropertyRNA *prop; FCurve *fcu; int array_index_max; - int done = 0; + int done = FALSE; /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 7ce2988b067..ac5af846900 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3325,9 +3325,9 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) for (ebone = arm->edbo->first; ((ebone) && (ebone != first)); ebone = ebone->next) { if (EBONE_VISIBLE(arm, ebone)) { /* we extrude per definition the tip */ - do_extrude = 0; + do_extrude = FALSE; if (ebone->flag & (BONE_TIPSEL | BONE_SELECTED)) - do_extrude = 1; + do_extrude = TRUE; else if (ebone->flag & BONE_ROOTSEL) { /* but, a bone with parent deselected we do the root... */ if (ebone->parent && (ebone->parent->flag & BONE_TIPSEL)) ; @@ -3361,7 +3361,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) totbone++; newbone = MEM_callocN(sizeof(EditBone), "extrudebone"); - if (do_extrude == 1) { + if (do_extrude == TRUE) { copy_v3_v3(newbone->head, ebone->tail); copy_v3_v3(newbone->tail, newbone->head); newbone->parent = ebone; diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index e9c960c4080..f18fa2f8bf8 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -1451,7 +1451,7 @@ static int pose_group_assign_exec(bContext *C, wmOperator *op) ScrArea *sa = CTX_wm_area(C); Object *ob; bPose *pose; - short done = 0; + short done = FALSE; /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) @@ -1476,7 +1476,7 @@ static int pose_group_assign_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) { pchan->agrp_index = pose->active_group; - done = 1; + done = TRUE; } CTX_DATA_END; @@ -1514,7 +1514,7 @@ static int pose_group_unassign_exec(bContext *C, wmOperator *UNUSED(op)) { ScrArea *sa = CTX_wm_area(C); Object *ob; - short done = 0; + short done = FALSE; /* since this call may also be used from the buttons window, we need to check for where to get the object */ if (sa->spacetype == SPACE_BUTS) @@ -1531,7 +1531,7 @@ static int pose_group_unassign_exec(bContext *C, wmOperator *UNUSED(op)) { if (pchan->agrp_index) { pchan->agrp_index = 0; - done = 1; + done = TRUE; } } CTX_DATA_END; diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c index 316c4699c0b..3f056f9638c 100644 --- a/source/blender/editors/armature/reeb.c +++ b/source/blender/editors/armature/reeb.c @@ -1818,7 +1818,7 @@ int filterSmartReebGraph(ReebGraph *UNUSED(rg), float UNUSED(threshold)) static void filterGraph(ReebGraph *rg, short options, float threshold_internal, float threshold_external) { - int done = 1; + int done = TRUE; calculateGraphLength(rg); @@ -1833,7 +1833,7 @@ static void filterGraph(ReebGraph *rg, short options, float threshold_internal, if (threshold_internal > 0 || threshold_external > 0) { /* filter until there's nothing more to do */ while (done == 1) { - done = 0; /* no work done yet */ + done = FALSE; /* no work done yet */ done = filterInternalExternalReebGraph(rg, threshold_internal, threshold_external); } diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 82b6ef641b6..4f0274fbd46 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -5222,7 +5222,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA but->block->auto_open = FALSE; if (type == BUTTON_ACTIVATE_OVER) { - data->used_mouse = 1; + data->used_mouse = TRUE; } button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT); @@ -5845,7 +5845,7 @@ static void ui_handle_button_return_submenu(bContext *C, wmEvent *event, uiBut * else { if (ISKEYBOARD(event->type)) { /* keyboard menu hierarchy navigation, going back to previous level */ - but->active->used_mouse = 0; + but->active->used_mouse = FALSE; button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT); } else { diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 958ee9f5420..4c2d86de502 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -2679,7 +2679,7 @@ void ui_layout_add_but(uiLayout *layout, uiBut *but) if (layout->context) { but->context = layout->context; - but->context->used = 1; + but->context->used = TRUE; } } diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index f2a43580fd8..dfd2d0cc4d0 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -368,7 +368,7 @@ static void UI_OT_reset_default_button(wmOperatorType *ot) static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb, int *use_path) { - *use_path = 0; + *use_path = FALSE; if (RNA_struct_is_a(ptr->type, &RNA_EditBone)) *lb = CTX_data_collection_get(C, "selected_editable_bones"); @@ -381,7 +381,7 @@ static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb, int if (id && GS(id->name) == ID_OB) { *lb = CTX_data_collection_get(C, "selected_editable_objects"); - *use_path = 1; + *use_path = TRUE; } else return 0; diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index dc2c3b4eea9..cbe44505263 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -754,14 +754,14 @@ static int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag) } /* we interpolate */ - done = 0; + done = FALSE; ps = panelsort; for (a = 0; a < tot; a++, ps++) { if ((ps->pa->flag & PNL_SELECT) == 0) { if ((ps->orig->ofsx != ps->pa->ofsx) || (ps->orig->ofsy != ps->pa->ofsy)) { ps->orig->ofsx = floorf(0.5f + fac * (float)ps->pa->ofsx + (1.0f - fac) * (float)ps->orig->ofsx); ps->orig->ofsy = floorf(0.5f + fac * (float)ps->pa->ofsy + (1.0f - fac) * (float)ps->orig->ofsy); - done = 1; + done = TRUE; } } } diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 1589bbc123f..bf57dda44bf 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1746,7 +1746,7 @@ void init_userdef_do_versions(void) rgba_char_args_set_fl(btheme->toops.selected_highlight, 0.51, 0.53, 0.55, 0.3); } - U.use_16bit_textures = 1; + U.use_16bit_textures = TRUE; } if (bmain->versionfile < 262 || (bmain->versionfile == 262 && bmain->subversionfile < 2)) { diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index ed010dc973a..2eea7f50f33 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -419,14 +419,14 @@ void UI_view2d_curRect_validate_resize(View2D *v2d, int resize) /* check if we should restore aspect ratio (if view size changed) */ if (v2d->keepzoom & V2D_KEEPASPECT) { - short do_x = 0, do_y = 0, do_cur /* , do_win */ /* UNUSED */; + short do_x = FALSE, do_y = FALSE, do_cur /* , do_win */ /* UNUSED */; float /* curRatio, */ /* UNUSED */ winRatio; /* when a window edge changes, the aspect ratio can't be used to * find which is the best new 'cur' rect. thats why it stores 'old' */ - if (winx != v2d->oldwinx) do_x = 1; - if (winy != v2d->oldwiny) do_y = 1; + if (winx != v2d->oldwinx) do_x = TRUE; + if (winy != v2d->oldwiny) do_y = TRUE; /* curRatio= height / width; */ /* UNUSED */ winRatio = winy / winx; @@ -435,11 +435,11 @@ void UI_view2d_curRect_validate_resize(View2D *v2d, int resize) if (do_x == do_y) { if (do_x && do_y) { /* here is 1,1 case, so all others must be 0,0 */ - if (ABS(winx - v2d->oldwinx) > ABS(winy - v2d->oldwiny)) do_y = 0; - else do_x = 0; + if (ABS(winx - v2d->oldwinx) > ABS(winy - v2d->oldwiny)) do_y = FALSE; + else do_x = FALSE; } - else if (winRatio > 1.0f) do_x = 0; - else do_x = 1; + else if (winRatio > 1.0f) do_x = FALSE; + else do_x = TRUE; } do_cur = do_x; /* do_win= do_y; */ /* UNUSED */ diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 63704f5b8e6..c223c146b4b 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -231,7 +231,7 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind MLoop *ml; MEdge *med; char *linkflag; - int a, b, doit = 1, mark = 0; + int a, b, do_it = TRUE, mark = 0; ehash = BLI_edgehash_new(); seamhash = BLI_edgehash_new(); @@ -259,8 +259,8 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind } } - while (doit) { - doit = 0; + while (do_it) { + do_it = FALSE; /* expand selection */ mp = me->mpoly; @@ -283,7 +283,7 @@ static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int ind if (mark) { linkflag[a] = 1; hash_add_face(ehash, mp, me->mloop + mp->loopstart); - doit = 1; + do_it = TRUE; } } } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 57f663aa571..1b3e4adff3a 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -722,7 +722,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent BMVert *v1; BMIter iter; float min[3], max[3]; - int done = 0; + int done = FALSE; short use_proj; em_setup_viewcontext(C, &vc); @@ -735,7 +735,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent BM_ITER_MESH (v1, &iter, vc.em->bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(v1, BM_ELEM_SELECT)) { minmax_v3v3_v3(min, max, v1->co); - done = 1; + done = TRUE; } } @@ -753,7 +753,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent mval_f[1] = (float)event->mval[1]; /* check for edges that are half selected, use for rotation */ - done = 0; + done = FALSE; BM_ITER_MESH (eed, &iter, vc.em->bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { float co1[3], co2[3]; @@ -776,7 +776,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent nor[1] += -(co2[0] - co1[0]); } } - done = 1; + done = TRUE; } if (done) { diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 69aae5c4f06..fe5fafb0ca0 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -735,7 +735,7 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op) if (BKE_scene_use_new_shading_nodes(scene)) { ED_node_shader_default(scene, &la->id); - la->use_nodes = 1; + la->use_nodes = TRUE; } return OPERATOR_FINISHED; @@ -901,7 +901,7 @@ static int object_delete_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); const short use_global = RNA_boolean_get(op->ptr, "use_global"); - /* int islamp= 0; */ /* UNUSED */ + /* int is_lamp = FALSE; */ /* UNUSED */ if (CTX_data_edit_object(C)) return OPERATOR_CANCELLED; @@ -909,7 +909,7 @@ static int object_delete_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN (C, Base *, base, selected_bases) { - /* if (base->object->type==OB_LAMP) islamp= 1; */ + /* if (base->object->type==OB_LAMP) is_lamp = TRUE; */ /* deselect object -- it could be used in other scenes */ base->object->flag &= ~SELECT; diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index cea9a0aae6b..b89562e772b 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -434,7 +434,7 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, MPassKnownData bkr->baked_faces++; if (bkr->do_update) - *bkr->do_update = 1; + *bkr->do_update = TRUE; if (bkr->progress) *bkr->progress = ((float)bkr->baked_objects + (float)bkr->baked_faces / tot_face) / bkr->tot_obj; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index c97ad9c62f9..107b19b0ed7 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -764,7 +764,7 @@ static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event) Base *base; Curve *cu, *cu1; Nurb *nu; - int do_scene_sort = 0; + int do_scene_sort = FALSE; if (scene->id.lib) return; @@ -949,7 +949,7 @@ static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event) /* Copy the constraint channels over */ copy_constraints(&base->object->constraints, &ob->constraints, TRUE); - do_scene_sort = 1; + do_scene_sort = TRUE; } else if (event == 23) { base->object->softflag = ob->softflag; @@ -1284,7 +1284,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) Curve *cu; Nurb *nu; int clear = (strcmp(op->idname, "OBJECT_OT_shade_flat") == 0); - int done = 0; + int done = FALSE; CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) { @@ -1295,7 +1295,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); - done = 1; + done = TRUE; } else if (ELEM(ob->type, OB_SURF, OB_CURVE)) { cu = ob->data; @@ -1308,7 +1308,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); - done = 1; + done = TRUE; } } CTX_DATA_END; @@ -1369,7 +1369,7 @@ static void UNUSED_FUNCTION(image_aspect) (Scene * scene, View3D * v3d) for (base = FIRSTBASE; base; base = base->next) { if (TESTBASELIB(v3d, base)) { ob = base->object; - done = 0; + done = FALSE; for (a = 1; a <= ob->totcol; a++) { ma = give_current_material(ob, a); @@ -1398,7 +1398,7 @@ static void UNUSED_FUNCTION(image_aspect) (Scene * scene, View3D * v3d) if (x > y) ob->size[0] = ob->size[1] * x / y; else ob->size[1] = ob->size[0] * y / x; - done = 1; + done = TRUE; DAG_id_tag_update(&ob->id, OB_RECALC_OB); } } diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 191677989b9..0aa7e1083c3 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1530,7 +1530,7 @@ static void oceanbake_update(void *customdata, float progress, int *cancel) if (oceanbake_breakjob(oj)) *cancel = 1; - *(oj->do_update) = 1; + *(oj->do_update) = TRUE; *(oj->progress) = progress; } @@ -1546,7 +1546,7 @@ static void oceanbake_startjob(void *customdata, short *stop, short *do_update, BKE_bake_ocean(oj->ocean, oj->och, oceanbake_update, (void *)oj); - *do_update = 1; + *do_update = TRUE; *stop = 0; } diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index b7dc3fd7bea..d618d17f797 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -429,7 +429,7 @@ void ED_object_generic_keymap(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyM RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit_falloff"); // Object mode - if (do_pet == 1) { + if (do_pet == TRUE) { kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0); RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_edit_objects"); diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index b3e16c8d4eb..2b622b21d2c 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1108,7 +1108,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); unsigned int lay, local; - /* int islamp= 0; */ /* UNUSED */ + /* int is_lamp = FALSE; */ /* UNUSED */ lay = move_to_layer_init(C, op); lay &= 0xFFFFFF; @@ -1125,7 +1125,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) base->object->lay = lay; base->object->flag &= ~SELECT; base->flag &= ~SELECT; - /* if (base->object->type==OB_LAMP) islamp= 1; */ + /* if (base->object->type==OB_LAMP) is_lamp = TRUE; */ } CTX_DATA_END; } @@ -1138,7 +1138,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) local = base->lay & 0xFF000000; base->lay = lay + local; base->object->lay = lay; - /* if (base->object->type==OB_LAMP) islamp= 1; */ + /* if (base->object->type==OB_LAMP) is_lamp = TRUE; */ } CTX_DATA_END; } diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index 5a56672f766..d9d5852eb6d 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -750,8 +750,8 @@ static void fluidbake_updatejob(void *customdata, float progress) { FluidBakeJob *fb= (FluidBakeJob *)customdata; - *(fb->do_update)= 1; - *(fb->progress)= progress; + *(fb->do_update) = TRUE; + *(fb->progress) = progress; } static void fluidbake_startjob(void *customdata, short *stop, short *do_update, float *progress) @@ -765,7 +765,7 @@ static void fluidbake_startjob(void *customdata, short *stop, short *do_update, G.afbreek= 0; /* XXX shared with render - replace with job 'stop' switch */ elbeemSimulate(); - *do_update= 1; + *do_update = TRUE; *stop = 0; } diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 595b51d22c4..7b4dda1a48f 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -340,7 +340,7 @@ static void image_renderinfo_cb(void *rjv, RenderStats *rs) RE_ReleaseResult(rj->re); /* make jobs timer to send notifier */ - *(rj->do_update) = 1; + *(rj->do_update) = TRUE; } @@ -352,7 +352,7 @@ static void render_progress_update(void *rjv, float progress) *rj->progress = progress; /* make jobs timer to send notifier */ - *(rj->do_update) = 1; + *(rj->do_update) = TRUE; } } @@ -372,7 +372,7 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec image_buffer_rect_update(rj->scene, rr, ibuf, renrect); /* make jobs timer to send notifier */ - *(rj->do_update) = 1; + *(rj->do_update) = TRUE; } BKE_image_release_ibuf(ima, lock); } diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index f7024444e86..6357cb48a3d 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -473,7 +473,7 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int Render *re; RenderResult rres; char name[32]; - int do_gamma_correct = 0, do_predivide = 0; + int do_gamma_correct = FALSE, do_predivide = FALSE; int offx = 0, newx = rect->xmax - rect->xmin, newy = rect->ymax - rect->ymin; if (id && GS(id->name) != ID_TE) { @@ -583,7 +583,7 @@ static void shader_preview_draw(void *spv, RenderResult *UNUSED(rr), volatile st { ShaderPreview *sp = spv; - *(sp->do_update) = 1; + *(sp->do_update) = TRUE; } /* called by renderer, checks job value */ @@ -737,7 +737,7 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd else shader_preview_render(sp, sp->id, 0, 0); - *do_update = 1; + *do_update = TRUE; } static void shader_preview_free(void *customdata) @@ -910,7 +910,7 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat icon_copy_rect(ibuf, sp->sizex, sp->sizey, sp->pr_rect); - *do_update = 1; + *do_update = TRUE; } else if (idtype == ID_BR) { Brush *br = (Brush *)id; @@ -924,7 +924,7 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat icon_copy_rect(br->icon_imbuf, sp->sizex, sp->sizey, sp->pr_rect); - *do_update = 1; + *do_update = TRUE; } else { /* re-use shader job */ diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 95312c07df1..21cd02c96f2 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -379,7 +379,7 @@ static int new_material_exec(bContext *C, wmOperator *UNUSED(op)) if (BKE_scene_use_new_shading_nodes(scene)) { ED_node_shader_default(scene, &ma->id); - ma->use_nodes = 1; + ma->use_nodes = TRUE; } } @@ -479,7 +479,7 @@ static int new_world_exec(bContext *C, wmOperator *UNUSED(op)) if (BKE_scene_use_new_shading_nodes(scene)) { ED_node_shader_default(scene, &wo->id); - wo->use_nodes = 1; + wo->use_nodes = TRUE; } } diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 0f286d91613..9771fef2d58 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -145,7 +145,7 @@ void ED_area_do_refresh(bContext *C, ScrArea *sa) if (sa->type && sa->type->refresh) { sa->type->refresh(C, sa); } - sa->do_refresh = 0; + sa->do_refresh = FALSE; } /* based on screen region draw tags, set draw tags in azones, and future region tabs etc */ @@ -162,7 +162,7 @@ void ED_area_overdraw_flush(ScrArea *sa, ARegion *ar) /* test if inside */ if (BLI_in_rcti(&ar->winrct, xs, ys)) { - az->do_draw = 1; + az->do_draw = TRUE; } } } @@ -384,7 +384,7 @@ void ED_area_overdraw(bContext *C) } } - az->do_draw = 0; + az->do_draw = FALSE; } } } @@ -487,7 +487,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar) ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL); - ar->do_draw = 0; + ar->do_draw = FALSE; memset(&ar->drawrct, 0, sizeof(ar->drawrct)); uiFreeInactiveBlocks(C, &ar->uiblocks); @@ -559,7 +559,7 @@ void ED_area_tag_redraw_regiontype(ScrArea *sa, int regiontype) void ED_area_tag_refresh(ScrArea *sa) { if (sa) - sa->do_refresh = 1; + sa->do_refresh = TRUE; } /* *************************************************************** */ diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index d714f82b58b..3a2498d3fa2 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -421,7 +421,7 @@ bScreen *ED_screen_add(wmWindow *win, Scene *scene, const char *name) sc = BKE_libblock_alloc(&G.main->screen, ID_SCR, name); sc->scene = scene; - sc->do_refresh = 1; + sc->do_refresh = TRUE; sc->redraws_flag = TIME_ALL_3D_WIN | TIME_ALL_ANIM_WIN; sc->winid = win->winid; @@ -970,16 +970,16 @@ void ED_screen_do_listen(bContext *C, wmNotifier *note) switch (note->category) { case NC_WM: if (note->data == ND_FILEREAD) - win->screen->do_draw = 1; + win->screen->do_draw = TRUE; break; case NC_WINDOW: - win->screen->do_draw = 1; + win->screen->do_draw = TRUE; break; case NC_SCREEN: if (note->data == ND_SUBWINACTIVE) uiFreeActiveButtons(C, win->screen); if (note->action == NA_EDITED) - win->screen->do_draw = win->screen->do_refresh = 1; + win->screen->do_draw = win->screen->do_refresh = TRUE; break; case NC_SCENE: if (note->data == ND_MODE) @@ -1055,7 +1055,7 @@ void ED_screen_draw(wmWindow *win) glDisable(GL_BLEND); } - win->screen->do_draw = 0; + win->screen->do_draw = FALSE; } /* helper call for below, dpi changes headers */ @@ -1108,7 +1108,7 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win) if (G.debug & G_DEBUG_EVENTS) { printf("%s: set screen\n", __func__); } - win->screen->do_refresh = 0; + win->screen->do_refresh = FALSE; win->screen->context = ed_screen_context; } @@ -1276,11 +1276,11 @@ void ED_screen_set_subwinactive(bContext *C, wmEvent *event) if (oldswin != scr->subwinactive) { for (sa = scr->areabase.first; sa; sa = sa->next) { - int do_draw = 0; + int do_draw = FALSE; for (ar = sa->regionbase.first; ar; ar = ar->next) if (ar->swinid == oldswin || ar->swinid == scr->subwinactive) - do_draw = 1; + do_draw = TRUE; if (do_draw) { for (ar = sa->regionbase.first; ar; ar = ar->next) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 9cbe69d29da..e2a9bf37916 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1468,7 +1468,7 @@ static int area_split_modal(bContext *C, wmOperator *op, wmEvent *event) } } - CTX_wm_window(C)->screen->do_draw = 1; + CTX_wm_window(C)->screen->do_draw = TRUE; } @@ -1913,7 +1913,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) ActKeyColumn *ak; float cfra; short next = RNA_boolean_get(op->ptr, "next"); - short done = 0; + short done = FALSE; /* sanity checks */ if (scene == NULL) @@ -1944,7 +1944,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) if (CFRA != (int)ak->cfra) { /* this changes the frame, so set the frame and we're done */ CFRA = (int)ak->cfra; - done = 1; + done = TRUE; } else { /* make this the new starting point for the search */ diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 256df21b79a..77289360f98 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -333,7 +333,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float sj->stop = stop; sj->do_update = do_update; - *do_update = 1; // wait for opengl rect + *do_update = TRUE; /* wait for opengl rect */ while (*stop == 0) { @@ -377,7 +377,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float MEM_freeN(sj->dumprect); sj->dumprect = NULL; - *do_update = 1; + *do_update = TRUE; rd.cfra++; diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 9effba5b433..d5c7b66f695 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -2433,8 +2433,8 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i /* Note about IsectPoly2Df_twoside, checking the face or uv flipping doesnt work, * could check the poly direction but better to do this */ - if ((do_backfacecull && IsectPoly2Df(uv, uv_clip, uv_clip_tot)) || - (do_backfacecull == 0 && IsectPoly2Df_twoside(uv, uv_clip, uv_clip_tot))) + if ((do_backfacecull == TRUE && IsectPoly2Df(uv, uv_clip, uv_clip_tot)) || + (do_backfacecull == FALSE && IsectPoly2Df_twoside(uv, uv_clip, uv_clip_tot))) { has_x_isect = has_isect = 1; @@ -2453,7 +2453,9 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i /* Is this UV visible from the view? - raytrace */ /* project_paint_PickFace is less complex, use for testing */ //if (project_paint_PickFace(ps, pixelScreenCo, w, &side) == face_index) { - if (ps->do_occlude == 0 || !project_bucket_point_occluded(ps, bucketFaceNodes, face_index, pixelScreenCo)) { + if ((ps->do_occlude == FALSE) || + !project_bucket_point_occluded(ps, bucketFaceNodes, face_index, pixelScreenCo)) + { mask = project_paint_uvpixel_mask(ps, face_index, side, w); @@ -2629,8 +2631,9 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i pixelScreenCo[2] = pixelScreenCo[2] / pixelScreenCo[3]; /* Use the depth for bucket point occlusion */ } - if (ps->do_occlude == 0 || !project_bucket_point_occluded(ps, bucketFaceNodes, face_index, pixelScreenCo)) { - + if ((ps->do_occlude == FALSE) || + !project_bucket_point_occluded(ps, bucketFaceNodes, face_index, pixelScreenCo)) + { /* Only bother calculating the weights if we intersect */ if (ps->do_mask_normal || ps->dm_mtface_clone) { #if 1 @@ -3005,7 +3008,7 @@ static void project_paint_begin(ProjPaintState *ps) ps->dm_mtface_clone = CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num); if (ps->dm_mtface_clone == NULL || ps->dm_mtface_clone == ps->dm_mtface) { - ps->do_layer_clone = 0; + ps->do_layer_clone = FALSE; ps->dm_mtface_clone = NULL; printf("ACK!\n"); } @@ -3018,7 +3021,7 @@ static void project_paint_begin(ProjPaintState *ps) ps->dm_mtface_stencil = CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num); if (ps->dm_mtface_stencil == NULL || ps->dm_mtface_stencil == ps->dm_mtface) { - ps->do_layer_stencil = 0; + ps->do_layer_stencil = FALSE; ps->dm_mtface_stencil = NULL; } } @@ -3850,7 +3853,7 @@ static void *do_projectpaint_thread(void *ph_v) float falloff; int bucket_index; int is_floatbuf = 0; - int use_color_correction = 0; + int use_color_correction = FALSE; const short tool = ps->tool; rctf bucket_bounds; @@ -4808,7 +4811,7 @@ static void project_state_init(bContext *C, Object *ob, ProjPaintState *ps) ps->normal_angle_range = ps->normal_angle - ps->normal_angle_inner; if (ps->normal_angle_range <= 0.0f) - ps->do_mask_normal = 0; /* no need to do blending */ + ps->do_mask_normal = FALSE; /* no need to do blending */ } static void paint_brush_init_tex(Brush *brush) diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c index 5d63a223c08..5ed384d22af 100644 --- a/source/blender/editors/space_console/console_ops.c +++ b/source/blender/editors/space_console/console_ops.c @@ -277,7 +277,7 @@ static int console_move_exec(bContext *C, wmOperator *op) ConsoleLine *ci = console_history_verify(C); int type = RNA_enum_get(op->ptr, "type"); - int done = 0; + int done = FALSE; int pos; switch (type) { @@ -448,7 +448,7 @@ static int console_delete_exec(bContext *C, wmOperator *op) int stride; const short type = RNA_enum_get(op->ptr, "type"); - int done = 0; + int done = FALSE; if (ci->len == 0) { return OPERATOR_CANCELLED; @@ -466,7 +466,7 @@ static int console_delete_exec(bContext *C, wmOperator *op) if (stride) { memmove(ci->line + ci->cursor, ci->line + ci->cursor + stride, (ci->len - ci->cursor) + 1); ci->len -= stride; - done = 1; + done = TRUE; } } break; @@ -482,7 +482,7 @@ static int console_delete_exec(bContext *C, wmOperator *op) ci->cursor -= stride; /* same as above */ memmove(ci->line + ci->cursor, ci->line + ci->cursor + stride, (ci->len - ci->cursor) + 1); ci->len -= stride; - done = 1; + done = TRUE; } } break; diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index 107acbf49b1..d84214413da 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -1299,7 +1299,7 @@ static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float limg->flags |= MOVIEFILE_ICON; } } - *do_update = 1; + *do_update = TRUE; PIL_sleep_ms(10); limg = limg->next; } @@ -1319,7 +1319,7 @@ static void thumbnails_update(void *tjv) tj->filelist->filelist[limg->index].flags &= ~MOVIEFILE; tj->filelist->filelist[limg->index].flags |= MOVIEFILE_ICON; } - limg->done=1; + limg->done = TRUE; } limg = limg->next; } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 97b6c32d81d..bf0d940c049 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -775,7 +775,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf bSensor *sens; bController *cont; unsigned int lay; - int a, nr, doit; + int a, nr, do_it; /* we need a sorted object list */ /* set scavisflags flags in Objects to indicate these should be evaluated */ @@ -815,9 +815,9 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf /* BUTS_XXX_STATE are similar to BUTS_XXX_LINK for selecting the object */ if (scavisflag & (BUTS_SENS_LINK|BUTS_CONT_LINK|BUTS_ACT_LINK|BUTS_SENS_STATE|BUTS_ACT_STATE)) { - doit= 1; - while (doit) { - doit= 0; + do_it = TRUE; + while (do_it) { + do_it = FALSE; ob= bmain->object.first; while (ob) { @@ -830,13 +830,13 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf if (sens->links[a]) { obt= (Object *)sens->links[a]->mynew; if (obt && (obt->scavisflag & OB_VIS_CONT)) { - doit= 1; + do_it = TRUE; ob->scavisflag |= OB_VIS_SENS; break; } } } - if (doit) break; + if (do_it) break; sens= sens->next; } } @@ -849,13 +849,13 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf if (cont->links[a]) { obt= (Object *)cont->links[a]->mynew; if (obt && (obt->scavisflag & OB_VIS_ACT)) { - doit= 1; + do_it = TRUE; ob->scavisflag |= OB_VIS_CONT; break; } } } - if (doit) break; + if (do_it) break; cont= cont->next; } } @@ -868,7 +868,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf if (sens->links[a]) { obt= (Object *)sens->links[a]->mynew; if (obt && (obt->scavisflag & OB_VIS_CONT)==0) { - doit= 1; + do_it = TRUE; obt->scavisflag |= OB_VIS_CONT; } } @@ -885,7 +885,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf if (cont->links[a]) { obt= (Object *)cont->links[a]->mynew; if (obt && (obt->scavisflag & OB_VIS_ACT)==0) { - doit= 1; + do_it = TRUE; obt->scavisflag |= OB_VIS_ACT; } } @@ -3333,7 +3333,7 @@ static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr) uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NONE); col = uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events") == FALSE); uiItemR(col, ptr, "button_number", 0, NULL, ICON_NONE); break; case SENS_JOY_AXIS: @@ -3343,7 +3343,7 @@ static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr) uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NONE); col = uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events") == FALSE); uiItemR(col, ptr, "axis_direction", 0, NULL, ICON_NONE); break; case SENS_JOY_HAT: @@ -3351,7 +3351,7 @@ static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr) uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NONE); col = uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events") == FALSE); uiItemR(col, ptr, "hat_direction", 0, NULL, ICON_NONE); break; case SENS_JOY_AXIS_SINGLE: @@ -3371,13 +3371,13 @@ static void draw_sensor_keyboard(uiLayout *layout, PointerRNA *ptr) row = uiLayoutRow(layout, 0); uiItemL(row, "Key:", ICON_NONE); col = uiLayoutColumn(row, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys") == FALSE); uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", ICON_NONE); col = uiLayoutColumn(row, 0); uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); col = uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys") == FALSE); row = uiLayoutRow(col, 0); uiItemL(row, "First Modifier:", ICON_NONE); uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", ICON_NONE); @@ -3843,7 +3843,7 @@ static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext col = uiLayoutColumn(row, 1); uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); sub = uiLayoutColumn(col, 0); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_force_distance")==1); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_force_distance") == TRUE); uiItemR(sub, ptr, "distance", 0, "", ICON_NONE); uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, ICON_NONE); @@ -3976,7 +3976,7 @@ static void draw_actuator_filter_2d(uiLayout *layout, PointerRNA *ptr) case ACT_2DFILTER_MOTIONBLUR: split=uiLayoutSplit(layout, 0.75, 1); row= uiLayoutRow(split, 0); - uiLayoutSetActive(row, RNA_boolean_get(ptr, "use_motion_blur")==1); + uiLayoutSetActive(row, RNA_boolean_get(ptr, "use_motion_blur") == TRUE); uiItemR(row, ptr, "motion_blur_factor", 0, NULL, ICON_NONE); uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); break; @@ -4080,21 +4080,21 @@ static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr) col = uiLayoutColumn(row, 0); uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); sub = uiLayoutColumn(col, 1); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_servo_limit_x")==1); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_servo_limit_x") == TRUE); uiItemR(sub, ptr, "force_max_x", 0, NULL, ICON_NONE); uiItemR(sub, ptr, "force_min_x", 0, NULL, ICON_NONE); col = uiLayoutColumn(row, 0); uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); sub = uiLayoutColumn(col, 1); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_servo_limit_y")==1); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_servo_limit_y") == TRUE); uiItemR(sub, ptr, "force_max_y", 0, NULL, ICON_NONE); uiItemR(sub, ptr, "force_min_y", 0, NULL, ICON_NONE); col = uiLayoutColumn(row, 0); uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); sub = uiLayoutColumn(col, 1); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_servo_limit_z")==1); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_servo_limit_z") == TRUE); uiItemR(sub, ptr, "force_max_z", 0, NULL, ICON_NONE); uiItemR(sub, ptr, "force_min_z", 0, NULL, ICON_NONE); @@ -4122,7 +4122,7 @@ static void draw_actuator_parent(uiLayout *layout, PointerRNA *ptr) row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "use_compound", 0, NULL, ICON_NONE); sub= uiLayoutRow(row, 0); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_compound")==1); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_compound") == TRUE); uiItemR(sub, ptr, "use_ghost", 0, NULL, ICON_NONE); } } @@ -4305,7 +4305,7 @@ static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C) uiItemR(layout, ptr, "use_sound_3d", 0, NULL, ICON_NONE); col = uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_sound_3d")==1); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_sound_3d") == TRUE); row = uiLayoutRow(col, 0); uiItemR(row, ptr, "gain_3d_min", 0, NULL, ICON_NONE); @@ -4565,7 +4565,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar) subsplit= uiLayoutSplit(split, 0.85, 0); col= uiLayoutColumn(subsplit, 0); row= uiLayoutRow(col, 0); - uiLayoutSetActive(row, RNA_boolean_get(&settings_ptr, "use_all_states")==0); + uiLayoutSetActive(row, RNA_boolean_get(&settings_ptr, "use_all_states") == FALSE); uiTemplateLayers(row, &settings_ptr, "states_visible", &settings_ptr, "used_states", 0); row= uiLayoutRow(col, 0); uiTemplateLayers(row, &settings_ptr, "states_initial", &settings_ptr, "used_states", 0); diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index 95a56176523..63e518e5aaa 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -335,11 +335,11 @@ static void nla_panel_properties(const bContext *C, Panel *pa) * - blend in/out can only be set when autoblending is off */ column = uiLayoutColumn(layout, 1); - uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_influence") == 0); + uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_influence") == FALSE); uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, ICON_NONE); // XXX as toggle? sub = uiLayoutColumn(column, 1); - uiLayoutSetActive(sub, RNA_boolean_get(&strip_ptr, "use_auto_blend") == 0); + uiLayoutSetActive(sub, RNA_boolean_get(&strip_ptr, "use_auto_blend") == FALSE); uiItemR(sub, &strip_ptr, "blend_in", 0, NULL, ICON_NONE); uiItemR(sub, &strip_ptr, "blend_out", 0, NULL, ICON_NONE); @@ -383,7 +383,7 @@ static void nla_panel_actclip(const bContext *C, Panel *pa) /* action usage */ column = uiLayoutColumn(layout, 1); - uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time") == 0); + uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time") == FALSE); uiItemL(column, "Playback Settings:", ICON_NONE); uiItemR(column, &strip_ptr, "scale", 0, NULL, ICON_NONE); uiItemR(column, &strip_ptr, "repeat", 0, NULL, ICON_NONE); diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c index c12cd6f2d39..096c16298e3 100644 --- a/source/blender/editors/space_nla/nla_draw.c +++ b/source/blender/editors/space_nla/nla_draw.c @@ -676,7 +676,7 @@ static void draw_nla_channel_list_gl(bAnimContext *ac, ListBase *anim_data, View short indent = 0, offset = 0, sel = 0, group = 0, nonSolo = 0; int expand = -1, protect = -1, special = -1, mute = -1; char name[128]; - short doDraw = 0; + short do_draw = FALSE; /* determine what needs to be drawn */ switch (ale->type) { @@ -716,8 +716,8 @@ static void draw_nla_channel_list_gl(bAnimContext *ac, ListBase *anim_data, View sel = SEL_NLT(nlt); BLI_strncpy(name, nlt->name, sizeof(name)); - // draw manually still - doDraw = 1; + /* draw manually still */ + do_draw = TRUE; } break; case ANIMTYPE_NLAACTION: /* NLA Action-Line */ @@ -733,8 +733,8 @@ static void draw_nla_channel_list_gl(bAnimContext *ac, ListBase *anim_data, View else BLI_strncpy(name, "", sizeof(name)); - // draw manually still - doDraw = 1; + /* draw manually still */ + do_draw = TRUE; } break; @@ -745,7 +745,7 @@ static void draw_nla_channel_list_gl(bAnimContext *ac, ListBase *anim_data, View } /* if special types, draw manually for now... */ - if (doDraw) { + if (do_draw) { if (ale->id) { /* special exception for textures */ if (GS(ale->id->name) == ID_TE) { diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 8a7e2a8a904..5c9994e46d3 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -503,7 +503,7 @@ static int nlaedit_add_transition_exec(bContext *C, wmOperator *op) bAnimListElem *ale; int filter; - int done = 0; + int done = FALSE; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -822,7 +822,7 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *UNUSED(op)) bAnimListElem *ale; int filter; - short done = 0; + short done = FALSE; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index ac12f2ffd31..d42393f3611 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1379,7 +1379,7 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), Po uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, ICON_NONE); col = uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==1); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer") == TRUE); uiItemR(col, ptr, "f_stop", 0, NULL, ICON_NONE); uiItemR(layout, ptr, "blur_max", 0, NULL, ICON_NONE); @@ -1394,7 +1394,7 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), Po col = uiLayoutColumn(layout, 0); uiItemR(col, ptr, "use_zbuffer", 0, NULL, ICON_NONE); sub = uiLayoutColumn(col, 0); - uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer")==0); + uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer") == FALSE); uiItemR(sub, ptr, "z_scale", 0, NULL, ICON_NONE); } @@ -1456,7 +1456,7 @@ static void node_composit_buts_lensdist(uiLayout *layout, bContext *UNUSED(C), P uiItemR(col, ptr, "use_projector", 0, NULL, ICON_NONE); col = uiLayoutColumn(col, 0); - uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector")==0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector") == FALSE); uiItemR(col, ptr, "use_jitter", 0, NULL, ICON_NONE); uiItemR(col, ptr, "use_fit", 0, NULL, ICON_NONE); } @@ -1627,7 +1627,7 @@ static void node_composit_buts_color_spill(uiLayout *layout, bContext *UNUSED(C) uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NONE); - if (RNA_boolean_get(ptr, "use_unspill")== 1) { + if (RNA_boolean_get(ptr, "use_unspill") == TRUE) { uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NONE); @@ -1818,7 +1818,7 @@ static void node_composit_buts_file_output_details(uiLayout *layout, bContext *C uiItemR(col, &active_input_ptr, "use_node_format", 0, NULL, 0); col= uiLayoutColumn(layout, 0); - uiLayoutSetActive(col, RNA_boolean_get(&active_input_ptr, "use_node_format")==0); + uiLayoutSetActive(col, RNA_boolean_get(&active_input_ptr, "use_node_format") == FALSE); uiTemplateImageSettings(col, &imfptr); } } @@ -2976,8 +2976,8 @@ void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int /* note; this is used for fake links in groups too */ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) { - int do_shaded= 0, th_col1= TH_HEADER, th_col2= TH_HEADER; - int do_triple= 0, th_col3= TH_WIRE; + int do_shaded= FALSE, th_col1= TH_HEADER, th_col2= TH_HEADER; + int do_triple= FALSE, th_col3= TH_WIRE; if (link->fromsock==NULL && link->tosock==NULL) return; @@ -2985,7 +2985,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) /* new connection */ if (!link->fromsock || !link->tosock) { th_col1 = TH_ACTIVE; - do_triple = 1; + do_triple = TRUE; } else { /* going to give issues once... */ @@ -2997,7 +2997,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) /* a bit ugly... but thats how we detect the internal group links */ if (!link->fromnode || !link->tonode) { UI_ThemeColorBlend(TH_BACK, TH_WIRE, 0.5f); - do_shaded= 0; + do_shaded = FALSE; } else { /* check cyclic */ @@ -3013,8 +3013,8 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) if (link->tonode->flag & SELECT) th_col2= TH_EDGE_SELECT; } - do_shaded= 1; - do_triple= 1; + do_shaded = TRUE; + do_triple = TRUE; } else { th_col1 = TH_REDALERT; diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index f71ce3f960c..8847dc3650a 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -125,7 +125,7 @@ static void compo_redrawjob(void *cjv, char *UNUSED(str)) { CompoJob *cj= cjv; - *(cj->do_update)= 1; + *(cj->do_update) = TRUE; } static void compo_freejob(void *cjv) @@ -169,7 +169,7 @@ static void compo_startjob(void *cjv, short *stop, short *do_update, float *prog CompoJob *cj= cjv; bNodeTree *ntree= cj->localtree; - if (cj->scene->use_nodes==0) + if (cj->scene->use_nodes == FALSE) return; cj->stop= stop; @@ -2366,7 +2366,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) ntreeUpdateTree(snode->edittree); } else { - int do_update = 0; + int do_update = FALSE; for (linkdata=nldrag->links.first; linkdata; linkdata=linkdata->next) { link = linkdata->data; @@ -2377,11 +2377,12 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) link->tosock= NULL; snode->edittree->update |= NTREE_UPDATE_LINKS; - do_update = 1; + do_update = TRUE; } } - if (do_update) + if (do_update) { ntreeUpdateTree(snode->edittree); + } } } else { @@ -2408,7 +2409,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) ntreeUpdateTree(snode->edittree); } else { - int do_update = 0; + int do_update = FALSE; for (linkdata=nldrag->links.first; linkdata; linkdata=linkdata->next) { link = linkdata->data; @@ -2419,11 +2420,12 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) link->fromsock= NULL; snode->edittree->update |= NTREE_UPDATE_LINKS; - do_update = 1; + do_update = TRUE; } } - if (do_update) + if (do_update) { ntreeUpdateTree(snode->edittree); + } } } diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 1590d08b4a1..2d1ba69cdd3 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -840,7 +840,7 @@ static int insert_gap(Scene *scene, int gap, int cfra) { Sequence *seq; Editing *ed = BKE_sequencer_editing_get(scene, FALSE); - int done = 0; + int done = FALSE; /* all strips >= cfra are shifted */ @@ -851,7 +851,7 @@ static int insert_gap(Scene *scene, int gap, int cfra) if (seq->startdisp >= cfra) { seq->start += gap; calc_sequence(scene, seq); - done = 1; + done = TRUE; } } SEQ_END @@ -971,7 +971,7 @@ static void UNUSED_FUNCTION(no_gaps) (Scene * scene) if (evaluate_seq_frame(scene, cfra) ) first = 1; } else { - done = 1; + done = TRUE; while (evaluate_seq_frame(scene, cfra) == 0) { done = insert_gap(scene, -1, cfra); if (done == 0) break; diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index a59570a09e1..811a89b07a8 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -1100,7 +1100,7 @@ static short select_grouped_effect_link(Editing *ed, Sequence *actseq) actseq->tmp = SET_INT_IN_POINTER(TRUE); - for (seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { + for (seq_begin(ed, &iter, TRUE); iter.valid; seq_next(&iter)) { seq = iter.seq; /* Ignore all seqs already selected! */ @@ -1129,7 +1129,7 @@ static short select_grouped_effect_link(Editing *ed, Sequence *actseq) /* Unfortunately, we must restart checks from the beginning. */ seq_end(&iter); - seq_begin(ed, &iter, 1); + seq_begin(ed, &iter, TRUE); } /* Video strips bellow active one, or any strip for audio (order do no matters here!). */ diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 04408173928..3ebc4eb974c 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -2888,7 +2888,7 @@ static int text_insert_exec(bContext *C, wmOperator *op) SpaceText *st = CTX_wm_space_text(C); Text *text = CTX_data_edit_text(C); char *str; - int done = 0; + int done = FALSE; size_t i = 0; unsigned int code; diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index 9e44d5207c0..01d27aaa0b3 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -354,7 +354,7 @@ static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar time_draw_idblock_keyframes(v2d, (ID *)ob, onlysel); } else { - short active_done = 0; + short active_done = FALSE; /* draw keyframes from all selected objects */ CTX_DATA_BEGIN (C, Object *, obsel, selected_objects) @@ -364,7 +364,7 @@ static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar /* if this object is the active one, set flag so that we don't draw again */ if (obsel == ob) - active_done = 1; + active_done = TRUE; } CTX_DATA_END; diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index 2211b1ddb62..6a070070379 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -1667,7 +1667,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, GLfloat tmp; float smat[4][4], imat[4][4], bmat[4][4]; int index = -1; - short do_dashed = 3, draw_wire = 0; + short do_dashed = 3, draw_wire = FALSE; int flag; /* being set below */ diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index b5c44fd1a8c..de1d9f22667 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -233,7 +233,7 @@ static Material *give_current_material_or_def(Object *ob, int matnr) static struct TextureDrawState { Object *ob; - int islit, istex; + int is_lit, is_tex; int color_profile; unsigned char obcol[4]; } Gtexdraw = {NULL, 0, 0, 0, {0, 0, 0, 0}}; @@ -263,12 +263,12 @@ static int set_draw_settings_cached(int clearcache, MTFace *texface, Material *m c_has_texface = -1; } else { - textured = gtexdraw.istex; + textured = gtexdraw.is_tex; litob = gtexdraw.ob; } /* convert number of lights into boolean */ - if (gtexdraw.islit) lit = 1; + if (gtexdraw.is_lit) lit = 1; if (ma) { alphablend = ma->game.alpha_blend; @@ -343,7 +343,7 @@ static int set_draw_settings_cached(int clearcache, MTFace *texface, Material *m static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob) { unsigned char obcol[4]; - int istex, solidtex; + int is_tex, solidtex; // XXX scene->obedit warning @@ -351,27 +351,27 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O * with face selection in weight paint is not lit. */ if ((v3d->drawtype <= OB_WIRE) && (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT))) { solidtex = FALSE; - Gtexdraw.islit = 0; + Gtexdraw.is_lit = 0; } else if (v3d->drawtype == OB_SOLID || ((ob->mode & OB_MODE_EDIT) && v3d->drawtype != OB_TEXTURE)) { /* draw with default lights in solid draw mode and edit mode */ solidtex = TRUE; - Gtexdraw.islit = -1; + Gtexdraw.is_lit = -1; } else { /* draw with lights in the scene otherwise */ solidtex = FALSE; - Gtexdraw.islit = GPU_scene_object_lights(scene, ob, v3d->lay, rv3d->viewmat, !rv3d->is_persp); + Gtexdraw.is_lit = GPU_scene_object_lights(scene, ob, v3d->lay, rv3d->viewmat, !rv3d->is_persp); } rgba_float_to_uchar(obcol, ob->col); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); - if (solidtex || v3d->drawtype == OB_TEXTURE) istex = 1; - else istex = 0; + if (solidtex || v3d->drawtype == OB_TEXTURE) is_tex = 1; + else is_tex = 0; Gtexdraw.ob = ob; - Gtexdraw.istex = istex; + Gtexdraw.is_tex = is_tex; Gtexdraw.color_profile = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT; memcpy(Gtexdraw.obcol, obcol, sizeof(obcol)); set_draw_settings_cached(1, NULL, NULL, Gtexdraw); diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 00622f368f0..e69538345bb 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -1967,7 +1967,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) Lattice *lt = ob->data; DispList *dl; int u, v, w; - int use_wcol = 0, is_edit = (lt->editlatt != NULL); + int use_wcol = FALSE, is_edit = (lt->editlatt != NULL); /* now we default make displist, this will modifiers work for non animated case */ if (ob->disp.first == NULL) @@ -3543,7 +3543,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D Object *obedit = scene->obedit; Mesh *me = ob->data; BMEditMesh *em = me->edit_btmesh; - int do_alpha_after = 0, drawlinked = 0, retval = 0, glsl, check_alpha, i; + int do_alpha_after = FALSE, drawlinked = 0, retval = 0, glsl, check_alpha, i; /* If we are drawing shadows and any of the materials don't cast a shadow, * then don't draw the object */ diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index d9126b3809a..f18ba29b1f4 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1848,7 +1848,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas /* generate displist, test for new object */ if (dob_prev && dob_prev->ob != dob->ob) { - if (use_displist == 1) + if (use_displist == TRUE) glDeleteLists(displist, 1); use_displist = -1; @@ -1870,7 +1870,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas !(bb_tmp = BKE_object_boundbox_get(dob->ob))) { // printf("draw_dupli_objects_color: skipping displist for %s\n", dob->ob->id.name+2); - use_displist = 0; + use_displist = FALSE; } else { // printf("draw_dupli_objects_color: using displist for %s\n", dob->ob->id.name+2); @@ -1886,7 +1886,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas draw_object(scene, ar, v3d, &tbase, DRAW_CONSTCOLOR); glEndList(); - use_displist = 1; + use_displist = TRUE; BKE_object_boundbox_flag(dob->ob, OB_BB_DISABLED, 0); } } diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 4bfb6dd9fd6..8ba0d75c786 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2051,7 +2051,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in int center = RNA_boolean_get(op->ptr, "center"); float size, min[3], max[3], afm[3]; - int ok = 1, onedone = 0; + int ok = 1, onedone = FALSE; if (center) { /* in 2.4x this also move the cursor to (0, 0, 0) (with shift+c). */ @@ -2066,7 +2066,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in for (base = scene->base.first; base; base = base->next) { if (BASE_VISIBLE(v3d, base)) { - onedone = 1; + onedone = TRUE; if (skip_camera && base->object == v3d->camera) { continue; diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 583736716c6..0bbd03c10bb 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -405,7 +405,7 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int BLI_lasso_is_point_inside(data->mcords, data->moves, x1, y1, IS_CLIPPED)) { BM_edge_select_set(data->vc->em->bm, eed, data->select); - data->done = 1; + data->done = TRUE; } } else { @@ -443,7 +443,7 @@ static void do_lasso_select_mesh(ViewContext *vc, int mcords[][2], short moves, data.mcords = mcords; data.moves = moves; data.select = select; - data.done = 0; + data.done = FALSE; data.pass = 0; if (extend == 0 && select) @@ -1180,19 +1180,19 @@ static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int View3D *v3d = vc->v3d; Base *base, *basact = NULL; static int lastmval[2] = {-100, -100}; - int a, donearest = 0; + int a, do_nearest = FALSE; /* define if we use solid nearest select or not */ if (v3d->drawtype > OB_WIRE) { - donearest = 1; + do_nearest = TRUE; if (ABS(mval[0] - lastmval[0]) < 3 && ABS(mval[1] - lastmval[1]) < 3) { if (!has_bones) /* hrms, if theres bones we always do nearest */ - donearest = 0; + do_nearest = FALSE; } } lastmval[0] = mval[0]; lastmval[1] = mval[1]; - if (donearest) { + if (do_nearest) { unsigned int min = 0xFFFFFFFF; int selcol = 0, notcol = 0; @@ -1623,7 +1623,7 @@ static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0 if (data->pass == 0) { if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) { BM_edge_select_set(data->vc->em->bm, eed, data->select); - data->done = 1; + data->done = TRUE; } } else { @@ -1651,7 +1651,7 @@ static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exten data.rect = rect; data.select = select; data.pass = 0; - data.done = 0; + data.done = FALSE; if (extend == 0 && select) EDBM_flag_disable_all(vc->em, BM_ELEM_SELECT); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index d07ae468f35..4573e66ca39 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -2111,7 +2111,7 @@ static void constraintRotLim(TransInfo *UNUSED(t), TransData *td) bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_ROTLIMIT); bConstraintOb cob; bConstraint *con; - int dolimit = 0; + int do_limit = FALSE; /* Evaluate valid constraints */ for (con= td->con; con; con= con->next) { @@ -2133,9 +2133,9 @@ static void constraintRotLim(TransInfo *UNUSED(t), TransData *td) continue; /* only do conversion if necessary, to preserve quats and eulers */ - if (!dolimit) { + if (do_limit == FALSE) { constraintob_from_transdata(&cob, td); - dolimit= 1; + do_limit = TRUE; } /* do space conversions */ @@ -2157,7 +2157,7 @@ static void constraintRotLim(TransInfo *UNUSED(t), TransData *td) } } - if (dolimit) { + if (do_limit) { /* copy results from cob->matrix */ if (td->ext->rotOrder == ROT_MODE_QUAT) { /* quats */ @@ -5438,10 +5438,10 @@ 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 */ +#if 0 /* 'do_time' disabled for now */ const Scene *scene= t->scene; - const short doTime= 0; //getAnimEdit_DrawTime(t); // NOTE: this works, but may be confusing behavior given the option's label, hence disabled + const short do_time= 0; //getAnimEdit_DrawTime(t); // NOTE: this works, but may be confusing behavior given the option's label, hence disabled const double secf= FPS; #endif double val; @@ -5452,10 +5452,10 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, else val= *(td->val); -#if 0 /* 'doTime' disabled for now */ +#if 0 /* 'do_time' disabled for now */ /* do the snapping to nearest frame/second */ - if (doTime) { + if (do_time) { val= (float)(floor((val/secf) + 0.5f) * secf); } else @@ -5540,19 +5540,19 @@ static void headerTimeTranslate(TransInfo *t, char *str) else { const Scene *scene = t->scene; const short autosnap= getAnimEdit_SnapMode(t); - const short doTime = getAnimEdit_DrawTime(t); + const short do_time = getAnimEdit_DrawTime(t); const double secf= FPS; float val = t->values[0]; /* apply snapping + frame->seconds conversions */ if (autosnap == SACTSNAP_STEP) { - if (doTime) + if (do_time) val= floorf((double)val/secf + 0.5f); else val= floorf(val + 0.5f); } else { - if (doTime) + if (do_time) val= (float)((double)val / secf); } @@ -5572,7 +5572,7 @@ static void applyTimeTranslate(TransInfo *t, float UNUSED(sval)) Scene *scene = t->scene; int i; - const short doTime= getAnimEdit_DrawTime(t); + const short do_time= getAnimEdit_DrawTime(t); const double secf= FPS; const short autosnap= getAnimEdit_SnapMode(t); @@ -5594,7 +5594,7 @@ static void applyTimeTranslate(TransInfo *t, float UNUSED(sval)) deltax = t->values[0]; if (autosnap == SACTSNAP_STEP) { - if (doTime) + if (do_time) deltax= (float)(floor((deltax/secf) + 0.5f) * secf); else deltax= (float)(floor(deltax + 0.5f)); @@ -5608,7 +5608,7 @@ static void applyTimeTranslate(TransInfo *t, float UNUSED(sval)) deltax = val = t->values[0]; if (autosnap == SACTSNAP_STEP) { - if (doTime) + if (do_time) val= (float)(floor((deltax/secf) + 0.5f) * secf); else val= (float)(floor(val + 0.5f)); @@ -5846,7 +5846,7 @@ static void applyTimeScale(TransInfo *t) int i; const short autosnap= getAnimEdit_SnapMode(t); - const short doTime= getAnimEdit_DrawTime(t); + const short do_time= getAnimEdit_DrawTime(t); const double secf= FPS; @@ -5860,7 +5860,7 @@ static void applyTimeScale(TransInfo *t) float fac= t->values[0]; if (autosnap == SACTSNAP_STEP) { - if (doTime) + if (do_time) fac= (float)(floor(fac/secf + 0.5f) * secf); else fac= (float)(floor(fac + 0.5f)); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index c9eb975cb77..dad1c65298a 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -4599,45 +4599,45 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob, } } else if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED)) { - short doLoc=0, doRot=0, doScale=0; + short do_loc = FALSE, do_rot = FALSE, do_scale = FALSE; /* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */ if (tmode == TFM_TRANSLATION) { - doLoc = 1; + do_loc = TRUE; } else if (tmode == TFM_ROTATION) { if (v3d->around == V3D_ACTIVE) { if (ob != OBACT) - doLoc = 1; + do_loc = TRUE; } else if (v3d->around == V3D_CURSOR) - doLoc = 1; + do_loc = TRUE; if ((v3d->flag & V3D_ALIGN)==0) - doRot = 1; + do_rot = TRUE; } else if (tmode == TFM_RESIZE) { if (v3d->around == V3D_ACTIVE) { if (ob != OBACT) - doLoc = 1; + do_loc = TRUE; } else if (v3d->around == V3D_CURSOR) - doLoc = 1; + do_loc = TRUE; if ((v3d->flag & V3D_ALIGN)==0) - doScale = 1; + do_scale = TRUE; } /* insert keyframes for the affected sets of channels using the builtin KeyingSets found */ - if (doLoc) { + if (do_loc) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOCATION_ID); ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } - if (doRot) { + if (do_rot) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_ROTATION_ID); ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } - if (doScale) { + if (do_scale) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_SCALING_ID); ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } @@ -4720,39 +4720,39 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o } /* only insert keyframe if needed? */ else if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED)) { - short doLoc=0, doRot=0, doScale=0; + short do_loc = FALSE, do_rot = FALSE, do_scale = FALSE; /* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */ if (tmode == TFM_TRANSLATION) { if (targetless_ik) - doRot= 1; + do_rot = TRUE; else - doLoc = 1; + do_loc = TRUE; } else if (tmode == TFM_ROTATION) { if (ELEM(v3d->around, V3D_CURSOR, V3D_ACTIVE)) - doLoc = 1; + do_loc = TRUE; if ((v3d->flag & V3D_ALIGN)==0) - doRot = 1; + do_rot = TRUE; } else if (tmode == TFM_RESIZE) { if (ELEM(v3d->around, V3D_CURSOR, V3D_ACTIVE)) - doLoc = 1; + do_loc = TRUE; if ((v3d->flag & V3D_ALIGN)==0) - doScale = 1; + do_scale = TRUE; } - if (doLoc) { + if (do_loc) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOCATION_ID); ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } - if (doRot) { + if (do_rot) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_ROTATION_ID); ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } - if (doScale) { + if (do_scale) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_SCALING_ID); ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index a869af56537..7d0e9dd6005 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -662,9 +662,9 @@ static void partial_doughnut(float radring, float radhole, int start, int end, i float cos_theta, sin_theta; float cos_theta1, sin_theta1; float ring_delta, side_delta; - int i, j, docaps= 1; + int i, j, do_caps = TRUE; - if (start==0 && end==nrings) docaps= 0; + if (start == 0 && end == nrings) do_caps = FALSE; ring_delta= 2.0f*(float)M_PI/(float)nrings; side_delta= 2.0f*(float)M_PI/(float)nsides; @@ -678,7 +678,7 @@ static void partial_doughnut(float radring, float radhole, int start, int end, i cos_theta1= (float)cos(theta1); sin_theta1= (float)sin(theta1); - if (docaps && i==start) { // cap + if (do_caps && i==start) { // cap glBegin(GL_POLYGON); phi= 0.0; for (j= nsides; j >= 0; j--) { @@ -710,7 +710,7 @@ static void partial_doughnut(float radring, float radhole, int start, int end, i glEnd(); } - if (docaps && i==end) { // cap + if (do_caps && i==end) { // cap glBegin(GL_POLYGON); phi= 0.0; for (j= nsides; j >= 0; j--) { diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index 04207643aa4..91f62291450 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -476,7 +476,7 @@ static int count_bone_select(bArmature *arm, ListBase *lb, int do_it) if (bone->flag & BONE_SELECTED) { bone->flag |= BONE_TRANSFORM; total++; - do_next= 0; // no transform on children if one parent bone is selected + do_next = FALSE; // no transform on children if one parent bone is selected } } } diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index ac0f8306259..9aaccb57fe2 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -209,19 +209,19 @@ static void undo_clean_stack(bContext *C) uel = undobase.first; while (uel) { void *editdata = uel->getdata(C); - int isvalid = 0; + int is_valid = FALSE; next = uel->next; /* for when objects are converted, renamed, or global undo changes pointers... */ if (uel->type == obedit->type) { if (strcmp(uel->id.name, obedit->id.name) == 0) { if (uel->validate_undo == NULL) - isvalid = 1; + is_valid = TRUE; else if (uel->validate_undo(uel->undodata, editdata)) - isvalid = 1; + is_valid = TRUE; } } - if (isvalid) + if (is_valid) uel->ob = obedit; else { if (uel == curundo) diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index cd88614f8fe..e7a9ab9ca73 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -165,15 +165,15 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) } } else { - int do_glob_undo = 0; + int do_glob_undo = FALSE; if (obact && obact->mode & OB_MODE_TEXTURE_PAINT) { if (!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname)) - do_glob_undo = 1; + do_glob_undo = TRUE; } else if (obact && obact->mode & OB_MODE_SCULPT) { if (!ED_undo_paint_step(C, UNDO_PAINT_MESH, step, undoname)) - do_glob_undo = 1; + do_glob_undo = TRUE; } else if (obact && obact->mode & OB_MODE_PARTICLE_EDIT) { if (step == 1) @@ -182,7 +182,7 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) PE_redo(CTX_data_scene(C)); } else { - do_glob_undo = 1; + do_glob_undo = TRUE; } if (do_glob_undo) { diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c index b30821dc56a..872f959b8a2 100644 --- a/source/blender/editors/uvedit/uvedit_smart_stitch.c +++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c @@ -827,7 +827,7 @@ static int stitch_process_data(StitchState *state, Scene *scene, int final) UvEdge *edge = state->edges + i; if ((state->uvs[edge->uv1]->flag & STITCH_STITCHABLE) && (state->uvs[edge->uv2]->flag & STITCH_STITCHABLE)) { stitch_island_calculate_edge_rotation(edge, state, final_position, uvfinal_map, island_stitch_data); - island_stitch_data[state->uvs[edge->uv1]->island].use_edge_rotation = 1; + island_stitch_data[state->uvs[edge->uv1]->island].use_edge_rotation = TRUE; } } diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index ebfedea3968..899f4afb903 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -1099,7 +1099,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O GMS.use_alpha_pass = (do_alpha_after != NULL); GMS.is_alpha_pass = (v3d && v3d->transp); if (GMS.use_alpha_pass) - *do_alpha_after = 0; + *do_alpha_after = FALSE; if (GMS.totmat > FIXEDMAT) { GMS.matbuf= MEM_callocN(sizeof(GPUMaterialFixed)*GMS.totmat, "GMS.matbuf"); @@ -1156,11 +1156,11 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O } } - /* setting do_alpha_after = 1 indicates this object needs to be + /* setting 'do_alpha_after = TRUE' indicates this object needs to be * drawn in a second alpha pass for improved blending */ if (do_alpha_after && !GMS.is_alpha_pass) if (ELEM3(alphablend, GPU_BLEND_ALPHA, GPU_BLEND_ADD, GPU_BLEND_ALPHA_SORT)) - *do_alpha_after= 1; + *do_alpha_after = TRUE; GMS.alphablend[a]= alphablend; } diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index f75c1576fb9..5918cf99d12 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -952,7 +952,7 @@ static void do_material_tex(GPUShadeInput *shi) /*char *lastuvname = NULL;*/ /*UNUSED*/ float one = 1.0f, norfac, ofs[3]; int tex_nr, rgbnor, talpha; - int init_done = 0, iBumpSpacePrev = 0; /* Not necessary, quiting gcc warning. */ + int init_done = FALSE, iBumpSpacePrev = 0; /* Not necessary, quiting gcc warning. */ GPUNodeLink *vNorg, *vNacc, *fPrevMagnitude; int iFirstTimeNMap=1; int found_deriv_map = 0; @@ -1184,7 +1184,7 @@ static void do_material_tex(GPUShadeInput *shi) // copy shi->vn to vNorg and vNacc, set magnitude to 1 GPU_link(mat, "mtex_bump_normals_init", shi->vn, &vNorg, &vNacc, &fPrevMagnitude); iBumpSpacePrev = 0; - init_done = 1; + init_done = TRUE; } // find current bump space diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c index 74fa7c5987e..11da2f4af91 100644 --- a/source/blender/imbuf/intern/indexer.c +++ b/source/blender/imbuf/intern/indexer.c @@ -867,7 +867,7 @@ static int index_rebuild_ffmpeg(FFmpegIndexBuilderContext *context, if (*progress != next_progress) { *progress = next_progress; - *do_update = 1; + *do_update = TRUE; } if (*stop) { @@ -1075,7 +1075,7 @@ static void index_rebuild_fallback(FallbackIndexBuilderContext *context, if (*progress != next_progress) { *progress = next_progress; - *do_update = 1; + *do_update = TRUE; } if (*stop) { diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c index 4f71f296caa..3af853ba150 100644 --- a/source/blender/imbuf/intern/jp2.c +++ b/source/blender/imbuf/intern/jp2.c @@ -97,7 +97,7 @@ static void info_callback(const char *msg, void *client_data) struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags) { struct ImBuf *ibuf = NULL; - int use_float = 0; /* for precision higher then 8 use float */ + int use_float = FALSE; /* for precision higher then 8 use float */ long signed_offsets[4] = {0, 0, 0, 0}; int float_divs[4] = {1, 1, 1, 1}; @@ -183,7 +183,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags) i--; if (image->comps[i].prec > 8) - use_float = 1; + use_float = TRUE; if (image->comps[i].sgnd) signed_offsets[i] = 1 << (image->comps[i].prec - 1); diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index ef057784a28..27034317396 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -1085,7 +1085,7 @@ static ImBuf *scaleupx(struct ImBuf *ibuf, int newx) float val_bf, nval_bf, diff_bf; float val_gf, nval_gf, diff_gf; float val_rf, nval_rf, diff_rf; - int x, y, do_rect = 0, do_float = 0; + int x, y, do_rect = FALSE, do_float = FALSE; val_a = nval_a = diff_a = val_b = nval_b = diff_b = 0; val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0; @@ -1095,12 +1095,12 @@ static ImBuf *scaleupx(struct ImBuf *ibuf, int newx) if (ibuf->rect == NULL && ibuf->rect_float == NULL) return (ibuf); if (ibuf->rect) { - do_rect = 1; + do_rect = TRUE; _newrect = MEM_mallocN(newx * ibuf->y * sizeof(int), "scaleupx"); if (_newrect == NULL) return(ibuf); } if (ibuf->rect_float) { - do_float = 1; + do_float = TRUE; _newrectf = MEM_mallocN(newx * ibuf->y * sizeof(float) * 4, "scaleupxf"); if (_newrectf == NULL) { if (_newrect) MEM_freeN(_newrect); @@ -1252,7 +1252,7 @@ static ImBuf *scaleupy(struct ImBuf *ibuf, int newy) float val_bf, nval_bf, diff_bf; float val_gf, nval_gf, diff_gf; float val_rf, nval_rf, diff_rf; - int x, y, do_rect = 0, do_float = 0, skipx; + int x, y, do_rect = FALSE, do_float = FALSE, skipx; val_a = nval_a = diff_a = val_b = nval_b = diff_b = 0; val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0; @@ -1262,12 +1262,12 @@ static ImBuf *scaleupy(struct ImBuf *ibuf, int newy) if (ibuf->rect == NULL && ibuf->rect_float == NULL) return (ibuf); if (ibuf->rect) { - do_rect = 1; + do_rect = TRUE; _newrect = MEM_mallocN(ibuf->x * newy * sizeof(int), "scaleupy"); if (_newrect == NULL) return(ibuf); } if (ibuf->rect_float) { - do_float = 1; + do_float = TRUE; _newrectf = MEM_mallocN(ibuf->x * newy * sizeof(float) * 4, "scaleupyf"); if (_newrectf == NULL) { if (_newrect) MEM_freeN(_newrect); @@ -1481,16 +1481,16 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned { unsigned int *rect, *_newrect, *newrect; struct imbufRGBA *rectf, *_newrectf, *newrectf; - int x, y, do_float = 0, do_rect = 0; + int x, y, do_float = FALSE, do_rect = FALSE; int ofsx, ofsy, stepx, stepy; rect = NULL; _newrect = NULL; newrect = NULL; rectf = NULL; _newrectf = NULL; newrectf = NULL; if (ibuf == NULL) return(NULL); - if (ibuf->rect) do_rect = 1; - if (ibuf->rect_float) do_float = 1; - if (do_rect == 0 && do_float == 0) return(ibuf); + if (ibuf->rect) do_rect = TRUE; + if (ibuf->rect_float) do_float = TRUE; + if (do_rect == FALSE && do_float == FALSE) return(ibuf); if (newx == ibuf->x && newy == ibuf->y) return(ibuf); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 9dcdce61cea..4c16239f137 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3123,7 +3123,7 @@ static void def_cmp_bokehimage(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "lensshift"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1.0f, 1.0f); - RNA_def_property_ui_text(prop, "Lens shift", "Shift of the lens."); + RNA_def_property_ui_text(prop, "Lens shift", "Shift of the lens"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c index f26b5f44f99..0d1840a7a7d 100644 --- a/source/blender/nodes/composite/node_composite_util.c +++ b/source/blender/nodes/composite/node_composite_util.c @@ -986,7 +986,7 @@ void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2) fRGB wt, *colp; int x, y, ch; int xbl, ybl, nxb, nyb, xbsz, ybsz; - int in2done = 0; + int in2done = FALSE; CompBuf* rdst = alloc_compbuf(in1->x, in1->y, in1->type, 1); @@ -1086,7 +1086,7 @@ void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2) } } - in2done = 1; + in2done = TRUE; } } diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c index 72dec01066e..84b203d005a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_defocus.c +++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c @@ -249,7 +249,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, float bkh_b[4] = {0}; // shape 2D bound float cam_fdist=1, cam_invfdist=1, cam_lens=35; float dof_sp, maxfgc, bk_hn_theta=0, inradsq=0; - int y, len_bkh=0, ydone=0; + int y, len_bkh=0, ydone = FALSE; float aspect, aperture; int minsz; //float bcrad, nmaxc, scf; diff --git a/source/blender/nodes/composite/nodes/node_composite_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c index a571b140a1f..fcc8ed4a128 100644 --- a/source/blender/nodes/composite/nodes/node_composite_outputFile.c +++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c @@ -124,7 +124,7 @@ bNodeSocket *ntreeCompositOutputFileAddSocket(bNodeTree *ntree, bNode *node, con } } /* use node data format by default */ - sockdata->use_node_format = 1; + sockdata->use_node_format = TRUE; nimf->active_input = BLI_findindex(&node->inputs, sock); diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 49a3d6c07b4..300954a3c19 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -133,7 +133,7 @@ bNode *node_group_make_from_selected(bNodeTree *ntree) DO_MINMAX2((&node->locx), min, max); totnode++; } - node->done= 0; + node->done = FALSE; } if (totnode==0) return NULL; diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c index 3b757e753a4..3f77638e25a 100644 --- a/source/blender/nodes/intern/node_exec.c +++ b/source/blender/nodes/intern/node_exec.c @@ -242,7 +242,7 @@ bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread) for (nts=lb->first; nts; nts=nts->next) { if (!nts->used) { - nts->used= 1; + nts->used = TRUE; break; } } @@ -250,7 +250,7 @@ bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread) if (!nts) { nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack"); nts->stack= MEM_dupallocN(exec->stack); - nts->used= 1; + nts->used = TRUE; BLI_addtail(lb, nts); } diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c index 9a9a27603dc..5961c2b330b 100644 --- a/source/blender/nodes/shader/node_shader_util.c +++ b/source/blender/nodes/shader/node_shader_util.c @@ -277,23 +277,23 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs) 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; + int do_it; stack= exec->stack; for (n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { node = nodeexec->node; - doit = 0; + do_it = FALSE; /* 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; + do_it = TRUE; } else - doit = 1; + do_it = TRUE; - if (doit) { + if (do_it) { if (node->typeinfo->gpufunc) { node_get_stack(node, stack, nsin, nsout); gpu_stack_from_data_list(gpuin, &node->inputs, nsin); diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index e2acef7bb73..de23b3bf109 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -122,7 +122,7 @@ static void bpy_pydriver_update_dict(const float evaltime) void BPY_driver_reset(void) { PyGILState_STATE gilstate; - int use_gil = 1; /* !PYC_INTERPRETER_ACTIVE; */ + int use_gil = TRUE; /* !PYC_INTERPRETER_ACTIVE; */ if (use_gil) gilstate = PyGILState_Ensure(); @@ -193,7 +193,7 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime) return 0.0f; } - use_gil = 1; /* !PYC_INTERPRETER_ACTIVE; */ + use_gil = TRUE; /* !PYC_INTERPRETER_ACTIVE; */ if (use_gil) gilstate = PyGILState_Ensure(); diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index b9d4c1ae94f..9fa02046e49 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -660,7 +660,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * PyObject *pyctx = (PyObject *)CTX_py_dict_get(C); PyObject *item = PyDict_GetItemString(pyctx, member); PointerRNA *ptr = NULL; - int done = 0; + int done = FALSE; if (item == NULL) { /* pass */ @@ -673,7 +673,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * //result->ptr = ((BPy_StructRNA *)item)->ptr; CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data); - done = 1; + done = TRUE; } else if (PySequence_Check(item)) { PyObject *seq_fast = PySequence_Fast(item, "bpy_context_get sequence conversion"); @@ -703,7 +703,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult * } Py_DECREF(seq_fast); - done = 1; + done = TRUE; } } diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index c2b0e1e777f..a1cc1e23470 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -168,7 +168,7 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void), float vec[4], fx, fy, fz; float fac, starmindist, clipend; float mat[4][4], stargrid, maxrand, maxjit, force, alpha; - int x, y, z, sx, sy, sz, ex, ey, ez, done = 0; + int x, y, z, sx, sy, sz, ex, ey, ez, done = FALSE; unsigned int totstar= 0; if (initfunc) { @@ -683,7 +683,7 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, int do_tangen } } - if (do_nmap_tangent != 0) { + if (do_nmap_tangent != FALSE) { SRenderMeshToTangent mesh2tangent; SMikkTSpaceContext sContext; SMikkTSpaceInterface sInterface; @@ -1575,7 +1575,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem float pa_time, pa_birthtime, pa_dietime; float random, simplify[2], pa_co[3]; const float cfra= BKE_scene_frame_get(re->scene); - int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0, use_duplimat = 0; + int i, a, k, max_k=0, totpart, do_simplify = FALSE, do_surfacecache = FALSE, use_duplimat = FALSE; int totchild=0; int seed, path_nbr=0, orco1=0, num; int totface, *origindex = 0; @@ -1697,7 +1697,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (psys->flag & PSYS_USE_IMAT) { /* psys->imat is the original emitter's inverse matrix, ob->obmat is the duplicated object's matrix */ mult_m4_m4m4(duplimat, ob->obmat, psys->imat); - use_duplimat = 1; + use_duplimat = TRUE; } /* 2.6 setup strand rendering */ @@ -1744,10 +1744,10 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem svert= strandbuf->vert; if (re->r.mode & R_SPEED) - dosurfacecache= 1; + do_surfacecache = TRUE; else if ((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && (re->wrld.ao_gather_method == WO_AOGATHER_APPROX)) if (ma->amb != 0.0f) - dosurfacecache= 1; + do_surfacecache = TRUE; totface= psmd->dm->getNumTessFaces(psmd->dm); origindex= psmd->dm->getTessFaceDataArray(psmd->dm, CD_ORIGINDEX); @@ -1860,7 +1860,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem get_particle_uvco_mcol(part->from, psmd->dm, parent->fuv, num, &sd); } - dosimplify = psys_render_simplify_params(psys, cpa, simplify); + do_simplify = psys_render_simplify_params(psys, cpa, simplify); if (strandbuf) { int orignum= (origindex)? origindex[cpa->num]: cpa->num; @@ -1892,7 +1892,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem strand->vert= svert; copy_v3_v3(strand->orco, sd.orco); - if (dosimplify) { + if (do_simplify) { float *ssimplify= RE_strandren_get_simplify(obr, strand, 1); ssimplify[0]= simplify[0]; ssimplify[1]= simplify[1]; @@ -1903,7 +1903,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem copy_v3_v3(snor, sd.surfnor); } - if (dosurfacecache && num >= 0) { + if (do_surfacecache && num >= 0) { int *facenum= RE_strandren_get_face(obr, strand, 1); *facenum= num; } @@ -2084,7 +2084,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem break; } - if (dosurfacecache) + if (do_surfacecache) strandbuf->surface= cache_strand_surface(re, obr, psmd->dm, mat, timeoffset); /* 4. clean up */ @@ -3263,8 +3263,8 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) float *orco=0; int need_orco=0, need_stress=0, need_nmap_tangent=0, need_tangent=0; int a, a1, ok, vertofs; - int end, do_autosmooth=0, totvert = 0; - int use_original_normals= 0; + int end, do_autosmooth = FALSE, totvert = 0; + int use_original_normals = FALSE; int recalc_normals = 0; // false by default int negative_scale; @@ -3339,7 +3339,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) /* attempt to autsmooth on original mesh, only without subsurf */ if (do_autosmooth && me->totvert==totvert && me->totface==dm->getNumTessFaces(dm)) - use_original_normals= 1; + use_original_normals= TRUE; ms = (totvert==me->totvert)?me->msticky:NULL; @@ -3354,7 +3354,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) for (a=0; atotvert++); copy_v3_v3(ver->co, mvert->co); - if (do_autosmooth==0) { /* autosmooth on original unrotated data to prevent differences between frames */ + if (do_autosmooth == FALSE) { /* autosmooth on original unrotated data to prevent differences between frames */ normal_short_to_float_v3(ver->n, mvert->no); mul_m4_v3(mat, ver->co); mul_transposed_m3_v3(imat, ver->n); @@ -3416,7 +3416,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) if ( mface->mat_nr==a1 ) { float len; - int reverse_verts = negative_scale!=0 && do_autosmooth==0; + int reverse_verts = (negative_scale != 0 && do_autosmooth == FALSE); int rev_tab[] = {reverse_verts==0 ? 0 : 2, 1, reverse_verts==0 ? 2 : 0, 3}; v1= reverse_verts==0 ? mface->v1 : mface->v3; v2= mface->v2; @@ -4703,7 +4703,7 @@ void RE_Database_Free(Render *re) free_strand_surface(re); re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; - re->i.convertdone= 0; + re->i.convertdone = FALSE; re->bakebuf= NULL; @@ -5045,7 +5045,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l re->lampren.first= re->lampren.last= NULL; slurph_opt= 0; - re->i.partsdone= 0; /* signal now in use for previewrender */ + re->i.partsdone = FALSE; /* signal now in use for previewrender */ /* in localview, lamps are using normal layers, objects only local bits */ if (re->lay & 0xFF000000) @@ -5164,7 +5164,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l if (re->test_break(re->tbh)) RE_Database_Free(re); else - re->i.convertdone= 1; + re->i.convertdone = TRUE; re->i.infostr= NULL; re->stats_draw(re->sdh, &re->i); @@ -5651,8 +5651,8 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned // NT check for fluidsim special treatment fluidmd = (FluidsimModifierData *)modifiers_findByType(obi->ob, eModifierType_Fluidsim); if (fluidmd && fluidmd->fss && (fluidmd->fss->type & OB_FLUIDSIM_DOMAIN)) { - // use preloaded per vertex simulation data, only does calculation for step=1 - // NOTE/FIXME - velocities and meshes loaded unnecessarily often during the database_fromscene_vectors calls... + /* use preloaded per vertex simulation data, only does calculation for step=1 */ + /* NOTE/FIXME - velocities and meshes loaded unnecessarily often during the database_fromscene_vectors calls... */ load_fluidsimspeedvectors(re, obi, oldobi->vectors, step); } else { diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index eebcf23a7a6..6714fe1a29d 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -505,7 +505,7 @@ static void render_envmap(Render *re, EnvMap *env) void make_envmaps(Render *re) { Tex *tex; - int do_init= 0, depth= 0, trace; + int do_init = FALSE, depth= 0, trace; if (!(re->r.mode & R_ENVMAP)) return; @@ -559,7 +559,7 @@ void make_envmaps(Render *re) if (env->ok==0 && depth==0) env->recalc= 1; if (env->ok==0) { - do_init= 1; + do_init = TRUE; render_envmap(re, env); if (depth==env->depth) env->recalc= 0; diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index e712950f4f8..c0382834987 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -549,7 +549,7 @@ void initparts(Render *re) /* this is render info for caller, is not reset when parts are freed! */ re->i.totpart= 0; re->i.curpart= 0; - re->i.partsdone= 0; + re->i.partsdone = FALSE; /* just for readable code.. */ xminb= re->disprect.xmin; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 79f94c77dde..7549207af87 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1302,7 +1302,7 @@ static int composite_needs_render(Scene *sce, int this_scene) bNode *node; if (ntree==NULL) return 1; - if (sce->use_nodes==0) return 1; + if (sce->use_nodes == FALSE) return 1; if ((sce->r.scemode & R_DOCOMP)==0) return 1; for (node= ntree->nodes.first; node; node= node->next) { @@ -2074,18 +2074,18 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie /* write movie or image */ if (BKE_imtype_is_movie(scene->r.im_format.imtype)) { - int dofree = 0; + int do_free = FALSE; unsigned int *rect32 = (unsigned int *)rres.rect32; /* note; the way it gets 32 bits rects is weak... */ if (rres.rect32 == NULL) { rect32 = MEM_mapallocN(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect"); RE_ResultGet32(re, rect32); - dofree = 1; + do_free = TRUE; } ok= mh->append_movie(&re->r, scene->r.sfra, scene->r.cfra, (int *)rect32, rres.rectx, rres.recty, re->reports); - if (dofree) { + if (do_free) { MEM_freeN(rect32); } printf("Append frame %d", scene->r.cfra); diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c index ac48a5f41f2..0aeee7e22e8 100644 --- a/source/blender/render/intern/source/pixelshading.c +++ b/source/blender/render/intern/source/pixelshading.c @@ -566,7 +566,7 @@ void shadeSunView(float col_r[3], const float view[3]) GroupObject *go; LampRen *lar; float sview[3]; - int do_init= 1; + int do_init = TRUE; for (go=R.lights.first; go; go= go->next) { lar= go->lampren; @@ -581,7 +581,7 @@ void shadeSunView(float col_r[3], const float view[3]) if (sview[2] < 0.0f) sview[2] = 0.0f; normalize_v3(sview); - do_init= 0; + do_init = FALSE; } GetSkyXYZRadiancef(lar->sunsky, sview, colorxyz); diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index f550cd82061..726d89a7c3e 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -721,7 +721,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con shi.lay= origshi->lay; shi.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass info */ shi.combinedflag= 0xFFFFFF; /* ray trace does all options */ - //shi.do_preview= 0; // memset above, so don't need this + //shi.do_preview = FALSE; // memset above, so don't need this shi.light_override= origshi->light_override; shi.mat_override= origshi->mat_override; @@ -1176,13 +1176,13 @@ static QMCSampler *get_thread_qmcsampler(Render *re, int thread, int type, int t for (qsa=re->qmcsamplers[thread].first; qsa; qsa=qsa->next) { if (qsa->type == type && qsa->tot == tot && !qsa->used) { - qsa->used= 1; + qsa->used = TRUE; return qsa; } } qsa= QMC_initSampler(type, tot); - qsa->used= 1; + qsa->used = TRUE; BLI_addtail(&re->qmcsamplers[thread], qsa); return qsa; @@ -1483,8 +1483,8 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr) float diff[3]; int do_tra, do_mir; - do_tra= ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f && (shi->depth <= shi->mat->ray_depth_tra)); - do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f && (shi->depth <= shi->mat->ray_depth)); + do_tra = ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha != 1.0f && (shi->depth <= shi->mat->ray_depth_tra)); + do_mir = ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror != 0.0f && (shi->depth <= shi->mat->ray_depth)); /* raytrace mirror and refract like to separate the spec color */ if (shi->combinedflag & SCE_PASS_SPEC) @@ -2195,7 +2195,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3], float adapt_thresh = lar->adapt_thresh; int min_adapt_samples=4, max_samples = lar->ray_totsamp; float *co; - int do_soft=1, full_osa=0, i; + int do_soft = TRUE, full_osa = FALSE, i; float min[3], max[3]; RayHint bb_hint; @@ -2210,8 +2210,8 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3], else shadfac[3]= 1.0f; - if (lar->ray_totsamp < 2) do_soft = 0; - if ((R.r.mode & R_OSA) && (R.osa > 0) && (shi->vlr->flag & R_FULL_OSA)) full_osa = 1; + if (lar->ray_totsamp < 2) do_soft = FALSE; + if ((R.r.mode & R_OSA) && (R.osa > 0) && (shi->vlr->flag & R_FULL_OSA)) full_osa = TRUE; if (full_osa) { if (do_soft) max_samples = max_samples/R.osa + 1; diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index 58a4e7c9828..bf18c04cd73 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -1367,7 +1367,7 @@ int multitex_ext_safe(Tex *tex, float *texvec, TexResult *texres) { int use_nodes= tex->use_nodes, retval; - tex->use_nodes= 0; + tex->use_nodes = FALSE; retval= multitex_nodes(tex, texvec, NULL, NULL, 0, texres, 0, 0, NULL, NULL); tex->use_nodes= use_nodes; @@ -1714,7 +1714,7 @@ static void compatible_bump_uv_derivs(CompatibleBump *compat_bump, ShadeInput *s compat_bump->nn[1] = -shi->vn[1]; compat_bump->nn[2] = -shi->vn[2]; ortho_basis_v3v3_v3(compat_bump->nu, compat_bump->nv, compat_bump->nn); - compat_bump->nunvdone= 1; + compat_bump->nunvdone = TRUE; } if (tf) { @@ -1766,7 +1766,7 @@ static int compatible_bump_compute(CompatibleBump *compat_bump, ShadeInput *shi, // render normal is negated negate_v3_v3(compat_bump->nn, shi->vn); ortho_basis_v3v3_v3(compat_bump->nu, compat_bump->nv, compat_bump->nn); - compat_bump->nunvdone= 1; + compat_bump->nunvdone = TRUE; } // two methods, either constant based on main image resolution, @@ -1946,7 +1946,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T ntap_bump->fPrevMagnitude = 1.0f; ntap_bump->iPrevBumpSpace = 0; - ntap_bump->init_done = 1; + ntap_bump->init_done = TRUE; } // resolve image dimensions @@ -2171,8 +2171,8 @@ void do_material_tex(ShadeInput *shi, Render *re) float *co = NULL, *dx = NULL, *dy = NULL; float fact, facm, factt, facmm, stencilTin=1.0; float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0; - int tex_nr, rgbnor= 0, warpdone=0; - int use_compat_bump = 0, use_ntap_bump = 0; + int tex_nr, rgbnor= 0, warp_done = FALSE; + int use_compat_bump = FALSE, use_ntap_bump = FALSE; int found_nmapping = 0, found_deriv_map = 0; int iFirstTimeNMap=1; @@ -2195,24 +2195,24 @@ void do_material_tex(ShadeInput *shi, Render *re) found_deriv_map = (tex->type==TEX_IMAGE) && (tex->imaflag & TEX_DERIVATIVEMAP); use_compat_bump= (mtex->texflag & MTEX_COMPAT_BUMP); - use_ntap_bump= ((mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP|MTEX_BICUBIC_BUMP))!=0 || found_deriv_map!=0) ? 1 : 0; + use_ntap_bump = ((mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP|MTEX_BICUBIC_BUMP))!=0 || found_deriv_map!=0) ? TRUE : FALSE; /* XXX texture node trees don't work for this yet */ if (tex->nodetree && tex->use_nodes) { - use_compat_bump = 0; - use_ntap_bump = 0; + use_compat_bump = FALSE; + use_ntap_bump = FALSE; } /* case displacement mapping */ - if (shi->osatex==0 && use_ntap_bump) { - use_ntap_bump = 0; - use_compat_bump = 1; + if (shi->osatex == 0 && use_ntap_bump) { + use_ntap_bump = FALSE; + use_compat_bump = TRUE; } /* case ocean */ if (tex->type == TEX_OCEAN) { - use_ntap_bump = 0; - use_compat_bump = 0; + use_ntap_bump = FALSE; + use_compat_bump = FALSE; } /* which coords */ @@ -2322,7 +2322,7 @@ void do_material_tex(ShadeInput *shi, Render *re) } else texres.nor= NULL; - if (warpdone) { + if (warp_done) { add_v3_v3v3(tempvec, co, warpvec); co= tempvec; } @@ -2409,7 +2409,7 @@ void do_material_tex(ShadeInput *shi, Render *re) warpvec[0]= mtex->warpfac*warpnor[0]; warpvec[1]= mtex->warpfac*warpnor[1]; warpvec[2]= mtex->warpfac*warpnor[2]; - warpdone= 1; + warp_done = TRUE; } #if 0 if (mtex->texflag & MTEX_VIEWSPACE) { @@ -2681,7 +2681,7 @@ void do_material_tex(ShadeInput *shi, Render *re) } } } - if ((use_compat_bump || use_ntap_bump || found_nmapping) && (shi->mat->mode & MA_TANGENT_V)!=0) { + if ((use_compat_bump || use_ntap_bump || found_nmapping) && (shi->mat->mode & MA_TANGENT_V) != 0) { const float fnegdot = -dot_v3v3(shi->vn, shi->tang); // apply Gram-Schmidt projection madd_v3_v3fl(shi->tang, shi->vn, fnegdot); diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 0dc7f35dc56..2fd8e49d34e 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -683,7 +683,7 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl) for (y=pa->disprect.ymin; ydisprect.ymax; y++) { for (x=pa->disprect.xmin; xdisprect.xmax; x++, od+=4) { float col[4]; - int sample, done= 0; + int sample, done = FALSE; for (sample= 0; samplerectf + od; @@ -692,7 +692,7 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl) if (done==0) { shadeSkyPixel(col, x, y, pa->thread); - done= 1; + done = TRUE; } if (pass[3]==0.0f) { @@ -748,7 +748,7 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl) float *zrect= RE_RenderLayerGetPass(rlpp[sample], SCE_PASS_Z) + od; float *rgbrect = rlpp[sample]->rectf + 4*od; float rgb[3] = {0}; - int done= 0; + int done = FALSE; for (go=R.lights.first; go; go= go->next) { @@ -780,7 +780,7 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl) if (done==0) { copy_v3_v3(rgb, tmp_rgb); - done = 1; + done = TRUE; } else { rgb[0] = 0.5f*rgb[0] + 0.5f*tmp_rgb[0]; @@ -1935,7 +1935,7 @@ void add_halo_flare(Render *re) RenderResult *rr= re->result; RenderLayer *rl; HaloRen *har; - int a, mode, do_draw=0; + int a, mode, do_draw = FALSE; /* for now, we get the first renderlayer in list with halos set */ for (rl= rr->layers.first; rl; rl= rl->next) @@ -1954,7 +1954,7 @@ void add_halo_flare(Render *re) har= R.sortedhalos[a]; if (har->flarec) { - do_draw= 1; + do_draw = TRUE; renderflare(rr, rl->rectf, har); } } @@ -1988,7 +1988,7 @@ typedef struct BakeShade { unsigned int *rect; float *rect_float; - int usemask; + int use_mask; char *rect_mask; /* bake pixel mask */ float dxco[3], dyco[3]; @@ -2408,12 +2408,12 @@ static int get_next_bake_face(BakeShade *bs) ObjectRen *obr; VlakRen *vlr; MTFace *tface; - static int v= 0, vdone= 0; + static int v= 0, vdone = FALSE; static ObjectInstanceRen *obi= NULL; if (bs==NULL) { vlr= NULL; - v= vdone= 0; + v= vdone = FALSE; obi= R.instancetable.first; return 0; } @@ -2507,7 +2507,7 @@ static void shade_tface(BakeShade *bs) bs->rect_float= bs->ibuf->rect_float; bs->quad= 0; - if (bs->usemask) { + if (bs->use_mask) { if (bs->ibuf->userdata==NULL) { BLI_lock_thread(LOCK_CUSTOM1); if (bs->ibuf->userdata==NULL) /* since the thread was locked, its possible another thread alloced the value */ @@ -2594,7 +2594,7 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up BakeShade *handles; ListBase threads; Image *ima; - int a, vdone=0, usemask=0, result=BAKE_RESULT_OK; + int a, vdone = FALSE, use_mask = FALSE, result = BAKE_RESULT_OK; /* initialize render global */ R= *re; @@ -2605,7 +2605,7 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up /* do we need a mask? */ if (re->r.bake_filter) - usemask = 1; + use_mask = TRUE; /* baker uses this flag to detect if image was initialized */ for (ima= G.main->image.first; ima; ima= ima->id.next) { @@ -2642,7 +2642,7 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up handles[a].actob= actob; handles[a].zspan= MEM_callocN(sizeof(ZSpan), "zspan for bake"); - handles[a].usemask = usemask; + handles[a].use_mask = use_mask; handles[a].do_update = do_update; /* use to tell the view to update */ @@ -2655,7 +2655,7 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up PIL_sleep_ms(50); /* calculate progress */ - for (vdone=0, a=0; ar.threads; a++) + for (vdone = FALSE, a=0; ar.threads; a++) vdone+= handles[a].vdone; if (progress) *progress = (float)(vdone / (float)re->totvlak); diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c index 4a9e4be7f86..bc61a26564d 100644 --- a/source/blender/render/intern/source/renderdatabase.c +++ b/source/blender/render/intern/source/renderdatabase.c @@ -1205,7 +1205,9 @@ static int panotestclip(Render *re, int do_pano, float *v) float abs4; short c=0; - if (do_pano==0) return testclip(v); + if (do_pano == FALSE) { + return testclip(v); + } abs4= fabs(v[3]); diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 53d06893a3f..a0f5caa826b 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -161,7 +161,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens) double a, b, c, disc, nray[3], npos[3]; double t0, t1 = 0.0f, t2= 0.0f, t3; float p1[3], p2[3], ladist, maxz = 0.0f, maxy = 0.0f, haint; - int snijp, doclip=1, use_yco=0; + int snijp, do_clip = TRUE, use_yco = FALSE; *intens= 0.0f; haint= lar->haint; @@ -196,7 +196,9 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens) /* rotate maxz */ - if (shi->co[2]==0.0f) doclip= 0; /* for when halo at sky */ + if (shi->co[2]==0.0f) { + do_clip = FALSE; /* for when halo at sky */ + } else { p1[0]= shi->co[0]-lar->co[0]; p1[1]= shi->co[1]-lar->co[1]; @@ -206,7 +208,9 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens) maxz*= lar->sh_zfac; maxy= lar->imat[0][1]*p1[0]+lar->imat[1][1]*p1[1]+lar->imat[2][1]*p1[2]; - if ( fabs(nray[2]) < FLT_EPSILON ) use_yco= 1; + if (fabsf(nray[2]) < FLT_EPSILON) { + use_yco = TRUE; + } } /* scale z to make sure volume is normalized */ @@ -261,7 +265,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens) if (ok1==0 && ok2==0) return; /* intersction point with -ladist, the bottom of the cone */ - if (use_yco==0) { + if (use_yco == FALSE) { t3= ((double)(-ladist)-npos[2])/nray[2]; /* de we have to replace one of the intersection points? */ @@ -294,12 +298,12 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens) } /* calculate t0: is the maximum visible z (when halo is intersected by face) */ - if (doclip) { - if (use_yco==0) t0= (maxz-npos[2])/nray[2]; - else t0= (maxy-npos[1])/nray[1]; + if (do_clip) { + if (use_yco == FALSE) t0 = (maxz - npos[2]) / nray[2]; + else t0 = (maxy - npos[1]) / nray[1]; - if (t0tmppoints; - int index, nsize[8], noffset[8], i, subco, usednodes, usedi; + int index, nsize[8], noffset[8], i, subco, used_nodes, usedi; float submid[3], subsize[3]; /* stopping condition */ @@ -684,16 +684,16 @@ static void create_octree_node(ScatterTree *tree, ScatterNode *node, float *mid, /* here we check if only one subnode is used. if this is the case, we don't * create a new node, but rather call this function again, with different * size and middle position for the same node. */ - for (usedi=0, usednodes=0, i=0; i<8; i++) { + for (usedi=0, used_nodes=0, i=0; i<8; i++) { if (nsize[i]) { - usednodes++; + used_nodes++; usedi = i; } if (i != 0) noffset[i]= noffset[i-1]+nsize[i-1]; } - if (usednodes<=1) { + if (used_nodes <= 1) { subnode_middle(usedi, mid, subsize, submid); create_octree_node(tree, node, submid, subsize, refpoints, depth+1); return; @@ -874,7 +874,7 @@ static void sss_create_tree_mat(Render *re, Material *mat) re->r.mode &= ~R_OSA; re->sss_points= &points; re->sss_mat= mat; - re->i.partsdone= 0; + re->i.partsdone = FALSE; if (!(re->r.scemode & R_PREVIEWBUTS)) re->result= NULL; diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 2b83a55d7bb..a8c94865aa5 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -130,7 +130,7 @@ static void wm_region_test_render_do_draw(ScrArea *sa, ARegion *ar) RenderEngine *engine = (rv3d) ? rv3d->render_engine : NULL; if (engine && (engine->flag & RE_ENGINE_DO_DRAW)) { - ar->do_draw = 1; + ar->do_draw = TRUE; engine->flag &= ~RE_ENGINE_DO_DRAW; } } @@ -661,15 +661,15 @@ static int wm_draw_update_test_window(wmWindow *win) { ScrArea *sa; ARegion *ar; - int do_draw = 0; + int do_draw = FALSE; for (ar = win->screen->regionbase.first; ar; ar = ar->next) { if (ar->do_draw_overlay) { wm_tag_redraw_overlay(win, ar); - ar->do_draw_overlay = 0; + ar->do_draw_overlay = FALSE; } if (ar->swinid && ar->do_draw) - do_draw = 1; + do_draw = TRUE; } for (sa = win->screen->areabase.first; sa; sa = sa->next) { @@ -677,7 +677,7 @@ static int wm_draw_update_test_window(wmWindow *win) wm_region_test_render_do_draw(sa, ar); if (ar->swinid && ar->do_draw) - do_draw = 1; + do_draw = TRUE; } } @@ -737,7 +737,7 @@ void wm_tag_redraw_overlay(wmWindow *win, ARegion *ar) if (ar && win) { if (wm_automatic_draw_method(win) != USER_DRAW_TRIPLE) ED_region_tag_redraw(ar); - win->screen->do_draw_paintcursor = 1; + win->screen->do_draw_paintcursor = TRUE; } } @@ -778,9 +778,9 @@ void wm_draw_update(bContext *C) else // if (drawmethod == USER_DRAW_TRIPLE) wm_method_draw_triple(C, win); - win->screen->do_draw_gesture = 0; - win->screen->do_draw_paintcursor = 0; - win->screen->do_draw_drag = 0; + win->screen->do_draw_gesture = FALSE; + win->screen->do_draw_paintcursor = FALSE; + win->screen->do_draw_drag = FALSE; wm_window_swap_buffers(win); @@ -816,7 +816,7 @@ void wm_draw_region_clear(wmWindow *win, ARegion *ar) if (ELEM(drawmethod, USER_DRAW_OVERLAP, USER_DRAW_OVERLAP_FLIP)) wm_flush_regions_down(win->screen, &ar->winrct); - win->screen->do_draw = 1; + win->screen->do_draw = TRUE; } void WM_redraw_windows(bContext *C) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index fd3e287a6a5..556ca6b5995 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -194,7 +194,7 @@ void wm_event_do_notifiers(bContext *C) /* cache & catch WM level notifiers, such as frame change, scene/screen set */ for (win = wm->windows.first; win; win = win->next) { - int do_anim = 0; + int do_anim = FALSE; CTX_wm_window_set(C, win); @@ -229,7 +229,7 @@ void wm_event_do_notifiers(bContext *C) { if (note->category == NC_SCENE) { if (note->data == ND_FRAME) - do_anim = 1; + do_anim = TRUE; } } if (ELEM5(note->category, NC_SCENE, NC_OBJECT, NC_GEOM, NC_SCENE, NC_WM)) { @@ -331,17 +331,17 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve ScrArea *area = CTX_wm_area(C); ARegion *region = CTX_wm_region(C); ARegion *menu = CTX_wm_menu(C); - static int do_wheel_ui = 1; + static int do_wheel_ui = TRUE; int is_wheel = ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE); int retval; /* UI is quite aggressive with swallowing events, like scrollwheel */ /* I realize this is not extremely nice code... when UI gets keymaps it can be maybe smarter */ - if (do_wheel_ui == 0) { + if (do_wheel_ui == FALSE) { if (is_wheel) return WM_HANDLER_CONTINUE; else if (wm_event_always_pass(event) == 0) - do_wheel_ui = 1; + do_wheel_ui = TRUE; } /* we set context to where ui handler came from */ @@ -369,7 +369,7 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve /* event not handled in UI, if wheel then we temporarily disable it */ if (is_wheel) - do_wheel_ui = 0; + do_wheel_ui = FALSE; return WM_HANDLER_CONTINUE; } @@ -1863,7 +1863,7 @@ static void wm_paintcursor_tag(bContext *C, wmPaintCursor *pc, ARegion *ar) for (; pc; pc = pc->next) { if (pc->poll == NULL || pc->poll(C)) { wmWindow *win = CTX_wm_window(C); - win->screen->do_draw_paintcursor = 1; + win->screen->do_draw_paintcursor = TRUE; wm_tag_redraw_overlay(win, ar); } } @@ -1902,10 +1902,10 @@ static void wm_event_drag_test(wmWindowManager *wm, wmWindow *win, wmEvent *even if (wm->drags.first == NULL) return; if (event->type == MOUSEMOVE) - win->screen->do_draw_drag = 1; + win->screen->do_draw_drag = TRUE; else if (event->type == ESCKEY) { BLI_freelistN(&wm->drags); - win->screen->do_draw_drag = 1; + win->screen->do_draw_drag = TRUE; } else if (event->type == LEFTMOUSE && event->val == KM_RELEASE) { event->type = EVT_DROP; @@ -1921,7 +1921,7 @@ static void wm_event_drag_test(wmWindowManager *wm, wmWindow *win, wmEvent *even event->customdatafree = 1; /* clear drop icon */ - win->screen->do_draw_drag = 1; + win->screen->do_draw_drag = TRUE; /* restore cursor (disabled, see wm_dragdrop.c) */ // WM_cursor_restore(win); @@ -1930,7 +1930,7 @@ static void wm_event_drag_test(wmWindowManager *wm, wmWindow *win, wmEvent *even /* overlap fails otherwise */ if (win->screen->do_draw_drag) if (win->drawmethod == USER_DRAW_OVERLAP) - win->screen->do_draw = 1; + win->screen->do_draw = TRUE; } diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c index 97a431d296b..c20a281fa96 100644 --- a/source/blender/windowmanager/intern/wm_gesture.c +++ b/source/blender/windowmanager/intern/wm_gesture.c @@ -357,7 +357,7 @@ void wm_gesture_tag_redraw(bContext *C) ARegion *ar = CTX_wm_region(C); if (screen) - screen->do_draw_gesture = 1; + screen->do_draw_gesture = TRUE; wm_tag_redraw_overlay(win, ar); } diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 877b8a92296..73f59a5fbae 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -37,6 +37,7 @@ #include "BLI_blenlib.h" #include "BLI_threads.h" +#include "BLI_utildefines.h" #include "BKE_blender.h" #include "BKE_context.h" @@ -449,7 +450,7 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) if (steve->flag & WM_JOB_PROGRESS) WM_event_add_notifier(C, NC_WM | ND_JOB, NULL); - steve->do_update = 0; + steve->do_update = FALSE; } if (steve->ready) { diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index d96198413e0..b613aab32fc 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -4075,7 +4075,7 @@ static EnumPropertyItem *rna_id_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(pt } RNA_enum_item_end(&item, &totitem); - *do_free = 1; + *do_free = TRUE; return item; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index af3ba02ed4d..95af8aa1d9e 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -238,8 +238,8 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig) BLI_strncpy(win->screenname, win->screen->id.name + 2, sizeof(win->screenname)); win->screen->winid = win->winid; - win->screen->do_refresh = 1; - win->screen->do_draw = 1; + win->screen->do_refresh = TRUE; + win->screen->do_draw = TRUE; win->drawmethod = -1; win->drawdata = NULL; From ed679693c9ec825b50666b89a4b1a883e77e58fb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 19 May 2012 13:55:54 +0000 Subject: [PATCH 045/159] style cleanup: whitespace/indentation --- CMakeLists.txt | 14 ++--- source/blender/avi/intern/avirgb.c | 2 +- source/blender/blenkernel/intern/action.c | 4 +- source/blender/blenkernel/intern/anim.c | 2 +- .../blender/blenkernel/intern/cdderivedmesh.c | 6 +- .../blender/blenkernel/intern/dynamicpaint.c | 20 +++---- source/blender/blenkernel/intern/font.c | 2 +- source/blender/blenlib/intern/BLI_kdopbvh.c | 4 +- source/blender/blenlib/intern/fnmatch.c | 2 +- source/blender/blenlib/intern/path_util.c | 2 +- source/blender/blenlib/intern/winstuff.c | 2 +- .../operations/COM_MapUVOperation.h | 2 +- .../operations/COM_OpenCLKernels.cl | 3 +- .../operations/COM_OpenCLKernels.cl.cpp | 3 +- source/blender/editors/animation/anim_draw.c | 2 +- .../blender/editors/armature/editarmature.c | 2 +- .../editors/armature/editarmature_retarget.c | 4 +- source/blender/editors/armature/poseobject.c | 2 +- .../blender/editors/gpencil/gpencil_paint.c | 2 +- source/blender/editors/interface/view2d.c | 4 +- .../blender/editors/physics/physics_fluid.c | 4 +- source/blender/editors/space_file/file_ops.c | 2 +- source/blender/editors/space_nla/nla_draw.c | 2 +- .../editors/space_userpref/space_userpref.c | 2 +- .../editors/space_view3d/view3d_draw.c | 2 +- source/blender/editors/transform/transform.c | 6 +- .../editors/transform/transform_conversions.c | 60 +++++++++---------- .../editors/transform/transform_generics.c | 2 +- .../editors/transform/transform_input.c | 4 +- .../editors/transform/transform_snap.c | 2 +- source/blender/imbuf/intern/filetype.c | 2 +- source/blender/imbuf/intern/filter.c | 2 +- source/blender/imbuf/intern/tiff.c | 2 +- source/blender/makesrna/intern/rna_nodetree.c | 2 +- .../blender/modifiers/intern/MOD_collision.c | 2 +- source/blender/modifiers/intern/MOD_mask.c | 2 +- source/blender/modifiers/intern/MOD_screw.c | 2 +- .../composite/nodes/node_composite_blur.c | 2 +- .../composite/nodes/node_composite_defocus.c | 2 +- .../render/intern/source/convertblender.c | 4 +- .../render/intern/source/render_texture.c | 2 +- .../render/intern/source/shadeoutput.c | 2 +- .../blender/windowmanager/intern/wm_gesture.c | 2 +- source/creator/creator.c | 2 +- 44 files changed, 101 insertions(+), 99 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69812be1e50..4f86aa0d7f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,8 +103,8 @@ enable_testing() #----------------------------------------------------------------------------- # Redirect output files -set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "" FORCE ) -set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib CACHE INTERNAL "" FORCE ) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "" FORCE) +set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib CACHE INTERNAL "" FORCE) #----------------------------------------------------------------------------- # Set default config options @@ -1187,13 +1187,13 @@ elseif(APPLE) endif() if(${XCODE_VERSION} VERSION_LESS 4.3) - SET(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk CACHE PATH "" FORCE ) # use guaranteed existing sdk + set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk CACHE PATH "" FORCE) # use guaranteed existing sdk else() # note: i don't use xcode-select path on purpose, cause also /Applications/Xcode.app would be allowed # absolute pathes are more foolproof here ! - SET(OSX_SYSROOT_PREFIX /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform) - SET(OSX_DEVELOPER_PREFIX /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk) # use guaranteed existing sdk - SET(CMAKE_OSX_SYSROOT ${OSX_SYSROOT_PREFIX}/${OSX_DEVELOPER_PREFIX} CACHE PATH "" FORCE) + set(OSX_SYSROOT_PREFIX /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform) + set(OSX_DEVELOPER_PREFIX /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk) # use guaranteed existing sdk + set(CMAKE_OSX_SYSROOT ${OSX_SYSROOT_PREFIX}/${OSX_DEVELOPER_PREFIX} CACHE PATH "" FORCE) endif() if(WITH_LIBS10.5) @@ -1365,7 +1365,7 @@ elseif(APPLE) ) set(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib) - set(OPENCOLLADA_LIBRARIES "OpenCOLLADASaxFrameworkLoader -lOpenCOLLADAFramework -lOpenCOLLADABaseUtils -lOpenCOLLADAStreamWriter -lMathMLSolver -lGeneratedSaxParser -lUTF -lxml2 -lbuffer -lftoa" ) + set(OPENCOLLADA_LIBRARIES "OpenCOLLADASaxFrameworkLoader -lOpenCOLLADAFramework -lOpenCOLLADABaseUtils -lOpenCOLLADAStreamWriter -lMathMLSolver -lGeneratedSaxParser -lUTF -lxml2 -lbuffer -lftoa") #pcre is bundled with openCollada #set(PCRE ${LIBDIR}/pcre) #set(PCRE_LIBPATH ${PCRE}/lib) diff --git a/source/blender/avi/intern/avirgb.c b/source/blender/avi/intern/avirgb.c index 78316990d54..7a95972845a 100644 --- a/source/blender/avi/intern/avirgb.c +++ b/source/blender/avi/intern/avirgb.c @@ -59,7 +59,7 @@ void *avi_converter_from_avi_rgb(AviMovie *movie, int stream, unsigned char *buf unsigned char *to; #ifdef __BIG_ENDIAN__ unsigned char *pxla; -#endif +#endif buf = MEM_mallocN(movie->header->Height * movie->header->Width * 3, "fromavirgbbuf"); diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 0f8716e2b04..233647c9ec6 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -247,7 +247,7 @@ void set_active_action_group(bAction *act, bActionGroup *agrp, short select) for (grp = act->groups.first; grp; grp = grp->next) { if ((grp == agrp) && (select)) grp->flag |= AGRP_ACTIVE; - else + else grp->flag &= ~AGRP_ACTIVE; } } @@ -958,7 +958,7 @@ short action_get_item_transforms(bAction *act, Object *ob, bPoseChannel *pchan, RNA_pointer_create((ID *)ob, &RNA_PoseBone, pchan, &ptr); else if (ob) RNA_id_pointer_create((ID *)ob, &ptr); - else + else return 0; /* get the basic path to the properties of interest */ diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 6198a119ac4..f73221066b1 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -452,7 +452,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) /* get pointer to animviz settings for each target */ if (mpt->pchan) avs = &mpt->ob->pose->avs; - else + else avs = &mpt->ob->avs; /* clear the flag requesting recalculation of targets */ diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index cc49652d6e5..65294e3e5f5 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -636,9 +636,9 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, else { if (index) { orig = *index++; - if (orig == ORIGINDEX_NONE) { if (nors) nors += 3; continue; } - if (drawParamsMapped) draw_option = drawParamsMapped(userData, orig); - else { if (nors) nors += 3; continue; } + if (orig == ORIGINDEX_NONE) { if (nors) nors += 3; continue; } + if (drawParamsMapped) { draw_option = drawParamsMapped(userData, orig); } + else { if (nors) nors += 3; continue; } } else if (drawParamsMapped) draw_option = drawParamsMapped(userData, i); diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index d526ce7afdc..f8b8efdf7eb 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -575,16 +575,16 @@ static int surface_getBrushFlags(DynamicPaintSurface *surface, Scene *scene) brushObj = NULL; /* select object */ - if (surface->brush_group) { + if (surface->brush_group) { if (go->ob) brushObj = go->ob; - } - else + } + else brushObj = base->object; if (!brushObj) { if (surface->brush_group) go = go->next; else base = base->next; - continue; + continue; } if (surface->brush_group) @@ -3569,7 +3569,7 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, tree = BLI_kdtree_new(psys->totpart); /* loop through particles and insert valid ones to the tree */ - for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) { + for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) { /* Proceed only if particle is active */ if (pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN) == 0) continue; @@ -4805,17 +4805,17 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *su while (base || go) { brushObj = NULL; /* select object */ - if (surface->brush_group) { + if (surface->brush_group) { if (go->ob) brushObj = go->ob; - } - else + } + else brushObj = base->object; - if (!brushObj) { + if (!brushObj) { /* skip item */ if (surface->brush_group) go = go->next; else base = base->next; - continue; + continue; } /* next item */ diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 07c5d6d0329..87e35bc2747 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -634,7 +634,7 @@ makebreak: * But if the font is FO_BUILTIN_NAME then do not try loading since * whole font is in the memory already */ - if (che == NULL && strcmp(vfont->name, FO_BUILTIN_NAME)) { + if (che == NULL && strcmp(vfont->name, FO_BUILTIN_NAME)) { BLI_vfontchar_from_freetypefont(vfont, ascii); } diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index 2b21758fdc1..e9ee91505de 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -438,7 +438,7 @@ static char get_largest_axis(float *bv) middle_point[0] = (bv[1]) - (bv[0]); // x axis middle_point[1] = (bv[3]) - (bv[2]); // y axis middle_point[2] = (bv[5]) - (bv[4]); // z axis - if (middle_point[0] > middle_point[1]) { + if (middle_point[0] > middle_point[1]) { if (middle_point[0] > middle_point[2]) return 1; // max x axis else @@ -464,7 +464,7 @@ static void node_join(BVHTree *tree, BVHNode *node) } for (i = 0; i < tree->tree_type; i++) { - if (node->children[i]) { + if (node->children[i]) { for (j = tree->start_axis; j < tree->stop_axis; j++) { // update minimum if (node->children[i]->bv[(2 * j)] < node->bv[(2 * j)]) diff --git a/source/blender/blenlib/intern/fnmatch.c b/source/blender/blenlib/intern/fnmatch.c index 53172957560..e29f31897c0 100644 --- a/source/blender/blenlib/intern/fnmatch.c +++ b/source/blender/blenlib/intern/fnmatch.c @@ -235,7 +235,7 @@ fnmatch (const char *pattern, const char *string, int flags) # undef FOLD } -#endif /* _LIBC or not __GNU_LIBRARY__. */ +#endif /* _LIBC or not __GNU_LIBRARY__. */ #else diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 59147040fd8..49a6cbcc249 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1920,7 +1920,7 @@ static void BLI_where_is_temp(char *fullname, const size_t maxlen, char *userdir BLI_strncpy(fullname, tmp, maxlen); } } -#endif +#endif if (fullname[0] == '\0') { BLI_strncpy(fullname, "/tmp/", maxlen); diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c index efb5ca98185..e34150ee4f2 100644 --- a/source/blender/blenlib/intern/winstuff.c +++ b/source/blender/blenlib/intern/winstuff.c @@ -158,7 +158,7 @@ void RegisterBlendExtension(void) ThumbHandlerDLL = "BlendThumb64.dll"; else ThumbHandlerDLL = "BlendThumb.dll"; -#endif +#endif snprintf(RegCmd, MAX_PATH * 2, "%s\\regsvr32 /s \"%s\\%s\"", SysDir, InstallDir, ThumbHandlerDLL); system(RegCmd); diff --git a/source/blender/compositor/operations/COM_MapUVOperation.h b/source/blender/compositor/operations/COM_MapUVOperation.h index 069f454895d..4d7bc814dc2 100644 --- a/source/blender/compositor/operations/COM_MapUVOperation.h +++ b/source/blender/compositor/operations/COM_MapUVOperation.h @@ -57,6 +57,6 @@ public: */ void deinitExecution(); - void setAlpha(float alpha){this->alpha = alpha;} + void setAlpha(float alpha) { this->alpha = alpha; } }; #endif diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl b/source/blender/compositor/operations/COM_OpenCLKernels.cl index d462f5d8250..40932e54bc7 100644 --- a/source/blender/compositor/operations/COM_OpenCLKernels.cl +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl @@ -1,6 +1,7 @@ /// This file contains all opencl kernels for node-operation implementations -__kernel void testKernel(__global __write_only image2d_t output){ +__kernel void testKernel(__global __write_only image2d_t output) +{ int x = get_global_id(0); int y = get_global_id(1); int2 coords = {x, y}; diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp index 66db4a1c86b..1024d460044 100644 --- a/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp @@ -3,7 +3,8 @@ const char *sourcecode = "/// This file contains all opencl kernels for node-operation implementations \n" \ "\n" \ -"__kernel void testKernel(__global __write_only image2d_t output) {\n" \ +"__kernel void testKernel(__global __write_only image2d_t output)\n" \ +"{\n" \ " int x = get_global_id(0);\n" \ " int y = get_global_id(1);\n" \ " int2 coords = {x, y}; \n" \ diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c index 0514700e120..ddc4f4d943c 100644 --- a/source/blender/editors/animation/anim_draw.c +++ b/source/blender/editors/animation/anim_draw.c @@ -191,7 +191,7 @@ static void draw_cfra_number(Scene *scene, View2D *v2d, float cfra, short time) */ if (time) ANIM_timecode_string_from_frame(&numstr[4], scene, 0, time, FRA2TIME(cfra)); - else + else ANIM_timecode_string_from_frame(&numstr[4], scene, 1, time, cfra); slen = (short)UI_GetStringWidth(numstr) - 1; diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index ac5af846900..546ab0e4396 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3653,7 +3653,7 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)) ebo->parent = child; if ((child) && equals_v3v3(ebo->head, child->tail)) ebo->flag |= BONE_CONNECTED; - else + else ebo->flag &= ~BONE_CONNECTED; /* get next bones diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c index 80f8c61694c..d90bd96a6f1 100644 --- a/source/blender/editors/armature/editarmature_retarget.c +++ b/source/blender/editors/armature/editarmature_retarget.c @@ -733,7 +733,7 @@ static void RIG_reconnectControlBones(RigGraph *rg) /* DO SOME MAGIC HERE */ for (pchan = rg->ob->pose->chanbase.first; pchan; pchan = pchan->next) { - for (con = pchan->constraints.first; con; con = con->next) { + for (con = pchan->constraints.first; con; con = con->next) { bConstraintTypeInfo *cti = constraint_get_typeinfo(con); ListBase targets = {NULL, NULL}; bConstraintTarget *ct; @@ -858,7 +858,7 @@ static void RIG_reconnectControlBones(RigGraph *rg) /* DO SOME MAGIC HERE */ for (pchan = rg->ob->pose->chanbase.first; pchan; pchan = pchan->next) { - for (con = pchan->constraints.first; con; con = con->next) { + for (con = pchan->constraints.first; con; con = con->next) { bConstraintTypeInfo *cti = constraint_get_typeinfo(con); ListBase targets = {NULL, NULL}; bConstraintTarget *ct; diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index f18fa2f8bf8..df970171a54 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -1136,7 +1136,7 @@ static bPoseChannel *pose_bone_do_paste(Object *ob, bPoseChannel *chan, short se /* quat/euler to axis angle */ if (chan->rotmode > 0) eulO_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, chan->eul, chan->rotmode); - else + else quat_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, chan->quat); } else { diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 5c23aba9024..6ffe3f1feeb 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -214,7 +214,7 @@ static void gp_get_3d_reference(tGPsdata *p, float vec[3]) sub_v3_v3v3(vec, fp, ob->loc); } else -#endif +#endif { /* use 3D-cursor */ copy_v3_v3(vec, fp); diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 2eea7f50f33..1d315e9a5b8 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -1442,7 +1442,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short v2d->scroll |= V2D_SCROLL_HORIZONTAL_FULLR; scrollers->horfull = 1; } - else + else v2d->scroll &= ~V2D_SCROLL_HORIZONTAL_FULLR; } } @@ -1484,7 +1484,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short v2d->scroll |= V2D_SCROLL_VERTICAL_FULLR; scrollers->vertfull = 1; } - else + else v2d->scroll &= ~V2D_SCROLL_VERTICAL_FULLR; } } diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index d9d5852eb6d..c8ca75835e4 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -540,7 +540,7 @@ static void export_fluid_objects(ListBase *fobjects, Scene *scene, int length) fsmesh.volumeInitType = fluidmd->fss->volumeInitType; fsmesh.obstacleImpactFactor = fluidmd->fss->surfaceSmoothing; // misused value - if (fsmesh.type == OB_FLUIDSIM_CONTROL) { + if (fsmesh.type == OB_FLUIDSIM_CONTROL) { fsmesh.cpsTimeStart = fluidmd->fss->cpsTimeStart; fsmesh.cpsTimeEnd = fluidmd->fss->cpsTimeEnd; fsmesh.cpsQuality = fluidmd->fss->cpsQuality; @@ -708,7 +708,7 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF strncpy(domainSettings->surfdataPath, newSurfdataPath, FILE_MAXDIR); BLI_path_abs(targetDir, G.main->name); // fixed #frame-no } -#endif +#endif return outStringsChanged; } diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 9629fd7da0c..4bb5a21cb3d 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -241,7 +241,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) result= WM_border_select_modal(C, op, event); - if (result==OPERATOR_RUNNING_MODAL) { + if (result == OPERATOR_RUNNING_MODAL) { rect.xmin = RNA_int_get(op->ptr, "xmin"); rect.ymin = RNA_int_get(op->ptr, "ymin"); diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c index 096c16298e3..a6578ffb3f7 100644 --- a/source/blender/editors/space_nla/nla_draw.c +++ b/source/blender/editors/space_nla/nla_draw.c @@ -695,7 +695,7 @@ static void draw_nla_channel_list_gl(bAnimContext *ac, ListBase *anim_data, View if (((nlt->flag & NLATRACK_ACTIVE) && (nlt->flag & NLATRACK_DISABLED)) == 0) { if (nlt->flag & NLATRACK_MUTED) mute = ICON_MUTE_IPO_ON; - else + else mute = ICON_MUTE_IPO_OFF; if (EDITABLE_NLT(nlt)) diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c index 6c683eba085..248f73b9ab6 100644 --- a/source/blender/editors/space_userpref/space_userpref.c +++ b/source/blender/editors/space_userpref/space_userpref.c @@ -149,7 +149,7 @@ static void userpref_header_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn default: break; } -#endif +#endif } /* only called once, from space/spacetypes.c */ diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index f18ba29b1f4..f63116a1f60 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -3005,7 +3005,7 @@ static void view3d_main_area_draw_info(const bContext *C, ARegion *ar, const cha if (U.uiflag & USER_SHOW_ROTVIEWICON) draw_view_axis(rv3d); - else + else draw_view_icon(rv3d); ob = OBACT; diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 4573e66ca39..b0a4f5bbfde 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -2311,8 +2311,8 @@ int handleEventWarp(TransInfo *t, wmEvent *event) if (event->type == MIDDLEMOUSE && event->val == KM_PRESS) { // Use customData pointer to signal warp direction - if (t->customData == NULL) - t->customData = (void*)1; + if (t->customData == NULL) + t->customData = (void *)1; else t->customData = NULL; @@ -2451,7 +2451,7 @@ int handleEventShear(TransInfo *t, wmEvent *event) if (event->type == MIDDLEMOUSE && event->val == KM_PRESS) { // Use customData pointer to signal Shear direction - if (t->customData == NULL) { + if (t->customData == NULL) { initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE); t->customData = (void*)1; } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index dad1c65298a..4d20346f79d 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -3757,42 +3757,42 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count /* *** Extend Transform *** */ - Scene * scene= t->scene; + Scene *scene = t->scene; int cfra= CFRA; int left= seq_tx_get_final_left(seq, 1); int right= seq_tx_get_final_right(seq, 1); if (seq->depth == 0 && ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK))) { - *recursive= 0; - *count= 0; - *flag= 0; + *recursive = FALSE; + *count = 0; + *flag = 0; } - else if (seq->type ==SEQ_META) { + else if (seq->type == SEQ_META) { /* for meta's we only ever need to extend their children, no matter what depth * just check the meta's are in the bounds */ - if (t->frame_side=='R' && right <= cfra) *recursive= 0; - else if (t->frame_side=='L' && left >= cfra) *recursive= 0; - else *recursive= 1; + if (t->frame_side=='R' && right <= cfra) *recursive = FALSE; + else if (t->frame_side=='L' && left >= cfra) *recursive = FALSE; + else *recursive = TRUE; *count= 1; *flag= (seq->flag | SELECT) & ~(SEQ_LEFTSEL|SEQ_RIGHTSEL); } else { - *recursive= 0; /* not a meta, so no thinking here */ - *count= 1; /* unless its set to 0, extend will never set 2 handles at once */ - *flag= (seq->flag | SELECT) & ~(SEQ_LEFTSEL|SEQ_RIGHTSEL); + *recursive = FALSE; /* not a meta, so no thinking here */ + *count = 1; /* unless its set to 0, extend will never set 2 handles at once */ + *flag = (seq->flag | SELECT) & ~(SEQ_LEFTSEL|SEQ_RIGHTSEL); if (t->frame_side=='R') { - if (right <= cfra) *count= *flag= 0; /* ignore */ - else if (left > cfra) ; /* keep the selection */ - else *flag |= SEQ_RIGHTSEL; + if (right <= cfra) *count = *flag= 0; /* ignore */ + else if (left > cfra) ; /* keep the selection */ + else *flag |= SEQ_RIGHTSEL; } else { - if (left >= cfra) *count= *flag= 0; /* ignore */ - else if (right < cfra) ; /* keep the selection */ - else *flag |= SEQ_LEFTSEL; + if (left >= cfra) *count = *flag= 0; /* ignore */ + else if (right < cfra) ; /* keep the selection */ + else *flag |= SEQ_LEFTSEL; } } } @@ -3808,9 +3808,9 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count /* Non nested strips (resect selection and handles) */ if ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK)) { - *recursive= 0; - *count= 0; - *flag= 0; + *recursive = FALSE; + *count = 0; + *flag = 0; } else { if ((seq->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) == (SEQ_LEFTSEL|SEQ_RIGHTSEL)) { @@ -3826,10 +3826,10 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count if ((seq->type == SEQ_META) && ((seq->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) == 0)) { /* if any handles are selected, don't recurse */ - *recursive = 1; + *recursive = TRUE; } else { - *recursive = 0; + *recursive = FALSE; } } } @@ -3837,9 +3837,9 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count /* Nested, different rules apply */ #ifdef SEQ_TX_NESTED_METAS - *flag= (seq->flag | SELECT) & ~(SEQ_LEFTSEL|SEQ_RIGHTSEL); - *count= 1; /* ignore the selection for nested */ - *recursive = (seq->type == SEQ_META ); + *flag = (seq->flag | SELECT) & ~(SEQ_LEFTSEL|SEQ_RIGHTSEL); + *count = 1; /* ignore the selection for nested */ + *recursive = (seq->type == SEQ_META); #else if (seq->type == SEQ_META) { /* Meta's can only directly be moved between channels since they @@ -3848,12 +3848,12 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count * calc_sequence() will update its settings when run on the toplevel meta */ *flag= 0; *count= 0; - *recursive = 1; + *recursive = TRUE; } else { *flag= (seq->flag | SELECT) & ~(SEQ_LEFTSEL|SEQ_RIGHTSEL); *count= 1; /* ignore the selection for nested */ - *recursive = 0; + *recursive = FALSE; } #endif } @@ -4131,9 +4131,9 @@ static void freeSeqData(TransInfo *t) for (seq= seqbasep->first; seq; seq= seq->next) { /* We might want to build a list of effects that need to be updated during transform */ if (seq->type & SEQ_EFFECT) { - if (seq->seq1 && seq->seq1->flag & SELECT) calc_sequence(t->scene, seq); - else if (seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(t->scene, seq); - else if (seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(t->scene, seq); + if (seq->seq1 && seq->seq1->flag & SELECT) calc_sequence(t->scene, seq); + else if (seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(t->scene, seq); + else if (seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(t->scene, seq); } } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index a9179f95d4e..23c1fba6107 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1606,7 +1606,7 @@ void calculatePropRatio(TransInfo *t) td->factor = 0.0f; restoreElement(td); } - else if ((connected && (td->flag & TD_NOTCONNECTED || td->dist > t->prop_size)) || + else if ((connected && (td->flag & TD_NOTCONNECTED || td->dist > t->prop_size)) || (connected == 0 && td->rdist > t->prop_size)) { /* diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index b25c76fe193..5d5142740cb 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -87,8 +87,8 @@ static void InputSpringFlip(TransInfo *t, MouseInput *mi, const int mval[2], flo /* flip scale */ /* values can become really big when zoomed in so use longs [#26598] */ - if ((long long int)(mi->center[0] - mval[0]) * (long long int)(mi->center[0] - mi->imval[0]) + - (long long int)(mi->center[1] - mval[1]) * (long long int)(mi->center[1] - mi->imval[1]) < 0) + if ((long long int)(mi->center[0] - mval[0]) * (long long int)(mi->center[0] - mi->imval[0]) + + (long long int)(mi->center[1] - mval[1]) * (long long int)(mi->center[1] - mi->imval[1]) < 0) { output[0] *= -1.0f; } diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index b875886e80a..75d5efca21f 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -689,7 +689,7 @@ static float RotationBetween(TransInfo *t, float p1[3], float p2[3]) if (dot_v3v3(tmp, axis) < 0.0f) angle = -acos(dot_v3v3(start, end)); - else + else angle = acos(dot_v3v3(start, end)); } else { diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c index da207c19695..900bc7756f0 100644 --- a/source/blender/imbuf/intern/filetype.c +++ b/source/blender/imbuf/intern/filetype.c @@ -100,7 +100,7 @@ ImFileType IMB_FILE_TYPES[] = { #endif #ifdef WITH_QUICKTIME {quicktime_init, quicktime_exit, imb_is_a_quicktime, imb_ftype_quicktime, imb_quicktime_decode, NULL, NULL, 0, QUICKTIME}, -#endif +#endif {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0} }; diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index e744851a9b6..30142e5f5d5 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -407,7 +407,7 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter) if (i != 0 || j != 0) { const int tmpindex = filter_make_index(x + i, y + j, width, height); - if (check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) { + if (check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) { if (is_float) { for (c = 0; c < depth; c++) tmp[c] = ((const float *) srcbuf)[depth * tmpindex + c]; diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 0c6a5b56a3e..2178b6a4155 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -478,7 +478,7 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul) /* assign rect last */ if (tmpibuf->rect_float) ibuf->rect_float = tmpibuf->rect_float; - else + else ibuf->rect = tmpibuf->rect; ibuf->mall |= ib_flag; ibuf->flags |= ib_flag; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 4c16239f137..1f5ac24db92 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3640,7 +3640,7 @@ static void rna_def_node_socket_subtype(BlenderRNA *brna, int type, int subtype, PropertyRNA *prop = NULL; PropertySubType propsubtype = PROP_NONE; - #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #socktype "_" #id, 0, #idname, ""}, + #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #socktype "_" #id, 0, #idname, ""}, static EnumPropertyItem subtype_items[] = { NODE_DEFINE_SUBTYPES {0, NULL, 0, NULL, NULL} diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c index a3169bdba46..609d70b6e98 100644 --- a/source/blender/modifiers/intern/MOD_collision.c +++ b/source/blender/modifiers/intern/MOD_collision.c @@ -71,7 +71,7 @@ static void freeData(ModifierData *md) { CollisionModifierData *collmd = (CollisionModifierData *) md; - if (collmd) { + if (collmd) { if (collmd->bvhtree) BLI_bvhtree_free(collmd->bvhtree); if (collmd->x) diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c index 5206aa281f7..0a14b4d5a08 100644 --- a/source/blender/modifiers/intern/MOD_mask.c +++ b/source/blender/modifiers/intern/MOD_mask.c @@ -273,7 +273,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, /* loop over edges and faces, and do the same thing to * ensure that they only reference existing verts */ - for (i = 0; i < maxEdges; i++) { + for (i = 0; i < maxEdges; i++) { MEdge me; dm->getEdge(dm, i, &me); diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c index f45cc9c2ade..ce95f9bec6e 100644 --- a/source/blender/modifiers/intern/MOD_screw.c +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -94,7 +94,7 @@ static void screwvert_iter_step(ScrewVertIter *iter) iter->v_other = iter->v; iter->v = iter->v_poin->v[0]; } - if (iter->v >= 0) { + if (iter->v >= 0) { iter->v_poin = &iter->v_array[iter->v]; iter->e = iter->v_poin->e[(iter->v_poin->e[0] == iter->e)]; } diff --git a/source/blender/nodes/composite/nodes/node_composite_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c index 77b62938d94..d19ea3f202f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_blur.c +++ b/source/blender/nodes/composite/nodes/node_composite_blur.c @@ -699,7 +699,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN bokeh_single_image(node, new, gammabuf, in[1]->vec[0]); else if (1) blur_single_image(node, new, gammabuf, in[1]->vec[0]); - else /* bloom experimental... */ + else /* bloom experimental... */ bloom_with_reference(new, gammabuf, NULL, in[1]->vec[0], nbd); if (nbd->gamma) { diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c index 84b203d005a..4c1c4e28c8d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_defocus.c +++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c @@ -748,7 +748,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, p4 = p * new->type; if (nqd->bktype==0) // Disk lwt = ((u*u + v*v)<=cR2) ? wcor : 0.f; - else // AA not needed here + else /* AA not needed here */ lwt = wcor * getWeight(BKH, len_bkh, u, v, ct_crad, inradsq); // prevent background bleeding onto in-focus pixels, user-option if (ct_crad > nqd->bthresh) { // if center blur > threshold diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index a1cc1e23470..eb628b87b3d 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -559,7 +559,7 @@ static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[ MTFace *tface= RE_vlakren_get_tface(pMesh->obr, vlr, pMesh->obr->actmtface, NULL, 0); const float *coord; - if (tface != NULL) { + if (tface != NULL) { coord= tface->uv[vert_index]; fUV[0]= coord[0]; fUV[1]= coord[1]; } @@ -585,7 +585,7 @@ static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); float * ftang= RE_vlakren_get_nmap_tangent(pMesh->obr, vlr, 1); - if (ftang!=NULL) { + if (ftang!=NULL) { copy_v3_v3(&ftang[iVert*4+0], fvTangent); ftang[iVert*4+3]=fSign; } diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index bf18c04cd73..f1a5326c602 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -2425,7 +2425,7 @@ void do_material_tex(ShadeInput *shi, Render *re) } } } -#endif +#endif } /* mapping */ diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index a0f5caa826b..a266914c085 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1807,7 +1807,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) shr->diff[1]= sss[1]*col[1]; shr->diff[2]= sss[2]*col[2]; - if (shi->combinedflag & SCE_PASS_SHADOW) { + if (shi->combinedflag & SCE_PASS_SHADOW) { shr->shad[0]= shr->diff[0]; shr->shad[1]= shr->diff[1]; shr->shad[2]= shr->diff[2]; diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c index c20a281fa96..14a25cc13e0 100644 --- a/source/blender/windowmanager/intern/wm_gesture.c +++ b/source/blender/windowmanager/intern/wm_gesture.c @@ -154,7 +154,7 @@ int wm_gesture_evaluate(wmGesture *gesture) if (val == 6) printf("tweak south-west\n"); if (val == 7) printf("tweak west\n"); if (val == 8) printf("tweak north-west\n"); -#endif +#endif return val; } } diff --git a/source/creator/creator.c b/source/creator/creator.c index 977cfbaa8d7..1f0756b2c24 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -1208,7 +1208,7 @@ int main(int argc, const char **argv) argv[argci] = alloc_utf_8_from_16(argv_16[argci], 0); } LocalFree(argv_16); -#endif +#endif #ifdef WITH_PYTHON_MODULE #ifdef __APPLE__ From 436b63eea5cf994a8aa934a41b34737e2b09ae03 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 19 May 2012 20:16:29 +0000 Subject: [PATCH 046/159] Fix [#31535] Radian Unit System Button Ignored for Face Angles display. Also avoid multiplying each vertex three times with obmat... --- .../blender/editors/space_view3d/drawobject.c | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index e69538345bb..111af7fb914 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2951,6 +2951,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS if (me->drawflag & ME_DRAWEXTRA_FACEANG) { BMFace *efa; + int is_rad = unit->system_rotation == USER_UNIT_ROT_RADIANS; UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col); @@ -2961,37 +2962,41 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS if (is_face_sel || do_moving) { BMIter liter; BMLoop *loop; - int cent_ok = FALSE; + int is_first = TRUE; BM_ITER_ELEM(loop, &liter, efa, BM_LOOPS_OF_FACE) { if (is_face_sel || (do_moving && BM_elem_flag_test(loop->v, BM_ELEM_SELECT))) { - /* yes, we should avoid triple matrix multiply every vertex for 'global' */ float angle; /* lazy init center calc */ - if (cent_ok == FALSE) { + if (is_first) { BM_face_calc_center_bounds(efa, vmid); - cent_ok = TRUE; + /* Avoid triple matrix multiply every vertex for 'global' */ + if (do_global) { + copy_v3_v3(v1, loop->prev->v->co); + copy_v3_v3(v2, loop->v->co); + mul_mat3_m4_v3(ob->obmat, v1); + mul_mat3_m4_v3(ob->obmat, v2); + } + is_first = FALSE; } if (do_global) { - copy_v3_v3(v1, loop->prev->v->co); - copy_v3_v3(v2, loop->v->co); copy_v3_v3(v3, loop->next->v->co); - mul_mat3_m4_v3(ob->obmat, v1); - mul_mat3_m4_v3(ob->obmat, v2); mul_mat3_m4_v3(ob->obmat, v3); angle = angle_v3v3v3(v1, v2, v3); interp_v3_v3v3(fvec, vmid, v2, 0.8f); + copy_v3_v3(v1, v2); + copy_v3_v3(v2, v3); } else { angle = angle_v3v3v3(loop->prev->v->co, loop->v->co, loop->next->v->co); interp_v3_v3v3(fvec, vmid, loop->v->co, 0.8f); } - BLI_snprintf(numstr, sizeof(numstr), "%.3f", RAD2DEGF(angle)); + BLI_snprintf(numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle)); view3d_cached_text_draw_add(fvec, numstr, 0, txt_flag, col); } } From dd7229aee066b879e58fb2f83efaf4e6059cc06f Mon Sep 17 00:00:00 2001 From: Dan Eicher Date: Sat, 19 May 2012 21:22:01 +0000 Subject: [PATCH 047/159] Added 'LIBRARY_EDITABLE' flag to bpy.props.* Rationale: custom props on linked objects are editable through ops and the console but the UI code calls RNA_property_editable() which returns false if (id->lib && !(prop->flag & PROP_LIB_EXCEPTION)) Setting the 'LIBRARY_EDITABLE' flag allows UI templates to change these props (but the changes aren't saved!) for things like indices into CollectionProperties which live on the linked object --- source/blender/makesrna/intern/rna_rna.c | 11 ++++++++ source/blender/python/intern/bpy_props.c | 32 ++++++++++++++++-------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index 38fbe708038..aab3483e29b 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -577,6 +577,12 @@ static int rna_Property_is_enum_flag_get(PointerRNA *ptr) return prop->flag & PROP_ENUM_FLAG ? 1 : 0; } +static int rna_Property_is_library_editable_flag_get(PointerRNA *ptr) +{ + PropertyRNA *prop = (PropertyRNA *)ptr->data; + return prop->flag & PROP_LIB_EXCEPTION ? 1 : 0; +} + static int rna_Property_array_length_get(PointerRNA *ptr) { PropertyRNA *prop = (PropertyRNA *)ptr->data; @@ -1174,6 +1180,11 @@ static void rna_def_property(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Property_is_enum_flag_get", NULL); RNA_def_property_ui_text(prop, "Enum Flag", "True when multiple enums "); + + prop = RNA_def_property(srna, "is_library_editable", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_boolean_funcs(prop, "rna_Property_is_library_editable_flag_get", NULL); + RNA_def_property_ui_text(prop, "Library Editable", "Property is editable from linked instances (changes not saved)"); } static void rna_def_function(BlenderRNA *brna) diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index dbb25eb854b..77ccf802663 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -60,6 +60,7 @@ static EnumPropertyItem property_flag_items[] = { {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, + {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem property_flag_enum_items[] = { @@ -67,6 +68,7 @@ static EnumPropertyItem property_flag_enum_items[] = { {PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""}, {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animatable", ""}, {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""}, + {PROP_LIB_EXCEPTION, "LIBRARY_EDITABLE", 0, "Library Editable", ""}, {0, NULL, 0, NULL, NULL}}; /* subtypes */ @@ -385,7 +387,7 @@ PyDoc_STRVAR(BPy_BoolProperty_doc, "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" " :type subtype: string\n" @@ -434,6 +436,7 @@ static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw) if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -457,7 +460,7 @@ BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC " :arg default: sequence of booleans the length of *size*.\n" " :type default: sequence\n" -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', " "'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', " @@ -524,6 +527,7 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -547,7 +551,7 @@ PyDoc_STRVAR(BPy_IntProperty_doc, "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" " :type subtype: string\n" @@ -600,6 +604,7 @@ static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw) if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -624,7 +629,7 @@ BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC " :arg default: sequence of ints the length of *size*.\n" " :type default: sequence\n" -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', " "'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', " @@ -696,6 +701,7 @@ static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -721,7 +727,7 @@ PyDoc_STRVAR(BPy_FloatProperty_doc, "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" " :type subtype: string\n" @@ -784,6 +790,7 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw) if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -810,7 +817,7 @@ BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC " :arg default: sequence of floats the length of *size*.\n" " :type default: sequence\n" -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', " "'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', " @@ -890,6 +897,7 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -910,7 +918,7 @@ PyDoc_STRVAR(BPy_StringProperty_doc, "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILENAME', 'NONE'].\n" " :type subtype: string\n" @@ -960,6 +968,7 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -1210,7 +1219,7 @@ BPY_PROPDEF_DESC_DOC " is disabled otherwise a set which may only contain string identifiers\n" " used in *items*.\n" " :type default: string or set\n" -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'ENUM_FLAG'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'ENUM_FLAG', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" " :arg items: sequence of enum items formatted:\n" " [(identifier, name, description, number), ...] where the identifier is used\n" @@ -1312,6 +1321,7 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -1367,7 +1377,7 @@ PyDoc_STRVAR(BPy_PointerProperty_doc, " :type type: class\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" BPY_PROPDEF_UPDATE_DOC ); @@ -1413,6 +1423,7 @@ static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *k if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } bpy_prop_callback_assign(prop, update_cb); RNA_def_property_duplicate_pointers(srna, prop); @@ -1432,7 +1443,7 @@ PyDoc_STRVAR(BPy_CollectionProperty_doc, " :type type: class\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE'].\n" +" :arg options: Enumerator in ['HIDDEN', 'SKIP_SAVE', 'ANIMATABLE', 'LIBRARY_EDITABLE'].\n" " :type options: set\n" ); static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw) @@ -1471,6 +1482,7 @@ static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE); + if (opts & PROP_LIB_EXCEPTION) RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); } RNA_def_property_duplicate_pointers(srna, prop); } From 997d7d50c9166aa8da1b9d0f45a7ca4198662431 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sat, 19 May 2012 23:11:46 +0000 Subject: [PATCH 048/159] Fix sculpt layer brush, broken by texture changes in r46651. --- source/blender/editors/sculpt_paint/sculpt.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 7e766ea3388..6773d50d95d 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -1884,14 +1884,14 @@ static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode SculptSession *ss = ob->sculpt; Brush *brush = paint_brush(&sd->paint); float bstrength = ss->cache->bstrength; - float area_normal[3], offset[3]; + float offset[3]; float lim = brush->height; int n; if (bstrength < 0) lim = -lim; - mul_v3_v3v3(offset, ss->cache->scale, area_normal); + mul_v3_v3v3(offset, ss->cache->scale, ss->cache->sculpt_normal_symm); #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for (n = 0; n < totnode; n++) { @@ -1917,7 +1917,8 @@ static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode { if (sculpt_brush_test(&test, origco[vd.i])) { const float fade = bstrength * tex_strength(ss, brush, vd.co, test.dist, - area_normal, vd.no, vd.fno, *vd.mask); + ss->cache->sculpt_normal_symm, + vd.no, vd.fno, *vd.mask); float *disp = &layer_disp[vd.i]; float val[3]; From 1e33cc4384deb200654bf6b74f972bfb2da02989 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sun, 20 May 2012 00:34:54 +0000 Subject: [PATCH 049/159] Sequencer UI: * Code cleanup * Fixed wrong label for Inverse Select in the Select menu * Some layout tweaks for space saving and avoid abbreviations in the UI. * "Image Offset" and "Image Crop" buttons were there twice, once in the Strip Input panel and once in the Effect Strip panel, show it in the Strip Input panel only now. * Commented the third input fields ("input_3"), only used by the deprecated plugin system according to an RNA comment. --- .../scripts/startup/bl_ui/space_sequencer.py | 143 +++++++----------- .../blender/makesrna/intern/rna_sequencer.c | 6 +- 2 files changed, 58 insertions(+), 91 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index c155128c5d1..3280b2a24b0 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -153,7 +153,7 @@ class SEQUENCER_MT_select(Menu): layout.operator_menu_enum("sequencer.select_grouped", "type", text="Grouped") layout.operator("sequencer.select_linked") layout.operator("sequencer.select_all").action = 'TOGGLE' - layout.operator("sequencer.select_all").action = 'INVERT' + layout.operator("sequencer.select_all", text="Invert Selection").action = 'INVERT' class SEQUENCER_MT_marker(Menu): @@ -346,6 +346,7 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel, Panel): def draw(self, context): layout = self.layout + scene = context.scene frame_current = scene.frame_current strip = act_strip(context) @@ -394,7 +395,7 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel, Panel): elem = strip.elements[0] if elem and elem.orig_width > 0 and elem.orig_height > 0: - col.label(text="Orig Dim" + ": %dx%d" % (elem.orig_width, elem.orig_height)) + col.label(text="Original Dimension" + ": %dx%d" % (elem.orig_width, elem.orig_height)) else: col.label(text="Orig Dim: None") @@ -413,7 +414,6 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): return strip.type in {'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', - 'PLUGIN', 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED', 'MULTICAM', 'ADJUSTMENT'} @@ -426,14 +426,11 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): col.prop(strip, "input_1") if strip.input_count > 1: col.prop(strip, "input_2") - if strip.input_count > 2: - col.prop(strip, "input_3") if strip.type == 'COLOR': layout.prop(strip, "color") elif strip.type == 'WIPE': - col = layout.column() col.prop(strip, "transition_type") col.label(text="Direction:") @@ -469,7 +466,34 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): #layout.prop(strip, "use_frame_blend") elif strip.type == 'TRANSFORM': - self.draw_panel_transform(strip) + layout = self.layout + col = layout.column() + + col.prop(strip, "interpolation") + col.prop(strip, "translation_unit") + col = layout.column(align=True) + col.label(text="Position:") + col.prop(strip, "translate_start_x", text="X") + col.prop(strip, "translate_start_y", text="Y") + + layout.separator() + + col = layout.column(align=True) + col.prop(strip, "use_uniform_scale") + if (strip.use_uniform_scale): + col = layout.column(align=True) + col.prop(strip, "scale_start_x", text="Scale") + else: + col = layout.column(align=True) + col.label(text="Scale:") + col.prop(strip, "scale_start_x", text="X") + col.prop(strip, "scale_start_y", text="Y") + + layout.separator() + + col = layout.column(align=True) + col.label(text="Rotation:") + col.prop(strip, "rotation_start", text="Rotation") elif strip.type == 'MULTICAM': layout.prop(strip, "multicam_source") @@ -492,50 +516,6 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): if not strip.use_default_fade: col.prop(strip, "effect_fader", text="Effect fader") - layout.prop(strip, "use_translation", text="Image Offset:") - if strip.use_translation: - col = layout.column(align=True) - col.prop(strip.transform, "offset_x", text="X") - col.prop(strip.transform, "offset_y", text="Y") - - layout.prop(strip, "use_crop", text="Image Crop:") - if strip.use_crop: - col = layout.column(align=True) - col.prop(strip.crop, "max_y") - col.prop(strip.crop, "min_x") - col.prop(strip.crop, "min_y") - col.prop(strip.crop, "max_x") - - def draw_panel_transform(self, strip): - layout = self.layout - col = layout.column() - - col.prop(strip, "interpolation") - col.prop(strip, "translation_unit") - col = layout.column(align=True) - col.label(text="Position:") - col.prop(strip, "translate_start_x", text="X") - col.prop(strip, "translate_start_y", text="Y") - - layout.separator() - - col = layout.column(align=True) - col.prop(strip, "use_uniform_scale") - if (strip.use_uniform_scale): - col = layout.column(align=True) - col.prop(strip, "scale_start_x", text="Scale") - else: - col = layout.column(align=True) - col.label(text="Scale:") - col.prop(strip, "scale_start_x", text="X") - col.prop(strip, "scale_start_y", text="Y") - - layout.separator() - - col = layout.column(align=True) - col.label(text="Rotation:") - col.prop(strip, "rotation_start", text="Rotation") - class SEQUENCER_PT_input(SequencerButtonsPanel, Panel): bl_label = "Strip Input" @@ -552,7 +532,7 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, Panel): return strip.type in {'MOVIE', 'IMAGE', 'SCENE', 'MOVIECLIP', 'META', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', - 'WIPE', 'GLOW', 'TRANSFORM', + 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'MULTICAM', 'SPEED', 'ADJUSTMENT'} def draw(self, context): @@ -565,43 +545,34 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, Panel): # draw a filename if we have one if seq_type == 'IMAGE': split = layout.split(percentage=0.2) - col = split.column() - col.label(text="Path:") - col = split.column() - col.prop(strip, "directory", text="") + split.label(text="Path:") + split.prop(strip, "directory", text="") # Current element for the filename elem = strip.getStripElem(context.scene.frame_current) if elem: split = layout.split(percentage=0.2) - col = split.column() - col.label(text="File:") - col = split.column() - col.prop(elem, "filename", text="") # strip.elements[0] could be a fallback + split.label(text="File:") + split.prop(elem, "filename", text="") # strip.elements[0] could be a fallback - # also accessible from the menu layout.operator("sequencer.change_path") elif seq_type == 'MOVIE': split = layout.split(percentage=0.2) - col = split.column() - col.label(text="Path:") - col = split.column() - col.prop(strip, "filepath", text="") - col.prop(strip, "mpeg_preseek", text="MPEG Preseek") - col.prop(strip, "stream_index", text="Stream Index") - - # TODO, sound??? - # end drawing filename - - layout.prop(strip, "use_translation", text="Image Offset:") + split.label(text="Path:") + split.prop(strip, "filepath", text="") + + layout.prop(strip, "mpeg_preseek") + layout.prop(strip, "stream_index") + + layout.prop(strip, "use_translation", text="Image Offset") if strip.use_translation: col = layout.column(align=True) col.prop(strip.transform, "offset_x", text="X") col.prop(strip.transform, "offset_y", text="Y") - layout.prop(strip, "use_crop", text="Image Crop:") + layout.prop(strip, "use_crop", text="Image Crop") if strip.use_crop: col = layout.column(align=True) col.prop(strip.crop, "max_y") @@ -734,15 +705,17 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel, Panel): col = layout.column() col.label(text="Distortion:") col.prop(strip, "undistort") + + split = layout.split(percentage=0.65) - row = layout.row() - row.label(text="Flip:") - row.prop(strip, "use_flip_x", text="X") - row.prop(strip, "use_flip_y", text="Y") - - col = layout.column() + col = split.column() col.prop(strip, "use_reverse_frames", text="Backwards") col.prop(strip, "use_deinterlace") + + col = split.column() + col.label(text="Flip:") + col.prop(strip, "use_flip_x", text="X") + col.prop(strip, "use_flip_y", text="Y") col = layout.column() col.label(text="Colors:") @@ -835,14 +808,6 @@ class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, Panel): #col.active = render.use_sequencer_gl_preview col.prop(render, "sequencer_gl_preview", text="") - ''' - col = layout.column() - col.prop(render, "use_sequencer_gl_render", text="Open GL Render") - col = layout.column() - col.active = render.use_sequencer_gl_render - col.prop(render, "sequencer_gl_render", text="") - ''' - class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel): bl_label = "View Settings" @@ -854,9 +819,9 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel): col = layout.column() if st.display_mode == 'IMAGE': - col.prop(st, "draw_overexposed") # text="Zebra" + col.prop(st, "draw_overexposed") col.prop(st, "show_safe_margin") - if st.display_mode == 'WAVEFORM': + elif st.display_mode == 'WAVEFORM': col.prop(st, "show_separate_color") col.prop(st, "proxy_render_size") diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index e7b648377e9..a3c309625f3 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -1374,12 +1374,14 @@ static void rna_def_effect_inputs(StructRNA *srna, int count) RNA_def_property_ui_text(prop, "Input 2", "Second input for the effect strip"); } - if (count == 3) { /* not used by any effects ...except maybe plugins? */ + /* + if (count == 3) { // not used by any effects ...except maybe plugins? prop = RNA_def_property(srna, "input_3", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "seq3"); RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL); RNA_def_property_ui_text(prop, "Input 3", "Third input for the effect strip"); } + */ } static void rna_def_image(BlenderRNA *brna) @@ -1472,7 +1474,7 @@ static void rna_def_movie(BlenderRNA *brna) prop = RNA_def_property(srna, "stream_index", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "streamindex"); RNA_def_property_range(prop, 0, 20); - RNA_def_property_ui_text(prop, "Streamindex", + RNA_def_property_ui_text(prop, "Stream Index", "For files with several movie streams, use the stream with the given index"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_update_reopen_files"); From c464654f5ea92c83ff5eac6577cfbf453b9f2674 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Sun, 20 May 2012 11:06:46 +0000 Subject: [PATCH 050/159] Fix memory leak when trying to apply transformations to shared meshes --- .../blender/editors/object/object_transform.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index 2e21fe9cdfe..07557d8ea4c 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -382,7 +382,7 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); float rsmat[3][3], tmat[3][3], obmat[3][3], iobmat[3][3], mat[4][4], scale; - int a, change = 0; + int a, change = 1; /* first check if we can execute */ CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) @@ -391,19 +391,19 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo if (ob->type == OB_MESH) { if (ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user mesh, doing nothing"); - return OPERATOR_CANCELLED; + change = 0; } } else if (ob->type == OB_ARMATURE) { if (ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user armature, doing nothing"); - return OPERATOR_CANCELLED; + change = 0; } } else if (ob->type == OB_LATTICE) { if (ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user lattice, doing nothing"); - return OPERATOR_CANCELLED; + change = 0; } } else if (ELEM(ob->type, OB_CURVE, OB_SURF)) { @@ -411,23 +411,28 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo if (ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user curve, doing nothing"); - return OPERATOR_CANCELLED; + change = 0; } cu = ob->data; if (!(cu->flag & CU_3D) && (apply_rot || apply_loc)) { BKE_report(reports, RPT_ERROR, "Neither rotation nor location could be applied to a 2d curve, doing nothing"); - return OPERATOR_CANCELLED; + change = 0; } if (cu->key) { BKE_report(reports, RPT_ERROR, "Can't apply to a curve with vertex keys, doing nothing"); - return OPERATOR_CANCELLED; + change = 0; } } } CTX_DATA_END; + if (!change) + return OPERATOR_CANCELLED; + + change = 0; + /* now execute */ CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) { From 518ff6995de78ccbf4aa0faa47367a4f9b995d03 Mon Sep 17 00:00:00 2001 From: Andrew Hale Date: Sun, 20 May 2012 12:52:46 +0000 Subject: [PATCH 051/159] BMesh Py API Fix: hide attribute of BMesh elements was returning the select flag. Fixed for all elements including loops, although this is commented out anyway. Reported by Crouch in IRC. --- source/blender/python/bmesh/bmesh_py_types.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index b75243c5feb..942e0fce2f7 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -574,7 +574,7 @@ static PyGetSetDef bpy_bmesh_getseters[] = { static PyGetSetDef bpy_bmvert_getseters[] = { /* generic */ {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_SELECT}, + {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, @@ -597,7 +597,7 @@ static PyGetSetDef bpy_bmvert_getseters[] = { static PyGetSetDef bpy_bmedge_getseters[] = { /* generic */ {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_SELECT}, + {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, @@ -622,7 +622,7 @@ static PyGetSetDef bpy_bmedge_getseters[] = { static PyGetSetDef bpy_bmface_getseters[] = { /* generic */ {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_SELECT}, + {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, @@ -647,7 +647,7 @@ static PyGetSetDef bpy_bmloop_getseters[] = { /* generic */ // flags are available but not used for loops. // {(char *)"select", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_select_doc, (void *)BM_ELEM_SELECT}, - // {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_SELECT}, + // {(char *)"hide", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_hide_doc, (void *)BM_ELEM_HIDDEN}, {(char *)"tag", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_tag_doc, (void *)BM_ELEM_TAG}, {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, From 1cb1d51db486018c018c1314d93ad5cdbe309dad Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sun, 20 May 2012 13:56:42 +0000 Subject: [PATCH 052/159] Various small fixes: *i18n: panel title of current tool in 3D view & File windows are now translated, as well a redo (F3) menu. *MESH_OT_faces_select_linked_flat & MESH_OT_edges_select_sharp: use ANGLE RNA prop for sharpness, and fix tip of the later op. --- source/blender/editors/mesh/editmesh_select.c | 18 +++++++++++------- source/blender/editors/screen/screen_ops.c | 4 ++-- .../blender/editors/space_file/file_panels.c | 2 +- .../editors/space_view3d/view3d_toolbar.c | 10 ++++++---- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index 2df89a3df6c..dc0a1a98b2d 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -2245,8 +2245,6 @@ static int edbm_select_sharp_edges_exec(bContext *C, wmOperator *op) BMLoop *l1, *l2; float sharp = RNA_float_get(op->ptr, "sharpness"), angle; - sharp = DEG2RADF(sharp); - BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(e, BM_ELEM_HIDDEN) || !e->l) continue; @@ -2273,9 +2271,11 @@ static int edbm_select_sharp_edges_exec(bContext *C, wmOperator *op) void MESH_OT_edges_select_sharp(wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name = "Select Sharp Edges"; - ot->description = "Marked selected edges as sharp"; + ot->description = "Select all sharp-enough edges"; ot->idname = "MESH_OT_edges_select_sharp"; /* api callbacks */ @@ -2286,7 +2286,9 @@ void MESH_OT_edges_select_sharp(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* props */ - RNA_def_float(ot->srna, "sharpness", 1.0f, 0.01f, FLT_MAX, "sharpness", "", 1.0f, 180.0f); + prop = RNA_def_float_rotation(ot->srna, "sharpness", 0, NULL, DEG2RADF(0.01f), DEG2RADF(180.0f), + "Sharpness", "", DEG2RADF(1.0f), DEG2RADF(180.0f)); + RNA_def_property_float_default(prop, DEG2RADF(1.0f)); } static int edbm_select_linked_flat_faces_exec(bContext *C, wmOperator *op) @@ -2300,8 +2302,6 @@ static int edbm_select_linked_flat_faces_exec(bContext *C, wmOperator *op) float sharp = RNA_float_get(op->ptr, "sharpness"); int i; - sharp = (sharp * (float)M_PI) / 180.0f; - BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) { BM_elem_flag_disable(f, BM_ELEM_TAG); } @@ -2354,6 +2354,8 @@ static int edbm_select_linked_flat_faces_exec(bContext *C, wmOperator *op) void MESH_OT_faces_select_linked_flat(wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name = "Select Linked Flat Faces"; ot->description = "Select linked faces by angle"; @@ -2367,7 +2369,9 @@ void MESH_OT_faces_select_linked_flat(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* props */ - RNA_def_float(ot->srna, "sharpness", 1.0f, 0.01f, FLT_MAX, "sharpness", "", 1.0f, 180.0f); + prop = RNA_def_float_rotation(ot->srna, "sharpness", 0, NULL, DEG2RADF(0.01f), DEG2RADF(180.0f), + "Sharpness", "", DEG2RADF(1.0f), DEG2RADF(180.0f)); + RNA_def_property_float_default(prop, DEG2RADF(1.0f)); } static int edbm_select_non_manifold_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index e2a9bf37916..5c68c92500b 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2501,11 +2501,11 @@ static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(ev if (items == 0) return OPERATOR_CANCELLED; - pup = uiPupMenuBegin(C, op->type->name, ICON_NONE); + pup = uiPupMenuBegin(C, RNA_struct_ui_name(op->type->srna), ICON_NONE); layout = uiPupMenuLayout(pup); for (i = items - 1, lastop = wm->operators.last; lastop; lastop = lastop->prev, i--) - uiItemIntO(layout, lastop->type->name, ICON_NONE, op->type->idname, "index", i); + uiItemIntO(layout, RNA_struct_ui_name(lastop->type->srna), ICON_NONE, op->type->idname, "index", i); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index 9fe1940e87b..a17a7edbd80 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -174,7 +174,7 @@ static void file_panel_operator_header(const bContext *C, Panel *pa) SpaceFile *sfile= CTX_wm_space_file(C); wmOperator *op= sfile->op; - BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname)); + BLI_strncpy(pa->drawname, RNA_struct_ui_name(op->type->srna), sizeof(pa->drawname)); } static int file_panel_check_prop(PointerRNA *UNUSED(ptr), PropertyRNA *prop) diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index 82ab6cd7193..ff896a95941 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -64,7 +64,7 @@ #include "UI_interface.h" #include "UI_resources.h" -#include "view3d_intern.h" // own include +#include "view3d_intern.h" /* own include */ /* ******************* view3d space & buttons ************** */ @@ -78,15 +78,17 @@ static void view3d_panel_operator_redo_header(const bContext *C, Panel *pa) { wmOperator *op = WM_operator_last_redo(C); - if (op) BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname)); - else BLI_strncpy(pa->drawname, IFACE_("Operator"), sizeof(pa->drawname)); + if (op) + BLI_strncpy(pa->drawname, RNA_struct_ui_name(op->type->srna), sizeof(pa->drawname)); + else + BLI_strncpy(pa->drawname, IFACE_("Operator"), sizeof(pa->drawname)); } static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wmOperator *op) { if (op->type->flag & OPTYPE_MACRO) { for (op = op->macro.first; op; op = op->next) { - uiItemL(pa->layout, op->type->name, ICON_NONE); + uiItemL(pa->layout, RNA_struct_ui_name(op->type->srna), ICON_NONE); view3d_panel_operator_redo_operator(C, pa, op); } } From f919973f32e230dbc310e2e9aec60ee20616c779 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Sun, 20 May 2012 15:00:19 +0000 Subject: [PATCH 053/159] Fix bug #31529 Remesh remove Apply as Shape button Change modifier_sameTopology() to not not treat Nonconstructive modifiers as having same topology. This function is only used to test whether Apply as Shape is allowed. The exact nature of "nonconstructive" modifiers is not documented, but current list is remesh, fluidsim, decimate, mask, build, and boolean. All of these modify topology, and should not be making making shape keys. --- source/blender/blenkernel/intern/modifier.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 2159837c9a0..b4c30203000 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -250,8 +250,7 @@ int modifier_couldBeCage(struct Scene *scene, ModifierData *md) int modifier_sameTopology(ModifierData *md) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); - return ELEM3(mti->type, eModifierTypeType_OnlyDeform, eModifierTypeType_Nonconstructive, - eModifierTypeType_NonGeometrical); + return ELEM(mti->type, eModifierTypeType_OnlyDeform, eModifierTypeType_NonGeometrical); } int modifier_nonGeometrical(ModifierData *md) From cd1f8200de6f7f68e837439acf20fc43b9c2c4a1 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sun, 20 May 2012 15:52:24 +0000 Subject: [PATCH 054/159] Sequencer UI: * Some consistency tweaks. --- release/scripts/startup/bl_ui/space_sequencer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 3280b2a24b0..732f675c208 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -153,7 +153,7 @@ class SEQUENCER_MT_select(Menu): layout.operator_menu_enum("sequencer.select_grouped", "type", text="Grouped") layout.operator("sequencer.select_linked") layout.operator("sequencer.select_all").action = 'TOGGLE' - layout.operator("sequencer.select_all", text="Invert Selection").action = 'INVERT' + layout.operator("sequencer.select_all", text="Inverse").action = 'INVERT' class SEQUENCER_MT_marker(Menu): @@ -397,7 +397,7 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel, Panel): if elem and elem.orig_width > 0 and elem.orig_height > 0: col.label(text="Original Dimension" + ": %dx%d" % (elem.orig_width, elem.orig_height)) else: - col.label(text="Orig Dim: None") + col.label(text="Original Dimension: None") class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): From baef07c22911934d70d4bcb78b32b769279d8fae Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Sun, 20 May 2012 17:40:57 +0000 Subject: [PATCH 055/159] Renamed the COLLADA Import/export labels to 'Collada (Default)' to make it better separatable from target specific exporters --- release/scripts/startup/bl_ui/space_info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py index 0c38829b54f..9cf4a337483 100644 --- a/release/scripts/startup/bl_ui/space_info.py +++ b/release/scripts/startup/bl_ui/space_info.py @@ -156,7 +156,7 @@ class INFO_MT_file_import(Menu): def draw(self, context): if hasattr(bpy.types, "WM_OT_collada_import"): - self.layout.operator("wm.collada_import", text="COLLADA (.dae)") + self.layout.operator("wm.collada_import", text="Collada (Default) (.dae)") class INFO_MT_file_export(Menu): @@ -165,7 +165,7 @@ class INFO_MT_file_export(Menu): def draw(self, context): if hasattr(bpy.types, "WM_OT_collada_export"): - self.layout.operator("wm.collada_export", text="COLLADA (.dae)") + self.layout.operator("wm.collada_export", text="Collada (Default) (.dae)") class INFO_MT_file_external_data(Menu): From 5d9256404159670bec6d65557697accb5b3111b8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 20 May 2012 18:19:45 +0000 Subject: [PATCH 056/159] use utf8 functions for new modifier names --- source/blender/blenkernel/intern/particle.c | 2 +- source/blender/editors/object/object_modifier.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 4ca9f9c281b..66dd23e76b9 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3465,7 +3465,7 @@ ModifierData *object_add_particle_system(Scene *scene, Object *ob, const char *n md = modifier_new(eModifierType_ParticleSystem); - if (name) BLI_strncpy(md->name, name, sizeof(md->name)); + if (name) BLI_strncpy_utf8(md->name, name, sizeof(md->name)); else BLI_snprintf(md->name, sizeof(md->name), "ParticleSystem %i", BLI_countlist(&ob->particlesystem)); modifier_unique_name(&ob->modifiers, md); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 0aa7e1083c3..1437081c9d7 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -126,7 +126,7 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc BLI_addtail(&ob->modifiers, new_md); if (name) - BLI_strncpy(new_md->name, name, sizeof(new_md->name)); + BLI_strncpy_utf8(new_md->name, name, sizeof(new_md->name)); /* make sure modifier data has unique name */ From 2d2d36fe3b2f3e7eed7d05714abc80f1a5a82303 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 20 May 2012 19:49:27 +0000 Subject: [PATCH 057/159] code cleanup: - style - multi-line ifs move braces onto new lines. - iterators - convert some to macros, other split up and move brace. --- source/blender/avi/intern/avi.c | 12 ++-- source/blender/blenkernel/intern/CCGSubSurf.c | 3 +- .../blender/blenkernel/intern/DerivedMesh.c | 4 +- source/blender/blenkernel/intern/blender.c | 3 +- .../blender/blenkernel/intern/cdderivedmesh.c | 21 ++++--- source/blender/blenkernel/intern/customdata.c | 3 +- source/blender/blenkernel/intern/displist.c | 3 +- .../blender/blenkernel/intern/dynamicpaint.c | 25 +++++--- source/blender/blenkernel/intern/font.c | 19 +++--- source/blender/blenkernel/intern/image_gen.c | 10 ++-- source/blender/blenkernel/intern/key.c | 2 +- source/blender/blenkernel/intern/mesh.c | 4 +- .../blender/blenkernel/intern/mesh_validate.c | 8 +-- source/blender/blenkernel/intern/object.c | 10 ++-- source/blender/blenkernel/intern/ocean.c | 58 +++++++++---------- .../blenkernel/intern/particle_system.c | 2 +- source/blender/blenkernel/intern/sequencer.c | 17 ++++-- source/blender/blenkernel/intern/softbody.c | 9 +-- .../blender/blenkernel/intern/subsurf_ccg.c | 3 +- source/blender/blenkernel/intern/text.c | 12 ++-- source/blender/blenkernel/intern/texture.c | 3 +- .../blender/blenkernel/intern/writeffmpeg.c | 20 ++++--- source/blender/blenlib/intern/path_util.c | 2 +- source/blender/blenlib/intern/pbvh.c | 5 +- source/blender/blenlib/intern/string.c | 2 +- source/blender/blenloader/intern/readfile.c | 8 +-- .../blenloader/intern/versioning_250.c | 2 +- .../blenloader/intern/versioning_legacy.c | 8 +-- source/blender/blenloader/intern/writefile.c | 2 +- source/blender/bmesh/intern/bmesh_operators.c | 4 +- source/blender/bmesh/operators/bmo_connect.c | 2 +- source/blender/bmesh/operators/bmo_utils.c | 2 +- .../blender/editors/armature/editarmature.c | 2 +- .../blender/editors/armature/meshlaplacian.c | 3 +- source/blender/editors/armature/reeb.c | 2 +- source/blender/editors/curve/editcurve.c | 2 +- .../editors/interface/interface_draw.c | 6 +- .../editors/interface/interface_handlers.c | 3 +- .../editors/interface/interface_widgets.c | 7 ++- source/blender/editors/mesh/editmesh_rip.c | 3 +- source/blender/editors/mesh/editmesh_select.c | 11 +--- source/blender/editors/mesh/editmesh_tools.c | 11 +--- .../blender/editors/object/object_modifier.c | 7 ++- source/blender/editors/object/object_select.c | 2 +- .../editors/sculpt_paint/paint_cursor.c | 3 +- .../editors/sculpt_paint/paint_image.c | 4 +- .../blender/editors/sculpt_paint/paint_ops.c | 3 +- source/blender/editors/sculpt_paint/sculpt.c | 12 ++-- source/blender/editors/space_clip/clip_ops.c | 2 +- source/blender/editors/space_file/filesel.c | 5 +- .../blender/editors/space_image/image_ops.c | 2 +- .../editors/space_logic/logic_window.c | 8 +-- .../editors/space_sequencer/sequencer_draw.c | 3 +- .../editors/space_sequencer/sequencer_edit.c | 8 +-- source/blender/editors/space_text/text_draw.c | 2 +- .../blender/editors/space_view3d/drawobject.c | 3 +- .../editors/space_view3d/view3d_draw.c | 7 ++- source/blender/editors/transform/transform.c | 2 +- .../editors/transform/transform_conversions.c | 20 +++---- .../editors/transform/transform_snap.c | 4 +- source/blender/editors/uvedit/uvedit_ops.c | 3 +- .../editors/uvedit/uvedit_smart_stitch.c | 4 +- source/blender/gpu/intern/gpu_draw.c | 4 +- source/blender/gpu/intern/gpu_material.c | 9 ++- source/blender/imbuf/intern/anim_movie.c | 11 ++-- .../imbuf/intern/dds/DirectDrawSurface.cpp | 2 +- source/blender/imbuf/intern/filter.c | 5 +- source/blender/imbuf/intern/indexer_dv.c | 5 +- source/blender/imbuf/intern/tiff.c | 3 +- source/blender/imbuf/intern/util.c | 6 +- source/blender/makesdna/intern/dna_genfile.c | 4 +- source/blender/makesrna/intern/makesrna.c | 6 +- source/blender/makesrna/intern/rna_access.c | 3 +- .../makesrna/intern/rna_dynamicpaint.c | 3 +- .../blender/makesrna/intern/rna_object_api.c | 3 +- source/blender/makesrna/intern/rna_scene.c | 2 +- source/blender/makesrna/intern/rna_userdef.c | 2 +- .../modifiers/intern/MOD_dynamicpaint.c | 6 +- source/blender/python/bmesh/bmesh_py_types.c | 2 +- source/blender/python/generic/idprop_py_api.c | 4 +- source/blender/python/intern/bpy_library.c | 6 +- source/blender/python/intern/bpy_operator.c | 2 +- .../python/mathutils/mathutils_Quaternion.c | 3 +- .../quicktime/apple/quicktime_export.c | 4 +- .../blender/render/intern/source/pipeline.c | 8 ++- .../windowmanager/intern/wm_event_system.c | 6 +- .../blender/windowmanager/intern/wm_keymap.c | 4 +- .../windowmanager/intern/wm_operators.c | 3 +- .../bad_level_call_stubs/stubs.c | 16 ++--- .../gameengine/Converter/BL_MeshDeformer.cpp | 3 +- source/gameengine/GameLogic/SCA_IController.h | 4 +- source/gameengine/GameLogic/SCA_ISensor.cpp | 5 +- .../NG_LoopBackNetworkDeviceInterface.h | 6 +- .../gameengine/Rasterizer/RAS_IRasterizer.h | 10 ++-- source/gameengine/SceneGraph/SG_Spatial.cpp | 4 +- 95 files changed, 336 insertions(+), 270 deletions(-) diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 861e07f6eb3..245f5d92e49 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -215,7 +215,8 @@ int AVI_is_avi(char *name) if (GET_FCC(fp) != FCC("RIFF") || !GET_FCC(fp) || - GET_FCC(fp) != FCC("AVI ")) { + GET_FCC(fp) != FCC("AVI ")) + { ret = 0; } else { @@ -245,7 +246,8 @@ int AVI_is_avi(const char *name) return 0; if (GET_FCC(movie.fp) != FCC("RIFF") || - !(movie.size = GET_FCC(movie.fp))) { + !(movie.size = GET_FCC(movie.fp))) + { fclose(movie.fp); return 0; } @@ -257,7 +259,8 @@ int AVI_is_avi(const char *name) !GET_FCC(movie.fp) || GET_FCC(movie.fp) != FCC("hdrl") || (movie.header->fcc = GET_FCC(movie.fp)) != FCC("avih") || - !(movie.header->size = GET_FCC(movie.fp))) { + !(movie.header->size = GET_FCC(movie.fp))) + { DEBUG_PRINT("bad initial header info\n"); fclose(movie.fp); return 0; @@ -378,8 +381,7 @@ int AVI_is_avi(const char *name) fcca = bi->Compression; - if (movie.streams[temp].format == - AVI_FORMAT_AVI_RGB) { + if (movie.streams[temp].format == AVI_FORMAT_AVI_RGB) { if (fcca == FCC("DIB ") || fcca == FCC("RGB ") || fcca == FCC("rgb ") || diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index 6f768a147f7..e4309a64e56 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -1166,7 +1166,8 @@ CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, const void *vertDa v->flags = Vert_eEffected | seamflag; } else if (!VertDataEqual(vertData, _vert_getCo(v, 0, ss->meshIFC.vertDataSize), ss) || - ((v->flags & Vert_eSeam) != seamflag)) { + ((v->flags & Vert_eSeam) != seamflag)) + { *prevp = v->next; _ehash_insert(ss->vMap, (EHEntry *) v); VertDataCopy(_vert_getCo(v, 0, ss->meshIFC.vertDataSize), vertData, ss); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 18560d3dbc0..7e2d881689c 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1546,7 +1546,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* if this is not the last modifier in the stack then recalculate the normals * to avoid giving bogus normals to the next modifier see: [#23673] */ - if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) { + if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) { /* XXX, this covers bug #23673, but we may need normal calc for other types */ if (dm && dm->type == DM_TYPE_CDDM) { CDDM_apply_vert_coords(dm, deformedVerts); @@ -2942,7 +2942,7 @@ static void navmesh_drawColored(DerivedMesh *dm) #endif glDisable(GL_LIGHTING); - /* if (GPU_buffer_legacy(dm) ) */ { /* TODO - VBO draw code, not high priority - campbell */ + /* if (GPU_buffer_legacy(dm) ) */ { /* TODO - VBO draw code, not high priority - campbell */ DEBUG_VBO("Using legacy code. drawNavMeshColored\n"); //glShadeModel(GL_SMOOTH); glBegin(glmode = GL_QUADS); diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index b2cbf0a1ce1..2ba4ab5d100 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -334,7 +334,8 @@ static int handle_subversion_warning(Main *main, ReportList *reports) { if (main->minversionfile > BLENDER_VERSION || (main->minversionfile == BLENDER_VERSION && - main->minsubversionfile > BLENDER_SUBVERSION)) { + main->minsubversionfile > BLENDER_SUBVERSION)) + { BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile); } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 65294e3e5f5..a34d2ecd47a 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -640,9 +640,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, if (drawParamsMapped) { draw_option = drawParamsMapped(userData, orig); } else { if (nors) nors += 3; continue; } } - else - if (drawParamsMapped) draw_option = drawParamsMapped(userData, i); - else { if (nors) nors += 3; continue; } + else if (drawParamsMapped) { draw_option = drawParamsMapped(userData, i); } + else { if (nors) nors += 3; continue; } } if (draw_option != DM_DRAW_OPTION_SKIP) { @@ -2397,11 +2396,13 @@ void CDDM_calc_edges_tessface(DerivedMesh *dm) CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges); CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges); - ehi = BLI_edgehashIterator_new(eh); med = CustomData_get_layer(&edgeData, CD_MEDGE); index = CustomData_get_layer(&edgeData, CD_ORIGINDEX); - for (i = 0; !BLI_edgehashIterator_isDone(ehi); - BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) { + + for (ehi = BLI_edgehashIterator_new(eh), i = 0; + BLI_edgehashIterator_isDone(ehi) == FALSE; + BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) + { BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2); med->flag = ME_EDGEDRAW | ME_EDGERENDER; @@ -2460,11 +2461,13 @@ void CDDM_calc_edges(DerivedMesh *dm) CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges); CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges); - ehi = BLI_edgehashIterator_new(eh); med = CustomData_get_layer(&edgeData, CD_MEDGE); index = CustomData_get_layer(&edgeData, CD_ORIGINDEX); - for (i = 0; !BLI_edgehashIterator_isDone(ehi); - BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) { + + for (ehi = BLI_edgehashIterator_new(eh), i = 0; + BLI_edgehashIterator_isDone(ehi) == FALSE; + BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) + { BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2); j = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 90a3e617477..56724b6ada9 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -2323,7 +2323,8 @@ void CustomData_bmesh_copy_data(const CustomData *source, CustomData *dest, /* if we found a matching layer, copy the data */ if (dest->layers[dest_i].type == source->layers[src_i].type && - strcmp(dest->layers[dest_i].name, source->layers[src_i].name) == 0) { + strcmp(dest->layers[dest_i].name, source->layers[src_i].name) == 0) + { char *src_data = (char *)src_block + source->layers[src_i].offset; char *dest_data = (char *)*dest_block + dest->layers[dest_i].offset; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 9274d7aefcb..2493507dca4 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -901,7 +901,8 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba continue; if (mti->type == eModifierTypeType_OnlyDeform || - (mti->type == eModifierTypeType_DeformOrConstruct && !dm)) { + (mti->type == eModifierTypeType_DeformOrConstruct && !dm)) + { if (editmode) appf |= MOD_APPLY_USECACHE; if (dm) { diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index f8b8efdf7eb..eb5e4e4f8b5 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -2035,7 +2035,8 @@ static int dynamicPaint_findNeighbourPixel(PaintUVPoint *tempPoints, DerivedMesh int v4 = (mface[i].v4) ? mface[i].v4 : -1; if ((e1_index == mface[i].v1 || e1_index == mface[i].v2 || e1_index == mface[i].v3 || e1_index == v4) && - (e2_index == mface[i].v1 || e2_index == mface[i].v2 || e2_index == mface[i].v3 || e2_index == v4)) { + (e2_index == mface[i].v1 || e2_index == mface[i].v2 || e2_index == mface[i].v3 || e2_index == v4)) + { if (i == cPoint->face_index) continue; target_face = i; @@ -3511,7 +3512,8 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, } /* get final object space depth */ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE || - surface->type == MOD_DPAINT_SURFACE_T_WAVE) { + surface->type == MOD_DPAINT_SURFACE_T_WAVE) + { depth /= bData->bNormal[index].normal_scale * total_sample; } @@ -3803,8 +3805,8 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po /* Smooth range or color ramp */ if (brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH || - brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) { - + brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) + { strength = 1.0f - distance / brush_radius; CLAMP(strength, 0.0f, 1.0f); } @@ -3855,7 +3857,8 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) { if (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP && - !(brush->flags & MOD_DPAINT_RAMP_ALPHA)) { + !(brush->flags & MOD_DPAINT_RAMP_ALPHA)) + { paintColor[0] = colorband[0]; paintColor[1] = colorband[1]; paintColor[2] = colorband[2]; @@ -4400,7 +4403,8 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale) avg_dist = (numOfN) ? avg_dist / numOfN : 0.0f; if (surface->flags & MOD_DPAINT_WAVE_OPEN_BORDERS && - sData->adj_data->flags[index] & ADJ_ON_MESH_EDGE) { + sData->adj_data->flags[index] & ADJ_ON_MESH_EDGE) + { /* if open borders, apply a fake height to keep waves going on */ avg_height = (numOfRN) ? avg_height / numOfRN : 0.0f; wPoint->height = (dt * wave_speed * avg_height + wPoint->height * avg_dist) / (avg_dist + dt * wave_speed); @@ -4507,7 +4511,8 @@ static void dynamicPaint_surfacePreStep(DynamicPaintSurface *surface, float time /* dissolve for float types */ else if (surface->flags & MOD_DPAINT_DISSOLVE && (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE || - surface->type == MOD_DPAINT_SURFACE_T_WEIGHT)) { + surface->type == MOD_DPAINT_SURFACE_T_WEIGHT)) + { float *point = &((float *)sData->type_data)[index]; /* log or linear */ @@ -4727,7 +4732,8 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc /* Prepare surface normal directional scale to easily convert * brush intersection amount between global and local space */ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE || - surface->type == MOD_DPAINT_SURFACE_T_WAVE) { + surface->type == MOD_DPAINT_SURFACE_T_WAVE) + { float temp_nor[3]; if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) { normal_short_to_float_v3(temp_nor, mvert[index].no); @@ -4856,7 +4862,8 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *su /* Particle brush: */ if (brush->collision == MOD_DPAINT_COL_PSYS) { if (brush && brush->psys && brush->psys->part && brush->psys->part->type == PART_EMITTER && - psys_check_enabled(brushObj, brush->psys)) { + psys_check_enabled(brushObj, brush->psys)) + { /* Paint a particle system */ BKE_animsys_evaluate_animdata(scene, &brush->psys->part->id, brush->psys->part->adt, BKE_scene_frame_get(scene), ADT_RECALC_ANIM); diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 87e35bc2747..061530965ef 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -705,9 +705,10 @@ makebreak: linedata3[lnr] = tb->w / cu->fsize; linedata4[lnr] = wsnr; - if ( (tb->h != 0.0f) && - ((-(yof - (tb->y / cu->fsize))) > ((tb->h / cu->fsize) - (linedist * cu->fsize)) - cu->yof) && - (cu->totbox > (curbox + 1)) ) { + if ((tb->h != 0.0f) && + ((-(yof - (tb->y / cu->fsize))) > ((tb->h / cu->fsize) - (linedist * cu->fsize)) - cu->yof) && + (cu->totbox > (curbox + 1)) ) + { maxlen = 0; tb++; curbox++; @@ -802,8 +803,7 @@ makebreak: ct++; } } - else if ((cu->spacemode == CU_FLUSH) && - (cu->tb[0].w != 0.0f)) { + else if ((cu->spacemode == CU_FLUSH) && (cu->tb[0].w != 0.0f)) { for (i = 0; i < lnr; i++) if (linedata2[i] > 1) linedata[i] = (linedata3[i] - linedata[i]) / (linedata2[i] - 1); @@ -829,7 +829,8 @@ makebreak: } if ((mem[j] != '\r') && (mem[j] != '\n') && - ((chartransdata[j].dobreak != 0))) { + ((chartransdata[j].dobreak != 0))) + { if (mem[i] == ' ') curofs += (linedata3[ct->linenr] - linedata[ct->linenr]) / linedata4[ct->linenr]; ct->xof += curofs; } @@ -1029,9 +1030,9 @@ makebreak: if ((info->flag & CU_CHINFO_UNDERLINE) && (cu->textoncurve == NULL) && (cha != '\n') && (cha != '\r')) { float ulwidth, uloverlap = 0.0f; - if ( (i < (slen - 1)) && (mem[i + 1] != '\n') && (mem[i + 1] != '\r') && - ((mem[i + 1] != ' ') || (custrinfo[i + 1].flag & CU_CHINFO_UNDERLINE)) && ((custrinfo[i + 1].flag & CU_CHINFO_WRAP) == 0) - ) { + if ((i < (slen - 1)) && (mem[i + 1] != '\n') && (mem[i + 1] != '\r') && + ((mem[i + 1] != ' ') || (custrinfo[i + 1].flag & CU_CHINFO_UNDERLINE)) && ((custrinfo[i + 1].flag & CU_CHINFO_WRAP) == 0)) + { uloverlap = xtrax + 0.1f; } // Find the character, the characters has to be in the memory already diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c index 4579e6f92aa..f135bebb8ce 100644 --- a/source/blender/blenkernel/intern/image_gen.c +++ b/source/blender/blenkernel/intern/image_gen.c @@ -123,11 +123,11 @@ void BKE_image_buf_fill_checker(unsigned char *rect, float *rect_float, int widt h = 0.125f * floorf(x / checkerwidth); if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 4) && - (fabs((y % checkerwidth) - (checkerwidth / 2)) < 4)) { - + (fabs((y % checkerwidth) - (checkerwidth / 2)) < 4)) + { if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 1) || - (fabs((y % checkerwidth) - (checkerwidth / 2)) < 1)) { - + (fabs((y % checkerwidth) - (checkerwidth / 2)) < 1)) + { hue = fmodf(fabs(h - hoffs), 1.0f); hsv_to_rgb(hue, s, v, &r, &g, &b); @@ -250,7 +250,7 @@ static void checker_board_grid_fill(unsigned char *rect, float *rect_float, int int x, y; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { - if (((y % 32) == 0) || ((x % 32) == 0) || x == 0) { + if (((y % 32) == 0) || ((x % 32) == 0) || x == 0) { if (rect) { rect[0] = BLEND_CHAR(rect[0], blend); rect[1] = BLEND_CHAR(rect[1], blend); diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index f4ec223a2fe..d776b05dce5 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -1260,7 +1260,7 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, const int float t[4]; int flag; - if (key->slurph && key->type != KEY_RELATIVE) { + if (key->slurph && key->type != KEY_RELATIVE) { const float ctime_scaled = key->ctime / 100.0f; float delta = (float)key->slurph / tot; float cfra = (float)scene->r.cfra; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 7a5c43b28f8..abc31bb25ed 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -812,8 +812,8 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr) mface->v4 == mface->v1 || /* across the face */ mface->v1 == mface->v3 || - mface->v2 == mface->v4 - ) { + mface->v2 == mface->v4) + { return 0; } } diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 1645a8c9c9b..a60bb98ac18 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -667,11 +667,11 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update) memset(&edata, 0, sizeof(edata)); CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge); - ehi = BLI_edgehashIterator_new(eh); med = CustomData_get_layer(&edata, CD_MEDGE); - for (i = 0; !BLI_edgehashIterator_isDone(ehi); - BLI_edgehashIterator_step(ehi), ++i, ++med) { - + for (ehi = BLI_edgehashIterator_new(eh), i = 0; + BLI_edgehashIterator_isDone(ehi) == FALSE; + BLI_edgehashIterator_step(ehi), ++i, ++med) + { if (update && (med_orig = BLI_edgehashIterator_getValue(ehi))) { *med = *med_orig; /* copy from the original */ } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 9000019ca2a..658a050d4d1 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2763,11 +2763,11 @@ int BKE_object_obdata_texspace_get(Object *ob, short **r_texflag, float **r_loc, int BKE_boundbox_ray_hit_check(struct BoundBox *bb, float ray_start[3], float ray_normal[3]) { static int triangle_indexes[12][3] = {{0, 1, 2}, {0, 2, 3}, - {3, 2, 6}, {3, 6, 7}, - {1, 2, 6}, {1, 6, 5}, - {5, 6, 7}, {4, 5, 7}, - {0, 3, 7}, {0, 4, 7}, - {0, 1, 5}, {0, 4, 5}}; + {3, 2, 6}, {3, 6, 7}, + {1, 2, 6}, {1, 6, 5}, + {5, 6, 7}, {4, 5, 7}, + {0, 3, 7}, {0, 4, 7}, + {0, 1, 5}, {0, 4, 5}}; int result = 0; int i; diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c index e76cde652c8..3d3a5ed7556 100644 --- a/source/blender/blenkernel/intern/ocean.c +++ b/source/blender/blenkernel/intern/ocean.c @@ -500,10 +500,10 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount // compute a new htilda #pragma omp parallel for private(i, j) - for (i = 0; i < o->_M; ++i) { + for (i = 0; i < o->_M; ++i) { // note the <= _N/2 here, see the fftw doco about // the mechanics of the complex->real fft storage - for (j = 0; j <= o->_N / 2; ++j) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex exp_param1; fftw_complex exp_param2; fftw_complex conj_param; @@ -538,8 +538,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount { if (o->_do_chop) { // x displacement - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; fftw_complex minus_i; @@ -560,8 +560,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount { if (o->_do_chop) { // z displacement - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; fftw_complex minus_i; @@ -582,8 +582,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount { if (o->_do_jacobian) { // Jxx - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; //init_complex(mul_param, -scale, 0); @@ -597,8 +597,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount } fftw_execute(o->_Jxx_plan); - for (i = 0; i < o->_M; ++i) { - for (j = 0; j < o->_N; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j < o->_N; ++j) { o->_Jxx[i * o->_N + j] += 1.0; } } @@ -609,8 +609,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount { if (o->_do_jacobian) { // Jzz - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; //init_complex(mul_param, -scale, 0); @@ -623,8 +623,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount } } fftw_execute(o->_Jzz_plan); - for (i = 0; i < o->_M; ++i) { - for (j = 0; j < o->_N; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j < o->_N; ++j) { o->_Jzz[i * o->_N + j] += 1.0; } } @@ -635,8 +635,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount { if (o->_do_jacobian) { // Jxz - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; //init_complex(mul_param, -scale, 0); @@ -656,8 +656,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount { // fft normals if (o->_do_normals) { - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; init_complex(mul_param, 0.0, -1.0); @@ -674,8 +674,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount #pragma omp section { if (o->_do_normals) { - for (i = 0; i < o->_M; ++i) { - for (j = 0; j <= o->_N / 2; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j <= o->_N / 2; ++j) { fftw_complex mul_param; init_complex(mul_param, 0.0, -1.0); @@ -687,8 +687,8 @@ void BKE_simulate_ocean(struct Ocean *o, float t, float scale, float chop_amount fftw_execute(o->_N_z_plan); #if 0 - for (i = 0; i < o->_M; ++i) { - for (j = 0; j < o->_N; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j < o->_N; ++j) { o->_N_y[i * o->_N + j] = 1.0f / scale; } } @@ -802,21 +802,21 @@ void BKE_init_ocean(struct Ocean *o, int M, int N, float Lx, float Lz, float V, o->_kz[i] = -2.0f * (float)M_PI * ii / o->_Lz; // pre-calculate the k matrix - for (i = 0; i < o->_M; ++i) - for (j = 0; j <= o->_N / 2; ++j) + for (i = 0; i < o->_M; ++i) + for (j = 0; j <= o->_N / 2; ++j) o->_k[i * (1 + o->_N / 2) + j] = sqrt(o->_kx[i] * o->_kx[i] + o->_kz[j] * o->_kz[j]); /*srand(seed);*/ BLI_srand(seed); - for (i = 0; i < o->_M; ++i) { - for (j = 0; j < o->_N; ++j) { + for (i = 0; i < o->_M; ++i) { + for (j = 0; j < o->_N; ++j) { float r1 = gaussRand(); float r2 = gaussRand(); fftw_complex r1r2; init_complex(r1r2, r1, r2); - mul_complex_f(o->_h0[i * o->_N + j], r1r2, (float)(sqrt(Ph(o, o->_kx[i], o->_kz[j]) / 2.0f))); + mul_complex_f(o->_h0[i * o->_N + j], r1r2, (float)(sqrt(Ph(o, o->_kx[i], o->_kz[j]) / 2.0f))); mul_complex_f(o->_h0_minus[i * o->_N + j], r1r2, (float)(sqrt(Ph(o, -o->_kx[i], -o->_kz[j]) / 2.0f))); } } @@ -1253,13 +1253,13 @@ void BKE_bake_ocean(struct Ocean *o, struct OceanCache *och, void (*update_cb)(v printf("Cannot save Displacement File Output to %s\n", string); if (o->_do_jacobian) { - cache_filename(string, och->bakepath, och->relbase, f, CACHE_TYPE_FOAM); + cache_filename(string, och->bakepath, och->relbase, f, CACHE_TYPE_FOAM); if (0 == BKE_imbuf_write(ibuf_foam, string, &imf)) printf("Cannot save Foam File Output to %s\n", string); } if (o->_do_normals) { - cache_filename(string, och->bakepath, och->relbase, f, CACHE_TYPE_NORMAL); + cache_filename(string, och->bakepath, och->relbase, f, CACHE_TYPE_NORMAL); if (0 == BKE_imbuf_write(ibuf_normal, string, &imf)) printf("Cannot save Normal File Output to %s\n", string); } diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 5397b1729f9..941e2990a4b 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -206,7 +206,7 @@ static void realloc_particles(ParticleSimulationData *sim, int new_totpart) int totpart, totsaved = 0; if (new_totpart<0) { - if (part->distr==PART_DISTR_GRID && part->from != PART_FROM_VERT) { + if ((part->distr == PART_DISTR_GRID) && (part->from != PART_FROM_VERT)) { totpart= part->grid_res; totpart*=totpart*totpart; } diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index a762af960a5..8fbb3ee9800 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1448,7 +1448,8 @@ void seq_proxy_rebuild(SeqIndexBuildContext *context, short *stop, short *do_upd 100); for (cfra = seq->startdisp + seq->startstill; - cfra < seq->enddisp - seq->endstill; cfra++) { + cfra < seq->enddisp - seq->endstill; cfra++) + { if (context->size_flags & IMB_PROXY_25) { seq_proxy_build_frame(render_context, seq, cfra, 25); } @@ -1675,7 +1676,8 @@ int input_have_to_preprocess( float mul; if (seq->flag & (SEQ_FILTERY | SEQ_USE_CROP | SEQ_USE_TRANSFORM | SEQ_FLIPX | - SEQ_FLIPY | SEQ_USE_COLOR_BALANCE | SEQ_MAKE_PREMUL)) { + SEQ_FLIPY | SEQ_USE_COLOR_BALANCE | SEQ_MAKE_PREMUL)) + { return TRUE; } @@ -1762,8 +1764,10 @@ static ImBuf *input_preprocess( } } - if (c.top + c.bottom >= ibuf->y || c.left + c.right >= ibuf->x || - t.xofs >= dx || t.yofs >= dy) { + if (c.top + c.bottom >= ibuf->y || + c.left + c.right >= ibuf->x || + t.xofs >= dx || t.yofs >= dy) + { make_black_ibuf(ibuf); } else { @@ -3168,7 +3172,7 @@ void seq_tx_handle_xlimits(Sequence *seq, int leftflag, int rightflag) } if (rightflag) { - if (seq_tx_get_final_right(seq, 0) <= seq_tx_get_final_left(seq, 0)) { + if (seq_tx_get_final_right(seq, 0) <= seq_tx_get_final_left(seq, 0)) { seq_tx_set_final_right(seq, seq_tx_get_final_left(seq, 0) + 1); } @@ -3508,7 +3512,8 @@ Sequence *seq_metastrip(ListBase *seqbase, Sequence *meta, Sequence *seq) return meta; } else if (iseq->seqbase.first && - (rval = seq_metastrip(&iseq->seqbase, iseq, seq))) { + (rval = seq_metastrip(&iseq->seqbase, iseq, seq))) + { return rval; } } diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index fe7ec83407b..85027efa246 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -697,7 +697,7 @@ static void add_2nd_order_roller(Object *ob, float UNUSED(stiffness), int *count if (bpo) {/* so now we have a 2nd order humpdidump */ for (c=bpo->nofsprings;c>0;c--) { bs2 = sb->bspring + bpo->springs[c-1]; - if ((bs2->v1 != notthis) && (bs2->v1 > v0)) { + if ((bs2->v1 != notthis) && (bs2->v1 > v0)) { (*counter)++;/*hit */ if (addsprings) { bs3->v1= v0; @@ -2228,7 +2228,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo attached = 0; for (b=obp->nofsprings;b>0;b--) { bs = sb->bspring + obp->springs[b-1]; - if (( ilast-bb == bs->v2) || ( ilast-bb == bs->v1)) { + if (( ilast-bb == bs->v2) || ( ilast-bb == bs->v1)) { attached=1; continue;} } @@ -2600,7 +2600,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa attached = 0; for (b=obp->nofsprings;b>0;b--) { bs = sb->bspring + obp->springs[b-1]; - if (( sb->totpoint-a == bs->v2) || ( sb->totpoint-a == bs->v1)) { + if (( sb->totpoint-a == bs->v2) || ( sb->totpoint-a == bs->v1)) { attached=1; continue;} } @@ -4078,7 +4078,8 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i /* verify if we need to create the softbody data */ if (sb->bpoint == NULL || - ((ob->softflag & OB_SB_EDGES) && !ob->soft->bspring && object_has_edges(ob))) { + ((ob->softflag & OB_SB_EDGES) && !ob->soft->bspring && object_has_edges(ob))) + { switch (ob->type) { case OB_MESH: diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index ad5bb24e541..22e702d5930 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -610,7 +610,8 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, * other parts of code significantly to handle missing faces. * since this really shouldn't even be possible we just bail.*/ if (ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), mp->totloop, - fVerts, &f) == eCCGError_InvalidValue) { + fVerts, &f) == eCCGError_InvalidValue) + { static int hasGivenError = 0; if (!hasGivenError) { diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 32cf966b7fd..7bfd4189cc3 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -1124,7 +1124,8 @@ static void txt_pop_first(Text *text) { if (txt_get_span(text->curl, text->sell) < 0 || - (text->curl == text->sell && text->curc > text->selc)) { + (text->curl == text->sell && text->curc > text->selc)) + { txt_curs_swap(text); } @@ -1140,7 +1141,8 @@ static void txt_pop_first(Text *text) static void txt_pop_last(Text *text) { if (txt_get_span(text->curl, text->sell) > 0 || - (text->curl == text->sell && text->curc < text->selc)) { + (text->curl == text->sell && text->curc < text->selc)) + { txt_curs_swap(text); } @@ -3214,7 +3216,8 @@ short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, in else if (marker->lineno > lineno) break; if ((marker->start == marker->end && start <= marker->start && marker->start <= end) || - (marker->start < end && marker->end > start)) { + (marker->start < end && marker->end > start)) + { BLI_freelinkN(&text->markers, marker); cleared = 1; } @@ -3234,7 +3237,8 @@ short txt_clear_markers(Text *text, int group, int flags) next = marker->next; if ((!group || marker->group == group) && - (marker->flags & flags) == flags) { + (marker->flags & flags) == flags) + { BLI_freelinkN(&text->markers, marker); cleared = 1; } diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 2c868ca2601..2ec42b47e5c 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -233,7 +233,8 @@ void init_tex_mapping(TexMapping *texmap) float smat[3][3], rmat[3][3], mat[3][3], proj[3][3]; if (texmap->projx == PROJ_X && texmap->projy == PROJ_Y && texmap->projz == PROJ_Z && - is_zero_v3(texmap->loc) && is_zero_v3(texmap->rot) && is_one_v3(texmap->size)) { + is_zero_v3(texmap->loc) && is_zero_v3(texmap->rot) && is_one_v3(texmap->size)) + { unit_m4(texmap->mat); texmap->flag |= TEXMAP_UNIT_MATRIX; diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index a3fdb41fe37..91e93bbd05d 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -472,7 +472,8 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex c->time_base.num = 100; } else if ((double) ((int) rd->frs_sec_base) == - rd->frs_sec_base) { + rd->frs_sec_base) + { c->time_base.den = rd->frs_sec; c->time_base.num = (int) rd->frs_sec_base; } @@ -523,7 +524,7 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex if (codec_id == CODEC_ID_FFV1) { #ifdef FFMPEG_FFV1_ALPHA_SUPPORTED - if (rd->im_format.planes == R_IMF_PLANES_RGBA) { + if (rd->im_format.planes == R_IMF_PLANES_RGBA) { c->pix_fmt = PIX_FMT_RGB32; } else { @@ -535,7 +536,7 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex } if (codec_id == CODEC_ID_QTRLE) { - if (rd->im_format.planes == R_IMF_PLANES_RGBA) { + if (rd->im_format.planes == R_IMF_PLANES_RGBA) { c->pix_fmt = PIX_FMT_ARGB; } } @@ -544,7 +545,8 @@ static AVStream *alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex // || !strcmp(of->oformat->name, "mp4") // || !strcmp(of->oformat->name, "mov") // || !strcmp(of->oformat->name, "3gp") - ) { + ) + { fprintf(stderr, "Using global header\n"); c->flags |= CODEC_FLAG_GLOBAL_HEADER; } @@ -903,7 +905,8 @@ void BKE_ffmpeg_filepath_get(char *string, RenderData *rd) while (*fe) { if (BLI_strcasecmp(string + strlen(string) - strlen(*fe), - *fe) == 0) { + *fe) == 0) + { break; } fe++; @@ -955,7 +958,8 @@ static void write_audio_frames(double to_pts) while (audio_stream && !finished) { if ((audio_time >= to_pts) || - (write_audio_frame())) { + (write_audio_frame())) + { finished = 1; } } @@ -1406,8 +1410,8 @@ void BKE_ffmpeg_image_type_verify(RenderData *rd, ImageFormatData *imf) if (rd->ffcodecdata.type <= 0 || rd->ffcodecdata.codec <= 0 || rd->ffcodecdata.audio_codec <= 0 || - rd->ffcodecdata.video_bitrate <= 1) { - + rd->ffcodecdata.video_bitrate <= 1) + { rd->ffcodecdata.codec = CODEC_ID_MPEG2VIDEO; BKE_ffmpeg_preset_set(rd, FFMPEG_PRESET_DVD); diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 49a6cbcc249..ed3eedb8e10 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1529,7 +1529,7 @@ void BLI_join_dirfile(char *dst, const size_t maxlen, const char *dir, const cha size_t dirlen = BLI_strnlen(dir, maxlen); if (dst != dir) { - if (dirlen == maxlen) { + if (dirlen == maxlen) { memcpy(dst, dir, dirlen); dst[dirlen - 1] = '\0'; return; /* dir fills the path */ diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index fdb0cc0ccc8..f4b57857173 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -406,8 +406,9 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) /* Build the vertex list, unique verts first */ for (iter = BLI_ghashIterator_new(map), i = 0; - !BLI_ghashIterator_isDone(iter); - BLI_ghashIterator_step(iter), ++i) { + BLI_ghashIterator_isDone(iter) == FALSE; + BLI_ghashIterator_step(iter), ++i) + { void *value = BLI_ghashIterator_getValue(iter); int ndx = GET_INT_FROM_POINTER(value); diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 53531871aa6..e73899ce929 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -135,7 +135,7 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen) case '\t': case '\n': case '\r': - if (len + 1 < maxlen) { + if (len + 1 < maxlen) { *dst++ = '\\'; len++; } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2b5eebb0f73..06fd2bdfd98 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5025,12 +5025,8 @@ static void direct_link_scene(FileData *fd, Scene *sce) if (seq->strip && seq->strip->done==0) { seq->strip->done = TRUE; - if (seq->type == SEQ_IMAGE || - seq->type == SEQ_MOVIE || - seq->type == SEQ_RAM_SOUND || - seq->type == SEQ_HD_SOUND) { - seq->strip->stripdata = newdataadr( - fd, seq->strip->stripdata); + if (ELEM4(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_RAM_SOUND, SEQ_HD_SOUND)) { + seq->strip->stripdata = newdataadr(fd, seq->strip->stripdata); } else { seq->strip->stripdata = NULL; diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index 4cf17b2c24c..c028c374cce 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -2331,7 +2331,7 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *main) } /* redraws flag in SpaceTime has been moved to Screen level */ - for (sc = main->screen.first; sc; sc = sc->id.next) { + for (sc = main->screen.first; sc; sc = sc->id.next) { if (sc->redraws_flag == 0) { /* just initialize to default? */ // XXX: we could also have iterated through areas, and taken them from the first timeline available... diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c index 799dc82482d..7b314c31488 100644 --- a/source/blender/blenloader/intern/versioning_legacy.c +++ b/source/blender/blenloader/intern/versioning_legacy.c @@ -884,9 +884,9 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *main) /* let faces have default add factor of 0.0 */ while (ma) { - if (!(ma->mode & MA_HALO)) - ma->add = 0.0; - ma = ma->id.next; + if (!(ma->mode & MA_HALO)) + ma->add = 0.0; + ma = ma->id.next; } while (ob) { @@ -3606,7 +3606,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *main) /* check if top parent has compound shape set and if yes, set this object * to compound shaper as well (was the behavior before, now it's optional) */ Object *parent = blo_do_versions_newlibadr(fd, lib, ob->parent); - while (parent && parent != ob && parent->parent != NULL) { + while (parent && parent != ob && parent->parent != NULL) { parent = blo_do_versions_newlibadr(fd, lib, parent->parent); } if (parent) { diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 02ebc91f191..297eb6027ae 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -779,7 +779,7 @@ static void write_renderinfo(WriteData *wd, Main *mainvar) /* for renderdeamon current_screen_compat(mainvar, &curscreen); for (sce= mainvar->scene.first; sce; sce= sce->id.next) { - if (sce->id.lib==NULL && ( sce==curscreen->scene || (sce->r.scemode & R_BG_RENDER)) ) { + if (sce->id.lib == NULL && (sce == curscreen->scene || (sce->r.scemode & R_BG_RENDER))) { data.sfra = sce->r.sfra; data.efra = sce->r.efra; memset(data.scene_name, 0, sizeof(data.scene_name)); diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c index b2d9590dc54..82ad5c1805b 100644 --- a/source/blender/bmesh/intern/bmesh_operators.c +++ b/source/blender/bmesh/intern/bmesh_operators.c @@ -254,7 +254,7 @@ void BMO_slot_copy(BMOperator *source_op, BMOperator *dest_op, const char *src, return; } - if (dest_slot->slottype == BMO_OP_SLOT_ELEMENT_BUF) { + if (dest_slot->slottype == BMO_OP_SLOT_ELEMENT_BUF) { /* do buffer copy */ dest_slot->data.buf = NULL; dest_slot->len = source_slot->len; @@ -264,7 +264,7 @@ void BMO_slot_copy(BMOperator *source_op, BMOperator *dest_op, const char *src, memcpy(dest_slot->data.buf, source_slot->data.buf, slot_alloc_size); } } - else if (dest_slot->slottype == BMO_OP_SLOT_MAPPING) { + else if (dest_slot->slottype == BMO_OP_SLOT_MAPPING) { GHashIterator it; BMOElemMapping *srcmap, *dstmap; diff --git a/source/blender/bmesh/operators/bmo_connect.c b/source/blender/bmesh/operators/bmo_connect.c index b8abe112c4d..2d4c15dbaa5 100644 --- a/source/blender/bmesh/operators/bmo_connect.c +++ b/source/blender/bmesh/operators/bmo_connect.c @@ -444,7 +444,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) i2 = i; i2next = clamp_index(i + 1, lenv2); - if (vv1[i1] == vv1[i1next]) { + if (vv1[i1] == vv1[i1next]) { continue; } diff --git a/source/blender/bmesh/operators/bmo_utils.c b/source/blender/bmesh/operators/bmo_utils.c index 7f2951354ce..4377eb3e883 100644 --- a/source/blender/bmesh/operators/bmo_utils.c +++ b/source/blender/bmesh/operators/bmo_utils.c @@ -597,7 +597,7 @@ void bmo_similarfaces_exec(BMesh *bm, BMOperator *op) /* now select the rest (if any) */ for (i = 0; i < num_total; i++) { fm = f_ext[i].f; - if (!BMO_elem_flag_test(bm, fm, FACE_MARK) && !BM_elem_flag_test(fm, BM_ELEM_HIDDEN)) { + if (!BMO_elem_flag_test(bm, fm, FACE_MARK) && !BM_elem_flag_test(fm, BM_ELEM_HIDDEN)) { int cont = TRUE; for (idx = 0; idx < num_sels && cont == TRUE; idx++) { fs = f_ext[indices[idx]].f; diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 546ab0e4396..4ccdc610cae 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -276,7 +276,7 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone else { /* if the bone is not selected, but connected to its parent * copy the parents tip selection state */ - if (eBone->parent && (eBone->flag & BONE_CONNECTED)) { + if (eBone->parent && (eBone->flag & BONE_CONNECTED)) { /* selecting with the mouse gives this behavior */ if (eBone->parent->flag & BONE_TIPSEL) { eBone->flag |= BONE_ROOTSEL; diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index b975d156868..ab96656406e 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -1393,7 +1393,8 @@ static void meshdeform_bind_floodfill(MeshDeformBind *mdb) if (b != -1) { if (tag[b] == MESHDEFORM_TAG_UNTYPED || - (tag[b] == MESHDEFORM_TAG_BOUNDARY && !mdb->boundisect[a][i - 1])) { + (tag[b] == MESHDEFORM_TAG_BOUNDARY && !mdb->boundisect[a][i - 1])) + { tag[b] = MESHDEFORM_TAG_EXTERIOR; stack[stacksize++] = b; } diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c index 3f056f9638c..a629312e732 100644 --- a/source/blender/editors/armature/reeb.c +++ b/source/blender/editors/armature/reeb.c @@ -1860,7 +1860,7 @@ static void finalizeGraph(ReebGraph *rg, char passes, char method) sortArcs(rg); - for (i = 0; i < passes; i++) { + for (i = 0; i < passes; i++) { postprocessGraph(rg, method); } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 7afba049232..aa29100ccbe 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -270,7 +270,7 @@ void printknots(Object *obedit) int a, num; for (nu = editnurb->first; nu; nu = nu->next) { - if (isNurbsel(nu) && nu->type == CU_NURBS) { + if (isNurbsel(nu) && nu->type == CU_NURBS) { if (nu->knotsu) { num = KNOTSU(nu); for (a = 0; a < num; a++) printf("knotu %d: %f\n", a, nu->knotsu[a]); diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index 2f9e763a7d0..e535990e7e9 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -79,7 +79,7 @@ int uiGetRoundBox(void) void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float rad) { float vec[7][2] = {{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}}; + {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; int a; /* mult */ @@ -147,7 +147,7 @@ static void round_box_shade_col(const float col1[3], float const col2[3], const void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown) { float vec[7][2] = {{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}}; + {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; const float div = maxy - miny; const float idiv = 1.0f / div; float coltop[3], coldown[3], color[4]; @@ -256,7 +256,7 @@ void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float float rad, float shadeLeft, float shadeRight) { float vec[7][2] = {{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}}; + {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; const float div = maxx - minx; const float idiv = 1.0f / div; float colLeft[3], colRight[3], color[4]; diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 4f0274fbd46..cfd09196970 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -5751,7 +5751,8 @@ static int ui_handle_list_event(bContext *C, wmEvent *event, ARegion *ar) Panel *pa = but->block->panel; if (ELEM(event->type, UPARROWKEY, DOWNARROWKEY) || - ((ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE) && event->alt))) { + ((ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE) && event->alt))) + { /* activate up/down the list */ value = RNA_property_int_get(&but->rnapoin, but->rnaprop); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index fe7a4e85418..42c6bfc3870 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -127,8 +127,11 @@ typedef struct uiWidgetType { /* *********************** draw data ************************** */ -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 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} +}; #define WIDGET_AA_JITTER 8 static float jit[WIDGET_AA_JITTER][2] = { diff --git a/source/blender/editors/mesh/editmesh_rip.c b/source/blender/editors/mesh/editmesh_rip.c index b74e8797d72..e3963918e99 100644 --- a/source/blender/editors/mesh/editmesh_rip.c +++ b/source/blender/editors/mesh/editmesh_rip.c @@ -348,7 +348,8 @@ static int edbm_rip_call_edgesplit(BMEditMesh *em, wmOperator *op) BMOperator bmop; if (!EDBM_op_init(em, &bmop, op, "edgesplit edges=%he verts=%hv use_verts=%b", - BM_ELEM_TAG, BM_ELEM_SELECT, TRUE)) { + BM_ELEM_TAG, BM_ELEM_SELECT, TRUE)) + { return FALSE; } BMO_op_exec(em->bm, &bmop); diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index dc0a1a98b2d..58e07b51a25 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -931,23 +931,16 @@ static int edbm_loop_multiselect_exec(bContext *C, wmOperator *op) BMIter iter; int totedgesel = 0; - for (eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL); - eed; eed = BM_iter_step(&iter)) { - + BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { totedgesel++; } } - edarray = MEM_mallocN(sizeof(BMEdge *) * totedgesel, "edge array"); edindex = 0; - for (eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL); - eed; - eed = BM_iter_step(&iter)) - { - + BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { edarray[edindex] = eed; edindex++; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 1b3e4adff3a..e5a85fed8f4 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3534,8 +3534,7 @@ static int edbm_select_by_number_vertices_exec(bContext *C, wmOperator *op) int numverts = RNA_int_get(op->ptr, "number"); int type = RNA_enum_get(op->ptr, "type"); - for (efa = BM_iter_new(&iter, em->bm, BM_FACES_OF_MESH, NULL); - efa; efa = BM_iter_step(&iter)) { + BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { int select = 0; @@ -3598,17 +3597,13 @@ static int edbm_select_loose_verts_exec(bContext *C, wmOperator *UNUSED(op)) BMEdge *eed; BMIter iter; - for (eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL); - eve; eve = BM_iter_step(&iter)) { - + BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (!eve->e) { BM_vert_select_set(em->bm, eve, TRUE); } } - for (eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL); - eed; eed = BM_iter_step(&iter)) { - + BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) { if (!eed->l) { BM_edge_select_set(em->bm, eed, TRUE); } diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 1437081c9d7..47748fbd53b 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -45,6 +45,7 @@ #include "BLI_math.h" #include "BLI_listbase.h" #include "BLI_string.h" +#include "BLI_string_utf8.h" #include "BLI_path_util.h" #include "BLI_utildefines.h" @@ -125,8 +126,9 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc else BLI_addtail(&ob->modifiers, new_md); - if (name) + if (name) { BLI_strncpy_utf8(new_md->name, name, sizeof(new_md->name)); + } /* make sure modifier data has unique name */ @@ -223,7 +225,8 @@ static int object_modifier_remove(Object *ob, ModifierData *md, int *sort_depsgr } if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) && - ob->particlesystem.first == NULL) { + ob->particlesystem.first == NULL) + { ob->mode &= ~OB_MODE_PARTICLE_EDIT; } diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 3a932b58fd9..fa86f089387 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -506,7 +506,7 @@ static short select_grouped_siblings(bContext *C, Object *ob) CTX_DATA_BEGIN (C, Base *, base, selectable_bases) { - if ((base->object->parent == ob->parent) && !(base->flag & SELECT)) { + if ((base->object->parent == ob->parent) && !(base->flag & SELECT)) { ED_base_object_select(base, BA_SELECT); changed = 1; } diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c index ebc255f4e43..b5d44676cf6 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.c +++ b/source/blender/editors/sculpt_paint/paint_cursor.c @@ -342,7 +342,8 @@ static int sculpt_get_brush_geometry(bContext *C, ViewContext *vc, window[1] = y + vc->ar->winrct.ymin; if (vc->obact->sculpt && vc->obact->sculpt->pbvh && - sculpt_stroke_get_location(C, location, window)) { + sculpt_stroke_get_location(C, location, window)) + { *pixel_radius = project_brush_radius(vc, BKE_brush_unprojected_radius_get(scene, brush), diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index d5c7b66f695..e6ef3001eeb 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -2131,7 +2131,9 @@ static void project_bucket_clip_face( /* remove doubles */ /* first/last check */ - if (fabsf(isectVCosSS[0][0] - isectVCosSS[(*tot) - 1][0]) < PROJ_GEOM_TOLERANCE && fabsf(isectVCosSS[0][1] - isectVCosSS[(*tot) - 1][1]) < PROJ_GEOM_TOLERANCE) { + if (fabsf(isectVCosSS[0][0] - isectVCosSS[(*tot) - 1][0]) < PROJ_GEOM_TOLERANCE && + fabsf(isectVCosSS[0][1] - isectVCosSS[(*tot) - 1][1]) < PROJ_GEOM_TOLERANCE) + { (*tot)--; } diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 368729723eb..23d1c0090a0 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -225,7 +225,8 @@ static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, c brush = brush->id.next ? brush->id.next : bmain->brush.first) { if ((brush->ob_mode & ob_mode) && - (brush_tool(brush, tool_offset) == tool)) { + (brush_tool(brush, tool_offset) == tool)) + { return brush; } } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 6773d50d95d..aea29c2d166 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -350,7 +350,8 @@ static int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d, bb_max, ar, rv3d, - ob)) { + ob)) + { return 0; } @@ -2776,7 +2777,8 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush) } if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_MASK) && - brush->autosmooth_factor > 0) { + brush->autosmooth_factor > 0) + { if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) { smooth(sd, ob, nodes, totnode, brush->autosmooth_factor * (1 - ss->cache->pressure), FALSE); } @@ -3196,7 +3198,8 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss) for (md = ob->modifiers.first; md; md = md->next) { if (md->type == eModifierType_Mirror && - (md->mode & eModifierMode_Realtime)) { + (md->mode & eModifierMode_Realtime)) + { MirrorModifierData *mmd = (MirrorModifierData *)md; if (mmd->flag & MOD_MIR_CLIPPING) { @@ -3355,7 +3358,8 @@ static void sculpt_update_brush_delta(Sculpt *sd, Object *ob, Brush *brush) if (ELEM5(tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_NUDGE, SCULPT_TOOL_CLAY_STRIPS, SCULPT_TOOL_SNAKE_HOOK, - SCULPT_TOOL_THUMB)) { + SCULPT_TOOL_THUMB)) + { float grab_location[3], imat[4][4], delta[3], loc[3]; if (cache->first_time) { diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index 117e599cbbb..5131b728646 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -381,7 +381,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_FINISHED; default: - if (event->type == vpd->event_type && event->val == KM_RELEASE) { + if (event->type == vpd->event_type && event->val == KM_RELEASE) { view_pan_exit(C, op, 0); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index b17ca5ee319..b0818d40e53 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -300,8 +300,9 @@ FileSelection ED_fileselect_layout_offset_rect(FileLayout* layout, const rcti* r colmax = (rect->xmax)/(layout->tile_w + 2*layout->tile_border_x); rowmax = (rect->ymax)/(layout->tile_h + 2*layout->tile_border_y); - if ( is_inside(colmin, rowmin, layout->columns, layout->rows) || - is_inside(colmax, rowmax, layout->columns, layout->rows) ) { + if (is_inside(colmin, rowmin, layout->columns, layout->rows) || + is_inside(colmax, rowmax, layout->columns, layout->rows) ) + { CLAMP(colmin, 0, layout->columns-1); CLAMP(rowmin, 0, layout->rows-1); CLAMP(colmax, 0, layout->columns-1); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index e2ab5ea64e4..31389bcb20c 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -313,7 +313,7 @@ static int image_view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) image_view_pan_exec(C, op); break; default: - if (event->type == vpd->event_type && event->val == KM_RELEASE) { + if (event->type == vpd->event_type && event->val == KM_RELEASE) { image_view_pan_exit(C, op, 0); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index bf0d940c049..dd21fca93ce 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -842,7 +842,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf } /* 2nd case: select cont when act selected */ - if ((scavisflag & BUTS_CONT_LINK) && (ob->scavisflag & OB_VIS_CONT)==0) { + if ((scavisflag & BUTS_CONT_LINK) && (ob->scavisflag & OB_VIS_CONT)==0) { cont= ob->controllers.first; while (cont) { for (a=0; atotlinks; a++) { @@ -878,7 +878,7 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf } /* 4th case: select actuator when controller selected */ - if ( (scavisflag & (BUTS_ACT_LINK|BUTS_ACT_STATE)) && (ob->scavisflag & OB_VIS_CONT)) { + if ( (scavisflag & (BUTS_ACT_LINK|BUTS_ACT_STATE)) && (ob->scavisflag & OB_VIS_CONT)) { cont= ob->controllers.first; while (cont) { for (a=0; atotlinks; a++) { @@ -5070,8 +5070,8 @@ void logic_buttons(bContext *C, ARegion *ar) if (!(slogic->scaflag & BUTS_ACT_STATE) || !(act->flag & ACT_LINKED) || /* always display actuators without links so that is can be edited */ (act->flag & ACT_VISIBLE) || /* this actuator has visible connection, display it */ - (act->flag & ACT_PIN && slogic->scaflag & BUTS_ACT_STATE)) { - + (act->flag & ACT_PIN && slogic->scaflag & BUTS_ACT_STATE)) + { pin = (slogic->scaflag & BUTS_ACT_STATE && (act->flag & SENS_SHOW || act->flag & SENS_PIN)) ? 1 : 0; act->flag |= ACT_VISIBLE; /* mark the actuator as visible to help implementing the up/down action */ diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 49fadf300e2..392e7793a0f 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -367,7 +367,8 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire /* draw! */ if (seq->type < SEQ_EFFECT || - get_sequence_effect_num_inputs(seq->type) == 0) { + get_sequence_effect_num_inputs(seq->type) == 0) + { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 2d1ba69cdd3..2543b49a48d 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1365,8 +1365,8 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) /* see reassigning would create a cycle */ if (seq_is_predecessor(seq1, last_seq) || seq_is_predecessor(seq2, last_seq) || - seq_is_predecessor(seq3, last_seq) - ) { + seq_is_predecessor(seq3, last_seq)) + { BKE_report(op->reports, RPT_ERROR, "Can't reassign inputs: no cycles allowed"); return OPERATOR_CANCELLED; } @@ -2109,8 +2109,8 @@ static int sequencer_view_all_preview_exec(bContext *C, wmOperator *UNUSED(op)) imgwidth = (int)(imgwidth * (scene->r.xasp / scene->r.yasp)); if (((imgwidth >= width) || (imgheight >= height)) && - ((width > 0) && (height > 0))) { - + ((width > 0) && (height > 0))) + { /* Find the zoom value that will fit the image in the image space */ zoomX = ((float)width) / ((float)imgwidth); zoomY = ((float)height) / ((float)imgheight); diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c index ffb686b6810..463a262c09c 100644 --- a/source/blender/editors/space_text/text_draw.c +++ b/source/blender/editors/space_text/text_draw.c @@ -1174,7 +1174,7 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll, rcti *back) /* push hl start down */ hlstart = barstart + barheight; } - else if (lhlend > st->top && lhlstart < st->top && hlstart > barstart) { + else if (lhlend > st->top && lhlstart < st->top && hlstart > barstart) { /*fill out start */ hlstart = barstart; } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 111af7fb914..000f81a4f32 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -3246,7 +3246,8 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, } if ((G.debug & G_DEBUG) && (me->drawflag & ME_DRAWEXTRA_INDICES) && - !(v3d->flag2 & V3D_RENDER_OVERRIDE)) { + !(v3d->flag2 & V3D_RENDER_OVERRIDE)) + { draw_em_indices(em); } } diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index f63116a1f60..33141bb6abb 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1296,7 +1296,8 @@ static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d) /* do nothing */ } else if (scene->obedit && v3d->drawtype > OB_WIRE && - (v3d->flag & V3D_ZBUF_SELECT)) { + (v3d->flag & V3D_ZBUF_SELECT)) + { /* do nothing */ } else { @@ -2734,8 +2735,8 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar) } #endif - /* is this more then half a frame behind? */ - if (fps + 0.5f < (float)(FPS)) { + /* is this more then half a frame behind? */ + if (fps + 0.5f < (float)(FPS)) { UI_ThemeColor(TH_REDALERT); BLI_snprintf(printable, sizeof(printable), "fps: %.2f", fps); } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index b0a4f5bbfde..d1aa29d196d 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -3096,7 +3096,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short /* rotation */ if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself /* euler or quaternion? */ - if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) { + if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) { mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL); mat3_to_quat(quat, fmat); // Actual transform diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 4d20346f79d..2b111190b93 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1393,10 +1393,10 @@ static void createTransCurveVerts(bContext *C, TransInfo *t) if (bezt->hide==0) { TransDataCurveHandleFlags *hdata = NULL; - if ( propmode || - ((bezt->f2 & SELECT) && hide_handles) || - ((bezt->f1 & SELECT) && hide_handles == 0) - ) { + if (propmode || + ((bezt->f2 & SELECT) && hide_handles) || + ((bezt->f1 & SELECT) && hide_handles == 0)) + { copy_v3_v3(td->iloc, bezt->vec[0]); td->loc= bezt->vec[0]; copy_v3_v3(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:0]); @@ -1455,10 +1455,10 @@ static void createTransCurveVerts(bContext *C, TransInfo *t) count++; tail++; } - if ( propmode || - ((bezt->f2 & SELECT) && hide_handles) || - ((bezt->f3 & SELECT) && hide_handles == 0) - ) { + if (propmode || + ((bezt->f2 & SELECT) && hide_handles) || + ((bezt->f3 & SELECT) && hide_handles == 0)) + { copy_v3_v3(td->iloc, bezt->vec[2]); td->loc= bezt->vec[2]; copy_v3_v3(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:2]); @@ -4438,7 +4438,7 @@ static void set_trans_object_base_flags(TransInfo *t) if (parsel) { /* rotation around local centers are allowed to propagate */ - if ((t->mode == TFM_ROTATION || t->mode == TFM_TRACKBALL) && t->around == V3D_LOCAL) { + if ((t->mode == TFM_ROTATION || t->mode == TFM_TRACKBALL) && t->around == V3D_LOCAL) { base->flag |= BA_TRANSFORM_CHILD; } else { @@ -4487,7 +4487,7 @@ static int count_proportional_objects(TransInfo *t) Base *base; /* rotations around local centers are allowed to propagate, so we take all objects */ - if (!((t->mode == TFM_ROTATION || t->mode == TFM_TRACKBALL) && t->around == V3D_LOCAL)) { + if (!((t->mode == TFM_ROTATION || t->mode == TFM_TRACKBALL) && t->around == V3D_LOCAL)) { /* mark all parents */ for (base= scene->base.first; base; base= base->next) { if (TESTBASELIB_BGMODE(v3d, scene, base)) { diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 75d5efca21f..137d0838587 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -323,7 +323,7 @@ void applySnapping(TransInfo *t, float *vec) // Time base quirky code to go around findnearest slowness /* !TODO! add exception for object mode, no need to slow it down then */ - if (current - t->tsnap.last >= 0.01) { + if (current - t->tsnap.last >= 0.01) { t->tsnap.calcSnap(t, vec); t->tsnap.targetSnap(t); @@ -1066,7 +1066,7 @@ static int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], fl project_int(ar, location, screen_loc); new_dist = abs(screen_loc[0] - (int)mval[0]) + abs(screen_loc[1] - (int)mval[1]); - if (new_dist <= *dist && new_depth < *depth) { + if (new_dist <= *dist && new_depth < *depth) { *depth = new_depth; retval = 1; diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index a4227d92e27..53331dbe079 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -2490,7 +2490,8 @@ static int border_select_exec(bContext *C, wmOperator *op) } else if (pinned) { if ((luv->flag & MLOOPUV_PINNED) && - BLI_in_rctf(&rectf, luv->uv[0], luv->uv[1])) { + BLI_in_rctf(&rectf, luv->uv[0], luv->uv[1])) + { if (select) uvedit_uv_select_enable(em, scene, l, FALSE); else uvedit_uv_select_disable(em, scene, l); } diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c index 872f959b8a2..43f3e81ae92 100644 --- a/source/blender/editors/uvedit/uvedit_smart_stitch.c +++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c @@ -319,7 +319,7 @@ static void stitch_calculate_island_snapping(StitchState *state, PreviewPosition int i; UvElement *element; - for (i = 0; i < state->element_map->totalIslands; i++) { + for (i = 0; i < state->element_map->totalIslands; i++) { if (island_stitch_data[i].addedForPreview) { int numOfIslandUVs = 0, j; @@ -649,7 +649,7 @@ static int stitch_process_data(StitchState *state, Scene *scene, int final) * Setup preview for stitchable islands * *****************************************/ if (state->snap_islands) { - for (i = 0; i < state->element_map->totalIslands; i++) { + for (i = 0; i < state->element_map->totalIslands; i++) { if (island_stitch_data[i].addedForPreview) { int numOfIslandUVs = 0, j; UvElement *element; diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 899f4afb903..6538da2eb61 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -449,8 +449,8 @@ int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int /* if tiling mode or repeat changed, change texture matrix to fit */ if (GTS.tilemode!=GTS.curtilemode || GTS.curtileXRep!=GTS.tileXRep || - GTS.curtileYRep != GTS.tileYRep) { - + GTS.curtileYRep != GTS.tileYRep) + { glMatrixMode(GL_TEXTURE); glLoadIdentity(); diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 5918cf99d12..4cb868a9fea 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -539,7 +539,8 @@ static void add_to_diffuse(GPUMaterial *mat, Material *ma, GPUShadeInput *shi, G GPUNodeLink *fac, *tmp, *addcol; if (!(mat->scene->gm.flag & GAME_GLSL_NO_RAMPS) && - ma->ramp_col && (ma->mode & MA_RAMP_COL)) { + ma->ramp_col && (ma->mode & MA_RAMP_COL)) + { /* MA_RAMP_IN_RESULT is exceptional */ if (ma->rampin_col==MA_RAMP_IN_RESULT) { addcol = shi->rgb; @@ -579,7 +580,8 @@ static void ramp_spec_result(GPUShadeInput *shi, GPUNodeLink **spec) GPUNodeLink *fac; if (!(mat->scene->gm.flag & GAME_GLSL_NO_RAMPS) && - ma->ramp_spec && ma->rampin_spec==MA_RAMP_IN_RESULT) { + ma->ramp_spec && ma->rampin_spec==MA_RAMP_IN_RESULT) + { GPU_link(mat, "ramp_rgbtobw", *spec, &fac); /* colorband + blend */ @@ -775,7 +777,8 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la if (mat->scene->gm.flag & GAME_GLSL_NO_SHADERS); else if (!(lamp->mode & LA_NO_SPEC) && !(lamp->mode & LA_ONLYSHADOW) && - (GPU_link_changed(shi->spec) || ma->spec != 0.0f)) { + (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, lcol, shi->specrgb, &outcol); diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index a0856533335..b702e59bc16 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -603,14 +603,14 @@ static int startffmpeg(struct anim *anim) #ifdef FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT /* Try do detect if input has 0-255 YCbCR range (JFIF Jpeg MotionJpeg) */ if (!sws_getColorspaceDetails(anim->img_convert_ctx, (int **)&inv_table, &srcRange, - &table, &dstRange, &brightness, &contrast, &saturation)) { - + &table, &dstRange, &brightness, &contrast, &saturation)) + { srcRange = srcRange || anim->pCodecCtx->color_range == AVCOL_RANGE_JPEG; inv_table = sws_getCoefficients(anim->pCodecCtx->colorspace); if (sws_setColorspaceDetails(anim->img_convert_ctx, (int *)inv_table, srcRange, - table, dstRange, brightness, contrast, saturation)) { - + table, dstRange, brightness, contrast, saturation)) + { printf("Warning: Could not set libswscale colorspace details.\n"); } } @@ -940,7 +940,8 @@ static ImBuf *ffmpeg_fetchibuf(struct anim *anim, int position, (long long int)pts_to_search, pts_time_base, frame_rate, st_time); if (anim->last_frame && - anim->last_pts <= pts_to_search && anim->next_pts > pts_to_search) { + anim->last_pts <= pts_to_search && anim->next_pts > pts_to_search) + { av_log(anim->pFormatCtx, AV_LOG_DEBUG, "FETCH: frame repeat: last: %lld next: %lld\n", (long long int)anim->last_pts, diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp index 3966135ea32..438988fbe48 100644 --- a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp +++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp @@ -1507,7 +1507,7 @@ void DirectDrawSurface::printInfo() const printf("\tMisc flag: %u\n", header.header10.miscFlag); printf("\tArray size: %u\n", header.header10.arraySize); } - + if (header.reserved[9] == FOURCC_NVTT) { int major = (header.reserved[10] >> 16) & 0xFF; diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index 30142e5f5d5..a0434691807 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -339,8 +339,9 @@ static int check_pixel_assigned(const void *buffer, const char *mask, const int if (mask != NULL) { res = mask[index] != 0 ? 1 : 0; } - else if ( (is_float && ((const float *) buffer)[alpha_index] != 0.0f) || - (!is_float && ((const unsigned char *) buffer)[alpha_index] != 0) ) { + else if ((is_float && ((const float *) buffer)[alpha_index] != 0.0f) || + (!is_float && ((const unsigned char *) buffer)[alpha_index] != 0) ) + { res = 1; } } diff --git a/source/blender/imbuf/intern/indexer_dv.c b/source/blender/imbuf/intern/indexer_dv.c index 460ca93435e..0090577062f 100644 --- a/source/blender/imbuf/intern/indexer_dv.c +++ b/source/blender/imbuf/intern/indexer_dv.c @@ -269,7 +269,8 @@ static void fill_gap(indexer_dv_context *This, int isPAL) } while (This->gap_start != This->ref_time_read || - This->gap_frame != This->curr_frame) { + This->gap_frame != This->curr_frame) + { inc_frame(&This->gap_frame, &This->gap_start, isPAL); This->frameno_offset++; } @@ -320,7 +321,7 @@ static void proc_frame(indexer_dv_context *This, This->gap_frame = -1; } } - else if (This->ref_time_read_new == This->ref_time_read) { + else if (This->ref_time_read_new == This->ref_time_read) { // do nothing } else { diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 2178b6a4155..556ec64e59a 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -819,7 +819,8 @@ int imb_savetiff(ImBuf *ibuf, const char *name, int flags) TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); if (TIFFWriteEncodedStrip(image, 0, (bitspersample == 16) ? (unsigned char *)pixels16 : pixels, - ibuf->x * ibuf->y * samplesperpixel * bitspersample / 8) == -1) { + ibuf->x * ibuf->y * samplesperpixel * bitspersample / 8) == -1) + { fprintf(stderr, "imb_savetiff: Could not write encoded TIFF.\n"); TIFFClose(image); diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index 4820347f048..a86e2bed0e5 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -188,9 +188,9 @@ static int IMB_ispic_name(const char *name) int IMB_ispic(const char *filename) { if (U.uiflag & USER_FILTERFILEEXTS) { - if ( (BLI_testextensie_array(filename, imb_ext_image)) || - (G.have_quicktime && BLI_testextensie_array(filename, imb_ext_image_qt)) - ) { + if ((BLI_testextensie_array(filename, imb_ext_image)) || + (G.have_quicktime && BLI_testextensie_array(filename, imb_ext_image_qt))) + { return IMB_ispic_name(filename); } else { diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index 80c80d02e06..231dd521f07 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -952,7 +952,7 @@ static void reconstruct_struct(SDNA *newsdna, SDNA *oldsdna, elen = elementsize(newsdna, spc[0], spc[1]); /* test: is type a struct? */ - if (spc[0] >= firststructtypenr && !ispointer(name)) { + if (spc[0] >= firststructtypenr && !ispointer(name)) { /* where does the old struct data start (and is there an old one?) */ cpo = find_elem(oldsdna, type, name, spo, data, &sppo); @@ -1020,7 +1020,7 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data) elen = elementsize(oldsdna, spc[0], spc[1]); /* test: is type a struct? */ - if (spc[0] >= firststructtypenr && !ispointer(name)) { + if (spc[0] >= firststructtypenr && !ispointer(name)) { /* where does the old data start (is there one?) */ cpo = find_elem(oldsdna, type, name, spo, data, NULL); if (cpo) { diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index d148182cce7..fa6b5556565 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -420,7 +420,8 @@ static const char *rna_parameter_type_name(PropertyRNA *parm) return type; switch (parm->type) { - case PROP_POINTER: { + case PROP_POINTER: + { PointerPropertyRNA *pparm = (PointerPropertyRNA *)parm; if (parm->flag & PROP_RNAPTR) @@ -428,7 +429,8 @@ static const char *rna_parameter_type_name(PropertyRNA *parm) else return rna_find_dna_type((const char *)pparm->type); } - case PROP_COLLECTION: { + case PROP_COLLECTION: + { return "ListBase"; } default: diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 70f6afd664d..7676f4a5866 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -4793,7 +4793,8 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop) BLI_dynstr_append(dynstr, "["); for (RNA_property_collection_begin(ptr, prop, &collect_iter); collect_iter.valid; - RNA_property_collection_next(&collect_iter)) { + RNA_property_collection_next(&collect_iter)) + { PointerRNA itemptr = collect_iter.ptr; if (first_time == 0) diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c index a38c769c26a..4bfcabc935b 100644 --- a/source/blender/makesrna/intern/rna_dynamicpaint.c +++ b/source/blender/makesrna/intern/rna_dynamicpaint.c @@ -243,7 +243,8 @@ static EnumPropertyItem *rna_DynamicPaint_surface_type_itemf(bContext *C, Pointe /* Displace */ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX || - surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) { + surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) + { tmp.value = MOD_DPAINT_SURFACE_T_DISPLACE; tmp.identifier = "DISPLACE"; tmp.name = "Displace"; diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 4d7ecc9350f..a3e538da9b1 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -411,7 +411,8 @@ void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], fl hit.index = -1; if (BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_nor, 0.0f, &hit, - treeData.raycast_callback, &treeData) != -1) { + treeData.raycast_callback, &treeData) != -1) + { if (hit.dist <= dist) { copy_v3_v3(r_location, hit.co); copy_v3_v3(r_normal, hit.no); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index f907e2f45b3..c6c97fa9979 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2326,7 +2326,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem aasamples_items[] = { + static EnumPropertyItem aasamples_items[] = { {0, "SAMPLES_0", 0, "Off", ""}, {2, "SAMPLES_2", 0, "2x", ""}, {4, "SAMPLES_4", 0, "4x", ""}, diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index eaddcc92a92..e88eee5d64c 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -2792,7 +2792,7 @@ static void rna_def_userdef_system(BlenderRNA *brna) {0, NULL, 0, NULL, NULL} }; - static EnumPropertyItem anisotropic_items[] = { + static EnumPropertyItem anisotropic_items[] = { {1, "FILTER_0", 0, "Off", ""}, {2, "FILTER_2", 0, "2x", ""}, {4, "FILTER_4", 0, "4x", ""}, diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c index 159da9adfcf..7d7bfade9b7 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -78,12 +78,14 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) for (; surface; surface = surface->next) { /* tface */ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ || - surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) { + surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) + { dataMask |= (1 << CD_MTFACE); } /* mcol */ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT || - surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) { + surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) + { dataMask |= (1 << CD_MCOL); } /* CD_MDEFORMVERT */ diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 942e0fce2f7..1c0040aec89 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -3184,7 +3184,7 @@ void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ } /* trick so we can ensure all items have the same mesh, * and allows us to pass the 'bm' as NULL. */ - else if (do_bm_check && (bm && bm != item->bm)) { + else if (do_bm_check && (bm && bm != item->bm)) { PyErr_Format(PyExc_ValueError, "%s: %d %s is from another mesh", error_prefix, i, BPy_BMElem_StringFromHType(htype)); diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index 9fd120b11aa..15eeb5934d8 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -277,7 +277,7 @@ static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item) IDProperty *idprop; const char *name; - if (self->prop->type != IDP_GROUP) { + if (self->prop->type != IDP_GROUP) { PyErr_SetString(PyExc_TypeError, "unsubscriptable object"); return NULL; } @@ -483,7 +483,7 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *name_obj, IDProperty int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val) { - if (prop->type != IDP_GROUP) { + if (prop->type != IDP_GROUP) { PyErr_SetString(PyExc_TypeError, "unsubscriptable object"); return -1; } diff --git a/source/blender/python/intern/bpy_library.c b/source/blender/python/intern/bpy_library.c index a5350b984c1..1d02acbe983 100644 --- a/source/blender/python/intern/bpy_library.c +++ b/source/blender/python/intern/bpy_library.c @@ -291,7 +291,8 @@ static void bpy_lib_exit_warn_idname(BPy_Library *self, const char *name_plural, PyErr_Fetch(&exc, &val, &tb); if (PyErr_WarnFormat(PyExc_UserWarning, 1, "load: '%s' does not contain %s[\"%s\"]", - self->abspath, name_plural, idname)) { + self->abspath, name_plural, idname)) + { /* Spurious errors can appear at shutdown */ if (PyErr_ExceptionMatches(PyExc_Warning)) { PyErr_WriteUnraisable((PyObject *)self); @@ -306,7 +307,8 @@ static void bpy_lib_exit_warn_type(BPy_Library *self, PyObject *item) PyErr_Fetch(&exc, &val, &tb); if (PyErr_WarnFormat(PyExc_UserWarning, 1, "load: '%s' expected a string type, not a %.200s", - self->abspath, Py_TYPE(item)->tp_name)) { + self->abspath, Py_TYPE(item)->tp_name)) + { /* Spurious errors can appear at shutdown */ if (PyErr_ExceptionMatches(PyExc_Warning)) { PyErr_WriteUnraisable((PyObject *)self); diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 8f5a9fec86b..10562271941 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -389,7 +389,7 @@ static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value) return NULL; } ot = WM_operatortype_find(opname, TRUE); - if (ot == NULL) { + if (ot == NULL) { PyErr_Format(PyExc_KeyError, "_bpy.ops.get_rna(\"%s\") not found", opname); return NULL; } diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c index d1da4660f3b..5ac1214409f 100644 --- a/source/blender/python/mathutils/mathutils_Quaternion.c +++ b/source/blender/python/mathutils/mathutils_Quaternion.c @@ -196,7 +196,8 @@ static PyObject *Quaternion_cross(QuaternionObject *self, PyObject *value) return NULL; if (mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, - "Quaternion.cross(other), invalid 'other' arg") == -1) { + "Quaternion.cross(other), invalid 'other' arg") == -1) + { return NULL; } diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c index a071c0be611..ab1192bfdfc 100644 --- a/source/blender/quicktime/apple/quicktime_export.c +++ b/source/blender/quicktime/apple/quicktime_export.c @@ -707,8 +707,8 @@ void quicktime_verify_image_type(RenderData *rd, ImageFormatData *imf) if (imf->imtype == R_IMF_IMTYPE_QUICKTIME) { if ((rd->qtcodecsettings.codecType == 0) || (rd->qtcodecsettings.codecSpatialQuality < 0) || - (rd->qtcodecsettings.codecSpatialQuality > 100)) { - + (rd->qtcodecsettings.codecSpatialQuality > 100)) + { rd->qtcodecsettings.codecType = kJPEGCodecType; rd->qtcodecsettings.codec = (int)anyCodec; rd->qtcodecsettings.codecSpatialQuality = (codecHighQuality * 100) / codecLosslessQuality; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 7549207af87..170d2efd60c 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -450,7 +450,8 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer * } if (re->rectx < 2 || re->recty < 2 || (BKE_imtype_is_movie(rd->im_format.imtype) && - (re->rectx < 16 || re->recty < 16) )) { + (re->rectx < 16 || re->recty < 16) )) + { BKE_report(re->reports, RPT_ERROR, "Image too small"); re->ok= 0; return; @@ -1833,7 +1834,8 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r if (scene->r.mode & R_BORDER) { if (scene->r.border.xmax <= scene->r.border.xmin || - scene->r.border.ymax <= scene->r.border.ymin) { + scene->r.border.ymax <= scene->r.border.ymin) + { BKE_report(reports, RPT_ERROR, "No border area selected."); return 0; } @@ -2376,7 +2378,7 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char { ImBuf *ibuf = IMB_loadiffname(filename, IB_rect); - if (ibuf && (ibuf->rect || ibuf->rect_float)) { + if (ibuf && (ibuf->rect || ibuf->rect_float)) { if (ibuf->x == layer->rectx && ibuf->y == layer->recty) { if (ibuf->rect_float==NULL) IMB_float_from_rect(ibuf); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 556ca6b5995..ad147d6d19d 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1539,7 +1539,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa /* a bit weak, might become arg for WM_event_fileselect? */ /* XXX also extension code in image-save doesnt work for this yet */ if (RNA_struct_find_property(handler->op->ptr, "check_existing") && - RNA_boolean_get(handler->op->ptr, "check_existing")) { + RNA_boolean_get(handler->op->ptr, "check_existing")) + { char *path = RNA_string_get_alloc(handler->op->ptr, "filepath", NULL, 0); /* this gives ownership to pupmenu */ uiPupMenuSaveOver(C, handler->op, (path) ? path : ""); @@ -2612,7 +2613,8 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi if (owin != win) { if (mx - owin->posx >= 0 && my - owin->posy >= 0 && - mx - owin->posx <= owin->sizex && my - owin->posy <= owin->sizey) { + mx - owin->posx <= owin->sizex && my - owin->posy <= owin->sizey) + { evt->x = mx - (int)owin->posx; evt->y = my - (int)owin->posy; diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 22d1cbe5e11..18caa8c2afe 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -785,8 +785,8 @@ char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len) if (kmi->shift == KM_ANY && kmi->ctrl == KM_ANY && kmi->alt == KM_ANY && - kmi->oskey == KM_ANY) { - + kmi->oskey == KM_ANY) + { strcat(buf, "Any "); } else { diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index b613aab32fc..d7cfe6c5544 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -3216,7 +3216,8 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, wmOperator *op, PropertyType prop_type = RNA_property_type(*r_prop); if (((flags & RC_PROP_REQUIRE_BOOL) && (prop_type != PROP_BOOLEAN)) || - ((flags & RC_PROP_REQUIRE_FLOAT) && prop_type != PROP_FLOAT)) { + ((flags & RC_PROP_REQUIRE_FLOAT) && prop_type != PROP_FLOAT)) + { MEM_freeN(str); BKE_reportf(op->reports, RPT_ERROR, "Property from path %s is not a float", name); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index f732edce20d..aa243edd96e 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -161,7 +161,7 @@ int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int o struct Material *RE_init_sample_material(struct Material *orig_mat, struct Scene *scene) {return (struct Material *)NULL;} void RE_free_sample_material(struct Material *mat) {} void RE_sample_material_color(struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3], - int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob) {} + int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob) {} /* nodes */ struct RenderResult *RE_GetResult(struct Render *re){return (struct RenderResult *) NULL;} @@ -507,13 +507,13 @@ void BPY_context_update(struct bContext *C){}; /* intern/dualcon */ struct DualConMesh; struct DualConMesh *dualcon(const struct DualConMesh *input_mesh, - void *create_mesh, - int flags, - int mode, - float threshold, - float hermite_num, - float scale, - int depth) {return 0;} + void *create_mesh, + int flags, + int mode, + float threshold, + float hermite_num, + float scale, + int depth) {return 0;} /* intern/cycles */ struct CCLDeviceInfo; diff --git a/source/gameengine/Converter/BL_MeshDeformer.cpp b/source/gameengine/Converter/BL_MeshDeformer.cpp index 682ff57be6b..c9371b9df50 100644 --- a/source/gameengine/Converter/BL_MeshDeformer.cpp +++ b/source/gameengine/Converter/BL_MeshDeformer.cpp @@ -54,7 +54,8 @@ bool BL_MeshDeformer::Apply(RAS_IPolyMaterial*) // only apply once per frame if the mesh is actually modified if (m_pMeshObject->MeshModified() && - m_lastDeformUpdate != m_gameobj->GetLastFrame()) { + m_lastDeformUpdate != m_gameobj->GetLastFrame()) + { // For each material for (list::iterator mit= m_pMeshObject->GetFirstMaterial(); mit != m_pMeshObject->GetLastMaterial(); ++ mit) { diff --git a/source/gameengine/GameLogic/SCA_IController.h b/source/gameengine/GameLogic/SCA_IController.h index 1b15547d898..656c4299dff 100644 --- a/source/gameengine/GameLogic/SCA_IController.h +++ b/source/gameengine/GameLogic/SCA_IController.h @@ -65,8 +65,8 @@ public: void UnlinkAllActuators(); void UnlinkActuator(class SCA_IActuator* actua); void UnlinkSensor(class SCA_ISensor* sensor); - void SetState(unsigned int state) { m_statemask = state; } - void ApplyState(unsigned int state); + void SetState(unsigned int state) { m_statemask = state; } + void ApplyState(unsigned int state); void Deactivate() { // the controller can only be part of a sensor m_newControllers list diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp index 4728729acb0..76b9a8df00f 100644 --- a/source/gameengine/GameLogic/SCA_ISensor.cpp +++ b/source/gameengine/GameLogic/SCA_ISensor.cpp @@ -101,8 +101,9 @@ bool SCA_ISensor::IsPositiveTrigger() } void SCA_ISensor::SetPulseMode(bool posmode, - bool negmode, - int freq) { + bool negmode, + int freq) +{ m_pos_pulsemode = posmode; m_neg_pulsemode = negmode; m_pulse_frequency = freq; diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h index a356b20ed1a..92ba6100359 100644 --- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h +++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h @@ -50,8 +50,10 @@ 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/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h index d6c9ddd9603..828ee01d150 100644 --- a/source/gameengine/Rasterizer/RAS_IRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h @@ -99,11 +99,11 @@ public: /** */ - enum { - RAS_RENDER_3DPOLYGON_TEXT = 64, /* GEMAT_TEXT */ - KX_BACKCULL = 16, /* GEMAT_BACKCULL */ - KX_TEX = 4096, /* GEMAT_TEX */ - KX_LINES = 32768 + enum { + RAS_RENDER_3DPOLYGON_TEXT = 64, /* GEMAT_TEXT */ + KX_BACKCULL = 16, /* GEMAT_BACKCULL */ + KX_TEX = 4096, /* GEMAT_TEX */ + KX_LINES = 32768 }; /** diff --git a/source/gameengine/SceneGraph/SG_Spatial.cpp b/source/gameengine/SceneGraph/SG_Spatial.cpp index b5b38fd3ba6..e026419ca67 100644 --- a/source/gameengine/SceneGraph/SG_Spatial.cpp +++ b/source/gameengine/SceneGraph/SG_Spatial.cpp @@ -112,8 +112,8 @@ SG_Spatial:: UpdateSpatialData( const SG_Spatial *parent, double time, - bool& parentUpdated - ) { + bool& parentUpdated) +{ bool bComputesWorldTransform = false; // update spatial controllers From deac41506fbba6040f89e578f0f4b8ba5c506bf8 Mon Sep 17 00:00:00 2001 From: Daniel Stokes Date: Sun, 20 May 2012 21:19:55 +0000 Subject: [PATCH 058/159] Fix #31511: GLSL preview is much darker than F12 results A problem caused by Harmony branch code. A value was being set improperly for the GLSL shader. --- source/blender/gpu/intern/gpu_material.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 4cb868a9fea..7ccb25e6cf6 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -708,7 +708,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la i = is; GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i); - GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), &lcol); + GPU_link(mat, "set_value", GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), &lcol); shade_light_textures(mat, lamp, &lcol); #if 0 From 3896ad4cbbd638956a072152baacd9c3554f913a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 20 May 2012 21:23:26 +0000 Subject: [PATCH 059/159] code cleanup: spelling --- source/blender/avi/intern/avi.c | 4 ++-- source/blender/blenlib/intern/math_rotation.c | 2 +- source/blender/bmesh/bmesh.h | 2 +- source/blender/bmesh/intern/bmesh_queries.c | 2 +- source/blender/editors/interface/interface_handlers.c | 2 +- source/blender/editors/mesh/editface.c | 2 +- source/blender/editors/mesh/editmesh_knife.c | 6 +++--- source/blender/editors/mesh/editmesh_rip.c | 4 ++-- source/blender/editors/mesh/editmesh_select.c | 2 +- source/blender/editors/mesh/editmesh_tools.c | 2 +- source/blender/editors/sculpt_paint/paint_image.c | 2 +- source/blender/editors/sculpt_paint/paint_vertex.c | 4 ++-- source/blender/editors/sculpt_paint/sculpt.c | 2 +- source/blender/editors/space_clip/clip_draw.c | 2 +- source/blender/editors/space_graph/graph_edit.c | 2 +- source/blender/editors/space_view3d/view3d_view.c | 2 +- source/blender/editors/transform/transform.c | 2 +- source/blender/editors/transform/transform_conversions.c | 2 +- source/blender/editors/transform/transform_input.c | 6 +++--- source/blender/makesdna/DNA_object_types.h | 2 +- source/blender/makesdna/intern/makesdna.c | 2 +- source/blender/makesrna/intern/rna_wm.c | 2 +- source/blender/python/intern/bpy_rna.c | 2 +- source/blender/render/intern/source/render_texture.c | 2 +- 24 files changed, 31 insertions(+), 31 deletions(-) diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 245f5d92e49..e00982bae72 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -831,8 +831,8 @@ AviError AVI_open_compress(char *name, AviMovie *movie, int streams, ...) if (movie->streams[i].sh.Type == FCC("vids")) { #if 0 if (movie->streams[i].format == AVI_FORMAT_MJPEG) { - movie->streams[i].sf = MEM_mallocN(sizeof(AviBitmapInfoHeader) - + sizeof(AviMJPEGUnknown), "moviestreamformatL"); + movie->streams[i].sf = MEM_mallocN(sizeof(AviBitmapInfoHeader) + + sizeof(AviMJPEGUnknown), "moviestreamformatL"); movie->streams[i].sf_size = sizeof(AviBitmapInfoHeader) + sizeof(AviMJPEGUnknown); } else { diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index 066c9e7cd15..f1e08993825 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -82,7 +82,7 @@ void mul_qt_qtqt(float q[4], const float q1[4], const float q2[4]) * \note: * Assumes a unit quaternion? * - * infact not, but you may wan't to use a unit quat, read on... + * in fact not, but you may wan't to use a unit quat, read on... * * Shortcut for 'q v q*' when \a v is actually a quaternion. * This removes the need for converting a vector to a quaternion, diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index 13926c42192..ac002070484 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -225,7 +225,7 @@ * * - face inset interpolate loop data from face (currently copies - but this stretches UV's in an ugly way) * - vert slide UV correction (like we have for edge slide) - * - fill-face edge net - produce consistant normals, currently it won't, fix should be to fill in edge-net node + * - fill-face edge net - produce consistent normals, currently it won't, fix should be to fill in edge-net node * connected with previous one - since they already check for normals of adjacent edge-faces before creating. */ diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 8628ed7f9a1..7df52cabe79 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -745,7 +745,7 @@ BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e) * BM_face_create_ngon() on an arbitrary array of verts, * though be sure to pick an edge which has a face. * - * \note This is infact quite a simple check, mainly include this function so the intent is more obvious. + * \note This is in fact quite a simple check, mainly include this function so the intent is more obvious. * We know these 2 verts will _always_ make up the loops edge */ void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2, diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index cfd09196970..428ddb3059f 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -1309,7 +1309,7 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho /* check if position is found */ if (cdist < x) { - /* check is previous location was infact closer */ + /* check is previous location was in fact closer */ if (((float)x - cdist) > (cdist_prev - (float)x)) { but->pos = pos_prev; } diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index c223c146b4b..3da2b4711f3 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -860,7 +860,7 @@ void ED_mesh_mirrtopo_init(Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_to } if (tot_unique <= tot_unique_prev) { - /* Finish searching for unique valus when 1 loop dosnt give a + /* Finish searching for unique values when 1 loop dosnt give a * higher number of unique values compared to the previous loop */ break; } diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c index a9ec893adb7..6bbcd1d253e 100644 --- a/source/blender/editors/mesh/editmesh_knife.c +++ b/source/blender/editors/mesh/editmesh_knife.c @@ -308,7 +308,7 @@ static KnifeVert *get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v) /** * get a KnifeEdge wrapper for an existing BMEdge - * \note #knife_get_face_kedges / #get_bm_knife_edge are called recusively - KEEP STACK MEM USAGE LOW */ + * \note #knife_get_face_kedges / #get_bm_knife_edge are called recursively - KEEP STACK MEM USAGE LOW */ static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e) { KnifeEdge *kfe = BLI_ghash_lookup(kcd->origedgemap, e); @@ -365,7 +365,7 @@ static void knife_start_cut(KnifeTool_OpData *kcd) } /** - * \note #knife_get_face_kedges / #get_bm_knife_edge are called recusively - KEEP STACK MEM USAGE LOW */ + * \note #knife_get_face_kedges / #get_bm_knife_edge are called recursively - KEEP STACK MEM USAGE LOW */ static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, BMFace *f) { ListBase *lst = BLI_ghash_lookup(kcd->kedgefacemap, f); @@ -889,7 +889,7 @@ static void knifetool_draw_angle_snapping(KnifeTool_OpData *kcd) static void knife_init_colors(KnifeColors *colors) { /* possible BMESH_TODO: add explicit themes or calculate these by - * figuring out constrasting colors with grid / edges / verts + * figuring out contrasting colors with grid / edges / verts * a la UI_make_axis_color */ UI_GetThemeColor3ubv(TH_NURB_VLINE, colors->line); UI_GetThemeColor3ubv(TH_NURB_ULINE, colors->edge); diff --git a/source/blender/editors/mesh/editmesh_rip.c b/source/blender/editors/mesh/editmesh_rip.c index e3963918e99..1bcd5cee111 100644 --- a/source/blender/editors/mesh/editmesh_rip.c +++ b/source/blender/editors/mesh/editmesh_rip.c @@ -139,7 +139,7 @@ static float edbm_rip_edge_side_measure(BMEdge *e, BMLoop *e_l, * connected edge loops. * The reason for using loops like this is because when the edges are split we don't which face user gets the newly * created edge (its as good as random so we cant assume new edges will be on once side). - * After splittingm, its very simple to walk along boundary loops since each only has one edge from a single side. + * After splitting, its very simple to walk along boundary loops since each only has one edge from a single side. * - The end loop pairs are stored in an array however to support multiple edge-selection-islands, so you can rip * multiple selections at once. * - * Execute the split * @@ -711,7 +711,7 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event) /* running in face mode hardly makes sense, so convert to region loop and rip */ if (em->bm->totfacesel) { - /* highly nifty but hard to sypport since the operator can fail and we're left + /* highly nifty but hard to support since the operator can fail and we're left * with modified selection */ // WM_operator_name_call(C, "MESH_OT_region_to_loop", WM_OP_INVOKE_DEFAULT, NULL); diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index 58e07b51a25..55f575bbdea 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -1270,7 +1270,7 @@ static int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, B * path found so far to edge n. The visitedhash will of course contain entries * for edges that have been visited, cost[n] will contain the length of the shortest * path to edge n found so far, Finally, heap is a priority heap which is built on the - * the same data as the cost arry, but inverted: it is a worklist of edges prioritized + * the same data as the cost array, but inverted: it is a worklist of edges prioritized * by the shortest path found so far to the edge. */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index e5a85fed8f4..507ed2de07f 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3962,7 +3962,7 @@ static void sort_bmelem_flag(bContext *C, const int types, const int flag, const else if (action == SRT_RANDOMIZE) { if (totelem[0]) { - /* Re-init random generator for each element type, to get consistant random when + /* Re-init random generator for each element type, to get consistent random when * enabling/disabling an element type. */ BLI_srandom(seed); pb = pblock[0] = MEM_callocN(sizeof(char) * totelem[0], "sort_bmelem vert pblock"); diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index e6ef3001eeb..88fb728f334 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -2342,7 +2342,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i /* Use tf_uv_pxoffset instead of tf->uv so we can offset the UV half a pixel - * this is done so we can avoid offseting all the pixels by 0.5 which causes + * this is done so we can avoid offsetting all the pixels by 0.5 which causes * problems when wrapping negative coords */ xhalfpx = (0.5f + (PROJ_GEOM_TOLERANCE / 3.0f) ) / ibuf_xf; yhalfpx = (0.5f + (PROJ_GEOM_TOLERANCE / 4.0f) ) / ibuf_yf; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index d544183ced8..7a9ebe9aec4 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1867,7 +1867,7 @@ static void do_weight_paint_vertex( * * So! just balance out the 2 weights, it keeps them equal and everything normalized. * - * While it wont hit the desired weight immediatelty as the user waggles their mouse, + * While it wont hit the desired weight immediately as the user waggles their mouse, * constant painting and re-normalizing will get there. this is also just simpler logic. * - campbell */ dw_mirr->weight = dw->weight = (dw_mirr->weight + dw->weight) * 0.5f; @@ -1952,7 +1952,7 @@ static void do_weight_paint_vertex( /* dv may have been altered greatly */ dw = defvert_find_index(dv, vgroup); #else - dw = NULL; /* UNUSED after assignment, set to NULL to ensuyre we don't + dw = NULL; /* UNUSED after assignment, set to NULL to ensure we don't * use again, we thats needed un-ifdef the line above */ (void)dw; /* quiet warnigns */ #endif diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index aea29c2d166..f5f8a790c55 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -2870,7 +2870,7 @@ static void sculpt_update_keyblock(Object *ob) SculptSession *ss = ob->sculpt; float (*vertCos)[3]; - /* Keyblock update happens after hadning deformation caused by modifiers, + /* Keyblock update happens after handling deformation caused by modifiers, * so ss->orig_cos would be updated with new stroke */ if (ss->orig_cos) vertCos = ss->orig_cos; else vertCos = BLI_pbvh_get_vertCos(ss->pbvh); diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index f92f639586d..c00359f0f32 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -263,7 +263,7 @@ static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf, } } - /* if texture buffers aren't efifciently supported or texture is too large to + /* if texture buffers aren't efficiently supported or texture is too large to * be binder fallback to simple draw pixels solution */ if (need_fallback) { /* set zoom */ diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 7371202b4fb..2d9a7baa213 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -2032,7 +2032,7 @@ static int graphkeys_smooth_exec(bContext *C, wmOperator *UNUSED(op)) /* smooth keyframes */ for (ale = anim_data.first; ale; ale = ale->next) { /* For now, we can only smooth by flattening handles AND smoothing curve values. - * Perhaps the mode argument could be removed, as that functionality is offerred through + * Perhaps the mode argument could be removed, as that functionality is offered through * Snap->Flatten Handles anyway. */ smooth_fcurve(ale->key_data); diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 95ae0ac971f..8fb012a18d6 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -142,7 +142,7 @@ void smooth_view(bContext *C, View3D *v3d, ARegion *ar, Object *oldcamera, Objec sms.to_camera = 0; /* note on camera locking, this is a little confusing but works ok. - * we may be changing the view 'as if' there is no active camera, but infact + * we may be changing the view 'as if' there is no active camera, but in fact * there is an active camera which is locked to the view. * * In the case where smooth view is moving _to_ a camera we don't want that diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index d1aa29d196d..cefc6837e5f 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4711,7 +4711,7 @@ void projectSVData(TransInfo *t, int final) /* BMESH_TODO, this interpolates between vertex/loops which are not moved * (are only apart of a face attached to a slide vert), couldn't we iterate BM_LOOPS_OF_VERT - * here and only iterpolate those? */ + * here and only interpolate those? */ BM_ITER_ELEM (f, &fiter, sv->v, BM_FACES_OF_VERT) { BMIter liter; BMLoop *l; diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 2b111190b93..1c974a963bd 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -3844,7 +3844,7 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count if (seq->type == SEQ_META) { /* Meta's can only directly be moved between channels since they * don't have their start and length set directly (children affect that) - * since this Meta is nested we don't need any of its data infact. + * since this Meta is nested we don't need any of its data in fact. * calc_sequence() will update its settings when run on the toplevel meta */ *flag= 0; *count= 0; diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index 5d5142740cb..f12961df0d9 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -88,10 +88,10 @@ static void InputSpringFlip(TransInfo *t, MouseInput *mi, const int mval[2], flo /* flip scale */ /* values can become really big when zoomed in so use longs [#26598] */ if ((long long int)(mi->center[0] - mval[0]) * (long long int)(mi->center[0] - mi->imval[0]) + - (long long int)(mi->center[1] - mval[1]) * (long long int)(mi->center[1] - mi->imval[1]) < 0) - { + (long long int)(mi->center[1] - mval[1]) * (long long int)(mi->center[1] - mi->imval[1]) < 0) + { output[0] *= -1.0f; - } + } } static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, const int mval[2], float output[3]) diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 1e428bb96e0..1ea50ec9c1a 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -142,7 +142,7 @@ typedef struct Object { /* rot en drot have to be together! (transform('r' en 's')) */ float loc[3], dloc[3], orig[3]; - float size[3]; /* scale infact */ + float size[3]; /* scale in fact */ float dsize[3] DNA_DEPRECATED ; /* DEPRECATED, 2.60 and older only */ float dscale[3]; /* ack!, changing */ float rot[3], drot[3]; /* euler rotation */ diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index a74632ac2f8..e2646918ea2 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -144,7 +144,7 @@ static int nr_structs = 0; static char **names, *namedata; /* at address names[a] is string a */ static char **types, *typedata; /* at address types[a] is string a */ static short *typelens; /* at typelens[a] is de length of type a */ -static short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits), infact any 64bit system */ +static short *alphalens; /* contains sizes as they are calculated on the DEC Alpha (64 bits), in fact any 64bit system */ static short **structs, *structdata; /* at sp= structs[a] is the first address of a struct definition * sp[0] is type number * sp[1] is amount of elements diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 993d1e20bc5..194f48bd32a 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -1783,7 +1783,7 @@ static void rna_def_keyconfig(BlenderRNA *brna) 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 + /* this is in fact 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); diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index e9b6f15033c..e25fac9b310 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -1702,7 +1702,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb /* this is really nasty!, so we can fake the operator having direct properties eg: * layout.prop(self, "filepath") - * ... which infact should be + * ... which in fact should be * layout.prop(self.properties, "filepath") * * we need to do this trick. diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index f1a5326c602..7e8a1fbc53e 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -2064,7 +2064,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T texres->nor = nvec; /* replaced newbump with code based on listing 1 and 2 of - * [Mik10] Mikkelsen M. S.: Bump Mapping Unparametrized Surfaces on the GPU. + * [Mik10] Mikkelsen M. S.: Bump Mapping Unparameterized Surfaces on the GPU. * -> http://jbit.net/~sparky/sfgrad_bump/mm_sfgrad_bump.pdf */ if ( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) From f8c1a71f24a60a67c72dfe0c43dfa98e1928854a Mon Sep 17 00:00:00 2001 From: Peter Schlaile Date: Sun, 20 May 2012 21:24:08 +0000 Subject: [PATCH 060/159] == Compositor == This fixes occasional crashes on uninitialized memory, when we open a blend file which has movie or image input nodes pointing to none existent source files. --- source/blender/compositor/operations/COM_ImageOperation.cpp | 4 ++++ .../blender/compositor/operations/COM_MovieClipOperation.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/source/blender/compositor/operations/COM_ImageOperation.cpp b/source/blender/compositor/operations/COM_ImageOperation.cpp index be3d9e80337..020dfdbdc14 100644 --- a/source/blender/compositor/operations/COM_ImageOperation.cpp +++ b/source/blender/compositor/operations/COM_ImageOperation.cpp @@ -98,6 +98,10 @@ void BaseImageOperation::deinitExecution() void BaseImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { ImBuf *stackbuf = getImBuf(); + + resolution[0] = 0; + resolution[1] = 0; + if (stackbuf) { resolution[0] = stackbuf->x; resolution[1] = stackbuf->y; diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.cpp b/source/blender/compositor/operations/COM_MovieClipOperation.cpp index 14687133194..d1dab13a952 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieClipOperation.cpp @@ -67,6 +67,10 @@ void MovieClipOperation::deinitExecution() void MovieClipOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { ImBuf *ibuf; + + resolution[0] = 0; + resolution[1] = 0; + if (this->movieClip) { ibuf = BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); if (ibuf) { From 000ac36290b1253b4593453bfeb29686a5704e2d Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 21 May 2012 06:33:32 +0000 Subject: [PATCH 061/159] readfile.c Style cleanups Part 2 - More whitespace + replaced most of the while loops --- source/blender/blenloader/intern/readfile.c | 325 ++++++++------------ 1 file changed, 127 insertions(+), 198 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 06fd2bdfd98..c5ecaf8d49a 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1254,9 +1254,9 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain) fd->imamap = oldnewmap_new(); - for (;ima; ima = ima->id.next) { + for (; ima; ima = ima->id.next) { Link *ibuf = ima->ibufs.first; - for (; ibuf; ibuf= ibuf->next) + for (; ibuf; ibuf = ibuf->next) oldnewmap_insert(fd->imamap, ibuf, ibuf, 0); if (ima->gputexture) oldnewmap_insert(fd->imamap, ima->gputexture, ima->gputexture, 0); @@ -1264,7 +1264,7 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain) if (ima->renders[a]) oldnewmap_insert(fd->imamap, ima->renders[a], ima->renders[a], 0); } - for (; sce; sce= sce->id.next) { + for (; sce; sce = sce->id.next) { if (sce->nodetree) { bNode *node; for (node = sce->nodetree->nodes.first; node; node = node->next) @@ -1283,12 +1283,12 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) int i; /* used entries were restored, so we put them to zero */ - for ( i= 0; i < fd->imamap->nentries; i++, entry++) { + for (i = 0; i < fd->imamap->nentries; i++, entry++) { if (entry->nr > 0) entry->newp = NULL; } - for (; ima; ima= ima->id.next) { + for (; ima; ima = ima->id.next) { Link *ibuf, *next; /* this mirrors direct_link_image */ @@ -1321,7 +1321,7 @@ void blo_make_movieclip_pointer_map(FileData *fd, Main *oldmain) fd->movieclipmap = oldnewmap_new(); - for (;clip; clip= clip->id.next) { + for (; clip; clip = clip->id.next) { if (clip->cache) oldnewmap_insert(fd->movieclipmap, clip->cache, clip->cache, 0); @@ -1535,7 +1535,7 @@ static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData prop->totallen = prop->len; prop->data.pointer = newdataadr(fd, prop->data.pointer); - array= (IDProperty*) prop->data.pointer; + array = (IDProperty *)prop->data.pointer; /* note!, idp-arrays didn't exist in 2.4x, so the pointer will be cleared * theres not really anything we can do to correct this, at least don't crash */ @@ -1652,7 +1652,7 @@ static void direct_link_curvemapping(FileData *fd, CurveMapping *cumap) /* flag seems to be able to hang? Maybe old files... not bad to clear anyway */ cumap->flag &= ~CUMA_PREMULLED; - for (a=0; acm[a].curve = newdataadr(fd, cumap->cm[a].curve); cumap->cm[a].table = NULL; cumap->cm[a].premultable = NULL; @@ -1666,7 +1666,7 @@ static void lib_link_brush(FileData *fd, Main *main) Brush *brush; /* only link ID pointers */ - for (brush= main->brush.first; brush; brush= brush->id.next) { + for (brush = main->brush.first; brush; brush = brush->id.next) { if (brush->id.flag & LIB_NEEDLINK) { brush->id.flag -= LIB_NEEDLINK; @@ -1738,8 +1738,7 @@ static void lib_link_ipo(FileData *fd, Main *main) { Ipo *ipo; - ipo = main->ipo.first; - while (ipo) { + for (ipo = main->ipo.first; ipo; ipo = ipo->id.next) { if (ipo->id.flag & LIB_NEEDLINK) { IpoCurve *icu; for (icu = ipo->curve.first; icu; icu = icu->next) { @@ -1748,7 +1747,6 @@ static void lib_link_ipo(FileData *fd, Main *main) } ipo->id.flag -= LIB_NEEDLINK; } - ipo = ipo->id.next; } } @@ -1758,12 +1756,11 @@ static void direct_link_ipo(FileData *fd, Ipo *ipo) IpoCurve *icu; link_list(fd, &(ipo->curve)); - icu = ipo->curve.first; - while (icu) { + + for (icu = ipo->curve.first; icu; icu = icu->next) { icu->bezt = newdataadr(fd, icu->bezt); icu->bp = newdataadr(fd, icu->bp); icu->driver = newdataadr(fd, icu->driver); - icu = icu->next; } } @@ -1777,7 +1774,7 @@ static void lib_link_nlastrips(FileData *fd, ID *id, ListBase *striplist) strip->object = newlibadr(fd, id->lib, strip->object); strip->act = newlibadr_us(fd, id->lib, strip->act); strip->ipo = newlibadr(fd, id->lib, strip->ipo); - for (amod= strip->modifiers.first; amod; amod= amod->next) + for (amod = strip->modifiers.first; amod; amod = amod->next) amod->ob = newlibadr(fd, id->lib, amod->ob); } } @@ -1789,7 +1786,7 @@ static void direct_link_nlastrips(FileData *fd, ListBase *strips) link_list(fd, strips); - for (strip= strips->first; strip; strip= strip->next) + for (strip = strips->first; strip; strip = strip->next) link_list(fd, &strip->modifiers); } @@ -1951,7 +1948,7 @@ static void lib_link_action(FileData *fd, Main *main) bAction *act; bActionChannel *chan; - for (act= main->action.first; act; act= act->id.next) { + for (act = main->action.first; act; act = act->id.next) { if (act->id.flag & LIB_NEEDLINK) { act->id.flag -= LIB_NEEDLINK; @@ -2168,7 +2165,7 @@ static void lib_link_ntree(FileData *fd, ID *id, bNodeTree *ntree) ntree->gpd = newlibadr_us(fd, id->lib, ntree->gpd); - for (node= ntree->nodes.first; node; node= node->next) + for (node = ntree->nodes.first; node; node = node->next) node->id = newlibadr_us(fd, id->lib, node->id); } @@ -2178,7 +2175,7 @@ static void lib_link_nodetree(FileData *fd, Main *main) bNodeTree *ntree; /* only link ID pointers */ - for (ntree= main->nodetree.first; ntree; ntree= ntree->id.next) { + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) { if (ntree->id.flag & LIB_NEEDLINK) { ntree->id.flag -= LIB_NEEDLINK; lib_link_ntree(fd, &ntree->id, ntree); @@ -2196,24 +2193,24 @@ static void do_versions_socket_default_value(bNodeSocket *sock) 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; + 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; } } @@ -2351,7 +2348,7 @@ static void lib_verify_nodetree(Main *main, int UNUSED(open)) } } - for (ntree= main->nodetree.first; ntree; ntree= ntree->id.next) + for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next) ntree->flag &= ~NTREE_DO_VERSIONS_GROUP_EXPOSE; } @@ -2420,7 +2417,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) if (ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB)) direct_link_curvemapping(fd, node->storage); else if (ntree->type==NTREE_COMPOSIT) { - if ( ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) + if (ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) direct_link_curvemapping(fd, node->storage); else if (ELEM3(node->type, CMP_NODE_IMAGE, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) ((ImageUser *)node->storage)->ok = 1; @@ -2565,7 +2562,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) /* always rebuild to match proxy or lib changes */ - rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib); + rebuild = ob->proxy || (ob->id.lib==NULL && arm->id.lib); if (ob->proxy) { /* sync proxy layer */ @@ -2606,14 +2603,11 @@ static void lib_link_armature(FileData *fd, Main *main) { bArmature *arm; - arm = main->armature.first; - - while (arm) { + for (arm = main->armature.first; arm; arm = arm->id.next) { if (arm->id.flag & LIB_NEEDLINK) { if (arm->adt) lib_link_animdata(fd, &arm->id, arm->adt); arm->id.flag -= LIB_NEEDLINK; } - arm = arm->id.next; } } @@ -2645,10 +2639,8 @@ static void direct_link_armature(FileData *fd, bArmature *arm) arm->adt = newdataadr(fd, arm->adt); direct_link_animdata(fd, arm->adt); - bone = arm->bonebase.first; - while (bone) { + for (bone = arm->bonebase.first; bone; bone = bone->next) { direct_link_bones(fd, bone); - bone=bone->next; } arm->act_bone = newdataadr(fd, arm->act_bone); @@ -2661,8 +2653,7 @@ static void lib_link_camera(FileData *fd, Main *main) { Camera *ca; - ca = main->camera.first; - while (ca) { + for (ca = main->camera.first; ca; ca = ca->id.next) { if (ca->id.flag & LIB_NEEDLINK) { if (ca->adt) lib_link_animdata(fd, &ca->id, ca->adt); @@ -2672,7 +2663,6 @@ static void lib_link_camera(FileData *fd, Main *main) ca->id.flag -= LIB_NEEDLINK; } - ca = ca->id.next; } } @@ -2691,8 +2681,7 @@ static void lib_link_lamp(FileData *fd, Main *main) MTex *mtex; int a; - la = main->lamp.first; - while (la) { + for (la = main->lamp.first; la; la = la->id.next) { if (la->id.flag & LIB_NEEDLINK) { if (la->adt) lib_link_animdata(fd, &la->id, la->adt); @@ -2711,7 +2700,6 @@ static void lib_link_lamp(FileData *fd, Main *main) la->id.flag -= LIB_NEEDLINK; } - la = la->id.next; } } @@ -2743,8 +2731,7 @@ static void lib_link_key(FileData *fd, Main *main) { Key *key; - key = main->key.first; - while (key) { + for (key = main->key.first; key; key = key->id.next) { /*check if we need to generate unique ids for the shapekeys*/ if (!key->uidgen) { KeyBlock *block; @@ -2763,7 +2750,6 @@ static void lib_link_key(FileData *fd, Main *main) key->id.flag -= LIB_NEEDLINK; } - key = key->id.next; } } @@ -2810,14 +2796,11 @@ static void direct_link_key(FileData *fd, Key *key) key->refkey= newdataadr(fd, key->refkey); - kb = key->block.first; - while (kb) { + for (kb = key->block.first; kb; kb = kb->next) { kb->data = newdataadr(fd, kb->data); if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) switch_endian_keyblock(key, kb); - - kb = kb->next; } } @@ -2828,8 +2811,7 @@ static void lib_link_mball(FileData *fd, Main *main) MetaBall *mb; int a; - mb = main->mball.first; - while (mb) { + for (mb = main->mball.first; mb; mb = mb->id.next) { if (mb->id.flag & LIB_NEEDLINK) { if (mb->adt) lib_link_animdata(fd, &mb->id, mb->adt); @@ -2840,7 +2822,6 @@ static void lib_link_mball(FileData *fd, Main *main) mb->id.flag -= LIB_NEEDLINK; } - mb = mb->id.next; } } @@ -2869,8 +2850,7 @@ static void lib_link_world(FileData *fd, Main *main) MTex *mtex; int a; - wrld = main->world.first; - while (wrld) { + for (wrld = main->world.first; wrld; wrld = wrld->id.next) { if (wrld->id.flag & LIB_NEEDLINK) { if (wrld->adt) lib_link_animdata(fd, &wrld->id, wrld->adt); @@ -2879,8 +2859,8 @@ static void lib_link_world(FileData *fd, Main *main) for (a=0; a < MAX_MTEX; a++) { mtex = wrld->mtex[a]; if (mtex) { - mtex->tex= newlibadr_us(fd, wrld->id.lib, mtex->tex); - mtex->object= newlibadr(fd, wrld->id.lib, mtex->object); + mtex->tex = newlibadr_us(fd, wrld->id.lib, mtex->tex); + mtex->object = newlibadr(fd, wrld->id.lib, mtex->object); } } @@ -2889,7 +2869,6 @@ static void lib_link_world(FileData *fd, Main *main) wrld->id.flag -= LIB_NEEDLINK; } - wrld = wrld->id.next; } } @@ -2897,14 +2876,14 @@ static void direct_link_world(FileData *fd, World *wrld) { int a; - wrld->adt= newdataadr(fd, wrld->adt); + wrld->adt = newdataadr(fd, wrld->adt); direct_link_animdata(fd, wrld->adt); - for (a=0; amtex[a]= newdataadr(fd, wrld->mtex[a]); + for (a = 0; a < MAX_MTEX; a++) { + wrld->mtex[a] = newdataadr(fd, wrld->mtex[a]); } - wrld->nodetree= newdataadr(fd, wrld->nodetree); + wrld->nodetree = newdataadr(fd, wrld->nodetree); if (wrld->nodetree) direct_link_nodetree(fd, wrld->nodetree); @@ -2918,12 +2897,10 @@ static void lib_link_vfont(FileData *UNUSED(fd), Main *main) { VFont *vf; - vf = main->vfont.first; - while (vf) { + for (vf = main->vfont.first; vf; vf = vf->id.next) { if (vf->id.flag & LIB_NEEDLINK) { vf->id.flag -= LIB_NEEDLINK; } - vf = vf->id.next; } } @@ -2939,12 +2916,10 @@ static void lib_link_text(FileData *UNUSED(fd), Main *main) { Text *text; - text = main->text.first; - while (text) { + for (text = main->text.first; text; text = text->id.next) { if (text->id.flag & LIB_NEEDLINK) { text->id.flag -= LIB_NEEDLINK; } - text = text->id.next; } } @@ -2973,8 +2948,7 @@ static void direct_link_text(FileData *fd, Text *text) text->curl = newdataadr(fd, text->curl); text->sell = newdataadr(fd, text->sell); - ln = text->lines.first; - while (ln) { + for (ln = text->lines.first; ln; ln = ln->next) { ln->line = newdataadr(fd, ln->line); ln->format = NULL; @@ -2982,8 +2956,6 @@ static void direct_link_text(FileData *fd, Text *text) printf("Error loading text, line lengths differ\n"); ln->len = strlen(ln->line); } - - ln = ln->next; } text->flags = (text->flags) & ~TXT_ISEXT; @@ -2997,14 +2969,12 @@ static void lib_link_image(FileData *fd, Main *main) { Image *ima; - ima = main->image.first; - while (ima) { + for (ima = main->image.first; ima; ima = ima->id.next) { if (ima->id.flag & LIB_NEEDLINK) { if (ima->id.properties) IDP_LibLinkProperty(ima->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); ima->id.flag -= LIB_NEEDLINK; } - ima = ima->id.next; } } @@ -3048,7 +3018,7 @@ static void direct_link_image(FileData *fd, Image *ima) if (fd->imamap) { int a; - for (a =0; a < IMA_MAX_RENDER_SLOT; a++) + for (a = 0; a < IMA_MAX_RENDER_SLOT; a++) ima->renders[a] = newimaadr(fd, ima->renders[a]); } else { @@ -3069,8 +3039,7 @@ static void lib_link_curve(FileData *fd, Main *main) Curve *cu; int a; - cu = main->curve.first; - while (cu) { + for (cu = main->curve.first; cu; cu = cu->id.next) { if (cu->id.flag & LIB_NEEDLINK) { if (cu->adt) lib_link_animdata(fd, &cu->id, cu->adt); @@ -3090,7 +3059,6 @@ static void lib_link_curve(FileData *fd, Main *main) cu->id.flag -= LIB_NEEDLINK; } - cu = cu->id.next; } } @@ -3100,13 +3068,13 @@ static void switch_endian_knots(Nurb *nu) int len; if (nu->knotsu) { - len= KNOTSU(nu); + len = KNOTSU(nu); while (len--) { SWITCH_INT(nu->knotsu[len]); } } if (nu->knotsv) { - len= KNOTSV(nu); + len = KNOTSV(nu); while (len--) { SWITCH_INT(nu->knotsv[len]); } @@ -3153,8 +3121,7 @@ static void direct_link_curve(FileData *fd, Curve *cu) cu->path = NULL; cu->editfont = NULL; - nu = cu->nurb.first; - while (nu) { + for (nu = cu->nurb.first; nu; nu = nu->next) { nu->bezt = newdataadr(fd, nu->bezt); nu->bp = newdataadr(fd, nu->bp); nu->knotsu = newdataadr(fd, nu->knotsu); @@ -3164,8 +3131,6 @@ static void direct_link_curve(FileData *fd, Curve *cu) if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { switch_endian_knots(nu); } - - nu = nu->next; } cu->bb = NULL; } @@ -3176,8 +3141,7 @@ static void lib_link_texture(FileData *fd, Main *main) { Tex *tex; - tex = main->tex.first; - while (tex) { + for (tex = main->tex.first; tex; tex = tex->id.next) { if (tex->id.flag & LIB_NEEDLINK) { if (tex->adt) lib_link_animdata(fd, &tex->id, tex->adt); @@ -3186,7 +3150,7 @@ static void lib_link_texture(FileData *fd, Main *main) if (tex->env) tex->env->object = newlibadr(fd, tex->id.lib, tex->env->object); if (tex->pd) - tex->pd->object= newlibadr(fd, tex->id.lib, tex->pd->object); + tex->pd->object = newlibadr(fd, tex->id.lib, tex->pd->object); if (tex->vd) tex->vd->object = newlibadr(fd, tex->id.lib, tex->vd->object); if (tex->ot) @@ -3197,7 +3161,6 @@ static void lib_link_texture(FileData *fd, Main *main) tex->id.flag -= LIB_NEEDLINK; } - tex= tex->id.next; } } @@ -3223,7 +3186,7 @@ static void direct_link_texture(FileData *fd, Tex *tex) memset(tex->env->cube, 0, 6*sizeof(void *)); tex->env->ok= 0; } - tex->pd= newdataadr(fd, tex->pd); + tex->pd = newdataadr(fd, tex->pd); if (tex->pd) { tex->pd->point_tree = NULL; tex->pd->coba = newdataadr(fd, tex->pd->coba); @@ -3245,13 +3208,13 @@ static void direct_link_texture(FileData *fd, Tex *tex) tex->ot = newdataadr(fd, tex->ot); - tex->nodetree= newdataadr(fd, tex->nodetree); + tex->nodetree = newdataadr(fd, tex->nodetree); if (tex->nodetree) direct_link_nodetree(fd, tex->nodetree); tex->preview = direct_link_preview_image(fd, tex->preview); - tex->iuser.ok= 1; + tex->iuser.ok = 1; } @@ -3264,8 +3227,7 @@ static void lib_link_material(FileData *fd, Main *main) MTex *mtex; int a; - ma = main->mat.first; - while (ma) { + for (ma = main->mat.first; ma; ma = ma->id.next) { if (ma->id.flag & LIB_NEEDLINK) { if (ma->adt) lib_link_animdata(fd, &ma->id, ma->adt); @@ -3276,7 +3238,7 @@ static void lib_link_material(FileData *fd, Main *main) ma->ipo = newlibadr_us(fd, ma->id.lib, ma->ipo); ma->group = newlibadr_us(fd, ma->id.lib, ma->group); - for (a=0; a < MAX_MTEX; a++) { + for (a = 0; a < MAX_MTEX; a++) { mtex = ma->mtex[a]; if (mtex) { mtex->tex = newlibadr_us(fd, ma->id.lib, mtex->tex); @@ -3289,7 +3251,6 @@ static void lib_link_material(FileData *fd, Main *main) ma->id.flag -= LIB_NEEDLINK; } - ma = ma->id.next; } } @@ -3408,9 +3369,8 @@ static void lib_link_particlesettings(FileData *fd, Main *main) ParticleDupliWeight *dw; MTex *mtex; int a; - - part= main->particle.first; - while (part) { + + for (part = main->particle.first; part; part = part->id.next) { if (part->id.flag & LIB_NEEDLINK) { if (part->adt) lib_link_animdata(fd, &part->id, part->adt); part->ipo = newlibadr_us(fd, part->id.lib, part->ipo); // XXX depreceated - old animation system @@ -3495,7 +3455,6 @@ static void lib_link_particlesettings(FileData *fd, Main *main) part->id.flag -= LIB_NEEDLINK; } - part= part->id.next; } } @@ -3507,6 +3466,7 @@ static void direct_link_partdeflect(PartDeflect *pd) static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) { int a; + part->adt = newdataadr(fd, part->adt); part->pd = newdataadr(fd, part->pd); part->pd2 = newdataadr(fd, part->pd2); @@ -3685,7 +3645,7 @@ static void lib_link_customdata_mtpoly(FileData *fd, Mesh *me, CustomData *pdata { int i; - for (i=0; itotlayer; i++) { + for (i=0; i < pdata->totlayer; i++) { CustomDataLayer *layer = &pdata->layers[i]; if (layer->type == CD_MTEXPOLY) { @@ -3705,8 +3665,7 @@ static void lib_link_mesh(FileData *fd, Main *main) { Mesh *me; - me = main->mesh.first; - while (me) { + for (me = main->mesh.first; me; me = me->id.next) { if (me->id.flag & LIB_NEEDLINK) { int i; @@ -3717,13 +3676,13 @@ static void lib_link_mesh(FileData *fd, Main *main) /* this check added for python created meshes */ if (me->mat) { - for (i=0; itotcol; i++) { + for (i = 0; i < me->totcol; i++) { me->mat[i] = newlibadr_us(fd, me->id.lib, me->mat[i]); } } else me->totcol = 0; - me->ipo = newlibadr_us(fd, me->id.lib, me->ipo); + me->ipo = newlibadr_us(fd, me->id.lib, me->ipo); // XXX: deprecated: old anim sys me->key = newlibadr_us(fd, me->id.lib, me->key); me->texcomesh = newlibadr_us(fd, me->id.lib, me->texcomesh); @@ -3763,7 +3722,6 @@ static void lib_link_mesh(FileData *fd, Main *main) me->id.flag -= LIB_NEEDLINK; } - me = me->id.next; } /* convert texface options to material */ @@ -3972,11 +3930,11 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) mesh->mr->verts = MEM_dupallocN(mesh->mvert); } - for (; lvl; lvl= lvl->next) { - lvl->verts= newdataadr(fd, lvl->verts); - lvl->faces= newdataadr(fd, lvl->faces); - lvl->edges= newdataadr(fd, lvl->edges); - lvl->colfaces= newdataadr(fd, lvl->colfaces); + for (; lvl; lvl = lvl->next) { + lvl->verts = newdataadr(fd, lvl->verts); + lvl->faces = newdataadr(fd, lvl->faces); + lvl->edges = newdataadr(fd, lvl->edges); + lvl->colfaces = newdataadr(fd, lvl->colfaces); } } @@ -3988,10 +3946,10 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) } if ((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && mesh->tface) { - TFace *tf= mesh->tface; + TFace *tf = mesh->tface; int i; - for (i=0; i< (mesh->totface); i++, tf++) { + for (i = 0; i < (mesh->totface); i++, tf++) { SWITCH_INT(tf->col[0]); SWITCH_INT(tf->col[1]); SWITCH_INT(tf->col[2]); @@ -4006,8 +3964,7 @@ static void lib_link_latt(FileData *fd, Main *main) { Lattice *lt; - lt = main->latt.first; - while (lt) { + for (lt = main->latt.first; lt; lt = lt->id.next) { if (lt->id.flag & LIB_NEEDLINK) { if (lt->adt) lib_link_animdata(fd, <->id, lt->adt); @@ -4016,7 +3973,6 @@ static void lib_link_latt(FileData *fd, Main *main) lt->id.flag -= LIB_NEEDLINK; } - lt= lt->id.next; } } @@ -4061,8 +4017,7 @@ static void lib_link_object(FileData *fd, Main *main) void *poin; int warn=0, a; - ob = main->object.first; - while (ob) { + for (ob = main->object.first; ob; ob = ob->id.next) { if (ob->id.flag & LIB_NEEDLINK) { if (ob->id.properties) IDP_LibLinkProperty(ob->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); if (ob->adt) lib_link_animdata(fd, &ob->id, ob->adt); @@ -4145,29 +4100,29 @@ static void lib_link_object(FileData *fd, Main *main) lib_link_nlastrips(fd, &ob->id, &ob->nlastrips); // >>> XXX depreceated - old animation system - for (paf= ob->effect.first; paf; paf= paf->next) { + for (paf = ob->effect.first; paf; paf = paf->next) { if (paf->type == EFF_PARTICLE) { paf->group = newlibadr_us(fd, ob->id.lib, paf->group); } } for (sens = ob->sensors.first; sens; sens = sens->next) { - for (a=0; atotlinks; a++) + for (a = 0; a < sens->totlinks; a++) sens->links[a] = newglobadr(fd, sens->links[a]); - if (sens->type==SENS_TOUCH) { + if (sens->type == SENS_TOUCH) { bTouchSensor *ts = sens->data; - ts->ma= newlibadr(fd, ob->id.lib, ts->ma); + ts->ma = newlibadr(fd, ob->id.lib, ts->ma); } - else if (sens->type==SENS_MESSAGE) { - bMessageSensor *ms= sens->data; + else if (sens->type == SENS_MESSAGE) { + bMessageSensor *ms = sens->data; ms->fromObject = newlibadr(fd, ob->id.lib, ms->fromObject); } } for (cont = ob->controllers.first; cont; cont = cont->next) { - for (a=0; atotlinks; a++) + for (a=0; a < cont->totlinks; a++) cont->links[a] = newglobadr(fd, cont->links[a]); if (cont->type == CONT_PYTHON) { @@ -4178,8 +4133,7 @@ static void lib_link_object(FileData *fd, Main *main) cont->totslinks = 0; } - act= ob->actuators.first; - while (act) { + for (act = ob->actuators.first; act; act = act->next) { if (act->type == ACT_SOUND) { bSoundActuator *sa = act->data; sa->sound= newlibadr_us(fd, ob->id.lib, sa->sound); @@ -4257,7 +4211,6 @@ static void lib_link_object(FileData *fd, Main *main) steeringa->target = newlibadr(fd, ob->id.lib, steeringa->target); steeringa->navmesh = newlibadr(fd, ob->id.lib, steeringa->navmesh); } - act= act->next; } { @@ -4285,7 +4238,6 @@ static void lib_link_object(FileData *fd, Main *main) lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem); lib_link_modifiers(fd, ob); } - ob = ob->id.next; } if (warn) { @@ -4330,7 +4282,7 @@ static void direct_link_pose(FileData *fd, bPose *pose) } pose->ikdata = NULL; if (pose->ikparam != NULL) { - pose->ikparam= newdataadr(fd, pose->ikparam); + pose->ikparam = newdataadr(fd, pose->ikparam); } } @@ -4405,7 +4357,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) smd->domain->tex = NULL; smd->domain->tex_shadow = NULL; smd->domain->tex_wt = NULL; - + smd->domain->effector_weights = newdataadr(fd, smd->domain->effector_weights); if (!smd->domain->effector_weights) smd->domain->effector_weights = BKE_add_effector_weights(NULL); @@ -4700,8 +4652,8 @@ static void direct_link_object(FileData *fd, Object *ob) test_pointer_array(fd, (void **)&sb->keys); if (sb->keys) { int a; - for (a=0; atotkey; a++) { - sb->keys[a]= newdataadr(fd, sb->keys[a]); + for (a = 0; a < sb->totkey; a++) { + sb->keys[a] = newdataadr(fd, sb->keys[a]); } } @@ -4762,7 +4714,7 @@ static void direct_link_object(FileData *fd, Object *ob) hook->indexar= newdataadr(fd, hook->indexar); if (fd->flags & FD_FLAGS_SWITCH_ENDIAN) { int a; - for (a=0; atotindex; a++) { + for (a = 0; a < hook->totindex; a++) { SWITCH_INT(hook->indexar[a]); } } @@ -4831,8 +4783,7 @@ static void lib_link_scene(FileData *fd, Main *main) SceneRenderLayer *srl; TimeMarker *marker; - sce = main->scene.first; - while (sce) { + for (sce = main->scene.first; sce; sce = sce->id.next) { if (sce->id.flag & LIB_NEEDLINK) { /* Link ID Properties -- and copy this comment EXACTLY for easy finding * of library blocks that implement this.*/ @@ -4917,7 +4868,7 @@ static void lib_link_scene(FileData *fd, Main *main) composite_patch(sce->nodetree, sce); } - for (srl= sce->r.layers.first; srl; srl= srl->next) { + for (srl = sce->r.layers.first; srl; srl = srl->next) { srl->mat_override = newlibadr_us(fd, sce->id.lib, srl->mat_override); srl->light_override = newlibadr_us(fd, sce->id.lib, srl->light_override); } @@ -4929,8 +4880,6 @@ static void lib_link_scene(FileData *fd, Main *main) sce->id.flag -= LIB_NEEDLINK; } - - sce = sce->id.next; } } @@ -4993,9 +4942,9 @@ static void direct_link_scene(FileData *fd, Scene *sce) } if (sce->ed) { - ListBase *old_seqbasep= &((Editing *)sce->ed)->seqbase; + ListBase *old_seqbasep = &((Editing *)sce->ed)->seqbase; - ed= sce->ed = newdataadr(fd, sce->ed); + ed = sce->ed = newdataadr(fd, sce->ed); ed->act_seq = newdataadr(fd, ed->act_seq); @@ -5263,11 +5212,10 @@ static void lib_link_screen(FileData *fd, Main *main) for (sc = main->screen.first; sc; sc = sc->id.next) { if (sc->id.flag & LIB_NEEDLINK) { sc->id.us = 1; - sc->scene= newlibadr(fd, sc->id.lib, sc->scene); + sc->scene = newlibadr(fd, sc->id.lib, sc->scene); sc->animtimer = NULL; /* saved in rare cases */ - sa= sc->areabase.first; - while (sa) { + for (sa = sc->areabase.first; sa; sa = sa->next) { SpaceLink *sl; sa->full = newlibadr(fd, sc->id.lib, sa->full); @@ -5419,7 +5367,6 @@ static void lib_link_screen(FileData *fd, Main *main) sclip->scopes.ok = 0; } } - sa= sa->next; } sc->id.flag -= LIB_NEEDLINK; } @@ -5436,15 +5383,15 @@ static void *restore_pointer_by_name(Main *mainp, ID *id, int user) ID *idn = lb->first; char *name = id->name + 2; - while (idn) { + for (; idn; idn = idn->next) { if (idn->name[2] == name[0] && strcmp(idn->name+2, name) == 0) { if (idn->lib == id->lib) { if (user && idn->us == 0) idn->us++; break; } } - idn = idn->next; } + return idn; } } @@ -5508,8 +5455,7 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) /* keep cursor location through undo */ copy_v3_v3(sc->scene->cursor, oldscene->cursor); - sa = sc->areabase.first; - while (sa) { + for (sa = sc->areabase.first; sa; sa = sa->next) { SpaceLink *sl; for (sl = sa->spacedata.first; sl; sl = sl->next) { @@ -5625,7 +5571,7 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) } else if (sl->spacetype == SPACE_TEXT) { SpaceText *st = (SpaceText *)sl; - + st->text = restore_pointer_by_name(newmain, (ID *)st->text, 1); if (st->text == NULL) st->text = newmain->text.first; } @@ -5682,7 +5628,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) sclip->scopes.ok = 0; } } - sa= sa->next; } } @@ -6072,8 +6017,7 @@ static void lib_link_speaker(FileData *fd, Main *main) { Speaker *spk; - spk = main->speaker.first; - while (spk) { + for (spk = main->speaker.first; spk; spk = spk->id.next) { if (spk->id.flag & LIB_NEEDLINK) { if (spk->adt) lib_link_animdata(fd, &spk->id, spk->adt); @@ -6084,7 +6028,6 @@ static void lib_link_speaker(FileData *fd, Main *main) spk->id.flag -= LIB_NEEDLINK; } - spk = spk->id.next; } } @@ -6120,16 +6063,14 @@ static void direct_link_sound(FileData *fd, bSound *sound) static void lib_link_sound(FileData *fd, Main *main) { bSound *sound; - - sound = main->sound.first; - while (sound) { + + for (sound = main->sound.first; sound; sound = sound->id.next) { if (sound->id.flag & LIB_NEEDLINK) { sound->id.flag -= LIB_NEEDLINK; sound->ipo = newlibadr_us(fd, sound->id.lib, sound->ipo); // XXX depreceated - old animation system sound_load(main, sound); } - sound = sound->id.next; } } /* ***************** READ GROUP *************** */ @@ -6141,18 +6082,17 @@ static void direct_link_group(FileData *fd, Group *group) static void lib_link_group(FileData *fd, Main *main) { - Group *group= main->group.first; + Group *group; GroupObject *go; int add_us; - while (group) { + for (group = main->group.first; group; group = group->id.next) { if (group->id.flag & LIB_NEEDLINK) { group->id.flag -= LIB_NEEDLINK; add_us = 0; - go = group->gobject.first; - while (go) { + for (go = group->gobject.first; go; go = go->next) { go->ob= newlibadr(fd, group->id.lib, go->ob); if (go->ob) { go->ob->flag |= OB_FROMGROUP; @@ -6161,12 +6101,10 @@ static void lib_link_group(FileData *fd, Main *main) if (go->ob->id.us == 0) go->ob->id.us = 1; } - go = go->next; } if (add_us) group->id.us++; rem_from_group(group, NULL, NULL, NULL); /* removes NULL entries */ } - group = group->id.next; } } @@ -6183,11 +6121,8 @@ static void direct_link_movieTracks(FileData *fd, ListBase *tracksbase) link_list(fd, tracksbase); - track = tracksbase->first; - while (track) { + for (track = tracksbase->first; track; track = track->next) { track->markers = newdataadr(fd, track->markers); - - track = track->next; } } @@ -6222,21 +6157,17 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip) link_list(fd, &tracking->objects); - object = tracking->objects.first; - while (object) { + for (object = tracking->objects.first; object; object = object->next) { direct_link_movieTracks(fd, &object->tracks); direct_link_movieReconstruction(fd, &object->reconstruction); - - object = object->next; } } static void lib_link_movieclip(FileData *fd, Main *main) { MovieClip *clip; - - clip= main->movieclip.first; - while (clip) { + + for (clip = main->movieclip.first; clip; clip = clip->id.next) { if (clip->id.flag & LIB_NEEDLINK) { if (clip->adt) lib_link_animdata(fd, &clip->id, clip->adt); @@ -6245,7 +6176,6 @@ static void lib_link_movieclip(FileData *fd, Main *main) clip->id.flag -= LIB_NEEDLINK; } - clip = clip->id.next; } } @@ -6254,7 +6184,7 @@ static void lib_link_movieclip(FileData *fd, Main *main) static const char *dataname(short id_code) { - switch ( id_code ) { + switch (id_code) { case ID_OB: return "Data from OB"; case ID_ME: return "Data from ME"; case ID_IP: return "Data from IP"; @@ -6505,7 +6435,6 @@ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead) /* note, this has to be kept for reading older files... */ static void link_global(FileData *fd, BlendFileData *bfd) { - bfd->curscreen = newlibadr(fd, NULL, bfd->curscreen); bfd->curscene = newlibadr(fd, NULL, bfd->curscene); // this happens in files older than 2.35 @@ -7747,7 +7676,7 @@ static void sort_bhead_old_map(FileData *fd) fd->tot_bheadmap = tot; if (tot == 0) return; - bhs = fd->bheadmap= MEM_mallocN(tot*sizeof(struct bheadsort), "bheadsort"); + bhs = fd->bheadmap = MEM_mallocN(tot*sizeof(struct bheadsort), "bheadsort"); for (bhead = blo_firstbhead(fd); bhead; bhead = blo_nextbhead(fd, bhead), bhs++) { bhs->bhead = bhead; @@ -8643,8 +8572,8 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, const const short is_group_append = (is_link==FALSE && idcode==ID_GR); /* give all objects which are LIB_INDIRECT a base, or for a group when *lib has been set */ - for (ob= mainvar->object.first; ob; ob= ob->id.next) { - if ( ob->id.flag & LIB_INDIRECT ) { + for (ob = mainvar->object.first; ob; ob = ob->id.next) { + if (ob->id.flag & LIB_INDIRECT) { /* IF below is quite confusing! * if we are appending, but this object wasnt just added along with a group, * then this is already used indirectly in the scene somewhere else and we didnt just append it. @@ -8844,7 +8773,7 @@ static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r) /* common routine to append/link something from a library */ -static Main* library_append_begin(Main *mainvar, FileData **fd, const char *filepath) +static Main *library_append_begin(Main *mainvar, FileData **fd, const char *filepath) { Main *mainl; @@ -8861,7 +8790,7 @@ static Main* library_append_begin(Main *mainvar, FileData **fd, const char *file return mainl; } -Main* BLO_library_append_begin(Main *mainvar, BlendHandle** bh, const char *filepath) +Main *BLO_library_append_begin(Main *mainvar, BlendHandle** bh, const char *filepath) { FileData *fd = (FileData*)(*bh); return library_append_begin(mainvar, &fd, filepath); @@ -9083,9 +9012,10 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) for (mainptr = mainl->next; mainptr; mainptr = mainptr->next) { a = set_listbasepointers(mainptr, lbarray); while (a--) { - ID *id = lbarray[a]->first; - while (id) { - ID *idn = id->next; + ID *id, *idn = NULL; + + for (id = lbarray[a]->first; id; id = idn) { + idn = id->next; if (id->flag & LIB_READ) { BLI_remlink(lbarray[a], id); BKE_reportf_wrap(basefd->reports, RPT_ERROR, @@ -9095,7 +9025,6 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) MEM_freeN(id); } - id = idn; } } } From be53fde9cde872003d5895f628e457289cd6b594 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 06:33:45 +0000 Subject: [PATCH 062/159] code cleanup: - remove duplicate includes - blender builds with -Werror in C++ for fluids/smoke --- intern/elbeem/CMakeLists.txt | 5 ++++- source/blender/blenkernel/intern/mesh.c | 8 ++------ source/blender/blenkernel/intern/smoke.c | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/intern/elbeem/CMakeLists.txt b/intern/elbeem/CMakeLists.txt index 064269b02bc..e9d29561121 100644 --- a/intern/elbeem/CMakeLists.txt +++ b/intern/elbeem/CMakeLists.txt @@ -86,9 +86,12 @@ set(SRC intern/solver_interface.h intern/solver_relax.h intern/utilities.h - intern/globals.h + intern/globals.h ) +# elbeem has some harmless UNUSED warnings +remove_strict_flags() + add_definitions( -DNOGUI -DELBEEM_BLENDER=1 diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index abc31bb25ed..a89cb042884 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -50,6 +50,7 @@ #include "BLI_math.h" #include "BLI_edgehash.h" #include "BLI_scanfill.h" +#include "BLI_array.h" #include "BKE_animsys.h" #include "BKE_main.h" @@ -70,11 +71,6 @@ #include "BKE_tessmesh.h" #include "BLI_edgehash.h" -#include "BLI_blenlib.h" -#include "BLI_math.h" -#include "BLI_array.h" -#include "BLI_edgehash.h" - #include "bmesh.h" enum { @@ -88,7 +84,7 @@ enum { MESHCMP_POLYMISMATCH, MESHCMP_EDGEUNKNOWN, MESHCMP_VERTCOMISMATCH, - MESHCMP_CDLAYERS_MISMATCH, + MESHCMP_CDLAYERS_MISMATCH }; static const char *cmpcode_to_str(int code) diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index 4b814a5b22b..51183511454 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -103,7 +103,7 @@ static void tend ( void ) { QueryPerformanceCounter ( &liCurrentTime ); } -static double tval( void ) +static double UNUSED_FUNCTION(tval)( void ) { return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart )); } @@ -120,7 +120,7 @@ static void tend ( void ) gettimeofday ( &_tend,&tz ); } -static double tval( void ) +static double UNUSED_FUNCTION(tval)( void ) { double t1, t2; t1 = ( double ) _tstart.tv_sec*1000 + ( double ) _tstart.tv_usec/ ( 1000 ); From c230ce0ac6b2c44c125466a13824988033287300 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 06:44:46 +0000 Subject: [PATCH 063/159] fix for error pointed out by Nicholas Bishop, BM_edge_face_pair & BM_edge_loop_pair returned TRUE for single face user edges. --- source/blender/bmesh/intern/bmesh_queries.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 7df52cabe79..f61f9666d6d 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -369,6 +369,7 @@ int BM_edge_face_pair(BMEdge *e, BMFace **r_fa, BMFace **r_fb) if ((la = e->l) && (lb = la->radial_next) && + (la != lb) && (lb->radial_next == la)) { *r_fa = la->f; @@ -394,6 +395,7 @@ int BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb) if ((la = e->l) && (lb = la->radial_next) && + (la != lb) && (lb->radial_next == la)) { *r_la = la; From 65b238544865128eef3365fa7646fb821087917d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 07:00:23 +0000 Subject: [PATCH 064/159] py api integration: __import__(... , level=0) default changed to work with python3.3 --- source/blender/python/generic/bpy_internal_import.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index ad97d741f9b..5999040a2ab 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -226,7 +226,7 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject char *name; int found = 0; PyObject *globals = NULL, *locals = NULL, *fromlist = NULL; - int level = -1; /* relative imports */ + int level = 0; /* relative imports */ PyObject *newmodule; //PyObject_Print(args, stderr, 0); From 09b4d262b93a6e73e67f4249f28da581b30f5214 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 08:10:37 +0000 Subject: [PATCH 065/159] Quiet null pointer free warning/error. --- source/blender/nodes/intern/node_util.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c index 1c38bdf39d7..548a21ee35b 100644 --- a/source/blender/nodes/intern/node_util.c +++ b/source/blender/nodes/intern/node_util.c @@ -57,7 +57,9 @@ void node_free_curves(bNode *node) void node_free_standard_storage(bNode *node) { - MEM_freeN(node->storage); + if (node->storage) { + MEM_freeN(node->storage); + } } void node_copy_curves(bNode *orig_node, bNode *new_node) From 252f3556e4ed7a34ca151ac7fbc074fb6f266846 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 08:24:03 +0000 Subject: [PATCH 066/159] fix for minor annoyance when an operator is called by another - dont add blend file to recent history. this way demo-mode addon doesnt clobber the recent history with demo files its operator loads. --- source/blender/windowmanager/intern/wm_files.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 56052b895ab..5c3027d72b1 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -373,6 +373,9 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports) int G_f = G.f; ListBase wmbase; + /* assume automated tasks with background, don't write recent file list */ + const int do_history = (G.background == FALSE) && (CTX_wm_manager(C)->op_undo_depth == 0); + /* put aside screens to match with persistent windows later */ /* also exit screens and editors */ wm_window_match_init(C, &wmbase); @@ -400,8 +403,9 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports) if (retval != BKE_READ_FILE_FAIL) { G.relbase_valid = 1; - if (!G.background) /* assume automated tasks with background, don't write recent file list */ + if (do_history) { write_history(); + } } From 04bc89a8b69da0644f8b6fc2de171fb78e861708 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 09:00:35 +0000 Subject: [PATCH 067/159] code cleanup: remove some old comments --- .../blender/editors/space_view3d/view3d_fly.c | 2 +- .../blender/windowmanager/intern/wm_files.c | 13 +++---- source/creator/creator.c | 39 +++++++++---------- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c index 2dab26e7781..06cae3585cd 100644 --- a/source/blender/editors/space_view3d/view3d_fly.c +++ b/source/blender/editors/space_view3d/view3d_fly.c @@ -580,7 +580,7 @@ static void flyEvent(FlyInfo *fly, wmEvent *event) fly->pan_view = TRUE; break; case FLY_MODAL_PAN_DISABLE: -//XXX2.5 warp_pointer(cent_orig[0], cent_orig[1]); +//XXX2.5 WM_cursor_warp(CTX_wm_window(C), cent_orig[0], cent_orig[1]); fly->pan_view = FALSE; break; diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 5c3027d72b1..3d1902409e8 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -333,8 +333,9 @@ static int wm_read_exotic(Scene *UNUSED(scene), const char *name) retval = BKE_READ_EXOTIC_OK_BLEND; } else { - //XXX waitcursor(1); #if 0 /* historic stuff - no longer used */ + WM_cursor_wait(TRUE); + if (is_foo_format(name)) { read_foo(name); retval = BKE_READ_EXOTIC_OK_OTHER; @@ -344,7 +345,9 @@ static int wm_read_exotic(Scene *UNUSED(scene), const char *name) { retval = BKE_READ_EXOTIC_FAIL_FORMAT; } - //XXX waitcursor(0); +#if 0 + WM_cursor_wait(FALSE); +#endif } } } @@ -393,8 +396,6 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports) /* match the read WM with current WM */ wm_window_match_do(C, &wmbase); WM_check(C); /* opens window(s), checks keymaps */ - -// XXX mainwindow_set_filename_to_title(G.main->name); if (retval == BKE_READ_FILE_OK_USERPREFS) { /* in case a userdef is read from regular .blend */ @@ -453,7 +454,6 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports) } #endif - // XXX undo_editmode_clear(); BKE_reset_undo(); BKE_write_undo(C, "original"); /* save current state */ } @@ -546,8 +546,7 @@ int WM_read_homefile(bContext *C, ReportList *UNUSED(reports), short from_memory /* XXX */ G.save_over = 0; // start with save preference untitled.blend G.fileflags &= ~G_FILE_AUTOPLAY; /* disable autoplay in startup.blend... */ -// mainwindow_set_filename_to_title(""); // empty string re-initializes title to "Blender" - + // refresh_interface_font(); // undo_editmode_clear(); diff --git a/source/creator/creator.c b/source/creator/creator.c index 1f0756b2c24..a21497b82fa 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -31,18 +31,18 @@ #if defined(__linux__) && defined(__GNUC__) -#define _GNU_SOURCE -#include +# define _GNU_SOURCE +# include #endif #if (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__))) -#define OSX_SSE_FPE -#include +# define OSX_SSE_FPE +# include #endif #ifdef WIN32 -#include -#include "utfconv.h" +# include +# include "utfconv.h" #endif #include @@ -105,30 +105,30 @@ #include "BLI_scanfill.h" /* for BLI_setErrorCallBack, TODO, move elsewhere */ #ifdef WITH_BUILDINFO_HEADER -#define BUILD_DATE +# define BUILD_DATE #endif /* for passing information between creator and gameengine */ #ifdef WITH_GAMEENGINE -#include "BL_System.h" +# include "BL_System.h" #else /* dummy */ -#define SYS_SystemHandle int +# define SYS_SystemHandle int #endif #include #ifdef __FreeBSD__ -# include -# include -# include +# include +# include +# include #endif #ifdef WITH_BINRELOC -#include "binreloc.h" +# include "binreloc.h" #endif #ifdef WITH_LIBMV -#include "libmv-capi.h" +# include "libmv-capi.h" #endif /* from buildinfo.c */ @@ -1178,15 +1178,14 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) #ifdef WITH_PYTHON_MODULE /* allow python module to call main */ -#define main main_python_enter +# define main main_python_enter static void *evil_C = NULL; -#ifdef __APPLE__ -/* environ is not available in mac shared libraries */ -#include +# ifdef __APPLE__ + /* environ is not available in mac shared libraries */ +# include char **environ = NULL; -#endif - +# endif #endif From 23d628a54ff57b336ca6ae10ba133c2417d71a5b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 10:11:51 +0000 Subject: [PATCH 068/159] fix for unlikely but possible use of uninitialized pointers. --- source/blender/blenkernel/intern/key.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index d776b05dce5..be3ea38844a 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -721,7 +721,7 @@ void do_rel_key(const int start, int end, const int tot, char *basispoin, Key *k KeyBlock *kb; int *ofsp, ofs[3], elemsize, b; char *cp, *poin, *reffrom, *from, elemstr[8]; - char *freefrom, *freereffrom; + char *freefrom = NULL, *freereffrom = NULL; int poinsize; /* currently always 0, in future key_pointer_size may assign */ From 14e4ad930209a3b861b5b514fbd23b39a7d16e94 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 10:13:43 +0000 Subject: [PATCH 069/159] fix for fix - possible on second loop to use freed memory still. --- source/blender/blenkernel/intern/key.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index be3ea38844a..e1bc1af2519 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -721,7 +721,6 @@ void do_rel_key(const int start, int end, const int tot, char *basispoin, Key *k KeyBlock *kb; int *ofsp, ofs[3], elemsize, b; char *cp, *poin, *reffrom, *from, elemstr[8]; - char *freefrom = NULL, *freereffrom = NULL; int poinsize; /* currently always 0, in future key_pointer_size may assign */ @@ -754,6 +753,7 @@ void do_rel_key(const int start, int end, const int tot, char *basispoin, Key *k if (!(kb->flag & KEYBLOCK_MUTE) && icuval != 0.0f && kb->totelem == tot) { KeyBlock *refb; float weight, *weights = kb->weights; + char *freefrom = NULL, *freereffrom = NULL; /* reference now can be any block */ refb = BLI_findlink(&key->block, kb->relative); From 998a850f9f2747065ffe379097907232a85cd2d5 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 10:20:30 +0000 Subject: [PATCH 070/159] Added switch in dilate/erode between old (Step) and new (Distance) algorithm Connected the Glare Fog Flow to use Fast Gaussian in stead of Bokeh blur --- .../compositor/nodes/COM_DilateErodeNode.cpp | 43 +++-- .../compositor/nodes/COM_GlareNode.cpp | 16 +- .../operations/COM_DilateErodeOperation.cpp | 160 +++++++++++++++++- .../operations/COM_DilateErodeOperation.h | 46 ++++- .../operations/COM_GlareBaseOperation.cpp | 16 +- source/blender/editors/space_node/drawnode.c | 4 + source/blender/makesdna/DNA_node_types.h | 3 + source/blender/makesrna/intern/rna_nodetree.c | 17 ++ 8 files changed, 273 insertions(+), 32 deletions(-) diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp index 2118f5b8e47..55759ba410f 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp @@ -33,16 +33,37 @@ DilateErodeNode::DilateErodeNode(bNode *editorNode): Node(editorNode) void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { - bNode *editorNode = this->getbNode(); - DilateErodeOperation *operation = new DilateErodeOperation(); - operation->setDistance(editorNode->custom2); - operation->setInset(2.0f); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); - - AntiAliasOperation * antiAlias = new AntiAliasOperation(); - addLink(graph, operation->getOutputSocket(), antiAlias->getInputSocket(0)); - this->getOutputSocket(0)->relinkConnections(antiAlias->getOutputSocket(0)); - graph->addOperation(operation); - graph->addOperation(antiAlias); + bNode *editorNode = this->getbNode(); + if (editorNode->custom1 == CMP_NODE_DILATEERODE_DISTANCE) { + DilateErodeDistanceOperation *operation = new DilateErodeDistanceOperation(); + operation->setDistance(editorNode->custom2); + operation->setInset(editorNode->custom3); + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + + if (editorNode->custom3 < 2.0f) { + AntiAliasOperation * antiAlias = new AntiAliasOperation(); + addLink(graph, operation->getOutputSocket(), antiAlias->getInputSocket(0)); + this->getOutputSocket(0)->relinkConnections(antiAlias->getOutputSocket(0)); + graph->addOperation(antiAlias); + } else { + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + } + graph->addOperation(operation); + } else { + if (editorNode->custom2 > 0) { + DilateStepOperation * operation = new DilateStepOperation(); + operation->setIterations(editorNode->custom2); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } else { + ErodeStepOperation * operation = new ErodeStepOperation(); + operation->setIterations(-editorNode->custom2); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); + graph->addOperation(operation); + } + } } diff --git a/source/blender/compositor/nodes/COM_GlareNode.cpp b/source/blender/compositor/nodes/COM_GlareNode.cpp index c65adc862b1..e882c16814a 100644 --- a/source/blender/compositor/nodes/COM_GlareNode.cpp +++ b/source/blender/compositor/nodes/COM_GlareNode.cpp @@ -23,12 +23,12 @@ #include "COM_GlareNode.h" #include "DNA_node_types.h" #include "COM_FogGlowImageOperation.h" -#include "COM_BokehBlurOperation.h" #include "COM_GlareThresholdOperation.h" #include "COM_GlareSimpleStarOperation.h" #include "COM_GlareStreaksOperation.h" #include "COM_SetValueOperation.h" #include "COM_MixBlendOperation.h" +#include "COM_FastGaussianBlurOperation.h" GlareNode::GlareNode(bNode *editorNode): Node(editorNode) { @@ -70,29 +70,31 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * case 1: // fog glow { GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation(); - FogGlowImageOperation * kerneloperation = new FogGlowImageOperation(); - BokehBlurOperation * bluroperation = new BokehBlurOperation(); + FastGaussianBlurOperation* bluroperation = new FastGaussianBlurOperation(); SetValueOperation * valueoperation = new SetValueOperation(); SetValueOperation * mixvalueoperation = new SetValueOperation(); MixBlendOperation * mixoperation = new MixBlendOperation(); mixoperation->setResolutionInputSocketIndex(1); this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); addLink(system, thresholdOperation->getOutputSocket(), bluroperation->getInputSocket(0)); - addLink(system, kerneloperation->getOutputSocket(), bluroperation->getInputSocket(1)); - addLink(system, valueoperation->getOutputSocket(), bluroperation->getInputSocket(2)); + addLink(system, valueoperation->getOutputSocket(), bluroperation->getInputSocket(1)); addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); addLink(system, bluroperation->getOutputSocket(), mixoperation->getInputSocket(2)); addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1)); thresholdOperation->setThreshold(glare->threshold); - bluroperation->setSize(0.003f*glare->size); + NodeBlurData * data = new NodeBlurData(); + data->relative = 0; + data->sizex = glare->size; + data->sizey = glare->size; + bluroperation->setData(data); + bluroperation->deleteDataWhenFinished(); bluroperation->setQuality(context->getQuality()); valueoperation->setValue(1.0f); mixvalueoperation->setValue(0.5f+glare->mix*0.5f); this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket()); system->addOperation(bluroperation); - system->addOperation(kerneloperation); system->addOperation(thresholdOperation); system->addOperation(mixvalueoperation); system->addOperation(valueoperation); diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp index d9c0350eb09..0dc4ea84cb8 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -23,7 +23,7 @@ #include "COM_DilateErodeOperation.h" #include "BLI_math.h" -DilateErodeOperation::DilateErodeOperation(): NodeOperation() +DilateErodeDistanceOperation::DilateErodeDistanceOperation(): NodeOperation() { this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); @@ -33,7 +33,7 @@ DilateErodeOperation::DilateErodeOperation(): NodeOperation() this->_switch = 0.5f; this->distance = 0.0f; } -void DilateErodeOperation::initExecution() +void DilateErodeDistanceOperation::initExecution() { this->inputProgram = this->getInputSocketReader(0); if (this->distance < 0.0f) { @@ -52,13 +52,13 @@ void DilateErodeOperation::initExecution() } } -void *DilateErodeOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +void *DilateErodeDistanceOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { void *buffer = inputProgram->initializeTileData(NULL, memoryBuffers); return buffer; } -void DilateErodeOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +void DilateErodeDistanceOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) { float inputValue[4]; const float sw = this->_switch; @@ -141,12 +141,12 @@ void DilateErodeOperation::executePixel(float *color, int x, int y, MemoryBuffer } } -void DilateErodeOperation::deinitExecution() +void DilateErodeDistanceOperation::deinitExecution() { this->inputProgram = NULL; } -bool DilateErodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +bool DilateErodeDistanceOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { rcti newInput; @@ -157,3 +157,151 @@ bool DilateErodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBuf return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); } + +// Dilate step +DilateStepOperation::DilateStepOperation(): NodeOperation() +{ + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + this->setComplex(true); + this->inputProgram = NULL; +} +void DilateStepOperation::initExecution() +{ + this->inputProgram = this->getInputSocketReader(0); + this->cached_buffer = NULL; + this->initMutex(); +} + +void *DilateStepOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ + if (this->cached_buffer != NULL) { + return this->cached_buffer; + } + BLI_mutex_lock(getMutex()); + if (this->cached_buffer == NULL) { + MemoryBuffer *buffer = (MemoryBuffer*)inputProgram->initializeTileData(NULL, memoryBuffers); + float *rectf = buffer->convertToValueBuffer(); + int x, y, i; + float *p; + int bwidth = buffer->getWidth(); + int bheight = buffer->getHeight(); + for (i = 0 ; i < this->iterations ; i ++) { + for (y=0; y < bheight; y++) { + for (x=0; x < bwidth-1; x++) { + p = rectf + (bwidth*y + x); + *p = MAX2(*p, *(p + 1)); + } + } + + for (y=0; y < bheight; y++) { + for (x=bwidth-1; x >= 1; x--) { + p = rectf + (bwidth*y + x); + *p = MAX2(*p, *(p - 1)); + } + } + + for (x=0; x < bwidth; x++) { + for (y=0; y < bheight-1; y++) { + p = rectf + (bwidth*y + x); + *p = MAX2(*p, *(p + bwidth)); + } + } + + for (x=0; x < bwidth; x++) { + for (y=bheight-1; y >= 1; y--) { + p = rectf + (bwidth*y + x); + *p = MAX2(*p, *(p - bwidth)); + } + } + } + this->cached_buffer = rectf; + } + BLI_mutex_unlock(getMutex()); + return this->cached_buffer; +} + + +void DilateStepOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data) +{ + color[0] = this->cached_buffer[y*this->getWidth()+x]; +} + +void DilateStepOperation::deinitExecution() +{ + this->inputProgram = NULL; + this->deinitMutex(); + if (this->cached_buffer) { + delete cached_buffer; + this->cached_buffer = NULL; + } +} + +bool DilateStepOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) +{ + if (this->cached_buffer) { + return false; + } else { + rcti newInput; + + newInput.xmax = getWidth(); + newInput.xmin = 0; + newInput.ymax = getHeight(); + newInput.ymin = 0; + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } +} + +// Erode step +ErodeStepOperation::ErodeStepOperation(): DilateStepOperation() +{ +} + +void *ErodeStepOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) +{ + if (this->cached_buffer != NULL) { + return this->cached_buffer; + } + BLI_mutex_lock(getMutex()); + if (this->cached_buffer == NULL) { + MemoryBuffer *buffer = (MemoryBuffer*)inputProgram->initializeTileData(NULL, memoryBuffers); + float *rectf = buffer->convertToValueBuffer(); + int x, y, i; + float *p; + int bwidth = buffer->getWidth(); + int bheight = buffer->getHeight(); + for (i = 0 ; i < this->iterations ; i ++) { + for (y=0; y < bheight; y++) { + for (x=0; x < bwidth-1; x++) { + p = rectf + (bwidth*y + x); + *p = MIN2(*p, *(p + 1)); + } + } + + for (y=0; y < bheight; y++) { + for (x=bwidth-1; x >= 1; x--) { + p = rectf + (bwidth*y + x); + *p = MIN2(*p, *(p - 1)); + } + } + + for (x=0; x < bwidth; x++) { + for (y=0; y < bheight-1; y++) { + p = rectf + (bwidth*y + x); + *p = MIN2(*p, *(p + bwidth)); + } + } + + for (x=0; x < bwidth; x++) { + for (y=bheight-1; y >= 1; y--) { + p = rectf + (bwidth*y + x); + *p = MIN2(*p, *(p - bwidth)); + } + } + } + this->cached_buffer = rectf; + } + BLI_mutex_unlock(getMutex()); + return this->cached_buffer; +} diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.h b/source/blender/compositor/operations/COM_DilateErodeOperation.h index 102d1165bc8..7f01ea94494 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.h +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.h @@ -25,7 +25,7 @@ #include "COM_NodeOperation.h" -class DilateErodeOperation : public NodeOperation { +class DilateErodeDistanceOperation : public NodeOperation { private: /** * Cached reference to the inputProgram @@ -42,7 +42,7 @@ private: */ int scope; public: - DilateErodeOperation(); + DilateErodeDistanceOperation(); /** * the inner loop of this program @@ -67,4 +67,46 @@ public: bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); }; + +class DilateStepOperation : public NodeOperation { +protected: + /** + * Cached reference to the inputProgram + */ + SocketReader * inputProgram; + + int iterations; + + float *cached_buffer; +public: + DilateStepOperation(); + + /** + * the inner loop of this program + */ + void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data); + + /** + * Initialize the execution + */ + void initExecution(); + + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); + /** + * Deinitialize the execution + */ + void deinitExecution(); + + void setIterations(int iterations) {this->iterations = iterations;} + + bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output); +}; + +class ErodeStepOperation : public DilateStepOperation { +public: + ErodeStepOperation(); + + void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers); +}; + #endif diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp index 6715d50bb95..44f987b45e3 100644 --- a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp @@ -72,10 +72,14 @@ void *GlareBaseOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBu bool GlareBaseOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) { - rcti newInput; - newInput.xmax = this->getWidth(); - newInput.xmin = 0; - newInput.ymax = this->getHeight(); - newInput.ymin = 0; - return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + if (this->cachedInstance != NULL) { + return false; + } else { + rcti newInput; + newInput.xmax = this->getWidth(); + newInput.xmin = 0; + newInput.ymax = this->getHeight(); + newInput.ymin = 0; + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); + } } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index d42393f3611..ecdd30ce966 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1582,7 +1582,11 @@ static void node_composit_buts_hue_sat(uiLayout *layout, bContext *UNUSED(C), Po static void node_composit_buts_dilateerode(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { + uiItemR(layout, ptr, "type", 0, NULL, ICON_NONE); uiItemR(layout, ptr, "distance", 0, NULL, ICON_NONE); + if (RNA_enum_get(ptr, "type") == CMP_NODE_DILATEERODE_DISTANCE) { + uiItemR(layout, ptr, "edge", 0, NULL, ICON_NONE); + } } static void node_composit_buts_diff_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 4bbd1e20973..6d3e57b6034 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -345,6 +345,9 @@ typedef struct bNodeSocketValueRGBA { #define CMP_NODE_LENSFLARE_CIRCLE 4 #define CMP_NODE_LENSFLARE_STREAKS 8 +#define CMP_NODE_DILATEERODE_STEP 0 +#define CMP_NODE_DILATEERODE_DISTANCE 1 + /* this one has been replaced with ImageUser, keep it for do_versions() */ typedef struct NodeImageAnim { int frames, sfra, nr; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 1f5ac24db92..cc2ad912a11 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -1962,12 +1962,29 @@ static void def_cmp_output_file(StructRNA *srna) static void def_cmp_dilate_erode(StructRNA *srna) { PropertyRNA *prop; + + static EnumPropertyItem type_items[] = { + {CMP_NODE_DILATEERODE_STEP, "STEP", 0, "Step", ""}, + {CMP_NODE_DILATEERODE_DISTANCE, "DISTANCE", 0, "Distance", ""}, + {0, NULL, 0, NULL, NULL}}; + + prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, type_items); + RNA_def_property_ui_text(prop, "Distance", "Distance to grow/shrink (number of iterations)"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "distance", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "custom2"); RNA_def_property_range(prop, -100, 100); RNA_def_property_ui_text(prop, "Distance", "Distance to grow/shrink (number of iterations)"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "edge", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "custom3"); + RNA_def_property_range(prop, -100, 100); + RNA_def_property_ui_text(prop, "Edge", "Edge to inset"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } static void def_cmp_scale(StructRNA *srna) From ea11bc980ad428950efb430618a6de439ffd5951 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 12:30:06 +0000 Subject: [PATCH 071/159] debugging check for bmesh (commented since its very slow), but useful for debugging some scripts. --- source/blender/python/bmesh/bmesh_py_types.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 1c0040aec89..be5b4844ae6 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -3115,6 +3115,21 @@ PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele) int bpy_bm_generic_valid_check(BPy_BMGeneric *self) { if (LIKELY(self->bm)) { + + /* far too slow to enable by default but handy + * to uncomment for debugging tricky errors, + * note that this will throw error on entering a + * function where the actual error will be caused by + * the previous action. */ +#if 0 + if (BM_mesh_validate(self->bm) == FALSE) { + PyErr_Format(PyExc_ReferenceError, + "BMesh used by %.200s has become invalid", + Py_TYPE(self)->tp_name); + return -1; + } +#endif + return 0; } else { From c3e1fce77552b5626d2939710cb6d0020891d218 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 21 May 2012 12:52:28 +0000 Subject: [PATCH 072/159] Cycles: add Object Info node, with outputs object location, object/material pass index, and a random number unique to the instance of the object. This can be useful to give some variation to a single material assigned to multiple instances, either manually controlled through the object index, based on the object location, or randomized for each instance. http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/More#Object_Info --- intern/cycles/blender/blender_object.cpp | 1 + intern/cycles/blender/blender_shader.cpp | 4 + intern/cycles/kernel/kernel_object.h | 25 + intern/cycles/kernel/kernel_shader.h | 5 - intern/cycles/kernel/svm/svm.h | 3 + intern/cycles/kernel/svm/svm_geometry.h | 20 + intern/cycles/kernel/svm/svm_types.h | 10 +- intern/cycles/render/nodes.cpp | 45 +- intern/cycles/render/nodes.h | 5 + intern/cycles/render/object.cpp | 7 +- intern/cycles/render/object.h | 1 + intern/cycles/util/util_hash.h | 18 +- source/blender/blenkernel/BKE_node.h | 1 + source/blender/blenkernel/intern/node.c | 1 + .../gpu/shaders/gpu_shader_material.glsl | 9 + .../gpu/shaders/gpu_shader_material.glsl.c | 3130 +++++++++-------- .../makesrna/intern/rna_nodetree_types.h | 5 +- source/blender/nodes/CMakeLists.txt | 1 + source/blender/nodes/NOD_shader.h | 1 + .../shader/nodes/node_shader_object_info.c | 61 + 20 files changed, 1778 insertions(+), 1575 deletions(-) create mode 100644 source/blender/nodes/shader/nodes/node_shader_object_info.c diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index 641aa88d6ef..405c7eada1d 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -245,6 +245,7 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, /* object sync */ if(object_updated || (object->mesh && object->mesh->need_update)) { object->name = b_ob.name().c_str(); + object->instance_id = b_index; object->pass_id = b_ob.pass_index(); object->tfm = tfm; object->motion.pre = tfm; diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index b33de789631..59eeb25ed74 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -334,6 +334,10 @@ static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Shader node = new LightFalloffNode(); break; } + case BL::ShaderNode::type_OBJECT_INFO: { + node = new ObjectInfoNode(); + break; + } case BL::ShaderNode::type_TEX_IMAGE: { BL::ShaderNodeTexImage b_image_node(b_node); BL::Image b_image(b_image_node.image()); diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h index abe427d8345..05c45c490d8 100644 --- a/intern/cycles/kernel/kernel_object.h +++ b/intern/cycles/kernel/kernel_object.h @@ -117,6 +117,16 @@ __device_inline void object_dir_transform(KernelGlobals *kg, ShaderData *sd, flo #endif } +__device_inline float3 object_location(KernelGlobals *kg, ShaderData *sd) +{ +#ifdef __MOTION__ + return make_float3(sd->ob_tfm.x.w, sd->ob_tfm.y.w, sd->ob_tfm.z.w); +#else + Transform tfm = object_fetch_transform(kg, sd->object, 0.0f, OBJECT_TRANSFORM); + return make_float3(tfm.x.w, tfm.y.w, tfm.z.w); +#endif +} + __device_inline float object_surface_area(KernelGlobals *kg, int object) { int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES; @@ -134,5 +144,20 @@ __device_inline float object_pass_id(KernelGlobals *kg, int object) return f.y; } +__device_inline float object_random_number(KernelGlobals *kg, int object) +{ + if(object == ~0) + return 0.0f; + + int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES; + float4 f = kernel_tex_fetch(__objects, offset); + return f.z; +} + +__device int shader_pass_id(KernelGlobals *kg, ShaderData *sd) +{ + return kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2 + 1); +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index 2138038e49d..8e0d36705ad 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -679,11 +679,6 @@ __device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect) } #endif -__device int shader_pass_id(KernelGlobals *kg, ShaderData *sd) -{ - return kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2 + 1); -} - /* Free ShaderData */ __device void shader_release(KernelGlobals *kg, ShaderData *sd) diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 12ed61673d1..6a05639beb9 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -266,6 +266,9 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT case NODE_LIGHT_PATH: svm_node_light_path(sd, stack, node.y, node.z, path_flag); break; + case NODE_OBJECT_INFO: + svm_node_object_info(kg, sd, stack, node.y, node.z); + break; #endif case NODE_CONVERT: svm_node_convert(sd, stack, node.y, node.z, node.w); diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h index 77fe26c809e..dab19983946 100644 --- a/intern/cycles/kernel/svm/svm_geometry.h +++ b/intern/cycles/kernel/svm/svm_geometry.h @@ -74,5 +74,25 @@ __device void svm_node_geometry_bump_dy(ShaderData *sd, float *stack, uint type, #endif } +/* Object Info */ + +__device void svm_node_object_info(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset) +{ + float data; + + switch(type) { + case NODE_INFO_OB_LOCATION: { + stack_store_float3(stack, out_offset, object_location(kg, sd)); + return; + } + case NODE_INFO_OB_INDEX: data = object_pass_id(kg, sd->object); break; + case NODE_INFO_MAT_INDEX: data = shader_pass_id(kg, sd); break; + case NODE_INFO_OB_RANDOM: data = object_random_number(kg, sd->object); break; + default: data = 0.0f; break; + } + + stack_store_float(stack, out_offset, data); +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 867709f29e0..97849736ef6 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -92,7 +92,8 @@ typedef enum NodeType { NODE_RGB_RAMP = 5900, NODE_RGB_CURVES = 6000, NODE_MIN_MAX = 6100, - NODE_LIGHT_FALLOFF = 6200 + NODE_LIGHT_FALLOFF = 6200, + NODE_OBJECT_INFO = 6300 } NodeType; typedef enum NodeAttributeType { @@ -109,6 +110,13 @@ typedef enum NodeGeometry { NODE_GEOM_uv } NodeGeometry; +typedef enum NodeObjectInfo { + NODE_INFO_OB_LOCATION, + NODE_INFO_OB_INDEX, + NODE_INFO_MAT_INDEX, + NODE_INFO_OB_RANDOM +} NodeObjectInfo; + typedef enum NodeLightPath { NODE_LP_camera = 0, NODE_LP_shadow, diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 57fe2fb01b7..506458d82e1 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1699,7 +1699,7 @@ void LightPathNode::compile(OSLCompiler& compiler) compiler.add(this, "node_light_path"); } -/* Light Path */ +/* Light Falloff */ LightFalloffNode::LightFalloffNode() : ShaderNode("light_path") @@ -1746,6 +1746,49 @@ void LightFalloffNode::compile(OSLCompiler& compiler) compiler.add(this, "node_light_falloff"); } +/* Object Info */ + +ObjectInfoNode::ObjectInfoNode() +: ShaderNode("object_info") +{ + add_output("Location", SHADER_SOCKET_VECTOR); + add_output("Object Index", SHADER_SOCKET_FLOAT); + add_output("Material Index", SHADER_SOCKET_FLOAT); + add_output("Random", SHADER_SOCKET_FLOAT); +} + +void ObjectInfoNode::compile(SVMCompiler& compiler) +{ + ShaderOutput *out = output("Location"); + if(!out->links.empty()) { + compiler.stack_assign(out); + compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_LOCATION, out->stack_offset); + } + + out = output("Object Index"); + if(!out->links.empty()) { + compiler.stack_assign(out); + compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_INDEX, out->stack_offset); + } + + out = output("Material Index"); + if(!out->links.empty()) { + compiler.stack_assign(out); + compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_MAT_INDEX, out->stack_offset); + } + + out = output("Random"); + if(!out->links.empty()) { + compiler.stack_assign(out); + compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_RANDOM, out->stack_offset); + } +} + +void ObjectInfoNode::compile(OSLCompiler& compiler) +{ + compiler.add(this, "node_object_info"); +} + /* Value */ ValueNode::ValueNode() diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index ff9e3647d01..2d0d58d1e94 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -285,6 +285,11 @@ public: SHADER_NODE_CLASS(LightFalloffNode) }; +class ObjectInfoNode : public ShaderNode { +public: + SHADER_NODE_CLASS(ObjectInfoNode) +}; + class ValueNode : public ShaderNode { public: SHADER_NODE_CLASS(ValueNode) diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index cae69c06f7d..e38b2635f90 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -23,6 +23,7 @@ #include "scene.h" #include "util_foreach.h" +#include "util_hash.h" #include "util_map.h" #include "util_progress.h" @@ -36,6 +37,7 @@ Object::Object() mesh = NULL; tfm = transform_identity(); visibility = ~0; + instance_id = 0; pass_id = 0; bounds = BoundBox::empty; motion.pre = transform_identity(); @@ -164,6 +166,9 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene float surface_area = 0.0f; float pass_id = ob->pass_id; + uint ob_hash = hash_int_2d(hash_string(ob->name.c_str()), ob->instance_id); + float random_number = (float)ob_hash * (1.0f/(float)0xFFFFFFFF); + if(transform_uniform_scale(tfm, uniform_scale)) { map::iterator it = surface_area_map.find(mesh); @@ -198,7 +203,7 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene memcpy(&objects[offset], &tfm, sizeof(float4)*3); memcpy(&objects[offset+3], &itfm, sizeof(float4)*3); - objects[offset+6] = make_float4(surface_area, pass_id, 0.0f, 0.0f); + objects[offset+6] = make_float4(surface_area, pass_id, random_number, 0.0f); if(need_motion == Scene::MOTION_PASS) { /* motion transformations, is world/object space depending if mesh diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h index 267052bfca7..b8169e3758e 100644 --- a/intern/cycles/render/object.h +++ b/intern/cycles/render/object.h @@ -41,6 +41,7 @@ public: Transform tfm; BoundBox bounds; ustring name; + int instance_id; int pass_id; vector attributes; uint visibility; diff --git a/intern/cycles/util/util_hash.h b/intern/cycles/util/util_hash.h index 16901dab38e..c31b46e1580 100644 --- a/intern/cycles/util/util_hash.h +++ b/intern/cycles/util/util_hash.h @@ -19,13 +19,15 @@ #ifndef __UTIL_HASH_H__ #define __UTIL_HASH_H__ +#include "util_types.h" + CCL_NAMESPACE_BEGIN -static inline unsigned int hash_int_2d(unsigned int kx, unsigned int ky) +static inline uint hash_int_2d(uint kx, uint ky) { #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) - unsigned int a, b, c; + uint a, b, c; a = b = c = 0xdeadbeef + (2 << 2) + 13; a += kx; @@ -44,11 +46,21 @@ static inline unsigned int hash_int_2d(unsigned int kx, unsigned int ky) #undef rot } -static inline unsigned int hash_int(unsigned int k) +static inline uint hash_int(uint k) { return hash_int_2d(k, 0); } +static inline uint hash_string(const char *str) +{ + uint i = 0, c; + + while ((c = *str++)) + i = i * 37 + c; + + return i; +} + CCL_NAMESPACE_END #endif /* __UTIL_HASH_H__ */ diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index a6018a45821..cb899dcc902 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -516,6 +516,7 @@ struct ShadeResult; #define SH_NODE_TEX_CHECKER 164 #define SH_NODE_BRIGHTCONTRAST 165 #define SH_NODE_LIGHT_FALLOFF 166 +#define SH_NODE_OBJECT_INFO 167 /* custom defines options for Material node */ #define SH_NODE_MAT_DIFF 1 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 8771e8de67e..fc62d69d002 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1977,6 +1977,7 @@ static void registerShaderNodes(bNodeTreeType *ttype) register_node_type_sh_geometry(ttype); register_node_type_sh_light_path(ttype); register_node_type_sh_light_falloff(ttype); + register_node_type_sh_object_info(ttype); register_node_type_sh_fresnel(ttype); register_node_type_sh_layer_weight(ttype); register_node_type_sh_tex_coord(ttype); diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 7e4312e21e0..65c0bcb3c63 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2206,6 +2206,15 @@ void node_light_falloff(float strength, float tsmooth, out float quadratic, out constant = strength; } +void node_object_info(out vec3 location, out float object_index, out float material_index, out float random) +{ + location = vec3(0.0); + object_index = 0.0; + material_index = 0.0; + random = 0.0; +} + + /* output */ void node_output_material(vec4 surface, vec4 volume, float displacement, out vec4 result) diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl.c b/source/blender/gpu/shaders/gpu_shader_material.glsl.c index 91b2b13ea1a..99fb18a98ec 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl.c +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl.c @@ -1,1598 +1,1604 @@ /* DataToC output of file */ -int datatoc_gpu_shader_material_glsl_size = 51015; +int datatoc_gpu_shader_material_glsl_size = 51212; 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, 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, - 32, 48, 46, 51, 49, 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 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,118, 99,111,108, 95, 97,108,112,104, 97, 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,118, 99,111,108, 95, 97,108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, - 46, 97, 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, 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, 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, + 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, 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, + 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 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,118, 99,111,108, 95, 97,108,112,104, 97, 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,118, 99,111,108, 95, 97,108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 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, 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, 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,110,111,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, 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, 44, 32,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, 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,110,111,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,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,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, + 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, + 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, 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,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,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, + 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, 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,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, + 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, 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, +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,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40, + 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,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118, +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,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, + 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, 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,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, +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,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,103,108, 95, 77,111,100,101,108, 86,105,101,119, - 77, 97,116,114,105,120, 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,103,108, 95, 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105,120, 73,110,118,101,114,115,101, 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, 35,105,102,100, -101,102, 32, 66, 85, 77, 80, 95, 66, 73, 67, 85, 66, 73, 67, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, - 98,105, 99,117, 98,105, 99, 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,102,108,111, 97,116, 32, 72,108, 59, 10, 9,102,108,111, 97,116, 32, 72,114, 59, 10, - 9,102,108,111, 97,116, 32, 72,100, 59, 10, 9,102,108,111, 97,116, 32, 72,117, 59, 10, 9, 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, 32, 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,114,103, 98,116,111, 98,119, 40,116,101,120,116,117,114,101, 50, 68, 40,105, -109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40,116,101,120,116,117,114,101, 50, - 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40,116,101,120,116,117, -114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40,116,101, -120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 41, 59, 10, 9, 10, 9,118,101, 99, 50, 32, -100, 72,100,120,121, 32, 61, 32,118,101, 99, 50, 40, 72,114, 32, 45, 32, 72,108, 44, 32, 72,117, 32, 45, 32, 72,100, 41, 59, 10, - 9,102,108,111, 97,116, 32,102, 66,108,101,110,100, 32, 61, 32, 99,108, 97,109,112, 40, 49, 46, 48, 45,116,101,120,116,117,114, -101, 81,117,101,114,121, 76, 79, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120, 44, 32, 48, 46, 48, 44, - 32, 49, 46, 48, 41, 59, 10, 9,105,102, 40,102, 66,108,101,110,100, 33, 61, 48, 46, 48, 41, 10, 9,123, 10, 9, 9, 47, 47, 32, -116,104,101, 32,100,101,114,105,118, 97,116,105,118,101, 32,111,102, 32,116,104,101, 32, 98,105, 99,117, 98,105, 99, 32,115, 97, -109,112,108,105,110,103, 32,111,102, 32,108,101,118,101,108, 32, 48, 10, 9, 9,105,118,101, 99, 50, 32,118, 68,105,109, 59, 10, - 9, 9,118, 68,105,109, 32, 61, 32,116,101,120,116,117,114,101, 83,105,122,101, 40,105,109, 97, 44, 32, 48, 41, 59, 10, 10, 9, - 9, 47, 47, 32,116, 97,107,105,110,103, 32,116,104,101, 32,102,114, 97, 99,116, 32,112, 97,114,116, 32,111,102, 32,116,104,101, - 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 32,105,115, 32, 97, 32,104, 97,114,100, 99,111,100, -101,100, 32,119,114, 97,112, 32,109,111,100,101, 46, 10, 9, 9, 47, 47, 32,116,104,105,115, 32,105,115, 32, 97, 99, 99,101,112, -116, 97, 98,108,101, 32, 97,115, 32,116,101,120,116,117,114,101,115, 32,117,115,101, 32,119,114, 97,112, 32,109,111,100,101, 32, -101,120, 99,108,117,115,105,118,101,108,121, 32,105,110, 32, 51, 68, 32,118,105,101,119, 32,101,108,115,101,119,104,101,114,101, - 32,105,110, 32, 98,108,101,110,100,101,114, 46, 32, 10, 9, 9, 47, 47, 32,116,104,105,115, 32,105,115, 32,100,111,110,101, 32, -115,111, 32,116,104, 97,116, 32,119,101, 32, 99, 97,110, 32,115,116,105,108,108, 32,103,101,116, 32, 97, 32,118, 97,108,105,100, - 32,116,101,120,101,108, 32,119,105,116,104, 32,117,118,115, 32,111,117,116,115,105,100,101, 32,116,104,101, 32, 48, 44, 49, 32, -114, 97,110,103,101, 10, 9, 9, 47, 47, 32, 98,121, 32,116,101,120,101,108, 70,101,116, 99,104, 32, 98,101,108,111,119, 44, 32, - 97,115, 32, 99,111,111,114,100,105,110, 97,116,101,115, 32, 97,114,101, 32, 99,108, 97,109,112,101,100, 32,119,104,101,110, 32, -117,115,105,110,103, 32,116,104,105,115, 32,102,117,110, 99,116,105,111,110, 46, 10, 9, 9,118,101, 99, 50, 32,102, 84,101,120, - 76,111, 99, 32, 61, 32,118, 68,105,109, 42,102,114, 97, 99,116, 40,116,101,120, 99,111, 46,120,121, 41, 32, 45, 32,118,101, 99, - 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 59, 10, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 76,111, 99, 32, 61, 32,105, -118,101, 99, 50, 40,102,108,111,111,114, 40,102, 84,101,120, 76,111, 99, 41, 41, 59, 10, 9, 9,118,101, 99, 50, 32,116, 32, 61, - 32, 99,108, 97,109,112, 40,102, 84,101,120, 76,111, 99, 32, 45, 32,105, 84,101,120, 76,111, 99, 44, 32, 48, 46, 48, 44, 32, 49, - 46, 48, 41, 59, 9, 9, 47, 47, 32,115, 97,116, 32,106,117,115,116, 32,116,111, 32, 98,101, 32,112,101,100, 97,110,116,105, 99, - 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 32, - 42, 32, 84,104,105,115, 32, 98,108,111, 99,107, 32,119,105,108,108, 32,114,101,112,108, 97, 99,101, 32,116,104,101, 32,111,110, -101, 32, 98,101,108,111,119, 32,119,104,101,110, 32,111,110,101, 32, 99,104, 97,110,110,101,108, 32,116,101,120,116,117,114,101, -115, 32, 97,114,101, 32,112,114,111,112,101,114,108,121, 32,115,117,112,112,111,114,116,101,100, 46, 32, 42, 10, 32, 42, 42, 42, + 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,103,108, 95, 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105, +120, 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,103,108, 95, + 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105,120, 73,110,118,101,114,115,101, 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, 35,105,102,100,101,102, 32, 66, 85, + 77, 80, 95, 66, 73, 67, 85, 66, 73, 67, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 98,105, 99,117, 98, +105, 99, 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,102,108,111, 97,116, 32, 72,108, 59, 10, 9,102,108,111, 97,116, 32, 72,114, 59, 10, 9,102,108,111, 97, +116, 32, 72,100, 59, 10, 9,102,108,111, 97,116, 32, 72,117, 59, 10, 9, 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, 32, 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,114,103, 98,116,111, 98,119, 40,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, + 84,108, 41, 44, 32, 72,108, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, + 44, 32, 83, 84,114, 41, 44, 32, 72,114, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40,116,101,120,116,117,114,101, 50, 68, 40, +105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40,116,101,120,116,117,114,101, + 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 41, 59, 10, 9, 10, 9,118,101, 99, 50, 32,100, 72,100,120,121, + 32, 61, 32,118,101, 99, 50, 40, 72,114, 32, 45, 32, 72,108, 44, 32, 72,117, 32, 45, 32, 72,100, 41, 59, 10, 9,102,108,111, 97, +116, 32,102, 66,108,101,110,100, 32, 61, 32, 99,108, 97,109,112, 40, 49, 46, 48, 45,116,101,120,116,117,114,101, 81,117,101,114, +121, 76, 79, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, + 59, 10, 9,105,102, 40,102, 66,108,101,110,100, 33, 61, 48, 46, 48, 41, 10, 9,123, 10, 9, 9, 47, 47, 32,116,104,101, 32,100, +101,114,105,118, 97,116,105,118,101, 32,111,102, 32,116,104,101, 32, 98,105, 99,117, 98,105, 99, 32,115, 97,109,112,108,105,110, +103, 32,111,102, 32,108,101,118,101,108, 32, 48, 10, 9, 9,105,118,101, 99, 50, 32,118, 68,105,109, 59, 10, 9, 9,118, 68,105, +109, 32, 61, 32,116,101,120,116,117,114,101, 83,105,122,101, 40,105,109, 97, 44, 32, 48, 41, 59, 10, 10, 9, 9, 47, 47, 32,116, + 97,107,105,110,103, 32,116,104,101, 32,102,114, 97, 99,116, 32,112, 97,114,116, 32,111,102, 32,116,104,101, 32,116,101,120,116, +117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 32,105,115, 32, 97, 32,104, 97,114,100, 99,111,100,101,100, 32,119,114, + 97,112, 32,109,111,100,101, 46, 10, 9, 9, 47, 47, 32,116,104,105,115, 32,105,115, 32, 97, 99, 99,101,112,116, 97, 98,108,101, + 32, 97,115, 32,116,101,120,116,117,114,101,115, 32,117,115,101, 32,119,114, 97,112, 32,109,111,100,101, 32,101,120, 99,108,117, +115,105,118,101,108,121, 32,105,110, 32, 51, 68, 32,118,105,101,119, 32,101,108,115,101,119,104,101,114,101, 32,105,110, 32, 98, +108,101,110,100,101,114, 46, 32, 10, 9, 9, 47, 47, 32,116,104,105,115, 32,105,115, 32,100,111,110,101, 32,115,111, 32,116,104, + 97,116, 32,119,101, 32, 99, 97,110, 32,115,116,105,108,108, 32,103,101,116, 32, 97, 32,118, 97,108,105,100, 32,116,101,120,101, +108, 32,119,105,116,104, 32,117,118,115, 32,111,117,116,115,105,100,101, 32,116,104,101, 32, 48, 44, 49, 32,114, 97,110,103,101, + 10, 9, 9, 47, 47, 32, 98,121, 32,116,101,120,101,108, 70,101,116, 99,104, 32, 98,101,108,111,119, 44, 32, 97,115, 32, 99,111, +111,114,100,105,110, 97,116,101,115, 32, 97,114,101, 32, 99,108, 97,109,112,101,100, 32,119,104,101,110, 32,117,115,105,110,103, + 32,116,104,105,115, 32,102,117,110, 99,116,105,111,110, 46, 10, 9, 9,118,101, 99, 50, 32,102, 84,101,120, 76,111, 99, 32, 61, + 32,118, 68,105,109, 42,102,114, 97, 99,116, 40,116,101,120, 99,111, 46,120,121, 41, 32, 45, 32,118,101, 99, 50, 40, 48, 46, 53, + 44, 32, 48, 46, 53, 41, 59, 10, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 76,111, 99, 32, 61, 32,105,118,101, 99, 50, 40, +102,108,111,111,114, 40,102, 84,101,120, 76,111, 99, 41, 41, 59, 10, 9, 9,118,101, 99, 50, 32,116, 32, 61, 32, 99,108, 97,109, +112, 40,102, 84,101,120, 76,111, 99, 32, 45, 32,105, 84,101,120, 76,111, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 9, + 9, 47, 47, 32,115, 97,116, 32,106,117,115,116, 32,116,111, 32, 98,101, 32,112,101,100, 97,110,116,105, 99, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 9, 9,118,101, 99, 52, 32, -118, 83, 97,109,112,108,101,115, 85, 76, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, - 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 45, 49, 44, 45, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, - 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 85, 82, - 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105, -118,101, 99, 50, 40, 49, 44, 45, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, - 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 76, 76, 32, 61, 32,116,101,120,116,117,114,101, 71, - 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 45, 49, 44, 49, 41, 32, - 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32, -118, 83, 97,109,112,108,101,115, 76, 82, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, - 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 49, 44, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, - 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 10, 9, 9,109, 97,116, 52, 32, 72, 32, 61, 32,109, 97,116, 52, 40,118, 83, - 97,109,112,108,101,115, 85, 76, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 85, 76, 46,120, 44, 32,118, 83, 97,109,112,108, -101,115, 76, 76, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,120, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,112, -108,101,115, 85, 76, 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 85, 76, 46,121, 44, 32,118, 83, 97,109,112,108,101,115, 76, - 76, 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,121, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,112,108,101,115, - 85, 82, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 85, 82, 46,120, 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,119, - 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,120, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,112,108,101,115, 85, 82, 46, -122, 44, 32,118, 83, 97,109,112,108,101,115, 85, 82, 46,121, 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,122, 44, 32,118, - 83, 97,109,112,108,101,115, 76, 82, 46,121, 41, 59, 10, 42, 47, 9, 10, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 76,111, - 99, 77,111,100, 32, 61, 32,105, 84,101,120, 76,111, 99, 32, 43, 32,105,118,101, 99, 50, 40, 45, 49, 44, 32, 45, 49, 41, 59, 10, - 10, 9, 9,109, 97,116, 52, 32, 72, 59, 10, 9, 9, 10, 9, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, - 32, 60, 32, 52, 59, 32,105, 43, 43, 41,123, 10, 9, 9, 9,102,111,114, 40,105,110,116, 32,106, 32, 61, 32, 48, 59, 32,106, 32, - 60, 32, 52, 59, 32,106, 43, 43, 41,123, 10, 9, 9, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 84,109,112, 32, 61, 32,105, - 84,101,120, 76,111, 99, 77,111,100, 32, 43, 32,105,118,101, 99, 50, 40,105, 44,106, 41, 59, 10, 9, 9, 9, 9, 10, 9, 9, 9, - 9, 47, 47, 32,119,114, 97,112, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101,115, 32,109, 97,110, -117, 97,108,108,121, 32,102,111,114, 32,116,101,120,101,108, 70,101,116, 99,104, 32,116,111, 32,119,111,114,107, 32,111,110, 32, -117,118,115, 32,111,105,116,115,105,100,101, 32,116,104,101, 32, 48, 44, 49, 32,114, 97,110,103,101, 46, 10, 9, 9, 9, 9, 47, - 47, 32,116,104,105,115, 32,105,115, 32,103,117, 97,114, 97,110,116,101,101,100, 32,116,111, 32,119,111,114,107, 32,115,105,110, - 99,101, 32,119,101, 32,116, 97,107,101, 32,116,104,101, 32,102,114, 97, 99,116,105,111,110, 97,108, 32,112, 97,114,116, 32,111, -102, 32,116,104,101, 32,117,118, 32, 97, 98,111,118,101, 46, 10, 9, 9, 9, 9,105, 84,101,120, 84,109,112, 46,120, 32, 61, 32, - 40,105, 84,101,120, 84,109,112, 46,120, 32, 60, 32, 48, 41, 63, 32,105, 84,101,120, 84,109,112, 46,120, 32, 43, 32,118, 68,105, -109, 46,120, 32, 58, 32, 40, 40,105, 84,101,120, 84,109,112, 46,120, 32, 62, 61, 32,118, 68,105,109, 46,120, 41, 63, 32,105, 84, -101,120, 84,109,112, 46,120, 32, 45, 32,118, 68,105,109, 46,120, 32, 58, 32,105, 84,101,120, 84,109,112, 46,120, 41, 59, 10, 9, - 9, 9, 9,105, 84,101,120, 84,109,112, 46,121, 32, 61, 32, 40,105, 84,101,120, 84,109,112, 46,121, 32, 60, 32, 48, 41, 63, 32, -105, 84,101,120, 84,109,112, 46,121, 32, 43, 32,118, 68,105,109, 46,121, 32, 58, 32, 40, 40,105, 84,101,120, 84,109,112, 46,121, - 32, 62, 61, 32,118, 68,105,109, 46,121, 41, 63, 32,105, 84,101,120, 84,109,112, 46,121, 32, 45, 32,118, 68,105,109, 46,121, 32, - 58, 32,105, 84,101,120, 84,109,112, 46,121, 41, 59, 10, 10, 9, 9, 9, 9,114,103, 98,116,111, 98,119, 40,116,101,120,101,108, - 70,101,116, 99,104, 40,105,109, 97, 44, 32,105, 84,101,120, 84,109,112, 44, 32, 48, 41, 44, 32, 72, 91,105, 93, 91,106, 93, 41, - 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9, 9, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,116, 46,120, 44, 32,121, - 32, 61, 32,116, 46,121, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 50, 32, 61, 32,120, 32, 42, 32,120, 44, 32,120, 51, 32, 61, - 32,120, 50, 32, 42, 32,120, 44, 32,121, 50, 32, 61, 32,121, 32, 42, 32,121, 44, 32,121, 51, 32, 61, 32,121, 50, 32, 42, 32,121, - 59, 10, 10, 9, 9,118,101, 99, 52, 32, 88, 32, 61, 32,118,101, 99, 52, 40, 45, 48, 46, 53, 42, 40,120, 51, 43,120, 41, 43,120, - 50, 44, 9, 9, 49, 46, 53, 42,120, 51, 45, 50, 46, 53, 42,120, 50, 43, 49, 44, 9, 45, 49, 46, 53, 42,120, 51, 43, 50, 42,120, - 50, 43, 48, 46, 53, 42,120, 44, 9, 9, 48, 46, 53, 42, 40,120, 51, 45,120, 50, 41, 41, 59, 10, 9, 9,118,101, 99, 52, 32, 89, - 32, 61, 32,118,101, 99, 52, 40, 45, 48, 46, 53, 42, 40,121, 51, 43,121, 41, 43,121, 50, 44, 9, 9, 49, 46, 53, 42,121, 51, 45, - 50, 46, 53, 42,121, 50, 43, 49, 44, 9, 45, 49, 46, 53, 42,121, 51, 43, 50, 42,121, 50, 43, 48, 46, 53, 42,121, 44, 9, 9, 48, - 46, 53, 42, 40,121, 51, 45,121, 50, 41, 41, 59, 10, 9, 9,118,101, 99, 52, 32,100, 88, 32, 61, 32,118,101, 99, 52, 40, 45, 49, - 46, 53, 42,120, 50, 43, 50, 42,120, 45, 48, 46, 53, 44, 9, 9, 52, 46, 53, 42,120, 50, 45, 53, 42,120, 44, 9, 9, 9, 45, 52, - 46, 53, 42,120, 50, 43, 52, 42,120, 43, 48, 46, 53, 44, 9, 9, 49, 46, 53, 42,120, 50, 45,120, 41, 59, 10, 9, 9,118,101, 99, - 52, 32,100, 89, 32, 61, 32,118,101, 99, 52, 40, 45, 49, 46, 53, 42,121, 50, 43, 50, 42,121, 45, 48, 46, 53, 44, 9, 9, 52, 46, - 53, 42,121, 50, 45, 53, 42,121, 44, 9, 9, 9, 45, 52, 46, 53, 42,121, 50, 43, 52, 42,121, 43, 48, 46, 53, 44, 9, 9, 49, 46, - 53, 42,121, 50, 45,121, 41, 59, 10, 9, 10, 9, 9, 47, 47, 32, 99,111,109,112,108,101,116,101, 32,100,101,114,105,118, 97,116, -105,118,101, 32,105,110, 32,110,111,114,109, 97,108,105,122,101,100, 32, 99,111,111,114,100,105,110, 97,116,101,115, 32, 40,109, -117,108, 32, 98,121, 32,118, 68,105,109, 41, 10, 9, 9,118,101, 99, 50, 32,100, 72,100, 83, 84, 32, 61, 32,118, 68,105,109, 32, - 42, 32,118,101, 99, 50, 40,100,111,116, 40, 89, 44, 32, 72, 32, 42, 32,100, 88, 41, 44, 32,100,111,116, 40,100, 89, 44, 32, 72, - 32, 42, 32, 88, 41, 41, 59, 10, 10, 9, 9, 47, 47, 32,116,114, 97,110,115,102,111,114,109, 32,100,101,114,105,118, 97,116,105, -118,101, 32,116,111, 32,115, 99,114,101,101,110, 45,115,112, 97, 99,101, 10, 9, 9,118,101, 99, 50, 32,100, 72,100,120,121, 95, - 98,105, 99,117, 98,105, 99, 32, 61, 32,118,101, 99, 50, 40, 32,100, 72,100, 83, 84, 46,120, 32, 42, 32, 84,101,120, 68,120, 46, -120, 32, 43, 32,100, 72,100, 83, 84, 46,121, 32, 42, 32, 84,101,120, 68,120, 46,121, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, - 32, 32,100, 72,100, 83, 84, 46,120, 32, 42, 32, 84,101,120, 68,121, 46,120, 32, 43, 32,100, 72,100, 83, 84, 46,121, 32, 42, 32, - 84,101,120, 68,121, 46,121, 32, 41, 59, 10, 10, 9, 9, 47, 47, 32, 98,108,101,110,100, 32, 98,101,116,119,101,101,110, 32,116, -104,101, 32,116,119,111, 10, 9, 9,100, 72,100,120,121, 32, 61, 32,100, 72,100,120,121, 42, 40, 49, 45,102, 66,108,101,110,100, - 41, 32, 43, 32,100, 72,100,120,121, 95, 98,105, 99,117, 98,105, 99, 42,102, 66,108,101,110,100, 59, 10, 9,125, 10, 10, 9,100, - 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32,100, 72,100,120,121, 46,120, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, - 99, 97,108,101, 32, 42, 32,100, 72,100,120,121, 46,121, 59, 10,125, 10, 10, 35,101,110,100,105,102, 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, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 32, 42, 32, 84,104,105, +115, 32, 98,108,111, 99,107, 32,119,105,108,108, 32,114,101,112,108, 97, 99,101, 32,116,104,101, 32,111,110,101, 32, 98,101,108, +111,119, 32,119,104,101,110, 32,111,110,101, 32, 99,104, 97,110,110,101,108, 32,116,101,120,116,117,114,101,115, 32, 97,114,101, + 32,112,114,111,112,101,114,108,121, 32,115,117,112,112,111,114,116,101,100, 46, 32, 42, 10, 32, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112, +108,101,115, 85, 76, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120, + 76,111, 99, 43,105,118,101, 99, 50, 40, 45, 49, 44, 45, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, + 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 85, 82, 32, 61, 32,116,101, +120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, + 49, 44, 45, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, + 9,118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 76, 76, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, + 40,105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 45, 49, 44, 49, 41, 32, 43, 32,118,101, 99, + 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112, +108,101,115, 76, 82, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120, + 76,111, 99, 43,105,118,101, 99, 50, 40, 49, 44, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47, +118, 68,105,109, 32, 41, 59, 10, 10, 9, 9,109, 97,116, 52, 32, 72, 32, 61, 32,109, 97,116, 52, 40,118, 83, 97,109,112,108,101, +115, 85, 76, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 85, 76, 46,120, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46, +119, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,120, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,112,108,101,115, 85, 76, + 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 85, 76, 46,121, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,122, 44, 32, +118, 83, 97,109,112,108,101,115, 76, 76, 46,121, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,112,108,101,115, 85, 82, 46,119, 44, + 32,118, 83, 97,109,112,108,101,115, 85, 82, 46,120, 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,119, 44, 32,118, 83, 97, +109,112,108,101,115, 76, 82, 46,120, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,112,108,101,115, 85, 82, 46,122, 44, 32,118, 83, + 97,109,112,108,101,115, 85, 82, 46,121, 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,122, 44, 32,118, 83, 97,109,112,108, +101,115, 76, 82, 46,121, 41, 59, 10, 42, 47, 9, 10, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 76,111, 99, 77,111,100, 32, + 61, 32,105, 84,101,120, 76,111, 99, 32, 43, 32,105,118,101, 99, 50, 40, 45, 49, 44, 32, 45, 49, 41, 59, 10, 10, 9, 9,109, 97, +116, 52, 32, 72, 59, 10, 9, 9, 10, 9, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 52, 59, + 32,105, 43, 43, 41,123, 10, 9, 9, 9,102,111,114, 40,105,110,116, 32,106, 32, 61, 32, 48, 59, 32,106, 32, 60, 32, 52, 59, 32, +106, 43, 43, 41,123, 10, 9, 9, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 84,109,112, 32, 61, 32,105, 84,101,120, 76,111, + 99, 77,111,100, 32, 43, 32,105,118,101, 99, 50, 40,105, 44,106, 41, 59, 10, 9, 9, 9, 9, 10, 9, 9, 9, 9, 47, 47, 32,119, +114, 97,112, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101,115, 32,109, 97,110,117, 97,108,108,121, + 32,102,111,114, 32,116,101,120,101,108, 70,101,116, 99,104, 32,116,111, 32,119,111,114,107, 32,111,110, 32,117,118,115, 32,111, +105,116,115,105,100,101, 32,116,104,101, 32, 48, 44, 49, 32,114, 97,110,103,101, 46, 10, 9, 9, 9, 9, 47, 47, 32,116,104,105, +115, 32,105,115, 32,103,117, 97,114, 97,110,116,101,101,100, 32,116,111, 32,119,111,114,107, 32,115,105,110, 99,101, 32,119,101, + 32,116, 97,107,101, 32,116,104,101, 32,102,114, 97, 99,116,105,111,110, 97,108, 32,112, 97,114,116, 32,111,102, 32,116,104,101, + 32,117,118, 32, 97, 98,111,118,101, 46, 10, 9, 9, 9, 9,105, 84,101,120, 84,109,112, 46,120, 32, 61, 32, 40,105, 84,101,120, + 84,109,112, 46,120, 32, 60, 32, 48, 41, 63, 32,105, 84,101,120, 84,109,112, 46,120, 32, 43, 32,118, 68,105,109, 46,120, 32, 58, + 32, 40, 40,105, 84,101,120, 84,109,112, 46,120, 32, 62, 61, 32,118, 68,105,109, 46,120, 41, 63, 32,105, 84,101,120, 84,109,112, + 46,120, 32, 45, 32,118, 68,105,109, 46,120, 32, 58, 32,105, 84,101,120, 84,109,112, 46,120, 41, 59, 10, 9, 9, 9, 9,105, 84, +101,120, 84,109,112, 46,121, 32, 61, 32, 40,105, 84,101,120, 84,109,112, 46,121, 32, 60, 32, 48, 41, 63, 32,105, 84,101,120, 84, +109,112, 46,121, 32, 43, 32,118, 68,105,109, 46,121, 32, 58, 32, 40, 40,105, 84,101,120, 84,109,112, 46,121, 32, 62, 61, 32,118, + 68,105,109, 46,121, 41, 63, 32,105, 84,101,120, 84,109,112, 46,121, 32, 45, 32,118, 68,105,109, 46,121, 32, 58, 32,105, 84,101, +120, 84,109,112, 46,121, 41, 59, 10, 10, 9, 9, 9, 9,114,103, 98,116,111, 98,119, 40,116,101,120,101,108, 70,101,116, 99,104, + 40,105,109, 97, 44, 32,105, 84,101,120, 84,109,112, 44, 32, 48, 41, 44, 32, 72, 91,105, 93, 91,106, 93, 41, 59, 10, 9, 9, 9, +125, 10, 9, 9,125, 10, 9, 9, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,116, 46,120, 44, 32,121, 32, 61, 32,116, 46, +121, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 50, 32, 61, 32,120, 32, 42, 32,120, 44, 32,120, 51, 32, 61, 32,120, 50, 32, 42, + 32,120, 44, 32,121, 50, 32, 61, 32,121, 32, 42, 32,121, 44, 32,121, 51, 32, 61, 32,121, 50, 32, 42, 32,121, 59, 10, 10, 9, 9, +118,101, 99, 52, 32, 88, 32, 61, 32,118,101, 99, 52, 40, 45, 48, 46, 53, 42, 40,120, 51, 43,120, 41, 43,120, 50, 44, 9, 9, 49, + 46, 53, 42,120, 51, 45, 50, 46, 53, 42,120, 50, 43, 49, 44, 9, 45, 49, 46, 53, 42,120, 51, 43, 50, 42,120, 50, 43, 48, 46, 53, + 42,120, 44, 9, 9, 48, 46, 53, 42, 40,120, 51, 45,120, 50, 41, 41, 59, 10, 9, 9,118,101, 99, 52, 32, 89, 32, 61, 32,118,101, + 99, 52, 40, 45, 48, 46, 53, 42, 40,121, 51, 43,121, 41, 43,121, 50, 44, 9, 9, 49, 46, 53, 42,121, 51, 45, 50, 46, 53, 42,121, + 50, 43, 49, 44, 9, 45, 49, 46, 53, 42,121, 51, 43, 50, 42,121, 50, 43, 48, 46, 53, 42,121, 44, 9, 9, 48, 46, 53, 42, 40,121, + 51, 45,121, 50, 41, 41, 59, 10, 9, 9,118,101, 99, 52, 32,100, 88, 32, 61, 32,118,101, 99, 52, 40, 45, 49, 46, 53, 42,120, 50, + 43, 50, 42,120, 45, 48, 46, 53, 44, 9, 9, 52, 46, 53, 42,120, 50, 45, 53, 42,120, 44, 9, 9, 9, 45, 52, 46, 53, 42,120, 50, + 43, 52, 42,120, 43, 48, 46, 53, 44, 9, 9, 49, 46, 53, 42,120, 50, 45,120, 41, 59, 10, 9, 9,118,101, 99, 52, 32,100, 89, 32, + 61, 32,118,101, 99, 52, 40, 45, 49, 46, 53, 42,121, 50, 43, 50, 42,121, 45, 48, 46, 53, 44, 9, 9, 52, 46, 53, 42,121, 50, 45, + 53, 42,121, 44, 9, 9, 9, 45, 52, 46, 53, 42,121, 50, 43, 52, 42,121, 43, 48, 46, 53, 44, 9, 9, 49, 46, 53, 42,121, 50, 45, +121, 41, 59, 10, 9, 10, 9, 9, 47, 47, 32, 99,111,109,112,108,101,116,101, 32,100,101,114,105,118, 97,116,105,118,101, 32,105, +110, 32,110,111,114,109, 97,108,105,122,101,100, 32, 99,111,111,114,100,105,110, 97,116,101,115, 32, 40,109,117,108, 32, 98,121, + 32,118, 68,105,109, 41, 10, 9, 9,118,101, 99, 50, 32,100, 72,100, 83, 84, 32, 61, 32,118, 68,105,109, 32, 42, 32,118,101, 99, + 50, 40,100,111,116, 40, 89, 44, 32, 72, 32, 42, 32,100, 88, 41, 44, 32,100,111,116, 40,100, 89, 44, 32, 72, 32, 42, 32, 88, 41, + 41, 59, 10, 10, 9, 9, 47, 47, 32,116,114, 97,110,115,102,111,114,109, 32,100,101,114,105,118, 97,116,105,118,101, 32,116,111, + 32,115, 99,114,101,101,110, 45,115,112, 97, 99,101, 10, 9, 9,118,101, 99, 50, 32,100, 72,100,120,121, 95, 98,105, 99,117, 98, +105, 99, 32, 61, 32,118,101, 99, 50, 40, 32,100, 72,100, 83, 84, 46,120, 32, 42, 32, 84,101,120, 68,120, 46,120, 32, 43, 32,100, + 72,100, 83, 84, 46,121, 32, 42, 32, 84,101,120, 68,120, 46,121, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,100, 72,100, + 83, 84, 46,120, 32, 42, 32, 84,101,120, 68,121, 46,120, 32, 43, 32,100, 72,100, 83, 84, 46,121, 32, 42, 32, 84,101,120, 68,121, + 46,121, 32, 41, 59, 10, 10, 9, 9, 47, 47, 32, 98,108,101,110,100, 32, 98,101,116,119,101,101,110, 32,116,104,101, 32,116,119, +111, 10, 9, 9,100, 72,100,120,121, 32, 61, 32,100, 72,100,120,121, 42, 40, 49, 45,102, 66,108,101,110,100, 41, 32, 43, 32,100, + 72,100,120,121, 95, 98,105, 99,117, 98,105, 99, 42,102, 66,108,101,110,100, 59, 10, 9,125, 10, 10, 9,100, 66,115, 32, 61, 32, +104, 83, 99, 97,108,101, 32, 42, 32,100, 72,100,120,121, 46,120, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, + 42, 32,100, 72,100,120,121, 46,121, 59, 10,125, 10, 10, 35,101,110,100,105,102, 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,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, 41, 10,123, - 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10, 10, 9,111,117, -116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48, 41, 47,108, 97, -109,112,100,105,115,116, 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,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97,116, 52, 32,108, - 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, - 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46, 48, 41, 32, -123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101, 99, 52, 40, -108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97,120, 40, 97, - 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111,116, 46,121, - 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114,116, 40, 49, - 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61, 32, 48, 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,115,112,111,116, 95, 99, -105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118, 44, 32,108, - 97,109,112,118,101, 99, 41, 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,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111,116, 98,108, - 44, 32,102,108,111, 97,116, 32,105,110,112,114, 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, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 32, 61, 32, -115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9,111,117,116,118, -105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 32, 61, 32,105, -110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10, 9, 9,105,102, - 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115,109,111,111,116, -104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10, 9, 9,111,117, -116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 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, 99,108, 97,109,112, 40,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, 41, 10,123, - 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48, 48, 49, 41, - 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105, -101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123, 10, 9, 47, 42, - 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112,104,105, 99, - 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, - 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 58, 32,118, -101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97,110,103, 44, - 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111,115,115, 40, -108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115, 40, 99, 44, - 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111,114, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, - 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61, 32,100,111,116, - 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110,111, 95,100,105, -102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 48, 59, - 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116, 32,105,110,112, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105,110,112, 32, - 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, - 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, - 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114, 97,100, 91, 52, - 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, - 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97, -108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 50, 93, 32, - 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41, 59, 10, 9, -118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 51, 93, 46, -120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118, -101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105, -122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9, 99, 91, 50, 93, - 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, - 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, - 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111,115, 40,100, -111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93, 32, 61, 32, 97, - 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 50, - 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9, -114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, - 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 48, 93, 41, - 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93, 41, 59, 10, 9, -102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10, 9,102, 97, 99, - 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114,101,116,117,114, -110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105, -110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32,108, 97,109,112, - 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109, 97,116, 52, 32, - 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32,107, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111,115,105,116, -105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 10, 9, -105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, -105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,105,110, -116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44, 32, 99,111, - 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114,101, 97,115, -105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115, -101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118, -101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, -118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, - 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32, -118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116, 40,110, 44, - 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, - 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, -105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,118,104, 32, - 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 76, -105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 86,105,101, -119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66, 32, 61, 32, -110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118,101, 99, 51, 32, - 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59, 10, 10, 9, - 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101,119, 95, 66, - 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105,102, 40, 76,105, -116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9, - 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 97, 32, 61, - 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10, 9, 9,102,108, -111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, - 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10, 9, 9,102,108, -111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114,111, -117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61, 32, 48, 46, 57, - 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105,110, 40, 97, - 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100, -105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, - 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, - 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, - 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115, -101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116, -115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105, -115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97,101,114,116, - 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, - 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,102, 40,110, -108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, - 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, - 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10, 9, 9, 9,105, -115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100, 97,114,107, -110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112, -111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, - 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51, 32,118,105, -101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97,116, 32,102, - 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32,102,102, 97, 99, - 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, - 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32,118,110, 41, 59, - 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9, 9,101,108,115, -101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32, 40, 49, 46, 48, - 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116, 50, 60, 48, 46, - 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49, 46, 48, 41, - 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50, 59, 10, 9, -125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100, -105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, - 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97,116, 32,102, - 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114,101,115,110,101, -108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60, 49, 46, 48, - 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32, -105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118,111,105,100, 32, -115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,118,105,115, -105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105, - 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32, 61, 32,109, 97, -120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101,108,115,101, 10, - 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97,110,103, -101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, -110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97, -100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108, 97,109,112, - 99,111,108, 44, 32,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,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108, 97,109,112, - 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,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,115,104, 97,100,101, 95,104,101,109, -105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105, -101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 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,116, 41, 10,123, 10, 9,108,118, 32, 43, 61, - 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 10, 9,116, 32, - 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48, 46, 53, 59, - 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97,114,100, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,101, 99, 51, 32, -110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111, -114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,109, 97, -120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,112, -111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,111, -111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, - 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, - 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, - 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102, 40,110,104, 32, - 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108, -115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, - 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97,114,100, 41, - 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, - 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112,101, 99, 40, -118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,101, -102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102,108,111, 97, -116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48, 41, 32,123, - 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,115,112, -101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, - 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119,101,114, 60, 49, - 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46, 48, 47,115,112, -101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, - 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111, -114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, - 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9,115,112,101, 99, -102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102,108,111, 97,116, - 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 9, 9, 9,102, -108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110,108, 32, 60, 61, - 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 9,125, - 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111, -116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32, 61, 32, 49, - 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41, 47,118,104, - 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118,104, 59, 10, - 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40, 97, 32, 60, 32, - 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 98, - 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105, -102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9, 9, 9,102,108, -111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114, 97, 99, 41, 43, - 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, 32, 40, 40, 40, -112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, 41, 41, 42, 40, - 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 43, -118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 42, 40, 40, -118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97,110, -103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,109, 97,120, - 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41, 47, 40, 50, 46, - 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32, 48, 46, 48, 41, - 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119, 97,114,100, -105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, - 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, - 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108, -111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, - 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 48, 49, - 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44, 32, 48, 46, - 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115, 40,110,104, - 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48, 46, 48, 48, - 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48, 42, 77, 95, - 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114, 40, 45, 40, - 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40,115,113,114, -116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111,110, 95,115, +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, 41, 10,123, 10, 9,102,108,111, + 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10, 10, 9,111,117,116,118,105,115,105, +102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48, 41, 47,108, 97,109,112,100,105,115, +116, 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,111,116, 95, +115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97,116, 52, 32,108, 97,109,112,105,109, + 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9, +105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,118, +101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101, 99, 52, 40,108,118, 44, 32, 48, + 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97,120, 40, 97, 98,115, 40,108,118, +114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111,116, 46,121, 47,108,118,114,111, +116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114,116, 40, 49, 46, 48, 32, 43, 32, +120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61, 32, 48, 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,115,112,111,116, 95, 99,105,114, 99,108,101, + 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, + 99, 41, 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,111,116, + 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111,116, 98,108, 44, 32,102,108,111, + 97,116, 32,105,110,112,114, 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, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 32, 61, 32,115,112,111,116,115, +105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9,111,117,116,118,105,115,105,102, 97, + 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 32, 61, 32,105,110,112,114, 32, 45, + 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10, 9, 9,105,102, 40,115,112,111,116, + 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115,109,111,111,116,104,115,116,101,112, + 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10, 9, 9,111,117,116,118,105,115,105, +102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 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, 99,108, 97,109,112, 40,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, 41, 10,123, 10, 9,111,117,116, +118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48, 48, 49, 41, 63, 32, 48, 46, 48, + 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,101,119, 40,118,101, + 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123, 10, 9, 47, 42, 32,104, 97,110,100, +108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112,104,105, 99, 32, 42, 47, 10, 9, +118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, + 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 58, 32,118,101, 99, 51, 40, 48, + 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97, +110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32, +118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111,115,115, 40,108,118, 44, 32,116, + 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115, 40, 99, 44, 32,116, 97,110,103, + 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111,114, 41, 59, 10,125, 10, 10,118, +111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61, 32,100,111,116, 40,118,110, 44, 32, +108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110,111, 95,100,105,102,102,117,115,101, + 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118, +111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105,110,112, 32, 43, 32, 48, 46, 53, + 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40,109, 97,116, 52, + 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, + 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114, 97,100, 91, 52, 93, 44, 32,102, 97, + 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114, +101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, + 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 50, 93, 32, 61, 32,110,111,114, +109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 51, + 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 51, 93, 46,120,121,122, 41, 59, + 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 48, 93, + 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114, +111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9, 99, 91, 50, 93, 32, 61, 32,110,111, +114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, + 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 51, 93, 44, 32, +118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, + 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93, 32, 61, 32, 97, 99,111,115, 40,100, +111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 50, 93, 32, 61, 32, 97, + 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 51, + 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, + 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 48, 93, 41, 59, 10, 9,102, 97, + 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, + 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97, +100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114,101,116,117,114,110, 32,109, 97,120, + 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 95, 97,114, +101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,118, +101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109, 97,116, 52, 32, 97,114,101, 97, 44, + 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32,107, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111,115,105,116,105,111,110, 59, 10, + 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 10, 9,105,102, 40,100,111, +116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,110,112, 32, 61, + 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,105,110,116,101,110,115, 32, + 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44, 32, 99,111, 44, 32,118,110, 41, + 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114,101, 97,115,105,122,101, 44, 32, +107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,111,114,101, +110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, + 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, + 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, + 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, + 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, + 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, + 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, + 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, + 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 76,105,116, 95, 65, 32, + 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 86,105,101,119, 95, 65, 32, 61, + 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66, 32, 61, 32,110,111,114,109, 97, +108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118,101, 99, 51, 32, 86,105,101,119, 95, + 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59, 10, 10, 9, 9,102,108,111, 97, +116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101,119, 95, 66, 41, 44, 32, 48, 46, + 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105,102, 40, 76,105,116, 95, 65, 32, 62, + 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, + 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 86,105,101,119, + 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10, 9, 9,102,108,111, 97,116, 32, 65, + 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114, +111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 66, + 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114, +111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61, 32, 48, 46, 57, 53, 59, 10, 9, 9, +105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105,110, 40, 97, 41, 32, 42, 32,116, + 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115, +101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102, +108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,110, 44, 32,108, + 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105,102, + 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, + 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,116, +104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,115, 32, 61, 32, 49, + 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41, 59, 10,125, 10, 10, +118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97,101,114,116, 40,102,108,111, 97, +116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,100, 97,114,107, +110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,102, 40,110,108, 32, 60, 61, 32, + 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, +102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, + 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10, 9, 9, 9,105,115, 32, 61, 32,110, +108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100, 97,114,107,110,101,115,115, 32, + 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40, 49, 46, + 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9,125, 10,125, + 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51, 32,118,105,101,119, 44, 32,118, +101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, + 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32,102,102, 97, 99, 59, 10, 10, 9,105, +102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 9, +101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32,118,110, 41, 59, 10, 9, 9,105,102, + 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9, 9,101,108,115,101, 32,116, 50, 61, + 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32, 40, 49, 46, 48, 45,103,114, 97,100, + 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116, 50, 60, 48, 46, 48, 41, 32,102,102, + 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49, 46, 48, 41, 32,102,102, 97, 99, + 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50, 59, 10, 9,125, 10, 10, 9,114, +101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115, +101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, + 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114,101,115,110,101,108, 95,102, 97, 99, + 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, + 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, +116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60, 49, 46, 48, 41, 10, 9, 9,111, +117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,105,115, 41, 59, 10, + 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, + 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, + 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105, 41, 10,123, 10, 9, + 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32, 61, 32,109, 97,120, 40,105, 42,118, +105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101,108,115,101, 10, 9, 9,111,117,116, +105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, + 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, + 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,116,111, + 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32, +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,105,102, + 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108, 97,109,112, 99,111,108, 42, 99, +111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,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,115,104, 97,100,101, 95,104,101,109,105, 95,115,112,101, + 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102, +108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 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,116, 41, 10,123, 10, 9,108,118, 32, 43, 61, 32,118,105,101,119, + 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 10, 9,116, 32, 61, 32,100,111,116, + 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48, 46, 53, 59, 10, 10, 9,116, 32, + 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10, +118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, + 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105, +122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,109, 97,120, 40,100,111,116, + 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,112,111,119, 40,114,115, +108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,111,111,107,116,111,114, +114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102, +108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, + 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, + 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, + 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, + 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, + 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97,114,100, 41, 59, 10, 10, 9, 9, +105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,105, 59, 10, 9, +125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32, +110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,101,102,114, 97, 99, 44, + 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, + 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48, 41, 32,123, 10, 9, 9,115,112, +101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,115,112,101, 99, 95,112,111, +119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, +125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119,101,114, 60, 49, 48, 48, 46, 48, 41, + 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46, 48, 47,115,112,101, 99, 95,112,111, +119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32, 49, 48, 46, 48, + 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105, +122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, + 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, + 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, + 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 9, 9, 9,102,108,111, 97,116, 32, +110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 49, + 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 9,125, 10, 9, 9, 9,101, +108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32, +104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32, 61, 32, 49, 46, 48, 59, 10, 9, + 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41, 47,118,104, 59, 10, 9, 9, 9, + 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118,104, 59, 10, 10, 9, 9, 9, 9, +102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40, 97, 32, 60, 32, 98, 32, 38, 38, 32, + 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 98, 32, 60, 32, 97, 32, + 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 99, 32, 60, + 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,112, + 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114, 97, 99, 41, 43, 40,118,104, 42,118, +104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, 32, 40, 40, 40,112, 45,118,104, 41, + 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, 41, 41, 42, 40, 49, 46, 48, 43, 40, + 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, + 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, + 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, + 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 42,103, 42, +101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41, 47, 40, 50, 46, 48, 42,115,112,101, + 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 9, +125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119, 97,114,100,105,115,111, 95,115, 112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97, -116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, -108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32,110, 41, 59, - 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97, -110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, - 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111, -116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,114,115,108, -116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41, - 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,102, -108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102, 97, 99, 41, 10, -123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59, 10,125, 10, 10, -118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, - 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97, -116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116, 32, 61, 32,115, -104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59, 10,125, 10, 10, -118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32,118,101, 99, - 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 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,116, 42,108, 97,109,112, 99,111,108, 42, -115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125, 10, 10,118,111, -105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118, -111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, +116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, + 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,110, +104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97, +116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102, +108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, + 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115, 40,110,104, 41, 41, 59, 10, 9, +102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 10, + 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48, 42, 77, 95, 80, 73, 42, 97,108, +112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114, 40, 45, 40, 97,110,103,108,101, + 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40,115,113,114,116, 40,110,118, 42, +110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111,110, 95,115,112,101, 99, 40,118, +101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122, +101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99, +102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, + 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32,110, 41, 59, 10, 9,102,108,111, + 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32, +115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, + 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, + 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,114,115,108,116, 32, 61, 32, 49, + 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41, 59, 10, 10, 9,115, +112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, + 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,102,108,111, 97,116, 32, +105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,111,117, +116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59, 10,125, 10, 10,118,111,105,100, 32, +115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,102,108,111, 97, +116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, + 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116, 32, 61, 32,115,104, 97,100,102, 97, + 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32, +115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32,118,101, 99, 51, 32,108, 97,109, +112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 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,116, 42,108, 97,109,112, 99,111,108, 42,115,112,101, 99, 99, +111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,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, -111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48, - 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108, 49, 42, 99,111,108, 50, - 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10, -118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, - 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 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, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10,118,111,105, -100, 32,115,104, 97,100,101, 95,109,117,108, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99, -111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, 97,108,117, -101, 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, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 10,125, 10, 10, -118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, - 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, 32, 99,111, -108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, 99, 51, 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, 10,123, 10, 9,111,117,116,118, - 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 53, 56, 32, - 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110, -108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, - 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,104, 97, -100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103,121, 42, 40, - 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110, -108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, - 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111, -117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118,101, 99, 52, - 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32,115,104, 97, -100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99, 44, 32,111, -117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61, 32,115,112, -101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,114, 99,111, - 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116, - 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97, -115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 10, -123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32, 48, - 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111, -119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47, 47,102,108, -111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, 97,100,111, -119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,111, 46,119, - 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40, 99,111, 46,119, 32, 62, 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,120, 32, 62, 32, - 48, 46, 48, 32, 38, 38, 32, 99,111, 46,120, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 32, 38, 38, 32, 99,111, 46,121, 32, 62, - 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,121, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 41, 10, 9, 9, 9,114,101,115,117, -108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, - 46,120, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,114,101,115,117,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,125, 10,125, - 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 95,118,115,109, 40,118,101, 99, 51, 32,114, - 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116, 52, 32,115,104, - 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97,115, 44, 32,102, -108,111, 97,116, 32, 98,108,101,101,100, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, - 10, 9, 9,114,101,115,117,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, - 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, - 49, 46, 48, 41, 59, 10, 9, 9,105,102, 32, 40, 99,111, 46,119, 32, 62, 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,120, 32, 62, - 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,120, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 32, 38, 38, 32, 99,111, 46,121, 32, - 62, 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,121, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 41, 32,123, 10, 9, 9, 9,118, -101, 99, 50, 32,109,111,109,101,110,116,115, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 80,114,111,106, 40,115,104, 97,100, -111,119,109, 97,112, 44, 32, 99,111, 41, 46,114,103, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,100,105,115,116, 32, 61, 32, 99, -111, 46,122, 47, 99,111, 46,119, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 9, 10, - 9, 9, 9,105,102, 40,100,105,115,116, 32, 60, 61, 32,109,111,109,101,110,116,115, 46,120, 41, 10, 9, 9, 9, 9,112, 32, 61, - 32, 49, 46, 48, 59, 10, 10, 9, 9, 9,102,108,111, 97,116, 32,118, 97,114,105, 97,110, 99,101, 32, 61, 32,109,111,109,101,110, -116,115, 46,121, 32, 45, 32, 40,109,111,109,101,110,116,115, 46,120, 42,109,111,109,101,110,116,115, 46,120, 41, 59, 10, 9, 9, - 9,118, 97,114,105, 97,110, 99,101, 32, 61, 32,109, 97,120, 40,118, 97,114,105, 97,110, 99,101, 44, 32,115,104, 97,100,111,119, - 98,105, 97,115, 47, 49, 48, 46, 48, 41, 59, 10, 10, 9, 9, 9,102,108,111, 97,116, 32,100, 32, 61, 32,109,111,109,101,110,116, -115, 46,120, 32, 45, 32,100,105,115,116, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,112, 95,109, 97,120, 32, 61, 32,118, 97,114, -105, 97,110, 99,101, 32, 47, 32, 40,118, 97,114,105, 97,110, 99,101, 32, 43, 32,100, 42,100, 41, 59, 10, 10, 9, 9, 9, 47, 47, - 32, 78,111,119, 32,114,101,100,117, 99,101, 32,108,105,103,104,116, 45, 98,108,101,101,100,105,110,103, 32, 98,121, 32,114,101, -109,111,118,105,110,103, 32,116,104,101, 32, 91, 48, 44, 32,120, 93, 32,116, 97,105,108, 32, 97,110,100, 32,108,105,110,101, 97, -114,108,121, 32,114,101,115, 99, 97,108,105,110,103, 32, 40,120, 44, 32, 49, 93, 10, 9, 9, 9,112, 95,109, 97,120, 32, 61, 32, - 99,108, 97,109,112, 40, 40,112, 95,109, 97,120, 45, 98,108,101,101,100, 98,105, 97,115, 41, 47, 40, 49, 46, 48, 45, 98,108,101, -101,100, 98,105, 97,115, 41, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 9,114,101,115,117,108,116, 32, 61, - 32,109, 97,120, 40,112, 44, 32,112, 95,109, 97,120, 41, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, -114,101,115,117,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,125, 9, 9, 9, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32, -115,104, 97,100,101, 95,108,105,103,104,116, 95,116,101,120,116,117,114,101, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, 97, -109,112,108,101,114, 50, 68, 32, 99,111,111,107,105,101, 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, - 97,116, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 10, 9,118,101, 99, 52, 32, 99,111, +111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, + 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, + 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115, +104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,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,111,117,116, 99,111, +108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, + 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97, +100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111, +117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108, 49, 42, 99,111,108, 50, 44, 32,118,101, 99, + 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32, +115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 44, 32,118, +101, 99, 52, 32, 99,111,108, 49, 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, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, +100,101, 95,109,117,108, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 42, 99, +111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, 97,108,117,101, 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, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32, +115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, 99, 51, 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, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, + 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 53, 56, 32, 43, 32, 99,111,108, +111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, + 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,102,108,111, + 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,104, 97,100,102, 97, 99, 41, + 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103,121, 42, 40, 49, 46, 48, 32, 45, + 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, + 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, + 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,100,105,102, +102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118,101, 99, 52, 40,114,103, 98, 42, +115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,108, +121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, + 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99, 44, 32,111,117,116, 32,118,101, + 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61, 32,115,112,101, 99, 32, 45, 32, +118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118, +111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, 97,109, +112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116, 52, 32,115,104, 97, +100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97,115, 44, 32,102,108, +111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,105,102, + 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9, +125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,119,112,101,114,115, +109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47, 47,102,108,111, 97,116, 32, 98, +105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, 97,100,111,119, 98,105, 97,115, + 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,111, 46,119, 59, 10, 9, 9, 10, + 9, 9,105,102, 32, 40, 99,111, 46,119, 32, 62, 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,120, 32, 62, 32, 48, 46, 48, 32, 38, + 38, 32, 99,111, 46,120, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 32, 38, 38, 32, 99,111, 46,121, 32, 62, 32, 48, 46, 48, 32, + 38, 38, 32, 99,111, 46,121, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 41, 10, 9, 9, 9,114,101,115,117,108,116, 32, 61, 32, +115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9, + 9,101,108,115,101, 10, 9, 9, 9,114,101,115,117,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,125, 10,125, 10, 10,118,111,105, +100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 95,118,115,109, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, + 97,109,112,108,101,114, 50, 68, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112, +101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32, + 98,108,101,101,100, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +114,101,115,117,108,116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101, +115,117,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, - 10, 10, 9,114,101,115,117,108,116, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 80,114,111,106, 40, 99,111,111,107,105,101, - 44, 32, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,101,120,112,111,115,117,114,101, 95, 99,111, -114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,108,105,110,102, 97, 99, 44, 32,102,108, -111, 97,116, 32,108,111,103,102, 97, 99, 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,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32,101,120,112, 40, 99,111,108, 42,108, -111,103,102, 97, 99, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,105,115,116, 95,102, 97, 99,116, -111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105,115,116,115,116, 97, 44, 32,102,108,111, 97,116, - 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115,116,116,121,112,101, 44, 32,102,108,111, 97,116, - 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,122, 99,111,114, 59, 10, 10, 9,122, 99,111,114, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99, -116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, - 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50, 93, 59, 10, 9, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99, -111,114, 45,109,105,115,116,115,116, 97, 41, 47,109,105,115,116,100,105,115,116, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, - 10, 9,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 48, 46, 48, 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, - 59, 10, 9,101,108,115,101, 32,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 49, 46, 48, 41, 59, 10, 9,101,108, -115,101, 32,102, 97, 99, 32, 61, 32,115,113,114,116, 40,102, 97, 99, 41, 59, 10, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, - 46, 48, 32, 45, 32, 40, 49, 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45,109,105,115,105, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,115,104, 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118,101, 99, 51, 32,104,111,114, 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,102,108,111, 97,116, - 32,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9, -111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111,114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32, -102, 97, 99, 41, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, - 97, 95,111,112, 97,113,117,101, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 49, 46, - 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111, 98, 99,111,108,111,114, 40, -118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, - 32, 99,111,108, 46, 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 32, 78, 69, 87, 32, 83, 72, 65, 68, 69, 82, 32, 85, 84, 73, 76, 73, 84, 73, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 47, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,100,105,101,108,101, 99,116,114,105, 99, 40, -118,101, 99, 51, 32, 73,110, 99,111,109,105,110,103, 44, 32,118,101, 99, 51, 32, 78,111,114,109, 97,108, 44, 32,102,108,111, 97, -116, 32,101,116, 97, 41, 10,123, 10, 32, 32, 32, 32, 47, 42, 32, 99,111,109,112,117,116,101, 32,102,114,101,115,110,101,108, 32, -114,101,102,108,101, 99,116, 97,110, 99,101, 32,119,105,116,104,111,117,116, 32,101,120,112,108,105, 99,105,116,108,121, 32, 99, -111,109,112,117,116,105,110,103, 10, 32, 32, 32, 32, 32, 32, 32,116,104,101, 32,114,101,102,114, 97, 99,116,101,100, 32,100,105, -114,101, 99,116,105,111,110, 32, 42, 47, 10, 32, 32, 32, 32,102,108,111, 97,116, 32, 99, 32, 61, 32, 97, 98,115, 40,100,111,116, - 40, 73,110, 99,111,109,105,110,103, 44, 32, 78,111,114,109, 97,108, 41, 41, 59, 10, 32, 32, 32, 32,102,108,111, 97,116, 32,103, - 32, 61, 32,101,116, 97, 32, 42, 32,101,116, 97, 32, 45, 32, 49, 46, 48, 32, 43, 32, 99, 32, 42, 32, 99, 59, 10, 32, 32, 32, 32, -102,108,111, 97,116, 32,114,101,115,117,108,116, 59, 10, 10, 32, 32, 32, 32,105,102, 40,103, 32, 62, 32, 48, 46, 48, 41, 32,123, - 10, 32, 32, 32, 32, 32, 32, 32, 32,103, 32, 61, 32,115,113,114,116, 40,103, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,102,108, -111, 97,116, 32, 65, 32, 61, 40,103, 32, 45, 32, 99, 41, 47, 40,103, 32, 43, 32, 99, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, -102,108,111, 97,116, 32, 66, 32, 61, 40, 99, 32, 42, 40,103, 32, 43, 32, 99, 41, 45, 32, 49, 46, 48, 41, 47, 40, 99, 32, 42, 40, -103, 32, 45, 32, 99, 41, 43, 32, 49, 46, 48, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,116, 32, 61, 32, 48, - 46, 53, 32, 42, 32, 65, 32, 42, 32, 65, 32, 42, 40, 49, 46, 48, 32, 43, 32, 66, 32, 42, 32, 66, 41, 59, 10, 32, 32, 32, 32,125, - 10, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,116, 32, 61, 32, 49, 46, 48, 59, 32, - 32, 47, 42, 32, 84, 73, 82, 32, 40,110,111, 32,114,101,102,114, 97, 99,116,101,100, 32, 99,111,109,112,111,110,101,110,116, 41, - 32, 42, 47, 10, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,114,101,115,117,108,116, 59, 10,125, 10, 10,102,108,111, 97,116, - 32,104,121,112,111,116, 40,102,108,111, 97,116, 32,120, 44, 32,102,108,111, 97,116, 32,121, 41, 10,123, 10, 9,114,101,116,117, -114,110, 32,115,113,114,116, 40,120, 42,120, 32, 43, 32,121, 42,121, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 32, 78, 69, 87, 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, 35,100,101,102,105,110,101, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 32, 51, 10, 10, 47, 42, 32, - 98,115,100,102,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, - 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,118,101, - 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32, 97,109, 98, -105,101,110,116, 32,108,105,103,104,116, 32, 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 50, - 41, 59, 10, 10, 9, 47, 42, 32,100,105,114,101, 99,116,105,111,110, 97,108, 32,108,105,103,104,116,115, 32, 42, 47, 10, 9,102, -111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 59, 32,105, 43, - 43, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 32, 61, 32,103,108, 95, - 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,112,111,115,105,116,105,111,110, 46,120,121,122, 59, 10, 9, 9,118, -101, 99, 51, 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, - 99,101, 91,105, 93, 46,100,105,102,102,117,115,101, 46,114,103, 98, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 98,115,100,102, - 32, 61, 32,109, 97,120, 40,100,111,116, 40, 78, 44, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 41, 44, 32, 48, - 46, 48, 41, 59, 10, 9, 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 42, 98,115,100,102, 59, 10, - 9,125, 10, 10, 9,114,101,115,117,108,116, 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,108,111,114, 46,114,103, 98, 44, 32, - 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,103,108,111,115,115,121, 40,118, -101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,118,101, 99, 51, - 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, - 47, 42, 32, 97,109, 98,105,101,110,116, 32,108,105,103,104,116, 32, 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, - 99, 51, 40, 48, 46, 50, 41, 59, 10, 10, 9, 47, 42, 32,100,105,114,101, 99,116,105,111,110, 97,108, 32,108,105,103,104,116,115, - 32, 42, 47, 10, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76, 73, 71, 72, - 84, 83, 59, 32,105, 43, 43, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, - 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,112,111,115,105,116,105,111,110, 46,120,121, -122, 59, 10, 9, 9,118,101, 99, 51, 32, 72, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46, -104, 97,108,102, 86,101, 99,116,111,114, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,100,105,102, -102,117,115,101, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,100,105,102,102,117,115,101, - 46,114,103, 98, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,115,112,101, 99,117,108, 97,114, 32, 61, 32,103,108, - 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,115,112,101, 99,117,108, 97,114, 46,114,103, 98, 59, 10, 10, 9, - 9, 47, 42, 32,119,101, 32,109,105,120, 32,105,110, 32,115,111,109,101, 32,100,105,102,102,117,115,101, 32,115,111, 32,108,111, -119, 32,114,111,117,103,104,110,101,115,115, 32,115,116,105,108,108, 32,115,104,111,119,115, 32,117,112, 32, 42, 47, 10, 9, 9, -102,108,111, 97,116, 32, 98,115,100,102, 32, 61, 32, 48, 46, 53, 42,112,111,119, 40,109, 97,120, 40,100,111,116, 40, 78, 44, 32, - 72, 41, 44, 32, 48, 46, 48, 41, 44, 32, 49, 46, 48, 47,114,111,117,103,104,110,101,115,115, 41, 59, 10, 9, 9, 98,115,100,102, - 32, 43, 61, 32, 48, 46, 53, 42,109, 97,120, 40,100,111,116, 40, 78, 44, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111, -110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,115,112,101, 99,117,108, 97,114, 42, - 98,115,100,102, 59, 10, 9,125, 10, 10, 9,114,101,115,117,108,116, 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,108,111,114, - 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95, 97,110, -105,115,111,116,114,111,112,105, 99, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103, -104,110,101,115,115, 85, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 86, 44, 32,118,101, 99, 51, 32, 78, - 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111, -100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114, -101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,103,108, 97,115,115, 40, -118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,102,108,111, - 97,116, 32,105,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, - 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111, -108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111, -100,101, 95, 98,115,100,102, 95,116,114, 97,110,115,108,117, 99,101,110,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32, -118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, - 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115, -117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,116,114, 97,110,115,112, 97,114, -101,110,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, - 10,123, 10, 9, 47, 42, 32,116,104,105,115, 32,105,115,110, 39,116, 32,114,105,103,104,116, 32, 42, 47, 10, 9,114,101,115,117, -108,116, 46,114, 32, 61, 32, 99,111,108,111,114, 46,114, 59, 10, 9,114,101,115,117,108,116, 46,103, 32, 61, 32, 99,111,108,111, -114, 46,103, 59, 10, 9,114,101,115,117,108,116, 46, 98, 32, 61, 32, 99,111,108,111,114, 46, 98, 59, 10, 9,114,101,115,117,108, -116, 46, 97, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,118,101,108, -118,101,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,115,105,103,109, 97, 44, 32,118,101, 99, - 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115, + 10, 9, 9,105,102, 32, 40, 99,111, 46,119, 32, 62, 32, 48, 46, 48, 32, 38, 38, 32, 99,111, 46,120, 32, 62, 32, 48, 46, 48, 32, + 38, 38, 32, 99,111, 46,120, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 32, 38, 38, 32, 99,111, 46,121, 32, 62, 32, 48, 46, 48, + 32, 38, 38, 32, 99,111, 46,121, 47, 99,111, 46,119, 32, 60, 32, 49, 46, 48, 41, 32,123, 10, 9, 9, 9,118,101, 99, 50, 32,109, +111,109,101,110,116,115, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 80,114,111,106, 40,115,104, 97,100,111,119,109, 97,112, + 44, 32, 99,111, 41, 46,114,103, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,100,105,115,116, 32, 61, 32, 99,111, 46,122, 47, 99, +111, 46,119, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 9, 10, 9, 9, 9,105,102, + 40,100,105,115,116, 32, 60, 61, 32,109,111,109,101,110,116,115, 46,120, 41, 10, 9, 9, 9, 9,112, 32, 61, 32, 49, 46, 48, 59, + 10, 10, 9, 9, 9,102,108,111, 97,116, 32,118, 97,114,105, 97,110, 99,101, 32, 61, 32,109,111,109,101,110,116,115, 46,121, 32, + 45, 32, 40,109,111,109,101,110,116,115, 46,120, 42,109,111,109,101,110,116,115, 46,120, 41, 59, 10, 9, 9, 9,118, 97,114,105, + 97,110, 99,101, 32, 61, 32,109, 97,120, 40,118, 97,114,105, 97,110, 99,101, 44, 32,115,104, 97,100,111,119, 98,105, 97,115, 47, + 49, 48, 46, 48, 41, 59, 10, 10, 9, 9, 9,102,108,111, 97,116, 32,100, 32, 61, 32,109,111,109,101,110,116,115, 46,120, 32, 45, + 32,100,105,115,116, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,112, 95,109, 97,120, 32, 61, 32,118, 97,114,105, 97,110, 99,101, + 32, 47, 32, 40,118, 97,114,105, 97,110, 99,101, 32, 43, 32,100, 42,100, 41, 59, 10, 10, 9, 9, 9, 47, 47, 32, 78,111,119, 32, +114,101,100,117, 99,101, 32,108,105,103,104,116, 45, 98,108,101,101,100,105,110,103, 32, 98,121, 32,114,101,109,111,118,105,110, +103, 32,116,104,101, 32, 91, 48, 44, 32,120, 93, 32,116, 97,105,108, 32, 97,110,100, 32,108,105,110,101, 97,114,108,121, 32,114, +101,115, 99, 97,108,105,110,103, 32, 40,120, 44, 32, 49, 93, 10, 9, 9, 9,112, 95,109, 97,120, 32, 61, 32, 99,108, 97,109,112, + 40, 40,112, 95,109, 97,120, 45, 98,108,101,101,100, 98,105, 97,115, 41, 47, 40, 49, 46, 48, 45, 98,108,101,101,100, 98,105, 97, +115, 41, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 9,114,101,115,117,108,116, 32, 61, 32,109, 97,120, 40, +112, 44, 32,112, 95,109, 97,120, 41, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,114,101,115,117,108, +116, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,125, 9, 9, 9, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, + 95,108,105,103,104,116, 95,116,101,120,116,117,114,101, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, 97,109,112,108,101,114, + 50, 68, 32, 99,111,111,107,105,101, 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,111, +117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 10, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, + 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,114,101, +115,117,108,116, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 80,114,111,106, 40, 99,111,111,107,105,101, 44, 32, 99,111, 41, + 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,101,120,112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, + 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,108,105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108, +111,103,102, 97, 99, 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,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, + 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, + 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105,115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116, +100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115,116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, + 44, 32,122, 99,111,114, 59, 10, 10, 9,122, 99,111,114, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, + 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, + 32, 45, 99,111, 91, 50, 93, 59, 10, 9, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105, +115,116,115,116, 97, 41, 47,109,105,115,116,100,105,115,116, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,105,102, 40, +109,105,115,116,116,121,112,101, 32, 61, 61, 32, 48, 46, 48, 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 10, 9,101,108, +115,101, 32,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 49, 46, 48, 41, 59, 10, 9,101,108,115,101, 32,102, 97, + 99, 32, 61, 32,115,113,114,116, 40,102, 97, 99, 41, 59, 10, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, + 40, 49, 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45,109,105,115,105, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, + 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118,101, 99, 51, 32,104,111,114, 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,102,108,111, 97,116, 32,102, 97, 99, 32, + 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111, +108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111,114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32,102, 97, 99, 41, 44, + 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111,112, 97, +113,117,101, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, + 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, + 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, + 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 78, 69, 87, 32, + 83, 72, 65, 68, 69, 82, 32, 85, 84, 73, 76, 73, 84, 73, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, + 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,100,105,101,108,101, 99,116,114,105, 99, 40,118,101, 99, 51, 32, + 73,110, 99,111,109,105,110,103, 44, 32,118,101, 99, 51, 32, 78,111,114,109, 97,108, 44, 32,102,108,111, 97,116, 32,101,116, 97, + 41, 10,123, 10, 32, 32, 32, 32, 47, 42, 32, 99,111,109,112,117,116,101, 32,102,114,101,115,110,101,108, 32,114,101,102,108,101, + 99,116, 97,110, 99,101, 32,119,105,116,104,111,117,116, 32,101,120,112,108,105, 99,105,116,108,121, 32, 99,111,109,112,117,116, +105,110,103, 10, 32, 32, 32, 32, 32, 32, 32,116,104,101, 32,114,101,102,114, 97, 99,116,101,100, 32,100,105,114,101, 99,116,105, +111,110, 32, 42, 47, 10, 32, 32, 32, 32,102,108,111, 97,116, 32, 99, 32, 61, 32, 97, 98,115, 40,100,111,116, 40, 73,110, 99,111, +109,105,110,103, 44, 32, 78,111,114,109, 97,108, 41, 41, 59, 10, 32, 32, 32, 32,102,108,111, 97,116, 32,103, 32, 61, 32,101,116, + 97, 32, 42, 32,101,116, 97, 32, 45, 32, 49, 46, 48, 32, 43, 32, 99, 32, 42, 32, 99, 59, 10, 32, 32, 32, 32,102,108,111, 97,116, + 32,114,101,115,117,108,116, 59, 10, 10, 32, 32, 32, 32,105,102, 40,103, 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 32, 32, 32, 32, + 32, 32, 32, 32,103, 32, 61, 32,115,113,114,116, 40,103, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,102,108,111, 97,116, 32, 65, + 32, 61, 40,103, 32, 45, 32, 99, 41, 47, 40,103, 32, 43, 32, 99, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,102,108,111, 97,116, + 32, 66, 32, 61, 40, 99, 32, 42, 40,103, 32, 43, 32, 99, 41, 45, 32, 49, 46, 48, 41, 47, 40, 99, 32, 42, 40,103, 32, 45, 32, 99, + 41, 43, 32, 49, 46, 48, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,116, 32, 61, 32, 48, 46, 53, 32, 42, 32, + 65, 32, 42, 32, 65, 32, 42, 40, 49, 46, 48, 32, 43, 32, 66, 32, 42, 32, 66, 41, 59, 10, 32, 32, 32, 32,125, 10, 32, 32, 32, 32, +101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,116, 32, 61, 32, 49, 46, 48, 59, 32, 32, 47, 42, 32, 84, + 73, 82, 32, 40,110,111, 32,114,101,102,114, 97, 99,116,101,100, 32, 99,111,109,112,111,110,101,110,116, 41, 32, 42, 47, 10, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32,114,101,115,117,108,116, 59, 10,125, 10, 10,102,108,111, 97,116, 32,104,121,112,111, +116, 40,102,108,111, 97,116, 32,120, 44, 32,102,108,111, 97,116, 32,121, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,115,113, +114,116, 40,120, 42,120, 32, 43, 32,121, 42,121, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 78, + 69, 87, 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, 35,100,101,102,105,110,101, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 32, 51, 10, 10, 47, 42, 32, 98,115,100,102,115, + 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40,118,101, 99, 52, + 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,118,101, 99, 51, 32, 78, 44, + 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32, 97,109, 98,105,101,110,116, 32, +108,105,103,104,116, 32, 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 50, 41, 59, 10, 10, 9, + 47, 42, 32,100,105,114,101, 99,116,105,111,110, 97,108, 32,108,105,103,104,116,115, 32, 42, 47, 10, 9,102,111,114, 40,105,110, +116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 59, 32,105, 43, 43, 41, 32,123, 10, + 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 32, 61, 32,103,108, 95, 76,105,103,104,116, + 83,111,117,114, 99,101, 91,105, 93, 46,112,111,115,105,116,105,111,110, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,108, +105,103,104,116, 95,100,105,102,102,117,115,101, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, + 46,100,105,102,102,117,115,101, 46,114,103, 98, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 98,115,100,102, 32, 61, 32,109, 97, +120, 40,100,111,116, 40, 78, 44, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, + 9, 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 42, 98,115,100,102, 59, 10, 9,125, 10, 10, 9, +114,101,115,117,108,116, 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,108,111,114, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,103,108,111,115,115,121, 40,118,101, 99, 52, 32, 99, +111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118, +101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32, 97,109, + 98,105,101,110,116, 32,108,105,103,104,116, 32, 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51, 40, 48, 46, + 50, 41, 59, 10, 10, 9, 47, 42, 32,100,105,114,101, 99,116,105,111,110, 97,108, 32,108,105,103,104,116,115, 32, 42, 47, 10, 9, +102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 59, 32,105, + 43, 43, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 32, 61, 32,103,108, + 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,112,111,115,105,116,105,111,110, 46,120,121,122, 59, 10, 9, 9, +118,101, 99, 51, 32, 72, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,104, 97,108,102, 86, +101, 99,116,111,114, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 32, + 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,100,105,102,102,117,115,101, 46,114,103, 98, 59, + 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,115,112,101, 99,117,108, 97,114, 32, 61, 32,103,108, 95, 76,105,103,104, +116, 83,111,117,114, 99,101, 91,105, 93, 46,115,112,101, 99,117,108, 97,114, 46,114,103, 98, 59, 10, 10, 9, 9, 47, 42, 32,119, +101, 32,109,105,120, 32,105,110, 32,115,111,109,101, 32,100,105,102,102,117,115,101, 32,115,111, 32,108,111,119, 32,114,111,117, +103,104,110,101,115,115, 32,115,116,105,108,108, 32,115,104,111,119,115, 32,117,112, 32, 42, 47, 10, 9, 9,102,108,111, 97,116, + 32, 98,115,100,102, 32, 61, 32, 48, 46, 53, 42,112,111,119, 40,109, 97,120, 40,100,111,116, 40, 78, 44, 32, 72, 41, 44, 32, 48, + 46, 48, 41, 44, 32, 49, 46, 48, 47,114,111,117,103,104,110,101,115,115, 41, 59, 10, 9, 9, 98,115,100,102, 32, 43, 61, 32, 48, + 46, 53, 42,109, 97,120, 40,100,111,116, 40, 78, 44, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 41, 44, 32, 48, + 46, 48, 41, 59, 10, 9, 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,115,112,101, 99,117,108, 97,114, 42, 98,115,100,102, 59, + 10, 9,125, 10, 10, 9,114,101,115,117,108,116, 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,108,111,114, 46,114,103, 98, 44, + 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95, 97,110,105,115,111,116,114, +111,112,105, 99, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, + 85, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 86, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, + 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115, 100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, - 41, 59, 10,125, 10, 10, 47, 42, 32,101,109,105,115,115,105,111,110, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95, -101,109,105,115,115,105,111,110, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,115,116,114,101,110, -103,116,104, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, - 9,114,101,115,117,108,116, 32, 61, 32, 99,111,108,111,114, 42,115,116,114,101,110,103,116,104, 59, 10,125, 10, 10, 47, 42, 32, - 99,108,111,115,117,114,101,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,109,105,120, 95,115,104, 97,100,101, -114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 49, 44, 32,118,101, 99, 52, 32, -115,104, 97,100,101,114, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 41, 10,123, 10, 9,115,104, 97, -100,101,114, 32, 61, 32,109,105,120, 40,115,104, 97,100,101,114, 49, 44, 32,115,104, 97,100,101,114, 50, 44, 32,102, 97, 99, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 97,100,100, 95,115,104, 97,100,101,114, 40,118,101, 99, 52, 32,115, -104, 97,100,101,114, 49, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,115, -104, 97,100,101,114, 41, 10,123, 10, 9,115,104, 97,100,101,114, 32, 61, 32,115,104, 97,100,101,114, 49, 32, 43, 32,115,104, 97, -100,101,114, 50, 59, 10,125, 10, 10, 47, 42, 32,102,114,101,115,110,101,108, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100, -101, 95,102,114,101,115,110,101,108, 40,102,108,111, 97,116, 32,105,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, - 51, 32, 73, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,102,108,111, 97,116, 32, -101,116, 97, 32, 61, 32,109, 97,120, 40,105,111,114, 44, 32, 48, 46, 48, 48, 48, 48, 49, 41, 59, 10, 9,114,101,115,117,108,116, - 32, 61, 32,102,114,101,115,110,101,108, 95,100,105,101,108,101, 99,116,114,105, 99, 40, 73, 44, 32, 78, 44, 32,101,116, 97, 41, - 59, 32, 47, 47, 98, 97, 99,107,102, 97, 99,105,110,103, 40, 41, 63, 32, 49, 46, 48, 47,101,116, 97, 58, 32,101,116, 97, 41, 59, - 10,125, 10, 10, 47, 42, 32,103,101,111,109,101,116,114,121, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,103,101, -111,109,101,116,114,121, 40,118,101, 99, 51, 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,109, 97,116, 52, 32,116,111,119,111, -114,108,100, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 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, 51, 32,116, 97,110,103,101,110,116, 44, 10, 9,111,117,116, - 32,118,101, 99, 51, 32,116,114,117,101, 95,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111, -109,105,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112, 97,114, 97,109,101,116,114,105, 99, 44, 10, 9,111,117,116, 32, -102,108,111, 97,116, 32, 98, 97, 99,107,102, 97, 99,105,110,103, 41, 10,123, 10, 9,112,111,115,105,116,105,111,110, 32, 61, 32, - 40,116,111,119,111,114,108,100, 42,118,101, 99, 52, 40, 73, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,110,111,114, -109, 97,108, 32, 61, 32, 78, 59, 10, 9,116, 97,110,103,101,110,116, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, 9, -116,114,117,101, 95,110,111,114,109, 97,108, 32, 61, 32, 78, 59, 10, 9,105,110, 99,111,109,105,110,103, 32, 61, 32, 73, 59, 10, - 9,112, 97,114, 97,109,101,116,114,105, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, 9, 98, 97, 99,107,102, 97, - 99,105,110,103, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,111,111, -114,100, 40,118,101, 99, 51, 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,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, 10, 9,118,101, 99, 51, 32, 97,116,116,114, 95,111,114, - 99,111, 44, 32,118,101, 99, 51, 32, 97,116,116,114, 95,117,118, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,103,101,110,101, -114, 97,116,101,100, 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, 51, - 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32, - 99, 97,109,101,114, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,119,105,110,100,111,119, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,114,101,102,108,101, 99,116,105,111,110, 41, 10,123, 10, 9,103,101,110,101,114, 97,116,101,100, 32, 61, 32, 97,116,116, -114, 95,111,114, 99,111, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 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, 78, 44, 32, 48, 46, 48, 41, 41, 41, - 46,120,121,122, 41, 59, 10, 9,117,118, 32, 61, 32, 97,116,116,114, 95,117,118, 59, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, - 73, 59, 10, 9, 99, 97,109,101,114, 97, 32, 61, 32, 73, 59, 10, 9,119,105,110,100,111,119, 32, 61, 32,103,108, 95, 70,114, 97, -103, 67,111,111,114,100, 46,120,121,122, 59, 10, 9,114,101,102,108,101, 99,116,105,111,110, 32, 61, 32,114,101,102,108,101, 99, -116, 40, 78, 44, 32, 73, 41, 59, 10, 10,125, 10, 10, 47, 42, 32,116,101,120,116,117,114,101,115, 32, 42, 47, 10, 10,118,111,105, -100, 32,110,111,100,101, 95,116,101,120, 95,103,114, 97,100,105,101,110,116, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, - 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99, -111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, - 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,104,101, 99,107,101,114, 40,118,101, 99, 51, 32, 99,111, 44, 32, -118,101, 99, 52, 32, 99,111,108,111,114, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,111,114, 50, 44, 32,102,108,111, 97,116, 32, -115, 99, 97,108,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, - 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,108,111,117,100,115, 40, -118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111, -108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118, -101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111, -100,101, 95,116,101,120, 95,101,110,118,105,114,111,110,109,101,110,116, 40,118,101, 99, 51, 32, 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, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,102,108, -111, 97,116, 32,117, 32, 61, 32, 40, 97,116, 97,110, 40, 99,111, 46,121, 44, 32, 99,111, 46,120, 41, 32, 43, 32, 77, 95, 80, 73, - 41, 47, 40, 50, 46, 48, 42, 77, 95, 80, 73, 41, 59, 10, 9,102,108,111, 97,116, 32,118, 32, 61, 32, 97,116, 97,110, 40, 99,111, - 46,122, 44, 32,104,121,112,111,116, 40, 99,111, 46,120, 44, 32, 99,111, 46,121, 41, 41, 47, 77, 95, 80, 73, 32, 43, 32, 48, 46, - 53, 59, 10, 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,118,101, 99, 50, - 40,117, 44, 32,118, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,101,110,118,105,114,111, -110,109,101,110,116, 95,101,109,112,116,121, 40,118,101, 99, 51, 32, 99,111, 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,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32, 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, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32, 97,108,112,104, 97, 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, 99,111, 46,120,121, 41, 59, 10, 32, 32, 32, 32, 97,108,112,104, 97, 32, 61, 32, 99,111,108,111,114, 46, 97, - 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 95,101,109,112,116,121, 40,118, -101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97, -116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10, 32, - 32, 32, 32, 97,108,112,104, 97, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, - 95,109, 97,103,105, 99, 40,118,101, 99, 51, 32,112, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97, -116, 32,100,105,115,116,111,114,116,105,111,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117, -116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, - 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, -109,117,115,103,114, 97,118,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102, -108,111, 97,116, 32,100,101,116, 97,105,108, 44, 32,102,108,111, 97,116, 32,100,105,109,101,110,115,105,111,110, 44, 32,102,108, -111, 97,116, 32,108, 97, 99,117,110, 97,114,105,116,121, 44, 32,102,108,111, 97,116, 32,111,102,102,115,101,116, 44, 32,102,108, -111, 97,116, 32,103, 97,105,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9, -102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,110,111,105,115, -101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97,116, 32,100,101, -116, 97,105,108, 44, 32,102,108,111, 97,116, 32,100,105,115,116,111,114,116,105,111,110, 44, 32,111,117,116, 32,118,101, 99, 52, + 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,103,108, 97,115,115, 40,118,101, 99, 52, 32, + 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,102,108,111, 97,116, 32,105,111, +114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117, +108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, + 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115, +100,102, 95,116,114, 97,110,115,108,117, 99,101,110,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,118,101, 99, 51, 32, + 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, + 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,116,114, 97,110,115,112, 97,114,101,110,116, 40,118, +101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, + 42, 32,116,104,105,115, 32,105,115,110, 39,116, 32,114,105,103,104,116, 32, 42, 47, 10, 9,114,101,115,117,108,116, 46,114, 32, + 61, 32, 99,111,108,111,114, 46,114, 59, 10, 9,114,101,115,117,108,116, 46,103, 32, 61, 32, 99,111,108,111,114, 46,103, 59, 10, + 9,114,101,115,117,108,116, 46, 98, 32, 61, 32, 99,111,108,111,114, 46, 98, 59, 10, 9,114,101,115,117,108,116, 46, 97, 32, 61, + 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,118,101,108,118,101,116, 40,118, +101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,115,105,103,109, 97, 44, 32,118,101, 99, 51, 32, 78, 44, 32, +111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105, +102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, + 10, 47, 42, 32,101,109,105,115,115,105,111,110, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,101,109,105,115,115, +105,111,110, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,115,116,114,101,110,103,116,104, 44, 32, +118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,114,101,115,117, +108,116, 32, 61, 32, 99,111,108,111,114, 42,115,116,114,101,110,103,116,104, 59, 10,125, 10, 10, 47, 42, 32, 99,108,111,115,117, +114,101,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,109,105,120, 95,115,104, 97,100,101,114, 40,102,108,111, + 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 49, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101, +114, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 41, 10,123, 10, 9,115,104, 97,100,101,114, 32, 61, + 32,109,105,120, 40,115,104, 97,100,101,114, 49, 44, 32,115,104, 97,100,101,114, 50, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10, +118,111,105,100, 32,110,111,100,101, 95, 97,100,100, 95,115,104, 97,100,101,114, 40,118,101, 99, 52, 32,115,104, 97,100,101,114, + 49, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, + 41, 10,123, 10, 9,115,104, 97,100,101,114, 32, 61, 32,115,104, 97,100,101,114, 49, 32, 43, 32,115,104, 97,100,101,114, 50, 59, + 10,125, 10, 10, 47, 42, 32,102,114,101,115,110,101,108, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,102,114,101, +115,110,101,108, 40,102,108,111, 97,116, 32,105,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,102,108,111, 97,116, 32,101,116, 97, 32, 61, + 32,109, 97,120, 40,105,111,114, 44, 32, 48, 46, 48, 48, 48, 48, 49, 41, 59, 10, 9,114,101,115,117,108,116, 32, 61, 32,102,114, +101,115,110,101,108, 95,100,105,101,108,101, 99,116,114,105, 99, 40, 73, 44, 32, 78, 44, 32,101,116, 97, 41, 59, 32, 47, 47, 98, + 97, 99,107,102, 97, 99,105,110,103, 40, 41, 63, 32, 49, 46, 48, 47,101,116, 97, 58, 32,101,116, 97, 41, 59, 10,125, 10, 10, 47, + 42, 32,103,101,111,109,101,116,114,121, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,103,101,111,109,101,116,114, +121, 40,118,101, 99, 51, 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,109, 97,116, 52, 32,116,111,119,111,114,108,100, 44, 10, + 9,111,117,116, 32,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 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, 51, 32,116, 97,110,103,101,110,116, 44, 10, 9,111,117,116, 32,118,101, 99, 51, + 32,116,114,117,101, 95,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,109,105,110,103, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,112, 97,114, 97,109,101,116,114,105, 99, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, + 32, 98, 97, 99,107,102, 97, 99,105,110,103, 41, 10,123, 10, 9,112,111,115,105,116,105,111,110, 32, 61, 32, 40,116,111,119,111, +114,108,100, 42,118,101, 99, 52, 40, 73, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,110,111,114,109, 97,108, 32, 61, + 32, 78, 59, 10, 9,116, 97,110,103,101,110,116, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, 9,116,114,117,101, 95, +110,111,114,109, 97,108, 32, 61, 32, 78, 59, 10, 9,105,110, 99,111,109,105,110,103, 32, 61, 32, 73, 59, 10, 9,112, 97,114, 97, +109,101,116,114,105, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, 9, 98, 97, 99,107,102, 97, 99,105,110,103, 32, + 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,111,111,114,100, 40,118,101, + 99, 51, 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,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, 10, 9,118,101, 99, 51, 32, 97,116,116,114, 95,111,114, 99,111, 44, 32,118, +101, 99, 51, 32, 97,116,116,114, 95,117,118, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,103,101,110,101,114, 97,116,101,100, + 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, 51, 32,117,118, 44, 32, +111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32, 99, 97,109,101,114, + 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,119,105,110,100,111,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, +108,101, 99,116,105,111,110, 41, 10,123, 10, 9,103,101,110,101,114, 97,116,101,100, 32, 61, 32, 97,116,116,114, 95,111,114, 99, +111, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 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, 78, 44, 32, 48, 46, 48, 41, 41, 41, 46,120,121,122, 41, + 59, 10, 9,117,118, 32, 61, 32, 97,116,116,114, 95,117,118, 59, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 73, 59, 10, 9, 99, + 97,109,101,114, 97, 32, 61, 32, 73, 59, 10, 9,119,105,110,100,111,119, 32, 61, 32,103,108, 95, 70,114, 97,103, 67,111,111,114, +100, 46,120,121,122, 59, 10, 9,114,101,102,108,101, 99,116,105,111,110, 32, 61, 32,114,101,102,108,101, 99,116, 40, 78, 44, 32, + 73, 41, 59, 10, 10,125, 10, 10, 47, 42, 32,116,101,120,116,117,114,101,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100, +101, 95,116,101,120, 95,103,114, 97,100,105,101,110,116, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, - 32,110,111,100,101, 95,116,101,120, 95,115,107,121, 40,118,101, 99, 51, 32, 99,111, 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,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,125, 10, 10, -118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,118,111,114,111,110,111,105, 40,118,101, 99, 51, 32, 99,111, 44, 32,102, -108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, - 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,119, 97, -118,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97,116, 32,100, -105,115,116,111,114,116,105,111,110, 44, 32,102,108,111, 97,116, 32,100,101,116, 97,105,108, 44, 32,102,108,111, 97,116, 32,100, -101,116, 97,105,108, 95,115, 99, 97,108,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, - 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 32,108,105,103,104,116, 32,112, 97,116,104, 32, 42, - 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,108,105,103,104,116, 95,112, 97,116,104, 40, 10, 9,111,117,116, 32,102,108, -111, 97,116, 32,105,115, 95, 99, 97,109,101,114, 97, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, - 95,115,104, 97,100,111,119, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,100,105,102,102,117, -115,101, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,103,108,111,115,115,121, 95,114, 97,121, - 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,115,105,110,103,117,108, 97,114, 95,114, 97,121, 44, 10, 9,111, -117,116, 32,102,108,111, 97,116, 32,105,115, 95,114,101,102,108,101, 99,116,105,111,110, 95,114, 97,121, 44, 10, 9,111,117,116, - 32,102,108,111, 97,116, 32,105,115, 95,116,114, 97,110,115,109,105,115,115,105,111,110, 95,114, 97,121, 41, 10,123, 10, 9,105, -115, 95, 99, 97,109,101,114, 97, 95,114, 97,121, 32, 61, 32, 49, 46, 48, 59, 10, 9,105,115, 95,115,104, 97,100,111,119, 95,114, - 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,100,105,102,102,117,115,101, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, - 10, 9,105,115, 95,103,108,111,115,115,121, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,115,105,110,103,117, -108, 97,114, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,114,101,102,108,101, 99,116,105,111,110, 95,114, 97, -121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,116,114, 97,110,115,109,105,115,115,105,111,110, 95,114, 97,121, 32, 61, 32, - 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,108,105,103,104,116, 95,102, 97,108,108,111,102,102, 40, -102,108,111, 97,116, 32,115,116,114,101,110,103,116,104, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,113,117, 97,100,114, 97,116,105, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,108,105, -110,101, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 99,111,110,115,116, 97,110,116, 41, 10,123, 10, 9,113,117, 97, -100,114, 97,116,105, 99, 32, 61, 32,115,116,114,101,110,103,116,104, 59, 10, 9,108,105,110,101, 97,114, 32, 61, 32,115,116,114, -101,110,103,116,104, 59, 10, 9, 99,111,110,115,116, 97,110,116, 32, 61, 32,115,116,114,101,110,103,116,104, 59, 10,125, 10, 10, + 32,110,111,100,101, 95,116,101,120, 95, 99,104,101, 99,107,101,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 52, 32, + 99,111,108,111,114, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,111,114, 50, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, + 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, + 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, + 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,108,111,117,100,115, 40,118,101, 99, 51, 32, + 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, + 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101, +120, 95,101,110,118,105,114,111,110,109,101,110,116, 40,118,101, 99, 51, 32, 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, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,102,108,111, 97,116, 32,117, + 32, 61, 32, 40, 97,116, 97,110, 40, 99,111, 46,121, 44, 32, 99,111, 46,120, 41, 32, 43, 32, 77, 95, 80, 73, 41, 47, 40, 50, 46, + 48, 42, 77, 95, 80, 73, 41, 59, 10, 9,102,108,111, 97,116, 32,118, 32, 61, 32, 97,116, 97,110, 40, 99,111, 46,122, 44, 32,104, +121,112,111,116, 40, 99,111, 46,120, 44, 32, 99,111, 46,121, 41, 41, 47, 77, 95, 80, 73, 32, 43, 32, 48, 46, 53, 59, 10, 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,118,101, 99, 50, 40,117, 44, 32,118, + 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,101,110,118,105,114,111,110,109,101,110,116, + 95,101,109,112,116,121, 40,118,101, 99, 51, 32, 99,111, 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,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111, +100,101, 95,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32, 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, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97, +108,112,104, 97, 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, + 99,111, 46,120,121, 41, 59, 10, 32, 32, 32, 32, 97,108,112,104, 97, 32, 61, 32, 99,111,108,111,114, 46, 97, 59, 10,125, 10, 10, +118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 95,101,109,112,116,121, 40,118,101, 99, 51, 32, 99, +111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112, +104, 97, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10, 32, 32, 32, 32, 97,108, +112,104, 97, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109, 97,103,105, + 99, 40,118,101, 99, 51, 32,112, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97,116, 32,100,105,115, +116,111,114,116,105,111,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, + 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109,117,115,103,114, + 97,118,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97,116, 32, +100,101,116, 97,105,108, 44, 32,102,108,111, 97,116, 32,100,105,109,101,110,115,105,111,110, 44, 32,102,108,111, 97,116, 32,108, + 97, 99,117,110, 97,114,105,116,121, 44, 32,102,108,111, 97,116, 32,111,102,102,115,101,116, 44, 32,102,108,111, 97,116, 32,103, + 97,105,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, + 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, + 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,110,111,105,115,101, 40,118,101, 99, + 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97,116, 32,100,101,116, 97,105,108, 44, + 32,102,108,111, 97,116, 32,100,105,115,116,111,114,116,105,111,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111, +114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, + 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, + 95,116,101,120, 95,115,107,121, 40,118,101, 99, 51, 32, 99,111, 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,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, +110,111,100,101, 95,116,101,120, 95,118,111,114,111,110,111,105, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32, +115, 99, 97,108,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, + 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,119, 97,118,101, 40,118,101, + 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115, 99, 97,108,101, 44, 32,102,108,111, 97,116, 32,100,105,115,116,111,114, +116,105,111,110, 44, 32,102,108,111, 97,116, 32,100,101,116, 97,105,108, 44, 32,102,108,111, 97,116, 32,100,101,116, 97,105,108, + 95,115, 99, 97,108,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, + 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 32,108,105,103,104,116, 32,112, 97,116,104, 32, 42, 47, 10, 10,118,111, +105,100, 32,110,111,100,101, 95,108,105,103,104,116, 95,112, 97,116,104, 40, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105, +115, 95, 99, 97,109,101,114, 97, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,115,104, 97,100, +111,119, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,100,105,102,102,117,115,101, 95,114, 97, +121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,103,108,111,115,115,121, 95,114, 97,121, 44, 10, 9,111,117, +116, 32,102,108,111, 97,116, 32,105,115, 95,115,105,110,103,117,108, 97,114, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108, +111, 97,116, 32,105,115, 95,114,101,102,108,101, 99,116,105,111,110, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97, +116, 32,105,115, 95,116,114, 97,110,115,109,105,115,115,105,111,110, 95,114, 97,121, 41, 10,123, 10, 9,105,115, 95, 99, 97,109, +101,114, 97, 95,114, 97,121, 32, 61, 32, 49, 46, 48, 59, 10, 9,105,115, 95,115,104, 97,100,111,119, 95,114, 97,121, 32, 61, 32, + 48, 46, 48, 59, 10, 9,105,115, 95,100,105,102,102,117,115,101, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95, +103,108,111,115,115,121, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,115,105,110,103,117,108, 97,114, 95,114, + 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,114,101,102,108,101, 99,116,105,111,110, 95,114, 97,121, 32, 61, 32, 48, + 46, 48, 59, 10, 9,105,115, 95,116,114, 97,110,115,109,105,115,115,105,111,110, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, +125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,108,105,103,104,116, 95,102, 97,108,108,111,102,102, 40,102,108,111, 97,116, + 32,115,116,114,101,110,103,116,104, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,113,117, 97,100,114, 97,116,105, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,108,105,110,101, 97,114, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32, 99,111,110,115,116, 97,110,116, 41, 10,123, 10, 9,113,117, 97,100,114, 97,116,105, + 99, 32, 61, 32,115,116,114,101,110,103,116,104, 59, 10, 9,108,105,110,101, 97,114, 32, 61, 32,115,116,114,101,110,103,116,104, + 59, 10, 9, 99,111,110,115,116, 97,110,116, 32, 61, 32,115,116,114,101,110,103,116,104, 59, 10,125, 10, 10,118,111,105,100, 32, +110,111,100,101, 95,111, 98,106,101, 99,116, 95,105,110,102,111, 40,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,116,105, +111,110, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, 98,106,101, 99,116, 95,105,110,100,101,120, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,109, 97,116,101,114,105, 97,108, 95,105,110,100,101,120, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +114, 97,110,100,111,109, 41, 10,123, 10, 9,108,111, 99, 97,116,105,111,110, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, + 10, 9,111, 98,106,101, 99,116, 95,105,110,100,101,120, 32, 61, 32, 48, 46, 48, 59, 10, 9,109, 97,116,101,114,105, 97,108, 95, +105,110,100,101,120, 32, 61, 32, 48, 46, 48, 59, 10, 9,114, 97,110,100,111,109, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10, 10, 47, 42, 32,111,117,116,112,117,116, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,111,117,116,112,117,116, 95,109, 97,116,101,114,105, 97,108, 40,118,101, 99, 52, 32,115,117,114,102, 97, 99,101, 44, 32,118,101, 99, 52, 32,118,111,108,117,109, 101, 44, 32,102,108,111, 97,116, 32,100,105,115,112,108, 97, 99,101,109,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 52, 32, diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h index 2da06d5dea7..351c6d93514 100644 --- a/source/blender/makesrna/intern/rna_nodetree_types.h +++ b/source/blender/makesrna/intern/rna_nodetree_types.h @@ -77,8 +77,9 @@ DefNode( ShaderNode, SH_NODE_VOLUME_TRANSPARENT, 0, "VO DefNode( ShaderNode, SH_NODE_VOLUME_ISOTROPIC, 0, "VOLUME_ISOTROPIC", VolumeIsotropic, "Isotropic Volume", "" ) DefNode( ShaderNode, SH_NODE_EMISSION, 0, "EMISSION", Emission, "Emission", "" ) DefNode( ShaderNode, SH_NODE_NEW_GEOMETRY, 0, "NEW_GEOMETRY", NewGeometry, "Geometry", "" ) -DefNode( ShaderNode, SH_NODE_LIGHT_PATH, 0, "LIGHT_PATH", LightPath, "Light Path", "" ) -DefNode( ShaderNode, SH_NODE_LIGHT_FALLOFF, 0, "LIGHT_FALLOFF", LightFalloff, "Light Falloff", "" ) +DefNode( ShaderNode, SH_NODE_LIGHT_PATH, 0, "LIGHT_PATH", LightPath, "Light Path", "" ) +DefNode( ShaderNode, SH_NODE_LIGHT_FALLOFF, 0, "LIGHT_FALLOFF", LightFalloff, "Light Falloff", "" ) +DefNode( ShaderNode, SH_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "" ) DefNode( ShaderNode, SH_NODE_TEX_IMAGE, def_sh_tex_image, "TEX_IMAGE", TexImage, "Image Texture", "" ) DefNode( ShaderNode, SH_NODE_TEX_ENVIRONMENT, def_sh_tex_environment, "TEX_ENVIRONMENT", TexEnvironment, "Environment Texture","" ) DefNode( ShaderNode, SH_NODE_TEX_SKY, def_sh_tex_sky, "TEX_SKY", TexSky, "Sky Texture", "" ) diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 772ce376cb8..f7e0fd57ff6 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -158,6 +158,7 @@ set(SRC shader/nodes/node_shader_volume_isotropic.c shader/nodes/node_shader_light_path.c shader/nodes/node_shader_light_falloff.c + shader/nodes/node_shader_object_info.c shader/nodes/node_shader_mix_shader.c shader/nodes/node_shader_add_shader.c shader/nodes/node_shader_output_lamp.c diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h index 3d93f41cfe5..dd6d25380b4 100644 --- a/source/blender/nodes/NOD_shader.h +++ b/source/blender/nodes/NOD_shader.h @@ -74,6 +74,7 @@ void register_node_type_sh_attribute(struct bNodeTreeType *ttype); void register_node_type_sh_geometry(struct bNodeTreeType *ttype); void register_node_type_sh_light_path(struct bNodeTreeType *ttype); void register_node_type_sh_light_falloff(struct bNodeTreeType *ttype); +void register_node_type_sh_object_info(struct bNodeTreeType *ttype); void register_node_type_sh_fresnel(struct bNodeTreeType *ttype); void register_node_type_sh_layer_weight(struct bNodeTreeType *ttype); void register_node_type_sh_tex_coord(struct bNodeTreeType *ttype); diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.c b/source/blender/nodes/shader/nodes/node_shader_object_info.c new file mode 100644 index 00000000000..ee356dbb3b3 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_object_info.c @@ -0,0 +1,61 @@ +/* + * ***** 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 ***** + */ + +#include "../node_shader_util.h" + +/* **************** OUTPUT ******************** */ + +static bNodeSocketTemplate sh_node_object_info_out[]= { + { SOCK_VECTOR, 0, "Location", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "Object Index", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "Material Index", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "Random", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static int node_shader_gpu_object_info(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out) +{ + return GPU_stack_link(mat, "node_object_info", in, out); +} + +/* node type definition */ +void register_node_type_sh_object_info(bNodeTreeType *ttype) +{ + static bNodeType ntype; + + node_type_base(ttype, &ntype, SH_NODE_OBJECT_INFO, "Object Info", NODE_CLASS_INPUT, 0); + node_type_compatibility(&ntype, NODE_NEW_SHADING); + node_type_socket_templates(&ntype, NULL, sh_node_object_info_out); + node_type_size(&ntype, 150, 60, 200); + node_type_init(&ntype, NULL); + node_type_storage(&ntype, "", NULL, NULL); + node_type_exec(&ntype, NULL); + node_type_gpu(&ntype, node_shader_gpu_object_info); + + nodeRegisterType(ttype, &ntype); +} + From c55bb6eae27142a34446440ef3433d5bd7597598 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 14:05:47 +0000 Subject: [PATCH 073/159] * Bokeh Image angle now has rnge from -720 to +720 degrees --- .../compositor/operations/COM_BokehImageOperation.cpp | 5 ++++- source/blender/makesrna/intern/rna_nodetree.c | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cpp b/source/blender/compositor/operations/COM_BokehImageOperation.cpp index 4bc738052f6..0279b9a5bdf 100644 --- a/source/blender/compositor/operations/COM_BokehImageOperation.cpp +++ b/source/blender/compositor/operations/COM_BokehImageOperation.cpp @@ -38,7 +38,10 @@ void BokehImageOperation::initExecution() this->circularDistance = getWidth()/2; this->flapRad = (M_PI*2)/this->data->flaps; this->flapRadAdd = (this->data->angle/360.0)*M_PI*2; - if (this->flapRadAdd>M_PI) { + while (this->flapRadAdd<0.0f) { + this->flapRadAdd+=M_PI*2; + } + while (this->flapRadAdd>M_PI) { this->flapRadAdd-=M_PI*2; } } diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index cc2ad912a11..4ec83888e9d 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3111,7 +3111,7 @@ static void def_cmp_bokehimage(StructRNA *srna) prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "angle"); RNA_def_property_float_default(prop, 0.0f); - RNA_def_property_range(prop, -0.0f, 360.0f); + RNA_def_property_range(prop, -720.0f, 720.0f); RNA_def_property_ui_text(prop, "Angle", "Angle of the bokeh"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); @@ -3140,7 +3140,7 @@ static void def_cmp_bokehimage(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "lensshift"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1.0f, 1.0f); - RNA_def_property_ui_text(prop, "Lens shift", "Shift of the lens"); + RNA_def_property_ui_text(prop, "Lens shift", "Shift of the lens components"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } From 081f3dd9fab7b2d0ea2b62411ee4653f1df7840c Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 16:05:45 +0000 Subject: [PATCH 074/159] fix for [#31543] Nodes use array past bounds --- source/blender/compositor/intern/COM_Node.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/compositor/intern/COM_Node.cpp b/source/blender/compositor/intern/COM_Node.cpp index f06672ac80b..ba5e21d53ae 100644 --- a/source/blender/compositor/intern/COM_Node.cpp +++ b/source/blender/compositor/intern/COM_Node.cpp @@ -138,7 +138,6 @@ void Node::addSetVectorOperation(ExecutionSystem *graph, InputSocket *inputsocke operation->setX(val->value[0]); operation->setY(val->value[1]); operation->setZ(val->value[2]); - operation->setW(val->value[3]); this->addLink(graph, operation->getOutputSocket(), inputsocket); graph->addOperation(operation); } From 2970b7a735c75878eb51b141cc01a1a27f873eb7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 21 May 2012 16:52:04 +0000 Subject: [PATCH 075/159] change name length from 32 to 64, perhaps we should have some constant here bpy.constants.NAME_MAX ? - but this hardly ever changes. also hide allow overlap option for adding sequence strips, this was only intended for api use --- release/scripts/startup/bl_operators/object.py | 2 +- release/scripts/startup/bl_operators/wm.py | 2 +- source/blender/editors/space_sequencer/sequencer_add.c | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py index 358919ac888..151e1e93d8c 100644 --- a/release/scripts/startup/bl_operators/object.py +++ b/release/scripts/startup/bl_operators/object.py @@ -35,7 +35,7 @@ class SelectPattern(Operator): pattern = StringProperty( name="Pattern", description="Name filter using '*' and '?' wildcard chars", - maxlen=32, + maxlen=64, default="*", ) case_sensitive = BoolProperty( diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 883bac84e78..2b820add10e 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1077,7 +1077,7 @@ class WM_OT_properties_context_change(Operator): context = StringProperty( name="Context", - maxlen=32, + maxlen=64, ) def execute(self, context): diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index 2c3924e5407..97bfe1bafc2 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -89,6 +89,8 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) { + PropertyRNA *prop; + if (flag & SEQPROP_STARTFRAME) RNA_def_int(ot->srna, "frame_start", 0, INT_MIN, INT_MAX, "Start Frame", "Start frame of the sequence strip", INT_MIN, INT_MAX); @@ -99,7 +101,9 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) RNA_def_boolean(ot->srna, "replace_sel", 1, "Replace Selection", "Replace the current selection"); - RNA_def_boolean(ot->srna, "overlap", 0, "Allow Overlap", "Don't correct overlap on new sequence strips"); + /* only for python scripts which import strips and place them after */ + prop = RNA_def_boolean(ot->srna, "overlap", 0, "Allow Overlap", "Don't correct overlap on new sequence strips"); + RNA_def_property_flag(prop, PROP_HIDDEN); } static void sequencer_generic_invoke_path__internal(bContext *C, wmOperator *op, const char *identifier) From 7fbf2ffd5395cbddf4f46ab871612c1ebc72c87b Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 21 May 2012 18:06:20 +0000 Subject: [PATCH 076/159] A few minor UI message fixes... --- source/blender/makesrna/intern/rna_nodetree.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 4ec83888e9d..8187e027d36 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3051,7 +3051,7 @@ static void def_cmp_boxmask(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "rotation"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1000.0f, 1000.0f); - RNA_def_property_ui_text(prop, "Rotation", "Rotationangle of the box"); + RNA_def_property_ui_text(prop, "Rotation", "Rotation angle of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } @@ -3182,14 +3182,14 @@ static void def_cmp_colorcorrection(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "startmidtones"); RNA_def_property_float_default(prop, 0.2f); RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Start of midtones", "Start of midtones"); + RNA_def_property_ui_text(prop, "Midtones Start", "Start of midtones"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "midtones_end", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "endmidtones"); RNA_def_property_float_default(prop, 0.7f); RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "End of midtones", "end of midtones"); + RNA_def_property_ui_text(prop, "Midtones End", "End of midtones"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "master_saturation", PROP_FLOAT, PROP_NONE); @@ -3347,7 +3347,7 @@ static void def_cmp_viewer(StructRNA *srna) prop = RNA_def_property(srna, "tile_order", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); RNA_def_property_enum_items(prop, tileorder_items); - RNA_def_property_ui_text(prop, "Tile order", "tile order"); + RNA_def_property_ui_text(prop, "Tile order", "Tile order"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "center_x", PROP_FLOAT, PROP_NONE); From f76419d6def8afe12026fa6f2c7d932d04c455d2 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Mon, 21 May 2012 18:35:31 +0000 Subject: [PATCH 077/159] Fix for [#31367] render.drawLine not 2D filter aware: The lines from render.drawLine() are now drawn before motion blur and 2D Filters. --- source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 83b02acf1c3..836005cf25e 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -1342,13 +1342,13 @@ 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_rasterizer->FlushDebugShapes(); m_rendertools->MotionBlur(m_rasterizer); scene->Render2DFilters(m_canvas); #ifdef WITH_PYTHON scene->RunDrawingCallbacks(scene->GetPostDrawCB()); #endif - m_rasterizer->FlushDebugShapes(); } void KX_KetsjiEngine::StopEngine() From ff87bdecfeedcb16155448a9cb6fe793f2c452e2 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 18:47:55 +0000 Subject: [PATCH 078/159] [#31410] Code review testing: The color correction node in particular is quite problematic in button layout * Added first column with labels * increased max size of node * moved the start/end midtones to the bottom of the node --- source/blender/editors/space_node/drawnode.c | 27 +++++++++++-------- .../nodes/node_composite_colorcorrection.c | 2 +- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index ecdd30ce966..be1918634af 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1984,17 +1984,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE uiItemR(row, ptr, "blue", 0, NULL, ICON_NONE); row = uiLayoutRow(layout, 0); - uiItemR(row, ptr, "midtones_start", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "midtones_end", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - - row = uiLayoutRow(layout, 0); - uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - - row = uiLayoutRow(layout, 0); + uiItemL(row, "", 0); uiItemL(row, "Saturation", 0); uiItemL(row, "Contrast", 0); uiItemL(row, "Gamma", 0); @@ -2002,6 +1992,15 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE uiItemL(row, "Lift", 0); row = uiLayoutRow(layout, 0); + uiItemL(row, "Master", 0); + uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemL(row, "Highlights", 0); uiItemR(row, ptr, "highlights_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "highlights_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "highlights_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); @@ -2009,6 +2008,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE uiItemR(row, ptr, "highlights_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); row = uiLayoutRow(layout, 0); + uiItemL(row, "Midtones", 0); uiItemR(row, ptr, "midtones_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "midtones_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "midtones_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); @@ -2016,11 +2016,16 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); row = uiLayoutRow(layout, 0); + uiItemL(row, "Shadows", 0); uiItemR(row, ptr, "shadows_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "shadows_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "shadows_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "shadows_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "midtones_start", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_end", UI_ITEM_R_SLIDER, NULL, ICON_NONE); } static void node_composit_buts_colorcorrection_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiLayout *row; diff --git a/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c b/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c index af085418c0e..929efaef2c8 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorcorrection.c @@ -81,7 +81,7 @@ void register_node_type_cmp_colorcorrection(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_COLORCORRECTION, "Color Correction", NODE_CLASS_OP_COLOR, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_colorcorrection_in, cmp_node_colorcorrection_out); - node_type_size(&ntype, 400, 200, 400); + node_type_size(&ntype, 400, 200, 500); node_type_init(&ntype, node_composit_init_colorcorrection); node_type_storage(&ntype, "NodeColorCorrection", node_free_standard_storage, node_copy_standard_storage); From 564711418d17bbd750a496d119cf0cfaefba2107 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 19:31:29 +0000 Subject: [PATCH 079/159] Fix for [#31418] Code review: OpenCL initialization * Moved OpenCL initialization to first use * cleaned up build files * display some debug lines only when debugging is enabled. --- .../compositor/intern/COM_WorkScheduler.cpp | 15 +++++++++------ .../blender/compositor/intern/COM_compositor.cpp | 2 ++ source/creator/CMakeLists.txt | 1 - 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index c82a01a1e0a..406f0acf724 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -29,6 +29,7 @@ #include "OCL_opencl.h" #include "stdio.h" #include "COM_OpenCLKernels.cl.cpp" +#include "BKE_global.h" #if COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD #warning COM_CURRENT_THREADING_MODEL COM_TM_NOTHREAD is activated. Use only for debugging. @@ -235,7 +236,7 @@ void WorkScheduler::initialize() cl_int error; error = clGetPlatformIDs(0, 0, &numberOfPlatforms); if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); } - printf("%d number of platforms\n", numberOfPlatforms); + if (G.f & G_DEBUG) printf("%d number of platforms\n", numberOfPlatforms); cl_platform_id *platforms = new cl_platform_id[numberOfPlatforms]; error = clGetPlatformIDs(numberOfPlatforms, platforms, 0); unsigned int indexPlatform; @@ -280,11 +281,13 @@ void WorkScheduler::initialize() OpenCLDevice *clDevice = new OpenCLDevice(context, device, program); clDevice->initialize(), gpudevices.push_back(clDevice); - char resultString[32]; - error = clGetDeviceInfo(device, CL_DEVICE_NAME, 32, resultString, 0); - printf("OPENCL_DEVICE: %s, ", resultString); - error = clGetDeviceInfo(device, CL_DEVICE_VENDOR, 32, resultString, 0); - printf("%s\n", resultString); + if (G.f & G_DEBUG) { + char resultString[32]; + error = clGetDeviceInfo(device, CL_DEVICE_NAME, 32, resultString, 0); + printf("OPENCL_DEVICE: %s, ", resultString); + error = clGetDeviceInfo(device, CL_DEVICE_VENDOR, 32, resultString, 0); + printf("%s\n", resultString); + } } delete cldevices; delete platforms; diff --git a/source/blender/compositor/intern/COM_compositor.cpp b/source/blender/compositor/intern/COM_compositor.cpp index bd967190987..e27bff4401e 100644 --- a/source/blender/compositor/intern/COM_compositor.cpp +++ b/source/blender/compositor/intern/COM_compositor.cpp @@ -29,6 +29,7 @@ extern "C" { #include "COM_compositor.h" #include "COM_ExecutionSystem.h" #include "COM_WorkScheduler.h" +#include "OCL_opencl.h" static ThreadMutex *compositorMutex; void COM_execute(bNodeTree *editingtree, int rendering) @@ -36,6 +37,7 @@ void COM_execute(bNodeTree *editingtree, int rendering) if (compositorMutex == NULL) { /// TODO: move to blender startup phase compositorMutex = new ThreadMutex(); BLI_mutex_init(compositorMutex); + OCL_init(); WorkScheduler::initialize(); ///TODO: call workscheduler.deinitialize somewhere } BLI_mutex_lock(compositorMutex); diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index d76c2071dca..0f674b407e2 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -38,7 +38,6 @@ blender_include_dirs( ../blender/makesdna ../blender/gpu ../blender/windowmanager - ../blender/opencl ) if(WIN32) From cd002016e907d4a42d4f26fbd36dd5536a6cd36a Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Mon, 21 May 2012 19:58:23 +0000 Subject: [PATCH 080/159] Fix for [#31408] Code review testing: Button labels are invisible in many nodes --- source/blender/editors/space_node/drawnode.c | 8 ++++---- source/blender/makesrna/intern/rna_nodetree.c | 16 ++++++++-------- .../composite/nodes/node_composite_boxmask.c | 2 +- .../composite/nodes/node_composite_ellipsemask.c | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index be1918634af..869a9157aa7 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2080,8 +2080,8 @@ static void node_composit_buts_boxmask(uiLayout *layout, bContext *UNUSED(C), Po uiLayout *row; row= uiLayoutRow(layout, 1); - uiItemR(row, ptr, "x", 0, "X", ICON_NONE); - uiItemR(row, ptr, "y", 0, "Y", ICON_NONE); + uiItemR(row, ptr, "x", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "y", 0, NULL, ICON_NONE); row= uiLayoutRow(layout, 1); uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE); @@ -2207,8 +2207,8 @@ static void node_composit_buts_ellipsemask(uiLayout *layout, bContext *UNUSED(C) { uiLayout *row; row= uiLayoutRow(layout, 1); - uiItemR(row, ptr, "x", 0, "X", ICON_NONE); - uiItemR(row, ptr, "y", 0, "Y", ICON_NONE); + uiItemR(row, ptr, "x", 0, NULL, ICON_NONE); + uiItemR(row, ptr, "y", 0, NULL, ICON_NONE); row= uiLayoutRow(layout, 1); uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 8187e027d36..a2e08690327 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3023,28 +3023,28 @@ static void def_cmp_boxmask(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "x"); RNA_def_property_float_default(prop, 0.5f); RNA_def_property_range(prop, -1.0f, 2.0f); - RNA_def_property_ui_text(prop, "X position", "X position of the middle of the box"); + RNA_def_property_ui_text(prop, "X", "X position of the middle of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "y"); RNA_def_property_float_default(prop, 0.5f); RNA_def_property_range(prop, -1.0f, 2.0f); - RNA_def_property_ui_text(prop, "Y position", "Y position of the middle of the box"); + RNA_def_property_ui_text(prop, "Y", "Y position of the middle of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "width"); RNA_def_property_float_default(prop, 0.3f); RNA_def_property_range(prop, 0.0f, 2.0f); - RNA_def_property_ui_text(prop, "Width of the box", "Width of the box"); + RNA_def_property_ui_text(prop, "Width", "Width of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "height"); RNA_def_property_float_default(prop, 0.2f); RNA_def_property_range(prop, 0.0f, 2.0f); - RNA_def_property_ui_text(prop, "Height of the box", "Height of the box"); + RNA_def_property_ui_text(prop, "Height", "Height of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_NONE); @@ -3070,28 +3070,28 @@ static void def_cmp_ellipsemask(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "x"); RNA_def_property_float_default(prop, 0.5f); RNA_def_property_range(prop, -1.0f, 2.0f); - RNA_def_property_ui_text(prop, "X position", "X position of the middle of the box"); + RNA_def_property_ui_text(prop, "X", "X position of the middle of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "y"); RNA_def_property_float_default(prop, 0.5f); RNA_def_property_range(prop, -1.0f, 2.0f); - RNA_def_property_ui_text(prop, "Y position", "Y position of the middle of the box"); + RNA_def_property_ui_text(prop, "Y", "Y position of the middle of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "width"); RNA_def_property_float_default(prop, 0.3f); RNA_def_property_range(prop, 0.0f, 2.0f); - RNA_def_property_ui_text(prop, "Width of the box", "Width of the box"); + RNA_def_property_ui_text(prop, "Width", "Width of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "height"); RNA_def_property_float_default(prop, 0.2f); RNA_def_property_range(prop, 0.0f, 2.0f); - RNA_def_property_ui_text(prop, "Height of the box", "Height of the box"); + RNA_def_property_ui_text(prop, "Height", "Height of the box"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_NONE); diff --git a/source/blender/nodes/composite/nodes/node_composite_boxmask.c b/source/blender/nodes/composite/nodes/node_composite_boxmask.c index be5d25f60c3..8c3744e2930 100644 --- a/source/blender/nodes/composite/nodes/node_composite_boxmask.c +++ b/source/blender/nodes/composite/nodes/node_composite_boxmask.c @@ -63,7 +63,7 @@ void register_node_type_cmp_boxmask(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_MASK_BOX, "Box Mask", NODE_CLASS_MATTE, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_boxmask_in, cmp_node_boxmask_out); - node_type_size(&ntype, 120, 110, 160); + node_type_size(&ntype, 260, 110, 300); node_type_init(&ntype, node_composit_init_boxmask); node_type_storage(&ntype, "NodeBoxMask", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c b/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c index 556ad1ab6c6..a6ba3034d87 100644 --- a/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c +++ b/source/blender/nodes/composite/nodes/node_composite_ellipsemask.c @@ -63,7 +63,7 @@ void register_node_type_cmp_ellipsemask(bNodeTreeType *ttype) node_type_base(ttype, &ntype, CMP_NODE_MASK_ELLIPSE, "Ellipse Mask", NODE_CLASS_MATTE, NODE_OPTIONS); node_type_socket_templates(&ntype, cmp_node_ellipsemask_in, cmp_node_ellipsemask_out); - node_type_size(&ntype, 120, 110, 160); + node_type_size(&ntype, 260, 110, 300); node_type_init(&ntype, node_composit_init_ellipsemask); node_type_storage(&ntype, "NodeEllipseMask", node_free_standard_storage, node_copy_standard_storage); From 146e92311f55acd6a5f3fdd0aeaec3a75a537ab5 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 20:10:21 +0000 Subject: [PATCH 081/159] UI mafia fix thanks to venomgfx for reporting * Color correction node --- source/blender/editors/space_node/drawnode.c | 41 ++++++++++--------- source/blender/makesrna/intern/rna_nodetree.c | 40 +++++++++--------- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 869a9157aa7..528a48b60df 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1993,40 +1993,41 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE row = uiLayoutRow(layout, 0); uiItemL(row, "Master", 0); - uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "master_gamma", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, "", ICON_NONE); row = uiLayoutRow(layout, 0); uiItemL(row, "Highlights", 0); - uiItemR(row, ptr, "highlights_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "highlights_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "highlights_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "highlights_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "highlights_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "highlights_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "highlights_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "highlights_gamma", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "highlights_gain", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "highlights_lift", UI_ITEM_R_SLIDER, "", ICON_NONE); row = uiLayoutRow(layout, 0); uiItemL(row, "Midtones", 0); - uiItemR(row, ptr, "midtones_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "midtones_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "midtones_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "midtones_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "midtones_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "midtones_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "midtones_gamma", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "midtones_gain", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, "", ICON_NONE); row = uiLayoutRow(layout, 0); uiItemL(row, "Shadows", 0); - uiItemR(row, ptr, "shadows_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "shadows_contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "shadows_gamma", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "shadows_gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(row, ptr, "shadows_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "shadows_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "shadows_gamma", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "shadows_gain", UI_ITEM_R_SLIDER, "", ICON_NONE); + uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, "", ICON_NONE); row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "midtones_start", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(row, ptr, "midtones_end", UI_ITEM_R_SLIDER, NULL, ICON_NONE); } + static void node_composit_buts_colorcorrection_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiLayout *row; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index a2e08690327..0ec372415be 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3196,35 +3196,35 @@ static void def_cmp_colorcorrection(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "master.saturation"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Master saturation", "Master saturation"); + RNA_def_property_ui_text(prop, "Master Saturation", "Master saturation"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "master_contrast", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "master.contrast"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Master contrast", "Master contrast"); + RNA_def_property_ui_text(prop, "Master Contrast", "Master contrast"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "master_gamma", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "master.gamma"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Master gamma", "Master gamma"); + RNA_def_property_ui_text(prop, "Master Gamma", "Master gamma"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "master_gain", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "master.gain"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Master gain", "Master gain"); + RNA_def_property_ui_text(prop, "Master Gain", "Master gain"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "master_lift", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "master.lift"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1, 1); - RNA_def_property_ui_text(prop, "Master lift", "Master lift"); + RNA_def_property_ui_text(prop, "Master Lift", "Master lift"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); // @@ -3232,105 +3232,105 @@ static void def_cmp_colorcorrection(StructRNA *srna) RNA_def_property_float_sdna(prop, NULL, "shadows.saturation"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Shadows saturation", "Shadows saturation"); + RNA_def_property_ui_text(prop, "Shadows Saturation", "Shadows saturation"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "shadows_contrast", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "shadows.contrast"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Shadows contrast", "Shadows contrast"); + RNA_def_property_ui_text(prop, "Shadows Contrast", "Shadows contrast"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "shadows_gamma", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "shadows.gamma"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Shadows gamma", "Shadows gamma"); + RNA_def_property_ui_text(prop, "Shadows Gamma", "Shadows gamma"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "shadows_gain", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "shadows.gain"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Shadows gain", "Shadows gain"); + RNA_def_property_ui_text(prop, "Shadows Gain", "Shadows gain"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "shadows_lift", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "shadows.lift"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1, 1); - RNA_def_property_ui_text(prop, "Shadows lift", "Shadows lift"); + RNA_def_property_ui_text(prop, "Shadows Lift", "Shadows lift"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); // prop = RNA_def_property(srna, "midtones_saturation", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "midtones.saturation"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Midtones saturation", "Midtones saturation"); + RNA_def_property_ui_text(prop, "Midtones Saturation", "Midtones saturation"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "midtones_contrast", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "midtones.contrast"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Midtones contrast", "Midtones contrast"); + RNA_def_property_ui_text(prop, "Midtones Contrast", "Midtones contrast"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "midtones_gamma", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "midtones.gamma"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Midtones gamma", "Midtones gamma"); + RNA_def_property_ui_text(prop, "Midtones Gamma", "Midtones gamma"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "midtones_gain", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "midtones.gain"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Midtones gain", "Midtones gain"); + RNA_def_property_ui_text(prop, "Midtones Gain", "Midtones gain"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "midtones_lift", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "midtones.lift"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1, 1); - RNA_def_property_ui_text(prop, "Midtones lift", "Midtones lift"); + RNA_def_property_ui_text(prop, "Midtones Lift", "Midtones lift"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); // prop = RNA_def_property(srna, "highlights_saturation", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "highlights.saturation"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Highlights saturation", "Highlights saturation"); + RNA_def_property_ui_text(prop, "Highlights Saturation", "Highlights saturation"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "highlights_contrast", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "highlights.contrast"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Highlights contrast", "Highlights contrast"); + RNA_def_property_ui_text(prop, "Highlights Contrast", "Highlights contrast"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "highlights_gamma", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "highlights.gamma"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Highlights gamma", "Highlights gamma"); + RNA_def_property_ui_text(prop, "Highlights Gamma", "Highlights gamma"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "highlights_gain", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "highlights.gain"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0, 4); - RNA_def_property_ui_text(prop, "Highlights gain", "Highlights gain"); + RNA_def_property_ui_text(prop, "Highlights Gain", "Highlights gain"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "highlights_lift", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "highlights.lift"); RNA_def_property_float_default(prop, 0.0f); RNA_def_property_range(prop, -1, 1); - RNA_def_property_ui_text(prop, "Highlights lift", "Highlights lift"); + RNA_def_property_ui_text(prop, "Highlights Lift", "Highlights lift"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } From 877dc587244b95e63ebc1e37e3692fa6fd5b85f7 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 21 May 2012 20:21:32 +0000 Subject: [PATCH 082/159] Fix for [#31413] Code review testing: Regarding chunksize, could the tooltip be made more clear --- source/blender/makesrna/intern/rna_nodetree.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 0ec372415be..e8ec8d8bb83 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3925,16 +3925,16 @@ static void rna_def_composite_nodetree(BlenderRNA *brna) prop= RNA_def_property(srna, "render_quality", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "render_quality"); RNA_def_property_enum_items(prop, node_quality_items); - RNA_def_property_ui_text(prop, "Render quality", "Quality when rendering"); + RNA_def_property_ui_text(prop, "Render Quality", "Quality when rendering"); prop= RNA_def_property(srna, "edit_quality", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "edit_quality"); RNA_def_property_enum_items(prop, node_quality_items); - RNA_def_property_ui_text(prop, "Edit quality", "Quality when editing"); + RNA_def_property_ui_text(prop, "Edit Quality", "Quality when editing"); prop= RNA_def_property(srna, "chunksize", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "chunksize"); - RNA_def_property_ui_text(prop, "Chunksize", "Max size of a chunk during calculation"); + RNA_def_property_ui_text(prop, "Chunksize", "Max size of a tile. Smaller values gives better distribution of multiple threads, but more overhead."); RNA_def_property_range(prop, 32, 1024); prop= RNA_def_property(srna, "use_opencl", PROP_BOOLEAN, PROP_NONE); From 9b20cecd22bb5debe8ff83f01db1a0a08dba38ce Mon Sep 17 00:00:00 2001 From: Dan Eicher Date: Mon, 21 May 2012 20:28:54 +0000 Subject: [PATCH 083/159] Missing RNA_def_property_update functions for RenderSettings bake properties --- source/blender/makesrna/intern/rna_scene.c | 33 +++++++++++++++------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index c6c97fa9979..e6a0401175d 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -3725,65 +3725,78 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_mode"); RNA_def_property_enum_items(prop, bake_mode_items); RNA_def_property_ui_text(prop, "Bake Mode", "Choose shading information to bake into the image"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bake_normal_space", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_normal_space"); RNA_def_property_enum_items(prop, bake_normal_space_items); RNA_def_property_ui_text(prop, "Normal Space", "Choose normal space for baking"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bake_quad_split", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, bake_qyad_split_items); RNA_def_property_ui_text(prop, "Quad Split", "Choose the method used to split a quad into 2 triangles for baking"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bake_aa_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_osa"); RNA_def_property_enum_items(prop, fixed_oversample_items); RNA_def_property_ui_text(prop, "Anti-Aliasing Level", ""); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "use_bake_selected_to_active", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_TO_ACTIVE); RNA_def_property_ui_text(prop, "Selected to Active", "Bake shading on the surface of selected objects to the active object"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "use_bake_normalize", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_NORMALIZE); RNA_def_property_ui_text(prop, "Normalized", "With displacement normalize to the distance, with ambient occlusion " "normalize without using material settings"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "use_bake_clear", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_CLEAR); RNA_def_property_ui_text(prop, "Clear", "Clear Images before baking"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "use_bake_antialiasing", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_OSA); RNA_def_property_ui_text(prop, "Anti-Aliasing", "Enables Anti-aliasing"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bake_margin", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "bake_filter"); RNA_def_property_range(prop, 0, 64); RNA_def_property_ui_text(prop, "Margin", "Amount of pixels to extend the baked result with, as post process filter"); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); prop = RNA_def_property(srna, "bake_distance", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "bake_maxdist"); RNA_def_property_range(prop, 0.0, 1000.0); RNA_def_property_ui_text(prop, "Distance", "Maximum distance from active object to other object (in blender units)"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "bake_bias", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "bake_biasdist"); RNA_def_property_range(prop, 0.0, 1000.0); RNA_def_property_ui_text(prop, "Bias", "Bias towards faces further away from the object (in blender units)"); - + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + prop = RNA_def_property(srna, "use_bake_multires", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_MULTIRES); RNA_def_property_ui_text(prop, "Bake from Multires", "Bake directly from multires object"); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); prop = RNA_def_property(srna, "use_bake_lores_mesh", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_LORES_MESH); RNA_def_property_ui_text(prop, "Low Resolution Mesh", "Calculate heights against unsubdivided low resolution mesh"); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); /* stamp */ From b951c2be7f26caea266e3a27d9701b0374bdcad5 Mon Sep 17 00:00:00 2001 From: Monique Dewanchand Date: Mon, 21 May 2012 20:36:02 +0000 Subject: [PATCH 084/159] fix for [#31502] Defocus max radius help tekst --- source/blender/makesrna/intern/rna_nodetree.c | 2 +- source/blender/nodes/composite/nodes/node_composite_defocus.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index e8ec8d8bb83..3406a940967 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -2427,7 +2427,7 @@ static void def_cmp_defocus(StructRNA *srna) prop = RNA_def_property(srna, "blur_max", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "maxblur"); RNA_def_property_range(prop, 0.0f, 10000.0f); - RNA_def_property_ui_text(prop, "Max Blur", "Blur limit, maximum CoC radius, 0=no limit"); + RNA_def_property_ui_text(prop, "Max Blur", "Blur limit, maximum CoC radius"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE); diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c index 4c1c4e28c8d..1a6e3fb1675 100644 --- a/source/blender/nodes/composite/nodes/node_composite_defocus.c +++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c @@ -868,7 +868,7 @@ static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode* node, bN nbd->gamco = 0; nbd->samples = 16; nbd->fstop = 128.f; - nbd->maxblur = 0; + nbd->maxblur = 16; nbd->bthresh = 1.f; nbd->scale = 1.f; nbd->no_zbuf = 1; From 5f95f7d2adb25ef7b821ec08f7f627664152d0b4 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Mon, 21 May 2012 23:32:46 +0000 Subject: [PATCH 085/159] Add input sample averaging to PaintStroke. Averages input samples to make the brush stroke smoother. Only mouse location is averaged right now, not pressure/tilt/etc. The DNA is in struct Paint.num_input_samples, RNA is Paint.input_samples. In combination with PaintStroke usage this change applies to sculpt, vpaint, and wpaint. The range of useful values varies quite a bit depending on input device; mouse needs higher values to match tablet pen, so set max samples pretty high (64). Release note section: http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Sculpting#Input_Stroke_Averaging --- .../startup/bl_ui/space_view3d_toolbar.py | 6 ++ source/blender/blenloader/intern/readfile.c | 4 +- .../editors/sculpt_paint/paint_intern.h | 2 +- .../editors/sculpt_paint/paint_stroke.c | 73 ++++++++++++++++--- .../editors/sculpt_paint/paint_vertex.c | 4 +- source/blender/editors/sculpt_paint/sculpt.c | 17 ++--- source/blender/makesdna/DNA_scene_types.h | 9 +++ .../makesrna/intern/rna_sculpt_paint.c | 5 ++ 8 files changed, 94 insertions(+), 26 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index d3a8427aa16..a1f616cc237 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -873,6 +873,8 @@ class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel): layout.prop(sculpt, "show_brush") layout.prop(sculpt, "use_deform_only") + layout.prop(sculpt, "input_samples") + self.unified_paint_settings(layout, context) @@ -984,6 +986,8 @@ class VIEW3D_PT_tools_weightpaint_options(Panel, View3DPaintPanel): col.prop(mesh, "use_mirror_x") col.prop(mesh, "use_mirror_topology") + col.prop(wpaint, "input_samples") + self.unified_paint_settings(col, context) # Commented out because the Apply button isn't an operator yet, making these settings useless @@ -1014,6 +1018,8 @@ class VIEW3D_PT_tools_vertexpaint(Panel, View3DPaintPanel): col.prop(vpaint, "use_normal") col.prop(vpaint, "use_spray") + col.prop(vpaint, "input_samples") + self.unified_paint_settings(col, context) # Commented out because the Apply button isn't an operator yet, making these settings useless diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c5ecaf8d49a..c1942144ece 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4897,8 +4897,10 @@ static void link_recurs_seq(FileData *fd, ListBase *lb) static void direct_link_paint(FileData *fd, Paint **paint) { -/* TODO. is this needed */ + /* TODO. is this needed */ (*paint) = newdataadr(fd, (*paint)); + if (*paint && (*paint)->num_input_samples < 1) + (*paint)->num_input_samples = 1; } static void direct_link_scene(FileData *fd, Scene *sce) diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h index a97563b258f..de149bf2806 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.h +++ b/source/blender/editors/sculpt_paint/paint_intern.h @@ -52,7 +52,7 @@ struct wmOperatorType; /* paint_stroke.c */ typedef int (*StrokeGetLocation)(struct bContext *C, float location[3], float mouse[2]); -typedef int (*StrokeTestStart)(struct bContext *C, struct wmOperator *op, struct wmEvent *event); +typedef int (*StrokeTestStart)(struct bContext *C, struct wmOperator *op, const float mouse[2]); typedef void (*StrokeUpdateStep)(struct bContext *C, struct PaintStroke *stroke, struct PointerRNA *itemptr); typedef void (*StrokeDone)(const struct bContext *C, struct PaintStroke *stroke); diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index 9832bcf1528..987ab932fd6 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -60,6 +60,12 @@ #include #include +typedef struct PaintSample { + float mouse[2]; + + /* TODO: other input properties, e.g. tablet pressure */ +} PaintSample; + typedef struct PaintStroke { void *mode_data; void *smooth_stroke_cursor; @@ -70,6 +76,12 @@ typedef struct PaintStroke { bglMats mats; Brush *brush; + /* Paint stroke can use up to PAINT_MAX_INPUT_SAMPLES prior inputs + * to smooth the stroke */ + PaintSample samples[PAINT_MAX_INPUT_SAMPLES]; + int num_samples; + int cur_sample; + float last_mouse_position[2]; /* Set whether any stroke step has yet occurred @@ -182,10 +194,11 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *ev } /* Returns zero if no sculpt changes should be made, non-zero otherwise */ -static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *event) +static int paint_smooth_stroke(PaintStroke *stroke, float output[2], + const PaintSample *sample) { - output[0] = event->x; - output[1] = event->y; + output[0] = sample->mouse[0]; + output[1] = sample->mouse[1]; if ((stroke->brush->flag & BRUSH_SMOOTH_STROKE) && !ELEM4(stroke->brush->sculpt_tool, @@ -197,15 +210,16 @@ static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *ev !(stroke->brush->flag & BRUSH_RESTORE_MESH)) { float u = stroke->brush->smooth_stroke_factor, v = 1.0f - u; - float dx = stroke->last_mouse_position[0] - event->x, dy = stroke->last_mouse_position[1] - event->y; + float dx = stroke->last_mouse_position[0] - sample->mouse[0]; + float dy = stroke->last_mouse_position[1] - sample->mouse[1]; /* If the mouse is moving within the radius of the last move, * don't update the mouse position. This allows sharp turns. */ if (dx * dx + dy * dy < stroke->brush->smooth_stroke_radius * stroke->brush->smooth_stroke_radius) return 0; - output[0] = event->x * v + stroke->last_mouse_position[0] * u; - output[1] = event->y * v + stroke->last_mouse_position[1] * u; + output[0] = sample->mouse[0] * v + stroke->last_mouse_position[0] * u; + output[1] = sample->mouse[1] * v + stroke->last_mouse_position[1] * u; } return 1; @@ -343,12 +357,52 @@ struct wmKeyMap *paint_stroke_modal_keymap(struct wmKeyConfig *keyconf) return keymap; } +static void paint_stroke_add_sample(const Paint *paint, + PaintStroke *stroke, + float x, float y) +{ + PaintSample *sample = &stroke->samples[stroke->cur_sample]; + int max_samples = MIN2(PAINT_MAX_INPUT_SAMPLES, + MAX2(paint->num_input_samples, 1)); + + sample->mouse[0] = x; + sample->mouse[1] = y; + + stroke->cur_sample++; + if (stroke->cur_sample >= max_samples) + stroke->cur_sample = 0; + if (stroke->num_samples < max_samples) + stroke->num_samples++; +} + +static void paint_stroke_sample_average(const PaintStroke *stroke, + PaintSample *average) +{ + int i; + + memset(average, 0, sizeof(*average)); + + BLI_assert(stroke->num_samples > 0); + + for (i = 0; i < stroke->num_samples; i++) + add_v2_v2(average->mouse, stroke->samples[i].mouse); + + mul_v2_fl(average->mouse, 1.0f / stroke->num_samples); + + /*printf("avg=(%f, %f), num=%d\n", average->mouse[0], average->mouse[1], stroke->num_samples);*/ +} + int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event) { + Paint *p = paint_get_active(CTX_data_scene(C)); PaintStroke *stroke = op->customdata; + PaintSample sample_average; float mouse[2]; int first = 0; + paint_stroke_add_sample(p, stroke, event->x, event->y); + paint_stroke_sample_average(stroke, &sample_average); + // let NDOF motion pass through to the 3D view so we can paint and rotate simultaneously! // this isn't perfect... even when an extra MOUSEMOVE is spoofed, the stroke discards it // since the 2D deltas are zero -- code in this file needs to be updated to use the @@ -357,9 +411,8 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_PASS_THROUGH; if (!stroke->stroke_started) { - stroke->last_mouse_position[0] = event->x; - stroke->last_mouse_position[1] = event->y; - stroke->stroke_started = stroke->test_start(C, op, event); + copy_v2_v2(stroke->last_mouse_position, sample_average.mouse); + stroke->stroke_started = stroke->test_start(C, op, sample_average.mouse); if (stroke->stroke_started) { stroke->smooth_stroke_cursor = @@ -390,7 +443,7 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event) (event->type == TIMER && (event->customdata == stroke->timer)) ) { if (stroke->stroke_started) { - if (paint_smooth_stroke(stroke, mouse, event)) { + if (paint_smooth_stroke(stroke, mouse, &sample_average)) { if (paint_space_stroke_enabled(stroke->brush)) { if (!paint_space_stroke(C, op, event, mouse)) { //ED_region_tag_redraw(ar); diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 7a9ebe9aec4..513b5bbaa98 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -2125,7 +2125,7 @@ static char *wpaint_make_validmap(Object *ob) return vgroup_validmap; } -static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) +static int wpaint_stroke_test_start(bContext *C, wmOperator *op, const float UNUSED(mouse[2])) { Scene *scene = CTX_data_scene(C); struct PaintStroke *stroke = op->customdata; @@ -2673,7 +2673,7 @@ static void vpaint_build_poly_facemap(struct VPaintData *vd, Mesh *me) } } -static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *UNUSED(event)) +static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, const float UNUSED(mouse[2])) { ToolSettings *ts = CTX_data_tool_settings(C); struct PaintStroke *stroke = op->customdata; diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index f5f8a790c55..7b8337ff957 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -3224,7 +3224,7 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss) } /* Initialize the stroke cache invariants from operator properties */ -static void sculpt_update_cache_invariants(bContext *C, Sculpt *sd, SculptSession *ss, wmOperator *op, wmEvent *event) +static void sculpt_update_cache_invariants(bContext *C, Sculpt *sd, SculptSession *ss, wmOperator *op, const float mouse[2]) { StrokeCache *cache = MEM_callocN(sizeof(StrokeCache), "stroke cache"); Brush *brush = paint_brush(&sd->paint); @@ -3247,14 +3247,7 @@ static void sculpt_update_cache_invariants(bContext *C, Sculpt *sd, SculptSessio sculpt_init_mirror_clipping(ob, ss); /* Initial mouse location */ - if (event) { - ss->cache->initial_mouse[0] = event->x; - ss->cache->initial_mouse[1] = event->y; - } - else { - ss->cache->initial_mouse[0] = 0; - ss->cache->initial_mouse[1] = 0; - } + copy_v2_v2(ss->cache->initial_mouse, mouse); mode = RNA_enum_get(op->ptr, "mode"); cache->invert = mode == BRUSH_STROKE_INVERT; @@ -3768,18 +3761,18 @@ static int over_mesh(bContext *C, struct wmOperator *UNUSED(op), float x, float } static int sculpt_stroke_test_start(bContext *C, struct wmOperator *op, - wmEvent *event) + const float mouse[2]) { /* Don't start the stroke until mouse goes over the mesh. * note: event will only be null when re-executing the saved stroke. */ - if (event == NULL || over_mesh(C, op, event->x, event->y)) { + if (over_mesh(C, op, mouse[0], mouse[1])) { Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; Sculpt *sd = CTX_data_tool_settings(C)->sculpt; ED_view3d_init_mats_rv3d(ob, CTX_wm_region_view3d(C)); - sculpt_update_cache_invariants(C, sd, ss, op, event); + sculpt_update_cache_invariants(C, sd, ss, op, mouse); sculpt_undo_push_begin(sculpt_tool_name(sd)); diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 83666068812..673156e3d7d 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -702,6 +702,8 @@ typedef struct TimeMarker { /* *************************************************************** */ /* Paint Mode/Tool Data */ +#define PAINT_MAX_INPUT_SAMPLES 64 + /* Paint Tool Base */ typedef struct Paint { struct Brush *brush; @@ -710,7 +712,14 @@ typedef struct Paint { void *paint_cursor; unsigned char paint_cursor_col[4]; + /* enum PaintFlags */ int flags; + + /* Paint stroke can use up to PAINT_MAX_INPUT_SAMPLES inputs to + * smooth the stroke */ + int num_input_samples; + + int pad; } Paint; /* ------------------------------------------- */ diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c index ad40e71eb71..58d676555c1 100644 --- a/source/blender/makesrna/intern/rna_sculpt_paint.c +++ b/source/blender/makesrna/intern/rna_sculpt_paint.c @@ -234,6 +234,11 @@ static void rna_def_paint(BlenderRNA *brna) prop = RNA_def_property(srna, "show_low_resolution", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", PAINT_FAST_NAVIGATE); RNA_def_property_ui_text(prop, "Fast Navigate", "For multires, show low resolution while navigating the view"); + + prop = RNA_def_property(srna, "input_samples", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "num_input_samples"); + RNA_def_property_ui_range(prop, 1, PAINT_MAX_INPUT_SAMPLES, 0, 0); + RNA_def_property_ui_text(prop, "Input Samples", "Average multiple input samples together to smooth the brush stroke"); } static void rna_def_sculpt(BlenderRNA *brna) From 72f38b4f097120e6d4c5b3b0c9aceda7d1782583 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 06:29:46 +0000 Subject: [PATCH 086/159] style cleanup: brace placement. --- source/blender/collada/ArmatureImporter.cpp | 4 +++- source/blender/compositor/nodes/COM_DilateErodeNode.cpp | 9 ++++++--- .../compositor/operations/COM_DilateErodeOperation.cpp | 3 ++- .../compositor/operations/COM_GlareBaseOperation.cpp | 3 ++- source/blender/gpu/intern/gpu_material.c | 3 ++- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 97de7590d07..f23b2bf4b02 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -289,8 +289,10 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW: 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); - }else + } + else { leaf_bones.push_back(leaf); + } } void ArmatureImporter::fix_leaf_bones( ) diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp index 55759ba410f..8f53c1ff8cc 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp @@ -47,18 +47,21 @@ void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorCont addLink(graph, operation->getOutputSocket(), antiAlias->getInputSocket(0)); this->getOutputSocket(0)->relinkConnections(antiAlias->getOutputSocket(0)); graph->addOperation(antiAlias); - } else { + } + else { this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); } graph->addOperation(operation); - } else { + } + else { if (editorNode->custom2 > 0) { DilateStepOperation * operation = new DilateStepOperation(); operation->setIterations(editorNode->custom2); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); - } else { + } + else { ErodeStepOperation * operation = new ErodeStepOperation(); operation->setIterations(-editorNode->custom2); this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp index 0dc4ea84cb8..a73f76030ab 100644 --- a/source/blender/compositor/operations/COM_DilateErodeOperation.cpp +++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cpp @@ -241,7 +241,8 @@ bool DilateStepOperation::determineDependingAreaOfInterest(rcti *input, ReadBuff { if (this->cached_buffer) { return false; - } else { + } + else { rcti newInput; newInput.xmax = getWidth(); diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp index 44f987b45e3..fdfd19a10ae 100644 --- a/source/blender/compositor/operations/COM_GlareBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareBaseOperation.cpp @@ -74,7 +74,8 @@ bool GlareBaseOperation::determineDependingAreaOfInterest(rcti *input, ReadBuffe { if (this->cachedInstance != NULL) { return false; - } else { + } + else { rcti newInput; newInput.xmax = this->getWidth(); newInput.xmin = 0; diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 7ccb25e6cf6..31008ff8685 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -729,7 +729,8 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la 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), GPU_uniform(&lamp->la->bleedbias), inp, &shadfac); - } else { + } + else { GPU_link(mat, "test_shadowbuf", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_texture(lamp->tex, GPU_DYNAMIC_SAMPLER_2DSHADOW, lamp->ob), From acd468f2b313ae576d2a4a06d26f19aad19f716c Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 22 May 2012 07:06:48 +0000 Subject: [PATCH 087/159] Fix #31500: Displacement Baking from Multires doesn't work Issue was caused by wrong calculation of grid coordinates when switching from low resolution mesh to high resolution mesh. Somehow was affected only for face U or V equals to 1.0f. Checked fix using all test files used during initial implementation of multires baker and tested sample file from bug/ Seems everything is OK. --- source/blender/editors/object/object_bake.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index b89562e772b..810fe244984 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -534,7 +534,7 @@ static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int *orig int grid_index = origindex[face_index]; int loc_offs = face_index % (1 << (2 * lvl)); int cell_index = loc_offs % ((side - 1) * (side - 1)); - int cell_side = grid_size / (side - 1); + int cell_side = (grid_size - 1) / (side - 1); int row = cell_index / (side - 1); int col = cell_index % (side - 1); From 82d1b699b52e14062b9dcbd6044ca27c12511690 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 07:07:25 +0000 Subject: [PATCH 088/159] remove unused enums (these are defined and used elsewhere) --- source/blender/makesrna/intern/rna_lamp.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c index 7adee6fd95f..fdad91165c4 100644 --- a/source/blender/makesrna/intern/rna_lamp.c +++ b/source/blender/makesrna/intern/rna_lamp.c @@ -758,20 +758,6 @@ static void rna_def_spot_lamp(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_shadbuffiltertype_items[] = { - {LA_SHADBUF_BOX, "BOX", 0, "Box", "Apply the Box filter to shadow buffer samples"}, - {LA_SHADBUF_TENT, "TENT", 0, "Tent", "Apply the Tent Filter to shadow buffer samples"}, - {LA_SHADBUF_GAUSS, "GAUSS", 0, "Gauss", "Apply the Gauss filter to shadow buffer samples"}, - {0, NULL, 0, NULL, NULL} - }; - - static EnumPropertyItem prop_numbuffer_items[] = { - {1, "BUFFERS_1", 0, "1", "Only one buffer rendered"}, - {4, "BUFFERS_4", 0, "4", "Render 4 buffers for better AA, this quadruples memory usage"}, - {9, "BUFFERS_9", 0, "9", "Render 9 buffers for better AA, this uses nine times more memory"}, - {0, NULL, 0, NULL, NULL} - }; - srna = RNA_def_struct(brna, "SpotLamp", "Lamp"); RNA_def_struct_sdna(srna, "Lamp"); RNA_def_struct_ui_text(srna, "Spot Lamp", "Directional cone lamp"); From 3289628610349784c0b068193da4275095b7a424 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 07:26:45 +0000 Subject: [PATCH 089/159] fix [#31489] EdgeSplit modifier prevents All Edge to be work correctly since 2.63 bmesh regression where the edge-draw flag was cleared when bmesh modifiers were used. --- source/blender/blenkernel/intern/cdderivedmesh.c | 8 ++++++++ source/blender/bmesh/bmesh_class.h | 5 +++-- source/blender/bmesh/intern/bmesh_construct.c | 15 +++++++++------ source/blender/bmesh/intern/bmesh_mesh_conv.c | 3 +++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index a34d2ecd47a..4a07e4b56c7 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1891,6 +1891,14 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis med->flag = BM_edge_flag_to_mflag(eed); + /* handle this differently to editmode switching, + * only enable draw for single user edges rather then calculating angle */ + if ((med->flag & ME_EDGEDRAW) == 0) { + if (eed->l && eed->l == eed->l->radial_next) { + med->flag |= ME_EDGEDRAW; + } + } + CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i); if (add_orig) *index = i; } diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h index c536a22cf53..737efde8391 100644 --- a/source/blender/bmesh/bmesh_class.h +++ b/source/blender/bmesh/bmesh_class.h @@ -225,9 +225,10 @@ enum { * when temp tagging is handy. * always assume dirty & clear before use. */ - /* we have 2 spare flags which is awesome but since we're limited to 8 + BM_ELEM_DRAW = (1 << 5), /* edge display */ + + /* we have 1 spare flag which is awesome but since we're limited to 8 * only add new flags with care! - campbell */ - /* BM_ELEM_SPARE = (1 << 5), */ /* BM_ELEM_SPARE = (1 << 6), */ BM_ELEM_INTERNAL_TAG = (1 << 7) /* for low level internal API tagging, diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 684237b79c5..589a5fbaa66 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -973,6 +973,7 @@ char BM_edge_flag_from_mflag(const short meflag) { return ( ((meflag & SELECT) ? BM_ELEM_SELECT : 0) | ((meflag & ME_SEAM) ? BM_ELEM_SEAM : 0) | + ((meflag & ME_EDGEDRAW) ? BM_ELEM_DRAW : 0) | ((meflag & ME_SHARP) == 0 ? BM_ELEM_SMOOTH : 0) | /* invert */ ((meflag & ME_HIDE) ? BM_ELEM_HIDDEN : 0) ); @@ -994,16 +995,18 @@ char BM_vert_flag_to_mflag(BMVert *eve) ((hflag & BM_ELEM_HIDDEN) ? ME_HIDE : 0) ); } + short BM_edge_flag_to_mflag(BMEdge *eed) { const char hflag = eed->head.hflag; - return ( ((hflag & BM_ELEM_SELECT) ? SELECT : 0) | - ((hflag & BM_ELEM_SEAM) ? ME_SEAM : 0) | - ((hflag & BM_ELEM_SMOOTH) == 0 ? ME_SHARP : 0) | - ((hflag & BM_ELEM_HIDDEN) ? ME_HIDE : 0) | - ((BM_edge_is_wire(eed)) ? ME_LOOSEEDGE : 0) | /* not typical */ - (ME_EDGEDRAW | ME_EDGERENDER) + return ( ((hflag & BM_ELEM_SELECT) ? SELECT : 0) | + ((hflag & BM_ELEM_SEAM) ? ME_SEAM : 0) | + ((hflag & BM_ELEM_DRAW) ? ME_EDGEDRAW : 0) | + ((hflag & BM_ELEM_SMOOTH) == 0 ? ME_SHARP : 0) | + ((hflag & BM_ELEM_HIDDEN) ? ME_HIDE : 0) | + ((BM_edge_is_wire(eed)) ? ME_LOOSEEDGE : 0) | /* not typical */ + ME_EDGERENDER ); } char BM_face_flag_to_mflag(BMFace *efa) diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c index 351fb8e941b..a8c27e0a761 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_conv.c +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c @@ -495,6 +495,9 @@ BLI_INLINE void bmesh_quick_edgedraw_flag(MEdge *med, BMEdge *e) { med->flag &= ~ME_EDGEDRAW; } + else { + med->flag |= ME_EDGEDRAW; + } } void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess) From d435be750a06ca672d82192d88bb00f01b068c92 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 22 May 2012 07:46:14 +0000 Subject: [PATCH 090/159] Fix #31522: wrong ID user count on custom bone shape object after duplicate --- source/blender/blenkernel/intern/object.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 658a050d4d1..6f6881ce317 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1036,6 +1036,10 @@ static void copy_object_pose(Object *obn, Object *ob) chan->flag &= ~(POSE_LOC | POSE_ROT | POSE_SIZE); + if (chan->custom) { + id_us_plus(&chan->custom->id); + } + for (con = chan->constraints.first; con; con = con->next) { bConstraintTypeInfo *cti = constraint_get_typeinfo(con); ListBase targets = {NULL, NULL}; From 00e7a4b5a70c64c6f1961b860c50d93daee4cbf7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 08:24:52 +0000 Subject: [PATCH 091/159] fix [#31530] Project paint with Clipping border gives opaque background draw clipping box alpha 0 so reprojection and rendering show the background as alpha 0. --- source/blender/editors/include/UI_resources.h | 5 ++-- source/blender/editors/interface/resources.c | 23 +++++++++++++++++-- .../editors/space_view3d/view3d_draw.c | 6 ++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index d157db9e993..35376412628 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -232,9 +232,10 @@ float UI_GetThemeValuef(int colorid); int UI_GetThemeValue(int colorid); // get three color values, scaled to 0.0-1.0 range -void UI_GetThemeColor3fv(int colorid, float *col); +void UI_GetThemeColor3fv(int colorid, float col[3]); // get the color, range 0.0-1.0, complete with shading offset -void UI_GetThemeColorShade3fv(int colorid, int offset, float *col); +void UI_GetThemeColorShade3fv(int colorid, int offset, float col[3]); +void UI_GetThemeColorShade3ubv(int colorid, int offset, unsigned char col[3]); // get the 3 or 4 byte values void UI_GetThemeColor3ubv(int colorid, unsigned char col[3]); diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index bf57dda44bf..9d66c9ea2e1 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1028,7 +1028,7 @@ int UI_GetThemeValue(int colorid) // get the color, range 0.0-1.0 -void UI_GetThemeColor3fv(int colorid, float *col) +void UI_GetThemeColor3fv(int colorid, float col[3]) { const unsigned char *cp; @@ -1039,7 +1039,7 @@ void UI_GetThemeColor3fv(int colorid, float *col) } // get the color, range 0.0-1.0, complete with shading offset -void UI_GetThemeColorShade3fv(int colorid, int offset, float *col) +void UI_GetThemeColorShade3fv(int colorid, int offset, float col[3]) { int r, g, b; const unsigned char *cp; @@ -1058,6 +1058,25 @@ void UI_GetThemeColorShade3fv(int colorid, int offset, float *col) col[2] = ((float)b) / 255.0f; } +void UI_GetThemeColorShade3ubv(int colorid, int offset, unsigned char col[3]) +{ + int r, g, b; + const unsigned char *cp; + + cp = UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid); + + r = offset + (int) cp[0]; + CLAMP(r, 0, 255); + g = offset + (int) cp[1]; + CLAMP(g, 0, 255); + b = offset + (int) cp[2]; + CLAMP(b, 0, 255); + + col[0] = r; + col[1] = g; + col[2] = b; +} + // get the color, in char pointer void UI_GetThemeColor3ubv(int colorid, unsigned char col[3]) { diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 33141bb6abb..0c6e13051bb 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -160,7 +160,11 @@ static void view3d_draw_clipping(RegionView3D *rv3d) {1, 5, 6, 2}, {7, 4, 0, 3}}; - UI_ThemeColorShade(TH_BACK, -8); + /* fill in zero alpha for rendering & re-projection [#31530] */ + unsigned char col[4]; + UI_GetThemeColorShade3ubv(TH_BACK, -8, col); + col[3] = 0; + glColor4ubv(col); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, bb->vec); From 7767239ac7b3d6ac84e6528200cf7fffd682194c Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 22 May 2012 08:36:06 +0000 Subject: [PATCH 092/159] I18n fixes, mainly for (cycles) nodes (i.e. node template in Buttons window). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: the problem of sockets translation remains (for all node types), currently they are unavailable from RNA, hence not detected by i18n tools, so only solution is to add N_() in all node sockets templates… yuck! Really have to fix this. --- .../editors/interface/interface_templates.c | 8 ++-- .../editors/space_node/node_templates.c | 38 +++++++++---------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 1c0a98eda6e..6b0ffb1b54e 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2154,11 +2154,11 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe manode = give_node_material(ma); if (manode) { char str[MAX_ID_NAME + 12]; - BLI_snprintf(str, sizeof(str), "Node %s", manode->id.name + 2); + BLI_snprintf(str, sizeof(str), IFACE_("Node %s"), manode->id.name + 2); uiItemL(sub, str, ui_id_icon_get(C, &manode->id, 1)); } else if (ma->use_nodes) { - uiItemL(sub, "Node ", ICON_NONE); + uiItemL(sub, IFACE_("Node "), ICON_NONE); } } } @@ -2192,7 +2192,9 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "lock_weight", 0, 0, 0, 0, 0, NULL); #else uiBlockSetEmboss(block, UI_EMBOSSN); - uiDefIconButBitC(block, TOG, DG_LOCK_WEIGHT, 0, (dg->flag & DG_LOCK_WEIGHT) ? ICON_LOCKED : ICON_UNLOCKED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &dg->flag, 0, 0, 0, 0, "Maintain relative weights while painting"); + uiDefIconButBitC(block, TOG, DG_LOCK_WEIGHT, 0, (dg->flag & DG_LOCK_WEIGHT) ? ICON_LOCKED : ICON_UNLOCKED, + 0, 0, UI_UNIT_X, UI_UNIT_Y, &dg->flag, 0, 0, 0, 0, + TIP_("Maintain relative weights while painting")); uiBlockSetEmboss(block, UI_EMBOSS); #endif } diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c index 785eafeb7c9..bd79b9dde00 100644 --- a/source/blender/editors/space_node/node_templates.c +++ b/source/blender/editors/space_node/node_templates.c @@ -291,7 +291,7 @@ static void ui_node_sock_name(bNodeSocket *sock, char name[UI_MAX_NAME_STR]) if (node->id) BLI_strncpy(node_name, node->id->name+2, UI_MAX_NAME_STR); else - BLI_strncpy(node_name, "Group", UI_MAX_NAME_STR); + BLI_strncpy(node_name, N_("Group"), UI_MAX_NAME_STR); } else BLI_strncpy(node_name, node->typeinfo->name, UI_MAX_NAME_STR); @@ -300,16 +300,16 @@ static void ui_node_sock_name(bNodeSocket *sock, char name[UI_MAX_NAME_STR]) node->outputs.first != node->outputs.last && !(node->typeinfo->flag & NODE_OPTIONS)) { - BLI_snprintf(name, UI_MAX_NAME_STR, "%s | %s", node_name, sock->link->fromsock->name); + BLI_snprintf(name, UI_MAX_NAME_STR, "%s | %s", IFACE_(node_name), IFACE_(sock->link->fromsock->name)); } else { - BLI_strncpy(name, node_name, UI_MAX_NAME_STR); + BLI_strncpy(name, IFACE_(node_name), UI_MAX_NAME_STR); } } else if (sock->type == SOCK_SHADER) - BLI_strncpy(name, "None", UI_MAX_NAME_STR); + BLI_strncpy(name, IFACE_("None"), UI_MAX_NAME_STR); else - BLI_strncpy(name, "Default", UI_MAX_NAME_STR); + BLI_strncpy(name, IFACE_("Default"), UI_MAX_NAME_STR); } static int ui_compatible_sockets(int typeA, int typeB) @@ -360,7 +360,7 @@ static void ui_node_menu_column(NodeLinkArg *arg, int nclass, const char *cname) column= uiLayoutColumn(layout, 0); uiBlockSetCurLayout(block, column); - uiItemL(column, cname, ICON_NODE); + uiItemL(column, IFACE_(cname), ICON_NODE); but= block->buttons.last; but->flag= UI_TEXT_LEFT; @@ -381,7 +381,7 @@ static void ui_node_menu_column(NodeLinkArg *arg, int nclass, const char *cname) BLI_strncpy(name, ngroup->id.name+2, UI_MAX_NAME_STR); but = uiDefBut(block, BUT, 0, ngroup->id.name+2, 0, 0, UI_UNIT_X*4, UI_UNIT_Y, - NULL, 0.0, 0.0, 0.0, 0.0, "Add node to input"); + NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Add node to input")); argN = MEM_dupallocN(arg); argN->type = NODE_GROUP; @@ -417,7 +417,7 @@ static void ui_node_menu_column(NodeLinkArg *arg, int nclass, const char *cname) column= uiLayoutColumn(layout, 0); uiBlockSetCurLayout(block, column); - uiItemL(column, cname, ICON_NODE); + uiItemL(column, IFACE_(cname), ICON_NODE); but= block->buttons.last; but->flag= UI_TEXT_LEFT; @@ -426,19 +426,19 @@ static void ui_node_menu_column(NodeLinkArg *arg, int nclass, const char *cname) if (num > 1) { if (j == 0) { - uiItemL(column, ntype->name, ICON_NODE); + uiItemL(column, IFACE_(ntype->name), ICON_NODE); but= block->buttons.last; but->flag= UI_TEXT_LEFT; } - BLI_snprintf(name, UI_MAX_NAME_STR, " %s", stemp->name); + BLI_snprintf(name, UI_MAX_NAME_STR, " %s", IFACE_(stemp->name)); j++; } else - BLI_strncpy(name, ntype->name, UI_MAX_NAME_STR); + BLI_strncpy(name, IFACE_(ntype->name), UI_MAX_NAME_STR); but = uiDefBut(block, BUT, 0, name, 0, 0, UI_UNIT_X*4, UI_UNIT_Y, - NULL, 0.0, 0.0, 0.0, 0.0, "Add node to input"); + NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Add node to input")); argN = MEM_dupallocN(arg); argN->type = ntype->type; @@ -486,16 +486,16 @@ static void ui_template_node_link_menu(bContext *C, uiLayout *layout, void *but_ but= block->buttons.last; but->flag= UI_TEXT_LEFT; - but = uiDefBut(block, BUT, 0, "Remove", 0, 0, UI_UNIT_X*4, UI_UNIT_Y, - NULL, 0.0, 0.0, 0.0, 0.0, "Remove nodes connected to the input"); + but = uiDefBut(block, BUT, 0, IFACE_("Remove"), 0, 0, UI_UNIT_X*4, UI_UNIT_Y, + NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Remove nodes connected to the input")); uiButSetNFunc(but, ui_node_link, MEM_dupallocN(arg), SET_INT_IN_POINTER(UI_NODE_LINK_REMOVE)); - but = uiDefBut(block, BUT, 0, "Disconnect", 0, 0, UI_UNIT_X*4, UI_UNIT_Y, - NULL, 0.0, 0.0, 0.0, 0.0, "Disconnect nodes connected to the input"); + but = uiDefBut(block, BUT, 0, IFACE_("Disconnect"), 0, 0, UI_UNIT_X*4, UI_UNIT_Y, + NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Disconnect nodes connected to the input")); uiButSetNFunc(but, ui_node_link, MEM_dupallocN(arg), SET_INT_IN_POINTER(UI_NODE_LINK_DISCONNECT)); } - ui_node_menu_column(arg, NODE_CLASS_GROUP, IFACE_("Group")); + ui_node_menu_column(arg, NODE_CLASS_GROUP, N_("Group")); } void uiTemplateNodeLink(uiLayout *layout, bNodeTree *ntree, bNode *node, bNodeSocket *sock) @@ -586,7 +586,7 @@ static void ui_node_draw_input(uiLayout *layout, bContext *C, bNodeTree *ntree, /* indented label */ memset(label, ' ', indent); label[indent] = '\0'; - BLI_snprintf(label, UI_MAX_NAME_STR, "%s%s:", label, input->name); + BLI_snprintf(label, UI_MAX_NAME_STR, "%s%s:", label, IFACE_(input->name)); /* split in label and value */ split = uiLayoutSplit(layout, 0.35f, 0); @@ -615,7 +615,7 @@ static void ui_node_draw_input(uiLayout *layout, bContext *C, bNodeTree *ntree, if (dependency_loop) { row = uiLayoutRow(split, 0); - uiItemL(row, "Dependency Loop", ICON_ERROR); + uiItemL(row, IFACE_("Dependency Loop"), ICON_ERROR); } else if (lnode) { /* input linked to a node */ From 40b7b9655afca32bf3fdae9bd6f58e7b377ddade Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 09:00:34 +0000 Subject: [PATCH 093/159] fix for regression in curve modifier (own fault) --- source/blender/blenkernel/intern/lattice.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 025ea40e82b..15db290ff14 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -662,7 +662,8 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL); } else { - use_vgroups = FALSE; + Mesh *me = target->data; + use_vgroups = (me->dvert != NULL); } } else { @@ -807,7 +808,8 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL); } else { - use_vgroups = FALSE; + Mesh *me = target->data; + use_vgroups = (me->dvert != NULL); } } else { From 1ae392913833edd2b11cef5b682f04ac8e70c4c4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 22 May 2012 09:15:01 +0000 Subject: [PATCH 094/159] Fix for movie distoriton node in tiles Now it works in the same way as non-tiles node in cases when image's resolution is not equal to resolution used for calibration. Also add some additional checks for distortion cache, so now it should be updating properly when camera intrinsics are changing. Potentially added support of overscan, but currently all needed computation is commented out. --- .../nodes/COM_MovieDistortionNode.cpp | 1 + .../COM_MovieDistortionOperation.cpp | 17 +++++-- .../operations/COM_MovieDistortionOperation.h | 44 +++++++++++++++---- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp index 82949fe10f9..55e51baf7da 100644 --- a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp +++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp @@ -39,6 +39,7 @@ void MovieDistortionNode::convertToOperations(ExecutionSystem *system, Composito MovieDistortionOperation * operation = new MovieDistortionOperation(bnode->custom1 == 1); operation->setMovieClip(clip); + operation->setFramenumber(context->getFramenumber()); inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, system); outputSocket->relinkConnections(operation->getOutputSocket(0)); diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp index 1699707ab3a..ebea9e8b4a2 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.cpp @@ -24,8 +24,8 @@ extern "C" { #include "BKE_tracking.h" - -#include "BLI_linklist.h" + #include "BKE_movieclip.h" + #include "BLI_linklist.h" } @@ -46,14 +46,23 @@ void MovieDistortionOperation::initExecution() { this->inputOperation = this->getInputSocketReader(0); if (this->movieClip) { + MovieClipUser clipUser = {0}; + int calibration_width, calibration_height; + + BKE_movieclip_user_set_frame(&clipUser, this->framenumber); + BKE_movieclip_get_size(this->movieClip, &clipUser, &calibration_width, &calibration_height); + for (int i = 0 ; i < s_cache.size() ; i ++) { DistortionCache *c = (DistortionCache*)s_cache[i]; - if (c->isCacheFor(this->movieClip, this->width, this->height, this->distortion)) { + if (c->isCacheFor(this->movieClip, this->width, this->height, + calibration_width, calibration_height, this->distortion)) + { this->cache = c; return; } } - DistortionCache *newC = new DistortionCache(this->movieClip, this->width, this->height, this->distortion); + DistortionCache *newC = new DistortionCache(this->movieClip, this->width, this->height, + calibration_width, calibration_height, this->distortion); s_cache.push_back(newC); this->cache = newC; } diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.h b/source/blender/compositor/operations/COM_MovieDistortionOperation.h index fcdf7090566..f583493340b 100644 --- a/source/blender/compositor/operations/COM_MovieDistortionOperation.h +++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.h @@ -34,18 +34,28 @@ private: float k1; float k2; float k3; + float principal_x; + float principal_y; + float pixel_aspect; int width; int height; + int calibration_width; + int calibration_height; bool inverted; float *buffer; int *bufferCalculated; public: - DistortionCache(MovieClip *movieclip, int width, int height, bool inverted) { + DistortionCache(MovieClip *movieclip, int width, int height, int calibration_width, int calibration_height, bool inverted) { this->k1 = movieclip->tracking.camera.k1; this->k2 = movieclip->tracking.camera.k2; this->k3 = movieclip->tracking.camera.k3; + this->principal_x = movieclip->tracking.camera.principal[0]; + this->principal_y = movieclip->tracking.camera.principal[1]; + this->pixel_aspect = movieclip->tracking.camera.pixel_aspect; this->width = width; this->height = height; + this->calibration_width = calibration_width; + this->calibration_height = calibration_height; this->inverted = inverted; this->bufferCalculated = new int[this->width*this->height]; this->buffer = new float[this->width*this->height*2]; @@ -53,13 +63,18 @@ public: this->bufferCalculated[i] = 0; } } - bool isCacheFor(MovieClip *movieclip, int width, int height, bool inverted) { + bool isCacheFor(MovieClip *movieclip, int width, int height, int calibration_width, int claibration_height, bool inverted) { return this->k1 == movieclip->tracking.camera.k1 && this->k2 == movieclip->tracking.camera.k2 && this->k3 == movieclip->tracking.camera.k3 && + this->principal_x == movieclip->tracking.camera.principal[0] && + this->principal_y == movieclip->tracking.camera.principal[1] && + this->pixel_aspect == movieclip->tracking.camera.pixel_aspect && this->inverted == inverted && - this->width == width && - this->height == height; + this->width == width && + this->height == height && + this->calibration_width == calibration_width && + this->calibration_height == calibration_height; } void getUV(MovieTracking *trackingData, int x, int y, float *u, float*v) { @@ -67,20 +82,30 @@ public: *u = x; *v = y; } else { + int offset = y * this->width + x; int offset2 = offset*2; if (!bufferCalculated[offset]) { + //float overscan = 0.0f; + float w = (float)this->width/* / (1 + overscan) */; + float h = (float)this->height/* / (1 + overscan) */; + float aspx = (float)w / this->calibration_width; + float aspy = (float)h / this->calibration_height; float in[2]; float out[2]; - in[0] = x; - in[1] = y; + + in[0] = (x /* - 0.5 * overscan * w */) / aspx; + in[1] = (y /* - 0.5 * overscan * h */) / aspy / this->pixel_aspect; + if (inverted) { BKE_tracking_invert_intrinsics(trackingData, in, out); } else { BKE_tracking_apply_intrinsics(trackingData, in, out); } - buffer[offset2] = out[0]; - buffer[offset2+1] = out[1]; + + buffer[offset2] = out[0] * aspx /* + 0.5 * overscan * w */; + buffer[offset2+1] = (out[1] * aspy /* + 0.5 * overscan * h */) * this->pixel_aspect; + bufferCalculated[offset] = 1; } *u = buffer[offset2]; @@ -97,6 +122,7 @@ private: protected: bool distortion; + int framenumber; public: MovieDistortionOperation(bool distortion); @@ -107,7 +133,7 @@ public: void deinitExecution(); void setMovieClip(MovieClip *clip) {this->movieClip = clip;} - + void setFramenumber(int framenumber) {this->framenumber = framenumber;} }; #endif From d3067dfaa226a9a4e59508878356f2fdf9b60d04 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 22 May 2012 09:15:05 +0000 Subject: [PATCH 095/159] Fix imbuf users leak in MovieClip tiles node Leak was caused by not calling IMB_freeImBuf for result of BKE_movieclip_get_ibuf --- .../blender/compositor/nodes/COM_MovieClipNode.cpp | 5 +++++ .../compositor/operations/COM_MovieClipOperation.cpp | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.cpp b/source/blender/compositor/nodes/COM_MovieClipNode.cpp index 0bddd328007..75831130936 100644 --- a/source/blender/compositor/nodes/COM_MovieClipNode.cpp +++ b/source/blender/compositor/nodes/COM_MovieClipNode.cpp @@ -30,6 +30,7 @@ extern "C" { #include "DNA_movieclip_types.h" #include "BKE_movieclip.h" #include "BKE_tracking.h" + #include "IMB_imbuf.h" } MovieClipNode::MovieClipNode(bNode *editorNode): Node(editorNode) @@ -118,4 +119,8 @@ void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContex angleMovieClip->relinkConnections(operationSetValue->getOutputSocket()); graph->addOperation(operationSetValue); } + + if (ibuf) { + IMB_freeImBuf(ibuf); + } } diff --git a/source/blender/compositor/operations/COM_MovieClipOperation.cpp b/source/blender/compositor/operations/COM_MovieClipOperation.cpp index d1dab13a952..b565e48345c 100644 --- a/source/blender/compositor/operations/COM_MovieClipOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieClipOperation.cpp @@ -61,21 +61,27 @@ void MovieClipOperation::initExecution() void MovieClipOperation::deinitExecution() { - this->movieClipBuffer = NULL; + if (this->movieClipBuffer) { + IMB_freeImBuf(this->movieClipBuffer); + + this->movieClipBuffer = NULL; + } } void MovieClipOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { ImBuf *ibuf; - resolution[0] = 0; - resolution[1] = 0; + resolution[0] = 0; + resolution[1] = 0; if (this->movieClip) { ibuf = BKE_movieclip_get_ibuf(this->movieClip, this->movieClipUser); if (ibuf) { resolution[0] = ibuf->x; resolution[1] = ibuf->y; + + IMB_freeImBuf(ibuf); } } } From e7647e15859f524c1989847656e4ea228507d71b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 09:53:33 +0000 Subject: [PATCH 096/159] solidify modifier - remove a loop on all edges. --- .../blender/modifiers/intern/MOD_solidify.c | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 0ca4d8dcd4f..799c81b3da6 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -240,8 +240,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, float (*face_nors_result)[3] = NULL; - const float ofs_orig = -(((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset); - const float ofs_new = smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset); + const float ofs_orig = -(((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset); + const float ofs_new = smd->offset - ofs_orig; const float offset_fac_vg = smd->offset_fac_vg; const float offset_fac_vg_inv = 1.0f - smd->offset_fac_vg; @@ -266,22 +266,31 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, unsigned int v1, v2; int eidx; +#define INVALID_UNUSED -1 +#define INVALID_PAIR -2 + + edge_users = MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges"); + edge_order = MEM_mallocN(sizeof(char) * numEdges, "solid_mod eorder"); + for (i = 0, mv = orig_mvert; i < numVerts; i++, mv++) { mv->flag &= ~ME_VERT_TMP_TAG; } + /* save doing 2 loops here... */ +#if 0 + fill_vn_i(edge_users, numEdges, INVALID_UNUSED); +#endif + for (i = 0, ed = orig_medge; i < numEdges; i++, ed++) { BLI_edgehash_insert(edgehash, ed->v1, ed->v2, SET_INT_IN_POINTER(i)); + edge_users[i] = INVALID_UNUSED; } -#define INVALID_UNUSED -1 -#define INVALID_PAIR -2 - #define ADD_EDGE_USER(_v1, _v2, edge_ord) \ { \ const unsigned int ml_v1 = _v1; \ const unsigned int ml_v2 = _v2; \ - eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2)); \ + eidx = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2)); \ if (edge_users[eidx] == INVALID_UNUSED) { \ ed= orig_medge + eidx; \ edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces); \ @@ -290,13 +299,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, else { \ edge_users[eidx] = INVALID_PAIR; \ } \ - } + } (void)0 - - edge_users = MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges"); - edge_order = MEM_mallocN(sizeof(char) * numEdges, "solid_mod eorder"); - fill_vn_i(edge_users, numEdges, INVALID_UNUSED); - for (i = 0, mp = orig_mpoly; i < numFaces; i++, mp++) { MLoop *ml; From dbd70c05f799afb4d8a3584eae58af384ee14353 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 22 May 2012 09:54:08 +0000 Subject: [PATCH 097/159] * Composite result is updated when editing (preview were already calculated, now the final result is also updated in the image space * default texture size when not connected to any resolution depended operation defaults to render size --- .../compositor/nodes/COM_TextureNode.cpp | 2 + .../operations/COM_CompositorOperation.cpp | 37 +++++++++++-------- .../operations/COM_CompositorOperation.h | 2 +- .../operations/COM_TextureOperation.cpp | 7 +++- .../operations/COM_TextureOperation.h | 2 + 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/source/blender/compositor/nodes/COM_TextureNode.cpp b/source/blender/compositor/nodes/COM_TextureNode.cpp index 0f9a2ca4c26..5e59d86e7d9 100644 --- a/source/blender/compositor/nodes/COM_TextureNode.cpp +++ b/source/blender/compositor/nodes/COM_TextureNode.cpp @@ -37,6 +37,7 @@ void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); operation->setTexture(texture); + operation->setScene(context->getScene()); system->addOperation(operation); addPreviewOperation(system, operation->getOutputSocket(), 9); @@ -46,6 +47,7 @@ void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext addLink(system, operation->getInputSocket(0)->getConnection()->getFromSocket(), alphaOperation->getInputSocket(0)); addLink(system, operation->getInputSocket(1)->getConnection()->getFromSocket(), alphaOperation->getInputSocket(1)); alphaOperation->setTexture(texture); + alphaOperation->setScene(context->getScene()); system->addOperation(alphaOperation); } } diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp index ce9484d0d9f..8b343374f1c 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cpp +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -31,7 +31,7 @@ extern "C" { #include "RE_shader_ext.h" #include "RE_render_ext.h" #include "MEM_guardedalloc.h" -#include "render_types.h" + #include "render_types.h" } #include "PIL_time.h" @@ -55,24 +55,31 @@ void CompositorOperation::initExecution() if (this->getWidth() * this->getHeight() != 0) { this->outputBuffer=(float*) MEM_callocN(this->getWidth()*this->getHeight()*4*sizeof(float), "CompositorOperation"); } - const Scene * scene = this->scene; - Render *re = RE_GetRender(scene->id.name); - RenderResult *rr = RE_AcquireResultWrite(re); - if (rr) { - if (rr->rectf != NULL) { - MEM_freeN(rr->rectf); - } - rr->rectf = outputBuffer; - } - if (re) { - RE_ReleaseResult(re); - re = NULL; - } - } void CompositorOperation::deinitExecution() { + if (tree->test_break && !tree->test_break(tree->tbh)) { + const Scene * scene = this->scene; + Render *re = RE_GetRender(scene->id.name); + RenderResult *rr = RE_AcquireResultWrite(re); + if (rr) { + if (rr->rectf != NULL) { + MEM_freeN(rr->rectf); + } + rr->rectf = outputBuffer; + } + if (re) { + RE_ReleaseResult(re); + re = NULL; + } + BKE_image_signal(BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), NULL, IMA_SIGNAL_FREE); + } else { + if (this->outputBuffer) { + MEM_freeN(this->outputBuffer); + } + } + this->outputBuffer = NULL; this->imageInput = NULL; this->alphaInput = NULL; diff --git a/source/blender/compositor/operations/COM_CompositorOperation.h b/source/blender/compositor/operations/COM_CompositorOperation.h index 39c81b8292a..41d43f896bb 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.h +++ b/source/blender/compositor/operations/COM_CompositorOperation.h @@ -60,7 +60,7 @@ public: void executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers); void setScene(const Scene *scene) {this->scene = scene;} void setbNodeTree(const bNodeTree *tree) {this->tree = tree;} - bool isOutputOperation(bool rendering) const {return rendering;} + bool isOutputOperation(bool rendering) const {return true;} void initExecution(); void deinitExecution(); const int getRenderPriority() const {return 7;} diff --git a/source/blender/compositor/operations/COM_TextureOperation.cpp b/source/blender/compositor/operations/COM_TextureOperation.cpp index f7edd922376..0d85f71c691 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.cpp +++ b/source/blender/compositor/operations/COM_TextureOperation.cpp @@ -32,6 +32,7 @@ TextureBaseOperation::TextureBaseOperation(): NodeOperation() this->texture = NULL; this->inputSize = NULL; this->inputOffset = NULL; + this->scene = NULL; } TextureOperation::TextureOperation() : TextureBaseOperation() { @@ -56,8 +57,10 @@ void TextureBaseOperation::deinitExecution() void TextureBaseOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) { if (preferredResolution[0] == 0 || preferredResolution[1] == 0) { - resolution[0] = COM_DEFAULT_RESOLUTION_WIDTH; - resolution[1] = COM_DEFAULT_RESOLUTION_HEIGHT; + int width = this->scene->r.xsch*this->scene->r.size/100; + int height = this->scene->r.ysch*this->scene->r.size/100; + resolution[0] = width; + resolution[1] = height; } else { resolution[0] = preferredResolution[0]; diff --git a/source/blender/compositor/operations/COM_TextureOperation.h b/source/blender/compositor/operations/COM_TextureOperation.h index ee067df2c64..de42b144730 100644 --- a/source/blender/compositor/operations/COM_TextureOperation.h +++ b/source/blender/compositor/operations/COM_TextureOperation.h @@ -43,6 +43,7 @@ extern "C" { class TextureBaseOperation : public NodeOperation { private: Tex *texture; + const Scene *scene; SocketReader *inputSize; SocketReader *inputOffset; @@ -64,6 +65,7 @@ public: void setTexture(Tex *texture) {this->texture = texture;} void initExecution(); void deinitExecution(); + void setScene(const Scene *scene) {this->scene = scene;} }; class TextureOperation:public TextureBaseOperation { From 8b2ffc1428bd8bd27568fa7e340841149addaaf5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 10:10:14 +0000 Subject: [PATCH 098/159] fix for error in last commit and minor speedup to looping over edges. --- .../blender/modifiers/intern/MOD_solidify.c | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 799c81b3da6..cd195e8e1aa 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -241,7 +241,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, float (*face_nors_result)[3] = NULL; const float ofs_orig = -(((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset); - const float ofs_new = smd->offset - ofs_orig; + const float ofs_new = smd->offset + ofs_orig; const float offset_fac_vg = smd->offset_fac_vg; const float offset_fac_vg_inv = 1.0f - smd->offset_fac_vg; @@ -286,27 +286,26 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, edge_users[i] = INVALID_UNUSED; } -#define ADD_EDGE_USER(_v1, _v2, edge_ord) \ - { \ - const unsigned int ml_v1 = _v1; \ - const unsigned int ml_v2 = _v2; \ - eidx = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2)); \ - if (edge_users[eidx] == INVALID_UNUSED) { \ - ed= orig_medge + eidx; \ - edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces); \ - edge_order[eidx] = edge_ord; \ - } \ - else { \ - edge_users[eidx] = INVALID_PAIR; \ - } \ - } (void)0 - for (i = 0, mp = orig_mpoly; i < numFaces; i++, mp++) { - MLoop *ml; - - for (ml = orig_mloop + mp->loopstart, j = 0; j < mp->totloop; ml++, j++) { - ADD_EDGE_USER(ml->v, ME_POLY_LOOP_NEXT(orig_mloop, mp, j)->v, j); - } + MLoop *ml = orig_mloop + mp->loopstart; + unsigned int ml_v1; + unsigned int ml_v2; + + for (j = 0, ml_v1 = ml->v, ml_v2 = ml[mp->totloop - 1].v; + j < mp->totloop; + j++, ml++, ml_v2 = ml_v1, ml_v1 = ml->v) + { + /* add edge user */ + eidx = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2)); + if (edge_users[eidx] == INVALID_UNUSED) { + ed = orig_medge + eidx; + edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces); + edge_order[eidx] = j; + } + else { + edge_users[eidx] = INVALID_PAIR; + } + } } #undef ADD_EDGE_USER From c63602286c82682f62a96908f065d9552b0947b7 Mon Sep 17 00:00:00 2001 From: Andrew Hale Date: Tue, 22 May 2012 12:03:56 +0000 Subject: [PATCH 099/159] Fix for customdata layer copying. Issue was caused by mixing up of destination and source in copy function. Also fixed an error in Py API, check to see if layers were different should be check to see if they're the same. --- source/blender/bmesh/intern/bmesh_interp.c | 16 +++---- source/blender/editors/mesh/mesh_data.c | 42 +++++++++---------- .../python/bmesh/bmesh_py_types_customdata.c | 7 +++- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index f64b55193c5..c39096d0800 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -852,24 +852,24 @@ void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int ds BMVert *eve; BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - void *ptr = CustomData_bmesh_get_n(data, eve->head.data, type, dst_n); - CustomData_bmesh_set_n(data, eve->head.data, type, src_n, ptr); + void *ptr = CustomData_bmesh_get_n(data, eve->head.data, type, src_n); + CustomData_bmesh_set_n(data, eve->head.data, type, dst_n, ptr); } } else if (&bm->edata == data) { BMEdge *eed; BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { - void *ptr = CustomData_bmesh_get_n(data, eed->head.data, type, dst_n); - CustomData_bmesh_set_n(data, eed->head.data, type, src_n, ptr); + void *ptr = CustomData_bmesh_get_n(data, eed->head.data, type, src_n); + CustomData_bmesh_set_n(data, eed->head.data, type, dst_n, ptr); } } else if (&bm->pdata == data) { BMFace *efa; BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - void *ptr = CustomData_bmesh_get_n(data, efa->head.data, type, dst_n); - CustomData_bmesh_set_n(data, efa->head.data, type, src_n, ptr); + void *ptr = CustomData_bmesh_get_n(data, efa->head.data, type, src_n); + CustomData_bmesh_set_n(data, efa->head.data, type, dst_n, ptr); } } else if (&bm->ldata == data) { @@ -879,8 +879,8 @@ void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int ds BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - void *ptr = CustomData_bmesh_get_n(data, l->head.data, type, dst_n); - CustomData_bmesh_set_n(data, l->head.data, type, src_n, ptr); + void *ptr = CustomData_bmesh_get_n(data, l->head.data, type, src_n); + CustomData_bmesh_set_n(data, l->head.data, type, dst_n, ptr); } } } diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index bc11a627be6..19ca30b9c45 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -309,44 +309,44 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set) { BMEditMesh *em; - int layernum; + int layernum_dst; short is_init = FALSE; if (me->edit_btmesh) { em = me->edit_btmesh; - layernum = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY); - if (layernum >= MAX_MTFACE) + layernum_dst = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY); + if (layernum_dst >= MAX_MTFACE) return -1; /* CD_MTEXPOLY */ BM_data_layer_add_named(em->bm, &em->bm->pdata, CD_MTEXPOLY, name); /* copy data from active UV */ - if (layernum) { - const int layernum_dst = CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY); - BM_data_layer_copy(em->bm, &em->bm->pdata, CD_MTEXPOLY, layernum, layernum_dst); + if (layernum_dst) { + const int layernum_src = CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY); + BM_data_layer_copy(em->bm, &em->bm->pdata, CD_MTEXPOLY, layernum_src, layernum_dst); } - if (active_set || layernum == 0) { - CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum); + if (active_set || layernum_dst == 0) { + CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum_dst); } /* CD_MLOOPUV */ BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV, name); /* copy data from active UV */ - if (layernum) { - const int layernum_dst = CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPUV); - BM_data_layer_copy(em->bm, &em->bm->ldata, CD_MLOOPUV, layernum, layernum_dst); + if (layernum_dst) { + const int layernum_src = CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPUV); + BM_data_layer_copy(em->bm, &em->bm->ldata, CD_MLOOPUV, layernum_src, layernum_dst); is_init = TRUE; } - if (active_set || layernum == 0) { - CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum); + if (active_set || layernum_dst == 0) { + CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum_dst); } } else { - layernum = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY); - if (layernum >= MAX_MTFACE) + layernum_dst = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY); + if (layernum_dst >= MAX_MTFACE) return -1; if (me->mtpoly) { @@ -361,11 +361,11 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name); } - if (active_set || layernum == 0) { - CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum); - CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum); + if (active_set || layernum_dst == 0) { + CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum_dst); + CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum_dst); - CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum); + CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum_dst); } mesh_update_customdata_pointers(me, TRUE); @@ -373,13 +373,13 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s /* don't overwrite our copied coords */ if (is_init == FALSE) { - ED_mesh_uv_loop_reset_ex(C, me, layernum); + ED_mesh_uv_loop_reset_ex(C, me, layernum_dst); } DAG_id_tag_update(&me->id, 0); WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); - return layernum; + return layernum_dst; } int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me) diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c index f25222c89da..d484ad5c87e 100644 --- a/source/blender/python/bmesh/bmesh_py_types_customdata.c +++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c @@ -271,13 +271,16 @@ static PyObject *bpy_bmlayeritem_copy_from(BPy_BMLayerItem *self, BPy_BMLayerIte } else if ((self->htype != value->htype) || - (self->type != value->type) || - (self->index != value->index)) + (self->type != value->type)) { PyErr_SetString(PyExc_ValueError, "layer.copy_from(other): layer type mismatch"); } + else if (self->index == value->index) { + Py_RETURN_NONE; + } + data = bpy_bm_customdata_get(self->bm, self->htype); if ((bpy_bmlayeritem_get(self) == NULL) || From 1937f3b8dec03af2390dc98ec6fcdc128bdd3732 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Tue, 22 May 2012 12:30:37 +0000 Subject: [PATCH 100/159] Disable building of CUDA 1.3 kernels for cycles for win32 cmake and mingw32 scons. They were already disabled for scons MSVC 32bit. --- CMakeLists.txt | 8 +++++++- build_files/scons/config/win32-mingw-config.py | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f86aa0d7f2..5632d211415 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,8 +238,14 @@ mark_as_advanced(WITH_MINGW64) option(WITH_CYCLES "Enable cycles Render Engine" ON) option(WITH_CYCLES_TEST "Build cycles test application" OFF) option(WITH_CYCLES_CUDA_BINARIES "Build cycles CUDA binaries" OFF) -set(CYCLES_CUDA_BINARIES_ARCH sm_13 sm_20 sm_21 CACHE STRING "CUDA architectures to build binaries for") +if(WIN32 AND NOT CMAKE_CL_64 AND NOT WITH_MINGW64) + set(PLATFORM_DEFAULT sm_20 sm_21) +else() + set(PLATFORM_DEFAULT sm_13 sm_20 sm_21) +endif() +set(CYCLES_CUDA_BINARIES_ARCH ${PLATFORM_DEFAULT} CACHE STRING "CUDA architectures to build binaries for") mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH) +unset(PLATFORM_DEFAULT) # disable for now, but plan to support on all platforms eventually option(WITH_MEM_JEMALLOC "Enable malloc replacement (http://www.canonware.com/jemalloc)" OFF) diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py index 57641555987..dc83411adac 100644 --- a/build_files/scons/config/win32-mingw-config.py +++ b/build_files/scons/config/win32-mingw-config.py @@ -169,6 +169,11 @@ BF_BOOST_LIBPATH = BF_BOOST + '/lib' WITH_BF_RAYOPTIMIZATION = True BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse'] +#CUDA +WITH_BF_CYCLES_CUDA_BINARIES = False +#BF_CYCLES_CUDA_NVCC = "" # Path to the nvidia compiler +BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_20', 'sm_21'] # don't build sm_13 until the compile can fit in 32bit process again :) + ## CC = 'gcc' CXX = 'g++' From eb023322ef5acffcfbe17b3779eb4d8266678fa7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 13:20:01 +0000 Subject: [PATCH 101/159] style cleanup: mmap_win32 --- intern/guardedalloc/intern/mmap_win.c | 100 +++++++++--------- .../blender/modifiers/intern/MOD_solidify.c | 1 - 2 files changed, 49 insertions(+), 52 deletions(-) diff --git a/intern/guardedalloc/intern/mmap_win.c b/intern/guardedalloc/intern/mmap_win.c index f2315f65924..a133f92fec4 100644 --- a/intern/guardedalloc/intern/mmap_win.c +++ b/intern/guardedalloc/intern/mmap_win.c @@ -29,8 +29,7 @@ * \ingroup MEM */ - -#if defined(WIN32) +#ifdef WIN32 #include #include @@ -53,21 +52,19 @@ #endif /* --------------------------------------------------------------------- */ -/* local storage definitions */ +/* local storage definitions */ /* --------------------------------------------------------------------- */ /* all memory mapped chunks are put in linked lists */ -typedef struct mmapLink -{ - struct mmapLink *next,*prev; +typedef struct mmapLink { + struct mmapLink *next, *prev; } mmapLink; -typedef struct mmapListBase -{ +typedef struct mmapListBase { void *first, *last; } mmapListBase; typedef struct MemMap { - struct MemMap *next,*prev; + struct MemMap *next, *prev; void *mmap; HANDLE fhandle; HANDLE maphandle; @@ -81,8 +78,8 @@ static void mmap_addtail(volatile mmapListBase *listbase, void *vlink); static void mmap_remlink(volatile mmapListBase *listbase, void *vlink); static void *mmap_findlink(volatile mmapListBase *listbase, void *ptr); -static int mmap_get_prot_flags (int flags); -static int mmap_get_access_flags (int flags); +static int mmap_get_prot_flags(int flags); +static int mmap_get_access_flags(int flags); /* --------------------------------------------------------------------- */ /* vars */ @@ -105,52 +102,53 @@ void *mmap(void *UNUSED(start), size_t len, int prot, int flags, int fd, off_t o MemMap *mm = NULL; void *ptr = NULL; - if ( flags & MAP_FIXED ) { + if (flags & MAP_FIXED) { return MAP_FAILED; } - /* +#if 0 if ( fd == -1 ) { _set_errno( EBADF ); return MAP_FAILED; } - */ +#endif - if ( fd != -1 ) { - fhandle = (HANDLE) _get_osfhandle (fd); + if (fd != -1) { + fhandle = (HANDLE) _get_osfhandle(fd); } - if ( fhandle == INVALID_HANDLE_VALUE ) { + if (fhandle == INVALID_HANDLE_VALUE) { if (!(flags & MAP_ANONYMOUS)) { errno = EBADF; return MAP_FAILED; } - } else { - if ( !DuplicateHandle( GetCurrentProcess(), fhandle, GetCurrentProcess(), - &fhandle, 0, FALSE, DUPLICATE_SAME_ACCESS ) ) { + } + else { + if (!DuplicateHandle(GetCurrentProcess(), fhandle, GetCurrentProcess(), + &fhandle, 0, FALSE, DUPLICATE_SAME_ACCESS) ) { return MAP_FAILED; } } maphandle = CreateFileMapping(fhandle, NULL, prot_flags, 0, len, NULL); - if ( maphandle == 0 ) { + if (maphandle == 0) { errno = EBADF; return MAP_FAILED; } ptr = MapViewOfFile(maphandle, access_flags, 0, offset, 0); - if ( ptr == NULL ) { + if (ptr == NULL) { DWORD dwLastErr = GetLastError(); - if ( dwLastErr == ERROR_MAPPED_ALIGNMENT ) - errno=EINVAL; + if (dwLastErr == ERROR_MAPPED_ALIGNMENT) + errno = EINVAL; else - errno=EACCES; + errno = EACCES; CloseHandle(maphandle); return MAP_FAILED; } - mm= (MemMap *)malloc(sizeof(MemMap)); + mm = (MemMap *)malloc(sizeof(MemMap)); if (!mm) { - errno=ENOMEM; + errno = ENOMEM; } mm->fhandle = fhandle; mm->maphandle = maphandle; @@ -165,12 +163,12 @@ intptr_t munmap(void *ptr, intptr_t UNUSED(size)) { MemMap *mm = mmap_findlink(mmapbase, ptr); if (!mm) { - errno=EINVAL; + errno = EINVAL; return -1; } - UnmapViewOfFile( mm->mmap ); - CloseHandle( mm->maphandle ); - CloseHandle( mm->fhandle); + UnmapViewOfFile(mm->mmap); + CloseHandle(mm->maphandle); + CloseHandle(mm->fhandle); mmap_remlink(mmapbase, mm); free(mm); return 0; @@ -182,7 +180,7 @@ intptr_t munmap(void *ptr, intptr_t UNUSED(size)) static void mmap_addtail(volatile mmapListBase *listbase, void *vlink) { - struct mmapLink *link= vlink; + struct mmapLink *link = vlink; if (link == 0) return; if (listbase == 0) return; @@ -197,7 +195,7 @@ static void mmap_addtail(volatile mmapListBase *listbase, void *vlink) static void mmap_remlink(volatile mmapListBase *listbase, void *vlink) { - struct mmapLink *link= vlink; + struct mmapLink *link = vlink; if (link == 0) return; if (listbase == 0) return; @@ -226,46 +224,46 @@ static void *mmap_findlink(volatile mmapListBase *listbase, void *ptr) return NULL; } -static int mmap_get_prot_flags (int flags) +static int mmap_get_prot_flags(int flags) { int prot = PAGE_NOACCESS; - if ( ( flags & PROT_READ ) == PROT_READ ) { - if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + if ( (flags & PROT_READ) == PROT_READ) { + if ( (flags & PROT_WRITE) == PROT_WRITE) { prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; - } else { + } + else { prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READ : PAGE_READONLY; } - } else if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + } + else if ( (flags & PROT_WRITE) == PROT_WRITE) { prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READ : PAGE_WRITECOPY; - } else if ( ( flags & PROT_EXEC ) == PROT_EXEC ) { + } + else if ( (flags & PROT_EXEC) == PROT_EXEC) { prot = PAGE_EXECUTE_READ; } return prot; } -static int mmap_get_access_flags (int flags) +static int mmap_get_access_flags(int flags) { int access = 0; - if ( ( flags & PROT_READ ) == PROT_READ ) { - if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + if ( (flags & PROT_READ) == PROT_READ) { + if ( (flags & PROT_WRITE) == PROT_WRITE) { access = FILE_MAP_WRITE; - } else { + } + else { access = (flags & PROT_EXEC) ? FILE_MAP_EXECUTE : FILE_MAP_READ; } - } else if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + } + else if ( (flags & PROT_WRITE) == PROT_WRITE) { access = FILE_MAP_COPY; - } else if ( ( flags & PROT_EXEC ) == PROT_EXEC ) { + } + else if ( (flags & PROT_EXEC) == PROT_EXEC) { access = FILE_MAP_EXECUTE; } return access; } - #endif // WIN32 - - - - - diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index cd195e8e1aa..39b88fccd22 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -308,7 +308,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, } } -#undef ADD_EDGE_USER #undef INVALID_UNUSED #undef INVALID_PAIR From 4a788a227702d373873c7d6769d6d46201df1b43 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 13:43:36 +0000 Subject: [PATCH 102/159] expose absolute shape keyblock interpolation in the ui --- .../startup/bl_ui/properties_data_mesh.py | 1 + source/blender/makesrna/RNA_enum_types.h | 2 ++ source/blender/makesrna/intern/rna_key.c | 18 +++++++++--------- source/blender/makesrna/intern/rna_lattice.c | 14 ++++---------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index fd96fa4a0ce..7ca464ce055 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -262,6 +262,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel): col.prop_search(kb, "relative_key", key, "key_blocks", text="") else: + layout.prop(kb, "interpolation") row = layout.column() row.active = enable_edit_value row.prop(key, "eval_time") diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 1b8772ffbcd..21eba3faf02 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -60,6 +60,8 @@ extern EnumPropertyItem beztriple_handle_type_items[]; extern EnumPropertyItem beztriple_interpolation_mode_items[]; extern EnumPropertyItem keyframe_handle_type_items[]; +extern EnumPropertyItem keyblock_type_items[]; + extern EnumPropertyItem keyingset_path_grouping_items[]; extern EnumPropertyItem keyframe_paste_offset_items[]; diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c index 5a56518e498..c2d730f5ed9 100644 --- a/source/blender/makesrna/intern/rna_key.c +++ b/source/blender/makesrna/intern/rna_key.c @@ -445,6 +445,13 @@ static char *rna_ShapeKeyPoint_path(PointerRNA *ptr) #else +EnumPropertyItem keyblock_type_items[] = { + {KEY_LINEAR, "KEY_LINEAR", 0, "Linear", ""}, + {KEY_CARDINAL, "KEY_CARDINAL", 0, "Cardinal", ""}, + {KEY_BSPLINE, "KEY_BSPLINE", 0, "BSpline", ""}, + {0, NULL, 0, NULL, NULL} +}; + static void rna_def_keydata(BlenderRNA *brna) { StructRNA *srna; @@ -515,13 +522,6 @@ static void rna_def_keyblock(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_keyblock_type_items[] = { - {KEY_LINEAR, "KEY_LINEAR", 0, "Linear", ""}, - {KEY_CARDINAL, "KEY_CARDINAL", 0, "Cardinal", ""}, - {KEY_BSPLINE, "KEY_BSPLINE", 0, "BSpline", ""}, - {0, NULL, 0, NULL, NULL} - }; - srna = RNA_def_struct(brna, "ShapeKey", NULL); RNA_def_struct_ui_text(srna, "Shape Key", "Shape key in a shape keys datablock"); RNA_def_struct_sdna(srna, "KeyBlock"); @@ -551,8 +551,8 @@ static void rna_def_keyblock(BlenderRNA *brna) prop = RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, prop_keyblock_type_items); - RNA_def_property_ui_text(prop, "Interpolation", "Interpolation type"); + RNA_def_property_enum_items(prop, keyblock_type_items); + RNA_def_property_ui_text(prop, "Interpolation", "Interpolation type for absolute shape keys"); RNA_def_property_update(prop, 0, "rna_Key_update_data"); prop = RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c index a50389f01c1..6e42b47afce 100644 --- a/source/blender/makesrna/intern/rna_lattice.c +++ b/source/blender/makesrna/intern/rna_lattice.c @@ -28,6 +28,7 @@ #include #include "RNA_define.h" +#include "RNA_enum_types.h" #include "rna_internal.h" @@ -248,13 +249,6 @@ static void rna_def_lattice(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_keyblock_type_items[] = { - {KEY_LINEAR, "KEY_LINEAR", 0, "Linear", ""}, - {KEY_CARDINAL, "KEY_CARDINAL", 0, "Cardinal", ""}, - {KEY_BSPLINE, "KEY_BSPLINE", 0, "BSpline", ""}, - {0, NULL, 0, NULL, NULL} - }; - srna = RNA_def_struct(brna, "Lattice", "ID"); RNA_def_struct_ui_text(srna, "Lattice", "Lattice datablock defining a grid for deforming other objects"); RNA_def_struct_ui_icon(srna, ICON_LATTICE_DATA); @@ -285,19 +279,19 @@ static void rna_def_lattice(BlenderRNA *brna) prop = RNA_def_property(srna, "interpolation_type_u", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "typeu"); - RNA_def_property_enum_items(prop, prop_keyblock_type_items); + RNA_def_property_enum_items(prop, keyblock_type_items); RNA_def_property_ui_text(prop, "Interpolation Type U", ""); RNA_def_property_update(prop, 0, "rna_Lattice_update_data"); prop = RNA_def_property(srna, "interpolation_type_v", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "typev"); - RNA_def_property_enum_items(prop, prop_keyblock_type_items); + RNA_def_property_enum_items(prop, keyblock_type_items); RNA_def_property_ui_text(prop, "Interpolation Type V", ""); RNA_def_property_update(prop, 0, "rna_Lattice_update_data"); prop = RNA_def_property(srna, "interpolation_type_w", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "typew"); - RNA_def_property_enum_items(prop, prop_keyblock_type_items); + RNA_def_property_enum_items(prop, keyblock_type_items); RNA_def_property_ui_text(prop, "Interpolation Type W", ""); RNA_def_property_update(prop, 0, "rna_Lattice_update_data"); From 85923aff288da072750447b44e492ebe5c59bcce Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 13:59:58 +0000 Subject: [PATCH 103/159] code cleanup: key/interpolation --- source/blender/blenkernel/BKE_key.h | 6 +++--- source/blender/blenkernel/intern/key.c | 21 ++++++++------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h index 4240ef16100..1ad451b0937 100644 --- a/source/blender/blenkernel/BKE_key.h +++ b/source/blender/blenkernel/BKE_key.h @@ -55,9 +55,9 @@ struct Key *copy_key_nolib(struct Key *key); void BKE_key_make_local(struct Key *key); void sort_keys(struct Key *key); -void key_curve_position_weights(float t, float *data, int type); -void key_curve_tangent_weights(float t, float *data, int type); -void key_curve_normal_weights(float t, float *data, int type); +void key_curve_position_weights(float t, float data[4], int type); +void key_curve_tangent_weights(float t, float data[4], int type); +void key_curve_normal_weights(float t, float data[4], int type); float *do_ob_key(struct Scene *scene, struct Object *ob); diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index e1bc1af2519..deb294a6738 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -271,7 +271,7 @@ void sort_keys(Key *key) /**************** do the key ****************/ -void key_curve_position_weights(float t, float *data, int type) +void key_curve_position_weights(float t, float data[4], int type) { float t2, t3, fc; @@ -303,7 +303,7 @@ void key_curve_position_weights(float t, float *data, int type) } /* first derivative */ -void key_curve_tangent_weights(float t, float *data, int type) +void key_curve_tangent_weights(float t, float data[4], int type) { float t2, fc; @@ -333,7 +333,7 @@ void key_curve_tangent_weights(float t, float *data, int type) } /* second derivative */ -void key_curve_normal_weights(float t, float *data, int type) +void key_curve_normal_weights(float t, float data[4], int type) { float fc; @@ -359,11 +359,11 @@ void key_curve_normal_weights(float t, float *data, int type) } } -static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl) +static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float t[4], int cycl) { /* return 1 means k[2] is the position, return 0 means interpolate */ KeyBlock *k1, *firstkey; - float d, dpos, ofs = 0, lastpos, temp, fval[4]; + float d, dpos, ofs = 0, lastpos; short bsplinetype; firstkey = lb->first; @@ -467,17 +467,12 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl) } /* interpolation */ - key_curve_position_weights(d, t, k[1]->type); if (k[1]->type != k[2]->type) { - key_curve_position_weights(d, fval, k[2]->type); - - temp = 1.0f - d; - t[0] = temp * t[0] + d * fval[0]; - t[1] = temp * t[1] + d * fval[1]; - t[2] = temp * t[2] + d * fval[2]; - t[3] = temp * t[3] + d * fval[3]; + float t_other[4]; + key_curve_position_weights(d, t_other, k[2]->type); + interp_v4_v4v4(t, t, t_other, d); } return 0; From 53b01d90023a850b17ded5deb9cace354c8e298a Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 22 May 2012 14:13:33 +0000 Subject: [PATCH 104/159] A number of new features for the node editor in general and the Frame node in particular. For an detailed user-level description of new features see the following blogpost: http://code.blender.org/index.php/2012/05/node-editing-tweaks/ TL;DR: * Frame node gets more usable bounding-box behavior * Node resizing has helpful mouse cursor indicators and works on all borders * Node selection/active colors are themeable independently * Customizable background colors for nodes (useful for frames visual distinction). --- .../scripts/startup/bl_operators/presets.py | 18 + release/scripts/startup/bl_ui/space_node.py | 18 + source/blender/blenkernel/BKE_blender.h | 2 +- source/blender/blenkernel/BKE_node.h | 9 +- source/blender/blenkernel/BKE_screen.h | 2 + source/blender/blenkernel/intern/node.c | 42 +- source/blender/blenloader/intern/readfile.c | 57 + .../blender/editors/datafiles/startup.blend.c | 22352 ++++++++-------- source/blender/editors/include/ED_node.h | 3 +- source/blender/editors/interface/resources.c | 2 +- source/blender/editors/screen/screen_edit.c | 28 +- source/blender/editors/space_node/drawnode.c | 204 +- .../blender/editors/space_node/node_buttons.c | 18 +- source/blender/editors/space_node/node_draw.c | 252 +- source/blender/editors/space_node/node_edit.c | 576 +- .../blender/editors/space_node/node_intern.h | 14 + source/blender/editors/space_node/node_ops.c | 83 +- .../blender/editors/space_node/node_select.c | 121 +- .../blender/editors/space_node/space_node.c | 13 + .../editors/transform/transform_conversions.c | 8 +- .../blender/editors/transform/transform_ops.c | 12 +- source/blender/makesdna/DNA_node_types.h | 16 +- source/blender/makesrna/intern/rna_nodetree.c | 28 +- source/blender/makesrna/intern/rna_userdef.c | 12 + source/blender/nodes/intern/node_common.c | 15 +- .../windowmanager/intern/wm_event_system.c | 2 +- 26 files changed, 12408 insertions(+), 11499 deletions(-) diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py index 05f7f3f0367..4171b8b3c2c 100644 --- a/release/scripts/startup/bl_operators/presets.py +++ b/release/scripts/startup/bl_operators/presets.py @@ -452,6 +452,24 @@ class AddPresetTrackingSettings(AddPresetBase, Operator): preset_subdir = "tracking_settings" +class AddPresetNodeColor(AddPresetBase, Operator): + '''Add a Node Color Preset''' + bl_idname = "node.node_color_preset_add" + bl_label = "Add Node Color Preset" + preset_menu = "NODE_MT_node_color_presets" + + preset_defines = [ + "node = bpy.context.active_node" + ] + + preset_values = [ + "node.color", + "node.use_custom_color" + ] + + preset_subdir = "node_color" + + class AddPresetInterfaceTheme(AddPresetBase, Operator): '''Add a theme preset''' bl_idname = "wm.interface_theme_preset_add" diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index 11c258ef689..fd47b3b809c 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -225,5 +225,23 @@ class NODE_PT_quality(bpy.types.Panel): layout.prop(tree, "chunksize") layout.prop(tree, "use_opencl") + +class NODE_MT_node_color_presets(Menu): + """Predefined node color""" + bl_label = "Color Presets" + preset_subdir = "node_color" + preset_operator = "script.execute_preset" + draw = Menu.draw_preset + + +class NODE_MT_node_color_specials(Menu): + bl_label = "Node Color Specials" + + def draw(self, context): + layout = self.layout + + layout.operator('node.node_copy_color', icon='COPY_ID') + + if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 7cc5d16dcc1..596c4a7d7b8 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -42,7 +42,7 @@ extern "C" { * and keep comment above the defines. * Use STRINGIFY() rather than defining with quotes */ #define BLENDER_VERSION 263 -#define BLENDER_SUBVERSION 5 +#define BLENDER_SUBVERSION 6 #define BLENDER_MINVERSION 250 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index cb899dcc902..2632a982a01 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -248,6 +248,12 @@ typedef struct bNodeType { #define NODE_OLD_SHADING 1 #define NODE_NEW_SHADING 2 +/* node resize directions */ +#define NODE_RESIZE_TOP 1 +#define NODE_RESIZE_BOTTOM 2 +#define NODE_RESIZE_RIGHT 4 +#define NODE_RESIZE_LEFT 8 + /* enum values for input/output */ #define SOCK_IN 1 #define SOCK_OUT 2 @@ -348,7 +354,8 @@ void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link); void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock); void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node); -void nodeSpaceCoords(struct bNode *node, float *locx, float *locy); +void nodeToView(struct bNode *node, float x, float y, float *rx, float *ry); +void nodeFromView(struct bNode *node, float x, float y, float *rx, float *ry); void nodeAttachNode(struct bNode *node, struct bNode *parent); void nodeDetachNode(struct bNode *node); diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 7223008afad..e99fc413ca1 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -153,6 +153,8 @@ typedef struct ARegionType { int keymapflag; /* return without drawing. lock is set by region definition, and copied to do_lock by render. can become flag */ short do_lock, lock; + /* call cursor function on each move event */ + short event_cursor; } ARegionType; /* panel types */ diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index fc62d69d002..445105d254a 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -336,6 +336,7 @@ bNode *nodeAddNode(bNodeTree *ntree, struct bNodeTemplate *ntemp) node->width= ntype->width; node->miniwidth= 42.0f; node->height= ntype->height; + node->color[0] = node->color[1] = node->color[2] = 0.608; /* default theme color */ node_add_sockets_from_type(ntree, node, ntype); @@ -591,40 +592,49 @@ void nodeInternalRelink(bNodeTree *ntree, bNode *node) BLI_freelistN(&intlinks); } -/* transforms node location to area coords */ -void nodeSpaceCoords(bNode *node, float *locx, float *locy) +void nodeToView(bNode *node, float x, float y, float *rx, float *ry) { if (node->parent) { - nodeSpaceCoords(node->parent, locx, locy); - *locx += node->locx; - *locy += node->locy; + nodeToView(node->parent, x + node->locx, y + node->locy, rx, ry); } else { - *locx = node->locx; - *locy = node->locy; + *rx = x + node->locx; + *ry = y + node->locy; + } +} + +void nodeFromView(bNode *node, float x, float y, float *rx, float *ry) +{ + if (node->parent) { + nodeFromView(node->parent, x, y, rx, ry); + *rx -= node->locx; + *ry -= node->locy; + } + else { + *rx = x - node->locx; + *ry = y - node->locy; } } void nodeAttachNode(bNode *node, bNode *parent) { - float parentx, parenty; + float locx, locy; + nodeToView(node, 0.0f, 0.0f, &locx, &locy); node->parent = parent; /* transform to parent space */ - nodeSpaceCoords(parent, &parentx, &parenty); - node->locx -= parentx; - node->locy -= parenty; + nodeFromView(parent, locx, locy, &node->locx, &node->locy); } void nodeDetachNode(struct bNode *node) { - float parentx, parenty; + float locx, locy; if (node->parent) { - /* transform to "global" (area) space */ - nodeSpaceCoords(node->parent, &parentx, &parenty); - node->locx += parentx; - node->locy += parenty; + /* transform to view space */ + nodeToView(node, 0.0f, 0.0f, &locx, &locy); + node->locx = locx; + node->locy = locy; node->parent = NULL; } } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c1942144ece..54b68e2828e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -6795,6 +6795,29 @@ static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree) } } +static void do_versions_nodetree_frame_2_64_6(bNodeTree *ntree) +{ + bNode *node; + + for (node=ntree->nodes.first; node; node=node->next) { + if (node->type==NODE_FRAME) { + /* initialize frame node storage data */ + if (node->storage == NULL) { + NodeFrame *data = (NodeFrame *)MEM_callocN(sizeof(NodeFrame), "frame node storage"); + node->storage = data; + + /* copy current flags */ + data->flag = node->custom1; + + data->label_size = 20; + } + } + + /* initialize custom node color */ + node->color[0] = node->color[1] = node->color[2] = 0.608; /* default theme color */ + } +} + static void do_versions(FileData *fd, Library *lib, Main *main) { /* WATCH IT!!!: pointers from libdata have not been converted */ @@ -7441,6 +7464,40 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } + + if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 6)) + { + /* update use flags for node sockets (was only temporary before) */ + Scene *sce; + Material *mat; + Tex *tex; + Lamp *lamp; + World *world; + bNodeTree *ntree; + + for (sce=main->scene.first; sce; sce=sce->id.next) + if (sce->nodetree) + do_versions_nodetree_frame_2_64_6(sce->nodetree); + + for (mat=main->mat.first; mat; mat=mat->id.next) + if (mat->nodetree) + do_versions_nodetree_frame_2_64_6(mat->nodetree); + + for (tex=main->tex.first; tex; tex=tex->id.next) + if (tex->nodetree) + do_versions_nodetree_frame_2_64_6(tex->nodetree); + + for (lamp=main->lamp.first; lamp; lamp=lamp->id.next) + if (lamp->nodetree) + do_versions_nodetree_frame_2_64_6(lamp->nodetree); + + for (world=main->world.first; world; world=world->id.next) + if (world->nodetree) + do_versions_nodetree_frame_2_64_6(world->nodetree); + + for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) + do_versions_nodetree_frame_2_64_6(ntree); + } /* 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! */ diff --git a/source/blender/editors/datafiles/startup.blend.c b/source/blender/editors/datafiles/startup.blend.c index cad150abc5e..2a1d3a602d8 100644 --- a/source/blender/editors/datafiles/startup.blend.c +++ b/source/blender/editors/datafiles/startup.blend.c @@ -1,14 +1,14 @@ /* DataToC output of file */ -int datatoc_startup_blend_size = 374884; +int datatoc_startup_blend_size = 375392; char datatoc_startup_blend[] = { - 66, 76, 69, 78, - 68, 69, 82, 45,118, 50, 54, 51, 82, 69, 78, 68, 72, 0, 0, 0, 16,174, 63,189,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 66, 76, 69, 78, 68, 69, 82, 45,118, 50, 54, 51, 82, 69, 78, 68, 72, 0, 0, 0, 0,201,255,255,255,127, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 48, 4, 0, 0, 96,170, 63,189,255,127, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, - 32, 32, 32, 53, 5, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 8,234, 27, 7, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, - 0, 16, 0, 0,128, 32, 4, 0,240,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 48, 4, 0, 0, 16,197,255,255,255,127, 0, 0,217, 0, 0, 0, + 1, 0, 0, 0, 32, 32, 32, 54, 6, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1,104, 63,166, 5, 0, 0, 0, 0,120,184,168, 5, + 0, 0, 0, 0, 0, 16, 0, 0,128, 32, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -40,471 +40,5001 @@ char datatoc_startup_blend[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 0, 0, 88, 1, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, -148, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 0, 0, 88, 1, 0, 0, 40, 39,147, 5, + 0, 0, 0, 0,154, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 24, 27, 7, 0, 0, 0, 0, 72, 24, 27, 7, 0, 0, 0, 0, 72, 24, 27, 7, 0, 0, 0, 0, 72, 24, 27, 7, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0,136,203, 87, 8, 0, 0, 0, 0,184,212, 84, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 99,154, 8, 0, 0, 0, 0,168, 35,250, 6, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40,193, 18, 7, 0, 0, 0, 0,216, 86, 19, 7, 0, 0, 0, 0, 40,193, 18, 7, 0, 0, 0, 0,232, 85, 19, 7, 0, 0, 0, 0, -216, 86, 19, 7, 0, 0, 0, 0,200, 87, 19, 7, 0, 0, 0, 0,200, 87, 19, 7, 0, 0, 0, 0,200, 87, 19, 7, 0, 0, 0, 0, - 68, 65, 84, 65, 0, 1, 0, 0, 72, 24, 27, 7, 0, 0, 0, 0,149, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,208,125, 19, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 34, 0, 78, 5,164, 2, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 0, 0, 1, 0, 0, 0, - 8,244,105, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, -104, 91,106, 7, 0, 0, 0, 0,152,172,157, 8, 0, 0, 0, 0,152,172,157, 8, 0, 0, 0, 0,200, 57,106, 7, 0, 0, 0, 0, - 88, 55,106, 7, 0, 0, 0, 0,248, 56,106, 7, 0, 0, 0, 0,248, 56,106, 7, 0, 0, 0, 0,200, 52,106, 7, 0, 0, 0, 0, -232,106,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,136,125, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 65,110,105,109, 97,116,105,111,110, 0, 46, 48, 48, 49, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,200,224, 26, 7, 0, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0,232, 33, 27, 7, 0, 0, 0, 0, - 40, 46, 27, 7, 0, 0, 0, 0,152, 46, 27, 7, 0, 0, 0, 0,184,115, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -200,224, 26, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,225, 26, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,225, 26, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,232, 26, 27, 7, 0, 0, 0, 0,200,224, 26, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,222, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232, 26, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 88, 27, 27, 7, 0, 0, 0, 0, 56,225, 26, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4,222, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 88, 27, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0, -232, 26, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -200, 27, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, 88, 27, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 24, 29, 27, 7, 0, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0, -168, 28, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -136, 29, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 60, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 60, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -216, 30, 27, 7, 0, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0, -104, 30, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 88, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 72, 31, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 88, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 1,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -152, 32, 27, 7, 0, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,152, 32, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0, - 40, 32, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 4, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 8, 33, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0,152, 32, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 60, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 60, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 33, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 88, 34, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,225, 26, 7, 0, 0, 0, 0,232, 26, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 34, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -200, 34, 27, 7, 0, 0, 0, 0,232, 33, 27, 7, 0, 0, 0, 0, 56,225, 26, 7, 0, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 34, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 56, 35, 27, 7, 0, 0, 0, 0, 88, 34, 27, 7, 0, 0, 0, 0,232, 26, 27, 7, 0, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 35, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -168, 35, 27, 7, 0, 0, 0, 0,200, 34, 27, 7, 0, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 35, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 24, 36, 27, 7, 0, 0, 0, 0, 56, 35, 27, 7, 0, 0, 0, 0,200,224, 26, 7, 0, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 36, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -136, 36, 27, 7, 0, 0, 0, 0,168, 35, 27, 7, 0, 0, 0, 0, 88, 27, 27, 7, 0, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 36, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -248, 36, 27, 7, 0, 0, 0, 0, 24, 36, 27, 7, 0, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 36, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -104, 37, 27, 7, 0, 0, 0, 0,136, 36, 27, 7, 0, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 37, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -216, 37, 27, 7, 0, 0, 0, 0,248, 36, 27, 7, 0, 0, 0, 0, 88, 27, 27, 7, 0, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 37, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 72, 38, 27, 7, 0, 0, 0, 0,104, 37, 27, 7, 0, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 38, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -184, 38, 27, 7, 0, 0, 0, 0,216, 37, 27, 7, 0, 0, 0, 0,200,224, 26, 7, 0, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 38, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 40, 39, 27, 7, 0, 0, 0, 0, 72, 38, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 39, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -152, 39, 27, 7, 0, 0, 0, 0,184, 38, 27, 7, 0, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 39, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 8, 40, 27, 7, 0, 0, 0, 0, 40, 39, 27, 7, 0, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 40, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -120, 40, 27, 7, 0, 0, 0, 0,152, 39, 27, 7, 0, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 40, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -232, 40, 27, 7, 0, 0, 0, 0, 8, 40, 27, 7, 0, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 40, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 88, 41, 27, 7, 0, 0, 0, 0,120, 40, 27, 7, 0, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 41, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -200, 41, 27, 7, 0, 0, 0, 0,232, 40, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 41, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 56, 42, 27, 7, 0, 0, 0, 0, 88, 41, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 42, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -168, 42, 27, 7, 0, 0, 0, 0,200, 41, 27, 7, 0, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 42, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 24, 43, 27, 7, 0, 0, 0, 0, 56, 42, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0,152, 32, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 43, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -136, 43, 27, 7, 0, 0, 0, 0,168, 42, 27, 7, 0, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0,152, 32, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 43, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -248, 43, 27, 7, 0, 0, 0, 0, 24, 43, 27, 7, 0, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 43, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -104, 44, 27, 7, 0, 0, 0, 0,136, 43, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 44, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -216, 44, 27, 7, 0, 0, 0, 0,248, 43, 27, 7, 0, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 44, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 72, 45, 27, 7, 0, 0, 0, 0,104, 44, 27, 7, 0, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 45, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, -184, 45, 27, 7, 0, 0, 0, 0,216, 44, 27, 7, 0, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 45, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 40, 46, 27, 7, 0, 0, 0, 0, 72, 45, 27, 7, 0, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 46, 27, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,184, 45, 27, 7, 0, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0,152, 32, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,152, 46, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -104, 50, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 27, 27, 7, 0, 0, 0, 0, 56,225, 26, 7, 0, 0, 0, 0, -232, 26, 27, 7, 0, 0, 0, 0, 56, 28, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, -196, 2, 0, 0,222, 2, 0, 0, 7, 7,241, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248,124, 27, 7, 0, 0, 0, 0,248,124, 27, 7, 0, 0, 0, 0,136, 47, 27, 7, 0, 0, 0, 0,248, 48, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,136, 47, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,248, 48, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,158, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,158, 68, 0, 0,200, 65, - 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,241, 4, - 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, -196, 2, 0, 0,221, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 4, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,248, 48, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136, 47, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, - 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, - 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 2, 0, 0,222, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,160, 0, 0, 0,104, 50, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,248, 74, 27, 7, 0, 0, 0, 0, -152, 46, 27, 7, 0, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, - 88, 27, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, - 4, 4,216, 0, 60, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 73, 27, 7, 0, 0, 0, 0, -184, 73, 27, 7, 0, 0, 0, 0, 88, 51, 27, 7, 0, 0, 0, 0,200, 52, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 88, 51, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200, 52, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 98, 39, 38, 54, 0, 0, 88, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 87, 67, 0, 0,200, 65, 0, 0, 87, 67, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,216, 0, 26, 0,216, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, 34, 1, 0, 0, 59, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, -200, 52, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 51, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 67, 0, 0, 61,196, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 71, 67, 1, 0,145,195, 0, 0, 0, 0, -199, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,216, 0, 34, 1,199, 0, 34, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 34, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 54, 27, 7, 0, 0, 0, 0, 24, 72, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, - 56, 54, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216, 55, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101, -120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101, -120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,199, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 55, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -120, 57, 27, 7, 0, 0, 0, 0, 56, 54, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,135,255,199, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -120, 57, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24, 59, 27, 7, 0, 0, 0, 0,216, 55, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 59, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -184, 60, 27, 7, 0, 0, 0, 0,120, 57, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140,254,199, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -184, 60, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88, 62, 27, 7, 0, 0, 0, 0, 24, 59, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108, -105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108, -105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,199, 0, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 62, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -248, 63, 27, 7, 0, 0, 0, 0,184, 60, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 34,254,199, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -248, 63, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152, 65, 27, 7, 0, 0, 0, 0, 88, 62, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 40,147, 5, 0, 0, 0, 0,200, 40,147, 5, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,216,151, 87, 4, 0, 0, 0, 0,184,153, 87, 4, 0, 0, 0, 0,216,151, 87, 4, 0, 0, 0, 0,200,152, 87, 4, + 0, 0, 0, 0,184,153, 87, 4, 0, 0, 0, 0,216,227,132, 5, 0, 0, 0, 0,216,227,132, 5, 0, 0, 0, 0,216,227,132, 5, + 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0,200, 40,147, 5, 0, 0, 0, 0,155, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,155, 87, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104, 63,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 32, 4, 0, 0, 0, 0, 0, 0,238, 3, 0, 0, 0, 0, + 0, 0, 0, 0,120,111,103, 4, 0, 0, 0, 0,104,117,132, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0,216, 88,117, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,125,123, 5, + 0, 0, 0, 0,200,123,123, 5, 0, 0, 0, 0,152,124,123, 5, 0, 0, 0, 0,152,124,123, 5, 0, 0, 0, 0,104,117,132, 5, + 0, 0, 0, 0, 40, 68,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, + 8, 1, 0, 0, 24, 42,147, 5, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 65,110,105,109, 97,116,105,111,110, 0, + 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,137, 95, 4, 0, 0, 0, 0,216, 43,147, 5, 0, 0, 0, 0, 72, 44,147, 5, + 0, 0, 0, 0,136, 56,147, 5, 0, 0, 0, 0,248, 56,147, 5, 0, 0, 0, 0,184,125,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,104,137, 95, 4, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 44,140, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104, 44,140, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24, 48,137, 5, 0, 0, 0, 0,104,137, 95, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,222, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 48,137, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,136,135,137, 5, 0, 0, 0, 0,104, 44,140, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4,222, 2, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,135,137, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168,152,137, 5, + 0, 0, 0, 0, 24, 48,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,168,152,137, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0,136,135,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 56,135, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0,168,152,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 40, 76,135, 5, 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40, 76,135, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184, 88,135, 5, + 0, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,184, 88,135, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,104,133, 5, 0, 0, 0, 0, 40, 76,135, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 60, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,104,133, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 72,225,140, 5, 0, 0, 0, 0,184, 88,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 60, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,225,140, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,152, 68,137, 5, 0, 0, 0, 0,248,104,133, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152, 68,137, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,164,137, 5, + 0, 0, 0, 0, 72,225,140, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 88, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,248,164,137, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,216,144,139, 5, 0, 0, 0, 0,152, 68,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 88, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216,144,139, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,152,213,132, 5, 0, 0, 0, 0,248,164,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,192, 1,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152,213,132, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,168,134,139, 5, 0, 0, 0, 0,216,144,139, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,134,139, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 43,147, 5, + 0, 0, 0, 0,152,213,132, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 4, 1, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,104, 43,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,216, 43,147, 5, 0, 0, 0, 0,168,134,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 60, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 43,147, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 43,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 60, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 44,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,184, 44,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 48,137, 5, 0, 0, 0, 0,104, 44,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 44,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 40, 45,147, 5, 0, 0, 0, 0, 72, 44,147, 5, 0, 0, 0, 0,168,152,137, 5, 0, 0, 0, 0,104, 44,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 45,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,152, 45,147, 5, 0, 0, 0, 0,184, 44,147, 5, 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0, 24, 48,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 45,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 8, 46,147, 5, 0, 0, 0, 0, 40, 45,147, 5, 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0,168,152,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 46,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,120, 46,147, 5, 0, 0, 0, 0,152, 45,147, 5, 0, 0, 0, 0,104,137, 95, 4, 0, 0, 0, 0, 8, 61,135, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 46,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,232, 46,147, 5, 0, 0, 0, 0, 8, 46,147, 5, 0, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0,136,135,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 46,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 88, 47,147, 5, 0, 0, 0, 0,120, 46,147, 5, 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0, 40, 76,135, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 47,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,200, 47,147, 5, 0, 0, 0, 0,232, 46,147, 5, 0, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0,184, 88,135, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 47,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 56, 48,147, 5, 0, 0, 0, 0, 88, 47,147, 5, 0, 0, 0, 0,248,104,133, 5, 0, 0, 0, 0,136,135,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 48,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,168, 48,147, 5, 0, 0, 0, 0,200, 47,147, 5, 0, 0, 0, 0,248,104,133, 5, 0, 0, 0, 0,184, 88,135, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 48,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 24, 49,147, 5, 0, 0, 0, 0, 56, 48,147, 5, 0, 0, 0, 0,104,137, 95, 4, 0, 0, 0, 0, 72,225,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 49,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,136, 49,147, 5, 0, 0, 0, 0,168, 48,147, 5, 0, 0, 0, 0, 40, 76,135, 5, 0, 0, 0, 0,152, 68,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 49,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,248, 49,147, 5, 0, 0, 0, 0, 24, 49,147, 5, 0, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0,152, 68,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 49,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,104, 50,147, 5, 0, 0, 0, 0,136, 49,147, 5, 0, 0, 0, 0,152, 68,137, 5, 0, 0, 0, 0, 72,225,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 50,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,216, 50,147, 5, 0, 0, 0, 0,248, 49,147, 5, 0, 0, 0, 0,248,164,137, 5, 0, 0, 0, 0, 72,225,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 50,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 72, 51,147, 5, 0, 0, 0, 0,104, 50,147, 5, 0, 0, 0, 0,152, 68,137, 5, 0, 0, 0, 0,248,164,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 51,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,184, 51,147, 5, 0, 0, 0, 0,216, 50,147, 5, 0, 0, 0, 0,168,152,137, 5, 0, 0, 0, 0,216,144,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 51,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 40, 52,147, 5, 0, 0, 0, 0, 72, 51,147, 5, 0, 0, 0, 0, 40, 76,135, 5, 0, 0, 0, 0,216,144,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 52,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,152, 52,147, 5, 0, 0, 0, 0,184, 51,147, 5, 0, 0, 0, 0,248,164,137, 5, 0, 0, 0, 0,216,144,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 52,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 8, 53,147, 5, 0, 0, 0, 0, 40, 52,147, 5, 0, 0, 0, 0,152,213,132, 5, 0, 0, 0, 0, 72,225,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 53,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,120, 53,147, 5, 0, 0, 0, 0,152, 52,147, 5, 0, 0, 0, 0,248,164,137, 5, 0, 0, 0, 0,168,134,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 53,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,232, 53,147, 5, 0, 0, 0, 0, 8, 53,147, 5, 0, 0, 0, 0,152,213,132, 5, 0, 0, 0, 0,168,134,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 53,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 88, 54,147, 5, 0, 0, 0, 0,120, 53,147, 5, 0, 0, 0, 0,184, 88,135, 5, 0, 0, 0, 0,104, 43,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 54,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,200, 54,147, 5, 0, 0, 0, 0,232, 53,147, 5, 0, 0, 0, 0, 40, 76,135, 5, 0, 0, 0, 0,104, 43,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 54,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 56, 55,147, 5, 0, 0, 0, 0, 88, 54,147, 5, 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0,216, 43,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 55,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,168, 55,147, 5, 0, 0, 0, 0,200, 54,147, 5, 0, 0, 0, 0,248,104,133, 5, 0, 0, 0, 0,216, 43,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 55,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 24, 56,147, 5, 0, 0, 0, 0, 56, 55,147, 5, 0, 0, 0, 0,104, 43,147, 5, 0, 0, 0, 0,216, 43,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 56,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0,136, 56,147, 5, 0, 0, 0, 0,168, 55,147, 5, 0, 0, 0, 0,152,213,132, 5, 0, 0, 0, 0,168,152,137, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 56,147, 5, 0, 0, 0, 0,213, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 56,147, 5, 0, 0, 0, 0,168,134,139, 5, 0, 0, 0, 0,216,144,139, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 56,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0,200, 60,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,152,137, 5, 0, 0, 0, 0,104, 44,140, 5, + 0, 0, 0, 0, 24, 48,137, 5, 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +240, 4, 0, 0,196, 2, 0, 0,222, 2, 0, 0, 7, 7,241, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 33,140, 5, 0, 0, 0, 0, 88, 33,140, 5, 0, 0, 0, 0,232, 57,147, 5, 0, 0, 0, 0, 88, 59,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 57,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 88, 59,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,158, 68, + 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +240, 4, 0, 0,196, 2, 0, 0,221, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 4, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 59,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232, 57,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, + 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,222, 2, 0, 0,222, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200, 60,147, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 88, 85,147, 5, + 0, 0, 0, 0,248, 56,147, 5, 0, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0,184, 88,135, 5, 0, 0, 0, 0,248,104,133, 5, + 0, 0, 0, 0,136,135,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, + 59, 1, 0, 0, 4, 4,216, 0, 60, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 84,147, 5, + 0, 0, 0, 0, 24, 84,147, 5, 0, 0, 0, 0,184, 61,147, 5, 0, 0, 0, 0, 40, 63,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,184, 61,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40, 63,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 98, 39, 38, 54, 0, 0, 88, 67, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 87, 67, 0, 0,200, 65, 0, 0, 87, 67, + 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,216, 0, 26, 0,216, 0, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, 34, 1, 0, 0, + 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0, 40, 63,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 61,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 67, 0, 0, 61,196, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 71, 67, 1, 0,145,195, + 0, 0, 0, 0,199, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,216, 0, 34, 1,199, 0, + 34, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, + 33, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 34, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 64,147, 5, 0, 0, 0, 0,120, 82,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,152, 64,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56, 66,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99, +111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99, +111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,199, 0, 36, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 66,147, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,216, 67,147, 5, 0, 0, 0, 0,152, 64,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,135,255,199, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,216, 67,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120, 69,147, 5, 0, 0, 0, 0, 56, 66,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97, +121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97, +121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,199, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 69,147, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 24, 71,147, 5, 0, 0, 0, 0,216, 67,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140,254,199, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0, 24, 71,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184, 72,147, 5, 0, 0, 0, 0,120, 69,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110, +116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110, +116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,199, 0, 58, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184, 72,147, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 88, 74,147, 5, 0, 0, 0, 0, 24, 71,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34,254,199, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0, 88, 74,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248, 75,147, 5, 0, 0, 0, 0,184, 72,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, + 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, + 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254,199, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248, 75,147, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,152, 77,147, 5, 0, 0, 0, 0, 88, 74,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,242,253,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,152, 77,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56, 79,147, 5, 0, 0, 0, 0,248, 75,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111, +115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111, +115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115, +105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253,199, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 79,147, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,216, 80,147, 5, 0, 0, 0, 0,152, 77,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,194,253,199, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,216, 80,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120, 82,147, 5, 0, 0, 0, 0, 56, 79,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117, +116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117, +116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253,199, 0,130, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 82,147, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 80,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16,253,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +248, 0, 0, 0, 24, 84,147, 5, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88, 85,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0, 72, 90,147, 5, 0, 0, 0, 0,200, 60,147, 5, 0, 0, 0, 0,104,137, 95, 4, 0, 0, 0, 0, 72,225,140, 5, + 0, 0, 0, 0,152, 68,137, 5, 0, 0, 0, 0, 8, 61,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 4, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 15, 15, 24, 4, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 89,147, 5, 0, 0, 0, 0, 40, 89,147, 5, 0, 0, 0, 0, 72, 86,147, 5, 0, 0, 0, 0,184, 87,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 86,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184, 87,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,140, 68, 0, 0, 0, 0, 0, 0,208, 65, 39,182,158, 55, + 0, 0,131, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,130, 68, + 0, 0,200, 65, 0,224,130, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 24, 4, 26, 0, 24, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 87,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 72, 86,147, 5, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192, +246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 18, 0, 0, 0, 61, 0, 0, 0, 0, 0,128, 63, + 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, + 8, 0, 24, 4, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 4, 0, 0, 26, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, 40, 89,147, 5, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 72, 90,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0,168, 96,147, 5, 0, 0, 0, 0, 88, 85,147, 5, 0, 0, 0, 0,184, 88,135, 5, 0, 0, 0, 0,104, 43,147, 5, + 0, 0, 0, 0,216, 43,147, 5, 0, 0, 0, 0,248,104,133, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, +240, 4, 0, 0, 61, 1, 0, 0, 59, 2, 0, 0, 3, 3,216, 0,255, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 94,147, 5, 0, 0, 0, 0, 24, 94,147, 5, 0, 0, 0, 0, 56, 91,147, 5, 0, 0, 0, 0,168, 92,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 91,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,168, 92,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 98, 39, 38, 54, + 0, 0, 88, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 87, 67, + 0, 0,200, 65, 0, 0, 87, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0,216, 0, 26, 0,216, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, +240, 4, 0, 0, 34, 2, 0, 0, 59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 26, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 92,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 91,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 71, 67, 0, 0, 83,195, 0, 0, 0, 0,199, 0, 0, 0,216, 0, 0, 0, 18, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, +198, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,198, 0, 0, 0, 18, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 12, 4, + 6, 0,216, 0,229, 0,199, 0,211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, +240, 4, 0, 0, 61, 1, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0,229, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0, 24, 94,147, 5, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,114,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,168,114,137, 5, + 0, 0, 0, 0,238, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,120, 95,147, 5, 0, 0, 0, 0, 68, 65, 84, 65, +224, 0, 0, 0,120, 95,147, 5, 0, 0, 0, 0,237, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,184,168, 5, + 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, + 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,210,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,184,219,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,184, 17,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,248,232,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8,255,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,226,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,205,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,216,204,168, 5, + 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168, 96,147, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 56,110,147, 5, 0, 0, 0, 0, 72, 90,147, 5, 0, 0, 0, 0,248,164,137, 5, + 0, 0, 0, 0,216,144,139, 5, 0, 0, 0, 0, 40, 76,135, 5, 0, 0, 0, 0,152, 68,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,193, 1, 0, 0, 23, 4, 0, 0, 89, 0, 0, 0,194, 2, 0, 0, 1, 1, 87, 2,106, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,108,147, 5, 0, 0, 0, 0,136,108,147, 5, 0, 0, 0, 0,152, 97,147, 5, + 0, 0, 0, 0, 88,103,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 97,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 8, 99,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0,192, 21, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 2, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,128, 21, 68, 0, 0,200, 65, 0,128, 21, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 87, 2, 26, 0, 87, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,193, 1, 0, 0, 23, 4, 0, 0, 89, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 99,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,120,100,147, 5, 0, 0, 0, 0,152, 97,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, + 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, + 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,193, 1, 0, 0,193, 1, 0, 0,115, 0, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 80, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,100,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,232,101,147, 5, 0, 0, 0, 0, 8, 99,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, + 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, +119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, +119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,193, 1, 0, 0,193, 1, 0, 0,115, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,101,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 88,103,147, 5, 0, 0, 0, 0,120,100,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, +147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, +147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23, 4, 0, 0, 23, 4, 0, 0,115, 0, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,103,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,101,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,193, 1, 0, 0, 23, 4, 0, 0,115, 0, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 2, 80, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200,104,147, 5, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0,200,104,147, 5, 0, 0, 0, 0,174, 0, 0, 0, + 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,167,141, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, + 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, + 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, + 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, + 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, + 0, 0,128, 63,178,157,229, 62,209,162,227,190, 48,180, 81,191,184,158, 81,191,117, 90,127, 63, 13,114, 91, 62, 26, 63,185, 62, + 35, 44,185, 62,145,180,109,188,105,147,125, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65, +214,211,111, 65, 99,240,191, 62,110,116, 85, 63, 64,185, 70,188, 0, 0, 82,180, 48,221,185,190, 44, 45, 51, 62, 28, 11, 79, 63, + 0, 0, 56,179, 67,108,117,194,183,204,216, 65,105,156, 5,194,212,247,159,192,235, 62,114, 66, 59,254,213,193,158,225, 3, 66, + 55, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, + 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, + 0, 0,128, 63,178,157,229, 62,209,162,227,190, 48,180, 81,191,184,158, 81,191,117, 90,127, 63, 13,114, 91, 62, 26, 63,185, 62, + 35, 44,185, 62,145,180,109,188,105,147,125, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65, +214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12,163, 91, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,163, 91, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,163, 91, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, + 0, 0, 0, 0,236, 15, 72, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 86,152,137, 66, +113, 27,126, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,136,108,147, 5, + 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 56,110,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0,232,118,147, 5, 0, 0, 0, 0,168, 96,147, 5, 0, 0, 0, 0, 72,225,140, 5, 0, 0, 0, 0,152,213,132, 5, + 0, 0, 0, 0,168,134,139, 5, 0, 0, 0, 0,248,164,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +191, 1, 0, 0, 89, 0, 0, 0, 3, 1, 0, 0, 2, 2,192, 1,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232,116,147, 5, 0, 0, 0, 0,232,116,147, 5, 0, 0, 0, 0, 40,111,147, 5, 0, 0, 0, 0,120,115,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,111,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,112,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,224, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,223, 67, + 0, 0,200, 65, 0,128,223, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0,192, 1, 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +191, 1, 0, 0, 89, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,112,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 8,114,147, 5, + 0, 0, 0, 0, 40,111,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 72, 67, 0, 0,254,194, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, +199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, + 6, 0,217, 0,145, 0,200, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +216, 0, 0, 0,115, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,145, 0, + 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,114,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,120,115,147, 5, + 0, 0, 0, 0,152,112,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, +191, 1, 0, 0,115, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,115,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8,114,147, 5, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, + 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 18, 0, 0, 0, +230, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0,111, 18,131, 58, +111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0,231, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, +191, 1, 0, 0,115, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 0,145, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,232,116,147, 5, 0, 0, 0, 0,179, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40,118,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0, 40,118,147, 5, 0, 0, 0, 0, 38, 1, 0, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232,118,147, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,184,125,147, 5, 0, 0, 0, 0, 56,110,147, 5, 0, 0, 0, 0,152,213,132, 5, + 0, 0, 0, 0,168,152,137, 5, 0, 0, 0, 0,216,144,139, 5, 0, 0, 0, 0,168,134,139, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 5, 1, 0, 0,194, 2, 0, 0, 12, 12,192, 1,190, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,124,147, 5, 0, 0, 0, 0, 40,124,147, 5, 0, 0, 0, 0,216,119,147, 5, + 0, 0, 0, 0,184,122,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,119,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 72,121,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 94, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0,224, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,128,223, 67, 0, 0,200, 65, 0,128,223, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,192, 1, 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 5, 1, 0, 0, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,192, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,121,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,184,122,147, 5, 0, 0, 0, 0,216,119,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, +163, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, + 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,164, 1,200, 0,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 31, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200, 0,164, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,122,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,121,147, 5, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 0, 72,194, + 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 0,201,195, 0, 0, 0, 0,231, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0, +163, 1, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0, +163, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, 0, 64, 28, 70, 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,248, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200, 0, 0, 0,191, 1, 0, 0, 31, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,248, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 40,124,147, 5, 0, 0, 0, 0, 39, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,125,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,118,147, 5, 0, 0, 0, 0,104, 43,147, 5, 0, 0, 0, 0, 40, 76,135, 5, + 0, 0, 0, 0, 88, 56,135, 5, 0, 0, 0, 0,216, 43,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, +240, 4, 0, 0, 61, 2, 0, 0,194, 2, 0, 0, 1, 1,216, 0,134, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 72,133,147, 5, 0, 0, 0, 0, 72,133,147, 5, 0, 0, 0, 0,168,126,147, 5, 0, 0, 0, 0, 24,128,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,126,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,128,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,165, 67, 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0,128,164, 67, + 0, 0,200, 65, 0,128,164, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, +240, 4, 0, 0, 61, 2, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,128,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,168,126,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0, +240, 4, 0, 0, 61, 2, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0,134, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,129,147, 5, + 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0,136,129,147, 5, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 56,255, 13, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,100, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, + 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,192, 56, 49,188, + 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, + 55, 70, 58, 63,160, 56, 49,188, 0, 0, 0, 0, 88,126,162,190,229,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63, +150, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 47,201,194, 63, + 61, 73,145,191,244,250, 39,191, 8,165, 39,191,190,164,206, 63,209, 10,143, 63,180,164, 28, 63,149, 84, 28, 63,224,153,196,188, +136,239, 76, 64, 10,108,228,190, 52,247,227,190,125, 21, 64,191,126,113,172,191,216, 49, 49, 65,152, 9, 52, 65,149, 70,158, 62, + 24,234,167, 62,192,214,159,187, 0, 0, 6,181,196,188,181,189, 71,238,178, 61,127, 45,128, 62, 0, 0,226, 51,168,120, 21,194, +107, 5, 2, 66,203,135,213,193,147,214,159,192,177, 38, 19, 66,124,173,255,193, 96,101,210, 65,128, 40,160, 64,221,149, 47, 63, + 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,192, 56, 49,188, + 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63, 47,201,194, 63, + 61, 73,145,191,244,250, 39,191, 8,165, 39,191,190,164,206, 63,209, 10,143, 63,180,164, 28, 63,149, 84, 28, 63,224,153,196,188, +136,239, 76, 64, 10,108,228,190, 52,247,227,190,125, 21, 64,191,126,113,172,191,216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,103, 97, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,103, 97, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,102,103, 97, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,241, 22, 72, 63, + 78,162,246,190, 43, 8, 90,190, 2, 35,171,190, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,191,136, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 1, 2, 0, 0,255,255, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63,190,133, 65, 66, 99,212, 90, 66, 27,183,118, 66, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0, 72,133,147, 5, 0, 0, 0, 0,175, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, + 1, 0, 3, 0, 8, 0,128, 0, 0, 0, 12, 66, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0,248,134,147, 5, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,104, 63,166, 5, + 0, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111, +109,112,111,115,105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,136,147, 5, 0, 0, 0, 0,248,141,147, 5, + 0, 0, 0, 0,104,142,147, 5, 0, 0, 0, 0,152,151,147, 5, 0, 0, 0, 0, 8,152,147, 5, 0, 0, 0, 0, 56,204,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 65, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 56, 67, 27, 7, 0, 0, 0, 0,248, 63, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,242,253,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,136,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184,136,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,184,136,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 40,137,147, 5, 0, 0, 0, 0, 72,136,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,137,147, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,152,137,147, 5, 0, 0, 0, 0,184,136,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152,137,147, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 8,138,147, 5, 0, 0, 0, 0, 40,137,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,138,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,120,138,147, 5, + 0, 0, 0, 0,152,137,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,120,138,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232,138,147, 5, 0, 0, 0, 0, 8,138,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,138,147, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0,120,138,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 6, 92, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,200,139,147, 5, 0, 0, 0, 0,232,138,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 92, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,139,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,140,147, 5, + 0, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0, 56,140,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168,140,147, 5, 0, 0, 0, 0,200,139,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,140,147, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0, 56,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 6,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,136,141,147, 5, 0, 0, 0, 0,168,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3,140, 1, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,141,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,141,147, 5, + 0, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,141,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,142,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,142,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,136,147, 5, + 0, 0, 0, 0, 40,137,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,142,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,143,147, 5, 0, 0, 0, 0,104,142,147, 5, 0, 0, 0, 0,184,136,147, 5, + 0, 0, 0, 0, 8,138,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,143,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,143,147, 5, 0, 0, 0, 0,216,142,147, 5, 0, 0, 0, 0, 40,137,147, 5, + 0, 0, 0, 0,120,138,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,143,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,144,147, 5, 0, 0, 0, 0, 72,143,147, 5, 0, 0, 0, 0, 8,138,147, 5, + 0, 0, 0, 0,120,138,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,144,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,144,147, 5, 0, 0, 0, 0,184,143,147, 5, 0, 0, 0, 0,152,137,147, 5, + 0, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,144,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,145,147, 5, 0, 0, 0, 0, 40,144,147, 5, 0, 0, 0, 0,232,138,147, 5, + 0, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,145,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,145,147, 5, 0, 0, 0, 0,152,144,147, 5, 0, 0, 0, 0,120,138,147, 5, + 0, 0, 0, 0,200,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,145,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,145,147, 5, 0, 0, 0, 0, 8,145,147, 5, 0, 0, 0, 0, 8,138,147, 5, + 0, 0, 0, 0,200,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,145,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,146,147, 5, 0, 0, 0, 0,120,145,147, 5, 0, 0, 0, 0,232,138,147, 5, + 0, 0, 0, 0,200,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,146,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,146,147, 5, 0, 0, 0, 0,232,145,147, 5, 0, 0, 0, 0,120,138,147, 5, + 0, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,146,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,147,147, 5, 0, 0, 0, 0, 88,146,147, 5, 0, 0, 0, 0, 8,138,147, 5, + 0, 0, 0, 0, 56,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,147,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168,147,147, 5, 0, 0, 0, 0,200,146,147, 5, 0, 0, 0, 0,200,139,147, 5, + 0, 0, 0, 0,168,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,147,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24,148,147, 5, 0, 0, 0, 0, 56,147,147, 5, 0, 0, 0, 0, 56,140,147, 5, + 0, 0, 0, 0,168,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,148,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136,148,147, 5, 0, 0, 0, 0,168,147,147, 5, 0, 0, 0, 0, 56,140,147, 5, + 0, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,148,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248,148,147, 5, 0, 0, 0, 0, 24,148,147, 5, 0, 0, 0, 0,168,140,147, 5, + 0, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,148,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104,149,147, 5, 0, 0, 0, 0,136,148,147, 5, 0, 0, 0, 0, 72,136,147, 5, + 0, 0, 0, 0,136,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,149,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,149,147, 5, 0, 0, 0, 0,248,148,147, 5, 0, 0, 0, 0,136,141,147, 5, + 0, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,149,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,150,147, 5, 0, 0, 0, 0,104,149,147, 5, 0, 0, 0, 0,152,137,147, 5, + 0, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,150,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,150,147, 5, 0, 0, 0, 0,216,149,147, 5, 0, 0, 0, 0,232,138,147, 5, + 0, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,150,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,151,147, 5, 0, 0, 0, 0, 72,150,147, 5, 0, 0, 0, 0, 24,141,147, 5, + 0, 0, 0, 0,136,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,151,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,151,147, 5, 0, 0, 0, 0,184,150,147, 5, 0, 0, 0, 0,168,140,147, 5, + 0, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,151,147, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,151,147, 5, 0, 0, 0, 0, 72,136,147, 5, + 0, 0, 0, 0, 56,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8,152,147, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,216,155,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,138,147, 5, + 0, 0, 0, 0,184,136,147, 5, 0, 0, 0, 0, 40,137,147, 5, 0, 0, 0, 0,120,138,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, 27, 0, 1, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,243,146, 5, 0, 0, 0, 0,184,243,146, 5, 0, 0, 0, 0,248,152,147, 5, + 0, 0, 0, 0,104,154,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,152,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,104,154,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,127, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, - 56, 67, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216, 68, 27, 7, 0, 0, 0, 0,152, 65, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112, -114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112, -114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,154,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,152,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, + 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 68, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -120, 70, 27, 7, 0, 0, 0, 0, 56, 67, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,216,155,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0,200,160,147, 5, 0, 0, 0, 0, 8,152,147, 5, 0, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0,232,138,147, 5, + 0, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0,152,137,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 15, 15, 94, 1, 92, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0,168,159,147, 5, 0, 0, 0, 0,168,159,147, 5, 0, 0, 0, 0,200,156,147, 5, 0, 0, 0, 0, 56,158,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,194,253,199, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,156,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 56,158,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,115, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,175, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,174, 67, + 0, 0,200, 65, 0,128,174, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 94, 1, 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -120, 70, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24, 72, 27, 7, 0, 0, 0, 0,216, 68, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253,199, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,158,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200,156,147, 5, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193, +154,209,131, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 18, 0, 0, 0, 65, 0, 0, 0, 0, 0,128, 63, + 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, + 8, 0, 94, 1, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 26, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 72, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,120, 70, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16,253,199, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -184, 73, 27, 7, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,168,159,147, 5, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 74, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -232, 79, 27, 7, 0, 0, 0, 0,104, 50, 27, 7, 0, 0, 0, 0,200,224, 26, 7, 0, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0, -216, 30, 27, 7, 0, 0, 0, 0,168, 28, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 15, 15, 24, 4, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 78, 27, 7, 0, 0, 0, 0,200, 78, 27, 7, 0, 0, 0, 0,232, 75, 27, 7, 0, 0, 0, 0, 88, 77, 27, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,160,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0, 88,185,147, 5, 0, 0, 0, 0,216,155,147, 5, 0, 0, 0, 0,232,138,147, 5, 0, 0, 0, 0,200,139,147, 5, + 0, 0, 0, 0,120,138,147, 5, 0, 0, 0, 0, 88,139,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 93, 0, 0, 0,233, 3, 0, 0, 4, 4, 94, 1,141, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24,184,147, 5, 0, 0, 0, 0, 24,184,147, 5, 0, 0, 0, 0,184,161,147, 5, 0, 0, 0, 0, 40,163,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,232, 75, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 88, 77, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,140, 68, 0, 0, 0, 0, 0, 0,208, 65, 39,182,158, 55, 0, 0,131, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,130, 68, 0, 0,200, 65, - 0,224,130, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 24, 4, - 26, 0, 24, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,161,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40,163,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,175, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,174, 67, + 0, 0,200, 65, 0,128,174, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 94, 1, 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0,208, 3, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 88, 77, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, 75, 27, 7, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 18, 0, 0, 0, 61, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 24, 4, - 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, - 26, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 62, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,163,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,184,161,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67, 0,128, 92,196, 0, 0, 0, 0, 0, 0, 0, 0, +255,127,166, 67,255,191, 92,196, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,114, 3, 0, 0, 0, 0, 0, 0, + 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,114, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, + 6, 0, 94, 1,115, 3, 77, 1,115, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 93, 0, 0, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,115, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,164,147, 5, 0, 0, 0, 0,120,182,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,164,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,166,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, + 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, + 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116, +101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, + 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,166,147, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,167,147, 5, 0, 0, 0, 0,152,164,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,208, 0, 0, 0,200, 78, 27, 7, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232, 79, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -168, 86, 27, 7, 0, 0, 0, 0,248, 74, 27, 7, 0, 0, 0, 0,136, 29, 27, 7, 0, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0, -120, 33, 27, 7, 0, 0, 0, 0,248, 29, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, - 61, 1, 0, 0, 59, 2, 0, 0, 3, 3,216, 0,255, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 83, 27, 7, 0, 0, 0, 0,184, 83, 27, 7, 0, 0, 0, 0,216, 80, 27, 7, 0, 0, 0, 0, 72, 82, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,216, 80, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 72, 82, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 98, 39, 38, 54, 0, 0, 88, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 87, 67, 0, 0,200, 65, - 0, 0, 87, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,216, 0, - 26, 0,216, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, - 34, 2, 0, 0, 59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 26, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 72, 82, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 80, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 67, - 0, 0, 83,195, 0, 0, 0, 0,199, 0, 0, 0,216, 0, 0, 0, 18, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0,198, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,198, 0, 0, 0, 18, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 12, 4, 6, 0,216, 0, -229, 0,199, 0,211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, - 61, 1, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0,229, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216,167,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,169,147, 5, + 0, 0, 0, 0, 56,166,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101, +114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, + 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,169,147, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24,171,147, 5, 0, 0, 0, 0,216,167,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24,171,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184,172,147, 5, + 0, 0, 0, 0,120,169,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, + 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, + 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,172,147, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88,174,147, 5, 0, 0, 0, 0, 24,171,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88,174,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248,175,147, 5, + 0, 0, 0, 0,184,172,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, +105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254, + 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,175,147, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152,177,147, 5, 0, 0, 0, 0, 88,174,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,177,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,179,147, 5, + 0, 0, 0, 0,248,175,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, + 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253, + 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,179,147, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,180,147, 5, 0, 0, 0, 0,152,177,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216,180,147, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,182,147, 5, + 0, 0, 0, 0, 56,179,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112, +117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253, + 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,182,147, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,180,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,184,147, 5, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 1, 0, 0,184, 83, 27, 7, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88,185,147, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,232,198,147, 5, 0, 0, 0, 0,200,160,147, 5, 0, 0, 0, 0,136,141,147, 5, + 0, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0,168,140,147, 5, 0, 0, 0, 0,248,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 3, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, 1, 1, 27, 3,140, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,197,147, 5, 0, 0, 0, 0, 56,197,147, 5, 0, 0, 0, 0, 72,186,147, 5, + 0, 0, 0, 0, 8,192,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,186,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,184,187,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0,192, 70, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 3, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,128, 70, 68, 0, 0,200, 65, 0,128, 70, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 27, 3, 26, 0, 27, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 3, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,187,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 40,189,147, 5, 0, 0, 0, 0, 72,186,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, + 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, + 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 3, 0, 0, 5, 3, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0,114, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,189,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,152,190,147, 5, 0, 0, 0, 0,184,187,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, + 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, +119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, +119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 3, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,190,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 8,192,147, 5, 0, 0, 0, 0, 40,189,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, +129, 1, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, +129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 6, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,192,147, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,190,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 3, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 3,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,120,193,147, 5, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0,120,193,147, 5, 0, 0, 0, 0,174, 0, 0, 0, + 1, 0, 0, 0, 93,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,133,119, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, + 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, + 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, + 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, + 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, + 0, 0,128, 63, 42, 6,158, 63, 99, 28,157,191,244,250, 39,191, 8,165, 39,191,211,164,167, 63, 55,175,154, 63,180,164, 28, 63, +149, 84, 28, 63, 39,127,159,188,135,157, 93, 64, 8,108,228,190, 50,247,227,190, 4,213, 27,191,122,122,186,191,216, 49, 49, 65, +152, 9, 52, 65, 25, 25,195, 62,176,249,206, 62,128,238,196,187, 0, 0,192,179, 55, 15,168,189,201,118,165, 61,152, 15,109, 62, + 0, 0,152, 51,211,120, 21,194,144, 5, 2, 66, 6,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,154,101,210, 65, +173, 40,160, 64,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, + 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, + 0, 0,128, 63, 42, 6,158, 63, 99, 28,157,191,244,250, 39,191, 8,165, 39,191,211,164,167, 63, 55,175,154, 63,180,164, 28, 63, +149, 84, 28, 63, 39,127,159,188,135,157, 93, 64, 8,108,228,190, 50,247,227,190, 4,213, 27,191,122,122,186,191,216, 49, 49, 65, +152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62,250,150, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,250,150, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,250,150, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63,241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 80, 49,183, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 65, 1, 2, 0, 0,255,255, 0, 0, + 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63,190,133, 65, 66,100,212, 90, 66, + 31,183,118, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0, 56,197,147, 5, + 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232,198,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0, 56,204,147, 5, 0, 0, 0, 0, 88,185,147, 5, 0, 0, 0, 0, 56,140,147, 5, 0, 0, 0, 0, 8,138,147, 5, + 0, 0, 0, 0,200,139,147, 5, 0, 0, 0, 0,168,140,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 6, 0, 0,141, 1, 0, 0,233, 3, 0, 0, 16, 16, 32, 6, 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,184,202,147, 5, 0, 0, 0, 0,184,202,147, 5, 0, 0, 0, 0,216,199,147, 5, 0, 0, 0, 0, 72,201,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,199,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 72,201,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 66, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,196, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,195, 68, + 0, 0,200, 65, 0,224,195, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 32, 6, 26, 0, 32, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 6, 0, 0,141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,201,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,216,199,147, 5, 0, 0, 0, 0, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,128,195,217,195, +192,225,108, 68, 96,240,187, 64, 62, 16,253, 67, 15, 6, 0, 0, 32, 6, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, + 14, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 14, 6, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, + 0, 0, 32, 6, 67, 2, 15, 6, 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 6, 0, 0,167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 67, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,184,202,147, 5, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 19, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,206, 97, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 56,204,147, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,198,147, 5, 0, 0, 0, 0, 72,136,147, 5, 0, 0, 0, 0, 56,140,147, 5, + 0, 0, 0, 0, 24,141,147, 5, 0, 0, 0, 0,136,141,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, 6, 6, 4, 3,140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,248, 29,166, 5, 0, 0, 0, 0,248, 29,166, 5, 0, 0, 0, 0, 40,205,147, 5, 0, 0, 0, 0,136, 28,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,205,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,206,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 65, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 64, 68, + 0, 0,200, 65, 0,192, 64, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 4, 3, 26, 0, 4, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,206,147, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136, 28,166, 5, + 0, 0, 0, 0, 40,205,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 28,166, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,152,206,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0,129,191, + 0,128, 0, 64, 0, 0,100,190, 0,128,156, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0,114, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3,114, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,248, 29,166, 5, 0, 0, 0, 0,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62, +100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0,104, 63,166, 5, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,184, 90,167, 5, + 0, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101, +102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 64,166, 5, 0, 0, 0, 0,104, 70,166, 5, + 0, 0, 0, 0,216, 70,166, 5, 0, 0, 0, 0, 72, 78,166, 5, 0, 0, 0, 0,184, 78,166, 5, 0, 0, 0, 0, 8,208,147, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 22,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 64,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 40, 65,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0, 40, 65,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,152, 65,166, 5, 0, 0, 0, 0,184, 64,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152, 65,166, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 8, 66,166, 5, 0, 0, 0, 0, 40, 65,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,128, 7, 32, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 66,166, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,120, 66,166, 5, 0, 0, 0, 0,152, 65,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 66,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232, 66,166, 5, + 0, 0, 0, 0, 8, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 3, 1, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,232, 66,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88, 67,166, 5, 0, 0, 0, 0,120, 66,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7,248, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 67,166, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0,232, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 56, 68,166, 5, 0, 0, 0, 0, 88, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 6,248, 3, + 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56, 68,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168, 68,166, 5, + 0, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 6,108, 3, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24, 69,166, 5, 0, 0, 0, 0, 56, 68,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7,108, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 69,166, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,248, 69,166, 5, 0, 0, 0, 0, 24, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 6,140, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 69,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 70,166, 5, + 0, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 3, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,104, 70,166, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 69,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 6,144, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 70,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72, 71,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 65,166, 5, + 0, 0, 0, 0,152, 65,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 71,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184, 71,166, 5, 0, 0, 0, 0,216, 70,166, 5, 0, 0, 0, 0, 40, 65,166, 5, + 0, 0, 0, 0,120, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 71,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40, 72,166, 5, 0, 0, 0, 0, 72, 71,166, 5, 0, 0, 0, 0,152, 65,166, 5, + 0, 0, 0, 0,232, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 72,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152, 72,166, 5, 0, 0, 0, 0,184, 71,166, 5, 0, 0, 0, 0,120, 66,166, 5, + 0, 0, 0, 0,232, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 72,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8, 73,166, 5, 0, 0, 0, 0, 40, 72,166, 5, 0, 0, 0, 0,184, 64,166, 5, + 0, 0, 0, 0, 88, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 73,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120, 73,166, 5, 0, 0, 0, 0,152, 72,166, 5, 0, 0, 0, 0, 8, 66,166, 5, + 0, 0, 0, 0, 88, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 73,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232, 73,166, 5, 0, 0, 0, 0, 8, 73,166, 5, 0, 0, 0, 0,120, 66,166, 5, + 0, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 73,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88, 74,166, 5, 0, 0, 0, 0,120, 73,166, 5, 0, 0, 0, 0,232, 66,166, 5, + 0, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 74,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200, 74,166, 5, 0, 0, 0, 0,232, 73,166, 5, 0, 0, 0, 0, 88, 67,166, 5, + 0, 0, 0, 0, 56, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 74,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56, 75,166, 5, 0, 0, 0, 0, 88, 74,166, 5, 0, 0, 0, 0,200, 67,166, 5, + 0, 0, 0, 0, 56, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 75,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168, 75,166, 5, 0, 0, 0, 0,200, 74,166, 5, 0, 0, 0, 0,232, 66,166, 5, + 0, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 75,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24, 76,166, 5, 0, 0, 0, 0, 56, 75,166, 5, 0, 0, 0, 0, 8, 66,166, 5, + 0, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 76,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136, 76,166, 5, 0, 0, 0, 0,168, 75,166, 5, 0, 0, 0, 0, 56, 68,166, 5, + 0, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 76,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248, 76,166, 5, 0, 0, 0, 0, 24, 76,166, 5, 0, 0, 0, 0,184, 64,166, 5, + 0, 0, 0, 0, 24, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 76,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104, 77,166, 5, 0, 0, 0, 0,136, 76,166, 5, 0, 0, 0, 0, 88, 67,166, 5, + 0, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 77,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216, 77,166, 5, 0, 0, 0, 0,248, 76,166, 5, 0, 0, 0, 0, 24, 69,166, 5, + 0, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 77,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72, 78,166, 5, 0, 0, 0, 0,104, 77,166, 5, 0, 0, 0, 0,120, 66,166, 5, + 0, 0, 0, 0, 24, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 78,166, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 77,166, 5, 0, 0, 0, 0,200, 67,166, 5, + 0, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184, 78,166, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,136, 82,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 66,166, 5, + 0, 0, 0, 0, 40, 65,166, 5, 0, 0, 0, 0,152, 65,166, 5, 0, 0, 0, 0,232, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,249, 3, 0, 0, 32, 4, 0, 0, 7, 7,129, 7, 40, 0, 1, 0, 0, 0, 0, 0, + 7, 0, 8, 0,248, 19, 64, 4, 0, 0, 0, 0, 40, 90,167, 5, 0, 0, 0, 0, 40, 90,167, 5, 0, 0, 0, 0,168, 79,166, 5, + 0, 0, 0, 0, 24, 81,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,127, 98, 4, + 0, 0, 0, 0,184,193,117, 5, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 79,166, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 24, 81,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,171, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 32,240, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0,240, 68, 0, 0,200, 65, 0, 0,240, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,129, 7, 26, 0,129, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,249, 3, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,129, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 22, 64, 4, 0, 0, 0, 0,136,237,100, 4, 0, 0, 0, 0,136,237,100, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,242,148, 5, 0, 0, 0, 0, 56,129,123, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 81,166, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 79,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,239, 68, 0, 0, 0, 0, + 0, 0,200, 65, 0, 0, 0, 0, 0, 0,238, 68, 0, 0,128, 63, 0, 0,112, 65,112, 7, 0, 0,129, 7, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, + 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 14, 0,112, 7, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 19, 4, 0, 0, 32, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,129, 7, 14, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 21, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 60,133, 5, 0, 0, 0, 0, 56,132,123, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136, 82,166, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0, 88,123,166, 5, 0, 0, 0, 0,184, 78,166, 5, 0, 0, 0, 0, 88, 67,166, 5, 0, 0, 0, 0, 56, 68,166, 5, + 0, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0, 8, 66,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 6, 0, 0, +128, 7, 0, 0, 0, 0, 0, 0,107, 3, 0, 0, 4, 4, 32, 1,108, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,120, 15, 64, 4, + 0, 0, 0, 0, 24,122,166, 5, 0, 0, 0, 0, 24,122,166, 5, 0, 0, 0, 0,120, 83,166, 5, 0, 0, 0, 0,232, 84,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 75,118, 5, 0, 0, 0, 0,120, 60,135, 5, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120, 83,166, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,232, 84,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,144, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,143, 67, + 0, 0,200, 65, 0,128,143, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 32, 1, 26, 0, 32, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 6, 0, 0, +128, 7, 0, 0, 82, 3, 0, 0,107, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 26, 0, + 4, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 18, 64, 4, + 0, 0, 0, 0, 24,214,139, 5, 0, 0, 0, 0, 24,214,139, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232, 93,137, 5, 0, 0, 0, 0,120,135,123, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 84,166, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,120, 83,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0,128, 84,196, 0, 0, 0, 0, 0, 0, 0, 0, + 2,128,135, 67, 3,128, 84,196, 0, 0, 0, 0, 15, 1, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 81, 3, 0, 0, 0, 0, 0, 0, + 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 0, 0, 81, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, + 6, 0, 32, 1, 82, 3, 15, 1, 82, 3, 0, 0,136, 69,115, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 97, 6, 0, 0, +128, 7, 0, 0, 0, 0, 0, 0, 81, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 82, 3, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 16, 64, 4, + 0, 0, 0, 0, 88,174,149, 5, 0, 0, 0, 0,152,144, 99, 4, 0, 0, 0, 0, 88, 86,166, 5, 0, 0, 0, 0,120,120,166, 5, + 0, 0, 0, 0,200,126,123, 5, 0, 0, 0, 0, 72,139,123, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 86,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248, 87,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 17, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, + 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, + 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116, +101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, + 15, 1, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248, 87,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152, 89,166, 5, 0, 0, 0, 0, 88, 86,166, 5, 0, 0, 0, 0,136,175,227, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 15, 1, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 89,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56, 91,166, 5, + 0, 0, 0, 0,248, 87,166, 5, 0, 0, 0, 0,136,178,227, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101, +114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, + 15, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 91,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216, 92,166, 5, 0, 0, 0, 0,152, 89,166, 5, 0, 0, 0, 0,152,181,227, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 15, 1,203, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 92,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120, 94,166, 5, + 0, 0, 0, 0, 56, 91,166, 5, 0, 0, 0, 0,168,184,227, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, + 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, + 15, 1, 58, 0, 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 94,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24, 96,166, 5, 0, 0, 0, 0,216, 92,166, 5, 0, 0, 0, 0,120,187,227, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 15, 1, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 96,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184, 97,166, 5, + 0, 0, 0, 0,120, 94,166, 5, 0, 0, 0, 0, 8,204,185, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, +105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254, + 15, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184, 97,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88, 99,166, 5, 0, 0, 0, 0, 24, 96,166, 5, 0, 0, 0, 0, 72,198,227, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253, 15, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 99,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248,100,166, 5, + 0, 0, 0, 0,184, 97,166, 5, 0, 0, 0, 0, 24,201,227, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, + 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253, + 15, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,100,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152,102,166, 5, 0, 0, 0, 0, 88, 99,166, 5, 0, 0, 0, 0, 40,204,227, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253, 15, 1, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,102,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,104,166, 5, + 0, 0, 0, 0,248,100,166, 5, 0, 0, 0, 0, 40,207,227, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112, +117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,253, + 15, 1,134, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,104,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,105,166, 5, 0, 0, 0, 0,152,102,166, 5, 0, 0, 0, 0, 56,213,227, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,253, 15, 1, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216,105,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,107,166, 5, + 0, 0, 0, 0, 56,104,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, + 69, 95, 80, 84, 95,115, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, + 69, 95, 80, 84, 95,115, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 99,101,110, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, + 41, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,107,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24,109,166, 5, 0, 0, 0, 0,216,105,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85,110,105,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,255, 41, 1, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24,109,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184,110,166, 5, + 0, 0, 0, 0,120,107,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, + 69, 95, 80, 84, 95,107,101,121,105,110,103, 95,115,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, + 69, 95, 80, 84, 95,107,101,121,105,110,103, 95,115,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75,101,121,105, +110,103, 32, 83,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,254, + 41, 1, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,110,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88,112,166, 5, 0, 0, 0, 0, 24,109,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,112,104,121,115,105, 99,115, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,112,104,121,115,105, 99,115, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114, 97,118,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131,254, 41, 1, 36, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88,112,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248,113,166, 5, + 0, 0, 0, 0,184,110,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, + 69, 95, 80, 84, 95,115,105,109,112,108,105,102,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, + 69, 95, 80, 84, 95,115,105,109,112,108,105,102,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,105,109,112, +108,105,102,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, + 41, 1, 80, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,113,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152,115,166, 5, 0, 0, 0, 0, 88,112,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112, +115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112, +115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,223,253, 41, 1, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,115,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,117,166, 5, + 0, 0, 0, 0,248,113,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, + 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, + 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,255, +187, 0,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,117,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,118,166, 5, 0, 0, 0, 0,152,115,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,254,187, 0,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216,118,166, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,120,166, 5, + 0, 0, 0, 0, 56,117,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, + 85, 82, 69, 95, 80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, + 85, 82, 69, 95, 80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,110,102,108, +117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,223,252, +187, 0, 86, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,120,166, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,118,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 74, 69, 67, 84, 95, 80, 84, 95, 99,111,110,115,116,114, 97,105,110,116, +115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 74, 69, 67, 84, 95, 80, 84, 95, 99,111,110,115,116,114, 97,105,110,116, +115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 67,111,110,115,116,114, 97,105,110,116,115, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,187, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,122,166, 5, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 40,235,139, 5, 0, 0, 0, 0,255, 21, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88,123,166, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 72,128,166, 5, 0, 0, 0, 0,136, 82,166, 5, 0, 0, 0, 0,184, 64,166, 5, + 0, 0, 0, 0, 24, 69,166, 5, 0, 0, 0, 0,136, 69,166, 5, 0, 0, 0, 0, 88, 67,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, 0, 0, 0, 0,139, 0, 0, 0, 15, 15, 96, 6,140, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40,226, 63, 4, 0, 0, 0, 0, 40,127,166, 5, 0, 0, 0, 0, 40,127,166, 5, 0, 0, 0, 0, 72,124,166, 5, + 0, 0, 0, 0,184,125,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 75,135, 5, + 0, 0, 0, 0,200,159,139, 5, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,124,166, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,184,125,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,143, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0,204, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,224,203, 68, 0, 0,200, 65, 0,224,203, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 96, 6, 26, 0, 96, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 6, 26, 0, 6, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 72,228, 63, 4, 0, 0, 0, 0,120, 14,135, 5, 0, 0, 0, 0,120, 14,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,130,123, 5, 0, 0, 0, 0,184,144,123, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,125,166, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,124,166, 5, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, + 0, 0, 72, 66, 88,218,103,194, 40,147,141, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, 18, 0, 0, 0, +113, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, + 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 96, 6,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, 26, 0, 0, 0,139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 6,114, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 72,227, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,145,123, 5, 0, 0, 0, 0,168,217,126, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, 40,127,166, 5, 0, 0, 0, 0,191, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 72,128,166, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 8,208,147, 5, 0, 0, 0, 0, 88,123,166, 5, 0, 0, 0, 0, 56, 68,166, 5, + 0, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0,232, 66,166, 5, 0, 0, 0, 0,168, 68,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 6, 0, 0,128, 7, 0, 0,109, 3, 0, 0,247, 3, 0, 0, 3, 3, 32, 1,139, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 8,223, 63, 4, 0, 0, 0, 0, 24,132,166, 5, 0, 0, 0, 0, 24,132,166, 5, 0, 0, 0, 0, 56,129,166, 5, + 0, 0, 0, 0,168,130,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,148,118, 5, + 0, 0, 0, 0,248,243,119, 5, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,129,166, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,168,130,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0,144, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,128,143, 67, 0, 0,200, 65, 0,128,143, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 32, 1, 26, 0, 32, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 6, 0, 0,128, 7, 0, 0,222, 3, 0, 0,247, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 1, 26, 0, 8, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40,225, 63, 4, 0, 0, 0, 0, 40,236,141, 5, 0, 0, 0, 0, 40,236,141, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,133,123, 5, 0, 0, 0, 0, 24,223,126, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,130,166, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,129,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,135, 67, 0, 0,190,194, 0, 0, 0, 0, 15, 1, 0, 0, 32, 1, 0, 0, 18, 0, 0, 0, +112, 0, 0, 0, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 14, 1, 0, 0, 18, 0, 0, 0, +112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 0, 0, + 2, 0, 3, 3, 0, 0, 12, 4, 6, 0, 32, 1,113, 0, 15, 1, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 6, 0, 0,128, 7, 0, 0,109, 3, 0, 0,221, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 1,113, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40,224, 63, 4, 0, 0, 0, 0, 88, 20,140, 5, 0, 0, 0, 0, 88, 20,140, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,136,123, 5, 0, 0, 0, 0,136,225,126, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0, 24,132,166, 5, 0, 0, 0, 0,184, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 89,170, 5, 0, 0, 0, 0,168, 89,170, 5, 0, 0, 0, 0,232,209,134, 5, + 0, 0, 0, 0, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, + 16, 0, 0, 0,232,209,134, 5, 0, 0, 0, 0,238, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0, 42, 11, 0, 0,120,133,166, 5, + 0, 0, 0, 0, 68, 65, 84, 65,160,178, 0, 0,120,133,166, 5, 0, 0, 0, 0,237, 0, 0, 0, 42, 11, 0, 0, 0, 0, 0, 0, + 2, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 20, 0, 0, 0, + 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 72,210,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,184,219,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0,184, 17,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,248,232,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 8,255,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,226,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0,232,205,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0,216,204,168, 5, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 0, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, + 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 30, 0,255,255, + 3, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 30, 0,255,255, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 32, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 34, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 36, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 38, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 40, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 42, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 44, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 46, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 48, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 50, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 52, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 54, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 56, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 58, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 60, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 62, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 64, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 66, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 68, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 70, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 72, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 74, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 76, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 78, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 80, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 82, 0, + 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 2, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 4, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 6, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 8, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 10, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 12, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 14, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 16, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 18, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 20, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 22, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 24, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 26, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 28, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 30, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 32, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 34, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 36, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 38, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 40, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 42, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 44, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 46, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 48, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 50, 0, + 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 31, 0, 0, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 32, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 34, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 36, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 38, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 40, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 42, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 44, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 46, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 48, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 50, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 52, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 54, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 56, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 58, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 60, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 62, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 64, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 66, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 68, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 70, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 72, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 74, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 76, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 78, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 80, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 82, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 84, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 86, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 88, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 90, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 92, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 94, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 96, 0, + 1, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 31, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 33, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 35, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 37, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 39, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 41, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 43, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 45, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 47, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 49, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 51, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 53, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 55, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 57, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 59, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 61, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 63, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 65, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 67, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 69, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 71, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 73, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 75, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 77, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 79, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 81, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 83, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 85, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 87, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 89, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 91, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 93, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 95, 0, + 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 22, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 24, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 26, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 28, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 30, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 32, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 34, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 36, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 38, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 40, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 42, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 44, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 46, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 48, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 50, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 52, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 54, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 56, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 58, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 60, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 62, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 64, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 66, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 68, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 70, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 72, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 74, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 76, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 78, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 80, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 82, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 84, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 86, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 88, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 90, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 92, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 94, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 96, 0, + 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 24, 42,147, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,248,134,147, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 31, 0, 0, 0, + 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 2, 0, + 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 4, 0, + 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 6, 0, + 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 8, 0, + 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 10, 0, + 1, 0, 0, 0, 40, 39,147, 5, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 1, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 3, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 5, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 7, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 9, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 11, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 13, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 15, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 17, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 19, 0, + 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0, 8,208,147, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,128,166, 5, + 0, 0, 0, 0, 24, 69,166, 5, 0, 0, 0, 0,120, 66,166, 5, 0, 0, 0, 0,200, 67,166, 5, 0, 0, 0, 0,136, 69,166, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0,141, 0, 0, 0,247, 3, 0, 0, 1, 1, 96, 6, +107, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 72,229, 63, 4, 0, 0, 0, 0,120, 88,167, 5, 0, 0, 0, 0,120, 88,167, 5, + 0, 0, 0, 0,104, 56,167, 5, 0, 0, 0, 0, 72, 83,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232, 31,125, 5, 0, 0, 0, 0,184,167,126, 5, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 56,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,216, 57,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,192,108, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,204, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 95, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,203, 68, 0, 0,200, 65, 0,224,203, 68, 0, 0,200, 65, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 96, 6, 26, 0, 96, 6, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0,141, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 6, 26, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,239, 63, 4, 0, 0, 0, 0,200, 6,182, 5, 0, 0, 0, 0,200, 6,182, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,223,126, 5, 0, 0, 0, 0, 24, 50,127, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216, 57,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200, 78,167, 5, 0, 0, 0, 0,104, 56,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,128,178, 67, 0, 64, 30,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 30,196, 0, 0, 0, 0,143, 0, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0,120, 2, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 0, 0, 0, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,121, 2,143, 0,121, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,127, 1, 0, 0,247, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,121, 2, 11, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,160, 0, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,236, 63, 4, 0, 0, 0, 0,232, 30,140, 5, 0, 0, 0, 0,232, 30,140, 5, + 0, 0, 0, 0, 72, 59,167, 5, 0, 0, 0, 0, 40, 77,167, 5, 0, 0, 0, 0,216, 46,127, 5, 0, 0, 0, 0,104,206,129, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72, 59,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,232, 60,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,165,231, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, + 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, + 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233,253,143, 0,255, 1, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 60,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136, 62,167, 5, + 0, 0, 0, 0, 72, 59,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,114,117,115, +104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117,254, +143, 0,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136, 62,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 40, 64,167, 5, 0, 0, 0, 0,232, 60,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115, +104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115, +104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,254,143, 0, 61, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 64,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,200, 65,167, 5, + 0, 0, 0, 0,136, 62,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114,111, +107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,254, +143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200, 65,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,104, 67,167, 5, 0, 0, 0, 0, 40, 64,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115, +104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115, +104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45,254,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 67,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 8, 69,167, 5, + 0, 0, 0, 0,200, 65,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,112,112,101, + 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,253, +143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 8, 69,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,168, 70,167, 5, 0, 0, 0, 0,104, 67,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,118,101,114,116, +101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,118,101,114,116, +101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149,253,143, 0,146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 70,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 72, 72,167, 5, + 0, 0, 0, 0, 8, 69,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116, +117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93,254, +143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72, 72,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,232, 73,167, 5, 0, 0, 0, 0,168, 70,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116, +105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116, +105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,254,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 73,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136, 75,167, 5, + 0, 0, 0, 0, 72, 72,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,121,109,109, +101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,253, +143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136, 75,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 40, 77,167, 5, 0, 0, 0, 0,232, 73,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104, +101,100,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104, +101,100,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,101,115,104, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,252,143, 0, 68, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 77,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,136, 75,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, + 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,101,115,104, + 32, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235,251, +143, 0,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 78,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,216, 81,167, 5, 0, 0, 0, 0,216, 57,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,128,178, 67, 0, 0, 90,195, 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,143, 0, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,167, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,216, 0, 12, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,237, 63, 4, 0, 0, 0, 0,200, 86,170, 5, 0, 0, 0, 0,200, 86,170, 5, + 0, 0, 0, 0, 56, 80,167, 5, 0, 0, 0, 0, 56, 80,167, 5, 0, 0, 0, 0,232, 50,127, 5, 0, 0, 0, 0, 56,210,129, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 80,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,238, 63, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97, +116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97, +116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, 0,105,116,109,111,100,101, 0,101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216, 81,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 72, 83,167, 5, + 0, 0, 0, 0,200, 78,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0, 96,158,196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 67, 0, 96,158,196, 0,128,142,195,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,213, 3, 0, 0, 0, 0, 0, 0, +162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,213, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, + 6, 0,180, 0,214, 3,163, 0,214, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 6, 0, 0, + 95, 6, 0, 0,167, 0, 0, 0,247, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,231, 63, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 83,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,216, 81,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0, + 95, 6, 0, 0,167, 0, 0, 0,247, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 5, 81, 3, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,230, 63, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200,229,129, 5, 0, 0, 0, 0,248,228,129, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 84,167, 5, + 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0,184, 84,167, 5, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142,187,242, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,142, 6,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 11,210, 76,190, 0, 0, 0, 0, 68,239,209, 62, + 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188, +166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63, 68,239,209, 62, + 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, + 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, 62, 95, 68, 65, 51,120,173,192,115,208,213, 64, 0, 0,128, 63,178,157,229, 62, + 53, 8, 67,191,116,169, 81,191,184,158, 81,191,117, 90,127, 63,194, 3,188, 62,158, 53,185, 62, 35, 44,185, 62,145,180,109,188, +174, 65,217, 63,218, 72,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 33,171,108, 65, 33,210,111, 65,100,240,191, 62, +110,116, 85, 63, 64,185, 70,188, 0, 0, 82,180, 51,239, 88,190, 2, 33,209, 61,210,167,241, 62, 0, 0, 88, 51,197,112,117,194, +178,208,216, 65,220,158, 5,194,231,251,159,192,221, 54,114, 66, 29,247,213,193, 58,221, 3, 66, 25, 4,160, 64, 68,239,209, 62, + 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188, +166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,178,157,229, 62, + 53, 8, 67,191,116,169, 81,191,184,158, 81,191,117, 90,127, 63,194, 3,188, 62,158, 53,185, 62, 35, 44,185, 62,145,180,109,188, +174, 65,217, 63,218, 72,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 33,171,108, 65, 33,210,111, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,191,178, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,191,178, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,154,191,178, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, + 56,186,224,190,237,203,148,190, 3,236,234,190, 33,210,111, 65, 33,210,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,134,210,162, 58, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 85,152,137, 66,113, 27,126, 66, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,120, 88,167, 5, 0, 0, 0, 0,175, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, + 1, 0, 3, 0, 8, 24,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0,184, 90,167, 5, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,104,170,167, 5, + 0, 0, 0, 0,104, 63,166, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97, +109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 92,167, 5, 0, 0, 0, 0,184, 97,167, 5, + 0, 0, 0, 0, 40, 98,167, 5, 0, 0, 0, 0,232,106,167, 5, 0, 0, 0, 0, 88,107,167, 5, 0, 0, 0, 0,120,163,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 92,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,120, 92,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,120, 92,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232, 92,167, 5, 0, 0, 0, 0, 8, 92,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232, 92,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88, 93,167, 5, 0, 0, 0, 0,120, 92,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 93,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,200, 93,167, 5, 0, 0, 0, 0,232, 92,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 93,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56, 94,167, 5, + 0, 0, 0, 0, 88, 93,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0, 56, 94,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168, 94,167, 5, 0, 0, 0, 0,200, 93,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168, 94,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24, 95,167, 5, 0, 0, 0, 0, 56, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 95,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0,168, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6,140, 1, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248, 95,167, 5, + 0, 0, 0, 0, 24, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,248, 95,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 96,167, 5, 0, 0, 0, 0,136, 95,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104, 96,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0,248, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 5,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 72, 97,167, 5, 0, 0, 0, 0,104, 96,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5,234, 3, + 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 97,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184, 97,167, 5, + 0, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,184, 97,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 97,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 98,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152, 98,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 92,167, 5, + 0, 0, 0, 0,232, 92,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 98,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8, 99,167, 5, 0, 0, 0, 0, 40, 98,167, 5, 0, 0, 0, 0,120, 92,167, 5, + 0, 0, 0, 0,200, 93,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 99,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120, 99,167, 5, 0, 0, 0, 0,152, 98,167, 5, 0, 0, 0, 0,232, 92,167, 5, + 0, 0, 0, 0, 56, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 99,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232, 99,167, 5, 0, 0, 0, 0, 8, 99,167, 5, 0, 0, 0, 0,200, 93,167, 5, + 0, 0, 0, 0, 56, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 99,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,100,167, 5, 0, 0, 0, 0,120, 99,167, 5, 0, 0, 0, 0,200, 93,167, 5, + 0, 0, 0, 0,168, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,100,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,100,167, 5, 0, 0, 0, 0,232, 99,167, 5, 0, 0, 0, 0,168, 94,167, 5, + 0, 0, 0, 0, 24, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,100,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,101,167, 5, 0, 0, 0, 0, 88,100,167, 5, 0, 0, 0, 0, 88, 93,167, 5, + 0, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,101,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168,101,167, 5, 0, 0, 0, 0,200,100,167, 5, 0, 0, 0, 0, 24, 95,167, 5, + 0, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,101,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24,102,167, 5, 0, 0, 0, 0, 56,101,167, 5, 0, 0, 0, 0, 8, 92,167, 5, + 0, 0, 0, 0,168, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,102,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136,102,167, 5, 0, 0, 0, 0,168,101,167, 5, 0, 0, 0, 0, 8, 92,167, 5, + 0, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,102,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248,102,167, 5, 0, 0, 0, 0, 24,102,167, 5, 0, 0, 0, 0, 56, 94,167, 5, + 0, 0, 0, 0,248, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,102,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104,103,167, 5, 0, 0, 0, 0,136,102,167, 5, 0, 0, 0, 0, 88, 93,167, 5, + 0, 0, 0, 0,248, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,103,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,103,167, 5, 0, 0, 0, 0,248,102,167, 5, 0, 0, 0, 0, 24, 95,167, 5, + 0, 0, 0, 0,248, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,103,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,104,167, 5, 0, 0, 0, 0,104,103,167, 5, 0, 0, 0, 0,104, 96,167, 5, + 0, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,104,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,104,167, 5, 0, 0, 0, 0,216,103,167, 5, 0, 0, 0, 0, 56, 94,167, 5, + 0, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,104,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,105,167, 5, 0, 0, 0, 0, 72,104,167, 5, 0, 0, 0, 0,248, 95,167, 5, + 0, 0, 0, 0,104, 96,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,105,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,105,167, 5, 0, 0, 0, 0,184,104,167, 5, 0, 0, 0, 0,168, 94,167, 5, + 0, 0, 0, 0, 72, 97,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,105,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,106,167, 5, 0, 0, 0, 0, 40,105,167, 5, 0, 0, 0, 0,104, 96,167, 5, + 0, 0, 0, 0, 72, 97,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,106,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,106,167, 5, 0, 0, 0, 0,152,105,167, 5, 0, 0, 0, 0,200, 93,167, 5, + 0, 0, 0, 0,184, 97,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,106,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,106,167, 5, 0, 0, 0, 0, 8,106,167, 5, 0, 0, 0, 0,216, 96,167, 5, + 0, 0, 0, 0,184, 97,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,106,167, 5, + 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,106,167, 5, 0, 0, 0, 0, 72, 97,167, 5, + 0, 0, 0, 0,184, 97,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88,107,167, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 40,111,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 93,167, 5, + 0, 0, 0, 0,120, 92,167, 5, 0, 0, 0, 0,232, 92,167, 5, 0, 0, 0, 0, 56, 94,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, 27, 0, 1, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,169,167, 5, 0, 0, 0, 0,216,169,167, 5, 0, 0, 0, 0, 72,108,167, 5, + 0, 0, 0, 0,184,109,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,108,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,184,109,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,127, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,109,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,108,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,238, 68, 0, 0, 0, 0, 0, 0, 0, 64,112, 7, 0, 0,129, 7, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, + 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40,111,167, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0,184,135,167, 5, 0, 0, 0, 0, 88,107,167, 5, 0, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0, 24, 95,167, 5, + 0, 0, 0, 0,248, 95,167, 5, 0, 0, 0, 0, 88, 93,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, 4, 4, 94, 1,140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,120,134,167, 5, 0, 0, 0, 0,120,134,167, 5, 0, 0, 0, 0, 24,112,167, 5, 0, 0, 0, 0,136,113,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,112,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136,113,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0,175, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,174, 67, + 0, 0,200, 65, 0,128,174, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0, 94, 1, 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0,114, 1, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,113,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24,112,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67, 0, 0, 61,196, 0, 0, 0, 0, 0, 0, 0, 0, +255,127,166, 67,255,255,184,195, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, + 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, + 6, 0, 94, 1,114, 1, 77, 1,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0, +126, 7, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,114, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,114,167, 5, 0, 0, 0, 0,216,132,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,114,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152,116,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, + 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, + 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116, +101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, + 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,116,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,118,167, 5, 0, 0, 0, 0,248,114,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,118,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,119,167, 5, + 0, 0, 0, 0,152,116,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101, +114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, + 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216,119,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,121,167, 5, 0, 0, 0, 0, 56,118,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,121,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24,123,167, 5, + 0, 0, 0, 0,216,119,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, + 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, + 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24,123,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184,124,167, 5, 0, 0, 0, 0,120,121,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,124,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88,126,167, 5, + 0, 0, 0, 0, 24,123,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, +105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254, + 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88,126,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248,127,167, 5, 0, 0, 0, 0,184,124,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, +101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,127,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152,129,167, 5, + 0, 0, 0, 0, 88,126,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, + 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253, + 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,129,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,131,167, 5, 0, 0, 0, 0,248,127,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,131,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,132,167, 5, + 0, 0, 0, 0,152,129,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, + 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112, +117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253, + 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216,132,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,131,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120,134,167, 5, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,135,167, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 40,143,167, 5, 0, 0, 0, 0, 40,111,167, 5, 0, 0, 0, 0, 8, 92,167, 5, + 0, 0, 0, 0,168, 94,167, 5, 0, 0, 0, 0, 24, 95,167, 5, 0, 0, 0, 0,136, 95,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, 17, 17, 32, 6,140, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,142,167, 5, 0, 0, 0, 0,152,142,167, 5, 0, 0, 0, 0,168,136,167, 5, + 0, 0, 0, 0, 40,141,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,136,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 24,138,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 67, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0,196, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,224,195, 68, 0, 0,200, 65, 0,224,195, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 32, 6, 26, 0, 32, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,138,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 40,141,167, 5, 0, 0, 0, 0,168,136,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,185,195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,185,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, +113, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, +113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,114, 1,203, 0,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,220, 0,114, 1, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,139,167, 5, + 0, 0, 0, 0,136,139,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136,139,167, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,196,255,203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0, 40,141,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,138,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67, 0, 80, 31,195, 0,234,179, 68,224,198,182,194, +184,177,165, 67, 51, 5, 0, 0, 68, 5, 0, 0, 18, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 50, 5, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 50, 5, 0, 0, 18, 0, 0, 0,113, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, + 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 68, 5,114, 1, 51, 5, + 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0, +139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 5,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 72, 0, 0, 0,152,142,167, 5, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0, 40,143,167, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,232,149,167, 5, 0, 0, 0, 0,184,135,167, 5, + 0, 0, 0, 0,104, 96,167, 5, 0, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0, 56, 94,167, 5, 0, 0, 0, 0,248, 95,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 5, 0, 0,126, 7, 0, 0,141, 1, 0, 0,233, 3, 0, 0, 9, 9, 62, 2, + 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,146,167, 5, 0, 0, 0, 0,248,146,167, 5, + 0, 0, 0, 0, 24,144,167, 5, 0, 0, 0, 0,136,145,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,144,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136,145,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,230, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 15, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 15, 68, 0, 0,200, 65, 0, 64, 15, 68, 0, 0,200, 65, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 62, 2, 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 5, 0, 0,126, 7, 0, 0,141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,145,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,144,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68, 0, 0, 0, 0, 86, 26, 3, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61, 2, 0, 0, 0, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, + 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2, 67, 2, 62, 2, 67, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 5, 0, 0,126, 7, 0, 0,167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 2, 0, 0,248,146,167, 5, + 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232,149,167, 5, 0, 0, 0, 0,215, 0, 0, 0, + 1, 0, 0, 0,120,163,167, 5, 0, 0, 0, 0, 40,143,167, 5, 0, 0, 0, 0, 72, 97,167, 5, 0, 0, 0, 0,184, 97,167, 5, + 0, 0, 0, 0,216, 96,167, 5, 0, 0, 0, 0,104, 96,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, + 63, 5, 0, 0,141, 1, 0, 0,233, 3, 0, 0, 1, 1,251, 3, 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200,161,167, 5, 0, 0, 0, 0,200,161,167, 5, 0, 0, 0, 0,216,150,167, 5, 0, 0, 0, 0,152,156,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,150,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 72,152,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0,192,126, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,126, 68, + 0, 0,200, 65, 0,128,126, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, + 10, 0,251, 3, 26, 0,251, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, + 63, 5, 0, 0,141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 3, 26, 0, + 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,152,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184,153,167, 5, + 0, 0, 0, 0,216,150,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, + 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, + 69, 1, 0, 0,167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 67, 2, + 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,153,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40,155,167, 5, + 0, 0, 0, 0, 72,152,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0, +231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, + 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, + 63, 5, 0, 0,167, 1, 0, 0,167, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,155,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,156,167, 5, + 0, 0, 0, 0,184,153,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 67, 0, 0,109,196, 0,128,145,195,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,144, 2, 0, 0, 0, 0, 0, 0, +162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,144, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, + 6, 0,180, 0,145, 2,163, 0,145, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 5, 0, 0, + 63, 5, 0, 0,167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,156,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40,155,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, + 63, 5, 0, 0,167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 3, 67, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,158,167, 5, + 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0, 8,158,167, 5, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0,190, 35, 30, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 40,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,190, 35, 30, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 40,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,149, 53,207, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,107, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,249,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,190, 35, 30, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 40,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 3,116, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 3,116, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,207, 3,116, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149, 53,207, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,221, 57, 80, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 65, 0, 0, 5, 0,251,251, 0, 0, 92, 62, 55, 63, 56,186,224,190, +237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,180, 66, 0, 0,180, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,200,161,167, 5, 0, 0, 0, 0,175, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, + 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120,163,167, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232,149,167, 5, 0, 0, 0, 0,168, 94,167, 5, 0, 0, 0, 0,200, 93,167, 5, 0, 0, 0, 0,184, 97,167, 5, + 0, 0, 0, 0, 72, 97,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0,141, 1, 0, 0, +233, 3, 0, 0, 3, 3, 68, 1, 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,167,167, 5, + 0, 0, 0, 0, 72,167,167, 5, 0, 0, 0, 0,104,164,167, 5, 0, 0, 0, 0,216,165,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,104,164,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,216,165,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,162, 67, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,161, 67, 0, 0,200, 65, 0,128,161, 67, + 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 68, 1, 26, 0, 68, 1, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0,141, 1, 0, 0, +166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,216,165,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,164,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,153, 67, 0, 64, 12,196, + 0, 0, 0, 0, 51, 1, 0, 0, 68, 1, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 50, 1, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 12, 4, 6, 0, 68, 1, 67, 2, 51, 1, + 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0,167, 1, 0, 0, +233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 1, 0, 0, 72,167,167, 5, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 82,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,120, 82,137, 5, 0, 0, 0, 0,238, 0, 0, 0, + 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,168,168,167, 5, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,168,168,167, 5, + 0, 0, 0, 0,237, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 19, 0, 0, 0, + 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 21, 0, 1, 0, + 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,210,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0,184,219,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,184, 17,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0,248,232,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8,255,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 88,226,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,205,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,216,204,168, 5, 0, 0, 0, 0, 21, 0, 0, 0, + 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0,104,170,167, 5, 0, 0, 0, 0,211, 0, 0, 0, + 1, 0, 0, 0, 72,242,167, 5, 0, 0, 0, 0,184, 90,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 82, 77,111,116,105,111,110, 32, 84,114, 97, 99,107,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,171,167, 5, + 0, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0,216,177,167, 5, 0, 0, 0, 0, 72,185,167, 5, 0, 0, 0, 0,184,185,167, 5, + 0, 0, 0, 0,248,225,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,171,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 40,172,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,172,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,152,172,167, 5, + 0, 0, 0, 0,184,171,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 4, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,152,172,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 8,173,167, 5, 0, 0, 0, 0, 40,172,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 98, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,173,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0,152,172,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0, 8,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88,174,167, 5, + 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 64, 4, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0, 88,174,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200,174,167, 5, 0, 0, 0, 0,232,173,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,174,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0, 88,174,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 5, 64, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0,200,174,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24,176,167, 5, + 0, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6,108, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0,168,175,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,176,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62, 6,120, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2,120, 3, + 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2, 64, 4, 1, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,216,177,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,178,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40,172,167, 5, 0, 0, 0, 0,152,172,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 72,178,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,178,167, 5, 0, 0, 0, 0,216,177,167, 5, + 0, 0, 0, 0, 40,172,167, 5, 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,184,178,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,179,167, 5, 0, 0, 0, 0, 72,178,167, 5, + 0, 0, 0, 0,152,172,167, 5, 0, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 40,179,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,179,167, 5, 0, 0, 0, 0,184,178,167, 5, + 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,152,179,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,180,167, 5, 0, 0, 0, 0, 40,179,167, 5, + 0, 0, 0, 0,184,171,167, 5, 0, 0, 0, 0, 8,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 8,180,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,180,167, 5, 0, 0, 0, 0,152,179,167, 5, + 0, 0, 0, 0,184,171,167, 5, 0, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,120,180,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,180,167, 5, 0, 0, 0, 0, 8,180,167, 5, + 0, 0, 0, 0, 8,173,167, 5, 0, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,232,180,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,181,167, 5, 0, 0, 0, 0,120,180,167, 5, + 0, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 88,181,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,181,167, 5, 0, 0, 0, 0,232,180,167, 5, + 0, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,200,181,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,182,167, 5, 0, 0, 0, 0, 88,181,167, 5, + 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 56,182,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168,182,167, 5, 0, 0, 0, 0,200,181,167, 5, + 0, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,168,182,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24,183,167, 5, 0, 0, 0, 0, 56,182,167, 5, + 0, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 24,183,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136,183,167, 5, 0, 0, 0, 0,168,182,167, 5, + 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,136,183,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248,183,167, 5, 0, 0, 0, 0, 24,183,167, 5, + 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,248,183,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104,184,167, 5, 0, 0, 0, 0,136,183,167, 5, + 0, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,104,184,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,184,167, 5, 0, 0, 0, 0,248,183,167, 5, + 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,216,184,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,185,167, 5, 0, 0, 0, 0,104,184,167, 5, + 0, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 72,185,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,184,167, 5, + 0, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0,184,185,167, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,136,189,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0, 40,172,167, 5, 0, 0, 0, 0,152,172,167, 5, 0, 0, 0, 0,232,173,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 65, 4, 0, 0, 98, 4, 0, 0, 7, 7, 63, 6, + 34, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,241,167, 5, 0, 0, 0, 0,184,241,167, 5, + 0, 0, 0, 0,168,186,167, 5, 0, 0, 0, 0, 24,188,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,186,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,188,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,163, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,199, 68, 0, 0,200, 65, 0,192,199, 68, 0, 0,200, 65, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 63, 6, 26, 0, 63, 6, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 65, 4, 0, 0, 90, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,188,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,186,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,192,239, 68, 0, 0, 0, 0, 0, 0,200, 65, 0, 0, 0, 0, 0,192,197, 68, 0, 0,128, 64, 0, 0, 64, 65, 46, 6, 0, 0, + 63, 6, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, + 45, 6, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0, 63, 6, 8, 0, 46, 6, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 91, 4, 0, 0, 98, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136,189,167, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,120,194,167, 5, 0, 0, 0, 0,184,185,167, 5, 0, 0, 0, 0,184,171,167, 5, + 0, 0, 0, 0, 56,175,167, 5, 0, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0, 8,173,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, 15, 15, 63, 6,108, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,193,167, 5, 0, 0, 0, 0, 88,193,167, 5, 0, 0, 0, 0,120,190,167, 5, + 0, 0, 0, 0,232,191,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,190,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,232,191,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,192,199, 68, 0, 0,200, 65, 0,192,199, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 63, 6, 26, 0, 63, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 63, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,191,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,190,167, 5, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, + 0, 0, 72, 66, 88,218,103,194, 40,147,141, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 18, 0, 0, 0, + 81, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, + 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 63, 6, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 26, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 63, 6, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, 88,193,167, 5, 0, 0, 0, 0,191, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120,194,167, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 56,210,167, 5, 0, 0, 0, 0,136,189,167, 5, 0, 0, 0, 0, 56,175,167, 5, + 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0,136,176,167, 5, 0, 0, 0, 0,168,175,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0,109, 0, 0, 0,119, 3, 0, 0, 20, 20, 63, 6, 11, 3, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,208,167, 5, 0, 0, 0, 0,184,208,167, 5, 0, 0, 0, 0,104,195,167, 5, + 0, 0, 0, 0, 72,207,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,195,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,216,196,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 19, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,192,199, 68, 0, 0,200, 65, 0,192,199, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 0, 0, 10, 0, 63, 6, 26, 0, 63, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0,109, 0, 0, 0,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 63, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,196,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 72,198,167, 5, 0, 0, 0, 0,104,195,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 64, 30,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 30,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, +120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, +120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,121, 2,143, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,255, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,160, 0,121, 2, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,198,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 88,201,167, 5, 0, 0, 0, 0,216,196,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0,240,194, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,240,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, +119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, +119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,135, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,199,167, 5, + 0, 0, 0, 0,184,199,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,199,167, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 78,101,119, 32, 83, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,216,255,143, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0, 88,201,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,104,204,167, 5, 0, 0, 0, 0, 72,198,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 64, 60,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 60,196, + 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,240, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,240, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,241, 2,143, 0, +241, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 5, 0, 0, 62, 6, 0, 0,135, 0, 0, 0, +119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,241, 2, 0, 0, 4, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,202,167, 5, 0, 0, 0, 0,200,202,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,200,202,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, + 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, + 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105, +108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,255,143, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,204,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,216,205,167, 5, 0, 0, 0, 0, 88,201,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64,110,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, 0,192,105,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 18, 0, 0, 0, +184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 0, 0, 0, + 2, 0, 3, 3, 0, 0, 2, 0, 6, 0,160, 0,185, 3,160, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,160, 0, 0, 0,160, 0, 0, 0,135, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,205,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 72,207,167, 5, 0, 0, 0, 0,104,204,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, + 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0,124,146, 72,255,255,127,127, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,160, 0, 0, 0,160, 0, 0, 0,135, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,207,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,205,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128,255, 0, 0,128,127, 0, 0,128,255, 0, 0,128,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 0, 0, 0, 0, 0, 0, +241, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, + 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,255, 4,241, 2,255, 4,241, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,160, 0, 0, 0,158, 5, 0, 0,135, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 4,241, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,184,208,167, 5, 0, 0, 0, 0,197, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17,200, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0, 56,210,167, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,248,225,167, 5, 0, 0, 0, 0,120,194,167, 5, + 0, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0,104,177,167, 5, 0, 0, 0, 0,232,173,167, 5, 0, 0, 0, 0,136,176,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, 62, 6, 0, 0,121, 3, 0, 0, 63, 4, 0, 0, 20, 20,110, 3, +199, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,224,167, 5, 0, 0, 0, 0,120,224,167, 5, + 0, 0, 0, 0, 40,211,167, 5, 0, 0, 0, 0, 8,223,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,211,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,212,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,212, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 91, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +109, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 91, 68, 0, 0,200, 65, 0, 64, 91, 68, 0, 0,200, 65, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 0, 0, 10, 0,110, 3, 26, 0,110, 3, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, 62, 6, 0, 0,121, 3, 0, 0,146, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,212,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 8,214,167, 5, 0, 0, 0, 0, 40,211,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,128,178, 67, 0, 0, 84,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 84,194, 0, 0, 0, 0,143, 0, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 53, 0,143, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,209, 2, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,214,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,217,167, 5, 0, 0, 0, 0,152,212,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,128,178, 67, 0, 0,240,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,240,194, 0, 0, 0, 0,143, 0, 0, 0, +160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,209, 2, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,120,215,167, 5, 0, 0, 0, 0,120,215,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,215,167, 5, + 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,101,119, 32, 83, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,143, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,217,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40,220,167, 5, + 0, 0, 0, 0, 8,214,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0, 45,195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 67, 0, 0, 45,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, + 6, 0,160, 0,173, 0,143, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, +209, 2, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,218,167, 5, 0, 0, 0, 0,136,218,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136,218,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, + 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, + 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97, +115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,255, +143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,220,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,221,167, 5, 0, 0, 0, 0, 24,217,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 67, 0, 0, 45,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 27,195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +159, 0, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,160, 0,173, 0,160, 0,155, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,112, 3, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,173, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,221,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 8,223,167, 5, 0, 0, 0, 0, 40,220,167, 5, 0, 0, 0, 0, 0, 0, 32,193, + 0,128, 91, 68,171,170,132,194, 0, 0, 0, 0, 0, 0, 32,193, 0,128, 91, 68, 0, 0, 27,195, 0, 0, 0, 0,189, 2, 0, 0, +206, 2, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0,188, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +188, 2, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72,255,255,127,127, 10,215, 35, 60, + 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 16, 0, 2, 4, 4, 0,206, 2,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113, 3, 0, 0, 62, 6, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,206, 2,173, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,223,167, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,221,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,255, 0, 0,128,127, 0, 0,128,255, 0, 0,128,127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 2, 0, 0, 0, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, + 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 10, 0, 46, 2,173, 0, 46, 2,173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,120,224,167, 5, + 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,200, 0, 0, 0, 0, 2, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248,225,167, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56,210,167, 5, 0, 0, 0, 0, 24,176,167, 5, 0, 0, 0, 0,120,173,167, 5, 0, 0, 0, 0,104,177,167, 5, + 0, 0, 0, 0,248,176,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0,121, 3, 0, 0, + 63, 4, 0, 0, 20, 20,208, 2,199, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,240,167, 5, + 0, 0, 0, 0, 56,240,167, 5, 0, 0, 0, 0,232,226,167, 5, 0, 0, 0, 0,200,238,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,232,226,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 88,228,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 52, 68, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 51, 68, 0, 0,200, 65, 0,192, 51, 68, + 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 0, 0, 10, 0,208, 2, 26, 0,208, 2, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0,121, 3, 0, 0, +146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0, 88,228,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200,229,167, 5, 0, 0, 0, 0,232,226,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0, 84,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 84,194, + 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 53, 0,143, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, + 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 5, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,200,229,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,216,232,167, 5, 0, 0, 0, 0, 88,228,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0,240,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,240,194, + 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,120, 0,143, 0, +120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, + 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,231,167, 5, 0, 0, 0, 0, 56,231,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0, 56,231,167, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, + 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, + 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,101,119, 32, 83, 99,114,101,101,110, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,143, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,232,167, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,232,235,167, 5, 0, 0, 0, 0,200,229,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0, 45,195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 45,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, +172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, +172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,173, 0,143, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,234,167, 5, + 0, 0, 0, 0, 72,234,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,234,167, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,232,255,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,232,235,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 88,237,167, 5, 0, 0, 0, 0,216,232,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64,110,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, 0,192,105,196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 18, 0, 0, 0,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 0, 0, 0, 2, 0, 3, 3, 0, 0, 2, 0, 6, 0,160, 0,185, 3,160, 0, +167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, + 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0, 88,237,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200,238,167, 5, 0, 0, 0, 0,232,235,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, + 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 18, 0, 0, 0,207, 2, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 18, 0, 0, 0,207, 2, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0,124,146, 72, +255,255,127,127, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,208, 2,173, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0,147, 3, 0, 0, + 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2,173, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0,200,238,167, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,237,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,255, 0, 0,128,127, 0, 0,128,255, + 0, 0,128,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 10, 0,144, 1,173, 0,144, 1, +173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 1, 0, 0, 56,240,167, 5, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,200, 0, 0, 0, 0, 1, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0, 72,242,167, 5, 0, 0, 0, 0,211, 0, 0, 0, + 1, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0,104,170,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,243,167, 5, + 0, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0,184,249,167, 5, 0, 0, 0, 0,232, 2,168, 5, 0, 0, 0, 0, 88, 3,168, 5, + 0, 0, 0, 0,184, 57,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152,243,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 8,244,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,244,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,120,244,167, 5, + 0, 0, 0, 0,152,243,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,120,244,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232,244,167, 5, 0, 0, 0, 0, 8,244,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,244,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0,120,244,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,200,245,167, 5, 0, 0, 0, 0,232,244,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 3, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,245,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,246,167, 5, + 0, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,168, 3, 0, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0,200,245,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,168, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,246,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 1, + 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,247,167, 5, + 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,104, 1, 1, 0, 0, 0, 68, 65, 84, 65, + 32, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0,136,247,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 2,104, 1, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,248,167, 5, + 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 5,236, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0,212, 0, 0, 0, + 1, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,236, 2, + 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 2,168, 3, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,184,249,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,250,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8,244,167, 5, 0, 0, 0, 0,120,244,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 40,250,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,250,167, 5, 0, 0, 0, 0,184,249,167, 5, + 0, 0, 0, 0, 8,244,167, 5, 0, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,152,250,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,251,167, 5, 0, 0, 0, 0, 40,250,167, 5, + 0, 0, 0, 0,120,244,167, 5, 0, 0, 0, 0,200,245,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 8,251,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,251,167, 5, 0, 0, 0, 0,152,250,167, 5, + 0, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0,200,245,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,120,251,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,251,167, 5, 0, 0, 0, 0, 8,251,167, 5, + 0, 0, 0, 0,200,245,167, 5, 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,232,251,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,252,167, 5, 0, 0, 0, 0,120,251,167, 5, + 0, 0, 0, 0,232,244,167, 5, 0, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 88,252,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,252,167, 5, 0, 0, 0, 0,232,251,167, 5, + 0, 0, 0, 0,152,243,167, 5, 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,200,252,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,253,167, 5, 0, 0, 0, 0, 88,252,167, 5, + 0, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 56,253,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168,253,167, 5, 0, 0, 0, 0,200,252,167, 5, + 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,168,253,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24,254,167, 5, 0, 0, 0, 0, 56,253,167, 5, + 0, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 24,254,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136,254,167, 5, 0, 0, 0, 0,168,253,167, 5, + 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,136,254,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248,254,167, 5, 0, 0, 0, 0, 24,254,167, 5, + 0, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,248,254,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104,255,167, 5, 0, 0, 0, 0,136,254,167, 5, + 0, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,104,255,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,255,167, 5, 0, 0, 0, 0,248,254,167, 5, + 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,216,255,167, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72, 0,168, 5, 0, 0, 0, 0,104,255,167, 5, + 0, 0, 0, 0,200,245,167, 5, 0, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 72, 0,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184, 0,168, 5, 0, 0, 0, 0,216,255,167, 5, + 0, 0, 0, 0,232,244,167, 5, 0, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,184, 0,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40, 1,168, 5, 0, 0, 0, 0, 72, 0,168, 5, + 0, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 40, 1,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152, 1,168, 5, 0, 0, 0, 0,184, 0,168, 5, + 0, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,152, 1,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8, 2,168, 5, 0, 0, 0, 0, 40, 1,168, 5, + 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0, 8, 2,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120, 2,168, 5, 0, 0, 0, 0,152, 1,168, 5, + 0, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,120, 2,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232, 2,168, 5, 0, 0, 0, 0, 8, 2,168, 5, + 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,232, 2,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 2,168, 5, + 0, 0, 0, 0,152,243,167, 5, 0, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0, 88, 3,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 40, 7,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88,245,167, 5, 0, 0, 0, 0, 8,244,167, 5, 0, 0, 0, 0,120,244,167, 5, 0, 0, 0, 0,200,245,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,169, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, + 93, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 64,168, 5, 0, 0, 0, 0,120, 64,168, 5, + 0, 0, 0, 0, 72, 4,168, 5, 0, 0, 0, 0,184, 5,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 4,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184, 5,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,236, 3, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 7, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 5,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 4,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0,192,239, 68, 0, 0, 0, 0, 0, 0, 28, 66, 0, 0, 0, 0, 0,192,237, 68, 0, 0, 0, 0, 0, 0,134, 66,110, 7, 0, 0, +127, 7, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +109, 7, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,127, 7, 67, 0,110, 7, 67, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,169, 3, 0, 0,235, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 7, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40, 7,168, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,184, 31,168, 5, 0, 0, 0, 0, 88, 3,168, 5, 0, 0, 0, 0,168,246,167, 5, + 0, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0,232,244,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,235, 2, 0, 0, 4, 4,142, 1,236, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 30,168, 5, 0, 0, 0, 0,120, 30,168, 5, 0, 0, 0, 0, 24, 8,168, 5, + 0, 0, 0, 0,136, 9,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 8,168, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,136, 9,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,128,198, 67, 0, 0,200, 65, 0,128,198, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,142, 1, 26, 0,142, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0,210, 2, 0, 0,235, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,142, 1, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 9,168, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,198, 67, 0, 0, 61,196, + 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254,127, 52,196, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, +209, 2, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, +209, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, + 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1,210, 2,125, 1,210, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,142, 1,210, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 10,168, 5, + 0, 0, 0, 0,216, 28,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248, 10,168, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,152, 12,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,152, 12,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56, 14,168, 5, 0, 0, 0, 0,248, 10,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101, +110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101, +110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 14,168, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,216, 15,168, 5, 0, 0, 0, 0,152, 12,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,111,255,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,216, 15,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120, 17,168, 5, 0, 0, 0, 0, 56, 14,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105, +109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105, +109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 17,168, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 24, 19,168, 5, 0, 0, 0, 0,216, 15,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0, 24, 19,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184, 20,168, 5, 0, 0, 0, 0,120, 17,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111, +116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111, +116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105, +111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,124, 1, 0, 0, 20, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184, 20,168, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0, 88, 22,168, 5, 0, 0, 0, 0, 24, 19,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10,254,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0, 88, 22,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248, 23,168, 5, 0, 0, 0, 0,184, 20,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101, +114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101, +114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253,124, 1, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248, 23,168, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,152, 25,168, 5, 0, 0, 0, 0, 88, 22,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,218,253,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,152, 25,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56, 27,168, 5, 0, 0, 0, 0,248, 23,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, + 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, + 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253,124, 1, 0, 0, 20, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 27,168, 5, 0, 0, 0, 0,214, 0, 0, 0, + 1, 0, 0, 0,216, 28,168, 5, 0, 0, 0, 0,152, 25,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40,253,124, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 88, 1, 0, 0,216, 28,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 27,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97, +107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97, +107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253,124, 1, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 30,168, 5, 0, 0, 0, 0,180, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0,184, 31,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 72, 45,168, 5, 0, 0, 0, 0, 40, 7,168, 5, + 0, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0,136,247,167, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,105, 1, 0, 0,167, 3, 0, 0, 1, 1,247, 2, + 63, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 43,168, 5, 0, 0, 0, 0,152, 43,168, 5, + 0, 0, 0, 0,168, 32,168, 5, 0, 0, 0, 0,104, 38,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 32,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24, 34,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +246, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128, 61, 68, 0, 0,200, 65, 0,128, 61, 68, 0, 0,200, 65, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,247, 2, 26, 0,247, 2, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,105, 1, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 34,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136, 35,168, 5, 0, 0, 0, 0,168, 32,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0, +160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,249, 2, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 37, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 35,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,248, 36,168, 5, 0, 0, 0, 0, 24, 34,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0, +160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,131, 1, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 36,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,104, 38,168, 5, 0, 0, 0, 0,136, 35,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0, +180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, +162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 38,168, 5, + 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 36,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 39,168, 5, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0,216, 39,168, 5, + 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74,141,193, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, + 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, +143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190, +142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65, +111,121,173,192,248,209,213, 64, 0, 0,128, 63,178,157,229, 62, 30,132, 27,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, +166,235,149, 62, 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,212, 60,173, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, + 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,160, 32,182,252, 5,136,190, + 43, 33, 3, 62,235,135, 23, 63, 0, 0, 96, 53,215,104, 25,196,133,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68, +158, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, +143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,178,157,229, 62, 30,132, 27,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, +166,235,149, 62, 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,212, 60,173, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, + 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 86, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 86, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 86, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65, +214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,107,227, 29, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 30, 33, 12, 66, 86,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 96, 1, 0, 0,152, 43,168, 5, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, +205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63, + 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 72, 45,168, 5, + 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 88, 51,168, 5, 0, 0, 0, 0,184, 31,168, 5, 0, 0, 0, 0,152,243,167, 5, + 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0,136,247,167, 5, 0, 0, 0, 0,168,246,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0,103, 1, 0, 0, 18, 18,240, 5,104, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 49,168, 5, 0, 0, 0, 0,136, 49,168, 5, 0, 0, 0, 0, 56, 46,168, 5, + 0, 0, 0, 0,168, 47,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 46,168, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0,168, 47,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67, 0, 0, 0, 0, + 0, 0,208, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,240, 5, 26, 0,240, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 47,168, 5, 0, 0, 0, 0,216, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 46,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, + 0, 0, 51, 67, 0, 0, 0, 0, 0,224,187, 68, 0, 0, 0, 0, 0, 0,167, 67,223, 5, 0, 0,240, 5, 0, 0, 0, 0, 0, 0, + 77, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 0, 0, 0, 0, + 77, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, + 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,240, 5, 78, 1,223, 5, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 26, 0, 0, 0,103, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 5, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 49,168, 5, 0, 0, 0, 0,194, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,220,132, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0, 88,220,132, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 1, 0, 0,136, 49,168, 5, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 49,168, 5, 0, 0, 0, 0, 24, 49,168, 5, 0, 0, 0, 0, + 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +112,121,116,104,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 4, 0, 0, 8, 4, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88, 51,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, +184, 57,168, 5, 0, 0, 0, 0, 72, 45,168, 5, 0, 0, 0, 0,104,248,167, 5, 0, 0, 0, 0, 56,246,167, 5, 0, 0, 0, 0, +200,245,167, 5, 0, 0, 0, 0,216,248,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0, +237, 2, 0, 0,167, 3, 0, 0, 3, 3,142, 1,187, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 55,168, 5, 0, 0, 0, 0, 40, 55,168, 5, 0, 0, 0, 0, 72, 52,168, 5, 0, 0, 0, 0,184, 53,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 72, 52,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184, 53,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,198, 67, 0, 0,200, 65, + 0,128,198, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,142, 1, + 26, 0,142, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0, +237, 2, 0, 0, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,184, 53,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 52,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,190, 67, + 0, 0, 15,195, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 12, 4, 6, 0,142, 1, +161, 0,125, 1,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0, + 7, 3, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 1, 0, 0, 40, 55,168, 5, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 85, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 52,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, 24, 85, 27, 7, 0, 0, 0, 0, -238, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,120, 85, 27, 7, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, -120, 85, 27, 7, 0, 0, 0, 0,237, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, - 19, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, - 21, 0, 1, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,128, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0,152,137, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 56,192, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0,120,151, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,136,173, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0,216,144, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,104,123, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,122, 30, 7, 0, 0, 0, 0, - 21, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168, 86, 27, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0, 56,100, 27, 7, 0, 0, 0, 0,232, 79, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0, -184, 31, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0,216, 30, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 1, 0, 0, 23, 4, 0, 0, 89, 0, 0, 0,194, 2, 0, 0, 1, 1, 87, 2,106, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136, 98, 27, 7, 0, 0, 0, 0,136, 98, 27, 7, 0, 0, 0, 0,152, 87, 27, 7, 0, 0, 0, 0, - 88, 93, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 87, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 8, 89, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,192, 21, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128, 21, 68, 0, 0,200, 65, 0,128, 21, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0, 87, 2, 26, 0, 87, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 1, 0, 0, 23, 4, 0, 0, 89, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,216, 52,137, 5, 0, 0, 0, 0, +238, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,136, 56,168, 5, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, +136, 56,168, 5, 0, 0, 0, 0,237, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, + 19, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, + 21, 0, 1, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,210,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,184,219,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,184, 17,169, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,248,232,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8,255,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 88,226,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,205,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,216,204,168, 5, 0, 0, 0, 0, + 21, 0, 0, 0, 1, 0, 1, 0,120,184,168, 5, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184, 57,168, 5, 0, 0, 0, 0, +215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 51,168, 5, 0, 0, 0, 0, 24,247,167, 5, 0, 0, 0, 0, + 88,245,167, 5, 0, 0, 0, 0, 72,249,167, 5, 0, 0, 0, 0,248,247,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,247, 2, 0, 0,105, 1, 0, 0,167, 3, 0, 0, 9, 9,248, 2, 63, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,136, 61,168, 5, 0, 0, 0, 0,136, 61,168, 5, 0, 0, 0, 0,168, 58,168, 5, 0, 0, 0, 0, + 24, 60,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 58,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 24, 60,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 62, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0,192, 61, 68, 0, 0,200, 65, 0,192, 61, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 0, 10, 0,248, 2, 26, 0,248, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,247, 2, 0, 0,105, 1, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 89, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -120, 90, 27, 7, 0, 0, 0, 0,152, 87, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 1, 0, 0,193, 1, 0, 0,115, 0, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 80, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 60,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,168, 58,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68, +248,150, 23, 68, 8, 41,100, 68, 46,224, 62, 67,233, 15,206, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, + 0, 0, 0, 4, 10, 0,248, 2, 37, 2,248, 2, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,247, 2, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248, 2, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120, 90, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -232, 91, 27, 7, 0, 0, 0, 0, 8, 89, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, - 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 1, 0, 0,193, 1, 0, 0,115, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 2, 0, 0,136, 61,168, 5, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,205,204,204, 61,231, 1, 0, 0,243, 1, 0, 0,122, 1, 0, 0,124, 1, 0, 0,231, 1, 0, 0,243, 1, 0, 0, + 4, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 91, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 88, 93, 27, 7, 0, 0, 0, 0,120, 90, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,180, 0,148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 23, 4, 0, 0, 23, 4, 0, 0,115, 0, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 93, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232, 91, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 1, 0, 0, 23, 4, 0, 0,115, 0, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 2, 80, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 94, 27, 7, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0,200, 94, 27, 7, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,167,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, - 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0, -185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, -178,157,229, 62,209,162,227,190, 48,180, 81,191,184,158, 81,191,117, 90,127, 63, 13,114, 91, 62, 26, 63,185, 62, 35, 44,185, 62, -145,180,109,188,105,147,125, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, - 99,240,191, 62,110,116, 85, 63, 64,185, 70,188, 0, 0, 82,180, 48,221,185,190, 44, 45, 51, 62, 28, 11, 79, 63, 0, 0, 56,179, - 67,108,117,194,183,204,216, 65,105,156, 5,194,212,247,159,192,235, 62,114, 66, 59,254,213,193,158,225, 3, 66, 55, 8,160, 64, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, -178,157,229, 62,209,162,227,190, 48,180, 81,191,184,158, 81,191,117, 90,127, 63, 13,114, 91, 62, 26, 63,185, 62, 35, 44,185, 62, -145,180,109,188,105,147,125, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -512,672 +5042,125 @@ char datatoc_startup_blend[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12,163, 91, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,163, 91, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12,163, 91, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, -236, 15, 72, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,255,255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 86,152,137, 66,113, 27,126, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,136, 98, 27, 7, 0, 0, 0, 0, -175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 56,100, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -232,108, 27, 7, 0, 0, 0, 0,168, 86, 27, 7, 0, 0, 0, 0,104, 30, 27, 7, 0, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0, -152, 32, 27, 7, 0, 0, 0, 0, 72, 31, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, - 89, 0, 0, 0, 3, 1, 0, 0, 2, 2,192, 1,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232,106, 27, 7, 0, 0, 0, 0,232,106, 27, 7, 0, 0, 0, 0, 40,101, 27, 7, 0, 0, 0, 0,120,105, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 40,101, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,102, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,224, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,223, 67, 0, 0,200, 65, - 0,128,223, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,192, 1, - 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, - 89, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,152,102, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 8,104, 27, 7, 0, 0, 0, 0, - 40,101, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, - 0, 0,254,194, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0, -145, 0,200, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, -115, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,145, 0, 0, 0, 2, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 8,104, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,120,105, 27, 7, 0, 0, 0, 0, -152,102, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0,191, 1, 0, 0, -115, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,120,105, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,104, 27, 7, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, - 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,231, 0, -145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,191, 1, 0, 0, -115, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 0,145, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,240, 0, 0, 0,232,106, 27, 7, 0, 0, 0, 0,179, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40,108, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0, 40,108, 27, 7, 0, 0, 0, 0, 38, 1, 0, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232,108, 27, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,184,115, 27, 7, 0, 0, 0, 0, 56,100, 27, 7, 0, 0, 0, 0, 40, 32, 27, 7, 0, 0, 0, 0, -200, 27, 27, 7, 0, 0, 0, 0,184, 31, 27, 7, 0, 0, 0, 0,152, 32, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,191, 1, 0, 0, 5, 1, 0, 0,194, 2, 0, 0, 12, 12,192, 1,190, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40,114, 27, 7, 0, 0, 0, 0, 40,114, 27, 7, 0, 0, 0, 0,216,109, 27, 7, 0, 0, 0, 0, -184,112, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,109, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 72,111, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 94, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,224, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,223, 67, 0, 0,200, 65, 0,128,223, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,192, 1, 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,191, 1, 0, 0, 5, 1, 0, 0, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,111, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -184,112, 27, 7, 0, 0, 0, 0,216,109, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,163, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3, - 0, 0, 2, 4, 6, 0,200, 0,164, 1,200, 0,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,199, 0, 0, 0, 31, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0,164, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,112, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 72,111, 27, 7, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 0, 72,194, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,104, 68, 0, 0,201,195, 0, 0, 0, 0,231, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0,163, 1, 0, 0, - 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,163, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, 0, 64, 28, 70, 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 2, 4, 4, 0,248, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0,191, 1, 0, 0, 31, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 40,114, 27, 7, 0, 0, 0, 0, 39, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 2, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,115, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232,108, 27, 7, 0, 0, 0, 0, 8, 33, 27, 7, 0, 0, 0, 0, 24, 29, 27, 7, 0, 0, 0, 0, - 56, 28, 27, 7, 0, 0, 0, 0,120, 33, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, - 61, 2, 0, 0,194, 2, 0, 0, 1, 1,216, 0,134, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72,123, 27, 7, 0, 0, 0, 0, 72,123, 27, 7, 0, 0, 0, 0,168,116, 27, 7, 0, 0, 0, 0, 24,118, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,168,116, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,118, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67, - 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0,128,164, 67, 0, 0,200, 65, - 0,128,164, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 74, 1, - 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, - 61, 2, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, - 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 24,118, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168,116, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,240, 4, 0, 0, - 61, 2, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0,134, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,119, 27, 7, 0, 0, 0, 0, - 68, 65, 84, 65,112, 3, 0, 0,136,119, 27, 7, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 56,255, 13, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,100, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 86,126,162,190, - 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,192, 56, 49,188, 55, 53,101, 63, - 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63, -160, 56, 49,188, 0, 0, 0, 0, 88,126,162,190,229,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191, - 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 47,201,194, 63, 61, 73,145,191, -244,250, 39,191, 8,165, 39,191,190,164,206, 63,209, 10,143, 63,180,164, 28, 63,149, 84, 28, 63,224,153,196,188,136,239, 76, 64, - 10,108,228,190, 52,247,227,190,125, 21, 64,191,126,113,172,191,216, 49, 49, 65,152, 9, 52, 65,149, 70,158, 62, 24,234,167, 62, -192,214,159,187, 0, 0, 6,181,196,188,181,189, 71,238,178, 61,127, 45,128, 62, 0, 0,226, 51,168,120, 21,194,107, 5, 2, 66, -203,135,213,193,147,214,159,192,177, 38, 19, 66,124,173,255,193, 96,101,210, 65,128, 40,160, 64,221,149, 47, 63, 86,126,162,190, - 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,192, 56, 49,188, 55, 53,101, 63, - 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63, 47,201,194, 63, 61, 73,145,191, -244,250, 39,191, 8,165, 39,191,190,164,206, 63,209, 10,143, 63,180,164, 28, 63,149, 84, 28, 63,224,153,196,188,136,239, 76, 64, - 10,108,228,190, 52,247,227,190,125, 21, 64,191,126,113,172,191,216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,103, 97, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,103, 97, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -102,103, 97, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,241, 22, 72, 63, 78,162,246,190, - 43, 8, 90,190, 2, 35,171,190, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,191,136, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 1, 2, 0, 0,255,255, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63,190,133, 65, 66, 99,212, 90, 66, 27,183,118, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0, 72,123, 27, 7, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, -248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 3, 0, - 8, 0,128, 0, 0, 0, 12, 66, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 78, 0, 0, 8, 1, 0, 0,136,125, 27, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111,109,112,111,115, -105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 78, 0, 0, 8, 1, 0, 0, 8, 65,168, 5, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 40,136,168, 5, 0, 0, 0, 0, + 72,242,167, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105, +116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,126, 27, 7, 0, 0, 0, 0,136,132, 27, 7, 0, 0, 0, 0, -248,132, 27, 7, 0, 0, 0, 0, 40,142, 27, 7, 0, 0, 0, 0,152,142, 27, 7, 0, 0, 0, 0,200,194, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 66,168, 5, 0, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0, +216, 69,168, 5, 0, 0, 0, 0, 56, 74,168, 5, 0, 0, 0, 0,168, 74,168, 5, 0, 0, 0, 0,200,118,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,216,126, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 72,127, 27, 7, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 88, 66,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200, 66,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 72,127, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184,127, 27, 7, 0, 0, 0, 0,216,126, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,127, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 40,128, 27, 7, 0, 0, 0, 0, 72,127, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,128, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -152,128, 27, 7, 0, 0, 0, 0,184,127, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 8,129, 27, 7, 0, 0, 0, 0, - 40,128, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 8,129, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,126, 7,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,232,129, 27, 7, 0, 0, 0, 0, 8,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 6, 92, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,129, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 88,130, 27, 7, 0, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 92, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 88,130, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200,130, 27, 7, 0, 0, 0, 0, -232,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -200,130, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0, 88,130, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,168,131, 27, 7, 0, 0, 0, 0,200,130, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 6,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,131, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 24,132, 27, 7, 0, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3,140, 1, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 24,132, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136,132, 27, 7, 0, 0, 0, 0, -168,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -136,132, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,132, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,132, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,104,133, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,127, 27, 7, 0, 0, 0, 0, -184,127, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,133, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,216,133, 27, 7, 0, 0, 0, 0,248,132, 27, 7, 0, 0, 0, 0, 72,127, 27, 7, 0, 0, 0, 0, -152,128, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,133, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 72,134, 27, 7, 0, 0, 0, 0,104,133, 27, 7, 0, 0, 0, 0,184,127, 27, 7, 0, 0, 0, 0, - 8,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,134, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,184,134, 27, 7, 0, 0, 0, 0,216,133, 27, 7, 0, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0, - 8,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,134, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 40,135, 27, 7, 0, 0, 0, 0, 72,134, 27, 7, 0, 0, 0, 0, 40,128, 27, 7, 0, 0, 0, 0, -232,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,135, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,152,135, 27, 7, 0, 0, 0, 0,184,134, 27, 7, 0, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, -232,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,135, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 8,136, 27, 7, 0, 0, 0, 0, 40,135, 27, 7, 0, 0, 0, 0, 8,129, 27, 7, 0, 0, 0, 0, - 88,130, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,136, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,120,136, 27, 7, 0, 0, 0, 0,152,135, 27, 7, 0, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0, - 88,130, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,136, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,232,136, 27, 7, 0, 0, 0, 0, 8,136, 27, 7, 0, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, - 88,130, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,136, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 88,137, 27, 7, 0, 0, 0, 0,120,136, 27, 7, 0, 0, 0, 0, 8,129, 27, 7, 0, 0, 0, 0, -232,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,137, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,200,137, 27, 7, 0, 0, 0, 0,232,136, 27, 7, 0, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0, -200,130, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,137, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 56,138, 27, 7, 0, 0, 0, 0, 88,137, 27, 7, 0, 0, 0, 0, 88,130, 27, 7, 0, 0, 0, 0, - 56,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,138, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,168,138, 27, 7, 0, 0, 0, 0,200,137, 27, 7, 0, 0, 0, 0,200,130, 27, 7, 0, 0, 0, 0, - 56,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,138, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 24,139, 27, 7, 0, 0, 0, 0, 56,138, 27, 7, 0, 0, 0, 0,200,130, 27, 7, 0, 0, 0, 0, -168,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,139, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,136,139, 27, 7, 0, 0, 0, 0,168,138, 27, 7, 0, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0, -168,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,139, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,248,139, 27, 7, 0, 0, 0, 0, 24,139, 27, 7, 0, 0, 0, 0,216,126, 27, 7, 0, 0, 0, 0, - 24,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,139, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,104,140, 27, 7, 0, 0, 0, 0,136,139, 27, 7, 0, 0, 0, 0, 24,132, 27, 7, 0, 0, 0, 0, -136,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,140, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,216,140, 27, 7, 0, 0, 0, 0,248,139, 27, 7, 0, 0, 0, 0, 40,128, 27, 7, 0, 0, 0, 0, -136,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,140, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 72,141, 27, 7, 0, 0, 0, 0,104,140, 27, 7, 0, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, -136,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,141, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,184,141, 27, 7, 0, 0, 0, 0,216,140, 27, 7, 0, 0, 0, 0,168,131, 27, 7, 0, 0, 0, 0, - 24,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,141, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 40,142, 27, 7, 0, 0, 0, 0, 72,141, 27, 7, 0, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0, -136,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,142, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,141, 27, 7, 0, 0, 0, 0,216,126, 27, 7, 0, 0, 0, 0, -200,130, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,152,142, 27, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,104,146, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0, - 72,127, 27, 7, 0, 0, 0, 0,184,127, 27, 7, 0, 0, 0, 0, 8,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,120,233, 27, 7, 0, 0, 0, 0,120,233, 27, 7, 0, 0, 0, 0,136,143, 27, 7, 0, 0, 0, 0, -248,144, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,143, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -248,144, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,144, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136,143, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, - 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,146, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, - 88,151, 27, 7, 0, 0, 0, 0,152,142, 27, 7, 0, 0, 0, 0,136,132, 27, 7, 0, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, -232,129, 27, 7, 0, 0, 0, 0, 40,128, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 0, 0, 0, 0, 91, 0, 0, 0, 15, 15, 94, 1, 92, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56,150, 27, 7, 0, 0, 0, 0, 56,150, 27, 7, 0, 0, 0, 0, 88,147, 27, 7, 0, 0, 0, 0,200,148, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 88,147, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200,148, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,115, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,174, 67, 0, 0,200, 65, - 0,128,174, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 94, 1, - 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,200,148, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88,147, 27, 7, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 18, 0, 0, 0, 65, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 94, 1, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 26, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 66, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,208, 0, 0, 0, 56,150, 27, 7, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88,151, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -232,175, 27, 7, 0, 0, 0, 0,104,146, 27, 7, 0, 0, 0, 0,120,129, 27, 7, 0, 0, 0, 0, 88,130, 27, 7, 0, 0, 0, 0, - 8,129, 27, 7, 0, 0, 0, 0,232,129, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 93, 0, 0, 0,233, 3, 0, 0, 4, 4, 94, 1,141, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168,174, 27, 7, 0, 0, 0, 0,168,174, 27, 7, 0, 0, 0, 0, 72,152, 27, 7, 0, 0, 0, 0,184,153, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 72,152, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184,153, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,174, 67, 0, 0,200, 65, - 0,128,174, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 94, 1, - 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, -208, 3, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,184,153, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72,152, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67, 0,128, 92,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67, -255,191, 92,196, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,114, 3, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,114, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1, -115, 3, 77, 1,115, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 93, 0, 0, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,115, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,155, 27, 7, 0, 0, 0, 0, 8,173, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 40,155, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,200,156, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200,156, 27, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,104,158, 27, 7, 0, 0, 0, 0, 40,155, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,104,158, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 8,160, 27, 7, 0, 0, 0, 0, -200,156, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 8,160, 27, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,168,161, 27, 7, 0, 0, 0, 0,104,158, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,168,161, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 72,163, 27, 7, 0, 0, 0, 0, - 8,160, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, - 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,163, 27, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,232,164, 27, 7, 0, 0, 0, 0,168,161, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,232,164, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136,166, 27, 7, 0, 0, 0, 0, - 72,163, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254, 76, 1, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136,166, 27, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 40,168, 27, 7, 0, 0, 0, 0,232,164, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 40,168, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,200,169, 27, 7, 0, 0, 0, 0, -136,166, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, - 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253, 76, 1, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200,169, 27, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,104,171, 27, 7, 0, 0, 0, 0, 40,168, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,104,171, 27, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 8,173, 27, 7, 0, 0, 0, 0, -200,169, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253, 76, 1,130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 8,173, 27, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,171, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,168,174, 27, 7, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232,175, 27, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,120,189, 27, 7, 0, 0, 0, 0, 88,151, 27, 7, 0, 0, 0, 0, 24,132, 27, 7, 0, 0, 0, 0, -168,131, 27, 7, 0, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0,136,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, 1, 1, 27, 3,140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,200,187, 27, 7, 0, 0, 0, 0,200,187, 27, 7, 0, 0, 0, 0,216,176, 27, 7, 0, 0, 0, 0, -152,182, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,176, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 72,178, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,192, 70, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128, 70, 68, 0, 0,200, 65, 0,128, 70, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0, 27, 3, 26, 0, 27, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 27, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,178, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -184,179, 27, 7, 0, 0, 0, 0,216,176, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 0, 0, 5, 3, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0,114, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,179, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 40,181, 27, 7, 0, 0, 0, 0, 72,178, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, - 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,181, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -152,182, 27, 7, 0, 0, 0, 0,184,179, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,180, 0,130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 6, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,182, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40,181, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 27, 3,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,184, 27, 7, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0, 8,184, 27, 7, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, - 93,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,133,119, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0, -221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0, -191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, -223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0, - 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, - 42, 6,158, 63, 99, 28,157,191,244,250, 39,191, 8,165, 39,191,211,164,167, 63, 55,175,154, 63,180,164, 28, 63,149, 84, 28, 63, - 39,127,159,188,135,157, 93, 64, 8,108,228,190, 50,247,227,190, 4,213, 27,191,122,122,186,191,216, 49, 49, 65,152, 9, 52, 65, - 25, 25,195, 62,176,249,206, 62,128,238,196,187, 0, 0,192,179, 55, 15,168,189,201,118,165, 61,152, 15,109, 62, 0, 0,152, 51, -211,120, 21,194,144, 5, 2, 66, 6,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,154,101,210, 65,173, 40,160, 64, -221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0, -191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, - 42, 6,158, 63, 99, 28,157,191,244,250, 39,191, 8,165, 39,191,211,164,167, 63, 55,175,154, 63,180,164, 28, 63,149, 84, 28, 63, - 39,127,159,188,135,157, 93, 64, 8,108,228,190, 50,247,227,190, 4,213, 27,191,122,122,186,191,216, 49, 49, 65,152, 9, 52, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62,250,150, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,250,150, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62,250,150, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, -241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 49,183, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 65, 1, 2, 0, 0,255,255, 0, 0, 92, 62, 55, 63, - 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63,190,133, 65, 66,100,212, 90, 66, 31,183,118, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,200,187, 27, 7, 0, 0, 0, 0, -175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120,189, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -200,194, 27, 7, 0, 0, 0, 0,232,175, 27, 7, 0, 0, 0, 0,200,130, 27, 7, 0, 0, 0, 0,152,128, 27, 7, 0, 0, 0, 0, - 88,130, 27, 7, 0, 0, 0, 0, 56,131, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, -141, 1, 0, 0,233, 3, 0, 0, 16, 16, 32, 6, 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72,193, 27, 7, 0, 0, 0, 0, 72,193, 27, 7, 0, 0, 0, 0,104,190, 27, 7, 0, 0, 0, 0,216,191, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,104,190, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,216,191, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 66, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,196, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,195, 68, 0, 0,200, 65, - 0,224,195, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 32, 6, - 26, 0, 32, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, -141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,216,191, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104,190, 27, 7, 0, 0, 0, 0, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,128,195,217,195,192,225,108, 68, - 96,240,187, 64, 62, 16,253, 67, 15, 6, 0, 0, 32, 6, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 14, 6, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 14, 6, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,250, 70, 0, 0,250, 70,236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 32, 6, - 67, 2, 15, 6, 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, -167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 67, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 1, 0, 0, 72,193, 27, 7, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,206, 97, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,194, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,120,189, 27, 7, 0, 0, 0, 0,216,126, 27, 7, 0, 0, 0, 0,200,130, 27, 7, 0, 0, 0, 0, -168,131, 27, 7, 0, 0, 0, 0, 24,132, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, - 0, 0, 0, 0,139, 1, 0, 0, 6, 6, 4, 3,140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,200, 27, 7, 0, 0, 0, 0, 8,200, 27, 7, 0, 0, 0, 0,184,195, 27, 7, 0, 0, 0, 0,152,198, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,184,195, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40,197, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 65, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 64, 68, 0, 0,200, 65, - 0,192, 64, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 4, 3, - 26, 0, 4, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 40,197, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152,198, 27, 7, 0, 0, 0, 0, -184,195, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,152,198, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40,197, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0,129,191, 0,128, 0, 64, - 0, 0,100,190, 0,128,156, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, - 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3,114, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 33, 0, 0, 8,200, 27, 7, 0, 0, 0, 0,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +200, 66,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56, 67,168, 5, 0, 0, 0, 0, 88, 66,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56, 67,168, 5, 0, 0, 0, 0, +212, 0, 0, 0, 1, 0, 0, 0,168, 67,168, 5, 0, 0, 0, 0,200, 66,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168, 67,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, + 24, 68,168, 5, 0, 0, 0, 0, 56, 67,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0, +168, 67,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +136, 68,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,126, 7,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0, +212, 0, 0, 0, 1, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +200, 3,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 3, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,216, 69,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72, 70,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200, 66,168, 5, 0, 0, 0, 0, 56, 67,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72, 70,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184, 70,168, 5, 0, 0, 0, 0, +216, 69,168, 5, 0, 0, 0, 0,200, 66,168, 5, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,184, 70,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40, 71,168, 5, 0, 0, 0, 0, + 72, 70,168, 5, 0, 0, 0, 0, 56, 67,168, 5, 0, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 40, 71,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152, 71,168, 5, 0, 0, 0, 0, +184, 70,168, 5, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,152, 71,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8, 72,168, 5, 0, 0, 0, 0, + 40, 71,168, 5, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 8, 72,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120, 72,168, 5, 0, 0, 0, 0, +152, 71,168, 5, 0, 0, 0, 0, 88, 66,168, 5, 0, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,120, 72,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232, 72,168, 5, 0, 0, 0, 0, + 8, 72,168, 5, 0, 0, 0, 0, 88, 66,168, 5, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,232, 72,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88, 73,168, 5, 0, 0, 0, 0, +120, 72,168, 5, 0, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 88, 73,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200, 73,168, 5, 0, 0, 0, 0, +232, 72,168, 5, 0, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,200, 73,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56, 74,168, 5, 0, 0, 0, 0, + 88, 73,168, 5, 0, 0, 0, 0,168, 67,168, 5, 0, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 56, 74,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +200, 73,168, 5, 0, 0, 0, 0,168, 67,168, 5, 0, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,168, 74,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,120, 78,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0,200, 66,168, 5, 0, 0, 0, 0, 56, 67,168, 5, 0, 0, 0, 0, +136, 68,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 5, 4, 0, 0, + 7, 7,127, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,135,168, 5, 0, 0, 0, 0, +152,135,168, 5, 0, 0, 0, 0,152, 75,168, 5, 0, 0, 0, 0, 8, 77,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +152, 75,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 8, 77,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 8, 77,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 75,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, +112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 5, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +120, 78,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,200,118,168, 5, 0, 0, 0, 0,168, 74,168, 5, 0, 0, 0, 0, + 88, 66,168, 5, 0, 0, 0, 0, 24, 68,168, 5, 0, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, 6, 6,200, 3,234, 3, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 85,168, 5, 0, 0, 0, 0, 88, 85,168, 5, 0, 0, 0, 0, +104, 79,168, 5, 0, 0, 0, 0,232, 83,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 79,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0,216, 80,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,114, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,192,113, 68, 0, 0,200, 65, 0,192,113, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,200, 3, 26, 0,200, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216, 80,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0,232, 83,168, 5, 0, 0, 0, 0,104, 79,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 67, + 0,192,115,196, 0, 0, 0, 0, 0, 0, 0, 0,254,255, 74, 67,254,255,115,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, + 0, 0, 0, 0,207, 3, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, + 0, 0, 0, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,208, 3,203, 0,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,220, 0,208, 3, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 82,168, 5, 0, 0, 0, 0, 72, 82,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72, 82,168, 5, 0, 0, 0, 0, +214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,255,202, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,232, 83,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +216, 80,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 51, 51, 43,191,154,153,213, 63, + 51, 51,131,191,154,153, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236, 2, 0, 0, 0, 0, 0, 0,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0,199, 3, 0, 0, + 26, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236, 2,208, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 33, 0, 0, 88, 85,168, 5, 0, 0, 0, 0,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1442,4423 +5425,440 @@ char datatoc_startup_blend[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 83, 78, 0, 0, 8, 1, 0, 0, 8,234, 27, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101,102, 97,117,108, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,235, 27, 7, 0, 0, 0, 0, 8,241, 27, 7, 0, 0, 0, 0, -120,241, 27, 7, 0, 0, 0, 0,232,248, 27, 7, 0, 0, 0, 0, 88,249, 27, 7, 0, 0, 0, 0,104,227, 28, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,153,101, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 88,235, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200,235, 27, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,200,118,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120, 78,168, 5, 0, 0, 0, 0,104, 69,168, 5, 0, 0, 0, 0,248, 68,168, 5, 0, 0, 0, 0,136, 68,168, 5, 0, 0, 0, 0, +168, 67,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, + 1, 1,182, 3,234, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,133,168, 5, 0, 0, 0, 0, +232,133,168, 5, 0, 0, 0, 0,184,119,168, 5, 0, 0, 0, 0,184,128,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +184,119,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40,121,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,109, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,181, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64,109, 68, 0, 0,200, 65, 0, 64,109, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,182, 3, 26, 0,182, 3, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 40,121,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 56,124,168, 5, 0, 0, 0, 0,184,119,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 86,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 86,196, 0, 0, 0, 0, +143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 87, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, 88, 3,143, 0, 88, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0,104, 4, 0, 0,146, 0, 0, 0,233, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 88, 3, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,152,122,168, 5, 0, 0, 0, 0,152,122,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, +152,122,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, +111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, +111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233,253,143, 0,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,124,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 72,127,168, 5, 0, 0, 0, 0, 40,121,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, + 0, 0, 0, 0,231,102, 16, 67, 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +201, 3, 0, 0,104, 4, 0, 0, 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +160, 0,120, 0, 0, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,125,168, 5, 0, 0, 0, 0, +168,125,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,125,168, 5, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 79,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 72,127,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184,128,168, 5, 0, 0, 0, 0, 56,124,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 67, 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0, +163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,126, 7, 0, 0, 26, 0, 0, 0,233, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +184,128,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,127,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 4, 0, 0,126, 7, 0, 0, 26, 0, 0, 0,233, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,130,168, 5, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0, + 40,130,168, 5, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 72,246,172, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, + 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, + 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, +188,173, 54, 64,136, 95,161,191,147,231,198, 63, 0, 0,128, 63,185,214, 13, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191, +189,188,157, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,241,213,146,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, + 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64,121, 92,155, 62,151,198, 44, 63,192,214, 32,188, 0, 0, 40,180, +195, 15,188,190,132, 75, 53, 62,216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 17,173,201, 64,181,148,248,192,203,247,159,192, +233, 74, 87, 65,247, 46,190,192, 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, + 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63,185,214, 13, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191, +189,188,157, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,241,213,146,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, + 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,201,250, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,248,201,250, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,201,250, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, + 0, 25, 95, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0,114,145,245, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 96, 1, 0, 0,232,133,168, 5, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 24,213,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, + 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0, + 40,136,168, 5, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 65,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,120,137,168, 5, 0, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0,184,142,168, 5, 0, 0, 0, 0, + 40,150,168, 5, 0, 0, 0, 0,152,150,168, 5, 0, 0, 0, 0,248,175,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -200,235, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,236, 27, 7, 0, 0, 0, 0, 88,235, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,236, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,168,236, 27, 7, 0, 0, 0, 0,200,235, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 78, 5,164, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,236, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 24,237, 27, 7, 0, 0, 0, 0, 56,236, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 5, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136,237, 27, 7, 0, 0, 0, 0, -168,236, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -136,237, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 78, 5,137, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,104,238, 27, 7, 0, 0, 0, 0,136,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,238, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -216,238, 27, 7, 0, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4,137, 2, 1, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,216,238, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 72,239, 27, 7, 0, 0, 0, 0, -104,238, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 48, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 72,239, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184,239, 27, 7, 0, 0, 0, 0,216,238, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 78, 5, 48, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,239, 27, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 40,240, 27, 7, 0, 0, 0, 0, 72,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,240, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -152,240, 27, 7, 0, 0, 0, 0,184,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 88, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,152,240, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 8,241, 27, 7, 0, 0, 0, 0, - 40,240, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 8,241, 27, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,240, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 72, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,241, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,232,241, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,235, 27, 7, 0, 0, 0, 0, - 56,236, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,241, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 88,242, 27, 7, 0, 0, 0, 0,120,241, 27, 7, 0, 0, 0, 0,200,235, 27, 7, 0, 0, 0, 0, - 24,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,242, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,200,242, 27, 7, 0, 0, 0, 0,232,241, 27, 7, 0, 0, 0, 0, 56,236, 27, 7, 0, 0, 0, 0, -136,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,242, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 56,243, 27, 7, 0, 0, 0, 0, 88,242, 27, 7, 0, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0, -136,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,243, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,168,243, 27, 7, 0, 0, 0, 0,200,242, 27, 7, 0, 0, 0, 0, 88,235, 27, 7, 0, 0, 0, 0, -248,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,243, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 24,244, 27, 7, 0, 0, 0, 0, 56,243, 27, 7, 0, 0, 0, 0,168,236, 27, 7, 0, 0, 0, 0, -248,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,244, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,136,244, 27, 7, 0, 0, 0, 0,168,243, 27, 7, 0, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0, -104,238, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,244, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,248,244, 27, 7, 0, 0, 0, 0, 24,244, 27, 7, 0, 0, 0, 0,136,237, 27, 7, 0, 0, 0, 0, -104,238, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,244, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,104,245, 27, 7, 0, 0, 0, 0,136,244, 27, 7, 0, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0, -216,238, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,245, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,216,245, 27, 7, 0, 0, 0, 0,248,244, 27, 7, 0, 0, 0, 0,104,238, 27, 7, 0, 0, 0, 0, -216,238, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,245, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 72,246, 27, 7, 0, 0, 0, 0,104,245, 27, 7, 0, 0, 0, 0,136,237, 27, 7, 0, 0, 0, 0, - 72,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,246, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,184,246, 27, 7, 0, 0, 0, 0,216,245, 27, 7, 0, 0, 0, 0,168,236, 27, 7, 0, 0, 0, 0, - 72,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,246, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 40,247, 27, 7, 0, 0, 0, 0, 72,246, 27, 7, 0, 0, 0, 0,216,238, 27, 7, 0, 0, 0, 0, - 72,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,247, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,152,247, 27, 7, 0, 0, 0, 0,184,246, 27, 7, 0, 0, 0, 0, 88,235, 27, 7, 0, 0, 0, 0, -184,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,247, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 8,248, 27, 7, 0, 0, 0, 0, 40,247, 27, 7, 0, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0, - 40,240, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,248, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,120,248, 27, 7, 0, 0, 0, 0,152,247, 27, 7, 0, 0, 0, 0,184,239, 27, 7, 0, 0, 0, 0, - 40,240, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,248, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,232,248, 27, 7, 0, 0, 0, 0, 8,248, 27, 7, 0, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0, -184,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,248, 27, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,248, 27, 7, 0, 0, 0, 0,104,238, 27, 7, 0, 0, 0, 0, - 40,240, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88,249, 27, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0, 40,253, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0, -200,235, 27, 7, 0, 0, 0, 0, 56,236, 27, 7, 0, 0, 0, 0,136,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 78, 5, 0, 0,138, 2, 0, 0,164, 2, 0, 0, 7, 7, 79, 5, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0, -184,148,251, 6, 0, 0, 0, 0, 24, 6, 29, 7, 0, 0, 0, 0, 24, 6, 29, 7, 0, 0, 0, 0, 72,250, 27, 7, 0, 0, 0, 0, -184,251, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 34,250, 6, 0, 0, 0, 0, -216,101,104, 7, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,250, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -184,251, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,171, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,224,169, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,192,169, 68, 0, 0,200, 65, 0,192,169, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0, 79, 5, 26, 0, 79, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 78, 5, 0, 0,138, 2, 0, 0,163, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 79, 5, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200,150,251, 6, 0, 0, 0, 0,232,134, 88, 8, 0, 0, 0, 0,232,134, 88, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216,189,154, 8, 0, 0, 0, 0, 72,108,104, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,251, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 72,250, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,239, 68, 0, 0, 0, 0, 0, 0,200, 65, - 0, 0, 0, 0, 0,192,168, 68, 0, 0,224, 64, 0, 0, 16, 65, 70, 5, 0, 0, 87, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 69, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, - 2, 0, 0, 4, 10, 0, 87, 5, 2, 0, 70, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,164, 2, 0, 0,164, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216,149,251, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136,109,104, 7, 0, 0, 0, 0,248,111,104, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40,253, 27, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -248, 37, 28, 7, 0, 0, 0, 0, 88,249, 27, 7, 0, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0,216,238, 27, 7, 0, 0, 0, 0, - 72,239, 27, 7, 0, 0, 0, 0,168,236, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 4, 0, 0, 78, 5, 0, 0, - 0, 0, 0, 0, 47, 2, 0, 0, 4, 4,206, 0, 48, 2, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 88,144,251, 6, 0, 0, 0, 0, -184, 36, 28, 7, 0, 0, 0, 0,184, 36, 28, 7, 0, 0, 0, 0, 24,254, 27, 7, 0, 0, 0, 0,136,255, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,197,105, 7, 0, 0, 0, 0, 72,174,105, 7, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 24,254, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136,255, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 78, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 77, 67, 0, 0,200, 65, - 0, 0, 77, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,206, 0, - 26, 0,206, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 4, 0, 0, 78, 5, 0, 0, - 22, 2, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,206, 0, 26, 0, 4, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,147,251, 6, 0, 0, 0, 0, - 88,117, 88, 8, 0, 0, 0, 0, 88,117, 88, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104,103,104, 7, 0, 0, 0, 0,232, 60,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,136,255, 27, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24,254, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0, 61,196, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 61, 67, - 1,128, 5,196, 0, 0, 0, 0,189, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 74, 1, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,206, 0, - 22, 2,189, 0, 22, 2, 0, 0, 88,148,156, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,129, 4, 0, 0, 78, 5, 0, 0, - 0, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,206, 0, 22, 2, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,145,251, 6, 0, 0, 0, 0, -216, 54, 84, 8, 0, 0, 0, 0, 72, 96,155, 8, 0, 0, 0, 0,248, 0, 28, 7, 0, 0, 0, 0, 24, 35, 28, 7, 0, 0, 0, 0, -232,114,104, 7, 0, 0, 0, 0, 56, 66,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,248, 0, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152, 2, 28, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,104,146,251, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,189, 0, 36, 0, - 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 2, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 56, 4, 28, 7, 0, 0, 0, 0,248, 0, 28, 7, 0, 0, 0, 0,248,122,240, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,189, 0, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 56, 4, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216, 5, 28, 7, 0, 0, 0, 0, -152, 2, 28, 7, 0, 0, 0, 0,104,125,240, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,189, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 5, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,120, 7, 28, 7, 0, 0, 0, 0, 56, 4, 28, 7, 0, 0, 0, 0,216,127,240, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,189, 0,203, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,120, 7, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24, 9, 28, 7, 0, 0, 0, 0, -216, 5, 28, 7, 0, 0, 0, 0, 72,130,240, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, - 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,189, 0, 58, 0, - 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 9, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,184, 10, 28, 7, 0, 0, 0, 0,120, 7, 28, 7, 0, 0, 0, 0,184,132,240, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,189, 0, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,184, 10, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88, 12, 28, 7, 0, 0, 0, 0, - 24, 9, 28, 7, 0, 0, 0, 0,200,118,193, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254,189, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 12, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,248, 13, 28, 7, 0, 0, 0, 0,184, 10, 28, 7, 0, 0, 0, 0, 72,142,240, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253,189, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,248, 13, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152, 15, 28, 7, 0, 0, 0, 0, - 88, 12, 28, 7, 0, 0, 0, 0,184,144,240, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, - 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253,189, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 15, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 56, 17, 28, 7, 0, 0, 0, 0,248, 13, 28, 7, 0, 0, 0, 0, 40,147,240, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253,189, 0, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 56, 17, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216, 18, 28, 7, 0, 0, 0, 0, -152, 15, 28, 7, 0, 0, 0, 0,152,149,240, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,253,189, 0,134, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 18, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,120, 20, 28, 7, 0, 0, 0, 0, 56, 17, 28, 7, 0, 0, 0, 0,120,154,240, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,253,189, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,120, 20, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24, 22, 28, 7, 0, 0, 0, 0, -216, 18, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, - 95,115, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, - 95,115, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 41, 1, 61, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 22, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,184, 23, 28, 7, 0, 0, 0, 0,120, 20, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 85,110,105,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,255, 41, 1, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,184, 23, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 88, 25, 28, 7, 0, 0, 0, 0, - 24, 22, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, - 95,107,101,121,105,110,103, 95,115,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, - 95,107,101,121,105,110,103, 95,115,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75,101,121,105,110,103, 32, 83, -101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,254, 41, 1, 69, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 25, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,248, 26, 28, 7, 0, 0, 0, 0,184, 23, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,112,104,121,115,105, 99,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,112,104,121,115,105, 99,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71,114, 97,118,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131,254, 41, 1, 36, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,248, 26, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,152, 28, 28, 7, 0, 0, 0, 0, - 88, 25, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, - 95,115,105,109,112,108,105,102,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, - 95,115,105,109,112,108,105,102,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,105,109,112,108,105,102,121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 41, 1, 80, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 28, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 56, 30, 28, 7, 0, 0, 0, 0,248, 26, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,223,253, 41, 1, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 56, 30, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216, 31, 28, 7, 0, 0, 0, 0, -152, 28, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,255,187, 0,204, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 31, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,120, 33, 28, 7, 0, 0, 0, 0, 56, 30, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,254,187, 0,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,120, 33, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 24, 35, 28, 7, 0, 0, 0, 0, -216, 31, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, - 80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, - 80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,110,102,108,117,101,110, 99, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,223,252,187, 0, 86, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 35, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 33, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 74, 69, 67, 84, 95, 80, 84, 95, 99,111,110,115,116,114, 97,105,110,116,115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 74, 69, 67, 84, 95, 80, 84, 95, 99,111,110,115,116,114, 97,105,110,116,115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 67,111,110,115,116,114, 97,105,110,116,115, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,187, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,184, 36, 28, 7, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 40,235,156, 8, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 37, 28, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,232, 42, 28, 7, 0, 0, 0, 0, 40,253, 27, 7, 0, 0, 0, 0, 88,235, 27, 7, 0, 0, 0, 0, -184,239, 27, 7, 0, 0, 0, 0, 40,240, 27, 7, 0, 0, 0, 0,248,237, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,127, 4, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 15, 15,128, 4, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40,100,251, 6, 0, 0, 0, 0,200, 41, 28, 7, 0, 0, 0, 0,200, 41, 28, 7, 0, 0, 0, 0,232, 38, 28, 7, 0, 0, 0, 0, - 88, 40, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 62,106, 7, 0, 0, 0, 0, -200,112,104, 7, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 38, 28, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 88, 40, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,143, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,144, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,143, 68, 0, 0,200, 65, 0,224,143, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,128, 4, 26, 0,128, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,127, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 4, 26, 0, 6, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56,102,251, 6, 0, 0, 0, 0,136,229,156, 8, 0, 0, 0, 0,136,229,156, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40, 69,106, 7, 0, 0, 0, 0,152, 71,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 40, 28, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232, 38, 28, 7, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 88,218,103,194, 40,147,141, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,127, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,127, 4, 0, 0, 18, 0, 0, 0, 61, 0, 0, 0, +120,137,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232,137,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,137,168, 5, 0, 0, 0, 0, +212, 0, 0, 0, 1, 0, 0, 0, 88,138,168, 5, 0, 0, 0, 0,120,137,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,222, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88,138,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, +200,138,168, 5, 0, 0, 0, 0,232,137,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4,222, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,200,138,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,139,168, 5, 0, 0, 0, 0, + 88,138,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 56,139,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0,200,138,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0, +212, 0, 0, 0, 1, 0, 0, 0, 24,140,168, 5, 0, 0, 0, 0, 56,139,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +240, 4,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24,140,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, +136,140,168, 5, 0, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 92, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,136,140,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,140,168, 5, 0, 0, 0, 0, + 24,140,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +248,140,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0,136,140,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 2,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0, +212, 0, 0, 0, 1, 0, 0, 0,216,141,168, 5, 0, 0, 0, 0,248,140,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 92, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216,141,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, + 72,142,168, 5, 0, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 2, 92, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +216,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 68, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +184,142,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,143,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +232,137,168, 5, 0, 0, 0, 0, 88,138,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 40,143,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,143,168, 5, 0, 0, 0, 0,184,142,168, 5, 0, 0, 0, 0, +232,137,168, 5, 0, 0, 0, 0, 56,139,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +152,143,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,144,168, 5, 0, 0, 0, 0, 40,143,168, 5, 0, 0, 0, 0, + 88,138,168, 5, 0, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 8,144,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,144,168, 5, 0, 0, 0, 0,152,143,168, 5, 0, 0, 0, 0, + 56,139,168, 5, 0, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +120,144,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,144,168, 5, 0, 0, 0, 0, 8,144,168, 5, 0, 0, 0, 0, +168,139,168, 5, 0, 0, 0, 0, 24,140,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +232,144,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,145,168, 5, 0, 0, 0, 0,120,144,168, 5, 0, 0, 0, 0, +120,137,168, 5, 0, 0, 0, 0,136,140,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 88,145,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,145,168, 5, 0, 0, 0, 0,232,144,168, 5, 0, 0, 0, 0, + 56,139,168, 5, 0, 0, 0, 0,248,140,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +200,145,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,146,168, 5, 0, 0, 0, 0, 88,145,168, 5, 0, 0, 0, 0, +136,140,168, 5, 0, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 56,146,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168,146,168, 5, 0, 0, 0, 0,200,145,168, 5, 0, 0, 0, 0, +104,141,168, 5, 0, 0, 0, 0,216,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +168,146,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24,147,168, 5, 0, 0, 0, 0, 56,146,168, 5, 0, 0, 0, 0, +248,140,168, 5, 0, 0, 0, 0,216,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 24,147,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136,147,168, 5, 0, 0, 0, 0,168,146,168, 5, 0, 0, 0, 0, + 24,140,168, 5, 0, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +136,147,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248,147,168, 5, 0, 0, 0, 0, 24,147,168, 5, 0, 0, 0, 0, +200,138,168, 5, 0, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +248,147,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104,148,168, 5, 0, 0, 0, 0,136,147,168, 5, 0, 0, 0, 0, +136,140,168, 5, 0, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +104,148,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,148,168, 5, 0, 0, 0, 0,248,147,168, 5, 0, 0, 0, 0, +120,137,168, 5, 0, 0, 0, 0,200,138,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +216,148,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,149,168, 5, 0, 0, 0, 0,104,148,168, 5, 0, 0, 0, 0, +168,139,168, 5, 0, 0, 0, 0,248,140,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 72,149,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,149,168, 5, 0, 0, 0, 0,216,148,168, 5, 0, 0, 0, 0, + 24,140,168, 5, 0, 0, 0, 0,216,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +184,149,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,150,168, 5, 0, 0, 0, 0, 72,149,168, 5, 0, 0, 0, 0, + 56,139,168, 5, 0, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 40,150,168, 5, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,149,168, 5, 0, 0, 0, 0, + 24,140,168, 5, 0, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +152,150,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,104,154,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56,139,168, 5, 0, 0, 0, 0,232,137,168, 5, 0, 0, 0, 0, 88,138,168, 5, 0, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0,196, 2, 0, 0,222, 2, 0, 0, 7, 7,241, 4, 27, 0, 1, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,183,168, 5, 0, 0, 0, 0,232,183,168, 5, 0, 0, 0, 0, +136,151,168, 5, 0, 0, 0, 0,248,152,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,151,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0,248,152,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,148, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,158, 68, 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0,196, 2, 0, 0,221, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,241, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,152,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,151,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, + 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, + 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, + 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 2, 0, 0,222, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,154,168, 5, 0, 0, 0, 0, +215, 0, 0, 0, 1, 0, 0, 0, 88,159,168, 5, 0, 0, 0, 0,152,150,168, 5, 0, 0, 0, 0,120,137,168, 5, 0, 0, 0, 0, +136,140,168, 5, 0, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0,200,138,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 15, 15,241, 4, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56,158,168, 5, 0, 0, 0, 0, 56,158,168, 5, 0, 0, 0, 0, 88,155,168, 5, 0, 0, 0, 0, +200,156,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,155,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, +200,156,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,140, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0,158, 68, 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 0, 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +241, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,156,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88,155,168, 5, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, +112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, - 4, 0, 0, 4, 8, 0,128, 4, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,127, 4, 0, 0, 26, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 4, 62, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72,101,251, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216, 72,106, 7, 0, 0, 0, 0, 40, 80,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,200, 41, 28, 7, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, + 4, 0, 0, 4, 8, 0,241, 4, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 0, 0, 26, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +241, 4, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, 56,158,168, 5, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,232, 42, 28, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,104,227, 28, 7, 0, 0, 0, 0,248, 37, 28, 7, 0, 0, 0, 0,216,238, 27, 7, 0, 0, 0, 0, -104,238, 27, 7, 0, 0, 0, 0,136,237, 27, 7, 0, 0, 0, 0, 72,239, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, 4, 0, 0, 78, 5, 0, 0, 49, 2, 0, 0,136, 2, 0, 0, 3, 3,206, 0, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, - 40, 97,251, 6, 0, 0, 0, 0,184, 46, 28, 7, 0, 0, 0, 0,184, 46, 28, 7, 0, 0, 0, 0,216, 43, 28, 7, 0, 0, 0, 0, - 72, 45, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,113,104, 7, 0, 0, 0, 0, - 8, 67,106, 7, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216, 43, 28, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 72, 45, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 78, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 77, 67, 0, 0,200, 65, 0, 0, 77, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,206, 0, 26, 0,206, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, 4, 0, 0, 78, 5, 0, 0,111, 2, 0, 0,136, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 26, 0, 8, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56, 99,251, 6, 0, 0, 0, 0, 72,208, 87, 8, 0, 0, 0, 0, 72,208, 87, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 83,106, 7, 0, 0, 0, 0,136, 85,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 45, 28, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216, 43, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, - 0, 0,184, 65, 0, 0, 84, 67, 0, 0, 48,194, 0, 0, 0, 0,189, 0, 0, 0,206, 0, 0, 0, 18, 0, 0, 0, 61, 0, 0, 0, - 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 18, 0, 0, 0, 61, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 0, 0, 2, 0, 3, 3, - 0, 0, 12, 4, 6, 0,206, 0, 62, 0,189, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, 4, 0, 0, 78, 5, 0, 0, 49, 2, 0, 0,110, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 62, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 98,251, 6, 0, 0, 0, 0,152, 9, 68, 8, 0, 0, 0, 0,152, 9, 68, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,200, 86,106, 7, 0, 0, 0, 0, 56, 89,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,184, 46, 28, 7, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216,185, 89, 8, 0, 0, 0, 0,216,185, 89, 8, 0, 0, 0, 0, 24, 48, 28, 7, 0, 0, 0, 0, - 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, - 24, 48, 28, 7, 0, 0, 0, 0,238, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0, 42, 11, 0, 0,120, 48, 28, 7, 0, 0, 0, 0, - 68, 65, 84, 65,160,178, 0, 0,120, 48, 28, 7, 0, 0, 0, 0,237, 0, 0, 0, 42, 11, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, -120,101, 30, 7, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, -120,101, 30, 7, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 40,128, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152,137, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 56,192, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,120,151, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -136,173, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,216,144, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -104,123, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 88,122, 30, 7, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, -184,212, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 3, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 25, 27, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -168, 6, 29, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152,158, 29, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248,222, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56,249, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56, 28, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248, 36, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56, 63, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248, 71, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56, 98, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248,106, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56,133, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248,141, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56,168, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248,176, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, - 56,203, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -248,211, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,220, 31, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, - 88,122, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,123, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, - 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0, -248,130, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0, -216,144, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -152, 25, 27, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,125, 27, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,125, 27, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,125, 27, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,125, 27, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,125, 27, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -136,125, 27, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 8,234, 27, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -168, 6, 29, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152,158, 29, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -152,158, 29, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152,158, 29, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -152,158, 29, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152,158, 29, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -152,158, 29, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152,158, 29, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -152,158, 29, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152,158, 29, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -152,158, 29, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 40, 53, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, -168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, -168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, -168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, -168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, -168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, -168, 22, 27, 7, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, - 40,128, 30, 7, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, -104,227, 28, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 42, 28, 7, 0, 0, 0, 0, -184,239, 27, 7, 0, 0, 0, 0, 24,237, 27, 7, 0, 0, 0, 0,104,238, 27, 7, 0, 0, 0, 0, 40,240, 27, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 4, 0, 0, 89, 0, 0, 0,136, 2, 0, 0, 1, 1,128, 4, 48, 2, 1, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 40,103,251, 6, 0, 0, 0, 0,104, 4, 29, 7, 0, 0, 0, 0,104, 4, 29, 7, 0, 0, 0, 0, - 88,228, 28, 7, 0, 0, 0, 0, 56,255, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 67,106, 7, 0, 0, 0, 0,216, 90,106, 7, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,228, 28, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,200,229, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,108, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,144, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,224,143, 68, 0, 0,200, 65, 0,224,143, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,128, 4, 26, 0,128, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 4, 0, 0, 89, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 26, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136,113,251, 6, 0, 0, 0, 0,136, 39, 68, 8, 0, 0, 0, 0,136, 39, 68, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 94,106, 7, 0, 0, 0, 0,184, 98,106, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,229, 28, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,184,250, 28, 7, 0, 0, 0, 0, 88,228, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, - 0,192, 5,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 1, 0,159,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, 62, 1,143, 0, 62, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 75, 1, 0, 0,136, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 62, 1, 11, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,160, 0, 50, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 72,110,251, 6, 0, 0, 0, 0,216,107,154, 8, 0, 0, 0, 0,216,107,154, 8, 0, 0, 0, 0, - 56,231, 28, 7, 0, 0, 0, 0, 24,249, 28, 7, 0, 0, 0, 0,248, 99,106, 7, 0, 0, 0, 0,104,102,106, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,231, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,216,232, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,190,243, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111, -100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111, -100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233,253,143, 0,255, 1, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,216,232, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,234, 28, 7, 0, 0, 0, 0, - 56,231, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,114,117,115,104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117,254,143, 0,115, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,234, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 24,236, 28, 7, 0, 0, 0, 0,216,232, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111, -111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111, -111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,254,143, 0, 61, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 24,236, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,184,237, 28, 7, 0, 0, 0, 0, -120,234, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114,111,107,101, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,254,143, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,237, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 88,239, 28, 7, 0, 0, 0, 0, 24,236, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 99,117, -114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 99,117, -114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45,254,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 88,239, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,248,240, 28, 7, 0, 0, 0, 0, -184,237, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,112,112,101, 97,114, 97,110, - 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,253,143, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,240, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,152,242, 28, 7, 0, 0, 0, 0, 88,239, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,118,101,114,116,101,120,112, 97, -105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,118,101,114,116,101,120,112, 97, -105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149,253,143, 0,146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,152,242, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 56,244, 28, 7, 0, 0, 0, 0, -248,240, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93,254,143, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,244, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,216,245, 28, 7, 0, 0, 0, 0,152,242, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,254,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,216,245, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,120,247, 28, 7, 0, 0, 0, 0, - 56,244, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,121,109,109,101,116,114,121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,253,143, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120,247, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 24,249, 28, 7, 0, 0, 0, 0,216,245, 28, 7, 0, 0, 0, 0, 8,193,243, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77,101,115,104, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,252,143, 0, 68, 3, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 24,249, 28, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120,247, 28, 7, 0, 0, 0, 0,120,195,243, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,101,115,104, 32, 79,112,116, -105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235,251,143, 0,161, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,250, 28, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,200,253, 28, 7, 0, 0, 0, 0,200,229, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, - 0, 0, 90,195, 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,115, 0, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,160, 0,216, 0, 12, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56,111,251, 6, 0, 0, 0, 0, 8, 95, 68, 8, 0, 0, 0, 0, 8, 95, 68, 8, 0, 0, 0, 0, - 40,252, 28, 7, 0, 0, 0, 0, 40,252, 28, 7, 0, 0, 0, 0,168,103,106, 7, 0, 0, 0, 0, 24,106,106, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,252, 28, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,112,251, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84,111,103,103,108,101, 32, 69,100,105,116,109,111,100,101, 0,101, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,200,253, 28, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 56,255, 28, 7, 0, 0, 0, 0, -184,250, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0, 96,158,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, - 0, 96,158,196, 0,128,142,195,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,213, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,213, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,180, 0, -214, 3,163, 0,214, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 4, 0, 0,127, 4, 0, 0, -115, 0, 0, 0,136, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,105,251, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 56,255, 28, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200,253, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0,127, 4, 0, 0, -115, 0, 0, 0,136, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 3, 22, 2, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,104,251, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216,139,106, 7, 0, 0, 0, 0, 8,139,106, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, 29, 7, 0, 0, 0, 0, - 68, 65, 84, 65,112, 3, 0, 0,168, 0, 29, 7, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 9, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 6,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 11,210, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190, -184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, - 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63, 68,239,209, 62, 70,119,105, 63, -176, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, - 43, 61,228, 62, 0, 0, 0, 0, 62, 95, 68, 65, 51,120,173,192,115,208,213, 64, 0, 0,128, 63,178,157,229, 62, 95,247, 80,191, -116,169, 81,191,184,158, 81,191,117, 90,127, 63,147,114,201, 62,158, 53,185, 62, 35, 44,185, 62,145,180,109,188, 85,199,232, 63, -218, 72,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 33,171,108, 65, 33,210,111, 65, 39,240,191, 62,124,116, 85, 63, - 96,189, 70,188, 0, 0,185,180,248,119, 74,190, 7, 47,195, 61,166,138,225, 62, 0, 0,132, 51,197,112,117,194,178,208,216, 65, -221,158, 5,194,231,251,159,192,221, 54,114, 66, 29,247,213,193, 59,221, 3, 66, 25, 4,160, 64, 68,239,209, 62, 51,177,205,190, -184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, - 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,178,157,229, 62, 95,247, 80,191, -116,169, 81,191,184,158, 81,191,117, 90,127, 63,147,114,201, 62,158, 53,185, 62, 35, 44,185, 62,145,180,109,188, 85,199,232, 63, -218, 72,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 33,171,108, 65, 33,210,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171,158, 4, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171,158, 4, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -171,158, 4, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190, -237,203,148,190, 3,236,234,190, 33,210,111, 65, 33,210,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,125,155,241, 58, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 84,152,137, 66,113, 27,126, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,104, 4, 29, 7, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, -248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, - 8, 24,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 78, 0, 0, 8, 1, 0, 0,168, 6, 29, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0,184, 86, 29, 7, 0, 0, 0, 0, - 8,234, 27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97,109,101, 32, 76, -111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 7, 29, 7, 0, 0, 0, 0,168, 13, 29, 7, 0, 0, 0, 0, - 24, 14, 29, 7, 0, 0, 0, 0,216, 22, 29, 7, 0, 0, 0, 0, 72, 23, 29, 7, 0, 0, 0, 0,104, 79, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,248, 7, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 8, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -104, 8, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,216, 8, 29, 7, 0, 0, 0, 0,248, 7, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 8, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 72, 9, 29, 7, 0, 0, 0, 0,104, 8, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 9, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -184, 9, 29, 7, 0, 0, 0, 0,216, 8, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 40, 10, 29, 7, 0, 0, 0, 0, - 72, 9, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 40, 10, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,152, 10, 29, 7, 0, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,126, 7,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152, 10, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 8, 11, 29, 7, 0, 0, 0, 0, 40, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 11, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -120, 11, 29, 7, 0, 0, 0, 0,152, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6,140, 1, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,120, 11, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232, 11, 29, 7, 0, 0, 0, 0, - 8, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -232, 11, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88, 12, 29, 7, 0, 0, 0, 0,120, 11, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,126, 7,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 12, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,200, 12, 29, 7, 0, 0, 0, 0,232, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64, 5,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 12, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 56, 13, 29, 7, 0, 0, 0, 0, 88, 12, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5,234, 3, 1, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 56, 13, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168, 13, 29, 7, 0, 0, 0, 0, -200, 12, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -168, 13, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 13, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 1,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 14, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,136, 14, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 8, 29, 7, 0, 0, 0, 0, -216, 8, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 14, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,248, 14, 29, 7, 0, 0, 0, 0, 24, 14, 29, 7, 0, 0, 0, 0,104, 8, 29, 7, 0, 0, 0, 0, -184, 9, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 14, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,104, 15, 29, 7, 0, 0, 0, 0,136, 14, 29, 7, 0, 0, 0, 0,216, 8, 29, 7, 0, 0, 0, 0, - 40, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 15, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,216, 15, 29, 7, 0, 0, 0, 0,248, 14, 29, 7, 0, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0, - 40, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 15, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 72, 16, 29, 7, 0, 0, 0, 0,104, 15, 29, 7, 0, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0, -152, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 16, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,184, 16, 29, 7, 0, 0, 0, 0,216, 15, 29, 7, 0, 0, 0, 0,152, 10, 29, 7, 0, 0, 0, 0, - 8, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 16, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 40, 17, 29, 7, 0, 0, 0, 0, 72, 16, 29, 7, 0, 0, 0, 0, 72, 9, 29, 7, 0, 0, 0, 0, -120, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 17, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,152, 17, 29, 7, 0, 0, 0, 0,184, 16, 29, 7, 0, 0, 0, 0, 8, 11, 29, 7, 0, 0, 0, 0, -120, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 17, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 8, 18, 29, 7, 0, 0, 0, 0, 40, 17, 29, 7, 0, 0, 0, 0,248, 7, 29, 7, 0, 0, 0, 0, -152, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 18, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,120, 18, 29, 7, 0, 0, 0, 0,152, 17, 29, 7, 0, 0, 0, 0,248, 7, 29, 7, 0, 0, 0, 0, -120, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 18, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,232, 18, 29, 7, 0, 0, 0, 0, 8, 18, 29, 7, 0, 0, 0, 0, 40, 10, 29, 7, 0, 0, 0, 0, -232, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 18, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 88, 19, 29, 7, 0, 0, 0, 0,120, 18, 29, 7, 0, 0, 0, 0, 72, 9, 29, 7, 0, 0, 0, 0, -232, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 19, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,200, 19, 29, 7, 0, 0, 0, 0,232, 18, 29, 7, 0, 0, 0, 0, 8, 11, 29, 7, 0, 0, 0, 0, -232, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 19, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 56, 20, 29, 7, 0, 0, 0, 0, 88, 19, 29, 7, 0, 0, 0, 0, 88, 12, 29, 7, 0, 0, 0, 0, -200, 12, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 20, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,168, 20, 29, 7, 0, 0, 0, 0,200, 19, 29, 7, 0, 0, 0, 0, 40, 10, 29, 7, 0, 0, 0, 0, -200, 12, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 20, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 24, 21, 29, 7, 0, 0, 0, 0, 56, 20, 29, 7, 0, 0, 0, 0,232, 11, 29, 7, 0, 0, 0, 0, - 88, 12, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 21, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,136, 21, 29, 7, 0, 0, 0, 0,168, 20, 29, 7, 0, 0, 0, 0,152, 10, 29, 7, 0, 0, 0, 0, - 56, 13, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 21, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,248, 21, 29, 7, 0, 0, 0, 0, 24, 21, 29, 7, 0, 0, 0, 0, 88, 12, 29, 7, 0, 0, 0, 0, - 56, 13, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 21, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,104, 22, 29, 7, 0, 0, 0, 0,136, 21, 29, 7, 0, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0, -168, 13, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 22, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0,216, 22, 29, 7, 0, 0, 0, 0,248, 21, 29, 7, 0, 0, 0, 0,200, 12, 29, 7, 0, 0, 0, 0, -168, 13, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 22, 29, 7, 0, 0, 0, 0, -213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 22, 29, 7, 0, 0, 0, 0, 56, 13, 29, 7, 0, 0, 0, 0, -168, 13, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 72, 23, 29, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0, 24, 27, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0, -104, 8, 29, 7, 0, 0, 0, 0,216, 8, 29, 7, 0, 0, 0, 0, 40, 10, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40, 86, 29, 7, 0, 0, 0, 0, 40, 86, 29, 7, 0, 0, 0, 0, 56, 24, 29, 7, 0, 0, 0, 0, -168, 25, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 24, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -168, 25, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 25, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 24, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,238, 68, 0, 0, 0, 0, 0, 0, 0, 64,112, 7, 0, 0,129, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, - 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 24, 27, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -168, 51, 29, 7, 0, 0, 0, 0, 72, 23, 29, 7, 0, 0, 0, 0,120, 11, 29, 7, 0, 0, 0, 0, 8, 11, 29, 7, 0, 0, 0, 0, -232, 11, 29, 7, 0, 0, 0, 0, 72, 9, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 0, 0, 0, 0,139, 1, 0, 0, 4, 4, 94, 1,140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104, 50, 29, 7, 0, 0, 0, 0,104, 50, 29, 7, 0, 0, 0, 0, 8, 28, 29, 7, 0, 0, 0, 0,120, 29, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 8, 28, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,120, 29, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,174, 67, 0, 0,200, 65, - 0,128,174, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 94, 1, - 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, -114, 1, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,120, 29, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 28, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67, 0, 0, 61,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67, -255,255,184,195, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1, -114, 1, 77, 1,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 6, 0, 0,126, 7, 0, 0, - 0, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,114, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 30, 29, 7, 0, 0, 0, 0,200, 48, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,232, 30, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136, 32, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136, 32, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 40, 34, 29, 7, 0, 0, 0, 0,232, 30, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 40, 34, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,200, 35, 29, 7, 0, 0, 0, 0, -136, 32, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200, 35, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,104, 37, 29, 7, 0, 0, 0, 0, 40, 34, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,104, 37, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 8, 39, 29, 7, 0, 0, 0, 0, -200, 35, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, - 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 8, 39, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,168, 40, 29, 7, 0, 0, 0, 0,104, 37, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,168, 40, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 72, 42, 29, 7, 0, 0, 0, 0, - 8, 39, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,254, 76, 1, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72, 42, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0,232, 43, 29, 7, 0, 0, 0, 0,168, 40, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,232, 43, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136, 45, 29, 7, 0, 0, 0, 0, - 72, 42, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, - 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,253, 76, 1, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136, 45, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 40, 47, 29, 7, 0, 0, 0, 0,232, 43, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0, 40, 47, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,200, 48, 29, 7, 0, 0, 0, 0, -136, 45, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253, 76, 1,130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200, 48, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 47, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,104, 50, 29, 7, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168, 51, 29, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0, 24, 59, 29, 7, 0, 0, 0, 0, 24, 27, 29, 7, 0, 0, 0, 0,248, 7, 29, 7, 0, 0, 0, 0, -152, 10, 29, 7, 0, 0, 0, 0, 8, 11, 29, 7, 0, 0, 0, 0,120, 11, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, 17, 17, 32, 6,140, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136, 58, 29, 7, 0, 0, 0, 0,136, 58, 29, 7, 0, 0, 0, 0,152, 52, 29, 7, 0, 0, 0, 0, - 24, 57, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 52, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 8, 54, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,196, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,195, 68, 0, 0,200, 65, 0,224,195, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0, 32, 6, 26, 0, 32, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 54, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 24, 57, 29, 7, 0, 0, 0, 0,152, 52, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,185,195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,185,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, - 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,113, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88,159,168, 5, 0, 0, 0, 0, +215, 0, 0, 0, 1, 0, 0, 0, 72,167,168, 5, 0, 0, 0, 0,104,154,168, 5, 0, 0, 0, 0,136,140,168, 5, 0, 0, 0, 0, +104,141,168, 5, 0, 0, 0, 0, 24,140,168, 5, 0, 0, 0, 0, 72,142,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 0, 0, 69, 0, 0, 0, 91, 1, 0, 0, 8, 8,241, 4, 23, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8,166,168, 5, 0, 0, 0, 0, 8,166,168, 5, 0, 0, 0, 0, 72,160,168, 5, 0, 0, 0, 0, +152,164,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,160,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, +184,161,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 26, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0,158, 68, 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 0, 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240, 4, 0, 0, 69, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +241, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,161,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 40,163,168, 5, 0, 0, 0, 0, 72,160,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,125,195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 75, 67, 1, 0,125,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, + 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,220, 0,114, 1,203, 0,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0,114, 1, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 55, 29, 7, 0, 0, 0, 0, -120, 55, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 55, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,196,255,203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 4, 6, 0,220, 0,253, 0,203, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,240, 4, 0, 0, 95, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +220, 0,253, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 24, 57, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 54, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67, 0, 80, 31,195, 0,234,179, 68,224,198,182,194,184,177,165, 67, - 51, 5, 0, 0, 68, 5, 0, 0, 18, 0, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 50, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 50, 5, 0, 0, 18, 0, 0, 0,113, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, - 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 68, 5,114, 1, 51, 5, 96, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 31, 6, 0, 0, 26, 0, 0, 0,139, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 5,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,163,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, +152,164,168, 5, 0, 0, 0, 0,184,161,168, 5, 0, 0, 0, 0, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, + 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 4, 0, 0, 91, 1, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0, -136, 58, 29, 7, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, - 24, 59, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,216, 65, 29, 7, 0, 0, 0, 0,168, 51, 29, 7, 0, 0, 0, 0, - 88, 12, 29, 7, 0, 0, 0, 0,200, 12, 29, 7, 0, 0, 0, 0, 40, 10, 29, 7, 0, 0, 0, 0,232, 11, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 65, 5, 0, 0,126, 7, 0, 0,141, 1, 0, 0,233, 3, 0, 0, 9, 9, 62, 2, 93, 2, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 62, 29, 7, 0, 0, 0, 0,232, 62, 29, 7, 0, 0, 0, 0, - 8, 60, 29, 7, 0, 0, 0, 0,120, 61, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 60, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,120, 61, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 15, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 15, 68, 0, 0,200, 65, 0, 64, 15, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 62, 2, 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 65, 5, 0, 0,126, 7, 0, 0,141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,164,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40,163,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,252, 0, 0, 0, + 18, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 20, 4, 0, 0, 18, 0, 0, 0,252, 0, 0, 0, + 0, 0, 32, 65, 0, 0, 0, 63, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 8, 0, 21, 4,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 4, 0, 0, 95, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120, 61, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 60, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,181, 67, - 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68, 0, 0, 0, 0, 86, 26, 3, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, - 0, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, - 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2, 67, 2, 62, 2, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 65, 5, 0, 0,126, 7, 0, 0,167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 8,166,168, 5, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 2, 0, 0,232, 62, 29, 7, 0, 0, 0, 0, -187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 72,167,168, 5, 0, 0, 0, 0, +215, 0, 0, 0, 1, 0, 0, 0,248,175,168, 5, 0, 0, 0, 0, 88,159,168, 5, 0, 0, 0, 0,104,141,168, 5, 0, 0, 0, 0, + 56,139,168, 5, 0, 0, 0, 0,248,140,168, 5, 0, 0, 0, 0,216,141,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 2, 0, 0, 93, 1, 0, 0,194, 2, 0, 0, 2, 2, 48, 2,102, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248,173,168, 5, 0, 0, 0, 0,248,173,168, 5, 0, 0, 0, 0, 56,168,168, 5, 0, 0, 0, 0, +136,172,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,168,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, +168,169,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, 68, 0, 0, 0, 0, 0, 0,208, 65, +154,216, 65, 55, 0, 0, 12, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0,192, 11, 68, 0, 0,200, 65, 0,192, 11, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 0, 10, 0, 48, 2, 26, 0, 48, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 2, 0, 0, 93, 1, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,169,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 24,171,168, 5, 0, 0, 0, 0, 56,168,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,157,195, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, + 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, + 0, 0, 0, 4, 6, 0,217, 0, 76, 1,200, 0, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,216, 0, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +217, 0, 76, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,171,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, +136,172,168, 5, 0, 0, 0, 0,168,169,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 2, 0, 0, 47, 2, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,172,168, 5, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 24,171,168, 5, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, + 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, + 18, 0, 0, 0, 86, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 86, 1, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, +111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 87, 1, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +217, 0, 0, 0, 47, 2, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 1, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,248,173,168, 5, 0, 0, 0, 0,179, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,216, 65, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, -104, 79, 29, 7, 0, 0, 0, 0, 24, 59, 29, 7, 0, 0, 0, 0, 56, 13, 29, 7, 0, 0, 0, 0,168, 13, 29, 7, 0, 0, 0, 0, -200, 12, 29, 7, 0, 0, 0, 0, 88, 12, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 63, 5, 0, 0, -141, 1, 0, 0,233, 3, 0, 0, 1, 1,251, 3, 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 77, 29, 7, 0, 0, 0, 0,184, 77, 29, 7, 0, 0, 0, 0,200, 66, 29, 7, 0, 0, 0, 0,136, 72, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,200, 66, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 56, 68, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192,126, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,126, 68, 0, 0,200, 65, - 0,128,126, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,251, 3, - 26, 0,251, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 63, 5, 0, 0, -141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 56, 68, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,168, 69, 29, 7, 0, 0, 0, 0, -200, 66, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, -255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, - 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 69, 1, 0, 0, -167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 67, 2, 0, 0, 5, 0, - 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,168, 69, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24, 71, 29, 7, 0, 0, 0, 0, - 56, 68, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, - 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, -120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 63, 5, 0, 0, -167, 1, 0, 0,167, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, - 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56,175,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0, 56,175,168, 5, 0, 0, 0, 0, + 38, 1, 0, 0, 1, 0, 0, 0,120,184,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0, 24, 71, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136, 72, 29, 7, 0, 0, 0, 0, -168, 69, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, - 0, 0,109,196, 0,128,145,195,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,144, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,144, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,180, 0, -145, 2,163, 0,145, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 5, 0, 0, 63, 5, 0, 0, -167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +248,175,168, 5, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,167,168, 5, 0, 0, 0, 0, +216,141,168, 5, 0, 0, 0, 0,248,140,168, 5, 0, 0, 0, 0,168,139,168, 5, 0, 0, 0, 0, 24,140,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 2, 0, 0,240, 4, 0, 0, 93, 1, 0, 0,194, 2, 0, 0, 8, 8,192, 2,102, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,182,168, 5, 0, 0, 0, 0,168,182,168, 5, 0, 0, 0, 0, +232,176,168, 5, 0, 0, 0, 0, 56,181,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,176,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0, 88,178,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 48, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 2, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 47, 68, 0, 0,200, 65, 0,192, 47, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,192, 2, 26, 0,192, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 2, 0, 0,240, 4, 0, 0, 93, 1, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,192, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,136, 72, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 71, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,178,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0,200,179,168, 5, 0, 0, 0, 0,232,176,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 63, 5, 0, 0, -167, 1, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 3, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0,240, 4, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 73, 29, 7, 0, 0, 0, 0, - 68, 65, 84, 65,112, 3, 0, 0,248, 73, 29, 7, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0,190, 35, 30, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 40,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,190, 35, 30, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 40,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,149, 53,207, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,107, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255,255,249,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,190, 35, 30, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 40,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,179,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0, 56,181,168, 5, 0, 0, 0, 0, 88,178,168, 5, 0, 0, 0, 0, 0, 0,240,195, 0, 0,240, 67, + 0, 0,135,195, 0, 0,135, 67,238, 33,143,196,238, 33,143, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 2, 0, 0, + 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, 0, 0,192, 2, 76, 1,192, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 2, 0, 0,240, 4, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,192, 2, 76, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 3,116, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 3,116, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 3,116, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,149, 53,207, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,221, 57, 80, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 65, 0, 0, 5, 0,251,251, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, - 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,180, 66, 0, 0,180, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,184, 77, 29, 7, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, -248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, - 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63,205,204,204, 61, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,160, 0, 0, 0,104, 79, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 65, 29, 7, 0, 0, 0, 0,152, 10, 29, 7, 0, 0, 0, 0,184, 9, 29, 7, 0, 0, 0, 0,168, 13, 29, 7, 0, 0, 0, 0, - 56, 13, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0,141, 1, 0, 0,233, 3, 0, 0, - 3, 3, 68, 1, 93, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 83, 29, 7, 0, 0, 0, 0, - 56, 83, 29, 7, 0, 0, 0, 0, 88, 80, 29, 7, 0, 0, 0, 0,200, 81, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 88, 80, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200, 81, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,162, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,161, 67, 0, 0,200, 65, 0,128,161, 67, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 68, 1, 26, 0, 68, 1, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0,141, 1, 0, 0,166, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, -200, 81, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 80, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,153, 67, 0, 64, 12,196, 0, 0, 0, 0, - 51, 1, 0, 0, 68, 1, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 50, 1, 0, 0, 18, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 12, 4, 6, 0, 68, 1, 67, 2, 51, 1, 49, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0,167, 1, 0, 0,233, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0, - 56, 83, 29, 7, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 84, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,152, 84, 29, 7, 0, 0, 0, 0,238, 0, 0, 0, 1, 0, 0, 0, - 14, 0, 0, 0, 14, 0, 0, 0,248, 84, 29, 7, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,248, 84, 29, 7, 0, 0, 0, 0, -237, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0, -120,101, 30, 7, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0, -120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,128, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -152,137, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 56,192, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -120,151, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,136,173, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -216,144, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,104,123, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,122, 30, 7, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0, -120,101, 30, 7, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0,184, 86, 29, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, -152,158, 29, 7, 0, 0, 0, 0,168, 6, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 82, 77,111,116,105,111,110, 32, 84,114, 97, 99,107,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 88, 29, 7, 0, 0, 0, 0, -184, 93, 29, 7, 0, 0, 0, 0, 40, 94, 29, 7, 0, 0, 0, 0,152,101, 29, 7, 0, 0, 0, 0, 8,102, 29, 7, 0, 0, 0, 0, - 72,142, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 88, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -120, 88, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,120, 88, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232, 88, 29, 7, 0, 0, 0, 0, - 8, 88, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -232, 88, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 88, 89, 29, 7, 0, 0, 0, 0,120, 88, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 98, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 89, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,200, 89, 29, 7, 0, 0, 0, 0,232, 88, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 89, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 56, 90, 29, 7, 0, 0, 0, 0, 88, 89, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 56, 90, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168, 90, 29, 7, 0, 0, 0, 0, -200, 89, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 64, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -168, 90, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24, 91, 29, 7, 0, 0, 0, 0, 56, 90, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 91, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,136, 91, 29, 7, 0, 0, 0, 0,168, 90, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 5, 64, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 91, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -248, 91, 29, 7, 0, 0, 0, 0, 24, 91, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,248, 91, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 92, 29, 7, 0, 0, 0, 0, -136, 91, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6,108, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -104, 92, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0,248, 91, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 72, 93, 29, 7, 0, 0, 0, 0,104, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62, 6,120, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 93, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -184, 93, 29, 7, 0, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2,120, 3, 1, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,184, 93, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2, 64, 4, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 40, 94, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152, 94, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120, 88, 29, 7, 0, 0, 0, 0,232, 88, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -152, 94, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8, 95, 29, 7, 0, 0, 0, 0, 40, 94, 29, 7, 0, 0, 0, 0, -120, 88, 29, 7, 0, 0, 0, 0,200, 89, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 8, 95, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120, 95, 29, 7, 0, 0, 0, 0,152, 94, 29, 7, 0, 0, 0, 0, -232, 88, 29, 7, 0, 0, 0, 0, 56, 90, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -120, 95, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232, 95, 29, 7, 0, 0, 0, 0, 8, 95, 29, 7, 0, 0, 0, 0, -200, 89, 29, 7, 0, 0, 0, 0, 56, 90, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -232, 95, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88, 96, 29, 7, 0, 0, 0, 0,120, 95, 29, 7, 0, 0, 0, 0, - 8, 88, 29, 7, 0, 0, 0, 0, 88, 89, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 88, 96, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200, 96, 29, 7, 0, 0, 0, 0,232, 95, 29, 7, 0, 0, 0, 0, - 8, 88, 29, 7, 0, 0, 0, 0,136, 91, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -200, 96, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56, 97, 29, 7, 0, 0, 0, 0, 88, 96, 29, 7, 0, 0, 0, 0, - 88, 89, 29, 7, 0, 0, 0, 0,248, 91, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 56, 97, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168, 97, 29, 7, 0, 0, 0, 0,200, 96, 29, 7, 0, 0, 0, 0, -136, 91, 29, 7, 0, 0, 0, 0,248, 91, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -168, 97, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24, 98, 29, 7, 0, 0, 0, 0, 56, 97, 29, 7, 0, 0, 0, 0, -136, 91, 29, 7, 0, 0, 0, 0,104, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 24, 98, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136, 98, 29, 7, 0, 0, 0, 0,168, 97, 29, 7, 0, 0, 0, 0, -200, 89, 29, 7, 0, 0, 0, 0,104, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -136, 98, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248, 98, 29, 7, 0, 0, 0, 0, 24, 98, 29, 7, 0, 0, 0, 0, - 56, 90, 29, 7, 0, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -248, 98, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104, 99, 29, 7, 0, 0, 0, 0,136, 98, 29, 7, 0, 0, 0, 0, -248, 91, 29, 7, 0, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -104, 99, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216, 99, 29, 7, 0, 0, 0, 0,248, 98, 29, 7, 0, 0, 0, 0, -104, 92, 29, 7, 0, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -216, 99, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,100, 29, 7, 0, 0, 0, 0,104, 99, 29, 7, 0, 0, 0, 0, -104, 92, 29, 7, 0, 0, 0, 0, 72, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 72,100, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,100, 29, 7, 0, 0, 0, 0,216, 99, 29, 7, 0, 0, 0, 0, -216, 92, 29, 7, 0, 0, 0, 0, 72, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -184,100, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,101, 29, 7, 0, 0, 0, 0, 72,100, 29, 7, 0, 0, 0, 0, -200, 89, 29, 7, 0, 0, 0, 0,184, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 40,101, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,101, 29, 7, 0, 0, 0, 0,184,100, 29, 7, 0, 0, 0, 0, - 56, 90, 29, 7, 0, 0, 0, 0,184, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -152,101, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,101, 29, 7, 0, 0, 0, 0, - 72, 93, 29, 7, 0, 0, 0, 0,184, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, - 8,102, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,216,105, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 89, 29, 7, 0, 0, 0, 0,120, 88, 29, 7, 0, 0, 0, 0,232, 88, 29, 7, 0, 0, 0, 0, 56, 90, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 65, 4, 0, 0, 98, 4, 0, 0, 7, 7, 63, 6, 34, 0, 1, 0, - 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,158, 29, 7, 0, 0, 0, 0, 8,158, 29, 7, 0, 0, 0, 0, -248,102, 29, 7, 0, 0, 0, 0,104,104, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,102, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,104,104, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,163, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,192,199, 68, 0, 0,200, 65, 0,192,199, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0, 63, 6, 26, 0, 63, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 65, 4, 0, 0, 90, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,104, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,102, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,239, 68, - 0, 0, 0, 0, 0, 0,200, 65, 0, 0, 0, 0, 0,192,197, 68, 0, 0,128, 64, 0, 0, 64, 65, 46, 6, 0, 0, 63, 6, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0, 63, 6, 8, 0, 46, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 91, 4, 0, 0, 98, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,216,105, 29, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,200,110, 29, 7, 0, 0, 0, 0, 8,102, 29, 7, 0, 0, 0, 0, 8, 88, 29, 7, 0, 0, 0, 0, -136, 91, 29, 7, 0, 0, 0, 0,248, 91, 29, 7, 0, 0, 0, 0, 88, 89, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, 15, 15, 63, 6,108, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,168,109, 29, 7, 0, 0, 0, 0,168,109, 29, 7, 0, 0, 0, 0,200,106, 29, 7, 0, 0, 0, 0, - 56,108, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,106, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 56,108, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,192,199, 68, 0, 0,200, 65, 0,192,199, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0, 63, 6, 26, 0, 63, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,108, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,200,106, 29, 7, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 88,218,103,194, 40,147,141, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 18, 0, 0, 0, 81, 0, 0, 0, - 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, - 4, 0, 0, 4, 8, 0, 63, 6, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 6, 0, 0, 26, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 6, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,168,109, 29, 7, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,110, 29, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,136,126, 29, 7, 0, 0, 0, 0,216,105, 29, 7, 0, 0, 0, 0,136, 91, 29, 7, 0, 0, 0, 0, -104, 92, 29, 7, 0, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0,248, 91, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 6, 0, 0,109, 0, 0, 0,119, 3, 0, 0, 20, 20, 63, 6, 11, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8,125, 29, 7, 0, 0, 0, 0, 8,125, 29, 7, 0, 0, 0, 0,184,111, 29, 7, 0, 0, 0, 0, -152,123, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,111, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 40,113, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 19, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,224,199, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,192,199, 68, 0, 0,200, 65, 0,192,199, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 0, 0, 10, 0, 63, 6, 26, 0, 63, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 6, 0, 0,109, 0, 0, 0,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,113, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -152,114, 29, 7, 0, 0, 0, 0,184,111, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 64, 30,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 30,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,120, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,120, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,121, 2,143, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,159, 0, 0, 0,255, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0,121, 2, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,114, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -168,117, 29, 7, 0, 0, 0, 0, 40,113, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0,240,194, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,240,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,159, 0, 0, 0,135, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0,120, 0, 0, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,116, 29, 7, 0, 0, 0, 0, - 8,116, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 8,116, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 78,101,119, 32, 83, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,216,255,143, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, -168,117, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184,120, 29, 7, 0, 0, 0, 0,152,114, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,178, 67, 0, 64, 60,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 60,196, 0, 0, 0, 0, -143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,240, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,240, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,241, 2,143, 0,241, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 5, 0, 0, 62, 6, 0, 0,135, 0, 0, 0,119, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,241, 2, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24,119, 29, 7, 0, 0, 0, 0, 24,119, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, - 24,119, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,255,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,120, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 40,122, 29, 7, 0, 0, 0, 0,168,117, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64,110,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 67, 0,192,105,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 18, 0, 0, 0,184, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 0, 0, 0, 2, 0, 3, 3, - 0, 0, 2, 0, 6, 0,160, 0,185, 3,160, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, 0,160, 0, 0, 0,135, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,122, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -152,123, 29, 7, 0, 0, 0, 0,184,120, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 0, 0, 0,128, 0, 0,124,146, 72,255,255,127,127, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, 0,160, 0, 0, 0,135, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,123, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40,122, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128,255, 0, 0,128,127, 0, 0,128,255, 0, 0,128,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 0, 0, 0, 0, 0, 0,241, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, - 0, 0, 0, 4, 10, 0,255, 4,241, 2,255, 4,241, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, 0,158, 5, 0, 0,135, 0, 0, 0,119, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 4,241, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 8,125, 29, 7, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 17,200, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, -136,126, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 72,142, 29, 7, 0, 0, 0, 0,200,110, 29, 7, 0, 0, 0, 0, - 72, 93, 29, 7, 0, 0, 0, 0,184, 93, 29, 7, 0, 0, 0, 0, 56, 90, 29, 7, 0, 0, 0, 0,216, 92, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, 62, 6, 0, 0,121, 3, 0, 0, 63, 4, 0, 0, 20, 20,110, 3,199, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,140, 29, 7, 0, 0, 0, 0,200,140, 29, 7, 0, 0, 0, 0, -120,127, 29, 7, 0, 0, 0, 0, 88,139, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,127, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,232,128, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 91, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,109, 3, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 91, 68, 0, 0,200, 65, 0, 64, 91, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 0, 0, 10, 0,110, 3, 26, 0,110, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, 62, 6, 0, 0,121, 3, 0, 0,146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,110, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,128, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 88,130, 29, 7, 0, 0, 0, 0,120,127, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, - 0, 0, 84,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 84,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 53, 0,143, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,209, 2, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,130, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,104,133, 29, 7, 0, 0, 0, 0,232,128, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, - 0, 0,240,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,240,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,209, 2, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200,131, 29, 7, 0, 0, 0, 0,200,131, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200,131, 29, 7, 0, 0, 0, 0, -214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 78,101,119, 32, 83, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,143, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 40, 1, 0, 0,104,133, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,120,136, 29, 7, 0, 0, 0, 0, - 88,130, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0, 45,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 0, 45,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, -173, 0,143, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,209, 2, 0, 0, -147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,134, 29, 7, 0, 0, 0, 0,216,134, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 88, 1, 0, 0,216,134, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95, -103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95, -103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80, -101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,255,143, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,136, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,232,137, 29, 7, 0, 0, 0, 0,104,133, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 0, 45,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 27,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, - 18, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,160, 0,173, 0,160, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209, 2, 0, 0,112, 3, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,160, 0,173, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,137, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 88,139, 29, 7, 0, 0, 0, 0,120,136, 29, 7, 0, 0, 0, 0, 0, 0, 32,193, 0,128, 91, 68, -171,170,132,194, 0, 0, 0, 0, 0, 0, 32,193, 0,128, 91, 68, 0, 0, 27,195, 0, 0, 0, 0,189, 2, 0, 0,206, 2, 0, 0, - 18, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0,188, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,188, 2, 0, 0, - 18, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72,255,255,127,127, 10,215, 35, 60, 0, 0, 72, 66, - 74, 0, 0, 0, 0, 0, 0, 2, 16, 0, 2, 4, 4, 0,206, 2,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,113, 3, 0, 0, 62, 6, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,206, 2,173, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,139, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,137, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,255, 0, 0,128,127, 0, 0,128,255, 0, 0,128,127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 2, 0, 0, - 0, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, - 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 10, 0, 46, 2,173, 0, 46, 2,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,181,168, 5, 0, 0, 0, 0, +216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,179,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, + 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, + 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, + 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0, 0, 63, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66, +105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,200,140, 29, 7, 0, 0, 0, 0, -197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 17,200, 0, 0, 0, 0, 2, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,168,182,168, 5, 0, 0, 0, 0, +181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,160, 0, 0, 0, 72,142, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136,126, 29, 7, 0, 0, 0, 0,104, 92, 29, 7, 0, 0, 0, 0,200, 89, 29, 7, 0, 0, 0, 0,184, 93, 29, 7, 0, 0, 0, 0, - 72, 93, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0,121, 3, 0, 0, 63, 4, 0, 0, - 20, 20,208, 2,199, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,156, 29, 7, 0, 0, 0, 0, -136,156, 29, 7, 0, 0, 0, 0, 56,143, 29, 7, 0, 0, 0, 0, 24,155, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 56,143, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,168,144, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,212, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 52, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,207, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 51, 68, 0, 0,200, 65, 0,192, 51, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 0, 0, 10, 0,208, 2, 26, 0,208, 2, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0,121, 3, 0, 0,146, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, -168,144, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,146, 29, 7, 0, 0, 0, 0, 56,143, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,178, 67, 0, 0, 84,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 84,194, 0, 0, 0, 0, -143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 53, 0,143, 0, 53, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 24,146, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40,149, 29, 7, 0, 0, 0, 0,168,144, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,178, 67, 0, 0,240,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,240,194, 0, 0, 0, 0, -143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136,147, 29, 7, 0, 0, 0, 0,136,147, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -136,147, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101, -114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 76, 73, 80, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101, -114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,101,119, 32, 83, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,143, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,149, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 56,152, 29, 7, 0, 0, 0, 0, 24,146, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,178, 67, 0, 0, 45,195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 45,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,172, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,172, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,160, 0,173, 0,143, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,150, 29, 7, 0, 0, 0, 0, -152,150, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152,150, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67, 76, 73, 80, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,232,255,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 56,152, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,168,153, 29, 7, 0, 0, 0, 0, 40,149, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 64,110,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, 0,192,105,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,159, 0, 0, 0, 18, 0, 0, 0,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 8, 0, 0, 0, 2, 0, 3, 3, 0, 0, 2, 0, 6, 0,160, 0,185, 3,160, 0,167, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, -168,153, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,155, 29, 7, 0, 0, 0, 0, 56,152, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, - 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 18, 0, 0, 0,207, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0,207, 2, 0, 0, 18, 0, 0, 0,172, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0,124,146, 72,255,255,127,127, - 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,208, 2,173, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0,147, 3, 0, 0, 63, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 2,173, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, - 24,155, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,153, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,255, 0, 0,128,127, 0, 0,128,255, 0, 0,128,127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 10, 0,144, 1,173, 0,144, 1,173, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -136,156, 29, 7, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,200, 0, 0, 0, 0, 1, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0,152,158, 29, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, - 8,238, 29, 7, 0, 0, 0, 0,184, 86, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,159, 29, 7, 0, 0, 0, 0, -152,165, 29, 7, 0, 0, 0, 0, 8,166, 29, 7, 0, 0, 0, 0, 56,175, 29, 7, 0, 0, 0, 0,168,175, 29, 7, 0, 0, 0, 0, -184,230, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,159, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 88,160, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 88,160, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200,160, 29, 7, 0, 0, 0, 0, -232,159, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -200,160, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,161, 29, 7, 0, 0, 0, 0, 88,160, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,161, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,168,161, 29, 7, 0, 0, 0, 0,200,160, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -126, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,161, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, - 24,162, 29, 7, 0, 0, 0, 0, 56,161, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 3, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0, 24,162, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136,162, 29, 7, 0, 0, 0, 0, -168,161, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,168, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -136,162, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, 24,162, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 5,168, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0,104,163, 29, 7, 0, 0, 0, 0,136,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,163, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -216,163, 29, 7, 0, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 1, 1, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 72,164, 29, 7, 0, 0, 0, 0, -104,163, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,104, 1, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, - 72,164, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,184,164, 29, 7, 0, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,248, 2,104, 1, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,164, 29, 7, 0, 0, 0, 0, -212, 0, 0, 0, 1, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0, 72,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5,236, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, -152,165, 29, 7, 0, 0, 0, 0,184,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,236, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 32, 0, 0, 0,152,165, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 2,168, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 8,166, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,166, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88,160, 29, 7, 0, 0, 0, 0,200,160, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -120,166, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,166, 29, 7, 0, 0, 0, 0, 8,166, 29, 7, 0, 0, 0, 0, - 88,160, 29, 7, 0, 0, 0, 0,168,161, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -232,166, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,167, 29, 7, 0, 0, 0, 0,120,166, 29, 7, 0, 0, 0, 0, -200,160, 29, 7, 0, 0, 0, 0, 24,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 88,167, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,167, 29, 7, 0, 0, 0, 0,232,166, 29, 7, 0, 0, 0, 0, -168,161, 29, 7, 0, 0, 0, 0, 24,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -200,167, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,168, 29, 7, 0, 0, 0, 0, 88,167, 29, 7, 0, 0, 0, 0, - 24,162, 29, 7, 0, 0, 0, 0,136,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 56,168, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168,168, 29, 7, 0, 0, 0, 0,200,167, 29, 7, 0, 0, 0, 0, - 56,161, 29, 7, 0, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -168,168, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24,169, 29, 7, 0, 0, 0, 0, 56,168, 29, 7, 0, 0, 0, 0, -232,159, 29, 7, 0, 0, 0, 0,104,163, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 24,169, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136,169, 29, 7, 0, 0, 0, 0,168,168, 29, 7, 0, 0, 0, 0, -168,161, 29, 7, 0, 0, 0, 0,104,163, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -136,169, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248,169, 29, 7, 0, 0, 0, 0, 24,169, 29, 7, 0, 0, 0, 0, -136,162, 29, 7, 0, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -248,169, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104,170, 29, 7, 0, 0, 0, 0,136,169, 29, 7, 0, 0, 0, 0, -248,162, 29, 7, 0, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -104,170, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216,170, 29, 7, 0, 0, 0, 0,248,169, 29, 7, 0, 0, 0, 0, -104,163, 29, 7, 0, 0, 0, 0, 72,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -216,170, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,171, 29, 7, 0, 0, 0, 0,104,170, 29, 7, 0, 0, 0, 0, -216,163, 29, 7, 0, 0, 0, 0, 72,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 72,171, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,171, 29, 7, 0, 0, 0, 0,216,170, 29, 7, 0, 0, 0, 0, -248,162, 29, 7, 0, 0, 0, 0,184,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -184,171, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,172, 29, 7, 0, 0, 0, 0, 72,171, 29, 7, 0, 0, 0, 0, -136,162, 29, 7, 0, 0, 0, 0,184,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 40,172, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,172, 29, 7, 0, 0, 0, 0,184,171, 29, 7, 0, 0, 0, 0, - 24,162, 29, 7, 0, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -152,172, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,173, 29, 7, 0, 0, 0, 0, 40,172, 29, 7, 0, 0, 0, 0, - 56,161, 29, 7, 0, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 8,173, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,173, 29, 7, 0, 0, 0, 0,152,172, 29, 7, 0, 0, 0, 0, -184,164, 29, 7, 0, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -120,173, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,173, 29, 7, 0, 0, 0, 0, 8,173, 29, 7, 0, 0, 0, 0, -168,161, 29, 7, 0, 0, 0, 0,152,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -232,173, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,174, 29, 7, 0, 0, 0, 0,120,173, 29, 7, 0, 0, 0, 0, -136,162, 29, 7, 0, 0, 0, 0,152,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 88,174, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,174, 29, 7, 0, 0, 0, 0,232,173, 29, 7, 0, 0, 0, 0, - 72,164, 29, 7, 0, 0, 0, 0,152,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -200,174, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,175, 29, 7, 0, 0, 0, 0, 88,174, 29, 7, 0, 0, 0, 0, -104,163, 29, 7, 0, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, - 56,175, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,174, 29, 7, 0, 0, 0, 0, -232,159, 29, 7, 0, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, -168,175, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,120,179, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168,161, 29, 7, 0, 0, 0, 0, 88,160, 29, 7, 0, 0, 0, 0,200,160, 29, 7, 0, 0, 0, 0, 24,162, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,169, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, 93, 0, 1, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,237, 29, 7, 0, 0, 0, 0,120,237, 29, 7, 0, 0, 0, 0, -152,176, 29, 7, 0, 0, 0, 0, 8,178, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,176, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 8,178, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,236, 3, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,127, 7, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,178, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,176, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,239, 68, - 0, 0, 0, 0, 0, 0, 28, 66, 0, 0, 0, 0, 0,192,237, 68, 0, 0, 0, 0, 0, 0,134, 66,110, 7, 0, 0,127, 7, 0, 0, - 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,109, 7, 0, 0, - 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,127, 7, 67, 0,110, 7, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,169, 3, 0, 0,235, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,127, 7, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120,179, 29, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0, 8,204, 29, 7, 0, 0, 0, 0,168,175, 29, 7, 0, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, -184,164, 29, 7, 0, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0, 56,161, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 5, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,235, 2, 0, 0, 4, 4,142, 1,236, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,200,202, 29, 7, 0, 0, 0, 0,200,202, 29, 7, 0, 0, 0, 0,104,180, 29, 7, 0, 0, 0, 0, -216,181, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,180, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -216,181, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,198, 67, 0, 0,200, 65, 0,128,198, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,142, 1, 26, 0,142, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 5, 0, 0,126, 7, 0, 0,210, 2, 0, 0,235, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 1, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,181, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,104,180, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,198, 67, 0, 0, 61,196, 0, 0, 0, 0, - 0, 0, 0, 0,254,127,190, 67,254,127, 52,196, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, - 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,142, 1,210, 2,125, 1,210, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 5, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,209, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 1,210, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,183, 29, 7, 0, 0, 0, 0, - 40,201, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,183, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -232,184, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -232,184, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136,186, 29, 7, 0, 0, 0, 0, 72,183, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136,186, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 40,188, 29, 7, 0, 0, 0, 0,232,184, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,111,255,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, - 40,188, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,200,189, 29, 7, 0, 0, 0, 0,136,186, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115, -105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115, -105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200,189, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -104,191, 29, 7, 0, 0, 0, 0, 40,188, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -104,191, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 8,193, 29, 7, 0, 0, 0, 0,200,189, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, - 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, - 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66, -108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 8,193, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -168,194, 29, 7, 0, 0, 0, 0,104,191, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10,254,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -168,194, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 72,196, 29, 7, 0, 0, 0, 0, 8,193, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114, -109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114, -109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,253,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,196, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, -232,197, 29, 7, 0, 0, 0, 0,168,194, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,218,253,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, -232,197, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,136,199, 29, 7, 0, 0, 0, 0, 72,196, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,253,124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,136,199, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, - 40,201, 29, 7, 0, 0, 0, 0,232,197, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40,253,124, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, - 40,201, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,199, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200,202, 29, 7, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, - 8,204, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,152,217, 29, 7, 0, 0, 0, 0,120,179, 29, 7, 0, 0, 0, 0, - 72,164, 29, 7, 0, 0, 0, 0,152,165, 29, 7, 0, 0, 0, 0,136,162, 29, 7, 0, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,105, 1, 0, 0,167, 3, 0, 0, 1, 1,247, 2, 63, 2, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,215, 29, 7, 0, 0, 0, 0,232,215, 29, 7, 0, 0, 0, 0, -248,204, 29, 7, 0, 0, 0, 0,184,210, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,204, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,104,206, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 2, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128, 61, 68, 0, 0,200, 65, 0,128, 61, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,247, 2, 26, 0,247, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,105, 1, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,206, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,216,207, 29, 7, 0, 0, 0, 0,248,204, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,249, 2, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 37, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,207, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 72,209, 29, 7, 0, 0, 0, 0,104,206, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, - 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,131, 1, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,209, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0,184,210, 29, 7, 0, 0, 0, 0,216,207, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, - 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, - 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,210, 29, 7, 0, 0, 0, 0, -216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,209, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 2, 0, 0,239, 5, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40,212, 29, 7, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0, 40,212, 29, 7, 0, 0, 0, 0, -174, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,141,193, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -225,215,163,188, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, - 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62, -166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192, -248,209,213, 64, 0, 0,128, 63,178,157,229, 62, 30,132, 27,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63,166,235,149, 62, - 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,212, 60,173, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, - 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,160, 32,182,252, 5,136,190, 43, 33, 3, 62, -235,135, 23, 63, 0, 0, 96, 53,215,104, 25,196,133,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,158, 87,135,195, -205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, - 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -214,211,111,193, 0, 0,128, 63,178,157,229, 62, 30,132, 27,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63,166,235,149, 62, - 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,212, 60,173, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, - 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 46, 86, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 86, 45, 64, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 86, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, - 0, 0, 0, 0, 0, 0, 0, 0,107,227, 29, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, -255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66, - 86,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0, -232,215, 29, 7, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,205,204, 76, 62, - 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63, 10,215, 35, 60, - 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,152,217, 29, 7, 0, 0, 0, 0, -215, 0, 0, 0, 1, 0, 0, 0,248,223, 29, 7, 0, 0, 0, 0, 8,204, 29, 7, 0, 0, 0, 0,232,159, 29, 7, 0, 0, 0, 0, -104,163, 29, 7, 0, 0, 0, 0,216,163, 29, 7, 0, 0, 0, 0,248,162, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0,103, 1, 0, 0, 18, 18,240, 5,104, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40,222, 29, 7, 0, 0, 0, 0, 40,222, 29, 7, 0, 0, 0, 0,136,218, 29, 7, 0, 0, 0, 0, -248,219, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,218, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, -248,219, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 0, 10, 0,240, 5, 26, 0,240, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,219, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,136,218, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0, 0, 51, 67, - 0, 0, 0, 0, 0,224,187, 68, 0, 0, 0, 0, 0, 0,167, 67,223, 5, 0, 0,240, 5, 0, 0, 0, 0, 0, 0, 77, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 0, 0, 0, 0, 77, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, - 2, 0, 0, 4, 10, 0,240, 5, 78, 1,223, 5, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 26, 0, 0, 0,103, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,221, 29, 7, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216,221, 29, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,216,221, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,136, 1, 0, 0, 40,222, 29, 7, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,221, 29, 7, 0, 0, 0, 0,104,221, 29, 7, 0, 0, 0, 0, 62, 62, 62, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104, -111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, - 8, 4, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248,223, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,184,230, 29, 7, - 0, 0, 0, 0,152,217, 29, 7, 0, 0, 0, 0,184,164, 29, 7, 0, 0, 0, 0,136,162, 29, 7, 0, 0, 0, 0, 24,162, 29, 7, - 0, 0, 0, 0, 40,165, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0,237, 2, 0, 0, -167, 3, 0, 0, 3, 3,142, 1,187, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,227, 29, 7, - 0, 0, 0, 0,200,227, 29, 7, 0, 0, 0, 0,232,224, 29, 7, 0, 0, 0, 0, 88,226, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 1, 0, 0,232,224, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 88,226, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,198, 67, 0, 0,200, 65, 0,128,198, 67, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,142, 1, 26, 0,142, 1, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0,237, 2, 0, 0, - 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 1, 0, 0, 88,226, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,224, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,244,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,190, 67, 0, 0, 15,195, - 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 12, 4, 6, 0,142, 1,161, 0,125, 1, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 5, 0, 0,126, 7, 0, 0, 7, 3, 0, 0, -167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 1, 0, 0,200,227, 29, 7, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,229, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, 40,229, 29, 7, 0, 0, 0, 0,238, 0, 0, 0, - 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,136,229, 29, 7, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,136,229, 29, 7, - 0, 0, 0, 0,237, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 19, 0, 0, 0, - 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 21, 0, 1, 0, - 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,128, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0,152,137, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 56,192, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0,120,151, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,136,173, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0,216,144, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,104,123, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,122, 30, 7, 0, 0, 0, 0, 21, 0, 0, 0, - 1, 0, 1, 0,120,101, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,230, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,223, 29, 7, 0, 0, 0, 0,104,163, 29, 7, 0, 0, 0, 0,168,161, 29, 7, - 0, 0, 0, 0,152,165, 29, 7, 0, 0, 0, 0, 72,164, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 2, 0, 0,105, 1, 0, 0,167, 3, 0, 0, 9, 9,248, 2, 63, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,136,234, 29, 7, 0, 0, 0, 0,136,234, 29, 7, 0, 0, 0, 0,168,231, 29, 7, 0, 0, 0, 0, 24,233, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,231, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24,233, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 62, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 61, 68, - 0, 0,200, 65, 0,192, 61, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, - 10, 0,248, 2, 26, 0,248, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 2, 0, 0,105, 1, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 2, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,233, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,168,231, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, - 8, 41,100, 68, 46,224, 62, 67,233, 15,206, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 2, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, - 10, 0,248, 2, 37, 2,248, 2, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 2, 0, 0,131, 1, 0, 0,167, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 2, 37, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,160, 2, 0, 0,136,234, 29, 7, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -205,204,204, 61,231, 1, 0, 0,243, 1, 0, 0,122, 1, 0, 0,124, 1, 0, 0,231, 1, 0, 0,243, 1, 0, 0, 4, 0, 0, 0, -124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, - 8, 1, 0, 0, 8,238, 29, 7, 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 40, 53, 30, 7, 0, 0, 0, 0,152,158, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,239, 29, 7, 0, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0,216,242, 29, 7, - 0, 0, 0, 0, 56,247, 29, 7, 0, 0, 0, 0,168,247, 29, 7, 0, 0, 0, 0,200, 35, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 32, 0, 0, 0, 88,239, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200,239, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,239, 29, 7, - 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56,240, 29, 7, 0, 0, 0, 0, 88,239, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,240, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, - 1, 0, 0, 0,168,240, 29, 7, 0, 0, 0, 0,200,239, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 5, 4, - 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,240, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 24,241, 29, 7, - 0, 0, 0, 0, 56,240, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 32, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0,168,240, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,241, 29, 7, - 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,126, 7,234, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, - 1, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 3,234, 3, - 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,216,242, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72,243, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,200,239, 29, 7, 0, 0, 0, 0, 56,240, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0, 72,243, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184,243, 29, 7, 0, 0, 0, 0,216,242, 29, 7, - 0, 0, 0, 0,200,239, 29, 7, 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,184,243, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40,244, 29, 7, 0, 0, 0, 0, 72,243, 29, 7, - 0, 0, 0, 0, 56,240, 29, 7, 0, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0, 40,244, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152,244, 29, 7, 0, 0, 0, 0,184,243, 29, 7, - 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,152,244, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8,245, 29, 7, 0, 0, 0, 0, 40,244, 29, 7, - 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0, 8,245, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120,245, 29, 7, 0, 0, 0, 0,152,244, 29, 7, - 0, 0, 0, 0, 88,239, 29, 7, 0, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,120,245, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232,245, 29, 7, 0, 0, 0, 0, 8,245, 29, 7, - 0, 0, 0, 0, 88,239, 29, 7, 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,232,245, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88,246, 29, 7, 0, 0, 0, 0,120,245, 29, 7, - 0, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0, 88,246, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200,246, 29, 7, 0, 0, 0, 0,232,245, 29, 7, - 0, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,200,246, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56,247, 29, 7, 0, 0, 0, 0, 88,246, 29, 7, - 0, 0, 0, 0,168,240, 29, 7, 0, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0, 56,247, 29, 7, 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,246, 29, 7, - 0, 0, 0, 0,168,240, 29, 7, 0, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -160, 0, 0, 0,168,247, 29, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,120,251, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0,200,239, 29, 7, 0, 0, 0, 0, 56,240, 29, 7, 0, 0, 0, 0,136,241, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 5, 4, 0, 0, 7, 7,127, 7, - 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 52, 30, 7, 0, 0, 0, 0,152, 52, 30, 7, - 0, 0, 0, 0,152,248, 29, 7, 0, 0, 0, 0, 8,250, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,248, 29, 7, - 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 8,250, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,239, 68, 0, 0,200, 65, 0,192,239, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,235, 3, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,250, 29, 7, - 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,248, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0, -129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120,251, 29, 7, - 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,200, 35, 30, 7, 0, 0, 0, 0,168,247, 29, 7, 0, 0, 0, 0, 88,239, 29, 7, - 0, 0, 0, 0, 24,241, 29, 7, 0, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, 6, 6,200, 3,234, 3, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 2, 30, 7, 0, 0, 0, 0, 88, 2, 30, 7, 0, 0, 0, 0,104,252, 29, 7, - 0, 0, 0, 0,232, 0, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,252, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0,216,253, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,114, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,192,113, 68, 0, 0,200, 65, 0,192,113, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,200, 3, 26, 0,200, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,200, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,253, 29, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0,232, 0, 30, 7, 0, 0, 0, 0,104,252, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 67, 0,192,115,196, - 0, 0, 0, 0, 0, 0, 0, 0,254,255, 74, 67,254,255,115,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, -207, 3, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, -207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,208, 3,203, 0,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,220, 0,208, 3, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,255, 29, 7, - 0, 0, 0, 0, 72,255, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,255, 29, 7, 0, 0, 0, 0,214, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,152,255,202, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 1, 0, 0,232, 0, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,253, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 51, 51, 43,191,154,153,213, 63, 51, 51,131,191, -154,153, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,236, 2, 0, 0, 0, 0, 0, 0,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0,199, 3, 0, 0, 26, 0, 0, 0, -233, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236, 2,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 33, 0, 0, 88, 2, 30, 7, 0, 0, 0, 0,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -160, 0, 0, 0,200, 35, 30, 7, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,251, 29, 7, - 0, 0, 0, 0,104,242, 29, 7, 0, 0, 0, 0,248,241, 29, 7, 0, 0, 0, 0,136,241, 29, 7, 0, 0, 0, 0,168,240, 29, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, 1, 1,182, 3, -234, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 50, 30, 7, 0, 0, 0, 0,232, 50, 30, 7, - 0, 0, 0, 0,184, 36, 30, 7, 0, 0, 0, 0,184, 45, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 36, 30, 7, - 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40, 38, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,109, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64,109, 68, 0, 0,200, 65, 0, 64,109, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,182, 3, 26, 0,182, 3, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40, 38, 30, 7, - 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 56, 41, 30, 7, 0, 0, 0, 0,184, 36, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 67, 0, 0, 86,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 86,196, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 0, 0, 0, 0, 87, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, 88, 3,143, 0, 88, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0,104, 4, 0, 0,146, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 88, 3, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152, 39, 30, 7, 0, 0, 0, 0,152, 39, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 39, 30, 7, - 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, - 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, - 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233,253,143, 0,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 41, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 72, 44, 30, 7, - 0, 0, 0, 0, 40, 38, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0, -231,102, 16, 67, 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, - 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 3, 0, 0, -104, 4, 0, 0, 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, - 0, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 42, 30, 7, 0, 0, 0, 0,168, 42, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 42, 30, 7, 0, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, - 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255, -144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 44, 30, 7, - 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184, 45, 30, 7, 0, 0, 0, 0, 56, 41, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 35, 67, 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0, -180, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0,126, 7, 0, 0, 26, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 45, 30, 7, - 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 44, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 4, 0, 0,126, 7, 0, 0, 26, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3,208, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 47, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65,112, 3, 0, 0, 40, 47, 30, 7, - 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 72,246,172, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190, -142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64, -136, 95,161,191,147,231,198, 63, 0, 0,128, 63,185,214, 13, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,189,188,157, 63, -140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,241,213,146,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64,121, 92,155, 62,151,198, 44, 63,192,214, 32,188, 0, 0, 40,180,195, 15,188,190, -132, 75, 53, 62,216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 17,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65, -247, 46,190,192, 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63,185,214, 13, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,189,188,157, 63, -140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,241,213,146,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,201,250, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248,201,250, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,201,250, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, - 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0,114,145,245, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 96, 1, 0, 0,232, 50, 30, 7, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, -205,204, 76, 62, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 8, 8,128, 0, 0, 0, 12, 66, 0, 0,128, 63, -205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 10, 0, 7, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 8, 1, 0, 0, 40, 53, 30, 7, - 0, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,238, 29, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,120, 54, 30, 7, 0, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0,184, 59, 30, 7, 0, 0, 0, 0, 40, 67, 30, 7, - 0, 0, 0, 0,152, 67, 30, 7, 0, 0, 0, 0,248, 92, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 54, 30, 7, - 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,232, 54, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232, 54, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, - 1, 0, 0, 0, 88, 55, 30, 7, 0, 0, 0, 0,120, 54, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 2, - 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 55, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,200, 55, 30, 7, - 0, 0, 0, 0,232, 54, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4,222, 2, 0, 0, 0, 0, 68, 65, 84, 65, - 32, 0, 0, 0,200, 55, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 56, 56, 30, 7, 0, 0, 0, 0, 88, 55, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56, 56, 30, 7, - 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0,200, 55, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, - 1, 0, 0, 0, 24, 57, 30, 7, 0, 0, 0, 0, 56, 56, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4,195, 2, - 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 57, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,136, 57, 30, 7, - 0, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 92, 1, 0, 0, 0, 0, 68, 65, 84, 65, - 32, 0, 0, 0,136, 57, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,248, 57, 30, 7, 0, 0, 0, 0, 24, 57, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 57, 30, 7, - 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0,136, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 2,195, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, - 1, 0, 0, 0,216, 58, 30, 7, 0, 0, 0, 0,248, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 1, - 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 58, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 72, 59, 30, 7, - 0, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 2, 92, 1, 0, 0, 0, 0, 68, 65, 84, 65, - 32, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 58, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 68, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 59, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40, 60, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 54, 30, 7, - 0, 0, 0, 0, 88, 55, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 60, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,152, 60, 30, 7, 0, 0, 0, 0,184, 59, 30, 7, 0, 0, 0, 0,232, 54, 30, 7, - 0, 0, 0, 0, 56, 56, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 60, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 8, 61, 30, 7, 0, 0, 0, 0, 40, 60, 30, 7, 0, 0, 0, 0, 88, 55, 30, 7, - 0, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 61, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,120, 61, 30, 7, 0, 0, 0, 0,152, 60, 30, 7, 0, 0, 0, 0, 56, 56, 30, 7, - 0, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 61, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,232, 61, 30, 7, 0, 0, 0, 0, 8, 61, 30, 7, 0, 0, 0, 0,168, 56, 30, 7, - 0, 0, 0, 0, 24, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 61, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 88, 62, 30, 7, 0, 0, 0, 0,120, 61, 30, 7, 0, 0, 0, 0,120, 54, 30, 7, - 0, 0, 0, 0,136, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 62, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,200, 62, 30, 7, 0, 0, 0, 0,232, 61, 30, 7, 0, 0, 0, 0, 56, 56, 30, 7, - 0, 0, 0, 0,248, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 62, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 56, 63, 30, 7, 0, 0, 0, 0, 88, 62, 30, 7, 0, 0, 0, 0,136, 57, 30, 7, - 0, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 63, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,168, 63, 30, 7, 0, 0, 0, 0,200, 62, 30, 7, 0, 0, 0, 0,104, 58, 30, 7, - 0, 0, 0, 0,216, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 63, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 24, 64, 30, 7, 0, 0, 0, 0, 56, 63, 30, 7, 0, 0, 0, 0,248, 57, 30, 7, - 0, 0, 0, 0,216, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 64, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,136, 64, 30, 7, 0, 0, 0, 0,168, 63, 30, 7, 0, 0, 0, 0, 24, 57, 30, 7, - 0, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 64, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,248, 64, 30, 7, 0, 0, 0, 0, 24, 64, 30, 7, 0, 0, 0, 0,200, 55, 30, 7, - 0, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 64, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,104, 65, 30, 7, 0, 0, 0, 0,136, 64, 30, 7, 0, 0, 0, 0,136, 57, 30, 7, - 0, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 65, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,216, 65, 30, 7, 0, 0, 0, 0,248, 64, 30, 7, 0, 0, 0, 0,120, 54, 30, 7, - 0, 0, 0, 0,200, 55, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 65, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 72, 66, 30, 7, 0, 0, 0, 0,104, 65, 30, 7, 0, 0, 0, 0,168, 56, 30, 7, - 0, 0, 0, 0,248, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 66, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,184, 66, 30, 7, 0, 0, 0, 0,216, 65, 30, 7, 0, 0, 0, 0, 24, 57, 30, 7, - 0, 0, 0, 0,216, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 66, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 40, 67, 30, 7, 0, 0, 0, 0, 72, 66, 30, 7, 0, 0, 0, 0, 56, 56, 30, 7, - 0, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 67, 30, 7, - 0, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 66, 30, 7, 0, 0, 0, 0, 24, 57, 30, 7, - 0, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,152, 67, 30, 7, - 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,104, 71, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 30, 7, - 0, 0, 0, 0,232, 54, 30, 7, 0, 0, 0, 0, 88, 55, 30, 7, 0, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0,196, 2, 0, 0,222, 2, 0, 0, 7, 7,241, 4, 27, 0, 1, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,100, 30, 7, 0, 0, 0, 0,232,100, 30, 7, 0, 0, 0, 0,136, 68, 30, 7, - 0, 0, 0, 0,248, 69, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 68, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0,248, 69, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,148, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0,158, 68, 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0,196, 2, 0, 0,221, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,241, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 69, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 68, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, - 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, - 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 2, 0, 0,222, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104, 71, 30, 7, 0, 0, 0, 0,215, 0, 0, 0, - 1, 0, 0, 0, 88, 76, 30, 7, 0, 0, 0, 0,152, 67, 30, 7, 0, 0, 0, 0,120, 54, 30, 7, 0, 0, 0, 0,136, 57, 30, 7, - 0, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0,200, 55, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 15, 15,241, 4, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 75, 30, 7, 0, 0, 0, 0, 56, 75, 30, 7, 0, 0, 0, 0, 88, 72, 30, 7, 0, 0, 0, 0,200, 73, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 72, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,200, 73, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,140, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,158, 68, - 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, - 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 4, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 73, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 72, 30, 7, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192, -246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0,128, 63, - 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, - 8, 0,241, 4, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 0, 0, 26, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 4, 42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, 56, 75, 30, 7, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88, 76, 30, 7, 0, 0, 0, 0,215, 0, 0, 0, - 1, 0, 0, 0, 72, 84, 30, 7, 0, 0, 0, 0,104, 71, 30, 7, 0, 0, 0, 0,136, 57, 30, 7, 0, 0, 0, 0,104, 58, 30, 7, - 0, 0, 0, 0, 24, 57, 30, 7, 0, 0, 0, 0, 72, 59, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 0, 0, 69, 0, 0, 0, 91, 1, 0, 0, 8, 8,241, 4, 23, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 83, 30, 7, 0, 0, 0, 0, 8, 83, 30, 7, 0, 0, 0, 0, 72, 77, 30, 7, 0, 0, 0, 0,152, 81, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 77, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,184, 78, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 26, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 32,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,158, 68, - 0, 0,200, 65, 0, 0,158, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, - 10, 0,241, 4, 26, 0,241, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 4, 0, 0, 69, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 4, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 78, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 40, 80, 30, 7, - 0, 0, 0, 0, 72, 77, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,125,195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 75, 67, 1, 0,125,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, - 6, 0,220, 0,253, 0,203, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0, -240, 4, 0, 0, 95, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,253, 0, - 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40, 80, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,152, 81, 30, 7, - 0, 0, 0, 0,184, 78, 30, 7, 0, 0, 0, 0, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, - 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 4, 0, 0, 91, 1, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 81, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 80, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, - 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,252, 0, 0, 0, 18, 0, 0, 0, - 20, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 20, 4, 0, 0, 18, 0, 0, 0,252, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 63, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 8, 0, 21, 4,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 4, 0, 0, 95, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4,253, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 8, 83, 30, 7, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 72, 84, 30, 7, 0, 0, 0, 0,215, 0, 0, 0, - 1, 0, 0, 0,248, 92, 30, 7, 0, 0, 0, 0, 88, 76, 30, 7, 0, 0, 0, 0,104, 58, 30, 7, 0, 0, 0, 0, 56, 56, 30, 7, - 0, 0, 0, 0,248, 57, 30, 7, 0, 0, 0, 0,216, 58, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 47, 2, 0, 0, 93, 1, 0, 0,194, 2, 0, 0, 2, 2, 48, 2,102, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,248, 90, 30, 7, 0, 0, 0, 0,248, 90, 30, 7, 0, 0, 0, 0, 56, 85, 30, 7, 0, 0, 0, 0,136, 89, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 85, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,168, 86, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, 68, 0, 0, 0, 0, 0, 0,208, 65,154,216, 65, 55, - 0, 0, 12, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 11, 68, - 0, 0,200, 65, 0,192, 11, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, - 10, 0, 48, 2, 26, 0, 48, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 47, 2, 0, 0, 93, 1, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 2, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 86, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 24, 88, 30, 7, - 0, 0, 0, 0, 56, 85, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 67, 0, 0,157,195, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, - 6, 0,217, 0, 76, 1,200, 0, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 0, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 76, 1, - 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 88, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,136, 89, 30, 7, - 0, 0, 0, 0,168, 86, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 2, 0, 0, - 47, 2, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 89, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 88, 30, 7, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, - 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0, - 86, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 86, 1, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0,111, 18,131, 58, -111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 87, 1, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, - 47, 2, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 1, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,248, 90, 30, 7, 0, 0, 0, 0,179, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 92, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0, 56, 92, 30, 7, 0, 0, 0, 0, 38, 1, 0, 0, - 1, 0, 0, 0,120,101, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 92, 30, 7, - 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 84, 30, 7, 0, 0, 0, 0,216, 58, 30, 7, - 0, 0, 0, 0,248, 57, 30, 7, 0, 0, 0, 0,168, 56, 30, 7, 0, 0, 0, 0, 24, 57, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 49, 2, 0, 0,240, 4, 0, 0, 93, 1, 0, 0,194, 2, 0, 0, 8, 8,192, 2,102, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 99, 30, 7, 0, 0, 0, 0,168, 99, 30, 7, 0, 0, 0, 0,232, 93, 30, 7, - 0, 0, 0, 0, 56, 98, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 93, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0, 88, 95, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 48, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,192, 47, 68, 0, 0,200, 65, 0,192, 47, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,192, 2, 26, 0,192, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 49, 2, 0, 0,240, 4, 0, 0, 93, 1, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,192, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 95, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0,200, 96, 30, 7, 0, 0, 0, 0,232, 93, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 4, 0, 0,240, 4, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 96, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0, 56, 98, 30, 7, 0, 0, 0, 0, 88, 95, 30, 7, 0, 0, 0, 0, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, - 0, 0,135, 67,238, 33,143,196,238, 33,143, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 2, 0, 0, 0, 0, 0, 0, - 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 4, 0, 0,192, 2, 76, 1,192, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 49, 2, 0, 0,240, 4, 0, 0,119, 1, 0, 0,194, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,192, 2, 76, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 98, 30, 7, 0, 0, 0, 0,216, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 96, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, - 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 18, 0, 0, 0, - 75, 1, 0, 0, 0, 0, 32, 65, 0, 0, 0, 63, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,168, 99, 30, 7, 0, 0, 0, 0,181, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0,216, 11, 0, 0, +120,184,168, 5, 0, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0,216, 11, 0, 0,120,101, 30, 7, - 0, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, +152,196,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 72,210,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,104,197,168, 5, 0, 0, 0, 0, 72,198,168, 5, 0, 0, 0, 0,104,197,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,113, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 40,128, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,104,114, 30, 7, 0, 0, 0, 0, 72,115, 30, 7, 0, 0, 0, 0,104,114, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,115, 30, 7, 0, 0, 0, 0,136, 5, 84, 8, - 0, 0, 0, 0, 17, 2, 24, 0, 90, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,198,168, 5, 0, 0, 0, 0, + 56,143,132, 5, 0, 0, 0, 0, 17, 2, 24, 0, 90, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, - 68,172, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 6, 0, 50, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 24, 0, 17, 0, 0, 0, 90, 0, 1, 0, 81, 0, 0, 0, 23, 0, 33, 0, - 2, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,168,119, 30, 7, 0, 0, 0, 0,168,119, 30, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, - 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +192, 0, 0, 0, 68,172, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, +250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 6, 0, 50, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 24, 0, 17, 0, 0, 0, 90, 0, 1, 0, 81, 0, 0, 0, + 23, 0, 33, 0, 2, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200,202,168, 5, 0, 0, 0, 0,200,202,168, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5890,7 +5890,7 @@ char datatoc_startup_blend[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5914,5019 +5914,5029 @@ char datatoc_startup_blend[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63, -205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78, - 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, - 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,225, 26, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 22,157, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,232,248,247, 6, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, -205,204,204, 61,154,153,153, 62,205,204, 76, 62,219, 15, 73, 63,102,102,102, 63, 0, 0, 0, 64,154,153, 25, 63, 0, 0, 64, 65, -102,102,166, 63, 0, 0, 0, 65, 0, 0,160, 65, 6, 0, 0, 0, 0, 0,192, 64, 0, 0,128, 63, 0, 0, 0, 0,205,204, 28, 65, - 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 1, 0,128, 0, 5, 0,218, 0, 0, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,152,113, 30, 7, 0, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,173, 2, 95, 0,154,153,217, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 76, 69, 78, 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68,172, 0, 0, 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48,194,132, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 38,140, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200,104, 99, 4, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 5, 0,205,204,204, 61,154,153,153, 62,205,204, 76, 62,219, 15, 73, 63,102,102,102, 63, 0, 0, 0, 64,154,153, 25, 63, + 0, 0, 64, 65,102,102,166, 63, 0, 0, 0, 65, 0, 0,160, 65, 6, 0, 0, 0, 0, 0,192, 64, 0, 0,128, 63, 0, 0, 0, 0, +205,204, 28, 65, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 1, 0,128, 0, 5, 0,218, 0, 0, 0, 60, 0, 5, 0, 1, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +195,245, 28,193, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 38, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,152,196,168, 5, 0, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,104,197,168, 5, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0,216,197,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,224, 2,168, 1,184,219,168, 5, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,216,197,168, 5, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 72,198,168, 5, 0, 0, 0, 0, +104,197,168, 5, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,183, 3,241, 2, 88,226,168, 5, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72,198,168, 5, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +216,197,168, 5, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,162, 0, 12, 2, 24,213,168, 5, 0, 0, 0, 0, + 68, 65, 84, 65,248, 1, 0, 0,184,198,168, 5, 0, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0,248,200,168, 5, 0, 0, 0, 0, +136,201,168, 5, 0, 0, 0, 0, 24,202,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, +205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, 32, 0, 32, 0, + 32, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, +232, 25,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, + 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, + 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, + 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, + 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61, +102,102,166, 63, 0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 67, 2, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63, 0, 0, 0, 63, 35, 0, 0, 0,204,197,121, 63, + 0, 0, 0, 63, 0, 0,128, 63, 49, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 0, 0, 0,248,200,168, 5, 0, 0, 0, 0, +165, 0, 0, 0, 1, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 0, 0, 0,136,201,168, 5, 0, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, +168,115,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255,128, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,104, 0, 0, 0, 24,202,168, 5, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0,155, 9, 25, 67,190, 23,237, 64, 75, 1,147, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,128, 0, 0, 0,200,202,168, 5, 0, 0, 0, 0,150, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,127, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,200, 0, 0, 0, +216,204,168, 5, 0, 0, 0, 0, 22, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, + 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,205,204,204, 61, 0, 0,200, 66, + 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 66, 0, 0,144, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 16, 2, 0, 0, +232,205,168, 5, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 72,208,168, 5, 0, 0, 0, 0, + 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,209,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 64, 1, 0, 0, 72,208,168, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63, +242, 4, 53,191,243, 4, 53, 63, 24, 73,137, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, + 24, 73,137, 5, 0, 0, 0, 0,125, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,209,168, 5, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0, 24, 2, 0, 0, 72,210,168, 5, 0, 0, 0, 0,143, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 79, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, + 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,168,212,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +168,212,168, 5, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,112, 5, 0, 0, + 24,213,168, 5, 0, 0, 0, 0,130, 0, 0, 0, 1, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, + 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,204,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 42,254,141, 63,192, 57, 49, 60, + 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, + 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0, +110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0,128, 63, 1, 0,128, 51, 1, 0, 0,179, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0, 2, 0, 0,179, 2, 0, 0,167, 1, 0,128, 63, 0, 0, 0, 0, + 1, 0, 0, 53, 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63,221,149, 47, 63, 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, + 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,192, 56, 49,188, 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, + 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, + 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 1, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +216,218,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,152, 0, 0, 0,216,218,168, 5, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 79, 66, 0, 0,112, 5, 0, 0,184,219,168, 5, 0, 0, 0, 0, +130, 0, 0, 0, 1, 0, 0, 0, 88,226,168, 5, 0, 0, 0, 0, 24,213,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,171,100, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 17,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, + 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,213,134, 5, 0, 0, 0, 0,136, 83,135, 5, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, + 0, 0, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63, +169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 1, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,225,168, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120,247,139, 5, 0, 0, 0, 0, 24,149,132, 5, 0, 0, 0, 0, 25, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, + 40,213,134, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0, +136, 83,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,120,225,168, 5, + 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 0, 0, 0, 79, 66, 0, 0,112, 5, 0, 0, 88,226,168, 5, 0, 0, 0, 0,130, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,184,219,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97, +109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232,205,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64, +183,178,128, 63,112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, + 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63, +241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 1, 0,128, 50, 0, 0, 0,179, 0, 0, 0, 0, 1, 0,128, 50, 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 39, 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 54,236,148,190, +221,102, 69,191, 38,255, 16, 63, 0, 0, 0, 0, 24,134,116, 63, 57,174, 76,190,239,161, 95, 62, 0, 0, 0, 0,237, 13, 98,189, + 35,194, 26, 63,166,111, 75, 63, 0, 0, 0, 0,209, 19, 13, 63,241, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62, +229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 5, 0, 1, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,232,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0, 24,232,168, 5, 0, 0, 0, 0,133, 0, 0, 0, + 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, +205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 77, 65, 0, 0, +128, 3, 0, 0,248,232,168, 5, 0, 0, 0, 0, 39, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 8, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,205,204, 76, 63,205,204, 76, 63, +205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, +205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 50, 0,205,204, 76, 62, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,160, 63, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6, + 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 4, 0, + 67, 0, 64, 3, 67, 0, 64, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0,128, 64, + 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,200,236,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 72,238,168, 5, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63,205,204, 76, 61, +205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,200,236,168, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,255,168, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 40, 0, 0, 0, 72,238,168, 5, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 53, 0, 53, 0,184,238,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0,184,238,168, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 51, 2, 2, 2, 51, 6, 6, 6,153, 6, 6, 6,153, 6, 6, 6,153, + 4, 4, 4,102, 3, 3, 3,102, 2, 2, 2, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 51, 8, 8, 8,153, 11, 11, 11,204, 13, 13, 13,255, 12, 12, 12,255, 12, 12, 12,255, 11, 11, 11,255, 10, 10, 10,255, + 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 4, 4, 4,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 51, 10, 10, 10,153, + 18, 18, 18,255, 20, 20, 20,255, 22, 22, 22,255, 23, 23, 23,255, 22, 22, 22,255, 20, 20, 20,255, 19, 19, 19,255, 16, 16, 16,255, + 14, 14, 14,255, 11, 11, 11,255, 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 8, 8, 8,204, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,102, 19, 19, 19,204, 27, 27, 27,255, + 31, 31, 31,255, 32, 32, 32,255, 33, 33, 33,255, 33, 33, 33,255, 31, 31, 31,255, 30, 30, 30,255, 27, 27, 27,255, 25, 25, 25,255, + 22, 22, 22,255, 19, 19, 19,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, + 4, 4, 4,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,153, 29, 29, 29,255, 37, 37, 37,255, 40, 40, 40,255, + 42, 42, 42,255, 42, 42, 42,255, 43, 43, 43,255, 41, 41, 41,255, 40, 40, 40,255, 38, 38, 38,255, 36, 36, 36,255, 33, 33, 33,255, + 30, 30, 30,255, 27, 27, 27,255, 24, 24, 24,255, 20, 20, 20,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, + 10, 10, 10,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 37, 37, 37,255, 44, 44, 44,255, 48, 48, 48,255, 50, 50, 50,255, + 51, 51, 51,255, 51, 51, 51,255, 50, 50, 50,255, 49, 49, 49,255, 48, 48, 48,255, 45, 45, 45,255, 43, 43, 43,255, 41, 41, 41,255, + 37, 37, 37,255, 34, 34, 34,255, 31, 31, 31,255, 28, 28, 28,255, 24, 24, 24,255, 20, 20, 20,255, 15, 15, 15,255, 11, 11, 11,255, + 10, 10, 10,255, 11, 11, 11,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 41, 41, 41,255, 50, 50, 50,255, 54, 54, 54,255, 57, 57, 57,255, 58, 58, 58,255, + 59, 59, 59,255, 59, 59, 59,255, 58, 58, 58,255, 57, 57, 57,255, 55, 55, 55,255, 53, 53, 53,255, 51, 51, 51,255, 48, 48, 48,255, + 45, 45, 45,255, 41, 41, 41,255, 38, 38, 38,255, 35, 35, 35,255, 31, 31, 31,255, 27, 27, 27,255, 23, 23, 23,255, 17, 17, 17,255, + 12, 12, 12,255, 11, 11, 11,255, 11, 11, 11,255, 5, 5, 5,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36,204, 53, 53, 53,255, 59, 59, 59,255, 63, 63, 63,255, 65, 65, 65,255, 66, 66, 66,255, + 66, 66, 66,255, 66, 66, 66,255, 65, 65, 65,255, 64, 64, 64,255, 62, 62, 62,255, 60, 60, 60,255, 57, 57, 57,255, 54, 54, 54,255, + 51, 51, 51,255, 48, 48, 48,255, 44, 44, 44,255, 41, 41, 41,255, 37, 37, 37,255, 33, 33, 33,255, 29, 29, 29,255, 24, 24, 24,255, + 19, 19, 19,255, 13, 13, 13,255, 11, 11, 11,255, 12, 12, 12,255, 3, 3, 3, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 19, 19,102, 56, 56, 56,255, 64, 64, 64,255, 68, 68, 68,255, 71, 71, 71,255, 73, 73, 73,255, 74, 74, 74,255, + 74, 74, 74,255, 73, 73, 73,255, 72, 72, 72,255, 71, 71, 71,255, 69, 69, 69,255, 67, 67, 67,255, 64, 64, 64,255, 61, 61, 61,255, + 58, 58, 58,255, 54, 54, 54,255, 50, 50, 50,255, 47, 47, 47,255, 43, 43, 43,255, 39, 39, 39,255, 34, 34, 34,255, 30, 30, 30,255, + 25, 25, 25,255, 19, 19, 19,255, 13, 13, 13,255, 12, 12, 12,255, 10, 10, 10,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 54, 54,255, 66, 66, 66,255, 72, 72, 72,255, 77, 77, 77,255, 79, 79, 79,255, 81, 81, 81,255, 81, 81, 81,255, + 81, 81, 81,255, 80, 80, 80,255, 79, 79, 79,255, 77, 77, 77,255, 75, 75, 75,255, 73, 73, 73,255, 70, 70, 70,255, 67, 67, 67,255, + 63, 63, 63,255, 60, 60, 60,255, 56, 56, 56,255, 52, 52, 52,255, 49, 49, 49,255, 44, 44, 44,255, 40, 40, 40,255, 35, 35, 35,255, + 30, 30, 30,255, 24, 24, 24,255, 18, 18, 18,255, 12, 12, 12,255, 12, 12, 12,255, 6, 6, 6,102, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 22, 22,102, 67, 67, 67,255, 76, 76, 76,255, 81, 81, 81,255, 84, 84, 84,255, 87, 87, 87,255, 88, 88, 88,255, 88, 88, 88,255, + 88, 88, 88,255, 87, 87, 87,255, 86, 86, 86,255, 84, 84, 84,255, 82, 82, 82,255, 79, 79, 79,255, 76, 76, 76,255, 73, 73, 73,255, + 69, 69, 69,255, 65, 65, 65,255, 62, 62, 62,255, 58, 58, 58,255, 54, 54, 54,255, 49, 49, 49,255, 45, 45, 45,255, 40, 40, 40,255, + 35, 35, 35,255, 29, 29, 29,255, 23, 23, 23,255, 16, 16, 16,255, 12, 12, 12,255, 12, 12, 12,204, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 49, 49,204, 76, 76, 76,255, 84, 84, 84,255, 89, 89, 89,255, 92, 92, 92,255, 94, 94, 94,255, 95, 95, 95,255, 95, 95, 95,255, + 95, 95, 95,255, 94, 94, 94,255, 93, 93, 93,255, 91, 91, 91,255, 88, 88, 88,255, 85, 85, 85,255, 82, 82, 82,255, 79, 79, 79,255, + 75, 75, 75,255, 71, 71, 71,255, 67, 67, 67,255, 63, 63, 63,255, 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, 45, 45, 45,255, + 40, 40, 40,255, 34, 34, 34,255, 28, 28, 28,255, 21, 21, 21,255, 13, 13, 13,255, 14, 14, 14,255, 0, 0, 0, 0, 14, 14, 14,102, + 70, 70, 70,255, 85, 85, 85,255, 92, 92, 92,255, 97, 97, 97,255,100,100,100,255,102,102,102,255,102,102,102,255,103,103,103,255, +102,102,102,255,101,101,101,255, 99, 99, 99,255, 97, 97, 97,255, 94, 94, 94,255, 91, 91, 91,255, 88, 88, 88,255, 84, 84, 84,255, + 81, 81, 81,255, 77, 77, 77,255, 72, 72, 72,255, 68, 68, 68,255, 64, 64, 64,255, 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, + 44, 44, 44,255, 39, 39, 39,255, 32, 32, 32,255, 25, 25, 25,255, 17, 17, 17,255, 13, 13, 13,255, 7, 7, 7,102, 24, 24, 24,102, + 80, 80, 80,255, 93, 93, 93,255,100,100,100,255,104,104,104,255,107,107,107,255,109,109,109,255,109,109,109,255,109,109,109,255, +109,109,109,255,107,107,107,255,106,106,106,255,103,103,103,255,100,100,100,255, 97, 97, 97,255, 94, 94, 94,255, 90, 90, 90,255, + 86, 86, 86,255, 82, 82, 82,255, 77, 77, 77,255, 73, 73, 73,255, 69, 69, 69,255, 64, 64, 64,255, 59, 59, 59,255, 54, 54, 54,255, + 49, 49, 49,255, 43, 43, 43,255, 36, 36, 36,255, 29, 29, 29,255, 21, 21, 21,255, 14, 14, 14,255, 10, 10, 10,153, 29, 29, 29,102, + 89, 89, 89,255,100,100,100,255,107,107,107,255,112,112,112,255,114,114,114,255,116,116,116,255,116,116,116,255,116,116,116,255, +115,115,115,255,114,114,114,255,112,112,112,255,110,110,110,255,107,107,107,255,104,104,104,255,100,100,100,255, 96, 96, 96,255, + 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255, 68, 68, 68,255, 63, 63, 63,255, 58, 58, 58,255, + 52, 52, 52,255, 46, 46, 46,255, 40, 40, 40,255, 33, 33, 33,255, 24, 24, 24,255, 17, 17, 17,255, 13, 13, 13,204, 46, 46, 46,153, + 95, 95, 95,255,107,107,107,255,114,114,114,255,118,118,118,255,121,121,121,255,122,122,122,255,123,123,123,255,123,123,123,255, +122,122,122,255,122,122,122,255,120,120,120,255,118,118,118,255,114,114,114,255,110,110,110,255,106,106,106,255,101,101,101,255, + 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255, 68, 68, 68,255, 62, 62, 62,255, + 56, 56, 56,255, 50, 50, 50,255, 44, 44, 44,255, 36, 36, 36,255, 28, 28, 28,255, 19, 19, 19,255, 12, 12, 12,204, 47, 47, 47,153, +101,101,101,255,113,113,113,255,120,120,120,255,125,125,125,255,127,127,127,255,129,129,129,255,130,130,130,255,130,130,130,255, +131,131,131,255,131,131,131,255,131,131,131,255,129,129,129,255,125,125,125,255,120,120,120,255,113,113,113,255,108,108,108,255, +103,103,103,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 82, 82, 82,255, 77, 77, 77,255, 72, 72, 72,255, 66, 66, 66,255, + 60, 60, 60,255, 54, 54, 54,255, 47, 47, 47,255, 39, 39, 39,255, 31, 31, 31,255, 22, 22, 22,255, 12, 12, 12,204, 48, 48, 48,153, +106,106,106,255,118,118,118,255,126,126,126,255,131,131,131,255,134,134,134,255,135,135,135,255,137,137,137,255,138,138,138,255, +142,142,142,255,147,147,147,255,149,149,149,255,148,148,148,255,142,142,142,255,133,133,133,255,124,124,124,255,115,115,115,255, +108,108,108,255,102,102,102,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 81, 81, 81,255, 75, 75, 75,255, 69, 69, 69,255, + 63, 63, 63,255, 57, 57, 57,255, 49, 49, 49,255, 42, 42, 42,255, 33, 33, 33,255, 24, 24, 24,255, 9, 9, 9,153, 32, 32, 32,102, +109,109,109,255,123,123,123,255,131,131,131,255,136,136,136,255,140,140,140,255,142,142,142,255,144,144,144,255,148,148,148,255, +156,156,156,255,168,168,168,255,176,176,176,255,177,177,177,255,168,168,168,255,153,153,153,255,137,137,137,255,124,124,124,255, +114,114,114,255,107,107,107,255,101,101,101,255, 96, 96, 96,255, 90, 90, 90,255, 85, 85, 85,255, 79, 79, 79,255, 72, 72, 72,255, + 66, 66, 66,255, 59, 59, 59,255, 52, 52, 52,255, 44, 44, 44,255, 35, 35, 35,255, 26, 26, 26,255, 10, 10, 10,153, 17, 17, 17, 51, +110,110,110,255,127,127,127,255,136,136,136,255,142,142,142,255,145,145,145,255,148,148,148,255,151,151,151,255,159,159,159,255, +174,174,174,255,195,195,195,255,212,212,212,255,216,216,216,255,204,204,204,255,179,179,179,255,154,154,154,255,135,135,135,255, +121,121,121,255,112,112,112,255,106,106,106,255, 99, 99, 99,255, 94, 94, 94,255, 88, 88, 88,255, 82, 82, 82,255, 76, 76, 76,255, + 69, 69, 69,255, 62, 62, 62,255, 54, 54, 54,255, 46, 46, 46,255, 37, 37, 37,255, 26, 26, 26,255, 6, 6, 6,102, 0, 0, 0, 0, +107,107,107,255,130,130,130,255,140,140,140,255,146,146,146,255,150,150,150,255,153,153,153,255,158,158,158,255,169,169,169,255, +191,191,191,255,219,219,219,255,246,246,246,255,254,254,254,255,237,237,237,255,204,204,204,255,170,170,170,255,145,145,145,255, +127,127,127,255,117,117,117,255,110,110,110,255,103,103,103,255, 97, 97, 97,255, 91, 91, 91,255, 85, 85, 85,255, 78, 78, 78,255, + 71, 71, 71,255, 64, 64, 64,255, 55, 55, 55,255, 47, 47, 47,255, 37, 37, 37,255, 25, 25, 25,255, 3, 3, 3, 51, 0, 0, 0, 0, + 65, 65, 65,153,129,129,129,255,142,142,142,255,149,149,149,255,154,154,154,255,158,158,158,255,163,163,163,255,176,176,176,255, +199,199,199,255,232,232,232,255,255,255,255,255,255,255,255,255,255,255,255,255,220,220,220,255,181,181,181,255,151,151,151,255, +132,132,132,255,121,121,121,255,113,113,113,255,106,106,106,255,100,100,100,255, 94, 94, 94,255, 87, 87, 87,255, 80, 80, 80,255, + 73, 73, 73,255, 65, 65, 65,255, 57, 57, 57,255, 48, 48, 48,255, 38, 38, 38,255, 16, 16, 16,153, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 21, 21, 51,127,127,127,255,143,143,143,255,152,152,152,255,157,157,157,255,161,161,161,255,165,165,165,255,177,177,177,255, +198,198,198,255,227,227,227,255,253,253,253,255,255,255,255,255,250,250,250,255,217,217,217,255,181,181,181,255,153,153,153,255, +135,135,135,255,124,124,124,255,117,117,117,255,110,110,110,255,103,103,103,255, 96, 96, 96,255, 89, 89, 89,255, 82, 82, 82,255, + 74, 74, 74,255, 66, 66, 66,255, 57, 57, 57,255, 48, 48, 48,255, 35, 35, 35,255, 10, 10, 10,153, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 93, 93,204,141,141,141,255,153,153,153,255,159,159,159,255,163,163,163,255,167,167,167,255,174,174,174,255, +188,188,188,255,209,209,209,255,228,228,228,255,234,234,234,255,224,224,224,255,200,200,200,255,173,173,173,255,151,151,151,255, +136,136,136,255,127,127,127,255,119,119,119,255,112,112,112,255,105,105,105,255, 98, 98, 98,255, 90, 90, 90,255, 83, 83, 83,255, + 75, 75, 75,255, 66, 66, 66,255, 57, 57, 57,255, 46, 46, 46,255, 24, 24, 24,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 20, 20, 51,134,134,134,255,151,151,151,255,160,160,160,255,164,164,164,255,167,167,167,255,171,171,171,255, +178,178,178,255,189,189,189,255,200,200,200,255,202,202,202,255,195,195,195,255,180,180,180,255,163,163,163,255,148,148,148,255, +137,137,137,255,129,129,129,255,121,121,121,255,114,114,114,255,107,107,107,255, 99, 99, 99,255, 91, 91, 91,255, 83, 83, 83,255, + 74, 74, 74,255, 65, 65, 65,255, 55, 55, 55,255, 41, 41, 41,255, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49,102,145,145,145,255,157,157,157,255,164,164,164,255,167,167,167,255,170,170,170,255, +172,172,172,255,176,176,176,255,180,180,180,255,179,179,179,255,174,174,174,255,165,165,165,255,155,155,155,255,145,145,145,255, +137,137,137,255,130,130,130,255,122,122,122,255,115,115,115,255,107,107,107,255, 99, 99, 99,255, 91, 91, 91,255, 82, 82, 82,255, + 73, 73, 73,255, 63, 63, 63,255, 50, 50, 50,255, 22, 22, 22,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,149,149,149,255,160,160,160,255,166,166,166,255,168,168,168,255, +169,169,169,255,170,170,170,255,169,169,169,255,167,167,167,255,164,164,164,255,158,158,158,255,151,151,151,255,144,144,144,255, +137,137,137,255,130,130,130,255,123,123,123,255,115,115,115,255,106,106,106,255, 98, 98, 98,255, 89, 89, 89,255, 80, 80, 80,255, + 70, 70, 70,255, 58, 58, 58,255, 27, 27, 27,153, 3, 3, 3, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,153,150,150,150,255,160,160,160,255,165,165,165,255, +167,167,167,255,167,167,167,255,166,166,166,255,163,163,163,255,160,160,160,255,155,155,155,255,149,149,149,255,143,143,143,255, +137,137,137,255,129,129,129,255,121,121,121,255,113,113,113,255,105,105,105,255, 96, 96, 96,255, 86, 86, 86,255, 76, 76, 76,255, + 63, 63, 63,255, 38, 38, 38,204, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,147,147,147,255,157,157,157,255, +161,161,161,255,163,163,163,255,162,162,162,255,160,160,160,255,157,157,157,255,152,152,152,255,147,147,147,255,141,141,141,255, +135,135,135,255,127,127,127,255,119,119,119,255,110,110,110,255,101,101,101,255, 91, 91, 91,255, 80, 80, 80,255, 66, 66, 66,255, + 32, 32, 32,153, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134,134,134,255, +148,148,148,255,154,154,154,255,155,155,155,255,154,154,154,255,152,152,152,255,147,147,147,255,142,142,142,255,136,136,136,255, +130,130,130,255,122,122,122,255,114,114,114,255,104,104,104,255, 93, 93, 93,255, 81, 81, 81,255, 54, 54, 54,204, 22, 22, 22,102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 73, 73,153,103,103,103,204,137,137,137,255,140,140,140,255,140,140,140,255,137,137,137,255,133,133,133,255,127,127,127,255, +120,120,120,255,113,113,113,255,102,102,102,255, 91, 91, 91,255, 64, 64, 64,204, 28, 28, 28,102, 6, 6, 6, 51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46,102, 72, 72, 72,153, 72, 72, 72,153, 92, 92, 92,204, 88, 88, 88,204, + 81, 81, 81,204, 54, 54, 54,153, 35, 35, 35,102, 16, 16, 16, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0, +168, 1, 0, 0, 8,255,168, 5, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 0, 0, 0,248, 0,169, 5, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 15, 0,104, 1,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 0, 16, 0, 0,104, 1,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 16, 5, 0, 0,184, 17,169, 5, + 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,168,106,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 37,169, 5, 0, 0, 0, 0,168, 36,169, 5, + 0, 0, 0, 0, 72, 33,169, 5, 0, 0, 0, 0,216, 31,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 25,169, 5, 0, 0, 0, 0,168, 28,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 23,169, 5, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 26,169, 5, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 0, + 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 34,169, 5, 0, 0, 0, 0,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 1, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255, 2, 0, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 29,169, 5, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 0, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255, 2, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 67, 0, 30, 0, 6, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 8, 0, 0, 0,168,106,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,248,232,168, 5, 0, 0, 0, 0, 68, 65, 84, 65, + 8, 2, 0, 0, 24, 23,169, 5, 0, 0, 0, 0,132, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 25,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,104,114, 30, 7, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0,216,114, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,240, 1, 11, 1,152,137, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0,216,114, 30, 7, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 72,115, 30, 7, 0, 0, 0, 0,104,114, 30, 7, - 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,129, 2,233, 1,216,144, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65, - 40, 0, 0, 0, 72,115, 30, 7, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,114, 30, 7, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,109, 0, 78, 1,248,130, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65, -240, 1, 0, 0,184,115, 30, 7, 0, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0,248,117, 30, 7, 0, 0, 0, 0,120,118, 30, 7, - 0, 0, 0, 0,248,118, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0,205,204, 76, 63, - 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 56,203, 31, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 2, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 10,215, 35, 60,205,204,204, 61, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61,102,102,166, 63, 0, 0,192, 63, 0, 0,240, 65, - 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 67, 2, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 35, 0, 0, 0,204,197,121, 63, 0, 0, 0, 63, 35, 0, 0, 0,204,197,121, 63, 0, 0, 0, 63, 0, 0,128, 63, 49, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0,248,117, 30, 7, 0, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0,248, 36, 31, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0,120,118, 30, 7, - 0, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255,128, - 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,248,118, 30, 7, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,184,150, 31, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0,155, 9, 25, 67,190, 23,237, 64, 75, 1,147, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +160, 0, 0, 0,104, 25,169, 5, 0, 0, 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191, +230, 73,230, 73, 26,182, 1, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182, 1, 0, 1, 0,128,191, +253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182, 1, 0,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, + 26,182, 1, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73,230, 73, 1, 0,245,255,127, 63, 5, 0,128,191, + 0, 0,128, 63,230, 73, 26,182,230, 73, 1, 0, 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73, 1, 0, +255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,230, 73, 1, 0, 68, 65, 84, 65, 8, 2, 0, 0, 88, 26,169, 5, + 0, 0, 0, 0,132, 1, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 28,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,168, 28,169, 5, + 0, 0, 0, 0, 53, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, + 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, + 8, 2, 0, 0,136, 29,169, 5, 0, 0, 0, 0,132, 1, 0, 0, 5, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 77, 97,112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 31,169, 5, 0, 0, 0, 0, 26, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 71,111,110, + 32, 70, 97, 99,101, 45, 86,101,114,116,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 33,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -128, 0, 0, 0,168,119, 30, 7, 0, 0, 0, 0,150, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 1, 0, 0,216, 31,169, 5, 0, 0, 0, 0, 61, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0, 72, 33,169, 5, + 0, 0, 0, 0, 59, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, + 5, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 6, 0, 0, 0, + 10, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, + 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, + 6, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 7, 0, 0, 0, + 7, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 68, 65, 84, 65, 8, 2, 0, 0, 88, 34,169, 5, 0, 0, 0, 0,132, 1, 0, 0, + 5, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 86, 77, 97,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255,127, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,200, 0, 0, 0, 88,122, 30, 7, - 0, 0, 0, 0, 22, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, + 0, 0, 0, 0,168, 36,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 71,111,110, 32, 70, 97, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66, -161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 66, 0, 0,144, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 16, 2, 0, 0,104,123, 30, 7, - 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, - 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,200,125, 30, 7, 0, 0, 0, 0, 2, 0, 0, 0, - 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 37,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,127, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,200,125, 30, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,168, 36,169, 5, 0, 0, 0, 0, 60, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0, 88, 37,169, 5, 0, 0, 0, 0, 58, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, + 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 20, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 2, 0, 66, 82, 0, 0, 96, 6, 0, 0,232, 37,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168, 47,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100, +100, 0,104, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 46,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 1, 0, 0,128, 38,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 24, 46,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,184,181,132, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184,181,132, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168, 47,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,232, 55,169, 5, 0, 0, 0, 0,232, 37,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88, 54,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, + 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 64, 48,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88, 54,169, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,200, 66,140, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,200, 66,140, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232, 55,169, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0,168, 47,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152, 62,169, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,128, 56,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0,152, 62,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191, -243, 4, 53, 63, 88,127, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, + 46,189,194, 61,216,145,132, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,127, 30, 7, - 0, 0, 0, 0,119, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,127, 30, 7, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 79, 0, 0, 24, 2, 0, 0, 40,128, 30, 7, 0, 0, 0, 0,143, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111, -114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216,145,132, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, + 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40, 64,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0,232, 55,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,128, 63, -205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216, 70,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,136,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,130, 30, 7, - 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,112, 5, 0, 0,248,130, 30, 7, - 0, 0, 0, 0,130, 0, 0, 0, 1, 0, 0, 0,152,137, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,122, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190, -227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64, -150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0,128, 63, 1, 0,128, 51, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 51, - 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0, 2, 0, 0,179, 2, 0, 0,167, 1, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 53, - 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63,221,149, 47, 63, 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63, -225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,192, 56, 49,188, 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, - 0,222,192,190,152, 9, 52,193, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, - 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 1, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,136, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -152, 0, 0, 0,184,136, 30, 7, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 79, 66, 0, 0,112, 5, 0, 0,152,137, 30, 7, 0, 0, 0, 0,130, 0, 0, 0, - 1, 0, 0, 0,216,144, 30, 7, 0, 0, 0, 0,248,130, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,133, 88, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, -250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,143, 30, 7, 0, 0, 0, 0,168,143, 30, 7, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0,192, 64,169, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216, 70,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, + 46, 95,255,186,224,255,127,191,114, 97,255,186, 8, 3,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0, 8, 3,135, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104, 72,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168, 80,169, 5, + 0, 0, 0, 0, 40, 64,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, + 97,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 79,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, + 56, 1, 0, 0, 0, 73,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 24, 79,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56, 35,135, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56, 35,135, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168, 80,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104, 89,169, 5, 0, 0, 0, 0,104, 72,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 67,108, 97,121, 32, 83,116,114,105,112,115, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88, 87,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, + 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 64, 81,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88, 87,169, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232, 88,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232, 88,169, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104, 89,169, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0,168, 80,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 96,169, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 0, 90,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24, 96,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, + 46,189,194, 61,168, 97,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168, 97,169, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, + 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40, 98,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0,104, 89,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101, 0, 48, 48, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216,104,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 0, 0, 7, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, - 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 1, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,143, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 77, 68, 8, - 0, 0, 0, 0, 56,150, 68, 8, 0, 0, 0, 0, 25, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 88,143, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,168,143, 30, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,248,143, 30, 7, 0, 0, 0, 0, -133, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 6, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, + 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0,192, 98,169, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216,104,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, + 50,131,112, 63,218,243,127,191, 10,183,157,188,104,106,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0,104,106,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232,106,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168,115,169, 5, + 0, 0, 0, 0, 40, 98,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97, +114,107,101,110, 0, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,113,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 1, 0, 0,128,107,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,152,113,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 40,115,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40,115,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168,115,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104,124,169, 5, 0, 0, 0, 0,232,106,169, 5, 0, 0, 0, 0, 0, 20, 1,160,255,255,255,255, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 68,114, 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88,122,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 63, 35, 0, 0, 0, 0, 4, 0, 8, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, + 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 64,116,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88,122,169, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232,123,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232,123,169, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104,124,169, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0,168,115,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24,131,169, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, + 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 0,125,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24,131,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191, +114, 97,255,186,168,132,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168,132,169, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, + 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40,133,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0,104,124,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,110, 47, 67,111, +110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216,139,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, - 79, 66, 0, 0,112, 5, 0, 0,216,144, 30, 7, 0, 0, 0, 0,130, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152,137, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, + 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0,192,133,169, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216,139,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, + 46, 95,255,186,224,255,127,191,114, 97,255,186,104,141,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0,104,141,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232,141,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168,150,169, 5, + 0, 0, 0, 0, 40,133,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, + 97, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,148,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 1, 0, 0,128,142,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,152,148,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40,150,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40,150,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168,150,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104,159,169, 5, 0, 0, 0, 0,232,141,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,101, 47, 68,101,102,108, 97,116,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88,157,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, + 0, 0,128, 62, 68, 65, 84, 65, 56, 1, 0, 0, 64,151,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88,157,169, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232,158,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232,158,169, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104,159,169, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0,168,150,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24,166,169, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 0,160,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24,166,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191, +114, 97,255,186,168,167,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168,167,169, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, + 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40,168,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0,104,159,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216,174,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,192,168,169, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216,174,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, + 54,189,194, 61, 14,215,126,191, 46,189,194, 61,104,176,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0,104,176,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232,176,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168,185,169, 5, + 0, 0, 0, 0, 40,168,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105, +120, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,183,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 1, 0, 0,128,177,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,152,183,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 40,185,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40,185,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168,185,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104,194,169, 5, 0, 0, 0, 0,232,176,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 77,117,108,116,105,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88,192,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 64,186,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88,192,169, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,232,193,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232,193,169, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, + 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104,194,169, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0,168,185,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24,201,169, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 0,195,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24,201,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191, +114, 97,255,186,168,202,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168,202,169, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, + 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40,203,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0,104,194,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47, 77, 97,103,110, +105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216,209,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, + 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 56, 1, 0, 0,192,203,169, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216,209,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, + 46, 95,255,186,224,255,127,191,114, 97,255,186,104,211,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0,104,211,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232,211,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168,220,169, 5, + 0, 0, 0, 0, 40,203,169, 5, 0, 0, 0, 0,253, 21,192, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,111, +108,105,115,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,218,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 56, 1, 0, 0,128,212,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,152,218,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40,220,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40,220,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168,220,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104,229,169, 5, 0, 0, 0, 0,232,211,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101, 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88,227,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 64,221,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88,227,169, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232,228,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232,228,169, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104,229,169, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0,168,220,169, 5, 0, 0, 0, 0,168,205,210, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24,236,169, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, + 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 0,230,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24,236,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191, +114, 97,255,186,168,237,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168,237,169, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, + 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40,238,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0,104,229,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0, 48, 48, 49, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216,244,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,192,238,169, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216,244,169, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, + 54,189,194, 61, 14,215,126,191, 46,189,194, 61,104,246,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0,104,246,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232,246,169, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168,255,169, 5, + 0, 0, 0, 0, 40,238,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109, +111,111,116,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,253,169, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 1, 0, 0,128,247,169, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,152,253,169, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40,255,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40,255,169, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168,255,169, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104, 8,170, 5, 0, 0, 0, 0,232,246,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 83,110, 97,107,101, 32, 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88, 6,170, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 64, 0,170, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88, 6,170, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232, 7,170, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232, 7,170, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104, 8,170, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0,168,255,169, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 15,170, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 63, + 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 0, 9,170, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24, 15,170, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, + 46,189,194, 61,168, 16,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168, 16,170, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, + 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, + 96, 6, 0, 0, 40, 17,170, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0,104, 8,170, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97, 99,116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0,216, 23,170, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,192, 17,170, 5, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,216, 23,170, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, + 54,189,194, 61, 14,215,126,191, 46,189,194, 61,104, 25,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 48, 0, 0, 0,104, 25,170, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,232, 25,170, 5, 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0,168, 34,170, 5, + 0, 0, 0, 0, 40, 17,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101, +120, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152, 32,170, 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, + 56, 1, 0, 0,128, 26,170, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,152, 32,170, 5, 0, 0, 0, 0,127, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40, 34,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40, 34,170, 5, 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,168, 34,170, 5, 0, 0, 0, 0,131, 1, 0, 0, + 1, 0, 0, 0,104, 43,170, 5, 0, 0, 0, 0,232, 25,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88, 41,170, 5, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 64, 35,170, 5, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 88, 41,170, 5, + 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, + 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232, 42,170, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,232, 42,170, 5, 0, 0, 0, 0,125, 1, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63, +143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,104, 43,170, 5, + 0, 0, 0, 0,131, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 34,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 50,170, 5, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, + 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 0, 44,170, 5, 0, 0, 0, 0, 25, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, + 64, 1, 0, 0, 24, 50,170, 5, 0, 0, 0, 0,127, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191, +114, 97,255,186,168, 51,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168, 51,170, 5, + 0, 0, 0, 0,125, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, + 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82, +112, 38, 0, 0,192,113, 10, 4, 0, 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0, 1, 8, 17, 1, 63, 6, 0, 0, 5, 0, 0, 0, + 47,116,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98, +105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0, 3, 0, 0, 0, 56, 52, 39, 0, 0, 0, 0, 0, 1, 0, 2, 0, + 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, + 5, 0, 2, 0,232, 90,170, 5, 0, 0, 0, 0,232, 90,170, 5, 0, 0, 0, 0, 8, 79,133, 5, 0, 0, 0, 0, 8, 79,133, 5, + 0, 0, 0, 0,216,132,170, 5, 0, 0, 0, 0,216,132,170, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 44,169, 5, 0, 0, 0, 0, 56,132,170, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 0, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63, +205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191, +154,153,153, 62,102,102,102, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, + 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 1, 0, + 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 5, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0, +200, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 0, 10, 0, 50, 0, 20, 0, 2, 0, 1, 0, 0, 0, 0, 0,128, 63, 60, 0, 0, 0, + 0, 0, 2, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104,123, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63, -112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63, -236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62, -164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0,128, 50, - 0, 0, 0,179, 0, 0, 0, 0, 1, 0,128, 50, 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 39, 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 54,236,148,190,221,102, 69,191, - 38,255, 16, 63, 0, 0, 0, 0, 24,134,116, 63, 57,174, 76,190,239,161, 95, 62, 0, 0, 0, 0,237, 13, 98,189, 35,194, 26, 63, -166,111, 75, 63, 0, 0, 0, 0,209, 19, 13, 63,241, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, - 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 1, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152,150, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,152,150, 30, 7, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, - 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, - 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 77, 65, 0, 0,128, 3, 0, 0, -120,151, 30, 7, 0, 0, 0, 0, 39, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 8, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 50, 0,205,204, 76, 62, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 63, - 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63, - 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 4, 0, 67, 0, 64, 3, - 67, 0, 64, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0,128, 64, 0, 0, 0, 63, -205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 72,155, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200,156, 30, 7, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63,205,204, 76, 61,205,204,204, 61, -102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 72,155, 30, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,173, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 40, 0, 0, 0,200,156, 30, 7, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 53, 0, 53, 0, 56,157, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 0, 16, 0, 0, 56,157, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 51, 2, 2, 2, 51, 6, 6, 6,153, 6, 6, 6,153, 6, 6, 6,153, 4, 4, 4,102, - 3, 3, 3,102, 2, 2, 2, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 51, - 8, 8, 8,153, 11, 11, 11,204, 13, 13, 13,255, 12, 12, 12,255, 12, 12, 12,255, 11, 11, 11,255, 10, 10, 10,255, 10, 10, 10,255, - 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 4, 4, 4,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 51, 10, 10, 10,153, 18, 18, 18,255, - 20, 20, 20,255, 22, 22, 22,255, 23, 23, 23,255, 22, 22, 22,255, 20, 20, 20,255, 19, 19, 19,255, 16, 16, 16,255, 14, 14, 14,255, - 11, 11, 11,255, 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 8, 8, 8,204, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,102, 19, 19, 19,204, 27, 27, 27,255, 31, 31, 31,255, - 32, 32, 32,255, 33, 33, 33,255, 33, 33, 33,255, 31, 31, 31,255, 30, 30, 30,255, 27, 27, 27,255, 25, 25, 25,255, 22, 22, 22,255, - 19, 19, 19,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, 4, 4, 4,102, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,153, 29, 29, 29,255, 37, 37, 37,255, 40, 40, 40,255, 42, 42, 42,255, - 42, 42, 42,255, 43, 43, 43,255, 41, 41, 41,255, 40, 40, 40,255, 38, 38, 38,255, 36, 36, 36,255, 33, 33, 33,255, 30, 30, 30,255, - 27, 27, 27,255, 24, 24, 24,255, 20, 20, 20,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, - 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 37, 37, 37,255, 44, 44, 44,255, 48, 48, 48,255, 50, 50, 50,255, 51, 51, 51,255, - 51, 51, 51,255, 50, 50, 50,255, 49, 49, 49,255, 48, 48, 48,255, 45, 45, 45,255, 43, 43, 43,255, 41, 41, 41,255, 37, 37, 37,255, - 34, 34, 34,255, 31, 31, 31,255, 28, 28, 28,255, 24, 24, 24,255, 20, 20, 20,255, 15, 15, 15,255, 11, 11, 11,255, 10, 10, 10,255, - 11, 11, 11,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 13, 13,102, 41, 41, 41,255, 50, 50, 50,255, 54, 54, 54,255, 57, 57, 57,255, 58, 58, 58,255, 59, 59, 59,255, - 59, 59, 59,255, 58, 58, 58,255, 57, 57, 57,255, 55, 55, 55,255, 53, 53, 53,255, 51, 51, 51,255, 48, 48, 48,255, 45, 45, 45,255, - 41, 41, 41,255, 38, 38, 38,255, 35, 35, 35,255, 31, 31, 31,255, 27, 27, 27,255, 23, 23, 23,255, 17, 17, 17,255, 12, 12, 12,255, - 11, 11, 11,255, 11, 11, 11,255, 5, 5, 5,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 36, 36,204, 53, 53, 53,255, 59, 59, 59,255, 63, 63, 63,255, 65, 65, 65,255, 66, 66, 66,255, 66, 66, 66,255, - 66, 66, 66,255, 65, 65, 65,255, 64, 64, 64,255, 62, 62, 62,255, 60, 60, 60,255, 57, 57, 57,255, 54, 54, 54,255, 51, 51, 51,255, - 48, 48, 48,255, 44, 44, 44,255, 41, 41, 41,255, 37, 37, 37,255, 33, 33, 33,255, 29, 29, 29,255, 24, 24, 24,255, 19, 19, 19,255, - 13, 13, 13,255, 11, 11, 11,255, 12, 12, 12,255, 3, 3, 3, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 19,102, 56, 56, 56,255, 64, 64, 64,255, 68, 68, 68,255, 71, 71, 71,255, 73, 73, 73,255, 74, 74, 74,255, 74, 74, 74,255, - 73, 73, 73,255, 72, 72, 72,255, 71, 71, 71,255, 69, 69, 69,255, 67, 67, 67,255, 64, 64, 64,255, 61, 61, 61,255, 58, 58, 58,255, - 54, 54, 54,255, 50, 50, 50,255, 47, 47, 47,255, 43, 43, 43,255, 39, 39, 39,255, 34, 34, 34,255, 30, 30, 30,255, 25, 25, 25,255, - 19, 19, 19,255, 13, 13, 13,255, 12, 12, 12,255, 10, 10, 10,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 54, 54,255, 66, 66, 66,255, 72, 72, 72,255, 77, 77, 77,255, 79, 79, 79,255, 81, 81, 81,255, 81, 81, 81,255, 81, 81, 81,255, - 80, 80, 80,255, 79, 79, 79,255, 77, 77, 77,255, 75, 75, 75,255, 73, 73, 73,255, 70, 70, 70,255, 67, 67, 67,255, 63, 63, 63,255, - 60, 60, 60,255, 56, 56, 56,255, 52, 52, 52,255, 49, 49, 49,255, 44, 44, 44,255, 40, 40, 40,255, 35, 35, 35,255, 30, 30, 30,255, - 24, 24, 24,255, 18, 18, 18,255, 12, 12, 12,255, 12, 12, 12,255, 6, 6, 6,102, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22,102, - 67, 67, 67,255, 76, 76, 76,255, 81, 81, 81,255, 84, 84, 84,255, 87, 87, 87,255, 88, 88, 88,255, 88, 88, 88,255, 88, 88, 88,255, - 87, 87, 87,255, 86, 86, 86,255, 84, 84, 84,255, 82, 82, 82,255, 79, 79, 79,255, 76, 76, 76,255, 73, 73, 73,255, 69, 69, 69,255, - 65, 65, 65,255, 62, 62, 62,255, 58, 58, 58,255, 54, 54, 54,255, 49, 49, 49,255, 45, 45, 45,255, 40, 40, 40,255, 35, 35, 35,255, - 29, 29, 29,255, 23, 23, 23,255, 16, 16, 16,255, 12, 12, 12,255, 12, 12, 12,204, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49,204, - 76, 76, 76,255, 84, 84, 84,255, 89, 89, 89,255, 92, 92, 92,255, 94, 94, 94,255, 95, 95, 95,255, 95, 95, 95,255, 95, 95, 95,255, - 94, 94, 94,255, 93, 93, 93,255, 91, 91, 91,255, 88, 88, 88,255, 85, 85, 85,255, 82, 82, 82,255, 79, 79, 79,255, 75, 75, 75,255, - 71, 71, 71,255, 67, 67, 67,255, 63, 63, 63,255, 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, 45, 45, 45,255, 40, 40, 40,255, - 34, 34, 34,255, 28, 28, 28,255, 21, 21, 21,255, 13, 13, 13,255, 14, 14, 14,255, 0, 0, 0, 0, 14, 14, 14,102, 70, 70, 70,255, - 85, 85, 85,255, 92, 92, 92,255, 97, 97, 97,255,100,100,100,255,102,102,102,255,102,102,102,255,103,103,103,255,102,102,102,255, -101,101,101,255, 99, 99, 99,255, 97, 97, 97,255, 94, 94, 94,255, 91, 91, 91,255, 88, 88, 88,255, 84, 84, 84,255, 81, 81, 81,255, - 77, 77, 77,255, 72, 72, 72,255, 68, 68, 68,255, 64, 64, 64,255, 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, 44, 44, 44,255, - 39, 39, 39,255, 32, 32, 32,255, 25, 25, 25,255, 17, 17, 17,255, 13, 13, 13,255, 7, 7, 7,102, 24, 24, 24,102, 80, 80, 80,255, - 93, 93, 93,255,100,100,100,255,104,104,104,255,107,107,107,255,109,109,109,255,109,109,109,255,109,109,109,255,109,109,109,255, -107,107,107,255,106,106,106,255,103,103,103,255,100,100,100,255, 97, 97, 97,255, 94, 94, 94,255, 90, 90, 90,255, 86, 86, 86,255, - 82, 82, 82,255, 77, 77, 77,255, 73, 73, 73,255, 69, 69, 69,255, 64, 64, 64,255, 59, 59, 59,255, 54, 54, 54,255, 49, 49, 49,255, - 43, 43, 43,255, 36, 36, 36,255, 29, 29, 29,255, 21, 21, 21,255, 14, 14, 14,255, 10, 10, 10,153, 29, 29, 29,102, 89, 89, 89,255, -100,100,100,255,107,107,107,255,112,112,112,255,114,114,114,255,116,116,116,255,116,116,116,255,116,116,116,255,115,115,115,255, -114,114,114,255,112,112,112,255,110,110,110,255,107,107,107,255,104,104,104,255,100,100,100,255, 96, 96, 96,255, 92, 92, 92,255, - 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255, 68, 68, 68,255, 63, 63, 63,255, 58, 58, 58,255, 52, 52, 52,255, - 46, 46, 46,255, 40, 40, 40,255, 33, 33, 33,255, 24, 24, 24,255, 17, 17, 17,255, 13, 13, 13,204, 46, 46, 46,153, 95, 95, 95,255, -107,107,107,255,114,114,114,255,118,118,118,255,121,121,121,255,122,122,122,255,123,123,123,255,123,123,123,255,122,122,122,255, -122,122,122,255,120,120,120,255,118,118,118,255,114,114,114,255,110,110,110,255,106,106,106,255,101,101,101,255, 97, 97, 97,255, - 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255, 68, 68, 68,255, 62, 62, 62,255, 56, 56, 56,255, - 50, 50, 50,255, 44, 44, 44,255, 36, 36, 36,255, 28, 28, 28,255, 19, 19, 19,255, 12, 12, 12,204, 47, 47, 47,153,101,101,101,255, -113,113,113,255,120,120,120,255,125,125,125,255,127,127,127,255,129,129,129,255,130,130,130,255,130,130,130,255,131,131,131,255, -131,131,131,255,131,131,131,255,129,129,129,255,125,125,125,255,120,120,120,255,113,113,113,255,108,108,108,255,103,103,103,255, - 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 82, 82, 82,255, 77, 77, 77,255, 72, 72, 72,255, 66, 66, 66,255, 60, 60, 60,255, - 54, 54, 54,255, 47, 47, 47,255, 39, 39, 39,255, 31, 31, 31,255, 22, 22, 22,255, 12, 12, 12,204, 48, 48, 48,153,106,106,106,255, -118,118,118,255,126,126,126,255,131,131,131,255,134,134,134,255,135,135,135,255,137,137,137,255,138,138,138,255,142,142,142,255, -147,147,147,255,149,149,149,255,148,148,148,255,142,142,142,255,133,133,133,255,124,124,124,255,115,115,115,255,108,108,108,255, -102,102,102,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 81, 81, 81,255, 75, 75, 75,255, 69, 69, 69,255, 63, 63, 63,255, - 57, 57, 57,255, 49, 49, 49,255, 42, 42, 42,255, 33, 33, 33,255, 24, 24, 24,255, 9, 9, 9,153, 32, 32, 32,102,109,109,109,255, -123,123,123,255,131,131,131,255,136,136,136,255,140,140,140,255,142,142,142,255,144,144,144,255,148,148,148,255,156,156,156,255, -168,168,168,255,176,176,176,255,177,177,177,255,168,168,168,255,153,153,153,255,137,137,137,255,124,124,124,255,114,114,114,255, -107,107,107,255,101,101,101,255, 96, 96, 96,255, 90, 90, 90,255, 85, 85, 85,255, 79, 79, 79,255, 72, 72, 72,255, 66, 66, 66,255, - 59, 59, 59,255, 52, 52, 52,255, 44, 44, 44,255, 35, 35, 35,255, 26, 26, 26,255, 10, 10, 10,153, 17, 17, 17, 51,110,110,110,255, -127,127,127,255,136,136,136,255,142,142,142,255,145,145,145,255,148,148,148,255,151,151,151,255,159,159,159,255,174,174,174,255, -195,195,195,255,212,212,212,255,216,216,216,255,204,204,204,255,179,179,179,255,154,154,154,255,135,135,135,255,121,121,121,255, -112,112,112,255,106,106,106,255, 99, 99, 99,255, 94, 94, 94,255, 88, 88, 88,255, 82, 82, 82,255, 76, 76, 76,255, 69, 69, 69,255, - 62, 62, 62,255, 54, 54, 54,255, 46, 46, 46,255, 37, 37, 37,255, 26, 26, 26,255, 6, 6, 6,102, 0, 0, 0, 0,107,107,107,255, -130,130,130,255,140,140,140,255,146,146,146,255,150,150,150,255,153,153,153,255,158,158,158,255,169,169,169,255,191,191,191,255, -219,219,219,255,246,246,246,255,254,254,254,255,237,237,237,255,204,204,204,255,170,170,170,255,145,145,145,255,127,127,127,255, -117,117,117,255,110,110,110,255,103,103,103,255, 97, 97, 97,255, 91, 91, 91,255, 85, 85, 85,255, 78, 78, 78,255, 71, 71, 71,255, - 64, 64, 64,255, 55, 55, 55,255, 47, 47, 47,255, 37, 37, 37,255, 25, 25, 25,255, 3, 3, 3, 51, 0, 0, 0, 0, 65, 65, 65,153, -129,129,129,255,142,142,142,255,149,149,149,255,154,154,154,255,158,158,158,255,163,163,163,255,176,176,176,255,199,199,199,255, -232,232,232,255,255,255,255,255,255,255,255,255,255,255,255,255,220,220,220,255,181,181,181,255,151,151,151,255,132,132,132,255, -121,121,121,255,113,113,113,255,106,106,106,255,100,100,100,255, 94, 94, 94,255, 87, 87, 87,255, 80, 80, 80,255, 73, 73, 73,255, - 65, 65, 65,255, 57, 57, 57,255, 48, 48, 48,255, 38, 38, 38,255, 16, 16, 16,153, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 51, -127,127,127,255,143,143,143,255,152,152,152,255,157,157,157,255,161,161,161,255,165,165,165,255,177,177,177,255,198,198,198,255, -227,227,227,255,253,253,253,255,255,255,255,255,250,250,250,255,217,217,217,255,181,181,181,255,153,153,153,255,135,135,135,255, -124,124,124,255,117,117,117,255,110,110,110,255,103,103,103,255, 96, 96, 96,255, 89, 89, 89,255, 82, 82, 82,255, 74, 74, 74,255, - 66, 66, 66,255, 57, 57, 57,255, 48, 48, 48,255, 35, 35, 35,255, 10, 10, 10,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 93, 93, 93,204,141,141,141,255,153,153,153,255,159,159,159,255,163,163,163,255,167,167,167,255,174,174,174,255,188,188,188,255, -209,209,209,255,228,228,228,255,234,234,234,255,224,224,224,255,200,200,200,255,173,173,173,255,151,151,151,255,136,136,136,255, -127,127,127,255,119,119,119,255,112,112,112,255,105,105,105,255, 98, 98, 98,255, 90, 90, 90,255, 83, 83, 83,255, 75, 75, 75,255, - 66, 66, 66,255, 57, 57, 57,255, 46, 46, 46,255, 24, 24, 24,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 20, 20, 51,134,134,134,255,151,151,151,255,160,160,160,255,164,164,164,255,167,167,167,255,171,171,171,255,178,178,178,255, -189,189,189,255,200,200,200,255,202,202,202,255,195,195,195,255,180,180,180,255,163,163,163,255,148,148,148,255,137,137,137,255, -129,129,129,255,121,121,121,255,114,114,114,255,107,107,107,255, 99, 99, 99,255, 91, 91, 91,255, 83, 83, 83,255, 74, 74, 74,255, - 65, 65, 65,255, 55, 55, 55,255, 41, 41, 41,255, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 49, 49, 49,102,145,145,145,255,157,157,157,255,164,164,164,255,167,167,167,255,170,170,170,255,172,172,172,255, -176,176,176,255,180,180,180,255,179,179,179,255,174,174,174,255,165,165,165,255,155,155,155,255,145,145,145,255,137,137,137,255, -130,130,130,255,122,122,122,255,115,115,115,255,107,107,107,255, 99, 99, 99,255, 91, 91, 91,255, 82, 82, 82,255, 73, 73, 73,255, - 63, 63, 63,255, 50, 50, 50,255, 22, 22, 22,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,149,149,149,255,160,160,160,255,166,166,166,255,168,168,168,255,169,169,169,255, -170,170,170,255,169,169,169,255,167,167,167,255,164,164,164,255,158,158,158,255,151,151,151,255,144,144,144,255,137,137,137,255, -130,130,130,255,123,123,123,255,115,115,115,255,106,106,106,255, 98, 98, 98,255, 89, 89, 89,255, 80, 80, 80,255, 70, 70, 70,255, - 58, 58, 58,255, 27, 27, 27,153, 3, 3, 3, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,153,150,150,150,255,160,160,160,255,165,165,165,255,167,167,167,255, -167,167,167,255,166,166,166,255,163,163,163,255,160,160,160,255,155,155,155,255,149,149,149,255,143,143,143,255,137,137,137,255, -129,129,129,255,121,121,121,255,113,113,113,255,105,105,105,255, 96, 96, 96,255, 86, 86, 86,255, 76, 76, 76,255, 63, 63, 63,255, - 38, 38, 38,204, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,147,147,147,255,157,157,157,255,161,161,161,255, -163,163,163,255,162,162,162,255,160,160,160,255,157,157,157,255,152,152,152,255,147,147,147,255,141,141,141,255,135,135,135,255, -127,127,127,255,119,119,119,255,110,110,110,255,101,101,101,255, 91, 91, 91,255, 80, 80, 80,255, 66, 66, 66,255, 32, 32, 32,153, - 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134,134,134,255,148,148,148,255, -154,154,154,255,155,155,155,255,154,154,154,255,152,152,152,255,147,147,147,255,142,142,142,255,136,136,136,255,130,130,130,255, -122,122,122,255,114,114,114,255,104,104,104,255, 93, 93, 93,255, 81, 81, 81,255, 54, 54, 54,204, 22, 22, 22,102, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 73, 73,153, -103,103,103,204,137,137,137,255,140,140,140,255,140,140,140,255,137,137,137,255,133,133,133,255,127,127,127,255,120,120,120,255, -113,113,113,255,102,102,102,255, 91, 91, 91,255, 64, 64, 64,204, 28, 28, 28,102, 6, 6, 6, 51, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46,102, 72, 72, 72,153, 72, 72, 72,153, 92, 92, 92,204, 88, 88, 88,204, 81, 81, 81,204, - 54, 54, 54,153, 35, 35, 35,102, 16, 16, 16, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0,168, 1, 0, 0, -136,173, 30, 7, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 64, - 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,175, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, -120,175, 30, 7, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 16, 0, 15, 0,232,175, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0, -232,175, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 16, 5, 0, 0, 56,192, 30, 7, 0, 0, 0, 0, - 50, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152,197, 30, 7, 0, 0, 0, 0,232, 12, 88, 8, 0, 0, 0, 0,184,127,248, 6, 0, 0, 0, 0,200, 47, 68, 8, 0, 0, 0, 0, -120, 28,155, 8, 0, 0, 0, 0,184,129,154, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,177, 84, 8, 0, 0, 0, 0,104, 66,154, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 65, 68, 8, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 10,155, 8, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 0, 5, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,197, 30, 7, 0, 0, 0, 0,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 0, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255, 2, 0, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216,111,154, 8, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 0,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 2, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 51, - 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 67, 0, 30, 0, 6, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, -152,197, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,120,151, 30, 7, 0, 0, 0, 0, 68, 65, 84, 65, 8, 2, 0, 0, - 56, 65, 68, 8, 0, 0, 0, 0,126, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,177, 84, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, -216,177, 84, 8, 0, 0, 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, - 26,182, 1, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182, 1, 0, 1, 0,128,191,253,255,127,191, - 0, 0,128,191, 26,182, 26,182, 26,182, 1, 0,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, 26,182, 1, 0, - 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73,230, 73, 1, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63, -230, 73, 26,182,230, 73, 1, 0, 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73, 1, 0,255,255,127,191, - 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,230, 73, 1, 0, 68, 65, 84, 65, 8, 2, 0, 0,152, 10,155, 8, 0, 0, 0, 0, -126, 1, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,104, 66,154, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,104, 66,154, 8, 0, 0, 0, 0, - 53, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, - 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 8, 2, 0, 0, -216,111,154, 8, 0, 0, 0, 0,126, 1, 0, 0, 5, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 77, 97,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,129,154, 8, 0, 0, 0, 0, 26, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 71,111,110, 32, 70, 97, 99, -101, 45, 86,101,114,116,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 28,155, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0, -184,129,154, 8, 0, 0, 0, 0, 61, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0,120, 28,155, 8, 0, 0, 0, 0, - 59, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, - 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, - 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, - 3, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, - 7, 0, 0, 0, 9, 0, 0, 0, 68, 65, 84, 65, 8, 2, 0, 0,232,197, 30, 7, 0, 0, 0, 0,126, 1, 0, 0, 5, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 85, 86, 77, 97,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 47, 68, 8, 0, 0, 0, 0, 25, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 78, 71,111,110, 32, 70, 97, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,184,127,248, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,200, 47, 68, 8, 0, 0, 0, 0, 60, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 72, 0, 0, 0,184,127,248, 6, 0, 0, 0, 0, 58, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 2, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 12, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, - 66, 82, 0, 0, 96, 6, 0, 0,184,212, 30, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,100, 0,104, 46, - 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232,220, 30, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, - 80,213, 30, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,220, 30, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, - 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,120,222, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120,222, 30, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248,222, 30, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184,231, 30, 7, 0, 0, 0, 0,184,212, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,229, 30, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, - 68, 65, 84, 65, 56, 1, 0, 0,144,223, 30, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,229, 30, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56,231, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,231, 30, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184,231, 30, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120,240, 30, 7, 0, 0, 0, 0,248,222, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,238, 30, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80,232, 30, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104,238, 30, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, -248,239, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,239, 30, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, - 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120,240, 30, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0,184,231, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40,247, 30, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 20,174,199, 62, - 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 16,241, 30, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40,247, 30, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186, -224,255,127,191,114, 97,255,186,184,248, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184,248, 30, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, -215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56,249, 30, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248, 1, 31, 7, 0, 0, 0, 0, -120,240, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48, - 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232,255, 30, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, -208,249, 30, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,255, 30, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, -224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120, 1, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120, 1, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248, 1, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184, 10, 31, 7, 0, 0, 0, 0, 56,249, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 67,108, 97,121, 32, 83,116,114,105,112,115, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168, 8, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, - 68, 65, 84, 65, 56, 1, 0, 0,144, 2, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168, 8, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56, 10, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56, 10, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120, 19, 31, 7, 0, 0, 0, 0,248, 1, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104, 17, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80, 11, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104, 17, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, -248, 18, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248, 18, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, - 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0,184, 10, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101, 0, 48, 48, 49, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40, 26, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 6, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, - 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 16, 20, 31, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40, 26, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, 50,131,112, 63, -218,243,127,191, 10,183,157,188,184, 27, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184, 27, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, -120, 19, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, - 0, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232, 34, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -208, 28, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232, 34, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, - 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,120, 36, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120, 36, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248, 36, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184, 45, 31, 7, 0, 0, 0, 0, 56, 28, 31, 7, 0, 0, 0, 0, 0, 20, 1,160,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 68,114, 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168, 43, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 63, 35, 0, 0, 0, 0, 4, 0, 8, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, - 68, 65, 84, 65, 56, 1, 0, 0,144, 37, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168, 43, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56, 45, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56, 45, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120, 54, 31, 7, 0, 0, 0, 0,248, 36, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104, 52, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 80, 46, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104, 52, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, -248, 53, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248, 53, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, - 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0,184, 45, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,110, 47, 67,111,110,116,114, 97, -115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40, 61, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, - 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 16, 55, 31, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40, 61, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186, -224,255,127,191,114, 97,255,186,184, 62, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184, 62, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, -215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, -120, 54, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48, - 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232, 69, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -208, 63, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232, 69, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, -224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120, 71, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120, 71, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248, 71, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184, 80, 31, 7, 0, 0, 0, 0, 56, 63, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 73,110,102,108, 97,116,101, 47, 68,101,102,108, 97,116,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168, 78, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, - 68, 65, 84, 65, 56, 1, 0, 0,144, 72, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168, 78, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56, 80, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56, 80, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120, 89, 31, 7, 0, 0, 0, 0,248, 71, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104, 87, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80, 81, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104, 87, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, -248, 88, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248, 88, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, - 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0,184, 80, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40, 96, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, + 0, 0, 0, 0, 68, 65, 84, 65,168, 36, 0, 0,232, 90,170, 5, 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255, +255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255, +255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255, +255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, + 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255, +255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255, +255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255, +255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255, +255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255, +204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,160,160,160,255, +255,255,255,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,172,172,172,128,255,255,255,255, + 0, 0, 0,255, 1, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,255,255,255,255, +255,255,255,255, 0, 0, 25, 0,236,255, 0, 0, 25, 25, 25,255,128,128,128,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255, +255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,128,128,128,255, 0, 0, 0,255, +255,255,255,255, 1, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255,190,190,190,255,100,100,100,180, 68, 68, 68,255, 0, 0, 0,255, +255,255,255,255, 0, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255,180, 0,255,255, +153, 0,230,255, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,114,114,114,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,130,130,130,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,170, 64,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, + 32,255,255,255, 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 32, 0, 0,255, 0, 32, 0,255, + 0, 0,128,255, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,255,255,255,255, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,200,200,200,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76,255, + 0, 0, 0, 0,250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,130,130,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255, 0, 0, 0, 0, +250,250,250,255,250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255,153, 64, 48,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, +240,175,144,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0,255,255,133, 0,255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255, 32, 32,143,255, +109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 18, 66,176, 38, +255,133, 0,178,255,133, 0,127, 0,255, 0,255,255, 0, 0,255,225,210,195, 35, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,127, 51, 76,130,135,140, 76,114,114,114,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +255,255,255,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 5,155,155,155,160,100,104,111,255,111,106,100,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255, 0,170, 0,255,220, 96, 96,255,220, 96, 96,255, + 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, + 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, + 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 94, 94, 94,255, 0, 0, 0,255, +241, 88, 0,255, 0, 0, 0, 40, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,170, 64,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, + 32,255,255,255, 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 32, 0, 0,255, 0, 32, 0,255, + 0, 0,128,255, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,255,255,255,255, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0,255,255,255, 0,255, 4, 0, 0, 0,255,127,127, 0,255,255,255,255,255,255,255, 0,255,127, 0, 0,255,127,127,127, +255,200,200,200,255,255, 0, 0,255, 0, 0,255,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255, +189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, + 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255, +193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, + 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255, +238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255, +152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255, +176,176,176,255,222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, + 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,152, 44,169, 5, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, 56, 45,169, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95, 51,100,115, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 56, 45,169, 5, 0, 0, 0, 0,208, 0, 0, 0, + 1, 0, 0, 0,216,127,170, 5, 0, 0, 0, 0,152, 44,169, 5, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,102, 98,120, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,216,127,170, 5, + 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,120,128,170, 5, 0, 0, 0, 0, 56, 45,169, 5, 0, 0, 0, 0,105,111, 95, 97, +110,105,109, 95, 98,118,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 80, 0, 0, 0,120,128,170, 5, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, 24,129,170, 5, 0, 0, 0, 0,216,127,170, 5, + 0, 0, 0, 0,105,111, 95,109,101,115,104, 95,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 24,129,170, 5, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,184,129,170, 5, + 0, 0, 0, 0,120,128,170, 5, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,111, 98,106, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,184,129,170, 5, 0, 0, 0, 0,208, 0, 0, 0, + 1, 0, 0, 0, 88,130,170, 5, 0, 0, 0, 0, 24,129,170, 5, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,120, 51,100, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 88,130,170, 5, + 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,248,130,170, 5, 0, 0, 0, 0,184,129,170, 5, 0, 0, 0, 0,105,111, 95,109, +101,115,104, 95,115,116,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 80, 0, 0, 0,248,130,170, 5, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,152,131,170, 5, 0, 0, 0, 0, 88,130,170, 5, + 0, 0, 0, 0,105,111, 95,109,101,115,104, 95,117,118, 95,108, 97,121,111,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,152,131,170, 5, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, 56,132,170, 5, + 0, 0, 0, 0,248,130,170, 5, 0, 0, 0, 0,105,111, 95, 99,117,114,118,101, 95,115,118,103, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 56,132,170, 5, 0, 0, 0, 0,208, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,131,170, 5, 0, 0, 0, 0, 99,121, 99,108,101,115, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,232, 0, 0, 0,216,132,170, 5, + 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97, +117,108,116, 32, 83,116,121,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 16, 90, 31, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40, 96, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, - 14,215,126,191, 46,189,194, 61,184, 97, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184, 97, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, - 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, -120, 89, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105,120, 0,104, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232,104, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -208, 98, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,104, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, - 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,120,106, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120,106, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248,106, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184,115, 31, 7, 0, 0, 0, 0, 56, 98, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 77,117,108,116,105,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,113, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,144,107, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,113, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,115, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,115, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184,115, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120,124, 31, 7, 0, 0, 0, 0,248,106, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,122, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80,116, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104,122, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, -248,123, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,123, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, - 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120,124, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0,184,115, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47, 77, 97,103,110,105,102,121, 0, - 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40,131, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, - 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 56, 1, 0, 0, 16,125, 31, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40,131, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186, -224,255,127,191,114, 97,255,186,184,132, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184,132, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, -215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56,133, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0, -120,124, 31, 7, 0, 0, 0, 0,253, 21,192, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104, - 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232,139, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, -208,133, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,139, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, -224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120,141, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120,141, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248,141, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184,150, 31, 7, 0, 0, 0, 0, 56,133, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 83, 99,114, 97,112,101, 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,148, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 56, 1, 0, 0,144,142, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,148, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56,150, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,150, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184,150, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120,159, 31, 7, 0, 0, 0, 0,248,141, 31, 7, 0, 0, 0, 0,168,205,210, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,157, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, - 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, 80,151, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104,157, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, -248,158, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,158, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, - 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120,159, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0,184,150, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40,166, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 16,160, 31, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40,166, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, - 14,215,126,191, 46,189,194, 61,184,167, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184,167, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, - 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56,168, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, -120,159, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, - 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232,174, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -208,168, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,174, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, -224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120,176, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120,176, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248,176, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184,185, 31, 7, 0, 0, 0, 0, 56,168, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 83,110, 97,107,101, 32, 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,183, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,144,177, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,183, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56,185, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,185, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184,185, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0,120,194, 31, 7, 0, 0, 0, 0,248,176, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,192, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 63, 35, 0, 0, 0, - 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80,186, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104,192, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, -248,193, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,193, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, - 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0, -120,194, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0,184,185, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97, 99,116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 40,201, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 16,195, 31, 7, 0, 0, 0, 0, - 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 64, 1, 0, 0, 40,201, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, - 14,215,126,191, 46,189,194, 61,184,202, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184,202, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, - 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0, 96, 6, 0, 0, 56,203, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, -120,194, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232,209, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 63, 35, 0, 0, 0, 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 56, 1, 0, 0, -208,203, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,209, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, -224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120,211, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,120,211, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,248,211, 31, 7, 0, 0, 0, 0,125, 1, 0, 0, 1, 0, 0, 0, -184,220, 31, 7, 0, 0, 0, 0, 56,203, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 84,104,117,109, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,218, 31, 7, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,205,204,204, 62, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,144,212, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,218, 31, 7, 0, 0, 0, 0, -121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 56,220, 31, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,220, 31, 7, 0, 0, 0, 0,119, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 96, 6, 0, 0,184,220, 31, 7, 0, 0, 0, 0, -125, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,211, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,227, 31, 7, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 63, 75, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, -205,204,204, 62, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80,221, 31, 7, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, -104,227, 31, 7, 0, 0, 0, 0,121, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, -248,228, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,228, 31, 7, 0, 0, 0, 0, -119, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, - 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82,112, 38, 0, 0, -160,219,222, 4, 0, 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0, 1, 8, 17, 1, 63, 6, 0, 0, 5, 0, 0, 0, 47,116,109,112, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85, -115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98, -108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0, 3, 0, 0, 0, 56, 52, 39, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 8, 0, 0, - 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0, - 56, 12, 32, 7, 0, 0, 0, 0, 56, 12, 32, 7, 0, 0, 0, 0,184,243, 31, 7, 0, 0, 0, 0,184,243, 31, 7, 0, 0, 0, 0, - 40, 54, 32, 7, 0, 0, 0, 0, 40, 54, 32, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,219, 30, 7, 0, 0, 0, 0,136, 53, 32, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 0, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63, -205,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62, -102,102,102, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0, -205,204, 76, 62,205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 1, 0, 25, 0, 15, 0, -120, 0, 60, 0, 3, 0, 5, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 4, 0, 10, 0, 50, 0, 20, 0, 2, 0, 1, 0, 0, 0, 0, 0,128, 63, 60, 0, 0, 0, 0, 0, 2, 0, - 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, - 68, 65, 84, 65,168, 36, 0, 0, 56, 12, 32, 7, 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, - 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, - 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, - 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, - 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, - 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, - 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, - 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,160,160,160,255,255,255,255,255, - 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,172,172,172,128,255,255,255,255, 0, 0, 0,255, - 1, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,255,255,255,255,255,255,255,255, - 0, 0, 25, 0,236,255, 0, 0, 25, 25, 25,255,128,128,128,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, - 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,128,128,128,255, 0, 0, 0,255,255,255,255,255, - 1, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255,190,190,190,255,100,100,100,180, 68, 68, 68,255, 0, 0, 0,255,255,255,255,255, - 0, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0, 0, 0, 0, 0, 0,115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255,180, 0,255,255,153, 0,230,255, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,130,130,130,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,170, 64,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, 32,255,255,255, - 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 32, 0, 0,255, 0, 32, 0,255, 0, 0,128,255, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,255,255,255,255, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,200, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76,255, 0, 0, 0, 0, -250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,130,130,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255, 0, 0, 0, 0,250,250,250,255, -250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 79,101, 73,255, -135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255,153, 64, 48,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255,240,175,144,255, - 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255, -255,133, 0,255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 79,101, 73,255, -135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255, -255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 79,101, 73,255, -135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255, -255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255, 32, 32,143,255,109, 88,129,255, - 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 18, 66,176, 38,255,133, 0,178, -255,133, 0,127, 0,255, 0,255,255, 0, 0,255,225,210,195, 35, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, -100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,127, 51, 76,130,135,140, 76,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 5, -155,155,155,160,100,104,111,255,111,106,100,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,140, 25,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, - 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255, 0,170, 0,255,220, 96, 96,255,220, 96, 96,255, 3, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,170, 64,255, 8, 48, 8,255, - 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, 32,255,255,255, - 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 32, 0, 0,255, 0, 32, 0,255, 0, 0,128,255, - 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, -144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,255,255,255,255, 0, 0, 0,255,144,144, 0,255, - 64,144, 48,255,128, 48, 96,255, 0, 0, 0, 0, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255, -255,255, 0,255, 4, 0, 0, 0,255,127,127, 0,255,255,255,255,255,255,255, 0,255,127, 0, 0,255,127,127,127,255,200,200,200, -255,255, 0, 0,255, 0, 0,255,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255, -247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255, -131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255, -240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255, -111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,238,194, 54,255, -243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,152, 69,190,255, -211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,176,176,176,255, -222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, - 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 80, 0, 0, 0,104,219, 30, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, 8,220, 30, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95, 51,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 8,220, 30, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, - 40, 49, 32, 7, 0, 0, 0, 0,104,219, 30, 7, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,102, 98,120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 40, 49, 32, 7, 0, 0, 0, 0, -208, 0, 0, 0, 1, 0, 0, 0,200, 49, 32, 7, 0, 0, 0, 0, 8,220, 30, 7, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95, - 98,118,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, -200, 49, 32, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,104, 50, 32, 7, 0, 0, 0, 0, 40, 49, 32, 7, 0, 0, 0, 0, -105,111, 95,109,101,115,104, 95,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 80, 0, 0, 0,104, 50, 32, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, 8, 51, 32, 7, 0, 0, 0, 0, -200, 49, 32, 7, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,111, 98,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 8, 51, 32, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, -168, 51, 32, 7, 0, 0, 0, 0,104, 50, 32, 7, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,120, 51,100, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,168, 51, 32, 7, 0, 0, 0, 0, -208, 0, 0, 0, 1, 0, 0, 0, 72, 52, 32, 7, 0, 0, 0, 0, 8, 51, 32, 7, 0, 0, 0, 0,105,111, 95,109,101,115,104, 95, -115,116,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, - 72, 52, 32, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,232, 52, 32, 7, 0, 0, 0, 0,168, 51, 32, 7, 0, 0, 0, 0, -105,111, 95,109,101,115,104, 95,117,118, 95,108, 97,121,111,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 80, 0, 0, 0,232, 52, 32, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,136, 53, 32, 7, 0, 0, 0, 0, - 72, 52, 32, 7, 0, 0, 0, 0,105,111, 95, 99,117,114,118,101, 95,115,118,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,136, 53, 32, 7, 0, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232, 52, 32, 7, 0, 0, 0, 0, 99,121, 99,108,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,232, 0, 0, 0, 40, 54, 32, 7, 0, 0, 0, 0, -200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 32, - 83,116,121,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,255,255, 0, 0,154,153, 25, 62, 0, 0,128, 63, 0, 0, 12, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255,255, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 11, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255,255, 0, 0,154,153, 25, 62, 0, 0,128, 63, 0, 0, 11, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 8, 0, 5, 0, 5, 0, 8, 0, 2, 0, 8, 0, 4, 0, 0, 0, 68, 78, 65, 49,160, 6, 1, 0,216,191, 73, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69, 80, 13, 0, 0, 42,110,101,120,116, 0, 42,112,114,101,118, 0, - 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,120,109,105,110, 0,120,109, - 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,112, 0,118, 97,108, 0, -118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,101, 91, 54, 52, 93, 0, -115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,101,119,105,100, 0, 42, -108,105, 98, 0,110, 97,109,101, 91, 54, 54, 93, 0,112, 97,100, 0,117,115, 0,105, 99,111,110, 95,105,100, 0,112, 97,100, 50, - 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97, -116, 97, 0,110, 97,109,101, 91, 49, 48, 50, 52, 93, 0,102,105,108,101,112, 97,116,104, 91, 49, 48, 50, 52, 93, 0, 42,112, 97, -114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0, 99,104, 97,110,103,101, -100, 95,116,105,109,101,115,116, 97,109,112, 91, 50, 93, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99, -107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122, -116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118,101,114,116, 0, -105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95,109,105,110, 0, -115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114,118,101, 0, 99, -117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,112, 97,100, 49, 0,114,101,108, 97, -116,105,118,101, 0,116,111,116,101,108,101,109, 0,117,105,100, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, - 91, 54, 52, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100,116, 0, 42,114, -101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, - 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 99,116,105,109,101, 0, -117,105,100,103,101,110, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, - 0,115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, - 0, 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, - 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, - 95,112,111,115, 0,117,110,100,111, 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105, -122,101, 0,115,101,101,107, 0,100,116,120, 0,112, 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 99,108,105,112,115, -116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119, -115,105,122,101, 0,115,101,110,115,111,114, 95,120, 0,115,101,110,115,111,114, 95,121, 0,115,104,105,102,116,120, 0,115,104, -105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0,115,101,110,115,111,114, 95,102, -105,116, 0,112, 97,100, 91, 55, 93, 0, 42,115, 99,101,110,101, 0,102,114, 97,109,101,110,114, 0,102,114, 97,109,101,115, 0, -111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116, -105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120, -116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, 0, 42,114,101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101, -114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,101,110,100,101,114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, - 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0, -121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105, -110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97, -116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95, -121, 0,103,101,110, 95,116,121,112,101, 0,103,101,110, 95,102,108, 97,103, 0, 97,115,112,120, 0, 97,115,112,121, 0,116,101, -120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116,121,112,101, 0, 42,111, 98, -106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,106,120, 0,112,114,111,106,121, - 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122,101, 91, 51, 93, 0,114,111, -116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, 97,112,116,111, 0,112,109, 97,112, -116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, 95,111,117,116,112,117,116, 0, 98, -114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,114, 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111, -108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, - 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105,114,114,102, 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100, -105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101,109,105,116,102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, - 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108,102, 97, 99, 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109, -105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, 0, 99,111,108,116,114, 97,110,115,102, 97, 99, 0,100,101,110, -115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0,114,101,102,108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0, -108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,107,105,110,107,102, - 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,103,114, 97,118,105,116,121,102, 97, 99, - 0,108,105,102,101,102, 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,102,105,101,108,100,102, 97, - 99, 0,115,104, 97,100,111,119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, - 98,108,101,110,100,102, 97, 99, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, 97,109,101,115, - 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, 0, 42, 99,102, -114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, 97,110, 99,101, - 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105,111,110, 0, 97, - 0,116,111,116, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97,116, 91, - 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, 99, 97, -108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, 0,108, - 97,115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115,111,102, -116,110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112,111,105, -110,116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, -111, 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111,105,110, -116, 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0,110,111, -105,115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97,100, 51, - 91, 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0,102, 97,108,108,111,102, -102, 95,115,112,101,101,100, 95,115, 99, 97,108,101, 0,112,100,112, 97,100, 50, 0, 42, 99,111, 98, 97, 0, 42,102, 97,108,108, -111,102,102, 95, 99,117,114,118,101, 0,114,101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102, -105,108,101, 95,102,111,114,109, 97,116, 0,101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110, -116, 95,109,117,108,116,105,112,108,105,101,114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95, -112, 97,116,104, 91, 49, 48, 50, 52, 93, 0, 42,100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0, -111, 99,101, 97,110,109,111,100, 91, 54, 52, 93, 0,111,117,116,112,117,116, 0,110,111,105,115,101,115,105,122,101, 0,116,117, -114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116,105,111,110, 0, -114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, 72, 0,109, -103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102,102,115,101, -116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, 99, 97,108, -101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95,109,101,120, -112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101,112,116,104, - 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97,115,105,115, - 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99,114,111,112, -120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97,120, 0,120,114, -101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98,108, 97, 0, -105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, 0, 42,112,100, - 0, 42,118,100, 0, 42,111,116, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, - 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0, 99,111, 98, 97, 0, 98,108, -101,110,100, 95, 99,111,108,111,114, 91, 51, 93, 0, 98,108,101,110,100, 95,102, 97, 99,116,111,114, 0, 98,108,101,110,100, 95, -116,121,112,101, 0,112, 97,100, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104,100, -119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112,111, -116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50, 0, - 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111, -102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0, 98,108,101,101,100, 98,105, 97,115, 0,112, 97,100, 53, - 91, 50, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108,116,101,114,116, -121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, 0,114, 97,121, - 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121,112,101, 0, 97, -114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122,101,121, 0, 97, -114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, 97,109,112, 95, -109,101,116,104,111,100, 0,115,104, 97,100,111,119,109, 97,112, 95,116,121,112,101, 0,116,101,120, 97, 99,116, 0,115,104, 97, -100,104, 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101, -110,100,116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, - 0,115,117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97, -116,116,101,114,101,100, 95,108,105,103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116, -117,114, 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, - 0, 97,116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97, -110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115, -117,114,101, 0,115,104, 97,100,111,119, 95,102,114,117,115,116,117,109, 95,115,105,122,101, 0,115,107,121, 95, 99,111,108,111, -114,115,112, 97, 99,101, 0,112, 97,100, 52, 91, 50, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116, -117,114,101, 0,112, 97,100, 54, 91, 52, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,115, 99, 97, -116,116,101,114,105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, - 51, 93, 0,116,114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,116,105,111, -110, 95, 99,111,108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95, 99,117,116, -111,102,102, 0, 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,104, 97,100, -101,102,108, 97,103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,111,108,117, -116,105,111,110, 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,110,115,105, -116,121, 0,109,115, 95,115,112,114,101, 97,100, 0, 97,108,112,104, 97, 95, 98,108,101,110,100, 0,102, 97, 99,101, 95,111,114, -105,101,110,116, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112, -101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, - 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, - 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, - 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,103, 97,109,101, 0,102,114,101,115,110,101,108, 95,109, -105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,101, -115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102, 97, -108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104, 97, -114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,114, - 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97, 0, - 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,114, - 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,116, -111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,115, -116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,122, -101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97, 0, -115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,117, -114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,100, -101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 54, 52, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115, 0, -115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, - 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,104, - 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114, 97, - 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,111, -108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,115, -112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101, 99, - 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,112, -102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,108, -101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115, 95, -114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,115, -115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115, 95, -116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,108, - 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,115,104, 97, -100,111,119,111,110,108,121, 95,102,108, 97,103, 0,105,110,100,101,120, 0,103,112,117,109, 97,116,101,114,105, 97,108, 0, 42, - 98, 98, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,117, 97,116, 91, 52, 93, 0,101,120,112,120, 0, -101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116, 0, 42,105,109, 97,116, 0, -101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109, 97,116, 0,102,108, 97,103, - 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114,115,105,122,101, 0,116,104,114, -101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105, -103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,101, 99, 91, 52, 93, 0,109, - 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,114,101,115,111,108,118, 0, -111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118, 0, 42,107,110,111,116,115, -117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,105,117,115, 95,105,110,116, -101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,119, 0,104, 0,110,117,114, 98,115, 0, 42,107,101,121,105, -110,100,101,120, 0,115,104, 97,112,101,110,114, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, 42, 98,101,118, -111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42,112, 97,116,104, - 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,109,111,100,101, 0,116,119, -105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99, 97,108,101, 0,112, 97,116,104,108, -101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,101,120,116, 50, 0,114,101,115,111, -108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117, 0, 42,108, 97,115,116,115,101,108, - 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,100,105,115,116, 0,115,104,101, 97, -114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115, 0,117,108,104,101,105,103,104,116, - 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114, 0, 42,115,101,108, 98,111,120,101, -115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,102,111,110,116, 0, 42,118, -102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,115,101,112, 99,104, 97,114, 0,116, -111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, - 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111, 0, 98,101,118,102, 97, 99, 49, 0, 98,101,118,102, 97, 99, - 50, 0, 42,109,115,101,108,101, 99,116, 0, 42,109,112,111,108,121, 0, 42,109,116,112,111,108,121, 0, 42,109,108,111,111,112, - 0, 42,109,108,111,111,112,117,118, 0, 42,109,108,111,111,112, 99,111,108, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, - 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42, -109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,101,100,105,116, 95, 98, -116,109,101,115,104, 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,112,100, 97,116, 97, 0,108,100, - 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101, 0,116,111,116,115,101,108,101, 99,116, 0,116,111, -116,112,111,108,121, 0,116,111,116,108,111,111,112, 0, 97, 99,116, 95,102, 97, 99,101, 0,115,109,111,111,116,104,114,101,115, -104, 0,115,117, 98,100,105,118, 0,115,117, 98,100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0,101,100,105, -116,102,108, 97,103, 0, 42,109,114, 0, 42,116,112, 97,103,101, 0,117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, - 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0, -101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, - 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111, 91, 51, 93, 0,108,111,111,112,115,116, 97,114,116, - 0,118, 0,101, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,102, 0,105, 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100, -105,115,112, 0,108,101,118,101,108, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0, 42,104,105,100,100,101,110, 0,118, 91, 52, - 93, 0,109,105,100, 0,112, 97,100, 91, 50, 93, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99, -101,115, 0, 42,101,100,103,101,115, 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111, -117,110,116, 0, 99,117,114,114,101,110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118, -108, 0,114,101,110,100,101,114,108,118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, - 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114, 0, -109,111,100,105,102,105,101,114, 0, 42,116,101,120,116,117,114,101, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118, -108, 97,121,101,114, 95,110, 97,109,101, 91, 54, 52, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0,116,101,120,109, 97, -112,112,105,110,103, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101, -109, 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,115,116,114,101,110,103,116,104, 0,100,101,102, 97,120,105,115, 0, -112, 97,100, 91, 54, 93, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, - 95, 97,114,109, 0, 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95, -111, 98, 0, 42,111,102,102,115,101,116, 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, - 0,109,101,114,103,101, 95,100,105,115,116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, - 0, 99,111,117,110,116, 0, 97,120,105,115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, - 0,115,112,108,105,116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, - 0,108,105,109, 95,102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100, -101,102,103,114,112, 95,110, 97,109,101, 91, 54, 52, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111, -108,108, 0,116,105,109,101, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,101,108, 0, 42,112,114,111,106, -101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, - 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,112, -101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106, -101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, - 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102, -115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101, -118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91, 54, 52, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, - 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,114, - 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,108, - 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120, 0, - 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101, -110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, - 0,110,117,109,102, 97, 99,101,115, 0,116,105,109,101, 95,120, 0,116,105,109,101, 95,120,110,101,119, 0, 42, 98,118,104,116, -114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, - 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,105,100,115,105,122,101, 0, 42, 98,105,110,100,105,110,102,108, -117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,101,116,115, 0, 42, 98,105,110,100, 99, 97,103,101, 99,111,115, - 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117,101, -110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122,101, - 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110,100, -109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111,115, 0, - 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,115,121,115, 0,116,111,116,100,109,118,101,114,116, 0,116,111, -116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,111,115,105,116,105,111,110, 0,114, 97,110,100,111, -109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99, -116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,116,111,116,108,118,108, 0,115,105,109,112,108,101, 0, 42,102, -115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116, 0,118,103,114,111,117,112, 95,110, 97,109, -101, 91, 54, 52, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107, 84,121,112,101, 0,115,104,114,105,110,107, - 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102, 76,101,118,101,108,115, 0, 42,111,114,105, -103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, 0,111, -102,102,115,101,116, 95,102, 97, 99, 0,111,102,102,115,101,116, 95,102, 97, 99, 95,118,103, 0, 99,114,101, 97,115,101, 95,105, -110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0,109, 97,116, - 95,111,102,115, 0,109, 97,116, 95,111,102,115, 95,114,105,109, 0, 42,111, 98, 95, 97,120,105,115, 0,115,116,101,112,115, 0, -114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,115, 99,114,101,119, 95,111,102,115, 0, 97,110,103,108, -101, 0, 42,111, 99,101, 97,110, 0, 42,111, 99,101, 97,110, 99, 97, 99,104,101, 0,114,101,115,111,108,117,116,105,111,110, 0, -115,112, 97,116,105, 97,108, 95,115,105,122,101, 0,119,105,110,100, 95,118,101,108,111, 99,105,116,121, 0,115,109, 97,108,108, -101,115,116, 95,119, 97,118,101, 0,119, 97,118,101, 95, 97,108,105,103,110,109,101,110,116, 0,119, 97,118,101, 95,100,105,114, -101, 99,116,105,111,110, 0,119, 97,118,101, 95,115, 99, 97,108,101, 0, 99,104,111,112, 95, 97,109,111,117,110,116, 0,102,111, - 97,109, 95, 99,111,118,101,114, 97,103,101, 0, 98, 97,107,101,115,116, 97,114,116, 0, 98, 97,107,101,101,110,100, 0, 99, 97, - 99,104,101,112, 97,116,104, 91, 49, 48, 50, 52, 93, 0,102,111, 97,109,108, 97,121,101,114,110, 97,109,101, 91, 54, 52, 93, 0, - 99, 97, 99,104,101,100, 0,103,101,111,109,101,116,114,121, 95,109,111,100,101, 0,114,101,102,114,101,115,104, 0,114,101,112, -101, 97,116, 95,120, 0,114,101,112,101, 97,116, 95,121, 0,102,111, 97,109, 95,102, 97,100,101, 0, 42,111, 98,106,101, 99,116, - 95,102,114,111,109, 0, 42,111, 98,106,101, 99,116, 95,116,111, 0,102, 97,108,108,111,102,102, 95,114, 97,100,105,117,115, 0, -101,100,105,116, 95,102,108, 97,103,115, 0,100,101,102, 97,117,108,116, 95,119,101,105,103,104,116, 0, 42, 99,109, 97,112, 95, - 99,117,114,118,101, 0, 97,100,100, 95,116,104,114,101,115,104,111,108,100, 0,114,101,109, 95,116,104,114,101,115,104,111,108, -100, 0,109, 97,115,107, 95, 99,111,110,115,116, 97,110,116, 0,109, 97,115,107, 95,100,101,102,103,114,112, 95,110, 97,109,101, - 91, 54, 52, 93, 0,109, 97,115,107, 95,116,101,120, 95,117,115,101, 95, 99,104, 97,110,110,101,108, 0, 42,109, 97,115,107, 95, -116,101,120,116,117,114,101, 0, 42,109, 97,115,107, 95,116,101,120, 95,109, 97,112, 95,111, 98,106, 0,109, 97,115,107, 95,116, -101,120, 95,109, 97,112,112,105,110,103, 0,109, 97,115,107, 95,116,101,120, 95,117,118,108, 97,121,101,114, 95,110, 97,109,101, - 91, 54, 52, 93, 0,112, 97,100, 95,105, 49, 0,100,101,102,103,114,112, 95,110, 97,109,101, 95, 97, 91, 54, 52, 93, 0,100,101, -102,103,114,112, 95,110, 97,109,101, 95, 98, 91, 54, 52, 93, 0,100,101,102, 97,117,108,116, 95,119,101,105,103,104,116, 95, 97, - 0,100,101,102, 97,117,108,116, 95,119,101,105,103,104,116, 95, 98, 0,109,105,120, 95,109,111,100,101, 0,109,105,120, 95,115, -101,116, 0,112, 97,100, 95, 99, 49, 91, 54, 93, 0,112,114,111,120,105,109,105,116,121, 95,109,111,100,101, 0,112,114,111,120, -105,109,105,116,121, 95,102,108, 97,103,115, 0, 42,112,114,111,120,105,109,105,116,121, 95,111, 98, 95,116, 97,114,103,101,116, - 0,109,105,110, 95,100,105,115,116, 0,109, 97,120, 95,100,105,115,116, 0,112, 97,100, 95,115, 49, 0, 42, 99, 97,110,118, 97, -115, 0, 42, 98,114,117,115,104, 0,116,104,114,101,115,104,111,108,100, 0,115, 99, 97,108,101, 0,104,101,114,109,105,116,101, - 95,110,117,109, 0, 42,108, 97,116,116, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115,118, 0,111, -112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, 0,102,119, - 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, 97,116,109, - 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99, -117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115, -117, 98,115,116,114, 91, 54, 52, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103, -114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105, - 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115,116,114, 97,105, -110,116, 67,104, 97,110,110,101,108,115, 0,101,102,102,101, 99,116, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105, -101,114,115, 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108, - 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,115, 99, 97,108,101, - 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,100,113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0, -100,114,111,116, 65,120,105,115, 91, 51, 93, 0,114,111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, - 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,105,109, 97,116, 95,114, -101,110, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0,112, 97,100, 54, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102, -108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, - 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102, -108, 97,103, 0,112, 97,100, 53, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0,100,117,112, -101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102,111,114,109, -102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109, -105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114,101,115,104, -111,108,100, 0,111, 98,115,116, 97, 99,108,101, 82, 97,100, 0,114,111,116,109,111,100,101, 0, 98,111,117,110,100,116,121,112, -101, 0, 99,111,108,108,105,115,105,111,110, 95, 98,111,117,110,100,116,121,112,101, 0,114,101,115,116,114,105, 99,116,102,108, - 97,103, 0,100,116, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,101,109,112,116,121, 95,100,114, 97,119,115, -105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116, -114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100, -101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102, -116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110, -115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108, -101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0, 98,111,100,121, 95,116,121, -112,101, 0,115,104, 97,112,101,102,108, 97,103, 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 42, -100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,108, 0,108, 97,115,116, - 68, 97,116, 97, 77, 97,115,107, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0,115,116, 97,116,101, 0,105, -110,105,116, 95,115,116, 97,116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108, -105,115,116, 0,105,109, 97, 95,111,102,115, 91, 50, 93, 0, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,111, -114,105,103,108, 97,121, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,110,111, 95,100,114, 97, -119, 0, 97,110,105,109, 97,116,101,100, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102,105,101,108,100, 0,115,104, - 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,107, 95, 97,120,105,115, 0,122,100,105,114, - 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112, 0,102, 95,102,108,111,119, 0,102, 95,115,105,122,101, - 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,102, 95,112,111,119,101,114, - 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95, -114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95, -114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,101,115,115, 0, 97, 98,115,111,114,112,116,105,111,110, - 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111, -102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, - 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101, -120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,119,101,105,103,104,116, 91, 49, 51, 93, 0, -103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91, 51, 93, 0,116,111,116,100, 97,116, 97, 0,102,114, 97, -109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,100, 97,116, 97, 91, 56, 93, 0, - 42, 99,117,114, 91, 56, 93, 0,101,120,116,114, 97,100, 97,116, 97, 0,115,116,101,112, 0,115,105,109,102,114, 97,109,101, 0, -115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114, 97,109,101, 0,108, 97, -115,116, 95,101,120, 97, 99,116, 0,108, 97,115,116, 95,118, 97,108,105,100, 0, 99,111,109,112,114,101,115,115,105,111,110, 0, -112,114,101,118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 49, 48, 50, 52, - 93, 0, 42, 99, 97, 99,104,101,100, 95,102,114, 97,109,101,115, 0,109,101,109, 95, 99, 97, 99,104,101, 0, 42,101,100,105,116, - 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,105,102,102, 0, 97,110,103, 83,116,105,102, -102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,101,114, 97,116,105,111,110,115, - 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115, 0,107, 83, 82, 72, 82, 95, 67, - 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0, -107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, - 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, - 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108, 97,103,115, 0,110,117,109, 99, -108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,105,110,103, 0,116,111,116,115,112,114,105, -110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,108,111, 99,107, 0,109,115,103, - 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95, 77, 97,115,115, 91, 54, 52, 93, - 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116, 0,112,104,121,115,105, 99,115, - 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,105, 99,116, 0,109,105,110,103, -111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,103,114,111,117,112, 0,110, 97, -109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 54, 52, 93, 0,102,117,122,122,121,110,101,115,115, 0,105,110,115, -112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,114,105,110,103, 95, 75, 91, 54, - 52, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,111,108,118,101,114,102,108, 97, -103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 0,115,101, 99,111,110,100,115,112,114,105, -110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,115,116,105,102,102, 0,115, 98, - 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,111,112,115, 0,109, 97,120,108,111,111,112, -115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105, 99, 0,115,112,114,105,110,103, -112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,105,102,102, 0,105,110,112,117, -115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,116,111,114, 95,119,101,105,103,104,116,115, - 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,115, 99, 97,108,101, 91, 51, 93, 91, 51, 93, - 0,108, 97,115,116, 95,102,114, 97,109,101, 0,118,101,108, 91, 51, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,118, - 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,105, -101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,101, - 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,117, -101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,110, -116, 0,103,114, 97,118, 91, 51, 93, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109, 69,110,100, 0, 98, 97,107,101, - 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,102,114, 97,109,101, 79,102,102,115,101,116, 0,103,115,116, 97,114, 0, -109, 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108, -122, 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, 80, 97,116,104, 91, - 49, 48, 50, 52, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116,121,112,101, 70, -108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110,105,116, 84,121, -112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, 99,101,114,115, - 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109,111,111,116,104, -105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 83,105, -122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, 83,105,122,101, - 0, 42,109,101,115,104, 86,101,108,111, 99,105,116,105,101,115, 0, 99,112,115, 84,105,109,101, 83,116, 97,114,116, 0, 99,112, -115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, - 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, 0,118,101,108,111, - 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 82, - 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0, 97,110,105,109, 82, 97,116,101, 0,109,105,115, -116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110,103, 0,122,101, -110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101, 0,108,105, -110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, 82, - 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,121,115,105, - 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112, 0,112,104, -121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,115,116, 97, - 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, 97, -114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116, 0,115,116, - 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,102,101,110, -100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,102, 97, 99, - 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, 97, -111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, 95, - 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,111,114, 0, - 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,101, 99,116, - 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50, 0, 97,111, - 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115, 97,109,112, - 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,112,112,114, -111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,115,101, -108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109,115, 0, 99, 98, - 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97,110,100,108,101, -114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0,100,119, 66,121, -116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114,108,101, 97,118, -101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, 80, 97,114,109, -115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 99, -111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0, 99,111,100, -101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,116,104, 0, 99,111,100,101, 99, 84,101, -109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0, -109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121, 70,114, 97,109,101, 82, 97,116,101, 0, - 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101, 0, 97,117,100,105,111, 83, 97,109,112, -108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,117,100,105,111, 67,104, 97,110,110,101, -108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,105,111, 66,105,116, 82, 97,116,101, 0, - 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95, - 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0, 97,117,100,105,111, 95, 99,104, 97,110, -110,101,108,115, 0, 97,117,100,105,111, 95,112, 97,100, 0, 97,117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95, -115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, - 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95, -114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, - 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114, 0,100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42, -109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, - 95,122,109, 97,115,107, 0,108, 97,121, 95,101,120, 99,108,117,100,101, 0,108, 97,121,102,108, 97,103, 0,112, 97,115,115,102, -108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0,115, 97,109,112,108,101,115, 0,105,109,116,121,112,101, 0,112,108, 97,110, -101,115, 0,113,117, 97,108,105,116,121, 0, 99,111,109,112,114,101,115,115, 0,101,120,114, 95, 99,111,100,101, 99, 0, 99,105, -110,101,111,110, 95,102,108, 97,103, 0, 99,105,110,101,111,110, 95,119,104,105,116,101, 0, 99,105,110,101,111,110, 95, 98,108, - 97, 99,107, 0, 99,105,110,101,111,110, 95,103, 97,109,109, 97, 0,106,112, 50, 95,102,108, 97,103, 0,105,109, 95,102,111,114, -109, 97,116, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113, -116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,111,100,101, 99,100, 97,116, 97, 0,115,117, 98,102,114, - 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0, -116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101, -100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97, -121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101, -114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105, -122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,115, 0,121,112, 97,114,116,115, 0,115,117, 98,105,109, -116,121,112,101, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99, -101, 95,111,112,116,105,111,110,115, 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,111, 99,114, -101,115, 0,112, 97,100, 52, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100, -103,101,105,110,116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121, -101,114,115, 0, 97, 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97, -115,112, 0,102,114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95, -102,108, 97,103, 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100, -105,116,104,101,114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105, -108,116,101,114, 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111, -114,109, 97,108, 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95, -109, 97,120,100,105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0,112, -105, 99, 91, 49, 48, 50, 52, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116, 95,105,100, 0,115,116, 97, -109,112, 95,117,100, 97,116, 97, 91, 55, 54, 56, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93, 0, 98,103, 95,115,116, 97, -109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,114,101,110,100, 95,116,121,112, -101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,105,102,121, 95,102,108, 97,103, - 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,121, 95,115,104, 97,100,111, -119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, 0,115,105,109,112, -108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,110,101,111,110, 98,108, 97, - 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106,112, 50, 95,100,101, -112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,101, 0,100,111,109,101, 97, -110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111,109,101,116,101, -120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,110, 97,109,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95, -112,101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, - 97,120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120, -116, 0, 99,111,108, 91, 51, 93, 0, 99,101,108,108,115,105,122,101, 0, 99,101,108,108,104,101,105,103,104,116, 0, 97,103,101, -110,116,109, 97,120,115,108,111,112,101, 0, 97,103,101,110,116,109, 97,120, 99,108,105,109, 98, 0, 97,103,101,110,116,104,101, -105,103,104,116, 0, 97,103,101,110,116,114, 97,100,105,117,115, 0,101,100,103,101,109, 97,120,108,101,110, 0,101,100,103,101, -109, 97,120,101,114,114,111,114, 0,114,101,103,105,111,110,109,105,110,115,105,122,101, 0,114,101,103,105,111,110,109,101,114, -103,101,115,105,122,101, 0,118,101,114,116,115,112,101,114,112,111,108,121, 0,100,101,116, 97,105,108,115, 97,109,112,108,101, -100,105,115,116, 0,100,101,116, 97,105,108,115, 97,109,112,108,101,109, 97,120,101,114,114,111,114, 0,102,114, 97,109,105,110, -103, 0,112,108, 97,121,101,114,102,108, 97,103, 0,114,116, 49, 0,114,116, 50, 0, 97, 97,115, 97,109,112,108,101,115, 0,112, - 97,100, 52, 91, 51, 93, 0,100,111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97, -116,105,111,110, 0,114,101, 99, 97,115,116, 68, 97,116, 97, 0,109, 97,116,109,111,100,101, 0,101,120,105,116,107,101,121, 0, -111, 98,115,116, 97, 99,108,101, 83,105,109,117,108, 97,116,105,111,110, 0,108,101,118,101,108, 72,101,105,103,104,116, 0, 42, - 99, 97,109,101,114, 97, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95, 99,117,114,115,111, -114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109, 97,108, - 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0, 42,112, 97,105,110, -116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, 97,100,100,107,101, -121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,115,116, - 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,116,101,112, 0,102, - 97,100,101, 95,102,114, 97,109,101,115, 0,114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, - 0,108, 97,115,116, 95,121, 0,108, 97,115,116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, - 0, 97,110, 99,104,111,114,101,100, 95,115,105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, - 91, 51, 93, 0, 97,110, 99,104,111,114,101,100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, - 97,119, 95,112,114,101,115,115,117,114,101, 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, - 97,108, 95,114,111,116, 97,116,105,111,110, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, - 95,112,114,101,118, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105, -117,115, 0, 42,118,112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0, 42,117,118,115, 99,117,108,112,116, 0,118,103,114, -111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,101,114,116,121,112,101, 0,106,111,105,110,116,114,105,108,105,109, -105,116, 0,100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, - 0,110,111,114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114, -105,110,103,115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, - 97,100,105,117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114, -103,105,110, 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103, -110, 0,117,118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109, -111,100,101, 0,117,118, 95,115,117, 98,115,117,114,102, 95,108,101,118,101,108, 0,103,112,101,110, 99,105,108, 95,102,108, 97, -103,115, 0, 97,117,116,111,105,107, 95, 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116, -105, 99,108,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104, -114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 97, -117,116,111,107,101,121, 95,102,108, 97,103, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, - 0,112, 97,100, 50, 91, 53, 93, 0,115,107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95, -116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111, -108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115, -107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105, -109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101, -110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, - 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103, -116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99, -101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115, -116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95, -115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101, -108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, - 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, - 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, -111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101, -110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110, -103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,101,100,103,101, 95,109,111,100,101, 95,108,105,118,101, 95,117,110, -119,114, 97,112, 0,115,110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97, -114,103,101,116, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,112,114,111,112, -111,114,116,105,111,110, 97,108, 95,111, 98,106,101, 99,116,115, 0,112, 97,100, 91, 53, 93, 0, 97,117,116,111, 95,110,111,114, -109, 97,108,105,122,101, 0,109,117,108,116,105,112, 97,105,110,116, 0,117,115,101, 95,117,118, 95,115, 99,117,108,112,116, 0, -117,118, 95,115, 99,117,108,112,116, 95,115,101,116,116,105,110,103,115, 0,117,118, 95,115, 99,117,108,112,116, 95,116,111,111, -108, 0,117,118, 95,114,101,108, 97,120, 95,109,101,116,104,111,100, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,115, -101,116,116,105,110,103,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,115,105,122, -101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,111,106,101, 99,116, -101,100, 95,114, 97,100,105,117,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95, 97, -108,112,104, 97, 0,117,110,105,102,105,101,100, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,116,111,116,111, - 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111, -116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115, -121,115,116,101,109, 0,115,121,115,116,101,109, 95,114,111,116, 97,116,105,111,110, 0,103,114, 97,118,105,116,121, 91, 51, 93, - 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,112, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97, -115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99, -101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, -108, 97,121, 95,117,112,100, 97,116,101,100, 0, 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115, -116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117, -110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,115,111, -117,110,100, 95,115, 99,114,117, 98, 95,104, 97,110,100,108,101, 0, 42,115,112,101, 97,107,101,114, 95,104, 97,110,100,108,101, -115, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,100, - 97,103,102,108, 97,103,115, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103,115, -101,116,115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,115, 95,115,101,116,116,105,110,103,115, 0, 42, 99,108, -105,112, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 95,109,111,100, 97,108, 0, 99,117,115,101,114, 0, 98, -108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, - 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, - 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112, -101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112, 95,108, -111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, - 42,114,101,110,100,101,114, 95,101,110,103,105,110,101, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111, -111,116,104, 95,116,105,109,101,114, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, - 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111, -111,109, 0,105,115, 95,112,101,114,115,112, 0,112,101,114,115,112, 0,118,105,101,119,108,111, 99,107, 0,116,119,100,114, 97, -119,102,108, 97,103, 0,114,102,108, 97,103, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0, -108,118,105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,114,111,116, 95, 97,110, -103,108,101, 0,114,111,116, 95, 97,120,105,115, 91, 51, 93, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101, -116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0, - 98,117,110,100,108,101, 95,115,105,122,101, 0, 98,117,110,100,108,101, 95,100,114, 97,119,116,121,112,101, 0,108, 97,121, 95, -117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, - 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 54, 52, 93, 0,100,114, 97,119,116,121,112,101, 0,111, 98, 95, - 99,101,110,116,114,101, 95, 99,117,114,115,111,114, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,103, -114,105,100, 0,110,101, 97,114, 0,102, 97,114, 0,109,111,100,101,115,101,108,101, 99,116, 0,103,114,105,100,108,105,110,101, -115, 0,103,114,105,100,115,117, 98,100,105,118, 0,103,114,105,100,102,108, 97,103, 0,116,119,116,121,112,101, 0,116,119,109, -111,100,101, 0,116,119,102,108, 97,103, 0,112, 97,100, 50, 91, 50, 93, 0, 97,102,116,101,114,100,114, 97,119, 95,116,114, 97, -110,115,112, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97,121, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97, -121,116,114, 97,110,115,112, 0,122, 98,117,102, 0,120,114, 97,121, 0,112, 97,100, 51, 91, 50, 93, 0, 42,112,114,111,112,101, -114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, - 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109, 97,120,122,111,111,109, 0,115, 99,114,111,108,108, - 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,107,101,101,112,122,111,111,109, 0,107,101,101,112, -111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121, 0,111,108,100,119,105,110,120, 0,111,108,100,119, -105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97, 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0, -114,112,116, 95,109, 97,115,107, 0,118, 50,100, 0, 42, 97,100,115, 0,103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117, -116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97, -105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,114,101,118,105,101,119, 0,116,101,120,116,117,114,101, - 95, 99,111,110,116,101,120,116, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105, -100, 0, 42,116,101,120,117,115,101,114, 0,114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, - 0,122,101, 98,114, 97, 0,122,111,111,109, 0,116,105,116,108,101, 91, 51, 50, 93, 0,100,105,114, 91, 49, 48, 53, 54, 93, 0, -102,105,108,101, 91, 50, 53, 54, 93, 0,114,101,110, 97,109,101,102,105,108,101, 91, 50, 53, 54, 93, 0,114,101,110, 97,109,101, -101,100,105,116, 91, 50, 53, 54, 93, 0,102,105,108,116,101,114, 95,103,108,111, 98, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, - 95,102,105,108,101, 0,115,101,108, 95,102,105,114,115,116, 0,115,101,108, 95,108, 97,115,116, 0,115,111,114,116, 0,100,105, -115,112,108, 97,121, 0,102, 95,102,112, 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115, -101,116, 0, 42,112, 97,114, 97,109,115, 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, - 42,102,111,108,100,101,114,115, 95,110,101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95, -116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110, -114, 0,115,121,115,116,101,109,110,114, 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99, -104, 95,115,116,114,105,110,103, 91, 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,111,117,116,108,105,110,101,118, -105,115, 0,115,116,111,114,101,102,108, 97,103, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0, 42, 99,117,109, 97,112, - 0,115, 99,111,112,101,115, 0,115, 97,109,112,108,101, 95,108,105,110,101, 95,104,105,115,116, 0, 99,117,114,115,111,114, 91, - 50, 93, 0, 99,101,110,116,120, 0, 99,101,110,116,121, 0, 99,117,114,116,105,108,101, 0,108,111, 99,107, 0,112,105,110, 0, -100,116, 95,117,118, 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 42,116,101,120,116, 0, -116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,109,101,110,117,110,114, 0,108,104,101,105,103,104,116, 0, 99,119,105, -100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115, - 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0,108,105,110,101, 95,104,108,105,103,104, -116, 0,111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105, -110,101, 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112, -108,117,103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50, - 53, 54, 93, 0,109, 97,114,103,105,110, 95, 99,111,108,117,109,110, 0, 42,100,114, 97,119, 99, 97, 99,104,101, 0, 42,112,121, - 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98, -114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97, -115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, 49, 48, 50, 52, 93, 0,115, 99,114,105,112,116, 97, -114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, - 0, 99, 97, 99,104,101,115, 0, 99, 97, 99,104,101, 95,100,105,115,112,108, 97,121, 0, 42,105,100, 0, 97,115,112,101, 99,116, - 0,112, 97,100,102, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116, -101,120,102,114,111,109, 0,115,104, 97,100,101,114,102,114,111,109, 0,108,105,110,107,100,114, 97,103, 0,108,101,110, 95, 97, -108,108,111, 99, 0, 99,117,114,115,111,114, 0,115, 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112, -114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114, -116, 0,115,101,108, 95,101,110,100, 0,102,105,108,116,101,114, 91, 54, 52, 93, 0,120,108,111, 99,107,111,102, 0,121,108,111, - 99,107,111,102, 0,117,115,101,114, 0,112, 97,116,104, 95,108,101,110,103,116,104, 0,108,111, 99, 91, 50, 93, 0,115,116, 97, - 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0,117,110,105,115,116, 97, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,116, -112,114,111, 99, 95,102,108, 97,103, 0, 42,100,114, 97,119, 95, 99,111,110,116,101,120,116, 0,100,111,112,101, 95,115,111,114, -116, 0,100,111,112,101, 95,102,108, 97,103, 0,102,105,108,101,110, 97,109,101, 91, 49, 48, 50, 52, 93, 0, 98,108,102, 95,105, -100, 0,117,105,102,111,110,116, 95,105,100, 0,114, 95,116,111, 95,108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110, -103, 0,105,116, 97,108,105, 99, 0, 98,111,108,100, 0,115,104, 97,100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, - 0,115,104, 97,100,111,119, 97,108,112,104, 97, 0,115,104, 97,100,111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105, -116,108,101, 0,103,114,111,117,112,108, 97, 98,101,108, 0,119,105,100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101, -116, 0,112, 97,110,101,108,122,111,111,109, 0,109,105,110,108, 97, 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100, -103,101,116, 99,104, 97,114,115, 0, 99,111,108,117,109,110,115,112, 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, - 99,101, 0, 98,111,120,115,112, 97, 99,101, 0, 98,117,116,116,111,110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115, -112, 97, 99,101,121, 0,112, 97,110,101,108,115,112, 97, 99,101, 0,112, 97,110,101,108,111,117,116,101,114, 0,111,117,116,108, -105,110,101, 91, 52, 93, 0,105,110,110,101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101, -109, 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0, -115,104, 97,100,101,116,111,112, 0,115,104, 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105, -110,110,101,114, 95, 97,110,105,109, 91, 52, 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105, -110,110,101,114, 95,107,101,121, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110, -101,114, 95,100,114,105,118,101,110, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, - 0,104,101, 97,100,101,114, 91, 52, 93, 0,115,104,111,119, 95,104,101, 97,100,101,114, 0,119, 99,111,108, 95,114,101,103,117, -108, 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100, -105,111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95, -110,117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111, -108, 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109, -101,110,117, 95,105,116,101,109, 0,119, 99,111,108, 95,116,111,111,108,116,105,112, 0,119, 99,111,108, 95, 98,111,120, 0,119, - 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105, -115,116, 95,105,116,101,109, 0,119, 99,111,108, 95,115,116, 97,116,101, 0,112, 97,110,101,108, 0,105, 99,111,110,102,105,108, -101, 91, 50, 53, 54, 93, 0,105, 99,111,110, 95, 97,108,112,104, 97, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91, - 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, - 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98, -117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95, -116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, - 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115, -116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108, -101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, - 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, - 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, - 91, 52, 93, 0,115,112,101, 97,107,101,114, 91, 52, 93, 0,101,109,112,116,121, 91, 52, 93, 0, 99, 97,109,101,114, 97, 91, 52, - 93, 0,112, 97,100, 91, 56, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93, 0,103,114,111,117, -112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,114,116,101,120, 91, - 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93, 0,101,100,103,101, - 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,101, 95,115,104, 97, -114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, 93, 0,101,100,103,101, 95, 99,114,101, 97,115, -101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, - 95,100,111,116, 91, 52, 93, 0,101,120,116,114, 97, 95,101,100,103,101, 95,108,101,110, 91, 52, 93, 0,101,120,116,114, 97, 95, -102, 97, 99,101, 95, 97,110,103,108,101, 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,114,101, 97, 91, 52, 93, - 0,112, 97,100, 51, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,111,114,109, 97,108, - 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115, -116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, - 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,118,108,105,110,101, 91, 52, 93, 0, 97, 99, -116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,117,108,105,110,101, 91, 52, 93, 0,110,117, -114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,115,116,115,101,108, 95,112,111,105,110,116, 91, 52, 93, - 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111, 91, 52, 93, 0,104, - 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,108,105,103,110, 91, 52, 93, 0,104, 97, -110,100,108,101, 95, 97,117,116,111, 95, 99,108, 97,109,112,101,100, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, -102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108, -101, 95,115,101,108, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, - 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,117,116,111, 95, 99,108, 97,109,112,101,100, 91, 52, 93, 0,100,115, 95, - 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115, -111,108,101, 95,111,117,116,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99, -111,110,115,111,108,101, 95,105,110,102,111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, - 99,111,110,115,111,108,101, 95, 99,117,114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,111,117, -116,108,105,110,101, 95,119,105,100,116,104, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0,110,111,111,100,108,101, 95, - 99,117,114,118,105,110,103, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121, -110,116, 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109, -111,118,105,101, 91, 52, 93, 0,109,111,118,105,101, 99,108,105,112, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99, -101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, - 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101, -115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97, -110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114, -116,101,120, 95,115,105,122,101, 0,109, 97,114,107,101,114, 95,111,117,116,108,105,110,101, 91, 52, 93, 0,109, 97,114,107,101, -114, 91, 52, 93, 0, 97, 99,116, 95,109, 97,114,107,101,114, 91, 52, 93, 0,115,101,108, 95,109, 97,114,107,101,114, 91, 52, 93, - 0,100,105,115, 95,109, 97,114,107,101,114, 91, 52, 93, 0,108,111, 99,107, 95,109, 97,114,107,101,114, 91, 52, 93, 0, 98,117, -110,100,108,101, 95,115,111,108,105,100, 91, 52, 93, 0,112, 97,116,104, 95, 98,101,102,111,114,101, 91, 52, 93, 0,112, 97,116, -104, 95, 97,102,116,101,114, 91, 52, 93, 0, 99, 97,109,101,114, 97, 95,112, 97,116,104, 91, 52, 93, 0,104,112, 97,100, 91, 55, - 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, - 95,102, 97, 99,101, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95,101,100,103,101, 91, 52, 93, 0, -112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95,118,101,114,116, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115, -116,105,116, 99,104, 95,115,116,105,116, 99,104, 97, 98,108,101, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, - 99,104, 95,117,110,115,116,105,116, 99,104, 97, 98,108,101, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99, -104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,109, 97,116, 99,104, 91, 52, 93, 0,115,101,108,101, 99,116,101,100, 95,104,105, -103,104,108,105,103,104,116, 91, 52, 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, - 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115, -101,113, 0,116,105,109, 97, 0,116,101,120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116, -108,111,103,105, 99, 0,116,117,115,101,114,112,114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 99,108,105,112, 0,116, - 97,114,109, 91, 50, 48, 93, 0, 97, 99,116,105,118,101, 95,116,104,101,109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, - 91, 54, 52, 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101, -109,112,100,105,114, 91, 55, 54, 56, 93, 0,102,111,110,116,100,105,114, 91, 55, 54, 56, 93, 0,114,101,110,100,101,114,100,105, -114, 91, 49, 48, 50, 52, 93, 0,116,101,120,116,117,100,105,114, 91, 55, 54, 56, 93, 0,112,108,117,103,116,101,120,100,105,114, - 91, 55, 54, 56, 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 55, 54, 56, 93, 0,112,121,116,104,111,110,100,105,114, 91, - 55, 54, 56, 93, 0,115,111,117,110,100,100,105,114, 91, 55, 54, 56, 93, 0,105,109, 97,103,101, 95,101,100,105,116,111,114, 91, - 49, 48, 50, 52, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 91, 49, 48, 50, 52, 93, 0, 97,110,105,109, 95,112,108, 97, -121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95,109,105,110, 95,103,114,105,100,115,105,122,101, 0,116,105,109,101, - 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115,105,111,110,115, 0,100, 98,108, 95, 99,108,105, 99,107, 95,116,105, -109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,101,115, 99,114,111,108,108, 0,117,105,102, -108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102, 0,118,105,101,119,122,111,111,109, 0,109, -105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111,100,101,118,105, 99,101, 0, 97,117,100,105,111,114, 97,116,101, 0, - 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100,105,111, 99,104, 97,110,110,101,108,115, 0,100,112,105, 0,101,110, - 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 49, 0, -109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115, 0,117,105,102,111,110,116,115, 0,117,105, -115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0,117,115,101,114, 95,107,101,121,109, 97,112,115, 0, 97,100,100,111, -110,115, 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110, -100,111,109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99, -108,105,100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, - 0,116, 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104, -116, 91, 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108, -101,115,105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108, -101, 99,116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,103,116,104,114,101,115,104,111, -108,100, 0,109,101,109, 99, 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0, -102,114, 97,109,101,115,101,114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, - 99,101,110,116,101,114, 95,100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99, -101,110,116, 95,102,105,108,101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109, -105,116, 0, 99,117,114,115,115,105,122,101, 0, 99,111,108,111,114, 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112, -111, 95,110,101,119, 0,107,101,121,104, 97,110,100,108,101,115, 95,110,101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0, -115, 99,114, 99, 97,115,116,119, 97,105,116, 0,119,105,100,103,101,116, 95,117,110,105,116, 0, 97,110,105,115,111,116,114,111, -112,105, 99, 95,102,105,108,116,101,114, 0,117,115,101, 95, 49, 54, 98,105,116, 95,116,101,120,116,117,114,101,115, 0,112, 97, -100, 56, 0,110,100,111,102, 95,115,101,110,115,105,116,105,118,105,116,121, 0,110,100,111,102, 95,102,108, 97,103, 0,103,108, - 97,108,112,104, 97, 99,108,105,112, 0,116,101,120,116, 95,114,101,110,100,101,114, 0,112, 97,100, 57, 0, 99,111, 98, 97, 95, -119,101,105,103,104,116, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,111,118,101,114,108, 97,121, 95, 99,111,108, 91, - 51, 93, 0,116,119,101, 97,107, 95,116,104,114,101,115,104,111,108,100, 0, 97,117,116,104,111,114, 91, 56, 48, 93, 0, 99,111, -109,112,117,116,101, 95,100,101,118,105, 99,101, 95,116,121,112,101, 0, 99,111,109,112,117,116,101, 95,100,101,118,105, 99,101, - 95,105,100, 0,102, 99,117, 95,105,110, 97, 99,116,105,118,101, 95, 97,108,112,104, 97, 0,118,101,114,116, 98, 97,115,101, 0, -101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,114,101,100,114, - 97,119,115, 95,102,108, 97,103, 0,102,117,108,108, 0,116,101,109,112, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, - 0,100,111, 95,114,101,102,114,101,115,104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100, -114, 97,119, 95,112, 97,105,110,116, 99,117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97, -112, 0,109, 97,105,110,119,105,110, 0,115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101, -114, 0, 42, 99,111,110,116,101,120,116, 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, - 42,118, 49, 0, 42,118, 50, 0, 42,116,121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, - 97,109,101, 91, 54, 52, 93, 0,100,114, 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115, -105,122,101,120, 0,115,105,122,101,121, 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, - 0, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, - 98, 0, 42, 97, 99,116,105,118,101,100, 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115, -105,122,101, 0,108,105,115,116, 95,108, 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, - 0,108,105,115,116, 95,115,101, 97,114, 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98, -117,116,115,112, 97, 99,101,116,121,112,101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, - 0,104, 97,110,100,108,101,114,115, 0, 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97, -119,114, 99,116, 0,115,119,105,110,105,100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, - 0,100,111, 95,100,114, 97,119, 95,111,118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, - 0, 42,104,101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, - 52, 93, 0,115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105, -110,115,117, 98,118,101,114,115,105,111,110, 0,119,105,110,112,111,115, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99, -117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,102, 0,114,101,118,105,115,105, -111,110, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0,111,114,105,103, 95,119,105,100,116,104, 0,111,114,105,103, 95,104,101,105, -103,104,116, 0, 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, - 51, 93, 0,103, 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 55, 54, 56, 93, 0,116, 99, 0, - 98,117,105,108,100, 95,115,105,122,101, 95,102,108, 97,103,115, 0, 98,117,105,108,100, 95,116, 99, 95,102,108, 97,103,115, 0, -100,111,110,101, 0,115,116, 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, - 97,116, 97, 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97, -110, 99,101, 0, 42,105,110,115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114, -114,101,110,116, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0, -101,110,100,111,102,115, 0,109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, - 0,115, 97,116, 0,109,117,108, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0,115, -116,114,101, 97,109,105,110,100,101,120, 0,109,117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0, 99,108,105,112, 95, -102,108, 97,103, 0, 42,115,116,114,105,112, 0, 42,115, 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, - 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,102, 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42, -115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0, 42,115,111,117,110,100, 0, 42,115, 99,101,110,101, 95,115,111,117,110,100, - 0,112,105,116, 99,104, 0,112, 97,110, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116, 97, 0, 97,110, -105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,100, 95,109,111, -100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,112, 97,114,115, -101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0, - 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 49, 48, 50, 52, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,105,114, 91, - 49, 48, 50, 52, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,102,108, - 97,103, 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,114,100, - 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,100, 68, -105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105, 0, 83, - 99, 97,108,101,121, 73,110,105, 0,120, 73,110,105, 0,121, 73,110,105, 0,114,111,116, 73,110,105, 0,105,110,116,101,114,112, -111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114, 97,109,101, 77, 97,112, 0, -103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,101, 0, 98,117,116,116,121, -112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,114,109,102, 97, 99, 0,111, - 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,105,102,101, 0,102,111,114, - 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,118,101, 99, 91, 51, 93, 0, -109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,109, 97,116, 91, 52, 93, 0, -116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112, 0,111,109, 97,116, 0,116, -105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,118,101,114,116,103,114,111, -117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 54, 52, 93, 0,118,103,114,111,117,112,110, 97,109,101, 95,118, - 91, 54, 52, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,110,114, 0,117,115,101,100, 0,117,115,101,100,101,108, -101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107, -101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91, 54, 52, 93, 0,116,111,103, -103,108,101, 78, 97,109,101, 91, 54, 52, 93, 0,118, 97,108,117,101, 91, 54, 52, 93, 0,109, 97,120,118, 97,108,117,101, 91, 54, - 52, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 54, - 52, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 54, 52, 93, 0,109, 97,116,110, 97,109, -101, 91, 54, 52, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,108, 91, 54, 52, 93, 0, 99, -111,110,115,116,114, 97,105,110,116, 91, 54, 52, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99, -116, 91, 54, 52, 93, 0, 98,111,100,121, 91, 54, 52, 93, 0,111,116,121,112,101, 0,112,117,108,115,101, 0,102,114,101,113, 0, -116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120, -105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0, -112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115, - 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109, - 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 54, 52, 93, 0, 98,108,101,110,100,105,110, 0,112, -114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114, -105,100,101,108,101,110,103,116,104, 0,108, 97,121,101,114, 95,119,101,105,103,104,116, 0,109,105,110, 95,103, 97,105,110, 0, -109, 97,120, 95,103, 97,105,110, 0,114,101,102,101,114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95, -100,105,115,116, 97,110, 99,101, 0,114,111,108,108,111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110, -101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111, -117,116,101,114, 95,103, 97,105,110, 0,115,110,100,110,114, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49, 93, 0, - 42,109,101, 0,108,105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, - 93, 0,108,111, 99, 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108, -111, 99, 91, 51, 93, 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,112, 97,100, 49, 91, 51, 93, 0,108,105,110,101, 97,114, -118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42, -114,101,102,101,114,101,110, 99,101, 0,109,105,110, 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, - 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, - 93, 0,109, 97,116,112,114,111,112, 91, 54, 52, 93, 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116, -114,105, 98,117,116,105,111,110, 0,105,110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, - 97,116, 95, 97,114,103, 95, 49, 0,102,108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, - 54, 52, 93, 0, 42,116,111, 79, 98,106,101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, - 54, 52, 93, 0,108,111, 97,100, 97,110,105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97, -116, 95, 97,114,103, 0,105,110,102,108,117,101,110, 99,101, 0, 42,115,117, 98,116, 97,114,103,101,116, 0,102, 97, 99,105,110, -103, 97,120,105,115, 0,118,101,108,111, 99,105,116,121, 0, 97, 99, 99,101,108,101,114, 97,116,105,111,110, 0,116,117,114,110, -115,112,101,101,100, 0,117,112,100, 97,116,101, 84,105,109,101, 0, 42,110, 97,118,109,101,115,104, 0,103,111, 0, 42,110,101, -119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, - 0, 42, 99, 97, 99,104,101, 0, 42,119, 97,118,101,102,111,114,109, 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100, -108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, - 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97, -105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93, - 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 97,114,109, 95,114, -111,108,108, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97, -100, 95,104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0,112, 97,100, 91, 49, 93, 0, 98,111,110,101, 98, 97,115,101, 0, - 99,104, 97,105,110, 98, 97,115,101, 0, 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101, -100, 98,111,110,101, 0, 42,115,107,101,116, 99,104, 0,103,101,118,101,114,116,100,101,102,111,114,109,101,114, 0,108, 97,121, -101,114, 95,117,115,101,100, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0, -103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111, -115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, - 99, 0,112, 97,116,104, 97, 99, 0, 42,112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, - 95,102,114, 97,109,101, 0,103,104,111,115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, - 99, 0,103,104,111,115,116, 95, 97, 99, 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, - 0,103,104,111,115,116, 95,102,108, 97,103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0, -112, 97,116,104, 95,118,105,101,119,102,108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, - 95,115,102, 0,112, 97,116,104, 95,101,102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104, 95, 97, 99, 0,105,107,102,108, - 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 99,111,110,115,116,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, - 97,103, 0,112, 97,100, 48, 91, 54, 93, 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0,115, -105,107,116,114,101,101, 0, 42, 99,117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0,101,117,108, 91, 51, 93, - 0, 99,104, 97,110, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112, -111,115,101, 95,104,101, 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105, -110, 91, 51, 93, 0,108,105,109,105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107, -115,116,114,101,116, 99,104, 0,105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, - 42,116,101,109,112, 0, 99,104, 97,110, 98, 97,115,101, 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111,120,121, 95,108, - 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102, -115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,107,115,111, -108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, 97, 99,116, 95, - 98,111,110,101, 91, 54, 52, 93, 0,110,117,109,105,116,101,114, 0,110,117,109,115,116,101,112, 0,109,105,110,115,116,101,112, - 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120,118,101,108, 0, -100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115,116,111,109, 67, -111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,114,107,101, -114, 0,105,100,114,111,111,116, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112, 0,115,101, 97, -114, 99,104,115,116,114, 91, 54, 52, 93, 0,102,105,108,116,101,114,102,108, 97,103, 0,114,101,110, 97,109,101, 73,110,100,101, -120, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101, 0, 42,103,114,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119, -110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, - 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,101,114,114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, - 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,116, 79,114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114, -103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111, -116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 54, 52, 93, - 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103, -101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115, 0, 99,104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, - 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102, -108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108, -111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98, -117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0, -109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0, -105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, - 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, - 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,116, 65,120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, - 97,100, 91, 57, 93, 0,116,114, 97, 99,107, 91, 54, 52, 93, 0,111, 98,106,101, 99,116, 91, 54, 52, 93, 0, 42,100,101,112,116, -104, 95,111, 98, 0, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114, -105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, - 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,108,101,110, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100, -101, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110, -112,117,116, 0,104, 97,115,111,117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112, -101, 0,105,115, 95, 99,111,112,121, 0,101,120,116,101,114,110, 97,108, 0, 42,110,101,119, 95,115,111, 99,107, 0, 42,115,116, -111,114, 97,103,101, 0,108,105,109,105,116, 0,108,111, 99,120, 0,108,111, 99,121, 0, 42,100,101,102, 97,117,108,116, 95,118, - 97,108,117,101, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,115,116, 97, 99,107, 95,116,121,112,101, 0,111,119,110, 95, -105,110,100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,103,114,111,117,112,115,111, 99,107, 0, 42,108,105,110,107, 0, -110,115, 0, 42,114,101, 99,116, 0,120,115,105,122,101, 0,121,115,105,122,101, 0, 42,110,101,119, 95,110,111,100,101, 0,108, - 97,115,116,121, 0,111,117,116,112,117,116,115, 0,109,105,110,105,119,105,100,116,104, 0,117,112,100, 97,116,101, 0,108, 97, - 98,101,108, 91, 54, 52, 93, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, - 99,117,115,116,111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97, -116, 97, 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110, -102,111, 0, 42,102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0, 42, -116,111,115,111, 99,107, 0,110,111,100,101,115, 0,108,105,110,107,115, 0,105,110,105,116, 0, 99,117,114, 95,105,110,100,101, -120, 0,110,111,100,101,116,121,112,101, 0, 42,101,120,101, 99,100, 97,116, 97, 0, 40, 42,112,114,111,103,114,101,115,115, 41, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,255,255, 0, 0,154,153, 25, 62, 0, 0,128, 63, 0, 0, 12, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255,255, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 11, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255,255, 0, 0,154,153, 25, 62, 0, 0,128, 63, 0, 0, 11, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 8, 0, 5, 0, 5, 0, 8, 0, 2, 0, 8, 0, 4, 0, 0, 0, 68, 78, 65, 49,124, 8, 1, 0,120,177,144, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69, 99, 13, 0, 0, 42,110,101,120,116, 0, 42,112, +114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,120,109,105, +110, 0,120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,112, 0, +118, 97,108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,101, 91, + 54, 52, 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,101,119, +105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 54, 54, 93, 0,112, 97,100, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, +112, 97,100, 50, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105, +108,101,100, 97,116, 97, 0,110, 97,109,101, 91, 49, 48, 50, 52, 93, 0,102,105,108,101,112, 97,116,104, 91, 49, 48, 50, 52, 93, + 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0, 99,104, + 97,110,103,101,100, 95,116,105,109,101,115,116, 97,109,112, 91, 50, 93, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, + 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, + 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118, +101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95, +109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114, +118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,112, 97,100, 49, 0, +114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,117,105,100, 0, 42,119,101,105,103,104,116,115, 0,118,103, +114,111,117,112, 91, 54, 52, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100, +116, 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98, +108,111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 99,116, +105,109,101, 0,117,105,100,103,101,110, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105, +110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97, +100, 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115, +101,108,108, 0, 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0, +117,110,100,111, 95,112,111,115, 0,117,110,100,111, 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109, +101, 0,115,105,122,101, 0,115,101,101,107, 0,100,116,120, 0,112, 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 99, +108,105,112,115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0, +100,114, 97,119,115,105,122,101, 0,115,101,110,115,111,114, 95,120, 0,115,101,110,115,111,114, 95,121, 0,115,104,105,102,116, +120, 0,115,104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0,115,101,110,115, +111,114, 95,102,105,116, 0,112, 97,100, 91, 55, 93, 0, 42,115, 99,101,110,101, 0,102,114, 97,109,101,110,114, 0,102,114, 97, +109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108, 0,111,107, 0, +109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,105, 98,117,102,115, 0, 42,103,112, +117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, 0, 42,114,101,110,100,101,114,115, 91, 56, 93, 0,114, +101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,101,110,100,101,114, 95,115,108,111,116, 0,115,111,117,114, + 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120, +114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114, +101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,114,101,118,105,101,119, 0,108, 97,115,116, +117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0, +103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0,103,101,110, 95,102,108, 97,103, 0, 97,115,112,120, 0, 97,115,112, +121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116,121,112,101, + 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,106,120, 0,112, +114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122,101, 91, 51, + 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, 97,112,116,111, 0, +112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, 95,111,117,116,112, +117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,114, 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97, +114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, + 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105,114,114,102, 97, 99, 0, 97,108,112,104, 97,102, + 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101,109,105,116,102, 97, 99, 0,104, 97,114,100,102, + 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108,102, 97, 99, 0, 97,109, 98,102, 97, 99, 0, 99, +111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, 0, 99,111,108,116,114, 97,110,115,102, 97, 99, + 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0,114,101,102,108,102, 97, 99, 0,116,105,109,101, +102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,107, +105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,103,114, 97,118,105,116, +121,102, 97, 99, 0,108,105,102,101,102, 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,102,105,101, +108,100,102, 97, 99, 0,115,104, 97,100,111,119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110, +102, 97, 99, 0, 98,108,101,110,100,102, 97, 99, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, + 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, + 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, + 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105, +111,110, 0, 97, 0,116,111,116, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105, +109, 97,116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101, +119,115, 99, 97,108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97, +108, 99, 0,108, 97,115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, + 95,115,111,102,116,110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111, +116,112,111,105,110,116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, + 97, 99,101, 0,111, 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42, +112,111,105,110,116, 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116, +104, 0,110,111,105,115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100, +112, 97,100, 51, 91, 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0,102, 97, +108,108,111,102,102, 95,115,112,101,101,100, 95,115, 99, 97,108,101, 0,112,100,112, 97,100, 50, 0, 42, 99,111, 98, 97, 0, 42, +102, 97,108,108,111,102,102, 95, 99,117,114,118,101, 0,114,101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121, +112,101, 0,102,105,108,101, 95,102,111,114,109, 97,116, 0,101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112, +101, 0,105,110,116, 95,109,117,108,116,105,112,108,105,101,114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117, +114, 99,101, 95,112, 97,116,104, 91, 49, 48, 50, 52, 93, 0, 42,100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, + 97,109,101, 0,111, 99,101, 97,110,109,111,100, 91, 54, 52, 93, 0,111,117,116,112,117,116, 0,110,111,105,115,101,115,105,122, +101, 0,116,117,114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116, +105,111,110, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, + 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111, +102,102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116, +115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, + 95,109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100, +101,112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, + 97,115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, + 99,114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97, +120, 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, + 98,108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, + 0, 42,112,100, 0, 42,118,100, 0, 42,111,116, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111, +116, 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0, 99,111, 98, + 97, 0, 98,108,101,110,100, 95, 99,111,108,111,114, 91, 51, 93, 0, 98,108,101,110,100, 95,102, 97, 99,116,111,114, 0, 98,108, +101,110,100, 95,116,121,112,101, 0,112, 97,100, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,115,104,100,119,114, + 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121, 0,100,105,115,116, + 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,116,116, 49, 0, 97, +116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97, +115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0, 98,108,101,101,100, 98,105, 97,115, 0, +112, 97,100, 53, 91, 50, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108, +116,101,114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, + 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121, +112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122, +101,121, 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, + 97,109,112, 95,109,101,116,104,111,100, 0,115,104, 97,100,111,119,109, 97,112, 95,116,121,112,101, 0,116,101,120, 97, 99,116, + 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107, +121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112, +114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99, +107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97, +116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, + 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100, +105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101, +120,112,111,115,117,114,101, 0,115,104, 97,100,111,119, 95,102,114,117,115,116,117,109, 95,115,105,122,101, 0,115,107,121, 95, + 99,111,108,111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 91, 50, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95, +116,101,120,116,117,114,101, 0,112, 97,100, 54, 91, 52, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, + 0,115, 99, 97,116,116,101,114,105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, + 99,111,108, 91, 51, 93, 0,116,114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, + 99,116,105,111,110, 95, 99,111,108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, + 95, 99,117,116,111,102,102, 0, 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0, +115,104, 97,100,101,102,108, 97,103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101, +115,111,108,117,116,105,111,110, 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116, +101,110,115,105,116,121, 0,109,115, 95,115,112,114,101, 97,100, 0, 97,108,112,104, 97, 95, 98,108,101,110,100, 0,102, 97, 99, +101, 95,111,114,105,101,110,116, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99, +114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98, +114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, + 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, + 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,103, 97,109,101, 0,102,114,101,115,110, +101,108, 95,109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, + 0,102,114,101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116, +120, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, + 97, 0,104, 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115, +115, 95,116,114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95, +116,114, 97, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115, +104, 95,116,114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, + 97,100,101,116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114, +101, 99, 0,115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114, +101,115,105,122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95, +115,116, 97, 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110, +100, 95,115,117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116, +104,102, 97,100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 54, 52, 93, 0,115, 98,105, 97,115, 0,108, 98, +105, 97,115, 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95, +116,121,112,101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102, +102, 95,115,104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114, +101,102,114, 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109, +112, 95, 99,111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112, +105,110, 95,115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95, +115,112,101, 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0, +114, 97,109,112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0, +114,101,102,108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0, +115,115,115, 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114, +111,114, 0,115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0, +115,115,115, 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115, +115, 95,102,108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, + 0,115,104, 97,100,111,119,111,110,108,121, 95,102,108, 97,103, 0,105,110,100,101,120, 0,103,112,117,109, 97,116,101,114,105, + 97,108, 0, 42, 98, 98, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,117, 97,116, 91, 52, 93, 0,101, +120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116, 0, 42,105, +109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109, 97,116, 0, +102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114,115,105,122,101, + 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, + 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,101, 99, 91, + 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,114,101,115, +111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118, 0, 42,107, +110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,105,117,115, + 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,119, 0,104, 0,110,117,114, 98,115, 0, 42, +107,101,121,105,110,100,101,120, 0,115,104, 97,112,101,110,114, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, + 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42, +112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,109,111,100, +101, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99, 97,108,101, 0,112, + 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,101,120,116, 50, 0, +114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117, 0, 42,108, 97,115, +116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,100,105,115,116, 0, +115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115, 0,117,108,104,101, +105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114, 0, 42,115,101,108, + 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,102,111,110, +116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,115,101,112, 99,104, + 97,114, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,108,115,116, 97,114,116, 0,115,101, +108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111, 0, 98,101,118,102, 97, 99, 49, 0, 98,101, +118,102, 97, 99, 50, 0, 42,109,115,101,108,101, 99,116, 0, 42,109,112,111,108,121, 0, 42,109,116,112,111,108,121, 0, 42,109, +108,111,111,112, 0, 42,109,108,111,111,112,117,118, 0, 42,109,108,111,111,112, 99,111,108, 0, 42,109,102, 97, 99,101, 0, 42, +109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101, +114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,101,100, +105,116, 95, 98,116,109,101,115,104, 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,112,100, 97,116, + 97, 0,108,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101, 0,116,111,116,115,101,108,101, 99, +116, 0,116,111,116,112,111,108,121, 0,116,111,116,108,111,111,112, 0, 97, 99,116, 95,102, 97, 99,101, 0,115,109,111,111,116, +104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, + 0,101,100,105,116,102,108, 97,103, 0, 42,109,114, 0, 42,116,112, 97,103,101, 0,117,118, 91, 52, 93, 91, 50, 93, 0, 99,111, +108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112, 0,118, 49, 0,118, 50, 0,118, 51, + 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,104,116, 0,100,101,102, 95,110,114, + 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111, 91, 51, 93, 0,108,111,111,112,115, +116, 97,114,116, 0,118, 0,101, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,102, 0,105, 0,115, 91, 50, 53, 54, 93, 0, +116,111,116,100,105,115,112, 0,108,101,118,101,108, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0, 42,104,105,100,100,101,110, + 0,118, 91, 52, 93, 0,109,105,100, 0,112, 97,100, 91, 50, 93, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111, +108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101, +108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112, +105,110,108,118,108, 0,114,101,110,100,101,114,108,118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, + 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114, +114,111,114, 0,109,111,100,105,102,105,101,114, 0, 42,116,101,120,116,117,114,101, 0, 42,109, 97,112, 95,111, 98,106,101, 99, +116, 0,117,118,108, 97,121,101,114, 95,110, 97,109,101, 91, 54, 52, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0,116, +101,120,109, 97,112,112,105,110,103, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108, +115, 0, 42,101,109, 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,115,116,114,101,110,103,116,104, 0,100,101,102, 97, +120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, + 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117, +114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116, 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108, +101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95, +116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111, +114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102, +108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103, +108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101, 91, 54, 52, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, + 0, 42, 99,111,108,108, 0,116,105,109,101, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,101,108, 0, 42, +112,114,111,106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99, +116,111,114,115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108, +101,121, 0,112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, + 42,111, 98,106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103, +104,116, 0,110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109, +101,111,102,102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, + 42,112,114,101,118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91, 54, 52, 93, 0,112, 97,114,101,110,116,105,110,118, + 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, + 0,102,111,114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, + 99,111,108,108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, + 0, 42,120, 0, 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99, +117,114,114,101,110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118, +101,114,116,115, 0,110,117,109,102, 97, 99,101,115, 0,116,105,109,101, 95,120, 0,116,105,109,101, 95,120,110,101,119, 0, 42, + 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,111,112,101,114, 97,116,105,111,110, 0,118,101, +114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,105,100,115,105,122,101, 0, 42, 98,105,110,100, +105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,101,116,115, 0, 42, 98,105,110,100, 99, 97,103, +101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100, 0, 42,100,121,110,105,110, +102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,100,121,110,103,114,105,100, +115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,108,119,105,100,116,104, 0, + 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110,100, + 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,115,121,115, 0,116,111,116,100,109,118,101,114, +116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,111,115,105,116,105,111,110, 0,114, + 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, 0,112,114, +111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,116,111,116,108,118,108, 0,115,105,109,112,108, +101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116, 0,118,103,114,111,117,112, + 95,110, 97,109,101, 91, 54, 52, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107, 84,121,112,101, 0,115,104, +114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102, 76,101,118,101,108,115, 0, + 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111,114,105,103,105,110, 79,112, +116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0,111,102,102,115,101,116, 95,102, 97, 99, 95,118,103, 0, 99,114,101, 97, +115,101, 95,105,110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, + 0,109, 97,116, 95,111,102,115, 0,109, 97,116, 95,111,102,115, 95,114,105,109, 0, 42,111, 98, 95, 97,120,105,115, 0,115,116, +101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,115, 99,114,101,119, 95,111,102,115, 0, + 97,110,103,108,101, 0, 42,111, 99,101, 97,110, 0, 42,111, 99,101, 97,110, 99, 97, 99,104,101, 0,114,101,115,111,108,117,116, +105,111,110, 0,115,112, 97,116,105, 97,108, 95,115,105,122,101, 0,119,105,110,100, 95,118,101,108,111, 99,105,116,121, 0,115, +109, 97,108,108,101,115,116, 95,119, 97,118,101, 0,119, 97,118,101, 95, 97,108,105,103,110,109,101,110,116, 0,119, 97,118,101, + 95,100,105,114,101, 99,116,105,111,110, 0,119, 97,118,101, 95,115, 99, 97,108,101, 0, 99,104,111,112, 95, 97,109,111,117,110, +116, 0,102,111, 97,109, 95, 99,111,118,101,114, 97,103,101, 0, 98, 97,107,101,115,116, 97,114,116, 0, 98, 97,107,101,101,110, +100, 0, 99, 97, 99,104,101,112, 97,116,104, 91, 49, 48, 50, 52, 93, 0,102,111, 97,109,108, 97,121,101,114,110, 97,109,101, 91, + 54, 52, 93, 0, 99, 97, 99,104,101,100, 0,103,101,111,109,101,116,114,121, 95,109,111,100,101, 0,114,101,102,114,101,115,104, + 0,114,101,112,101, 97,116, 95,120, 0,114,101,112,101, 97,116, 95,121, 0,102,111, 97,109, 95,102, 97,100,101, 0, 42,111, 98, +106,101, 99,116, 95,102,114,111,109, 0, 42,111, 98,106,101, 99,116, 95,116,111, 0,102, 97,108,108,111,102,102, 95,114, 97,100, +105,117,115, 0,101,100,105,116, 95,102,108, 97,103,115, 0,100,101,102, 97,117,108,116, 95,119,101,105,103,104,116, 0, 42, 99, +109, 97,112, 95, 99,117,114,118,101, 0, 97,100,100, 95,116,104,114,101,115,104,111,108,100, 0,114,101,109, 95,116,104,114,101, +115,104,111,108,100, 0,109, 97,115,107, 95, 99,111,110,115,116, 97,110,116, 0,109, 97,115,107, 95,100,101,102,103,114,112, 95, +110, 97,109,101, 91, 54, 52, 93, 0,109, 97,115,107, 95,116,101,120, 95,117,115,101, 95, 99,104, 97,110,110,101,108, 0, 42,109, + 97,115,107, 95,116,101,120,116,117,114,101, 0, 42,109, 97,115,107, 95,116,101,120, 95,109, 97,112, 95,111, 98,106, 0,109, 97, +115,107, 95,116,101,120, 95,109, 97,112,112,105,110,103, 0,109, 97,115,107, 95,116,101,120, 95,117,118,108, 97,121,101,114, 95, +110, 97,109,101, 91, 54, 52, 93, 0,112, 97,100, 95,105, 49, 0,100,101,102,103,114,112, 95,110, 97,109,101, 95, 97, 91, 54, 52, + 93, 0,100,101,102,103,114,112, 95,110, 97,109,101, 95, 98, 91, 54, 52, 93, 0,100,101,102, 97,117,108,116, 95,119,101,105,103, +104,116, 95, 97, 0,100,101,102, 97,117,108,116, 95,119,101,105,103,104,116, 95, 98, 0,109,105,120, 95,109,111,100,101, 0,109, +105,120, 95,115,101,116, 0,112, 97,100, 95, 99, 49, 91, 54, 93, 0,112,114,111,120,105,109,105,116,121, 95,109,111,100,101, 0, +112,114,111,120,105,109,105,116,121, 95,102,108, 97,103,115, 0, 42,112,114,111,120,105,109,105,116,121, 95,111, 98, 95,116, 97, +114,103,101,116, 0,109,105,110, 95,100,105,115,116, 0,109, 97,120, 95,100,105,115,116, 0,112, 97,100, 95,115, 49, 0, 42, 99, + 97,110,118, 97,115, 0, 42, 98,114,117,115,104, 0,116,104,114,101,115,104,111,108,100, 0,115, 99, 97,108,101, 0,104,101,114, +109,105,116,101, 95,110,117,109, 0, 42,108, 97,116,116, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116, +115,118, 0,111,112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102, +118, 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0, +108, 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, + 0, 42,115, 99,117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0, +112, 97,114,115,117, 98,115,116,114, 91, 54, 52, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111, +120,121, 95,103,114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111, +115,101,108,105, 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115, +116,114, 97,105,110,116, 67,104, 97,110,110,101,108,115, 0,101,102,102,101, 99,116, 0,100,101,102, 98, 97,115,101, 0,109,111, +100,105,102,105,101,114,115, 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99, +116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,115, + 99, 97,108,101, 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,100,113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, + 91, 51, 93, 0,100,114,111,116, 65,120,105,115, 91, 51, 93, 0,114,111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103, +108,101, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,105,109, + 97,116, 95,114,101,110, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0,112, 97,100, 54, 0, 99,111,108, 98,105,116,115, 0,116,114, + 97,110,115,102,108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112, +102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97, +118,105,115,102,108, 97,103, 0,112, 97,100, 53, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, + 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0, +102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118, +101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104, +114,101,115,104,111,108,100, 0,111, 98,115,116, 97, 99,108,101, 82, 97,100, 0,114,111,116,109,111,100,101, 0, 98,111,117,110, +100,116,121,112,101, 0, 99,111,108,108,105,115,105,111,110, 95, 98,111,117,110,100,116,121,112,101, 0,114,101,115,116,114,105, + 99,116,102,108, 97,103, 0,100,116, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,101,109,112,116,121, 95,100, +114, 97,119,115,105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, + 99,111,110,116,114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, + 97, 99,116,100,101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, + 0,115,111,102,116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, + 0, 99,111,110,115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114, +116,105, 99,108,101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0, 98,111,100, +121, 95,116,121,112,101, 0,115,104, 97,112,101,102,108, 97,103, 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,105,110, +103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,108, 0, +108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0,115,116, 97, +116,101, 0,105,110,105,116, 95,115,116, 97,116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117, +112,108,105,108,105,115,116, 0,105,109, 97, 95,111,102,115, 91, 50, 93, 0, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105, +118,101, 0,111,114,105,103,108, 97,121, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,110,111, + 95,100,114, 97,119, 0, 97,110,105,109, 97,116,101,100, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102,105,101,108, +100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,107, 95, 97,120,105,115, 0, +122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112, 0,102, 95,102,108,111,119, 0,102, 95, +115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,102, 95,112, +111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,100,101,102, 95,100, 97,109,112, 0,112, +100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,102,114,105, 99,116, 0,112, +100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,101,115,115, 0, 97, 98,115,111,114,112, +116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,102,116, 0,112,100,101,102, + 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,119, 0,107,105,110,107, 95, +102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,102,114,101,101, 95,101,110, +100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,119,101,105,103,104,116, 91, + 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91, 51, 93, 0,116,111,116,100, 97,116, 97, + 0,102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,100, 97,116, 97, + 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,101,120,116,114, 97,100, 97,116, 97, 0,115,116,101,112, 0,115,105,109,102,114, + 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114, 97,109, +101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0,108, 97,115,116, 95,118, 97,108,105,100, 0, 99,111,109,112,114,101,115,115, +105,111,110, 0,112,114,101,118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, + 49, 48, 50, 52, 93, 0, 42, 99, 97, 99,104,101,100, 95,102,114, 97,109,101,115, 0,109,101,109, 95, 99, 97, 99,104,101, 0, 42, +101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,105,102,102, 0, 97,110,103, + 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,101,114, 97,116, +105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115, 0,107, 83, 82, + 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95, 83, 80, 76, 84, + 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 86, 67, 70, + 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84, 0,107, 67, 72, + 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108, 97,103,115, 0, +110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,105,110,103, 0,116,111,116, +115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,108,111, 99,107, + 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95, 77, 97,115,115, + 91, 54, 52, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116, 0,112,104,121, +115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,105, 99,116, 0, +109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,103,114,111,117, +112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 54, 52, 93, 0,102,117,122,122,121,110,101,115,115, + 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,114,105,110,103, + 95, 75, 91, 54, 52, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,111,108,118,101, +114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 0,115,101, 99,111,110,100, +115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,115,116,105,102, +102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,111,112,115, 0,109, 97,120, +108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105, 99, 0,115,112, +114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,105,102,102, 0, +105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,116,111,114, 95,119,101,105, +103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,115, 99, 97,108,101, 91, 51, + 93, 91, 51, 93, 0,108, 97,115,116, 95,102,114, 97,109,101, 0,118,101,108, 91, 51, 93, 0, 42,102,109,100, 0,115,104,111,119, + 95, 97,100,118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112, +114,101,118,105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, + 77,111,100,101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, + 86, 97,108,117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112, +111,110,101,110,116, 0,103,114, 97,118, 91, 51, 93, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109, 69,110,100, 0, + 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,102,114, 97,109,101, 79,102,102,115,101,116, 0,103,115, +116, 97,114, 0,109, 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110, +105, 86,101,108,122, 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, 80, + 97,116,104, 91, 49, 48, 50, 52, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116, +121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110, +105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, + 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109, +111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73, +110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, + 83,105,122,101, 0, 42,109,101,115,104, 86,101,108,111, 99,105,116,105,101,115, 0, 99,112,115, 84,105,109,101, 83,116, 97,114, +116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116,102, +111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, 0, +118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102,111, +114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0, 97,110,105,109, 82, 97,116,101, + 0,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110, +103, 0,122,101,110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103, +101, 0,108,105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, + 66,111,120, 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112, +104,121,115,105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101, +112, 0,112,104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115, +116,115,116, 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, + 0,115,116, 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115, +116, 0,115,116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100, +111,102,101,110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115, +116,102, 97, 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97, +109,112, 0, 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, + 0, 97,111, 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114, +114,111,114, 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105, +114,101, 99,116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, + 50, 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95, +115, 97,109,112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, + 97,112,112,114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101, +115, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109, +115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97, +110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0, +100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114, +108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, + 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, + 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, + 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,116,104, 0, 99,111,100, +101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105, 97,108, 81,117, 97,108, +105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121, 70,114, 97,109,101, 82, + 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101, 0, 97,117,100,105,111, + 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,117,100,105,111, 67,104, + 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,105,111, 66,105,116, 82, + 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101, 0, 97,117, +100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0, 97,117,100,105,111, 95, + 99,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 95,112, 97,100, 0, 97,117,100,105,111, 95,118,111,108,117,109,101, 0, +103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, + 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0, +109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0,115,112,101,101,100, 95,111,102, 95,115, +111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114, 0,100,105,115,116, 97,110, 99,101, 95,109,111,100, +101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,105,103,104,116, 95,111,118,101,114,114,105,100,101, + 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121, 95,101,120, 99,108,117,100,101, 0,108, 97,121,102,108, 97,103, 0,112, + 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0,115, 97,109,112,108,101,115, 0,105,109,116,121,112,101, 0, +112,108, 97,110,101,115, 0,113,117, 97,108,105,116,121, 0, 99,111,109,112,114,101,115,115, 0,101,120,114, 95, 99,111,100,101, + 99, 0, 99,105,110,101,111,110, 95,102,108, 97,103, 0, 99,105,110,101,111,110, 95,119,104,105,116,101, 0, 99,105,110,101,111, +110, 95, 98,108, 97, 99,107, 0, 99,105,110,101,111,110, 95,103, 97,109,109, 97, 0,106,112, 50, 95,102,108, 97,103, 0,105,109, + 95,102,111,114,109, 97,116, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116, 99,111,100,101, 99,100, 97, +116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,111,100,101, 99,100, 97,116, 97, 0,115, +117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97, +112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100,103, +101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, 0, +121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,102,114, 97,109,101, 95,115,116,101,112, + 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116, 0,109, 97,120, +105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,115, 0,121,112, 97,114,116,115, 0,115, +117, 98,105,109,116,121,112,101, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,115, 99,101,109,111,100,101, 0,114, 97,121, +116,114, 97, 99,101, 95,111,112,116,105,111,110,115, 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, + 0,111, 99,114,101,115, 0,112, 97,100, 52, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, + 99, 0,101,100,103,101,105,110,116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, + 0,108, 97,121,101,114,115, 0, 97, 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115, +112, 0,121, 97,115,112, 0,102,114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95, +109,103,116, 95,102,108, 97,103, 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, + 97,116, 0,100,105,116,104,101,114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107, +101, 95,102,105,108,116,101,114, 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107, +101, 95,110,111,114,109, 97,108, 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, + 97,107,101, 95,109, 97,120,100,105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, + 97,100, 0,112,105, 99, 91, 49, 48, 50, 52, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116, 95,105,100, + 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 55, 54, 56, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93, 0, 98,103, + 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,114,101,110,100, + 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,105,102,121, 95, +102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,121, 95,115, +104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, 0, +115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,110,101,111, +110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106,112, + 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,101, 0,100, +111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111, +109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,110, 97,109,101, 91, 51, 50, 93, 0,112, 97,114,116,105, + 99,108,101, 95,112,101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112, +108,101, 95,109, 97,120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114, +112,116,101,120,116, 0, 99,111,108, 91, 51, 93, 0, 99,101,108,108,115,105,122,101, 0, 99,101,108,108,104,101,105,103,104,116, + 0, 97,103,101,110,116,109, 97,120,115,108,111,112,101, 0, 97,103,101,110,116,109, 97,120, 99,108,105,109, 98, 0, 97,103,101, +110,116,104,101,105,103,104,116, 0, 97,103,101,110,116,114, 97,100,105,117,115, 0,101,100,103,101,109, 97,120,108,101,110, 0, +101,100,103,101,109, 97,120,101,114,114,111,114, 0,114,101,103,105,111,110,109,105,110,115,105,122,101, 0,114,101,103,105,111, +110,109,101,114,103,101,115,105,122,101, 0,118,101,114,116,115,112,101,114,112,111,108,121, 0,100,101,116, 97,105,108,115, 97, +109,112,108,101,100,105,115,116, 0,100,101,116, 97,105,108,115, 97,109,112,108,101,109, 97,120,101,114,114,111,114, 0,102,114, + 97,109,105,110,103, 0,112,108, 97,121,101,114,102,108, 97,103, 0,114,116, 49, 0,114,116, 50, 0, 97, 97,115, 97,109,112,108, +101,115, 0,112, 97,100, 52, 91, 51, 93, 0,100,111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101, +112, 97,114, 97,116,105,111,110, 0,114,101, 99, 97,115,116, 68, 97,116, 97, 0,109, 97,116,109,111,100,101, 0,101,120,105,116, +107,101,121, 0,111, 98,115,116, 97, 99,108,101, 83,105,109,117,108, 97,116,105,111,110, 0,108,101,118,101,108, 72,101,105,103, +104,116, 0, 42, 99, 97,109,101,114, 97, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95, 99, +117,114,115,111,114, 95, 99,111,108, 91, 52, 93, 0,110,117,109, 95,105,110,112,117,116, 95,115, 97,109,112,108,101,115, 0,112, + 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109, 97,108, 95, 97,110,103,108,101, 0,115, 99,114, +101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0, 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110, +118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112, +101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100, +101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, + 0,114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,108, 97, +115,116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,100, 95, +115,105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,111,114, +101,100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,117,114, +101, 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,105,111, +110, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0,109, 97,116, 91, + 51, 93, 91, 51, 93, 0,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115, 0, 42,118,112, 97,105,110,116, + 0, 42,119,112, 97,105,110,116, 0, 42,117,118,115, 99,117,108,112,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, + 0, 99,111,114,110,101,114,116,121,112,101, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,100,101,103,114, 0,116,117, +114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,114,109, 97,108,115,105,122, +101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,115, 0,118,101,114,116,105, + 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,117,115, 0,117,118, 99, 97, +108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110, 0,117,118, 99, 97,108, 99, + 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,118, 99, 97,108, 99, 95,102, +108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101, 0,117,118, 95,115,117, 98, +115,117,114,102, 95,108,101,118,101,108, 0,103,112,101,110, 99,105,108, 95,102,108, 97,103,115, 0, 97,117,116,111,105,107, 95, + 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111, +114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, + 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97, +103, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,112, 97,100, 50, 91, 53, 93, 0,115, +107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95, +105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97, +108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116, +104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, + 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, + 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103, +104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0, +115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115, +107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, + 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111, +110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116, +101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, + 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95, +110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107, +103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114, +105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95, +109,111,100,101, 0,101,100,103,101, 95,109,111,100,101, 95,108,105,118,101, 95,117,110,119,114, 97,112, 0,115,110, 97,112, 95, +109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,111, +114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,111, + 98,106,101, 99,116,115, 0,112, 97,100, 91, 53, 93, 0, 97,117,116,111, 95,110,111,114,109, 97,108,105,122,101, 0,109,117,108, +116,105,112, 97,105,110,116, 0,117,115,101, 95,117,118, 95,115, 99,117,108,112,116, 0,117,118, 95,115, 99,117,108,112,116, 95, +115,101,116,116,105,110,103,115, 0,117,118, 95,115, 99,117,108,112,116, 95,116,111,111,108, 0,117,118, 95,114,101,108, 97,120, + 95,109,101,116,104,111,100, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,115, 99, +117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,112, + 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115, 0, +115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95, 97,108,112,104, 97, 0,117,110,105,102,105, +101,100, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, + 0,116,111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97, +114,109, 97,116,117,114,101, 0,115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,121,115,116,101,109, 0,115,121,115,116, +101,109, 95,114,111,116, 97,116,105,111,110, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99, +104,101, 95,115,116,101,112, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, + 0, 42,111, 98,101,100,105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109, +105,110, 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0,108, 97,121, 95,117,112,100, 97,116,101, +100, 0, 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, + 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42, +115,111,117,110,100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,115,111,117,110,100, 95,115, 99,114,117, 98, 95, +104, 97,110,100,108,101, 0, 42,115,112,101, 97,107,101,114, 95,104, 97,110,100,108,101,115, 0, 42,102,112,115, 95,105,110,102, +111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,100, 97,103,102,108, 97,103,115, 0, 97, 99, +116,105,118,101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105, +116, 0,112,104,121,115,105, 99,115, 95,115,101,116,116,105,110,103,115, 0, 42, 99,108,105,112, 0, 99,117,115,116,111,109,100, + 97,116, 97, 95,109, 97,115,107, 95,109,111,100, 97,108, 0, 99,117,115,101,114, 0, 98,108,101,110,100, 0,118,105,101,119, 0, +119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105, +110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, + 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, + 93, 91, 52, 93, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112, 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, + 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101,110,100,101,114, 95,101,110, +103,105,110,101, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, 0, +116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109, +100,120, 0, 99, 97,109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,105,115, 95,112,101,114,115, +112, 0,112,101,114,115,112, 0,118,105,101,119,108,111, 99,107, 0,116,119,100,114, 97,119,102,108, 97,103, 0,114,102,108, 97, +103, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105,101,119, 0,103,114,105,100, +118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,114,111,116, 95, 97,110,103,108,101, 0,114,111,116, 95, 97,120, +105,115, 91, 51, 93, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107, +115, 99, 97,108,101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0, 98,117,110,100,108,101, 95,115,105,122, +101, 0, 98,117,110,100,108,101, 95,100,114, 97,119,116,121,112,101, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99, +101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101, + 95, 98,111,110,101, 91, 54, 52, 93, 0,100,114, 97,119,116,121,112,101, 0,111, 98, 95, 99,101,110,116,114,101, 95, 99,117,114, +115,111,114, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,103,114,105,100, 0,110,101, 97,114, 0,102, + 97,114, 0,109,111,100,101,115,101,108,101, 99,116, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,115,117, 98,100, +105,118, 0,103,114,105,100,102,108, 97,103, 0,116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, + 0,112, 97,100, 50, 91, 50, 93, 0, 97,102,116,101,114,100,114, 97,119, 95,116,114, 97,110,115,112, 0, 97,102,116,101,114,100, +114, 97,119, 95,120,114, 97,121, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97,121,116,114, 97,110,115,112, 0,122, 98, +117,102, 0,120,114, 97,121, 0,112, 97,100, 51, 91, 50, 93, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, + 97,103,101, 0,118,101,114,116, 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0, +109,105,110,122,111,111,109, 0,109, 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, + 0,107,101,101,112,116,111,116, 0,107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0, +119,105,110,120, 0,119,105,110,121, 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111, +102,102,115,101,116, 0,116, 97, 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0,114,112,116, 95,109, 97,115,107, 0,118, + 50,100, 0, 42, 97,100,115, 0,103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114, +115,111,114, 86, 97,108, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, + 95, 97,108,105,103,110, 0,112,114,101,118,105,101,119, 0,116,101,120,116,117,114,101, 95, 99,111,110,116,101,120,116, 0,112, + 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0, 42,116,101,120,117,115,101,114, + 0,114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111, +109, 0,116,105,116,108,101, 91, 51, 50, 93, 0,100,105,114, 91, 49, 48, 53, 54, 93, 0,102,105,108,101, 91, 50, 53, 54, 93, 0, +114,101,110, 97,109,101,102,105,108,101, 91, 50, 53, 54, 93, 0,114,101,110, 97,109,101,101,100,105,116, 91, 50, 53, 54, 93, 0, +102,105,108,116,101,114, 95,103,108,111, 98, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108, 95, +102,105,114,115,116, 0,115,101,108, 95,108, 97,115,116, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0,102, 95,102,112, + 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,115, + 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110, +101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,121, +111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,114, + 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51, + 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,108, + 97,103, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0, 42, 99,117,109, 97,112, 0,115, 99,111,112,101,115, 0,115, 97, +109,112,108,101, 95,108,105,110,101, 95,104,105,115,116, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 99,101,110,116,120, 0, 99, +101,110,116,121, 0, 99,117,114,116,105,108,101, 0,108,111, 99,107, 0,112,105,110, 0,100,116, 95,117,118, 0,115,116,105, 99, +107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101,119,108,105, +110,101,115, 0,109,101,110,117,110,114, 0,108,104,101,105,103,104,116, 0, 99,119,105,100,116,104, 0,108,105,110,101,110,114, +115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115, 0,116, 97, 98,110,117,109, 98,101,114, + 0,115,104,111,119,115,121,110,116, 97,120, 0,108,105,110,101, 95,104,108,105,103,104,116, 0,111,118,101,114,119,114,105,116, +101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,110,101, 0,116,120,116,115, 99,114,111, +108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,108,117,103,105,110,115, 0,102,105,110, +100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50, 53, 54, 93, 0,109, 97,114,103,105,110, + 95, 99,111,108,117,109,110, 0, 42,100,114, 97,119, 99, 97, 99,104,101, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95, +101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, + 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99, +114,105,112,116,110, 97,109,101, 91, 49, 48, 50, 52, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, + 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,104,101,115, 0, 99, 97, + 99,104,101, 95,100,105,115,112,108, 97,121, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0,112, 97,100,102, 0,109,120, 0,109, +121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,115,104, 97, +100,101,114,102,114,111,109, 0,108,105,110,107,100,114, 97,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111, +114, 0,115, 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, + 0,108, 97,110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,101,108, 95,101,110,100, 0, +102,105,108,116,101,114, 91, 54, 52, 93, 0,120,108,111, 99,107,111,102, 0,121,108,111, 99,107,111,102, 0,117,115,101,114, 0, +112, 97,116,104, 95,108,101,110,103,116,104, 0,108,111, 99, 91, 50, 93, 0,115,116, 97, 98,109, 97,116, 91, 52, 93, 91, 52, 93, + 0,117,110,105,115,116, 97, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,116,112,114,111, 99, 95,102,108, 97,103, 0, + 42,100,114, 97,119, 95, 99,111,110,116,101,120,116, 0,100,111,112,101, 95,115,111,114,116, 0,100,111,112,101, 95,102,108, 97, +103, 0,102,105,108,101,110, 97,109,101, 91, 49, 48, 50, 52, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116, 95,105, +100, 0,114, 95,116,111, 95,108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99, 0, 98, +111,108,100, 0,115,104, 97,100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,108,112, +104, 97, 0,115,104, 97,100,111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,112,108, + 97, 98,101,108, 0,119,105,100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,111,111, +109, 0,109,105,110,108, 97, 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115, 0, 99, +111,108,117,109,110,115,112, 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112, 97, 99, +101, 0, 98,117,116,116,111,110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,110,101, +108,115,112, 97, 99,101, 0,112, 97,110,101,108,111,117,116,101,114, 0,111,117,116,108,105,110,101, 91, 52, 93, 0,105,110,110, +101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109, 91, 52, 93, 0,116,101,120,116, 91, + 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,104, 97,100,101,116,111,112, 0,115, +104, 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,110,101,114, 95, 97,110,105,109, 91, + 52, 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 91, 52, + 93, 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 91, + 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, + 0,115,104,111,119, 95,104,101, 97,100,101,114, 0,119, 99,111,108, 95,114,101,103,117,108, 97,114, 0,119, 99,111,108, 95,116, +111,111,108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100,105,111, 0,119, 99,111,108, 95,111,112, +116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,117,109, 0,119, 99,111,108, 95,110, +117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108, 95,112,117,108,108,100,111,119,110, + 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,110,117, 95,105,116,101,109, 0,119, + 99,111,108, 95,116,111,111,108,116,105,112, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, + 0,119, 99,111,108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,116,101,109, 0,119, 99, +111,108, 95,115,116, 97,116,101, 0,112, 97,110,101,108, 0,105, 99,111,110,102,105,108,101, 91, 50, 53, 54, 93, 0,105, 99,111, +110, 95, 97,108,112,104, 97, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, + 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, + 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98, +117,116,116,111,110, 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117, +116,116,111,110, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116, +108,101, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, + 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, + 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, + 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0, +119,105,114,101, 91, 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0,115,112,101, 97,107,101, +114, 91, 52, 93, 0,101,109,112,116,121, 91, 52, 93, 0, 99, 97,109,101,114, 97, 91, 52, 93, 0,112, 97,100, 91, 56, 93, 0, 97, + 99,116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, + 93, 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95, +115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, + 0,101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, + 95,102, 97, 99,101,115,101,108, 91, 52, 93, 0,101,100,103,101, 95, 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, + 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,101,120, +116,114, 97, 95,101,100,103,101, 95,108,101,110, 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,110,103,108,101, + 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,114,101, 97, 91, 52, 93, 0,112, 97,100, 51, 91, 52, 93, 0,110, +111,114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115, +111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116, +114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105, +110,101, 91, 52, 93, 0,110,117,114, 98, 95,118,108,105,110,101, 91, 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, + 93, 0,110,117,114, 98, 95,115,101,108, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105, +110,101, 91, 52, 93, 0,108, 97,115,116,115,101,108, 95,112,111,105,110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114, +101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, + 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,108,105,103,110, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111, 95, + 99,108, 97,109,112,101,100, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104, 97, +110,100,108,101, 95,115,101,108, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,116, + 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115, +101,108, 95, 97,117,116,111, 95, 99,108, 97,109,112,101,100, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, 91, 52, 93, + 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,111,117,116,112,117,116, + 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,102, +111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95, 99,117, +114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,111,117,116,108,105,110,101, 95,119,105,100,116, +104, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0,110,111,111,100,108,101, 95, 99,117,114,118,105,110,103, 0,115,121, +110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116, 97,120, 98, 91, 52, 93, 0,115, +121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,105,101, 91, 52, 93, 0,109,111, +118,105,101, 99,108,105,112, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117,100, +105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115,105, +116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, 91, + 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101, +120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0,109, + 97,114,107,101,114, 95,111,117,116,108,105,110,101, 91, 52, 93, 0,109, 97,114,107,101,114, 91, 52, 93, 0, 97, 99,116, 95,109, + 97,114,107,101,114, 91, 52, 93, 0,115,101,108, 95,109, 97,114,107,101,114, 91, 52, 93, 0,100,105,115, 95,109, 97,114,107,101, +114, 91, 52, 93, 0,108,111, 99,107, 95,109, 97,114,107,101,114, 91, 52, 93, 0, 98,117,110,100,108,101, 95,115,111,108,105,100, + 91, 52, 93, 0,112, 97,116,104, 95, 98,101,102,111,114,101, 91, 52, 93, 0,112, 97,116,104, 95, 97,102,116,101,114, 91, 52, 93, + 0, 99, 97,109,101,114, 97, 95,112, 97,116,104, 91, 52, 93, 0,104,112, 97,100, 91, 55, 93, 0,112,114,101,118,105,101,119, 95, + 98, 97, 99,107, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95,102, 97, 99,101, 91, 52, 93, 0,112, +114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95,101,100,103,101, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116, +105,116, 99,104, 95,118,101,114,116, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95,115,116,105,116, + 99,104, 97, 98,108,101, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95,117,110,115,116,105,116, 99, +104, 97, 98,108,101, 91, 52, 93, 0,112,114,101,118,105,101,119, 95,115,116,105,116, 99,104, 95, 97, 99,116,105,118,101, 91, 52, + 93, 0,109, 97,116, 99,104, 91, 52, 93, 0,115,101,108,101, 99,116,101,100, 95,104,105,103,104,108,105,103,104,116, 91, 52, 93, + 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116, +105,112,111, 0,116,105,110,102,111, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,101, +120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0,116,117,115,101, +114,112,114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 99,108,105,112, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97, 99, +116,105,118,101, 95,116,104,101,109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99, 91, + 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 55, 54, 56, 93, + 0,102,111,110,116,100,105,114, 91, 55, 54, 56, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 48, 50, 52, 93, 0,116,101, +120,116,117,100,105,114, 91, 55, 54, 56, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 55, 54, 56, 93, 0,112,108,117,103, +115,101,113,100,105,114, 91, 55, 54, 56, 93, 0,112,121,116,104,111,110,100,105,114, 91, 55, 54, 56, 93, 0,115,111,117,110,100, +100,105,114, 91, 55, 54, 56, 93, 0,105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 49, 48, 50, 52, 93, 0, 97,110,105,109, + 95,112,108, 97,121,101,114, 91, 49, 48, 50, 52, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, + 0,118, 50,100, 95,109,105,110, 95,103,114,105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, + 0,118,101,114,115,105,111,110,115, 0,100, 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97, +103,115, 0,119,104,101,101,108,108,105,110,101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97, +103,101, 0,117,115,101,114,112,114,101,102, 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, + 97,117,100,105,111,100,101,118,105, 99,101, 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97, +116, 0, 97,117,100,105,111, 99,104, 97,110,110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97, +110,115,111,112,116,115, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104, +111,108,100, 50, 0,116,104,101,109,101,115, 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121, +109, 97,112,115, 0,117,115,101,114, 95,107,101,121,109, 97,112,115, 0, 97,100,100,111,110,115, 0,107,101,121, 99,111,110,102, +105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,109,101,109,111,114,121, 0,103, +112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,100,101, 97,110,100,105,115,116, + 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116, 98, 95,108,101,102,116,109,111, +117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116,119, 95,104,111, +116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,105,122,101, 0,116,119, 95,115, +105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,116,114, 97,116,101, 0,119,109, +100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,103,116,104,114,101,115,104,111,108,100, 0,109,101,109, 99, 97, 99,104, +101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109,101,115,101,114,118,101, +114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116,101,114, 95,100,105, 97, + 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95,102,105,108,101,115, 0, +115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0, 99,117,114,115,115,105,122, +101, 0, 99,111,108,111,114, 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, + 97,110,100,108,101,115, 95,110,101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105, +116, 0,119,105,100,103,101,116, 95,117,110,105,116, 0, 97,110,105,115,111,116,114,111,112,105, 99, 95,102,105,108,116,101,114, + 0,117,115,101, 95, 49, 54, 98,105,116, 95,116,101,120,116,117,114,101,115, 0,112, 97,100, 56, 0,110,100,111,102, 95,115,101, +110,115,105,116,105,118,105,116,121, 0,110,100,111,102, 95,102,108, 97,103, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0, +116,101,120,116, 95,114,101,110,100,101,114, 0,112, 97,100, 57, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117, +108,112,116, 95,112, 97,105,110,116, 95,111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 0,116,119,101, 97,107, 95,116, +104,114,101,115,104,111,108,100, 0, 97,117,116,104,111,114, 91, 56, 48, 93, 0, 99,111,109,112,117,116,101, 95,100,101,118,105, + 99,101, 95,116,121,112,101, 0, 99,111,109,112,117,116,101, 95,100,101,118,105, 99,101, 95,105,100, 0,102, 99,117, 95,105,110, + 97, 99,116,105,118,101, 95, 97,108,112,104, 97, 0,118,101,114,116, 98, 97,115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97, +114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,114,101,100,114, 97,119,115, 95,102,108, 97,103, 0,102, +117,108,108, 0,116,101,109,112, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115, +104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99, +117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0, +115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116, + 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116, +121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114, + 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121, + 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115, +110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100, + 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108, + 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114, + 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112, +101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0, + 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105, +100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111, +118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116, +114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115, +105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111, +110, 0,119,105,110,112,111,115, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105, +108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,102, 0,114,101,118,105,115,105,111,110, 0,110, 97,109,101, 91, 50, 53, + 54, 93, 0,111,114,105,103, 95,119,105,100,116,104, 0,111,114,105,103, 95,104,101,105,103,104,116, 0, 98,111,116,116,111,109, + 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103, 97,109,109, 97, 91, 51, + 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 55, 54, 56, 93, 0,116, 99, 0, 98,117,105,108,100, 95,115,105,122,101, + 95,102,108, 97,103,115, 0, 98,117,105,108,100, 95,116, 99, 95,102,108, 97,103,115, 0,100,111,110,101, 0,115,116, 97,114,116, +115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0, 42, 99,114,111,112, 0, + 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,105,110,115,116, 97, +110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,105,118, 97, +116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,109, 97, 99, +104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,115, 97,116, 0,109,117,108, 0,104, + 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0,115,116,114,101, 97,109,105,110,100,101,120, + 0,109,117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0, 99,108,105,112, 95,102,108, 97,103, 0, 42,115,116,114,105, +112, 0, 42,115, 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101, +101,100, 95,102, 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97, +115,101, 0, 42,115,111,117,110,100, 0, 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,112,105,116, 99,104, 0,112, 97,110, + 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116, 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102, +115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111, +112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115, +101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100, +105,114, 91, 49, 48, 50, 52, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,105,114, 91, 49, 48, 50, 52, 93, 0,111,118,101,114, + 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,102,108, 97,103, 0,111,118,101,114, 95, 98,111, +114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,114,100, 0,119,105,112,101,116,121,112,101, 0, +102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,100, 68,105,115,116, 0,100, 81,117, 97,108,105, +116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105, 0, 83, 99, 97,108,101,121, 73,110,105, 0,120, + 73,110,105, 0,121, 73,110,105, 0,114,111,116, 73,110,105, 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110, +105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114, 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101, +100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, + 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, + 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116, +115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105, +102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114, +109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112, 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101, +101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117, +112,110, 97,109,101, 91, 54, 52, 93, 0,118,103,114,111,117,112,110, 97,109,101, 95,118, 91, 54, 52, 93, 0, 42,107,101,121,115, + 0,109,105,110,102, 97, 99, 0,110,114, 0,117,115,101,100, 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114, +101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, + 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91, 54, 52, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 54, 52, + 93, 0,118, 97,108,117,101, 91, 54, 52, 93, 0,109, 97,120,118, 97,108,117,101, 91, 54, 52, 93, 0,100,101,108, 97,121, 0,100, +117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 54, 52, 93, 0,100, 97,109,112,116,105,109, +101,114, 0,112,114,111,112,110, 97,109,101, 91, 54, 52, 93, 0,109, 97,116,110, 97,109,101, 91, 54, 52, 93, 0, 97,120,105,115, +102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,108, 91, 54, 52, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, + 54, 52, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,116, 91, 54, 52, 93, 0, 98,111,100,121, + 91, 54, 52, 93, 0,111,116,121,112,101, 0,112,117,108,115,101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, + 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, + 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0, +115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, + 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102, +114, 97,109,101, 80,114,111,112, 91, 54, 52, 93, 0, 98,108,101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110, +100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0, +108, 97,121,101,114, 95,119,101,105,103,104,116, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,114, +101,102,101,114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110, 99,101, 0,114, +111,108,108,111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,108,101, 0, 99, +111,110,101, 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103, 97,105,110, 0, +115,110,100,110,114, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49, 93, 0, 42,109,101, 0,108,105,110, 86,101,108, +111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97, +103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93, 0,102,111,114, 99, +101,114,111,116, 91, 51, 93, 0,112, 97,100, 49, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, + 93, 0, 97,110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0, +109,105,110, 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, + 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, + 54, 52, 93, 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0,105, +110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0,102, +108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 54, 52, 93, 0, 42,116,111, 79, 98,106, +101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110, +105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0,105,110,102,108, +117,101,110, 99,101, 0, 42,115,117, 98,116, 97,114,103,101,116, 0,102, 97, 99,105,110,103, 97,120,105,115, 0,118,101,108,111, + 99,105,116,121, 0, 97, 99, 99,101,108,101,114, 97,116,105,111,110, 0,116,117,114,110,115,112,101,101,100, 0,117,112,100, 97, +116,101, 84,105,109,101, 0, 42,110, 97,118,109,101,115,104, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108, +101, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101, 0, 42,119, + 97,118,101,102,111,114,109, 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100,108,101, 0, 42,108, 97,109,112,114,101, +110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, 0, 42,112,114,111,112, 0, 99,104,105, +108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, + 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, + 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 97,114,109, 95,114,111,108,108, 0,120,119,105,100,116,104, + 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,104,101, 97,100, 0,114, 97,100, + 95,116, 97,105,108, 0,112, 97,100, 91, 49, 93, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0, + 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,101, +116, 99,104, 0,103,101,118,101,114,116,100,101,102,111,114,109,101,114, 0,108, 97,121,101,114, 95,117,115,101,100, 0,108, 97, +121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0, +103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116, +101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42, +112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111, +115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99, + 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97, +103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102, +108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101, +102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104, 95, 97, 99, 0,105,107,102,108, 97,103, 0, 97,103,114,112, 95,105,110, +100,101,120, 0, 99,111,110,115,116,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0,112, 97,100, 48, 91, 54, 93, + 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0,115,105,107,116,114,101,101, 0, 42, 99,117, +115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95,109, 97,116, 91, + 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100, 91, 51, + 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,105,116, +109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0,105,107, +114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 42,116,101,109,112, 0, 99,104, 97,110, + 98, 97,115,101, 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100, +101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114, +111,117,112,115, 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97, +116, 97, 0, 42,105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, 97, 99,116, 95, 98,111,110,101, 91, 54, 52, 93, 0,110, +117,109,105,116,101,114, 0,110,117,109,115,116,101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115, +111,108,118,101,114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97, +109,112,101,112,115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118, +101,115, 0,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,114,107,101,114, 0,105,100,114,111,111,116, 0, 42, +115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112, 0,115,101, 97,114, 99,104,115,116,114, 91, 54, 52, 93, + 0,102,105,108,116,101,114,102,108, 97,103, 0,114,101,110, 97,109,101, 73,110,100,101,120, 0, 97,100,115, 0,116,105,109,101, +115,108,105,100,101, 0, 42,103,114,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114, +115,112, 97, 99,101, 0,101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, + 0,114,111,116, 95,101,114,114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, + 99,101, 0,114,111,116, 79,114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97, +116,105,111,110,115, 0,114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108, +101,116, 97,114, 0,112,111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 54, 52, 93, 0,112,111,108,101, 97,110,103,108,101, + 0,111,114,105,101,110,116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112, +111,105,110,116,115, 0, 99,104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114, +118,101,100, 49, 0,114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, + 99, 97, 99,104,101, 91, 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108, +109,111,100,101, 0,112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0, +112,105,118, 89, 0,112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, + 93, 0,109, 97,120, 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, + 52, 93, 0,102,114,111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, + 51, 93, 0,102,114,111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, + 51, 93, 0,114,111,116, 65,120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0,116,114, 97, 99, +107, 91, 54, 52, 93, 0,111, 98,106,101, 99,116, 91, 54, 52, 93, 0, 42,100,101,112,116,104, 95,111, 98, 0, 99,104, 97,110,110, +101,108, 91, 51, 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99, +117,114,109,111,100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116, +114,105,100,101,108,101,110, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, 91, 51, + 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,117,116, +112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0,105,115, 95, 99,111,112,121, 0, +101,120,116,101,114,110, 97,108, 0, 42,110,101,119, 95,115,111, 99,107, 0, 42,115,116,111,114, 97,103,101, 0,108,105,109,105, +116, 0,108,111, 99,120, 0,108,111, 99,121, 0, 42,100,101,102, 97,117,108,116, 95,118, 97,108,117,101, 0,115,116, 97, 99,107, + 95,105,110,100,101,120, 0,115,116, 97, 99,107, 95,116,121,112,101, 0,114,101,115,105,122,101,109,111,100,101, 0,111,119,110, + 95,105,110,100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,103,114,111,117,112,115,111, 99,107, 0, 42,108,105,110,107, + 0,110,115, 0, 42,114,101, 99,116, 0,120,115,105,122,101, 0,121,115,105,122,101, 0, 42,110,101,119, 95,110,111,100,101, 0, +108, 97,115,116,121, 0, 99,111,108,111,114, 91, 51, 93, 0,111,117,116,112,117,116,115, 0,109,105,110,105,119,105,100,116,104, + 0,111,102,102,115,101,116,120, 0,111,102,102,115,101,116,121, 0,117,112,100, 97,116,101, 0,108, 97, 98,101,108, 91, 54, 52, + 93, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116,111,109, + 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116,111,116, +114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111, 0, 42,102,114, +111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0, 42,116,111,115,111, 99,107, + 0,110,111,100,101,115, 0,108,105,110,107,115, 0,105,110,105,116, 0, 99,117,114, 95,105,110,100,101,120, 0,110,111,100,101, +116,121,112,101, 0,101,100,105,116, 95,113,117, 97,108,105,116,121, 0,114,101,110,100,101,114, 95,113,117, 97,108,105,116,121, + 0, 99,104,117,110,107,115,105,122,101, 0, 42,101,120,101, 99,100, 97,116, 97, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,115,116, 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, 98,104, 0, 42,112,114,104, 0, 42,115,100,104, 0,118, 97,108,117,101, 91, 51, 93, 0,118, 97,108,117,101, - 91, 52, 93, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,108, 97,121,101,114, 95,105,110,100,101,120, 0,112, 97,115, -115, 95,105,110,100,101,120, 0,112, 97,115,115, 95,102,108, 97,103, 0,109, 97,120,115,112,101,101,100, 0,109,105,110,115,112, -101,101,100, 0, 99,117,114,118,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,110,116,121, 0, 98,111,107, -101,104, 0,103, 97,109,109, 97, 0,105,109, 97,103,101, 95,105,110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, - 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119, -114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0, - 98, 97,115,101, 95,112, 97,116,104, 91, 49, 48, 50, 52, 93, 0,102,111,114,109, 97,116, 0, 97, 99,116,105,118,101, 95,105,110, -112,117,116, 0,117,115,101, 95,114,101,110,100,101,114, 95,102,111,114,109, 97,116, 0,117,115,101, 95,110,111,100,101, 95,102, -111,114,109, 97,116, 0,108, 97,121,101,114, 91, 51, 48, 93, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103, -116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110, -101,108, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0,102, 97, 99, 95,120, 49, 0,102, 97, 99, 95,120, 50, 0,102, 97, 99, - 95,121, 49, 0,102, 97, 99, 95,121, 50, 0, 99,111,108,110, 97,109,101, 91, 54, 52, 93, 0, 98,107,116,121,112,101, 0,112, 97, -100, 95, 99, 49, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,117,114, - 0, 98,116,104,114,101,115,104, 0,114,111,116, 97,116,105,111,110, 0,112, 97,100, 95,102, 49, 0, 42,100,105, 99,116, 0, 42, -110,111,100,101, 0, 99,111,108,109,111,100, 0,109,105,120, 0,102, 97,100,101, 0, 97,110,103,108,101, 95,111,102,115, 0,109, - 0, 99, 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, - 93, 0,108,105,102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, - 97,110, 0,117,110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105, -108,108,103, 0,117,115,112,105,108,108, 98, 0,116,101,120, 95,109, 97,112,112,105,110,103, 0, 99,111,108,111,114, 95,109, 97, -112,112,105,110,103, 0,115,117,110, 95,100,105,114,101, 99,116,105,111,110, 91, 51, 93, 0,116,117,114, 98,105,100,105,116,121, - 0, 99,111,108,111,114, 95,115,112, 97, 99,101, 0,112,114,111,106,101, 99,116,105,111,110, 0,103,114, 97,100,105,101,110,116, - 95,116,121,112,101, 0, 99,111,108,111,114,105,110,103, 0,109,117,115,103,114, 97,118,101, 95,116,121,112,101, 0,119, 97,118, -101, 95,116,121,112,101, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,108,101, 0, -101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,116, 97, 98, -108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,100, 95,116, -105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, - 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,120, - 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91, 50, - 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,115, - 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114, 97, 99,121, - 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119, 97,118,101, -102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,111,112,101, - 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120, 91, 51, 93, - 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,109, 95, 50, - 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,114,109, 95, -116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,116,111,103,103,108,101, - 95, 98,114,117,115,104, 0, 42,105, 99,111,110, 95,105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, - 91, 49, 48, 50, 52, 93, 0,110,111,114,109, 97,108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116, -116,101,114, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95, -115,116,114,111,107,101, 95,102, 97, 99,116,111,114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, - 95,112,108, 97,110,101, 0,112,108, 97,110,101, 95,111,102,102,115,101,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0, -118,101,114,116,101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, - 0,109, 97,115,107, 95,116,111,111,108, 0, 97,117,116,111,115,109,111,111,116,104, 95,102, 97, 99,116,111,114, 0, 99,114,101, - 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,111,114, 0,112,108, 97,110,101, 95,116,114,105,109, 0,116,101,120,116, -117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,115, 0,116,101,120,116,117,114,101, 95,111,118,101,114,108, 97,121, 95, - 97,108,112,104, 97, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93, 0, 97, 99,116,105, -118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,109, 97,115,107, 0, - 42,108, 97,121,101,114,115, 0,116,121,112,101,109, 97,112, 91, 51, 54, 93, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120, -108, 97,121,101,114, 0,116,111,116,115,105,122,101, 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,114,111, -116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,114,101, -115,116, 95,108,101,110,103,116,104, 0,112, 97,114,116,105, 99,108,101, 95,105,110,100,101,120, 91, 50, 93, 0,100,101,108,101, -116,101, 95,102,108, 97,103, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117, -118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98, -111,105,100, 0,100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,105,114, 95,105,110,100, -101,120, 0, 97,108,105,118,101, 0,115,112,114,105,110,103, 95,107, 0,112,108, 97,115,116,105, 99,105,116,121, 95, 99,111,110, -115,116, 97,110,116, 0,121,105,101,108,100, 95,114, 97,116,105,111, 0,112,108, 97,115,116,105, 99,105,116,121, 95, 98, 97,108, - 97,110, 99,101, 0,121,105,101,108,100, 95, 98, 97,108, 97,110, 99,101, 0,118,105,115, 99,111,115,105,116,121, 95,111,109,101, -103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115, 95,107, 0,115,116, -105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0, 98,117,111,121, 97, -110, 99,121, 0,115,112,114,105,110,103, 95,102,114, 97,109,101,115, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0, -100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110, -116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121, -112,101, 0,114,101,110, 95, 97,115, 0,115,117, 98,102,114, 97,109,101,115, 0,100,114, 97,119, 95, 99,111,108, 0,114,101,110, - 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115,116,101,112, 0, 97,100, 97,112,116, 95, - 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111,109, 0,105,110,116,101,103,114, 97,116, -111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, - 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95, -116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0, 98, 98, 95,115,105,122,101, 91, 50, 93, 0, 98, 98, 95, -118,101,108, 95,104,101, 97,100, 0, 98, 98, 95,118,101,108, 95,116, 97,105,108, 0, 99,111,108,111,114, 95,118,101, 99, 95,109, - 97,120, 0,115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116, -101, 0,115,105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118, -105,101,119,112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0, 99,111,117,114, 97,110,116, 95,116, 97,114,103,101,116, - 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,114,105,100, 95,114, 97,110,100, 0,112,115, 95,111,102, -102,115,101,116, 91, 49, 93, 0,103,114,105,100, 95,114,101,115, 0,101,102,102,101, 99,116,111,114, 95, 97,109,111,117,110,116, - 0,116,105,109,101, 95,102,108, 97,103, 0,116,105,109,101, 95,112, 97,100, 91, 51, 93, 0,112, 97,114,116,102, 97, 99, 0,116, - 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116,102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, - 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110, -100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, - 99, 0, 98,114,111,119,110,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,110, 98,114, 0, -114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,105,122,101, 0, - 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,102,108, 97,116, - 0, 99,108,117,109,112,112,111,119, 0,107,105,110,107, 95,102,108, 97,116, 0,107,105,110,107, 95, 97,109,112, 95, 99,108,117, -109,112, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104, 50, 0,114,111,117, -103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104, 95,101,110,100, 0, -114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,110,103,116,104, 95, -116,104,114,101,115, 0,112, 97,114,116,105,110,103, 95,102, 97, 99, 0,112, 97,114,116,105,110,103, 95,109,105,110, 0,112, 97, -114,116,105,110,103, 95,109, 97,120, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,108,105,110,101, - 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,108, 95, 99,111, -117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115, 0, 42,101,102, -102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0, 42,112, 97,114, -116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104,105,108,100, - 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104,101, 98,117, -102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,117,116, 95,100, -109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,114, 97,109,101, - 0, 98,118,104,116,114,101,101, 95,102,114, 97,109,101, 0, 99,104,105,108,100, 95,115,101,101,100, 0,116,111,116,117,110,101, -120,105,115,116, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,101,100, 0,116,111,116, 99,104,105,108,100, - 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,107,101,121,101,100, 0, 98, 97,107,101,115, -112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 54, 52, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, - 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,116, 97, 0, 42,101,102,102,101, 99,116,111, -114,115, 0, 42,102,108,117,105,100, 95,115,112,114,105,110,103,115, 0,116,111,116, 95,102,108,117,105,100,115,112,114,105,110, -103,115, 0, 97,108,108,111, 99, 95,102,108,117,105,100,115,112,114,105,110,103,115, 0, 42,116,114,101,101, 0, 42,112,100,100, - 0, 42,102,114, 97,110,100, 0,100,116, 95,102,114, 97, 99, 0, 95,112, 97,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116, -114,117, 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116, -114,117, 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105, -109,101,115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, - 95,115, 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111, -111,116,104, 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111,110, 0,118,101,108, 95,100, 97,109,112,105,110, -103, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,101, 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110, -103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,112,101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114, -111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,112, 95,115,116,114,117, 99,116, 0,115,104, 97,112,101,107,101,121, 95, -114,101,115,116, 0,112,114,101,115,101,116,115, 0,114,101,115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105, -115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,102, 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115, -105,108,111,110, 0,114,101,112,101,108, 95,102,111,114, 99,101, 0,100,105,115,116, 97,110, 99,101, 95,114,101,112,101,108, 0, -115,101,108,102, 95,108,111,111,112, 95, 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115, -117,114,101, 0,116,104,105, 99,107,110,101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, - 97, 99,116,102,114, 97,109,101, 0,103,115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, - 95,115,105,122,101, 0,115, 98,117,102,102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0,108,105,115, -116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101,118,101,108, 0, 42,114,101,112,111,114,116,116, -105,109,101,114, 0, 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110, -100,111,119,115, 0,105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117, -110,100,111, 95,100,101,112,116,104, 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116, -115, 0,106,111, 98,115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110, -102,105,103,115, 0, 42,100,101,102, 97,117,108,116, 99,111,110,102, 0, 42, 97,100,100,111,110, 99,111,110,102, 0, 42,117,115, -101,114, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116,105,109,101,114, 0, 42,103,104, -111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,115, 99,114,101,101,110, 0, 42,110,101,119,115, 99, -114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 54, 52, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119,105, -110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0,109,111,100, - 97,108, 99,117,114,115,111,114, 0, 97,100,100,109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116, -101, 0, 42, 99,117,114,115,119,105,110, 0, 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97, -119,102, 97,105,108, 0, 42,100,114, 97,119,100, 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, - 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112, -118, 97,108,117,101, 95,115,116,114, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,116, 0, 99,116, -114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,116,121,112,101, - 0, 42,112,116,114, 0, 42,114,101,109,111,118,101, 95,105,116,101,109, 0, 42, 97,100,100, 95,105,116,101,109, 0,105,116,101, -109,115, 0,100,105,102,102, 95,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100, 0,107, -109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98, 97,115, -101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, - 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, - 0, 42,101,100, 97,116, 97, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,115, 0, 97,114,114, 97,121,115,105,122,101, 0, -112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101, 0,112,104, 97,115,101, 95,109,117,108,116,105, -112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118, 97,108,117,101, 95,111,102,102,115,101,116, 0, -109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,102,116,101,114, 95,109,111,100,101, 0, 98,101, -102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121, 99,108,101,115, 0,114,101, 99,116, 0,112,104, - 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,112, 95,115,105,122,101, 0, 42,114,110, 97, 95, -112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,116,114, 97,110,115, 67,104, 97,110, 0,105,100, -116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,116, 97,114,103,101,116,115, 0,118, 97,114,105, - 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 0, 42,101,120,112,114, 95, 99,111,109,112, - 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0, 99,111,108,111,114, 95,109, -111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, - 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,112, 0,102, 99,117,114,118,101,115, 0,115,116, -114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,120,116,101,110,100,109,111,100,101, 0, 42,115, -112,101, 97,107,101,114, 95,104, 97,110,100,108,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100, -101, 0,107,101,121,105,110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,100,101,115, 99,114,105,112,116,105,111,110, 91, 50, - 52, 48, 93, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,112, 97,116,104, 0, 42,116,109, -112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114,105,112, 0,100,114,105,118,101,114, -115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111,100,101, 0, 97, 99,116, 95,101,120, -116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0,114,117,108,101, 0,111,112,116,105, -111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105,100, 0,108,111,111,107, 95, 97, -104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0,119, 97,110,100,101,114, 0,102, -108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116,101, 95,105,100, 0,114,117,108, -101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117,108,101,115,101,116, 95,116,121, -112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115,116, 97,116,101, 95,105,100, 0, -108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105,110,103, 0, 97,103,103,114,101, -115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95,115,112,101,101, -100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120, 95, 97,118,101, 0, 97,105,114, 95,112,101, -114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,112, 95,115,112,101,101,100, 0,108, 97,110, -100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95, 97, 99, 99, 0,108, 97,110,100, 95,109, 97, -120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,115, -116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,100, 0, 42,102,108,117,105,100, 95,103,114, -111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101,120, 95,119,116, 0, 42,116,101,120, - 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, 49, 91, 51, 93, 0,100,120, 0,111, -109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, 93, 0, 97,109,112,108,105,102,121, - 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,110,111,105,115,101, 0,100,105,115,115, 95, -112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95,119,116, 91, 51, 93, 0,100,120, 95, -119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, 99,104,101, 95,104,105,103,104, 95, - 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, 99, 97, 99,104,101,115, 91, 50, 93, - 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,109,101, 95,115, 99, 97,108,101, 0,118,111, -114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,101,108, 95,109,117,108,116,105, 0,118,103, -114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102,108,111,119, 0,118,103,114, -111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42,112,111,105,110,116,115, 95, -111,108,100, 0, 42,118,101,108, 0, 42,116,114,105,100,105,118,115, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52, 93, 0, -110,117,109,116,114,105,115, 0,118,111,108,117,109,101, 95,109, 97,120, 0,118,111,108,117,109,101, 95,109,105,110, 0,100,105, -115,116, 97,110, 99,101, 95,109, 97,120, 0,100,105,115,116, 97,110, 99,101, 95,114,101,102,101,114,101,110, 99,101, 0, 99,111, -110,101, 95, 97,110,103,108,101, 95,111,117,116,101,114, 0, 99,111,110,101, 95, 97,110,103,108,101, 95,105,110,110,101,114, 0, - 99,111,110,101, 95,118,111,108,117,109,101, 95,111,117,116,101,114, 0,114,101,110,100,101,114, 95,102,108, 97,103, 0, 98,117, -105,108,100, 95,115,105,122,101, 95,102,108, 97,103, 0, 98,117,105,108,100, 95,116, 99, 95,102,108, 97,103, 0,108, 97,115,116, -115,105,122,101, 91, 50, 93, 0,116,114, 97, 99,107,105,110,103, 0, 42,116,114, 97, 99,107,105,110,103, 95, 99,111,110,116,101, -120,116, 0,112,114,111,120,121, 0,116,114, 97, 99,107, 95,112,114,101,118,105,101,119, 95,104,101,105,103,104,116, 0, 42,116, -114, 97, 99,107, 95,112,114,101,118,105,101,119, 0,116,114, 97, 99,107, 95,112,111,115, 91, 50, 93, 0,116,114, 97, 99,107, 95, -100,105,115, 97, 98,108,101,100, 0, 42,109, 97,114,107,101,114, 0,115,108,105,100,101, 95,115, 99, 97,108,101, 91, 50, 93, 0, -101,114,114,111,114, 0, 42,105,110,116,114,105,110,115,105, 99,115, 0,115,101,110,115,111,114, 95,119,105,100,116,104, 0,112, -105,120,101,108, 95, 97,115,112,101, 99,116, 0,102,111, 99, 97,108, 0,117,110,105,116,115, 0,112,114,105,110, 99,105,112, 97, -108, 91, 50, 93, 0,107, 49, 0,107, 50, 0,107, 51, 0,112,111,115, 91, 50, 93, 0,112, 97,116, 95,109,105,110, 91, 50, 93, 0, -112, 97,116, 95,109, 97,120, 91, 50, 93, 0,115,101, 97,114, 99,104, 95,109,105,110, 91, 50, 93, 0,115,101, 97,114, 99,104, 95, -109, 97,120, 91, 50, 93, 0,109, 97,114,107,101,114,115,110,114, 0,108, 97,115,116, 95,109, 97,114,107,101,114, 0, 42,109, 97, -114,107,101,114,115, 0, 98,117,110,100,108,101, 95,112,111,115, 91, 51, 93, 0,112, 97,116, 95,102,108, 97,103, 0,115,101, 97, -114, 99,104, 95,102,108, 97,103, 0,102,114, 97,109,101,115, 95,108,105,109,105,116, 0,112, 97,116,116,101,114,110, 95,109, 97, -116, 99,104, 0,116,114, 97, 99,107,101,114, 0,112,121,114, 97,109,105,100, 95,108,101,118,101,108,115, 0,109,105,110,105,109, -117,109, 95, 99,111,114,114,101,108, 97,116,105,111,110, 0,100,101,102, 97,117,108,116, 95,116,114, 97, 99,107,101,114, 0,100, -101,102, 97,117,108,116, 95,112,121,114, 97,109,105,100, 95,108,101,118,101,108,115, 0,100,101,102, 97,117,108,116, 95,109,105, -110,105,109,117,109, 95, 99,111,114,114,101,108, 97,116,105,111,110, 0,100,101,102, 97,117,108,116, 95,112, 97,116,116,101,114, -110, 95,115,105,122,101, 0,100,101,102, 97,117,108,116, 95,115,101, 97,114, 99,104, 95,115,105,122,101, 0,100,101,102, 97,117, -108,116, 95,102,114, 97,109,101,115, 95,108,105,109,105,116, 0,100,101,102, 97,117,108,116, 95,109, 97,114,103,105,110, 0,100, -101,102, 97,117,108,116, 95,112, 97,116,116,101,114,110, 95,109, 97,116, 99,104, 0,100,101,102, 97,117,108,116, 95,102,108, 97, -103, 0,109,111,116,105,111,110, 95,102,108, 97,103, 0,107,101,121,102,114, 97,109,101, 49, 0,107,101,121,102,114, 97,109,101, - 50, 0,114,101,102,105,110,101, 95, 99, 97,109,101,114, 97, 95,105,110,116,114,105,110,115,105, 99,115, 0, 99,108,101, 97,110, - 95,102,114, 97,109,101,115, 0, 99,108,101, 97,110, 95, 97, 99,116,105,111,110, 0, 99,108,101, 97,110, 95,101,114,114,111,114, - 0,111, 98,106,101, 99,116, 95,100,105,115,116, 97,110, 99,101, 0,116,111,116, 95,116,114, 97, 99,107, 0, 97, 99,116, 95,116, -114, 97, 99,107, 0,109, 97,120,115, 99, 97,108,101, 0, 42,114,111,116, 95,116,114, 97, 99,107, 0,108,111, 99,105,110,102, 0, -115, 99, 97,108,101,105,110,102, 0,114,111,116,105,110,102, 0, 42,115, 99, 97,108,101,105, 98,117,102, 0,108, 97,115,116, 95, - 99, 97,109,101,114, 97, 0, 99, 97,109,110,114, 0, 42, 99, 97,109,101,114, 97,115, 0,116,114, 97, 99,107,115, 0,114,101, 99, -111,110,115,116,114,117, 99,116,105,111,110, 0,109,101,115,115, 97,103,101, 91, 50, 53, 54, 93, 0,116,111,116, 95,115,101,103, -109,101,110,116, 0, 42,115,101,103,109,101,110,116,115, 0,109, 97,120, 95,115,101,103,109,101,110,116, 0,116,111,116, 97,108, - 95,102,114, 97,109,101,115, 0,116,111,116, 95, 99,104, 97,110,110,101,108, 0,115,111,114,116, 95,109,101,116,104,111,100, 0, -115,111,114,116, 95,105,110,118,101,114,115,101, 0,115,101,116,116,105,110,103,115, 0, 99, 97,109,101,114, 97, 0,115,116, 97, - 98,105,108,105,122, 97,116,105,111,110, 0, 42, 97, 99,116, 95,116,114, 97, 99,107, 0,111, 98,106,101, 99,116,115, 0,111, 98, -106,101, 99,116,110,114, 0,116,111,116, 95,111, 98,106,101, 99,116, 0,100,111,112,101,115,104,101,101,116, 0, 42, 98,114,117, -115,104, 95,103,114,111,117,112, 0, 99,117,114,114,101,110,116, 95,102,114, 97,109,101, 0,100,105,115,112, 95,116,121,112,101, - 0,105,109, 97,103,101, 95,102,105,108,101,102,111,114,109, 97,116, 0,101,102,102,101, 99,116, 95,117,105, 0,112,114,101,118, -105,101,119, 95,105,100, 0,105,110,105,116, 95, 99,111,108,111,114, 95,116,121,112,101, 0,112, 97,100, 95,115, 0,105,109, 97, -103,101, 95,114,101,115,111,108,117,116,105,111,110, 0,115,117, 98,115,116,101,112,115, 0,105,110,105,116, 95, 99,111,108,111, -114, 91, 52, 93, 0, 42,105,110,105,116, 95,116,101,120,116,117,114,101, 0,105,110,105,116, 95,108, 97,121,101,114,110, 97,109, -101, 91, 54, 52, 93, 0,100,114,121, 95,115,112,101,101,100, 0, 99,111,108,111,114, 95,100,114,121, 95,116,104,114,101,115,104, -111,108,100, 0,100,101,112,116,104, 95, 99,108, 97,109,112, 0,100,105,115,112, 95,102, 97, 99,116,111,114, 0,115,112,114,101, - 97,100, 95,115,112,101,101,100, 0, 99,111,108,111,114, 95,115,112,114,101, 97,100, 95,115,112,101,101,100, 0,115,104,114,105, -110,107, 95,115,112,101,101,100, 0,100,114,105,112, 95,118,101,108, 0,100,114,105,112, 95, 97, 99, 99, 0,105,110,102,108,117, -101,110, 99,101, 95,115, 99, 97,108,101, 0,114, 97,100,105,117,115, 95,115, 99, 97,108,101, 0,119, 97,118,101, 95,100, 97,109, -112,105,110,103, 0,119, 97,118,101, 95,115,112,101,101,100, 0,119, 97,118,101, 95,116,105,109,101,115, 99, 97,108,101, 0,119, - 97,118,101, 95,115,112,114,105,110,103, 0,105,109, 97,103,101, 95,111,117,116,112,117,116, 95,112, 97,116,104, 91, 49, 48, 50, - 52, 93, 0,111,117,116,112,117,116, 95,110, 97,109,101, 91, 54, 52, 93, 0,111,117,116,112,117,116, 95,110, 97,109,101, 50, 91, - 54, 52, 93, 0, 42,112,109,100, 0,115,117,114,102, 97, 99,101,115, 0, 97, 99,116,105,118,101, 95,115,117,114, 0,101,114,114, -111,114, 91, 54, 52, 93, 0, 99,111,108,108,105,115,105,111,110, 0,119,101,116,110,101,115,115, 0,112, 97,114,116,105, 99,108, -101, 95,114, 97,100,105,117,115, 0,112, 97,114,116,105, 99,108,101, 95,115,109,111,111,116,104, 0,112, 97,105,110,116, 95,100, -105,115,116, 97,110, 99,101, 0, 42,112, 97,105,110,116, 95,114, 97,109,112, 0, 42,118,101,108, 95,114, 97,109,112, 0,112,114, -111,120,105,109,105,116,121, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,105,114, 0,119, 97,118,101, 95,102, 97, 99, -116,111,114, 0,119, 97,118,101, 95, 99,108, 97,109,112, 0,109, 97,120, 95,118,101,108,111, 99,105,116,121, 0,115,109,117,100, -103,101, 95,115,116,114,101,110,103,116,104, 0, 84, 89, 80, 69, 20, 2, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115, -104,111,114,116, 0,117,115,104,111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, - 0,100,111,117, 98,108,101, 0,105,110,116, 54, 52, 95,116, 0,117,105,110,116, 54, 52, 95,116, 0,118,111,105,100, 0, 76,105, -110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, 99, 50,102, - 0,118,101, 99, 51,102, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, - 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80, -114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, - 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108, -111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97, -114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103, -101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105, -109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101, -120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, - 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 86,111,120,101,108, 68, - 97,116, 97, 0, 79, 99,101, 97,110, 84,101,120, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112,112,105,110, -103, 0, 67,111,108,111,114, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 86,111,108,117,109,101, 83,101,116,116,105,110, -103,115, 0, 71, 97,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105, 97,108, 0, 71,114,111,117,112, 0, 86, - 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, 0, 66,111,117,110,100, 66,111,120, - 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, - 69,100,105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, - 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 83,101,108,101, 99,116, 0, 77, 80,111,108,121, 0, 77, 84,101, -120, 80,111,108,121, 0, 77, 76,111,111,112, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, 0, 77, 70, 97, - 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102, -111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, 0, 66, 77, 69,100,105,116, 77,101,115,104, 0, - 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 0, 77, 68,101,102,111,114,109, 87,101,105,103,104, -116, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, 83, -116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 79,114,105,103, - 83,112, 97, 99,101, 76,111,111,112, 0, 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108, -116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114, -101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77, 82,101, 99, 97,115,116, 0, 71,114,105, -100, 80, 97,105,110,116, 77, 97,115,107, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,112,112,105,110,103, 73, -110,102,111, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, - 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100, -105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115,107, - 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, -105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105,102, -105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, 77, -111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109, -111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70,108,111,119, 83,101,116,116,105, -110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105,115,112,108, 97, 99,101, 77,111, -100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, - 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, 77,111,100,105, -102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111, -100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, - 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100,105,102,105,101, -114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108, -111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116,105,110,103,115, - 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, -114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111,111,108,101, 97, -110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, - 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116, -105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83, -121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105,101,114, 68, 97, -116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77, -111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, - 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, 77,111,100,105, -102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,108,105,100,105,102,121, 77, -111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,114,101,119, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 79, 99, -101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 79, 99,101, 97,110, 0, 79, 99,101, 97,110, 67, 97, 99,104,101, - 0, 87, 97,114,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87,101,105,103,104,116, 86, 71, 69,100,105,116, 77,111, -100,105,102,105,101,114, 68, 97,116, 97, 0, 87,101,105,103,104,116, 86, 71, 77,105,120, 77,111,100,105,102,105,101,114, 68, 97, -116, 97, 0, 87,101,105,103,104,116, 86, 71, 80,114,111,120,105,109,105,116,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, - 0, 68,121,110, 97,109,105, 99, 80, 97,105,110,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,121,110, 97,109,105, - 99, 80, 97,105,110,116, 67, 97,110,118, 97,115, 83,101,116,116,105,110,103,115, 0, 68,121,110, 97,109,105, 99, 80, 97,105,110, -116, 66,114,117,115,104, 83,101,116,116,105,110,103,115, 0, 82,101,109,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 69,100,105,116, 76, 97,116,116, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, - 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 98, 71, 80,100, - 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, - 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,102,116, - 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71, 0, 69,102,102,101, - 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 69,120,116,114, 97, 0, 80, 84, 67, 97, 99,104,101, - 77,101,109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105, -110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 70,108,117,105,100, 86,101,114, -116,101,120, 86,101,108,111, 99,105,116,121, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, - 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, - 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117, -100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, 0, 73,109, 97,103,101, 70,111, -114,109, 97,116, 68, 97,116, 97, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108, -101, 0, 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 82,101, 99, 97,115,116, 68, 97,116, - 97, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115, -104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117, -115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 83,101,116,116,105,110,103,115, 0, 83, 99,117,108, -112,116, 0, 85,118, 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101, -110,116, 97,116,105,111,110, 0, 85,110,105,102,105,101,100, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 84,111,111, -108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,104, -121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, - 0, 68, 97,103, 70,111,114,101,115,116, 0, 77,111,118,105,101, 67,108,105,112, 0, 66, 71,112,105, 99, 0, 77,111,118,105,101, - 67,108,105,112, 85,115,101,114, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, - 0, 82,101,110,100,101,114, 69,110,103,105,110,101, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86, -105,101,119, 83,116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110, -107, 0, 86,105,101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112, -101, 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101, -108,101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, - 79,112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114, -101,101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, - 0, 83, 99,111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, - 84,101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109, -101, 67, 97, 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, - 76,111,103,105, 99, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101, 67,111,110,115,111,108,101, 0, 83, -112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 67,108,105,112, 0, 77,111,118,105,101, 67,108,105,112, - 83, 99,111,112,101,115, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,108,101, 0,117,105, 83,116,121,108, -101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,101,116, 83,116, 97,116,101, 67,111, -108,111,114,115, 0,117,105, 80, 97,110,101,108, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, - 83,112, 97, 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100, -111,110, 0, 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 98, 83, 99,114,101,101,110, 0, 83, 99, -114, 86,101,114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, - 76, 97,121,111,117,116, 0, 83, 99,114, 65,114,101, 97, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, - 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101, -109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, - 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108, -117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110, 99,101, 0, 98, 83,111,117,110,100, 0, 77,101,116, 97, 83,116, 97, 99, -107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114, -115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114, -115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0, 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99, -108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, - 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117, 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98, -111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, - 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105, -111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110, -115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, - 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101, -114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0, 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110, -116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, - 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110, 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, - 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116, -117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99, -116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97, -116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, - 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117, 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99, -116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116, -117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70, -105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, -116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 98, - 83,116,101,101,114,105,110,103, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110, -101, 0, 98, 65,114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115, -101, 67,104, 97,110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, - 71,114,111,117,112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, - 0, 98, 67,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, - 98, 67,111,110,115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, - 73, 75, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, - 98, 82,111,116, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107, -101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, - 98, 83, 97,109,101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, - 67,111,110,115,116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99, -116,105,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, - 80, 97,116,104, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67, -108, 97,109,112, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67, -111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82, -111,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115, -116,114, 97,105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114, -105,110,107,119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 84,114, 97, 99,107, 67,111, -110,115,116,114, 97,105,110,116, 0, 98, 67, 97,109,101,114, 97, 83,111,108,118,101,114, 67,111,110,115,116,114, 97,105,110,116, - 0, 98, 79, 98,106,101, 99,116, 83,111,108,118,101,114, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, - 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, - 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 80,114,101,118, -105,101,119, 0, 98, 78,111,100,101, 0,117,105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 98, 78,111,100, -101, 84,114,101,101, 69,120,101, 99, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 73,110,116, 0, 98, 78, -111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 70,108,111, 97,116, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, - 97,108,117,101, 66,111,111,108,101, 97,110, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 86,101, 99,116, -111,114, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 82, 71, 66, 65, 0, 78,111,100,101, 73,109, 97,103, -101, 65,110,105,109, 0, 78,111,100,101, 73,109, 97,103,101, 76, 97,121,101,114, 0, 78,111,100,101, 66,108,117,114, 68, 97,116, - 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,108, 97,116,101,114, 97,108, 66,108,117, -114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,109, 97,103,101, 70,105,108,101, 0, 78, -111,100,101, 73,109, 97,103,101, 77,117,108,116,105, 70,105,108,101, 0, 78,111,100,101, 73,109, 97,103,101, 77,117,108,116,105, - 70,105,108,101, 83,111, 99,107,101,116, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, - 0, 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, - 86,101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, - 68,105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76, -101,110,115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108, -111,114,115,112,105,108,108, 0, 78,111,100,101, 84,101,120, 66, 97,115,101, 0, 78,111,100,101, 84,101,120, 83,107,121, 0, 78, -111,100,101, 84,101,120, 73,109, 97,103,101, 0, 78,111,100,101, 84,101,120, 67,104,101, 99,107,101,114, 0, 78,111,100,101, 84, -101,120, 69,110,118,105,114,111,110,109,101,110,116, 0, 78,111,100,101, 84,101,120, 71,114, 97,100,105,101,110,116, 0, 78,111, -100,101, 84,101,120, 78,111,105,115,101, 0, 78,111,100,101, 84,101,120, 86,111,114,111,110,111,105, 0, 78,111,100,101, 84,101, -120, 77,117,115,103,114, 97,118,101, 0, 78,111,100,101, 84,101,120, 87, 97,118,101, 0, 78,111,100,101, 84,101,120, 77, 97,103, -105, 99, 0, 78,111,100,101, 83,104, 97,100,101,114, 65,116,116,114,105, 98,117,116,101, 0, 84,101,120, 78,111,100,101, 79,117, -116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115, -104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97, 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, - 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111, -105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,112,114,105, -110,103, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, - 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, - 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110, -103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, - 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,100, -101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109, -101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,116, 76,105,115,116, 0,119,109, 87,105,110,100,111,119, 77, - 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118, -101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119,109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, - 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65, 0,119,109, 75,101,121, 77, 97,112, 68,105,102,102, 73,116, -101,109, 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100,105, -102,105,101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105,111, -110, 71,101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111,100, - 95, 69,110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104,111, -110, 0, 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83,116, -101,112,112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97, -110,110,101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, - 80, 97,105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99, -107, 0, 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, - 0, 73,100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, - 71,111, 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, - 0, 66,111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118, -101,114, 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97, -116,101, 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 83,112,101, 97,107,101,114, 0, - 77,111,118,105,101, 67,108,105,112, 80,114,111,120,121, 0, 77,111,118,105,101, 67,108,105,112, 67, 97, 99,104,101, 0, 77,111, -118,105,101, 84,114, 97, 99,107,105,110,103, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 84,114, 97, 99,107, 0, 77, -111,118,105,101, 84,114, 97, 99,107,105,110,103, 77, 97,114,107,101,114, 0, 77,111,118,105,101, 82,101, 99,111,110,115,116,114, -117, 99,116,101,100, 67, 97,109,101,114, 97, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 67, 97,109,101,114, 97, 0, - 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 83,101,116,116,105,110,103,115, 0, 77,111,118,105,101, 84,114, 97, 99,107, -105,110,103, 83,116, 97, 98,105,108,105,122, 97,116,105,111,110, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 82,101, - 99,111,110,115,116,114,117, 99,116,105,111,110, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 79, 98,106,101, 99,116, - 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 83,116, 97,116,115, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110, -103, 68,111,112,101,115,104,101,101,116, 67,104, 97,110,110,101,108, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 68, -111,112,101,115,104,101,101,116, 0, 68,121,110, 97,109,105, 99, 80, 97,105,110,116, 83,117,114,102, 97, 99,101, 0, 80, 97,105, -110,116, 83,117,114,102, 97, 99,101, 68, 97,116, 97, 0, 0, 0, 84, 76, 69, 78, 1, 0, 1, 0, 2, 0, 2, 0, 4, 0, 4, 0, + 91, 52, 93, 0,108, 97, 98,101,108, 95,115,105,122,101, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,103, 97,109,109, + 97, 0,103, 97,105,110, 0,108,105,102,116, 0,109, 97,115,116,101,114, 0,115,104, 97,100,111,119,115, 0,109,105,100,116,111, +110,101,115, 0,104,105,103,104,108,105,103,104,116,115, 0,115,116, 97,114,116,109,105,100,116,111,110,101,115, 0,101,110,100, +109,105,100,116,111,110,101,115, 0,102,108, 97,112,115, 0,114,111,117,110,100,105,110,103, 0, 99, 97,116, 97,100,105,111,112, +116,114,105, 99, 0,108,101,110,115,115,104,105,102,116, 0,114,111,116, 97,116,105,111,110, 0,112, 97,115,115, 95,105,110,100, +101,120, 0,112, 97,115,115, 95,102,108, 97,103, 0,109, 97,120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0, 99, +117,114,118,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,110,116,121, 0, 98,111,107,101,104, 0,105,109, + 97,103,101, 95,105,110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110, +116,101,114, 95,120, 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99, +111,108,111,114, 0,115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0, 98, 97,115,101, 95,112, 97,116,104, 91, 49, + 48, 50, 52, 93, 0,102,111,114,109, 97,116, 0, 97, 99,116,105,118,101, 95,105,110,112,117,116, 0,117,115,101, 95,114,101,110, +100,101,114, 95,102,111,114,109, 97,116, 0,117,115,101, 95,110,111,100,101, 95,102,111,114,109, 97,116, 0,108, 97,121,101,114, + 91, 51, 48, 93, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104, 0,102, 97,108,112,104, 97, 0,107, +101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,101,108, 0,120, 49, 0,120, 50, 0,121, 49, + 0,121, 50, 0,102, 97, 99, 95,120, 49, 0,102, 97, 99, 95,120, 50, 0,102, 97, 99, 95,121, 49, 0,102, 97, 99, 95,121, 50, 0, + 99,111,108,110, 97,109,101, 91, 54, 52, 93, 0, 98,107,116,121,112,101, 0,112, 97,100, 95, 99, 49, 0,103, 97,109, 99,111, 0, +110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,117,114, 0, 98,116,104,114,101,115,104, 0,112, 97, +100, 95,102, 49, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 99,111,108,109,111,100, 0,109,105,120, 0,102, 97,100,101, + 0, 97,110,103,108,101, 95,111,102,115, 0,109, 0, 99, 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112, +101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,108,105,102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95, +105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110, 0,117,110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0, +117,115,112,105,108,108,114, 0,117,115,112,105,108,108,103, 0,117,115,112,105,108,108, 98, 0,116,101,120, 95,109, 97,112,112, +105,110,103, 0, 99,111,108,111,114, 95,109, 97,112,112,105,110,103, 0,115,117,110, 95,100,105,114,101, 99,116,105,111,110, 91, + 51, 93, 0,116,117,114, 98,105,100,105,116,121, 0, 99,111,108,111,114, 95,115,112, 97, 99,101, 0,112,114,111,106,101, 99,116, +105,111,110, 0,103,114, 97,100,105,101,110,116, 95,116,121,112,101, 0, 99,111,108,111,114,105,110,103, 0,109,117,115,103,114, + 97,118,101, 95,116,121,112,101, 0,119, 97,118,101, 95,116,121,112,101, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98, +108,101, 0,109, 97,120,116, 97, 98,108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, + 0, 42, 99,117,114,118,101, 0, 42,116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115, +101,116, 0, 99,104, 97,110,103,101,100, 95,116,105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, + 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, + 0,115, 97,109,112,108,101, 91, 51, 93, 0,120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, + 53, 54, 93, 0,100, 97,116, 97, 95,103, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, + 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,115, 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105, +110,101,115, 0, 97, 99, 99,117,114, 97, 99,121, 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114, +109, 95, 97,108,112,104, 97, 0,119, 97,118,101,102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105, +103,104,116, 0,118,101, 99,115, 99,111,112,101, 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103, +104,116, 0,109,105,110,109, 97,120, 91, 51, 93, 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, + 0, 42,119, 97,118,101,102,111,114,109, 95, 50, 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111, +112,101, 0,119, 97,118,101,102,111,114,109, 95,116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0, +109,116,101,120, 0, 42,116,111,103,103,108,101, 95, 98,114,117,115,104, 0, 42,105, 99,111,110, 95,105,109, 98,117,102, 0,105, + 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 49, 48, 50, 52, 93, 0,110,111,114,109, 97,108, 95,119,101,105,103,104,116, + 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,114, 97, +100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,102, 97, 99,116,111,114, 0,114, 97,116,101, 0,114, +103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,110,101, 0,112,108, 97,110,101, 95,111,102,102,115,101,116, 0, +115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97, +103,101,112, 97,105,110,116, 95,116,111,111,108, 0,109, 97,115,107, 95,116,111,111,108, 0, 97,117,116,111,115,109,111,111,116, +104, 95,102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,111,114, 0,112,108, 97, +110,101, 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,115, 0,116,101,120,116, +117,114,101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, + 95, 99,111,108, 91, 51, 93, 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, + 97, 99,116,105,118,101, 95,109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,121,112,101,109, 97,112, 91, 51, 54, 93, 0, +116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,111,116,115,105,122,101, 0, 42,112,111,111,108, 0, + 42,101,120,116,101,114,110, 97,108, 0,114,111,116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0, +119, 97,110,100,101,114, 91, 51, 93, 0,114,101,115,116, 95,108,101,110,103,116,104, 0,112, 97,114,116,105, 99,108,101, 95,105, +110,100,101,120, 91, 50, 93, 0,100,101,108,101,116,101, 95,102,108, 97,103, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, + 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,112,114,101,118, 95,115,116, + 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, + 99,104,101, 0,104, 97,105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115,112,114,105,110,103, 95,107, 0,112,108, + 97,115,116,105, 99,105,116,121, 95, 99,111,110,115,116, 97,110,116, 0,121,105,101,108,100, 95,114, 97,116,105,111, 0,112,108, + 97,115,116,105, 99,105,116,121, 95, 98, 97,108, 97,110, 99,101, 0,121,105,101,108,100, 95, 98, 97,108, 97,110, 99,101, 0,118, +105,115, 99,111,115,105,116,121, 95,111,109,101,103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116, +105,102,102,110,101,115,115, 95,107, 0,115,116,105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100, +101,110,115,105,116,121, 0, 98,117,111,121, 97,110, 99,121, 0,115,112,114,105,110,103, 95,102,114, 97,109,101,115, 0, 42, 98, +111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0, 97,118,101,109,111, +100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,100,114, 97,119, 95, +115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,115,117, 98,102,114, 97,109,101,115, 0, +100,114, 97,119, 95, 99,111,108, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, + 95,115,116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102, +114,111,109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112, +108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116, +105,108,116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0, 98, 98, + 95,115,105,122,101, 91, 50, 93, 0, 98, 98, 95,118,101,108, 95,104,101, 97,100, 0, 98, 98, 95,118,101,108, 95,116, 97,105,108, + 0, 99,111,108,111,114, 95,118,101, 99, 95,109, 97,120, 0,115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0, +115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111, +110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0, 99,111, +117,114, 97,110,116, 95,116, 97,114,103,101,116, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,114,105, +100, 95,114, 97,110,100, 0,112,115, 95,111,102,102,115,101,116, 91, 49, 93, 0,103,114,105,100, 95,114,101,115, 0,101,102,102, +101, 99,116,111,114, 95, 97,109,111,117,110,116, 0,116,105,109,101, 95,102,108, 97,103, 0,116,105,109,101, 95,112, 97,100, 91, + 51, 93, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116, +102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97, +110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0, 97, + 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116, +104, 0, 99,104,105,108,100, 95,110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116, +115, 0, 99,104,105,108,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, + 97,100, 0, 99,104,105,108,100,102,108, 97,116, 0, 99,108,117,109,112,112,111,119, 0,107,105,110,107, 95,102,108, 97,116, 0, +107,105,110,107, 95, 97,109,112, 95, 99,108,117,109,112, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122, +101, 0,114,111,117,103,104, 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101, +115, 0,114,111,117,103,104, 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110, +103,116,104, 0, 99,108,101,110,103,116,104, 95,116,104,114,101,115, 0,112, 97,114,116,105,110,103, 95,102, 97, 99, 0,112, 97, +114,116,105,110,103, 95,109,105,110, 0,112, 97,114,116,105,110,103, 95,109, 97,120, 0, 98,114, 97,110, 99,104, 95,116,104,114, +101,115, 0,100,114, 97,119, 95,108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95, +101,110,100, 0,116,114, 97,105,108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108, +105,119,101,105,103,104,116,115, 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95, +111, 98, 0, 42,112,100, 50, 0, 42,112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, + 97, 99,104,101, 0, 42, 42, 99,104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, + 99,104,105,108,100, 99, 97, 99,104,101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, + 0, 42,104, 97,105,114, 95,111,117,116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99, +101, 0,116,114,101,101, 95,102,114, 97,109,101, 0, 98,118,104,116,114,101,101, 95,102,114, 97,109,101, 0, 99,104,105,108,100, + 95,115,101,101,100, 0,116,111,116,117,110,101,120,105,115,116, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99, +104,101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111, +116,107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 54, 52, + 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, + 97,116, 97, 0, 42,101,102,102,101, 99,116,111,114,115, 0, 42,102,108,117,105,100, 95,115,112,114,105,110,103,115, 0,116,111, +116, 95,102,108,117,105,100,115,112,114,105,110,103,115, 0, 97,108,108,111, 99, 95,102,108,117,105,100,115,112,114,105,110,103, +115, 0, 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97,110,100, 0,100,116, 95,102,114, 97, 99, 0, 95,112, 97,100, + 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114,117, 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, + 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117, 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115, +112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, + 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115, 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0, +118,101,108,111, 99,105,116,121, 95,115,109,111,111,116,104, 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111, +110, 0,118,101,108, 95,100, 97,109,112,105,110,103, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,101, 0,112,114,101,114, +111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,112,101, 0,118,103,114, +111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,112, 95,115,116,114,117, + 99,116, 0,115,104, 97,112,101,107,101,121, 95,114,101,115,116, 0,112,114,101,115,101,116,115, 0,114,101,115,101,116, 0, 42, + 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,102, 95,102,114,105, 99, +116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,114,101,112,101,108, 95,102,111,114, 99,101, 0,100,105,115, +116, 97,110, 99,101, 95,114,101,112,101,108, 0,115,101,108,102, 95,108,111,111,112, 95, 99,111,117,110,116, 0,108,111,111,112, + 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, 99,107,110,101,115,115, 0,115,116,114,111,107,101, +115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, 0,103,115,116,101,112, 0,105,110,102,111, 91, + 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98,117,102,102,101,114, 95,115,102,108, 97,103, 0, + 42,115, 98,117,102,102,101,114, 0,108,105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101, +118,101,108, 0, 42,114,101,112,111,114,116,116,105,109,101,114, 0, 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119, +105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119,115, 0,105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108, +101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100,111, 95,100,101,112,116,104, 0,111,112,101,114, 97,116,111,114,115, 0, +113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106,111, 98,115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0, +100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105,103,115, 0, 42,100,101,102, 97,117,108,116, 99,111,110,102, 0, 42, 97, +100,100,111,110, 99,111,110,102, 0, 42,117,115,101,114, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, + 97,118,101,116,105,109,101,114, 0, 42,103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,115, + 99,114,101,101,110, 0, 42,110,101,119,115, 99,114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 54, 52, 93, 0, +112,111,115,120, 0,112,111,115,121, 0,119,105,110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97, +115,116, 99,117,114,115,111,114, 0,109,111,100, 97,108, 99,117,114,115,111,114, 0, 97,100,100,109,111,117,115,101,109,111,118, +101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42,116,119,101, 97,107, 0,100,114, + 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, 97,116, 97, 0,109,111,100, 97, +108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,114,101, 0,105,100,110, + 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 95,115,116,114, 91, 54, 52, 93, 0,112,114,111,112,118, 97, +108,117,101, 0,115,104,105,102,116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105, +102,105,101,114, 0,109, 97,112,116,121,112,101, 0, 42,112,116,114, 0, 42,114,101,109,111,118,101, 95,105,116,101,109, 0, 42, + 97,100,100, 95,105,116,101,109, 0,105,116,101,109,115, 0,100,105,102,102, 95,105,116,101,109,115, 0,115,112, 97, 99,101,105, +100, 0,114,101,103,105,111,110,105,100, 0,107,109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, + 97,108, 95,105,116,101,109,115, 0, 98, 97,115,101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, + 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116, +115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0, 42,101,100, 97,116, 97, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116, +115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101, + 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118, + 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97, +102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121, + 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101, +112, 95,115,105,122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0, +116,114, 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95, +116, 97,114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, + 93, 0, 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105, +110,100,101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,111, 91, 49, 50, 56, + 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,112, 0,102, 99,117,114,118,101,115, + 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,120,116,101,110,100,109,111,100,101, + 0, 42,115,112,101, 97,107,101,114, 95,104, 97,110,100,108,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112, +109,111,100,101, 0,107,101,121,105,110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,100,101,115, 99,114,105,112,116,105,111, +110, 91, 50, 52, 48, 93, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,112, 97,116,104, 0, + 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114,105,112, 0,100,114,105, +118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111,100,101, 0, 97, 99,116, + 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0,114,117,108,101, 0,111, +112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105,100, 0,108,111,111, +107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0,119, 97,110,100,101, +114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116,101, 95,105,100, 0, +114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117,108,101,115,101,116, + 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115,116, 97,116,101, 95, +105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105,110,103, 0, 97,103, +103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95,115, +112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120, 95, 97,118,101, 0, 97,105,114, + 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,112, 95,115,112,101,101,100, 0, +108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95, 97, 99, 99, 0,108, 97,110,100, + 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110, +100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,100, 0, 42,102,108,117,105,100, + 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101,120, 95,119,116, 0, 42, +116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, 49, 91, 51, 93, 0,100, +120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, 93, 0, 97,109,112,108, +105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,110,111,105,115,101, 0,100,105, +115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95,119,116, 91, 51, 93, 0, +100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, 99,104,101, 95,104,105, +103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, 99, 97, 99,104,101,115, + 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,109,101, 95,115, 99, 97,108,101, + 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,101,108, 95,109,117,108,116,105, + 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102,108,111,119, 0, +118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42,112,111,105,110, +116,115, 95,111,108,100, 0, 42,118,101,108, 0, 42,116,114,105,100,105,118,115, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, + 52, 93, 0,110,117,109,116,114,105,115, 0,118,111,108,117,109,101, 95,109, 97,120, 0,118,111,108,117,109,101, 95,109,105,110, + 0,100,105,115,116, 97,110, 99,101, 95,109, 97,120, 0,100,105,115,116, 97,110, 99,101, 95,114,101,102,101,114,101,110, 99,101, + 0, 99,111,110,101, 95, 97,110,103,108,101, 95,111,117,116,101,114, 0, 99,111,110,101, 95, 97,110,103,108,101, 95,105,110,110, +101,114, 0, 99,111,110,101, 95,118,111,108,117,109,101, 95,111,117,116,101,114, 0,114,101,110,100,101,114, 95,102,108, 97,103, + 0, 98,117,105,108,100, 95,115,105,122,101, 95,102,108, 97,103, 0, 98,117,105,108,100, 95,116, 99, 95,102,108, 97,103, 0,108, + 97,115,116,115,105,122,101, 91, 50, 93, 0,116,114, 97, 99,107,105,110,103, 0, 42,116,114, 97, 99,107,105,110,103, 95, 99,111, +110,116,101,120,116, 0,112,114,111,120,121, 0,116,114, 97, 99,107, 95,112,114,101,118,105,101,119, 95,104,101,105,103,104,116, + 0, 42,116,114, 97, 99,107, 95,112,114,101,118,105,101,119, 0,116,114, 97, 99,107, 95,112,111,115, 91, 50, 93, 0,116,114, 97, + 99,107, 95,100,105,115, 97, 98,108,101,100, 0, 42,109, 97,114,107,101,114, 0,115,108,105,100,101, 95,115, 99, 97,108,101, 91, + 50, 93, 0,101,114,114,111,114, 0, 42,105,110,116,114,105,110,115,105, 99,115, 0,115,101,110,115,111,114, 95,119,105,100,116, +104, 0,112,105,120,101,108, 95, 97,115,112,101, 99,116, 0,102,111, 99, 97,108, 0,117,110,105,116,115, 0,112,114,105,110, 99, +105,112, 97,108, 91, 50, 93, 0,107, 49, 0,107, 50, 0,107, 51, 0,112,111,115, 91, 50, 93, 0,112, 97,116, 95,109,105,110, 91, + 50, 93, 0,112, 97,116, 95,109, 97,120, 91, 50, 93, 0,115,101, 97,114, 99,104, 95,109,105,110, 91, 50, 93, 0,115,101, 97,114, + 99,104, 95,109, 97,120, 91, 50, 93, 0,109, 97,114,107,101,114,115,110,114, 0,108, 97,115,116, 95,109, 97,114,107,101,114, 0, + 42,109, 97,114,107,101,114,115, 0, 98,117,110,100,108,101, 95,112,111,115, 91, 51, 93, 0,112, 97,116, 95,102,108, 97,103, 0, +115,101, 97,114, 99,104, 95,102,108, 97,103, 0,102,114, 97,109,101,115, 95,108,105,109,105,116, 0,112, 97,116,116,101,114,110, + 95,109, 97,116, 99,104, 0,116,114, 97, 99,107,101,114, 0,112,121,114, 97,109,105,100, 95,108,101,118,101,108,115, 0,109,105, +110,105,109,117,109, 95, 99,111,114,114,101,108, 97,116,105,111,110, 0,100,101,102, 97,117,108,116, 95,116,114, 97, 99,107,101, +114, 0,100,101,102, 97,117,108,116, 95,112,121,114, 97,109,105,100, 95,108,101,118,101,108,115, 0,100,101,102, 97,117,108,116, + 95,109,105,110,105,109,117,109, 95, 99,111,114,114,101,108, 97,116,105,111,110, 0,100,101,102, 97,117,108,116, 95,112, 97,116, +116,101,114,110, 95,115,105,122,101, 0,100,101,102, 97,117,108,116, 95,115,101, 97,114, 99,104, 95,115,105,122,101, 0,100,101, +102, 97,117,108,116, 95,102,114, 97,109,101,115, 95,108,105,109,105,116, 0,100,101,102, 97,117,108,116, 95,109, 97,114,103,105, +110, 0,100,101,102, 97,117,108,116, 95,112, 97,116,116,101,114,110, 95,109, 97,116, 99,104, 0,100,101,102, 97,117,108,116, 95, +102,108, 97,103, 0,109,111,116,105,111,110, 95,102,108, 97,103, 0,107,101,121,102,114, 97,109,101, 49, 0,107,101,121,102,114, + 97,109,101, 50, 0,114,101,102,105,110,101, 95, 99, 97,109,101,114, 97, 95,105,110,116,114,105,110,115,105, 99,115, 0, 99,108, +101, 97,110, 95,102,114, 97,109,101,115, 0, 99,108,101, 97,110, 95, 97, 99,116,105,111,110, 0, 99,108,101, 97,110, 95,101,114, +114,111,114, 0,111, 98,106,101, 99,116, 95,100,105,115,116, 97,110, 99,101, 0,116,111,116, 95,116,114, 97, 99,107, 0, 97, 99, +116, 95,116,114, 97, 99,107, 0,109, 97,120,115, 99, 97,108,101, 0, 42,114,111,116, 95,116,114, 97, 99,107, 0,108,111, 99,105, +110,102, 0,115, 99, 97,108,101,105,110,102, 0,114,111,116,105,110,102, 0, 42,115, 99, 97,108,101,105, 98,117,102, 0,108, 97, +115,116, 95, 99, 97,109,101,114, 97, 0, 99, 97,109,110,114, 0, 42, 99, 97,109,101,114, 97,115, 0,116,114, 97, 99,107,115, 0, +114,101, 99,111,110,115,116,114,117, 99,116,105,111,110, 0,109,101,115,115, 97,103,101, 91, 50, 53, 54, 93, 0,116,111,116, 95, +115,101,103,109,101,110,116, 0, 42,115,101,103,109,101,110,116,115, 0,109, 97,120, 95,115,101,103,109,101,110,116, 0,116,111, +116, 97,108, 95,102,114, 97,109,101,115, 0,116,111,116, 95, 99,104, 97,110,110,101,108, 0,115,111,114,116, 95,109,101,116,104, +111,100, 0,115,111,114,116, 95,105,110,118,101,114,115,101, 0,115,101,116,116,105,110,103,115, 0, 99, 97,109,101,114, 97, 0, +115,116, 97, 98,105,108,105,122, 97,116,105,111,110, 0, 42, 97, 99,116, 95,116,114, 97, 99,107, 0,111, 98,106,101, 99,116,115, + 0,111, 98,106,101, 99,116,110,114, 0,116,111,116, 95,111, 98,106,101, 99,116, 0,100,111,112,101,115,104,101,101,116, 0, 42, + 98,114,117,115,104, 95,103,114,111,117,112, 0, 99,117,114,114,101,110,116, 95,102,114, 97,109,101, 0,100,105,115,112, 95,116, +121,112,101, 0,105,109, 97,103,101, 95,102,105,108,101,102,111,114,109, 97,116, 0,101,102,102,101, 99,116, 95,117,105, 0,112, +114,101,118,105,101,119, 95,105,100, 0,105,110,105,116, 95, 99,111,108,111,114, 95,116,121,112,101, 0,112, 97,100, 95,115, 0, +105,109, 97,103,101, 95,114,101,115,111,108,117,116,105,111,110, 0,115,117, 98,115,116,101,112,115, 0,105,110,105,116, 95, 99, +111,108,111,114, 91, 52, 93, 0, 42,105,110,105,116, 95,116,101,120,116,117,114,101, 0,105,110,105,116, 95,108, 97,121,101,114, +110, 97,109,101, 91, 54, 52, 93, 0,100,114,121, 95,115,112,101,101,100, 0, 99,111,108,111,114, 95,100,114,121, 95,116,104,114, +101,115,104,111,108,100, 0,100,101,112,116,104, 95, 99,108, 97,109,112, 0,100,105,115,112, 95,102, 97, 99,116,111,114, 0,115, +112,114,101, 97,100, 95,115,112,101,101,100, 0, 99,111,108,111,114, 95,115,112,114,101, 97,100, 95,115,112,101,101,100, 0,115, +104,114,105,110,107, 95,115,112,101,101,100, 0,100,114,105,112, 95,118,101,108, 0,100,114,105,112, 95, 97, 99, 99, 0,105,110, +102,108,117,101,110, 99,101, 95,115, 99, 97,108,101, 0,114, 97,100,105,117,115, 95,115, 99, 97,108,101, 0,119, 97,118,101, 95, +100, 97,109,112,105,110,103, 0,119, 97,118,101, 95,115,112,101,101,100, 0,119, 97,118,101, 95,116,105,109,101,115, 99, 97,108, +101, 0,119, 97,118,101, 95,115,112,114,105,110,103, 0,105,109, 97,103,101, 95,111,117,116,112,117,116, 95,112, 97,116,104, 91, + 49, 48, 50, 52, 93, 0,111,117,116,112,117,116, 95,110, 97,109,101, 91, 54, 52, 93, 0,111,117,116,112,117,116, 95,110, 97,109, +101, 50, 91, 54, 52, 93, 0, 42,112,109,100, 0,115,117,114,102, 97, 99,101,115, 0, 97, 99,116,105,118,101, 95,115,117,114, 0, +101,114,114,111,114, 91, 54, 52, 93, 0, 99,111,108,108,105,115,105,111,110, 0,119,101,116,110,101,115,115, 0,112, 97,114,116, +105, 99,108,101, 95,114, 97,100,105,117,115, 0,112, 97,114,116,105, 99,108,101, 95,115,109,111,111,116,104, 0,112, 97,105,110, +116, 95,100,105,115,116, 97,110, 99,101, 0, 42,112, 97,105,110,116, 95,114, 97,109,112, 0, 42,118,101,108, 95,114, 97,109,112, + 0,112,114,111,120,105,109,105,116,121, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,105,114, 0,119, 97,118,101, 95, +102, 97, 99,116,111,114, 0,119, 97,118,101, 95, 99,108, 97,109,112, 0,109, 97,120, 95,118,101,108,111, 99,105,116,121, 0,115, +109,117,100,103,101, 95,115,116,114,101,110,103,116,104, 0, 0, 84, 89, 80, 69, 26, 2, 0, 0, 99,104, 97,114, 0,117, 99,104, + 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102, +108,111, 97,116, 0,100,111,117, 98,108,101, 0,105,110,116, 54, 52, 95,116, 0,117,105,110,116, 54, 52, 95,116, 0,118,111,105, +100, 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118, +101, 99, 50,102, 0,118,101, 99, 51,102, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, 68, + 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, 97, +116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99,116, + 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, 75, +101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,120,116, 76,105,110,101, 0, 84,101, +120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, + 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, 80, 85, 84,101,120,116,117,114,101, + 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, 0, 84,101,120, 0, 80,108,117,103, +105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, + 66,117,102, 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 86,111, +120,101,108, 68, 97,116, 97, 0, 79, 99,101, 97,110, 84,101,120, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97, +112,112,105,110,103, 0, 67,111,108,111,114, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 86,111,108,117,109,101, 83,101, +116,116,105,110,103,115, 0, 71, 97,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105, 97,108, 0, 71,114,111, +117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, 0, 66,111,117,110, +100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, + 66,111,120, 0, 69,100,105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101, +108, 66,111,120, 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 83,101,108,101, 99,116, 0, 77, 80,111,108,121, + 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, + 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, + 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, 0, 66, 77, 69,100,105,116, 77, +101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 0, 77, 68,101,102,111,114,109, 87, +101,105,103,104,116, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116, +121, 0, 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, + 79,114,105,103, 83,112, 97, 99,101, 76,111,111,112, 0, 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, + 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117, +108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77, 82,101, 99, 97,115,116, + 0, 71,114,105,100, 80, 97,105,110,116, 77, 97,115,107, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,112,112, +105,110,103, 73,110,102,111, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102, +105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118, +101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, + 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97, +116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77, +111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77, +101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101,114, 68, 97,116, + 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70,108,111,119, 83, +101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105,115,112,108, 97, + 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, + 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, + 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97, +118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100, +105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116, +104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116, +105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,105,101, +114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, + 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111, +111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, + 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, + 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, + 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105, +101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105, +114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,101,114, + 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, + 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,105,101, +114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,108,105,100, +105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,114,101,119, 77,111,100,105,102,105,101,114, 68, 97,116, + 97, 0, 79, 99,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 79, 99,101, 97,110, 0, 79, 99,101, 97,110, 67, + 97, 99,104,101, 0, 87, 97,114,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87,101,105,103,104,116, 86, 71, 69,100, +105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87,101,105,103,104,116, 86, 71, 77,105,120, 77,111,100,105,102,105, +101,114, 68, 97,116, 97, 0, 87,101,105,103,104,116, 86, 71, 80,114,111,120,105,109,105,116,121, 77,111,100,105,102,105,101,114, + 68, 97,116, 97, 0, 68,121,110, 97,109,105, 99, 80, 97,105,110,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,121, +110, 97,109,105, 99, 80, 97,105,110,116, 67, 97,110,118, 97,115, 83,101,116,116,105,110,103,115, 0, 68,121,110, 97,109,105, 99, + 80, 97,105,110,116, 66,114,117,115,104, 83,101,116,116,105,110,103,115, 0, 82,101,109,101,115,104, 77,111,100,105,102,105,101, +114, 68, 97,116, 97, 0, 69,100,105,116, 76, 97,116,116, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114, +111,117,112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, + 98, 71, 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,110, + 80, 97,116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, + 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71, 0, + 69,102,102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 69,120,116,114, 97, 0, 80, 84, 67, + 97, 99,104,101, 77,101,109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100, +121, 80,111,105,110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 70,108,117,105, +100, 86,101,114,116,101,120, 86,101,108,111, 99,105,116,121, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65,118,105, 67,111, +100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107, +116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116, + 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, 0, 73,109, 97, +103,101, 70,111,114,109, 97,116, 68, 97,116, 97, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114, +111,102,105,108,101, 0, 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 82,101, 99, 97,115, +116, 68, 97,116, 97, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 80, 97,105,110,116, 0, + 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108, +101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 83,101,116,116,105,110,103,115, 0, + 83, 99,117,108,112,116, 0, 85,118, 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,114, 97,110,115,102,111,114,109, + 79,114,105,101,110,116, 97,116,105,111,110, 0, 85,110,105,102,105,101,100, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, + 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, 85,110,105,116, 83,101,116,116,105,110,103, +115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83, +116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 77,111,118,105,101, 67,108,105,112, 0, 66, 71,112,105, 99, 0, 77, +111,118,105,101, 67,108,105,112, 85,115,101,114, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, + 73,110,102,111, 0, 82,101,110,100,101,114, 69,110,103,105,110,101, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111, +111,116,104, 86,105,101,119, 83,116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99, +101, 76,105,110,107, 0, 86,105,101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 83,112, 97, 99,101, 73,112,111, 0, + 98, 68,111,112,101, 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105, +108,101, 83,101,108,101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115, +116, 0,119,109, 79,112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112, +115, 0, 84,114,101,101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73, +109, 97,103,101, 0, 83, 99,111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83, +112, 97, 99,101, 84,101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99, +101, 84,105,109,101, 67, 97, 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83, +112, 97, 99,101, 76,111,103,105, 99, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101, 67,111,110,115,111, +108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 67,108,105,112, 0, 77,111,118,105,101, + 67,108,105,112, 83, 99,111,112,101,115, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,108,101, 0,117,105, + 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,101,116, 83,116, 97, +116,101, 67,111,108,111,114,115, 0,117,105, 80, 97,110,101,108, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84, +104,101,109,101, 83,112, 97, 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, + 98, 65,100,100,111,110, 0, 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 98, 83, 99,114,101,101, +110, 0, 83, 99,114, 86,101,114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112, +101, 0,117,105, 76, 97,121,111,117,116, 0, 83, 99,114, 65,114,101, 97, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101, +103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105, +112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83, +116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105, +112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110, 99,101, 0, 98, 83,111,117,110,100, 0, 77,101,116, 97, + 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,115, 0, 84,114, 97,110,115,102,111,114, +109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,112,101,101,100, 67,111,110,116,114,111, +108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0, 80, 97,114,116, 69,102,102, 0, 80, 97, +114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,116,121, 0, 98, 78,101, 97,114, 83,101, +110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117, 99,104, 83,101,110,115,111,114, 0, 98, + 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,116,121, 83,101,110,115,111,114, 0, 98, + 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,101,110,115,111,114, 0, 98, 67,111,108, +108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,115,111,114, 0, 98, 82, 97,110,100,111, +109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,109, 97,116,117,114,101, 83,101,110,115, +111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,115,111,114, 0, 98, 67,111,110,116,114, +111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0, 98, 69,120,112,114,101,115,115,105,111, +110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,117, 97,116,111,114, 0, 98, 65,100,100, + 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110, 65, 99,116,117, 97,116,111,114, 0, 83, +111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98, 69,100,105,116, 79, 98,106,101, 99, +116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,111,114, 0, 98, 80,114,111,112,101,114, +116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 73,112,111, 65, + 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,114, 0, 98, 67,111,110,115,116,114, 97, +105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117, 97,116,111,114, 0, 98, 82, 97,110,100, +111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,117, 97,116,111,114, 0, 98, 71, 97,109, +101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 84, +119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,101,110,116, 65, 99,116,117, 97,116,111, +114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,116,117,114,101, 65, 99,116,117, 97,116, +111,114, 0, 98, 83,116,101,101,114,105,110,103, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, + 0, 66,111,110,101, 0, 98, 65,114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, + 98, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99, +116,105,111,110, 71,114,111,117,112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97, +110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97, +105,110,116, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110, +115,116,114, 97,105,110,116, 0, 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112, +108,105,110,101, 73, 75, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97, +105,110,116, 0, 98, 82,111,116, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116, +101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97, +105,110,116, 0, 98, 83, 97,109,101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, + 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, + 0, 98, 65, 99,116,105,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110, +115,116,114, 97,105,110,116, 0, 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111, +108,108,111,119, 80, 97,116,104, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110, +115,116,114, 97,105,110,116, 0, 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110, +116, 0, 98, 67,108, 97,109,112, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110, +115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105, +118,111,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110, +116, 0, 98, 82,111,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, + 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, + 98, 83,104,114,105,110,107,119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 84,114, 97, + 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67, 97,109,101,114, 97, 83,111,108,118,101,114, 67,111,110,115,116,114, + 97,105,110,116, 0, 98, 79, 98,106,101, 99,116, 83,111,108,118,101,114, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99, +116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83, +116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, + 80,114,101,118,105,101,119, 0, 98, 78,111,100,101, 0,117,105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, + 98, 78,111,100,101, 84,114,101,101, 69,120,101, 99, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 73,110, +116, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 70,108,111, 97,116, 0, 98, 78,111,100,101, 83,111, 99, +107,101,116, 86, 97,108,117,101, 66,111,111,108,101, 97,110, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, + 86,101, 99,116,111,114, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 86, 97,108,117,101, 82, 71, 66, 65, 0, 78,111,100,101, + 70,114, 97,109,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 67,111,108,111,114, 67,111,114,114,101, 99,116, +105,111,110, 68, 97,116, 97, 0, 78,111,100,101, 67,111,108,111,114, 67,111,114,114,101, 99,116,105,111,110, 0, 78,111,100,101, + 66,111,107,101,104, 73,109, 97,103,101, 0, 78,111,100,101, 66,111,120, 77, 97,115,107, 0, 78,111,100,101, 69,108,108,105,112, +115,101, 77, 97,115,107, 0, 78,111,100,101, 73,109, 97,103,101, 76, 97,121,101,114, 0, 78,111,100,101, 66,108,117,114, 68, 97, +116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,108, 97,116,101,114, 97,108, 66,108, +117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,109, 97,103,101, 70,105,108,101, 0, + 78,111,100,101, 73,109, 97,103,101, 77,117,108,116,105, 70,105,108,101, 0, 78,111,100,101, 73,109, 97,103,101, 77,117,108,116, +105, 70,105,108,101, 83,111, 99,107,101,116, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89, +115, 0, 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100, +101, 86,101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112, +116, 68,105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, + 76,101,110,115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111, +108,111,114,115,112,105,108,108, 0, 78,111,100,101, 84,101,120, 66, 97,115,101, 0, 78,111,100,101, 84,101,120, 83,107,121, 0, + 78,111,100,101, 84,101,120, 73,109, 97,103,101, 0, 78,111,100,101, 84,101,120, 67,104,101, 99,107,101,114, 0, 78,111,100,101, + 84,101,120, 69,110,118,105,114,111,110,109,101,110,116, 0, 78,111,100,101, 84,101,120, 71,114, 97,100,105,101,110,116, 0, 78, +111,100,101, 84,101,120, 78,111,105,115,101, 0, 78,111,100,101, 84,101,120, 86,111,114,111,110,111,105, 0, 78,111,100,101, 84, +101,120, 77,117,115,103,114, 97,118,101, 0, 78,111,100,101, 84,101,120, 87, 97,118,101, 0, 78,111,100,101, 84,101,120, 77, 97, +103,105, 99, 0, 78,111,100,101, 83,104, 97,100,101,114, 65,116,116,114,105, 98,117,116,101, 0, 84,101,120, 78,111,100,101, 79, +117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117, +115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97, 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97, +116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66, +111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,112,114, +105,110,103, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, + 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, + 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105, +110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101, +121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111, +100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97, +109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,116, 76,105,115,116, 0,119,109, 87,105,110,100,111,119, + 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69, +118,101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119,109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, + 77, 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65, 0,119,109, 75,101,121, 77, 97,112, 68,105,102,102, 73, +116,101,109, 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100, +105,102,105,101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105, +111,110, 71,101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111, +100, 95, 69,110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104, +111,110, 0, 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83, +116,101,112,112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, + 97,110,110,101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97, +112, 80, 97,105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, + 99,107, 0, 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100, +101, 0, 73,100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108, +101, 71,111, 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111, +110, 0, 66,111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65, +118,101,114, 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, + 97,116,101, 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 83,112,101, 97,107,101,114, + 0, 77,111,118,105,101, 67,108,105,112, 80,114,111,120,121, 0, 77,111,118,105,101, 67,108,105,112, 67, 97, 99,104,101, 0, 77, +111,118,105,101, 84,114, 97, 99,107,105,110,103, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 84,114, 97, 99,107, 0, + 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 77, 97,114,107,101,114, 0, 77,111,118,105,101, 82,101, 99,111,110,115,116, +114,117, 99,116,101,100, 67, 97,109,101,114, 97, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 67, 97,109,101,114, 97, + 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 83,101,116,116,105,110,103,115, 0, 77,111,118,105,101, 84,114, 97, 99, +107,105,110,103, 83,116, 97, 98,105,108,105,122, 97,116,105,111,110, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 82, +101, 99,111,110,115,116,114,117, 99,116,105,111,110, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 79, 98,106,101, 99, +116, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, 83,116, 97,116,115, 0, 77,111,118,105,101, 84,114, 97, 99,107,105, +110,103, 68,111,112,101,115,104,101,101,116, 67,104, 97,110,110,101,108, 0, 77,111,118,105,101, 84,114, 97, 99,107,105,110,103, + 68,111,112,101,115,104,101,101,116, 0, 68,121,110, 97,109,105, 99, 80, 97,105,110,116, 83,117,114,102, 97, 99,101, 0, 80, 97, +105,110,116, 83,117,114,102, 97, 99,101, 68, 97,116, 97, 0, 0, 84, 76, 69, 78, 1, 0, 1, 0, 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 8, 0, 8, 0, 0, 0, 16, 0, 24, 0, 16, 0, 4, 0, 8, 0, 12, 0, 16, 0, 16, 0, 32, 0,128, 0, 120, 0,144, 8, 0, 0, 40, 0,144, 0,112, 5,112, 0, 36, 0, 56, 0,160, 0,192, 0,224, 0, 96, 0, 40, 0, 48, 0,224, 0, 16, 0,200, 0, 40, 0,216, 11, 48, 5, 0, 0, 0, 0, 0, 0, 56, 1,168, 1,216, 4, 24, 0, 8, 3,200, 0, 0, 0,104, 0, - 64, 1, 56, 4, 80, 0, 24, 1,144, 0, 56, 3, 16, 2, 88, 0, 16, 0,128, 3,152, 0,136, 4, 0, 0,104, 0,104, 0, 0, 1, + 64, 1, 56, 4, 80, 0, 32, 1,144, 0, 56, 3, 16, 2, 88, 0, 16, 0,128, 3,152, 0,136, 4, 0, 0,104, 0,104, 0, 0, 1, 80, 0, 8, 0, 16, 0, 32, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 16, 5, 8, 0, 12, 0, 16, 0, 8, 0, 12, 0, 4, 0, 20, 0, 48, 0, 64, 0, 20, 0, 12, 0, 16, 0, 4, 0, 8, 0, 0, 0,184, 0,160, 1, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 8, 0, 24, 0, 16, 0, 64, 0, 24, 0, 12, 0, 64, 0, 4, 0, 16, 0,112, 0,200, 0,136, 0,192, 0,192, 0,128, 0,192, 0, @@ -10935,8 +10945,8 @@ char datatoc_startup_blend[] = { 144, 0,152, 2,136, 0,192, 0,120, 0,128, 0,224, 4,208, 0,200, 0,112, 0,208, 0,144, 0, 16, 5, 0, 0, 0, 0, 48, 1, 104, 1,160, 1,104, 1,136, 0,104, 0,112, 0,128, 0, 16, 0, 96, 1, 88, 0, 0, 0,200, 0,216, 0,152, 0, 48, 0, 24, 0, 120, 0,152, 0,216, 1, 0, 1,184, 0, 0, 0, 72, 0, 32, 0,176, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 12, 0, 24, 2, - 40, 0,184, 0,152, 0, 64, 0, 72, 0, 32, 0,128, 0, 24, 0, 56, 9, 64, 0, 24, 0, 16, 0, 56, 0,168, 0, 96, 0, 24, 0, - 96, 6, 48, 0, 16, 0,168, 0, 96, 0, 24, 0, 56, 0,120, 0, 24, 0,240, 1, 32, 0, 8, 0, 24, 0, 80, 8, 0, 0, 0, 0, + 40, 0,184, 0,152, 0, 64, 0, 72, 0, 32, 0,128, 0, 24, 0, 56, 9, 64, 0, 24, 0, 16, 0, 56, 0,168, 0, 96, 0, 32, 0, + 96, 6, 56, 0, 16, 0,168, 0,104, 0, 32, 0, 64, 0,120, 0, 24, 0,248, 1, 32, 0, 8, 0, 24, 0, 80, 8, 0, 0, 0, 0, 224, 8,104, 0, 8, 0,112, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 56, 0,144, 0, 64, 0,240, 0,112, 0,248, 0, 240, 0,160, 7,104, 0, 0, 0,168, 0, 0, 0, 24, 1, 16, 0, 16, 0, 40, 33,128, 16, 24, 16,216, 0,160, 2,168, 5, 64, 0, 24, 0,208, 0, 48, 1, 72, 0, 40, 0,136, 1,104, 0, 56, 1, 56, 0, 24, 4, 32, 0,232, 0, 32, 0, 32, 0, 8, 0, 80, 3, @@ -10947,776 +10957,782 @@ char datatoc_startup_blend[] = { 112, 0,148, 0, 32, 0,128, 0, 88, 0, 88, 0,208, 0,140, 0, 4, 0, 24, 0, 16, 0, 8, 0,160, 0, 48, 0, 40, 0, 72, 1, 0, 1, 16, 0, 32, 2, 4, 0, 40, 0,120, 0, 72, 1,120, 0, 56, 0,120, 0,160, 0,112, 0,184, 0, 24, 0, 88, 0, 80, 0, 80, 0, 80, 0, 8, 0, 72, 0,104, 0,104, 0, 80, 0, 80, 0, 24, 0, 88, 0,104, 0, 16, 0,144, 0,128, 0, 88, 0, 28, 0, - 28, 0, 28, 0, 88, 0, 24, 0,160, 0, 16, 0,152, 0, 72, 0,168, 0, 48, 0,208, 0, 56, 0, 16, 0, 88, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 16, 0, 4, 0, 24, 0, 16, 0, 16, 0, 12, 0, 40, 0, 28, 0, 12, 0, 12, 0, 32, 4, 40, 4, 64, 4, 44, 0, - 24, 0, 8, 0,128, 0, 64, 0, 32, 0, 16, 0, 32, 0, 32, 0, 8, 0, 96, 0, 20, 0,200, 3,216, 3,208, 3,200, 3,208, 3, -208, 3,200, 3,208, 3,208, 3,208, 3,208, 3, 64, 0, 64, 0, 12, 0, 56, 0, 24, 0,104, 0, 0, 4, 24, 0, 56, 0, 56, 0, - 20, 0, 16, 0, 64, 0, 40, 0, 32, 0,192, 0, 60, 0, 16, 3,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 40, 0, -192, 0, 40, 0, 88, 1, 0, 1,168, 0, 0, 0, 0, 0, 0, 0,184, 0, 0, 0, 32, 0,136, 0, 0, 0,120, 0, 24, 0, 24, 0, - 16, 0, 24, 0, 8, 0, 16, 0, 24, 0, 20, 0, 20, 0, 56, 0, 24, 2, 40, 1, 16, 0,104, 0, 0, 1, 40, 0,208, 0,104, 0, -112, 0,216, 1, 32, 0,128, 0, 56, 0, 80, 0, 64, 0,104, 0, 72, 0, 64, 0,128, 0, 0, 0, 0, 0,184, 0, 8, 3, 0, 0, - 24, 1,192, 0, 16, 0, 72, 0, 48, 0, 64, 0, 56, 0, 24, 0,128, 0, 0, 1, 48, 0, 32, 0, 16, 6, 0, 0, 83, 84, 82, 67, -211, 1, 0, 0, 12, 0, 2, 0, 12, 0, 0, 0, 12, 0, 1, 0, 13, 0, 3, 0, 13, 0, 0, 0, 13, 0, 1, 0, 11, 0, 2, 0, - 14, 0, 2, 0, 11, 0, 3, 0, 11, 0, 4, 0, 15, 0, 2, 0, 2, 0, 5, 0, 2, 0, 6, 0, 16, 0, 2, 0, 7, 0, 5, 0, - 7, 0, 6, 0, 17, 0, 3, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 18, 0, 4, 0, 4, 0, 8, 0, 4, 0, 9, 0, - 4, 0, 10, 0, 4, 0, 11, 0, 19, 0, 4, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 20, 0, 4, 0, - 11, 0, 12, 0, 14, 0, 13, 0, 4, 0, 14, 0, 4, 0, 15, 0, 21, 0, 10, 0, 21, 0, 0, 0, 21, 0, 1, 0, 0, 0, 16, 0, - 0, 0, 17, 0, 2, 0, 18, 0, 0, 0, 19, 0, 4, 0, 20, 0, 20, 0, 21, 0, 4, 0, 22, 0, 4, 0, 23, 0, 22, 0, 11, 0, - 11, 0, 0, 0, 11, 0, 1, 0, 22, 0, 24, 0, 23, 0, 25, 0, 0, 0, 26, 0, 2, 0, 27, 0, 2, 0, 28, 0, 2, 0, 18, 0, - 4, 0, 29, 0, 4, 0, 30, 0, 21, 0, 31, 0, 23, 0, 6, 0, 22, 0, 32, 0, 22, 0, 33, 0, 24, 0, 34, 0, 0, 0, 35, 0, - 0, 0, 36, 0, 23, 0, 37, 0, 25, 0, 5, 0, 4, 0, 38, 0, 4, 0, 39, 0, 2, 0, 40, 0, 2, 0, 41, 0, 4, 0, 42, 0, - 26, 0, 6, 0, 27, 0, 43, 0, 2, 0, 44, 0, 2, 0, 45, 0, 2, 0, 16, 0, 2, 0, 18, 0, 0, 0, 46, 0, 28, 0, 21, 0, - 28, 0, 0, 0, 28, 0, 1, 0, 29, 0, 47, 0, 30, 0, 48, 0, 19, 0, 49, 0, 19, 0, 50, 0, 2, 0, 44, 0, 2, 0, 45, 0, - 2, 0, 51, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 18, 0, 2, 0, 55, 0, 7, 0, 10, 0, 7, 0, 11, 0, - 4, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0, 7, 0, 59, 0, 26, 0, 60, 0, 31, 0, 7, 0, 22, 0, 32, 0, 14, 0, 61, 0, - 19, 0, 62, 0, 2, 0, 44, 0, 2, 0, 63, 0, 2, 0, 64, 0, 2, 0, 27, 0, 32, 0, 16, 0, 32, 0, 0, 0, 32, 0, 1, 0, - 7, 0, 65, 0, 7, 0, 59, 0, 2, 0, 16, 0, 2, 0, 66, 0, 2, 0, 67, 0, 2, 0, 18, 0, 4, 0, 68, 0, 4, 0, 69, 0, - 11, 0, 2, 0, 7, 0, 70, 0, 0, 0, 19, 0, 0, 0, 71, 0, 7, 0, 72, 0, 7, 0, 73, 0, 33, 0, 15, 0, 22, 0, 32, 0, - 34, 0, 74, 0, 32, 0, 75, 0, 0, 0, 76, 0, 4, 0, 77, 0, 4, 0, 27, 0, 14, 0, 78, 0, 31, 0, 79, 0, 22, 0, 80, 0, - 2, 0, 16, 0, 2, 0, 81, 0, 2, 0, 82, 0, 2, 0, 18, 0, 7, 0, 83, 0, 4, 0, 84, 0, 35, 0, 6, 0, 35, 0, 0, 0, - 35, 0, 1, 0, 0, 0, 85, 0, 0, 0, 86, 0, 4, 0, 22, 0, 4, 0, 87, 0, 36, 0, 10, 0, 36, 0, 0, 0, 36, 0, 1, 0, - 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 90, 0, 4, 0, 66, 0, 4, 0, 13, 0, 4, 0, 91, 0, 0, 0, 92, 0, 0, 0, 93, 0, - 37, 0, 15, 0, 22, 0, 32, 0, 0, 0, 94, 0, 4, 0, 91, 0, 4, 0, 95, 0, 14, 0, 96, 0, 35, 0, 97, 0, 35, 0, 98, 0, - 4, 0, 99, 0, 4, 0,100, 0, 14, 0,101, 0, 0, 0,102, 0, 4, 0,103, 0, 4, 0,104, 0, 11, 0,105, 0, 8, 0,106, 0, - 38, 0, 3, 0, 4, 0,107, 0, 4, 0,108, 0, 11, 0, 2, 0, 39, 0, 20, 0, 22, 0, 32, 0, 34, 0, 74, 0, 0, 0, 16, 0, - 0, 0,109, 0, 2, 0, 18, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0, - 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, 7, 0,120, 0, 31, 0, 79, 0, 27, 0,121, 0, 0, 0,122, 0, - 0, 0,123, 0, 40, 0, 14, 0, 41, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, 4, 0,127, 0, 4, 0,128, 0, 0, 0,129, 0, - 0, 0,130, 0, 0, 0,131, 0, 0, 0, 27, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0,134, 0, 2, 0, 18, 0, 4, 0, 30, 0, - 42, 0, 33, 0, 22, 0, 32, 0, 0, 0, 35, 0, 14, 0,135, 0, 43, 0,136, 0, 44, 0,137, 0, 45, 0,138, 0, 45, 0,139, 0, - 2, 0,140, 0, 2, 0,141, 0, 2, 0,131, 0, 2, 0, 18, 0, 2, 0,142, 0, 2, 0, 16, 0, 4, 0,143, 0, 2, 0,144, 0, - 2, 0,145, 0, 2, 0,146, 0, 2, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0, 4, 0,150, 0, 4, 0,151, 0, 38, 0,152, 0, - 25, 0,153, 0, 7, 0,154, 0, 4, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0, 2, 0,158, 0, 0, 0,159, 0, 0, 0,160, 0, - 7, 0,161, 0, 7, 0,162, 0, 46, 0, 65, 0, 2, 0,163, 0, 2, 0,164, 0, 2, 0,165, 0, 2, 0,166, 0, 27, 0,167, 0, - 47, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0, 0, 0,173, 0, 7, 0,174, 0, 7, 0,175, 0, - 7, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 2, 0,180, 0, 2, 0,181, 0, 2, 0,182, 0, 0, 0,183, 0, - 0, 0,123, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0, 55, 0, 7, 0,189, 0, - 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0, 7, 0,196, 0, 7, 0,197, 0, - 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0, 7, 0,204, 0, 7, 0,205, 0, - 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, - 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0, 7, 0,217, 0, 7, 0,218, 0, 7, 0,219, 0, 7, 0,220, 0, 7, 0,221, 0, - 7, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 48, 0, 15, 0, 0, 0, 35, 0, 11, 0,226, 0, 0, 0,227, 0, - 0, 0,228, 0, 4, 0,229, 0, 4, 0,230, 0, 11, 0,231, 0, 7, 0,232, 0, 7, 0,233, 0, 7, 0,234, 0, 4, 0,235, 0, - 11, 0,236, 0, 11, 0,237, 0, 4, 0,238, 0, 4, 0, 27, 0, 49, 0, 6, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, - 7, 0,239, 0, 7, 0, 65, 0, 4, 0, 62, 0, 50, 0, 5, 0, 2, 0, 18, 0, 2, 0,240, 0, 2, 0, 62, 0, 2, 0,241, 0, - 49, 0,234, 0, 51, 0, 17, 0, 27, 0,167, 0, 42, 0,242, 0, 52, 0,243, 0, 7, 0,244, 0, 7, 0,245, 0, 2, 0, 16, 0, - 2, 0,246, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,247, 0, 4, 0,248, 0, 2, 0,249, 0, 2, 0,250, 0, 4, 0,131, 0, - 4, 0,143, 0, 2, 0,251, 0, 2, 0,252, 0, 53, 0, 25, 0, 2, 0, 18, 0, 2, 0,253, 0, 7, 0,254, 0, 7, 0,255, 0, - 2, 0,142, 0, 2, 0, 0, 1, 4, 0, 1, 1, 4, 0, 2, 1, 27, 0,167, 0, 4, 0, 3, 1, 2, 0, 4, 1, 2, 0, 5, 1, - 11, 0, 6, 1, 7, 0, 7, 1, 7, 0, 8, 1, 2, 0, 9, 1, 2, 0, 10, 1, 2, 0, 11, 1, 2, 0, 12, 1, 7, 0, 13, 1, - 7, 0, 14, 1, 7, 0, 15, 1, 7, 0, 16, 1, 50, 0, 17, 1, 54, 0, 18, 1, 55, 0, 13, 0, 4, 0, 19, 1, 4, 0, 20, 1, - 2, 0, 21, 1, 2, 0, 18, 0, 2, 0, 22, 1, 2, 0, 23, 1, 27, 0,167, 0, 7, 0, 24, 1, 4, 0, 25, 1, 0, 0, 26, 1, - 7, 0, 27, 1, 4, 0, 28, 1, 4, 0,131, 0, 56, 0, 4, 0, 27, 0,167, 0, 0, 0, 29, 1, 4, 0, 30, 1, 4, 0, 27, 0, - 47, 0, 64, 0, 22, 0, 32, 0, 34, 0, 74, 0, 7, 0, 31, 1, 7, 0, 32, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, - 7, 0, 36, 1, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 7, 0, 30, 0, 7, 0, 40, 1, 7, 0, 41, 1, 7, 0, 42, 1, - 7, 0, 43, 1, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, - 7, 0, 51, 1, 2, 0, 52, 1, 2, 0, 53, 1, 2, 0, 54, 1, 2, 0, 55, 1, 2, 0, 56, 1, 2, 0, 57, 1, 2, 0, 58, 1, - 2, 0, 18, 0, 2, 0, 16, 0, 2, 0,246, 0, 7, 0, 59, 1, 7, 0, 60, 1, 7, 0, 61, 1, 7, 0, 62, 1, 4, 0, 63, 1, - 4, 0, 64, 1, 2, 0, 65, 1, 2, 0, 66, 1, 2, 0, 22, 1, 2, 0,129, 0, 4, 0, 22, 0, 4, 0,126, 0, 4, 0,127, 0, - 4, 0,128, 0, 7, 0, 67, 1, 7, 0, 68, 1, 7, 0, 66, 0, 40, 0, 69, 1, 57, 0, 70, 1, 31, 0, 79, 0, 42, 0,242, 0, - 48, 0, 71, 1, 50, 0, 17, 1, 51, 0, 72, 1, 25, 0,153, 0, 53, 0, 73, 1, 55, 0, 74, 1, 56, 0, 75, 1, 0, 0, 76, 1, - 0, 0,123, 0, 58, 0, 13, 0, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0,175, 0, 4, 0, 18, 0, 0, 0,170, 0, 0, 0,171, 0, - 0, 0,172, 0, 0, 0,173, 0, 4, 0, 27, 0, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 27, 0, 43, 0, 59, 0, 9, 0, - 50, 0, 82, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, 4, 0, 18, 0, 7, 0, 83, 1, 7, 0, 84, 1, 4, 0, 85, 1, - 4, 0, 86, 1, 60, 0, 76, 0, 22, 0, 32, 0, 34, 0, 74, 0, 2, 0, 16, 0, 2, 0, 18, 0, 4, 0, 87, 1, 2, 0,178, 0, - 2, 0, 88, 1, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0, 89, 1, 7, 0, 90, 1, 7, 0, 91, 1, - 7, 0, 92, 1, 7, 0, 93, 1, 7, 0, 94, 1, 7, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1, 7, 0, 98, 1, 7, 0, 99, 1, - 54, 0,100, 1, 2, 0,253, 0, 2, 0, 30, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,101, 1, 7, 0,102, 1, 7, 0,103, 1, - 7, 0,104, 1, 7, 0,105, 1, 7, 0,106, 1, 2, 0,107, 1, 2, 0,108, 1, 2, 0,109, 1, 2, 0,110, 1, 0, 0,111, 1, - 0, 0,112, 1, 2, 0,113, 1, 2, 0,114, 1, 2, 0,115, 1, 2, 0,116, 1, 2, 0,117, 1, 7, 0,118, 1, 7, 0,119, 1, - 7, 0,120, 1, 7, 0,121, 1, 2, 0,122, 1, 2, 0,123, 1, 2, 0,124, 1, 2, 0,125, 1, 2, 0,126, 1, 2, 0,127, 1, - 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, 7, 0,135, 1, - 7, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, 2, 0,141, 1, 0, 0,142, 1, 31, 0, 79, 0, - 46, 0,143, 1, 2, 0,144, 1, 2, 0, 76, 1, 0, 0,145, 1, 25, 0,153, 0, 57, 0, 70, 1, 61, 0, 18, 0, 7, 0,146, 1, - 7, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, - 7, 0,155, 1, 2, 0,156, 1, 2, 0,157, 1, 2, 0,158, 1, 2, 0,159, 1, 7, 0,160, 1, 7, 0,161, 1, 7, 0,162, 1, - 7, 0,163, 1, 62, 0, 4, 0, 4, 0, 18, 0, 4, 0,164, 1, 4, 0,165, 1, 4, 0, 66, 0, 63, 0,126, 0, 22, 0, 32, 0, - 34, 0, 74, 0, 2, 0,166, 1, 2, 0, 18, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,167, 1, 7, 0,168, 1, - 7, 0,169, 1, 7, 0,170, 1, 7, 0,171, 1, 7, 0,172, 1, 7, 0,173, 1, 7, 0,174, 1, 7, 0,175, 1, 7, 0,176, 1, - 7, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, - 7, 0,185, 1, 7, 0,186, 1, 61, 0,187, 1, 62, 0,188, 1, 7, 0,189, 1, 7, 0,190, 1, 7, 0,191, 1, 7, 0,192, 1, - 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1, 2, 0,196, 1, 2, 0,197, 1, 2, 0,198, 1, 0, 0,199, 1, 0, 0,200, 1, - 7, 0,201, 1, 7, 0,202, 1, 2, 0,203, 1, 2, 0,204, 1, 7, 0,205, 1, 7, 0,206, 1, 7, 0,207, 1, 7, 0,208, 1, - 2, 0,209, 1, 2, 0,210, 1, 4, 0, 87, 1, 4, 0,211, 1, 2, 0,212, 1, 2, 0,213, 1, 2, 0,214, 1, 2, 0,215, 1, - 7, 0,216, 1, 7, 0,217, 1, 7, 0,218, 1, 7, 0,219, 1, 7, 0,220, 1, 7, 0,221, 1, 7, 0,222, 1, 7, 0,223, 1, - 7, 0,224, 1, 7, 0,225, 1, 0, 0,226, 1, 7, 0,227, 1, 7, 0,228, 1, 7, 0,229, 1, 4, 0,230, 1, 0, 0,231, 1, - 0, 0,124, 1, 0, 0,232, 1, 0, 0, 76, 1, 2, 0,233, 1, 2, 0,234, 1, 2, 0,144, 1, 2, 0,235, 1, 2, 0,236, 1, - 2, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1, 7, 0,242, 1, 2, 0,163, 0, 2, 0,164, 0, - 50, 0,243, 1, 50, 0,244, 1, 0, 0,245, 1, 0, 0,246, 1, 0, 0,247, 1, 0, 0,248, 1, 2, 0,249, 1, 2, 0,250, 1, - 7, 0,251, 1, 7, 0,252, 1, 46, 0,143, 1, 57, 0, 70, 1, 31, 0, 79, 0, 64, 0,253, 1, 25, 0,153, 0, 7, 0,254, 1, - 7, 0,255, 1, 7, 0, 0, 2, 7, 0, 1, 2, 7, 0, 2, 2, 2, 0, 3, 2, 2, 0, 30, 0, 7, 0, 4, 2, 7, 0, 5, 2, - 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 11, 2, 7, 0, 12, 2, 2, 0, 13, 2, - 2, 0, 14, 2, 4, 0, 15, 2, 2, 0, 16, 2, 2, 0, 17, 2, 14, 0, 18, 2, 65, 0, 4, 0, 22, 0, 32, 0, 0, 0, 35, 0, - 66, 0, 2, 0, 38, 0,152, 0, 67, 0, 20, 0, 67, 0, 0, 0, 67, 0, 1, 0, 68, 0, 19, 2, 2, 0, 16, 0, 2, 0, 18, 0, - 2, 0, 20, 2, 2, 0, 21, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 22, 2, 7, 0, 23, 2, 7, 0, 24, 2, - 7, 0, 25, 2, 7, 0, 26, 2, 7, 0, 27, 2, 7, 0, 28, 2, 7, 0, 22, 0, 7, 0, 29, 2, 7, 0, 30, 2, 69, 0, 20, 0, - 22, 0, 32, 0, 34, 0, 74, 0, 68, 0, 19, 2, 14, 0, 31, 2, 14, 0, 32, 2, 14, 0, 33, 2, 31, 0, 79, 0, 63, 0, 34, 2, - 0, 0, 18, 0, 0, 0, 35, 2, 2, 0, 36, 2, 2, 0,177, 0, 2, 0, 27, 0, 7, 0, 77, 1, 7, 0,175, 0, 7, 0, 78, 1, - 7, 0, 37, 2, 7, 0, 38, 2, 7, 0, 39, 2, 67, 0, 40, 2, 30, 0, 11, 0, 7, 0, 41, 2, 7, 0, 42, 2, 7, 0, 43, 2, - 7, 0,255, 0, 2, 0, 53, 0, 0, 0, 44, 2, 0, 0, 45, 2, 0, 0, 46, 2, 0, 0, 47, 2, 0, 0, 48, 2, 0, 0, 49, 2, - 29, 0, 7, 0, 7, 0, 50, 2, 7, 0, 42, 2, 7, 0, 43, 2, 2, 0, 46, 2, 2, 0, 49, 2, 7, 0,255, 0, 7, 0, 27, 0, - 70, 0, 21, 0, 70, 0, 0, 0, 70, 0, 1, 0, 2, 0, 16, 0, 2, 0, 51, 2, 2, 0, 49, 2, 2, 0, 18, 0, 2, 0, 52, 2, - 2, 0, 53, 2, 2, 0, 54, 2, 2, 0, 55, 2, 2, 0, 56, 2, 2, 0, 57, 2, 2, 0, 58, 2, 2, 0, 59, 2, 7, 0, 60, 2, - 7, 0, 61, 2, 29, 0, 47, 0, 30, 0, 48, 0, 2, 0, 62, 2, 2, 0, 63, 2, 4, 0, 64, 2, 71, 0, 5, 0, 2, 0, 65, 2, - 2, 0, 51, 2, 0, 0, 18, 0, 0, 0, 27, 0, 2, 0, 30, 0, 72, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 66, 2, - 7, 0, 67, 2, 73, 0, 4, 0, 14, 0, 68, 2, 74, 0, 69, 2, 4, 0, 70, 2, 0, 0, 93, 0, 75, 0, 70, 0, 22, 0, 32, 0, - 34, 0, 74, 0, 68, 0, 19, 2, 14, 0, 71, 2, 14, 0, 32, 2, 73, 0, 72, 2, 27, 0, 73, 2, 27, 0, 74, 2, 27, 0, 75, 2, - 31, 0, 79, 0, 76, 0, 76, 2, 33, 0, 77, 2, 63, 0, 34, 2, 14, 0, 78, 2, 7, 0, 77, 1, 7, 0,175, 0, 7, 0, 78, 1, - 2, 0, 16, 0, 2, 0,177, 0, 2, 0, 79, 2, 2, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2, 4, 0, 83, 2, 2, 0, 27, 0, - 2, 0, 36, 2, 2, 0, 18, 0, 2, 0, 84, 2, 7, 0, 85, 2, 7, 0, 86, 2, 7, 0, 87, 2, 2, 0, 54, 2, 2, 0, 55, 2, - 2, 0, 88, 2, 2, 0, 89, 2, 4, 0, 90, 2, 11, 0, 91, 2, 2, 0, 22, 0, 2, 0, 96, 0, 2, 0, 65, 0, 2, 0, 92, 2, - 7, 0, 93, 2, 7, 0, 94, 2, 7, 0, 95, 2, 7, 0, 96, 2, 7, 0, 97, 2, 7, 0, 98, 2, 7, 0, 99, 2, 7, 0,100, 2, - 7, 0,101, 2, 7, 0,102, 2, 0, 0,103, 2, 77, 0,104, 2, 78, 0,105, 2, 0, 0,106, 2, 65, 0,107, 2, 65, 0,108, 2, - 65, 0,109, 2, 65, 0,110, 2, 4, 0,111, 2, 7, 0, 83, 0, 4, 0,112, 2, 4, 0,113, 2, 72, 0,114, 2, 4, 0,115, 2, - 4, 0,116, 2, 71, 0,117, 2, 71, 0,118, 2, 7, 0,119, 2, 7, 0,120, 2, 79, 0, 47, 0, 22, 0, 32, 0, 34, 0, 74, 0, - 68, 0, 19, 2, 31, 0, 79, 0, 33, 0, 77, 2, 63, 0, 34, 2, 80, 0,121, 2, 81, 0,122, 2, 82, 0,123, 2, 83, 0,124, 2, - 84, 0,125, 2, 85, 0,126, 2, 86, 0,127, 2, 87, 0,128, 2, 88, 0,129, 2, 89, 0,130, 2, 90, 0,131, 2, 91, 0,132, 2, - 92, 0,133, 2, 93, 0,134, 2, 79, 0,135, 2, 94, 0,136, 2, 95, 0,137, 2, 95, 0,138, 2, 95, 0,139, 2, 95, 0,140, 2, - 95, 0,141, 2, 4, 0, 52, 0, 4, 0,142, 2, 4, 0,143, 2, 4, 0,144, 2, 4, 0,145, 2, 4, 0,146, 2, 4, 0,147, 2, - 7, 0, 77, 1, 7, 0,175, 0, 7, 0, 78, 1, 2, 0,177, 0, 2, 0, 79, 2, 2, 0,148, 2, 2, 0, 18, 0, 2, 0,149, 2, - 2, 0,150, 2, 0, 0,151, 2, 0, 0,152, 2, 2, 0, 36, 2, 96, 0,153, 2, 88, 0, 8, 0, 11, 0,154, 2, 7, 0,155, 2, - 4, 0,156, 2, 0, 0, 18, 0, 0, 0,157, 2, 2, 0, 87, 1, 2, 0,158, 2, 2, 0,159, 2, 86, 0, 7, 0, 4, 0,160, 2, - 4, 0,161, 2, 4, 0,162, 2, 4, 0,163, 2, 2, 0, 51, 2, 0, 0,164, 2, 0, 0, 18, 0, 90, 0, 5, 0, 4, 0,160, 2, - 4, 0,161, 2, 0, 0,165, 2, 0, 0,166, 2, 2, 0, 18, 0, 97, 0, 2, 0, 4, 0,167, 2, 7, 0, 43, 2, 91, 0, 3, 0, - 97, 0,168, 2, 4, 0,169, 2, 4, 0, 18, 0, 89, 0, 4, 0, 7, 0,170, 2, 2, 0,171, 2, 0, 0, 18, 0, 0, 0,166, 2, - 92, 0, 4, 0, 0, 0,239, 0, 0, 0,184, 0, 0, 0,185, 0, 0, 0,186, 0, 81, 0, 5, 0, 4, 0,172, 2, 4, 0,146, 2, - 2, 0, 51, 2, 0, 0, 18, 0, 0, 0, 27, 0, 83, 0, 2, 0, 4, 0,173, 2, 4, 0,174, 2, 82, 0, 6, 0, 42, 0,154, 2, - 0, 0, 18, 0, 0, 0,157, 2, 2, 0, 87, 1, 2, 0,158, 2, 2, 0,159, 2, 84, 0, 2, 0, 7, 0,175, 2, 4, 0, 18, 0, - 85, 0, 4, 0, 0, 0,184, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,239, 0, 93, 0, 1, 0, 7, 0,176, 2, 80, 0, 2, 0, - 4, 0, 17, 2, 4, 0, 16, 0, 87, 0, 7, 0, 7, 0,155, 2, 42, 0,154, 2, 0, 0, 18, 0, 0, 0,157, 2, 2, 0, 87, 1, - 2, 0,158, 2, 2, 0,159, 2, 98, 0, 1, 0, 7, 0,177, 2, 99, 0, 1, 0, 4, 0,178, 2,100, 0, 1, 0, 0, 0,179, 2, -101, 0, 1, 0, 7, 0,155, 2,102, 0, 1, 0, 7, 0,175, 2,103, 0, 4, 0, 4, 0,180, 2, 4, 0,181, 2, 7, 0,182, 2, - 4, 0,183, 2,104, 0, 4, 0, 7, 0,239, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0,105, 0, 1, 0,104, 0,156, 2, -106, 0, 5, 0, 4, 0,184, 2, 4, 0,185, 2, 0, 0, 18, 0, 0, 0, 51, 2, 0, 0,186, 2,107, 0, 2, 0, 4, 0,187, 2, - 4, 0,185, 2,108, 0, 10, 0,108, 0, 0, 0,108, 0, 1, 0,106, 0,188, 2,105, 0,189, 2,107, 0,190, 2, 4, 0, 52, 0, - 4, 0,143, 2, 4, 0,142, 2, 4, 0, 27, 0, 89, 0,191, 2, 96, 0, 14, 0, 14, 0,192, 2, 89, 0,191, 2, 0, 0,193, 2, - 0, 0,194, 2, 0, 0,195, 2, 0, 0,196, 2, 0, 0,197, 2, 0, 0,198, 2, 0, 0,199, 2, 0, 0, 18, 0, 95, 0,137, 2, - 95, 0,139, 2, 2, 0,200, 2, 0, 0,201, 2,109, 0, 1, 0, 4, 0,178, 2,110, 0, 3, 0, 7, 0, 2, 0, 4, 0,181, 2, - 4, 0, 27, 0,111, 0, 9, 0,111, 0, 0, 0,111, 0, 1, 0, 4, 0, 16, 0, 4, 0, 87, 1, 4, 0,202, 2, 4, 0, 27, 0, - 0, 0, 19, 0, 41, 0,124, 0, 0, 0,203, 2,112, 0, 6, 0,111, 0,204, 2, 47, 0,205, 2, 27, 0,206, 2, 0, 0,207, 2, - 4, 0,208, 2, 4, 0,209, 2,113, 0, 7, 0,111, 0,204, 2, 2, 0,210, 2, 2, 0,192, 2, 2, 0,211, 2, 2, 0, 91, 0, - 11, 0,212, 2, 11, 0,213, 2,114, 0, 5, 0,111, 0,204, 2, 27, 0,167, 0, 0, 0, 19, 0, 7, 0,214, 2, 0, 0, 93, 0, -115, 0, 5, 0,111, 0,204, 2, 27, 0,167, 0, 0, 0, 19, 0, 2, 0,215, 2, 0, 0,216, 2,116, 0, 5, 0,111, 0,204, 2, - 7, 0, 89, 0, 7, 0,217, 2, 4, 0,218, 2, 4, 0,219, 2,117, 0, 5, 0,111, 0,204, 2, 27, 0,220, 2, 0, 0, 71, 0, - 4, 0, 87, 1, 4, 0, 18, 0,118, 0, 13, 0,111, 0,204, 2, 27, 0,221, 2, 27, 0,222, 2, 27, 0,223, 2, 27, 0,224, 2, - 7, 0,225, 2, 7, 0,226, 2, 7, 0,217, 2, 7, 0,227, 2, 4, 0,228, 2, 4, 0,229, 2, 4, 0, 91, 0, 4, 0,230, 2, -119, 0, 5, 0,111, 0,204, 2, 2, 0,231, 2, 2, 0, 18, 0, 7, 0,232, 2, 27, 0,233, 2,120, 0, 3, 0,111, 0,204, 2, - 7, 0,234, 2, 4, 0, 91, 0,121, 0, 10, 0,111, 0,204, 2, 7, 0,235, 2, 4, 0,236, 2, 4, 0, 27, 0, 2, 0, 91, 0, - 2, 0,237, 2, 2, 0,238, 2, 2, 0,239, 2, 7, 0,240, 2, 0, 0,241, 2,122, 0, 3, 0,111, 0,204, 2, 7, 0, 27, 0, - 4, 0, 16, 0,123, 0, 6, 0,111, 0,204, 2,124, 0,242, 2,125, 0,243, 2,126, 0,244, 2, 7, 0,245, 2, 4, 0, 16, 0, -127, 0, 11, 0,111, 0,204, 2, 47, 0,205, 2, 27, 0,206, 2, 0, 0,207, 2, 4, 0,208, 2, 4, 0,209, 2, 7, 0,214, 2, - 4, 0,246, 2, 0, 0,241, 2, 7, 0,247, 2, 4, 0, 27, 0,128, 0, 12, 0,111, 0,204, 2, 27, 0,248, 2, 42, 0,249, 2, - 4, 0, 91, 0, 4, 0,250, 2, 7, 0,251, 2, 7, 0,252, 2, 7, 0,253, 2, 7, 0,254, 2, 0, 0,207, 2, 4, 0,208, 2, - 4, 0, 27, 0,129, 0, 3, 0,111, 0,204, 2, 7, 0,255, 2, 4, 0, 0, 3,130, 0, 5, 0,111, 0,204, 2, 7, 0, 1, 3, - 0, 0,241, 2, 2, 0, 18, 0, 2, 0, 2, 3,131, 0, 8, 0,111, 0,204, 2, 27, 0,167, 0, 7, 0, 1, 3, 7, 0,255, 0, - 7, 0,107, 0, 0, 0,241, 2, 2, 0, 18, 0, 2, 0, 16, 0,132, 0, 21, 0,111, 0,204, 2, 47, 0,205, 2, 27, 0,206, 2, - 0, 0,207, 2, 4, 0,208, 2, 4, 0,209, 2, 27, 0, 3, 3, 0, 0,241, 2, 2, 0, 18, 0, 2, 0, 27, 0, 7, 0, 4, 3, - 7, 0, 5, 3, 7, 0, 6, 3, 7, 0, 85, 2, 7, 0, 7, 3, 7, 0, 8, 3, 7, 0, 9, 3, 7, 0, 10, 3, 7, 0, 11, 3, - 7, 0, 12, 3, 7, 0, 66, 0,133, 0, 7, 0,111, 0,204, 2, 2, 0, 13, 3, 2, 0, 14, 3, 4, 0, 30, 0, 27, 0,167, 0, - 7, 0, 15, 3, 0, 0,241, 2,134, 0, 10, 0,111, 0,204, 2, 27, 0,167, 0, 0, 0, 16, 3, 7, 0, 17, 3, 7, 0, 18, 3, - 7, 0, 10, 3, 4, 0, 19, 3, 4, 0, 20, 3, 7, 0, 21, 3, 0, 0, 19, 0,135, 0, 1, 0,111, 0,204, 2,136, 0, 7, 0, -111, 0,204, 2, 41, 0,124, 0,137, 0, 22, 3,138, 0, 23, 3,139, 0, 24, 3,140, 0, 25, 3, 14, 0, 26, 3,141, 0, 13, 0, -111, 0,204, 2, 89, 0, 27, 3, 89, 0, 28, 3, 89, 0, 29, 3, 89, 0, 30, 3, 89, 0, 31, 3, 89, 0, 32, 3, 86, 0, 33, 3, - 4, 0, 34, 3, 4, 0, 35, 3, 7, 0, 36, 3, 7, 0, 37, 3,142, 0, 38, 3,143, 0, 7, 0,111, 0,204, 2, 89, 0, 27, 3, - 89, 0, 39, 3,144, 0, 40, 3,145, 0, 38, 3, 4, 0, 41, 3, 4, 0, 34, 3,146, 0, 4, 0,111, 0,204, 2, 27, 0,167, 0, - 4, 0, 42, 3, 4, 0, 27, 0,147, 0, 2, 0, 4, 0, 43, 3, 7, 0, 43, 2,148, 0, 2, 0, 4, 0,127, 0, 4, 0, 44, 3, -149, 0, 24, 0,111, 0,204, 2, 27, 0,167, 0, 0, 0,241, 2, 2, 0, 45, 3, 2, 0, 18, 0, 2, 0, 87, 1, 2, 0, 27, 0, -147, 0, 46, 3, 4, 0, 47, 3, 7, 0, 48, 3, 4, 0, 52, 0, 4, 0, 49, 3,148, 0, 50, 3,147, 0, 51, 3, 4, 0, 52, 3, - 4, 0, 53, 3, 4, 0, 54, 3, 4, 0, 44, 3, 7, 0, 55, 3, 7, 0, 56, 3, 7, 0, 57, 3, 7, 0, 58, 3, 7, 0, 59, 3, - 11, 0, 60, 3,150, 0, 8, 0,111, 0,204, 2,151, 0, 61, 3,144, 0, 40, 3, 4, 0, 62, 3, 4, 0, 63, 3, 4, 0, 64, 3, - 2, 0, 18, 0, 2, 0, 55, 0,152, 0, 8, 0,111, 0,204, 2, 27, 0, 43, 0, 2, 0, 3, 1, 2, 0, 18, 0, 2, 0,231, 2, - 2, 0, 55, 0, 7, 0, 65, 3, 7, 0, 66, 3,153, 0, 6, 0,111, 0,204, 2, 4, 0, 67, 3, 2, 0, 18, 0, 2, 0, 68, 3, - 7, 0, 69, 3, 0, 0,169, 0,154, 0, 8, 0,111, 0,204, 2, 0, 0, 70, 3, 0, 0, 71, 3, 0, 0,198, 2, 0, 0, 72, 3, - 0, 0, 73, 3, 0, 0, 91, 0, 0, 0,186, 2,155, 0, 3, 0,111, 0,204, 2,156, 0, 74, 3,140, 0, 25, 3,157, 0, 10, 0, -111, 0,204, 2, 27, 0, 75, 3, 27, 0, 76, 3, 0, 0, 77, 3, 7, 0, 78, 3, 2, 0, 79, 3, 2, 0, 80, 3, 0, 0, 81, 3, - 0, 0, 82, 3, 0, 0,216, 2,158, 0, 9, 0,111, 0,204, 2, 27, 0, 83, 3, 0, 0, 77, 3, 7, 0, 84, 3, 7, 0, 85, 3, - 0, 0, 87, 1, 0, 0,231, 2, 0, 0, 86, 3, 0, 0, 27, 0,159, 0, 1, 0,111, 0,204, 2,160, 0, 11, 0,111, 0,204, 2, - 0, 0,241, 2, 7, 0,127, 0, 7, 0, 87, 3, 7, 0, 88, 3, 7, 0, 89, 3, 7, 0, 90, 3, 7, 0, 91, 3, 4, 0, 18, 0, - 2, 0, 92, 3, 2, 0, 93, 3,161, 0, 9, 0,111, 0,204, 2, 27, 0, 94, 3, 4, 0, 95, 3, 4, 0, 96, 3, 4, 0, 97, 3, - 7, 0, 98, 3, 7, 0, 99, 3, 2, 0,231, 2, 2, 0, 18, 0,162, 0, 29, 0,111, 0,204, 2,163, 0,100, 3,164, 0,101, 3, - 4, 0,102, 3, 4, 0,103, 3, 7, 0,104, 3, 7, 0, 9, 3, 7, 0,105, 3, 7, 0,250, 0, 7, 0,106, 3, 7, 0,107, 3, - 7, 0,108, 3, 7, 0,109, 3, 7, 0,110, 3, 7, 0,245, 2, 4, 0,111, 3, 4, 0,112, 3, 0, 0,113, 3, 0, 0,114, 3, - 0, 0,115, 3, 0, 0,116, 3, 0, 0, 18, 0, 0, 0,117, 3, 2, 0,118, 3, 2, 0,119, 3, 4, 0,219, 2, 7, 0,107, 0, - 7, 0,120, 3, 4, 0, 27, 0,165, 0, 15, 0,111, 0,204, 2, 47, 0,205, 2, 27, 0,206, 2, 0, 0,207, 2, 4, 0,208, 2, - 4, 0,209, 2, 27, 0,121, 3, 27, 0,122, 3, 54, 0,100, 1, 0, 0,241, 2, 7, 0,214, 2, 7, 0,123, 3, 0, 0, 18, 0, - 0, 0,253, 0, 0, 0,216, 2,166, 0, 16, 0,111, 0,204, 2, 0, 0,241, 2, 2, 0,124, 3, 2, 0,253, 0, 7, 0,125, 3, - 54, 0,126, 3, 7, 0,127, 3, 7, 0,128, 3, 7, 0,129, 3, 0, 0,130, 3, 4, 0,131, 3, 47, 0,132, 3, 27, 0,133, 3, - 4, 0,134, 3, 0, 0,135, 3, 4, 0,136, 3,167, 0, 16, 0,111, 0,204, 2, 0, 0,137, 3, 0, 0,138, 3, 7, 0,139, 3, - 7, 0,140, 3, 0, 0,141, 3, 0, 0,142, 3, 0, 0,143, 3, 7, 0,129, 3, 0, 0,130, 3, 4, 0,131, 3, 47, 0,132, 3, - 27, 0,133, 3, 4, 0,134, 3, 0, 0,135, 3, 4, 0,136, 3,168, 0, 16, 0,111, 0,204, 2, 0, 0,241, 2, 4, 0,144, 3, - 4, 0,145, 3, 27, 0,146, 3, 7, 0,129, 3, 0, 0,130, 3, 4, 0,131, 3, 47, 0,132, 3, 27, 0,133, 3, 4, 0,134, 3, - 0, 0,135, 3, 7, 0,147, 3, 7, 0,148, 3, 2, 0,253, 0, 2, 0,149, 3,169, 0, 5, 0,111, 0,204, 2,170, 0,150, 3, -171, 0,151, 3, 4, 0, 16, 0, 4, 0, 27, 0,172, 0, 8, 0,111, 0,204, 2, 7, 0,152, 3, 7, 0,153, 3, 7, 0,154, 3, - 0, 0,250, 0, 0, 0, 18, 0, 0, 0, 87, 1, 0, 0, 27, 0,173, 0, 3, 0,174, 0,155, 3, 4, 0, 70, 2, 0, 0, 93, 0, -174, 0, 29, 0, 22, 0, 32, 0, 34, 0, 74, 0, 2, 0, 52, 2, 2, 0, 53, 2, 2, 0,156, 3, 2, 0, 18, 0, 2, 0,157, 3, - 2, 0,158, 3, 2, 0,159, 3, 2, 0, 30, 0, 0, 0,160, 3, 0, 0,161, 3, 0, 0,162, 3, 0, 0,250, 1, 4, 0, 27, 0, - 7, 0,163, 3, 7, 0,164, 3, 7, 0,165, 3, 7, 0,166, 3, 7, 0,167, 3, 7, 0,168, 3, 29, 0,169, 3, 31, 0, 79, 0, - 33, 0, 77, 2, 91, 0,132, 2, 0, 0, 71, 0, 7, 0,170, 3, 7, 0,171, 3,173, 0,172, 3,175, 0, 5, 0,175, 0, 0, 0, -175, 0, 1, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0,123, 0, 68, 0, 3, 0, 7, 0,173, 3, 4, 0, 18, 0, 4, 0, 27, 0, - 27, 0,128, 0, 22, 0, 32, 0, 34, 0, 74, 0,176, 0,174, 3, 2, 0, 16, 0, 2, 0,175, 3, 4, 0,176, 3, 4, 0,177, 3, - 4, 0,178, 3, 0, 0,179, 3, 27, 0, 37, 0, 27, 0,180, 3, 27, 0,181, 3, 27, 0,182, 3, 27, 0,183, 3, 31, 0, 79, 0, - 68, 0, 19, 2,177, 0,184, 3,177, 0,185, 3,178, 0,186, 3, 11, 0, 2, 0,179, 0,187, 3,180, 0,188, 3,181, 0,189, 3, - 14, 0,190, 3, 14, 0,191, 3, 14, 0, 32, 2, 14, 0,192, 3, 14, 0,193, 3, 4, 0, 87, 1, 4, 0,194, 3, 63, 0, 34, 2, - 0, 0,195, 3, 4, 0, 36, 2, 4, 0,196, 3, 7, 0, 77, 1, 7, 0,197, 3, 7, 0,198, 3, 7, 0,175, 0, 7, 0,199, 3, - 7, 0,200, 3, 7, 0, 78, 1, 7, 0,201, 3, 7, 0, 22, 2, 7, 0,202, 3, 7, 0,203, 3, 7, 0,204, 3, 7, 0,205, 3, - 7, 0,206, 3, 7, 0,207, 3, 7, 0, 17, 3, 7, 0,208, 3, 7, 0,244, 0, 7, 0,209, 3, 4, 0,210, 3, 4, 0,211, 3, - 2, 0, 18, 0, 2, 0,212, 3, 2, 0,213, 3, 2, 0,214, 3, 2, 0,215, 3, 2, 0,216, 3, 2, 0,217, 3, 2, 0,218, 3, - 2, 0,219, 3, 0, 0,220, 3, 0, 0,221, 3, 4, 0,222, 3, 4, 0,223, 3, 4, 0,224, 3, 4, 0,225, 3, 7, 0,226, 3, - 7, 0, 83, 0, 7, 0,227, 3, 7, 0,228, 3, 7, 0,229, 3, 7, 0,230, 3, 7, 0,231, 3, 7, 0,219, 0, 7, 0,232, 3, - 7, 0,233, 3, 7, 0,234, 3, 7, 0,235, 3, 7, 0,236, 3, 2, 0,237, 3, 0, 0,238, 3, 0, 0,239, 3, 0, 0,240, 3, - 0, 0,241, 3, 0, 0,109, 0, 0, 0,242, 3, 7, 0,243, 3, 7, 0,244, 3, 14, 0,245, 3, 14, 0,246, 3, 14, 0,247, 3, - 14, 0,248, 3, 7, 0,249, 3, 2, 0, 17, 2, 2, 0,250, 3, 7, 0,156, 2, 4, 0,251, 3, 4, 0,252, 3,182, 0,253, 3, - 2, 0,254, 3, 2, 0,251, 0, 7, 0,255, 3, 14, 0, 0, 4, 14, 0, 1, 4, 14, 0, 2, 4, 14, 0, 3, 4,183, 0, 73, 1, -184, 0, 4, 4, 64, 0, 5, 4, 0, 0, 6, 4, 0, 0, 7, 4, 2, 0, 70, 2, 7, 0,148, 2,156, 0, 8, 4,144, 0, 9, 4, -144, 0, 10, 4, 10, 0, 11, 4, 10, 0, 12, 4, 4, 0, 13, 4, 4, 0, 14, 4, 14, 0, 15, 4, 14, 0, 16, 4, 14, 0, 17, 4, - 7, 0, 18, 4,185, 0, 14, 0,185, 0, 0, 0,185, 0, 1, 0, 27, 0, 37, 0, 7, 0, 17, 3, 7, 0, 79, 1, 7, 0, 18, 3, - 7, 0, 10, 3, 0, 0, 19, 0, 4, 0, 19, 3, 4, 0, 20, 3, 4, 0, 19, 4, 2, 0, 16, 0, 2, 0, 20, 4, 7, 0, 21, 3, -186, 0, 12, 0,186, 0, 0, 0,186, 0, 1, 0, 27, 0, 43, 0, 4, 0, 21, 4, 4, 0, 17, 2, 7, 0, 79, 1, 7, 0, 22, 4, - 7, 0, 23, 4, 7, 0,175, 2, 2, 0, 16, 0, 0, 0, 24, 4, 0, 0, 25, 4,183, 0, 40, 0, 4, 0, 18, 0, 2, 0, 26, 4, - 2, 0, 27, 4, 2, 0, 10, 3, 2, 0, 28, 4, 2, 0, 29, 4, 2, 0, 30, 4, 2, 0, 31, 4, 2, 0, 32, 4, 7, 0, 33, 4, - 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4, 7, 0, 39, 4, 7, 0, 40, 4, 7, 0, 41, 4, - 7, 0, 42, 4, 7, 0, 43, 4, 7, 0, 44, 4, 7, 0, 45, 4, 7, 0, 46, 4, 7, 0, 47, 4, 7, 0, 48, 4, 7, 0, 49, 4, - 7, 0, 50, 4, 7, 0, 51, 4, 7, 0, 52, 4, 7, 0, 53, 4, 7, 0, 54, 4, 7, 0, 55, 4, 7, 0, 56, 4, 7, 0, 57, 4, - 7, 0, 58, 4, 7, 0, 59, 4, 47, 0,168, 0,187, 0, 60, 4, 7, 0, 61, 4, 4, 0,219, 2,188, 0, 5, 0, 64, 0,253, 1, - 7, 0, 62, 4, 7, 0, 63, 4, 2, 0, 18, 0, 2, 0, 64, 4,189, 0, 5, 0,189, 0, 0, 0,189, 0, 1, 0, 4, 0, 16, 0, - 4, 0, 65, 4, 11, 0, 2, 0,190, 0, 9, 0,190, 0, 0, 0,190, 0, 1, 0, 4, 0, 66, 4, 4, 0, 67, 4, 4, 0, 68, 4, - 4, 0, 18, 0, 11, 0, 69, 4, 11, 0, 70, 4, 14, 0, 71, 4,140, 0, 23, 0,140, 0, 0, 0,140, 0, 1, 0, 4, 0, 18, 0, - 4, 0, 72, 4, 4, 0, 73, 4, 4, 0, 74, 4, 4, 0, 75, 4, 4, 0, 76, 4, 4, 0, 77, 4, 4, 0, 78, 4, 4, 0, 27, 0, - 4, 0, 67, 4, 4, 0, 17, 2, 2, 0, 79, 4, 2, 0, 55, 0, 0, 0, 19, 0, 0, 0, 80, 4, 0, 0, 81, 4, 0, 0, 82, 4, - 0, 0, 83, 4, 14, 0, 84, 4,191, 0, 85, 4, 11, 0, 86, 4,192, 0, 1, 0, 7, 0, 50, 2,182, 0, 30, 0, 4, 0, 18, 0, - 7, 0, 87, 4, 7, 0, 88, 4, 7, 0, 89, 4, 4, 0, 90, 4, 4, 0, 91, 4, 4, 0, 92, 4, 4, 0, 93, 4, 7, 0, 94, 4, - 7, 0, 95, 4, 7, 0, 96, 4, 7, 0, 97, 4, 7, 0, 98, 4, 7, 0, 99, 4, 7, 0,100, 4, 7, 0,101, 4, 7, 0,102, 4, - 7, 0,103, 4, 7, 0,104, 4, 7, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 7, 0,108, 4, 7, 0,109, 4, 7, 0,110, 4, - 7, 0,111, 4, 4, 0,112, 4, 4, 0,113, 4, 7, 0,114, 4, 7, 0,232, 3,184, 0, 54, 0, 4, 0, 67, 4, 4, 0,115, 4, -193, 0,116, 4,194, 0,117, 4, 0, 0, 27, 0, 0, 0,118, 4, 2, 0,119, 4, 7, 0,120, 4, 0, 0,121, 4, 7, 0,122, 4, - 7, 0,123, 4, 7, 0,124, 4, 7, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, - 2, 0,131, 4, 0, 0,132, 4, 2, 0,133, 4, 7, 0,134, 4, 7, 0,135, 4, 0, 0,136, 4, 4, 0,128, 0, 4, 0,137, 4, - 4, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4,192, 0,141, 4, 4, 0,142, 4, 4, 0, 81, 0, 7, 0,143, 4, 7, 0,144, 4, - 7, 0,145, 4, 7, 0,146, 4, 2, 0,147, 4, 2, 0,148, 4, 2, 0,149, 4, 2, 0,150, 4, 2, 0,151, 4, 2, 0,152, 4, - 2, 0,153, 4, 2, 0,154, 4,195, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4,140, 0,158, 4, 14, 0, 26, 3,188, 0,159, 4, - 7, 0,160, 4, 7, 0,161, 4, 7, 0,162, 4, 4, 0,163, 4,196, 0, 1, 0, 7, 0,164, 4,156, 0, 52, 0,155, 0,165, 4, - 2, 0, 16, 0, 2, 0,166, 4, 2, 0,167, 4, 2, 0,168, 4, 7, 0,169, 4, 2, 0,170, 4, 2, 0,171, 4, 7, 0,172, 4, - 2, 0,173, 4, 2, 0,174, 4, 7, 0,175, 4, 7, 0,176, 4, 7, 0,177, 4, 4, 0,178, 4, 4, 0,179, 4, 4, 0,180, 4, - 4, 0, 27, 0, 7, 0,181, 4, 4, 0,182, 4, 7, 0,183, 4, 7, 0,184, 4, 7, 0,185, 4, 79, 0,186, 4, 79, 0,187, 4, - 0, 0,188, 4, 7, 0,189, 4, 7, 0,190, 4, 31, 0, 79, 0, 2, 0,191, 4, 0, 0,192, 4, 0, 0,193, 4, 7, 0,194, 4, - 4, 0,195, 4, 7, 0,196, 4, 7, 0,197, 4, 4, 0,198, 4, 4, 0, 18, 0, 7, 0,199, 4, 7, 0,200, 4, 7, 0,201, 4, -196, 0,202, 4, 4, 0, 52, 0, 7, 0,203, 4, 7, 0,204, 4, 7, 0,205, 4, 7, 0,206, 4, 7, 0,207, 4, 7, 0,208, 4, - 7, 0,209, 4, 4, 0,210, 4, 7, 0,211, 4,197, 0, 78, 0, 22, 0, 32, 0, 34, 0, 74, 0, 2, 0,178, 0, 2, 0, 88, 1, - 2, 0,124, 1, 2, 0,212, 4, 7, 0,213, 4, 7, 0,214, 4, 7, 0,215, 4, 7, 0,216, 4, 7, 0,217, 4, 7, 0,218, 4, - 7, 0,173, 1, 7, 0,175, 1, 7, 0,174, 1, 7, 0, 30, 0, 4, 0,219, 4, 7, 0,220, 4, 7, 0,221, 4, 7, 0,222, 4, - 7, 0,223, 4, 7, 0,224, 4, 7, 0,225, 4, 7, 0,226, 4, 2, 0,227, 4, 2, 0, 87, 1, 2, 0,228, 4, 2, 0,229, 4, - 2, 0,230, 4, 2, 0,231, 4, 2, 0,232, 4, 2, 0,233, 4, 7, 0,234, 4, 7, 0,235, 4, 7, 0,236, 4, 7, 0,237, 4, - 7, 0,238, 4, 7, 0,239, 4, 7, 0,240, 4, 7, 0,241, 4, 7, 0,242, 4, 7, 0,243, 4, 7, 0,244, 4, 7, 0,245, 4, - 2, 0,246, 4, 2, 0,247, 4, 2, 0,248, 4, 2, 0,249, 4, 7, 0,250, 4, 7, 0,251, 4, 7, 0,252, 4, 7, 0,253, 4, - 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 7, 0, 2, 5, 7, 0, 3, 5, 7, 0, 4, 5, 7, 0, 5, 5, - 7, 0, 6, 5, 7, 0, 7, 5, 7, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, - 2, 0, 18, 0, 7, 0, 14, 5, 7, 0, 15, 5, 31, 0, 79, 0, 46, 0,143, 1, 2, 0,144, 1, 2, 0, 76, 1, 2, 0,186, 2, - 25, 0,153, 0, 57, 0, 70, 1,198, 0, 8, 0,198, 0, 0, 0,198, 0, 1, 0, 4, 0,210, 3, 4, 0, 16, 5, 4, 0, 18, 0, - 2, 0, 17, 5, 2, 0, 18, 5, 27, 0,167, 0,199, 0, 13, 0, 11, 0, 19, 5, 11, 0, 20, 5, 4, 0, 21, 5, 4, 0, 22, 5, - 4, 0, 23, 5, 4, 0, 24, 5, 4, 0, 25, 5, 4, 0, 26, 5, 4, 0, 27, 5, 4, 0, 28, 5, 4, 0, 29, 5, 4, 0, 27, 0, - 0, 0, 30, 5,200, 0, 5, 0, 11, 0, 31, 5, 11, 0, 32, 5, 4, 0, 33, 5, 4, 0, 30, 0, 0, 0, 34, 5,201, 0, 17, 0, - 4, 0, 35, 5, 4, 0, 36, 5, 4, 0, 37, 5, 4, 0, 38, 5, 4, 0, 39, 5, 4, 0, 40, 5, 4, 0, 41, 5, 4, 0, 42, 5, - 4, 0, 43, 5, 4, 0, 44, 5, 4, 0, 45, 5, 4, 0, 46, 5, 2, 0, 47, 5, 2, 0, 48, 5, 4, 0, 49, 5, 4, 0, 50, 5, - 4, 0, 66, 0,202, 0, 17, 0, 4, 0, 16, 0, 4, 0, 37, 5, 4, 0, 51, 5, 4, 0, 52, 5, 4, 0, 53, 5, 4, 0, 54, 5, - 4, 0, 55, 5, 4, 0, 56, 5, 7, 0, 57, 5, 4, 0, 58, 5, 4, 0, 91, 0, 4, 0, 59, 5, 4, 0, 60, 5, 4, 0, 61, 5, - 4, 0, 62, 5, 4, 0, 63, 5, 21, 0, 31, 0,203, 0, 9, 0, 4, 0, 64, 5, 7, 0, 65, 5, 7, 0, 66, 5, 7, 0, 67, 5, - 4, 0, 68, 5, 2, 0, 18, 0, 2, 0, 27, 0, 7, 0, 89, 4, 7, 0, 30, 0,204, 0, 13, 0,204, 0, 0, 0,204, 0, 1, 0, - 0, 0, 19, 0, 63, 0, 69, 5, 64, 0, 70, 5, 4, 0,210, 3, 4, 0, 71, 5, 4, 0, 72, 5, 4, 0, 73, 5, 4, 0, 74, 5, - 4, 0, 75, 5, 4, 0, 76, 5, 4, 0, 27, 0,205, 0, 13, 0, 0, 0, 77, 5, 0, 0,250, 0, 0, 0, 78, 5, 0, 0, 18, 0, - 0, 0, 79, 5, 0, 0, 80, 5, 0, 0, 81, 5, 0, 0, 82, 5, 2, 0, 83, 5, 2, 0, 84, 5, 7, 0, 85, 5, 0, 0, 86, 5, - 0, 0,123, 0,206, 0,106, 0,205, 0, 87, 5,199, 0, 88, 5,200, 0, 89, 5,201, 0, 90, 5,202, 0, 91, 5, 4, 0, 41, 3, - 4, 0,128, 0, 4, 0,137, 4, 7, 0, 92, 5, 4, 0, 93, 5, 4, 0, 94, 5, 4, 0, 95, 5, 4, 0, 96, 5, 2, 0, 18, 0, - 2, 0, 97, 5, 7, 0, 98, 5, 7, 0, 99, 5, 7, 0,100, 5, 7, 0,101, 5, 7, 0,102, 5, 2, 0,103, 5, 2, 0,104, 5, - 2, 0,105, 5, 2, 0,106, 5, 2, 0,250, 0, 2, 0,107, 5, 4, 0,108, 5, 2, 0,109, 5, 2, 0,110, 5, 2, 0,110, 1, - 2, 0,107, 0, 2, 0,111, 5, 2, 0,112, 5, 2, 0,113, 5, 2, 0,114, 5, 2, 0,115, 5, 2, 0, 78, 5, 2, 0, 77, 5, - 2, 0,116, 5, 2, 0, 79, 5, 2, 0,117, 5, 4, 0,118, 5, 4, 0, 87, 1, 4, 0,119, 5, 2, 0,120, 5, 2, 0, 66, 0, - 2, 0,121, 5, 2, 0,122, 5, 2, 0,123, 5, 2, 0,124, 5, 2, 0,125, 5, 2, 0,126, 5, 19, 0,127, 5, 19, 0,128, 5, - 18, 0,129, 5, 14, 0,130, 5, 2, 0,131, 5, 2, 0,132, 5, 7, 0,133, 5, 7, 0,134, 5, 7, 0,135, 5, 7, 0,136, 5, - 4, 0,137, 5, 7, 0,138, 5, 7, 0,139, 5, 7, 0,140, 5, 7, 0,141, 5, 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, - 2, 0,145, 5, 2, 0,146, 5, 2, 0,147, 5, 7, 0,148, 5, 7, 0,149, 5, 7, 0,150, 5, 0, 0,151, 5, 4, 0,152, 5, - 2, 0,153, 5, 2, 0,250, 1, 0, 0,154, 5, 7, 0,155, 5, 7, 0,156, 5, 0, 0,157, 5, 0, 0,158, 5, 0, 0,159, 5, - 0, 0,160, 5, 4, 0,161, 5, 2, 0,162, 5, 2, 0,163, 5, 7, 0,164, 5, 7, 0,165, 5, 2, 0,166, 5, 2, 0,167, 5, - 7, 0,168, 5, 2, 0,169, 5, 2, 0,170, 5, 4, 0,171, 5, 2, 0,172, 5, 2, 0,173, 5, 2, 0,174, 5, 2, 0,175, 5, - 7, 0,176, 5, 7, 0, 30, 0, 37, 0,177, 5, 0, 0,178, 5,207, 0, 9, 0,207, 0, 0, 0,207, 0, 1, 0, 0, 0,179, 5, - 2, 0,180, 5, 2, 0,181, 5, 2, 0,182, 5, 2, 0, 66, 0, 7, 0,183, 5, 7, 0, 30, 0,208, 0, 7, 0, 2, 0,236, 2, - 2, 0, 87, 1, 2, 0, 99, 3, 2, 0,184, 5, 7, 0,185, 5, 7, 0, 30, 0, 37, 0,186, 5,209, 0, 5, 0, 7, 0,187, 5, - 0, 0, 16, 0, 0, 0, 66, 0, 0, 0, 30, 0, 0, 0,250, 1,210, 0, 15, 0, 7, 0,188, 5, 7, 0,189, 5, 7, 0,190, 5, - 7, 0,191, 5, 7, 0,192, 5, 7, 0,193, 5, 7, 0,194, 5, 7, 0,195, 5, 7, 0,196, 5, 7, 0,197, 5, 4, 0,198, 5, - 7, 0,199, 5, 7, 0,200, 5, 2, 0, 66, 0, 2, 0, 30, 0,211, 0, 32, 0,209, 0,201, 5, 2, 0,202, 5, 2, 0,104, 5, - 2, 0,105, 5, 2, 0,106, 5, 2, 0,250, 0, 2, 0,107, 5, 2, 0,203, 5, 2, 0,204, 5, 2, 0,205, 5, 2, 0,206, 5, -208, 0,207, 5, 2, 0,208, 5, 2, 0,109, 5, 7, 0,209, 5,210, 0,210, 5, 7, 0,225, 4, 7, 0,226, 4, 4, 0, 18, 0, - 2, 0, 87, 1, 2, 0,211, 5, 2, 0,228, 4, 2, 0,229, 4, 2, 0,212, 5, 2, 0, 27, 0, 2, 0,230, 4, 2, 0,231, 4, - 2, 0,232, 4, 2, 0,233, 4, 2, 0,213, 5, 2, 0, 66, 0, 7, 0,214, 5,212, 0, 6, 0,212, 0, 0, 0,212, 0, 1, 0, - 4, 0, 66, 4, 0, 0, 19, 0, 4, 0, 18, 0, 27, 0,215, 5,213, 0, 4, 0,214, 0,151, 3, 11, 0,216, 5, 0, 0,217, 5, - 4, 0, 91, 0,215, 0, 8, 0,213, 0,218, 5, 2, 0, 18, 0, 2, 0, 27, 0, 2, 0,219, 5, 2, 0,220, 5, 2, 0,221, 5, - 4, 0, 66, 0, 11, 0,222, 5,216, 0, 6, 0, 2, 0,107, 0, 2, 0, 72, 4, 2, 0,223, 5, 2, 0,230, 2, 4, 0, 18, 0, - 7, 0,214, 2,217, 0, 14, 0, 2, 0, 18, 0, 2, 0,224, 5, 2, 0,225, 5, 2, 0,226, 5,216, 0,227, 5, 11, 0,222, 5, - 7, 0,228, 5, 7, 0, 55, 0, 4, 0,229, 5, 4, 0,230, 5, 4, 0,231, 5, 4, 0,232, 5, 41, 0,124, 0, 27, 0,167, 0, -218, 0, 14, 0,213, 0,218, 5, 4, 0, 91, 0, 4, 0,233, 5, 7, 0,234, 5, 7, 0,235, 5, 7, 0,236, 5, 4, 0,237, 5, - 4, 0,238, 5, 7, 0,239, 5, 7, 0,240, 5, 4, 0,241, 5, 7, 0,242, 5, 7, 0,243, 5, 4, 0, 27, 0,219, 0, 1, 0, -213, 0,218, 5,220, 0, 7, 0,213, 0,218, 5, 2, 0, 18, 0, 2, 0, 27, 0, 4, 0,240, 0, 4, 0,244, 5, 91, 0,245, 5, - 11, 0,222, 5,221, 0, 5, 0,221, 0, 0, 0,221, 0, 1, 0, 0, 0, 19, 0, 7, 0,246, 5, 4, 0, 27, 0,222, 0, 6, 0, - 4, 0,107, 0, 7, 0,247, 5, 7, 0,181, 1, 7, 0, 43, 2, 4, 0, 18, 0, 4, 0, 27, 0,223, 0, 85, 0,220, 0,248, 5, -220, 0,249, 5,218, 0,174, 3,219, 0,250, 5, 7, 0,251, 5, 2, 0,252, 5, 2, 0,250, 1, 7, 0,253, 5, 7, 0,254, 5, - 2, 0, 72, 4, 2, 0,255, 5, 7, 0, 0, 6, 7, 0, 1, 6, 7, 0, 2, 6, 2, 0, 3, 6, 2, 0,229, 5, 2, 0, 4, 6, - 2, 0, 5, 6, 2, 0, 6, 6, 2, 0, 7, 6, 7, 0, 8, 6, 7, 0, 9, 6, 7, 0, 10, 6, 2, 0, 11, 6, 2, 0, 12, 6, - 2, 0, 13, 6, 2, 0, 14, 6, 2, 0, 15, 6, 2, 0, 16, 6, 2, 0, 17, 6, 2, 0, 18, 6,215, 0, 19, 6,217, 0, 20, 6, - 7, 0, 21, 6, 7, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6, 2, 0, 25, 6, 0, 0, 26, 6, 0, 0, 27, 6, 2, 0, 28, 6, - 7, 0, 29, 6, 7, 0, 30, 6, 7, 0, 31, 6, 7, 0, 32, 6, 7, 0, 33, 6, 7, 0, 34, 6, 7, 0, 35, 6, 7, 0, 36, 6, - 7, 0, 37, 6, 7, 0, 38, 6, 2, 0, 39, 6, 0, 0, 40, 6, 0, 0, 41, 6, 0, 0, 42, 6, 0, 0, 43, 6, 27, 0, 44, 6, - 0, 0, 45, 6, 0, 0, 46, 6, 0, 0, 47, 6, 0, 0, 48, 6, 0, 0, 49, 6, 0, 0, 50, 6, 0, 0, 51, 6, 0, 0, 52, 6, - 0, 0, 53, 6, 0, 0, 54, 6, 2, 0, 55, 6, 2, 0, 56, 6, 2, 0, 57, 6, 2, 0, 58, 6, 0, 0, 59, 6, 0, 0, 60, 6, - 0, 0, 61, 6, 0, 0, 62, 6, 4, 0, 63, 6, 4, 0, 64, 6, 4, 0, 65, 6, 4, 0, 66, 6, 2, 0, 67, 6, 2, 0, 66, 0, - 4, 0, 68, 6, 7, 0, 69, 6, 7, 0, 70, 6,222, 0, 71, 6,224, 0, 8, 0, 4, 0, 72, 6, 4, 0, 73, 6, 4, 0, 74, 6, - 4, 0, 75, 6, 4, 0, 76, 6, 4, 0, 77, 6, 4, 0, 52, 0, 4, 0,143, 2,225, 0, 4, 0, 7, 0, 78, 6, 0, 0, 79, 6, - 0, 0, 80, 6, 2, 0, 18, 0,226, 0, 4, 0, 7, 0, 81, 6, 4, 0, 18, 0, 4, 0, 82, 6, 4, 0, 55, 0, 41, 0, 46, 0, - 22, 0, 32, 0, 34, 0, 74, 0, 27, 0,215, 5,197, 0, 83, 6, 41, 0, 84, 6, 14, 0, 85, 6,198, 0, 86, 6, 27, 0, 87, 6, - 7, 0, 88, 6, 7, 0, 89, 6, 7, 0, 90, 6, 7, 0, 91, 6, 4, 0,210, 3, 4, 0, 92, 6, 4, 0, 93, 6, 2, 0, 18, 0, - 2, 0, 76, 1, 57, 0, 70, 1,227, 0, 94, 6,223, 0, 95, 6,228, 0, 96, 6,206, 0,184, 0,203, 0, 97, 6, 14, 0,101, 0, - 14, 0, 98, 6, 11, 0, 99, 6, 11, 0,100, 6, 11, 0,101, 6, 11, 0,102, 6, 11, 0,103, 6,229, 0,104, 6, 2, 0,105, 6, - 2, 0,106, 6, 2, 0,251, 0, 2, 0,211, 3, 4, 0,221, 3, 4, 0,107, 6, 14, 0,108, 6,209, 0,201, 5,211, 0,109, 6, -225, 0,110, 6,179, 0,187, 3,226, 0,111, 6,230, 0,112, 6, 10, 0, 12, 4, 10, 0,113, 6,231, 0, 14, 0,231, 0, 0, 0, -231, 0, 1, 0, 42, 0,242, 0, 40, 0, 69, 1,230, 0,112, 6,232, 0,114, 6, 7, 0,100, 2, 7, 0,101, 2, 7, 0,107, 0, - 7, 0,115, 6, 2, 0,116, 6, 2, 0, 18, 0, 2, 0,142, 0, 2, 0, 27, 0,233, 0, 39, 0, 7, 0,117, 6, 7, 0,118, 6, - 7, 0,119, 6, 7, 0,120, 6, 7, 0,121, 6, 7, 0,122, 6, 7, 0,123, 6, 7, 0,124, 6, 7, 0,125, 6, 68, 0,126, 6, -179, 0,187, 3,233, 0,127, 6,234, 0,128, 6,235, 0,129, 6,236, 0,130, 6,237, 0,131, 6,238, 0,132, 6, 7, 0,133, 6, - 7, 0,134, 6, 7, 0, 94, 1, 7, 0,135, 6, 7, 0,136, 6, 7, 0,137, 6, 7, 0,138, 6, 7, 0,174, 0, 7, 0,139, 6, - 0, 0,140, 6, 0, 0,141, 6, 0, 0,116, 6, 0, 0,142, 6, 2, 0,143, 6, 2, 0,144, 6, 7, 0,145, 6, 2, 0,146, 6, - 2, 0,147, 6, 7, 0,148, 6, 7, 0,149, 6, 7, 0,150, 6, 7, 0,151, 6,239, 0, 51, 0,240, 0, 0, 0,240, 0, 1, 0, - 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6, 7, 0,134, 6, 7, 0, 94, 1, 7, 0,156, 6, 2, 0,157, 6, - 0, 0,216, 2, 4, 0,158, 6, 2, 0,141, 6, 2, 0,116, 6, 27, 0,215, 5, 27, 0,159, 6, 14, 0,160, 6,231, 0,161, 6, -239, 0,127, 6, 0, 0,162, 6, 4, 0,210, 3, 4, 0, 92, 6, 2, 0,163, 6, 2, 0,164, 6, 2, 0,165, 6, 2, 0,166, 6, - 2, 0, 18, 0, 2, 0, 35, 2, 7, 0,113, 0, 7, 0,167, 6, 7, 0,168, 6, 7, 0,169, 6, 7, 0,174, 0, 7, 0, 88, 6, - 2, 0,170, 6, 2, 0,171, 6, 2, 0,172, 6, 0, 0,173, 6, 0, 0,174, 6, 0, 0,175, 6, 0, 0,176, 6, 0, 0,177, 6, - 14, 0,178, 6, 14, 0,179, 6, 14, 0,180, 6, 2, 0,181, 6, 2, 0,157, 2, 2, 0,182, 6, 0, 0,183, 6, 11, 0,184, 6, -179, 0,187, 3,241, 0, 24, 0, 19, 0,240, 0, 19, 0, 62, 0, 18, 0,185, 6, 18, 0,186, 6, 18, 0,187, 6, 7, 0,188, 6, - 7, 0,189, 6, 7, 0,190, 6, 7, 0,191, 6, 2, 0,192, 6, 2, 0,193, 6, 2, 0,194, 6, 2, 0,195, 6, 2, 0,196, 6, - 2, 0, 18, 0, 2, 0,197, 6, 2, 0,198, 6, 2, 0,199, 6, 2, 0,200, 6, 2, 0,201, 6, 2, 0,166, 6, 7, 0,202, 6, - 4, 0,203, 6, 4, 0,204, 6,240, 0, 6, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, - 2, 0,155, 6,242, 0, 8, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6, - 0, 0,205, 6, 0, 0,123, 0,243, 0, 14, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, - 2, 0,155, 6,241, 0,206, 6,244, 0,207, 6, 14, 0,208, 6, 2, 0, 87, 1, 2, 0,209, 6, 4, 0, 18, 0, 7, 0,210, 6, - 4, 0,166, 6,245, 0, 21, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6, -241, 0,206, 6, 2, 0,211, 6, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, 2, 0,197, 6, 2, 0,215, 6, 2, 0,216, 6, - 0, 0, 18, 0, 0, 0, 27, 0, 11, 0, 76, 2, 4, 0,217, 6, 4, 0,218, 6, 22, 0,219, 6, 11, 0,220, 6,246, 0, 18, 0, -240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6,241, 0,206, 6, 7, 0,100, 2, - 7, 0,101, 2, 2, 0,211, 6, 2, 0,221, 6, 2, 0,222, 6, 2, 0,223, 6, 4, 0, 18, 0, 7, 0,224, 6, 4, 0,116, 6, - 4, 0, 27, 0,179, 0,187, 3,247, 0, 16, 0, 0, 0,225, 6, 0, 0,226, 6, 0, 0,227, 6, 0, 0,228, 6, 0, 0,229, 6, - 0, 0,230, 6, 4, 0,231, 6, 4, 0,232, 6, 4, 0,233, 6, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0,234, 6, 2, 0,235, 6, - 2, 0,193, 1, 2, 0,236, 6, 0, 0,237, 6,248, 0, 16, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, - 4, 0,238, 6,247, 0,239, 6,249, 0,240, 6, 14, 0,241, 6, 14, 0,242, 6,250, 0,243, 6,238, 0,244, 6,251, 0,245, 6, - 2, 0,246, 6, 2, 0,247, 6, 2, 0,248, 6, 2, 0, 30, 0,252, 0, 15, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, - 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6,241, 0,206, 6, 14, 0,249, 6,253, 0,250, 6, 0, 0,251, 6,254, 0,252, 6, - 2, 0, 18, 0, 2, 0,253, 6, 2, 0,254, 6, 2, 0,255, 6,255, 0, 25, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, - 4, 0,153, 6, 4, 0, 18, 0, 42, 0,249, 2, 40, 0, 69, 1, 54, 0, 0, 7, 0, 1, 1, 7, 1, 1, 2, 7,179, 0,187, 3, - 7, 0, 3, 7, 7, 0,100, 2, 7, 0,101, 2, 7, 0,224, 6, 7, 0, 4, 7, 7, 0, 5, 7, 2, 0, 6, 7, 2, 0, 27, 0, - 2, 0, 7, 7, 2, 0, 8, 7, 0, 0, 9, 7, 0, 0, 10, 7, 0, 0, 11, 7, 0, 0,166, 6, 2, 1, 11, 0,240, 0, 0, 0, -240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6, 2, 0,209, 6, 2, 0, 18, 0, 4, 0, 27, 0, -244, 0,207, 6,241, 0,206, 6, 3, 1, 31, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, - 2, 0,155, 6, 37, 0, 12, 7, 4, 0, 13, 7, 4, 0, 14, 7, 2, 0, 91, 0, 2, 0, 15, 7, 2, 0, 16, 7, 0, 0, 17, 7, - 0, 0, 18, 7, 4, 0, 19, 7, 4, 0, 20, 7, 4, 0, 21, 7, 2, 0, 22, 7, 2, 0, 23, 7, 2, 0, 24, 7, 2, 0, 25, 7, - 7, 0, 26, 7, 18, 0, 27, 7, 18, 0, 28, 7, 4, 0, 29, 7, 4, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 2, 0, 33, 7, - 0, 0,216, 2, 11, 0, 34, 7, 4, 1, 10, 0, 22, 0, 32, 0, 11, 0, 35, 7, 11, 0, 36, 7, 11, 0, 37, 7, 11, 0, 38, 7, - 11, 0, 39, 7, 4, 0, 91, 0, 4, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, 5, 1, 10, 0,240, 0, 0, 0,240, 0, 1, 0, - 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 4, 1, 43, 7, 2, 0, 91, 0, 2, 0, 15, 7, 4, 0, 66, 0, 11, 0, 44, 7, - 6, 1, 3, 0, 6, 1, 0, 0, 6, 1, 1, 0, 7, 0, 45, 7, 7, 1, 9, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, - 4, 0,153, 6, 7, 0,154, 6,241, 0,206, 6, 14, 0, 46, 7, 4, 0, 47, 7, 4, 0, 18, 0, 8, 1, 27, 0,240, 0, 0, 0, -240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6,241, 0,206, 6, 22, 0, 48, 7, 22, 0, 80, 0, - 2, 0, 18, 0, 2, 0, 66, 0, 7, 0, 49, 7, 7, 0,100, 2, 7, 0,101, 2, 7, 0,224, 6, 7, 0, 50, 7, 7, 0, 51, 7, - 7, 0, 52, 7, 57, 0, 70, 1, 57, 0, 53, 7, 4, 0, 54, 7, 2, 0, 55, 7, 2, 0, 56, 7, 2, 0,251, 0, 2, 0, 86, 1, - 14, 0, 57, 7,179, 0,187, 3, 9, 1, 10, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, - 2, 0,155, 6, 2, 0, 18, 0, 2, 0,219, 3, 4, 0, 27, 0,179, 0,187, 3, 10, 1, 7, 0, 10, 1, 0, 0, 10, 1, 1, 0, - 4, 0, 58, 7, 4, 0, 22, 0, 0, 0, 85, 0, 4, 0, 59, 7, 4, 0, 16, 0, 11, 1, 14, 0,240, 0, 0, 0,240, 0, 1, 0, - 14, 0,152, 6, 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6, 4, 0, 16, 7, 4, 0, 27, 0, 14, 0, 60, 7, 14, 0, 61, 7, - 0, 0, 62, 7, 0, 0, 63, 7, 4, 0, 64, 7, 4, 0, 65, 7, 12, 1, 6, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, - 4, 0,153, 6, 4, 0, 27, 0, 0, 0, 66, 7, 13, 1, 28, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, 4, 0,153, 6, - 7, 0,100, 2, 7, 0,101, 2, 7, 0, 67, 7, 7, 0, 68, 7, 7, 0,224, 6,232, 0, 69, 7,230, 0,112, 6, 14, 1, 1, 7, - 4, 0, 18, 0, 2, 0, 87, 1, 2, 0,116, 6, 4, 0, 70, 7, 7, 0, 71, 7, 7, 0,153, 3, 7, 0, 99, 3, 4, 0, 27, 0, - 7, 0, 72, 7, 7, 0, 73, 7, 4, 0, 74, 7, 4, 0, 30, 0, 11, 0, 75, 7, 2, 0, 76, 7, 2, 0, 77, 7, 4, 0,250, 1, - 15, 1, 7, 0, 15, 1, 0, 0, 15, 1, 1, 0, 0, 0, 78, 7, 2, 0, 79, 7, 2, 0, 80, 7, 2, 0, 81, 7, 2, 0, 27, 0, - 16, 1, 12, 0, 2, 0, 80, 7, 2, 0, 82, 7, 2, 0, 83, 7, 0, 0,216, 2, 2, 0, 84, 7, 2, 0, 85, 7, 2, 0, 86, 7, - 2, 0, 87, 7, 2, 0, 88, 7, 2, 0,197, 6, 7, 0, 89, 7, 7, 0, 90, 7, 17, 1, 18, 0, 17, 1, 0, 0, 17, 1, 1, 0, - 0, 0, 19, 0, 16, 1, 91, 7, 16, 1, 92, 7, 16, 1, 93, 7, 16, 1, 94, 7, 7, 0, 95, 7, 2, 0, 96, 7, 2, 0, 97, 7, - 2, 0, 98, 7, 2, 0, 99, 7, 2, 0,100, 7, 2, 0,101, 7, 2, 0,102, 7, 2, 0,103, 7, 2, 0,104, 7, 2, 0, 27, 0, - 18, 1, 10, 0, 0, 0,105, 7, 0, 0,106, 7, 0, 0,107, 7, 0, 0,108, 7, 0, 0,109, 7, 0, 0,110, 7, 2, 0,111, 7, - 2, 0,112, 7, 2, 0,113, 7, 2, 0,114, 7, 19, 1, 8, 0, 0, 0,115, 7, 0, 0,116, 7, 0, 0,117, 7, 0, 0,118, 7, - 0, 0,119, 7, 0, 0,120, 7, 7, 0,115, 6, 7, 0, 27, 0, 20, 1, 3, 0, 0, 0,121, 7, 2, 0,122, 7, 2, 0, 27, 0, - 21, 1, 22, 0, 18, 1,123, 7, 18, 1,124, 7, 18, 1,125, 7, 18, 1,126, 7, 18, 1,127, 7, 18, 1,128, 7, 18, 1,129, 7, - 18, 1,130, 7, 18, 1,131, 7, 18, 1,132, 7, 18, 1,133, 7, 18, 1,134, 7, 18, 1,135, 7, 18, 1,136, 7, 18, 1,137, 7, - 18, 1,138, 7, 18, 1,139, 7, 19, 1,140, 7, 20, 1,141, 7, 0, 0,142, 7, 7, 0,143, 7, 7, 0, 27, 0, 22, 1,122, 0, - 0, 0,144, 7, 0, 0,145, 7, 0, 0,109, 7, 0, 0,146, 7, 0, 0,121, 7, 0, 0,147, 7, 0, 0,148, 7, 0, 0,149, 7, - 0, 0,150, 7, 0, 0,151, 7, 0, 0,152, 7, 0, 0,153, 7, 0, 0,154, 7, 0, 0,155, 7, 0, 0,156, 7, 0, 0,157, 7, - 0, 0,158, 7, 0, 0,159, 7, 0, 0,160, 7, 0, 0,161, 7, 0, 0,162, 7, 0, 0,163, 7, 0, 0,164, 7, 0, 0,165, 7, - 0, 0,166, 7, 0, 0,167, 7, 0, 0,168, 7, 0, 0,169, 7, 0, 0,170, 7, 0, 0,171, 7, 0, 0,172, 7, 0, 0,173, 7, - 0, 0,174, 7, 0, 0,175, 7, 0, 0,176, 7, 0, 0,177, 7, 0, 0,178, 7, 0, 0,179, 7, 0, 0,180, 7, 0, 0,181, 7, - 0, 0,182, 7, 0, 0,183, 7, 0, 0,184, 7, 0, 0,185, 7, 0, 0,186, 7, 0, 0,187, 7, 0, 0,188, 7, 0, 0,189, 7, - 0, 0,190, 7, 0, 0,191, 7, 0, 0,192, 7, 0, 0,193, 7, 0, 0,194, 7, 0, 0,195, 7, 0, 0,196, 7, 0, 0,197, 7, - 0, 0,198, 7, 0, 0,199, 7, 0, 0,200, 7, 0, 0,201, 7, 0, 0,202, 7, 0, 0,203, 7, 0, 0,204, 7, 0, 0,205, 7, - 0, 0,206, 7, 0, 0,207, 7, 0, 0,208, 7, 0, 0,209, 7, 0, 0,210, 7, 0, 0,211, 7, 0, 0,212, 7, 0, 0,213, 7, - 0, 0,214, 7, 0, 0,215, 7, 0, 0,216, 7, 0, 0,217, 7, 0, 0,218, 7, 0, 0,219, 7, 0, 0,220, 7, 0, 0,221, 7, - 0, 0,222, 7, 0, 0,223, 7, 0, 0,224, 7, 0, 0,225, 7, 0, 0,226, 7, 0, 0,227, 7, 0, 0,228, 7, 0, 0,229, 7, - 0, 0,230, 7, 0, 0,231, 7, 0, 0,232, 7, 0, 0,233, 7, 0, 0,234, 7, 0, 0,235, 7, 0, 0,236, 7, 0, 0,237, 7, - 0, 0,238, 7, 0, 0,239, 7, 0, 0,240, 7, 0, 0,241, 7, 0, 0,242, 7, 0, 0,243, 7, 0, 0,244, 7, 0, 0,245, 7, - 0, 0,246, 7, 0, 0,247, 7, 0, 0,248, 7, 0, 0,249, 7, 0, 0,250, 7, 0, 0,251, 7, 0, 0,252, 7, 0, 0,253, 7, - 0, 0,254, 7, 0, 0,255, 7, 0, 0, 0, 8, 0, 0, 1, 8, 0, 0, 2, 8, 0, 0, 3, 8, 0, 0, 4, 8, 0, 0, 5, 8, - 0, 0, 6, 8, 0, 0, 7, 8, 23, 1, 5, 0, 0, 0, 8, 8, 0, 0,167, 7, 0, 0,173, 7, 2, 0, 18, 0, 2, 0, 27, 0, - 24, 1, 24, 0, 24, 1, 0, 0, 24, 1, 1, 0, 0, 0,179, 5, 21, 1, 9, 8, 22, 1, 10, 8, 22, 1, 11, 8, 22, 1, 12, 8, - 22, 1, 13, 8, 22, 1, 14, 8, 22, 1, 15, 8, 22, 1, 16, 8, 22, 1, 17, 8, 22, 1, 18, 8, 22, 1, 19, 8, 22, 1, 20, 8, - 22, 1, 21, 8, 22, 1, 22, 8, 22, 1, 23, 8, 22, 1, 24, 8, 22, 1, 25, 8, 22, 1, 26, 8, 23, 1, 27, 8, 4, 0, 28, 8, - 4, 0, 27, 0, 25, 1, 3, 0, 25, 1, 0, 0, 25, 1, 1, 0, 0, 0, 29, 8, 26, 1, 5, 0, 4, 0, 18, 0, 4, 0, 27, 0, - 7, 0,156, 2, 7, 0, 30, 8, 7, 0, 50, 2, 27, 1, 95, 0, 4, 0, 18, 0, 4, 0, 31, 8, 4, 0, 32, 8, 0, 0, 33, 8, - 0, 0, 34, 8, 0, 0, 35, 8, 0, 0, 36, 8, 0, 0, 37, 8, 0, 0, 38, 8, 0, 0, 39, 8, 0, 0, 40, 8, 0, 0, 41, 8, - 0, 0, 42, 8, 4, 0, 43, 8, 2, 0, 44, 8, 2, 0, 45, 8, 2, 0, 46, 8, 2, 0, 47, 8, 4, 0, 48, 8, 4, 0, 49, 8, - 4, 0, 50, 8, 4, 0, 51, 8, 2, 0, 52, 8, 2, 0, 53, 8, 4, 0, 54, 8, 4, 0, 55, 8, 4, 0, 56, 8, 4, 0, 57, 8, - 4, 0, 58, 8, 4, 0, 60, 7, 4, 0, 59, 8, 2, 0, 60, 8, 2, 0, 61, 8, 2, 0, 62, 8, 2, 0, 63, 8, 14, 0, 64, 8, - 14, 0, 65, 8, 14, 0, 66, 8, 14, 0, 67, 8, 14, 0, 68, 8, 14, 0, 69, 8, 0, 0, 70, 8, 2, 0, 71, 8, 2, 0, 72, 8, - 2, 0, 73, 8, 2, 0, 74, 8, 2, 0, 75, 8, 2, 0, 76, 8, 2, 0, 77, 8, 2, 0, 78, 8, 26, 1, 79, 8, 2, 0, 80, 8, - 2, 0, 81, 8, 2, 0, 82, 8, 2, 0, 83, 8, 2, 0, 84, 8, 2, 0, 85, 8, 2, 0, 86, 8, 2, 0, 87, 8, 4, 0, 88, 8, - 4, 0, 89, 8, 2, 0, 90, 8, 2, 0, 91, 8, 2, 0, 92, 8, 2, 0, 93, 8, 2, 0, 94, 8, 2, 0, 95, 8, 2, 0, 96, 8, - 2, 0, 97, 8, 2, 0, 98, 8, 2, 0, 99, 8, 2, 0,100, 8, 2, 0,101, 8, 2, 0,102, 8, 2, 0,103, 8, 2, 0,104, 8, - 2, 0,105, 8, 2, 0,106, 8, 2, 0,107, 8, 7, 0,108, 8, 4, 0,109, 8, 7, 0,110, 8, 2, 0, 24, 6, 2, 0, 25, 6, - 2, 0,111, 8, 2, 0,112, 8, 50, 0,113, 8, 7, 0,114, 8, 2, 0,115, 8, 2, 0,250, 1, 0, 0,116, 8, 4, 0,117, 8, - 4, 0,118, 8, 7, 0,119, 8, 7, 0, 27, 0, 28, 1, 24, 0, 22, 0, 32, 0, 14, 0,120, 8, 14, 0,121, 8, 14, 0,122, 8, - 14, 0,152, 6, 41, 0,124, 0, 41, 0,123, 8, 4, 0,124, 8, 4, 0, 66, 0, 2, 0,125, 8, 2, 0,126, 8, 2, 0,127, 8, - 2, 0,128, 8, 2, 0,129, 8, 2, 0,130, 8, 2, 0,131, 8, 2, 0,132, 8, 2, 0,133, 8, 2, 0,134, 8, 2, 0,135, 8, - 2, 0, 27, 0,238, 0,136, 8, 11, 0,137, 8, 2, 0,138, 8, 29, 1, 5, 0, 29, 1, 0, 0, 29, 1, 1, 0, 29, 1,139, 8, - 15, 0,140, 8, 4, 0, 18, 0, 30, 1, 7, 0, 30, 1, 0, 0, 30, 1, 1, 0, 29, 1,141, 8, 29, 1,142, 8, 2, 0,128, 5, - 2, 0, 18, 0, 4, 0, 27, 0, 31, 1, 25, 0, 31, 1, 0, 0, 31, 1, 1, 0, 32, 1,143, 8, 33, 1,245, 6, 0, 0,144, 8, - 0, 0,145, 8, 0, 0,146, 8, 2, 0,147, 8, 2, 0,148, 8, 2, 0,149, 8, 2, 0,150, 8, 2, 0,151, 8, 2, 0, 27, 0, - 2, 0, 18, 0, 2, 0,152, 8, 2, 0,153, 8, 2, 0,154, 8, 4, 0,155, 8, 31, 1,156, 8, 11, 0,157, 8, 4, 0,158, 8, - 4, 0,159, 8, 4, 0,160, 8, 4, 0,161, 8, 0, 0,162, 8, 34, 1, 22, 0, 34, 1, 0, 0, 34, 1, 1, 0, 29, 1,141, 8, - 29, 1,142, 8, 29, 1,163, 8, 29, 1,164, 8, 28, 1,165, 8, 18, 0, 50, 0, 0, 0,153, 6, 0, 0,166, 8, 2, 0,198, 6, - 2, 0,199, 6, 2, 0,167, 8, 2, 0, 27, 0, 2, 0,129, 8, 2, 0, 59, 7, 2, 0, 18, 0, 35, 1,143, 8, 14, 0,168, 8, - 14, 0,152, 6, 14, 0,169, 8, 14, 0,170, 8, 36, 1, 24, 0, 36, 1, 0, 0, 36, 1, 1, 0,241, 0,206, 6, 18, 0,171, 8, - 18, 0,172, 8, 2, 0,198, 6, 2, 0,199, 6, 2, 0,173, 8, 2, 0,174, 8, 2, 0,175, 8, 2, 0, 18, 0, 7, 0, 96, 2, - 2, 0,149, 8, 2, 0,150, 8, 2, 0,128, 8, 2, 0,176, 8, 2, 0,133, 8, 2, 0, 86, 1, 37, 1,143, 8, 14, 0,177, 8, - 14, 0,178, 8, 14, 0,169, 8, 0, 0,179, 8, 11, 0,180, 8, 38, 1, 14, 0, 0, 0,181, 8, 2, 0,182, 8, 2, 0,183, 8, - 2, 0,184, 8, 2, 0,185, 8, 2, 0,117, 5, 2, 0,186, 8, 28, 1,187, 8, 41, 0,188, 8, 4, 0,189, 8, 4, 0,190, 8, - 4, 0,191, 8, 4, 0, 27, 0, 0, 0, 78, 7, 39, 1, 3, 0, 0, 0,192, 8, 4, 0,193, 8, 4, 0,194, 8, 40, 1, 4, 0, - 4, 0, 13, 7, 4, 0,195, 8, 4, 0, 19, 7, 4, 0,196, 8, 41, 1, 2, 0, 4, 0,197, 8, 4, 0,198, 8, 42, 1, 5, 0, - 7, 0,199, 8, 7, 0,200, 8, 7, 0,201, 8, 4, 0, 18, 0, 4, 0, 27, 0, 43, 1, 7, 0, 0, 0,202, 8, 0, 0,227, 6, - 44, 0,137, 0, 2, 0,203, 8, 2, 0, 79, 5, 2, 0,204, 8, 2, 0,205, 8, 44, 1, 12, 0, 44, 1, 0, 0, 44, 1, 1, 0, - 4, 0, 28, 0, 4, 0,206, 8, 4, 0,207, 8, 4, 0,208, 8, 39, 1,209, 8, 0, 0,202, 8, 43, 1,181, 3, 40, 1,210, 8, - 41, 1,211, 8, 42, 1,212, 8, 45, 1, 12, 0, 0, 0, 35, 0, 11, 0,226, 0, 0, 0,227, 0, 4, 0,230, 0, 4, 0,238, 0, - 11, 0,231, 0, 7, 0,233, 0, 7, 0,234, 0, 11, 0,213, 8, 11, 0,214, 8, 11, 0,235, 0, 11, 0,237, 0, 46, 1, 50, 0, - 46, 1, 0, 0, 46, 1, 1, 0, 11, 0,215, 8, 11, 0, 25, 0, 0, 0, 19, 0, 4, 0, 18, 0, 4, 0, 16, 0, 4, 0, 22, 0, - 4, 0, 89, 0, 4, 0,216, 8, 4, 0,217, 8, 4, 0,207, 8, 4, 0,208, 8, 4, 0,218, 8, 4, 0,250, 0, 4, 0,219, 8, - 4, 0,220, 8, 7, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, 2, 0,224, 8, 2, 0,225, 8, 4, 0,226, 8, 4, 0,227, 8, - 44, 1,228, 8, 31, 0, 79, 0, 41, 0,124, 0, 27, 0,229, 8, 44, 0,137, 0,230, 0,112, 6, 7, 0,230, 8, 7, 0,231, 8, - 45, 1, 71, 1, 46, 1,232, 8, 46, 1,233, 8, 46, 1,234, 8, 14, 0,235, 8, 47, 1,236, 8, 11, 0,237, 8, 7, 0, 89, 4, - 7, 0,238, 8, 7, 0,239, 8, 7, 0,240, 8, 11, 0,241, 8, 4, 0,242, 8, 4, 0,243, 8, 4, 0,244, 8, 7, 0,245, 8, - 4, 0,128, 0, 4, 0, 27, 0, 48, 1, 4, 0, 48, 1, 0, 0, 48, 1, 1, 0, 14, 0,246, 8, 46, 1,247, 8,227, 0, 11, 0, - 14, 0,248, 8, 14, 0,235, 8, 14, 0,249, 8, 46, 1,250, 8, 0, 0,251, 8, 0, 0,252, 8, 4, 0,253, 8, 4, 0,254, 8, - 4, 0,255, 8, 4, 0, 27, 0, 19, 0, 0, 9, 49, 1, 4, 0, 7, 0, 1, 9, 7, 0, 99, 3, 2, 0, 2, 9, 2, 0, 3, 9, - 50, 1, 6, 0, 7, 0, 4, 9, 7, 0, 5, 9, 7, 0, 6, 9, 7, 0, 7, 9, 4, 0, 8, 9, 4, 0, 9, 9, 51, 1, 8, 0, - 7, 0, 10, 9, 7, 0, 11, 9, 7, 0, 12, 9, 7, 0, 13, 9, 7, 0, 14, 9, 4, 0,255, 2, 4, 0, 15, 9, 4, 0, 16, 9, - 52, 1, 2, 0, 7, 0,187, 5, 7, 0, 27, 0, 53, 1, 5, 0, 7, 0, 17, 9, 7, 0, 18, 9, 4, 0, 91, 0, 4, 0,217, 2, - 4, 0, 19, 9, 54, 1, 6, 0, 54, 1, 0, 0, 54, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 20, 9, 2, 0, 55, 0, - 55, 1, 8, 0, 55, 1, 0, 0, 55, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 20, 9, 2, 0, 55, 0, 7, 0, 22, 0, - 7, 0,128, 0, 56, 1, 45, 0, 56, 1, 0, 0, 56, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 20, 9, 2, 0,246, 0, - 2, 0,131, 4, 2, 0, 21, 9, 7, 0, 22, 9, 7, 0, 90, 0, 7, 0, 12, 3, 4, 0, 23, 9, 4, 0, 81, 0, 4, 0,219, 2, - 7, 0, 24, 9, 7, 0, 25, 9, 7, 0, 26, 9, 7, 0, 27, 9, 7, 0, 28, 9, 7, 0, 29, 9, 7, 0, 9, 3, 7, 0, 68, 1, - 7, 0, 30, 9, 7, 0, 31, 9, 7, 0, 27, 0, 7, 0, 32, 9, 7, 0, 33, 9, 7, 0, 34, 9, 2, 0, 35, 9, 2, 0, 36, 9, - 2, 0, 37, 9, 2, 0, 38, 9, 2, 0, 39, 9, 2, 0, 40, 9, 2, 0, 41, 9, 2, 0, 42, 9, 2, 0, 35, 2, 2, 0, 43, 9, - 2, 0, 32, 2, 2, 0, 44, 9, 0, 0, 45, 9, 0, 0, 46, 9, 7, 0,244, 0, 57, 1, 47, 9, 64, 0,253, 1, 58, 1, 16, 0, - 58, 1, 0, 0, 58, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 20, 9, 2, 0,246, 0, 7, 0, 4, 3, 7, 0, 5, 3, - 7, 0, 6, 3, 7, 0, 85, 2, 7, 0, 7, 3, 7, 0, 8, 3, 7, 0, 48, 9, 7, 0, 9, 3, 7, 0, 11, 3, 7, 0, 12, 3, -254, 0, 5, 0, 2, 0, 16, 0, 2, 0, 49, 9, 2, 0, 18, 0, 2, 0, 50, 9, 22, 0, 48, 7,253, 0, 3, 0, 4, 0, 68, 0, - 4, 0, 51, 9,254, 0, 2, 0, 59, 1, 7, 0, 59, 1, 0, 0, 59, 1, 1, 0, 0, 0, 19, 0, 2, 0, 16, 0, 2, 0, 18, 0, - 4, 0, 21, 0, 11, 0, 52, 9, 60, 1, 5, 0, 0, 0, 19, 0, 7, 0, 94, 1, 7, 0, 53, 9, 4, 0, 54, 9, 4, 0, 27, 0, - 61, 1, 4, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 66, 0, 2, 0, 30, 0, 62, 1, 4, 0, 0, 0, 19, 0, 63, 0, 55, 9, - 7, 0, 94, 1, 7, 0, 27, 0, 63, 1, 6, 0, 2, 0, 56, 9, 2, 0, 57, 9, 2, 0, 16, 0, 2, 0, 58, 9, 0, 0, 59, 9, - 0, 0, 60, 9, 64, 1, 5, 0, 4, 0, 16, 0, 4, 0, 27, 0, 0, 0, 19, 0, 0, 0, 61, 9, 0, 0, 62, 9, 65, 1, 3, 0, - 4, 0, 16, 0, 4, 0, 27, 0, 0, 0, 19, 0, 66, 1, 4, 0, 2, 0, 63, 9, 2, 0, 64, 9, 2, 0, 18, 0, 2, 0, 27, 0, - 67, 1, 6, 0, 0, 0, 19, 0, 0, 0, 65, 9, 2, 0, 66, 9, 2, 0, 9, 3, 2, 0, 87, 1, 2, 0, 30, 0, 68, 1, 5, 0, - 0, 0, 19, 0, 7, 0, 99, 3, 7, 0,222, 4, 2, 0, 18, 0, 2, 0,231, 2, 69, 1, 3, 0, 0, 0, 19, 0, 4, 0,219, 2, - 4, 0, 63, 9, 70, 1, 7, 0, 0, 0, 19, 0, 7, 0,222, 4, 0, 0, 67, 9, 0, 0, 68, 9, 2, 0, 87, 1, 2, 0, 66, 0, - 4, 0, 69, 9, 71, 1, 4, 0, 0, 0, 70, 9, 0, 0, 71, 9, 4, 0, 16, 0, 7, 0,235, 2, 72, 1, 3, 0, 27, 0, 72, 9, - 0, 0, 73, 9, 0, 0, 74, 9, 73, 1, 18, 0, 73, 1, 0, 0, 73, 1, 1, 0, 2, 0, 16, 0, 2, 0, 75, 9, 2, 0, 18, 0, - 2, 0, 76, 9, 2, 0, 77, 9, 2, 0, 78, 9, 2, 0, 66, 0, 2, 0, 30, 0, 0, 0, 19, 0, 11, 0, 2, 0, 74, 1, 79, 9, - 27, 0, 43, 0, 2, 0,223, 5, 2, 0,181, 2, 2, 0, 80, 9, 2, 0, 27, 0, 75, 1, 11, 0, 0, 0, 19, 0, 0, 0, 16, 0, - 0, 0, 81, 9, 2, 0, 18, 0, 2, 0,231, 2, 2, 0, 82, 9, 4, 0, 83, 9, 4, 0, 84, 9, 4, 0, 85, 9, 4, 0, 86, 9, - 4, 0, 87, 9, 76, 1, 1, 0, 0, 0, 88, 9, 77, 1, 4, 0, 37, 0, 12, 7, 0, 0, 29, 8, 4, 0, 87, 1, 4, 0, 18, 0, - 74, 1, 18, 0, 74, 1, 0, 0, 74, 1, 1, 0, 74, 1, 89, 9, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 90, 9, 2, 0, 78, 9, - 2, 0, 75, 9, 2, 0, 91, 9, 2, 0, 30, 0, 2, 0,250, 1, 0, 0, 19, 0, 11, 0, 2, 0, 78, 1, 79, 9, 73, 1, 92, 9, - 2, 0, 14, 0, 2, 0, 93, 9, 4, 0, 94, 9, 79, 1, 3, 0, 4, 0,245, 2, 4, 0, 27, 0, 27, 0, 43, 0, 80, 1, 15, 0, -177, 0, 95, 9, 2, 0, 16, 0, 2, 0, 18, 0, 7, 0, 22, 9, 7, 0, 90, 0, 0, 0, 19, 0, 0, 0, 96, 9, 2, 0, 97, 9, - 2, 0, 98, 9, 2, 0,133, 0, 2, 0, 99, 9, 2, 0,100, 9, 2, 0, 27, 0, 7, 0,101, 9, 7, 0,102, 9, 81, 1, 8, 0, - 7, 0,103, 9, 7, 0,104, 9, 7, 0,105, 9, 7, 0,106, 9, 7, 0,107, 9, 7, 0,108, 9, 7, 0,109, 9, 7, 0,110, 9, - 82, 1, 13, 0, 2, 0, 18, 0, 2, 0,111, 9, 4, 0, 66, 0, 4, 0, 30, 0, 2, 0,183, 6, 7, 0, 89, 4, 7, 0,238, 8, - 47, 1,236, 8, 81, 1,112, 9, 2, 0, 16, 0, 2, 0,122, 5, 2, 0,221, 3, 2, 0,113, 9, 83, 1, 11, 0, 4, 0,245, 2, - 2, 0, 16, 0, 2, 0, 18, 0, 27, 0, 43, 0, 79, 0,114, 9, 0, 0, 19, 0, 7, 0,115, 9, 7, 0,116, 9, 7, 0,227, 3, - 2, 0,117, 9, 2, 0,118, 9, 84, 1, 5, 0, 2, 0, 16, 0, 2, 0, 66, 0, 4, 0, 27, 0, 41, 0,124, 0, 27, 0,215, 5, - 85, 1, 5, 0, 4, 0, 27, 0, 4, 0, 16, 0, 0, 0, 19, 0, 0, 0, 61, 9, 27, 0, 43, 0, 86, 1, 13, 0, 2, 0, 18, 0, - 2, 0, 16, 0, 2, 0, 75, 9, 2, 0,228, 3, 7, 0,119, 9, 7, 0,120, 9, 7, 0, 86, 1, 7, 0,121, 9, 7, 0,197, 3, - 7, 0,201, 3, 7, 0,122, 9, 7, 0,123, 9, 27, 0,124, 9, 87, 1, 10, 0, 2, 0, 18, 0, 2, 0, 16, 0, 7, 0, 22, 9, - 7, 0, 90, 0, 0, 0, 19, 0, 0, 0, 96, 9, 2, 0, 66, 0, 2, 0, 30, 0, 2, 0,250, 1, 2, 0,122, 5, 88, 1, 8, 0, - 27, 0, 43, 0, 7, 0, 6, 3, 7, 0,125, 9, 7, 0,126, 9, 7, 0,228, 3, 2, 0, 66, 0, 2, 0,231, 2, 7, 0, 30, 0, - 89, 1, 12, 0, 2, 0, 16, 0, 2, 0, 87, 1, 2, 0, 18, 0, 2, 0, 9, 3, 2, 0,245, 2, 2, 0,127, 9, 4, 0, 27, 0, - 7, 0,128, 9, 7, 0,129, 9, 7, 0,130, 9, 7, 0,131, 9, 0, 0,132, 9, 90, 1, 9, 0, 2, 0, 18, 0, 2, 0, 16, 0, - 4, 0, 22, 9, 4, 0, 90, 0, 0, 0, 19, 0, 2, 0, 86, 1, 2, 0, 62, 0, 2, 0,133, 9, 2, 0,134, 9, 91, 1, 7, 0, - 4, 0,219, 2, 4, 0,135, 9, 4, 0,136, 9, 4, 0,137, 9, 7, 0,138, 9, 7, 0,139, 9, 0, 0, 67, 9, 92, 1, 7, 0, - 0, 0,140, 9, 27, 0,141, 9, 0, 0, 73, 9, 2, 0,142, 9, 2, 0, 66, 0, 4, 0, 30, 0, 0, 0, 74, 9, 93, 1, 6, 0, - 2, 0, 18, 0, 2, 0, 16, 0, 4, 0, 22, 9, 4, 0, 90, 0, 0, 0,143, 9, 0, 0,144, 9, 94, 1, 1, 0, 4, 0, 18, 0, - 95, 1, 6, 0, 0, 0, 93, 0, 2, 0, 16, 0, 2, 0, 18, 0, 4, 0,145, 9, 7, 0,146, 9, 37, 0, 12, 7, 96, 1, 4, 0, - 0, 0,186, 2, 2, 0, 18, 0, 4, 0, 16, 0, 27, 0, 43, 0, 97, 1, 2, 0, 4, 0, 16, 0, 4, 0,187, 6, 98, 1, 8, 0, - 0, 0, 70, 9, 0, 0, 71, 9, 4, 0, 16, 0, 7, 0, 43, 2, 7, 0,147, 9, 7, 0, 27, 0, 27, 0, 75, 3, 27, 0,148, 9, - 99, 1, 11, 0, 0, 0, 60, 6, 0, 0, 18, 0, 2, 0,149, 9, 4, 0, 16, 0, 7, 0, 94, 1, 7, 0,150, 9, 7, 0,151, 9, - 7, 0,152, 9, 4, 0,153, 9, 27, 0, 75, 3, 27, 0,154, 9, 78, 1, 10, 0, 78, 1, 0, 0, 78, 1, 1, 0, 78, 1, 89, 9, - 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 75, 9, 2, 0,155, 9, 0, 0, 19, 0, 11, 0, 2, 0, 27, 0, 43, 0, 47, 1, 17, 0, - 22, 0, 32, 0, 0, 0, 35, 0, 38, 0,152, 0, 11, 0,226, 0, 38, 0,156, 9, 31, 0, 79, 0, 7, 0, 89, 4, 7, 0,157, 9, - 7, 0,238, 8, 7, 0,103, 9, 7, 0,104, 9, 7, 0,158, 9, 4, 0, 91, 0, 4, 0, 27, 0, 11, 0,159, 9, 11, 0,160, 9, - 11, 0,161, 9,100, 1, 6, 0,100, 1, 0, 0,100, 1, 1, 0, 27, 0, 43, 0, 11, 0,162, 9, 2, 0,251, 0, 0, 0,216, 2, - 64, 0, 4, 0, 22, 0, 32, 0, 14, 0,163, 9, 4, 0,133, 0, 7, 0,164, 9,101, 1, 28, 0,101, 1, 0, 0,101, 1, 1, 0, - 21, 0,165, 9,101, 1, 37, 0, 14, 0,166, 9, 0, 0, 19, 0, 7, 0,167, 9, 7, 0,168, 9, 7, 0,169, 9, 7, 0,170, 9, - 4, 0, 18, 0, 7, 0,171, 9, 7, 0,172, 9, 7, 0,173, 9, 7, 0,174, 9, 7, 0, 94, 1, 7, 0, 43, 2, 7, 0,175, 9, - 7, 0,217, 2, 7, 0,176, 9, 7, 0,177, 9, 7, 0,178, 9, 7, 0,179, 9, 7, 0,180, 9, 7, 0,175, 0, 4, 0,133, 0, - 2, 0, 4, 6, 2, 0,181, 9,102, 1, 27, 0, 22, 0, 32, 0, 34, 0, 74, 0, 14, 0,182, 9, 14, 0,183, 9, 14, 0,184, 9, -101, 1,185, 9, 11, 0,186, 9, 11, 0,187, 9, 4, 0, 18, 0, 4, 0,163, 6, 4, 0,188, 9, 4, 0, 27, 0, 2, 0, 13, 3, - 2, 0,217, 6, 4, 0,189, 9, 4, 0,133, 0, 4, 0,190, 9, 2, 0,191, 9, 2, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9, - 4, 0,195, 9, 4, 0,196, 9, 4, 0,197, 9, 4, 0,198, 9, 4, 0,199, 9, 4, 0,200, 9,103, 1, 2, 0, 7, 0,170, 2, - 4, 0, 18, 0,181, 0, 5, 0,103, 1,201, 9, 4, 0,217, 2, 4, 0,202, 9, 4, 0,203, 9, 4, 0, 18, 0,180, 0, 16, 0, - 4, 0,204, 9, 4, 0,205, 9, 4, 0,206, 9, 4, 0,207, 9, 2, 0,208, 9, 2, 0,209, 9, 2, 0,210, 9, 2, 0,251, 0, - 2, 0,211, 9, 2, 0,212, 9, 2, 0,213, 9, 2, 0,214, 9, 4, 0,215, 9, 4, 0,216, 9, 4, 0,217, 9, 4, 0,218, 9, -104, 1, 40, 0,104, 1, 0, 0,104, 1, 1, 0, 21, 0,165, 9, 14, 0, 0, 4, 0, 0, 19, 0, 2, 0, 18, 0, 2, 0,219, 9, - 2, 0,214, 3, 2, 0,220, 9, 0, 0,221, 9, 0, 0,222, 9, 0, 0,223, 9,101, 1,224, 9,104, 1, 37, 0,104, 1,225, 9, - 14, 0,226, 9, 14, 0,227, 9,181, 0,189, 3, 27, 0,228, 9,104, 1,229, 9, 7, 0, 77, 1, 7, 0,175, 0, 7, 0,230, 9, - 7, 0, 22, 2, 7, 0,203, 3, 7, 0,205, 3, 2, 0,237, 3, 2, 0, 27, 0, 7, 0,231, 9, 7, 0,232, 9, 7, 0,208, 3, - 7, 0,233, 9, 7, 0,234, 9, 7, 0,235, 9, 7, 0,236, 9, 7, 0,237, 9, 7, 0,238, 9, 7, 0,239, 9, 7, 0,240, 9, - 11, 0,241, 9,178, 0, 16, 0, 14, 0,242, 9, 74, 0,243, 9, 2, 0, 18, 0, 2, 0, 27, 0, 4, 0,244, 9, 4, 0, 66, 0, - 7, 0, 83, 0, 7, 0,245, 9, 7, 0,246, 9, 14, 0,247, 9, 4, 0,248, 9, 4, 0,249, 9, 11, 0,250, 9, 11, 0,251, 9, -180, 0,188, 3, 0, 0,252, 9,105, 1, 1, 0, 4, 0,249, 9,106, 1, 12, 0, 4, 0,249, 9, 7, 0, 87, 9, 2, 0,253, 9, - 2, 0,254, 9, 7, 0,255, 9, 7, 0, 0, 10, 2, 0, 1, 10, 2, 0, 18, 0, 7, 0, 2, 10, 7, 0, 3, 10, 7, 0, 4, 10, - 7, 0, 5, 10,107, 1, 7, 0,107, 1, 0, 0,107, 1, 1, 0, 14, 0, 6, 10, 4, 0, 18, 0, 4, 0, 7, 10, 0, 0, 19, 0, - 23, 1, 8, 10,177, 0, 9, 0, 22, 0, 32, 0, 14, 0, 9, 10, 14, 0,242, 9, 14, 0, 10, 10, 14, 0,101, 0, 4, 0, 18, 0, - 4, 0, 11, 10, 4, 0, 12, 10, 4, 0, 27, 0,244, 0, 8, 0, 22, 0, 13, 10, 14, 0,242, 9, 64, 0, 14, 10, 0, 0, 15, 10, - 4, 0, 16, 10, 4, 0, 18, 0, 4, 0, 17, 10, 4, 0, 27, 0,108, 1, 13, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,152, 6, - 4, 0,153, 6, 7, 0,154, 6, 2, 0,155, 6,241, 0,206, 6,177, 0,184, 3,244, 0, 18, 10, 0, 0, 87, 1, 0, 0,209, 6, - 2, 0, 18, 0, 7, 0, 19, 10,109, 1, 8, 0,109, 1, 0, 0,109, 1, 1, 0,107, 1, 20, 10, 31, 0, 79, 0, 14, 0,190, 3, - 4, 0, 18, 0, 0, 0, 19, 0, 4, 0,126, 8,110, 1, 5, 0,110, 1, 0, 0,110, 1, 1, 0, 31, 0, 79, 0, 2, 0, 18, 0, - 0, 0, 21, 10,111, 1, 14, 0,111, 1, 0, 0,111, 1, 1, 0, 11, 0, 2, 0, 2, 0, 16, 0, 2, 0, 18, 0, 0, 0, 22, 10, - 0, 0, 23, 10, 0, 0, 19, 0, 2, 0, 27, 0, 7, 0, 24, 10, 7, 0, 25, 10, 31, 0, 79, 0, 7, 0, 26, 10, 7, 0, 27, 10, -112, 1, 9, 0,112, 1, 0, 0,112, 1, 1, 0, 27, 0, 28, 10, 0, 0, 16, 3, 7, 0, 29, 10, 2, 0, 30, 10, 2, 0, 18, 0, - 2, 0, 16, 0, 2, 0, 31, 10,113, 1, 7, 0, 37, 0, 12, 7, 21, 0,165, 9, 4, 0, 18, 0, 4, 0, 32, 10, 14, 0, 33, 10, - 27, 0, 28, 10, 0, 0, 16, 3,114, 1, 15, 0, 27, 0, 28, 10, 2, 0, 34, 10, 2, 0, 18, 0, 2, 0, 35, 10, 2, 0, 36, 10, - 0, 0, 16, 3, 27, 0, 37, 10, 0, 0, 38, 10, 7, 0, 39, 10, 7, 0, 43, 2, 7, 0, 40, 10, 7, 0, 41, 10, 2, 0, 16, 0, - 2, 0, 87, 1, 7, 0, 94, 1,115, 1, 6, 0, 27, 0, 28, 10, 7, 0,201, 9, 2, 0, 42, 10, 2, 0, 43, 10, 2, 0, 18, 0, - 2, 0, 44, 10,116, 1, 6, 0, 27, 0, 28, 10, 4, 0, 45, 10, 4, 0, 46, 10, 4, 0, 91, 0, 4, 0, 27, 0, 0, 0, 16, 3, -117, 1, 4, 0, 27, 0, 28, 10, 4, 0, 18, 0, 4, 0, 45, 10, 0, 0, 16, 3,118, 1, 4, 0, 27, 0, 28, 10, 4, 0, 18, 0, - 4, 0, 45, 10, 0, 0, 16, 3,119, 1, 4, 0, 27, 0, 28, 10, 4, 0, 18, 0, 4, 0, 45, 10, 0, 0, 16, 3,120, 1, 2, 0, - 4, 0, 18, 0, 7, 0, 89, 4,121, 1, 2, 0, 27, 0, 28, 10, 0, 0, 16, 3,122, 1, 10, 0, 27, 0, 28, 10, 4, 0, 47, 10, - 7, 0,127, 0, 4, 0, 18, 0, 2, 0, 10, 7, 2, 0, 48, 10, 2, 0, 66, 0, 2, 0, 30, 0, 7, 0, 49, 10, 0, 0, 16, 3, -123, 1, 10, 0, 27, 0, 28, 10, 2, 0, 16, 0, 2, 0,139, 4, 4, 0, 89, 0, 4, 0, 90, 0, 7, 0,125, 9, 7, 0,126, 9, - 4, 0, 27, 0,177, 0, 95, 9, 0, 0, 16, 3,124, 1, 4, 0, 27, 0, 28, 10, 4, 0,215, 3, 4, 0, 50, 10, 0, 0, 16, 3, -125, 1, 4, 0, 27, 0, 28, 10, 4, 0,215, 3, 4, 0, 27, 0, 0, 0, 16, 3,126, 1, 6, 0, 27, 0, 28, 10, 7, 0,127, 0, - 7, 0, 87, 3, 4, 0, 51, 10, 2, 0,215, 3, 2, 0,216, 3,127, 1, 6, 0, 27, 0, 28, 10, 4, 0, 52, 10, 4, 0, 53, 10, - 7, 0, 54, 10, 7, 0, 55, 10, 0, 0, 16, 3,128, 1, 16, 0, 27, 0, 28, 10, 27, 0,225, 9, 4, 0, 16, 0, 7, 0, 56, 10, - 7, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 60, 10, 7, 0, 61, 10, 7, 0, 62, 10, 7, 0, 63, 10, 7, 0, 64, 10, - 2, 0, 18, 0, 2, 0, 27, 0, 2, 0, 66, 0, 2, 0, 30, 0,129, 1, 3, 0, 27, 0, 28, 10, 4, 0, 18, 0, 4, 0, 35, 2, -130, 1, 5, 0, 27, 0, 28, 10, 4, 0, 18, 0, 4, 0, 27, 0, 7, 0, 65, 10, 0, 0, 16, 3,131, 1, 10, 0, 27, 0, 28, 10, - 0, 0, 16, 3, 2, 0, 66, 10, 2, 0, 67, 10, 0, 0, 68, 10, 0, 0, 69, 10, 7, 0, 70, 10, 7, 0, 71, 10, 7, 0, 72, 10, - 7, 0, 73, 10,132, 1, 5, 0, 27, 0, 28, 10, 0, 0, 16, 3, 7, 0,225, 2, 2, 0, 74, 10, 2, 0, 18, 0,133, 1, 8, 0, - 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 75, 10, 7, 0, 76, 10, 2, 0, 18, 0, 2, 0, 35, 2, -134, 1, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 75, 10, 7, 0, 76, 10, 2, 0, 18, 0, - 2, 0, 35, 2,135, 1, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 75, 10, 7, 0, 76, 10, - 2, 0, 18, 0, 2, 0, 35, 2,136, 1, 7, 0, 27, 0, 28, 10, 0, 0, 16, 3, 7, 0, 94, 1, 7, 0,103, 1, 2, 0, 18, 0, - 2, 0, 87, 1, 4, 0, 27, 0,137, 1, 5, 0, 27, 0, 75, 3, 7, 0, 94, 1, 2, 0, 79, 3, 0, 0, 81, 3, 0, 0, 77, 10, -138, 1, 7, 0,230, 0,112, 6, 0, 0, 78, 10, 4, 0, 18, 0, 4, 0, 27, 0, 0, 0, 79, 10, 27, 0,215, 5, 27, 0, 80, 10, -139, 1, 3, 0,230, 0,112, 6, 4, 0, 18, 0, 4, 0, 27, 0,140, 1, 6, 0,230, 0,112, 6, 4, 0, 18, 0, 4, 0, 27, 0, - 0, 0, 79, 10, 7, 0, 65, 10, 27, 0,215, 5,141, 1, 10, 0,141, 1, 0, 0,141, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, - 0, 0, 81, 10, 7, 0, 31, 1, 7, 0, 32, 1, 2, 0, 6, 10, 2, 0, 82, 10, 27, 0, 43, 0,142, 1, 22, 0,142, 1, 0, 0, -142, 1, 1, 0, 2, 0, 18, 0, 2, 0, 87, 1, 2, 0, 83, 10, 2, 0, 84, 10, 31, 0, 79, 0,177, 0, 95, 9, 27, 0,167, 0, - 7, 0, 89, 0, 7, 0, 90, 0, 7, 0, 85, 10, 7, 0, 86, 10, 7, 0, 87, 10, 7, 0, 88, 10, 7, 0, 2, 3, 7, 0,153, 3, - 7, 0, 97, 9, 7, 0, 89, 10, 0, 0, 90, 10, 0, 0, 91, 10, 14, 0,193, 3,143, 1, 11, 0, 7, 0, 50, 2, 7, 0,125, 9, - 7, 0,126, 9, 11, 0, 2, 0, 2, 0, 92, 10, 2, 0, 93, 10, 2, 0, 94, 10, 2, 0, 95, 10, 2, 0, 96, 10, 2, 0, 97, 10, - 2, 0,186, 2,144, 1, 21, 0,144, 1, 0, 0,144, 1, 1, 0,144, 1, 98, 10, 0, 0, 19, 0, 11, 0, 99, 10, 2, 0, 16, 0, - 2, 0, 18, 0, 2, 0,100, 10, 2, 0, 66, 0, 7, 0,101, 10, 7, 0,102, 10, 11, 0,103, 10, 2, 0,104, 10, 2, 0,105, 10, - 4, 0, 30, 0, 11, 0,159, 9, 4, 0,106, 10, 4, 0,107, 10,144, 1,108, 10,145, 1,109, 10,143, 1,110, 10,146, 1, 4, 0, - 0, 0,111, 10, 2, 0,112, 10, 2, 0,113, 10, 4, 0, 27, 0,147, 1, 37, 0,147, 1, 0, 0,147, 1, 1, 0,147, 1,114, 10, - 0, 0, 19, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0,206, 8, 2, 0,181, 2, 2, 0,115, 10, 2, 0, 15, 7, 2, 0,104, 10, - 2, 0, 49, 9, 14, 0, 90, 9, 14, 0,116, 10,147, 1, 37, 0, 22, 0, 48, 7, 11, 0, 99, 10, 7, 0,101, 10, 7, 0,102, 10, - 7, 0, 85, 2, 7, 0, 6, 3, 7, 0,117, 10, 4, 0,118, 10, 0, 0,119, 10, 2, 0,120, 10, 2, 0,121, 10, 7, 0,122, 10, - 7, 0,123, 10, 2, 0,124, 10, 2, 0,125, 10, 11, 0,126, 10, 19, 0,127, 10, 19, 0,128, 10, 19, 0,129, 10,146, 1,153, 0, -148, 1,130, 10,149, 1,131, 10,145, 1, 8, 0,145, 1, 0, 0,145, 1, 1, 0,147, 1,132, 10,147, 1,133, 10,144, 1,134, 10, -144, 1,135, 10, 4, 0, 18, 0, 4, 0, 27, 0, 57, 0, 20, 0, 22, 0, 32, 0, 34, 0, 74, 0,179, 0,187, 3, 14, 0,136, 10, - 14, 0,137, 10, 4, 0, 16, 0, 4, 0,138, 10, 4, 0,139, 10, 4, 0, 18, 0, 4, 0,118, 10, 4, 0,140, 10, 14, 0, 90, 9, - 14, 0,116, 10,150, 1,141, 10, 11, 0,142, 10, 11, 0,143, 10, 4, 0,144, 10, 11, 0,145, 10, 11, 0,146, 10, 11, 0,147, 10, -151, 1, 4, 0, 4, 0, 17, 0, 4, 0,235, 2, 4, 0,125, 9, 4, 0,126, 9,152, 1, 4, 0, 4, 0, 17, 0, 7, 0,235, 2, - 7, 0,125, 9, 7, 0,126, 9,153, 1, 2, 0, 0, 0,235, 2, 0, 0, 86, 1,154, 1, 4, 0, 4, 0, 17, 0, 7, 0,148, 10, - 7, 0,125, 9, 7, 0,126, 9,155, 1, 1, 0, 7, 0,149, 10,156, 1, 6, 0, 4, 0,126, 0, 4, 0,128, 0, 4, 0, 49, 9, - 0, 0,150, 10, 0, 0,151, 10, 2, 0, 27, 0,157, 1, 3, 0, 4, 0,152, 10, 4, 0,153, 10, 4, 0,154, 10,158, 1, 16, 0, - 2, 0,149, 8, 2, 0,150, 8, 2, 0, 76, 5, 2, 0,155, 10, 2, 0,156, 10, 2, 0, 67, 0, 2, 0, 49, 7, 2, 0,157, 10, - 7, 0, 1, 3, 7, 0,158, 10, 7, 0,159, 10, 2, 0,110, 1, 0, 0,160, 10, 0, 0,161, 10, 4, 0,162, 10, 4, 0,163, 10, -159, 1, 9, 0, 7, 0,164, 10, 7, 0,165, 10, 7, 0,158, 9, 7, 0, 99, 3, 7, 0,166, 10, 7, 0,224, 6, 2, 0, 97, 3, - 0, 0,167, 10, 0, 0, 27, 0,160, 1, 4, 0, 7, 0,168, 10, 7, 0,169, 10, 2, 0, 97, 3, 2, 0, 27, 0,161, 1, 3, 0, - 7, 0,170, 10, 7, 0,221, 8, 7, 0, 14, 0,162, 1, 4, 0, 0, 0, 35, 0,205, 0, 87, 5, 4, 0,128, 0, 4, 0,137, 4, -163, 1, 6, 0, 0, 0,171, 10,205, 0,172, 10, 4, 0,128, 0, 4, 0,137, 4, 4, 0,173, 10, 4, 0, 27, 0,164, 1, 7, 0, - 2, 0,174, 10, 2, 0,175, 10, 4, 0, 66, 0, 0, 0, 82, 4,205, 0,172, 10, 0, 0,176, 10, 0, 0,177, 6,165, 1, 9, 0, - 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10, 7, 0, 96, 2, 7, 0,180, 10, 7, 0,181, 10, 7, 0,182, 10, 2, 0,183, 10, - 2, 0,184, 10,166, 1, 8, 0, 2, 0,185, 10, 2, 0,186, 10, 2, 0,187, 10, 2, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, - 7, 0,191, 10, 7, 0,192, 10,167, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,168, 1, 2, 0, 0, 0,169, 0, 0, 0,193, 10, -169, 1, 1, 0, 0, 0, 19, 0,170, 1, 12, 0, 0, 0,194, 10, 0, 0,195, 10, 0, 0,215, 6, 0, 0,196, 10, 2, 0, 76, 5, - 2, 0,197, 10, 7, 0,198, 10, 7, 0,199, 10, 7, 0,200, 10, 7, 0,153, 3, 7, 0,201, 10, 7, 0,202, 10,171, 1, 2, 0, - 11, 0,203, 10, 11, 0,204, 10,172, 1, 13, 0, 0, 0, 79, 5, 0, 0, 16, 0, 0, 0, 97, 3, 0, 0, 99, 3, 0, 0,195, 10, - 0, 0,107, 0, 0, 0,186, 2, 7, 0,205, 10, 7, 0,206, 10, 7, 0,152, 3, 7, 0,207, 10, 7, 0,208, 10, 7, 0,202, 10, -173, 1, 8, 0, 7, 0, 56, 9, 7, 0,127, 0, 7, 0,161, 10, 7, 0,177, 2, 7, 0,209, 10, 7, 0,239, 0, 7, 0,210, 10, - 4, 0, 16, 0,174, 1, 4, 0, 2, 0,211, 10, 2, 0,212, 10, 2, 0,213, 10, 2, 0, 27, 0,175, 1, 8, 0, 7, 0,214, 10, - 7, 0,225, 2, 7, 0,215, 10, 7, 0,199, 8, 7, 0,200, 8, 7, 0,201, 8, 7, 0,216, 10, 7, 0,217, 10,176, 1, 6, 0, - 2, 0,218, 10, 2, 0,219, 10, 7, 0,220, 10, 7, 0,221, 10, 7, 0,222, 10, 7, 0,223, 10,177, 1, 2, 0, 58, 0,224, 10, - 59, 0,225, 10,178, 1, 3, 0,177, 1, 85, 6, 7, 0,226, 10, 7, 0,227, 10,179, 1, 3, 0,177, 1, 85, 6, 4, 0,228, 10, - 4, 0, 27, 0,180, 1, 1, 0,177, 1, 85, 6,181, 1, 3, 0,177, 1, 85, 6, 4, 0,228, 10, 4, 0,229, 10,182, 1, 3, 0, -177, 1, 85, 6, 4, 0,230, 10, 4, 0, 27, 0,183, 1, 1, 0,177, 1, 85, 6,184, 1, 3, 0,177, 1, 85, 6, 4, 0,231, 10, - 4, 0, 27, 0,185, 1, 3, 0,177, 1, 85, 6, 4, 0,232, 10, 4, 0, 27, 0,186, 1, 3, 0,177, 1, 85, 6, 4, 0,233, 10, - 4, 0, 27, 0,187, 1, 3, 0,177, 1, 85, 6, 4, 0,250, 0, 4, 0, 27, 0,188, 1, 1, 0, 0, 0, 19, 0,189, 1, 1, 0, - 0, 0, 19, 0,190, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 18, 0, 2, 0,234, 10,191, 1, 10, 0, 2, 0, 67, 4, - 2, 0, 18, 0, 7, 0,222, 4, 7, 0,235, 10, 7, 0,236, 10, 7, 0,237, 10, 7, 0,238, 10,190, 1,239, 10,190, 1,240, 10, -190, 1,241, 10, 54, 0, 11, 0, 4, 0, 18, 0, 4, 0, 62, 0, 4, 0,242, 10, 4, 0,243, 10, 19, 0,244, 10, 19, 0,245, 10, -191, 1,246, 10, 7, 0,247, 10, 7, 0,248, 10, 7, 0,249, 10, 7, 0,250, 10, 1, 1, 10, 0, 4, 0, 6, 10, 4, 0,251, 10, - 7, 0,252, 10, 7, 0,253, 10, 7, 0,254, 10, 7, 0,255, 10, 7, 0, 9, 0, 7, 0, 11, 0, 4, 0, 87, 1, 4, 0, 6, 3, - 0, 1, 18, 0, 4, 0,131, 0, 4, 0, 0, 11, 4, 0, 1, 11, 7, 0, 2, 11, 4, 0, 3, 11, 7, 0, 4, 11, 7, 0, 5, 11, - 4, 0, 6, 11, 7, 0, 7, 11, 4, 0, 8, 11, 7, 0, 9, 11, 1, 1, 10, 11, 7, 0, 11, 11, 7, 0, 12, 11, 7, 0, 13, 11, - 7, 0, 14, 11, 4, 0, 15, 11, 4, 0, 27, 0,192, 1, 4, 0, 42, 0,249, 2, 7, 0, 16, 11, 7, 0,181, 1, 7, 0, 27, 0, -214, 0, 36, 0, 22, 0, 32, 0,192, 1, 17, 11, 54, 0,239, 10, 46, 0, 18, 11,214, 0, 19, 11, 52, 0, 20, 11, 25, 0,153, 0, - 0, 0, 21, 11, 7, 0, 22, 11, 2, 0,115, 6, 2, 0, 23, 11, 7, 0, 43, 2, 4, 0,107, 0, 4, 0, 18, 0, 7, 0, 24, 11, - 4, 0, 93, 2, 4, 0, 25, 11, 7, 0, 26, 11, 7, 0, 27, 11, 7, 0, 28, 11, 7, 0,181, 1, 4, 0, 29, 11, 7, 0, 30, 11, - 0, 0, 31, 11, 0, 0, 32, 11, 0, 0, 33, 11, 0, 0, 34, 11, 7, 0, 35, 11, 7, 0, 36, 11, 7, 0, 37, 11, 7, 0, 6, 3, - 7, 0, 38, 11, 4, 0, 39, 11, 7, 0,247, 5, 7, 0, 40, 11, 7, 0, 41, 11,193, 1, 10, 0, 4, 0, 16, 0, 4, 0,127, 0, - 4, 0, 18, 0, 4, 0, 20, 4, 4, 0, 42, 11, 4, 0, 43, 11, 4, 0, 44, 11, 4, 0, 69, 0, 0, 0, 19, 0, 11, 0, 2, 0, -194, 1, 1, 0, 0, 0, 78, 7, 95, 0, 8, 0,193, 1, 45, 11, 4, 0, 46, 11, 4, 0, 47, 11, 4, 0, 48, 11, 4, 0, 49, 11, - 4, 0, 30, 0, 11, 0, 50, 11,194, 1, 51, 11,195, 1, 5, 0, 7, 0,170, 2, 7, 0,245, 2, 7, 0, 43, 2, 2, 0,152, 2, - 2, 0, 27, 0,196, 1, 5, 0, 7, 0,170, 2, 7, 0,164, 4, 7, 0, 52, 11, 7, 0, 53, 11, 7, 0,245, 2,197, 1, 5, 0, - 27, 0, 54, 11,198, 1, 21, 0, 7, 0, 81, 6, 7, 0, 55, 11, 7, 0, 55, 0,199, 1, 3, 0, 7, 0, 56, 11, 4, 0, 57, 11, - 4, 0, 58, 11,200, 1, 7, 0, 4, 0, 59, 11, 4, 0, 60, 11, 4, 0, 61, 11, 7, 0, 62, 11, 7, 0, 63, 11, 7, 0, 64, 11, - 7, 0, 55, 0,201, 1, 8, 0,201, 1, 0, 0,201, 1, 1, 0, 27, 0, 43, 0, 4, 0, 3, 1, 2, 0, 18, 0, 2, 0, 87, 1, - 7, 0,245, 2, 7, 0, 64, 9,202, 1, 7, 0,202, 1, 0, 0,202, 1, 1, 0, 27, 0, 43, 0, 2, 0,230, 2, 2, 0, 18, 0, - 2, 0, 17, 2, 2, 0, 55, 0,203, 1, 17, 0,196, 1, 13, 4,196, 1, 65, 11,195, 1, 66, 11,196, 1, 47, 9,197, 1, 67, 11, - 4, 0, 81, 0, 7, 0,245, 2, 7, 0, 12, 3, 7, 0, 68, 11, 4, 0, 59, 11, 4, 0, 69, 11, 7, 0, 63, 11, 7, 0, 64, 11, - 7, 0,107, 0, 4, 0, 70, 11, 2, 0, 18, 0, 2, 0, 71, 11,204, 1, 15, 0, 7, 0,255, 0, 7, 0, 72, 11, 7, 0, 56, 11, - 7, 0, 73, 11, 7, 0, 74, 11, 7, 0, 75, 11, 7, 0, 76, 11, 7, 0, 77, 11, 7, 0, 78, 11, 7, 0, 79, 11, 7, 0, 80, 11, - 7, 0, 81, 11, 7, 0, 82, 11, 4, 0, 18, 0, 4, 0, 83, 11,205, 1,128, 0, 22, 0, 32, 0, 34, 0, 74, 0,206, 1, 84, 11, -204, 1, 85, 11,188, 0,159, 4, 4, 0, 18, 0, 4, 0, 55, 0, 2, 0, 16, 0, 2, 0, 66, 10, 2, 0, 86, 11, 2, 0,124, 1, - 2, 0, 87, 11, 2, 0,237, 3, 2, 0, 88, 11, 2, 0, 89, 11, 2, 0, 90, 11, 2, 0, 91, 11, 2, 0, 92, 11, 2, 0, 93, 11, - 2, 0, 94, 11, 2, 0, 95, 11, 2, 0, 96, 11, 2, 0,231, 5, 2, 0, 97, 11, 2, 0, 98, 11, 2, 0, 99, 11, 2, 0,100, 11, - 2, 0,101, 11, 2, 0, 32, 2, 2, 0, 40, 9, 2, 0, 15, 9, 2, 0,102, 11, 2, 0,103, 11, 2, 0, 30, 4, 2, 0, 31, 4, - 2, 0,104, 11, 2, 0,105, 11, 2, 0,106, 11, 2, 0,107, 11, 7, 0,108, 11, 7, 0,109, 11, 7, 0,110, 11, 7, 0,111, 11, - 7, 0,112, 11, 7, 0,113, 11, 7, 0,114, 11, 2, 0,161, 5, 2, 0,115, 11, 7, 0,116, 11, 7, 0,117, 11, 7, 0,118, 11, - 7, 0, 22, 9, 7, 0, 90, 0, 7, 0, 12, 3, 7, 0, 28, 9, 7, 0,119, 11, 7, 0,120, 11, 7, 0,121, 11, 7, 0,122, 11, - 7, 0,123, 11, 7, 0,124, 11, 4, 0, 23, 9, 4, 0, 21, 9, 4, 0,125, 11, 4, 0,126, 11, 2, 0,127, 11, 2, 0,128, 11, - 7, 0, 24, 9, 7, 0, 25, 9, 7, 0, 26, 9, 7, 0,129, 11, 7, 0,130, 11, 7, 0,131, 11, 7, 0,132, 11, 7, 0,133, 11, - 7, 0,134, 11, 7, 0,135, 11, 7, 0,136, 11, 7, 0,137, 11, 7, 0,227, 3, 7, 0,107, 0, 7, 0,138, 11, 7, 0,139, 11, - 7, 0,140, 11, 7, 0,141, 11, 7, 0,213, 0, 7, 0,142, 11, 4, 0,143, 11, 4, 0,144, 11, 7, 0,145, 11, 7, 0,146, 11, - 7, 0,147, 11, 7, 0,148, 11, 7, 0,149, 11, 7, 0,212, 0, 7, 0,150, 11, 7, 0, 57, 4, 7, 0, 55, 4, 7, 0, 56, 4, - 7, 0,151, 11, 7, 0,152, 11, 7, 0,153, 11, 7, 0,154, 11, 7, 0,155, 11, 7, 0,156, 11, 7, 0,157, 11, 7, 0,158, 11, - 7, 0,159, 11, 7, 0,160, 11, 7, 0,161, 11, 7, 0,162, 11, 7, 0,163, 11, 7, 0,164, 11, 7, 0,165, 11, 7, 0,166, 11, - 7, 0,167, 11, 7, 0,168, 11, 4, 0,169, 11, 4, 0,170, 11, 46, 0,143, 1, 64, 0, 5, 4, 14, 0,171, 11, 64, 0,172, 11, - 27, 0,173, 11, 27, 0,174, 11, 31, 0, 79, 0,183, 0, 73, 1,183, 0,175, 11,151, 0, 52, 0,151, 0, 0, 0,151, 0, 1, 0, -205, 1,176, 11,203, 1,177, 11,200, 1,225, 9,191, 0, 85, 4, 11, 0, 86, 4,207, 1,178, 11,207, 1,179, 11, 14, 0,180, 11, - 14, 0,181, 11,136, 0,182, 11,144, 0,183, 11,144, 0,184, 11, 27, 0,185, 11, 27, 0,186, 11, 27, 0, 37, 0, 14, 0, 33, 10, - 0, 0, 19, 0, 7, 0,244, 0, 7, 0, 41, 3, 7, 0,187, 11, 7, 0,188, 11, 4, 0,219, 2, 4, 0,189, 11, 4, 0, 18, 0, - 4, 0, 23, 9, 4, 0,190, 11, 4, 0,191, 11, 4, 0,192, 11, 4, 0,193, 11, 2, 0,251, 0, 2, 0,194, 11, 2, 0,195, 11, - 2, 0,196, 11, 0, 0,197, 11, 2, 0,198, 11, 2, 0,199, 11, 2, 0,200, 11, 11, 0,201, 11,140, 0,158, 4, 14, 0, 26, 3, - 14, 0,202, 11,199, 1,203, 11, 4, 0,204, 11, 4, 0,205, 11,208, 1,206, 11,142, 0, 38, 3,209, 1,207, 11, 7, 0,208, 11, - 7, 0,209, 11, 7, 0,210, 11,138, 0, 38, 0,210, 1,159, 9, 7, 0,128, 4, 7, 0,211, 11, 7, 0,212, 11, 7, 0, 81, 6, - 7, 0,241, 3, 7, 0,227, 3, 7, 0,213, 11, 7, 0, 95, 2, 7, 0,214, 11, 7, 0,215, 11, 7, 0,216, 11, 7, 0,217, 11, - 7, 0,218, 11, 7, 0,219, 11, 7, 0,129, 4, 7, 0,220, 11, 7, 0,221, 11, 7, 0,222, 11, 7, 0,130, 4, 7, 0,126, 4, - 7, 0,127, 4, 7, 0,223, 11, 7, 0,224, 11, 7, 0,225, 11, 4, 0,226, 11, 4, 0, 91, 0, 4, 0,227, 11, 4, 0,228, 11, - 2, 0,229, 11, 2, 0,230, 11, 2, 0,231, 11, 2, 0,232, 11, 2, 0,233, 11, 2, 0,234, 11, 2, 0,235, 11, 2, 0, 27, 0, -188, 0,159, 4,139, 0, 11, 0,210, 1,236, 11, 7, 0,237, 11, 7, 0,238, 11, 7, 0,254, 1, 7, 0,239, 11, 7, 0,240, 11, - 7, 0,241, 11, 4, 0, 91, 0, 2, 0,242, 11, 2, 0,243, 11, 64, 0,253, 1,211, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, - 7, 0, 7, 0, 7, 0,244, 11,212, 1, 6, 0,212, 1, 0, 0,212, 1, 1, 0,211, 1,201, 9, 4, 0, 1, 1, 2, 0,245, 11, - 2, 0, 18, 0,213, 1, 5, 0,213, 1, 0, 0,213, 1, 1, 0, 14, 0,246, 11, 4, 0,247, 11, 4, 0, 18, 0,214, 1, 9, 0, -214, 1, 0, 0,214, 1, 1, 0, 14, 0,126, 0,213, 1,248, 11, 4, 0, 18, 0, 2, 0,245, 11, 2, 0,249, 11, 7, 0, 92, 0, - 0, 0,250, 11,179, 0, 6, 0, 22, 0, 32, 0, 14, 0,130, 5, 4, 0, 18, 0, 2, 0,251, 11, 2, 0,252, 11, 11, 0,253, 11, -215, 1, 6, 0, 14, 0,254, 11, 4, 0,255, 11, 4, 0, 0, 12, 4, 0, 18, 0, 4, 0, 27, 0,238, 0, 1, 12,216, 1, 19, 0, - 22, 0, 32, 0,217, 1, 2, 12,217, 1, 3, 12, 14, 0, 4, 12, 4, 0, 5, 12, 2, 0, 6, 12, 2, 0, 7, 12, 14, 0, 8, 12, - 14, 0, 9, 12,215, 1, 10, 12, 14, 0, 11, 12, 14, 0, 12, 12, 14, 0, 13, 12, 14, 0, 14, 12,218, 1, 15, 12,218, 1, 16, 12, -218, 1, 17, 12, 14, 0, 18, 12,238, 0, 19, 12,217, 1, 32, 0,217, 1, 0, 0,217, 1, 1, 0, 11, 0, 20, 12, 4, 0,127, 8, - 2, 0, 21, 12, 2, 0, 27, 0, 28, 1, 22, 12, 28, 1, 23, 12, 0, 0, 24, 12, 2, 0, 25, 12, 2, 0, 26, 12, 2, 0,149, 8, - 2, 0,150, 8, 2, 0, 27, 12, 2, 0, 28, 12, 2, 0, 20, 4, 2, 0, 59, 7, 2, 0, 29, 12, 2, 0, 30, 12, 2, 0, 31, 12, - 2, 0, 30, 0,219, 1, 32, 12,220, 1, 33, 12,221, 1, 34, 12, 4, 0, 35, 12, 4, 0, 36, 12, 11, 0, 37, 12, 14, 0, 9, 12, - 14, 0,169, 8, 14, 0, 38, 12, 14, 0, 39, 12, 14, 0, 40, 12,222, 1, 18, 0,222, 1, 0, 0,222, 1, 1, 0, 0, 0, 41, 12, - 21, 0, 31, 0, 0, 0, 42, 12, 2, 0, 43, 12, 2, 0, 16, 0, 2, 0, 14, 0, 2, 0, 44, 12, 2, 0, 45, 12, 2, 0, 46, 12, - 2, 0, 47, 12, 2, 0, 48, 12, 2, 0, 18, 0, 2, 0, 49, 12, 2, 0, 32, 0, 2, 0, 27, 0,223, 1, 50, 12,224, 1, 4, 0, -224, 1, 0, 0,224, 1, 1, 0,222, 1, 51, 12,222, 1, 52, 12,225, 1, 11, 0,225, 1, 0, 0,225, 1, 1, 0, 14, 0, 53, 12, - 14, 0, 54, 12, 0, 0, 41, 12, 2, 0, 55, 12, 2, 0, 56, 12, 2, 0, 18, 0, 2, 0, 57, 12, 4, 0, 58, 12, 11, 0, 59, 12, -218, 1, 7, 0,218, 1, 0, 0,218, 1, 1, 0, 0, 0, 41, 12, 0, 0, 60, 12, 14, 0, 67, 8, 4, 0, 61, 12, 4, 0, 18, 0, -250, 0, 14, 0,250, 0, 0, 0,250, 0, 1, 0, 0, 0, 41, 12, 21, 0, 31, 0,226, 1,143, 8, 11, 0, 62, 12, 11, 0, 63, 12, -223, 1, 50, 12,215, 1, 64, 12, 14, 0, 65, 12,250, 0, 66, 12, 33, 1,245, 6, 2, 0, 18, 0, 2, 0, 86, 1,227, 1, 12, 0, -227, 1, 0, 0,227, 1, 1, 0, 11, 0, 2, 0, 11, 0, 67, 12, 0, 0, 19, 0, 2, 0, 16, 0, 2, 0, 18, 0, 7, 0,147, 9, - 7, 0,128, 0, 7, 0,137, 4, 7, 0, 97, 9, 7, 0, 89, 10,228, 1, 5, 0, 7, 0, 68, 12, 4, 0, 69, 12, 4, 0, 70, 12, - 4, 0, 87, 1, 4, 0, 18, 0,229, 1, 6, 0, 7, 0, 71, 12, 7, 0, 72, 12, 7, 0, 73, 12, 7, 0, 74, 12, 4, 0, 16, 0, - 4, 0, 18, 0,230, 1, 5, 0, 7, 0,125, 9, 7, 0,126, 9, 7, 0,245, 2, 2, 0, 46, 2, 2, 0, 47, 2,231, 1, 5, 0, -230, 1, 2, 0, 4, 0, 52, 0, 7, 0, 75, 12, 7, 0,125, 9, 7, 0,126, 9,232, 1, 4, 0, 2, 0, 76, 12, 2, 0, 77, 12, - 2, 0, 78, 12, 2, 0, 79, 12,233, 1, 2, 0, 37, 0, 43, 7, 21, 0,165, 9,234, 1, 3, 0, 19, 0, 80, 12, 4, 0, 18, 0, - 4, 0, 27, 0,235, 1, 6, 0, 7, 0,107, 0, 7, 0,214, 2, 7, 0, 81, 12, 7, 0, 27, 0, 2, 0,250, 0, 2, 0, 82, 12, -236, 1, 5, 0, 7, 0, 83, 12, 7, 0,127, 0, 7, 0,202, 9, 7, 0,203, 9, 4, 0, 18, 0,237, 1, 6, 0, 22, 0, 48, 7, - 0, 0, 84, 12, 0, 0, 85, 12, 2, 0, 86, 12, 2, 0, 18, 0, 4, 0, 87, 12,238, 1, 7, 0,238, 1, 0, 0,238, 1, 1, 0, - 0, 0, 19, 0,237, 1, 88, 12, 2, 0, 89, 12, 2, 0, 16, 0, 7, 0, 59, 0,239, 1, 7, 0, 14, 0, 90, 12, 0, 0, 91, 12, - 11, 0, 92, 12, 7, 0, 59, 0, 7, 0,147, 9, 4, 0, 16, 0, 4, 0, 18, 0,240, 1, 3, 0, 7, 0, 93, 12, 4, 0, 18, 0, - 4, 0, 27, 0,241, 1, 15, 0,241, 1, 0, 0,241, 1, 1, 0,107, 1, 20, 10,239, 1, 60, 0, 14, 0,193, 3, 30, 0, 48, 0, -240, 1, 94, 12, 4, 0, 52, 0, 7, 0, 59, 0, 2, 0, 18, 0, 2, 0, 22, 1, 4, 0, 95, 12, 0, 0, 84, 12, 4, 0, 96, 12, - 7, 0, 97, 12,242, 1, 2, 0, 0, 0, 98, 12, 0, 0, 99, 12,243, 1, 4, 0,243, 1, 0, 0,243, 1, 1, 0,177, 0, 75, 3, - 14, 0,100, 12,244, 1, 25, 0,244, 1, 0, 0,244, 1, 1, 0, 14, 0,101, 12,177, 0, 95, 9,243, 1,102, 12, 14, 0,103, 12, - 14, 0,193, 3, 0, 0, 19, 0, 7, 0,147, 9, 7, 0,104, 12, 7, 0, 89, 0, 7, 0, 90, 0, 7, 0, 85, 10, 7, 0, 86, 10, - 7, 0, 2, 3, 7, 0,153, 3, 7, 0, 97, 9, 7, 0, 89, 10, 2, 0,105, 12, 2, 0,106, 12, 2, 0, 66, 0, 2, 0, 16, 0, - 11, 0,107, 12, 4, 0, 18, 0, 4, 0, 30, 0,245, 1, 6, 0,245, 1, 0, 0,245, 1, 1, 0, 14, 0,101, 12, 4, 0, 18, 0, - 4, 0, 17, 2, 0, 0, 19, 0,246, 1, 11, 0,246, 1, 0, 0,246, 1, 1, 0, 22, 0, 48, 7, 0, 0,108, 12, 4, 0, 87, 12, - 2, 0,109, 12, 2, 0, 27, 0, 0, 0, 84, 12, 4, 0, 95, 12, 2, 0, 18, 0, 2, 0,110, 12,247, 1, 10, 0,247, 1, 0, 0, -247, 1, 1, 0, 14, 0,111, 12, 0, 0, 41, 12, 0, 0, 19, 0, 0, 0,112, 12, 0, 0,113, 12, 2, 0, 18, 0, 2, 0,110, 12, - 4, 0,114, 12,248, 1, 5, 0,248, 1, 0, 0,248, 1, 1, 0, 0, 0, 84, 12, 4, 0, 95, 12, 7, 0,235, 2, 34, 0, 12, 0, -177, 0,184, 3,177, 0,115, 12,243, 1,102, 12, 14, 0,116, 12,244, 1,117, 12, 14, 0,118, 12, 14, 0,119, 12, 4, 0, 18, 0, - 4, 0,251, 0, 2, 0,120, 12, 2, 0,121, 12, 7, 0,122, 12,249, 1, 2, 0, 22, 0, 32, 0, 34, 0, 74, 0,250, 1, 5, 0, -250, 1, 0, 0,250, 1, 1, 0, 4, 0, 16, 0, 4, 0, 18, 0, 0, 0,179, 5,251, 1, 6, 0,250, 1,123, 12, 27, 0, 43, 0, - 4, 0,124, 12, 7, 0,125, 12, 4, 0,126, 12, 4, 0, 6, 10,252, 1, 3, 0,250, 1,123, 12, 4, 0,124, 12, 7, 0,127, 12, -253, 1, 8, 0,250, 1,123, 12, 27, 0, 43, 0, 7, 0, 77, 1, 7, 0,128, 12, 7, 0, 41, 3, 7, 0,158, 9, 4, 0,124, 12, - 4, 0,129, 12,254, 1, 5, 0,250, 1,123, 12, 7, 0,130, 12, 7, 0,181, 2, 7, 0, 8, 3, 7, 0, 55, 0,255, 1, 3, 0, -250, 1,123, 12, 7, 0,158, 9, 7, 0,131, 12,198, 1, 4, 0, 7, 0,132, 12, 7, 0,139, 11, 2, 0,133, 12, 2, 0, 87, 1, - 0, 2, 14, 0, 0, 2, 0, 0, 0, 2, 1, 0, 14, 0,134, 12, 14, 0,135, 12, 14, 0,136, 12, 0, 0,179, 5, 4, 0, 32, 0, - 4, 0, 18, 0, 4, 0,137, 12, 7, 0,138, 12, 4, 0,126, 12, 4, 0, 6, 10, 7, 0, 89, 4, 7, 0, 10, 3,206, 1, 23, 0, - 4, 0,124, 12, 4, 0,139, 12, 7, 0,140, 12, 7, 0, 6, 3, 7, 0,141, 12, 7, 0,238, 8, 7, 0,132, 12, 7, 0,142, 12, - 7, 0,214, 2, 7, 0, 2, 11, 7, 0,222, 4, 7, 0,143, 12, 7, 0,144, 12, 7, 0,145, 12, 7, 0,146, 12, 7, 0,147, 12, - 7, 0,148, 12, 7, 0,149, 12, 7, 0,150, 12, 7, 0,151, 12, 7, 0,152, 12, 7, 0,153, 12, 14, 0,154, 12,124, 0, 40, 0, -123, 0,155, 12, 1, 2, 85, 11, 64, 0,156, 12, 64, 0,172, 11, 64, 0,157, 12, 2, 2,158, 12, 43, 0,168, 0, 43, 0,159, 12, - 43, 0,160, 12, 7, 0,161, 12, 7, 0,162, 12, 7, 0,163, 12, 7, 0,164, 12, 7, 0,165, 12, 7, 0,126, 8, 7, 0,166, 12, - 7, 0,181, 1, 7, 0,167, 12, 4, 0,168, 12, 4, 0,169, 12, 4, 0,170, 12, 4, 0, 91, 0, 4, 0, 27, 0, 4, 0,171, 12, - 2, 0,172, 12, 2, 0,173, 12, 4, 0,174, 12, 7, 0,214, 2, 4, 0,175, 12, 7, 0,176, 12, 4, 0,177, 12, 4, 0,178, 12, - 4, 0,179, 12,140, 0,180, 12, 14, 0,181, 12,188, 0,159, 4, 4, 0,182, 12, 7, 0,183, 12, 7, 0,184, 12, 4, 0, 30, 0, -125, 0, 12, 0,123, 0,155, 12,151, 0, 61, 3, 7, 0,146, 1, 7, 0,126, 8, 7, 0,185, 12, 7, 0,186, 12, 7, 0,187, 12, - 2, 0,188, 12, 2, 0,189, 12, 2, 0,190, 12, 2, 0, 16, 0, 4, 0, 91, 0,126, 0, 15, 0,123, 0,155, 12,142, 0, 38, 3, - 7, 0,201, 9, 7, 0,191, 12, 7, 0,192, 12, 4, 0,193, 12, 7, 0, 79, 1, 7, 0,194, 12, 4, 0, 42, 10, 4, 0, 34, 3, - 4, 0,195, 12, 7, 0,164, 12, 2, 0, 16, 0, 2, 0, 27, 0, 4, 0, 30, 0, 3, 2, 15, 0, 22, 0, 32, 0, 34, 0, 74, 0, - 47, 1,236, 8, 7, 0,196, 12, 7, 0,197, 12, 7, 0,198, 12, 7, 0,199, 12, 7, 0,157, 9, 7, 0,200, 12, 7, 0,201, 12, - 7, 0,202, 12, 7, 0, 89, 4, 7, 0,238, 8, 2, 0, 18, 0, 2, 0,121, 9,232, 0, 3, 0, 4, 0,125, 0, 2, 0,221, 6, - 2, 0,203, 12, 4, 2, 5, 0, 0, 0,202, 8, 2, 0,203, 8, 2, 0, 79, 5, 2, 0,204, 12, 2, 0,205, 12,230, 0, 16, 0, - 22, 0, 32, 0, 34, 0, 74, 0, 0, 0, 35, 0, 4, 0,142, 0, 4, 0,143, 0, 4, 0,206, 12, 7, 0,161, 0, 7, 0,162, 0, - 44, 0,137, 0, 5, 2,159, 9,179, 0,187, 3, 6, 2,207, 12, 11, 0,208, 12, 4, 2,209, 12, 4, 0, 18, 0, 4, 0, 22, 0, - 14, 1, 10, 0, 4, 0,131, 0, 4, 0,210, 12, 52, 0,211, 12, 7, 0,212, 12, 2, 0,213, 12, 0, 0,186, 2, 4, 0,125, 0, - 7, 2,180, 3, 8, 2,214, 12, 7, 0,215, 12, 9, 2, 3, 0, 4, 0,125, 0, 7, 0,216, 12, 7, 0, 79, 1, 10, 2, 11, 0, - 11, 0,217, 12, 7, 0,218, 12, 7, 0,219, 12, 7, 0, 27, 0, 7, 0,220, 12, 2, 0,221, 12, 2, 0, 66, 0, 7, 0,222, 12, - 7, 0,223, 12, 7, 0,224, 12, 7, 0,225, 12, 8, 2, 3, 0, 7, 0,226, 12, 4, 0,125, 0, 4, 0, 18, 0, 7, 2, 24, 0, - 7, 2, 0, 0, 7, 2, 1, 0, 0, 0, 19, 0, 7, 0,227, 12, 7, 0,228, 12, 7, 0,229, 12, 7, 0,230, 12, 7, 0, 16, 11, - 4, 0,231, 12, 4, 0,232, 12, 8, 2,233, 12, 7, 0,234, 12, 7, 0,216, 12, 4, 0, 18, 0, 4, 0,235, 12, 4, 0,236, 12, - 7, 0, 97, 12, 2, 0,237, 12, 2, 0,232, 3, 2, 0,238, 12, 2, 0,239, 12, 2, 0,240, 12, 2, 0, 30, 0, 7, 0,241, 12, - 11, 2, 22, 0, 4, 0, 18, 0, 2, 0,242, 12, 2, 0,243, 12, 7, 0,244, 12, 2, 0,245, 12, 2, 0,246, 12, 2, 0,247, 12, - 2, 0,248, 12, 2, 0,249, 12, 2, 0,250, 12, 2, 0,251, 12, 2, 0, 8, 3, 4, 0,252, 12, 4, 0,253, 12, 2, 0,254, 12, - 2, 0, 30, 0, 7, 0, 94, 1, 4, 0,255, 12, 4, 0, 0, 13, 7, 0, 1, 13, 7, 0, 2, 13, 4, 0,250, 1, 12, 2, 12, 0, - 4, 0, 18, 0, 4, 0, 3, 13, 4, 0, 4, 13, 7, 0, 5, 13, 7, 2, 6, 13, 7, 0, 7, 13, 7, 0, 8, 13, 7, 0, 9, 13, - 4, 0,193, 1, 4, 0,131, 0, 7, 0,153, 3, 52, 0, 10, 13, 13, 2, 5, 0, 4, 0, 18, 0, 7, 0,216, 12, 4, 0, 11, 13, - 4, 0, 12, 13, 9, 2, 13, 13, 14, 2, 7, 0, 14, 2, 0, 0, 14, 2, 1, 0, 0, 0, 19, 0, 4, 0, 18, 0, 7, 0,153, 3, - 14, 0, 14, 13, 13, 2, 15, 13, 15, 2, 1, 0, 0, 0, 16, 13, 16, 2, 8, 0, 16, 2, 0, 0, 16, 2, 1, 0, 7, 2,180, 3, - 4, 0, 27, 0, 4, 0, 17, 13, 4, 0, 18, 13, 4, 0, 19, 13, 4, 0, 20, 13, 17, 2, 6, 0, 4, 0,131, 0, 4, 0, 27, 0, - 14, 0, 6, 10, 4, 0, 21, 13, 2, 0, 22, 13, 2, 0, 23, 13, 6, 2, 11, 0, 11, 2, 24, 13, 10, 2, 25, 13, 14, 0, 14, 13, - 13, 2, 15, 13, 12, 2, 26, 13, 7, 2, 27, 13, 14, 0, 28, 13, 4, 0, 29, 13, 4, 0, 30, 13, 15, 2, 96, 6, 17, 2, 31, 13, - 18, 2, 48, 0, 18, 2, 0, 0, 18, 2, 1, 0,170, 0,150, 3, 19, 2, 2, 0, 64, 0, 32, 13,188, 0,159, 4,140, 0,158, 4, - 14, 0, 26, 3, 4, 0, 33, 13, 0, 0, 19, 0, 2, 0,172, 10, 2, 0, 16, 0, 2, 0, 34, 13, 2, 0, 35, 13, 2, 0, 36, 13, - 2, 0, 37, 13, 2, 0, 38, 13, 2, 0, 39, 13, 4, 0, 91, 0, 4, 0,191, 3, 4, 0, 40, 13, 4, 0, 41, 13, 4, 0,202, 9, - 4, 0,203, 9, 4, 0, 27, 0, 7, 0, 42, 13, 47, 0, 43, 13, 0, 0, 44, 13, 4, 0, 45, 13, 4, 0,174, 12, 7, 0, 46, 13, - 7, 0, 47, 13, 7, 0, 48, 13, 7, 0, 49, 13, 7, 0, 50, 13, 7, 0, 51, 13, 7, 0, 52, 13, 7, 0, 53, 13, 7, 0, 54, 13, - 7, 0, 55, 13, 7, 0, 56, 13, 7, 0, 57, 13, 7, 0, 58, 13, 7, 0, 59, 13, 0, 0,207, 2, 0, 0, 60, 13, 0, 0, 61, 13, - 0, 0, 62, 13,170, 0, 7, 0,169, 0, 63, 13,144, 0, 40, 3, 14, 0, 64, 13, 2, 0, 65, 13, 2, 0, 91, 0, 4, 0, 27, 0, - 0, 0, 66, 13,171, 0, 24, 0,169, 0, 63, 13,144, 0, 40, 3,151, 0, 61, 3, 63, 0, 29, 2, 4, 0, 91, 0, 4, 0, 67, 13, - 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,181, 1, 7, 0, 68, 13, 7, 0, 69, 13, 7, 0, 70, 13, 7, 0, 71, 13, - 50, 0, 72, 13, 50, 0, 73, 13, 2, 0, 74, 13, 2, 0,233, 10, 2, 0, 75, 13, 2, 0, 27, 0, 7, 0, 76, 13, 7, 0, 77, 13, - 7, 0, 78, 13, 7, 0, 79, 13, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 0, 28, 0, 88, 0, 24, 0,160, 0, 16, 0,152, 0, 72, 0,168, 0, 48, 0,208, 0, 56, 0, 16, 0,112, 1, 0, 0, 0, 0, + 0, 0, 16, 0, 16, 0, 4, 0, 24, 0, 16, 0, 4, 0, 16, 0, 24, 0,104, 0, 20, 0, 24, 0, 24, 0, 8, 0, 40, 0, 28, 0, + 12, 0, 12, 0, 32, 4, 40, 4, 64, 4, 44, 0, 24, 0, 8, 0,128, 0, 64, 0, 32, 0, 16, 0, 32, 0, 32, 0, 8, 0, 96, 0, + 20, 0,200, 3,216, 3,208, 3,200, 3,208, 3,208, 3,200, 3,208, 3,208, 3,208, 3,208, 3, 64, 0, 64, 0, 12, 0, 56, 0, + 24, 0,104, 0, 0, 4, 24, 0, 56, 0, 56, 0, 20, 0, 16, 0, 64, 0, 40, 0, 32, 0,192, 0, 60, 0, 16, 3,104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, 88, 1, 0, 1,168, 0, 0, 0, 0, 0, 0, 0,184, 0, 0, 0, + 32, 0,136, 0, 0, 0,120, 0, 24, 0, 24, 0, 16, 0, 24, 0, 8, 0, 16, 0, 24, 0, 20, 0, 20, 0, 56, 0, 24, 2, 40, 1, + 16, 0,104, 0, 0, 1, 40, 0,208, 0,104, 0,112, 0,216, 1, 32, 0,128, 0, 56, 0, 80, 0, 64, 0,104, 0, 72, 0, 64, 0, +128, 0, 0, 0, 0, 0,184, 0, 8, 3, 0, 0, 24, 1,192, 0, 16, 0, 72, 0, 48, 0, 64, 0, 56, 0, 24, 0,128, 0, 0, 1, + 48, 0, 32, 0, 16, 6, 0, 0, 83, 84, 82, 67,217, 1, 0, 0, 12, 0, 2, 0, 12, 0, 0, 0, 12, 0, 1, 0, 13, 0, 3, 0, + 13, 0, 0, 0, 13, 0, 1, 0, 11, 0, 2, 0, 14, 0, 2, 0, 11, 0, 3, 0, 11, 0, 4, 0, 15, 0, 2, 0, 2, 0, 5, 0, + 2, 0, 6, 0, 16, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 17, 0, 3, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, + 18, 0, 4, 0, 4, 0, 8, 0, 4, 0, 9, 0, 4, 0, 10, 0, 4, 0, 11, 0, 19, 0, 4, 0, 7, 0, 8, 0, 7, 0, 9, 0, + 7, 0, 10, 0, 7, 0, 11, 0, 20, 0, 4, 0, 11, 0, 12, 0, 14, 0, 13, 0, 4, 0, 14, 0, 4, 0, 15, 0, 21, 0, 10, 0, + 21, 0, 0, 0, 21, 0, 1, 0, 0, 0, 16, 0, 0, 0, 17, 0, 2, 0, 18, 0, 0, 0, 19, 0, 4, 0, 20, 0, 20, 0, 21, 0, + 4, 0, 22, 0, 4, 0, 23, 0, 22, 0, 11, 0, 11, 0, 0, 0, 11, 0, 1, 0, 22, 0, 24, 0, 23, 0, 25, 0, 0, 0, 26, 0, + 2, 0, 27, 0, 2, 0, 28, 0, 2, 0, 18, 0, 4, 0, 29, 0, 4, 0, 30, 0, 21, 0, 31, 0, 23, 0, 6, 0, 22, 0, 32, 0, + 22, 0, 33, 0, 24, 0, 34, 0, 0, 0, 35, 0, 0, 0, 36, 0, 23, 0, 37, 0, 25, 0, 5, 0, 4, 0, 38, 0, 4, 0, 39, 0, + 2, 0, 40, 0, 2, 0, 41, 0, 4, 0, 42, 0, 26, 0, 6, 0, 27, 0, 43, 0, 2, 0, 44, 0, 2, 0, 45, 0, 2, 0, 16, 0, + 2, 0, 18, 0, 0, 0, 46, 0, 28, 0, 21, 0, 28, 0, 0, 0, 28, 0, 1, 0, 29, 0, 47, 0, 30, 0, 48, 0, 19, 0, 49, 0, + 19, 0, 50, 0, 2, 0, 44, 0, 2, 0, 45, 0, 2, 0, 51, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 18, 0, + 2, 0, 55, 0, 7, 0, 10, 0, 7, 0, 11, 0, 4, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0, 7, 0, 59, 0, 26, 0, 60, 0, + 31, 0, 7, 0, 22, 0, 32, 0, 14, 0, 61, 0, 19, 0, 62, 0, 2, 0, 44, 0, 2, 0, 63, 0, 2, 0, 64, 0, 2, 0, 27, 0, + 32, 0, 16, 0, 32, 0, 0, 0, 32, 0, 1, 0, 7, 0, 65, 0, 7, 0, 59, 0, 2, 0, 16, 0, 2, 0, 66, 0, 2, 0, 67, 0, + 2, 0, 18, 0, 4, 0, 68, 0, 4, 0, 69, 0, 11, 0, 2, 0, 7, 0, 70, 0, 0, 0, 19, 0, 0, 0, 71, 0, 7, 0, 72, 0, + 7, 0, 73, 0, 33, 0, 15, 0, 22, 0, 32, 0, 34, 0, 74, 0, 32, 0, 75, 0, 0, 0, 76, 0, 4, 0, 77, 0, 4, 0, 27, 0, + 14, 0, 78, 0, 31, 0, 79, 0, 22, 0, 80, 0, 2, 0, 16, 0, 2, 0, 81, 0, 2, 0, 82, 0, 2, 0, 18, 0, 7, 0, 83, 0, + 4, 0, 84, 0, 35, 0, 6, 0, 35, 0, 0, 0, 35, 0, 1, 0, 0, 0, 85, 0, 0, 0, 86, 0, 4, 0, 22, 0, 4, 0, 87, 0, + 36, 0, 10, 0, 36, 0, 0, 0, 36, 0, 1, 0, 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 90, 0, 4, 0, 66, 0, 4, 0, 13, 0, + 4, 0, 91, 0, 0, 0, 92, 0, 0, 0, 93, 0, 37, 0, 15, 0, 22, 0, 32, 0, 0, 0, 94, 0, 4, 0, 91, 0, 4, 0, 95, 0, + 14, 0, 96, 0, 35, 0, 97, 0, 35, 0, 98, 0, 4, 0, 99, 0, 4, 0,100, 0, 14, 0,101, 0, 0, 0,102, 0, 4, 0,103, 0, + 4, 0,104, 0, 11, 0,105, 0, 8, 0,106, 0, 38, 0, 3, 0, 4, 0,107, 0, 4, 0,108, 0, 11, 0, 2, 0, 39, 0, 20, 0, + 22, 0, 32, 0, 34, 0, 74, 0, 0, 0, 16, 0, 0, 0,109, 0, 2, 0, 18, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, + 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, 7, 0,120, 0, + 31, 0, 79, 0, 27, 0,121, 0, 0, 0,122, 0, 0, 0,123, 0, 40, 0, 14, 0, 41, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, + 4, 0,127, 0, 4, 0,128, 0, 0, 0,129, 0, 0, 0,130, 0, 0, 0,131, 0, 0, 0, 27, 0, 2, 0,132, 0, 2, 0,133, 0, + 2, 0,134, 0, 2, 0, 18, 0, 4, 0, 30, 0, 42, 0, 33, 0, 22, 0, 32, 0, 0, 0, 35, 0, 14, 0,135, 0, 43, 0,136, 0, + 44, 0,137, 0, 45, 0,138, 0, 45, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0, 2, 0,131, 0, 2, 0, 18, 0, 2, 0,142, 0, + 2, 0, 16, 0, 4, 0,143, 0, 2, 0,144, 0, 2, 0,145, 0, 2, 0,146, 0, 2, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0, + 4, 0,150, 0, 4, 0,151, 0, 38, 0,152, 0, 25, 0,153, 0, 7, 0,154, 0, 4, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0, + 2, 0,158, 0, 0, 0,159, 0, 0, 0,160, 0, 7, 0,161, 0, 7, 0,162, 0, 46, 0, 65, 0, 2, 0,163, 0, 2, 0,164, 0, + 2, 0,165, 0, 2, 0,166, 0, 27, 0,167, 0, 47, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0, + 0, 0,173, 0, 7, 0,174, 0, 7, 0,175, 0, 7, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 2, 0,180, 0, + 2, 0,181, 0, 2, 0,182, 0, 0, 0,183, 0, 0, 0,123, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, + 7, 0,188, 0, 7, 0, 55, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, + 7, 0,195, 0, 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, + 7, 0,203, 0, 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, + 7, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0, 7, 0,217, 0, 7, 0,218, 0, + 7, 0,219, 0, 7, 0,220, 0, 7, 0,221, 0, 7, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 48, 0, 15, 0, + 0, 0, 35, 0, 11, 0,226, 0, 0, 0,227, 0, 0, 0,228, 0, 4, 0,229, 0, 4, 0,230, 0, 11, 0,231, 0, 7, 0,232, 0, + 7, 0,233, 0, 7, 0,234, 0, 4, 0,235, 0, 11, 0,236, 0, 11, 0,237, 0, 4, 0,238, 0, 4, 0, 27, 0, 49, 0, 6, 0, + 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,239, 0, 7, 0, 65, 0, 4, 0, 62, 0, 50, 0, 5, 0, 2, 0, 18, 0, + 2, 0,240, 0, 2, 0, 62, 0, 2, 0,241, 0, 49, 0,234, 0, 51, 0, 17, 0, 27, 0,167, 0, 42, 0,242, 0, 52, 0,243, 0, + 7, 0,244, 0, 7, 0,245, 0, 2, 0, 16, 0, 2, 0,246, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,247, 0, 4, 0,248, 0, + 2, 0,249, 0, 2, 0,250, 0, 4, 0,131, 0, 4, 0,143, 0, 2, 0,251, 0, 2, 0,252, 0, 53, 0, 25, 0, 2, 0, 18, 0, + 2, 0,253, 0, 7, 0,254, 0, 7, 0,255, 0, 2, 0,142, 0, 2, 0, 0, 1, 4, 0, 1, 1, 4, 0, 2, 1, 27, 0,167, 0, + 4, 0, 3, 1, 2, 0, 4, 1, 2, 0, 5, 1, 11, 0, 6, 1, 7, 0, 7, 1, 7, 0, 8, 1, 2, 0, 9, 1, 2, 0, 10, 1, + 2, 0, 11, 1, 2, 0, 12, 1, 7, 0, 13, 1, 7, 0, 14, 1, 7, 0, 15, 1, 7, 0, 16, 1, 50, 0, 17, 1, 54, 0, 18, 1, + 55, 0, 13, 0, 4, 0, 19, 1, 4, 0, 20, 1, 2, 0, 21, 1, 2, 0, 18, 0, 2, 0, 22, 1, 2, 0, 23, 1, 27, 0,167, 0, + 7, 0, 24, 1, 4, 0, 25, 1, 0, 0, 26, 1, 7, 0, 27, 1, 4, 0, 28, 1, 4, 0,131, 0, 56, 0, 4, 0, 27, 0,167, 0, + 0, 0, 29, 1, 4, 0, 30, 1, 4, 0, 27, 0, 47, 0, 64, 0, 22, 0, 32, 0, 34, 0, 74, 0, 7, 0, 31, 1, 7, 0, 32, 1, + 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 7, 0, 30, 0, + 7, 0, 40, 1, 7, 0, 41, 1, 7, 0, 42, 1, 7, 0, 43, 1, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, + 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 7, 0, 51, 1, 2, 0, 52, 1, 2, 0, 53, 1, 2, 0, 54, 1, 2, 0, 55, 1, + 2, 0, 56, 1, 2, 0, 57, 1, 2, 0, 58, 1, 2, 0, 18, 0, 2, 0, 16, 0, 2, 0,246, 0, 7, 0, 59, 1, 7, 0, 60, 1, + 7, 0, 61, 1, 7, 0, 62, 1, 4, 0, 63, 1, 4, 0, 64, 1, 2, 0, 65, 1, 2, 0, 66, 1, 2, 0, 22, 1, 2, 0,129, 0, + 4, 0, 22, 0, 4, 0,126, 0, 4, 0,127, 0, 4, 0,128, 0, 7, 0, 67, 1, 7, 0, 68, 1, 7, 0, 66, 0, 40, 0, 69, 1, + 57, 0, 70, 1, 31, 0, 79, 0, 42, 0,242, 0, 48, 0, 71, 1, 50, 0, 17, 1, 51, 0, 72, 1, 25, 0,153, 0, 53, 0, 73, 1, + 55, 0, 74, 1, 56, 0, 75, 1, 0, 0, 76, 1, 0, 0,123, 0, 58, 0, 13, 0, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0,175, 0, + 4, 0, 18, 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0, 0, 0,173, 0, 4, 0, 27, 0, 7, 0, 79, 1, 7, 0, 80, 1, + 7, 0, 81, 1, 27, 0, 43, 0, 59, 0, 9, 0, 50, 0, 82, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, 4, 0, 18, 0, + 7, 0, 83, 1, 7, 0, 84, 1, 4, 0, 85, 1, 4, 0, 86, 1, 60, 0, 76, 0, 22, 0, 32, 0, 34, 0, 74, 0, 2, 0, 16, 0, + 2, 0, 18, 0, 4, 0, 87, 1, 2, 0,178, 0, 2, 0, 88, 1, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, + 7, 0, 89, 1, 7, 0, 90, 1, 7, 0, 91, 1, 7, 0, 92, 1, 7, 0, 93, 1, 7, 0, 94, 1, 7, 0, 95, 1, 7, 0, 96, 1, + 7, 0, 97, 1, 7, 0, 98, 1, 7, 0, 99, 1, 54, 0,100, 1, 2, 0,253, 0, 2, 0, 30, 0, 7, 0,111, 0, 7, 0,112, 0, + 7, 0,101, 1, 7, 0,102, 1, 7, 0,103, 1, 7, 0,104, 1, 7, 0,105, 1, 7, 0,106, 1, 2, 0,107, 1, 2, 0,108, 1, + 2, 0,109, 1, 2, 0,110, 1, 0, 0,111, 1, 0, 0,112, 1, 2, 0,113, 1, 2, 0,114, 1, 2, 0,115, 1, 2, 0,116, 1, + 2, 0,117, 1, 7, 0,118, 1, 7, 0,119, 1, 7, 0,120, 1, 7, 0,121, 1, 2, 0,122, 1, 2, 0,123, 1, 2, 0,124, 1, + 2, 0,125, 1, 2, 0,126, 1, 2, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, + 7, 0,133, 1, 7, 0,134, 1, 7, 0,135, 1, 7, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, + 2, 0,141, 1, 0, 0,142, 1, 31, 0, 79, 0, 46, 0,143, 1, 2, 0,144, 1, 2, 0, 76, 1, 0, 0,145, 1, 25, 0,153, 0, + 57, 0, 70, 1, 61, 0, 18, 0, 7, 0,146, 1, 7, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1, + 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 2, 0,156, 1, 2, 0,157, 1, 2, 0,158, 1, 2, 0,159, 1, + 7, 0,160, 1, 7, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 62, 0, 4, 0, 4, 0, 18, 0, 4, 0,164, 1, 4, 0,165, 1, + 4, 0, 66, 0, 63, 0,126, 0, 22, 0, 32, 0, 34, 0, 74, 0, 2, 0,166, 1, 2, 0, 18, 0, 7, 0,184, 0, 7, 0,185, 0, + 7, 0,186, 0, 7, 0,167, 1, 7, 0,168, 1, 7, 0,169, 1, 7, 0,170, 1, 7, 0,171, 1, 7, 0,172, 1, 7, 0,173, 1, + 7, 0,174, 1, 7, 0,175, 1, 7, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1, + 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 7, 0,185, 1, 7, 0,186, 1, 61, 0,187, 1, 62, 0,188, 1, 7, 0,189, 1, + 7, 0,190, 1, 7, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1, 2, 0,196, 1, 2, 0,197, 1, + 2, 0,198, 1, 0, 0,199, 1, 0, 0,200, 1, 7, 0,201, 1, 7, 0,202, 1, 2, 0,203, 1, 2, 0,204, 1, 7, 0,205, 1, + 7, 0,206, 1, 7, 0,207, 1, 7, 0,208, 1, 2, 0,209, 1, 2, 0,210, 1, 4, 0, 87, 1, 4, 0,211, 1, 2, 0,212, 1, + 2, 0,213, 1, 2, 0,214, 1, 2, 0,215, 1, 7, 0,216, 1, 7, 0,217, 1, 7, 0,218, 1, 7, 0,219, 1, 7, 0,220, 1, + 7, 0,221, 1, 7, 0,222, 1, 7, 0,223, 1, 7, 0,224, 1, 7, 0,225, 1, 0, 0,226, 1, 7, 0,227, 1, 7, 0,228, 1, + 7, 0,229, 1, 4, 0,230, 1, 0, 0,231, 1, 0, 0,124, 1, 0, 0,232, 1, 0, 0, 76, 1, 2, 0,233, 1, 2, 0,234, 1, + 2, 0,144, 1, 2, 0,235, 1, 2, 0,236, 1, 2, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1, + 7, 0,242, 1, 2, 0,163, 0, 2, 0,164, 0, 50, 0,243, 1, 50, 0,244, 1, 0, 0,245, 1, 0, 0,246, 1, 0, 0,247, 1, + 0, 0,248, 1, 2, 0,249, 1, 2, 0,250, 1, 7, 0,251, 1, 7, 0,252, 1, 46, 0,143, 1, 57, 0, 70, 1, 31, 0, 79, 0, + 64, 0,253, 1, 25, 0,153, 0, 7, 0,254, 1, 7, 0,255, 1, 7, 0, 0, 2, 7, 0, 1, 2, 7, 0, 2, 2, 2, 0, 3, 2, + 2, 0, 30, 0, 7, 0, 4, 2, 7, 0, 5, 2, 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, + 7, 0, 11, 2, 7, 0, 12, 2, 2, 0, 13, 2, 2, 0, 14, 2, 4, 0, 15, 2, 2, 0, 16, 2, 2, 0, 17, 2, 14, 0, 18, 2, + 65, 0, 4, 0, 22, 0, 32, 0, 0, 0, 35, 0, 66, 0, 2, 0, 38, 0,152, 0, 67, 0, 20, 0, 67, 0, 0, 0, 67, 0, 1, 0, + 68, 0, 19, 2, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 20, 2, 2, 0, 21, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, + 7, 0, 22, 2, 7, 0, 23, 2, 7, 0, 24, 2, 7, 0, 25, 2, 7, 0, 26, 2, 7, 0, 27, 2, 7, 0, 28, 2, 7, 0, 22, 0, + 7, 0, 29, 2, 7, 0, 30, 2, 69, 0, 20, 0, 22, 0, 32, 0, 34, 0, 74, 0, 68, 0, 19, 2, 14, 0, 31, 2, 14, 0, 32, 2, + 14, 0, 33, 2, 31, 0, 79, 0, 63, 0, 34, 2, 0, 0, 18, 0, 0, 0, 35, 2, 2, 0, 36, 2, 2, 0,177, 0, 2, 0, 27, 0, + 7, 0, 77, 1, 7, 0,175, 0, 7, 0, 78, 1, 7, 0, 37, 2, 7, 0, 38, 2, 7, 0, 39, 2, 67, 0, 40, 2, 30, 0, 11, 0, + 7, 0, 41, 2, 7, 0, 42, 2, 7, 0, 43, 2, 7, 0,255, 0, 2, 0, 53, 0, 0, 0, 44, 2, 0, 0, 45, 2, 0, 0, 46, 2, + 0, 0, 47, 2, 0, 0, 48, 2, 0, 0, 49, 2, 29, 0, 7, 0, 7, 0, 50, 2, 7, 0, 42, 2, 7, 0, 43, 2, 2, 0, 46, 2, + 2, 0, 49, 2, 7, 0,255, 0, 7, 0, 27, 0, 70, 0, 21, 0, 70, 0, 0, 0, 70, 0, 1, 0, 2, 0, 16, 0, 2, 0, 51, 2, + 2, 0, 49, 2, 2, 0, 18, 0, 2, 0, 52, 2, 2, 0, 53, 2, 2, 0, 54, 2, 2, 0, 55, 2, 2, 0, 56, 2, 2, 0, 57, 2, + 2, 0, 58, 2, 2, 0, 59, 2, 7, 0, 60, 2, 7, 0, 61, 2, 29, 0, 47, 0, 30, 0, 48, 0, 2, 0, 62, 2, 2, 0, 63, 2, + 4, 0, 64, 2, 71, 0, 5, 0, 2, 0, 65, 2, 2, 0, 51, 2, 0, 0, 18, 0, 0, 0, 27, 0, 2, 0, 30, 0, 72, 0, 4, 0, + 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 66, 2, 7, 0, 67, 2, 73, 0, 4, 0, 14, 0, 68, 2, 74, 0, 69, 2, 4, 0, 70, 2, + 0, 0, 93, 0, 75, 0, 70, 0, 22, 0, 32, 0, 34, 0, 74, 0, 68, 0, 19, 2, 14, 0, 71, 2, 14, 0, 32, 2, 73, 0, 72, 2, + 27, 0, 73, 2, 27, 0, 74, 2, 27, 0, 75, 2, 31, 0, 79, 0, 76, 0, 76, 2, 33, 0, 77, 2, 63, 0, 34, 2, 14, 0, 78, 2, + 7, 0, 77, 1, 7, 0,175, 0, 7, 0, 78, 1, 2, 0, 16, 0, 2, 0,177, 0, 2, 0, 79, 2, 2, 0, 80, 2, 7, 0, 81, 2, + 7, 0, 82, 2, 4, 0, 83, 2, 2, 0, 27, 0, 2, 0, 36, 2, 2, 0, 18, 0, 2, 0, 84, 2, 7, 0, 85, 2, 7, 0, 86, 2, + 7, 0, 87, 2, 2, 0, 54, 2, 2, 0, 55, 2, 2, 0, 88, 2, 2, 0, 89, 2, 4, 0, 90, 2, 11, 0, 91, 2, 2, 0, 22, 0, + 2, 0, 96, 0, 2, 0, 65, 0, 2, 0, 92, 2, 7, 0, 93, 2, 7, 0, 94, 2, 7, 0, 95, 2, 7, 0, 96, 2, 7, 0, 97, 2, + 7, 0, 98, 2, 7, 0, 99, 2, 7, 0,100, 2, 7, 0,101, 2, 7, 0,102, 2, 0, 0,103, 2, 77, 0,104, 2, 78, 0,105, 2, + 0, 0,106, 2, 65, 0,107, 2, 65, 0,108, 2, 65, 0,109, 2, 65, 0,110, 2, 4, 0,111, 2, 7, 0, 83, 0, 4, 0,112, 2, + 4, 0,113, 2, 72, 0,114, 2, 4, 0,115, 2, 4, 0,116, 2, 71, 0,117, 2, 71, 0,118, 2, 7, 0,119, 2, 7, 0,120, 2, + 79, 0, 47, 0, 22, 0, 32, 0, 34, 0, 74, 0, 68, 0, 19, 2, 31, 0, 79, 0, 33, 0, 77, 2, 63, 0, 34, 2, 80, 0,121, 2, + 81, 0,122, 2, 82, 0,123, 2, 83, 0,124, 2, 84, 0,125, 2, 85, 0,126, 2, 86, 0,127, 2, 87, 0,128, 2, 88, 0,129, 2, + 89, 0,130, 2, 90, 0,131, 2, 91, 0,132, 2, 92, 0,133, 2, 93, 0,134, 2, 79, 0,135, 2, 94, 0,136, 2, 95, 0,137, 2, + 95, 0,138, 2, 95, 0,139, 2, 95, 0,140, 2, 95, 0,141, 2, 4, 0, 52, 0, 4, 0,142, 2, 4, 0,143, 2, 4, 0,144, 2, + 4, 0,145, 2, 4, 0,146, 2, 4, 0,147, 2, 7, 0, 77, 1, 7, 0,175, 0, 7, 0, 78, 1, 2, 0,177, 0, 2, 0, 79, 2, + 2, 0,148, 2, 2, 0, 18, 0, 2, 0,149, 2, 2, 0,150, 2, 0, 0,151, 2, 0, 0,152, 2, 2, 0, 36, 2, 96, 0,153, 2, + 88, 0, 8, 0, 11, 0,154, 2, 7, 0,155, 2, 4, 0,156, 2, 0, 0, 18, 0, 0, 0,157, 2, 2, 0, 87, 1, 2, 0,158, 2, + 2, 0,159, 2, 86, 0, 7, 0, 4, 0,160, 2, 4, 0,161, 2, 4, 0,162, 2, 4, 0,163, 2, 2, 0, 51, 2, 0, 0,164, 2, + 0, 0, 18, 0, 90, 0, 5, 0, 4, 0,160, 2, 4, 0,161, 2, 0, 0,165, 2, 0, 0,166, 2, 2, 0, 18, 0, 97, 0, 2, 0, + 4, 0,167, 2, 7, 0, 43, 2, 91, 0, 3, 0, 97, 0,168, 2, 4, 0,169, 2, 4, 0, 18, 0, 89, 0, 4, 0, 7, 0,170, 2, + 2, 0,171, 2, 0, 0, 18, 0, 0, 0,166, 2, 92, 0, 4, 0, 0, 0,239, 0, 0, 0,184, 0, 0, 0,185, 0, 0, 0,186, 0, + 81, 0, 5, 0, 4, 0,172, 2, 4, 0,146, 2, 2, 0, 51, 2, 0, 0, 18, 0, 0, 0, 27, 0, 83, 0, 2, 0, 4, 0,173, 2, + 4, 0,174, 2, 82, 0, 6, 0, 42, 0,154, 2, 0, 0, 18, 0, 0, 0,157, 2, 2, 0, 87, 1, 2, 0,158, 2, 2, 0,159, 2, + 84, 0, 2, 0, 7, 0,175, 2, 4, 0, 18, 0, 85, 0, 4, 0, 0, 0,184, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,239, 0, + 93, 0, 1, 0, 7, 0,176, 2, 80, 0, 2, 0, 4, 0, 17, 2, 4, 0, 16, 0, 87, 0, 7, 0, 7, 0,155, 2, 42, 0,154, 2, + 0, 0, 18, 0, 0, 0,157, 2, 2, 0, 87, 1, 2, 0,158, 2, 2, 0,159, 2, 98, 0, 1, 0, 7, 0,177, 2, 99, 0, 1, 0, + 4, 0,178, 2,100, 0, 1, 0, 0, 0,179, 2,101, 0, 1, 0, 7, 0,155, 2,102, 0, 1, 0, 7, 0,175, 2,103, 0, 4, 0, + 4, 0,180, 2, 4, 0,181, 2, 7, 0,182, 2, 4, 0,183, 2,104, 0, 4, 0, 7, 0,239, 0, 7, 0,184, 0, 7, 0,185, 0, + 7, 0,186, 0,105, 0, 1, 0,104, 0,156, 2,106, 0, 5, 0, 4, 0,184, 2, 4, 0,185, 2, 0, 0, 18, 0, 0, 0, 51, 2, + 0, 0,186, 2,107, 0, 2, 0, 4, 0,187, 2, 4, 0,185, 2,108, 0, 10, 0,108, 0, 0, 0,108, 0, 1, 0,106, 0,188, 2, +105, 0,189, 2,107, 0,190, 2, 4, 0, 52, 0, 4, 0,143, 2, 4, 0,142, 2, 4, 0, 27, 0, 89, 0,191, 2, 96, 0, 14, 0, + 14, 0,192, 2, 89, 0,191, 2, 0, 0,193, 2, 0, 0,194, 2, 0, 0,195, 2, 0, 0,196, 2, 0, 0,197, 2, 0, 0,198, 2, + 0, 0,199, 2, 0, 0, 18, 0, 95, 0,137, 2, 95, 0,139, 2, 2, 0,200, 2, 0, 0,201, 2,109, 0, 1, 0, 4, 0,178, 2, +110, 0, 3, 0, 7, 0, 2, 0, 4, 0,181, 2, 4, 0, 27, 0,111, 0, 9, 0,111, 0, 0, 0,111, 0, 1, 0, 4, 0, 16, 0, + 4, 0, 87, 1, 4, 0,202, 2, 4, 0, 27, 0, 0, 0, 19, 0, 41, 0,124, 0, 0, 0,203, 2,112, 0, 6, 0,111, 0,204, 2, + 47, 0,205, 2, 27, 0,206, 2, 0, 0,207, 2, 4, 0,208, 2, 4, 0,209, 2,113, 0, 7, 0,111, 0,204, 2, 2, 0,210, 2, + 2, 0,192, 2, 2, 0,211, 2, 2, 0, 91, 0, 11, 0,212, 2, 11, 0,213, 2,114, 0, 5, 0,111, 0,204, 2, 27, 0,167, 0, + 0, 0, 19, 0, 7, 0,214, 2, 0, 0, 93, 0,115, 0, 5, 0,111, 0,204, 2, 27, 0,167, 0, 0, 0, 19, 0, 2, 0,215, 2, + 0, 0,216, 2,116, 0, 5, 0,111, 0,204, 2, 7, 0, 89, 0, 7, 0,217, 2, 4, 0,218, 2, 4, 0,219, 2,117, 0, 5, 0, +111, 0,204, 2, 27, 0,220, 2, 0, 0, 71, 0, 4, 0, 87, 1, 4, 0, 18, 0,118, 0, 13, 0,111, 0,204, 2, 27, 0,221, 2, + 27, 0,222, 2, 27, 0,223, 2, 27, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2, 7, 0,217, 2, 7, 0,227, 2, 4, 0,228, 2, + 4, 0,229, 2, 4, 0, 91, 0, 4, 0,230, 2,119, 0, 5, 0,111, 0,204, 2, 2, 0,231, 2, 2, 0, 18, 0, 7, 0,232, 2, + 27, 0,233, 2,120, 0, 3, 0,111, 0,204, 2, 7, 0,234, 2, 4, 0, 91, 0,121, 0, 10, 0,111, 0,204, 2, 7, 0,235, 2, + 4, 0,236, 2, 4, 0, 27, 0, 2, 0, 91, 0, 2, 0,237, 2, 2, 0,238, 2, 2, 0,239, 2, 7, 0,240, 2, 0, 0,241, 2, +122, 0, 3, 0,111, 0,204, 2, 7, 0, 27, 0, 4, 0, 16, 0,123, 0, 6, 0,111, 0,204, 2,124, 0,242, 2,125, 0,243, 2, +126, 0,244, 2, 7, 0,245, 2, 4, 0, 16, 0,127, 0, 11, 0,111, 0,204, 2, 47, 0,205, 2, 27, 0,206, 2, 0, 0,207, 2, + 4, 0,208, 2, 4, 0,209, 2, 7, 0,214, 2, 4, 0,246, 2, 0, 0,241, 2, 7, 0,247, 2, 4, 0, 27, 0,128, 0, 12, 0, +111, 0,204, 2, 27, 0,248, 2, 42, 0,249, 2, 4, 0, 91, 0, 4, 0,250, 2, 7, 0,251, 2, 7, 0,252, 2, 7, 0,253, 2, + 7, 0,254, 2, 0, 0,207, 2, 4, 0,208, 2, 4, 0, 27, 0,129, 0, 3, 0,111, 0,204, 2, 7, 0,255, 2, 4, 0, 0, 3, +130, 0, 5, 0,111, 0,204, 2, 7, 0, 1, 3, 0, 0,241, 2, 2, 0, 18, 0, 2, 0, 2, 3,131, 0, 8, 0,111, 0,204, 2, + 27, 0,167, 0, 7, 0, 1, 3, 7, 0,255, 0, 7, 0,107, 0, 0, 0,241, 2, 2, 0, 18, 0, 2, 0, 16, 0,132, 0, 21, 0, +111, 0,204, 2, 47, 0,205, 2, 27, 0,206, 2, 0, 0,207, 2, 4, 0,208, 2, 4, 0,209, 2, 27, 0, 3, 3, 0, 0,241, 2, + 2, 0, 18, 0, 2, 0, 27, 0, 7, 0, 4, 3, 7, 0, 5, 3, 7, 0, 6, 3, 7, 0, 85, 2, 7, 0, 7, 3, 7, 0, 8, 3, + 7, 0, 9, 3, 7, 0, 10, 3, 7, 0, 11, 3, 7, 0, 12, 3, 7, 0, 66, 0,133, 0, 7, 0,111, 0,204, 2, 2, 0, 13, 3, + 2, 0, 14, 3, 4, 0, 30, 0, 27, 0,167, 0, 7, 0, 15, 3, 0, 0,241, 2,134, 0, 10, 0,111, 0,204, 2, 27, 0,167, 0, + 0, 0, 16, 3, 7, 0, 17, 3, 7, 0, 18, 3, 7, 0, 10, 3, 4, 0, 19, 3, 4, 0, 20, 3, 7, 0, 21, 3, 0, 0, 19, 0, +135, 0, 1, 0,111, 0,204, 2,136, 0, 7, 0,111, 0,204, 2, 41, 0,124, 0,137, 0, 22, 3,138, 0, 23, 3,139, 0, 24, 3, +140, 0, 25, 3, 14, 0, 26, 3,141, 0, 13, 0,111, 0,204, 2, 89, 0, 27, 3, 89, 0, 28, 3, 89, 0, 29, 3, 89, 0, 30, 3, + 89, 0, 31, 3, 89, 0, 32, 3, 86, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 7, 0, 36, 3, 7, 0, 37, 3,142, 0, 38, 3, +143, 0, 7, 0,111, 0,204, 2, 89, 0, 27, 3, 89, 0, 39, 3,144, 0, 40, 3,145, 0, 38, 3, 4, 0, 41, 3, 4, 0, 34, 3, +146, 0, 4, 0,111, 0,204, 2, 27, 0,167, 0, 4, 0, 42, 3, 4, 0, 27, 0,147, 0, 2, 0, 4, 0, 43, 3, 7, 0, 43, 2, +148, 0, 2, 0, 4, 0,127, 0, 4, 0, 44, 3,149, 0, 24, 0,111, 0,204, 2, 27, 0,167, 0, 0, 0,241, 2, 2, 0, 45, 3, + 2, 0, 18, 0, 2, 0, 87, 1, 2, 0, 27, 0,147, 0, 46, 3, 4, 0, 47, 3, 7, 0, 48, 3, 4, 0, 52, 0, 4, 0, 49, 3, +148, 0, 50, 3,147, 0, 51, 3, 4, 0, 52, 3, 4, 0, 53, 3, 4, 0, 54, 3, 4, 0, 44, 3, 7, 0, 55, 3, 7, 0, 56, 3, + 7, 0, 57, 3, 7, 0, 58, 3, 7, 0, 59, 3, 11, 0, 60, 3,150, 0, 8, 0,111, 0,204, 2,151, 0, 61, 3,144, 0, 40, 3, + 4, 0, 62, 3, 4, 0, 63, 3, 4, 0, 64, 3, 2, 0, 18, 0, 2, 0, 55, 0,152, 0, 8, 0,111, 0,204, 2, 27, 0, 43, 0, + 2, 0, 3, 1, 2, 0, 18, 0, 2, 0,231, 2, 2, 0, 55, 0, 7, 0, 65, 3, 7, 0, 66, 3,153, 0, 6, 0,111, 0,204, 2, + 4, 0, 67, 3, 2, 0, 18, 0, 2, 0, 68, 3, 7, 0, 69, 3, 0, 0,169, 0,154, 0, 8, 0,111, 0,204, 2, 0, 0, 70, 3, + 0, 0, 71, 3, 0, 0,198, 2, 0, 0, 72, 3, 0, 0, 73, 3, 0, 0, 91, 0, 0, 0,186, 2,155, 0, 3, 0,111, 0,204, 2, +156, 0, 74, 3,140, 0, 25, 3,157, 0, 10, 0,111, 0,204, 2, 27, 0, 75, 3, 27, 0, 76, 3, 0, 0, 77, 3, 7, 0, 78, 3, + 2, 0, 79, 3, 2, 0, 80, 3, 0, 0, 81, 3, 0, 0, 82, 3, 0, 0,216, 2,158, 0, 9, 0,111, 0,204, 2, 27, 0, 83, 3, + 0, 0, 77, 3, 7, 0, 84, 3, 7, 0, 85, 3, 0, 0, 87, 1, 0, 0,231, 2, 0, 0, 86, 3, 0, 0, 27, 0,159, 0, 1, 0, +111, 0,204, 2,160, 0, 11, 0,111, 0,204, 2, 0, 0,241, 2, 7, 0,127, 0, 7, 0, 87, 3, 7, 0, 88, 3, 7, 0, 89, 3, + 7, 0, 90, 3, 7, 0, 91, 3, 4, 0, 18, 0, 2, 0, 92, 3, 2, 0, 93, 3,161, 0, 9, 0,111, 0,204, 2, 27, 0, 94, 3, + 4, 0, 95, 3, 4, 0, 96, 3, 4, 0, 97, 3, 7, 0, 98, 3, 7, 0, 99, 3, 2, 0,231, 2, 2, 0, 18, 0,162, 0, 29, 0, +111, 0,204, 2,163, 0,100, 3,164, 0,101, 3, 4, 0,102, 3, 4, 0,103, 3, 7, 0,104, 3, 7, 0, 9, 3, 7, 0,105, 3, + 7, 0,250, 0, 7, 0,106, 3, 7, 0,107, 3, 7, 0,108, 3, 7, 0,109, 3, 7, 0,110, 3, 7, 0,245, 2, 4, 0,111, 3, + 4, 0,112, 3, 0, 0,113, 3, 0, 0,114, 3, 0, 0,115, 3, 0, 0,116, 3, 0, 0, 18, 0, 0, 0,117, 3, 2, 0,118, 3, + 2, 0,119, 3, 4, 0,219, 2, 7, 0,107, 0, 7, 0,120, 3, 4, 0, 27, 0,165, 0, 15, 0,111, 0,204, 2, 47, 0,205, 2, + 27, 0,206, 2, 0, 0,207, 2, 4, 0,208, 2, 4, 0,209, 2, 27, 0,121, 3, 27, 0,122, 3, 54, 0,100, 1, 0, 0,241, 2, + 7, 0,214, 2, 7, 0,123, 3, 0, 0, 18, 0, 0, 0,253, 0, 0, 0,216, 2,166, 0, 16, 0,111, 0,204, 2, 0, 0,241, 2, + 2, 0,124, 3, 2, 0,253, 0, 7, 0,125, 3, 54, 0,126, 3, 7, 0,127, 3, 7, 0,128, 3, 7, 0,129, 3, 0, 0,130, 3, + 4, 0,131, 3, 47, 0,132, 3, 27, 0,133, 3, 4, 0,134, 3, 0, 0,135, 3, 4, 0,136, 3,167, 0, 16, 0,111, 0,204, 2, + 0, 0,137, 3, 0, 0,138, 3, 7, 0,139, 3, 7, 0,140, 3, 0, 0,141, 3, 0, 0,142, 3, 0, 0,143, 3, 7, 0,129, 3, + 0, 0,130, 3, 4, 0,131, 3, 47, 0,132, 3, 27, 0,133, 3, 4, 0,134, 3, 0, 0,135, 3, 4, 0,136, 3,168, 0, 16, 0, +111, 0,204, 2, 0, 0,241, 2, 4, 0,144, 3, 4, 0,145, 3, 27, 0,146, 3, 7, 0,129, 3, 0, 0,130, 3, 4, 0,131, 3, + 47, 0,132, 3, 27, 0,133, 3, 4, 0,134, 3, 0, 0,135, 3, 7, 0,147, 3, 7, 0,148, 3, 2, 0,253, 0, 2, 0,149, 3, +169, 0, 5, 0,111, 0,204, 2,170, 0,150, 3,171, 0,151, 3, 4, 0, 16, 0, 4, 0, 27, 0,172, 0, 8, 0,111, 0,204, 2, + 7, 0,152, 3, 7, 0,153, 3, 7, 0,154, 3, 0, 0,250, 0, 0, 0, 18, 0, 0, 0, 87, 1, 0, 0, 27, 0,173, 0, 3, 0, +174, 0,155, 3, 4, 0, 70, 2, 0, 0, 93, 0,174, 0, 29, 0, 22, 0, 32, 0, 34, 0, 74, 0, 2, 0, 52, 2, 2, 0, 53, 2, + 2, 0,156, 3, 2, 0, 18, 0, 2, 0,157, 3, 2, 0,158, 3, 2, 0,159, 3, 2, 0, 30, 0, 0, 0,160, 3, 0, 0,161, 3, + 0, 0,162, 3, 0, 0,250, 1, 4, 0, 27, 0, 7, 0,163, 3, 7, 0,164, 3, 7, 0,165, 3, 7, 0,166, 3, 7, 0,167, 3, + 7, 0,168, 3, 29, 0,169, 3, 31, 0, 79, 0, 33, 0, 77, 2, 91, 0,132, 2, 0, 0, 71, 0, 7, 0,170, 3, 7, 0,171, 3, +173, 0,172, 3,175, 0, 5, 0,175, 0, 0, 0,175, 0, 1, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0,123, 0, 68, 0, 3, 0, + 7, 0,173, 3, 4, 0, 18, 0, 4, 0, 27, 0, 27, 0,128, 0, 22, 0, 32, 0, 34, 0, 74, 0,176, 0,174, 3, 2, 0, 16, 0, + 2, 0,175, 3, 4, 0,176, 3, 4, 0,177, 3, 4, 0,178, 3, 0, 0,179, 3, 27, 0, 37, 0, 27, 0,180, 3, 27, 0,181, 3, + 27, 0,182, 3, 27, 0,183, 3, 31, 0, 79, 0, 68, 0, 19, 2,177, 0,184, 3,177, 0,185, 3,178, 0,186, 3, 11, 0, 2, 0, +179, 0,187, 3,180, 0,188, 3,181, 0,189, 3, 14, 0,190, 3, 14, 0,191, 3, 14, 0, 32, 2, 14, 0,192, 3, 14, 0,193, 3, + 4, 0, 87, 1, 4, 0,194, 3, 63, 0, 34, 2, 0, 0,195, 3, 4, 0, 36, 2, 4, 0,196, 3, 7, 0, 77, 1, 7, 0,197, 3, + 7, 0,198, 3, 7, 0,175, 0, 7, 0,199, 3, 7, 0,200, 3, 7, 0, 78, 1, 7, 0,201, 3, 7, 0, 22, 2, 7, 0,202, 3, + 7, 0,203, 3, 7, 0,204, 3, 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0, 17, 3, 7, 0,208, 3, 7, 0,244, 0, + 7, 0,209, 3, 4, 0,210, 3, 4, 0,211, 3, 2, 0, 18, 0, 2, 0,212, 3, 2, 0,213, 3, 2, 0,214, 3, 2, 0,215, 3, + 2, 0,216, 3, 2, 0,217, 3, 2, 0,218, 3, 2, 0,219, 3, 0, 0,220, 3, 0, 0,221, 3, 4, 0,222, 3, 4, 0,223, 3, + 4, 0,224, 3, 4, 0,225, 3, 7, 0,226, 3, 7, 0, 83, 0, 7, 0,227, 3, 7, 0,228, 3, 7, 0,229, 3, 7, 0,230, 3, + 7, 0,231, 3, 7, 0,219, 0, 7, 0,232, 3, 7, 0,233, 3, 7, 0,234, 3, 7, 0,235, 3, 7, 0,236, 3, 2, 0,237, 3, + 0, 0,238, 3, 0, 0,239, 3, 0, 0,240, 3, 0, 0,241, 3, 0, 0,109, 0, 0, 0,242, 3, 7, 0,243, 3, 7, 0,244, 3, + 14, 0,245, 3, 14, 0,246, 3, 14, 0,247, 3, 14, 0,248, 3, 7, 0,249, 3, 2, 0, 17, 2, 2, 0,250, 3, 7, 0,156, 2, + 4, 0,251, 3, 4, 0,252, 3,182, 0,253, 3, 2, 0,254, 3, 2, 0,251, 0, 7, 0,255, 3, 14, 0, 0, 4, 14, 0, 1, 4, + 14, 0, 2, 4, 14, 0, 3, 4,183, 0, 73, 1,184, 0, 4, 4, 64, 0, 5, 4, 0, 0, 6, 4, 0, 0, 7, 4, 2, 0, 70, 2, + 7, 0,148, 2,156, 0, 8, 4,144, 0, 9, 4,144, 0, 10, 4, 10, 0, 11, 4, 10, 0, 12, 4, 4, 0, 13, 4, 4, 0, 14, 4, + 14, 0, 15, 4, 14, 0, 16, 4, 14, 0, 17, 4, 7, 0, 18, 4,185, 0, 14, 0,185, 0, 0, 0,185, 0, 1, 0, 27, 0, 37, 0, + 7, 0, 17, 3, 7, 0, 79, 1, 7, 0, 18, 3, 7, 0, 10, 3, 0, 0, 19, 0, 4, 0, 19, 3, 4, 0, 20, 3, 4, 0, 19, 4, + 2, 0, 16, 0, 2, 0, 20, 4, 7, 0, 21, 3,186, 0, 12, 0,186, 0, 0, 0,186, 0, 1, 0, 27, 0, 43, 0, 4, 0, 21, 4, + 4, 0, 17, 2, 7, 0, 79, 1, 7, 0, 22, 4, 7, 0, 23, 4, 7, 0,175, 2, 2, 0, 16, 0, 0, 0, 24, 4, 0, 0, 25, 4, +183, 0, 40, 0, 4, 0, 18, 0, 2, 0, 26, 4, 2, 0, 27, 4, 2, 0, 10, 3, 2, 0, 28, 4, 2, 0, 29, 4, 2, 0, 30, 4, + 2, 0, 31, 4, 2, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4, + 7, 0, 39, 4, 7, 0, 40, 4, 7, 0, 41, 4, 7, 0, 42, 4, 7, 0, 43, 4, 7, 0, 44, 4, 7, 0, 45, 4, 7, 0, 46, 4, + 7, 0, 47, 4, 7, 0, 48, 4, 7, 0, 49, 4, 7, 0, 50, 4, 7, 0, 51, 4, 7, 0, 52, 4, 7, 0, 53, 4, 7, 0, 54, 4, + 7, 0, 55, 4, 7, 0, 56, 4, 7, 0, 57, 4, 7, 0, 58, 4, 7, 0, 59, 4, 47, 0,168, 0,187, 0, 60, 4, 7, 0, 61, 4, + 4, 0,219, 2,188, 0, 5, 0, 64, 0,253, 1, 7, 0, 62, 4, 7, 0, 63, 4, 2, 0, 18, 0, 2, 0, 64, 4,189, 0, 5, 0, +189, 0, 0, 0,189, 0, 1, 0, 4, 0, 16, 0, 4, 0, 65, 4, 11, 0, 2, 0,190, 0, 9, 0,190, 0, 0, 0,190, 0, 1, 0, + 4, 0, 66, 4, 4, 0, 67, 4, 4, 0, 68, 4, 4, 0, 18, 0, 11, 0, 69, 4, 11, 0, 70, 4, 14, 0, 71, 4,140, 0, 23, 0, +140, 0, 0, 0,140, 0, 1, 0, 4, 0, 18, 0, 4, 0, 72, 4, 4, 0, 73, 4, 4, 0, 74, 4, 4, 0, 75, 4, 4, 0, 76, 4, + 4, 0, 77, 4, 4, 0, 78, 4, 4, 0, 27, 0, 4, 0, 67, 4, 4, 0, 17, 2, 2, 0, 79, 4, 2, 0, 55, 0, 0, 0, 19, 0, + 0, 0, 80, 4, 0, 0, 81, 4, 0, 0, 82, 4, 0, 0, 83, 4, 14, 0, 84, 4,191, 0, 85, 4, 11, 0, 86, 4,192, 0, 1, 0, + 7, 0, 50, 2,182, 0, 30, 0, 4, 0, 18, 0, 7, 0, 87, 4, 7, 0, 88, 4, 7, 0, 89, 4, 4, 0, 90, 4, 4, 0, 91, 4, + 4, 0, 92, 4, 4, 0, 93, 4, 7, 0, 94, 4, 7, 0, 95, 4, 7, 0, 96, 4, 7, 0, 97, 4, 7, 0, 98, 4, 7, 0, 99, 4, + 7, 0,100, 4, 7, 0,101, 4, 7, 0,102, 4, 7, 0,103, 4, 7, 0,104, 4, 7, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, + 7, 0,108, 4, 7, 0,109, 4, 7, 0,110, 4, 7, 0,111, 4, 4, 0,112, 4, 4, 0,113, 4, 7, 0,114, 4, 7, 0,232, 3, +184, 0, 54, 0, 4, 0, 67, 4, 4, 0,115, 4,193, 0,116, 4,194, 0,117, 4, 0, 0, 27, 0, 0, 0,118, 4, 2, 0,119, 4, + 7, 0,120, 4, 0, 0,121, 4, 7, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, 7, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, + 7, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, 2, 0,131, 4, 0, 0,132, 4, 2, 0,133, 4, 7, 0,134, 4, 7, 0,135, 4, + 0, 0,136, 4, 4, 0,128, 0, 4, 0,137, 4, 4, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4,192, 0,141, 4, 4, 0,142, 4, + 4, 0, 81, 0, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4, 2, 0,147, 4, 2, 0,148, 4, 2, 0,149, 4, + 2, 0,150, 4, 2, 0,151, 4, 2, 0,152, 4, 2, 0,153, 4, 2, 0,154, 4,195, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4, +140, 0,158, 4, 14, 0, 26, 3,188, 0,159, 4, 7, 0,160, 4, 7, 0,161, 4, 7, 0,162, 4, 4, 0,163, 4,196, 0, 1, 0, + 7, 0,164, 4,156, 0, 52, 0,155, 0,165, 4, 2, 0, 16, 0, 2, 0,166, 4, 2, 0,167, 4, 2, 0,168, 4, 7, 0,169, 4, + 2, 0,170, 4, 2, 0,171, 4, 7, 0,172, 4, 2, 0,173, 4, 2, 0,174, 4, 7, 0,175, 4, 7, 0,176, 4, 7, 0,177, 4, + 4, 0,178, 4, 4, 0,179, 4, 4, 0,180, 4, 4, 0, 27, 0, 7, 0,181, 4, 4, 0,182, 4, 7, 0,183, 4, 7, 0,184, 4, + 7, 0,185, 4, 79, 0,186, 4, 79, 0,187, 4, 0, 0,188, 4, 7, 0,189, 4, 7, 0,190, 4, 31, 0, 79, 0, 2, 0,191, 4, + 0, 0,192, 4, 0, 0,193, 4, 7, 0,194, 4, 4, 0,195, 4, 7, 0,196, 4, 7, 0,197, 4, 4, 0,198, 4, 4, 0, 18, 0, + 7, 0,199, 4, 7, 0,200, 4, 7, 0,201, 4,196, 0,202, 4, 4, 0, 52, 0, 7, 0,203, 4, 7, 0,204, 4, 7, 0,205, 4, + 7, 0,206, 4, 7, 0,207, 4, 7, 0,208, 4, 7, 0,209, 4, 4, 0,210, 4, 7, 0,211, 4,197, 0, 78, 0, 22, 0, 32, 0, + 34, 0, 74, 0, 2, 0,178, 0, 2, 0, 88, 1, 2, 0,124, 1, 2, 0,212, 4, 7, 0,213, 4, 7, 0,214, 4, 7, 0,215, 4, + 7, 0,216, 4, 7, 0,217, 4, 7, 0,218, 4, 7, 0,173, 1, 7, 0,175, 1, 7, 0,174, 1, 7, 0, 30, 0, 4, 0,219, 4, + 7, 0,220, 4, 7, 0,221, 4, 7, 0,222, 4, 7, 0,223, 4, 7, 0,224, 4, 7, 0,225, 4, 7, 0,226, 4, 2, 0,227, 4, + 2, 0, 87, 1, 2, 0,228, 4, 2, 0,229, 4, 2, 0,230, 4, 2, 0,231, 4, 2, 0,232, 4, 2, 0,233, 4, 7, 0,234, 4, + 7, 0,235, 4, 7, 0,236, 4, 7, 0,237, 4, 7, 0,238, 4, 7, 0,239, 4, 7, 0,240, 4, 7, 0,241, 4, 7, 0,242, 4, + 7, 0,243, 4, 7, 0,244, 4, 7, 0,245, 4, 2, 0,246, 4, 2, 0,247, 4, 2, 0,248, 4, 2, 0,249, 4, 7, 0,250, 4, + 7, 0,251, 4, 7, 0,252, 4, 7, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 7, 0, 2, 5, + 7, 0, 3, 5, 7, 0, 4, 5, 7, 0, 5, 5, 7, 0, 6, 5, 7, 0, 7, 5, 7, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, + 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, 2, 0, 18, 0, 7, 0, 14, 5, 7, 0, 15, 5, 31, 0, 79, 0, 46, 0,143, 1, + 2, 0,144, 1, 2, 0, 76, 1, 2, 0,186, 2, 25, 0,153, 0, 57, 0, 70, 1,198, 0, 8, 0,198, 0, 0, 0,198, 0, 1, 0, + 4, 0,210, 3, 4, 0, 16, 5, 4, 0, 18, 0, 2, 0, 17, 5, 2, 0, 18, 5, 27, 0,167, 0,199, 0, 13, 0, 11, 0, 19, 5, + 11, 0, 20, 5, 4, 0, 21, 5, 4, 0, 22, 5, 4, 0, 23, 5, 4, 0, 24, 5, 4, 0, 25, 5, 4, 0, 26, 5, 4, 0, 27, 5, + 4, 0, 28, 5, 4, 0, 29, 5, 4, 0, 27, 0, 0, 0, 30, 5,200, 0, 5, 0, 11, 0, 31, 5, 11, 0, 32, 5, 4, 0, 33, 5, + 4, 0, 30, 0, 0, 0, 34, 5,201, 0, 17, 0, 4, 0, 35, 5, 4, 0, 36, 5, 4, 0, 37, 5, 4, 0, 38, 5, 4, 0, 39, 5, + 4, 0, 40, 5, 4, 0, 41, 5, 4, 0, 42, 5, 4, 0, 43, 5, 4, 0, 44, 5, 4, 0, 45, 5, 4, 0, 46, 5, 2, 0, 47, 5, + 2, 0, 48, 5, 4, 0, 49, 5, 4, 0, 50, 5, 4, 0, 66, 0,202, 0, 17, 0, 4, 0, 16, 0, 4, 0, 37, 5, 4, 0, 51, 5, + 4, 0, 52, 5, 4, 0, 53, 5, 4, 0, 54, 5, 4, 0, 55, 5, 4, 0, 56, 5, 7, 0, 57, 5, 4, 0, 58, 5, 4, 0, 91, 0, + 4, 0, 59, 5, 4, 0, 60, 5, 4, 0, 61, 5, 4, 0, 62, 5, 4, 0, 63, 5, 21, 0, 31, 0,203, 0, 9, 0, 4, 0, 64, 5, + 7, 0, 65, 5, 7, 0, 66, 5, 7, 0, 67, 5, 4, 0, 68, 5, 2, 0, 18, 0, 2, 0, 27, 0, 7, 0, 89, 4, 7, 0, 30, 0, +204, 0, 13, 0,204, 0, 0, 0,204, 0, 1, 0, 0, 0, 19, 0, 63, 0, 69, 5, 64, 0, 70, 5, 4, 0,210, 3, 4, 0, 71, 5, + 4, 0, 72, 5, 4, 0, 73, 5, 4, 0, 74, 5, 4, 0, 75, 5, 4, 0, 76, 5, 4, 0, 27, 0,205, 0, 13, 0, 0, 0, 77, 5, + 0, 0,250, 0, 0, 0, 78, 5, 0, 0, 18, 0, 0, 0, 79, 5, 0, 0, 80, 5, 0, 0, 81, 5, 0, 0, 82, 5, 2, 0, 83, 5, + 2, 0, 84, 5, 7, 0, 85, 5, 0, 0, 86, 5, 0, 0,123, 0,206, 0,106, 0,205, 0, 87, 5,199, 0, 88, 5,200, 0, 89, 5, +201, 0, 90, 5,202, 0, 91, 5, 4, 0, 41, 3, 4, 0,128, 0, 4, 0,137, 4, 7, 0, 92, 5, 4, 0, 93, 5, 4, 0, 94, 5, + 4, 0, 95, 5, 4, 0, 96, 5, 2, 0, 18, 0, 2, 0, 97, 5, 7, 0, 98, 5, 7, 0, 99, 5, 7, 0,100, 5, 7, 0,101, 5, + 7, 0,102, 5, 2, 0,103, 5, 2, 0,104, 5, 2, 0,105, 5, 2, 0,106, 5, 2, 0,250, 0, 2, 0,107, 5, 4, 0,108, 5, + 2, 0,109, 5, 2, 0,110, 5, 2, 0,110, 1, 2, 0,107, 0, 2, 0,111, 5, 2, 0,112, 5, 2, 0,113, 5, 2, 0,114, 5, + 2, 0,115, 5, 2, 0, 78, 5, 2, 0, 77, 5, 2, 0,116, 5, 2, 0, 79, 5, 2, 0,117, 5, 4, 0,118, 5, 4, 0, 87, 1, + 4, 0,119, 5, 2, 0,120, 5, 2, 0, 66, 0, 2, 0,121, 5, 2, 0,122, 5, 2, 0,123, 5, 2, 0,124, 5, 2, 0,125, 5, + 2, 0,126, 5, 19, 0,127, 5, 19, 0,128, 5, 18, 0,129, 5, 14, 0,130, 5, 2, 0,131, 5, 2, 0,132, 5, 7, 0,133, 5, + 7, 0,134, 5, 7, 0,135, 5, 7, 0,136, 5, 4, 0,137, 5, 7, 0,138, 5, 7, 0,139, 5, 7, 0,140, 5, 7, 0,141, 5, + 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, 2, 0,145, 5, 2, 0,146, 5, 2, 0,147, 5, 7, 0,148, 5, 7, 0,149, 5, + 7, 0,150, 5, 0, 0,151, 5, 4, 0,152, 5, 2, 0,153, 5, 2, 0,250, 1, 0, 0,154, 5, 7, 0,155, 5, 7, 0,156, 5, + 0, 0,157, 5, 0, 0,158, 5, 0, 0,159, 5, 0, 0,160, 5, 4, 0,161, 5, 2, 0,162, 5, 2, 0,163, 5, 7, 0,164, 5, + 7, 0,165, 5, 2, 0,166, 5, 2, 0,167, 5, 7, 0,168, 5, 2, 0,169, 5, 2, 0,170, 5, 4, 0,171, 5, 2, 0,172, 5, + 2, 0,173, 5, 2, 0,174, 5, 2, 0,175, 5, 7, 0,176, 5, 7, 0, 30, 0, 37, 0,177, 5, 0, 0,178, 5,207, 0, 9, 0, +207, 0, 0, 0,207, 0, 1, 0, 0, 0,179, 5, 2, 0,180, 5, 2, 0,181, 5, 2, 0,182, 5, 2, 0, 66, 0, 7, 0,183, 5, + 7, 0, 30, 0,208, 0, 7, 0, 2, 0,236, 2, 2, 0, 87, 1, 2, 0, 99, 3, 2, 0,184, 5, 7, 0,185, 5, 7, 0, 30, 0, + 37, 0,186, 5,209, 0, 5, 0, 7, 0,187, 5, 0, 0, 16, 0, 0, 0, 66, 0, 0, 0, 30, 0, 0, 0,250, 1,210, 0, 15, 0, + 7, 0,188, 5, 7, 0,189, 5, 7, 0,190, 5, 7, 0,191, 5, 7, 0,192, 5, 7, 0,193, 5, 7, 0,194, 5, 7, 0,195, 5, + 7, 0,196, 5, 7, 0,197, 5, 4, 0,198, 5, 7, 0,199, 5, 7, 0,200, 5, 2, 0, 66, 0, 2, 0, 30, 0,211, 0, 32, 0, +209, 0,201, 5, 2, 0,202, 5, 2, 0,104, 5, 2, 0,105, 5, 2, 0,106, 5, 2, 0,250, 0, 2, 0,107, 5, 2, 0,203, 5, + 2, 0,204, 5, 2, 0,205, 5, 2, 0,206, 5,208, 0,207, 5, 2, 0,208, 5, 2, 0,109, 5, 7, 0,209, 5,210, 0,210, 5, + 7, 0,225, 4, 7, 0,226, 4, 4, 0, 18, 0, 2, 0, 87, 1, 2, 0,211, 5, 2, 0,228, 4, 2, 0,229, 4, 2, 0,212, 5, + 2, 0, 27, 0, 2, 0,230, 4, 2, 0,231, 4, 2, 0,232, 4, 2, 0,233, 4, 2, 0,213, 5, 2, 0, 66, 0, 7, 0,214, 5, +212, 0, 6, 0,212, 0, 0, 0,212, 0, 1, 0, 4, 0, 66, 4, 0, 0, 19, 0, 4, 0, 18, 0, 27, 0,215, 5,213, 0, 6, 0, +214, 0,151, 3, 11, 0,216, 5, 0, 0,217, 5, 4, 0, 91, 0, 4, 0,218, 5, 4, 0, 27, 0,215, 0, 8, 0,213, 0,219, 5, + 2, 0, 18, 0, 2, 0, 27, 0, 2, 0,220, 5, 2, 0,221, 5, 2, 0,222, 5, 4, 0, 66, 0, 11, 0,223, 5,216, 0, 6, 0, + 2, 0,107, 0, 2, 0, 72, 4, 2, 0,224, 5, 2, 0,230, 2, 4, 0, 18, 0, 7, 0,214, 2,217, 0, 14, 0, 2, 0, 18, 0, + 2, 0,225, 5, 2, 0,226, 5, 2, 0,227, 5,216, 0,228, 5, 11, 0,223, 5, 7, 0,229, 5, 7, 0, 55, 0, 4, 0,230, 5, + 4, 0,231, 5, 4, 0,232, 5, 4, 0,233, 5, 41, 0,124, 0, 27, 0,167, 0,218, 0, 14, 0,213, 0,219, 5, 4, 0, 91, 0, + 4, 0,234, 5, 7, 0,235, 5, 7, 0,236, 5, 7, 0,237, 5, 4, 0,238, 5, 4, 0,239, 5, 7, 0,240, 5, 7, 0,241, 5, + 4, 0,242, 5, 7, 0,243, 5, 7, 0,244, 5, 4, 0, 27, 0,219, 0, 1, 0,213, 0,219, 5,220, 0, 7, 0,213, 0,219, 5, + 2, 0, 18, 0, 2, 0, 27, 0, 4, 0,240, 0, 4, 0,245, 5, 91, 0,246, 5, 11, 0,223, 5,221, 0, 5, 0,221, 0, 0, 0, +221, 0, 1, 0, 0, 0, 19, 0, 7, 0,247, 5, 4, 0, 27, 0,222, 0, 6, 0, 4, 0,107, 0, 7, 0,248, 5, 7, 0,181, 1, + 7, 0, 43, 2, 4, 0, 18, 0, 4, 0, 27, 0,223, 0, 85, 0,220, 0,249, 5,220, 0,250, 5,218, 0,174, 3,219, 0,251, 5, + 7, 0,252, 5, 2, 0,253, 5, 2, 0,250, 1, 7, 0,254, 5, 7, 0,255, 5, 2, 0, 72, 4, 2, 0, 0, 6, 7, 0, 1, 6, + 7, 0, 2, 6, 7, 0, 3, 6, 2, 0, 4, 6, 2, 0,230, 5, 2, 0, 5, 6, 2, 0, 6, 6, 2, 0, 7, 6, 2, 0, 8, 6, + 7, 0, 9, 6, 7, 0, 10, 6, 7, 0, 11, 6, 2, 0, 12, 6, 2, 0, 13, 6, 2, 0, 14, 6, 2, 0, 15, 6, 2, 0, 16, 6, + 2, 0, 17, 6, 2, 0, 18, 6, 2, 0, 19, 6,215, 0, 20, 6,217, 0, 21, 6, 7, 0, 22, 6, 7, 0, 23, 6, 7, 0, 24, 6, + 2, 0, 25, 6, 2, 0, 26, 6, 0, 0, 27, 6, 0, 0, 28, 6, 2, 0, 29, 6, 7, 0, 30, 6, 7, 0, 31, 6, 7, 0, 32, 6, + 7, 0, 33, 6, 7, 0, 34, 6, 7, 0, 35, 6, 7, 0, 36, 6, 7, 0, 37, 6, 7, 0, 38, 6, 7, 0, 39, 6, 2, 0, 40, 6, + 0, 0, 41, 6, 0, 0, 42, 6, 0, 0, 43, 6, 0, 0, 44, 6, 27, 0, 45, 6, 0, 0, 46, 6, 0, 0, 47, 6, 0, 0, 48, 6, + 0, 0, 49, 6, 0, 0, 50, 6, 0, 0, 51, 6, 0, 0, 52, 6, 0, 0, 53, 6, 0, 0, 54, 6, 0, 0, 55, 6, 2, 0, 56, 6, + 2, 0, 57, 6, 2, 0, 58, 6, 2, 0, 59, 6, 0, 0, 60, 6, 0, 0, 61, 6, 0, 0, 62, 6, 0, 0, 63, 6, 4, 0, 64, 6, + 4, 0, 65, 6, 4, 0, 66, 6, 4, 0, 67, 6, 2, 0, 68, 6, 2, 0, 66, 0, 4, 0, 69, 6, 7, 0, 70, 6, 7, 0, 71, 6, +222, 0, 72, 6,224, 0, 8, 0, 4, 0, 73, 6, 4, 0, 74, 6, 4, 0, 75, 6, 4, 0, 76, 6, 4, 0, 77, 6, 4, 0, 78, 6, + 4, 0, 52, 0, 4, 0,143, 2,225, 0, 4, 0, 7, 0, 79, 6, 0, 0, 80, 6, 0, 0, 81, 6, 2, 0, 18, 0,226, 0, 4, 0, + 7, 0, 82, 6, 4, 0, 18, 0, 4, 0, 83, 6, 4, 0, 55, 0, 41, 0, 46, 0, 22, 0, 32, 0, 34, 0, 74, 0, 27, 0,215, 5, +197, 0, 84, 6, 41, 0, 85, 6, 14, 0, 86, 6,198, 0, 87, 6, 27, 0, 88, 6, 7, 0, 89, 6, 7, 0, 90, 6, 7, 0, 91, 6, + 7, 0, 92, 6, 4, 0,210, 3, 4, 0, 93, 6, 4, 0, 94, 6, 2, 0, 18, 0, 2, 0, 76, 1, 57, 0, 70, 1,227, 0, 95, 6, +223, 0, 96, 6,228, 0, 97, 6,206, 0,184, 0,203, 0, 98, 6, 14, 0,101, 0, 14, 0, 99, 6, 11, 0,100, 6, 11, 0,101, 6, + 11, 0,102, 6, 11, 0,103, 6, 11, 0,104, 6,229, 0,105, 6, 2, 0,106, 6, 2, 0,107, 6, 2, 0,251, 0, 2, 0,211, 3, + 4, 0,221, 3, 4, 0,108, 6, 14, 0,109, 6,209, 0,201, 5,211, 0,110, 6,225, 0,111, 6,179, 0,187, 3,226, 0,112, 6, +230, 0,113, 6, 10, 0, 12, 4, 10, 0,114, 6,231, 0, 14, 0,231, 0, 0, 0,231, 0, 1, 0, 42, 0,242, 0, 40, 0, 69, 1, +230, 0,113, 6,232, 0,115, 6, 7, 0,100, 2, 7, 0,101, 2, 7, 0,107, 0, 7, 0,116, 6, 2, 0,117, 6, 2, 0, 18, 0, + 2, 0,142, 0, 2, 0, 27, 0,233, 0, 39, 0, 7, 0,118, 6, 7, 0,119, 6, 7, 0,120, 6, 7, 0,121, 6, 7, 0,122, 6, + 7, 0,123, 6, 7, 0,124, 6, 7, 0,125, 6, 7, 0,126, 6, 68, 0,127, 6,179, 0,187, 3,233, 0,128, 6,234, 0,129, 6, +235, 0,130, 6,236, 0,131, 6,237, 0,132, 6,238, 0,133, 6, 7, 0,134, 6, 7, 0,135, 6, 7, 0, 94, 1, 7, 0,136, 6, + 7, 0,137, 6, 7, 0,138, 6, 7, 0,139, 6, 7, 0,174, 0, 7, 0,140, 6, 0, 0,141, 6, 0, 0,142, 6, 0, 0,117, 6, + 0, 0,143, 6, 2, 0,144, 6, 2, 0,145, 6, 7, 0,146, 6, 2, 0,147, 6, 2, 0,148, 6, 7, 0,149, 6, 7, 0,150, 6, + 7, 0,151, 6, 7, 0,152, 6,239, 0, 51, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, + 2, 0,156, 6, 7, 0,135, 6, 7, 0, 94, 1, 7, 0,157, 6, 2, 0,158, 6, 0, 0,216, 2, 4, 0,159, 6, 2, 0,142, 6, + 2, 0,117, 6, 27, 0,215, 5, 27, 0,160, 6, 14, 0,161, 6,231, 0,162, 6,239, 0,128, 6, 0, 0,163, 6, 4, 0,210, 3, + 4, 0, 93, 6, 2, 0,164, 6, 2, 0,165, 6, 2, 0,166, 6, 2, 0,167, 6, 2, 0, 18, 0, 2, 0, 35, 2, 7, 0,113, 0, + 7, 0,168, 6, 7, 0,169, 6, 7, 0,170, 6, 7, 0,174, 0, 7, 0, 89, 6, 2, 0,171, 6, 2, 0,172, 6, 2, 0,173, 6, + 0, 0,174, 6, 0, 0,175, 6, 0, 0,176, 6, 0, 0,177, 6, 0, 0,178, 6, 14, 0,179, 6, 14, 0,180, 6, 14, 0,181, 6, + 2, 0,182, 6, 2, 0,157, 2, 2, 0,183, 6, 0, 0,184, 6, 11, 0,185, 6,179, 0,187, 3,241, 0, 24, 0, 19, 0,240, 0, + 19, 0, 62, 0, 18, 0,186, 6, 18, 0,187, 6, 18, 0,188, 6, 7, 0,189, 6, 7, 0,190, 6, 7, 0,191, 6, 7, 0,192, 6, + 2, 0,193, 6, 2, 0,194, 6, 2, 0,195, 6, 2, 0,196, 6, 2, 0,197, 6, 2, 0, 18, 0, 2, 0,198, 6, 2, 0,199, 6, + 2, 0,200, 6, 2, 0,201, 6, 2, 0,202, 6, 2, 0,167, 6, 7, 0,203, 6, 4, 0,204, 6, 4, 0,205, 6,240, 0, 6, 0, +240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6,242, 0, 8, 0,240, 0, 0, 0, +240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6, 0, 0,206, 6, 0, 0,123, 0,243, 0, 14, 0, +240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6,241, 0,207, 6,244, 0,208, 6, + 14, 0,209, 6, 2, 0, 87, 1, 2, 0,210, 6, 4, 0, 18, 0, 7, 0,211, 6, 4, 0,167, 6,245, 0, 21, 0,240, 0, 0, 0, +240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6,241, 0,207, 6, 2, 0,212, 6, 2, 0,213, 6, + 2, 0,214, 6, 2, 0,215, 6, 2, 0,198, 6, 2, 0,216, 6, 2, 0,217, 6, 0, 0, 18, 0, 0, 0, 27, 0, 11, 0, 76, 2, + 4, 0,218, 6, 4, 0,219, 6, 22, 0,220, 6, 11, 0,221, 6,246, 0, 18, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, + 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6,241, 0,207, 6, 7, 0,100, 2, 7, 0,101, 2, 2, 0,212, 6, 2, 0,222, 6, + 2, 0,223, 6, 2, 0,224, 6, 4, 0, 18, 0, 7, 0,225, 6, 4, 0,117, 6, 4, 0, 27, 0,179, 0,187, 3,247, 0, 16, 0, + 0, 0,226, 6, 0, 0,227, 6, 0, 0,228, 6, 0, 0,229, 6, 0, 0,230, 6, 0, 0,231, 6, 4, 0,232, 6, 4, 0,233, 6, + 4, 0,234, 6, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0,235, 6, 2, 0,236, 6, 2, 0,193, 1, 2, 0,237, 6, 0, 0,238, 6, +248, 0, 16, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 4, 0,239, 6,247, 0,240, 6,249, 0,241, 6, + 14, 0,242, 6, 14, 0,243, 6,250, 0,244, 6,238, 0,245, 6,251, 0,246, 6, 2, 0,247, 6, 2, 0,248, 6, 2, 0,249, 6, + 2, 0, 30, 0,252, 0, 15, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6, +241, 0,207, 6, 14, 0,250, 6,253, 0,251, 6, 0, 0,252, 6,254, 0,253, 6, 2, 0, 18, 0, 2, 0,254, 6, 2, 0,255, 6, + 2, 0, 0, 7,255, 0, 25, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 4, 0, 18, 0, 42, 0,249, 2, + 40, 0, 69, 1, 54, 0, 1, 7, 0, 1, 2, 7, 1, 1, 3, 7,179, 0,187, 3, 7, 0, 4, 7, 7, 0,100, 2, 7, 0,101, 2, + 7, 0,225, 6, 7, 0, 5, 7, 7, 0, 6, 7, 2, 0, 7, 7, 2, 0, 27, 0, 2, 0, 8, 7, 2, 0, 9, 7, 0, 0, 10, 7, + 0, 0, 11, 7, 0, 0, 12, 7, 0, 0,167, 6, 2, 1, 11, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, + 7, 0,155, 6, 2, 0,156, 6, 2, 0,210, 6, 2, 0, 18, 0, 4, 0, 27, 0,244, 0,208, 6,241, 0,207, 6, 3, 1, 31, 0, +240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6, 37, 0, 13, 7, 4, 0, 14, 7, + 4, 0, 15, 7, 2, 0, 91, 0, 2, 0, 16, 7, 2, 0, 17, 7, 0, 0, 18, 7, 0, 0, 19, 7, 4, 0, 20, 7, 4, 0, 21, 7, + 4, 0, 22, 7, 2, 0, 23, 7, 2, 0, 24, 7, 2, 0, 25, 7, 2, 0, 26, 7, 7, 0, 27, 7, 18, 0, 28, 7, 18, 0, 29, 7, + 4, 0, 30, 7, 4, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 2, 0, 34, 7, 0, 0,216, 2, 11, 0, 35, 7, 4, 1, 10, 0, + 22, 0, 32, 0, 11, 0, 36, 7, 11, 0, 37, 7, 11, 0, 38, 7, 11, 0, 39, 7, 11, 0, 40, 7, 4, 0, 91, 0, 4, 0, 41, 7, + 0, 0, 42, 7, 0, 0, 43, 7, 5, 1, 10, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, + 4, 1, 44, 7, 2, 0, 91, 0, 2, 0, 16, 7, 4, 0, 66, 0, 11, 0, 45, 7, 6, 1, 3, 0, 6, 1, 0, 0, 6, 1, 1, 0, + 7, 0, 46, 7, 7, 1, 9, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6,241, 0,207, 6, + 14, 0, 47, 7, 4, 0, 48, 7, 4, 0, 18, 0, 8, 1, 27, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, + 7, 0,155, 6, 2, 0,156, 6,241, 0,207, 6, 22, 0, 49, 7, 22, 0, 80, 0, 2, 0, 18, 0, 2, 0, 66, 0, 7, 0, 50, 7, + 7, 0,100, 2, 7, 0,101, 2, 7, 0,225, 6, 7, 0, 51, 7, 7, 0, 52, 7, 7, 0, 53, 7, 57, 0, 70, 1, 57, 0, 54, 7, + 4, 0, 55, 7, 2, 0, 56, 7, 2, 0, 57, 7, 2, 0,251, 0, 2, 0, 86, 1, 14, 0, 58, 7,179, 0,187, 3, 9, 1, 10, 0, +240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6, 2, 0, 18, 0, 2, 0,219, 3, + 4, 0, 27, 0,179, 0,187, 3, 10, 1, 7, 0, 10, 1, 0, 0, 10, 1, 1, 0, 4, 0, 59, 7, 4, 0, 22, 0, 0, 0, 85, 0, + 4, 0, 60, 7, 4, 0, 16, 0, 11, 1, 14, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, + 2, 0,156, 6, 4, 0, 17, 7, 4, 0, 27, 0, 14, 0, 61, 7, 14, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 4, 0, 65, 7, + 4, 0, 66, 7, 12, 1, 6, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 4, 0, 27, 0, 0, 0, 67, 7, + 13, 1, 28, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,100, 2, 7, 0,101, 2, 7, 0, 68, 7, + 7, 0, 69, 7, 7, 0,225, 6,232, 0, 70, 7,230, 0,113, 6, 14, 1, 2, 7, 4, 0, 18, 0, 2, 0, 87, 1, 2, 0,117, 6, + 4, 0, 71, 7, 7, 0, 72, 7, 7, 0,153, 3, 7, 0, 99, 3, 4, 0, 27, 0, 7, 0, 73, 7, 7, 0, 74, 7, 4, 0, 75, 7, + 4, 0, 30, 0, 11, 0, 76, 7, 2, 0, 77, 7, 2, 0, 78, 7, 4, 0,250, 1, 15, 1, 7, 0, 15, 1, 0, 0, 15, 1, 1, 0, + 0, 0, 79, 7, 2, 0, 80, 7, 2, 0, 81, 7, 2, 0, 82, 7, 2, 0, 27, 0, 16, 1, 12, 0, 2, 0, 81, 7, 2, 0, 83, 7, + 2, 0, 84, 7, 0, 0,216, 2, 2, 0, 85, 7, 2, 0, 86, 7, 2, 0, 87, 7, 2, 0, 88, 7, 2, 0, 89, 7, 2, 0,198, 6, + 7, 0, 90, 7, 7, 0, 91, 7, 17, 1, 18, 0, 17, 1, 0, 0, 17, 1, 1, 0, 0, 0, 19, 0, 16, 1, 92, 7, 16, 1, 93, 7, + 16, 1, 94, 7, 16, 1, 95, 7, 7, 0, 96, 7, 2, 0, 97, 7, 2, 0, 98, 7, 2, 0, 99, 7, 2, 0,100, 7, 2, 0,101, 7, + 2, 0,102, 7, 2, 0,103, 7, 2, 0,104, 7, 2, 0,105, 7, 2, 0, 27, 0, 18, 1, 10, 0, 0, 0,106, 7, 0, 0,107, 7, + 0, 0,108, 7, 0, 0,109, 7, 0, 0,110, 7, 0, 0,111, 7, 2, 0,112, 7, 2, 0,113, 7, 2, 0,114, 7, 2, 0,115, 7, + 19, 1, 8, 0, 0, 0,116, 7, 0, 0,117, 7, 0, 0,118, 7, 0, 0,119, 7, 0, 0,120, 7, 0, 0,121, 7, 7, 0,116, 6, + 7, 0, 27, 0, 20, 1, 3, 0, 0, 0,122, 7, 2, 0,123, 7, 2, 0, 27, 0, 21, 1, 22, 0, 18, 1,124, 7, 18, 1,125, 7, + 18, 1,126, 7, 18, 1,127, 7, 18, 1,128, 7, 18, 1,129, 7, 18, 1,130, 7, 18, 1,131, 7, 18, 1,132, 7, 18, 1,133, 7, + 18, 1,134, 7, 18, 1,135, 7, 18, 1,136, 7, 18, 1,137, 7, 18, 1,138, 7, 18, 1,139, 7, 18, 1,140, 7, 19, 1,141, 7, + 20, 1,142, 7, 0, 0,143, 7, 7, 0,144, 7, 7, 0, 27, 0, 22, 1,122, 0, 0, 0,145, 7, 0, 0,146, 7, 0, 0,110, 7, + 0, 0,147, 7, 0, 0,122, 7, 0, 0,148, 7, 0, 0,149, 7, 0, 0,150, 7, 0, 0,151, 7, 0, 0,152, 7, 0, 0,153, 7, + 0, 0,154, 7, 0, 0,155, 7, 0, 0,156, 7, 0, 0,157, 7, 0, 0,158, 7, 0, 0,159, 7, 0, 0,160, 7, 0, 0,161, 7, + 0, 0,162, 7, 0, 0,163, 7, 0, 0,164, 7, 0, 0,165, 7, 0, 0,166, 7, 0, 0,167, 7, 0, 0,168, 7, 0, 0,169, 7, + 0, 0,170, 7, 0, 0,171, 7, 0, 0,172, 7, 0, 0,173, 7, 0, 0,174, 7, 0, 0,175, 7, 0, 0,176, 7, 0, 0,177, 7, + 0, 0,178, 7, 0, 0,179, 7, 0, 0,180, 7, 0, 0,181, 7, 0, 0,182, 7, 0, 0,183, 7, 0, 0,184, 7, 0, 0,185, 7, + 0, 0,186, 7, 0, 0,187, 7, 0, 0,188, 7, 0, 0,189, 7, 0, 0,190, 7, 0, 0,191, 7, 0, 0,192, 7, 0, 0,193, 7, + 0, 0,194, 7, 0, 0,195, 7, 0, 0,196, 7, 0, 0,197, 7, 0, 0,198, 7, 0, 0,199, 7, 0, 0,200, 7, 0, 0,201, 7, + 0, 0,202, 7, 0, 0,203, 7, 0, 0,204, 7, 0, 0,205, 7, 0, 0,206, 7, 0, 0,207, 7, 0, 0,208, 7, 0, 0,209, 7, + 0, 0,210, 7, 0, 0,211, 7, 0, 0,212, 7, 0, 0,213, 7, 0, 0,214, 7, 0, 0,215, 7, 0, 0,216, 7, 0, 0,217, 7, + 0, 0,218, 7, 0, 0,219, 7, 0, 0,220, 7, 0, 0,221, 7, 0, 0,222, 7, 0, 0,223, 7, 0, 0,224, 7, 0, 0,225, 7, + 0, 0,226, 7, 0, 0,227, 7, 0, 0,228, 7, 0, 0,229, 7, 0, 0,230, 7, 0, 0,231, 7, 0, 0,232, 7, 0, 0,233, 7, + 0, 0,234, 7, 0, 0,235, 7, 0, 0,236, 7, 0, 0,237, 7, 0, 0,238, 7, 0, 0,239, 7, 0, 0,240, 7, 0, 0,241, 7, + 0, 0,242, 7, 0, 0,243, 7, 0, 0,244, 7, 0, 0,245, 7, 0, 0,246, 7, 0, 0,247, 7, 0, 0,248, 7, 0, 0,249, 7, + 0, 0,250, 7, 0, 0,251, 7, 0, 0,252, 7, 0, 0,253, 7, 0, 0,254, 7, 0, 0,255, 7, 0, 0, 0, 8, 0, 0, 1, 8, + 0, 0, 2, 8, 0, 0, 3, 8, 0, 0, 4, 8, 0, 0, 5, 8, 0, 0, 6, 8, 0, 0, 7, 8, 0, 0, 8, 8, 23, 1, 5, 0, + 0, 0, 9, 8, 0, 0,168, 7, 0, 0,174, 7, 2, 0, 18, 0, 2, 0, 27, 0, 24, 1, 24, 0, 24, 1, 0, 0, 24, 1, 1, 0, + 0, 0,179, 5, 21, 1, 10, 8, 22, 1, 11, 8, 22, 1, 12, 8, 22, 1, 13, 8, 22, 1, 14, 8, 22, 1, 15, 8, 22, 1, 16, 8, + 22, 1, 17, 8, 22, 1, 18, 8, 22, 1, 19, 8, 22, 1, 20, 8, 22, 1, 21, 8, 22, 1, 22, 8, 22, 1, 23, 8, 22, 1, 24, 8, + 22, 1, 25, 8, 22, 1, 26, 8, 22, 1, 27, 8, 23, 1, 28, 8, 4, 0, 29, 8, 4, 0, 27, 0, 25, 1, 3, 0, 25, 1, 0, 0, + 25, 1, 1, 0, 0, 0, 30, 8, 26, 1, 5, 0, 4, 0, 18, 0, 4, 0, 27, 0, 7, 0,156, 2, 7, 0, 31, 8, 7, 0, 50, 2, + 27, 1, 95, 0, 4, 0, 18, 0, 4, 0, 32, 8, 4, 0, 33, 8, 0, 0, 34, 8, 0, 0, 35, 8, 0, 0, 36, 8, 0, 0, 37, 8, + 0, 0, 38, 8, 0, 0, 39, 8, 0, 0, 40, 8, 0, 0, 41, 8, 0, 0, 42, 8, 0, 0, 43, 8, 4, 0, 44, 8, 2, 0, 45, 8, + 2, 0, 46, 8, 2, 0, 47, 8, 2, 0, 48, 8, 4, 0, 49, 8, 4, 0, 50, 8, 4, 0, 51, 8, 4, 0, 52, 8, 2, 0, 53, 8, + 2, 0, 54, 8, 4, 0, 55, 8, 4, 0, 56, 8, 4, 0, 57, 8, 4, 0, 58, 8, 4, 0, 59, 8, 4, 0, 61, 7, 4, 0, 60, 8, + 2, 0, 61, 8, 2, 0, 62, 8, 2, 0, 63, 8, 2, 0, 64, 8, 14, 0, 65, 8, 14, 0, 66, 8, 14, 0, 67, 8, 14, 0, 68, 8, + 14, 0, 69, 8, 14, 0, 70, 8, 0, 0, 71, 8, 2, 0, 72, 8, 2, 0, 73, 8, 2, 0, 74, 8, 2, 0, 75, 8, 2, 0, 76, 8, + 2, 0, 77, 8, 2, 0, 78, 8, 2, 0, 79, 8, 26, 1, 80, 8, 2, 0, 81, 8, 2, 0, 82, 8, 2, 0, 83, 8, 2, 0, 84, 8, + 2, 0, 85, 8, 2, 0, 86, 8, 2, 0, 87, 8, 2, 0, 88, 8, 4, 0, 89, 8, 4, 0, 90, 8, 2, 0, 91, 8, 2, 0, 92, 8, + 2, 0, 93, 8, 2, 0, 94, 8, 2, 0, 95, 8, 2, 0, 96, 8, 2, 0, 97, 8, 2, 0, 98, 8, 2, 0, 99, 8, 2, 0,100, 8, + 2, 0,101, 8, 2, 0,102, 8, 2, 0,103, 8, 2, 0,104, 8, 2, 0,105, 8, 2, 0,106, 8, 2, 0,107, 8, 2, 0,108, 8, + 7, 0,109, 8, 4, 0,110, 8, 7, 0,111, 8, 2, 0, 25, 6, 2, 0, 26, 6, 2, 0,112, 8, 2, 0,113, 8, 50, 0,114, 8, + 7, 0,115, 8, 2, 0,116, 8, 2, 0,250, 1, 0, 0,117, 8, 4, 0,118, 8, 4, 0,119, 8, 7, 0,120, 8, 7, 0, 27, 0, + 28, 1, 24, 0, 22, 0, 32, 0, 14, 0,121, 8, 14, 0,122, 8, 14, 0,123, 8, 14, 0,153, 6, 41, 0,124, 0, 41, 0,124, 8, + 4, 0,125, 8, 4, 0, 66, 0, 2, 0,126, 8, 2, 0,127, 8, 2, 0,128, 8, 2, 0,129, 8, 2, 0,130, 8, 2, 0,131, 8, + 2, 0,132, 8, 2, 0,133, 8, 2, 0,134, 8, 2, 0,135, 8, 2, 0,136, 8, 2, 0, 27, 0,238, 0,137, 8, 11, 0,138, 8, + 2, 0,139, 8, 29, 1, 5, 0, 29, 1, 0, 0, 29, 1, 1, 0, 29, 1,140, 8, 15, 0,141, 8, 4, 0, 18, 0, 30, 1, 7, 0, + 30, 1, 0, 0, 30, 1, 1, 0, 29, 1,142, 8, 29, 1,143, 8, 2, 0,128, 5, 2, 0, 18, 0, 4, 0, 27, 0, 31, 1, 25, 0, + 31, 1, 0, 0, 31, 1, 1, 0, 32, 1,144, 8, 33, 1,246, 6, 0, 0,145, 8, 0, 0,146, 8, 0, 0,147, 8, 2, 0,148, 8, + 2, 0,149, 8, 2, 0,150, 8, 2, 0,151, 8, 2, 0,152, 8, 2, 0, 27, 0, 2, 0, 18, 0, 2, 0,153, 8, 2, 0,154, 8, + 2, 0,155, 8, 4, 0,156, 8, 31, 1,157, 8, 11, 0,158, 8, 4, 0,159, 8, 4, 0,160, 8, 4, 0,161, 8, 4, 0,162, 8, + 0, 0,163, 8, 34, 1, 22, 0, 34, 1, 0, 0, 34, 1, 1, 0, 29, 1,142, 8, 29, 1,143, 8, 29, 1,164, 8, 29, 1,165, 8, + 28, 1,166, 8, 18, 0, 50, 0, 0, 0,154, 6, 0, 0,167, 8, 2, 0,199, 6, 2, 0,200, 6, 2, 0,168, 8, 2, 0, 27, 0, + 2, 0,130, 8, 2, 0, 60, 7, 2, 0, 18, 0, 35, 1,144, 8, 14, 0,169, 8, 14, 0,153, 6, 14, 0,170, 8, 14, 0,171, 8, + 36, 1, 24, 0, 36, 1, 0, 0, 36, 1, 1, 0,241, 0,207, 6, 18, 0,172, 8, 18, 0,173, 8, 2, 0,199, 6, 2, 0,200, 6, + 2, 0,174, 8, 2, 0,175, 8, 2, 0,176, 8, 2, 0, 18, 0, 7, 0, 96, 2, 2, 0,150, 8, 2, 0,151, 8, 2, 0,129, 8, + 2, 0,177, 8, 2, 0,134, 8, 2, 0, 86, 1, 37, 1,144, 8, 14, 0,178, 8, 14, 0,179, 8, 14, 0,170, 8, 0, 0,180, 8, + 11, 0,181, 8, 38, 1, 14, 0, 0, 0,182, 8, 2, 0,183, 8, 2, 0,184, 8, 2, 0,185, 8, 2, 0,186, 8, 2, 0,117, 5, + 2, 0,187, 8, 28, 1,188, 8, 41, 0,189, 8, 4, 0,190, 8, 4, 0,191, 8, 4, 0,192, 8, 4, 0, 27, 0, 0, 0, 79, 7, + 39, 1, 3, 0, 0, 0,193, 8, 4, 0,194, 8, 4, 0,195, 8, 40, 1, 4, 0, 4, 0, 14, 7, 4, 0,196, 8, 4, 0, 20, 7, + 4, 0,197, 8, 41, 1, 2, 0, 4, 0,198, 8, 4, 0,199, 8, 42, 1, 5, 0, 7, 0,200, 8, 7, 0,201, 8, 7, 0,202, 8, + 4, 0, 18, 0, 4, 0, 27, 0, 43, 1, 7, 0, 0, 0,203, 8, 0, 0,228, 6, 44, 0,137, 0, 2, 0,204, 8, 2, 0, 79, 5, + 2, 0,205, 8, 2, 0,206, 8, 44, 1, 12, 0, 44, 1, 0, 0, 44, 1, 1, 0, 4, 0, 28, 0, 4, 0,207, 8, 4, 0,208, 8, + 4, 0,209, 8, 39, 1,210, 8, 0, 0,203, 8, 43, 1,181, 3, 40, 1,211, 8, 41, 1,212, 8, 42, 1,213, 8, 45, 1, 12, 0, + 0, 0, 35, 0, 11, 0,226, 0, 0, 0,227, 0, 4, 0,230, 0, 4, 0,238, 0, 11, 0,231, 0, 7, 0,233, 0, 7, 0,234, 0, + 11, 0,214, 8, 11, 0,215, 8, 11, 0,235, 0, 11, 0,237, 0, 46, 1, 50, 0, 46, 1, 0, 0, 46, 1, 1, 0, 11, 0,216, 8, + 11, 0, 25, 0, 0, 0, 19, 0, 4, 0, 18, 0, 4, 0, 16, 0, 4, 0, 22, 0, 4, 0, 89, 0, 4, 0,217, 8, 4, 0,218, 8, + 4, 0,208, 8, 4, 0,209, 8, 4, 0,219, 8, 4, 0,250, 0, 4, 0,220, 8, 4, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, + 7, 0,224, 8, 2, 0,225, 8, 2, 0,226, 8, 4, 0,227, 8, 4, 0,228, 8, 44, 1,229, 8, 31, 0, 79, 0, 41, 0,124, 0, + 27, 0,230, 8, 44, 0,137, 0,230, 0,113, 6, 7, 0,231, 8, 7, 0,232, 8, 45, 1, 71, 1, 46, 1,233, 8, 46, 1,234, 8, + 46, 1,235, 8, 14, 0,236, 8, 47, 1,237, 8, 11, 0,238, 8, 7, 0, 89, 4, 7, 0,239, 8, 7, 0,240, 8, 7, 0,241, 8, + 11, 0,242, 8, 4, 0,243, 8, 4, 0,244, 8, 4, 0,245, 8, 7, 0,246, 8, 4, 0,128, 0, 4, 0, 27, 0, 48, 1, 4, 0, + 48, 1, 0, 0, 48, 1, 1, 0, 14, 0,247, 8, 46, 1,248, 8,227, 0, 11, 0, 14, 0,249, 8, 14, 0,236, 8, 14, 0,250, 8, + 46, 1,251, 8, 0, 0,252, 8, 0, 0,253, 8, 4, 0,254, 8, 4, 0,255, 8, 4, 0, 0, 9, 4, 0, 27, 0, 19, 0, 1, 9, + 49, 1, 4, 0, 7, 0, 2, 9, 7, 0, 99, 3, 2, 0, 3, 9, 2, 0, 4, 9, 50, 1, 6, 0, 7, 0, 5, 9, 7, 0, 6, 9, + 7, 0, 7, 9, 7, 0, 8, 9, 4, 0, 9, 9, 4, 0, 10, 9, 51, 1, 8, 0, 7, 0, 11, 9, 7, 0, 12, 9, 7, 0, 13, 9, + 7, 0, 14, 9, 7, 0, 15, 9, 4, 0,255, 2, 4, 0, 16, 9, 4, 0, 17, 9, 52, 1, 2, 0, 7, 0,187, 5, 7, 0, 27, 0, + 53, 1, 5, 0, 7, 0, 18, 9, 7, 0, 19, 9, 4, 0, 91, 0, 4, 0,217, 2, 4, 0, 20, 9, 54, 1, 6, 0, 54, 1, 0, 0, + 54, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 21, 9, 2, 0, 55, 0, 55, 1, 8, 0, 55, 1, 0, 0, 55, 1, 1, 0, + 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 21, 9, 2, 0, 55, 0, 7, 0, 22, 0, 7, 0,128, 0, 56, 1, 45, 0, 56, 1, 0, 0, + 56, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 21, 9, 2, 0,246, 0, 2, 0,131, 4, 2, 0, 22, 9, 7, 0, 23, 9, + 7, 0, 90, 0, 7, 0, 12, 3, 4, 0, 24, 9, 4, 0, 81, 0, 4, 0,219, 2, 7, 0, 25, 9, 7, 0, 26, 9, 7, 0, 27, 9, + 7, 0, 28, 9, 7, 0, 29, 9, 7, 0, 30, 9, 7, 0, 9, 3, 7, 0, 68, 1, 7, 0, 31, 9, 7, 0, 32, 9, 7, 0, 27, 0, + 7, 0, 33, 9, 7, 0, 34, 9, 7, 0, 35, 9, 2, 0, 36, 9, 2, 0, 37, 9, 2, 0, 38, 9, 2, 0, 39, 9, 2, 0, 40, 9, + 2, 0, 41, 9, 2, 0, 42, 9, 2, 0, 43, 9, 2, 0, 35, 2, 2, 0, 44, 9, 2, 0, 32, 2, 2, 0, 45, 9, 0, 0, 46, 9, + 0, 0, 47, 9, 7, 0,244, 0, 57, 1, 48, 9, 64, 0,253, 1, 58, 1, 16, 0, 58, 1, 0, 0, 58, 1, 1, 0, 2, 0, 16, 0, + 2, 0, 18, 0, 2, 0, 21, 9, 2, 0,246, 0, 7, 0, 4, 3, 7, 0, 5, 3, 7, 0, 6, 3, 7, 0, 85, 2, 7, 0, 7, 3, + 7, 0, 8, 3, 7, 0, 49, 9, 7, 0, 9, 3, 7, 0, 11, 3, 7, 0, 12, 3,254, 0, 5, 0, 2, 0, 16, 0, 2, 0, 50, 9, + 2, 0, 18, 0, 2, 0, 51, 9, 22, 0, 49, 7,253, 0, 3, 0, 4, 0, 68, 0, 4, 0, 52, 9,254, 0, 2, 0, 59, 1, 7, 0, + 59, 1, 0, 0, 59, 1, 1, 0, 0, 0, 19, 0, 2, 0, 16, 0, 2, 0, 18, 0, 4, 0, 21, 0, 11, 0, 53, 9, 60, 1, 5, 0, + 0, 0, 19, 0, 7, 0, 94, 1, 7, 0, 54, 9, 4, 0, 55, 9, 4, 0, 27, 0, 61, 1, 4, 0, 2, 0, 16, 0, 2, 0, 18, 0, + 2, 0, 66, 0, 2, 0, 30, 0, 62, 1, 4, 0, 0, 0, 19, 0, 63, 0, 56, 9, 7, 0, 94, 1, 7, 0, 27, 0, 63, 1, 6, 0, + 2, 0, 57, 9, 2, 0, 58, 9, 2, 0, 16, 0, 2, 0, 59, 9, 0, 0, 60, 9, 0, 0, 61, 9, 64, 1, 5, 0, 4, 0, 16, 0, + 4, 0, 27, 0, 0, 0, 19, 0, 0, 0, 62, 9, 0, 0, 63, 9, 65, 1, 3, 0, 4, 0, 16, 0, 4, 0, 27, 0, 0, 0, 19, 0, + 66, 1, 4, 0, 2, 0, 64, 9, 2, 0, 65, 9, 2, 0, 18, 0, 2, 0, 27, 0, 67, 1, 6, 0, 0, 0, 19, 0, 0, 0, 66, 9, + 2, 0, 67, 9, 2, 0, 9, 3, 2, 0, 87, 1, 2, 0, 30, 0, 68, 1, 5, 0, 0, 0, 19, 0, 7, 0, 99, 3, 7, 0,222, 4, + 2, 0, 18, 0, 2, 0,231, 2, 69, 1, 3, 0, 0, 0, 19, 0, 4, 0,219, 2, 4, 0, 64, 9, 70, 1, 7, 0, 0, 0, 19, 0, + 7, 0,222, 4, 0, 0, 68, 9, 0, 0, 69, 9, 2, 0, 87, 1, 2, 0, 66, 0, 4, 0, 70, 9, 71, 1, 4, 0, 0, 0, 71, 9, + 0, 0, 72, 9, 4, 0, 16, 0, 7, 0,235, 2, 72, 1, 3, 0, 27, 0, 73, 9, 0, 0, 74, 9, 0, 0, 75, 9, 73, 1, 18, 0, + 73, 1, 0, 0, 73, 1, 1, 0, 2, 0, 16, 0, 2, 0, 76, 9, 2, 0, 18, 0, 2, 0, 77, 9, 2, 0, 78, 9, 2, 0, 79, 9, + 2, 0, 66, 0, 2, 0, 30, 0, 0, 0, 19, 0, 11, 0, 2, 0, 74, 1, 80, 9, 27, 0, 43, 0, 2, 0,224, 5, 2, 0,181, 2, + 2, 0, 81, 9, 2, 0, 27, 0, 75, 1, 11, 0, 0, 0, 19, 0, 0, 0, 16, 0, 0, 0, 82, 9, 2, 0, 18, 0, 2, 0,231, 2, + 2, 0, 83, 9, 4, 0, 84, 9, 4, 0, 85, 9, 4, 0, 86, 9, 4, 0, 87, 9, 4, 0, 88, 9, 76, 1, 1, 0, 0, 0, 89, 9, + 77, 1, 4, 0, 37, 0, 13, 7, 0, 0, 30, 8, 4, 0, 87, 1, 4, 0, 18, 0, 74, 1, 18, 0, 74, 1, 0, 0, 74, 1, 1, 0, + 74, 1, 90, 9, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 91, 9, 2, 0, 79, 9, 2, 0, 76, 9, 2, 0, 92, 9, 2, 0, 30, 0, + 2, 0,250, 1, 0, 0, 19, 0, 11, 0, 2, 0, 78, 1, 80, 9, 73, 1, 93, 9, 2, 0, 14, 0, 2, 0, 94, 9, 4, 0, 95, 9, + 79, 1, 3, 0, 4, 0,245, 2, 4, 0, 27, 0, 27, 0, 43, 0, 80, 1, 15, 0,177, 0, 96, 9, 2, 0, 16, 0, 2, 0, 18, 0, + 7, 0, 23, 9, 7, 0, 90, 0, 0, 0, 19, 0, 0, 0, 97, 9, 2, 0, 98, 9, 2, 0, 99, 9, 2, 0,133, 0, 2, 0,100, 9, + 2, 0,101, 9, 2, 0, 27, 0, 7, 0,102, 9, 7, 0,103, 9, 81, 1, 8, 0, 7, 0,104, 9, 7, 0,105, 9, 7, 0,106, 9, + 7, 0,107, 9, 7, 0,108, 9, 7, 0,109, 9, 7, 0,110, 9, 7, 0,111, 9, 82, 1, 13, 0, 2, 0, 18, 0, 2, 0,112, 9, + 4, 0, 66, 0, 4, 0, 30, 0, 2, 0,184, 6, 7, 0, 89, 4, 7, 0,239, 8, 47, 1,237, 8, 81, 1,113, 9, 2, 0, 16, 0, + 2, 0,122, 5, 2, 0,221, 3, 2, 0,114, 9, 83, 1, 11, 0, 4, 0,245, 2, 2, 0, 16, 0, 2, 0, 18, 0, 27, 0, 43, 0, + 79, 0,115, 9, 0, 0, 19, 0, 7, 0,116, 9, 7, 0,117, 9, 7, 0,227, 3, 2, 0,118, 9, 2, 0,119, 9, 84, 1, 5, 0, + 2, 0, 16, 0, 2, 0, 66, 0, 4, 0, 27, 0, 41, 0,124, 0, 27, 0,215, 5, 85, 1, 5, 0, 4, 0, 27, 0, 4, 0, 16, 0, + 0, 0, 19, 0, 0, 0, 62, 9, 27, 0, 43, 0, 86, 1, 13, 0, 2, 0, 18, 0, 2, 0, 16, 0, 2, 0, 76, 9, 2, 0,228, 3, + 7, 0,120, 9, 7, 0,121, 9, 7, 0, 86, 1, 7, 0,122, 9, 7, 0,197, 3, 7, 0,201, 3, 7, 0,123, 9, 7, 0,124, 9, + 27, 0,125, 9, 87, 1, 10, 0, 2, 0, 18, 0, 2, 0, 16, 0, 7, 0, 23, 9, 7, 0, 90, 0, 0, 0, 19, 0, 0, 0, 97, 9, + 2, 0, 66, 0, 2, 0, 30, 0, 2, 0,250, 1, 2, 0,122, 5, 88, 1, 8, 0, 27, 0, 43, 0, 7, 0, 6, 3, 7, 0,126, 9, + 7, 0,127, 9, 7, 0,228, 3, 2, 0, 66, 0, 2, 0,231, 2, 7, 0, 30, 0, 89, 1, 12, 0, 2, 0, 16, 0, 2, 0, 87, 1, + 2, 0, 18, 0, 2, 0, 9, 3, 2, 0,245, 2, 2, 0,128, 9, 4, 0, 27, 0, 7, 0,129, 9, 7, 0,130, 9, 7, 0,131, 9, + 7, 0,132, 9, 0, 0,133, 9, 90, 1, 9, 0, 2, 0, 18, 0, 2, 0, 16, 0, 4, 0, 23, 9, 4, 0, 90, 0, 0, 0, 19, 0, + 2, 0, 86, 1, 2, 0, 62, 0, 2, 0,134, 9, 2, 0,135, 9, 91, 1, 7, 0, 4, 0,219, 2, 4, 0,136, 9, 4, 0,137, 9, + 4, 0,138, 9, 7, 0,139, 9, 7, 0,140, 9, 0, 0, 68, 9, 92, 1, 7, 0, 0, 0,141, 9, 27, 0,142, 9, 0, 0, 74, 9, + 2, 0,143, 9, 2, 0, 66, 0, 4, 0, 30, 0, 0, 0, 75, 9, 93, 1, 6, 0, 2, 0, 18, 0, 2, 0, 16, 0, 4, 0, 23, 9, + 4, 0, 90, 0, 0, 0,144, 9, 0, 0,145, 9, 94, 1, 1, 0, 4, 0, 18, 0, 95, 1, 6, 0, 0, 0, 93, 0, 2, 0, 16, 0, + 2, 0, 18, 0, 4, 0,146, 9, 7, 0,147, 9, 37, 0, 13, 7, 96, 1, 4, 0, 0, 0,186, 2, 2, 0, 18, 0, 4, 0, 16, 0, + 27, 0, 43, 0, 97, 1, 2, 0, 4, 0, 16, 0, 4, 0,188, 6, 98, 1, 8, 0, 0, 0, 71, 9, 0, 0, 72, 9, 4, 0, 16, 0, + 7, 0, 43, 2, 7, 0,148, 9, 7, 0, 27, 0, 27, 0, 75, 3, 27, 0,149, 9, 99, 1, 11, 0, 0, 0, 61, 6, 0, 0, 18, 0, + 2, 0,150, 9, 4, 0, 16, 0, 7, 0, 94, 1, 7, 0,151, 9, 7, 0,152, 9, 7, 0,153, 9, 4, 0,154, 9, 27, 0, 75, 3, + 27, 0,155, 9, 78, 1, 10, 0, 78, 1, 0, 0, 78, 1, 1, 0, 78, 1, 90, 9, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0, 76, 9, + 2, 0,156, 9, 0, 0, 19, 0, 11, 0, 2, 0, 27, 0, 43, 0, 47, 1, 17, 0, 22, 0, 32, 0, 0, 0, 35, 0, 38, 0,152, 0, + 11, 0,226, 0, 38, 0,157, 9, 31, 0, 79, 0, 7, 0, 89, 4, 7, 0,158, 9, 7, 0,239, 8, 7, 0,104, 9, 7, 0,105, 9, + 7, 0,159, 9, 4, 0, 91, 0, 4, 0, 27, 0, 11, 0,160, 9, 11, 0,161, 9, 11, 0,162, 9,100, 1, 6, 0,100, 1, 0, 0, +100, 1, 1, 0, 27, 0, 43, 0, 11, 0,163, 9, 2, 0,251, 0, 0, 0,216, 2, 64, 0, 4, 0, 22, 0, 32, 0, 14, 0,164, 9, + 4, 0,133, 0, 7, 0,165, 9,101, 1, 28, 0,101, 1, 0, 0,101, 1, 1, 0, 21, 0,166, 9,101, 1, 37, 0, 14, 0,167, 9, + 0, 0, 19, 0, 7, 0,168, 9, 7, 0,169, 9, 7, 0,170, 9, 7, 0,171, 9, 4, 0, 18, 0, 7, 0,172, 9, 7, 0,173, 9, + 7, 0,174, 9, 7, 0,175, 9, 7, 0, 94, 1, 7, 0, 43, 2, 7, 0,176, 9, 7, 0,217, 2, 7, 0,177, 9, 7, 0,178, 9, + 7, 0,179, 9, 7, 0,180, 9, 7, 0,181, 9, 7, 0,175, 0, 4, 0,133, 0, 2, 0, 5, 6, 2, 0,182, 9,102, 1, 27, 0, + 22, 0, 32, 0, 34, 0, 74, 0, 14, 0,183, 9, 14, 0,184, 9, 14, 0,185, 9,101, 1,186, 9, 11, 0,187, 9, 11, 0,188, 9, + 4, 0, 18, 0, 4, 0,164, 6, 4, 0,189, 9, 4, 0, 27, 0, 2, 0, 13, 3, 2, 0,218, 6, 4, 0,190, 9, 4, 0,133, 0, + 4, 0,191, 9, 2, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9, 2, 0,195, 9, 4, 0,196, 9, 4, 0,197, 9, 4, 0,198, 9, + 4, 0,199, 9, 4, 0,200, 9, 4, 0,201, 9,103, 1, 2, 0, 7, 0,170, 2, 4, 0, 18, 0,181, 0, 5, 0,103, 1,202, 9, + 4, 0,217, 2, 4, 0,203, 9, 4, 0,204, 9, 4, 0, 18, 0,180, 0, 16, 0, 4, 0,205, 9, 4, 0,206, 9, 4, 0,207, 9, + 4, 0,208, 9, 2, 0,209, 9, 2, 0,210, 9, 2, 0,211, 9, 2, 0,251, 0, 2, 0,212, 9, 2, 0,213, 9, 2, 0,214, 9, + 2, 0,215, 9, 4, 0,216, 9, 4, 0,217, 9, 4, 0,218, 9, 4, 0,219, 9,104, 1, 40, 0,104, 1, 0, 0,104, 1, 1, 0, + 21, 0,166, 9, 14, 0, 0, 4, 0, 0, 19, 0, 2, 0, 18, 0, 2, 0,220, 9, 2, 0,214, 3, 2, 0,221, 9, 0, 0,222, 9, + 0, 0,223, 9, 0, 0,224, 9,101, 1,225, 9,104, 1, 37, 0,104, 1,226, 9, 14, 0,227, 9, 14, 0,228, 9,181, 0,189, 3, + 27, 0,229, 9,104, 1,230, 9, 7, 0, 77, 1, 7, 0,175, 0, 7, 0,231, 9, 7, 0, 22, 2, 7, 0,203, 3, 7, 0,205, 3, + 2, 0,237, 3, 2, 0, 27, 0, 7, 0,232, 9, 7, 0,233, 9, 7, 0,208, 3, 7, 0,234, 9, 7, 0,235, 9, 7, 0,236, 9, + 7, 0,237, 9, 7, 0,238, 9, 7, 0,239, 9, 7, 0,240, 9, 7, 0,241, 9, 11, 0,242, 9,178, 0, 16, 0, 14, 0,243, 9, + 74, 0,244, 9, 2, 0, 18, 0, 2, 0, 27, 0, 4, 0,245, 9, 4, 0, 66, 0, 7, 0, 83, 0, 7, 0,246, 9, 7, 0,247, 9, + 14, 0,248, 9, 4, 0,249, 9, 4, 0,250, 9, 11, 0,251, 9, 11, 0,252, 9,180, 0,188, 3, 0, 0,253, 9,105, 1, 1, 0, + 4, 0,250, 9,106, 1, 12, 0, 4, 0,250, 9, 7, 0, 88, 9, 2, 0,254, 9, 2, 0,255, 9, 7, 0, 0, 10, 7, 0, 1, 10, + 2, 0, 2, 10, 2, 0, 18, 0, 7, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0, 6, 10,107, 1, 7, 0,107, 1, 0, 0, +107, 1, 1, 0, 14, 0, 7, 10, 4, 0, 18, 0, 4, 0, 8, 10, 0, 0, 19, 0, 23, 1, 9, 10,177, 0, 9, 0, 22, 0, 32, 0, + 14, 0, 10, 10, 14, 0,243, 9, 14, 0, 11, 10, 14, 0,101, 0, 4, 0, 18, 0, 4, 0, 12, 10, 4, 0, 13, 10, 4, 0, 27, 0, +244, 0, 8, 0, 22, 0, 14, 10, 14, 0,243, 9, 64, 0, 15, 10, 0, 0, 16, 10, 4, 0, 17, 10, 4, 0, 18, 0, 4, 0, 18, 10, + 4, 0, 27, 0,108, 1, 13, 0,240, 0, 0, 0,240, 0, 1, 0, 14, 0,153, 6, 4, 0,154, 6, 7, 0,155, 6, 2, 0,156, 6, +241, 0,207, 6,177, 0,184, 3,244, 0, 19, 10, 0, 0, 87, 1, 0, 0,210, 6, 2, 0, 18, 0, 7, 0, 20, 10,109, 1, 8, 0, +109, 1, 0, 0,109, 1, 1, 0,107, 1, 21, 10, 31, 0, 79, 0, 14, 0,190, 3, 4, 0, 18, 0, 0, 0, 19, 0, 4, 0,127, 8, +110, 1, 5, 0,110, 1, 0, 0,110, 1, 1, 0, 31, 0, 79, 0, 2, 0, 18, 0, 0, 0, 22, 10,111, 1, 14, 0,111, 1, 0, 0, +111, 1, 1, 0, 11, 0, 2, 0, 2, 0, 16, 0, 2, 0, 18, 0, 0, 0, 23, 10, 0, 0, 24, 10, 0, 0, 19, 0, 2, 0, 27, 0, + 7, 0, 25, 10, 7, 0, 26, 10, 31, 0, 79, 0, 7, 0, 27, 10, 7, 0, 28, 10,112, 1, 9, 0,112, 1, 0, 0,112, 1, 1, 0, + 27, 0, 29, 10, 0, 0, 16, 3, 7, 0, 30, 10, 2, 0, 31, 10, 2, 0, 18, 0, 2, 0, 16, 0, 2, 0, 32, 10,113, 1, 7, 0, + 37, 0, 13, 7, 21, 0,166, 9, 4, 0, 18, 0, 4, 0, 33, 10, 14, 0, 34, 10, 27, 0, 29, 10, 0, 0, 16, 3,114, 1, 15, 0, + 27, 0, 29, 10, 2, 0, 35, 10, 2, 0, 18, 0, 2, 0, 36, 10, 2, 0, 37, 10, 0, 0, 16, 3, 27, 0, 38, 10, 0, 0, 39, 10, + 7, 0, 40, 10, 7, 0, 43, 2, 7, 0, 41, 10, 7, 0, 42, 10, 2, 0, 16, 0, 2, 0, 87, 1, 7, 0, 94, 1,115, 1, 6, 0, + 27, 0, 29, 10, 7, 0,202, 9, 2, 0, 43, 10, 2, 0, 44, 10, 2, 0, 18, 0, 2, 0, 45, 10,116, 1, 6, 0, 27, 0, 29, 10, + 4, 0, 46, 10, 4, 0, 47, 10, 4, 0, 91, 0, 4, 0, 27, 0, 0, 0, 16, 3,117, 1, 4, 0, 27, 0, 29, 10, 4, 0, 18, 0, + 4, 0, 46, 10, 0, 0, 16, 3,118, 1, 4, 0, 27, 0, 29, 10, 4, 0, 18, 0, 4, 0, 46, 10, 0, 0, 16, 3,119, 1, 4, 0, + 27, 0, 29, 10, 4, 0, 18, 0, 4, 0, 46, 10, 0, 0, 16, 3,120, 1, 2, 0, 4, 0, 18, 0, 7, 0, 89, 4,121, 1, 2, 0, + 27, 0, 29, 10, 0, 0, 16, 3,122, 1, 10, 0, 27, 0, 29, 10, 4, 0, 48, 10, 7, 0,127, 0, 4, 0, 18, 0, 2, 0, 11, 7, + 2, 0, 49, 10, 2, 0, 66, 0, 2, 0, 30, 0, 7, 0, 50, 10, 0, 0, 16, 3,123, 1, 10, 0, 27, 0, 29, 10, 2, 0, 16, 0, + 2, 0,139, 4, 4, 0, 89, 0, 4, 0, 90, 0, 7, 0,126, 9, 7, 0,127, 9, 4, 0, 27, 0,177, 0, 96, 9, 0, 0, 16, 3, +124, 1, 4, 0, 27, 0, 29, 10, 4, 0,215, 3, 4, 0, 51, 10, 0, 0, 16, 3,125, 1, 4, 0, 27, 0, 29, 10, 4, 0,215, 3, + 4, 0, 27, 0, 0, 0, 16, 3,126, 1, 6, 0, 27, 0, 29, 10, 7, 0,127, 0, 7, 0, 87, 3, 4, 0, 52, 10, 2, 0,215, 3, + 2, 0,216, 3,127, 1, 6, 0, 27, 0, 29, 10, 4, 0, 53, 10, 4, 0, 54, 10, 7, 0, 55, 10, 7, 0, 56, 10, 0, 0, 16, 3, +128, 1, 16, 0, 27, 0, 29, 10, 27, 0,226, 9, 4, 0, 16, 0, 7, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 60, 10, + 7, 0, 61, 10, 7, 0, 62, 10, 7, 0, 63, 10, 7, 0, 64, 10, 7, 0, 65, 10, 2, 0, 18, 0, 2, 0, 27, 0, 2, 0, 66, 0, + 2, 0, 30, 0,129, 1, 3, 0, 27, 0, 29, 10, 4, 0, 18, 0, 4, 0, 35, 2,130, 1, 5, 0, 27, 0, 29, 10, 4, 0, 18, 0, + 4, 0, 27, 0, 7, 0, 66, 10, 0, 0, 16, 3,131, 1, 10, 0, 27, 0, 29, 10, 0, 0, 16, 3, 2, 0, 67, 10, 2, 0, 68, 10, + 0, 0, 69, 10, 0, 0, 70, 10, 7, 0, 71, 10, 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10,132, 1, 5, 0, 27, 0, 29, 10, + 0, 0, 16, 3, 7, 0,225, 2, 2, 0, 75, 10, 2, 0, 18, 0,133, 1, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, + 7, 0, 11, 0, 7, 0, 76, 10, 7, 0, 77, 10, 2, 0, 18, 0, 2, 0, 35, 2,134, 1, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, + 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 76, 10, 7, 0, 77, 10, 2, 0, 18, 0, 2, 0, 35, 2,135, 1, 8, 0, 7, 0, 8, 0, + 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 76, 10, 7, 0, 77, 10, 2, 0, 18, 0, 2, 0, 35, 2,136, 1, 7, 0, + 27, 0, 29, 10, 0, 0, 16, 3, 7, 0, 94, 1, 7, 0,103, 1, 2, 0, 18, 0, 2, 0, 87, 1, 4, 0, 27, 0,137, 1, 5, 0, + 27, 0, 75, 3, 7, 0, 94, 1, 2, 0, 79, 3, 0, 0, 81, 3, 0, 0, 78, 10,138, 1, 7, 0,230, 0,113, 6, 0, 0, 79, 10, + 4, 0, 18, 0, 4, 0, 27, 0, 0, 0, 80, 10, 27, 0,215, 5, 27, 0, 81, 10,139, 1, 3, 0,230, 0,113, 6, 4, 0, 18, 0, + 4, 0, 27, 0,140, 1, 6, 0,230, 0,113, 6, 4, 0, 18, 0, 4, 0, 27, 0, 0, 0, 80, 10, 7, 0, 66, 10, 27, 0,215, 5, +141, 1, 10, 0,141, 1, 0, 0,141, 1, 1, 0, 2, 0, 16, 0, 2, 0, 18, 0, 0, 0, 82, 10, 7, 0, 31, 1, 7, 0, 32, 1, + 2, 0, 7, 10, 2, 0, 83, 10, 27, 0, 43, 0,142, 1, 22, 0,142, 1, 0, 0,142, 1, 1, 0, 2, 0, 18, 0, 2, 0, 87, 1, + 2, 0, 84, 10, 2, 0, 85, 10, 31, 0, 79, 0,177, 0, 96, 9, 27, 0,167, 0, 7, 0, 89, 0, 7, 0, 90, 0, 7, 0, 86, 10, + 7, 0, 87, 10, 7, 0, 88, 10, 7, 0, 89, 10, 7, 0, 2, 3, 7, 0,153, 3, 7, 0, 98, 9, 7, 0, 90, 10, 0, 0, 91, 10, + 0, 0, 92, 10, 14, 0,193, 3,143, 1, 11, 0, 7, 0, 50, 2, 7, 0,126, 9, 7, 0,127, 9, 11, 0, 2, 0, 2, 0, 93, 10, + 2, 0, 94, 10, 2, 0, 95, 10, 2, 0, 96, 10, 2, 0, 97, 10, 2, 0, 98, 10, 2, 0,186, 2,144, 1, 21, 0,144, 1, 0, 0, +144, 1, 1, 0,144, 1, 99, 10, 0, 0, 19, 0, 11, 0,100, 10, 2, 0, 16, 0, 2, 0, 18, 0, 2, 0,101, 10, 2, 0, 66, 0, + 7, 0,102, 10, 7, 0,103, 10, 11, 0,104, 10, 2, 0,105, 10, 2, 0,106, 10, 4, 0,107, 10, 11, 0,160, 9, 4, 0,108, 10, + 4, 0,109, 10,144, 1,110, 10,145, 1,111, 10,143, 1,112, 10,146, 1, 4, 0, 0, 0,113, 10, 2, 0,114, 10, 2, 0,115, 10, + 4, 0, 27, 0,147, 1, 41, 0,147, 1, 0, 0,147, 1, 1, 0,147, 1,116, 10, 0, 0, 19, 0, 4, 0, 18, 0, 2, 0, 16, 0, + 2, 0, 30, 0, 2, 0,207, 8, 2, 0,181, 2, 2, 0,117, 10, 2, 0, 16, 7, 2, 0,105, 10, 2, 0, 50, 9, 7, 0,118, 10, + 14, 0, 91, 9, 14, 0,119, 10,147, 1, 37, 0, 22, 0, 49, 7, 11, 0,100, 10, 7, 0,102, 10, 7, 0,103, 10, 7, 0, 85, 2, + 7, 0, 6, 3, 7, 0,120, 10, 7, 0,121, 10, 7, 0,122, 10, 4, 0,123, 10, 0, 0,124, 10, 2, 0,125, 10, 2, 0,126, 10, + 7, 0,127, 10, 7, 0,128, 10, 2, 0,129, 10, 2, 0,130, 10, 11, 0,131, 10, 19, 0,132, 10, 19, 0,133, 10, 19, 0,134, 10, +146, 1,153, 0,148, 1,135, 10,149, 1,136, 10,145, 1, 8, 0,145, 1, 0, 0,145, 1, 1, 0,147, 1,137, 10,147, 1,138, 10, +144, 1,139, 10,144, 1,140, 10, 4, 0, 18, 0, 4, 0, 27, 0, 57, 0, 23, 0, 22, 0, 32, 0, 34, 0, 74, 0,179, 0,187, 3, + 14, 0,141, 10, 14, 0,142, 10, 4, 0, 16, 0, 4, 0,143, 10, 4, 0,144, 10, 4, 0, 18, 0, 4, 0,123, 10, 4, 0,145, 10, + 2, 0,146, 10, 2, 0,147, 10, 4, 0,148, 10, 14, 0, 91, 9, 14, 0,119, 10,150, 1,149, 10, 11, 0,150, 10, 11, 0,151, 10, + 4, 0,152, 10, 11, 0,153, 10, 11, 0,154, 10, 11, 0,155, 10,151, 1, 4, 0, 4, 0, 17, 0, 4, 0,235, 2, 4, 0,126, 9, + 4, 0,127, 9,152, 1, 4, 0, 4, 0, 17, 0, 7, 0,235, 2, 7, 0,126, 9, 7, 0,127, 9,153, 1, 2, 0, 0, 0,235, 2, + 0, 0, 86, 1,154, 1, 4, 0, 4, 0, 17, 0, 7, 0,156, 10, 7, 0,126, 9, 7, 0,127, 9,155, 1, 1, 0, 7, 0,157, 10, +156, 1, 2, 0, 2, 0, 18, 0, 2, 0,158, 10,157, 1, 6, 0, 4, 0,126, 0, 4, 0,128, 0, 4, 0, 50, 9, 0, 0,159, 10, + 0, 0,160, 10, 2, 0, 27, 0,158, 1, 6, 0, 7, 0, 35, 1, 7, 0, 34, 1, 7, 0,161, 10, 7, 0,162, 10, 7, 0,163, 10, + 4, 0, 27, 0,159, 1, 6, 0,158, 1,164, 10,158, 1,165, 10,158, 1,166, 10,158, 1,167, 10, 7, 0,168, 10, 7, 0,169, 10, +160, 1, 5, 0, 7, 0, 99, 3, 4, 0,170, 10, 7, 0,171, 10, 7, 0,172, 10, 7, 0,173, 10,161, 1, 6, 0, 7, 0, 5, 0, + 7, 0, 6, 0, 7, 0,174, 10, 7, 0, 6, 3, 7, 0, 85, 2, 4, 0, 27, 0,162, 1, 6, 0, 7, 0, 5, 0, 7, 0, 6, 0, + 7, 0,174, 10, 7, 0, 6, 3, 7, 0, 85, 2, 4, 0, 27, 0,163, 1, 2, 0, 4, 0,175, 10, 4, 0,176, 10,164, 1, 16, 0, + 2, 0,150, 8, 2, 0,151, 8, 2, 0, 76, 5, 2, 0,177, 10, 2, 0,178, 10, 2, 0, 67, 0, 2, 0, 50, 7, 2, 0,179, 10, + 7, 0, 1, 3, 7, 0,180, 10, 7, 0,181, 10, 2, 0,110, 1, 0, 0,182, 10, 0, 0,161, 10, 4, 0,183, 10, 4, 0,184, 10, +165, 1, 9, 0, 7, 0,185, 10, 7, 0,186, 10, 7, 0,159, 9, 7, 0, 99, 3, 7, 0,187, 10, 7, 0,225, 6, 2, 0, 97, 3, + 0, 0,188, 10, 0, 0, 27, 0,166, 1, 4, 0, 7, 0,189, 10, 7, 0,190, 10, 2, 0, 97, 3, 2, 0, 27, 0,167, 1, 3, 0, + 7, 0,191, 10, 7, 0,222, 8, 7, 0, 14, 0,168, 1, 4, 0, 0, 0, 35, 0,205, 0, 87, 5, 4, 0,128, 0, 4, 0,137, 4, +169, 1, 6, 0, 0, 0,192, 10,205, 0,193, 10, 4, 0,128, 0, 4, 0,137, 4, 4, 0,194, 10, 4, 0, 27, 0,170, 1, 7, 0, + 2, 0,195, 10, 2, 0,196, 10, 4, 0, 66, 0, 0, 0, 82, 4,205, 0,193, 10, 0, 0,197, 10, 0, 0,178, 6,171, 1, 9, 0, + 7, 0,198, 10, 7, 0,199, 10, 7, 0,200, 10, 7, 0, 96, 2, 7, 0,201, 10, 7, 0,202, 10, 7, 0,203, 10, 2, 0,204, 10, + 2, 0,205, 10,172, 1, 8, 0, 2, 0,206, 10, 2, 0,207, 10, 2, 0,208, 10, 2, 0,209, 10, 7, 0,210, 10, 7, 0,211, 10, + 7, 0,212, 10, 7, 0,213, 10,173, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,174, 1, 2, 0, 0, 0,169, 0, 0, 0,214, 10, +175, 1, 1, 0, 0, 0, 19, 0,176, 1, 12, 0, 0, 0,215, 10, 0, 0,216, 10, 0, 0,216, 6, 0, 0,217, 10, 2, 0, 76, 5, + 2, 0,218, 10, 7, 0,219, 10, 7, 0,220, 10, 7, 0,221, 10, 7, 0,153, 3, 7, 0,174, 10, 7, 0,222, 10,177, 1, 2, 0, + 11, 0,223, 10, 11, 0,224, 10,178, 1, 13, 0, 0, 0, 79, 5, 0, 0, 16, 0, 0, 0, 97, 3, 0, 0, 99, 3, 0, 0,216, 10, + 0, 0,107, 0, 0, 0,186, 2, 7, 0,225, 10, 7, 0,226, 10, 7, 0,152, 3, 7, 0,227, 10, 7, 0,228, 10, 7, 0,222, 10, +179, 1, 8, 0, 7, 0, 57, 9, 7, 0,127, 0, 7, 0,161, 10, 7, 0,177, 2, 7, 0,229, 10, 7, 0,239, 0, 7, 0,230, 10, + 4, 0, 16, 0,180, 1, 4, 0, 2, 0,231, 10, 2, 0,232, 10, 2, 0,233, 10, 2, 0, 27, 0,181, 1, 8, 0, 7, 0,234, 10, + 7, 0,225, 2, 7, 0,235, 10, 7, 0,200, 8, 7, 0,201, 8, 7, 0,202, 8, 7, 0,236, 10, 7, 0,237, 10,182, 1, 6, 0, + 2, 0,238, 10, 2, 0,239, 10, 7, 0,240, 10, 7, 0,241, 10, 7, 0,242, 10, 7, 0,243, 10,183, 1, 2, 0, 58, 0,244, 10, + 59, 0,245, 10,184, 1, 3, 0,183, 1, 86, 6, 7, 0,246, 10, 7, 0,247, 10,185, 1, 3, 0,183, 1, 86, 6, 4, 0,248, 10, + 4, 0, 27, 0,186, 1, 1, 0,183, 1, 86, 6,187, 1, 3, 0,183, 1, 86, 6, 4, 0,248, 10, 4, 0,249, 10,188, 1, 3, 0, +183, 1, 86, 6, 4, 0,250, 10, 4, 0, 27, 0,189, 1, 1, 0,183, 1, 86, 6,190, 1, 3, 0,183, 1, 86, 6, 4, 0,251, 10, + 4, 0, 27, 0,191, 1, 3, 0,183, 1, 86, 6, 4, 0,252, 10, 4, 0, 27, 0,192, 1, 3, 0,183, 1, 86, 6, 4, 0,253, 10, + 4, 0, 27, 0,193, 1, 3, 0,183, 1, 86, 6, 4, 0,250, 0, 4, 0, 27, 0,194, 1, 1, 0, 0, 0, 19, 0,195, 1, 1, 0, + 0, 0, 19, 0,196, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 18, 0, 2, 0,254, 10,197, 1, 10, 0, 2, 0, 67, 4, + 2, 0, 18, 0, 7, 0,222, 4, 7, 0,255, 10, 7, 0, 0, 11, 7, 0, 1, 11, 7, 0, 2, 11,196, 1, 3, 11,196, 1, 4, 11, +196, 1, 5, 11, 54, 0, 11, 0, 4, 0, 18, 0, 4, 0, 62, 0, 4, 0, 6, 11, 4, 0, 7, 11, 19, 0, 8, 11, 19, 0, 9, 11, +197, 1, 10, 11, 7, 0, 11, 11, 7, 0, 12, 11, 7, 0, 13, 11, 7, 0, 14, 11, 1, 1, 10, 0, 4, 0, 7, 10, 4, 0, 15, 11, + 7, 0, 16, 11, 7, 0, 17, 11, 7, 0, 18, 11, 7, 0, 19, 11, 7, 0, 9, 0, 7, 0, 11, 0, 4, 0, 87, 1, 4, 0, 6, 3, + 0, 1, 18, 0, 4, 0,131, 0, 4, 0, 20, 11, 4, 0, 21, 11, 7, 0, 22, 11, 4, 0, 23, 11, 7, 0, 24, 11, 7, 0, 25, 11, + 4, 0, 26, 11, 7, 0, 27, 11, 4, 0, 28, 11, 7, 0, 29, 11, 1, 1, 30, 11, 7, 0, 31, 11, 7, 0, 32, 11, 7, 0, 33, 11, + 7, 0, 34, 11, 4, 0, 35, 11, 4, 0, 27, 0,198, 1, 4, 0, 42, 0,249, 2, 7, 0, 36, 11, 7, 0,181, 1, 7, 0, 27, 0, +214, 0, 36, 0, 22, 0, 32, 0,198, 1, 37, 11, 54, 0, 3, 11, 46, 0, 38, 11,214, 0, 39, 11, 52, 0, 40, 11, 25, 0,153, 0, + 0, 0, 41, 11, 7, 0, 42, 11, 2, 0,116, 6, 2, 0, 43, 11, 7, 0, 43, 2, 4, 0,107, 0, 4, 0, 18, 0, 7, 0, 44, 11, + 4, 0, 93, 2, 4, 0, 45, 11, 7, 0, 46, 11, 7, 0, 47, 11, 7, 0, 48, 11, 7, 0,181, 1, 4, 0, 49, 11, 7, 0, 50, 11, + 0, 0, 51, 11, 0, 0, 52, 11, 0, 0, 53, 11, 0, 0, 54, 11, 7, 0, 55, 11, 7, 0, 56, 11, 7, 0, 57, 11, 7, 0, 6, 3, + 7, 0, 58, 11, 4, 0, 59, 11, 7, 0,248, 5, 7, 0, 60, 11, 7, 0, 61, 11,199, 1, 10, 0, 4, 0, 16, 0, 4, 0,127, 0, + 4, 0, 18, 0, 4, 0, 20, 4, 4, 0, 62, 11, 4, 0, 63, 11, 4, 0, 64, 11, 4, 0, 69, 0, 0, 0, 19, 0, 11, 0, 2, 0, +200, 1, 1, 0, 0, 0, 79, 7, 95, 0, 8, 0,199, 1, 65, 11, 4, 0, 66, 11, 4, 0, 67, 11, 4, 0, 68, 11, 4, 0, 69, 11, + 4, 0, 30, 0, 11, 0, 70, 11,200, 1, 71, 11,201, 1, 5, 0, 7, 0,170, 2, 7, 0,245, 2, 7, 0, 43, 2, 2, 0,152, 2, + 2, 0, 27, 0,202, 1, 5, 0, 7, 0,170, 2, 7, 0,164, 4, 7, 0, 72, 11, 7, 0, 73, 11, 7, 0,245, 2,203, 1, 5, 0, + 27, 0, 74, 11,204, 1, 21, 0, 7, 0, 82, 6, 7, 0, 75, 11, 7, 0, 55, 0,205, 1, 3, 0, 7, 0, 76, 11, 4, 0, 77, 11, + 4, 0, 78, 11,206, 1, 7, 0, 4, 0, 79, 11, 4, 0, 80, 11, 4, 0, 81, 11, 7, 0, 82, 11, 7, 0, 83, 11, 7, 0, 84, 11, + 7, 0, 55, 0,207, 1, 8, 0,207, 1, 0, 0,207, 1, 1, 0, 27, 0, 43, 0, 4, 0, 3, 1, 2, 0, 18, 0, 2, 0, 87, 1, + 7, 0,245, 2, 7, 0, 65, 9,208, 1, 7, 0,208, 1, 0, 0,208, 1, 1, 0, 27, 0, 43, 0, 2, 0,230, 2, 2, 0, 18, 0, + 2, 0, 17, 2, 2, 0, 55, 0,209, 1, 17, 0,202, 1, 13, 4,202, 1, 85, 11,201, 1, 86, 11,202, 1, 48, 9,203, 1, 87, 11, + 4, 0, 81, 0, 7, 0,245, 2, 7, 0, 12, 3, 7, 0, 88, 11, 4, 0, 79, 11, 4, 0, 89, 11, 7, 0, 83, 11, 7, 0, 84, 11, + 7, 0,107, 0, 4, 0, 90, 11, 2, 0, 18, 0, 2, 0, 91, 11,210, 1, 15, 0, 7, 0,255, 0, 7, 0, 92, 11, 7, 0, 76, 11, + 7, 0, 93, 11, 7, 0, 94, 11, 7, 0, 95, 11, 7, 0, 96, 11, 7, 0, 97, 11, 7, 0, 98, 11, 7, 0, 99, 11, 7, 0,100, 11, + 7, 0,101, 11, 7, 0,102, 11, 4, 0, 18, 0, 4, 0,103, 11,211, 1,128, 0, 22, 0, 32, 0, 34, 0, 74, 0,212, 1,104, 11, +210, 1,105, 11,188, 0,159, 4, 4, 0, 18, 0, 4, 0, 55, 0, 2, 0, 16, 0, 2, 0, 67, 10, 2, 0,106, 11, 2, 0,124, 1, + 2, 0,107, 11, 2, 0,237, 3, 2, 0,108, 11, 2, 0,109, 11, 2, 0,110, 11, 2, 0,111, 11, 2, 0,112, 11, 2, 0,113, 11, + 2, 0,114, 11, 2, 0,115, 11, 2, 0,116, 11, 2, 0,232, 5, 2, 0,117, 11, 2, 0,118, 11, 2, 0,119, 11, 2, 0,120, 11, + 2, 0,121, 11, 2, 0, 32, 2, 2, 0, 41, 9, 2, 0, 16, 9, 2, 0,122, 11, 2, 0,123, 11, 2, 0, 30, 4, 2, 0, 31, 4, + 2, 0,124, 11, 2, 0,125, 11, 2, 0,126, 11, 2, 0,127, 11, 7, 0,128, 11, 7, 0,129, 11, 7, 0,130, 11, 7, 0,131, 11, + 7, 0,132, 11, 7, 0,133, 11, 7, 0,134, 11, 2, 0,161, 5, 2, 0,135, 11, 7, 0,136, 11, 7, 0,137, 11, 7, 0,138, 11, + 7, 0, 23, 9, 7, 0, 90, 0, 7, 0, 12, 3, 7, 0, 29, 9, 7, 0,139, 11, 7, 0,140, 11, 7, 0,141, 11, 7, 0,142, 11, + 7, 0,143, 11, 7, 0,144, 11, 4, 0, 24, 9, 4, 0, 22, 9, 4, 0,145, 11, 4, 0,146, 11, 2, 0,147, 11, 2, 0,148, 11, + 7, 0, 25, 9, 7, 0, 26, 9, 7, 0, 27, 9, 7, 0,149, 11, 7, 0,150, 11, 7, 0,151, 11, 7, 0,152, 11, 7, 0,153, 11, + 7, 0,154, 11, 7, 0,155, 11, 7, 0,156, 11, 7, 0,157, 11, 7, 0,227, 3, 7, 0,107, 0, 7, 0,158, 11, 7, 0,159, 11, + 7, 0,160, 11, 7, 0,161, 11, 7, 0,213, 0, 7, 0,162, 11, 4, 0,163, 11, 4, 0,164, 11, 7, 0,165, 11, 7, 0,166, 11, + 7, 0,167, 11, 7, 0,168, 11, 7, 0,169, 11, 7, 0,212, 0, 7, 0,170, 11, 7, 0, 57, 4, 7, 0, 55, 4, 7, 0, 56, 4, + 7, 0,171, 11, 7, 0,172, 11, 7, 0,173, 11, 7, 0,174, 11, 7, 0,175, 11, 7, 0,176, 11, 7, 0,177, 11, 7, 0,178, 11, + 7, 0,179, 11, 7, 0,180, 11, 7, 0,181, 11, 7, 0,182, 11, 7, 0,183, 11, 7, 0,184, 11, 7, 0,185, 11, 7, 0,186, 11, + 7, 0,187, 11, 7, 0,188, 11, 4, 0,189, 11, 4, 0,190, 11, 46, 0,143, 1, 64, 0, 5, 4, 14, 0,191, 11, 64, 0,192, 11, + 27, 0,193, 11, 27, 0,194, 11, 31, 0, 79, 0,183, 0, 73, 1,183, 0,195, 11,151, 0, 52, 0,151, 0, 0, 0,151, 0, 1, 0, +211, 1,196, 11,209, 1,197, 11,206, 1,226, 9,191, 0, 85, 4, 11, 0, 86, 4,213, 1,198, 11,213, 1,199, 11, 14, 0,200, 11, + 14, 0,201, 11,136, 0,202, 11,144, 0,203, 11,144, 0,204, 11, 27, 0,205, 11, 27, 0,206, 11, 27, 0, 37, 0, 14, 0, 34, 10, + 0, 0, 19, 0, 7, 0,244, 0, 7, 0, 41, 3, 7, 0,207, 11, 7, 0,208, 11, 4, 0,219, 2, 4, 0,209, 11, 4, 0, 18, 0, + 4, 0, 24, 9, 4, 0,210, 11, 4, 0,211, 11, 4, 0,212, 11, 4, 0,213, 11, 2, 0,251, 0, 2, 0,214, 11, 2, 0,215, 11, + 2, 0,216, 11, 0, 0,217, 11, 2, 0,218, 11, 2, 0,219, 11, 2, 0,220, 11, 11, 0,221, 11,140, 0,158, 4, 14, 0, 26, 3, + 14, 0,222, 11,205, 1,223, 11, 4, 0,224, 11, 4, 0,225, 11,214, 1,226, 11,142, 0, 38, 3,215, 1,227, 11, 7, 0,228, 11, + 7, 0,229, 11, 7, 0,230, 11,138, 0, 38, 0,216, 1,160, 9, 7, 0,128, 4, 7, 0,231, 11, 7, 0,232, 11, 7, 0, 82, 6, + 7, 0,241, 3, 7, 0,227, 3, 7, 0,233, 11, 7, 0, 95, 2, 7, 0,234, 11, 7, 0,235, 11, 7, 0,236, 11, 7, 0,237, 11, + 7, 0,238, 11, 7, 0,239, 11, 7, 0,129, 4, 7, 0,240, 11, 7, 0,241, 11, 7, 0,242, 11, 7, 0,130, 4, 7, 0,126, 4, + 7, 0,127, 4, 7, 0,243, 11, 7, 0,244, 11, 7, 0,245, 11, 4, 0,246, 11, 4, 0, 91, 0, 4, 0,247, 11, 4, 0,248, 11, + 2, 0,249, 11, 2, 0,250, 11, 2, 0,251, 11, 2, 0,252, 11, 2, 0,253, 11, 2, 0,254, 11, 2, 0,255, 11, 2, 0, 27, 0, +188, 0,159, 4,139, 0, 11, 0,216, 1, 0, 12, 7, 0, 1, 12, 7, 0, 2, 12, 7, 0,254, 1, 7, 0, 3, 12, 7, 0, 4, 12, + 7, 0, 5, 12, 4, 0, 91, 0, 2, 0, 6, 12, 2, 0, 7, 12, 64, 0,253, 1,217, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, + 7, 0, 7, 0, 7, 0, 8, 12,218, 1, 6, 0,218, 1, 0, 0,218, 1, 1, 0,217, 1,202, 9, 4, 0, 1, 1, 2, 0, 9, 12, + 2, 0, 18, 0,219, 1, 5, 0,219, 1, 0, 0,219, 1, 1, 0, 14, 0, 10, 12, 4, 0, 11, 12, 4, 0, 18, 0,220, 1, 9, 0, +220, 1, 0, 0,220, 1, 1, 0, 14, 0,126, 0,219, 1, 12, 12, 4, 0, 18, 0, 2, 0, 9, 12, 2, 0, 13, 12, 7, 0, 92, 0, + 0, 0, 14, 12,179, 0, 6, 0, 22, 0, 32, 0, 14, 0,130, 5, 4, 0, 18, 0, 2, 0, 15, 12, 2, 0, 16, 12, 11, 0, 17, 12, +221, 1, 6, 0, 14, 0, 18, 12, 4, 0, 19, 12, 4, 0, 20, 12, 4, 0, 18, 0, 4, 0, 27, 0,238, 0, 21, 12,222, 1, 19, 0, + 22, 0, 32, 0,223, 1, 22, 12,223, 1, 23, 12, 14, 0, 24, 12, 4, 0, 25, 12, 2, 0, 26, 12, 2, 0, 27, 12, 14, 0, 28, 12, + 14, 0, 29, 12,221, 1, 30, 12, 14, 0, 31, 12, 14, 0, 32, 12, 14, 0, 33, 12, 14, 0, 34, 12,224, 1, 35, 12,224, 1, 36, 12, +224, 1, 37, 12, 14, 0, 38, 12,238, 0, 39, 12,223, 1, 32, 0,223, 1, 0, 0,223, 1, 1, 0, 11, 0, 40, 12, 4, 0,128, 8, + 2, 0, 41, 12, 2, 0, 27, 0, 28, 1, 42, 12, 28, 1, 43, 12, 0, 0, 44, 12, 2, 0, 45, 12, 2, 0, 46, 12, 2, 0,150, 8, + 2, 0,151, 8, 2, 0, 47, 12, 2, 0, 48, 12, 2, 0, 20, 4, 2, 0, 60, 7, 2, 0, 49, 12, 2, 0, 50, 12, 2, 0, 51, 12, + 2, 0, 30, 0,225, 1, 52, 12,226, 1, 53, 12,227, 1, 54, 12, 4, 0, 55, 12, 4, 0, 56, 12, 11, 0, 57, 12, 14, 0, 29, 12, + 14, 0,170, 8, 14, 0, 58, 12, 14, 0, 59, 12, 14, 0, 60, 12,228, 1, 18, 0,228, 1, 0, 0,228, 1, 1, 0, 0, 0, 61, 12, + 21, 0, 31, 0, 0, 0, 62, 12, 2, 0, 63, 12, 2, 0, 16, 0, 2, 0, 14, 0, 2, 0, 64, 12, 2, 0, 65, 12, 2, 0, 66, 12, + 2, 0, 67, 12, 2, 0, 68, 12, 2, 0, 18, 0, 2, 0, 69, 12, 2, 0, 32, 0, 2, 0, 27, 0,229, 1, 70, 12,230, 1, 4, 0, +230, 1, 0, 0,230, 1, 1, 0,228, 1, 71, 12,228, 1, 72, 12,231, 1, 11, 0,231, 1, 0, 0,231, 1, 1, 0, 14, 0, 73, 12, + 14, 0, 74, 12, 0, 0, 61, 12, 2, 0, 75, 12, 2, 0, 76, 12, 2, 0, 18, 0, 2, 0, 77, 12, 4, 0, 78, 12, 11, 0, 79, 12, +224, 1, 7, 0,224, 1, 0, 0,224, 1, 1, 0, 0, 0, 61, 12, 0, 0, 80, 12, 14, 0, 68, 8, 4, 0, 81, 12, 4, 0, 18, 0, +250, 0, 14, 0,250, 0, 0, 0,250, 0, 1, 0, 0, 0, 61, 12, 21, 0, 31, 0,232, 1,144, 8, 11, 0, 82, 12, 11, 0, 83, 12, +229, 1, 70, 12,221, 1, 84, 12, 14, 0, 85, 12,250, 0, 86, 12, 33, 1,246, 6, 2, 0, 18, 0, 2, 0, 86, 1,233, 1, 12, 0, +233, 1, 0, 0,233, 1, 1, 0, 11, 0, 2, 0, 11, 0, 87, 12, 0, 0, 19, 0, 2, 0, 16, 0, 2, 0, 18, 0, 7, 0,148, 9, + 7, 0,128, 0, 7, 0,137, 4, 7, 0, 98, 9, 7, 0, 90, 10,234, 1, 5, 0, 7, 0, 88, 12, 4, 0, 89, 12, 4, 0, 90, 12, + 4, 0, 87, 1, 4, 0, 18, 0,235, 1, 6, 0, 7, 0, 91, 12, 7, 0, 92, 12, 7, 0, 93, 12, 7, 0, 94, 12, 4, 0, 16, 0, + 4, 0, 18, 0,236, 1, 5, 0, 7, 0,126, 9, 7, 0,127, 9, 7, 0,245, 2, 2, 0, 46, 2, 2, 0, 47, 2,237, 1, 5, 0, +236, 1, 2, 0, 4, 0, 52, 0, 7, 0, 95, 12, 7, 0,126, 9, 7, 0,127, 9,238, 1, 4, 0, 2, 0, 96, 12, 2, 0, 97, 12, + 2, 0, 98, 12, 2, 0, 99, 12,239, 1, 2, 0, 37, 0, 44, 7, 21, 0,166, 9,240, 1, 3, 0, 19, 0,100, 12, 4, 0, 18, 0, + 4, 0, 27, 0,241, 1, 6, 0, 7, 0,107, 0, 7, 0,214, 2, 7, 0,101, 12, 7, 0, 27, 0, 2, 0,250, 0, 2, 0,102, 12, +242, 1, 5, 0, 7, 0,103, 12, 7, 0,127, 0, 7, 0,203, 9, 7, 0,204, 9, 4, 0, 18, 0,243, 1, 6, 0, 22, 0, 49, 7, + 0, 0,104, 12, 0, 0,105, 12, 2, 0,106, 12, 2, 0, 18, 0, 4, 0,107, 12,244, 1, 7, 0,244, 1, 0, 0,244, 1, 1, 0, + 0, 0, 19, 0,243, 1,108, 12, 2, 0,109, 12, 2, 0, 16, 0, 7, 0, 59, 0,245, 1, 7, 0, 14, 0,110, 12, 0, 0,111, 12, + 11, 0,112, 12, 7, 0, 59, 0, 7, 0,148, 9, 4, 0, 16, 0, 4, 0, 18, 0,246, 1, 3, 0, 7, 0,113, 12, 4, 0, 18, 0, + 4, 0, 27, 0,247, 1, 15, 0,247, 1, 0, 0,247, 1, 1, 0,107, 1, 21, 10,245, 1, 60, 0, 14, 0,193, 3, 30, 0, 48, 0, +246, 1,114, 12, 4, 0, 52, 0, 7, 0, 59, 0, 2, 0, 18, 0, 2, 0, 22, 1, 4, 0,115, 12, 0, 0,104, 12, 4, 0,116, 12, + 7, 0,118, 10,248, 1, 2, 0, 0, 0,117, 12, 0, 0,118, 12,249, 1, 4, 0,249, 1, 0, 0,249, 1, 1, 0,177, 0, 75, 3, + 14, 0,119, 12,250, 1, 25, 0,250, 1, 0, 0,250, 1, 1, 0, 14, 0,120, 12,177, 0, 96, 9,249, 1,121, 12, 14, 0,122, 12, + 14, 0,193, 3, 0, 0, 19, 0, 7, 0,148, 9, 7, 0,123, 12, 7, 0, 89, 0, 7, 0, 90, 0, 7, 0, 86, 10, 7, 0, 87, 10, + 7, 0, 2, 3, 7, 0,153, 3, 7, 0, 98, 9, 7, 0, 90, 10, 2, 0,124, 12, 2, 0,125, 12, 2, 0, 66, 0, 2, 0, 16, 0, + 11, 0,126, 12, 4, 0, 18, 0, 4, 0, 30, 0,251, 1, 6, 0,251, 1, 0, 0,251, 1, 1, 0, 14, 0,120, 12, 4, 0, 18, 0, + 4, 0, 17, 2, 0, 0, 19, 0,252, 1, 11, 0,252, 1, 0, 0,252, 1, 1, 0, 22, 0, 49, 7, 0, 0,127, 12, 4, 0,107, 12, + 2, 0,128, 12, 2, 0, 27, 0, 0, 0,104, 12, 4, 0,115, 12, 2, 0, 18, 0, 2, 0,129, 12,253, 1, 10, 0,253, 1, 0, 0, +253, 1, 1, 0, 14, 0,130, 12, 0, 0, 61, 12, 0, 0, 19, 0, 0, 0,131, 12, 0, 0,132, 12, 2, 0, 18, 0, 2, 0,129, 12, + 4, 0,133, 12,254, 1, 5, 0,254, 1, 0, 0,254, 1, 1, 0, 0, 0,104, 12, 4, 0,115, 12, 7, 0,235, 2, 34, 0, 12, 0, +177, 0,184, 3,177, 0,134, 12,249, 1,121, 12, 14, 0,135, 12,250, 1,136, 12, 14, 0,137, 12, 14, 0,138, 12, 4, 0, 18, 0, + 4, 0,251, 0, 2, 0,139, 12, 2, 0,140, 12, 7, 0,141, 12,255, 1, 2, 0, 22, 0, 32, 0, 34, 0, 74, 0, 0, 2, 5, 0, + 0, 2, 0, 0, 0, 2, 1, 0, 4, 0, 16, 0, 4, 0, 18, 0, 0, 0,179, 5, 1, 2, 6, 0, 0, 2,142, 12, 27, 0, 43, 0, + 4, 0,143, 12, 7, 0,144, 12, 4, 0,145, 12, 4, 0, 7, 10, 2, 2, 3, 0, 0, 2,142, 12, 4, 0,143, 12, 7, 0,146, 12, + 3, 2, 8, 0, 0, 2,142, 12, 27, 0, 43, 0, 7, 0, 77, 1, 7, 0,147, 12, 7, 0, 41, 3, 7, 0,159, 9, 4, 0,143, 12, + 4, 0,148, 12, 4, 2, 5, 0, 0, 2,142, 12, 7, 0,149, 12, 7, 0,181, 2, 7, 0, 8, 3, 7, 0, 55, 0, 5, 2, 3, 0, + 0, 2,142, 12, 7, 0,159, 9, 7, 0,150, 12,204, 1, 4, 0, 7, 0,151, 12, 7, 0,159, 11, 2, 0,152, 12, 2, 0, 87, 1, + 6, 2, 14, 0, 6, 2, 0, 0, 6, 2, 1, 0, 14, 0,153, 12, 14, 0,154, 12, 14, 0,155, 12, 0, 0,179, 5, 4, 0, 32, 0, + 4, 0, 18, 0, 4, 0,156, 12, 7, 0,157, 12, 4, 0,145, 12, 4, 0, 7, 10, 7, 0, 89, 4, 7, 0, 10, 3,212, 1, 23, 0, + 4, 0,143, 12, 4, 0,158, 12, 7, 0,159, 12, 7, 0, 6, 3, 7, 0,160, 12, 7, 0,239, 8, 7, 0,151, 12, 7, 0,161, 12, + 7, 0,214, 2, 7, 0, 22, 11, 7, 0,222, 4, 7, 0,162, 12, 7, 0,163, 12, 7, 0,164, 12, 7, 0,165, 12, 7, 0,166, 12, + 7, 0,167, 12, 7, 0,168, 12, 7, 0,169, 12, 7, 0,170, 12, 7, 0,171, 12, 7, 0,172, 12, 14, 0,173, 12,124, 0, 40, 0, +123, 0,174, 12, 7, 2,105, 11, 64, 0,175, 12, 64, 0,192, 11, 64, 0,176, 12, 8, 2,177, 12, 43, 0,168, 0, 43, 0,178, 12, + 43, 0,179, 12, 7, 0,180, 12, 7, 0,181, 12, 7, 0,182, 12, 7, 0,183, 12, 7, 0,184, 12, 7, 0,127, 8, 7, 0,185, 12, + 7, 0,181, 1, 7, 0,186, 12, 4, 0,187, 12, 4, 0,188, 12, 4, 0,189, 12, 4, 0, 91, 0, 4, 0, 27, 0, 4, 0,190, 12, + 2, 0,191, 12, 2, 0,192, 12, 4, 0,193, 12, 7, 0,214, 2, 4, 0,194, 12, 7, 0,195, 12, 4, 0,196, 12, 4, 0,197, 12, + 4, 0,198, 12,140, 0,199, 12, 14, 0,200, 12,188, 0,159, 4, 4, 0,201, 12, 7, 0,202, 12, 7, 0,203, 12, 4, 0, 30, 0, +125, 0, 12, 0,123, 0,174, 12,151, 0, 61, 3, 7, 0,146, 1, 7, 0,127, 8, 7, 0,204, 12, 7, 0,205, 12, 7, 0,206, 12, + 2, 0,207, 12, 2, 0,208, 12, 2, 0,209, 12, 2, 0, 16, 0, 4, 0, 91, 0,126, 0, 15, 0,123, 0,174, 12,142, 0, 38, 3, + 7, 0,202, 9, 7, 0,210, 12, 7, 0,211, 12, 4, 0,212, 12, 7, 0, 79, 1, 7, 0,213, 12, 4, 0, 43, 10, 4, 0, 34, 3, + 4, 0,214, 12, 7, 0,183, 12, 2, 0, 16, 0, 2, 0, 27, 0, 4, 0, 30, 0, 9, 2, 15, 0, 22, 0, 32, 0, 34, 0, 74, 0, + 47, 1,237, 8, 7, 0,215, 12, 7, 0,216, 12, 7, 0,217, 12, 7, 0,218, 12, 7, 0,158, 9, 7, 0,219, 12, 7, 0,220, 12, + 7, 0,221, 12, 7, 0, 89, 4, 7, 0,239, 8, 2, 0, 18, 0, 2, 0,122, 9,232, 0, 3, 0, 4, 0,125, 0, 2, 0,222, 6, + 2, 0,222, 12, 10, 2, 5, 0, 0, 0,203, 8, 2, 0,204, 8, 2, 0, 79, 5, 2, 0,223, 12, 2, 0,224, 12,230, 0, 16, 0, + 22, 0, 32, 0, 34, 0, 74, 0, 0, 0, 35, 0, 4, 0,142, 0, 4, 0,143, 0, 4, 0,225, 12, 7, 0,161, 0, 7, 0,162, 0, + 44, 0,137, 0, 11, 2,160, 9,179, 0,187, 3, 12, 2,226, 12, 11, 0,227, 12, 10, 2,228, 12, 4, 0, 18, 0, 4, 0, 22, 0, + 14, 1, 10, 0, 4, 0,131, 0, 4, 0,229, 12, 52, 0,230, 12, 7, 0,231, 12, 2, 0,232, 12, 0, 0,186, 2, 4, 0,125, 0, + 13, 2,180, 3, 14, 2,233, 12, 7, 0,234, 12, 15, 2, 3, 0, 4, 0,125, 0, 7, 0,235, 12, 7, 0, 79, 1, 16, 2, 11, 0, + 11, 0,236, 12, 7, 0,237, 12, 7, 0,238, 12, 7, 0, 27, 0, 7, 0,239, 12, 2, 0,240, 12, 2, 0, 66, 0, 7, 0,241, 12, + 7, 0,242, 12, 7, 0,243, 12, 7, 0,244, 12, 14, 2, 3, 0, 7, 0,245, 12, 4, 0,125, 0, 4, 0, 18, 0, 13, 2, 24, 0, + 13, 2, 0, 0, 13, 2, 1, 0, 0, 0, 19, 0, 7, 0,246, 12, 7, 0,247, 12, 7, 0,248, 12, 7, 0,249, 12, 7, 0, 36, 11, + 4, 0,250, 12, 4, 0,251, 12, 14, 2,252, 12, 7, 0,253, 12, 7, 0,235, 12, 4, 0, 18, 0, 4, 0,254, 12, 4, 0,255, 12, + 7, 0,118, 10, 2, 0, 0, 13, 2, 0,232, 3, 2, 0, 1, 13, 2, 0, 2, 13, 2, 0, 3, 13, 2, 0, 30, 0, 7, 0, 4, 13, + 17, 2, 22, 0, 4, 0, 18, 0, 2, 0, 5, 13, 2, 0, 6, 13, 7, 0, 7, 13, 2, 0, 8, 13, 2, 0, 9, 13, 2, 0, 10, 13, + 2, 0, 11, 13, 2, 0, 12, 13, 2, 0, 13, 13, 2, 0, 14, 13, 2, 0, 8, 3, 4, 0, 15, 13, 4, 0, 16, 13, 2, 0, 17, 13, + 2, 0, 30, 0, 7, 0, 94, 1, 4, 0, 18, 13, 4, 0, 19, 13, 7, 0, 20, 13, 7, 0, 21, 13, 4, 0,250, 1, 18, 2, 12, 0, + 4, 0, 18, 0, 4, 0, 22, 13, 4, 0, 23, 13, 7, 0, 24, 13, 13, 2, 25, 13, 7, 0, 26, 13, 7, 0, 27, 13, 7, 0, 28, 13, + 4, 0,193, 1, 4, 0,131, 0, 7, 0,153, 3, 52, 0, 29, 13, 19, 2, 5, 0, 4, 0, 18, 0, 7, 0,235, 12, 4, 0, 30, 13, + 4, 0, 31, 13, 15, 2, 32, 13, 20, 2, 7, 0, 20, 2, 0, 0, 20, 2, 1, 0, 0, 0, 19, 0, 4, 0, 18, 0, 7, 0,153, 3, + 14, 0, 33, 13, 19, 2, 34, 13, 21, 2, 1, 0, 0, 0, 35, 13, 22, 2, 8, 0, 22, 2, 0, 0, 22, 2, 1, 0, 13, 2,180, 3, + 4, 0, 27, 0, 4, 0, 36, 13, 4, 0, 37, 13, 4, 0, 38, 13, 4, 0, 39, 13, 23, 2, 6, 0, 4, 0,131, 0, 4, 0, 27, 0, + 14, 0, 7, 10, 4, 0, 40, 13, 2, 0, 41, 13, 2, 0, 42, 13, 12, 2, 11, 0, 17, 2, 43, 13, 16, 2, 44, 13, 14, 0, 33, 13, + 19, 2, 34, 13, 18, 2, 45, 13, 13, 2, 46, 13, 14, 0, 47, 13, 4, 0, 48, 13, 4, 0, 49, 13, 21, 2, 97, 6, 23, 2, 50, 13, + 24, 2, 48, 0, 24, 2, 0, 0, 24, 2, 1, 0,170, 0,150, 3, 25, 2, 2, 0, 64, 0, 51, 13,188, 0,159, 4,140, 0,158, 4, + 14, 0, 26, 3, 4, 0, 52, 13, 0, 0, 19, 0, 2, 0,193, 10, 2, 0, 16, 0, 2, 0, 53, 13, 2, 0, 54, 13, 2, 0, 55, 13, + 2, 0, 56, 13, 2, 0, 57, 13, 2, 0, 58, 13, 4, 0, 91, 0, 4, 0,191, 3, 4, 0, 59, 13, 4, 0, 60, 13, 4, 0,203, 9, + 4, 0,204, 9, 4, 0, 27, 0, 7, 0, 61, 13, 47, 0, 62, 13, 0, 0, 63, 13, 4, 0, 64, 13, 4, 0,193, 12, 7, 0, 65, 13, + 7, 0, 66, 13, 7, 0, 67, 13, 7, 0, 68, 13, 7, 0, 69, 13, 7, 0, 70, 13, 7, 0, 71, 13, 7, 0, 72, 13, 7, 0, 73, 13, + 7, 0, 74, 13, 7, 0, 75, 13, 7, 0, 76, 13, 7, 0, 77, 13, 7, 0, 78, 13, 0, 0,207, 2, 0, 0, 79, 13, 0, 0, 80, 13, + 0, 0, 81, 13,170, 0, 7, 0,169, 0, 82, 13,144, 0, 40, 3, 14, 0, 83, 13, 2, 0, 84, 13, 2, 0, 91, 0, 4, 0, 27, 0, + 0, 0, 85, 13,171, 0, 24, 0,169, 0, 82, 13,144, 0, 40, 3,151, 0, 61, 3, 63, 0, 29, 2, 4, 0, 91, 0, 4, 0, 86, 13, + 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,181, 1, 7, 0, 87, 13, 7, 0, 88, 13, 7, 0, 89, 13, 7, 0, 90, 13, + 50, 0, 91, 13, 50, 0, 92, 13, 2, 0, 93, 13, 2, 0,253, 10, 2, 0, 94, 13, 2, 0, 27, 0, 7, 0, 95, 13, 7, 0, 96, 13, + 7, 0, 97, 13, 7, 0, 98, 13, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index 192236b7cb8..66e65d114cb 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -49,6 +49,7 @@ void ED_init_node_butfuncs(void); 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); +void ED_node_sort(struct bNodeTree *ntree); /* node_edit.c */ void ED_node_shader_default(struct Scene *scene, struct ID *id); @@ -57,7 +58,7 @@ 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_update_hierarchy(struct bContext *C, struct bNodeTree *ntree); +void ED_node_post_apply_transform(struct bContext *C, struct bNodeTree *ntree); void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node); /* node ops.c */ diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 9d66c9ea2e1..ae42d6d7f58 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -837,7 +837,7 @@ void ui_theme_init_default(void) /* space node, re-uses syntax color storage */ btheme->tnode = btheme->tv3d; - rgba_char_args_set(btheme->tnode.edge_select, 255, 255, 255, 255); + rgba_char_args_set(btheme->tnode.edge_select, 255, 255, 255, 255); /* wire selected */ rgba_char_args_set(btheme->tnode.syntaxl, 155, 155, 155, 160); /* TH_NODE, backdrop */ rgba_char_args_set(btheme->tnode.syntaxn, 100, 100, 100, 255); /* in/output */ rgba_char_args_set(btheme->tnode.syntaxb, 108, 105, 111, 255); /* operator */ diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 3a2498d3fa2..f973d3cc070 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -944,7 +944,7 @@ bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc) } /* screen sets cursor based on swinid */ -static void region_cursor_set(wmWindow *win, int swinid) +static void region_cursor_set(wmWindow *win, int swinid, int swin_changed) { ScrArea *sa = win->screen->areabase.first; @@ -952,10 +952,12 @@ static void region_cursor_set(wmWindow *win, int swinid) ARegion *ar = sa->regionbase.first; for (; ar; ar = ar->next) { if (ar->swinid == swinid) { - if (ar->type && ar->type->cursor) - ar->type->cursor(win, sa, ar); - else - WM_cursor_set(win, CURSOR_STD); + if (swin_changed || (ar->type && ar->type->event_cursor)) { + if (ar->type && ar->type->cursor) + ar->type->cursor(win, sa, ar); + else + WM_cursor_set(win, CURSOR_STD); + } return; } } @@ -983,7 +985,7 @@ void ED_screen_do_listen(bContext *C, wmNotifier *note) break; case NC_SCENE: if (note->data == ND_MODE) - region_cursor_set(win, note->swinid); + region_cursor_set(win, note->swinid, TRUE); break; } } @@ -1239,9 +1241,7 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event) else WM_cursor_set(win, CURSOR_X_MOVE); } - else - WM_cursor_set(win, CURSOR_STD); - } + } } @@ -1294,9 +1294,13 @@ void ED_screen_set_subwinactive(bContext *C, wmEvent *event) if (scr->subwinactive == scr->mainwin) { screen_cursor_set(win, event); } - else if (oldswin != scr->subwinactive) { - region_cursor_set(win, scr->subwinactive); - WM_event_add_notifier(C, NC_SCREEN | ND_SUBWINACTIVE, scr); + else { + if (oldswin != scr->subwinactive) { + region_cursor_set(win, scr->subwinactive, TRUE); + WM_event_add_notifier(C, NC_SCREEN | ND_SUBWINACTIVE, scr); + } + else + region_cursor_set(win, scr->subwinactive, FALSE); } } } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 528a48b60df..8b7e0dd0db1 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -53,6 +53,8 @@ #include "BKE_main.h" #include "BKE_node.h" +#include "BLF_api.h" + #include "NOD_composite.h" #include "NOD_shader.h" @@ -79,6 +81,9 @@ #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) @@ -474,15 +479,21 @@ static int node_resize_area_default(bNode *node, int x, int y) rctf totr= node->totr; /* right part of node */ totr.xmin = node->totr.xmax-20.0f; - return BLI_in_rctf(&totr, x, y); + if (BLI_in_rctf(&totr, x, y)) + return NODE_RESIZE_RIGHT; + else + return 0; } else { - /* rect we're interested in is just the bottom right corner */ + const float size = 10.0f; 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); + int dir = 0; + + if (x >= totr.xmax-size && x < totr.xmax && y >= totr.ymin && y < totr.ymax) + dir |= NODE_RESIZE_RIGHT; + if (x >= totr.xmin && x < totr.xmin+size && y >= totr.ymin && y < totr.ymax) + dir |= NODE_RESIZE_LEFT; + return dir; } } @@ -511,7 +522,7 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode) int dy; /* get "global" coords */ - nodeSpaceCoords(gnode, &locx, &locy); + nodeToView(gnode, 0.0f, 0.0f, &locx, &locy); /* center them, is a bit of abuse of locx and locy though */ node_update_nodetree(C, ngroup, locx, locy); @@ -906,20 +917,166 @@ static void node_common_buts_whileloop(uiLayout *layout, bContext *UNUSED(C), Po uiItemR(layout, ptr, "max_iterations", 0, NULL, 0); } -static void node_update_frame(const bContext *UNUSED(C), bNodeTree *UNUSED(ntree), bNode *node) +/* XXX Does a bounding box update by iterating over all children. + * Not ideal to do this in every draw call, but doing as transform callback doesn't work, + * since the child node totr rects are not updated properly at that point. + */ +static void node_update_frame(const bContext *UNUSED(C), bNodeTree *ntree, bNode *node) { - float locx, locy; + const float margin = 30.0f; + NodeFrame *data = (NodeFrame *)node->storage; + int bbinit; + bNode *tnode; + rctf rect, noderect; + float xmax, ymax; + + /* init rect from current frame size */ + nodeToView(node, node->offsetx, node->offsety, &rect.xmin, &rect.ymax); + nodeToView(node, node->offsetx+node->width, node->offsety-node->height, &rect.xmax, &rect.ymin); + + /* frame can be resized manually only if shrinking is disabled or no children are attached */ + data->flag |= NODE_FRAME_RESIZEABLE; + /* for shrinking bbox, initialize the rect from first child node */ + bbinit = (data->flag & NODE_FRAME_SHRINK); + /* fit bounding box to all children */ + for (tnode=ntree->nodes.first; tnode; tnode=tnode->next) { + if (tnode->parent!=node) + continue; + + /* add margin to node rect */ + noderect = tnode->totr; + noderect.xmin -= margin; + noderect.xmax += margin; + noderect.ymin -= margin; + noderect.ymax += margin; + + /* first child initializes frame */ + if (bbinit) { + bbinit = 0; + rect = noderect; + data->flag &= ~NODE_FRAME_RESIZEABLE; + } + else + BLI_union_rctf(&rect, &noderect); + } + + /* now adjust the frame size from view-space bounding box */ + nodeFromView(node, rect.xmin, rect.ymax, &node->offsetx, &node->offsety); + nodeFromView(node, rect.xmax, rect.ymin, &xmax, &ymax); + node->width = xmax - node->offsetx; + node->height = -ymax + node->offsety; + + node->totr = rect; +} - /* get "global" coords */ - nodeSpaceCoords(node, &locx, &locy); +static void node_draw_frame_label(bNode *node) +{ + /* XXX font id is crap design */ + const int fontid = blf_mono_font; + NodeFrame *data = (NodeFrame *)node->storage; + rctf *rct= &node->totr; + int color_id= node_get_colorid(node); + char label[128]; + /* XXX a bit hacky, should use separate align values for x and y */ + float width, ascender; + float x, y; + + BLI_strncpy(label, nodeLabel(node), sizeof(label)); + BLF_size(fontid, data->label_size, U.dpi); + + /* title color */ + UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.8f, 10); - node->prvr.xmin = locx + NODE_DYS; - node->prvr.xmax = locx + node->width- NODE_DYS; + width = BLF_width(fontid, label); + ascender = BLF_ascender(fontid); + + x = 0.5f*(rct->xmin + rct->xmax) - 0.5f*width; + y = rct->ymax - NODE_DYS - ascender; + + BLF_position(fontid, x, y, 0); + BLF_draw(fontid, label, BLF_DRAW_STR_DUMMY_MAX); +} - node->totr.xmin = locx; - node->totr.xmax = locx + node->width; - node->totr.ymax = locy; - node->totr.ymin = locy - node->height; +static void node_draw_frame(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *UNUSED(ntree), bNode *node) +{ + rctf *rct= &node->totr; + int color_id= node_get_colorid(node); + + /* skip if out of view */ + if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax || + node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax) { + + uiEndBlock(C, node->block); + node->block= NULL; + return; + } + + /* shadow */ + node_draw_shadow(snode, node, BASIS_RAD); + + /* body */ + if (node->flag & NODE_CUSTOM_COLOR) + glColor3fv(node->color); + else + UI_ThemeColor4(TH_NODE); + glEnable(GL_BLEND); + uiSetRoundBox(UI_CNR_ALL); + uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD); + glDisable(GL_BLEND); + + /* outline active and selected emphasis */ + if ( node->flag & (NODE_ACTIVE|SELECT) ) { + glEnable(GL_BLEND); + glEnable( GL_LINE_SMOOTH ); + + if (node->flag & NODE_ACTIVE) + UI_ThemeColorShadeAlpha(TH_ACTIVE, 0, -40); + else + UI_ThemeColorShadeAlpha(TH_SELECT, 0, -40); + uiSetRoundBox(UI_CNR_ALL); + uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD); + + glDisable( GL_LINE_SMOOTH ); + glDisable(GL_BLEND); + } + + /* label */ + node_draw_frame_label(node); + + UI_ThemeClearColor(color_id); + + uiEndBlock(C, node->block); + uiDrawBlock(C, node->block); + node->block= NULL; +} + +static int node_resize_area_frame(bNode *node, int x, int y) +{ + const float size = 10.0f; + NodeFrame *data = (NodeFrame *)node->storage; + rctf totr= node->totr; + int dir = 0; + + /* shrinking frame size is determined by child nodes */ + if (!(data->flag & NODE_FRAME_RESIZEABLE)) + return 0; + + if (x >= totr.xmax-size && x < totr.xmax && y >= totr.ymin && y < totr.ymax) + dir |= NODE_RESIZE_RIGHT; + if (x >= totr.xmin && x < totr.xmin+size && y >= totr.ymin && y < totr.ymax) + dir |= NODE_RESIZE_LEFT; + if (x >= totr.xmin && x < totr.xmax && y >= totr.ymax-size && y < totr.ymax) + dir |= NODE_RESIZE_TOP; + if (x >= totr.xmin && x < totr.xmax && y >= totr.ymin && y < totr.ymin+size) + dir |= NODE_RESIZE_BOTTOM; + + return dir; +} + +static void node_buts_frame_details(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "label_size", 0, "Label Size", ICON_NONE); + uiItemR(layout, ptr, "shrink", 0, "Shrink", ICON_NONE); } static void node_common_set_butfunc(bNodeType *ntype) @@ -941,7 +1098,10 @@ static void node_common_set_butfunc(bNodeType *ntype) ntype->drawupdatefunc= node_update_group; break; case NODE_FRAME: + ntype->drawfunc= node_draw_frame; ntype->drawupdatefunc= node_update_frame; + ntype->uifuncbut= node_buts_frame_details; + ntype->resize_area_func= node_resize_area_frame; break; } } @@ -1136,7 +1296,6 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA * /* only once called */ static void node_shader_set_butfunc(bNodeType *ntype) { - ntype->uifuncbut = NULL; switch (ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -1215,7 +1374,6 @@ static void node_shader_set_butfunc(bNodeType *ntype) ntype->uifunc= node_shader_buts_dynamic; break; } - if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } /* ****************** BUTTON CALLBACKS FOR COMPOSITE NODES ***************** */ @@ -2233,7 +2391,6 @@ static void node_composit_buts_viewer_but(uiLayout *layout, bContext *UNUSED(C), /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) { - ntype->uifuncbut = NULL; switch (ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -2424,8 +2581,6 @@ static void node_composit_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } - if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; - } /* ****************** BUTTON CALLBACKS FOR TEXTURE NODES ***************** */ @@ -2536,7 +2691,6 @@ static void node_texture_buts_output(uiLayout *layout, bContext *UNUSED(C), Poin /* only once called */ static void node_texture_set_butfunc(bNodeType *ntype) { - ntype->uifuncbut = NULL; if ( ntype->type >= TEX_NODE_PROC && ntype->type < TEX_NODE_PROC_MAX ) { ntype->uifunc = node_texture_buts_proc; } @@ -2580,10 +2734,6 @@ static void node_texture_set_butfunc(bNodeType *ntype) break; } } - - if (ntype->uifuncbut == NULL) { - ntype->uifuncbut = ntype->uifunc; - } } /* ******* init draw callbacks for all tree types, only called in usiblender.c, once ************* */ diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index c92abf116c4..16810e0fdec 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -89,8 +89,8 @@ static void active_node_panel(const bContext *C, Panel *pa) SpaceNode *snode= CTX_wm_space_node(C); bNodeTree *ntree= (snode) ? snode->edittree : NULL; bNode *node = (ntree) ? nodeGetActive(ntree) : NULL; // xxx... for editing group nodes - uiLayout *layout; - PointerRNA ptr; + uiLayout *layout, *row, *col; + PointerRNA ptr, opptr; /* verify pointers, and create RNA pointer for the node */ if (ELEM(NULL, ntree, node)) @@ -113,6 +113,20 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle"); uiItemS(layout); + row = uiLayoutRow(layout, 0); + uiItemM(row, (bContext *)C, "NODE_MT_node_color_presets", NULL, 0); + uiItemM(row, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_DOWNARROW_HLT); + uiItemO(row, "", ICON_ZOOMIN, "node.node_color_preset_add"); + opptr = uiItemFullO(row, "node.node_color_preset_add", "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_boolean_set(&opptr, "remove_active", 1); + + row = uiLayoutRow(layout, 0); + uiItemR(row, &ptr, "use_custom_color", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE); + col = uiLayoutColumn(row, 0); + if (!(node->flag & NODE_CUSTOM_COLOR)) + uiLayoutSetEnabled(col, 0); + uiItemR(col, &ptr, "color", 0, "", 0); + /* draw this node's settings */ if (node->typeinfo && node->typeinfo->uifuncbut) node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index d93b1b1fcc8..7011d605a7e 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -167,6 +167,110 @@ void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node) ntreeTexCheckCyclics(ntree); } +static int compare_nodes(bNode *a, bNode *b) +{ + 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; + + /* 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; + + 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 ED_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 void do_node_internal_buttons(bContext *C, void *node_v, int event) { if (event==B_NODE_EXEC) { @@ -176,24 +280,6 @@ static void do_node_internal_buttons(bContext *C, void *node_v, int event) } } - -static void node_scaling_widget(int color_id, float aspect, float xmin, float ymin, float xmax, float ymax) -{ - float dx; - float dy; - - dx= 0.5f*(xmax-xmin); - dy= 0.5f*(ymax-ymin); - - UI_ThemeColorShade(color_id, +30); - fdrawline(xmin, ymin, xmax, ymax); - fdrawline(xmin+dx, ymin, xmax, ymax-dy); - - UI_ThemeColorShade(color_id, -10); - fdrawline(xmin, ymin+aspect, xmax, ymax+aspect); - fdrawline(xmin+dx, ymin+aspect, xmax, ymax-dy+aspect); -} - static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) { bNode *node; @@ -223,7 +309,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) int buty; /* get "global" coords */ - nodeSpaceCoords(node, &locx, &locy); + nodeToView(node, 0.0f, 0.0f, &locx, &locy); dy= locy; /* header */ @@ -350,7 +436,7 @@ static void node_update_hidden(bNode *node) int totin=0, totout=0, tot; /* get "global" coords */ - nodeSpaceCoords(node, &locx, &locy); + nodeToView(node, 0.0f, 0.0f, &locx, &locy); /* calculate minimal radius */ for (nsock= node->inputs.first; nsock; nsock= nsock->next) @@ -410,7 +496,7 @@ void node_update_default(const bContext *C, bNodeTree *ntree, bNode *node) node_update_basis(C, ntree, node); } -static int node_get_colorid(bNode *node) +int node_get_colorid(bNode *node) { if (node->typeinfo->nclass==NODE_CLASS_INPUT) return TH_NODE_IN_OUT; @@ -573,6 +659,24 @@ static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_ WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL); } +void node_draw_shadow(SpaceNode *snode, bNode *node, float radius) +{ + rctf *rct = &node->totr; + + uiSetRoundBox(UI_CNR_ALL); + if (node->parent==NULL) + ui_dropshadow(rct, radius, snode->aspect, node->flag & SELECT); + else { + const float margin = 3.0f; + + glColor4f(0.0f, 0.0f, 0.0f, 0.33f); + glEnable(GL_BLEND); + uiRoundBox(rct->xmin-margin, rct->ymin-margin, + rct->xmax+margin, rct->ymax+margin, radius+margin); + glDisable(GL_BLEND); + } +} + static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node) { bNodeSocket *sock; @@ -597,8 +701,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN return; } - uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_LEFT); - ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT); + /* shadow */ + node_draw_shadow(snode, node, BASIS_RAD); /* header */ if (color_id==TH_NODE) @@ -644,7 +748,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN /* title */ if (node->flag & SELECT) - UI_ThemeColor(TH_TEXT_HI); + UI_ThemeColor(TH_SELECT); else UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10); @@ -680,27 +784,27 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN (int)(iconofs - rct->xmin-18.0f), NODE_DY, NULL, 0, 0, 0, 0, ""); /* body */ - UI_ThemeColor4(TH_NODE); + if (node->flag & NODE_CUSTOM_COLOR) + glColor3fv(node->color); + else + UI_ThemeColor4(TH_NODE); glEnable(GL_BLEND); - uiSetRoundBox(UI_CNR_BOTTOM_LEFT); + uiSetRoundBox(UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT); uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax-NODE_DY, BASIS_RAD); glDisable(GL_BLEND); - /* scaling indicator */ - node_scaling_widget(TH_NODE, snode->aspect, rct->xmax-BASIS_RAD*snode->aspect, rct->ymin, rct->xmax, rct->ymin+BASIS_RAD*snode->aspect); - /* outline active and selected emphasis */ if ( node->flag & (NODE_ACTIVE|SELECT) ) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); - /* using different shades of TH_TEXT_HI for the empasis, like triangle */ - if ( node->flag & NODE_ACTIVE ) - UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40); - else - UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120); - 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); - + + if (node->flag & NODE_ACTIVE) + UI_ThemeColorShadeAlpha(TH_ACTIVE, 0, -40); + else + UI_ThemeColorShadeAlpha(TH_SELECT, 0, -40); + uiSetRoundBox(UI_CNR_ALL); + uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD); + glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); } @@ -758,8 +862,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b char showname[128]; /* 128 is used below */ /* shadow */ - uiSetRoundBox(UI_CNR_ALL); - ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT); + node_draw_shadow(snode, node, hiddenrad); /* body */ UI_ThemeColor(color_id); @@ -771,19 +874,20 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b if ( node->flag & (NODE_ACTIVE|SELECT) ) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); - /* using different shades of TH_TEXT_HI for the empasis, like triangle */ - if ( node->flag & NODE_ACTIVE ) - UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40); - else - UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120); - uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad); + + if (node->flag & NODE_ACTIVE) + UI_ThemeColorShadeAlpha(TH_ACTIVE, 0, -40); + else + UI_ThemeColorShadeAlpha(TH_SELECT, 0, -40); + uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad); + glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); } /* title */ if (node->flag & SELECT) - UI_ThemeColor(TH_TEXT_HI); + UI_ThemeColor(TH_SELECT); else UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10); @@ -807,7 +911,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b node_draw_mute_line(&ar->v2d, snode, node); if (node->flag & SELECT) - UI_ThemeColor(TH_TEXT_HI); + UI_ThemeColor(TH_SELECT); else UI_ThemeColor(TH_TEXT); @@ -848,6 +952,45 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b node->block= NULL; } +int node_get_resize_cursor(int directions) +{ + if (directions==0) + return CURSOR_STD; + else if ((directions & ~(NODE_RESIZE_TOP|NODE_RESIZE_BOTTOM))==0) + return CURSOR_Y_MOVE; + else if ((directions & ~(NODE_RESIZE_RIGHT|NODE_RESIZE_LEFT))==0) + return CURSOR_X_MOVE; + else + return CURSOR_EDIT; +} + +void node_set_cursor(wmWindow *win, SpaceNode *snode) +{ + bNodeTree *ntree = snode->edittree; + bNode *node; + bNodeSocket *sock; + int cursor = CURSOR_STD; + + if (ntree) { + if (node_find_indicated_socket(snode, &node, &sock, SOCK_IN|SOCK_OUT)) { + /* pass */ + } + else { + /* check nodes front to back */ + for (node=ntree->nodes.last; node; node=node->prev) { + if (BLI_in_rctf(&node->totr, snode->mx, snode->my)) + break; /* first hit on node stops */ + } + if (node) { + int dir = node->typeinfo->resize_area_func(node, snode->mx, snode->my); + cursor = node_get_resize_cursor(dir); + } + } + } + + WM_cursor_set(win, cursor); +} + void node_draw_default(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node) { if (node->flag & NODE_HIDDEN) @@ -866,7 +1009,8 @@ void node_update_nodetree(const bContext *C, bNodeTree *ntree, float offsetx, fl { bNode *node; - for (node= ntree->nodes.first; node; node= node->next) { + /* update nodes front to back, so children sizes get updated before parents */ + for (node= ntree->nodes.last; node; node= node->prev) { /* XXX little hack */ node->locx += offsetx; node->locy += offsety; @@ -892,6 +1036,14 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT if (ntree==NULL) return; /* groups... */ + /* draw background nodes, last nodes in front */ + for (a=0, node= ntree->nodes.first; node; node=node->next, a++) { + if (!(node->flag & NODE_BACKGROUND)) + continue; + node->nr= a; /* index of node in list, used for exec event code */ + node_draw(C, ar, snode, ntree, node); + } + /* node lines */ glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); @@ -900,8 +1052,10 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); - /* draw nodes, last nodes in front */ + /* draw foreground nodes, last nodes in front */ for (a=0, node= ntree->nodes.first; node; node=node->next, a++) { + if (node->flag & NODE_BACKGROUND) + continue; node->nr= a; /* index of node in list, used for exec event code */ node_draw(C, ar, snode, ntree, node); } diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 8847dc3650a..5000e0f2163 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -711,55 +711,13 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node) } } -static int inside_rctf(rctf *bounds, rctf *rect) +void ED_node_post_apply_transform(bContext *UNUSED(C), bNodeTree *UNUSED(ntree)) { - 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); - } + /* node_update_nodetree(C, ntree, 0.0f, 0.0f); */ } /* ***************** generic operator functions for nodes ***************** */ @@ -1517,36 +1475,130 @@ void NODE_OT_backimage_sample(wmOperatorType *ot) typedef struct NodeSizeWidget { float mxstart, mystart; + float oldlocx, oldlocy; + float oldoffsetx, oldoffsety; float oldwidth, oldheight; float oldminiwidth; + int directions; } NodeSizeWidget; +static void node_resize_init(bContext *C, wmOperator *op, wmEvent *UNUSED(event), bNode *node, int dir) +{ + SpaceNode *snode = CTX_wm_space_node(C); + + NodeSizeWidget *nsw= MEM_callocN(sizeof(NodeSizeWidget), "size widget op data"); + + op->customdata= nsw; + nsw->mxstart= snode->mx; + nsw->mystart= snode->my; + + /* store old */ + nsw->oldlocx= node->locx; + nsw->oldlocy= node->locy; + nsw->oldoffsetx= node->offsetx; + nsw->oldoffsety= node->offsety; + nsw->oldwidth= node->width; + nsw->oldheight= node->height; + nsw->oldminiwidth= node->miniwidth; + nsw->directions = dir; + + WM_cursor_modal(CTX_wm_window(C), node_get_resize_cursor(dir)); + /* add modal handler */ + WM_event_add_modal_handler(C, op); +} + +static void node_resize_exit(bContext *C, wmOperator *op, int UNUSED(cancel)) +{ + WM_cursor_restore(CTX_wm_window(C)); + + MEM_freeN(op->customdata); + op->customdata= NULL; +} + static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) { SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); bNode *node= editnode_get_active(snode->edittree); NodeSizeWidget *nsw= op->customdata; - float mx, my; + float mx, my, dx, dy; switch (event->type) { case MOUSEMOVE: - UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], - &mx, &my); + UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &mx, &my); + dx = mx - nsw->mxstart; + dy = my - nsw->mystart; if (node) { if (node->flag & NODE_HIDDEN) { - node->miniwidth= nsw->oldminiwidth + mx - nsw->mxstart; - CLAMP(node->miniwidth, 0.0f, 100.0f); + float widthmin = 0.0f; + float widthmax = 100.0f; + if (nsw->directions & NODE_RESIZE_RIGHT) { + node->miniwidth= nsw->oldminiwidth + dx; + CLAMP(node->miniwidth, widthmin, widthmax); + } + if (nsw->directions & NODE_RESIZE_LEFT) { + float locmax = nsw->oldlocx + nsw->oldminiwidth; + + node->locx= nsw->oldlocx + dx; + CLAMP(node->locx, locmax - widthmax, locmax - widthmin); + node->miniwidth= locmax - node->locx; + } } else { - node->width= nsw->oldwidth + mx - nsw->mxstart; - CLAMP(node->width, UI_DPI_FAC*node->typeinfo->minwidth, UI_DPI_FAC*node->typeinfo->maxwidth); + float widthmin = UI_DPI_FAC*node->typeinfo->minwidth; + float widthmax = UI_DPI_FAC*node->typeinfo->maxwidth; + if (nsw->directions & NODE_RESIZE_RIGHT) { + node->width= nsw->oldwidth + dx; + CLAMP(node->width, widthmin, widthmax); + } + if (nsw->directions & NODE_RESIZE_LEFT) { + float locmax = nsw->oldlocx + nsw->oldwidth; + + node->locx= nsw->oldlocx + dx; + CLAMP(node->locx, locmax - widthmax, locmax - widthmin); + node->width= locmax - node->locx; + } } + /* height works the other way round ... */ - node->height= nsw->oldheight - my + nsw->mystart; - CLAMP(node->height, node->typeinfo->minheight, node->typeinfo->maxheight); + { + float heightmin = UI_DPI_FAC*node->typeinfo->minheight; + float heightmax = UI_DPI_FAC*node->typeinfo->maxheight; + if (nsw->directions & NODE_RESIZE_TOP) { + float locmin = nsw->oldlocy - nsw->oldheight; + + node->locy= nsw->oldlocy + dy; + CLAMP(node->locy, locmin + heightmin, locmin + heightmax); + node->height= node->locy - locmin; + } + if (nsw->directions & NODE_RESIZE_BOTTOM) { + node->height= nsw->oldheight - dy; + CLAMP(node->height, heightmin, heightmax); + } + } + + /* XXX make callback? */ + if (node->type == NODE_FRAME) { + /* keep the offset symmetric around center point */ + if (nsw->directions & NODE_RESIZE_LEFT) { + node->locx = nsw->oldlocx + 0.5f*dx; + node->offsetx = nsw->oldoffsetx + 0.5f*dx; + } + if (nsw->directions & NODE_RESIZE_RIGHT) { + node->locx = nsw->oldlocx + 0.5f*dx; + node->offsetx = nsw->oldoffsetx - 0.5f*dx; + } + if (nsw->directions & NODE_RESIZE_TOP) { + node->locy = nsw->oldlocy + 0.5f*dy; + node->offsety = nsw->oldoffsety + 0.5f*dy; + } + if (nsw->directions & NODE_RESIZE_BOTTOM) { + node->locy = nsw->oldlocy + 0.5f*dy; + node->offsety = nsw->oldoffsety - 0.5f*dy; + } + } } ED_region_tag_redraw(ar); @@ -1557,10 +1609,8 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) case MIDDLEMOUSE: case RIGHTMOUSE: - MEM_freeN(nsw); - op->customdata= NULL; - - ED_node_update_hierarchy(C, snode->edittree); + node_resize_exit(C, op, 0); + ED_node_post_apply_transform(C, snode->edittree); return OPERATOR_FINISHED; } @@ -1573,37 +1623,24 @@ static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event) SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); bNode *node= editnode_get_active(snode->edittree); + int dir; if (node) { /* convert mouse coordinates to v2d space */ UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], - &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 */ - nsw->oldwidth= node->width; - nsw->oldheight= node->height; - nsw->oldminiwidth= node->miniwidth; - - /* add modal handler */ - WM_event_add_modal_handler(C, op); - + &snode->mx, &snode->my); + dir = node->typeinfo->resize_area_func(node, snode->mx, snode->my); + if (dir != 0) { + node_resize_init(C, op, event, node, dir); return OPERATOR_RUNNING_MODAL; } } return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH; } -static int node_resize_cancel(bContext *UNUSED(C), wmOperator *op) +static int node_resize_cancel(bContext *C, wmOperator *op) { - MEM_freeN(op->customdata); - op->customdata= NULL; + node_resize_exit(C, op, 1); return OPERATOR_CANCELLED; } @@ -2180,6 +2217,27 @@ bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, bNodeTemplate /* ****************** Duplicate *********************** */ +static void node_duplicate_reparent_recursive(bNode *node) +{ + bNode *parent; + + node->flag |= NODE_TEST; + + /* find first selected parent */ + for (parent=node->parent; parent; parent=parent->parent) { + if (parent->flag & SELECT) { + if (!(parent->flag & NODE_TEST)) + node_duplicate_reparent_recursive(parent); + break; + } + } + /* reparent node copy to parent copy */ + if (parent) { + nodeDetachNode(node->new_node); + nodeAttachNode(node->new_node, parent->new_node); + } +} + static int node_duplicate_exec(bContext *C, wmOperator *op) { SpaceNode *snode= CTX_wm_space_node(C); @@ -2242,6 +2300,19 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) break; } + /* clear flags for recursive depth-first iteration */ + for (node= ntree->nodes.first; node; node= node->next) + node->flag &= ~NODE_TEST; + /* reparent copied nodes */ + for (node= ntree->nodes.first; node; node= node->next) { + if ((node->flag & SELECT) && !(node->flag & NODE_TEST)) + node_duplicate_reparent_recursive(node); + + /* only has to check old nodes */ + if (node==lastnode) + break; + } + /* deselect old nodes, select the copies instead */ for (node= ntree->nodes.first; node; node= node->next) { if (node->flag & SELECT) { @@ -3782,3 +3853,354 @@ void NODE_OT_output_file_move_active_socket(wmOperatorType *ot) RNA_def_enum(ot->srna, "direction", direction_items, 2, "Direction", ""); } + +/* ****************** Copy Node Color ******************* */ + +static int node_copy_color_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNode *node, *tnode; + + if (!ntree) + return OPERATOR_CANCELLED; + node = nodeGetActive(ntree); + if (!node) + return OPERATOR_CANCELLED; + + for (tnode=ntree->nodes.first; tnode; tnode=tnode->next) { + if (tnode->flag & NODE_SELECT && tnode != node) { + if (node->flag & NODE_CUSTOM_COLOR) { + tnode->flag |= NODE_CUSTOM_COLOR; + copy_v3_v3(tnode->color, node->color); + } + else + tnode->flag &= ~NODE_CUSTOM_COLOR; + } + } + + ED_node_sort(ntree); + WM_event_add_notifier(C, NC_NODE|ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; +} + +void NODE_OT_node_copy_color(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Copy Color"; + ot->description = "Copy color to all selected nodes"; + ot->idname = "NODE_OT_node_copy_color"; + + /* api callbacks */ + ot->exec = node_copy_color_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ****************** Set Parent ******************* */ + +static int node_parent_set_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNode *frame = nodeGetActive(ntree), *node; + if (!frame || frame->type != NODE_FRAME) + return OPERATOR_CANCELLED; + + for (node=ntree->nodes.first; node; node=node->next) { + if (node == frame) + continue; + if (node->flag & NODE_SELECT) { + nodeDetachNode(node); + nodeAttachNode(node, frame); + } + } + + ED_node_sort(ntree); + WM_event_add_notifier(C, NC_NODE|ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; +} + +void NODE_OT_parent_set(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Make Parent"; + ot->description = "Attach selected nodes"; + ot->idname = "NODE_OT_parent_set"; + + /* api callbacks */ + ot->exec = node_parent_set_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ****************** Clear Parent ******************* */ + +static int node_parent_clear_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNode *node; + + for (node=ntree->nodes.first; node; node=node->next) { + if (node->flag & NODE_SELECT) { + nodeDetachNode(node); + } + } + + WM_event_add_notifier(C, NC_NODE|ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; +} + +void NODE_OT_parent_clear(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Clear Parent"; + ot->description = "Detach selected nodes"; + ot->idname = "NODE_OT_parent_clear"; + + /* api callbacks */ + ot->exec = node_parent_clear_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ****************** Join Nodes ******************* */ + +/* tags for depth-first search */ +#define NODE_JOIN_DONE 1 +#define NODE_JOIN_IS_DESCENDANT 2 + +static void node_join_attach_recursive(bNode *node, bNode *frame) +{ + node->done |= NODE_JOIN_DONE; + + if (node == frame) { + node->done |= NODE_JOIN_IS_DESCENDANT; + } + else if (node->parent) { + /* call recursively */ + if (!(node->parent->done & NODE_JOIN_DONE)) + node_join_attach_recursive(node->parent, frame); + + /* in any case: if the parent is a descendant, so is the child */ + if (node->parent->done & NODE_JOIN_IS_DESCENDANT) + node->done |= NODE_JOIN_IS_DESCENDANT; + else if (node->flag & NODE_TEST) { + /* if parent is not an decendant of the frame, reattach the node */ + nodeDetachNode(node); + nodeAttachNode(node, frame); + node->done |= NODE_JOIN_IS_DESCENDANT; + } + } + else if (node->flag & NODE_TEST) { + nodeAttachNode(node, frame); + node->done |= NODE_JOIN_IS_DESCENDANT; + } +} + +static int node_join_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + Main *bmain = CTX_data_main(C); + Scene *scene = CTX_data_scene(C); + bNodeTree *ntree = snode->edittree; + bNode *node, *frame; + bNodeTemplate ntemp; + + /* XXX save selection: node_add_node call below sets the new frame as single active+selected node */ + for (node=ntree->nodes.first; node; node=node->next) { + if (node->flag & NODE_SELECT) + node->flag |= NODE_TEST; + else + node->flag &= ~NODE_TEST; + } + + ntemp.main = bmain; + ntemp.scene = scene; + ntemp.type = NODE_FRAME; + frame = node_add_node(snode, bmain, scene, &ntemp, 0.0f, 0.0f); + + /* reset tags */ + for (node=ntree->nodes.first; node; node=node->next) + node->done = 0; + + for (node=ntree->nodes.first; node; node=node->next) { + if (!(node->done & NODE_JOIN_DONE)) + node_join_attach_recursive(node, frame); + } + + /* restore selection */ + for (node=ntree->nodes.first; node; node=node->next) { + if (node->flag & NODE_TEST) + node->flag |= NODE_SELECT; + } + + ED_node_sort(ntree); + WM_event_add_notifier(C, NC_NODE|ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; +} + +void NODE_OT_join(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Join Nodes"; + ot->description = "Attaches selected nodes to a new common frame"; + ot->idname = "NODE_OT_join"; + + /* api callbacks */ + ot->exec = node_join_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ****************** Attach ******************* */ + +static int node_attach_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNode *frame; + + /* check nodes front to back */ + for (frame=ntree->nodes.last; frame; frame=frame->prev) { + /* skip selected, those are the nodes we want to attach */ + if ((frame->type != NODE_FRAME) || (frame->flag & NODE_SELECT)) + continue; + if (BLI_in_rctf(&frame->totr, snode->mx, snode->my)) + break; + } + if (frame) { + bNode *node, *parent; + for (node=ntree->nodes.last; node; node=node->prev) { + if (node->flag & NODE_SELECT) { + if (node->parent == NULL) { + /* attach all unparented nodes */ + nodeAttachNode(node, frame); + } + else { + /* attach nodes which share parent with the frame */ + for (parent=frame->parent; parent; parent=parent->parent) + if (parent == node->parent) + break; + if (parent) { + nodeDetachNode(node); + nodeAttachNode(node, frame); + } + } + } + } + } + + ED_node_sort(ntree); + WM_event_add_notifier(C, NC_NODE|ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; +} + +static int node_attach_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + SpaceNode *snode= CTX_wm_space_node(C); + + /* convert mouse coordinates to v2d space */ + UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &snode->mx, &snode->my); + + return node_attach_exec(C, op); +} + +void NODE_OT_attach(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Attach Nodes"; + ot->description = "Attaches active node to a frame"; + ot->idname = "NODE_OT_attach"; + + /* api callbacks */ + ot->exec = node_attach_exec; + ot->invoke = node_attach_invoke; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ****************** Detach ******************* */ + +/* tags for depth-first search */ +#define NODE_DETACH_DONE 1 +#define NODE_DETACH_IS_DESCENDANT 2 + +static void node_detach_recursive(bNode *node) +{ + node->done |= NODE_DETACH_DONE; + + if (node->parent) { + /* call recursively */ + if (!(node->parent->done & NODE_DETACH_DONE)) + node_detach_recursive(node->parent); + + /* in any case: if the parent is a descendant, so is the child */ + if (node->parent->done & NODE_DETACH_IS_DESCENDANT) + node->done |= NODE_DETACH_IS_DESCENDANT; + else if (node->flag & NODE_SELECT) { + /* if parent is not a decendant of a selected node, detach */ + nodeDetachNode(node); + node->done |= NODE_DETACH_IS_DESCENDANT; + } + } + else if (node->flag & NODE_SELECT) { + node->done |= NODE_DETACH_IS_DESCENDANT; + } +} + +/* detach the root nodes in the current selection */ +static int node_detach_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + bNodeTree *ntree = snode->edittree; + bNode *node; + + /* reset tags */ + for (node=ntree->nodes.first; node; node=node->next) + node->done = 0; + /* detach nodes recursively + * relative order is preserved here! + */ + for (node=ntree->nodes.first; node; node=node->next) { + if (!(node->done & NODE_DETACH_DONE)) + node_detach_recursive(node); + } + + ED_node_sort(ntree); + WM_event_add_notifier(C, NC_NODE|ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; +} + +void NODE_OT_detach(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Detach Nodes"; + ot->description = "Detaches selected nodes from parents"; + ot->idname = "NODE_OT_detach"; + + /* api callbacks */ + ot->exec = node_detach_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 802c471c7aa..60177192e2a 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -40,7 +40,9 @@ struct ARegion; struct ARegionType; struct View2D; struct bContext; +struct wmWindow; struct wmWindowManager; +struct wmEvent; struct bNodeTemplate; struct bNode; struct bNodeSocket; @@ -67,13 +69,18 @@ ARegion *node_has_buttons_region(ScrArea *sa); void node_menus_register(void); /* node_draw.c */ +int node_get_colorid(struct bNode *node); void node_socket_circle_draw(struct bNodeTree *ntree, struct bNodeSocket *sock, float size); +int node_get_resize_cursor(int directions); +void node_draw_shadow(struct SpaceNode *snode, struct bNode *node, float radius); 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); +void node_set_cursor(struct wmWindow *win, struct SpaceNode *snode); + /* node_buttons.c */ void node_buttons_register(struct ARegionType *art); void NODE_OT_properties(struct wmOperatorType *ot); @@ -151,6 +158,7 @@ void NODE_OT_hide_toggle(struct wmOperatorType *ot); void NODE_OT_hide_socket_toggle(struct wmOperatorType *ot); void NODE_OT_preview_toggle(struct wmOperatorType *ot); void NODE_OT_options_toggle(struct wmOperatorType *ot); +void NODE_OT_node_copy_color(struct wmOperatorType *ot); void NODE_OT_show_cyclic_dependencies(struct wmOperatorType *ot); void NODE_OT_link_viewer(struct wmOperatorType *ot); @@ -170,6 +178,12 @@ void NODE_OT_output_file_add_socket(struct wmOperatorType *ot); void NODE_OT_output_file_remove_active_socket(struct wmOperatorType *ot); void NODE_OT_output_file_move_active_socket(struct wmOperatorType *ot); +void NODE_OT_parent_set(struct wmOperatorType *ot); +void NODE_OT_parent_clear(struct wmOperatorType *ot); +void NODE_OT_join(struct wmOperatorType *ot); +void NODE_OT_attach(struct wmOperatorType *ot); +void NODE_OT_detach(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 5d586f08eb0..781a14fca59 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -68,6 +68,7 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_options_toggle); WM_operatortype_append(NODE_OT_hide_socket_toggle); WM_operatortype_append(NODE_OT_show_cyclic_dependencies); + WM_operatortype_append(NODE_OT_node_copy_color); WM_operatortype_append(NODE_OT_duplicate); WM_operatortype_append(NODE_OT_delete); @@ -104,6 +105,12 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_output_file_add_socket); WM_operatortype_append(NODE_OT_output_file_remove_active_socket); WM_operatortype_append(NODE_OT_output_file_move_active_socket); + + WM_operatortype_append(NODE_OT_parent_set); + WM_operatortype_append(NODE_OT_parent_clear); + WM_operatortype_append(NODE_OT_join); + WM_operatortype_append(NODE_OT_attach); + WM_operatortype_append(NODE_OT_detach); } void ED_operatormacros_node(void) @@ -111,10 +118,32 @@ void ED_operatormacros_node(void) wmOperatorType *ot; wmOperatorTypeMacro *mot; - ot = WM_operatortype_append_macro("NODE_OT_duplicate_move", "Duplicate", "Duplicate selected nodes and move them", + ot = WM_operatortype_append_macro("NODE_OT_select_link_viewer", "Link Viewer", + "Select node and link it to a viewer node", + OPTYPE_UNDO); + WM_operatortype_macro_define(ot, "NODE_OT_select"); + WM_operatortype_macro_define(ot, "NODE_OT_link_viewer"); + + ot = WM_operatortype_append_macro("NODE_OT_translate_attach", "Move and Attach", + "Move nodes and attach to frame", + OPTYPE_UNDO|OPTYPE_REGISTER); + mot = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); + RNA_boolean_set(mot->ptr, "release_confirm", TRUE); + WM_operatortype_macro_define(ot, "NODE_OT_attach"); + + ot = WM_operatortype_append_macro("NODE_OT_detach_translate_attach", "Detach and Move", + "Detach nodes, move and attach to frame", + OPTYPE_UNDO|OPTYPE_REGISTER); + WM_operatortype_macro_define(ot, "NODE_OT_detach"); + mot = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); + RNA_boolean_set(mot->ptr, "release_confirm", TRUE); + WM_operatortype_macro_define(ot, "NODE_OT_attach"); + + ot = WM_operatortype_append_macro("NODE_OT_duplicate_move", "Duplicate", + "Duplicate selected nodes and move them", OPTYPE_UNDO|OPTYPE_REGISTER); WM_operatortype_macro_define(ot, "NODE_OT_duplicate"); - WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); + WM_operatortype_macro_define(ot, "NODE_OT_translate_attach"); /* modified operator call for duplicating with input links */ ot = WM_operatortype_append_macro("NODE_OT_duplicate_move_keep_inputs", "Duplicate", @@ -122,12 +151,7 @@ void ED_operatormacros_node(void) OPTYPE_UNDO|OPTYPE_REGISTER); mot = WM_operatortype_macro_define(ot, "NODE_OT_duplicate"); RNA_boolean_set(mot->ptr, "keep_inputs", TRUE); - WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); - - ot = WM_operatortype_append_macro("NODE_OT_select_link_viewer", "Link Viewer", - "Select node and link it to a viewer node", OPTYPE_UNDO); - WM_operatortype_macro_define(ot, "NODE_OT_select"); - WM_operatortype_macro_define(ot, "NODE_OT_link_viewer"); + WM_operatortype_macro_define(ot, "NODE_OT_translate_attach"); ot = WM_operatortype_append_macro("NODE_OT_move_detach_links", "Detach", "Move a node to detach links", OPTYPE_UNDO|OPTYPE_REGISTER); @@ -137,8 +161,30 @@ void ED_operatormacros_node(void) ot = WM_operatortype_append_macro("NODE_OT_move_detach_links_release", "Detach", "Move a node to detach links", OPTYPE_UNDO|OPTYPE_REGISTER); WM_operatortype_macro_define(ot, "NODE_OT_links_detach"); - mot = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); - RNA_boolean_set(mot->ptr, "release_confirm", TRUE); + mot = WM_operatortype_macro_define(ot, "NODE_OT_translate_attach"); +} + +/* helper function for repetitive select operator keymap */ +static void node_select_keymap(wmKeyMap *keymap, int extend) +{ + /* modifier combinations */ + const int mod_single[] = { 0, KM_CTRL, KM_ALT, KM_CTRL|KM_ALT, + -1 /* terminator */ + }; + const int mod_extend[] = { KM_SHIFT, KM_SHIFT|KM_CTRL, + KM_SHIFT|KM_ALT, KM_SHIFT|KM_CTRL|KM_ALT, + -1 /* terminator */ + }; + const int *mod = (extend ? mod_extend : mod_single); + wmKeyMapItem *kmi; + int i; + + for (i=0; mod[i] >= 0; ++i) { + kmi = WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, mod[i], 0); + RNA_boolean_set(kmi->ptr, "extend", extend); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, mod[i], 0); + RNA_boolean_set(kmi->ptr, "extend", extend); + } } void node_keymap(struct wmKeyConfig *keyconf) @@ -157,15 +203,12 @@ void node_keymap(struct wmKeyConfig *keyconf) /* mouse select in nodes used to be both keys, but perhaps this should be reduced? * NOTE: mouse-clicks on left-mouse will fall through to allow transform-tweak, but also link/resize * NOTE 2: socket select is part of the node select operator, to handle overlapping cases + * NOTE 3: select op is registered for various combinations of modifier key, so the specialized + * grab operators (unlink, attach, etc.) can work easily on single nodes. */ - kmi = WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(kmi->ptr, "extend", FALSE); - kmi = WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(kmi->ptr, "extend", FALSE); - kmi = WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0); - RNA_boolean_set(kmi->ptr, "extend", TRUE); - kmi = WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); - RNA_boolean_set(kmi->ptr, "extend", TRUE); + node_select_keymap(keymap, FALSE); + node_select_keymap(keymap, TRUE); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_border", EVT_TWEAK_S, KM_ANY, 0, 0); RNA_boolean_set(kmi->ptr, "tweak", TRUE); @@ -195,6 +238,10 @@ void node_keymap(struct wmKeyConfig *keyconf) /* modified operator call for duplicating with input links */ WM_keymap_add_item(keymap, "NODE_OT_duplicate_move_keep_inputs", DKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + WM_keymap_add_item(keymap, "NODE_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "NODE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "NODE_OT_join", JKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "NODE_OT_hide_toggle", HKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_mute_toggle", MKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_preview_toggle", HKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index a540f18b3a5..9098c8a4255 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -70,109 +70,6 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my) return NULL; } -static int compare_nodes(bNode *a, bNode *b) -{ - 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; - - /* 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; - - return 0; -} - -/* Sorts nodes by selection: unselected nodes first, then selected, - * then the active node at the very end. Relative order is kept intact! - */ -static 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; - } -} - void node_select(bNode *node) { node->flag |= SELECT; @@ -407,7 +304,7 @@ void node_select_single(bContext *C, bNode *node) ED_node_set_active(bmain, snode->edittree, node); - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); } @@ -479,7 +376,7 @@ static int node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const i /* update node order */ if (selected) - node_sort(snode->edittree); + ED_node_sort(snode->edittree); return selected; } @@ -573,7 +470,7 @@ static int node_borderselect_exec(bContext *C, wmOperator *op) } } - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); @@ -645,7 +542,7 @@ static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op)) node_select(node); } - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; @@ -687,7 +584,7 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op)) node_select(node); } - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; @@ -729,7 +626,7 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op)) node_select(node); } - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; @@ -758,7 +655,7 @@ static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op)) node_select_same_type(snode); - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; @@ -787,7 +684,7 @@ static int node_select_same_type_next_exec(bContext *C, wmOperator *UNUSED(op)) node_select_same_type_np(snode, 0); - node_sort(snode->edittree); + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); @@ -815,7 +712,7 @@ static int node_select_same_type_prev_exec(bContext *C, wmOperator *UNUSED(op)) node_select_same_type_np(snode, 1); - node_sort(snode->edittree); + ED_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/space_node.c b/source/blender/editors/space_node/space_node.c index 3540c20e515..4d5964c72e5 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -339,6 +339,17 @@ static void node_buttons_area_draw(const bContext *C, ARegion *ar) ED_region_panels(C, ar, 1, NULL, -1); } +static void node_cursor(wmWindow *win, ScrArea *sa, ARegion *ar) +{ + SpaceNode *snode= sa->spacedata.first; + + /* convert mouse coordinates to v2d space */ + UI_view2d_region_to_view(&ar->v2d, win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin, + &snode->mx, &snode->my); + + node_set_cursor(win, snode); +} + /* Initialize main area, setting handlers. */ static void node_main_area_init(wmWindowManager *wm, ARegion *ar) { @@ -522,6 +533,8 @@ void ED_spacetype_node(void) art->init= node_main_area_init; art->draw= node_main_area_draw; art->listener= node_region_listener; + art->cursor = node_cursor; + art->event_cursor = TRUE; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_GPENCIL; BLI_addhead(&st->regiontypes, art); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 1c974a963bd..330be0a1628 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -2180,7 +2180,6 @@ void flushTransNodes(TransInfo *t) if (t->total==1) { ED_node_link_intersect_test(t->sa, 1); } - } /* *** SEQUENCE EDITOR *** */ @@ -4859,10 +4858,11 @@ 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 (canceled == 0) + if (canceled == 0) { + ED_node_post_apply_transform(C, snode->edittree); + ED_node_link_insert(t->sa); + } /* clear link line */ ED_node_link_intersect_test(t->sa, 0); diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 164112f206b..b75e42c4df5 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -944,11 +944,9 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac RNA_enum_set(kmi->ptr, "mode", TFM_TIME_SCALE); break; case SPACE_NODE: - WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0); - - kmi = WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_A, KM_ANY, 0, 0); - RNA_boolean_set(kmi->ptr, "release_confirm", TRUE); - kmi = WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_translate_attach", GKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_translate_attach", EVT_TWEAK_A, KM_ANY, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_translate_attach", EVT_TWEAK_S, KM_ANY, 0, 0); WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0); @@ -956,10 +954,12 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac /* detach and translate */ WM_keymap_add_item(keymap, "NODE_OT_move_detach_links", DKEY, KM_PRESS, KM_ALT, 0); - /* XXX release_confirm is set in the macro operator definition */ WM_keymap_add_item(keymap, "NODE_OT_move_detach_links_release", EVT_TWEAK_A, KM_ANY, KM_ALT, 0); WM_keymap_add_item(keymap, "NODE_OT_move_detach_links", EVT_TWEAK_S, KM_ANY, KM_ALT, 0); + + /* dettach and translate */ + WM_keymap_add_item(keymap, "NODE_OT_detach_translate_attach", FKEY, KM_PRESS, KM_ALT, 0); break; case SPACE_SEQ: WM_keymap_add_item(keymap, OP_SEQ_SLIDE, GKEY, KM_PRESS, 0, 0); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 6d3e57b6034..b2781675cbe 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -154,11 +154,13 @@ typedef struct bNode { struct bNode *next, *prev, *new_node; char name[64]; /* MAX_NAME */ - short type, flag; + int flag; + short type, pad2; short done, level; /* both for dependency and sorting */ short lasty, menunr; /* lasty: check preview render status, menunr: browse ID blocks */ short stack_index; /* for groupnode, offset in global caller stack */ short nr; /* number of this node in list, used for UI exec events */ + float color[3]; /* custom user-defined color */ ListBase inputs, outputs; struct bNode *parent; /* parent node */ @@ -168,6 +170,7 @@ typedef struct bNode { float locx, locy; /* root offset for drawing */ float width, height; /* node custom width and height */ float miniwidth; /* node width if hidden */ + float offsetx, offsety; /* additional offset from loc */ int update; /* update flags */ @@ -209,6 +212,8 @@ typedef struct bNode { #define NODE_TRANSFORM (1<<13) /* node is active texture */ #define NODE_ACTIVE_TEXTURE (1<<14) + /* use a custom color for the node */ +#define NODE_CUSTOM_COLOR (1<<15) /* node->update */ /* XXX NODE_UPDATE is a generic update flag. More fine-grained updates @@ -348,6 +353,11 @@ typedef struct bNodeSocketValueRGBA { #define CMP_NODE_DILATEERODE_STEP 0 #define CMP_NODE_DILATEERODE_DISTANCE 1 +typedef struct NodeFrame { + short flag; + short label_size; +} NodeFrame; + /* this one has been replaced with ImageUser, keep it for do_versions() */ typedef struct NodeImageAnim { int frames, sfra, nr; @@ -607,6 +617,10 @@ typedef struct TexNodeOutput { char name[64]; } TexNodeOutput; +/* frame node flags */ +#define NODE_FRAME_SHRINK 1 /* keep the bounding box minimal */ +#define NODE_FRAME_RESIZEABLE 2 /* test flag, if frame can be resized by user */ + /* comp channel matte */ #define CMP_NODE_CHANNEL_MATTE_CS_RGB 1 #define CMP_NODE_CHANNEL_MATTE_CS_HSV 2 diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 3406a940967..8b7e7f7a5d9 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -205,6 +205,8 @@ static StructRNA *rna_Node_refine(struct PointerRNA *ptr) return &RNA_NodeForLoop; case NODE_WHILELOOP: return &RNA_NodeWhileLoop; + case NODE_FRAME: + return &RNA_NodeFrame; default: return &RNA_Node; @@ -1123,8 +1125,20 @@ static void def_whileloop(StructRNA *srna) static void def_frame(StructRNA *srna) { -/* PropertyRNA *prop; */ + PropertyRNA *prop; + RNA_def_struct_sdna_from(srna, "NodeFrame", "storage"); + + prop = RNA_def_property(srna, "shrink", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_FRAME_SHRINK); + RNA_def_property_ui_text(prop, "Shrink", "Shrink the frame to minimal bounding box"); + RNA_def_property_update(prop, NC_NODE|ND_DISPLAY, NULL); + + prop = RNA_def_property(srna, "label_size", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "label_size"); + RNA_def_property_range(prop, 8, 64); + RNA_def_property_ui_text(prop, "Label Font Size", "Font size to use for displaying the label"); + RNA_def_property_update(prop, NC_NODE|ND_DISPLAY, NULL); } static void def_math(StructRNA *srna) @@ -3787,6 +3801,18 @@ static void rna_def_node(BlenderRNA *brna) 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"); + + prop = RNA_def_property(srna, "use_custom_color", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_CUSTOM_COLOR); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Custom Color", "Use custom color for the node"); + RNA_def_property_update(prop, NC_NODE|ND_DISPLAY, NULL); + + prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Color", "Custom color of the node body"); + RNA_def_property_update(prop, NC_NODE|ND_DISPLAY, NULL); prop = RNA_def_property(srna, "show_texture", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_ACTIVE_TEXTURE); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index e88eee5d64c..b2dbc6b4632 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1526,6 +1526,18 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna) rna_def_userdef_theme_spaces_main(srna); rna_def_userdef_theme_spaces_list_main(srna); + prop = RNA_def_property(srna, "node_selected", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "select"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Node Selected", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop = RNA_def_property(srna, "node_active", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "active"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Active Node", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + prop = RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "wire"); RNA_def_property_array(prop, 3); diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 300954a3c19..21aad779f89 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -57,6 +57,7 @@ #include "MEM_guardedalloc.h" #include "node_common.h" +#include "node_util.h" #include "node_exec.h" #include "NOD_socket.h" @@ -810,12 +811,24 @@ bNodeTemplate node_whileloop_template(bNode *node) /**** FRAME ****/ +static void node_frame_init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + NodeFrame *data = (NodeFrame *)MEM_callocN(sizeof(NodeFrame), "frame node storage"); + node->storage = data; + + data->flag |= NODE_FRAME_SHRINK; + + data->label_size = 20; +} + void register_node_type_frame(bNodeTreeType *ttype) { /* frame type is used for all tree types, needs dynamic allocation */ bNodeType *ntype= MEM_callocN(sizeof(bNodeType), "frame node type"); - node_type_base(ttype, ntype, NODE_FRAME, "Frame", NODE_CLASS_LAYOUT, NODE_BACKGROUND); + node_type_base(ttype, ntype, NODE_FRAME, "Frame", NODE_CLASS_LAYOUT, NODE_BACKGROUND|NODE_OPTIONS); + node_type_init(ntype, node_frame_init); + node_type_storage(ntype, "NodeFrame", node_free_standard_storage, node_copy_standard_storage); node_type_size(ntype, 150, 100, 0); node_type_compatibility(ntype, NODE_OLD_SHADING|NODE_NEW_SHADING); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index ad147d6d19d..3533b8a19f6 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2025,7 +2025,7 @@ void wm_event_do_handlers(bContext *C) /* Note: setting subwin active should be done here, after modal handlers have been done */ if (event->type == MOUSEMOVE) { /* state variables in screen, cursors. Also used in wm_draw.c, fails for modal handlers though */ - ED_screen_set_subwinactive(C, event); + ED_screen_set_subwinactive(C, event); /* for regions having custom cursors */ wm_paintcursor_test(C, event); } From 396a3d31cc500af0ae2185c8c116bab44b3baeec Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:18:43 +0000 Subject: [PATCH 105/159] Add MVertSkin DNA/RNA and customdata (CD_MVERT_SKIN). The MVertSkin currently just stores local skin radii and skin flags (MVertSkinFlag). Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier Reviewed by Campbell Barton. --- source/blender/blenkernel/intern/customdata.c | 46 ++++++- .../blender/makesdna/DNA_customdata_types.h | 10 +- source/blender/makesdna/DNA_meshdata_types.h | 21 +++ source/blender/makesrna/RNA_access.h | 2 + source/blender/makesrna/intern/rna_mesh.c | 122 ++++++++++++++++++ 5 files changed, 189 insertions(+), 12 deletions(-) diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 56724b6ada9..3fd8c34ad21 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -992,6 +992,38 @@ static void layerInterp_shapekey(void **sources, float *weights, } } +static void layerDefault_mvert_skin(void *data, int count) +{ + MVertSkin *vs = data; + int i; + + for(i = 0; i < count; i++) { + copy_v3_fl(vs[i].radius, 0.25f); + vs[i].flag = 0; + } +} + +static void layerInterp_mvert_skin(void **sources, float *weights, + float *UNUSED(sub_weights), + int count, void *dest) +{ + float radius[3], w; + MVertSkin *vs; + int i; + + zero_v3(radius); + for(i = 0; i < count; i++) { + w = weights ? weights[i] : 1.0f; + vs = sources[i]; + + madd_v3_v3fl(radius, vs->radius, w); + } + + vs = dest; + copy_v3_v3(vs->radius, radius); + vs->flag &= ~MVERT_SKIN_ROOT; +} + static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { /* 0: CD_MVERT */ {sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL}, @@ -1093,7 +1125,10 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { {sizeof(float), "", 0, NULL, NULL, NULL, NULL, NULL, NULL}, /* 35: CD_GRID_PAINT_MASK */ {sizeof(GridPaintMask), "GridPaintMask", 1, NULL, layerCopy_grid_paint_mask, - layerFree_grid_paint_mask, NULL, NULL, NULL} + layerFree_grid_paint_mask, NULL, NULL, NULL}, + /* 36: CD_SKIN_NODE */ + {sizeof(MVertSkin), "MVertSkin", 1, "Skin", NULL, NULL, + layerInterp_mvert_skin, NULL, layerDefault_mvert_skin} }; /* note, numbers are from trunk and need updating for bmesh */ @@ -1108,10 +1143,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = { /* BMESH ONLY */ /* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight", /* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask", - /* 35 */ "CDGridPaintMask" - -/* END BMESH ONLY */ - + /* 35-36 */ "CDGridPaintMask", "CDMVertSkin" }; @@ -1123,7 +1155,7 @@ const CustomDataMask CD_MASK_MESH = CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP | CD_MASK_MTEXPOLY | CD_MASK_NORMAL | CD_MASK_RECAST | CD_MASK_PAINT_MASK | - CD_MASK_GRID_PAINT_MASK; + CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN; const CustomDataMask CD_MASK_EDITMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX | @@ -1142,7 +1174,7 @@ const CustomDataMask CD_MASK_BMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK | - CD_MASK_GRID_PAINT_MASK; + CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN; const CustomDataMask CD_MASK_FACECORNERS = CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL; diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index 5792953fe49..377af042922 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -63,12 +63,11 @@ typedef struct CustomDataExternal { * layers, each with a data type (e.g. MTFace, MDeformVert, etc.). */ typedef struct CustomData { CustomDataLayer *layers; /* CustomDataLayers, ordered by type */ - int typemap[36]; /* runtime only! - maps types to indices of first layer of that type, + int typemap[37]; /* runtime only! - maps types to indices of first layer of that type, * MUST be >= CD_NUMTYPES, but we cant use a define here. * Correct size is ensured in CustomData_update_typemap assert() */ - int totlayer, maxlayer; /* number of layers, size of layers array */ - int totsize, pad2; /* in editmode, total size of all data layers */ + int totsize; /* in editmode, total size of all data layers */ void *pool; /* Bmesh: Memory pool for allocation of blocks */ CustomDataExternal *external; /* external file storing customdata layers */ } CustomData; @@ -114,8 +113,8 @@ typedef struct CustomData { #define CD_PAINT_MASK 34 #define CD_GRID_PAINT_MASK 35 - -#define CD_NUMTYPES 36 +#define CD_MVERT_SKIN 36 +#define CD_NUMTYPES 37 /* Bits for CustomDataMask */ #define CD_MASK_MVERT (1 << CD_MVERT) @@ -156,6 +155,7 @@ typedef struct CustomData { #define CD_MASK_PAINT_MASK (1LL << CD_PAINT_MASK) #define CD_MASK_GRID_PAINT_MASK (1LL << CD_GRID_PAINT_MASK) +#define CD_MASK_MVERT_SKIN (1LL << CD_MVERT_SKIN) /* CustomData.flag */ diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index c3b0bc39388..0bd83e73271 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -257,6 +257,27 @@ typedef struct GridPaintMask { int pad; } GridPaintMask; +typedef enum MVertSkinFlag { + /* Marks a vertex as the edge-graph root, used for calculating + rotations for all connected edges (recursively.) Also used to + choose a root when generating an armature. */ + MVERT_SKIN_ROOT = 1, + + /* Marks a branch vertex (vertex with more than two connected + edges) so that it's neighbors are directly hulled together, + rather than the default of generating intermediate frames. */ + MVERT_SKIN_LOOSE = 2 +} MVertSkinFlag; + +typedef struct MVertSkin { + /* Radii of the skin, define how big the generated frames + are. Currently only the first two elements are used. */ + float radius[3]; + + /* MVertSkinFlag */ + int flag; +} MVertSkin; + /* mvert->flag (1=SELECT) */ #define ME_SPHERETEST 2 #define ME_VERT_TMP_TAG 4 diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 826ebb72979..1f3529d2f65 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -318,6 +318,8 @@ extern StructRNA RNA_MeshFloatProperty; extern StructRNA RNA_MeshFloatPropertyLayer; extern StructRNA RNA_MeshIntProperty; extern StructRNA RNA_MeshIntPropertyLayer; +extern StructRNA RNA_MeshSkinVertexLayer; +extern StructRNA RNA_MeshSkinVertex; extern StructRNA RNA_MeshSticky; extern StructRNA RNA_MeshStringProperty; extern StructRNA RNA_MeshStringPropertyLayer; diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 466cf0ed412..7eb0bdf75df 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -76,6 +76,11 @@ static Mesh *rna_mesh(PointerRNA *ptr) return me; } +static CustomData *rna_mesh_vdata_helper(Mesh *me) +{ + return (me->edit_btmesh) ? &me->edit_btmesh->bm->vdata : &me->vdata; +} + static CustomData *rna_mesh_pdata_helper(Mesh *me) { return (me->edit_btmesh) ? &me->edit_btmesh->bm->pdata : &me->pdata; @@ -91,6 +96,11 @@ static CustomData *rna_mesh_fdata_helper(Mesh *me) return (me->edit_btmesh) ? NULL : &me->fdata; } +static CustomData *rna_mesh_vdata(PointerRNA *ptr) +{ + Mesh *me = rna_mesh(ptr); + return rna_mesh_vdata_helper(me); +} static CustomData *rna_mesh_pdata(PointerRNA *ptr) { Mesh *me = rna_mesh(ptr); @@ -856,6 +866,42 @@ static int rna_Mesh_polygon_string_layers_length(PointerRNA *ptr) return CustomData_number_of_layers(rna_mesh_pdata(ptr), CD_PROP_STR); } +/* Skin vertices */ +DEFINE_CUSTOMDATA_LAYER_COLLECTION(skin_vertice, vdata, CD_MVERT_SKIN); + +static char *rna_MeshSkinVertexLayer_path(PointerRNA *ptr) +{ + return BLI_sprintfN("skin_vertices[\"%s\"]", ((CustomDataLayer *)ptr->data)->name); +} + +static char *rna_VertCustomData_data_path(PointerRNA *ptr, char *collection, int type); +static char *rna_MeshSkinVertex_path(PointerRNA *ptr) +{ + return rna_VertCustomData_data_path(ptr, "skin_vertices", CD_MVERT_SKIN); +} + +static void rna_MeshSkinVertexLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + Mesh *me = rna_mesh(ptr); + CustomDataLayer *layer = (CustomDataLayer *)ptr->data; + rna_iterator_array_begin(iter, layer->data, sizeof(MVertSkin), me->totvert, 0, NULL); +} + +static int rna_MeshSkinVertexLayer_data_length(PointerRNA *ptr) +{ + Mesh *me = rna_mesh(ptr); + return me->totvert; +} + +static void rna_MeshSkinVertexLayer_name_set(PointerRNA *ptr, const char *value) +{ + CustomDataLayer *cdl = (CustomDataLayer *)ptr->data; + BLI_strncpy_utf8(cdl->name, value, sizeof(cdl->name)); + CustomData_set_layer_unique_name(rna_mesh_vdata(ptr), cdl - rna_mesh_vdata(ptr)->layers); +} + +/* End skin vertices */ + static void rna_TexturePoly_image_set(PointerRNA *ptr, PointerRNA value) { MTexPoly *tf = (MTexPoly *)ptr->data; @@ -1056,6 +1102,24 @@ static char *rna_MeshTexturePolyLayer_path(PointerRNA *ptr) return BLI_sprintfN("uv_textures[\"%s\"]", ((CustomDataLayer *)ptr->data)->name); } +static char *rna_VertCustomData_data_path(PointerRNA *ptr, char *collection, int type) +{ + CustomDataLayer *cdl; + Mesh *me = rna_mesh(ptr); + CustomData *vdata = rna_mesh_vdata(ptr); + int a, b, totvert = (me->edit_btmesh) ? 0 : me->totvert; + + for (cdl = vdata->layers, a = 0; a < vdata->totlayer; cdl++, a++) { + if (cdl->type == type) { + b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type); + if (b >= 0 && b < totvert) + return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, cdl->name, b); + } + } + + return NULL; +} + static char *rna_PolyCustomData_data_path(PointerRNA *ptr, char *collection, int type) { CustomDataLayer *cdl; @@ -2499,6 +2563,54 @@ static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); } +static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "MeshSkinVertexLayer", NULL); + RNA_def_struct_ui_text(srna, "Mesh Skin Vertex Layer", "Per-vertex skin data for use with the Skin modifier"); + RNA_def_struct_sdna(srna, "CustomDataLayer"); + RNA_def_struct_path_func(srna, "rna_MeshSkinVertexLayer_path"); + + prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); + RNA_def_struct_name_property(srna, prop); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshSkinVertexLayer_name_set"); + RNA_def_property_ui_text(prop, "Name", "Name of skin layer"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); + + prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "MeshSkinVertex"); + RNA_def_property_ui_text(prop, "Data", ""); + RNA_def_property_collection_funcs(prop, "rna_MeshSkinVertexLayer_data_begin", "rna_iterator_array_next", + "rna_iterator_array_end", "rna_iterator_array_get", + "rna_MeshSkinVertexLayer_data_length", NULL, NULL, NULL); + + /* SkinVertex struct */ + srna = RNA_def_struct(brna, "MeshSkinVertex", NULL); + RNA_def_struct_sdna(srna, "MVertSkin"); + RNA_def_struct_ui_text(srna, "Skin Vertex", "Per-vertex skin data for use with the Skin modifier"); + RNA_def_struct_path_func(srna, "rna_MeshSkinVertex_path"); + + prop = RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE); + RNA_def_property_array(prop, 2); + RNA_def_property_ui_range(prop, 0.001, 100, 1, 3); + RNA_def_property_ui_text(prop, "Radius", "Radius of the skin"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); + + /* Flags */ + + prop = RNA_def_property(srna, "use_root", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MVERT_SKIN_ROOT); + RNA_def_property_ui_text(prop, "Root", "Vertex is a root for rotation calculations and armature generation"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); + + prop = RNA_def_property(srna, "use_loose", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MVERT_SKIN_LOOSE); + RNA_def_property_ui_text(prop, "Loose", "If vertex has multiple adjacent edges, it is hulled to them directly"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); +} + static void rna_def_mesh(BlenderRNA *brna) { StructRNA *srna; @@ -2671,6 +2783,16 @@ static void rna_def_mesh(BlenderRNA *brna) RNA_def_property_ui_text(prop, "String Property Layers", ""); rna_def_polygon_string_layers(brna, prop); + /* Skin vertices */ + prop = RNA_def_property(srna, "skin_vertices", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "vdata.layers", "vdata.totlayer"); + RNA_def_property_collection_funcs(prop, "rna_Mesh_skin_vertices_begin", NULL, NULL, NULL, + "rna_Mesh_skin_vertices_length", NULL, NULL, NULL); + RNA_def_property_struct_type(prop, "MeshSkinVertexLayer"); + RNA_def_property_ui_text(prop, "Skin Vertices", "All skin vertices"); + rna_def_skin_vertices(brna, prop); + /* End skin vertices */ + prop = RNA_def_property(srna, "use_auto_smooth", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_AUTOSMOOTH); RNA_def_property_ui_text(prop, "Auto Smooth", From d9ce31104f974509a4626c77b3f35342576f05ca Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:19:13 +0000 Subject: [PATCH 106/159] Add skin modifier icon created by Julio Iglesias. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- release/datafiles/blender_icons.png | Bin 226647 -> 227018 bytes .../editors/datafiles/blender_icons.png.c | 14182 ++++++++-------- source/blender/editors/include/UI_icons.h | 2 +- 3 files changed, 7098 insertions(+), 7086 deletions(-) diff --git a/release/datafiles/blender_icons.png b/release/datafiles/blender_icons.png index 35988235cfe506a8d88e7fef0e7e62ae5c77f368..a0d460b0153b68d4fff7eaaa3bdcfd3a3f6b62e4 100644 GIT binary patch delta 153575 zcmX_n1yCGa7va0%|gAvnR^-KBAt00Dx#yIXLFpuyeU-P!s6-P)<1npZQg zs(Y@#d(K@rMj1Ursi{OnfX2r_`8p+jWfjzf*xZB&(T)$CJ^cN9pRD&SpAJG4ff)iK z0F=uOBO)$x6i&~;AcON$PeKX15CL9Bib7ghTNH@~WoFFmU%jup+4)5rH9EN|*6qvD z!X8{Wm?0VLe~LdVBOw%J*P`L?wQIbJL(6zvA(OAqf!`6}83t;q%c- zbG27rD9YgI(Zl%~l~^dUa!PV?Y~{BlbmOi20D;eY<{7Zeu@ITaIOqsALcqS#q~ z!M}Ci!J5$yYq)NOQV{)d`P9np%|#Oxn@pc1QT#eE<$PW#r)BYXff;z5-_rZo{HG{{gM*73SadX$;lx`cmrCjA;PBhr`JlNg z1YYzTzVLd)7%LZ#&kFkO`t@0z`Wc_$brfmc-jI{dnjAL=Y|E0tILR?ZQ(LKOnep`W z^fd$&tifEF8e*!PTb>|Em%`Y%X2TZTU1j4N0E()TGf?AmYUCGOAyu_>H{*1hEH-Tp?E6I+{vM8}l4{}v>$s(*rQzpKbhMzJ97S2#C?WTAVtulS zXL2DSAxp5~T(O%^Ade3ZTR?O-HZ%aL%G%lttm)%y=H})HZfDD_@@X93Ja-0Ta0v(q zmYrBs8f!F}9794vf}ZbAG*mS;!?|pi4K6o(F0ZdegJ4mJ z;CKV^*YvCwWMmM#9L>N);W886UXQVC9L-nie3O(H)NWjNWLF5^+mRWev>bA3)_H(&n?-pLp*4g5`-ab-9A+Y+Ci zzLIRZR6@8u*piTd2@eg~KRB2sPKjZWCTV1}oj)-&Fi>c^GEdPXbh-p6&?ZRtes#6D zBB$XDLT4z%{SI*9Bfl#vD--qg^~I!f*&3DK*epRNj<}qI^`>5`Dr0JHUXR@8zr$m6 zJUcS$_2%W|e*R+=5XnUk7pENFb2{D~Ni^%w1I~q58pz>bv_z}E(G+SSUJ0c{FqLAF zyTTSsfK@gyXVQVl(Z6XEP9Yf%iM?BERT6AOkd&BsBaN;`9Fx}AeWzN9i5>4RqAU6n z*~!%v$Hd%RsBfvxRCds+ahY_PCh7+E@#us^8yBA-N+XBcCVIxmon{r}-)BRK9;_ zB#mT&EV%>r9vYfhFDL#PXSY3Tl^Ri$N(N>1ynY12?@i;%Pq|Y3k*ywtgD?k zA(fRT+x*Y^opQcc19+;;-wE|}n`{WGblXG0A!hUS>4u)3zIz>u4%3Z}+UEzWd3o9t znp$s9&sK-&STY44-!q1}pPyhdvraOEft9Yfx-Rfs2=*uFi>3O53{{3CaO^0RaB^~j z_5bDNkjy_Rt){29o(;Zf`)auc%hTi4&KmHvho{k@w;@a!@9}%w?5e~2;Ws#yc&v4J zb1zwN=rtDdJ2^X74-O36S^p~g2B3w&AY5P&Vbg)_jr_nUo)2-{%VE{(LQ}-h6WO^N$wt^(I>)ur2oX_D(h1Z>;b2 zWi|<>R4HS-M(36MQ}opW~f}g#y}=q=HsB{O9J~5Odjc4 z;E&TSQChA-mz@)W^&W#S{CudS{DAbIKYv^plFBBwNWiOE8XB4c%V_TjZ5iS@$n*TY;57#+4|~xx3j>kYC>9?jE}GH z3GsT*+M2H^PSfm|Bme-7JqF~uZ7!a9a&K>MbCUVBlxszosBEb=b*c>G2{MIRm=U`- zp(sTA=PS)|6*|pTM&I~Wbx;xP=lAa7)^t#PFFbp{mZ+Ao>*?vW1;L>SPIn^1290l# zn6PPus+aH0SvB6p2?6g@Qc_YU#>U2X;2abBy80tZyOIkV4=>$r{f}kB*ay)2^`~vX z_;B)O-?u2jwahtPyFVQT%oIW>bi0q~!Q#HcRd$);Z5#;>z~8GVI(-*2kz6f#FrL7(5?kRV{NQf3ONWFk9ec$y-DCwP?4G%oZELDB4vURQ}jvEfQKu|C9`do4GT7+ELgqLb#-;aPd5kOTwFL>fe*oNva(b|u_RQY zxl`d@Hahc502TzsxWp27iaX723afbiiy9lfxElKY!;h=O<<_>geUh(k(bRNwiOvTT z7-(p5{2;E$6q4C4B8vU=0`mv-nId`kqv=N85xHeyzD9fLCYvSESu0M<#TtszazhLZ z3=Mb+Rw!8Ha0mxBN=nN8t-dhUOg`7P=rl1Q)u{Cjz*`5N!lc_D0$NyITpZf-@si?b zwluL-FvMK83!9LTaJ^ikI!;VXY@?p$j~H_XpoVS*YuY2E19_p7-4GYmsq80o?V?wd7xt~mByJy0WgK;Nss09VHZcmrK7c0@T z8G3im(DAITuI35w^JgLCX?=Q&@Gm4KB?Y{|-mdz}yXvJXz=lO%C&BvM5~Y zBbH*R^Tq3o=!ZKyiS1r@R(Yxn*_zkHv%bB>8kh|<_I@p<`Zy4>wkW8};M8Vv4}L;C zGBQPvEIR&44Z4Q1?da2~TrodAJyH#A?a`v*;&iZKS!mXoL`dXM<2PzoKFtG_I<)ro z_9*_tZS%?k7+1HK1WU_#j8A0)wJ$eN=N;=>hLKtV{y$65hWD856D}pU*+d#RAEBSP zYQ8Q_iQ8ZuaLc#HSN71I`{6p+dw9FwWRd86Gcuy&^)cW^u>SG6uG8v@acL&6m^ni& zqVjB|IkCTA-05(NLPtVfTul@>$%i+cPR}eXVm<5M&#e?s?i?4lNdZAD%%|_`v;^Iv zB%}^&h#ZV)Fh4I@6>Bmnh!y_kQzXNT5dR)D6ydV`Pc2EqtaSs6M=1Fwi1?a@_Y)YXF8HzZuTN>cG(hD8QF@k_ZPr7uvJQfC3G}b zj#pZq85wNcylZ|V19Bk(UqZs)56&R5$5_^m%W>w9^x8WydtY(B`Yen~MFH8lLn z;B$=>7Z?AT`PDrk3XcV|^#|$qjhEqhzf#3)!E9POx)h)LCG(ducugxt^KE^T1O1t> zS0RToa18o8p3eQv5HO@bxVoj5B?vVM7pIn`rquBd{D4g5C~eE_>mpJ^WX_+K-v66w zoGer56)&y2!0hop7c(_Jex?Y1H5L~iU>Q|AwSjAwyN_$4FG|#yg@_@&bj_QVywraz z7p`vjbx@8zGTb7?DW|1WN>zo-Cy49S%PXU%ApHfMTKR8)my0fLYHDgtaB02Bs8OYv zpPxUDgv&&qG`5#oBFNMO6!4FP(rzQxx_aw%zx7Z!jWxNyBwU6nMpPVAwQ7uOeQvVz z*#^4Ia}sp9?70xEnY>j@<^pakYiUx(WDh2@_3;$v69X^P$$>gf5A)RUvb{yjTh1ly z-4DgqI6lCeGRHk3&>uo4E5iMW_xg*Qg2L~xA8*o=Zp zN#rN1LT-{ieJ}bMhDMeEherAnyf4A9FBAiqwSCF*x|7Y#&D|34zRy_b^nG~;a1K6l zrc{v01TzkJVs9@tvUSj~ZS(2xxFS{TVK_d{NGrR%`zGN*#f)^)g({8H7A_hLNkZ0* z%c=A_xKBSafUr!ri4Q~t`$Cmg0aW)->r2E;Ey8uv*52SA9V}|2@BtFxFWj{93m!|Qf&T8^yv44TWzwNPKOlb{G2BU(l}==^ zm0|I0t(Jd!4%L5EC%n{CG}TU_9pymxfrxll(dEs?)jmhJ#P$`i2)o%K=#g+koGpj+j*p|r zrhJyDHyf|9n5HZvb-Pz%NUDZ~gX3=XemIBf(Cb3#u2vKR0t2#~0&*$?OeZ&>@~pRf zBuZ5~@ra36kI&cI-EY0#tU%spzH41UiA6_^5D*Yl35kgZkc&Yd6t6=e$w216i6@rb ziWbFTq49|!qo`~I#2Aqh;s_Qh%0i8qMXC0YjP@T}?3mAqkT+Q3BD7D~K9k5IGT zdyI#+s)Ur(3eo`TSDPVf{??hxY4`T2y1rO|w_b!G>uF72?1xAX4C0)k zMR}BLjUd*U!V2%nzzE0zdNa5VpBhKj%NnVEn#_MrFUw8gYjNg3V8Zg?71*zcdD-Bh z)|zAJv;Bwwhz$>3Wv4H?XfL2`MQW;EEv&2E|J(fE-s}VLKk_}i+<-ains*ZY1EC7t z8XXdk7>ZpF0u{C>z+-}fe|=;rD7)&#ScQ?eEgFWAeCWf&IFR^r`v-txbNS19Kgy>P zTDcxV{q4knD{6cYy!;y6*aq7!9sh%v`V#q6i1456z$a5%^;c&&F(d>R{H>!RFHX9y z$Cs~;%lgMomHEd0`LhF0G>HR*l(-QyOcFFJh)86==KGLS()@nZ_$x`(SAVB$4RLct zSJt+O;L;i4W{{zUL;WLntj&!bgNMVQ<{hEB{;kRhu$#cj5zb6CYO2HItrrZveC$AV zy(9ED1^MfBC{RJ8YU&vB6y3MQEac@WVf?tK0*##*RAKppKm!yM6wix`n&bL&lG(-U z)`8-bNm`Y-NJEa39juMw=U+Zj&ywf~C2hBQ54LbxVNn?__(^*b$hx}MvzNg_aZ_b% zfXxGJhHLIeE+LrpTWFI;2_Zm=@E(wdGLc43q~Z@ypytrr;$W4qd;U)^nL7~kMslCO zb<9lTMq!@^^m$9%lCoM%b?3}eRHj3ApDnI@lZqpaisF+enYG+T6G(xAnHeDAYw)Jv zdw!+_{mX8K*40g72i`0d9@eSUKl!%_I1~b(Cs&>P)TZ@wZmhrK&8CJEg9GozxxjGZ#ysPqN+ z1vuvrARtTu;O(y1V)l`1bUzKkTIp2`SJa;^Hz@(qT*vl|+dwtDVK!JoE7h`V3KBwJ zv%-5}ZcZ#cJ9`Cd533bi3}JhEdg6kTKTJBhZU?uk(R?0`bkyFs&N2tAp?os2?G>{% z_d-_%DCs(Z^WFQTMnt0!tM}pNeSq1cR%3&1rus))_*%MPNL7QMk?bxZ&tXzX7jf!r z7e#|vV25&PP1^XQ6Reth!MKj4MY!g8~-s49F8?1piSbE=zCcLyNkTe>qH5^ zfB&vCpUgr6O;vh7n1SOSN#p2}#Pv=`ED^HJFVdttPtbOWhVdV5*Vk5U+IN!R!3=u%6k7+AW>_D_ZIBcYJ(q!4ciV z%r^zNF`fo-R<2*2T-~VZesE{TU_#i`nS+$4Ur`xdsR}=cuWU4Rn#ejn=*p=^^v~dZ6^#Zdz?q{D8uTn$IYFQyfs0 zJ&5wP2*hYE)?4AjnI|wXd?%MQLWO8u4Te9L0nH3fsO}!^*MQHRq^RMtER`xIN71He z4j6p_kdBoBC5-+T{sx=P1jbuOtwaC*-O!*ZR{!p(*UiiOEs+Pa376u98@w%la;INot?_e9k=%-1M?=i%Oh0?bOb!Eiu zH869$F=R!3OGT}(f)7UDZM-fyCKF;UXs}9U`V|i^_2DQnJvFej#Je?t)&@+jt2Lve z%l=JZNfW?sg>O6E=&Ih^6bb5=DLjUvv^Zg$jem%Yvd7UFdg3r4?E#|>(WhYHjKt}B z?Y$2Y5W^*oK$p)&-riz!Du%PbW!>N3 zhX|8P=7&No*4d@{9K?lv1$-Zmw)Jm4;rn(rljC?|U_#(xvtQ>j$;*0%>`@GykQ&3= zlEY8j|D9;ZD~35({7y~Nth1V9Fq@9(ztww_a)OXw;oxwD2Ejx~gW~-q{oApHCQ*8l za+~>ILffiof{80i`Q>RDA4F>cEm!(6niCKm@A_%}rZwYEqsi0H0mmYav|svz|IES} z@W#%nUzox(LxUp3ucvdV=!kxMd~%AEQ^HG|VzLRQ8gg+f4|HIhKG$jJo?eyZ$+vE_M;mfo_cm-#}+Z+2C7uzq*1b~sz7Z2bCH&tGg1{I zi#|Lw@kD9`$dj^$Z=t;lYJBP3wyuEge|}j zpQpVADkqC4<=`o-XJ-Cn@%Zl4b+hn~MH)J!Enq2q&eV?0K`D>k-R((M2M~3!aEJ@efgSEe% z8+Myv`3sk0OGGVR=g_hqC;4w(zt+bglh!N0C!s8tkdXj_6r7>vX838hrzDPE*SF2U zLdyPuU%jJY5iR3hmbiGW69QCa{6H+bmWSn%{HpxFKy;N8*meHP^TUV>XZ0u;k$0KX z^(JC5uO^A=`H90tRfyK^;I9umHSQ0n$p=RdR;?IRV{!PPDXYc{;IYS>kbSJrXwUG| z2Y>wo5(;2G+okWPD_3|@)}G4!hxe>6YvYt}?O^lCMmy79WOfAV^4=N}Lu^bKB8T2T zPZ&PHTNnx7lT^s}E&|Q!ceOf29j$y?F!(?upnUNyVnkX-Zt&=P3Iymg#2KP49C=o<#sca9HVt)$&T-!wd21=E=rpF)?@_ z0ulLS4pfbHU%9Nqh<=NQ7-9_WbapCHsxhV4dMrSuiYsl!!1R5o(XPy~M9eq0{XrgI zo{U1o<&&#KPfUdl|Gdz6a41v*WnujJ8ST^n&~NMm*Gwf#`D%_HLeusd?jh3_(xkjz z#K0ecKflEEeRQ!CRiWkG7%+E?bGfxCoa~ULJEm%sL3RUgMoTrajTfI-9!8s`-Fzw@I$8U533)t#CK>iKOQ(SI0>U(qH1L@ z%1Tu+Jow`p-R}7?F~rCf!@85OnsWq)Z3!Sl(AF)Ne6NF`(wpRK`bcjC4X*U6QPfnZ zGcw^KfgDWNgX$(Q7SR_NM(pyyqE6aazu? zaO6_SiyP_o`dUcHqTl-5$a3k6P3c7NMVGd6ekO+mMwW4uX1Urzfn(y|&1Bm`JOB{l z+>QGO*JzWtkddHL*8@*uAg=P8sfn3il}>LR**}fPcA{a9M_mk`nseLCB3%)vKprphn_-!_p`f>pfz2D!OmK z2}1-V2yqzBp^SE@aI|N{vG?|Y4&WQXcCnGfP^p*g9`V`STe-b@WYACEP!KskTyewx zysogLaJI4v*KG)TP7_y`lS2k~alYkx6iI{<CSbpNFcAv1;vBlSj@J!Gx?)WfQzsfG^8?& zdAY;(i*c<6zqinOs^UtYQXLDdU%#y4wG2YkH4rn^;ZlE~Mra~Sk_&%u3j#-v?%A*J z=ibh^m0BIg?8&Bzi!WmTJN|af<#U!gX*Y^8-klG`g3uRp?K@Q%95AM^X9>PN`pq$2 z^7r^RtBcMJBe7vXC2|4!IzL^iidy+{=&iHIb=ZmI)0g`VAM7g8L2eiGh{Xz5&W}#k zPWclo4RBjL$b@{D`T7Jgzla6=__AR$du;w$@uuoH=x}R147=;aslww&T9IxJ7g$#? z^})ANEkxE!Mtck}A3t{LWq`Mdt-qx=UZu(v(S@Swt`d@6umetNl5Pq|wHczu=9x($ zZNtHm}<*zE(dE-nlsU;PwcTkuefIUxc8PENozKKK?gg4VKH2!ZadtQNJjdeM&ainv+Z*p3lA+f9j}$@# z8}#VSvw42E;dnA{+khGuTt12?gCTW|`9Xhqdu>@fF#=!Y~~Q^Kp|YvlCeB#Dft@h?Knf_?0KO>+so zTvXk@ufWzq<~H9QE)F9q1i3&v^q*O%R!=VvkFQXsvcJ#DQO|0?fvfD^3L?qKLV%(n zmQ+9nlv8#!E$0gHBMGvF+ag%QymAoDdIM%iO9Z~#sY!yCT>Nq6wlpS?h|6eIpM;V7 zbh$F6gHPQK-ttVF-`6UCS0x|NNZz>|%KXt!3*b?46++9To*8!H*IFD$?v05$_DCI!j=1R=xx;oH zJ*8ctgeQorjji)GTsqUPl@lc6nP7;IK;b{v8yo0e@3(x~|2Rr{a-GRUy~b0y&-Cp0 z46L@WH|=NU3FE`^i+$&p2*8`^M;3i7W}aCPu}}+VuKk(%aI)S=iUr%$9d|IskzK3$ zJ#VZcaX7HN{Nxc$@X_G?XS}hpO+n6QrW@F_N`7%f?%UM&O8usyewM4__$p6sH$0t~ zfs?XE#!n|@BGqCMxlBUNgK(_bcJC-m7(n;H8r(T5#k+F>_fBiK4UMJ`;0FHIBz!G;`f*Ug1_QSGvQ>kyyc=T6^pYr@&^ z^?sW+dDMFoW%d1c^ptKczPMw#1n%hoNLDkHAC%Se^`w<)Y~t`gf2M_ncAj6_E@EFj z*r^?#LL}GQ@*H1ookq`{6oeKE% zG$d?3iymVdC!WtXnHrmIod-9tH_JLpP{z-VX~~rSG78NNF-lD0f@wlDjh#}pkY~aX zJvqwl^O2wVsSl)KU2oSUeNH8WiX8u&pDPwxe16zU`vanz3Ae0tb9>G75%; z?0tD#Q@k2{bS&OntH=iObABU9btXQf*TIxJPV-ijn%L`#&r{XHpvPXih!{r9^ovF^ zxMYv?E|l+CpfJV$80nc7^WG{^nT_h3p01SuS0lm*{apP1?86s^G5>hi`Q! z!d`uAg^3=RbLzO)-Uv*tTmddVcGsHq{GR3z4vFs}x9#2#6uS)QGgpTTcSX7Q7xlmR zSx7OAHX{%=9tH-tFK9=J=dD;qJd~3p{2du74d-pl@qM|MmX#F~DfF^muD}41zxypw zh9brf+^9AG`!;5m)8E}Qu7w<$2O&B&r4xD>3>mGX8D5k8`SKwdDi{#9Zs@hyH{61# zkB1S{XgB$}!xNhyk<>~`gjOpJKST+JYYD{j_?0+NlJ^X2wGF3;YJ{HI;LQzrVt14T zk*&&ym)$7$B1SI#)={M=Ki5Vv|JNI`@9FZO^f7f*>yRp^g?{wfma$>ehT{&+4?=uM zWb2+1ox(OSwZ#+b2aMhv#|fnhXc-S#nyIP;O!UvwI{2hZqrbgv*4vwx< zFu~2wo^8Xahj48^X=ZX&u`26x%A)OM{i5+dx3olcd;|yy5GGgZs@Ji^!ia|g@+_); zgnyd3L80ej1J^A|npPstWH1U+Bva1nedi1vwxaRI|0Fvf0go#}d^uuFwnp@C)OuNZ zm3Fb|TpHK+P1JIydy(!e)TYOCGp(+rTCqC@U(zIw|A-zWsALAoF|f9@^X#j+R@KIm zRw51;LL#Hy1WvQT!eT`UO%hk2$s13?c21=+MwC0%s%g0(B%Omw1{+OZ&d+`;yW0;j zwYeRwX5nmPs39!19(hl=REmxcD^KBApwE^9QeuPoLe5$(_EW%$}_<+j-aq14LVqL%uU<#^_MHDXhQWFRPjJ73?o zw#Muj0(P_GbzdaZ=9tdH&;Oq=;A1ZRO<533UJ-}Hun2`6bNoW&O3%a~d`-4NM*4Pr zIdyk3@26fXGmRV1>3fdKq|ZZY3h^-Z#r^#OU+4{|eX;I;CGC3p9kLCkwoEH_aQwEY z9A=<)Q%`K4#&m@%fL|x8g+A3-#Z}Rr5r@10@q>&_{QRp=iz1n5aF^|pb^-(_Mr_o= zBg-G%|I##Y%q=CBoRhb`z>tas=G;tE4lyF!O+B2zU8+`^8r`4j*Qc*vN5mmMHBAW! zxX^2OkzEMb6w=aE^0avdblTQRAdC9%3nKRG2@aOBV__j511;5M_Xz>DHT-sh^pf!t zk(8A%y56X`t}*z5NVT4uT8!#Gz7@Zy=BK*_tV!79^;`XhG`^Q4!ovjSZJI%#4Ny|( zsHjl-T{FQVrsBhBGlDcvmc1ff)rmVZf~epgglQ84X7gdd&>mf`G-6bhO-s#o4ZrIY zB!VzfhD|{SV9rJKE*IOr8hEl4O+YpcUoD@8l3i5E>T&7NU|EodswWdPH=69lX<0~V zT5f{{YJhQA!ktVmQ|V|vTrM~>&V|7)STAwJVKkqZoK3e(L+>2bfTaK#!Okv0^Mar` z$PFy~^YCML$|~rRO@Td6y$%J}PlwJW;TmG@&#hk#hB@kIoP9ly26Wc&K+~6BpGcM`sm{_b(EMTs|eo`U2N< zj)R5RwJ>POL5P8IwL7@$=>FLgdzbb%!obb>wn__c+m4|O;Y0>ciH14tpd;;$68|S& zGH1+QJnVFX1_%0CZKZ;Ge^<1jNdPbtVKB<+^z6esTQ+3C}EGIzefn5XV)YiJgwm5eG^s|Q*+|I<`^h}ue0X( z)jI%gNk#@X&a`sQ#n(p>D+9%(lS3*z!%CVtL+ejsc#z$facF-(aD=NQbu1^;>x-$* z=9iO?A^wMKJ$3ax*$=XN6VLbLOHB3a1eggT;xm(eN#i|?CYHIy{dHI=Juyvne|e*$ zxj(>wBR;%n)$-{-%>A zdl2WIQnzaTOz5GR%zS@!RqBx=AY(tR%5@uOOvZK2Y7+9YJb7?vDcS!WQklt|^OUt@ zrzr=vi2Af@W9rZ@sdhvK$V?OCX)7N*s3VRci zu6RSkt-t2kzL7aO069J~>=Xw|SEzhEF#wek$Gm_0^hqB=6FO(&rDQkhw<9GV-Vo{= zyd-^<;@u2es+@LGOBqueX(ki4tn$9^cD6;h+K!3J>za3U*Ru>#Qa%Zh}YjH$~s&{b@GBm=P9nWY|e8Fv{8LG>P@G z_|mTxGXhLnlT12maNDj3k~e%uD=O^5q;zte zKS`{4->Z6fc%-tivEOc-ubK+DzNVb>FKS%hU^Q}HfjL>#)eO3n>TWPozcG}|f@pIU z*n4l-{z)F#!A`0M3-Y4c4hrE`ylBLPq~!Bv4}BQIOT;(zmyFP6Az37P0ug^J7F|J zr>iS-7F;jr;WNDRJ_=)7>^i*2$Nd%>3;PrsejP`N_RYW&6hEFE#HZli3l&E0POf;h z9WnN57whc!a^$C{WwK+hN(!ORVP;HzIt$Et-~P$z$L@sio6GMq4YDAowe;0^0?9;( zR*z?>{$Ihg*tNX8JU$4`xHqxu?R8jqIEE)CXahOMZy4t5V9KPInT^*E9}G zhGxxHbJ}i=Ecg#;3*P5Zh{q-R2LHM_7k#0`;kvQ<`WayLdZ1ziL!Z z8Z*uR1IVw0j>nhP=iGaQ2EhDExI+30&qO^P0Uc15R%#b9FsDR-&r};AwS$B8|z^Fj@+A)j z-jrm!M*-<|A!rAnPw(RYk_;xE^vAS_nteHUHki6kGydO~mf-&L`-S6sI%{bpl)vxc z)PMK*kHFB<#-#xnw|_T}*s6o12%0)r`@SMO8OxyLncYXXZ!vvGjXeW-_2QItA`p^q zz5n5{r4oRG!~Wu8f9tGdyfoGJgWetObpj~2Jm3hC+LZGM8_gPm50Nr zbFRhbsJvFD5UHsIKt}f)KNQq1KpJ4Js>fVC%AbZ-b#gZ`G2shl2ZpH;|F=4G7w%AA zin?1RWtOCm*C+mJ=rw!|<6L;s^bzfvJ=tnKgVXp*x4&BHSZon$=EGR*$e$AbaA_6R z6)04aYqL#97VYi+w9H2OpKbp2A@kKMTYP9jCk);T^}Hmy`vhV@qIi+(zS;=g-nOd>JluvVo6l=QoG4# zgLtXkC=vp2zkcL~8)!RQ{&UDMmG|9py~D~l^6GipGfM_@`wX8}MAlDiswK ziGVhWfcY4wk>twt;dEc#@UWk&MRtI%@V~F0gokfTnEMiamtP;LbL`p`NB9G2XUMr8 z*!fE=#Ozk@pK+^%x2JUIF+2Y8)VNxh$rv>#=(L4$;$)Yz$0zxI+=l#qhs^yMdAgR$ z3SpjIJR=|=5C+(;w$y&}@ZbUYn`(u;2KhAR_~6vKj=z1nYOB+C@0fUo+<- z$^36nN+(fWz4Z}9@VL4>fF1}0=7;NVfAk`oOBQgbY7y_NNGQ)NEu~cd$ODmAI6wYq z)rpe-$j)Lel~OV%^x&@0=?|Z-j?UNNe304@>=5Jt0aC}aX3&sJbLAT8GaTbJOxDOq zNV49f?S#;wAKwD*>udI_InnY`K$AAaeLT-0evp!vV6N*?q2;vhJCcC*WU{kvsztzK zCab+1QtI3K(2Ukeo`cQJ>K~wN7!m}wO2s#?QL)cvAdogy)O&nCaVO84M1f6xvEJL=**pmzG7Yj%3H=L4v>7T( zoYx+U^*&qNKGb2|cwG_VXez2vUf?IlG(SUxneSU@gBXwlC+E`#lUZsKf> znum+y>8rPCk+)vaAIq;E5l+Y_LdyW>Bt77J!D6mYv1X=E5v-r;==fI68UI_3*0pQ+ z9rc$mh0xng>^WpwU=o!9FJzUEy=vJjN@&q1^sLRwX4*V`6F^|{nxM(u>2@Nq_``u) z%d=v+#W%i6v;J_)cLCehaotADE^z$CV2Ye%hOA#<-S?JFRJ#c@l(IyyTMl%e8>e6p zWB)MYRzyE679T<-2{3P>tyeQC6+B^eSnU;IQS=XM|7u}G;_|$BF0$dFKF)2|$sDW?m@K0E$*+U>T#L_nL@aSoZMZE^(rAkD--%?YXW0 zB}~pBM8-kEuNIU-FG`QC&MRtYNZcDfbtRvcJ4VQ8J%?SSYp)Ea_=7Q5v%z%t5J6Xu zkQICVJeJ4z3b*L5$HJ&~h4t~A=a*=5@SGVK)L%Mz%5GNO*-*&51bBRDt6Xd!?#CzS{U%_2T+=6`J{T-AC3={f z<4Oz>i^vLD7ti-BkJW6Y)l5r%zFZ^O@V&WTYyXSJFUG=Qwo&d>jn%3lEd*!2Akaq# zod5dC2nvAthN=?n^=2DJtH(xP5dE)jR_=oLq6@f!km5_S07&^O#CvPmGA?zY(OP7)&L94O*D`A$Yg_RY+!s5BuZ!0VL0;Q8)+TC3(xoUK6;6|oe3#7cm# z!CKyTywTHi692MCh3HePy3NGap&z9mCC}J_%DeaG=YMMg5En(Bxzu3 zJ(<5X_%kyuA}XchkC$1Ix<}jP?n(CGyYJN3O!$LWM8pj1%STkzxT(>lUOh^P^7U&e?H`yh)qOG zc13xHLk{N#Nsx8zu`-L1ZP^S)FGB@_UX#Y{X>m3(Td2L(E+hmtmKvH0%bSLo9&ILc z0;4M`vR>jcP6krx`fG95hSGFi%5M?P`*jiT5WK%xO>5h4M2}f$TO@2M$RJ>=K>Wfn zWdv}9DR4wT;gB;@5y0^68x=9GVI6#~b!A<(*mBs(#YG8P?pbMv_zR_H>p^o|tY4M& z;+ZOV@IKUZeJbch;B2lKo9lnFhjuhInQU*@WpRE>H?z;QI@S4}#WeRvudkT-bl#jt z25I*3X2JK6+k#pz^9z!Kf*s=m)6*ucH3JagRWx~r=$Gp%9i=OXLil*)v-FuP7_>ZN zQ{Cy4H*lrakeQd^}!HR=$wZ#$Y>go!NI-p+P z+-w~lmdqU;W50~&%BOP~=jY`WOiaXaTYgC&S1MJ-|LRszW53ZU2%g0vCLGt$cD_ZP2F*WfzLbp|OX(eEobBQ1mDVz~{sC zFUV9LugKe1d(A?yA8uRs;d_i4-$<}AEh5J~ZsxYQgn~@7M4;MSj^4-eLb4HmA;S1| zT!Yv*JU4!4Vzx(K_KthW`!pY55S2oyd3~&mRI@KtQI*o#gaL(t|DYaQONscGdTbSrV7D6k0n7*b$W)hHaAgFmzI(&3lzFo;9KQO(hA!`%j#wbBs}d@u7Y^y(SY67M*+&;2H1>90}^!w(@=<8gMx0 z(0@^Q&mB-rrQ2A&avK$X%WMe zFy~c+D=L3T<}b;jEF#<0@!l7q<4`htB-E4Y`Q$&%Y4Uj3NYtdKbN56ir&mkBPw_L7 zV7Nc6|bWiRo^2w$WXt^SC~~gjjn}@&BDCL4X2D2zyKV+Sc&!({WSt zX7xAHZiOKCc{Fnd1+$JnWYvk&PBF;8m+G>7GiUQ&v6#~ucXmD53)uaXRAvTdRsoo^ zWtm}ZQ{tsReB(15puC%Wni9Fw@UnQDE^b^`&|;1O5?8 zkjT<{V=y}P0ltO3{lyxHJYE`nb>HwCZF8`%20|9+{n&KGb+%F-C3`CyYfnj8*esSv zo(3#})yoG$WEY6Lp0!COIkK=<&Ug4aeKDdf-54tp1dCvC(eUguZ<<`t{RKo1wAZI-2CE@)~};e0sHjh3=cCa42SSJY9V5 zRWO$%Dv=247ufTnOYQUipJA~WWwcF0$so51xb5?~9MzPKD{~2>bXo`3BjV%%^g2zR zX0EQ63;YkaClo$HkVX(TQVgrZ>DI^$dfk@}^9YV^f77{cavRUv!r6;H+6~DL_>Es* za2c%;b&^hm@yhps}J_4 zIzG7X&E06=rzJ}|)fsa3o|6=?0*jl5E{OY`!7y*Zi#kWtz=du>8~u?SGaOirlA0an z-8WlhDvBg?IdKq>dSTQ99*v!%0#WEd6fqOS^d)h0(dXco&tE=&{`r&RQ#i9x4{Qduh)99w zh)+g6hR&NjHf{`XGczq=&66z6J2P~gi35!eGf5sPZpLCH?B13l?rT{=9r@Lw-YR{q zo*Mo5MNrdtUD{B8_(JQ7(yZN^Ydzn<)%ur{x||=~UXm`^5phUf4!^{}lX#O&+?dYn zB(j#am-HltC|=Z^CR+rF?!yu#UQ64P?hnD=NoT8SX<@cEXb<6xjL{ z1mN4VGkARmVu^dLh!DJrMbOxC=2lg3X2I&BT)BC!+_qo?7W|!J=#gA#s0dz@&=}A0O!({vbVE% zy|S||b%Jj-tJUr0?Is)BcYC`(^<^1UQHMcd6{y5W??jsg+ikB81?R#;kUm%jelbE@ z%j$5$FSq-U#Y?7dmpssHjj>|;y$hoox`tXkIwev)r)zZ%tnGvtqs@qF87K8ugjJjT z9;W{EA-VhEp%)U-zE#?H`c(u+x?Q#X&UsV?l$kSjjTJ;dlGWz}EC{zeii`AWzt4Nm zzI)q*6Vrv6&IKPi#Bnse+a8e1?>H^0qAnl3Lb_5=aT911*h_t!A%;Tu=~|W(8yR|4 zck7=9TiPM`u^E!2$o{zn2c~+~H#p()#J=<4auwaou?)RB3J(X3gE?M}*%`S~tu2|u zV?ruhArw!(G~jc+lP}@;wY);eZ#h@aCX62xKGcB}{1(SvSO^3R?2Y?s6BF9b$Ch%7 zy|`zq7)GRofouk-nsAX?3g=Rllev)DF>cA}Y;mdms^Hqwon^~`U(3=MN7E~dKUfu0 z#^sX9bGr$7EoyopriZzejt~?c2Wwg(J}q0{DT ze>65P+JmraV)LYNFltb92tK>zV|z4>%pi!;nC#9S3V+egpRrOgTE?4`S$Pg|+vz?C zvY{S6*{#uxB#uh=AlX*J|B11~Y33%p==sro|29B&Odvokq|eskq0Fi|F2f%?5KfT` zqqCWNcb(k8e?5#87w%`j;j567!}YJ&rz{RDcV8>M?rJ0Ob7w2EULU&f)wuEN+2tzV z=!e`AepM!vq6gJ=hi1QamK->tC3`iEvWl$Z5c%XNIe7Bc!@a(rw=0`_>-*26a8PnT zn@w=MA8zsz*K1soYh8CGWkGj(-y<)uHXr#eee>B=lfL^!g?v-UAb%YPp7jA!)le5hLstB#w*p{4&Wjjl6 zb){3Z>dtUJtCCTMld|qjH)g12f0WJ}wSAvVu#r#XI+2I_Egkv4;sbb_&nub+SG#c~ zWu@np(Me2)FEYv@0&89=Q_|!OC%$WW!7meIFR#W-l$0AZ1L0Epd^7w}WYh|`mk6#= zF;~^dIE`AO?+^)*IkSkW_qwNbQ9t+usS)R#RSkPuVZTB@DKD`e$Nx1~_hrEbvu#Gl zS@*Wy=1;!Goh^sa<3ieWHLNFOFl75sqMKsFbUm-Id2D1DWb61%C~ef2%2q_-6zxwB z#-z!B+TrSER&6O!_`bGSNf7**MLbU2roTqV84k%5jHFe%z9M8rD3)wvmwdR+=r@*A zgXRxb^}cj<&D%P+XQK+`o%oCVBqy&)3V%M&l3T;OT%OJgVq+6toTb#p=0#p`^I?s*=)8Fm;bCe^dZQFznSYBkp$ir*P8^g?NH@X=~M ze|_bXYx(GR(Y*FMbdEsA5bwD;zIU{7R1U|w^XBZ2FQH(mK<*xN-=6+--_!z0Y1!r$ zn{3&K3N)4HzLEya8ykioZ(lgnw5nSAKUve_DN0nlgAZ*>!i-NrB#C~^}$HVo=A6uKrTIK1jnH5pO3lyYN(R{SUCJw9kuT7{F%*DuSrwfh)|pEo=2ZFlg5 zU*)@y4eM#8U9FH+k&NwF!cOAZWk9jcWPVCd{?C&h1T_jd`J_S&5N%2{IAN>7L> z=30j;h+5({&O;a~c3B(pV_2~%LDR`Qv+Si}s68Z`!fc?_IKFw^PmXs|=+khnU6rPrBGHixv^tvYg~~?JMDa)x*unOo%*KnS*%!EzFO~srgm41rO?mOr61t5H8qGhOOU)p1es(C<&#%R-#G=~&fjvygKfU;9rS`DvydLd&ZdBs^Z%ry6(2K?d8K zC)_sb55fgf-H=XHDxp#MNS(`pcF$KLR^odgZL;mq^Z?h$#U?ZtbJq|8%@scMY?dD#UHVR4{Gga?*lrP|@r}2I;c(-gZ$PCazZ0pT zYon8Po2Haku@;1%5jB(eUGOK17S+`p9}b-xgf9J8_tw@BOTS@c^ypUbJNf#+^jM0; z_+u(B+Y9JlyB51=bl`FiBpqM9TRh+ACyD4f*E?vMpTP3!vUj-!sR|yCgfek$U~H2GL7H+K*~Rl&%5B^-y->5}-%XNGzY!n^U; zL?nF`vf0NNYhvDMqn`_e7!*z_IT|c*OPiaRtNswHC-Uq4xsrOAX+mxiq?LFtY0b0W zi0XaU(wPJw02hFc5d0JwtOtk_SS#Ndq=FJsOt4KTpuLf&96gs?Q_y7x%1jykO?J=q zh;fVG6SBHsiXhW_F6Nj8s&UxK}Pv`^)H`HM5Rzl z8<=is+4JX9WjBP>kPsO<9u1CAiR~E~uywl`DxEG=L}R=&gFh=iN)JWQ?OQ*tc$Z%3 zdbCml)&vzo3Xe9!#;NpCc;AB3sQNDQh-?`SvIc{W0PYULg{-$@FNiMhPpUr<;!p+k z#XNJILEuU@ehm8ZjQ-v z!cyq@$sQtG4U(8$oZI{yjPCx7EAKkhg+7*$dV>pZNP5F|7(prUbNlzy^58`WFaLej z;cf3HO}}-iw6Iwgje%-9lp)LEY;00Kc+EhBDD6aTZ#y?mj5ju22ppfUY@-jCo-b!O ze0(?d1LC7Hro#Z$m&vX0jU({bkjibD7ZVG*BZp@>D)w(B)I0_RigA^wg7E?(4$BIv zxOSgDJr3z-?}Wb0Ai{+s_^QIke@3B2BZr402ZDV-J`fcZ6-UJi35|r58a3|#C2IN; zZrr}XNVf2i`{ab~C6=o$s$WJTl`0kr4F*OA)PwGmQ7kpIxY(R6MH6LKsjdWM>=YN; z{fLzJm(a2)hiu3XJ9j>R32krk6K5o-rTZE8APdZ~84qx13DRxo4uF8es^~0|fBRLY z@aDc;AI7)TcykxJItfy7&q`OT{3Ws0!h&DM4GG8`E9JHM>g<^2V|kte@1uP3vW=is z2~v+{ZtIy9!S=2t&$Y+&I;U68@#QAC?^HHp2WBri*UQD9JD>XI*UN5>9LWA*_dFHR ztoOvHi}S1_yW`;VCom;HrDp9@-;Zxqhu=zE89ZrVy1M)t<{FYk$l?z#5mRKK-J&|i zi9a>ZoJk%G4^p%S-RZFTQ>FYSbbVD@0^YX-h_raUCa-tTFzT!Ad&wf4KPjBc>IbVi zdjBYS1U{hi>v^b_4kJz*a~B%LT`IfCP(l_hr2?MWoToy@?MVz#Ev-WpY|Ipq;6QEj za;-{WW9HZN$W{19+Hg*ihIY!=(1dYWe;p-#;v1F^ub8&so=-0@MY*$~;bDkwHftP} z_w?1{dn{qQ`3hNh^-8NgLdMejB9QvfUBrio74&A{ZcDnvUw0w6@zU9ygM>OG3$y(_ zyE_J7a`WT9CgPo!ctHLshYP+hcLwJsO6U&+=9_lCIn8YZ)6-A-aR z$r4qJD9w#;JNWRXUCH7Q#L>us!$9)FlOywI5de|>ZJ*&qI8A#^INSijBRI+;h znns@n4UynVE5-J51~ACAoL)hZb%_42-WJ@qnmxo6bWvR=WeIUeT4j_nY1JXRTx@IH z(D&&t<~~zxTIZ3mx`*KP;Rw?FHVyi}IqRZ@WCqz?2}*0YI&eI(B}7JM#qd#d=K+uC zAtn~c!puC}H8fn#dZn*H$-Ljnk@&C;vma7P3ArOtaWFiq5iqF`P?OGxq+QzV!RxKFXu9*yAJLG@VNMs&6NtE# z^;61Z{voG_nA-K6f|HbluekHdEz6vB=B<6@d&FLS-UB^?pOSvTLx(k0uk@1|ZeiS3;I2R6kgmycN4c9rG^14&h+%1ve*3ZKMudVA9I+M{hkqA6<=m$ z@PfG01V~#R#b1ODZ7H!`EC!m_W2Lf+GNue<=}#Zf%96#92EPcGj+M|5!Ivieo)t}S zUKG)DjA_mo8O%7SRx`S!m0z^}%gU%!(x#Fp)$e(EZxZhrPns#Gj>&CZ&P(l&T5Dfk zAa)gP`r>Hdnhj-HMpyRh8ClK0HnAq~QHc%Gw}CD_?uK@v?}VQw$S)3h%xO(E1u#Ue z19OvrfBHBDMds^QV>u%_ZgiQC?p zaVi&T;of{^lJO(Y%&p=62|D71X4YE-2>x4Awv}4C(Umz>b?Z#3fz8CpQdsrY*9$n3 zqCZ!9hbEsq-PrnoKVea?Y;IVANkiv|Oy?+u!6rsmAx5XFUr$RI=-boQR%Cp_I@uJJ zh(bJOutZ%MGmvXphl1==U(XE+_jZGWiKVMF=1h&rU3Q*H zF2-p_nEv#wS=V^*CsdD7M9Z{lnosIa9>Nib--@4-$3;ZjGVKozSPZ}m&$Rz89_;!< zHuvIl_&X(9gR!08T_O#BwBn@Bs2I*BDUEP2QzfLI()^wYs(jnu*ol7ALBExv@%KaO z+`X=s?!7ogB{LX4WiiJ#V!nL+pk*fTEfs;RQ?%S&bmX3RA@2H(%~`FE_g)!29Kx2x z97BgoLdogP`U>|e^Itz-TWJM&77gegafVCBS+RMrk5B~O?A<)3lFMZCHG(6H`*{B3 zxp2qxk6EJfW)upeqZC6Q;Dexc-yj{TdXvbiCuzkK?}Y*{4tlu{Js2}7$uRRgljiP( z(*z4OGk@n{PqC)1roKXzN>eDjz(1;;syBMHK+JlTJ97~-jRC{*i&VfP4186f*7$3# z!2AY@%7Cd*-gnx)DNWAJB0A|SkCUSF3u*sn*baSC$`tj78TV?hMJ31~7#h0;f&I0A zGe2*UV8+itjEk{c`_S4^o*=CD&0q6eO?9blNw>cJ)wwa1s%E{y#gMu(=cO;eD;P(gkkqYuV&>FwcAW3=i&IEeA@PLY2 zgc}Mp{PSjsofjpvBOZZ2DlslhW(+t172HBLl`O{PM0Xx8vf*Dm9L>*9CA_$?zQ5eY z(Zq1iz*94m_{?>h-z4v~_`BH2EY2Fp6jZ9`dwtsp{YlBFLkT^5qyO|_BlOt~II#C9 z#N5OZo{|gv29(~Uby>=X&116I=S^ZHW6Io4Hm-qEC6KaA{G0PwVmV!=5B^`jSPUF# z(78&P>AQ*0WjLUGB^)NI57QAGTeosA}X+36$>iCrAHJj#@ zD2JJ1n#g)GHxX~^v}7=O9@^bdq3>~r6-9Y4ANmZ!Cpfvud8aO+etl?<7!x4DPCVcZ z6Y>=puC|ygvc9=Ehy#XxiIDFP+u;^CdY$JlUp?%CWWg(3S{X-r28My|p`m8v7ELE% z<{AQyDYU@H-0w60oNcooTKsNGKKYhrBS`&pS!(T7!L?lvnUnSH4LfIKvH6&uvY2_W zvI#0=wou3Iz7A(boO3YQOCmBYZj}O7Am=GyMk!?L$Jt%s&6QeU_RR((> zQrOPb@OyGxw`^tfYSn$B?Yzz%<9*`Y{Q1SqwA_1LrFeY@-E7dxa}AD6c9mI zGdbWIsKF%sj_LlCX0gKbg#2a9^u;c5fJPGZrPz4jZr|^1p++C-FImx&-bcz2qo~;8 z6pp<@)C)XWllb=eNeBJ(*2pX+m{!*Lfy zJvFRjzYTdMWh-eDC+4JJ=!cBEzdiTXFP~{T z`#vjyZuwxu{?#Z#x_mm=gNS%7)-)o5L{>HbjQ*bL@HIB<6TwUantM3eC#RhWD$W<7 zT5Od%f$A@y3}l*og5Hgp;SGMxJO`^N$cg%=e+FyhYh2G?DNe)dcShMxc~8>Df2@)vNSEO&5^>SkUV_^bi)DPuoSKLP689Gsl3`X~IE)Qb`>0%r4izes@u2JUJ(uWiF{u z+?Pf54JmgpzHA8-2P;LC_x>Cw(Z*7Wk15gtnYVl;j=i+r0SLwhttc}G?uiFxbMCfBGQ*C)r9GL8{r)|B=BTx-AUlm z(y(J&UG;2T(4eWmJ?shwd|=9Sp<3)@VU+y-tuB;O`+ zI2(#6Pss8SCu@s9s3Rf%4Lm4e=GCM7_MM674%=8>7N?o3`O0_Q7tRrs#fsQjgNQK` zh*<5oq^AHIxylmd)eQ5Wk{%DlIQoIz96+S3?WqFK*ntXS+eU_wTR3Q`N<*{TE z6^@K6q#fmkl+T8Qy{TArfN4FV&4 z%M^{Ge)$$MOCbBbU#uP5IiX;aZN1|~AAkJ)RkzMNn!}0p>g|L@tiSJH7WP;`;YJDOa^aKZeG5cZa7@MSL3QI(+Q2iOa=HX5upcrXx`LV)S(>vsdW{73GMd|4G0Y{cW3KoC+Z?Q}NOB93jSf6%L3 z@T3YlELgc`zq!kHF09pAMLbQ@9_Kk z9SSx*8H;Jj%}nt^=LJ9cCn-vJJ++4UcIa|)l^FZ<0)KJ_qSzUYCO;S$HkU?o7SV^^ z%gc`#p`Zk{4JLC}6MPYol9zux)YsRyvb$^9-`hJ1FdKI;bGE&jo_WNKoqV+fZCHO0+z#1po$cCUl|^XJbM02XjP-Fhr3DS0?+lgrMD$ZWlb zyOL@+0RcX0^LKmdOQ5YeTRA~tQHd{0h&yO+g%Pk~msGdAHBJ1n>H^Io_wA>Lg+wh~ zJvCEDnwRXzFBRR_@Sm>ASkg0+@qWq-a#83PGoTJ?-~GK#t688Xi(A}OpZH8catsH< z?fr)uqv4l$+}fvHqjbFc06bS3e{i$Dxm8PMFthzFvNJKHUVupFX%CM>)EkcBe+(6_@#R_V^|F=73Zsb5C^>4peAhsIlZ!%$NI zra%bPYlCBp>oN2NpdCt~_XdG_D*)wTHB<4Y6d0+KrYzH^AsU$Xt;x=@rfR+sR8#TZ zb|G*u^g+)eB-=~x3nJlg%?}!QD%(7j%;rZC39)JsPPB(gkk-TX+>IKn^VdRKS^b;I z4HiUCI(iHzq;Ts-bT7Wt;$o$I<$w$fAm*`PNt^2U-(&*aoYy|~BS246?8j^@$SeHH z>9}^dQdIoNj$pDV)Lk31s^60ROjBw(R4`RXJuWFDT=db2-k7-)ypKYqI`4O!$R6ge zkeM0u$EtkVv$`|Try~c8bmqR388cjUDr@p`F8O-ylD=WBjGE#s>G01aod!FmC5W3B zwi`QU9C8>jNalxJ?QxBR$%e=y)kP1V!G1}(||D) z)wFv*j4+J*Ngpeyw%ceRJBDfGyFMYu<3JQ~G;B=59K08qG@NR9#4DftIjjV$xoAT@ zC%Ep8mfW(wNLx< zn1R~FGapvV4546G9&Kkek&rRP@)HjaUTu%Y>FkI&vZ9we%AQh%%Y7XOr#nZ}&;&vd z9kJ78c>Tu116%zOiDyWst^Xi~4#tEfCCD>D)^HBC{{XGlfi6k`wo}D_n^|n*w@(&=rR6ABrEh zOe33}CigL^*|(cHY_tivZ7~zn)R&Zl=k(*535rqX3ew=B4-N_AX3zs}JvA*)xfe;x z!-qEhNBRGG349)S-$`?)!D>fZ*C!z$Soaitz1VldR37{VBpNi3;5m^hWQhLfg@9x9 z95$j9XHtd#zPSFFL5GL65rJL(Kkt@%SsbXT_;jAjd6zJE%jNF{673(70Td*z^14ec~aK@T0VCJk}2ofE5F>7hxk};?QY{yo0lI} zL;eh_{O?Yp%y!s;wtH|83FFlJ#h2BLDrU^&Cfev;W=TJ#o9} z|89?tO%3<;?M|sd7b>sVKfisia%<7}{whqq9QwBl-6M!sL-@s?$-JCJ77+hmPtxBV zop!gQtTx*#o_G}IL%E$5H@0|H(tPeaS89U9G91WSk->1^hX9?^4?==0M=zahw-AUM}~)53wJ1`)`lmQ+n!!n8!R|X8f;n$A`(Qa+I%R|JUf+6nKLf z9k3SA(C??6F97REGqWrBKX>2zK>MJ~bj*>?uG<1b7I?}#{%=1JK)25tQ8$Tbr;}5R z|LNujjQdb+|BJ67|Fp2sRq7%3Ib~DHi#Bqm8?L3Y)j{=Q<{5#$+|NqAO5r1MyG?v%@O$7+d z1^oZJ;yY&b6dtmJ4_`#eWGEwU`&W;=VN2@2nWB3PKYDq3l3iY28X_SgCfPbhdyfkE z7r`!zO`%V4o|F;qS330Vh<)~8d~i!gENvLK%)1L+e%K6$?IkAnV~fBFV)0oh-p>5` zEq&6Kh$XP^+Z&+4N!uCKN6LOR+lUM{bLqtM3YX6O^p_(Pvk zrhS+l74>J_6Meb++&?c0XNL>*=z7QJ6lt9cVQO=2%`vfSl@x)wV)vT3cl9U?m~r#S zCB?fAO!mp%*w3G}R2$8bU)|i~3keJV20zdvOia&7?KioQ;&okf^TR!;Td%+(<%%B5 zQ`*tno2jh+ERw!o5u5?m$!2~8IC|s~uD5UBCg41gM*R{N8XAgRg4Oawkxa;Q+snn} z;tGR+acpyABeJbcDDvAk0q-PMzrEE?sz*Fpl}$}e5>Dom3*-I1tOx?a9&D*CN|X_r zsjMbp*T?HnpE=m4jMbErqoOkSJkAU1z`=q!EEQA(3!J=Jyj-T7KE=E0#3o4fY_?nN zyikjM0qBaXupA}a0h3&$&xxF^Ml}e>3>x@2WzJkgjKZBErl8c5G=Q+<%X|C&y{b0~n9P``#=2ZPiPx29y{{7F`$>7~t0mvkB?phq6c z&MUqr(#B{+N6x5+O$N3%lLRH`dr^_7V*#zldUtA(ehr;Org_YW9H zIdOxZNN4J}qF2Wmg+>ej3p3^vlXvH8PeR`qbc%!%vC`B5Ad@^y2H1mi*C9+zpOKl% z5^$GiN)5!_0L=ys9i0*a@xd2Bmfs&o$hv7fILQJ&((MoR7oM8%uNUhPj7@{aI^?PP zfaxUa>Mq?GEVG{o(1Y?F9UZy2xVYmdn?ouW04PNI)N83<~P{1PUP3j*pMKK_x`@7hKwI;Bu&e-dtyIgah+;Py{5mbOE-IPO~@f zjOAPLL`dqVX;jZsuidHAEl?CF0)!m6XH40|o`rUr`nBQ!y~4YXU?fLOM3ggs2q$ zU=SYP-yG}!;$Pl(@bVjW_L%h}R}%}lLFmOg%?`*bUy}eptUuG`ChDf9Tg7MFjSZd5&v&nKwd2x`dNni#uhx`Pdqwh8~}7$SzU#Mm5VebRAXPb zbvb`?kQP{J{`%Y>C$hv8opTbA+U@S0A*jqz&sF3q3y#{E$Wx+=k;(pOGhHUi5F=>= zZ;Gy=Lj6&B!sYLiHMkt4xPxe_IqYPwL6;bQiz2EgaIm05mO8PClC{x}K)?Z(Vw8H6 z_{IR4!XF2M9zKBjUoJ2m``=4RC0V>p-0b}ItKVuYXQV*z%!`|Z_{#nJN@9LiNfb6GKCuw}7t`3`mAi(a}%sua1pY zc6L09xTML+Q*S_xp5a|Mf27{Pv#27*u*}4KDzm-k6Krsh`sA4De3KV9u>hOT*2>Dt ze||o$unQ%M+Fh*Thz%oqjo%09|)&?qrIo1 z3Q+S!xiF3*k`oXDg!G>J{4x5;lMYHv)rC<1046NHfXMVsYIJ--lXGkoE+Jvgt8hcO zOI~J(Sq_(&SQ0GBUz(en^Q2~r&S`9Z$#1{phcYFv8IXpEzzc$#vdm=IGkcL!AB%~|NZ`4t+4rI z5vf|o1$iSVwps?B;jwOC*9w9uwr-XPzJYnS2SSg^afIGa7HOT( zJ#nzJ`;++nJBLc~J3cFUXI_h?wNO8hxvRDs zIIus(rro@@ieWQ;aeps5Se2b^QUsWQuoMpvxPJ_`rmx#<0QF@Iu~5!k8_%m#n{|-r z^OZ+^m$jq_Z%Pz{kgr@{&SG$|?lFXihY!UABq+a8h2)11bZqL9SuB6M9t9aW#eF)z zsS)Q(x9QCWkL`4_ON+VEnwc< z4=OH+-XGcax>y42T|X}O7N)=)*lgNfe2As@vtmT0@eiqXmvnXc`y*82noqA^p$8)I z7+@edz`ciEDxQk^e`5sat=-+-KIP@CNy*6|rUNI0N{`5l+oH=NnEhLD=*gBUB#^7z z-qnRd6O}9YV%_HGeAeb2DjM3W+m#R|d)>a6X&&d@DOO-0czjkbWCTR5-|uV|8kk_I zzkdC4Q7+aF{rnkK@o3m=p&58`09f&Gz+kqDPg+IgrCRF*`0Q$Mk@3> zf~&OZog1~Ay}cM=nVFe9dC>cBdf&yIw#R&1bp=4U0pOre#7#_oZ9H{z(P?VB>=QP* zq?!q=@w#@WZLf}y7nHthXbhz(mld-19s~tLz5?Im6%`RPMo^PwP_h)htgPt&J>;OJ zMS=Hyp3C(pJ2LXaD-|Xd5ASQNNAxe2_H@t|mYqyZ>3{ab4kX1{;%(=TDY$I z+euIjS;kzPa(;KhSu5RskmXBlo*Wopc+wICGlcOuIyi)^om>gS=n+dY0y{39fw{p7 zNTpdW`*W=XkdCJ>KrgO>%ybJ_iBalR%l!NuVNm-Ok^n!<3w-J1i@9_IqCWzNG!+E}9I&qrFD`=A3&qULUIk(jt?aI?u|+Dc0*Cp)vMl9@@}c6h za=(m*J@*e;7KXU0<~&W?UD8mL`_cAri7Pn$LyqMwyVR?# z_lQYJ=jExNcqvLypu+yP#q=~0IJmQQazg4Wle0J*R)vdMKn)OrQ<|=t(fuTr;da}M zH|zys@d1Fx$k;tFaEB#u^7-@U)_mo{Ht>{Zcb}fsF>R093;v!HcksI+#9o3%!A?C4 z3=(EcT-Tsm62b{&P=O1b_d$)pK~`xmSD24QhGh!i-ds>pcw2x)zJ20U+Y&_7Zn4;U%;7C zTy%6no=m%J|IO}=nE}zl-J&ly0bC*aaIT&!PN)v~n%>^MU)$+d%s620g=3(ien!So zj3J|_`q;f}o5G&9WXtgy=Ef3F4=CbqqS}|&9t*J*XTH#be9<%+pGW(&7u%Z+RkyXb zyBHZ8pG(Nd?3b92=OO8raySE<3Ih~uaT|gc(6F%=k(TBYJRx1(rRZ9RO?@!W{*K8{ zpFUNbYz%0i>0mGanMo21#2zTT~r}TY2w&fJ(LusXUlV0AW}t*~Igji3wXz zPtVrQ&KImjpzCy5;(y5H{wRfq)LAhCgnT30JWUIIIz~uAv(3HH z_^P!v^7BMiU7KM$j2j(}kL~R1L)=EJF6T;L$CzILWhoiJaF^DSlY@c8DsVKlI&0Ic z1gy~Acf_HPc>eFovdkC=RE)nmKk}f7T?&-m3rY|>C)JX-No z5IC5nAeRHrW~QQt$Ef#dJE*3<;z}O0So!tk76S8$5WtNMK~ihsRBNl=R>)JpmZy6A z_PidXwf5*HTCc5w+!s-58k%4gu-=1eJiWyxFG3zy=ASaj!C(j~zo2~tz8qX!x>z}mp1(YL_l5S7HBhNZ;BuM}RtP~Lm z>6J81RHeKv^XAUgA}U`JTWgkT$c-2A6%bNe@^%)yhN#$s^SOR%1yAUP5ZcCj<$}FPwyvh3EC_ZQ+a&RUPUlFM8IG@ysjh)T27q?QfoW zTGaP`kbKS7bV&PXG+1$3cx=gdQ5TizofMR=*S~(_I)9omVNienBm_Uim@RsLp03#W>&49&LWs zto#^B6Bw}Fbgy1c1EEf}Te&a z^{G4-DuACgEs|}A+S>tkfdL2!MEq39O=9uBy~F^`xBP;Z_F}ri>|-j(v3T;6y4_v0 zPu%ZwuGPdOS{MnlE(}DBO6^v~3RFwmZd*~vsf$!g)1?IkTWw-?n}rzTQte$_9!k{8 zjbDQa0&JqSwY8Rk`D6pQ?2PP?J{$29MV5tJep_BTsJhow*@N$5K21x*`Ofs59z~NA z(fC&Ln>5DZ(f8#r_ja3kHkZ+bFUqg0>0)}l*c()@fkkLH2@VaZbr`k$jY2J26*RvJ z`QeEoV?<|R+dg=c%+2$DOGrR()DFMAbZuL=4_77_dA0dvU#Rvy_3Mq3t1BL|VrouK zwT#IfsCC)aP&r>oUtG-sB$`S2S+R^z<)x>`=y}%o1noQV%q@OrJt7T<@iV#E>qlN? z|5gb(4eUj+fN>}*C>(Q8)`Bq?4)!x{tQO;`iFq!%xW38emVtLB5BGPh-~{p!z(lzo zD}E87MD_sy-j(~in?1SM;*PT2BH$NnLu}9d{r#!QIcx<`TWkPJj8wT$JpjZ{o`U+I zN|bN#KUzV~g0KILObDtFFqg5je0k)Wx$d<7&%) z!;oY6$>}5lQ7oy-WZ*85d|ZsufgPSIE+X>1ysYdmM)Z9;+D z@~JpzwwNL7@~MCow=?|;U|{0{ws2>x*TEDR^SMJwoEaPTwOzW2Gih^jP29Fi0sww4 zhk}9<*AiQ!L)2amDjnUA*Cg~S)l(BQa!N|RfnZ0ZOfpvwT*JwXMX{(>qdR*ZSh{ZV z=}JJTq<|Y3ppwvs4WdDdh;q&x6#c?QZ?2cL4*l@lEY!Hzwg$MvUif}IN%ow=V)pcY#_tq>7D=jhELwa(r~e2^NVIQ`m?m z<2w*>5X)E0%K*6|7JhzyCTtcHmWn`e$KxDGYIjoKy_P@ikAJ0z~JuYiyUJs2;)j0I!@Fgj28{Jqj%{6U-_iQ<3|eO8#iPj z&Fl*?_LU54fhPb|BRC{%M>==HOrJgLSn5sCk2&m&=gV-I{C)#}oP7(?_%XkA-EXt; zYV-KG-oJ%~7w>u&-tNTFU*i(|UE8t$Z~SVZPU#mZe>c=&`SZc{wvG-pqgpSG$!s;| z^59^3X)sxM0YCn{bTltn&@O?pr{_R}$P`5f6P^PAstZZt`Kkf?fKKvM-^b^4`5olHTs+(O-jpsnbl}~c{I9y`xA`)gtgLhkCEotq+Gg5_1ga6!F*hlA;+)Djve}nUa7r5HpqNbvR;amljlRr?fOrD)=$Jw ziq^V4-7UI1MK+EWKW&VgU==TIz z`OTVpa30H{H*|`4(Uc7~KD-}tF%fjBB|siNkXFBczb*Gj8UtGguss8rRs%q+Y*4+L zSAvs?k56U|pU6tw**&n6Ezb(y{*&rSAU``uB-w3VtAD5XqzM_}H*0-ofU3jV45_U> z8^j@D5+AE{n9cx&-72&Vm*!`6pfpH2AoL%Py=X@HzJ{5{(ogJs6FT4BKEyyqL4!S? zwfw_PP%*Yw2foYsyIFXZJC`F>=Pw-C*pa_Z&he?#qSXYQ|Fm*G$}GtM_4Y5V*t_l^ z8u|^8>4)6G6=xZRszzg$$gr@x8-P@MMr578UOBp(_ih$~dNl z?0$54`QB4Lkx3dFn)?W(Fm{Uw3+EM;mUaMLefb!GpZmipBy0Wo89~+D-OX8D;I)5) zTj;T1*R3y;t8eym7hw0X)se%k$G_!nfq%R9FmKhNH>Ie!c+_)kgh%bsBixX;Z<(^5 zBr(E}a{4ZVL;-_uu6_ixF6&C@u@I0{4FVKg@2`@jk*C6TMQL&PwfS;Y3Ni}oA9Do?7R4;B7A@QephQxVrN=w6Ji)5}K9p??943jd;i+Ah6drY=oTs&99vL zZsFiS*R$X}ZS$A}79#_Lw20f9Hk^{ifI1k>WO8*}FmJ!5lUf&qzT^ldX)EzrbXwuirxg_y9l>F_ z$a9TvXkdU3!Y(WCYoE{j8?(!7H#;AytF zHIsoR)GrA+mrsNl0j;=)GFwc4c6N5J6~Ds6hdi?j{p$HFLhtgYX=;1t0@@mfZah3_ zG$~HCbcu4`p?3Sl#Hu0cv&Zxg6vQc9+C|3wfGiv(Cnx{jTOD@#+shE4&q;S>rX7)y z61dJ34P7_P-?be@czgM~VmlV}L(@G-WpP+TO_v8~8$Yv4`-PzE9EExvg)!aTvjil0&&RQ!f#1p7!U(s`PjoJU8s0q)+L{+nf z&Y@T!lyLRzaO>I2l#~=vR@UWfvZ@8B{og-9(1D9aiqJ}Uk)kYS&6mnyTYq71Ys(H0 z-VT~A2C6v!Y!ihOJhzVDqDR?l6t9r4sa5rJQD!M_Zk0`V!`GiH&neWREjg&@72G#6n&#T`^8F155<#hU z-oyI)|GbY64?j=~J2sHg&?rIGWbW$b#@XoLTjtktv)Pw34>l^Q zPa=js>#;#y25j^4$59{c-b9s8_dLo6m`8!bR@uw`Os){G`XBQO&(G@K(gnbWufZz0>}7v%J}w>96Y6 z1!wZP%$6z=RKY^_=nw1JGDlr@T|{KooXpJ4&8_;AfQ{P-%)>3xWj5ZM%zx=)0IRNa!?E_gNEGC#7YlvZ3gCBm7;s<&*`7gp#8=z2Hy(_Yw-d4MId_3YzkpdiM{n!V14aBJ(PjvB8~K zW~}4&i_}j7nSafjM0+1%TN~`H*)@s&?n-!iMQ7luxQCT#)knSmY$IX4$ClU}9sb4t z-Bz-K27Xu*>6YW=CKRsR5d7IMM5g_p2NC|L$9sXrp1Go$8R2A$keE|FLoP4b|7=HD zK|9FXQik=5jffYBjdo`aY*GLDUH|!(3rlIe?+uqH*nj?*ac9^ZoF2xA8(Pn3an=0< zMB8Un19!MS;vM7SyJnkOIBR}P!`;A+;h09&jfWM`xPQYk>6G*dV5RoQ`D;cpwwI8q~XQi z?1lB^?b(t~()_jl{98Gc^-atc38MST#`bS@-ga%m)!l8~#z#O%ry*}`Vge5-F8+rPUluAob&>t=pm`#NCfSLCNX+>uXjvaWE=;)g`YKj_`}umCveMq* z&R#`0#>Zz3+ELmQpIR*3F;N+Yh=GQopC_qfb7IA(aVZDga|C49(g|+%0{mX|j-6Tk zg3E#8?}2=;-J%?XD0={;Y*V0{#7X&Bd#n@m(mYv3Do~GG#1Ccg;D4@JM-eB z0H3z#QWCoN9Px(wcF z;0`7`TB8@%SMc&NNP@B8E#k(xDP?tP0#Y2EDI$BT=jt%XUY zB%GDU`=|C5!NFG%T1lUgZ&fC5v*uBm?UX-%sE!cby$_d&TuaCwZw36!t-0HVOk4! zc+ExGUO#QpnbT6^K>u#%#CFa`C`lwgU0+wZhV9x7D}IDhzuu1q%8drlGVoY-Q+MTN zHjN2Ce#I0xn$EAY*5TXF&%_#{p`#NrGNS$A!w3J4g&$pA_z)>>{Qmv>wc~xd+c=c` zJov=Z&aX`#t+e0z0k698yS!hsPHB@}BFl9!OX|ZX#lVNY$!XQ#69R1B2@vKJpqe8g zU<9cMt=$^W_p<9V{oSQS%+Js{Wau}t(?2?&2u*l59JiPB7H1qD6%|#h885%XRHAON zX%IN0i7t`_hSZh>b{-n+<=K0CzV4OwoDzff={vOE^8`YzZ;Wqmq&x4HST|Y4Fu&wK+8*lBe@b^vGjh+wtNk?9{aW z<0m(bUn^8IW^BoKN#n^a^9@TLEdJR|xzYH>_e2}$hRZuT8H(-Adin}!vR#?abFgPi zPJVvecKXuJ-G>rCqwfvWr1XMGkGI#|#jH7*v{NH!FaBuDLp)K~ z2^};gFbe`?;Ef+x)p`q!q(;|9T@-p#E7cgRRrkey5#t*-ZVyr=WpyV8E2ZRFsaWYe zh`lU|$SW)cZ_c41eSLj@26LHFg#Pw|&c7O)oW7`a$*l`3pb}7J0==IBdhrU9k+z?% zQ=0PLkQjv1n=1vF+&9u$;|p_Zry|)+jmfAoW_lvrAWT3j{s8`ao1gy!OlVJm%$wIh zlfL7#?0yFb=X(Idws)7+pohg3M|&ud$c|o=fJ9Ez9sZ^9)eegiBO~%R$1AfPE=byH zjknP|?73{n&hfsqt%2Lm9odpr8N~H|W*3>S_|sxW|c!i3-5{JcM?n zb*3?(4Jz=~Uv!8fDK6$LKyC0dEjO{TA26ye0yFi{0MO9SfDI*zxxWR8S0{4so(f$S z%8HJV5TdrU6o7Xec8T^_c9&-vxR*DXo5@e-Q$9YX(}y&tJd3fyq#RzN1&vKV$Dhxp5iQ zMv1p+MlIwD5u@S*318{@h;tM*yh0=mhZ!$O)s1ck1Rw#dD5+sB?Jm>&=`w2)HCX3# zeurtc6CZhkz4!k{jr|@_lkRg37=4ZBQ4<6*ml9APy$K7uAAFsLKDv#bEQ|rZVjf*` z?@$eD>*!oE-|x|B9Zc@mFp-#`E)QLi2HV27H1m)=X65beJu*5f%}#cUl@&)fpA3_kyEDp9<60}bE_$p7;`HoB9CT3t{ME?~@_Y2fT zPRF~}59HlgJ-n9GIO|$vOXy564Df4V??U9-mq@o-9k9LJs4_#0DV?%gNrqoq@;O+Tjo!3&wd zO@_@&Ud+=Yuo87UBH!|6(M$(d{U0q&&2$htWPfRHCc~Qf1@o7dE$H+>`@A5*N0d(6W(}wQe4;{8@W3>?$Ar9 zCJa22%jj!0EuL9e2!ehzqojnG`ubH=syf03_Yd}4e=xz2Wk1=D0f+zR50CD!gvvNN7M;C(^Jc5}d3}+h^^PNLZ`ts3B>2Vp@8$k~ zV(#eVoceD--x~3wwe{|ehJfR@N|=kjhW8uZg@>bPR8%q)zFX>!jlx}!43CU-A1N^p zvz_>=x`WEIQKZSg{r)ZRE5a^|*LYK;E?QAvsrH&%OkWV-;{E^`-n*ozt*F`I7d}U+ zS4g?Dv+06@gEx{v2d0f&8=!eD$3cDmbIbQS5Dc_ zh}{vVD+?GfwYp z3YHMRQd3hC#*G^{(D1hxnH6r;C!9=0+_g-IpcJ62fchH(2?EsFg6`4(Co7}2wr#QN z6T^oJo>dt`HF2J67;qS!p8AM;ZeO{aG5}l9`gDC{NeS=Av{IEc%}R5MFPc$shf-Bo za)JQCK7|a_ryL~jzF;M074eu*;dpp*Pe`5mq@VQca_iuJpl#Jcf{6%ae zpq*zAY7}A5?c2`0ys_rL8I5`UUv>WeZ9Y3YO9A{4%j@N#k>eN3{VmgGyt6nV)e<3c+?%RJya}= zF8i%8+0~8beL2LM0!D{1y}W8ZDAb6p;5TvFZ~E(xUpCLjcS);~9{Tu|7v-=PJ+C9j z4YI(YK(Ra&8Gp7|%?IB{pqq~sNVw_YbGfZ`bl`!O#-Mudw;8K2(zow-YkvCk0q8n` z&I4zk3TSUKpW>A3+U;w)Mz=M$x3~X@lsbQtp3aEkqRG!~))<@yJLiK34`x785+N!D zK-xW5SN>eB>AGr853fc2&E3xB!OD$-XlCUSz_Fr|liz}T?y`0xG#!y@yTFwn4&8AJ|~V+i2y(XXF%`&La3}a-rAdP zVSP@P?FM=A4zmjPba?xn&AlC3W5u~Xc62|PwJ@Hr7>;DW4`(P{s z)O#Z%3JvpH#m)B%)!*3JLcI<*XY~N~%&GW_?5IyW|up6yrL#Y zSj+ZA?j6zBWl6UWH@eQs*+T3@XT1P|e@IbLY}qX)8#@PKF2aa4w?dJtVk1 zR^;rbF@`E=Aido|RN(03vKq2xTY9B)%j=5b@+X{+7ucyKC1TKdPI~RFU|I@QM&y^2 za*00=Oo{C?{^kWThdNM;w*WORDEcKciNnJ#et^i)cI96!9QVt@$hkN)zk^;ZHgY}= zyuSPB2gB6U?kc1LbPblV2+@C@;%E-t2whQ9iii$!F2lSmYsw7y$O=(lNk&cxXg%5% zoT)PUM(E=*Z7s9|DZVstn<7rLzFTp9uX-r)I`c31=N6J(rk>rw0K2p`h4R(bWwF z2%nLO2@8s|OTAgt`}gPpjVQ>MBb0GGJ=}VFUuSfNk-mqQc}0#SKCduZJpoz%JM(Vx z0n_Tq@d5D+0I13)+!Sz1n`@<{knvDl$_?=0;s$w_T2P6j{TlA@K!2M&HAR(kx&#TE85Wy$jA-8tI#lh9@*X6|Q)b zh5?c%puLw=>7=Y@ZwKohpx~XjlEU7my$G0r51#SqCg#;vPT@B2ORExP&boZh~peTmf^I+0FKQBKY7N5$~r>{CY6(L)QK~PZh zj+RxL^WPK$nxZnYZYe@UtUJLeS071Casm0^XLydGt-_LZ+QQ;=oWgCzyodWz!^m%M zFr4U?Tq;+S5AtM~~YhrTFLeS+Z~53#OMG`P9DUuC!g`ilGN>L2W3 zk7~!wG6}7YL)e9wQ^q(_(Hkf$6BCnm7P}253w%%9@87>~U98ezSnte4hZ^#8QQ$RQ zyX~`#v74yvOT9+ zbisOZcqDeyC!|!w6Q|=9)?05$vsS`!a8~HN_}lvuYFjuQ;W3H?wg05D)S0>=1C74( zfwNhBeAV?qX_6mL3khlpK2>D){GmSYQiTu0g1?(x-%a<>|`5f`$ZtoyDk*hc=?H%38lF)SW zK_1jDbg|SR+eE%9HGt%@UUz?es(nXXKilJ*39Y$YdPFWwMdAJbM!OY{J3x1J%^9R zUfUn5q@l|!<@-qB!%mTCNL%6gyJh#%e~i9!klJti z^*Gk&n_E}H6Vu{vS>48)0`ZFeZ6Ea0o*FQSPTDCMw_4OS$A3(U>-|~SxqcM&#M^Dd z&=KwpGF>)lm~oWz<0se8#EM~dH5~n5eZN}Cfy_I@Y4OT*Oar!hdgH!O6D=I94iiAz zEej7JEbe>Q($MpOWi1fqeBBYk9O7@zLgUX5v*dhW3zF%FDHqEt?-b%gE}F zc21~)rISzP<)*tVW5Z&2Y@?C&C!25BBxW$!gu-)WOC);b8KCAyIwifv1x;ET121{4 z_)|{VD6AtUgVu)Ig_zh)aW=1DDRKXa^pAEi+J2#XqS_@m=ox)BxZxan_hl}^!c`x- zy{((%HhL}VTbfth)V|`qBk%EZQOkh2S@+$g3ra&$GTN*3ZeefTM5$;b&YK7%DdyMa z=Kjsh7~7be%TCvLO8g9F|8Fn>Uzdu`k%pLY&t0460lg@4Ju{06TA}B^#Y0WL50i2? z8y~jdjcBIaSyfv4BGyxdY}|cJrrp5q@>6cV!z(YKvFQ5NR(bf5Tx4cBsccN++@bwt zmFuD!v$6U6;(*|w6zG}@=|uLL30cc!<^K{i4eZ>poX{zhnlvM^jsMHhq~dDS=?D~) zcr1Tci(|9vw0|X}TEX*wS)J2DN8BxB+}z83em}>4^Y~3PnyDewG>-geTOWyPU zhZ{<{zNE#NyNGx17DnuUh|N)7{z{x&T7MqK)n0Ig8l;Wp_kPvLWEWf&iR7pj zw8ZlL^7$0WmoKM5{j~HyV$PJl9S|bXS)2#C%5wI$kElzA&nB@?O4P5V2I0 zJ)dnQr=T=iTmAJkMbv!=qb#}0UOHaUFqMS?(;r55hJG11#A+I7xpze6IJWGM5{z83 z=ch1(Iji}xM-&ou~hhya`iu%VVF={=KxVA7xeT~%3x5r0;1X(rn zsX_m;Yf3!>7lv`7Hv78LfUAQHwk&p)zM-KXPJ;=`ftXdAKIYLd?C?tZbv~X^wY9!s zvPc-&Br7N9d2vyZ;~mK5TvvWwsmLS-SPW>lb!yQr?GPoJxdQDA+YeF60`HZtq=vz7 z2iy(9Z!)HHPs1Ytqk8s2)PUOm6G|OP6ESV!R&35KUdKyai=;oxeZ!8T=Rc*r!&Ls2 z%rIYX$l&8Ec@Fa~GF@LUQ35JSq(%xKrF#}{5?Ami`7q$qfDicHhHo)4+6qwOgM84J zo{7og)6;By!;PT(w$*=2IhKM*WikAJoAEv}s_|GnVVONnZEmJo9efyPpTM$DP2+Vt zUJXZz>k0uC-}Ao-0%;!)_nVnQLSoRhR@Lo`b^kouV4BSP2JsJ&u&?vxUKlt7j$&Gqnd)SOmon?2dW&aRg8_U&eS zP-aa46-^A#+X}EhZ=se?s0K@%)1ypha}ezqevG=`*WS+d_KUTUOW%{>qUL9Pk>5W*Uz zaD^-^sK5Vd9K5O@D6pP_G@sOlKVcR%N9C0K{ZVE=tF7Spv@!QLbW{^J*RGc@WLHI^ z9M6=P-$X|b41=uAA%>S6k&cXjqD#Z}ZNfOxEC-biR-WI#@vaT?oD zj*DwO^I|VbYT1dle{LO}7I@_s{M~I?yAwgA0afdgt({#E&?=q~06&dSC20E(OrW*{ z{r&G^VuGNi2`w!xU26IDYr6M&`3v2O_V&=q0&PLY2aHa}AxPj*(fg6cj%tqYt~9S3 z?@!A<+OFmF{xLk^y~VhwR%}pOjw?GL+GCfy_*cZ|_v5G=#KfUl4g+WXmY^PTmpF{>`{7};WUaT*Uy|3$TTW*$s5F`E^NHIOwqojcH@FsFENm-uX>iWkVezu-g*StT^)`D zBRU@gFR$|tP&Vz{z-{rVd34Qy!0R&KW##l}=T&?AqvoGK(*X_u36Z_M{UzE4j#IN? zaKL@dQcl6b_+~3-Af}Mne;2yZMd0{iA3c01Z49QwOL!9Si9euYANBqbh$FP%jCd-e zobWfxA=$`VK7w+g#P7_@22g!4cP+J>@lNNQCv%&iyN?u^bVE}-<^_-T9p@?^O8@G; zoFT1O+AO4uQc`p<&9tG$bEmq{qza>SGSQ3PoWMi_O9%aknWSbF)aysCb&~Di51QEtoWH&3JF-&|U*0 z){-Y+?l9bhz>Yp!n2OHH7Mh@^n+1VW@Sj&9Tv%wKe!$r&4kP# zeQ#C-0e?N}fgZ|UkS zZtQ!#FIw6cRAQ~UJ?GdJ>)6{iAiK&B>P@$o0;>iKy^K%6|fLWgNg%OAkh(VAy%vWE7(CleuKFw z7=*qIoSfGU4GoLR%P~K7y*4ZiewzIN`XgupVLaK1Ow6N&!3JVNW$?xrRXMjvKwk?T z`fJF)h9?nq2^D{H`$q}>$X9?Ont=CNhb^X^+#mVEDI+FUJps$Z92`RGIqGbpQc@{2 zR8%%BckhzK#m1K0z{S+dR_6t8xzYf?e7+E5*=7}nUj_$#|d#LpE^i3F~ zJr`%>_Yz+7I-O)Vn4#v|qM6|m+ynn3rKtSo{{9os!_73I;HK>MRqYrq0!&N<(_??_ zreTc-8XX-SgqCiNhLLmmP*QqclDwcJxenB}w4a~k<;sgvFn;z-?Q9AFbUL3+G&A1# znv#Fe(34orN5GGx3#rVh`L&tJb%8@Ag4WJ1)|Q+ zKt&tLV8e1pw*It{)ErECw}A$mW6P*>w9>uDaH`Dxi}g869i^XEqV<5Ki(JIt9N$C= zr7cC}-tOt|q^NafmOGT+F;8``Mn7XNa5-2XZF`OLBz5zT6R%`;nD;%0rTC3{siu0Z zgJjqEM|aNFt2zFusnI<~1N2{6(tSO>S`*?`mTa^TMI*l|vDwpw2?GoD(T?HagP(BC zXg)t>y-kb*gaGi-ppaAt|9*C5MMXtBd^!MLWmSRsFk?dX42R_Sl%Zy78~xTaeSPdi z!~^a%_^n)PZ_Ri!vfNp9V%M$zO~U&3UjiEMUFx8B8qfAbMB-nH?kePT$>(Mg9ET&+ ze9tGKO2fv-xxd>spJ_^zUtD4G_|?Y{N@;&#UqK2w5WUw*-j{>7m44Y=P#Rh7p>M0Chi|&eo`ktFo}j+ zTE^TC9jo(`lOJ%!ZG7$e^;NK&qIhHxG9i3%K25qT%hTb!3J3s7(g{fTwUIi5`L(sv z-a8Dl$@NdG+V#7yhmqX?)Z;k}E<7Vik=lr6juS#dS&CKX!Af$f&d5mdK_<(x+a|pH zko~-YsNLOokPg1`sY;x6s**L(Ef+og*B&E9H8(HfBP3+=(9tnteCqNY&Xw?5G>(-| z@^0^Z`e4H^8Ct>{uUeRuAM_*LfrrFa+SK1ex%j_p9VG+mV8P%WrM#zTy`Mkb*#X%xOedO?b~n2g`}wK-~aOE2qh5_57c%(hUCm~9hn&D=%VQU3b)af z29)#j^J$V26Cc2$O4N-_CgoQWvML9$38bZf;ac8$x#JoqTMVwGq$Dr`gXx1{Kz;t= ztiT9XERNl1$pR`$q4`kE{lBZhUw97y9RqnF>AuQ+#2e z!!DRuX|Nf>5Vjab;EjM}c64@@0aL90GgDKtmAzw*i~P}3`A~M$*V)4-Nm2(*R?`-D(CqZE zCo|HMCT?Xcaiv1 zuVh_CgM)Z@R(6CO48v0-#&ht42Ws$xF=C%+l@YU?Hk-BUba4+^Ge7ypt-oITD4G?; zq-M7jJ*F7)R?gGnOWonhV0+!P52E&0(s70?|H+cdi|kZZT=kgMz_tfGkK_6SO;Rh% zeXriR(?vCR$}Qx+`#GL3I9b@64Dhb}x)iA8jDd>LF0&%q08d-eTWXR1<((c$7j*8i zM6cv}&w+g-z$k6U(*l0gVO;e9TP4aLz|AB3iK4~||r(A);SbBjBIA=d{@J z^LgawtezUzqml>^N1$e4AMOYJN%wOJx3xb4E=vWt1$pY)dzBIgzfbM5;gX& z_#5(B)J$i%Z)j#%c9-pJZl*Sy^1!a`?Cfj{5ka*X9qk`}*-wT0_l;aAQ_GY;kE)Nq zvs$?`H#ltw+AHKwOhR7WOGp7PeL&X4oyyX#UyLb(jf;mD1)>OeztWjc8Nh=NX0>Jz zoj8F4A5hu9uJ}u-H$onOOk?%eM2#m26b3+AfOGsm)W2j3fu*G-JUp;C;y8#yjs=YG zP=dA6!+!8$VPV0zSbH!%v!;d`dL{(46%bU=a;dF|QMi4-Q-TVl0t?Pn6JMa_sEDMK zI#;TghL*Sru65)|24to0t0Y3n9FgeeGh0L zrA2K+mEGq5(h4Zgb)m1whH$_OscZV+ct)6k%yj*z1xP*ULWQ{uyA1G4%E?%DGC z-@n4Cb)v9!-wJDa1wsx`4sA}lPtSsBR@mo|d$Bty3N}m&yyU;?ui;oWhazO*O(3;cV*=jeyy`5j*E%PYj%br zlO7KUjQqNIKE=faLlOlZCVHbY>g^s8knE?{G4BR<#uDZ=7W%NEO=FUT< z$I-X5J}bO``ZSM@>GqoqDIbbEmu?$&0cr+a___H|Mc4WJ>tRW6p)B3>U5G52$y${P^Ma(~BT9p8!U z_^_e7`-#e(5>zUXk|U6ew6Rv@@?P2R(8OhAZxt;e{926f&SGH4d{z8-3Q9#&XSv>d zRnr@csBF-Qva+&XCeA>Z3#1WcH_1mnDr48olJdkplY=UNo9ab#pQ+)be*r2LdW46A z&d6Nur)T9KdF8EYabQuv7m)iJ9N{@2Fzq7ZKm$ED3kQcR2pkdfwmC;(V+t$~PJyC? zG6IX1mKMYg*k2>n@--^~;YzJ1k0q|0}&DIo{(sQ z|JtP2zxx%~`X~?tAwz)_t;}Zl`dzI8e#k4>LUq@$2_Bw6p$*qe0Q}0BpoVpHb-mmR z#&z>63~fFrGT~i-J7z7X`Gtm*mU@ji%_Xr94ZYDf(4eU4FCmMI=boAvp_xae-|Vi; zlC^@*m{ zper;Z@^S%-BSgu<%BQKLFj3@OY>N4Mcgym4 zqfMq>^~mqhiPvbPNS-M!aU~AF!27*$opyxtVlBw7txCkYE+6Cjyz1P7bRhl9^ylPB zA*{lB)?Th6yv`L5?Y=W>SFg{`q}|Uty1IwWYw)J(GqRArS^VOlfNQaf+Gj2JOz&!< z1j)KuPUoAc(yNrGO42OteUEOlv9R5>5o2Ok6tUl$bFriN5~G^+7!TujAYr>1H#_1n zgSz`6JvIpK%L{fgv2n8;$4u+l=l(d}cFdK1#*U^Q;@@Ys&F?oUggh)lGXP6rn zoO6w+uOnH+kewMVJj=nFF6eO{FhXs33xez%&yHV!ACeSABLP_W=mxkb1!*7fvCaBH|+FCdlU^?0>fBgms-p_XF}rA-^61 z&b(KkHJ!z$6n5+jULCSK@tUq<&uFAaY!t_>6TYy9zJjjxGWp2x+!<4kovdkSi0m@C zLuLe7Jj{L^cB)iV`g-O##yrfkoKyEj+Fy;GpQgO=oy0n}g4NO~cU|)I3!A9ZG&Hm% zQ!eg4){JS$$zfI+fTI?Fs@W)nK@-Tjx3m(WfJ|y~J&uWu1q1yh9EL#K>2ZE40*5I! zbifUrGlk&!bAlS@pUMjom@Qd34nN|2nQJ72-3XWwZnf+3oXQTJ+yTO>2C2bFqj+zhwFTs_~9q$(e-H~hauZ!$RKN=acqq8 z(tjrGd(02r^(F-LS>_C`tTINmKFrtrwY0F1|Ge`^km8z3wmRs2q~QvKj*{)}U8=li zb^u>rg$+z6#qW5T0NyYP1#mUMxhL!(HW5e8slim$yX;CI_*=~L=Idn%2)J5@?drpm ztbjJNOPFKu1e6JfM@L8>sF@uyzkJ!3qoKO{T$1~=4;$x5JFK2zn=i5{h6B^ehH%e` z^hTWyDS4HCo&EB!`kIqHrX)2t&fXu$Z6Ce8mR(jXpW{(g508p_a&lN+2kTwX@yDwg z8rF^Iuj7&1Q}(1t^0`fn4~Xur3N<^fPgvh>PI;WTwND|!6N9L^3BK}He!qTLVLgne z8&G_e@H-CnofkdsR?11vUzBMGQh1%V#q3V@X;P)!XPKKPzik@te9_U8ob>wYej)u# zS4`AE>ff|J-@v5d_S%U=%OO?3?B)>`stiI6#*4$q2gZv>*=-sWu&vP=URr#-!ED)m zZP)w7Eddmhls_keS;pueCMvVY?Nf(SSP;f9`;u_`Zq(lQ-gN8l(ir!Yx)To4bFQw? zh`C*MdmRg}x-5kL`l&|qZ5{1MdLL{o4KkI4hK8!Bs|RjxJ1c(Veo5lC^u)Wy`Rr@h zK+~wsEn@6#Iti~o{qXD<4Qgep%g_@VU%bRfgl%AY)f+k9wcsbb$f>AMBgM>C$JNu* z11S?IazNb-kvDTN6~S2b!)y<=c)4{{eVWFqP)D!^8AlH1YFL#_Sc_?Gu|_WE$5L0Y zuKz#kK3xG0Ck-Kqm-qakTD;FfDhV-6d2!K%+nS(OBD`_qvWdCOmO`M~1cxh}5|Duy z2+szT-VYdw0%c~K*gCWf;MuE!1qSNWujic*zXb|3CWzGl5R%QDH(r6B@FRyltX-I; z@#&LZdF16P`~1{8rU(>(FJoeEU^Cz+Wwe9xk-+A3+6jWWq#y!DFf1gb5eoYm5Z3G= ztHW8DSy{?g9OXGLo}Dpv-MkO4Ax|gib9nhqa|(&!wZ6bZ^-pEsw~>m9Kb#$qtc67? z%OD~$`c*R*$qP=HUs?HXxzHYC8qlaBQGtn$2C_pqEn$HI_RC}1jNK+Q?L$(~XH|oC zYLUvRTlUvs`B{d_eRnBogmvq{<@1wL{6<70P;V@k=iHJUtC^{)@SEF_=ul{EvlMC*RSuu;lkbezM+ zMqu#${fQdJZj4r8R>Z{Vjg9uQn>1DEFY!Y0=s>bTbnDf)F>+A1`c7eO1_ll$e34zO zs0D9?sMqF7wc2$2p!tk{+UwG#Cp>XIDK)fpE-gGip5m}RWwPp5C%a%@IB%9bW4hN+ zyp5(iBx;;1L_ugKC;NIktB$XFwc%wGKJ+TTss>K%3k)a!xQ>NkBvQGT9NqfW%@HEG zqb+8kJ&?tjj<`Li|L2ffVio$7jEq#fbkz36;pc~Ks8q|3>AYkeQR!cqQOS82)C~)< zZ}}*~!z9Fo74125o2~duQ0wof7mcojnQY@zMpTbCyvzg9e8osx8w%xBTPK|sBr2F+ z(`{{k!p6pCoO2($t~(y^AJ08PL;PApBaX{eld6KS&=ZHKr1lBNH;JUWEY+H%T^C{8 z{jZoHEi95+qCK0nB*zdAASxldId<(5vvu!lrG(||0Yif+8U+79%XqDc9wba4BZAWJ zau0%Hv^Av$=dZ(BN)YAapi-ks=RvBeG@kCwMO@HR9|q$>dgu+8OSvZU|LHX~IplGI zWT?g56tkXYn^JyMBv($6oMgCtJ5T~*BQND_E{mO@z4Qn47bca!N4u zHcr7ZSEjg*4jLMoB%=#^h;@B3?RR1)`}FDiIw;nL7IELQQHy&NjXga8Pm9k9@~@IU z(4X)XWE0Ho^hg!H^&L`}U}b0Lhb|Mu@C^|E2Pf1a43Ec0t)EuPxtNqkB+7G3&iTOSA3;}s+GQz)0BmyXNH-hnQsg-hQ7jRZh1J1`j{^{yI97*28nVjd_+mEuNw*31LVF zZ6Zs_i6;{WHA}u~AZvSiM(+qc=hK8Q2SY8Z%gZ7MODV{H?4!)cy(KmqtC$$|%%_b| z4+3LxAPO-r`k+c6xWHE_tV44M^!YLQ@W%l8$a7xr#VjF9MY@gb0m~6gK@v68yLdZB_h{j!(3q4d z{gTtGh9*v<&C^JsSdFyO){pr{PVR4&HA*UxWLkx5{sHQd6^%(e9=&*PLTV$>W6&T_ zQ7)r+$`Qd~btj0pLyD7%9dm!{&E$yF#zAI`ivvV@}o^g*FE}4`g0W{jp7F z381VA{EYiA<0@s^1NF+Ia^4~vEA66#5hs$QV0;?sCyBzH|0YX0EH+}@#DtUOKDQ1& z{7tE=#8Uh?==H!2iwfRDxw_|A`xiE1gtOmlO?k`x5tWaRDSlG%8*IlkzN=SYx0f`c z_qa~l63_YwFPfDEHR0^+qxj?rrcXfH4eg2{RI5b>Pa&hw@UMJ#hqg0Jyw6JC-2_x( zB%AkeH~@Co^hmsu7(1j4L0Y-D${yWMyw)VnRFV^@Ie5`R+^w{;WQ0#4{_Qrz+C5B> z^!>WMjW|P-BE?hzc~05An~uxtA3xrEJU+lk)HQ#$AOr4WQIdyvlpkeEwXJl(QEHv= zIxdbJR_;p8){ckx$oRNc7twI_cDEIO0r)9?et_9$US)RUWB^P8yZ16F$)J2g`^Gec zfo#F!Z4)jxzk(%PuUF@D6bviRbqCqsf1R6qcYUfB4=NWceoC+z{pjl}9&=cN8fQT+ zW2+jgnF?}0`NTv;r!=zFPob}p2BY9Th};}}UJg}PG%YwkzJqKn7X*)oV5OWH;GazO z%4EU46wWH#261>Z*uLQ1g+EWpgKVB>-H9TDKOj`DYX~1n3~aC!4ESOlM$RHWNK$P6 zs+L|tLLvvC+^mCt<4cA&qpyJ|orRq}@KL4=h}vP=X-Wzm;6qM_naJ19WJ$fENmV_Uzd&v_mbt{DfH=EPOv@QsSX5S7shjp>MJ# z>mP}bC%@2U++@;rlGMoq17)M60}O8A;t7^x7#DCE5TJw~-^swb{+G@DLz~B4P5bkI zzv$|{?Ju^Zeu(91AF!EstLMpTtz0eX|EF@S#;uP;#XrqL5No*jZh;i+w&{w8Id!?c6xJ$p1yyS zk1{Fi;#An)6F=!B7r}c#?48-R%Yyz=#cJtFc+SC3KI&rWYK z7IYLsMD+o_QnfGI2OsPIL)CkLW7+rd!xz~jl93S^*&=&yrR+%d3fVIu<5X6Wl@J*r zdu5Zo%Z}_#*%{gU{d%7N^MBv>Iy$g~&5gAg~ItbH{#le${q1GO52hl=ZO_A272VTtZ%dnUn(4z z&>}KV*Qgd?h5-=J>X-FTpLc^xzj7wuy?ZAJYIZ0xl^DIx}m1OPuM+i-rS(B(Kqg&$^FfBWy)7snZ_vsXvn zl2r{Jt6NfjxaGLqMsk|Mv4x`f3s^_LSL;Q9Q4Ru|2nKL^p)m;!EB|d2zQhV46s4TD zF%e6+%T06&v4semU-%g47}(fPI{M~?uYwN`(j!3!(!4d-;s!a)0;eKD!_kR0Nva2n zU}1a?o9yMWQWl6u_6KwToJX@@ufZWC3{=f(0X%XK{udS0>aj5Bl7jm_-t}*Q07G(L zUtd!={tgqM642&uICUunNy|~0H8R-F13`&>m)Gs;bJ01tJjnP}i0nTn4$U)haTUDG zRli028DI`k7i8$ORxmMbf8=N(iO%EKUFcGk-x6=!(C^Oss??CG7o;sgr%L z&AKN>|Bai3C}IXyRvg%S@O*-#yXDAz_*4hbLu7pUsr*=w@oiIkf4dlgyoXkx%xdcE zE6TN}(;G|r#uW*nWmzO;U*5ZIv|)>Z{#6~sUCAKHz+HFD{mUxC=rCl2;UEB&clQa43^ z6>V}GNi+!Rzdw1onVegVgOp9-^ze0fk`&2p|6x9o>{H;`$Ew#n|(C`;6mzk2KyIJpL!0 z&L-$ggCA>gWbE_!?^pdbfz|0cqTZCLxAyvoP_D?;AdQoQ()4>=w|WwU94nq4sIsrN z#Uo8eR}ToEI3(WlULTXUp6Xxh)P-< z&x8ei*V|8sZfg)99I2)wI61LK>7ladqeJ8(oe!y)_`*!eWhhutq$o7G``4Qs4UJ4btvO!D>v~S%(di)iB%MJV)!{W=uc&Sg^9-HQD-(G^$Yi> z-HT>Q!WYEcV!v+jpsHT18JUL86(uDOe#;mP?KJc8RS4W*M8(GrBX#!=riGE06uwgx za&p4;O)V|{C~21x><6lM7?DG=8mqwHz0KBidnuX2AG|AH`kZO9{S_0B*uR+Q^UH24Emc2Jv+1X}B7qXD-YCb0ST;fP->29}x@~7c@ zPae&WE$sA3V5Io8=k-z6FJ6q0^sYg6ddlJX31~ZdsB29Z?wtS*nhMM@9ObQ@ofZfT zb~4#CvIpx14N6L{x%#a2?XL<`Qw0bY*bRI4?hCM`2-GgXuXpzt*{{e(m+kJFCu9og z=(%fWl<1F^+a|wRh^^yw`TZ_1l>7kzxDP19+HLY;$LxZDK^ZgWtxhLzfK~XmegzLq zTma<^%_Z2h-{u4}4gGJaPpGpZ`6Rp_LqmH((zmSi2ERSl->6MEu}bKLtxAZ8?DjD7 zhlmVk_7kLz)$zgxhaEBxKsCk;d#MwS0-g9hafzX}71k(4$*3RZS8`>AL00CaSFmsQ z=eemTqi_-v$q%h~Wx=n!XL!ITIf4+2?_Rny;i{^ZAzfA-WCoAG%J1k4ova&xNQJ@h&)FXCxpltOH^n$6-bD?^}YI4?q(HF!@Q{wANiP$A6v4mIXU%P~a7&Vm?qJ9%P z-yz3Ijypcw)$4IC-DF}C{^f0wS0X;*oxQua_n4hDggMsfp3g;{E=%+SOK$z)nr4&b zI;T0=Ch&e2p9j<3kTaUTO2$(jK88e!ihNQ@vJrAUJ9bCcuiSsRR!|9E6k;G3VB;t3 zv-$yYc10ef|E#rAnM$v}m|iEjfs>QPB0_O}L3}$}jak6)XS3&4B)u#P3k&3vUIvF= z-selw(wZqywzx~-U2zjBkZL&udZbXWLeH(QzXPP~@_UEqYor|nqu@5#V~VwiI1lt$ zkrHt`eByPe??TUj^46`c!y#NEI29t2RAXrD>9LQ7B*d3>z6^eeh=~X$%vftN4=sdb zaljd01aO(JpQ!dUf8!7A{vKFp^U~9wI;Q`;@krz>Hh;*5`(w|dZOkys{zdhMH|h#x z+s`ZsBZUGA8h1FmUT3cGhA(VDmLM0Z_w-8Vk+QIy{+va#oTB0D*}JKG0e+u_nOH1l zBgy{!CZwEg2!Hx&@NP9-n(5NGR6s1|e49i4IKq^T~iCmK%I264EQu2BU{ z-&$_JW}s9Zv2#&g>>$}6(6Qi_>QSqW(f^3F%?}|KB7To1Ddn6zmiTJ?`p1zUM})Kc z{&{O;$rp|07a5B&1Fo>lcbpjIVWXT8FZ5eid38(fM@@UJt;mH?y0?UxA_yzYDoKa>fc3dZ+T zWBJd~`aMSRp3m2t%Q0T~393?Og$=e_FPzdX8Q=-~T&Wrx-{JoA0UamXTjx}0_)N-r ziez-W8H?KPYg14IRq5)B(yw!4GQoP@C3c4wn8@P@_VRY7(Hj5JHzFBU@kjf{4_i`IhnlQUKNmr+{$A8j>hR3 z)FFsr3^hX$U?6knw;nLZLveHTIWmG_06KSd;*~E8L`P6oJMRjqF-_9s8Qy{${|7~A z+g%iM>NdxdiFu90G6mGQzH8c((KmI;ri>degTfS@i0G!<`RwFhKO22hV`R#>e~x*! zr)xCx>~S(ph-`S^A4FFHtr`^Uh~m*jzzh1hc8&D=6B9vC;jPXgwDtA%MSub&?m;;1 z!rIzN2xb;R_8;b^N2H@zSZBxKw%-kOcP7cmwF{V^T@OK5VwcgF1u^{a@!=t-=Rc4d zl*gtu4hhE=&~N1nYe+4kf{iG?k@>q)4dgFs%NDj5n`zr4a`qZi8>J z$uFdol0O{ZS{wc0I?^&xelgYCyFtiNcnvhn;fILuF;o zTJIy5F;IK|n}PBFgjC^Xp2Almu;lP@i;10lkxdo0aCE#V$Lx6G3SUfBp4O+gkL;O~ z5mQFRu)j6h6`pb<%W6I{3{e>Tx0Wv+UO!9eywX_nuLcJ-^Q1mEw$y9l0aITtA{qLB z4!mIR1-t0u`jgqH2JOANiSft5beUOMVkl{K^?q#BRUJkqRy;nD@GX>IN4n(ZM5Qr{ zm)A*0+O4&{m(I%FN9Q#6vpW|oNs!k9C_Jt+!ss90uj94NZf9H1&HYWFAR}voishSN zsL#;;${LpgS zj7>qq0O*?CmlBd^yP7AEDH;cm$*_Pl^{;xlEH$+xQOYznHUYbHhXq8XPWp@OH7ZWM z2J2620q*VIAKt(Bpf1m1%)zDglS}db_do}nk5#p`ld44{LNhQFPD15LF!;$sVDMAP z8L}ak{Q?8WWlvHNI31MHzE;rAiS20U|I-HT_X|lBNV!98%8GfInB=igz!e!^YxY4$ z1(=BVjg@~yh6h?+zC&j%Q>`uQyOY1fdIe`gQ~KqfD^0SW?-^uwL~+J-QOA7Z;pK%O z0-FoKafn!BI>~7|!i$O$-3&R@)cQ0zyQrWlC-;iQ%L=6WQ%!n)LvERPq43IgO#Bn( zKN}n8FJL$)L2bef!X4c&GLrb3AGNBg>QoOTydl&Va8Y7WpOdG$;Y%}}D>jwp+?7=# zK*6|xx@9ddlbwKW3B&c)_O|DvT8Ly?v}QjUb>!45`<|MgZ`TOM%U_|yB@j7oY(IM{ zEBiGO4tEwS9?4t7aY!O^cjt)zx@87i;IKDJcOdnhMOeE8$}u(C^nC zezM?Ic@RJSnN4V$a(vl}+X5f|L)+DT-l-+yJH!ZVh&o_U^2f@~RQ@E$^#v{yUr_#L zz_5pb{z?wi32^snN{0U9WE<$u06xHZW#G0!wM*dTR$>>Dl%85A7)?Z0E$(=xU}0ke z0%V>E@hHM~M$w$(dc?cJ5<4_2?AIr`t&9R$baIb0 zHB-2`xZ2X!WOJ{7JXjs-N~qUT#EB)Mqumpc)_@E#R^$_}1s?b9+kbk1o@Eo4IFrox zzJUX!CjA-LK|6+xiJ1eL7`Y8wFWf1;=Vn(U8jMOAJ;YKwwSEL|3iJ!*!1f}mA9@>p zg9uEM3@=ccDR;Qg8#ZQrpFe;80f@^($%rKdX+^oSoeSy}Yqn-VnWi%P+KS6#9w=;t zuoZ?&9R;FLz-Hz#4&GBx7&^jG#$l^>Iw@c8 z1jxlVq*zk?9D_JHH3T|42R!3{q(H%KqZJtVJm}%=sh11)eofw13OGkYdn57kSGr=B zW=_~WIcO6yy|EaA=|;5kZ}+`}!QO(~efpFgo7MZcQCcU9L7c6kt&5Bp-gfam|hEPaN z6fFCyqeaB-rLq+egBq|SZ+#s?20GkdGt<+wsE`6K%noPG$*HLrNN?YOw{M=nYw=JP z%p8dc9RL@cu0fs_8iZHqLQF!nmVtqtJ#DFOfQeg%TmJI$PbB^C!u-7CArxncOPy}X z{edlsktS=T*7#;C!AvQcZpG!+!)!_yLsyuNCiDKwJ^YHSL1CrZ2UU_fR)7Dg?QT+aF8L-`j@`TOPl}NEK2ox*FFZM>$?NTuxCD z$H@1{0$3+vV2B>avSkt%Z>kpCd_NTUV1`$QLTn6}p6MsU%(*=`2@*|dJ?1)Ul?JuLp6O1h|a)g1)X=60+3AYSb z09(M!M41fP#_HA*IGZyKNEHwi!}+@D3p+>D)JJ?nLUqthq>s{u&+l{u%9pvne{bfh zvz`x&ialUTLZ;vDT4F^}9dS*I6^S@OO@e z+ErU^@VU2~INS>8TX-A-i2ESM(c|UIG|-+vGL$*O8~#|fnb+vVMS0Le@!uR~BI}+6DvKfzFEeJ!_;_`D*VG)tbRB0j#l1 zEsX1{*ZfaA*Ze^j)Cun(^3$hK=w`7=%}^(ssqvPew;2DTQRhw@_CS)%i}5Ifeo9Q8 z)Y{0HGUj2%!&}5)ByyflgXKOpfVd1YNp3=8fh{0(uP`v7d!km9x7ogj9ALpr(@ zH?LN&8=+fvt_liSI?fE+)xWU+3F8q4 zDy8J?py%Od!YWmGX7cakikTVraUfQu zi21>0eu0b8?WE*bGo7T>qdhCfH$RsVp;aJqNK$})8u{3mm_2PE z*V<4f5c^JbZ*{N(xlv{_#C|EE)q^qytZ^* z^1P3enM7r<4tV2t!1bA1Sm+7_xl+Rww?)u~Tu zJ(gP@;!thH2*rE7ckXCCeEF>lIGg8+airSF1GOicfb z)9VZ%K^k28zU#6)kR=k@YpRRvPk}@9nu13Enj2IQ1S>B>Nf!$SW_h5&oemfRRls?) z1}@NPtSYcp!io>~egDfSGHJkn%U#b){qzcGe}bB31=7Z_T6k{UHNya*@)OX{I7L7x z|HsQpvB9aSn~*G2iMALZ)*Q7eexURi&h3Nt;Xj@SW+dyj``lC;jDypsZcJP-n;U$FL4iZr3 zaT?X$035O-l3osD1o%ffER&_u)oq#%QxMDwB+W&0iKwxX1_1#_1(520QPr)zy}-&! zq06dTxV5+r*a;SKgY={93jqM7L$NZzCW7Mkvdmu8Y3n ziPpuULLOVABSiTArP#;4@2>9;6NrC zK)4MuuvS<-H(>HNWaljFY!JETtZGOJwH9AGGALY7n zfXx;fRZdhQ(I0 zVGyT7+5ibmIG1z_1qW#elCJGk3|elWTp@F|9j-;(h>jKjgYyDozsZsOxDtpIhIrR5j57D0foHR3G?m|_;)W| z%f3f{C>G&>OHq)L+Eo%R{Aa=)qPYZa0ffSR43 zmz|iHcslUq0ki9-6Fx{YnqLakJs#T>4I2 z-y`-IQI0hYGScYxitB~t)`N?t^6~+LO5AlA5DIw7KEn<|Nhn@<2WXPU)2T3|`$ib1 z&{et@>pP2|R5ckHpLicOVdvGK{!@|xo{cR@H5lmQC?Ki(8(`B-#T(Ca-iTKG!@RR% zz-6T7eo?ahlYBjV|9bS1LYn*5Ie64UH|^Gz?!R1GS~C9nAv7)fGwe(}uE|1TMlm4J z;09~{@dFp2sgKYWw8Mg=c+V4{U@je+qoe{I;ijPV0Mq>-QzvMNxUQh#3e|2Wnh;;v z3ed*$Nstk{ql)_;S_%BCJ-M6$FYDYGNbzzY4-?`yO`zvoFHqKb@?l{h%(w|ps_Wc< zCg0>X{Pqi?Q9qC8=5Vr$%y9ia^ckWC!m%A-c0{g9 ztE38`_FBh5i#dXikFPh3qdxYCp}1yR+9LV4H!rK@2%u{=&?2r3XDZCkSKOhH>PE3n ztwyT)4X)qbD0LOzfGXUX|02 zNDAY8#agGP4P-x_PgX6V{;7({&dv^ZYr9eFa8I6zAa&|@Fqg>qhIm+#!Dwtoz&0Q^tzr zbVo?YT?f`ENCrrq+r#0?D~t-1T~kX0!zEIBl~(+414{PpfmT6o6haVCU?i-*in1ll zGAf$E`TX*a9c<=`U}=ar*&S4q$m`5{C`wg?KHqX&dty=9YibXW#DbQp!`xN3f7i-y zyRiiLWm-GYU_&CYJzRhv9{!Po8bz6V_ktd~A+bKw{|9EixNqud?t#eSv^dkiYU{i; zD>G~-s0OpPK>FjNI*eGpSyBI2;sKdNaO!Agz zyBV`aAeyCSB@Ahg7Rz_yDJrqrTN%9W*l@wNE5NC@Ju+y*-@+am`_qa5+D|XLiO^=x zhV>m`4Fh2ypxJVF;__xZmu^-(634w4PP1Z;>u6%~xd^oV-~*#4#f!M&r_L(w3;dbs zCBJ-ndWz1+$H&G$o3cnIXvU2;?kBr;pINvJ*(acOjzb^dNN;C>l@<4EKX)E8JB53G zruEAiC<>EW9xq?}3=F4cHo?%=2gR^wtcB?2vCL$^Lzcuc4`^8-HBEezYu+ z$C*j6qcz9*A4t#6!&19IDpfUALE~2@oE~bZ#w=DFe}g+0gR}5P2S9SxV2}JvYm-L> zq-CpUljlYfb1rOW$49gprlV_VXWWj*^_$;5oPZ&8PeD~Ryi*omzRrU@?<$%J#nx8& z`nu*|OA9tZyg23GU;^iV_QUUnKJ`r2DaB=ToE(HYq=+#7q7GvrLK7K|<&%=SXg>Og zpJjYg#7^A=f98JLTq=#i?NwxO_)R{G{N@|DW!wZu-|K`NyKYO@xA4VZ@qa;WlKO-i(L#>F=PV9t3Vo7X`Cew8G%7V4&<>UI4jKoH`iNeu8h~_RFvMeWgv0 z^sr93>G#4^;vO1`>QmQOX7-j_-C+?CGa^vtzU>k6(MT->;VK=QT>p{uIF`%y4H)MN zM%E}}Eihr$hEYZTn2MU}HP=A~;e{Tttmu`kd@4bX8Htop!Bk#DlOYJ&(uMDKkBVmK zgiDwL6@r?~V9mY5_&xKR63o!<}_Xdy;K{LxC(Jz3K@- z%;Q9Uc@NpoI5pJOBSSic9WVG{iJ)dfLXO>_KJF6Gv??SA4lgG$z+2RZw{1 z8=lLLryx~r=%zg6ED(`1@8N>@ETK0-abGExR;j68Sp(Yj%4qHQM>Bf822EC0~2sLMw@mNA* z5W*&Id;Ol?7kc8-@>w0r6+)lYynuJM*?!USQ13tM{zYqa z$93&|_U*mjOW^eOd3F3O(R=HA$REw4>T%=H=Jc2=&NHn*tWx|OApTC_6tDO*S`N4MIL)?D-^B7!ygUoPyw1Y4Q2Bq0uc5-xp| z2mhH04t-QWB>m-0&afPs7IaH->Cf`Q^Tacc6LWpk>ZPiS>YuK$%?Gelq7!J%UN z>tMI>7jo2))+~C{iH~{|kMS|@-4pp-bc##pCX%DeVOn#(tNq+4l6$gteO=o%U^jcx zO~%mflwZT2S4rgcr(3Pz!F|H7_fd`MP9u$T6CY&P79I=@_qB-MMP%%_eR{^)%H6E3 zHNK6ROvZg_zQ^C(B-l^Z=ZayBn#J|hi8nIaet7jiUwKw}xcFlO@sPApJ>i_J-(_4{ zU#0DaN=^>+_6;vsVkX#A$yVR~`1}=xLTh^Rfc?~J=t%O0Nym~STBFd%v6TQhgMzRh za@=CqklU!<#*)q32pi`C1^!M8F=#JuV9i=7die&q&eR1K(xcs?A#@_32`X&tcY5ZcHdZA*DpT)dyEqr~)pLj3 zai&o{8eov6)iS1JgcfaD|p8ZK93&9st z>nCn&!M9mQDbSpTf5kI?jIZ!%=1KKa3#_e)C*lbs(W5u=@Mo~%sl`Zjx~u!vFzhJI zg!@$f8pf+;-w?#a{XO2piO6UEgcn>}9CgvUV{Ofuzyw5AvRsyF@x<^mMY^)h`mytm`_;K25xvtf6oD^SkY_Ax+o1xlZ&|iztqVUF zckEFcCk-dA5*e$!c|B&i;Y?9^W7R&06y+5Ab|Spy6YUm1MN?O=!(RK|jMqukgl2b4 zhKUaOc@M);Y1X@K-P5Vq&Chr14QGz*>xjo|6~6DP|JDP0Uy5Qc?;ow2TD1W|` zlBRpZwQKZqZqnInrYUcl>~j$t_6@V3^VjxPB~3vW6rs3sIM>9V_L>GnURQgtL+N+G zQCW#P+@~ZhU_)(o{zXT5R?u!~c?=xY{d6u{mlig;Py!^zo(;zYJA|lT@7)biVp^kV zRKb;QQNLm2N*Vd*J=RC&S1h?AkEn0RGHE{<$;KMkPerm&9-BWyA!=?3CNG?p0;D zfAF4yNUIUe$(cz0JSOS;x0jKtKdry~jx$Uv_N&%T9U8wPfpxH20tv_?!NgZ-?n?`k zlVMRIr3aR;Ep%&ntL`K59~o#mUJ+ld#%%kxGxF&8S?qkm?bzI_eFuM?4;F_^ME~Ak zXy<&8>Zc@dY!IQJ<%^5u>rfk;-e{R*5aMTa{gB!{X;&-nU&qbS`tu<=*t15ZwKCbt z53|&@#?^}zIV1GynVkiuS#~R()U|W+10CD=NDWq>h-&9NFTsJ`LM$NOb+-bb3X ze_F*;Lj!|R7?~_?O8FW%tkH*&7--`cd`R@s6r&^~Lq(c3ZAYjaQChuN8OC(vLI`a) zf?Nu4vmDJ|Sy+E1(6k;iYvkp}a^I2`YGKL`Q^jm?QCeN_Cb4XW)2VT}j^=(V3BB6Q z-iaVOb3;Gqh!!ejJsGLm{&9BxP!D3>DByYCZF{(1-pe}j!N2Ic z6FL6vJ8;BRo6WjAEsRfa4r}lK)!j3*UJkqGXJNuJD;<@)Y4x>Ccii{)5*>nCFArKx z&TlPLSKGz7k9}Q_2(RkHmt(op0FSw_C9Hd}S=ww}d z*mKuaGbIId7gK*Ft4VMFsCGhTvMVyVb#XyOv%|gg+{MLa41&}=`Be^p4^-*4wtQL^Qctqxh_#{HWnC)dhDO3Z|p`af-1a`!F2)--O&gY*T>&Hm^P93Z6U0_B% z-Z>*mC4*8$Fsx>?RNBf|`sGz!C*VYx>*>G#Ez7B2diE>Q^<-qPLG;;Kwnk3Dvt}RpF}vPji!IIOuMoHnuV9X}+iXB)X9oO#6NQg)etAW1fy#m1a{u zZ$QJ0gue2ZA9@`z89MjxtjVXIq`mxBE~%gC-!-*8UT?&wJA9S0_?sfbEM!isu68tI zc`}#tUf#eXQYr$e&Gq$xcJ;)zCvoIWZDIs+_mKN@dEeDP*p{isv_=n0s%q`G-TcVM zkI@#0cf;CmfJ%vgSxzD8@AsB=HOp@A^!SLZd>ak4Ii2S?xUG#whR%xv76uJ*ScNX| zm%_iR6De+o!;sienQwmKDG8gf_XbPG)BIRb#Up%Q9PI2TTE-Y z>vd4Kaq{<>;~u5By)A)XbcJ(Q5W;BWv-h|La_@8yd+=65KgB zaC`xQJW(Q`<-6R{lp+_tp*~g|2qtmEOB}2lA!+JRc|SR_EM5s*9w_nqCQD*cQjmtb zu?65Vhyu?GP?1d~oS<2Sa4`aax5F0z-;ZeH5MunJ%?UyESmkxXQ{(#|cF*|?DT8ycCMF{2e9?##l)O#op z2bsgjkwlGS%#N=rQ@C6nSvVU&38Lq#=7!xUR{J zr1g)K;-1}@?`K<$T^frn_ZJnjuNGo9J*w5A_2~Sd8=H(KXDDsw2EUCPc~A5GK0F#e zGvB8C)W7O_X#q{$(gn}Dr|-NVS@6fW(Lwe_AQyolX{M-5UiYnLL;FxfW4+c3H26gcAdPA z{={7dJOc4y2NmL=!)S-bDCt3d2!~{nfKvE4keDt(#dW}Ck1GGIudFB%RCA{n1*V^v z^E?JrlLvvW#3|-PNBrfXwbllr1}roDD%U$xZjDuE4FKH&B+)?58iZRAv~2DC`}bKp z@2=CKlXs;#?(zQLP&m0?6Tb$s-%R?zsdnFt4)U!0O>cyD>VrENipmHmC22m56y1lI z?w=L*`e4Qf#{j7?~ggs^NvSg~a>;}l6aDz9#K2CAja}u(}o_*Ct zb2(#RwY>LZzVaB0fh~)4$)PJfI&@1}+t!Iwd@|_^%9x-o{%ImF^$U|loL6NdOE<*C ze>B);Hy}f~a>1r~JR8$ze!cc}R~iRUN-ZnpNsSD;{(qLIWxW@pb2MuReXPssbXEzp zqw&AZ(uN>|3!h^uWMp12?}q2ZB7F>-991W~tQ=f3qO!2p)-$bL44Oykcs2 z>}T=zBWM$^r>L=oD#`q`n`;vzB8%HF{}&dnqv!Y>iDDU&XuI(6NC`(3bcEK8&(+*q zl0+YMPu^gVDzUou`F=KwAn|Kjp{qq#!#!56>pcC5x6{}k8C&1rU3us#bdYI(NP6Gj zqY|6nGoUjxxYYQ`*ZQeq>%Sp*;fysJYF7BMSE>^6O*F64^YLA$?QuYn5`8(6`xt*e zi?ZkUVFFUnaqK(n_+WI)L`M2FiQvz&yH7?R_Ll#9QeLAd?XIzQZt8Oto*M+%aa{U~ zY$^!W8{XBPlMZv|BKKrXanP9d(S92vGLr=a2}Yc<>E+a4pq3;fKA2MZt&N&&=q zt>j%Lui*?=wNPqs59yL^2%!xylG1$nl^wQg*g*R{N{Z$ zoqKOFhB)nF{uKGm>ecAEUjf&WyeZB}_$X1+Ubnxiv0pRkiDGJAFzqePHc`Zp*SgD0 zv_4M$kM}z7Z;Pd9w9pda6nz2miHP>a!f6LZ`hdnZnSmFRQ}6tYRVTZ3t4AVbh0!T; zcn*_(Zx9xWzT2WuMLr7pygazJ+5PqDqy452&UlHsL}9uCy!Ar=TwJz#GM5d)hIjSS zIz?Z_8@$!9N|B$|8J77oK7-ZqO~>+^j4tiM zFd8XK^M~r6rZ@6WU)9K@Yix*n4%Ym85QXmduGTF3mtK&?GJZHB%c)$_Dys7~)@bY9 z>b3pMtaO~?5MB=vyt`Glc|t2QgObSSvU`ORY-Lu&dJ%a_Cz#h`uVN{+cpp4j<9bRe znKaPV^kZl@61#xl>jCP|F9IhA8C?=Ey>}Ns&SUF(N_mcsNEN8KVi;(1vg7eZ z-V$O|KC-Hq%Gn~_Dka3n&mSO{1$%MPICgehPGO zP}p4p#?Eu?I-=#bZ`t5H+a#l+vLSyfZ-HV0`tb!|gddtrP#w;RrKNlvaa}7TMqWK0 z5KW-1S0H#|&3Vb+;X>e#O-Nd@=&oGMcjVvJ)>eLY_AKgyAoK2(79I%eYRsw97k1vj z?sE#dJQ+3(;#QkEgV=;Yz8_nc-U+kfTVW6#br{M#3CQ18(mbzOOp-8WDwQ%@*jygM8f1Bp+pfF)J~Wc;n=eb2Y~DfC z%L?8tPnsvDOotL|O3_+=T1vvae5Nm_BUY+SC#F4R0SQY%|MQ1oXY#AfHSnJ_#Ho}lyIrY|2}9by-1Qg36Nx6Lc)(_O_}-5Ml8No#5S3S_rcP{F{G<;-b3eU)@-8NTr|M9ud1tj<+$dSv#`T!1k$ zHRLjqEU~>dQefP5w>uHz_H%7goAX?WxO*3(brB~2`b~sT#JC{iNKF7D?p`zKKjJ`As&=Je2qHzFdga}-a__xAkscqBDcu}W;v;v2`QRI9-Im)!IWW*KFhel&;cmKJuvX_2r%5%H|PZ#xoMoA`;@O^KMh{a|aROF8@^A^TEPUpXO zil}zc@X_RDUQMS22)Qau_K>ztb*a9qiJ}^=OyYi>@J*R4E|yCrXpbBjxK9y;W+eyQ z5ixh|PtV=SZ`#zuA>^pIb`o`ON$G9c0>AD$f>%nn#>x-AI&{VU4SgTVX`CoiY61lT z5G|~ldAGgTUx5U&!Y0e~5#g4aZCM2$3T$Je{-Y1+AKxF|^CfGZoJbxS{S*N3!gZLY zHknyih`?faHXI>^oR2y~7;*hVN5m4EG@MkGpf)@@fEq zj|^))?&gCa>HSi&S2*;@kts5f48wZ>OTj3_38jDzc7}%jQxXM$yqgFp$cj7+`3Gh>mx8;JCT@L6W`ZTL#!xSnYri`lg@h z?D{&vvu8^UhE_uv3g@>!s&~~N`;^H_+#Q<^7`o1=|5gu!Kk)7**2ZsblinS}_lG3+ zTUsmc$-nb17dd{urd+-S;rY*pBIttBtnR%hvE^jbc#lUU%v#wx+4Jd_RxWnOwbn^Z zWY$P~C6<(oR!6f&osNLmuQHg}Y>6{ECKyX#@5Yua_H^X*HRA18N)0njS$S8D{s@zJ zb~RhK+~**mqfn2~zA+F{z{3;}c|Y&!nvmqyk=Cm_C*Laj>j-x#?|x_h6Is9+d~cTU zsjs9oOhJ2M+9UW7!deuYDpTM)T0v)-gisNgRi>qBy=tQlulTp)x|sxuubU1_6~$9V#pUCkO)-VxVujt#>IY@ zN`U!A`rUSi)={N@V>LhDJkTO34mDK2CZq9kbG^i(^8lL@En_{++S0d=ug@-CLJT=e z_S~%7eEiI0zU-QI-M5IZ=zdEP8;zQUf)AfO3r3UscBm^?)Lv-3NgCZ)Q`0vY@%Pb; zp5Pb%te*Mbldrz#8a~pHlh5O9eiAwzbRShA89eI$WS|Gz&G8P!AVw1f^DCj!jzz;@ z{M#=F@0l(6wH3rkoR$0*Z|XJba`1ir0+FG%0EYE>hFh>&Y4wcM`m~=)_d?mT*aJHG zk8HP%^T%(tUy&8GeuW5tbTk&~K6cwEj0sX8k8@&ianTJ8yy?q1Mnw(kFMSdQ#3HeY zuTxW>@I%BFG{MykgO-1W?8N#rQ9ciKW)(YF47w)QHF)0t@rLYY5vH1^YSdB(Pk z2-tNiC1_iQ_{S9*mA@(^?%O!Mlc#yW=G-bGwkb=^Mcq8#^1*{2 zjhzPb2M%&w#==`)V?)<=Xz*>TvwaVa{~3EEFL8Ct?|Et)r)TPQ*-asPE#U%iU*YRh zR#tHFWx~5%*xxmE&1>nkUWVyAw${AK6p%QrR5q77J9Y6cms5RViS-!z-R-S2USp*4 z@FB0BW`~pKm3zv>pL84Te)~y3u#3g&G2ndYKov;oapNU!lG4OS$p^RQ##-C5_sSyQ zO8p(0BvV_^blUbED9jo|6fM&qy=Y@z!rHT6cva3qtBkgLqB8aZ!6sPpe9mf3P=rPF ze9OJjiP4Ly{>y{V?WP3dy)=sY)sf6`IIL1=U)o4?5Jm-kfv6Bn_&?!3F3^V;Aww#jMyV#GqE%%(Qn=Iv)T zt8=mhPCp3{Xs9_jY^?oKZtwC;GP0iNdUE}rxLVx3QX3lr;{wYg8`8h+fT*S6s0Ravq4sHd!X0B*78qAZ`djr_I1=pt3go za*fNm!S}3@hX6?y_k0Zr^U5ibH=#AR3SaL@gQE4JoCt5eGTj?sz25?^l#<*AIQ z+V>QkdeQSSQ$=hVJ(>x5SLebf)A09kcwt`N+JvFlk?C@)NPo`1Ev9vBQp>FQ`Nx=P z|8^$Oc|?&kH-Tj9H-|K3MT{Ype(ftQjgpZhZL|DGx3uEls0=I;PQGtM_cM6dzv!Ku zp%HaoO^i+?qhq7=pvn1mi;y#o;O4o6;PP5jPk&=e=8vQ=&(WC!PH|~(I?|lx`ffYo zqf~>HH0{^i4dSM*mD4z|@KQcNy_U|aP&GVQdrkffp?m&uTf$J+%`lgU`3O0(BP&kYae;)eh4jORy=up zf<)m{pxEXKx>nHQ}CC@{mC1}^okT>K|pk?~nM zcZq)e5w>^da(&ty-{sC+!nrB0A)gBi0OIpF8WRN>3rli+%t_TFt;NB0wfvnK=)8}G zqd#bP)C(qvC>+FK@_-2~;k`dm?rBuund9%0%b|TN`lv3(e&)+>nnha5A zuUa?cp5>>=5PKN5sLAKK)h>n7Q8DN@*FBV;O?gG1tMLB!{7Ci@pA7LP+MBy`&*mVJ zC(LMP(c&&av_T_^~6t$F511 z(3+>*eD`>SFE#f-R;f}b5(K=6>?l6O2BF8u5o4UNSmBLrV-R5F$vzJy-GA%%-$$eE zUEM!Rx0z`k2VW?!sHlG;Hp_<90x#ip=70WkA<~mj7C8M5DM7n_`GT7L|9#zttRu(F zPC-4{q1699Q%XSp4I}CQK4yoqoz<-o&@BGv@oHS-?DN3oTlvqUynRbKtJdJ^LQJPxTnO6%UB_e;h#2%?iC#aI9DlbN;bWl?jPn!En*qg;NX3nk{f*JC6v z|39xGurCVD5C45+-@J~(h^@aWU!5IG{PX|31hI!e1)9?x0i7(=7o2-a|NG#3>h*@& zn=Xq=JbM58xJ8I!jC~o7)|Bh5Ujb6tDx3c5|GyV^O%SjSo}cN!(Ci*rlV3h&|9`*! z*NaH($n@G*N)zVwVIh)^fd~J6ozE}N6ODq;8}Bosf6(8JqKu95%l&2nB5v(!14-~g zkX^%QqLf_nq(yZ`xa}fL5LNP2<$^0p@ik<(NwITs!i>;#9Ruz4E!1p=NLR^QNb%=7 z9}13KV)MG+vBnVMBCwam+0mAfl~FD*$I^v^&Zl(#|B!Va&|LQM-~U-rW;J9rW($*p8?cUa(y~g{f;0I1VuVO{;G1PGD9rnhZ{ur2Dn6 zemTv4&OgCNo!H&x`Zy|4$8(d$J(*QL{%NpxaF^-(J3XF_) z{0)|??C5pR3z(oZXcny=dr9>3;=$h~}L}%H%7qKB}se|L3Ekf+G#wE#1s{YAN~Z z?8CsIau}=3$UDMxoD2PE$<+K)bIwXcOsrtP3W5W;zJ?wPEIc7H!f$56aa8*_l6(H! zLu5$9^vPs3V1U|*6)#SDGOjX1yuO|EQg zBwGLkWtDFUt+0>{FDtJ_Oh7gWB+6@#Wn@al`wtoAnJE(a%%=?nbP5%dlRTeN8j#nB z^Blet(099jD6r^JRGliPma_IiHCJv{Sy55(M{lq4WI1B4SgFMPr4qQO8=xbPudJ+m zfAtD1-Y!gKl+-k{75_{Biml!Kn8H`OL$9W==}NuzoQ8rYFA8y|#Xi&vurMf(Fj}R) zTwh$|)BLFJr!5*K0Ksuj82}+6H#ISV_xb4|uM`D;UANiKYvaeyBn%ru-zEzM(Qg0D zc+mM3$?ltXjJ!}+#>NgYYc%NJb`_oL>*M|-_<7wXV_oY|yqU6PYdlNG{Q>`1Bdr3q zTzThUeR>g&yiHd&<$`Xe*a`u8KLV)}6;U}PAphY42Jk0X zS-jE})uIk+nA`1}$Fh~@ugUfVKE86@+Q?o&qA_m?iu3u-SIb6}f!-G#6}d5eTSB)g zAm|%4v3%DSkvLk}lSsee2mEV$S|{7%dx4N2$BHt7>+ydhzWnnLhJ_gA*yS`K2T5b&X20_7 z@sjQ*u|UbuuCgI*J#278Fj@}K{xgi~(MRPf;s)M9X=*s)il=@!9%^9;`lnmPisf!G!1sM9|zSdGSRP zcD`k=z<(~3;@W`YBk{?BkYrna<2Z6i$GXgN>q8%X#<56LUwY(nEeR?D!j!5Pd-D?BQQhKQa%VzmGl(_uV>@m z-+Rr(Eggbel^G+nBy|+xZ-cfGcJ2Cm+80h-t{1E7o>2|ug9q3RRP|!-bc7B~Z(ep^ zKGD$hO6UgcQt=+l|3lNoE<@#N@NuLrUx~ILU;A!2yU5EswcV^eW9?&o1bIs|u8@T# z>&XvSRd@aYb2l%=jfE{B#6Z>>mhvzx3Ivpslvn2=xcBknxKwVgn(}fR{b$dNQqt0( z%YW;G`u)RqUYLQQb%;bdn(f<>(*==ri8O}|mf$Rn)=P1j&dtLo3QuK2gp~Iekzdln z-Y1;eV=JlA0vR1YBz@5>(J-&(bu%F7je|>-7DC;57WS8uhd$8r#jTeSNTtTq6Qdwm z1s(Oo)@2ulEc%UJq`@{Ov5eBOjI80`y2!mrtmQup(ep74V1T|AOMYyIv5cSY3;Gd@ zOwK0wqzuv<8dt$hMuI}XlXw8(`E}6IvSz*R%@A)c5{(1%{+uKm+a^`3Bnys-IZPs( zIK^I4hsZu43Cn+)&ir!LQxcWsmiey}DeuYb%&|+s*P}1g8I)u; zTK3a~I4ytAgFNk5BB&&wI=aGmNz^R-Wyp7r63=CSA%tdkR~T6pZ6l63en0s78LQQ& zIj3;%jAV&FLlQgpzM55mC;dNQQlBxQz#u6Bv0w0z`PS2e2df&0*yX`T{H^nJ4IhCA)rt2pk z>EwwG{r)gf3fT!S!Z&k>W~RjxXdg9)(3o(|Af);fWiLo*`&`rwoWD)}d_3n>W8+zkV%K7ghADNi-F8 zBBXgR&>NA@zF}Ly>gIzN8^J-cLRxPH9MhXHJNZPUcHrphugw|oM5(3TRQ?3{I}>r2 zE|gta6RQ_wA4~8WR`BDYVPj)^czQ~6Cp}`0)8N%w#n)nzD+xn00yo&0 z7v#)IN`U#)pr|RVFUYv&_;&qIjUw)XH%c_&tOTCep9!S zRd(DR;@X+1Cqpf0G&3RBeiL#=e5a_(FbAI_4Fvh_9QTRs(Xp^RZU*w9z{?qOc+AS( z$z{)YHw--T_0O6`Uk@Aj)^?bb1L#WO0t5G7b7iS=LEfp4Kg)Ne$)JR{1XqO3(U)JS zt@Q0Q9Ma#IQ1WD+g&nmLK6w8)jGWLpKe^+rZYfd;K9<#?@vTFPea$_BStCe_Z)6 z4tlOPQXR*sRaAAzGuQrG(25w$P)(4-MV1sHmGoj6K*){v$@iw-WnPOjU(Cn3^fL86 z{1w{xYu|@ZXb)@YjNkIt=|!MParoxn`_#D)6o+4dF-r@S7MAHivBAB~4cIeWcJvC}~p7tj? z`huNhh}X-Pym1P2HzU}^%PC)kAW}pPpmDikRsoQ;PM;v?AzGM>nzcapM1g+BI*bA7 z85s6~1*)y5w|ubLePxSKR4qPO>xn1wWx{Iy8k#O78)1H(>!I2kP^ynmpY{HBO1W$MAJSAd>D+Wql z5k51)S|YwT`2KaxA@*L)t9+bm{7HM6n2z(~j9S{-osi@Kd?4axTWjm(dsj5d@AEikw2kF>}x$V6w$>K z**$W=qK;QX*#uzT*yVp=M_uivC z$|!f{K`#C78|}|>X7y03(Z6$Su`-BVrclrDP0EMfn~bpn)L)j$qU+N;kc(2{I1Mio z7f8|bD3HZH+MBp3p!|sWX6r+XYZ+W&W)y`4MQpcJb&k6F`XD*Bw#O)isJBo(ZdrIh zAPOEr5bH|d`07;${Br;#Gf9QS%7QxAa*rPh8mORxpCro56=^HdJ)g!zFmIxQ(X?p> zNNxwNqh(+piE_bt*nKga%&r5uJ%r%kZU?u)k;Bk?HfaAKwV|iC_bPzG+BytY=IvYt z4Z=a|d|zeaj(?D!`~kxvyE+wReonkh0> zAm5|JToLz!^D7_afB<;2d47E&6ZvBkNi&6AvnPSHm8^f}^OE?T&i5rDhjngz{PyPN zCQ+CSFF!vJA6vlm47=FidvO|ixq@WBs*axNpIMlObtx!6mDbI{Q4o9VQ**bLbzR41 zo7R5=@xI&bG@}J$H39);F+RM&H*YYn%$MNNehSp-tw`OMK)q7DFH^2iL{L=tw1*41 z-SwkbuDsCZp##tTh>Gd)r@yTx>+i4?aJk$tRTI;%cWjznshUR)#0yHX{aG}^6l8M@ z?5Ao9z81VrbZz-T`Y0wQeudfM3;~+1UZYRPVq8~TYXkl4v~ZG z=93T+ECF_~QkV6o@1`56XxCO3#pTryub9pY%SJyc8(!U2Hz-d+uVPa`L>NXpDEM#V z=%(Yq=C9r2$EC%?*tN$v)xH0oz0JP)h=_DpItc0!_6L_qF#+s_6V|BoM-LyK9vo6S zyi>@`GMCu$y4J8Ny+K&~=;6)W^vfqKp8B0C2o9#!A?8=8oN@X2S&NGmzai(0*Bwy> z*f`Z~s9)4*8G@U^|MUE9ef50WB4M19l~qb#pPE@I83jQ1rJ3i?7r|qnnjZsn+g2-RO@t^_UXh&k{b$xVR#lu=EJuj#ZIg(S?#}V~mDO_C zAb*n!rV%IyhdqP~QeAIbQ$`z zpW(0mS37Vsnp!e)r&0h?<}izOs~##T;k}$kn(!gRgLQUl>HPT}8pa}HSTIe<9PBAk z@Lq8P4E@f2)(}8DpA#90*9`V?p~+gOk4co2`o9_HE}7xGj3p({}zBxB(E~M9^?iS+L(ndY$C{8mrXXfA# zBc!~86_qGe7TqQ`JJ%k}<^5lL27aPBRiiO;w-5|Ftssm*8+OzWA?@jmPkLn-g@l`b z-4~ap91m>_=mX0)g2`+5$E>oKt<5S)vcW!Gk_nd}wH?FX9+9(Zr{{;D5Z;kbDY~sE zDj@_=V$%{62OJ!3`57&4{GPkb&s=OZS-}u~-6J2KgJB*dw2?s2gSr|z z<*VWrA*7Xj0}%r_0WDw-9t0)F6{-)Eml{CxnK8>fUigZkn6W-DB=f)~0{A`9n_tx` zR8&;8^}CNZHXHxL_Q478mzM+gaTy>}$Y63=rHhr)gSWPJLt9(>+xR#kV0ktmq+Uo! z$o)B_uH1b-J~}@?e-64d+A-wg^T+5Y*gWAwY|H}$+}E!^s&WN>rN@DbJb{8Mm2q)r z<=IJ7r7xvwl%}6rqTCG>97+?V$1LTLLzgV-#twNvLiX&NX7?d_0wQLpC3J`6WAis{ zTA9H#*#@0#*7$Y|0REu=!CL3hZ+X4kyf`^bE^u<#R_lbA!r-RVcAVRFV_?yt@ouP0 z&K39j)f~_@cHt)y0Z?WJ7%9151qZ1Wjheu}Z-T^g7?A1xKHyaEb7(x)d=+fW&ab4A3nbBDeK>es z>YFvq6Ph;Tkl4GE9?{{lfE4cBr8;9o1B*w?k#+8V^PX0~vX#{liFm`5RPM6We*&oj zwy#}`Z{MYV-70p!*;o>HGA1S_Et>X$q&XzUEeJm?w>q?Nlau>?FFEmYOE&%DDp@O| z@$PcRCWDlOn7rA%7v{8dg$K2cbXFa0`D()L{o4k~%@lIo3yj_U2uE&;%4|uoo&EP% zvd<^{1%65o{_&lC^)$Ki~g4kMMXm+FV{JG%HdFbZ)Rz6y|8> z%ax-be?Si|g*(8BZHH}F_mtUHZp{@M-X9Ia5yV2mVq&?VmHc4XEP1sjd+y+Dq(cVF zk6?q4CiIJ@>E_iXF+%x`BP;9(+j)8vu4-iZ0WB+DDzX@f*6zcz? zUI2-uudfgIoHv5DW4|ES;Y_1o*dBU&0g+fxAdke*h5oUr(pB5Nu9c(Ct^$Gn=5R8| z-N%Hrzi2uEru4$d^V=lW*O3*Lxo;!CB{;}=VxFj*y0P^i%0gh73lvX}9`5*3i+o$2 zc4!tn3YT%+41B%lo5cNMVRaR2?u|YLb;lJ5a{^fse<$(p=B4nB8bmToR6$R`ZVVlU z_X%na4FpGC|E@q`21TP8*rj*r=}lbW2CM{nSC=_Fv$|MRkPN(QrTp~t^j2N5OfM*c zKUUVz$*NwS?Ns!OLil+yQJmM$l;JN{!GpI9duG1|zYtZq7nwmWyu-h{KF`n@migHv zt$H&G@+%4;HHZlSJi58&q3Rl>+3#6z0CVsAYmDzTS(MlwdS2|Gxn?Jnr3ZpmmB#e` z=c+yt{)0r_13z;@LKSI?X7ut96n9|MeKz@rB_cHRKY2!CNSACC5)cqbW$bc;=ZJ=A z^pC>p97RvtIF3XsRq0FJIxNWEej?NB+*lHG%P~*H^cRm>9_Hu|S-Z74l+RT!5W-|n zliW?BZd3UrygofCZknT6Dnc=dfzQrL!papB5ssEIj=7d4Lx+ZUX++`?Am^@ok2O3T z)e7pFr|?!vAj@PdUBrdiqVL^i9h_3dAVf+}iHRA+5oDw-kt^uy!oan7S6j76@eHCnX&_hm&sT4rCG7}CGA zn84d};f1j`oa6mOHb)u))dlez!#$7 z{J$3`v#;hGi-tE73knJ>$#c(I37IyNR_w`4P8LMTMXVt%O$532QC&BC0TfL>UDZ^U7$1hLG&GeFZ5=oIAIG9F`Ki{mPxu;_!A4M*>f{QG2 zVM6=To-N_uuddoMvi>~-*{wiF{U)MxmtPxYJ2{_@oS2h8mD@;)6^Q;iKqjraNEA^1 zNeIWYwfwxBg`BAxRB;*?!7p?OkYdPwGl2j|0F_I?xa-HulYF^e_Au_0ndwq-EG(>F zM@MZCfI@WhCK`m3Kx7vl{Gs`^?uqZe#QQs-J<4B&L?w@yCo(H*Yu|uv2qE{J3J~6= zfg2|XB({EXQCC**GloEir>(2Ibv=Lx&A+OuY7R!Y($dn16$m9dplz%!u=X-_c0TyL z)yEV-_v6Nh({@hQXd=l#nvnfNYrUEWg*YarXbfKE5Z(?-R&}o(Q2K|$S(m7;JS0F( zP3;I!-dry=3Svn7koz{@O>;Bb(un7Fc38x%8BzC#uC7P(6utD%h6r-?Hbr1d+UC4> zA6*-92&Zf16_<~ddH68kDRgwuBb@m{+TsD4vK0ZF2>(`}COz2_FB+tRY0ZC@m zrbm#Hxwx{Tp1pVmwYZIWxf}-CbhD1ZV+A$Mi<7-2Yju6Tk3l=lM&&3v2teWRFAn|< zi&sLKlAxWKQW2AnhgD^@yXbzwB@YSzTjTfZ1sg7j~ zrH7v_G?Dk-8#HTtuQO+t(4V%ti|j_j>XRbw@pilY{efFd_zT_lgZHf8cNMBX|ENyS zQN;M@Av_=k>keuEQMih}&>`vm_ARG8bWAZ7iq?v^cf^EF09pS?^77n873xBKi>Fx2 z-`$I{y2|YaHirw?qL)iyP!CObTvGSy;i~hWYoK!0EY?(^e&BZ=DvLyr#Q@{6ZL~<)6YBS;M){_wM*S}@z>U4LYHCP81tQIbKtINhba`Xus(uI%sj@B zp)XG>y8&6#2IrnC9QBU2BOhX1%*@P^Aat%DvYuPL*&=Pzp67dlOpk#|$PR~6!mBcQ zS@;A}S-enhfZpo1{2hN61iAsb#lbMz+uYhxcqieV=naG_;r>IHs7d!kbB^~;ybW_T z4w+r!-syjv6u&h6T+c}H!Df>$Gdhf~NB&!85oAvN^x%yAUqWgGVg(LZcs}b%{5>-BIPx* zeg~!ras}IO!$m4DjyuxnI=d{9sj6tk7ScS4ST(G&gP7L8!-3d@-ysB>h=QUnk1|dp zzw2;iCG-$`{3fcP&x0`!H}l71-+@dTAvIhc7N%Yn9=Mb-cPKr+ zxZ90A12rF`WTdRSDqr6mlA(Bjm=(Kh$IsBUhrR_%YFxsnN+}*8`8dX|8-t&;!pss3 zRUSX?xY1e{&r^$U?{5<`W$fRs==OSoujZ}1 zsG-1PuYZg1SbJ&%hxS_ta3bb4M$O&M5y9(l!okIDg>OYW{ptO?2slS_X6WbPRogpI zFS|o}WvJJ$1vHPQHNOIzDoO|@2IMmbb6sv$)=lzYwC-}=`}cVwmJ;sw3#LEj>~1ov zgbZo82t{2tt{|C7vXwUBQqbRcJcf4;?1iLaEkGjz`Yce$emeW>o3JNOpMHmqXK`sM zAWsoVq8AgR!fQPrT|6?lx(d%ATyKbho_+?{@1HO*FnVDfkwJ6w=As;tj9BsnPU>>4 z2<+a^+%|{uDjxhh8Xkix6O1tQ+-z)NlVAo|TwZ<@-fpsVv^hKjp1=}5ybAOd+2{0q ztIA}us^3#T-B5D*FS?wLU({}*G7>pDbRPaWhcGWLjdrN8;`9Fuu~EZl=z2!t);T|q z^uTDM*Xv}5?M0=PssWrA8q7tp*lW%2#}|LQND`);=;ZRv(Ta>pTd9gVTZLCvG7t8| zJ(RYHJXmoMTSkq>V>pDP-g2+CD@|aA?^}atHqpmU!-?(?5sLLJ^&d#bTJ5 zKAk3XSRfK-OB$y|Ier@(JK3EW%=JD07XpDx%bhU{6Nj^}VD>9>V}_vcZl=NCs(a~T z%N^0j_G3E?ovY5&l0M{L0s^DP{v?@p;vqK>v(S?4C^C5xeed%I-t+y#hmPX?`whX2 zG0)x)bNQYNeALWudFEETf~0kol=S7k`}5I0X;(o>)8r4|(2v_g8jWMy$6<27M*Q{5 zW3yr^#LqKMDY4A65=95c5LU}M7%+E%|J~t%lCKh%n-+E35HFG#YYLM3SPzGz2V{WxQ}mh!DCj3acb5S!zn1-0Y5d*(kt?YM&G&zr2DX#Np?lik{hc_<=A`Fr#+A5P)%hu6xxPZ?#gWatwp ztQ3#e{tUv)F`9>-XquRrt)#=eoE44wQ{Jv@f`Xe9ME%^kGR#{pwS^Uf8B`A7kQA`( zFhQUj{{|Qk=jV8un`J#NFrVeu7u4?_6=-OJMXBF5X2m-}b+ySwwr&mPQ*DvFp6=V2_8CS%=nn z6>jWyIb`gozH357TG#o#$Q>R{<8%3rFor!D2{fPl{-U2|oh>{Z(i<%mi*O_67ald4 zjTUN1f^kdOc?G9$cQztBB}MqLDhV6ebo$7qW~*>ur5PlDHbEzQm0$dHZz||+)$qr{ zPqx>kbp8t6YGFY2q9vmZWSLp9oE^w&Z@voN;~~P_w-kC)EW&>tA@g0__5!INe^{(( zd3Ji5JhHA^GOnc;(#@-sQ&UqjsETW(jN*x z>ap+VHNcCT@5~+w12i5rqCzC260d&U?(25fnlB$r&6nUf6?+Mj70UiY0K*dsjT$9L zNE8%gdcB~^NYDT0dzskwYNW2-dK$Ot3*9ra$R*Edr z#Gv>rneIRab!pob$SjYlh#aL5v>_qm)b`KR`t+grsT=F{030-bm|pe2sJ2V#g%XsK z$FRxAdh_focu%przD2}kO@Q;aFPc9Ua&YlUfd4#G`TqZ_D#Ys5dcFQT?1+4 zzJIBgb@zWYlRWQzNQ#8!o8|EAD}Pkrvu=*PNZ=668-HZ~&i?;be;WRk=s#?P_p|6J zSz1{4RlD)De&)PNQ0xQdqv=mcQ&#^baf~(o->+?W{Shf0$`34uE*Frm*@xsY7oB5f zr4~NQc%a0@^i_>MCIU^WNMlp~MT`nj;AJ101J*@4dA)Z*x{K z6NnQLs1c#G`}jt|RaM8&Y;A2Jg<*#Uw2dLCPiW6fwKiolMUk4HGZlyDrNhRGWWGtx z$9a2}!qdkabAHkjT^teXFO~X)oMt$22X zA5>5XU{YQ`%`cF{Q+`@^9}}hjj*8aV(Z-dRO+LrvV7r8N8t+xv`<0eY+RIjV%M!31FrWB~C9B|Xsg_Id{>RrTd zwYZ?I|l4tG}RD6^Uj+^JfgxQOFB? zmxFvra;7TdqR|omz(Pkz5_po2 zxCjT0KpaI2Cl#Z^Xdx-k?cko~MHrZv@|bgFF_J;X7m}Km=6#!t?0ezpRxWYa`)MeO zW}v2Vh)GP8dq%Q)3Mg5GoSJ$j&N%tAAgQxw*}0E3?PauQ+4>sB#_`f`r7}Abl{)Og zKhxLq)>^INn25v1K*<@!#@$8Q(yYCJ0xxE7S8wleQ7;pr(L1;-kz}y*e9PA=F@Ow} zJr?+4{SdEnNvl9?EO}4W#RB#j-t;k{Fb*sjv8iH{>%Pqt$UBcJz0ULzw;shbF6N(b zZCNgMg&A_Ye*?X|mZBwg%3vEdHhPc)Bn-gNCUr=lv;{%oNnU=wyAOU%4CH9KdO=Z7 z1u3Qot0?6BC~sbT+D&!F80ejvs^5kn7!uI*OhDW14R44CmSCs&O!i&|U6?}x5^Q{Y zgBk0dFjQ4R|MgZtmr?#R6|YfCGK|K$G9|p3U%9z)DQ19XptxJ*wU&jRNUMem4Of^9 zx5ebr-!8V_!40$4jie}j;RoiSfzOfFCt)%)TvhRRs0Ir3hNWMpm=`R(9&Sup3%Gr1(n~^w$U$6&sNQIqT?tumABDYs62ntG*bK2 z^Hv@$V7ETjZJh5nT-jW~%t)datuCGAvFxi7_wu-8bcyL7$T{keo1aM)Y5nvB3Gow< z^_ggr4gB0Xzx_n$S4jx=Z`u>#eeYBDgCGCq$rI=8xxepEvyCzzd3QOw{+ue#1)1f4 z;y@+~Mb5Y?mF;_i7avsW;DIy20L$4Ppadt=3!Ds~zTdw|92Vhc?P! zY#iI5$W3*)xzmPu-DVzHp!M3R(5B*H52@ghar$^S`@RGqp}S zY9m0NC5A^)d7b0pw@6TR^j}f_v{1?Rh>5^=|BoG~MUd)CAPLH|P-vR|qLT59q`?+d zFk}_^e#9y&ozL`p2ORj{fgw^uCoX=TrYrY{HQ0D=d%A`vZ+zSM#el;jQi|m>o`8)|8MV;ppi2pELEVRJu@mh{$ zj{msyG?TF!RtYre&`f+{gLm_vI-sl z{{I#m#hy@M3B1v^(L8x^NX9kLAdBnlZY=$K`~FL}2Z-}ps$3r8$0~X&*S5ARo+26$ zE>|G#Z|J~I0X)(?`@g8`_sh#KPuJ2MI6=?r1#-&eJJHKcPPdYYj=<<^rb zs6YIBzTi{(yC>1+VJj>uJ7a#oU##yWlULB|P47@w=|Z#=eu|RZfWT}y@kbE5D#S8c zAU845KB|-5At7=7a`Z(Mro{0O?EV;Qfdcg;@19mTy|3cEGSfW1Yd~&0ABLp9F*$kn{{7n^ z(W~|Qcg0(UCj0$Q-5MLAS99k@*AaPn`zSuWwdxb?(QIpZF;O9KT*1CI2_F|X zu%v{Clamv!cC0ILE|+d)DNKbP!2l~yuE?do?=a8zTnz3vEF>t8zk2UM=;Io9w~-B+ zzS|Y+j|)9FHzGaScSN~FCr52hCB@U`t9dMVB*(8iIQ*}eAbq}Z*I8Gy!FDh;{!^h6 znZE{5oydI_TF`7!5G5g{t4j$hGVo~2(5p_KzOOPn0*2-fC8}0l^IQ}(tPTH8rmdzb z*$}_;{fEVB(aLo|pf!~qf@YGau21CI5MjpM&$c&$>! znz^6`EQgsvzA6c6LJE>1g3e^G7AbqpNErxj9k5nyyJCodp4|wro)8vJ2@H{Bc#gf0 z?ebsa8FB+@ClChmY(bcMrE&rdDjM9cgU6(iiIyP*cNjse4$?YfW8)ie3(;Oo!4Kt%+n4Qo*>tY0Ctm?YkluWd)A0Ppp@(ox z=zU=jtiVa4J&*j*areXaPMCFO6Ng^8>%27I@@h;PRg&ST7iC6H^#vt9^V#)@Puite zT|8V_&%ClcZ)>s6&c{Y)RC|y-`)ZXiuEc=j%r8$&dkgdR_oy_+&pH+Pz2xV6QYn9L#2UrdY#V*u4s;hbsQofs$&*#mEprz$F$&u6_7bF%}7 zq??fKUGHi#i}yplK_ohQ!;x)DJ!o6?yACNBR@&_jh9itnmPf3bd)=4RO>5LRyJ9m`;%=ts107ee)GCTbjLug(UTv%Cokf}Jhwi=*LQegkSS5P&W&F1`*3 zKo|Eu>3PaXJlXu;V3QL6j_X8h!-UJ>^Dx8t*``an?}W5BST4F`i)uodB>q-j#um(A z^m0*7pJE=p*3M~JNr||5$8$(d!*LI}6`<^BSh@CVM4>tzB~}0B3*rjn+lcZ3T-k&u zPi;SE3!uK}e{shT9%L;XpuR~-xdqZ;17o!RQPW)y zHU?-2gtobg-T`$62>M7t(Ukmte7lunctv=(;_jp1O2{MleX)yt*~=QW(Sp*{1TYv2 z!UV9Eux~v)&xIUxG!)#(p8YmR;a7ekA`vWy!0x%4g_`jwT@^o z*LwC*{d*)n)n68p2@M-)7?$97+73*rtNaL9Qv&aZ2otT*z;O1Ljo@d?f~Q&hadv-o zb*6p39g2eus6r!ThCw9*kvhBm@~k<<0`)R?DLI7ATn90D$1Pys7JgDtVM$O<6aOb+t7m%?dB}YkE_8hMh?(>* zM+rHde}_sR`a3N8+~vXgY-$PbQw~4zgAErHZlsPO^S)@CWFwu)@qncydeRv+@2h~+ zXLKB^B01bNf?Fvu%e5-tjB{DA`C6?#F+UngUPwFW^1%2H+`8Dr*UXab%P4l5z zvc##P{K?pos5>%(#k7)`@|m>Phfb4q;9tdLiF5Y6B;Z2&;iUA~gI1E|xtbc{7X@r^ z!Ubu!2WqS&4(1jXIZ!9V*TW$o2nIHhIy>phncA-)5WERTild9mBTY>*xUEKP+zK^| zip%R8D!od_k6!I}=jweCttVD-z)KlqTT_)$KToMhYPJYBzg`!XU9nZ&V1LJq!s*)qHqsloC;nJ&a1G-t6=b;5aB=f#`q{85Z4Rj#&Kl{LD z=v@QHZ4I|UgH@er2LUhM^UX@%Gk17$*rWM>(9L*^9D`8D!}uyQ1BgSs@2CK_2kIO@ zKR+<3308SCu!V~@fp|v}9@f~(!vi)|+Rc6vU~Ws${QImBgVzC;bGdWKr7x%&+b(D7 z3iaHcpcI=p1>a`MYAgqWOoTU3AB9r9NFlx4Jsg~-}j?c7n^ zp(OQw6eXytBv8gNM!q9)lPWwMi{p-}y4NkD#A;tlOF!gUz!RN;l{3FTC*u8*Un<00 zPSU;idL$0#yywS1?%ccPIMCH){lw00$DO4A#Tnk%*cb#+rsNG;-S9rzFoqCJ>p)mR zgNeonGQLbw^92QzZ{15lIOm3j?!D<>-&V{UngI?A7wY9jftPat9S%WAAS@6Ado3Or z8qzw~QQK72EA`|iwhk$$h4)M>^a=1e>IhgY8sSpuiIGzs+`M&IcsAQI?d`F1zo}B~ z=NU8KrGtvQp=!kW15(}0RdF*dgA`K%JeLboT}qYqv=KgaXxyj9<8-^Ze%%~%sAoX zTS=-Lu9cMK@ejL}0Ga)2D@4MHt;P6w=Fw@?ohMO#n89N$-#^Ax-|otQ^}74kT%*_* z7-QIfHf)|_2BAxXj8Ww#%q6Hm53n;;r6@<#mLaO?o`TKE!Lcpk-wP6{DSq!0JJ|MD zE2yZH9JJUG6!gY(>5&sew7;ADlJsSNt=G^`%0Ub2Yx(yA(1cXuI(DGHY$_+#?n;4quJGf+GNw4m-yah9WEu^{K0iBzD z6WnU8P$#9s$!HU?^uAET&1jD;{2qo8DLFX~ID1#t*OR<-a zmJv)RS9(r9fQu+Mw zeMoe>1LHTLmeJAU-=Jo^Z%lp-l*$1G1uUQ(C!(Q=K0o(?EY9g>vGkXk7#uI zo~W*LUFtTbv^8dCW^X~ts4v;s$lZ+w?FO$u zcy%TOB=_*G^0n=(ne<5%#A}bS-FHv1V0!8Ja}rl}$LoV(iR8*X>n>T05AinI+9GrU z0{SoLV$?k!Ep2^#x2-24oxOEKf`;%}7^-uDTi;e*`T%9vIIWt2I)7BO^2myfz z*=Ev;OwYm(vwHfm?k2r18I-!P7ZcQ%heFi9b7AQ-w`D6r?;roXhdi5zw`qK(l?7A_RiJV%LiZvPTM} zjd>Bw%Bh%nYFBzaSWSDx$mL!yY-Rc<04aZb@Illv0Jhvaw1PGW2~biUq4P6fH8{G9 zv4GK1zS3B~{oKmjyecz)GnPsI#}j*r3$!pO=$J zOqC-j8Xf@5j7YEA&KNv;6>?FO<`9&5R}%&Vw}CE)C|L>G+SFH>p3!jF@1!oRd>rnC zKnRYwA!m53L6XeruSJYV1P{N|{_O31Pr6_gO?a!3&u+P$UAgZ_t+k>Ai;}FF2hMpk zt&F;vHU({-=3SvRCKFSGZ$GBc{+*rBe}@sPMoXEmomr9-@BVgn z#RVwqKH@?!l)K8*%6UX+Pgj=Hqdp4QBi~*9V9^8x>}K_k1=e#0l5<{~CWofO)9FHg@G zl1@wSRV_3vI5RsSY*b=e{?>Xq7!jFKtV4-PoMa4=h$PM5zke5;g|p1ntQckgTek?z zQwt~*5CleCuS)M#-D4_N~Mk7oKrC9$F3j7-$f5{y3ni(#lVEb^m(9 z{aYuQE&S9j-GVbCv*LVe3E)!|;z>CXyR9b`zyvua2!5 z=NuepTw$r+0a*IQ)m4q{XrvjP@_2XF`@g6td^kdl?CtTvnRFM%*Z63RBW1Jw$G?7^ z!o3;=bhu;)L6~du_1=Xsg%~JnnvI~}g;qtAT+IE`e>opwG-8rdQ~y!}@c3Jnbl{T& zh0#N>Oas~RjoL>{SyhkA3yFq?hI3?* z`Xxx}dzgTBK5tqhuhc@%Y#qV#}(GDLw_^#V20PC=GTKK3fe z;Nhc3A%L^gaE~m3?HVWeROaB_%7T$Ei&fzTefh~qi6JrvrVBo+0Xldgl8)k?1oe8k zSr_qZaC*n6v;Qj)btrve@*`2Xd!POYpZmpCLf`Gu@^bXde(Y9W0JTACZ?JBjR1sO! zud|rq&L2OnJ<0jOb{|t->D}L-IO0C8xX{$dsK&ex4{?wXaB~h$FJ@9xdoJ}K@1s!fn52Z0c5{HeBkJ6r4XTrHh*a0(QQ%w~|}zK2d&p4e45v8?VB&mOr^Y>k1^k zLtt9+z{5c0YDEDlNfziWpgy`uO&tmK4leA@{}|?0+uPX%175ki0tVaw1co09VO4#p z2z4-{JgCjlrJfqlz;zPw?k#P$X3BecYayC}txH*@9&QFvt#?wL39skTN6>{XEk4X95|8=HLc?u8bt|*~fg2QqRAORc zc2kwtK?B=sZ*QLm7ujF9XdRuLq-$Oxvyg6!Z>4&Tq?PyI)&BGdR&k~PLghm)d``el z@_(564sfjFw(Z-Nl_C^bNwN~MH_1r$mYq#fvisYzql|2Y%bpnD1j=M8qbha|X|O}O4NkZT&ueEs~~nq@Rs z&s9K`fns{0J4O9v_%DmOAQvU~z#!`|2Ic^jH-tK6U7mLjjpWZ z&&|t=h>gWX@#~c3V8K;$2QYRBDD{HKjr!i+k6^%}gECaMr4*En9M#CxD(nLVK2)NY z!v`=udJjV^9X&8t2?lu~u%l0rvoo+mE-n03p|{ZmXLJON8>bv9Autg`MO77kau|L4 z1AXw_UtlPtuRH#kcOYkjiU8KES9$rtD-;*lZZv@(&0!mC;L9l^=ow9*#Qk$A>Vs07 zRj*>J{Cd8sI$;e53rlMzfI@%U+N6|~uL1CBz%Ik+yYja8CB zPX;HLBosnfkcBB%ZF-lElAVj-wJsAWboT{&KXez?*VpG~Ro6_R$Y}a>UzHIH8@mUF zjp*z#_?3F>NB7)pbtExTx(kwU%fC~L%Q#a>{Qg=yORnf0)0}28n0;TsX~`Ga3*k=K z5=2*h{nKjm4ne(V>p<;r^Q~{EM87XwX-}Ueu*dH%%vuH{tQUf==qQp zN*lpKr~FFn79pkxwpYW#SNZsi3ioCIpwvDu9r6$A@=BkT=Y2Ia{9fUx<^>S73h0L} ztbun+fYbVjI=IP9q@~TOB?`Hy=v*f#E<0qnRaIK*D99eO$`6Cdw+P(34KRVUhnso` zN}`F@znQL&d4ii-@3*vYl0CBd%kz*!rsmbz56Q`QXYWDB3Isn;T-{+6N|-Lt%JNO6 zJ7VPiWV-FlukJ$0B5q8WL*%itGM;U2(qmeE;1oKC=h6yzbx`}X{aRk=$BC-J^Q25A zrqfNx8?Jf@`qR^)_Z&(`M@kF9b?J{dYzMJfqtKPIjTYO)lJ1Fh74us8Nhq5r)vKgF z)*!|fiokWpklcFwCCEE9;~u{_*ae+j3bjF90eQ6m$qGfuVL{y)CFcj<^zi7&2)-g5 z?KGodSrzX2dR*@U)8b(jKn|v%f^Ge+fRxydl3`wUuX1MjOjDq+_?XP6sbWxl;( z(eLhZr{#}=VvV?@wRFLI7~Po=pG+VrOO<8Nb0@@A;2Ie zsDj8vTHM1rm(xz{dFD1)2|ek4}jy^yaPW3bpv5H zP36Ab7*c@-%#k*5zj>xR3);q632;|Q;Kx8se&sX1mkW=uu>TF-0>xOe+VvjqM|hLy8Hn|J;VLt z?BKHaxDz3>f6;sUQN0E2jVIz?ImAab+PlhLV2u5sL`N-gwcJpVr2}E2FVu_P?bEeG zeL9qiw4bo@BfhnW85|H%EOq18oV_Faq~mw9mr*PsCSVdlM7?288@}e_;JP@$NY(iE z_aBSys#4h`{0$T{HMiD})`Ji$!=uz5PW9{F;_KHV<02voIaye8%0!lX zEVg`;lHSR{RnaR5>Ke(~+@po8R34q$2kEk>E??51vReW)!loUk$%x6?acoVBB|PBJE8eT||VHWsZd))sKiqu<(rNMhFYAMxi;DC#`4801T> z%6%~vhd%3OPg=qc+o`DdPQCX%(iFTGW=uTk3qG{Cr#+>2ow4cd{pj1ycI`fMY)zKn z!8xEHV10vF-xV&17!ai1hBhoPT|S2X;X`n$xWmPzngkz>hUfKu=1?@idg)I~4$)8e zL5rsSYiq@ZMn-=B{fmo*g5?6tsZ;J~NP&i|e%xH1r+4-0NNC$V-E1 zaBQ(UTxh3+m}sAjWtl!szkYyMO~7s=!R_CQ9|)>!`YpJ1QK#JI9aKL-e0Q0Wo{^E^ zyt|-a1j65Uq~92_oBb%S8m8yxzqB?mFi=!g?PZ4>-1%^e4ya6FV3Uvvhnp6dIX*!p zp)wB-pJ*hPUUCT#St)Tf=e(JPDAzJn3UJ7lVO7RHG{Jri%FpLO$I#<8`t4gJV&C%V zej7-|GE(>mdquC5%BB0JTHYa@zk5gUE(JPT)qW(&&jl_fu+G~hm468n>FMdfBpIuI^ij0k5I6m+9}FjW57ix zsCOr8@oF%hhBCNR_~7-WiUlMbldoW&uyy>;8X%XY<>l!CBu|&r(*xFdmE+D_Ga8e= z0;yK~{(VxsY9S$^%P*{gdz0SteOFgkFdTK1gI}LqJ>4IDsn7X&&EA&JGLD^wD~o$p z(iygR3=Aws2Hd0pFFUwylxPgWFcg59gYgR3ia36^)olT0sUsxYKl!E*?+?Yc(M%=s zdXe!RjASXeEr_9!_6P1xUKe|w){8}IG}_-SEmknd{Z{}ZJ2?H1p^LIqmy*H+U2G%h zV^dcguA-sflxZa#E=YM$gQsm&GGxPcP`W*m}@Xb4u)_*z7%K;d# z1!ojMB3}Td`=G0)R#Lz|P{5yn`{bM12H*={{fTb>PDHqEQKP?mt{=JZzxTN9&zmnX zHIz#@@Nxu=f^slcridZ0V=8p=f#B$PUX4*PnQet_JcW3A#$}A5=y%_oFZv>^Dfj33 zmY=MvY+<62I@lMar?1RK+qy+>2s*nTwP11i3hSNF?R31XSVA=DHJQp^X&>HY#_1W- ziT2WC*F@CU6z3f(SLCga0lS3GNDZ+0i8Q7ay+_SSqV?2b{1T}ZyVW_Xo|`Ynd*X|X z{Tyb}WLr~|GHYia+N6HKOzsSPwJXe_n&6O3r>|UT$ zNec*gG71G?uR+gSQ%-Gi$fN9)=iuQf0}<`5KC4GiazeWp5f>MCDaN^hT3SU`ccsIr zZM8@i!|*M48osW-jV~e*#ut(1=6-RH@eS;^iC1(Ab`~s0+a|_JHkTLeW(<1~V>m^6 zA$j$`fnrnkzCZHBf6VJ-OG&kpQ@{hJA3$H6zy{+JAZ^$~0kFNdta^BIqNTC5t+g?O97sQ7!d^E5gW9$Axtb*`8)De%C&K#5|(Qk4DJ#>NKL zo?IuWOO4=~&HuGdt7-bF7Cz3&#&E8iojJ0TUQzSR<_GF9$0XkV97>9 zIMs-JIe53rJ{bPhXmVt4Hh(pa+wO3DFUv&xSr{8_v!dVU${TB|k0jm>JOOp7mFn_InXxOl~H9|4;$@XooIVvegPOFd?)eFWBJfkQMWh zbw6+0otRL)zA>4sMGS;uQFc3@Ywj*B-DiOEC4cxpjMy5?`^F5+ z4_8EtvxWakyqQ0I=RXg4|8ryLnw^LE?Q5)Lt*W%d31oPf5fWasDhRx9R;ZPf`Hran zUIK6pALQlca$4_l^73BI^Glos-D@n&G{bcCd;4DrtgNm!UGe+fxAVZm<7~$(wG9)! zPCZqrLY1;3d9Xz5fX`6>Pp7p`ZqDK8=`>?+61H92XVEd!IG(qcUeZtpw-sDIii)!L zU)b55tKdIFgfTFD5~0!gERm{o=XxNgpTsoLCwyDw!5u(>a)N_{6B>+f=WX@w!$jrp zu+4s%j>E0}rEWH@M}r;L1n` zbfpgE@9|g=hmb}j0WJqK3V)->j~_n+2;7S>5s@C=+e#2}>WnXK40?)}kIvQvkW(yjwr|XE67m<}2ITgIE7S<;?Qp9)uGF4(oH~YWWlH zDiG+o9q61aZJg2YtX(5N59mzvMWSDi{6aUk{LrQI%7Kq+@>!xlyE`C#%AwL+t4N6l znA>T!0xe^t5jL(Rcieg=gOcg(HN9~_y8vX0F;G)u01BZ2{?r(v>mtDWXuX!>g?Kq{ z&Aa52)0|hFCH`hwqK%D0ez-f)oQ%y{Pr7eSi9sNAcmt@MJ%z2^m1?(;RVPUHO`;P@WF8Di;oWBBU z?faA1iMs0l?=#PCFJ5?eWxvtoeUn)~88&{$5C?_NerJ7i$N=Z|n=Wyj+voLszRdna z$OWZuG@B{?0G%!4T|9FAz(_Yc7ezRiU+|JG4vdmZ#E5DPX|H1|4MkNrV% zt7q+E&TyFPckO#w4`m6S9 zScnV@cwY3ugYR-XIoAm4h3IhUwZ3)>RohQX$Z@6YuKADQ2VYm)zrhbf zpG|Gw@1c)x^9=~E88(*6Hq$s*vbu%qR2(BDPR~qCe{)$Z@o{3S~Czf zY6v?Ys^&w{pekbC)1VG-)>eC97-1RCC$N3PMe!j8uD^FYFbb_FLUjW2Vg+Bcd>V&_ z$830L2=bh5J>dXSh06**`?J&-T#d!Tu2(I&9YVg<{vN|zzDYyanIs|*|8MTR7Px({ z{`ZwoPuYl=9vv1l`10GHC-|_;4JSrqwq{xU2On=k&Qk0-GUibh3Rbjf+(=0BhhUb} zoBjE|%BqGqdi?5RB+ue&T>-c61)@hxx<7EBuEK_tg!t$h1&COPhZ{B%JarJsf7{Ac zaomt{X4RL#U+uK zHM#Z1J?W|X)q7f;jp_v!oynqqqgI0ZZ%Yv~9KGgPM?z;ztE^u;IED&>zAjop zy0E}Pv>|x#yX*y*L)f5-&vRzKQt7Wp8jHg{u;1TwrSeSV-tvq7$RAd2z0CLalveXy zPBg++JAZNGN4f_v*(XymmY=H)Z5{=Gct?(&#GJO0_PUVf;bYw#xsN?|)Mov2O;d~l5O(3M{fR4c z3uN@7`MBH)2-%?d1fl5$Wr*#Grh=C22ZnC5KX?SC9R^dYtCWPE^|RY8<&wG{Kch$E z_BXvStQoyhEwO9MbexM>2?+?!AqQn?tkC4irA;A>G-3svzB>RJ=+aD`1SXiDFJLVi zptcT+@xkky&t?wc(^uB_(#ul1uh1T9=_kd0#>D<1Jf1`K=Ivt}de2VZ0rKc?|2^J3 zjbg)4kcLizx&7tzZ8LlNunw~wBDJ0QNt^#iI8)Mw37Qzj6u&s}%mePiV|9Nh$e$h^ zI7kE=QTQt_R+*C)@=`1Z*C$t-c9VY&SzL@Y|2BX;e74YUZgi1xvyVi_=X3A1w%_`V zJByvkI6d6!o8uS+yDOyiRRRsH8+Z#K@Z$A=`SKZ%vC#Us74H{sJ?7YLyZ%%ikRZa@ z)z#KqozftF*F7emTlAT3&dy`uK|#h4&Pe5Ng^nSB@jH+(*MOyCL+yTzZNq!F6?NBh z9)yP{d8oL*J8pQiIf8#8{|v|9$c~esILavY6+t~WhUZ()X%5O_r=8b7O>C^<$tIxl|bE!x*7`?d?98xP6Jv3BKm%gcE5`mY-GaAu}F%S?fmo59$x z+A25aB$s!M0sKd2&SvKY9n6v*zo^7Ek?gSe!P^S)j|$#Hs+cj*ZMhs*)EevSeU>L{ zM0?9$8UP1fhRa~^mc28YegfYo zAH5bdiT}9kITUKVkBXUH`q#Rdv7(Nt^qRb;Ec%oXcMO3CSBP~arQd(}7~wm3^?^pR z%oohTNly$~4n{_7B;TM$T22lR3R&|L@czJsDG3PIx}PmGi>@!yj|htO^%K%GAproI zf@QN8P=cCfy}o4LI+7{kn|+x@o>Sy8hT@r2d*gU<>_^yq@0?0|M=-7R(TK~AlmxD? zH-U$T_^>^lr;Io4L>UI3M8rh@62}gWF`%Tt-_PoD;UH+CTe_U)Et+vNy@Z(JQ zaXToUZZiPg+1F~JdfhF=N$hPhkc9k&owsUFVTzr?l-)B3AFy9E`iqWwP|Dp}W`xxH zJ0%Ibnb8sB+QTB6o1c$zDav^ISpwd3q2{wUR5Lc7*$4DyA%%~8?j9jPI@RBp)L&CB zW~@Dwgr(jR==nGIQIc;>P29bXh(fL0gZYDtTk}~^#x12tu8R@-iq>=ZT=Cw@KYZTM znSOF~c=*XShPoJjR<`-Fbi|;!%IaSI0kiUlYUWYd?Un1K`4_0cR6*x55aUAKn#9D4?cK?c!I7elVt4utV3JcT)VGleb;R9xOSrf-I&^xR7uVb4Aj zB)O2DD$3- zW>;JP)AmQUYd3JQERWH}(|*ZlF_z$ZJ6}Z+1k5@af7P@$GD}c8rzgJYprek}-U!gJ zR?)DHHK;LQG6+)}6WE=ffdNwuJPeao>nEWin+cN{exXCx#9f09luPY|7uW*a2-f=- zM%HAlIZoq|^VqRgKUta1D2$5dGp>18EK^fc&%klTr3g5g9R&3$kaGqeV7_3I4n8wr z4wwRAQ$ts#Vx!HjJbn7q4xHx(C1{DkKLG_}H1HUW<$X#05?pa=$Vo{<;0W%PmysEA zgAZUcbqF44-%(3zzn*X^jHYvrlJSo)y_t;LdQ+ zmMG|?1Cy2+D6ApAB$mrO48~N!P-BwPUk)8V-k_pF5>%u9qI*IcM@in9xHJI#glnNx z@i!Z9keOb=bUnW6v+>G6$gPT(jcwg!e*R{rqsz)=i?pQlsHBJfhLCEhc;ze~%nZ8W zk?dUci};4-ZGD#Y-WAd(@*k5=kFIpRv3<5*ya{WC37U3AU$VTr<{R_9@8bni+dirz zE5pA%?;9|bSi})wZv|dMm;bgc7{KS`WNG>&yK`M4`%`2-@-?!C-PFHPjkEbj$VU}P z#mwZi2iG-7wF6PKB@R@j9)`vGwsDW>vWjcy6|&iP!j!XS7~0aATkJhx`aBp9IhN}a z)uVsw>d;6Z-)9M8^-AwOd|t2n)~SdGq3b8#r+u6eu@R(t@jdh}C-3#~opDZ0gW5%y zvYV`)uxoCcm-jbL%K4Fhmb@VQ;fHmEr-f`F4D9bH`$ z7!c`|>IkRfg(X8n`=|nH#>?zxeSKh!Y(jr{uZ=}CVrE6VNpnEQzoF!|jO+h)f zGcKh0At??Qm?ThfkA~B4KRgb9a7_y)BR+8X9>Wn#2LpX@ZD`<~boYVzp5P^^Cg8uM znzJ+DJxywea~T5a$%N4QA1xpX%SwtCwCbb`j(or5zl9Y@g=k0bx!a} zdsyGT9qCP}9i96)Hl~N>dHUmjOFy^L>>m2zyY$RIi`E^`bBb)gc#}WXo<7*B*-a?f zu_(;b@oouWzE@Hta`e2jRxKx0@)1_qW?>PZjw>*@U4aXKX$wkATsts8W?V=C<3Dt( zBvOT&VMv_sv)OO6e!^EnbkrAycM=8ukrV>|Tz=8Nzi(NDWt&?Vt+wQ~&7Mz^5}$f! zRnpOyN-n-D+IVA*&!e2CzeRl^mF9kM^C;YUDwy)^l+PGJ+xT;qt+8v&Q2^O^}4@w7p`#jMAk0u8W|dTerj{KA7ULQFXMd|PA#l)*|@{B z7Y>+b(%?dr4u?pGHbiEDjUEP&F2Kkl{unxQU6f5uiEz;{*So`M97bW`L}2wI0YH3Q z=uGY$EqWn8oRACn=q2TejMRSdivPsW6}ddzmR8w!TLRChOj~Bzz*9B**?%whdd+R) z>P!&tp`r+HTiq?0*wE%`e>GAy-{rJK^tkOs*W=GGsM&-gt~^~8yrcM~_NbN^<*ZAY zgNKjb4J^vF_?bRkeI)klx2s}xyq^rF|5do19XsAv=ru>_<$IY)LcHt#Igprz7Potq z_V$b(U&Y(|_Ye4J*REajf?|{z%_cKdA{k`Nmv%mV8KG;~B`-%^>sHh!u=A<04cDWq z-}DkuAL%L@+;1cA-@Mc6Op?)%<*!Msz1&VYusUA$B6uF~=kE_g-Z@jQzT1C6HM-Y+ zaWn(u7A(T!)?$6p!3+W)Z*L-WKCK_myY)8}ep-AB!}tUL;U`jxzD?c4YO;t#4!`hx}CUFN+NehhgUc+?k>HCJ6AFf3x6o8p_ zXUA{E58l1@{dZ)sao{zqppUQhDu^9cr|hpjdb4mFVFack=xZd^6L| ztDIOd=A46N3TEFowg0r;?DMv?lSSO^IqPl8JN-uQ4OiD#VmsC_8XiAFAtD8>tcE@z|TgV%tSw9k*OZ{JC zg8dyA5@{{d8pN+JRte=PL8pp1pQI?*hV%{&B4$QL+l{|}ORV)}POysbSuZ*xM8$2g z&Y_={W+IgR^s?nV-11$XTMgFLc|Djje4D<{JipTBls{@!e@C6E+-7Wg@Se?P6D(cH;*kD7kyZv;Y+QvD?*ER8Y{bqvFrxc%+vXYU99OrxIYNyL>u zuWn=qDtkrz%4@}Uvi~V$5I}iFeZ=o}Bxui1NLrKXq`z3T5Noy6>b+0}i{7*MKji47ZS4mo@sxwj) zeIPW{pKWYIA}jcqYNB66x%~J=`~XFewcE|0e7I+;(p_9G`#9yMzZnIVEdApzDz+|^ z$r=ahPME1K+w9u=J03v^sh05ByW&$mItniX!xWEaYw9M#BQ&W`RHee3I=@8AFl1NL zn0&`X8eEm1NJ~EhvEV9qsPrtp*cq0dT+kN{yYU~$KNVOA{S2Pm90rMmeoMh_u?N?cl-9Y{}0o@ zc%5(|J(S`saatOAVAU`<=xeu}^Z$JwCIy1biMUru6{!dQ^Gg*ExKNymsaiSy33G#S zsl-sSh%{w%MB03a~tWl*`->BKwVpy;5BOa0n3KO4J z)`B8UB;Pr!-mLOU3$sy6C&xAD2gQgyW13glPjYK^9u}q&e6S6 zWYwEw86v^=kKh1taa+4$cop#^yYUMlG^F#aeQ<`s>uHPCwt&up62m%8xI#s6{20e)HwYMn-Bi0^=3`*hm=KxCj-XDnLvL(CI$(~ z$52f15IWhS#&~Rn-dp}g9l;GV|4?|=yH6z03=}N6qt0>S8+v5Yf|%>|K_P+tkzqK~ z{kP3jFXjlMekQG~wgLk9(rc-%4Dmld&{mv@^*lqNp_{ViDNkhF?`KEtJh-OK^Y50Z zUX@vnhgzF;?tYwS@;+5lwqI|-YL_Kz!Xs*ScDC&5)t)Ik?P9~H2FV_adYbK&^#{XF zznZM_UsbWWb^g;@e-yo0e2}o3jb*Y|zE&fK5vxXy+-VXVk;4tj-fNCED!%b;G6VmD zL~{@5)HiCCiZb|t#vzLD085XaC%!tiX|__Cbe;f3MRZR(RS8p>v=l>3 znGHF5n~|Pg`Cf`1RH8+gd#q$RF2Ei?Xr6aydLZn=V)&Ls_9-gtxkgl?<9B(pYQ)c4o`XfCrj}3|}Iv^;dj~aN>dQzbF z(zJ3Pn=LE|OQ56sf@GZmpmk;onzT6Nsv&sN9N#@__zq54Z|>rHqt}A4L-@bGiGAM~)k-?YQ>y&~p7Ok05ItKrCg|8ku{q@Lc~%!~?IgI=D7&ljf5ek+jY zvuYQmReXIx0qPMzWZIH}knqQNd!~i&XG#7+B!kR}iUHx*?lciX`E@Z%Zq`aYb;}F~ zVPU&c`f#LvdZ^}jS5ZE)3FB)wikr|sLq4c@u7MP3vasN=BD4s?zN?zjJ61VD`k0qU z@nY}KXZbuqr{&+4N}Xh%{2Nbv)mA^mDE>^o@R+1Z&$Sow6lfTpxk7-kPt9j@LC=ck zbwEAUF;0uB&2y_u_x{``59J*ZHO+WcSBpnDA64Yxk=oJXy?*=;Jea z@XM`76!SC&nY`iB?U82uSe?ccWK=vnK_b0Z!ouKU+t5BX z9dbVU?F~iMnzQqx+niZSOk4Zwx}Owx^oimG^i>!+BW9caKUaelCjqoOvb zSw5ynDlm}PFTliD9PQ+r@uo(oL@uq%Wo=!S2N@y!Jm-+XBBlz zMD$#5(Jd92%R@s$rkD6Gc~I+dB?Eu4?a6-ez*U;>2aqZ#4D%PDf`jBr`XPbI8al-< zbUdrp_Ql=dnv3%jXXL>;$V7gMBDy`0{t4Hc!o=D-7z~=k zvQCBcVpCJ;zI^?9v6Ee>wbYZ259*(XC^F3s*%8rq5f<7%gewg2?PB&#&0I5l(Zq7W ziRftsS}m9!mKKsQ1o*6_q}15`vAK>g#GvZXWZrHwF;jTL`p4?B66?%J;%Vq={{HLh zMYO>IB}*Sc$LY2AzP`={GS@@n`Mx0e)Cv2ye-50u)c52pH*aF2JL|7{XWXo2{MY_! z&H|V9sT2j*Ddp1Y_I7X5I zT2tAX`2D$ba`Tp+PDR1~$#cn7vi4h5ZO&!)d3gtOR(5igo}2}*zE_os880DOY(w+p zOjW0}=c78=+k4X*x1ZB&tu)i@DyvKi88+{$s)QPchMW)EeR3YSRg^Vjd2VgltI{O1 z)p!14^;}!lpP5S*-}{ql_uyhk07(~?Q;|>u-MNg#Xc?R8&Tv@g;%k-?-cg`byjv(8 zFqU~W2=Q@MF!JmIW5_A!wJGuZB!F^60#a-?0z$&%%d5WFVZMb2EJ83mk90`Q4V;_~ zxZp%{)ng|IR2B?fIXF4d!<*`XE}#W8THe+EoWTZInA=EZ10GYQUPrEe^(}NS6ubdI z18?-g#J})YS0C_w`c~syy{S=iM!C_S^CVwhR<=3ER`-LjGfLT+PibSMpG;ap6$T-L za}nq*9#w;`24v=5*qi% zqKaqDc$4uhR>YSS84@zBu8ov`D!XQZP(4M z95=y=z7uLxkQH{&26kC68Uuy}er=xFq=z@H+(b&OKbuZrVc{{I4V;6&ObTI6i+~xT zI58&VOBk7(TrYpJz_i5Of_q8!W z+~*tVoi6r)L-!+OdQkQN6lB0qgAi^Y@Eshn5HnrozmOSti;V)L7|X3wxIB(8ElQ6* zA{X)bsQQhLotc@_jSUg;H&W8kvHDc}%g?a)Kvdvw3x2`MXf+%zvA~6=@b9jHJm)s% zd-A>cqeOqLHt*MARW)g>2CZR;dK;p7V{f@uuQ*B26B)SMHruz6W%7?i**7?mKF2%yoM&BKT1ctG-M4nb?>Bku#2>rd zbQX$<^G|{*u5q=aNRoc>>D^yv%S;lZE;D~C-Ij*yaGKbK#5SL?+0Up@9Xs0kaSf7e zH-x4S=*RL90GH0U1W;sdg5d`SN~g@`h~d$r(!7p-y;+Gl>rx%jL_y`8 zeu;DyBhU&^nK(MVd9y}FOza6hUN+#Hl?8)0X9RM`Ao~p{lb3Ot+Yr~z;k;!CDyR~- z$B+H8b}g-KZL3#7+e{zHK=-k^mV>}`ZwW1u0W^s3@5)C{!JMD(-DyPy$jE-qIk=!! ze*7bRen%rqt?0k|I06@pcwk#c$xVG!&}I(%>vv_XtGK^!*t+>&tH=)oeag4;KuGEK z$A4!pYivI&=|4lSeSle~#Cnp*-zkVvV{Vj2vKWA|0fwe+YnL#zF(p)K=)?lhy340u##MX8Ihk(-asYbwb=Z5o`&fj ztD9Iqw*z9|75Bh7Ur(cVX`Yy`N9SCJ$iVV<8yG?~ zkENwWz$Lscdqi*$n3_AFh!VLY9ddXE=;G+DUiNC+Nuz0ZL5d!FfmtST;=%!H9bdZ zU2b5tPf1zXD<}vLBzK0uA$@d}`zjo$z#69MG{lWDxj03uy$azWbHcxFzuwPDEIx6f z?uyvm+L`Un)DPcE1kS-vR4q(5gHQ=)yjcseFlBilBrN>zA#>??fKDD6yfVlSEwXf# zK+s5AYe$DZ{2kbr#v&vCL+4D;A5F66_zdJ%wMDtViZ4nU9gJ1x9=+)pcHR8<%iMCr z*UekhZ7=O}5biqF(jo*G+8(|w7Wf`{8QIoO+jCR|h*s#a z`|sHV0JFoVbv}~uyP(QP_B(9LI&9so-dJL?4EeY7BV=k_1$p-;ewSGGwt$8`^Z4YF zpkDK8*53!MJdqmWX-Q&QJ+xF*ersuKM-WJId3lK^ycQ&*>AhWySai>r(7Y+4EaYX3 zp6A_^B^FBEpPd&x6#7*`lEPuWC6=wmd`afWXsIvCRpwQ&v|OI^^z@_@J>Bvl5hp&J z4Ht!{x|a_(F(gxg(OeKnDPrxiZD0Tv3{<5dd`xs8j-9=(pSIruR5RD0h8h;FH24C6 zzKR0@nQ=TIpbwaWbSxY1%7M&25g4en*8@{X^icM6fiWPK91#?371qmdN?MyZs3tbo z?BocP>d8zmPQno6vT$7%YznI!7kV2~`Ff>KKJ{r?{hFJMBt6U7UGTd0g<|UqY|hfh zBv5u9x{JV@9#uPDs-bM;A4qaW#Cy4cm_iDqt$%6_=mHa>oa9Z+wnfAVu? z#<&S4?O#et_Qv7w{ai~D2S}O}x`u*hArqNqREOMnY8f#ifn@!ffggpkg3N8PHn*)NO&$P}cbUej@*u zhmD3>7EB0X_FRx=qH}0hc6Rn}*yF2OCD1!64209-=8C>TCpR(PvXj9LoA?>9Bs)93 z*^9}l;Ca_`?M(Db#h2?R?2}S~Ps6TMyViAfH1ItL7v(6?rMT$HGu?95`(RjWHMfPg zgh3?xd!icaP>9-Dh`r}^5HWGzV`3I!LU$6NDk9&oEaDnLB=QQ(LHXPcYkz4IYrGr_ zbi&!=1amgrBp_VWPgm`KKd}jOjC`S`^e_KfJvwV}hV?+oa@?Z|&E4en>}>F$@%-); zdR-gJf0*~Ey?gh|4dVnK9K&UeiouM^_r7Yzo44Sd`(bM-f{~BG*Xixa%&b5;9SQ+M zvQMn~RfmUv9$u@5EF2l6Y{%)l66*$4p`p|7^M@u+Pt4S^LtunFkl@-pzvF)AX8_t^ z2GG*pf?BHq8cq(YKBgOwl`T;mkfF%~=M)LR{Po~E5(BY*_>AatSm@%(Q15(Tj#_yX z0Vcemfc>Y!ND`d4qL8SlCGb#w*&5B}(MGEC8s_JNUtI@`*2_538?pSr;Pv$IXUs=e zLWRqy2I>hKTZV(o|+@!9!5tE&G-haTXzg=%})qnWxI+Jto!q{e4%L_YWLAS13 zgy;d`1ETkwkYPsb`uD9xoE$6*eFoKL-?1*RV|(aJ{dz`0L@)#%f(@wu{P|-Y^j27& zW4s8dZoYP91>*O&r;|MqR8Hx|AY zs)h$-u&N(zPz6azN%&T`=03n{TnTDI8h|idUi|pRw6_Kcr%}0#nI0Pk=66j%n=t2q z)n|pLLx_>55&X=n?9jv9^q-SXBJwYH#A=|go~(>Vh*0)=5YCk&!m?OcMpv}8oj-lP zf^vS);yksw8S^p)BoG;LquE(8I6Lf&YP=IcRAU#r#PDoUD6eUf+C@$LJZ3Dcn6h@U zg50_iltvi!Vx@b;Re3H$ZERLapBFdno!xV^lfmCD75qZ+yz9~Ol#P(K0xu@En7ZM* zs%PGvi+6;C^lU6HV1P$j>i2ouI!#^!-2`ubDxi4ZW;$ef=B4t(-yac z*u9ZgBDNBoBEcdY$xR5kQ;?RS`+$*c-`hLC?verMWeD`;w2TbccAm8F%~9THwY|N& z{4uTn=I!~0emJt!%{z<+`1!GE0FfkwUIBwxOBJCdSeW|Az3)Ym1BxnHo8XDyMZgd9Tg{Tn~}sGN`Udm{y|1n+6BVKR;z` z)np>QkaE1`?fmtNOfxM@wZQ2fF!gZ>3Hx;mtaLBG(I519=__phS#~jC{s3^9BRPT~ z=qT7bfnY*<4|JzrAmsP+Ez~YrN@q&MSny(pmbF*Z5mkrW_hz2R{w@L&jwO8?^YC$1 zq!AtUi<(19bV%T!-5AW;_6!OROU(m~D2P}Oldo$NYL`rWfBEi3H*7RHc(}F;49LWm zS@iRaKO*}P&`-=`H})QeVU+9d%WQ_dVa{%c`C-E1qsc{>*U%f*=5hsEG!#n>g|vpc z`ZNqg3d+mDNZst)Sy5?u`Gr3N()=*tm{iZT+ujj?MPSt@RYQ|@|9(^&aHTyWCokA^in?S3ZB)Mi5%7#C~r^|53gGw{0{(8Gv6KOe?yDRyD;L zCz1tgEWyzdS--s>o25@={gST!5!lW@6x+~3MW-=Yghc|4Ci)Tq>!}k@0=L2}pg_l~ z-Cd5k9_wwy{C`_oBvcTU>!3aM-`R24lDWQ1BP#t<_G8MzZXE{!T$CUPGTJ|~F} zDW5id#2V(-Eamfr)>pEVZMW$pLtpmS)ulqn@4F~ereweh(Fb+rs5+vtiHY-gh<<*t zzcpRoe0(3<>gU0m2k^|HOK8`xKv^vtC@o+G) zb^Z&?;j#Um+1Y*nOva}1vRj3T(j~NwlK*C@*7AN$7DrdQJE$8Ioi=$A8dK?R^4w|PKg(|uADO^iRjk9Qy0p7_;L_uG=@^pEtqpBf5 z9(aeBPPQ>ITIxblU4zNOn|gK2a7Rk)0e;UDmdUV; zgMS7E-Qsm1m>Kt5J-S1T`xk0yVrbyz;UM{3#G~eMI2~XI@mG&Kb{VKd+KjtEL#bQ@ep_OKfU z^BfQ34mo+~pZ)YWDKmg9vCDwQk*9pmn_hs4R-sl1{PbvIadbt1hMs$_aC}cod-o~q0^?mPZP)uuU*DmUoLEj*}D03Q)y7=%XzC^OP_i8)`^z^ zK_hKtrFxSI1gb69toAflnEQ5TKWG%LARnl9Lf$Ot!Y-)mlYO>GIdr zH&9=FX`rNPHUEFOIuCFx|NrgZw(Mj@Mv`o@x6JGnvWl$CGD7ApLRLb^$R5ewdqy@P zdxh-1cb>Q3|M>ln=XpBx&C${Kwyx`Qy~laJPFd5$(m<^F(iZ@tH*UQ!x_Q39c8OiH z{7tCJbH$_7^kU7gePIr8NjTCYYy^R(s;UK)x#^gW)u@jCdxf?lhSMOgbbRxM5)ldMai*pu*5h+4rvb!sriKYpiHW2FAV)(FSow|$baDqkaqScpn}oX40#99w zT9?g@WC`R)m{RS#i6&JRT!N7BkG&w|9sEX|U^5!NgrX8Qc%vc^7!bM-{gu67;+i9H z)6LFZ82Y}3?DQxzG2=j^3kt04zmBKQ5XN5o_9ZZ&Qsfy>Wi^mcgfb`)8*)@;`}zGK zLp)mxS=9dgUopWmw#rW&UXz3R?ChQ19DL5GfHHSj`_23Y=3D?`2Zyt)ySwlVz*jCG z!XRJD(D06axwZL3+GFcq-|cY0kYa5^5N^b?Gq=jF=Sf2=%0Wn9++iC+CP_r6K#VT= zhz&`$jybLj7L@CJq$GqOh_iTAsHn@h*w))QYoY~^bMBQOW3PIX1Ic&rExE;@0A&Um zyx-oA1@8+8Jbgf{^g7|yP(cd&LoY9cE{V!EomrEJf+TIHl zkRx{Xge_$(VV6g^b&_Ff`9*EHiLC0Jj^@0gk(+zt?8W_tX=jYyDQd}_@AgMK{imN5 z8&2`V9Eay)=$cBD)7J`asfp4M0=^EDT_3)qI8R2{F8MTV)b%obr2fU;$o~Z6kmsR6 zK@Ki}(tiH@InpbYbP&KhAz=CK0~0P_t{#fy%cIfbYUX@qVrMtMLrqO}zXE^~ikVW1 ziow-Ln~gE}i7=qeCqg3h z`pVK0W{?c(yGMu^bIF6vkmsDwebTHxv>{EP)HDHzwKiXl2_^5Ro9J`x%li+3c_AzU zsxH4{VJG3*2`AQaq8yyo?L;U+W#mV_?P`u_C=Ymdx16k+m7at}%H`|)fD9Zs_S=Dh z@~hBD;(cJ?y}Nf&U|skKE=m~VmX?-sT(nr?1?U&ZzIeWCGm?8Y37rs<#osOJ9E_j7 zU|Cv!(hW11O;|}bm9Qm5M4%WL7`Om5ADJnGc z=&{`pb3p|zIjg;&qd_cRJLdP?oMnKTSpvF@Qjnfo2whCVGht;EM&?F8XB+5~e)nHUg=VI~KmEf|*wP}><$S2L^-QQ0{xTh;56KHq7 z?L0Y%HQx&!yz$nHIY~G%?;#;B?k_w)C4sHDXUF=l2<)p3L7$~O@XJ=3AbX-W2T7Gf zwP1ET;LonC<t`I?x;vSGN z-XGByc|Th523%I~b#mXmD+zk)i>B87{ADec=(vFS2hob=w<6?Qb4Tag%Hio-jzT_f zv&hED*;os~Fsjl4c+Ig$BX7O=l@-f#pgK7S-644Bw4_`ED2Bb|WMqW|6k0HSe-)?U z8mF0akpW$%2kd`dUdL&}Sh9#M1a>*5PzhdZ{!~=jARXxeq#P&zIUG}lj__#0|gBJLjiVxv!aLJ}2idreMn}V@s`D@}DhsoHU=Z^=J z=Nov^^ye*q0|?a0M0u`i-Y>9`5=Se_{wBVx7M9%F+{}m1n$sp2Lfl4Mk#E4EcHq|n zY+Y#h=)}cm)GZaM`$R-4=cm5khf?87a%4LBGmkT8bhW0(O+^~z$Xfj2EvetP^nRYD zS9;H|Cn7!McQBQ9R*KYew304iAeb&KB_%#nW_1g+n#Cqqp@ghkkQk z3ytbGrpELF@qV;|4-$C=HRYsq~~eLxpDkb1jG0zA8R5w z1wp@3qI}0C_mBBe(Xf$s8FB@S7SyIQQOom71ip0Yy6PW(w|c~vKK5q*7MW0q-v4;L zaMcvD#!Z&UygbPecnKv$UbPs$T^Vy8ZXKLn%TRur2K!@i~N=XSZtn^F(&yv~J))qpwj|Zsi zKA5daT3Iohnw!g7^HQqV+ZU;`ktNip)X31^HnB_w3K972^=;y_Yzp6XJY|XYzTP=z zUw$dI8RdZ825(tfnu&>y&Ik;u4(-t;+hJ3c23!t-2c_--VyZ^G-8oqp1YR7D)G@mqb=2j?X4$ z8D_8p@Tw%Fq|K0I4(_w`tg8yDQOjgW^waN;9#3fAoZKTR287#=LpZM^4r+ zOZVFi{I{a`C!P&L9HcQXC_cNp`zk26g8KqS_ma8sjg5_ZWSa3=Mz{3g=ZFChto|gi zo8;u#m6mZx(%24eB5VxjDSvcHA5J2l2Y&>3soG82O8!V-E}a#3BYNHfi3vQ?XRRe{ z-O}X}d*PL*```c!tW=dS{5$je;n~+9v4ILdLQD3rgqQQXlM@SAj!ur*O`+xe6am!} z=}rd3<&Mq(s(bjFd%dWx&hzx*bbog-)~KN~?*|fd_ax{ICQ8L>k*hmCreukAd6)bT zEUzU^@#NzJZ(oM0)P)Sq)jxoEfBx68nw`?A?{+{Z3lr1I>ofUHmFTpV?ceXHo%*S# z`M$hZ(LqNL#9kRnYb_uz_**8Zld2s?>ToZ6Gn}kd~oeOU^ zQ-;KHA5&^;X?a4_L*<|pfXdFbl#P`Ed%pZ~DTQ%Z`XxkR zWAVkX%_X3>Qi%-9O$9Gi5#2_VTAL$1ji@Lo^*uCJKLc*A@3neC2#!C!J?wm)Wa%}G zstso_5rF)B0(G3Wzf|#!ET<EuyCs5fvs3eXXgzl7G8#gAVb0tx_CSm`aF11 z*Ut#vBR7GHV`lryjpqlv;^CY2hu0hxFgiwc-s$e@B7#r)rO$T{sC1e; zJ9GN3zEGOxbSVwI-jYhOkjo($jsc?9L|QJ}Nq<|T`>slSO=U+~`n@LJVlHQr zGj?|^dfZ16cM_oCSL-E)DeGE4y!sa+XtX$x)?C7?8-UTxZA?+)-fRyWLqKAoLNzRtY;Gy>R$MPClj}hMJl7a}PRHijg z;IW|i^dVw~FDyuXu&$PtpKZ*~mxM5MW-VRl<_>>XQdDFdr6Q_xY(~3tGZ{(9FrJaR zJn-vfk?pH!shf&**87KvAdVocGJN%fr|YN$5O1ZKD*pTa=` zE3-%H3$iDYsp4k)?<1dC@>SWzq1wE|Ak#Iz{?Cq!;4?MbuOnV`q2C67enFp=8Gl}4 z|G)poP|IoMLfIeA_icIB@KXQ#_xng{%x8fai&OveD%US{VPjnJtHkA)(0=#E%;s2` zm#^v2(G3pqW@K&t^d;KAtYsBEW6{{|`jxpk4HPt`?F+&tf+kC?<>T8ZO>2b=gjiLk z@A@C0j7Rxw6gMr;UHLiqv08WpObd$q+Xx;{dV#-{yuIqV-1236)O&03fc!EuAEM7x zK?kBNAW+E$zn>vC*n7WTe`(E)cr_I4(@M1IZ5T)&P=VMZMiB==A3jt)zZ(5GBROPH zZhN@6MjCR1P=K73y;uEqoX}=W;Yabr2Y+6%^{QSh;^W9dpI0oE%7yBqT9gUWLEZQ) z!j?L#2?$DUY@V}^7g!3nitpoqbK*4Mfm0}$b_zfRlMB{0Y;;sMfCV0CugF!nnJh4JiH~`{&{|!|B3I} zXftY|wQMjkG3F7}-wyHU&(XWnkoQoC(1|$NE&9|+yofCRn(+AUeiNZa8kyecN-kCM z|AFcrEzwv*(j;_EjJqM&Mg4NiwE(UBMMCau%hVc>CY50 z2k8)`S6OoMt@k_oF+^t|ad;995%|L`Z^V+r`nCmYPfw@C^;NOmg8WQ&N*LJOvs2Sm zTs~{_VNx z95rAglbEWoql%7??}EiiF_@*z!|w>Sc%Q9iE5hiA$fr^$5&9|&wL(Kh9ce~BG2efjmj`Mw1L z&1r03V`oGYsA=j-j=Co&Yx{B`KP4Iz>u-@;8yi!_cl#VRn@c*+b@|wMUv{w994ILVJ^C0ZAAZ5t+{ou!8V1)#OjOhp>rKvQevjWAZ}VAI zJJlZlpwj45znOfsH=mk}T$$f!&(qgvijfF0HOiWLalA41?WTP-C(8SV-umD2y4S~3 z-_;{kQ~ke5gAS{pZ!%h13TU=(KUb_1 ztTukuzgBM9*vD3|<&2Fg(k`2fkTpsrDo*U(>J2CRVmDiE|BuxlE6ny(`v;xPaIDTIw# z^e2TuLdI#phcmpbQY}HYl&6!bQ7=rFgOZPFTZaNY+;hHt&h$Jxlfht3r0=Z=vYio{ zs&@Y4v9n6DoR)F*w)l;4w`GBR^~*L)1=y#hn+i&jswEP0rcvlNub{^uXY{-0>p>v1 z&S?mGFW?^l^j*GOe|ofMf5PHdiX<{g$mwS_43-BYBZ)5w2ww&^kA}ZWs$V)so?Z13 zn-6|o2v@Q9KUx`C9UM>hu=~(;2m4MiB8y@b%Nygx;``#{zJ;UB*}~2ySGi~I@kezM zKIbtG^>Fy)=j(4=A@#o=NU_q>`&xeU#p_0|trZFpD4g|5md+U-Avm&5s;8D7n{Z+( z&l+qWh4xFi2<6||6VV&Rx}FEHG=BxN9=snA7eop+KPFaIKV`-r`=3e5c3uULM&OFQ zgmbJN+&{=8b8c4-dDOF*1QA|ElBBjRn{wQ8n?wAF(!i9l#_UGKqJGC@31HM ztMA+lDf+Yr4Shs)t*cA%lKT#c>|Jqj8n8LcK^2pw6`{8rh1zibuX46RnThiO${%uH zW2TtPzA2B+-Z0m{Q{%JG1pnR=97l$D9G5)O7+z%O;AqY3XKh*@2O=L*7z_PCG%{HY zBej64IMp$@FG(x}4!*lWLgPx6atXR@KhKbd>q00fD9@os6Lj6W14bTf)5SWMe-mqa z%THsMZY>8~)Lqeu(+H5!*q+fI<$oCV3phN9U*rubs=#+Sz@@}&Xu{-a)DQaI`sAad zUduB2*CE@sfG@YbBDd3Iem2vkx2`OUDUdvfn_ab_{x^8&2(c*QPsi7Wk&YC zMd+5(f~pBYn}44 zIq~FBrIxV0HP+x1s+hiumg4RA5?T7N=s%UyRa_!wIi$ybMO2O2l8vsQk|SilJ=bWe z&)OvVeWrK0Inh2cTX0!jwNz@*dw#8_R3@3eHLP?islW}(+AxR_E&PUWUW%1mhpY1w z)$~>h4=Pu$RxUgCAKdw>lU;bq0@D4P9A^&M{?nzf$9>PUXb#C zj*XSRpNqJk+mxQDe1N^}ry-4raj}2WSZ?#Ka*J}e)zs5B|2v-wg^`a9Hix~+zyK{M3t z&5BKu4j34|2&87@M_;b^*8WV6# zi-5=ZO>1~PDC{;5GqiI|BKL4TQy6rUQ(y|LVuuEFDB!8jEZ^{ncxQ?w3q z7qf?()r)Qp2aaUqDZaO1v`Kr>z#k!x7pDi|buk+!r%wQzV({}23T{cUs$1wc zaS`B=4oOc-i^TT*V6MlX_S1*B8(Cuee(MXR!_h>=*4WwPp#-OX855VVu)CeE?$|q6 zVbvpy6)o}eZ|W4X*GsRFm~9>lld%U>?{3IudH(V#P%$l(XpnGT`}NN>@Q@}k;#uNg zSNo6q%&W!JKez;Xgp{C0PlKK8)Zm~dsP80MqG4r0P9iI*_Z(B(?e=G+d1gwN((XmG z7<%O%=?Ho^m4Dxw=B%dnWXb)aa{pf=WHJlW0ox*if>Q&|-$`V>8enuu4-L6RFQo_- zRRRS<>Ip+dLE?uZ0?EHoq38#AaiRR|v$AsUP-VGs{LM*f4*sF^N;gQB5@^VGvb=kG zOM=)ib)YR73X(Nj+A(C~b+jUc%(YZGEEEB#4N|rVU@!1xr`h8=fd+iADx})OSt?Y~ zfcofyUJANG^v21_;P2dA#2-L^F_7T&x87>Kl^GuH5kB`L$c5Ik zsgpP)Xx%4F$dE&|F4gP2{vH$Sbf$o&7w<4B@;M>0wO2yebYwaI(I>}9|Yq^&JRyMx9xb#a_r@PEa#v<&&;^+uRN`eH*R~) z4#~;SHWNSkN80OB_)B{6D6?C1qKK!i(P^la>7*c_m1UzO@AlRwsOmPj;PPD#aeg!M zo^Ilsd}>3eIdOW*dmnq`j|>S)I8va`sb@d1%-{2Nv`?n*%q_FYt z`AFL{X>PZt2IY!8?O4FCICubE@$vhI?3xB_5EfU+SJ609TQgJfTz;7RMY#mpqc?93 z^kdBLfwQxm)~BV1#Zz;A`a)FyPNuMRb4#Xu8Tn+O%fY^&!`7J}RV5AZ=Uy+(cUk}b zIBR!N%zXE$OoHAA1UWgmI*C8jdvlB3u_;VA6W>|Bb#sIS{3i0obI`*pYIZEcCvGXp{lwG8OkSpa77`#Ae}UIc6)t&ot-RXUqj5V z#P1;o=E}+%C3^XqLNDLaJ35&a0WJ(NcQHifoFBt`I)$5M6DESf?(fWl=x)gxGDa(2 zg1S$}!pscfAWJUC?jYKC+`yX3uXU{>^Ol9B-5!W)czuFcM`UhRF+ zIqcA9t5}tqi)^Fy zn$r@6y0+J`sT&7Ay=QnTM5VZS5jeVa2WJIxN4 zP&uCWCfp2F&g(H61)bC>Rwig$KV9XqZ46Ku2)IPMU&s<{p)B12|MXpCmdx7PxtN`r&e_ z0qMN|NF>&n#Ae=i-tm6v(#KaNZbNg1nP1d58CMc53?m%Fh0K*Dj{R!JUUnsUTD3*S z(T2NLIN9f(Ew(c~j+8EWK&x*4uAz@$+x5I*kJc%+EvHZE=Kd0c$>-i7>EhP-(wub`}q2O=nG z7ag*)V3toTe7c!;(A-@Dv3));G`(c97eeh|VMWljnJs@CsIwTS$3{gpFu=~szgtwC zZ#u`_ZgP(V=eVu4^)0{EAUbg1WkAkwSzlN87wC{C0D--Zi+}}8J0$L)@Hi@3m8HGU zj$6^ta>PX%BF}GF`{PjmK%%zU5sWsyZW5iub^8}&z5cG9tFEUHz4<0XoQ>O{m-oTS z&7S+-bnRBo*O(C}?>l+A-zbbjU;&Clw~g;jnJ_P680aP~bwj#;Lw_YV#{ zsfzi$n|(2u7IuA7rJL2%uw*q>M)Ij3hyoI0;2k6w41E3kAPmnR{1+bu7|P^PclGUx z8w(2ypIdI8J`1kGLX&*t!!98{M7zGZ8Rn@VjP0w!tMOAC7SP?`rtlK59c#K7By$4T z0|TfE_zNH2H-$SL;R8<(Q%J~zR3b-dGY|fXV-~g-S;f&h_s(i~U(deYL6jY=BLltt zN>PmSZwc)CZN~`SaVom+@=Vax!L5JCTZv5P`LoN-KJKW8;fs2;=4u$G0+&UX$0|mg z@%Or7zAHH?jVn^!9nFdsdBL-utIfH$H@JLnIk7V?2JZ)*nAkJgp=>P{4Q*|IFj-!T zr59CDaXYOQePZ#K@;-LZKN=jr)q?y^g5#zy=fYByDaj`n`PZ~sS^UxStoOYCnB$L* z-^nRG%Fn#Z9wV8FVHp|NM9BD#v5Kjy8>4ehRBAfK3m2}%ZM1ZKnU@0~nio-@T+2Ae zdxWu&Dmpk}qPVQedmwT6wztjZp+4h~$jZOcI4}Rvn#Ei3-1>HtEorFiv8>3ye5Ft2 z6-#=rT%#39J;1&*hlWK!k|pMi?(8P?d(r&QLw&&@5x)#Ay5H8kyDw8d2RU3?q{(G! zw#BoS$rEJ1GK>kse_!E3G%@zul|7yqLkIXKYqKCggCP@)WPQ_^P-HdWc!CExH0LLm z$Fs#imP4WZ*0=A2DVlZ|6K?eC_LO%DuwOK@ zJIwEB;OGyV^Ju@N&Q(`+VSFyG=C2|vZn&98r=}*`t`IfbA$$!y<-+p=UEP{r?yQzA zDLFa7_nur|W`M4XNJt0)lStk9R_&Q7jhOp;uwj*1Bh9Deb+yuj_PHN;_ndDx_BT2$ z6X?eHCnr;H*yc-ql0rwXLit962E82?De3COpyp9%(ApN7J@~&R)~9PLM}VM!qVis#Ca3SK4h~nJeX+R>@D*`F~a7(my*yL*Rv;V6z)|q^B{Z`fElA z`Sv5(ot4KT6WC}ddA0T4vf~dIJc){Z7U5DvmmskFYd7lU%Q~uE8Z~K~a!GN~z%QoR zxK5=djgOD2Tb~|Dr0a;*q@|(4>;N(zweYEhwd5liKwy(auK$Wdb<_RLjXk6K)#LpU zsZ@LWC7A|UY3VSTLFDK{A@h8|I=|qTN^s)zv;eM^l+E}sdP!_1*QN)$})Q0GoNvp~zRs1YJy~p3% z>$+LLt!|8k3SCdK1Z`YgoG}Fw6P(nFK{AoB7w18_gSNxd(;?dTlv$viW}Js7?`2i@ z`Mrv{lQ}mg)_=-g6(D?pYHxKzO zQShTJIFN{w@a^GBPCutPo+v>XlwqSU188|I)qg@LtJrdHLZA`y5=jbEFHiPIBBG*q zAlu*sv&r#^oEV^XKv52`Yg!0XmumFByw2VR-HBn9Jqmmm>9A2@z4c2g~y|8zv4omg5M5M>ad-);5yF=4X!{TzfCgocK1$I5nFas7S&O@|Iu zodHeuxnd@g7&eG`z~Is_G!#oOzZ(L8aq`>r?iXCQRs8HK%> zsCM1DQL#Lmb-LGTl2#gbJx*H3WmpzEa`aI{`0gTqKLstI_p^PsSuD?_OIg1jAK)hv@U|SU^w6)mdnrRK%x2J#ttqH5 zW?{fT_tz)Si-o~w-V$oa#~`7 zb@_E#E!bJ$AD94>9TH^Gu5W;ijZknuNM>rz0cQ^fp%iM*t(oKUJBEFr?dHw;BAe0h zot+f|no%^vB-T8n-NkNq|Lpu%SK;};LDKhS+a@#+WfoIPU7&d}0W%YYnERV82&7s8 ziGICoh`Am-R!I3CS^$06^27due^9kizJk8qr{u}av*F2w!oszr~E4sK>j&Ltry{rJj@d z`ESj3~RvC`kg@@Hxw>zFaHbbMGih!nM%Z z$$`Xmn|RD+;p30d5+|I0daQvu(u-O;ET7W@!V`71b-qiDkw+NI@T(8_1S~#Mvfq7s zDEHwj(zcj$A+^p>I!tQ%j{eWJfBgSD4!!E#k(n+h5Ccb?vPzEaV1~l>@hp{(_)Vqe z61F7K3xdqSY|Ht(GVU(26h7-=Ov)}6s;ZSjN-;FlJl~Ly)I-QxmU_L6HEUht6$CDya{u{0%DB0~<#n0Jbq+%GGpxwOS& z4_9pPXz(3oY3~XdETCLSV`8a=s(%YaWTRL=hIqr$K-AaZMYUP`Mz-lU(h4LtV9&eX8<@T++Sk*b?kjh zS|sa>n>^zsC3|nJx)huobEa#LxeAc#=N}(8Jfqs2dD-XrYHipCkuN!NXp`b^ZLyFa zg0V=#hZ>W&0~4CcN{ib=^jC8fIB3l~7Egaxnn&&1UB(mcy;{RT$oF?hyUT6)ACOo3 zsUVr2OAoOghA7_RW4@!iPZnM9V|8QW0;1>n?Rv&jtb_~UL7yJCcxM#SxmF-GJ00&w zk6p&Z>rYQAzwvgG;u)8(9U&gsV=S?;JWD984-4xhpb1~jul-m$f4V=cKE1wBd;gu%5BEb#=ksuhk6y@fMl178uhIY!Z{Dqa zq1nyZv&*LvcQ~ibRfQm~@ef2B=^`ZAx+^U7q-2O}nI(x75X8T&oo%5f?ymfHo)Bt} z@32N5jj4h)gs@pk8@!rb{2wXEm3ZHkh38ymlE=-o@%tv~P$x16rwJBP84ToAAH zS6-DNEF@^+-&Nja=HS@6;1qW|2QtyoRrGs4DQolIb(P&J0E*;RV?7}`EEE)w3FBL* zlE#AkcBYWDZ%PQb6YLS{QX0SA@^uV$;8pv8{qWno!3g6|GgXYAM$U?to7+JHQj+>O zXL!vGN{0N;ikXjcwDxS&#KFy?X^OIoET1!0+E{W@`bupZbS8zPs$wsr5j{4NbK~O| zgCfYBK7b8!J%d7pvEB%^@h0flV$4H8SMv&t-djlZdl|pEd))K&FIl#Jao7Grg(7kG zT{8vyE7LfrL*;b)vN6irVv4_l1e66)Y5n|g7tvI7b%3MD5cx6SD2}xR>9h8Qovyff zV}sS3DS9q2-H5-!7Nq=L0dX8I(B3qm;{G##>k$(3Uri3EY4A;6vNvnD*T^>Q^t}6d z@_g3psQEr9c!vI?=((2RAVvDFwCfm4{z(|eo&CSsoNc<2wMK-lVc@k8W|jg8dp-+x zmb1C1jWT0nf*iSdOyU0|jtWFLf^%&ocuGsX$j34{+E8)mQ+zNyWK=@yW!N-|V=4F^ zTL1nwpu1pW62y2kV?eS||CCoJ?|{Skg-6`!KcD;GK4YlN{Jj)xoE7Zj+TW;medV@Q zy_{6)v05Y@a}Eo}r8UjG80#D)nN}Oc%+SzuI4=*oUQC8=BpAF$C96!sEIb^23oIzZp~(0KC|H3T$jn zk3%VLLQ;ogL8Lv%v25>Q`c}TpHMD@BchxFL8?E0+^JnJf=o@9p^U1H$^Y%3YBzZYmVNDbnq*0j1;GUHpKUF)6=j?T`TnJ_0O zku7GLIy5{{o0|pvJvYo!v7WxaU+~Ud^kH$Y?fah@rtRN}Z?f+`!X=~VK`mDZeq%<# zNZKSc`2K@0N!>{x!4_XgSGmprAAZyACNG2$3e&eG31mW@9UhY8k@dp?mbtA4J7{x| zoB&KaKU^L6nENtddLx*AcW2;U-?CrewUlX!LHL;$5qdfqHVsR(Tj#mU=BKlf+?V_b zxAXMQ4YDsAX%k=EAK!zHV4NTF++w$;YoEX~14f!YdzTRGGD8z_8BAkzkeDZ z;c(o$mGj9m+>>W7OfVs0R?pylEOb9!!^6Wb=34w6nwy&mA@}JR_<-}T8!wM?f!)CJB9ft+ zk%2+x2!;z1IZq2`_=3~kDkv!YO%!r!fNkg-m_nO=k5mPO_Bi}i5-$i1FhM8}qFUtV zMEKUlaz3vs68`E~EecJnGdzdxAk>*iRP1bRy_s(h4bBI*Sn@8}lux_^NJ*w}3pKZw zxd7s%&A6IF^ywS?yr3e+AxRE@?_FvPg@B25xiU>bcturfp~TcrL~c;Q*$xx zoocvojQ=wSzx$uM1^#fHqZ9r^F|#>>+q@CEJC6ZcR0uRhvYh_QfN97Zi1A3V2h&~) z45+VH7_w10ChfmLGddD|+b=nWmTF|>#gRka*4GO86@n)rG&A)z1UCZm)3H%+U{&jN z`DDA^5=ojppKmAEC?wA%=Atq`|9f8ep}zj|Cn#Ul;bQrD36>QMfcGy0zo4YGcVNKb z!4D)?4HOk~2)bxRS0L%>f#y53(VE^gqO!W9(J)=xwoqF?Pudp_$M#Sfr30#85}R$g z6amuvn2CaJngHH;yrz@yyLxCt(fF^X4UDv*FVHZpEQ7~37WE9uUXH$s^}{-aku+r8xez}#Hc z0dQf5LLpnNZNV;k*H%7~H&!&3n5Ki$A-2;D{BwvuM-4n`A|kcgnmNd_aLt_GpBOrc z(VN!}-BaOYUr;#UdHPlLsq5)y$ zeE5X~$DY8v!5I17S0VCmJjlCQKnV3UD*EekWICJiDX%%GeCNQzrd#Q>tm^o;Bf^Fv z;6|>@X~8ON(*FVK#WA@t*x7C8dO-IlP>SR7)BYS;q^H|=Q zYiZa9hhRo*Z0xtcJe2ta3@Fe-1;-1#ZXj(ELH2q1Ez6m9yfMBw+0BX0XKN0=K`L(g zuQ&Et7R^Z1k2x;zoho~rZ|mpBAbwFx=&MzLt^Z;gfIsWdz+NuHh;a=CD0_k%@Of!m zyG|=#&+37{=*n28yC)tW(L}y;3IMeCU`nW_ImX9xdU-jN9oD#WXcyVb<&3Nb^bo8` zn4jcm(Q|MRVEUneFDG@P!ft&6UML#yPRS@-x*88+YpScmU`o$gWa+Gr&+jyW9(RJj zPU&XY)w+4aC!MG-`^{6#0RvHGU03keEJdr>Auv1cr{`nW7qz3i@w8eu79%tJTTL9) zq7};RoDSU27^QPk;Vc1RXi} zF;sWoUaocRLD(=u&0U%rWLJl3B*PWFroFSX*MhjL2I3bo3+GcQWXukWLW(`Cib^SY zEq7MoOnC;CCy2~zxS5$(cZ|MfM;iV`$_~pmv@uMQ_4z6Ur^&b01@i<1R1m7k%YOo+ z*(Y8VY3HpwWtFd`=_69$RzHBTgRLzC|2-2^lYQo3^zKN~3DFL-63&-BU*_gFH}Ru7 zwKk9gQ)b+EAvByg2;C2h(1kci#z;RdTwnaTsw?LmgGtN5FMTGo16ChyJ&-E7!u_o# z^v+65x;0y;AE#h}rO`mD&ANQ$O${r+ZSFYi&dXvV`jRF3uT$<1&U>V82S~zt76|vj z1?c}9-At=b#Pddk zL7FK8kzxX1O^08v7&V53hpVZ9s}}&T&KDppCY`Qvb}GQjii(Q5jsa#2kAF@r;(ejO zQ=o3$Jr}h3+dBUg)Cs%LziI)0M@Y{vM<>?`3kwS!9lfc)8yC0)f{@e%8r)EPDt==q zJuIizZpkAvH9>3(J;5N-)t~!nsrz3V?XVZ*S1@1Sceil-dnN-7IRpsr2y%JtRCd=I z#E`N6GMkog*%<2v!_bfZ{{IlLP?}Y|VK|@iPS_KV?R#j)1E(Rv6kI$- zejTBwR~aZ5hwI4E=MWis01Y%j%uN&AN`|3w za3`69hRES~yW@!h#~x=?CH`D^gLGN23GOolB8E=um{vT4ndbGck6%Sj|HoGa1Mi2w zL6_jPNeOX$5Z{A%`SNAnbd^S)KM9?^|q=nglNnNEz4=dS^PAQ?_~5Z1$}8gj9lK&ra~az#c#!7+!^052Pz z%L-?`{+M?Kb_tlHu_S*<1i?0FrZ>{v^~NO$Fd+*MI2Y^`2zuuR?=*ykjp;Fx)^^LH z3WzJnLjyknjzbE>S7d%$qQL9tJyGPlF6fg*=@bGh&_(FDZAr~&Z!?r{_&@)|k}t>n9F8U*s{9}$kf|lHLstW`xwU1?GF(Bcx5BUwd6q>&U zkg)WDhl;Nsv_o)C{3(KGLK_|hSBlp|cmTQ5h&dvj)f~%-UHR}yTiCuFZp6@o2Isz04L|MV0WXB`U~w59abABM?&1D z&gb1t4A*so7#mwC^uF-sj>vRBbaryOb&dOl>w^(WcAc1L)o8^`0E|;$64Hc%KO+r3 z88|vptSAjCw;fg_Y(v%3b?i_tDfw)WUkcOXe@TsZaF^Z9T&izk#vwE|WkgK>7%$_$Vgj?m%8sdj+NgtJYQJh;tGvbRY#{S!s{Foam8peO z3K7=%@FCk?4`ty)wvXgc+dlLDd4?0@sd>V@T;kse8qfDzwMX^GMU>P2LgwH{}MtPhnv7vnO)m6#PL;S zG9Dk+aT$nqOd{kMswZ>PElF}`js!E2pNFr+rtlw`$GHDlTN7S~JMbeMN_m<>^y{ z+F9x`_$2hSFX`cg*oPf{B<$c{dCa%ofRVoaB&d)wvNJMzJd!zk7aen;p6rAf@+@r= zHLy{xEl46vyzy*LGc>Ipc9vLw#c`y>#@?(U%kIdl>7{KOP`AAxjiTHdaX%4@ z!?+Yvlo_Oo6GCbAFc2l|LI3>VLR93w#H-0VU8hxYk|`(!i^HH6H1(y+n}}pXlHmA3 zPJ8=Z=J=vm1+fg`RHt3y;IGectJ6&>I!oMOVxho9f~ifveFxJ}P^8n2ntFqQTH0X5 zZYHf-&F_;%?n;TzrWMkBJ&MmPSM*_=^504HTsF^C^$y+8zul2A_pqz9ENM7f%hiEI z_eNrBYWyG>Ur>a;fJMtwodUygYY_X5)w%JQn3(X#1OnQjQ3zm|y4PjU;Q07$0RMs) zr4^9NLX1&XPe4yv507DwrPe32o0CO56F<(6xn3b#%#voz5-ntp^ulB!Ut13`dK3

&U5WpO80%55sS9|>!9so(f`+$Hna6|s0Qhqa* zqH##mR_9_+^(J*?>eTOVG%I<|CYI_rKjEbr#?$XrD5>==@t)s%^{_SHwA7T|>M-JX zuT&v-F%O>opxVmq+m!_~2}DS`tq2EGSF+zSloN!947XGICCtspvC+F>BCuk@MX>`R zF3O358s|x$+Hi;n2??)PurQeVot2$!bXB{j6&Z3-h@Fk@#})$#yoPbgOFD(m#WV{? z$vG4@W?#<~Sq*9A>xiHrT!#xA3mlwW38{JCa>0>0kf}ue+{_G_ahV$$>dA_kDB%4X zCNI~TSHyKM)b`!E1;_7x5WBGJ#>5z-#zjb2s(*3Hh|(&)!@Ht~@-$eeIHAp!?nwjd zecj84m+!~*%0*6)@A0!Mopln*J@U8gWzw>ss&?I)>V&(&fup;m0+I`zfEA!Jo4#S1 zEaowiWsdBQ0od{QyBA-0VB?XCXw^Ucr;C_HV@lG4cJvd&jTrL*z*#6Ki%)NZ!T~%A ziFIJt5kUM!r65Sr$_FmN@2MJRrMFvCLLjBDHY5Ou$iz8b-BGxn;!LThCV&Bj@3^TUemf0yevfnYXgAJa)3wsZzNdi>R`xnmyRxF_*bel z3IgtgCYawCfbxRG<7lJ#S^@$O-^(K?SUQ=e22MY6;SJfrqxZE9&I|51V_r&9#wZ1i z-{ddaf}`WIRpsUYUOCf!?7^FFCC?&)QDEnJ2JYG zd4BW}JC5!**t=mACbYFC>+Shn@K*Aq;Y;qC{gbC1@kzGG2VJ?;p4(y`OpGgoM z1*m2Z;|L*64?3u8T+uriUhczo_&U8Sq>)?VwNu0ubDFlbG!Nza>PX(ZwVvBMs$c&P zQ`a4j<^K0?p~%Q4BNCELb^~QZ_TGDEXRpi1PFD6NBxK7TNm-E{%E-znD|A*VfNEMU-3H+?Y3i)t`Ple+?=?%3GX5^k4xL1q#+#xK zB};pTg>JDvs7bZ0uPwzR6fR>+knU>~3+wEGW-uKgK;&^ygc_AsJf9lADJoKW+ZzQ! zdU{gQg&JpM;WIZ#LB1q0=_Xw~7pAS?z=KEaH~v4qf2IUhfO{Fk@5D-sQxb%JO;|A@ zda0te7Tb)^`0pED9yQ+q&^HAGHgx6$Pe|!>_^F^I_5rn!)3?sfuxsm4`uElEcUevP zK<#zW4};7*<8LfK>5Drd*nJ80;_bQGT!=&vH__B*7G?`x{M}E~@}VYwKY#j!lbN|8 zVjJBm{-nCOzRAOI?5e{CHfpNr1J~C280F`JHVT;IrrG49rJr+)h@`r>yDxvb%|ch1 z5Kd>mv5|%ma8qoPqIjgG(E8QxdTFU$v^1%i{ftqoZ;uLV##_>&0cqi=Lq*jaUqTTj zq8H(euk}e2?hr*}m?p$m=_GNgJ+2q_P%i(tDd3@mYloJ>d?~*lm@*dpZFzold5=oi z?X%DHnTBNDyEk8T^~BaVecxyrK97NgP{*mexD(&dmfkqtR4D9w zQ!Ue1rRDMlQ=X&W z_^ljEm`1TWPpW(sWG~YSz`yf4qR$-tRH`RWBlB2&kCu`vtdW1-4?w+=GqRd9fvgjg zk_Lk?7)Yc0P`?a-cMhwZilWs(6$c(1_oMGL@W?t$JL5$T9ez>$J20=X85;!2f&Cd= zUqUNR!j|AxKx_YEQob%{RkW^%2*Nn73*8Hf?t-efvSk9T)GK`rDEd^aK6d68;y#Ky z05IpPh0RU5&eP>|M}!Ra<2t^3#gQ^<*Yzt>y$&2_QK+o^1d2;>MxLJa#e6B%mS1;V zU0rK#bu6b7go;f}yB%``6$;GlP{+`VWxd5;hO!{rlcOWxCc^QA`4f9BQq(b0_;nq- ziG@Yq-i*h(cH@4%ynK}4Gx*FR9Elx40R1?9pXkS;HI^J=&F}m=aBzjv(T}^NG07rd zgL<-R|L141*VS0{b^fE%{?+Knd}Y>NdnMSYQXn}tZ3z0+(TVF2Fa)VUVbDD6y78Tu zqfghpb{;_3-`{eBTLClckvgwsdky1Shc$m*P7VtF`d+@2G&W{nCyDS@yOGU-L&J;Y zONnTnl)d>zGCI5Ry_LH&Q8*egmlS6G0T;Q3SZMiyG9i3 z>|IPz=wRmOSj-NnEI*lWeeZ=+gVq7fmycC(6~q7Zy8mI=X%C_}BfFxvua!YQ*8Vwf zJHTAzQ%A1Y$*6NF^QS#O8{t~fRS(3TdKu-ZqH<4&3SYN+5tzT30MMHc}sH&^@PX_NYXb~I= zrA7o0hB=9`&`S_tvPRw}a&0Z)#g}q=|DD6(^OG3&3xs+*Pbxw1 z9izo1@P29sF?=tV8St#N*M8--)P905bKCPs$bC-$@C>o8D#`OhXhe1#L*w4 zZ-l9-srhNJX*?x!7>FF~?X}f<;}yv*Ls|z775)~2=}nY$nf;c}zX7dw1{?kj2!Z(t zN2TcBr6spd5as>E8nOQE64eye<~g}V2RrC3T~Kfss3^tE*?oqprR4j>^=L-n24@cQ}d| zgNgw!UPz{NsN1&al#DGGtFr-`IXT<#yhzd5IH&pddD+1!&sV@!4}k0HYHV!$i}|gY zWYYm+ZTMItKLWiMo1J|vxFevnl!J+hNxXdG)}1@J5Q`9ESS|xmY_5%wx0%4R44z|M z1q^>gZ;Q@SA^k;jvdR-V*|5wqDpD5t9EkPp%Mwq0c(+7$2!(bSCWR7@k>D2|j1`=&H)jGHCOEaD7~4lLB z%GH9|J+3nEa!mjVg-=P;&XW@Kh!TIVX~4D?MuQ!Uw7 zap%LZF`HP0SyKhl?w*w37Xk~r3GUKU8h-1!&0jiU+^)ObB=r;hB!W1Loh{=@zy2x*0as@=z$2lV>3XdKD|72Mbct8uVWQ==KZ3l+6H!rd1gF zw_<=aBBA**guhnv!_4Y9Xw_|s+L>hYo_l&)7DCJxR3kjlXCXZ*Ea(~BoL(`;R=EY2 zGjBsxEMZ^AyhzY3LX^xD)`5{z^bevRO9CAUJEvAd_g%C%H}4Of+*A6OqU-ba?PbC6 zXU29b5w(w6(!M`RH4$GNbl#rg;JCCkn&yrS@boXh6AZF)N8hS+UJ2;pa$0~KsxKFi zz?* z=+aUBb6cKYBf|`?tJu}Dl*V0eX7*yl&KbCjTIFFw${*@pW>4Js$*z^t;2BqeR94>9 z6|h&Uus9#m3)3`cFjLm@&O3j|2Ms-1Ul0CFQ(iSjE9&3hW@4(T2YT%RNIDZWuxsl> zfadpEV0FRE>soMTRqjh22q4Dl$5!q_D8COo2@4 zp3864*`gw#JNX7&qGg7n>UW%%HzMBBj-N_BTA}R2j~ej~UF5S=%$f|pPY~tHDJ&%G z)lIZ%7@9(OQ;A#JsBbu}HgSp*uBJAa5X=MNR(5<_?yxU>#{D~pf z@f)cXCL``J&fG|H&<$=N(FrVym&Ur!k>2niE*^uV+96w_+yz@h9*gvBGOnwmH=bK6I4CdHRO=USvf2{OvH9Ki8V%5b6iG7l3z`Pk zxB>_^lsOVkTGU!ZTmsq5CxfDy*9{9a|16Yrvh7@2hN*~MFmr}5&N{z7tOR{{>|^2 zU6YvZs21}#K&$5=Bvzoq?0jJh^*sE2v+-p%R$HafLU%05QdUxR0N0Y;? z`TvHL4!1r=xWmN3gPfmg0+-ZWW!!P8#&Pxrz+2=FzP#yQVYmWYB?|6r!#4kD0Gv&L znKIVVM4_%~9ejpB2;@ggS(dlsp=mb_S5?1_i$3>)$ctt zuY5YKhC%F`&Up@r#UozT_dT)k!)PhrZ{-Fp(v|0a1@!JVa%1 zmKd4p)Cq55Ph$1sU(?#mYA=3zLY#g|y?q_g4KRb;eB8?leE%9eaz`Ud<#>|&{C?(0 zVAjbduyFKMfsMZ44%fpOSDz!7{f^&5FaAve=f=te)}xz5I8=e+v3o*FVfSX zNn)B>%J|WvkK+JyIRjxS;qESoe;G3`FK-T9S%8nU17{5wo^*@%p0Qwh?wD-{&&!6q zf&2G%1!5BeUZ;QA-jE<0C?L|Vy?05#)=RTTDLN*h8!?)Q#9B z8Qci`({!m;JiM(9v5IHT*020j!Yx>GFkS z0O#%ddB+VtJi!MAMM~611*&n|lG%z8wyTqB7N=2^+yf`4yMsl*rJYQoxfbYPy$tY> z1l%XvU+9s!rp;E&0QAjuzY6w$>2ioCE6}v&H|9$PaXc3wXQYrH1Qb2C1knlz^0wJg z%2-|4s7%eG-93BLTC{SB;sC8u>bi$5c67SiPY^|E7A74`%$LgA^V7h2aj8!w=ITAG zy8C5{QcQii36~YvEKgf`#RfxBXtyitI$eAny#Fy^^P^%N5d&U5R~d`3`ehM2)V&KRht-huCulMX?)Xw3xbDu)5~OO1p7FEGA`O zjWk5yxdL&srMRePg6TSs*T<#Xx}sLYjC>_(JdaTcRU&M+&=qn$AmRHlMo0A*nCfmS!4-U;$FM3(Z+SI!tL`5rMKg^jKf>m+nDiLjvm2DJ5ljJ%iq z>60YLl3+T3qZ_7}$UNg`&+tIFkal(1UOrz$Z_LUpIk5OW_GR}P1N+g%t5GyXQ3Qd1 z1Nmu%uWw8i&=-Ne>7l2GjFyz%xgWKl-QhZ{f3hgpkuWD=gfc>u{oiJ|@M2%WphrP= zSQVhM`!LF~*bm;XSDOm$?~X~X){15RTd2ijg9d60Kv zphA-#8?uFfvVi98*xF@!k_3y%%dq%G>kPBlLTK1fadB}lNSH-+Uu9%u5CV*EKW6Lp z>}!>7oo($@aZZjnJQrv%!{13}awo+b7OANrYAX=HOhR6eKux2tacZ-(2~>$j^X+q* z)&BneA8o+ugTYU!Joj;!DWuJ7H@FlKqM-BQEqiXy4opDLR6kdlgpo|e+h_ak;DUdV z8SbCz?{U9DX#kMxYtSfIp~Ukw*mXifW|WtYPwp-CENqJ={-d;Z{@lN?jX=`!TCHtj zDh*Xi%N=f|2SpN?=_;+QkJmAS{6~mPg4H40EaPh9e332C$zji1;G^~2EKY$^{WwJt@EmPR+ zGrkE-h`>zsz{(Z}R(TLpfg+v%_~c{+qSCp!uQAC!tmO+n*d>X-cTPQZVw}K@giW4= z)Wz2BIR#e|N4@@}egB>h+saVSlFqln1L>~$Ksg#5biT>!k;Cl;oifd*u+vpQ3$H7+ zh|A&u(2!>(hbrMfB@=^z&4OE-Xg-E)FqVQ=*00*qhR(-+JUNfrn5U}A8= zkT1sp^G@lHM*0R3Bo!i!L&RAnH9WL;p12Ie>{{Nlc-SCuzuEuQq=(ppPIJqr2Z!0& zA1Nv?cC79)39Nhx5&N#2B;YZtph05ke(EC-hu|&GasWRM5zNf`1_qOiG@Ny`d3%=F z-1=O%di4ZL+5F|@`#(xYQ!DrbE%*=;ym?W!pj!HodKa-ew*u(4vuwy516>uDbd5%E zLlPo)TP>&xO(Fsxe1>#SPuv4H@2Q%h&MWfltlgDUgPD-CD*(eLSam)EdwCtqg2Q}w zrds`)dO*iSD(IlUTvfy0-{z|$z{$X1JyLBI-N7^6JG}O~u%{};KwU*OvU}Vcm0kB6 zSr6)bY8ppcba74I6PNwtr9?(q*foErWM%n#f+V#LB)ih$;wa9zCyzM(nu4C%X}KTd z$JNpoAX773;?x2?FFrjz{Zo+&ED7^FZZH1K9N&!3%|9U4axi)v85lUwol|GUGv(ii zFY`)_r|8oIf4k8|y9&k@Zlh*TXT%zU0sKJ7t7l?qS*TMq!VA*9BFLY%wG^QZ?VC4- z9IZ4UQD+0&1ls=@!5P5qgty&Mqr*IS!LDkHXTiF&mR8&5HdX!X1D;eI7q?MM_yOG^)=MhDPZs%^P0Vs$Ul<;Afb|B9R(MBMFY$6^mA^9UGh zGC`?)_KIGNYZaWmETW>v0Z~y;V<5D06~fNk;Bl6Sd;d7aFH`Mee4`+HR(EIm%bYT2 zZa&6mPx8>y5tMr#$@wd}NNo;6vIt4Y9x_yX@+91_WXy$J5s_-% zU%&pNB|s!4)J2S`LNNnaMT3h^4NuQOY$VnUu|-N~k32UwH&wJW*f0Rc=mh*)G?Vc8 z%7B!i;SAGj(%qK~I4Salre=CV2WcVx-ZP!iAt@{^S<()Vq%~Qp4`Tkg)^_~Z?s~SD z{~=o~J@+b|=*{aWSNS92m9G1q5AHSISiO#kwx~3Egj=Q~;PCJ215W`0S_NYk9W87W?`JrB@SCFYzR)+r# zLQk?VsWfNqHYF3@!1j6;u`QVLV*AV(FH#ax? zk=(~udMeX}62`cVq@_Q9Zlt-+Qq{bF6ev4RW4`|F^gI2v3##eBq4|J^S0*r+TCOY? z0Mv0z0BS`?pd$1RkB)NT{(>v^I(jRCYX~Aw7$234X;LXe%Gb%yEr1`^lg6GiIvClk zjWqTVnFO$7wggHcrl(K)GixO>sV`0|JIsG$vkR?R^QXD7YnJBRx^=6mRJT@6x7t!6 z650<@-(k$H0DMTv9m^^CqkIhqTw26TMbZ;X0L)l7|?(dK6*^w80nht5QU$?^9Fz71h-~ z=Fgr@=UY>J2N~sksOzCW5_-qp*Y$6E`?|8S@>WPp%pj_74*-^^@{*v{`T3!90AbI- zCw!~}1Evp$e*ISUEOOD(*3{&)z-GLIu>mfw%r6TT-}o~fL;#r+l~P$njVI-Dt}B}+ zA||FpbCvs#N|H!=+b^c4Pp*9W7cW=P z^lbF4$?AIJLXeE}wTQWOxzoBIlVfK*I zxqoH4(TMXlR*XQ(9(b%SK~~i)Ag30^>fYZwI!tZ`cwZDWGGQPU#3ARYuX3I4obp^1 zA|E}yGJbS1$hX$E*Gcz|x8(o+z6eP%ck|LDEt4ZD`*01lEb?eIb*~$#X_(Ym{r~^Hg!f|BM6>V8Yuj2|0n7jQH?n-usLoBN`LtI3f4@$p zs@`MGdz;}_rdewkK0z6weq-hkUd^A}yt2jquCCA#)0jFSiSLqy%=C{M}V`OK7~!l0Ok4)VVbm6B>I$;lauopm|h=0I0TuU{ncM4#B8m$N=6XHGD{ z875Igou!N=0hgnXqG)7ru>3e!Q&D=$vstO7r6qmMwJ`&H33`ZSwU^*S{g;AzsOlqM z|0keJybtc)ENdPrhddrCmzgjI9eTfiLx}*#O~-%%wii-G^fVI6Y>ylx(C`>kEu$Dx z3T-GM@Ge(5<@3t!CT_^bdC)(9E#oMhw9BHSq+A(>1Ctr%z~^`G-mL}MmmQdLm{7et zGk!>V)M?)n&7Qj)Z=%#*^HPXU3sF&pE!?1|-((`fY3GsOHs0SiX(*pqCnh2?erw#m z4N(uSzqUQQ4uHjigE8gJ8>XVXiYr}tBdc?N|DG#Fdi@L0=Nf$aWwyO51Xxr7(djEs-HI7>D(o=UVHl}6N1H3%YcjWIu6X{R~b!Q#GhPI*%+Xk<7 zFYVB+Pn3V4jF1#|Sq%3B%Q*LJi_eEWpIFY}nHm2}0q*#nTc{uXJw2&0y*_SQPnhDN zzGwXM`9Eo;_%{fq1W{^|4@8gi;y;HGzDdf>?bIU*Y%Aga{{0(6YfBP(pbZu}X5q^g z-T-Op8C3)SX%`0|SIrh^vG6_|b_^>Gru=l3`9sdGPO*qCJtpD?Xn%iW< zb+1e@$rc@T8f9+ag?S_L`$CtHE|)A41RYKw(W>~Y)4(kGsG&t7E^HeFf@&DX*R4J8 z-*|86H&W~ix}7MRlUZiJ)2o^H|DIIw7?_k?ZF#nNGE8ajA1RZK`~0}LHk1XW-T=e? z2S{qd-PxW;yS9qc)Ah3Dh{|lDsRcyEaqa0ohT#*?58NaOmQgZ{O-U<8s0D0CJ3#CG z;sTm8l%TJXkD%RSywHe&Xw>`oU-5@YyU^_HSux(15=2)sH~k2WwT43V9e#C<)4{=^6+mj2?t%VKgMCRl4noq{ec?&_`4j8glU86(NdHQUhda9JdJIe} z=Q%%zAHkd%d;G#33MA?RlR-Ows2(Fgn?uo(Y8mX{$Ark`t+IbulmTMBgxFnNx;4L# zU_diEqvUx89ah}|embagz8l;JL%8ip2So*^VrhJZ}S4v>A(T5m07}#k}hWP0+5)&=HGDTx;bwUMLSf&_a z=nnpytd^Dsz*1BerkGIOewqm+^w!><8~1kW)~p;qn1OikA7c`szG=9gwMkZ?{lDMg zg&4tH1jz}f1KK4cs|-Xq_2A=MhiEtn`iH*t{mkM)jF$A14+a&u5-y>V%0-GV2f!Im z2m2353UP37a=_J9l)`T_JO~#+XWvI}^kaozcU`WDYeG88V)B=;m!>8dS~9)xVn8t$w1h#92(}%m(StTYsHnZHRw!>{fGbZ%Q2)IZ@ws!DxN+*w}9M0m!6D(&j7gz!dd$W zcNL04`s~5kD!5c5z)D4#+{X+NUl2P82^@V!6~+>nxypxMK#5+5`fVT~DvR2Mx%i$X zkXr6=XYzqm8Z8?mlL{=f375?KH8%$SfW5UAWP$1IiOA8{$GLRx=-57Nco)((|0=i! zyde<|T!!r{yHGnZqH`(G___oU%QKz`u}LY006lVp1%r{;HmD^Jzb8S|hw*}fuxU~1 z%9XGPbZ)}9DI3|<6Y%wsUkyPg)pRX zu(1TwHyxylr021cpjcl??u@zS!2M`F_Kv(pmlO8Rxy{YNn>dUa3^+7N76_&jxX)Fz z3wcj}e3+2p1b3hQdkx8w-$#-BtZ#;_p%csR@huQ2^jq%I9B@jOut}m@*7^Yz`T}k4 zr4r=HB#;R;TZtUNU8AZB`2Z(6U&NjNZNDBB<%{^H!dAu^+w%uJQ12<-SjOdk!g7K8 z;YM=?|IWJ9F163(G{37yY{U1fUL^6#xbmNw8ub4fOuFhFW5+$g0*{p}HRr1ka||O)mnT#gqc4e=;e-=(!d<$8X@zmIvC8+IbWERK#k#bve%<$c z5rD(*{Pt6?q1NL{diP+424#_EO+;yCJ-2wj}=e@Q}aAh8pPK zQH+ZIQf_EGHkxSiaBKx?eD{ZbiGrptct4cxiHP8G`n?5xQVTSi*todx0Z{;(VJM6s zA3HiQz~Jj*SY_Vx3M2`L^wOO&ulqA~kgVwmi^DwN4c{QV5?&D_Cno`{+)z%4e!OP- zpC4IivGeP6F+GDlrvX5U91yuP6xcMTSUU@6nC4kTlxc?~hW=n2wuBqx;Gw&NFRD47 zDQa*fcyQ%075+^gsZXrjfuUr~VRm8=`+kqclD8&FV*EFOx z{#jhaLT&BuOLvA62BFut9LPAi({g^FL6&}=no4~v5H@g4P6%P2roU?o$WnaU=RI+%agyfCEU@Zd7 zD1D+JUXjgl@MNPlP9nr;OzX1q;HxD`mkhT-{pJf0ety09^I?`vq3)xm6y>wZnN;cH zBZG8aGwB$ZL~aZ1zxzsD^obJ3ZewH4FuyN0t7S9a=^(duhfz$-Nc)Syo7=LSD#3$s zY@hU7qvV%AkFE3Bne!o8ibZ`=A`&?m?UR#7Z8+XP z+*MRmN zM4uCr7rB;HhczigZm_FTFK?F!EAWOeD4u-ag9g1efXT3a2LQYCsAvQZjSfI#z}GSk zeFQ2M;B$Hj7jqzayCSF++q83)aRjId0DlaD=LVXph6-)y^aeasu3&h;PH>&QJxwFt zJo?51MV$Q&9AU4N5b(iI|lMi2IjUsEo`cLZIkUR-d{{VBKqXQmD~q3(GL<*#rKkofe8sC zY^cn#evepvF7Cgxn3$MxDJh<;+}w_c6FmB!#Q%_vH|OqS61aW)3RpTMEaq!*+^=H> z`903x8^i@snU1Pds|E|^f|s28$NBf zJ#_PHy74mn2{w_&jqoQ-?~V?)%{Jp{aA7q9+5~Ws6$rMc!w}COVqjos*Nv9_3VgNK z)Bl9M|8^AxXbqkJ9>gF%!Vj}HxN|K$_J3k-c>$W@4)#!5_!*#(QUb(xA?6yr(tUZ% zY&J1n^G+3=eR#LjR3mZwUG((&E#FZn++tt|XmMG(3YSA5_ytMBuF(soe6@6tlj{wJ z*}sG*<>J|fPK`4A+xieXYA%FRSmk4SWX6Uo`h{}#kD zqZ#>`&QYSPnL6Yv#&M_0InFLMe#|S&t90n)tIZz`OFs@;4_Yj%Im^b~rwxro*lVoQ z_7``L&?O9GJH`mw_vO-%0dtEm(BQv-D?5JxBc&vepJ(^=a)H$gX@exhR9eC?I%v#X zL|(ppDFkJQ182wU<_jW=Li$bQTz&tpL&Y@!g z8dL!=gs1CgI1CA!l&JlFeB7h<2n zBO`-Aat4eDSiltUJ2xh4Y!XBm80H+|QCFi|hd%81oi$+`hT;b?b) zXzQZCZmiBs5Q_qWYYbpV!KA7#T*_GT3Xgmk!}wD;actibq&*WBl~j3}=up5@55A=H z<1pHxJ~bsS)4qB~_?9tSKKMvB;KJORc5IVCO2$mV#fyWBdmVr7u2sWE#=q-{a$O+i z63 zFyKN}j$QxJtD~#i3w{p!lzfW^H*e<7f)I~86Y5xQLs%p1S?EUt1XES`9=Vjs6|7-0 z7~~Jpy2suf1r8=XH5J5nLk-WZ?0(b}gMLU7fC-o*V&mh3KzM!#I283XVWy&ou%KX_ zvqcm#4h+Kskbv4*@UgHIek9AgYhPtyTQZf;m1Cm|o7{L!~awAY&TzgtNtuR-eEj2clX!@VOswxR7F>!}7nbh`?FA)|-rMA9( z@F1UE|2nByNyVDe%B;2JeT&fMNV%1yZv@cj7SYB8{EZ{WHPqoAP3 z6Xe_>i6|>7)gL!xMf^M-(Gue?=L(?LGw>tO~fr^=IP0R%E0(} zo}&JZm2V}tWQ4Ma9%TDM@6!n+7iow6zxpW2bIGC+ z3w&DPZx6)^;PFlXH59lI*{}9GAtAq_Z6c1JI{NcV^q+Chz&cYE3stL|IWL*iN)WZ+ zr^7E`Z^4}G7=Kr@tg4C+Dtz-xOYwEf>c|3&wMGh20S#SU_1k+B z^;M?W8-3OJzrR=B@>%L7N4wX+j0wvl7V4v_dnRt`P)6QcVgOa}u~9%->NmL)Jj(s1 zNeQ%lB*?ycBtsn`=~$I>`?KV4|lLb^UD)9h%P|@tGDz122eKHj*t+EqvI_EGO`HX0QS` zw^t^ht$f7y;D+U-{~*u4FaD{oUxtEdagX_M>(O%h3=Gi>x;55;GBL;v9nQxEP7mKa zh7=`7SrxKPh=~BxwKzP4E9@ruy3P3@KpQ^aYQT2+sG})u=Odvqlj2&t4@IA57~s39 z0C`3O7@3aUH*>{l_Em!O&icvPSJ{>Z=3|@w`CfLhjXb zS5SdqmuMo{5B*+32@vk99RTP^BJ)mB4F5fhG{aH)UfgTT4wf5NKsHwdYHNz%#s@X{ zSYxGrt4;-7yZd?rSUR)7a8PF0qFW6zIcUG|MyQXTGXi`XGN!(w`F^u|#ywfn}#aHX-HFonXUqf_6_e2%wbS0A@_b|8#_E5L6 zq1nk3YkQsDCApIBl>|NcapR{p(yDbGSPgTjtA zBi8{D0f0MH{MJOMIrL>YQgjWD3@{BQGogMeKh4oh=y_v3QW*WU5z?x@qKGn+!@kE7 zL3^~mPUWR21s0Cys_hnUK-IW)tuAy% zK$8~%0*|N{hUH)2tf_)i96=qF5bJKhCI+h~Dl+dI1Wb`p zUQ|-Cva-H?_iS{ROc!Q}=$IHI5#x3gxR6@L;l=I&4LexOT^^HsTeQ}mu*L9Niy@j% zg|eOd;1GekMj~)VaaXDqaWq-L!^ejf*Dg5FOn9hZ-GBYf_P+1omeIk+e>Qjh&1FrK$!jwIA(xqL>IPt@2z2jIcX2}eHmI_e9S}F z@lu_N$TBdUEiNr}K(+myT#G%wno{a(ZcLS$66T1NmoBJG?XfD}zZ$=d64%sB%7OFA z8|=6r!s}}H=ASd`SHxH9VqLj1xC^A*6l6`4k&$h|@ej{RvyJhxbY5X$&-eNFF9k9r zep%S#rkCgG?(fIytHOgv%Eh%>-RNJxOk362Y6;!}v6wrtu9jKR+yzn}-`<7oBm`Fe zcOM^Z0XIN=UgZl`?dX(~z*9EbhMg=*#t}q+6PpCBZFc4H}~w=SFVPxeyv# z@FB7k&-cwf#RG(B$aFNl6#o+W<#N0L@frJLft_DRRO*(}#vj(%E+K9uuGj(A(W zK#As)rDCnv&*D&&MASOc)gI7mozT+!HnWqDVL zl`IRBM_53B9L1IEi+8((Ja_8ZE7w-r+O+l6RUHd!9K$2)ZXLWA(YsK(d}0erTG+$m z-}xtdi>1SP0^a|ufB%yFu9cK$ zozI8S2XP}tt@xoP{V?75plvyFK-kY|#Yjm*#L)iqg8#`MAun_DH=D3ts%UHDz}@7z zWej9MKRLVR7Rq=1cT;6J=K?ed&B7883EB1Bvp*UIb_Oy!0x_>-9d|$rH|k3MmL8`f zybsSK+TVRs+dXp2^7qwo27P4)8s}>(Q)e?ko46%_MR^11FTVNG(dR?OYPZ9zDC_nA zx?Z~$bA?|)t#fSl>i@e!SQ%a4Blj#Hi&=dyxjyJTWrC)7mS2X*)pLlH`YtC*RYIcN_WO5*P_F)eO`8*)<1(2Kdx z^i_7znC)aQbY^ViNCbZefmtOnF)?BRAH5l{kAKJG2P^@EdbqN=Nq;S;fONvPe-QQ` z0V^GMmcFW?G1|L2N%m*WBAiEhpdHhL5wUm4MNmj683suUcp*NZO5O+Hcmt$oIz~pb zmt=&?d@lzF!YFG8WnKX9YXf4-a{G2QI)4j1~I-k8b_t0dFGas$IQ44B!A!wWQ`t!Zg3>)gkcHp(oODvh-hi;6crQ<&Vk6EpiU?UMBytiA?!@Df>*v}SWGTsN$_8p z!vhnjIyGz|tCQ8Yf!zp%4{>9*4Y?OEvOiwhtGg&AE@xF??-+#Ck6>fs-2J6Zf;r7R z^=m_eLTAj8%^+me@en33d-8!m#U)w$L`WmHJ_JI7-H8uBpPP%zzYSzWG_^o$o$58P+)H(Sx+m+V?8Df+W z!FN~ZDy06Q*I4bLk;Sgj3z&+6j|a*?~D z(P(s({pO-1xV?%|K%llmA1g~}YNk{eRqpE$_WRw7WIgMK`A`~%dKG%sA3AfNv#)E; za;$p^Jk(7*tF~LgdS@gu*Z+ReO^4Ze{Ojtn>+?pDpBaOhBQ)Yz0g1Igw7lF*Fi_V~ z3HQW)A{l$%t`P=WOsWVd(2-y{H|M@c`g* z{cwVR7`p1~R+>t!0$*7AYEue@gG7atyuEo*X_59VE<{zpv16B(NY2GGq2Yc9L&dT? z3KiejN!9CLV6)(WYH(wAAgHmK=M>GeqB2aH;^8XuO~)+aCH#GBZWkejwB~n>@3mN6 zy@O4@`_Bn^(4oKM52pp@z%UT6iNrH?mKlBjLRU%~9BYztzd`>Y{*oHfH5fl~esFoT zlG{TdBU5w{MV?pjFoCZ6&igq7CGJfNB=h`QTT&Tg1aR*d9I>g1bpPhgTW*T|Io*Gp zsM`Ad&BVnQoxg$sGNci6zmSLiU(zwD9l3u#kNieOQV$R@=d2MV>PuZffzT@A>~iGv;rp=~qc&UOz=BHyX0)`KaQ5J!DHTgAJYeYpXg&5% z8;GxO3~^U^9cKMF4Pw$rHIepyFa39byhvr_JZ;c^Qvn6Im(Y`V{Ax;!@drL-D~T6r zUzcTE8k#)_YQ934hR~(ontJW#Pwnc~fpzjzZ_^zd`SN82F9>1yoWLYIwl5EGq=}BZ zk*sXb3Tkxh=gPvub3wR=^o)&-%QUHh_)AT_4!hR@9{izhk6j)<<5bletyrs=3L?z; zc>aihIxg|{YueQ@G zC?4fjl1qEU4UsCJaZ{JCR;OZL)K>Uj|OTsj68MYqI1z%gPb)22C#je^2Qa(qtSQ1QN zh^o6V5lnXm_~;rsf(;;=BZ2!qp5R$GnN)7p<7Cp?4smB}WPRM{ce}_gh4;qU(fwgHL}sdsp6$no+jrN+zR{G2 zC)p%HzwqUSeGVO2TK*zFSITrG<}aPk`nWrO`AS@H>$}X0Rs&rpn(Wpy56<6?s(o5L z!pv25t-FNBsq#2)Se3CbuA*d#SVz{K{dUYl2!?Pi z_D6?@BTtGki>?G@qh5@=7;y#QIt{1U_i2y&nyxmM-8C)TV{XkBt6B1y&1#X~`F>vP zWufChu$0nWWoM(IqdewXCjEQw7?nSS;~7Dwu!NLAM*2) z!Hy8pVeGlqsLm$kvO}N#5{O1P$YZf2US8p8yKG2-%FEA}P$BydAzC*$9&AE|zETqF zSbQuqxT$R;@Uz2geQUZeD<+?j3@TTK{VO@R*jDP<#`_SLnt1fO`%(Zx(`F}Q=s*}h zT*bTU_?%g__&_U>dek;K+S_ZV_1yE3QSRs0c(vEW1y+LD$4%#dzq(X>+cELhD%sXi zTdA?>!9xQgW<6LOAP(ffow!f3Fva4Qs7KqLKLJZN`h`D z0UsCl=o}EIO@Pe8=t#MF9g>h(CwEIGJSq9*xOQ2Vv z0O)O<6#mkX8Q_8^K`>f=4^sSY@Fv;jKt{|`W2sqH%u=SqTw5o%)hXbp-P zp%CZtqD#Y{dyo)&Vt1xspP|`D+R0Pzy~hUT=n#+;m=0z=fPs(-ewTvX5WfL?kvvQA z+|wD?~vOocz9PBJGI0<*7;YYtX&pVXOty$96q$6 zKeV8H7psz|y8KT%(>THkV%%bRVg4zKM zbcT4PHsV{-830@E>+vfXy?r|44Hp)~B$?Fylo@fYQ!RG&PA4V|8)*YILKxwV`@hZj zsSWt9&hH-Gf+eon4ML=bL3D~ZJaFI8F77ZEUXqWyRN)E`{3aCK`V3}>B=~L31-9(5 zq5WIscA!bFhY&vc{xpH8D{~`LrT0l9%=h8LJG0=s4pc)~+}DAD&?ij)kw%cfW5>vE zFL4$;X)8TTJ6?p^J*KesQ}IC6&Cd417oaj9eyzAFKu%^#6;Q?+>@DzTa zRM18Aj0^+FW6-D$bvTYzf*g)a6j6HF!p@A`EG(AYfJc2si38*jgO0>mS#m+Vnt*xe zh5dRcbYzl=BvHz>5^A4vvZvXhPvN=}SD=RAzB70=-y|+%N z$V~W(WQ8b1M)p?rDnv$Pbr315BqSp`Wc_Z>^IX4kRj#W)>TtfFalh}^{eDZAdwHPL zXb6-2Aa@PgMg*|f`$~-pQhxO)0T%QRw?Q4RKFH-DQiK@qZ$W)a3;Qxp^(fcm`Du{XxgGsMujG?0{p;x^`T&z(JM?lds^@6$*3w_Z|!%Y(}01p3?M!CK_N zV-2ayKb=MzT{{sg4Xoee(NI%+0d#buZwilo&iD81S?n}gk|v@ipd>HkahONQ<@_RnfBowThM8xs zrr5_7(`Xur)e48@N>dxv)M(a{bx&FHsB3hm4@QOaz&>vocp2XuBe*%ZSL z^Ps(;r5{Hrlzsx*CBbt^PxEzo=;^4y!<3zqvk1!oOj2Lt5Liw2&~X5qzOreQmW1#q znu@J85QLVGkk|CCw^th^o?Us+dT+yHr}566D4BtUr2;;V8N|>hPV6?cN#{WFSU>vt z6LTB2VHHB`L2rY9-_a4+WuZqNL=ksfo%drz!kBu+V zp<8H2f&$V~PXz%0>>MhQOyrfY=kc1uNhXZjLrWO`6k-KEo<}R#y2AHnNLkV!i(%X5 z;D+eOi^ty*s4$B|1ZwT`yAFh1ZC^0&2RQILgu61Omt1#{!7wRt1w3jU?eUQo>Yr!k z=LF_#122VFT-2QNqf-Jdv%t%F4dhtHOU{J!WC#(M!@69o&6;-HFMjXZy4y{yxC4Db zIVX#b)1EP42YfOE8Yw&<+$F$n8cZfB3&vtjj&U7R9f+c43Q)X|3J47_5W}lX*4ewo zV5cBHD`JbGvr5aLAS5PwJ2J-sF6otKnAE3FLm(+>qfb&Yj2rxHRcOXPNPu; zhQA9^iRDx|MA9Uis66T8Y^YP-<_T=RIb2v`A(XfoUb}f|kt&QBHC5}v0dF>1Rr$8# zXswn2aMEj;%`>Ps2=SSH9ESC`-j}VrkIe6frSho|Vlsrdg0O3u~mEnUzp4*y}o0|mW0K)}(vJxbs6~;DdTzVf(w}u`BtN=8gH-f=3t;qdYCmC$N0&Ql|7Xf)>~ zMvBve9jH@5Zt~S=LI&~33?E#mB2xw}4S~%KEVwNob zJSqrIoIk&P!}eK0hNQj<&iem&mitX< ztlQ@W5JdMQYxT~ts2Uxy2CsDtMg~)u}kQ5|^l&-t{V!@yBld-jljr za#YCQteL}?c$OA#Z{m-x5UnQt_ff`ts%F#H)_$CpW^R$}c5~xw=vL3Uj@P@BHtdti z6`DL<(Hvo=Sj^@4EI~DQiBp*4u`oRu>;!Ifh!uEZ)YsFqQuVcRCwq$}kdRWH?&H?= zUa<#h0q_1#yZ~u~;kHq#{7Q%fm}IrFA5g7>rO&PHV9tqgPk4e;Vzd+i{)7>cB^iixP1f znmM|Zq=QD;_%2XwF7^zERg{#5_eTbnGO9T79{ublpiy=n?iAbFEpV$T({`z1i+ap6 zm_0|Duf5Fv@lFCa2>^*iX)dmZ#3gCrF49vF3VsuWdz|0>dH>~`|WK4fAWh8~xtlv8dBxl?CIRc0&tsV8ym><}XhZ1*QT4d#an zws8%?Bb2`qm`GznXjXVtU-2&wwMC8CVeU>R(bWFn&J@fX|o@HgJz*g>9s1@lPIAD@9}qoJ-P3j9b9`#p?*%*!E0 za6{Wgh_qlFg;+e%iLuv9YQsb@Rq|orE7|I++oHezyhu~1n#~$fi619QwO}!K8LO?9 z4e=1-Tr=sl(hcyTOf`%s{O!K{y=z3nnZ_zDl4q>OZr|~5kP35GW&=TVerKM5rW!u| z_vQQDTpQ+nGdW#0w;McI7rymH33rA+e&InufY`~=obBrKR&)xwM|OL{E7awt%Ah88 zK7q~ixu|Yj;x$t*Vb~j9NHPmOi(3<{2Tl!uywlr~bcXK6r%Um4@sN+Dmm}9QCFlr1 z4+Kxx!b@%#PiV{pEPFNr*FT$yK6&r8QmGT^5(OK=7ToOi!Q&TtEZ^v35jDtXhP=Zm zxGjbQOObHT9Ad?~Yier9P{4kgp$TcgirYPcQ_4(MijI)xHu6%x2h@ch+R!R+n5r8Y-EknUn{dN-dQb^GfC-@Qa>n~Ar`K748ZK7Ee$Ak1dD9HHn8xmZ^3mNst~;uYq$yqpt8bLC z4;%ixP4=~TDP;Ki2&?p)g8#`ugu`L3YP#`FslbJbFCrl2H8yL2qCJRHOOer{6R+sOI9*I?` zcyo_*vR8)^9`je=5WP0^`TnA}k`d1pdZOE9=o?M9GInLZ?w4O7MzOZXbSz{q zutl{Tst`U13hxv7l=!Q_CpDOaYIK$k>wBoSOg!-ha56^ zOhEN*I)F}4I}|xjmY0_ed`34`F2I4v2J;Srpk1t1!&9)ge{e8!joV+al8}o9yfHeH z4?J3Udl$bP=k(N0H~|BaZulE1_K=(wxhE0!}ZnivZsauY9N<^t-v6p5!nH! zS~8(bva$E6<5<$LVC?d98DBnwGE+dtodC~z2vmfEO$kS}4d1>m#>)HaWe zY`MGQVS5Y2ueW+xzVqjX7`p@!SJ1VdA8}nT@$|&m^-Pai7b?6WUpHJT)MA+HF-Kbm zD0eYm!;JNQRXoA9?aNF5r6eKUiLfoJi>)ebK0<{zxr-1)3+5U>)qa595@4O$Pxycl zuBi1ZYx#aJ7umVB(1R0GX84eA*U52p2|e^zQKVV+pz}nZboQ<~_Yt4^7Q5~bN(28G zvM7C@wKUAT$*N{4H!|i+6pN~=3t*h9!wGWiDBIPCI>gl6nw%&(d1Yjucjv|pv9gI) z*+(BBN|z8Q3zq9*jH2Vxxo{+xf#`$-RH7(`OFC!9e!n?XRqkbaskK>g6E z9_Z&SFyF=+HeIp)0ZryIu(O#S2TiG6ImMMz4=dha9co&F4Na2O<+W=MY5AEQID6L= zkZ4(9VciSKniN1gK#r3!04oBhbkYb-|A!J#S|XsT8-S0|cbHYAD>Pn_iQpuGsMzzg zv1jmN5Pp)yc8M$=t<3c*3+SGK!Lh1>^$`9$Y;@!N{N_GOj7(Nbq|-Fmx@jkhtP(Kd z-b5yT3rICMhc9++_P)=YE7}?1`R<)J&Xm-hQ0_>+!TIDp6i&_zR*-T9zGOTVQxLeP z24sH<$~#-+rC{o6HyFHS*HR=ZR(5wHBYgFh5#{hVjlKun!y1EJFc<)VTY!c>9yOdf zake@Ok88NCXrLy>h+dtB@O~^Eo6X}xSm+Ee6ZC@BGzySpZtncadzG!@M#DhI$ofjv zpDnBCEMN6C%P(&w+p2tAF(#n+wZ;D^lc`QI<;z`5RM9o+IPP^818?LCeIdKbWvahj zIVXoURpu8IR3#7CrMA8gF@IcVz`Ljx-%mxSM0$e8^9qx!iwq5W>zQG_Fp}}vN?M1) zfLsJxZD6cv(3f?E>vy{gG5hed`-a(6_=BM0p&xGs!LKE5&vomc80NKN-3t>e6y4cn z-+{qrlyKKIf^!$q9Cz|~DGTBg0g9?Q&fw)I2k>7Gy9p5!{J_pKY(@}f)W!W5anjS& z42p?ki5H}$rDcbn$&*tR0EapzA|?m|o2Omi9hD(v?4$uW%nkr|xW&ZKF#Q7B!87UG zIgqJS1yZ|bmTsNV%TET44%+K+A*0CJ?hMGSjcsw>@Go{KLK@)}m^OfjiM8-MiZ4P? zb6168Dxbj~Uj<1r{ijpQ*shg??VFDpC+|z(;CMK-Av_P!kUB>6P}>YHcw5FhP?DoS z_G3Vm`pjfSN3|9`IXRl)FWYw`#*%3-6FB0&(wuy}6wWMFX@*Gc)PyQ)4icEvX3C-2 zmHVZnyHd^v{<(p!_>x(^>LV$Jqt@%W z&_DJZ3;rQrtRyTy(SRFOFqzF>&Kr{m+U6lpkGjiAO3Rhd1+x`+G`a77Pf30*)L9P0 zmg-zH?UNjc54^EHr6B)Y8posb9MwxW%7=7%?Ry>#+tz$2DioM9xHa&S)q=U=OPvSn zXy42y+)he?Mvr>|O%F#H$t68i3{&b;#Te91x|MIPqWj_JJ@umZzb%Z;+qM%W2`#Lx-8*&lu>-~H+UKjUZCsYDN}8@@-4O{~ z=pqURSD|zmSNUhr2mHi7B$**i4q)hFKq`2kxi#qvAwA&GnOk;?oE^r08$2f~_vfpc zX1S{t1b$Jk1t?E;V=g;GW&PteVAM86##Za&P7qCP4s-C&B*!DpE31S3%r+eFD!IJN zI>OC@mQ6YFHzI^+hqj)AJLP0yOBl_N4XrX)f>OAeau}63JMz_q`UuzNT%~;+rC)MX z&6gvk^rzT(RzV@s{1w>??E@2e$wido_msfgQaw6j&u4#Y;;Ia&*=YaRGz1G8X2F=g zf(Rw7Z69mbQzk)FSz?_1{NRJ_J=?p?jKKY=?+8= zXCF~5M13_yn8Tx?D3FQE@2Wb>bk8%Cfkj*Kf`9-c{)=LUt|57O`3@Jx;# z^{UKAlqsKUOTQ~ug_aI66BE-=RYmFg!9clr8qhr)1ZODvVO}IDC@t%vV7Zn5-lApw zFZ2MNX7RRq*IRcwHd6d~@0LJHx7I(w+3x)18KOu?8YA%z4K%Yh3yqD;@`nn|*LKcy zi#7G%`5!!>A_NKs)>hQQ@gkoP(il;^QVVAj4eDd=rR5X8EI(tGRe_Qv#?5?RsrkA( z(eJE|3%1)Sg}$Bf12;nL`GcZmO%iQWa|2df?Xrg-F8Z0tmvd)(5xmCnUeuB$MqXpG zQU{YFU+eqGS{7&N@vp7=Nzq>qT{EIwab2@XE5D1=*`(zzl9+lr?6~1qCVtDs&%eWW zAo*3EIlg80Z=1c?bE#Mb4%-$pB?7Oj=w**#?fn%&;hIXZ*k}SgjqJMt7O!#IBdfHt zvN6IXSM1Dwvt(k;{L92kga$&*Hjp=XbIBDSS5jKX(QfT=+a|YX2ePV5by8*QjDF`5 zl?bgGn`KoC;3nQ2q)&{x!d~(qh?5mbN?3yT3`(zAhy zjl!lDJilKZtU+lsyDnqbx1P?eTzHh`UOHI_n5`AtH1kkS0S>)>FaMgV)m`r972nW%IgxP)MV}6 zuW;gWBkI^Ujtz*1<5SR{4!vzbuK4F{9GQQ$*kujhr*z`-LN&`}rzLMMQ*QpcsFTyW zmeMBr#@oNlID_@4icYeQ$O!y!wiJKK*qU8q`8RE6mCn5QwZm%<>FiFj7Sbr`LcvQ* MU0k(Q|L8T{ zXHCs1+ox*R$l0gG<4-k}hzL-qpBPxol9bRxnh=|t5Fy&|0H=qsvHLVbSsD0zN|Dc@ zI3miQMMU_>gTDupOG;p&V;@1zWT|3F+CT=+pu=m}ATXtH$gpH7Ox~|$v}};dvWkpQ zmk8gj+z8y*-=B{SJGdQ;`CSBTU^5^K`raxVwRy&>|DNwJket1x$k%ux$Smr)@y`xT zQ!FNY+m2=_11>hYl;}r}4iCR;lxyPqKAcx}x*edD%D6c@*XST?z5=OoFmP~is~vvn zw@0(m9gb^!W_!1O59f)ZA+V+L^77J)l!o+0H`-}o)7BD(h9onyv!ofbpAaL4R9H}v zIq{I6+pZ97D#dku@sMEyY;|=7SmUd|`FWRXR$kL60Xg=xjEw%4`BXU37f8^MGnIPW zrd(OFzP_!T)inv94BLOKW(Z{`NlMG7$Wdub$O?O32Bi<1KYV!ROWqjf4Y}cBG$?k! z#bK%OYC%NfB=A6CSixge9WGWf)t|XW;=*shkViUI{uJ9rxLi{lAk5D7vnl(Nmj^=b z6Tpyk1;QXZ!rP?)zxiF5gsMEe4ZhVAcHx&(b`=v7GV9Fu5H;q(zmb?!C@3iP4kWMl zO=zOD2yjDwF1!PdATay&FUZr_T7#*DpY7FYG+=5xMWBB#YjiUB@8zDcoSHij(+!3LdL zk@3^@-VZ^)drOd0U(+WRu6TLmJ_!_3A%Qt#*2A6c?HMsKF#%-Q5FsWeruWqrH~#>h zlaSZf*WcOvUIR+me4LCF6u)3Vi!;ECs-%rg>0f)U(VyAb*(*&BCtN1I(0j3j+`8uG z=GLQ?GV{HrwSTd3a8M3cnw|br%W{KF$Tujs-qBH{PXrv@n>``Z?LKb12M1=vuS;^R^8f%CN!rbHP} zO|rVOd2$fPUhv@S-{PXQ4f~F!kuC?G3)xzYCvV&1nqydqeg7`6ES1wmtT@s91o^^* z$o>T0w%)%tkJP-<)fDEQ2KPGh10^LTcd#Kns1}A64mdC;3zf4< zSzKq9j*gBc>hzpizpIV90K<=EyXt;RbMw&QJ=Xw_lX`k2rbr3Xk@4{}p1{|~7o&i? zR7K`=@qA?w^28r*Zf@c+;QjZ__zD{)rc!LfD>kGST;|$ZX{^IV&&|#44&ET{ zg(`#cax{_Dn?J65aviFr70Ht2+X7)?-#G0S4#ArAWe2~hP7WmgU?@CU_c_QWY-wr9 zXB?H9zvLQ7O-T{?jP{v}Yk?9YQe>6`0~3?^>`|^xUszXPuM=+4?Lx%n zacXVb;mOp(ZwKJ)^%G#ufy-r$?%O69_ zWJ8p)`}_O5aOzY;eq!Sx^#6`t0D|$UAfV6JmfG9h6~K_dmKK@C`IA$o5loK3S`v+v z1W{F06?}SnTFj%@WIwE3skvg%X6~{M5~dOwJPg<@Vg{_AlbkHRRKb5YjL`h{iS@0p zXvC1GB{4WH&FG0loo`2Jr^mbiaUTK5)DhJyN zq{^C7P6XVXbSEn9@7WRyr_tM=`g;m`F?KFTkLEXoH8!PGR8(@8>a7m!I5Gz%G;M8d z`^B$dKtN;XYmT5Bx&2jv%^#cqxHs7Lh?C}|%VBBp&E3!9>grhGD8x}PNI0L_*wBUF zA1N9wMsbd>_eSS%jr>LD>wa&|Q^}`oE;rg8ZgdGx2CZ{K?%Xux&&v+2d@qdBra^JLN8} zwRt7SO6_Rq9aC^~KiKN)>u+#5EU)Ty1qOsSH**Vv{kr{WKg-$6>tLZmCwZY#ulXPF z`}c474ntsNpgpkJ`)Yf`^K3Z`?A+ko)Y*N$*5n)zi%>>V&2|7&)_^% z?%z7Qa4^FeRS>6)<#8N2X~+4d8DUrc(l&6DGqj&ZgR*jE`*~jhS>*^I#Z+{q7LcB! z&`XG(Y)iOOpk4dt+v>%Nha4aG2E06AvaqmZ%N3T@`@wU~bsGUY-XlRJde;W$+ z6GDEEWA!}E^2p}q2Z}|6^Ye2Ca8!OY_jPzum>e4V3=XHiP5Q!hQh`}DH8ojVTl%ZJ zyGpPGUS1D-8oPytKDReFYJ|wJGllZ$gU54|lS&R81Pn6{t{0z^hu72O3UyRVIpoO` z{ntxWeyxI4lK}Q>b$i(ezfsZbEKi>|%!jlPVQ-uV6mSY^NKa39{CIzhzhepMF$Vui z#@Dp`d0U@GT?gRpta;;hdV2c#-#_gDSJyf+VeZ8O&GJwE{ryE*+)kOh*B`NdaCL<~ zYISUn#xub|ZL_VTvCX()7}vAPVsV|aGIL*DJ#L_9s6=|-xPF-kEMd8KV2b5jEXSBrS5gqKaFP>pJ5t&|9zQ5HM!3GW>?J=1K!s^k0VTZ2{JlSt>qK6jIl#qb-dAuY$`d9m_ zMJUy3^bZye&O(dTWKM2qSXh8@v|ofS&j%yT9P-Fdpb2`a^VM1B z{GCrVfZBC{Tn{3)K#|{o|2+}w7&D_1n@_wLTGwx4BjF(yec*#ZN~+|0dzi0AiGR3y!Y z^HnOfY2~%V$19zKttV2o)Zc#8P5Hqk*FbhEt^H|wKv08+v2mW)+9*scap{*ds)4`1 zz?M(WrGQcPR9O^zUBJuzlaG&&zKsoCR!)wi@8e~@2^bmS#7ddX*){_Edd-d*?HwJQ zAo7!CsXK|k$+K4GZqZfdYS9!A2hSUR9m%~|^>xBzD(u61u}(=75Zhlw8+ae_o|=5T z>X?=7F%P&ES`){62G1w1y0{y%+k6(A#wpp@5{XuulS8?gadonEU*))(4o#4(G)(Ql zDByn{@;G;ECSt1qsZ-B9Vmh~$G^IA`dbK{z42gwGYUnHdM%`h)v;Ih42|}V@Fu^{R zV{bdXxZoevzs;e3U3#-imMFu)319hLw_npu_WlS)aJZYR%%4zF(;=X=GAm1O-D@L2 zT0l^clPju1`ez92Em^6o^zb)9d71cgrlI@F*`d@Mx8Z2u%{Sruclf0AbZOuFQ`zH8 zC28rwGu=wAeK6`}16wZ}7<9$Acwd>u=reB^n*8)uwQuzHeU10-Ex=aO)s<8H$s-Cj z>!JIzmErzq+(>=q_|l62^OHYwZC)3XNy*9b`(qjP#fTAwO|I1MvQMvS0|_4x#d6fi z{j2Rh$pF~GlhBlu>VBBWgv&_ONs!l}(>|gO{YIEqAby`OQMJa8mHJ{ffLyOmKOZeo z&>Ft^q~#^X&E32qC@46elamu4*)ehiHm=2w9d2W{M41$NEJRY&o>^Dr18Rf8iF%`*fr#|YWdfCRl4y;GM;*x zv@|R0ZML*SUXJopDT=8@-;mGie6>}(js!P!1NsSUB`c#6>P&+JdDX+=pSysO0AOwy z^SvWe{(P<{$wFReg^!{k*^3AI&BnjvNUwReb$bIqY8@GNGld{OqjV zmcPaJ-^g8X{MqdZf!hVYXFikwkU@JOZKzed&@nPrxW$tQS~i2B@kVa{(}%J(9TPur483!C4sItopFy%|4DlZbQQblrc+0m!#}ZzWK^j-{mwidqx;1dj5*Po zS>SZrKdkzJ>PtJ@3Qa#NatTBEEbp=BuWC<+6?Ngkx26Z0m}@*WcS1sU*Cf@>KuaJH zdqgXM8~;lVXKTAI2)2Krvdo+E>Q2gHMUpUCqoC7OjCMXtqUEMf{~ergSPWx|6tYag zhX{4S>m}(@^-cmXnDTx&UxV}Q2!snV%JqMTh7#O`6fOB?F}VR%0N!TFQuRPIBBIq} zFn;m6^?j2AwVj!*b%i7s9nHVLzxRQi!V2PF*oXAvN*IuqJv;HlvRm;-X-JqU7x>N; zNKeZFoB!qW_Tn6Qo$W!23ULqOI#gKr=OKuEtwr*>cf&*krq=jLdf-E-uX*tGj6{n}^KLi82QtDDULp^jv>CI|(&dNmQFa!M5Yg@%{F|1pOiQ z<3GCGqHs|uE_vfqc>QMeB~PTaCg7!MQc~K;2xL4`zmQj6?s{A;Jbt)t_YV<9xf!l% zuK%g92Z~}P@bO&Yc^trxhN^n=^vsxP(?H*<>^h#KV41_>d6Iq8&hB1TasFv|V_;<^ zE;=LA>qbEr1xb;1;fCt(7(a`2feTsVGx#IKYZM;UY2%GzP$7MUSP;fo0z_+GxGFw( zPBn2czCm!mQmKA_t7Jq#m+1UM=*98u=BTt(@$!M?<>jPWSR4@9S)tXlgRKy|Le+tX z7zx#sL;UG5ZnyEy@}MZMpq-GKagW4=b{W>+`e0xn*zok!BBSYvhq0%2k+@_r1?;u$j491C2r5EuxFlZyibS zMIbG3Z$|QT^%B5$FZ8Un_|HtQxHn~5{_tJzqRt~SfmP%DbZU|gg*yuYLN_sdG@pJJ zT3M7Fgb+E%fy!igd^C6sq`?hEYj8M@3Jj6{M=cNv;@?hmNJ1F9EXq9Zt5}96FVi>shz3 z0Xw2Xkh&gb3ye=#0#+V5?^gxs1=X+c*#rmnjG33i(4@J}mRlGWPEoxl@7aT&bZQ)O zYXZ~&xE~b)as9hq>wkQ=t~afyPIazM>tF z5qA%^v?w$F_}Y4u+EBcULEK9R+I!uPZp3uTt#6#6GCi9eT5O z?>$h1EKhZM@h{v;rwV>(Zi$V$U&n)&8-SfV6_$-jccgi&4CkBs>?Zm2z}j2I)3X(T zJ~i2GXFoqXc;%K5ui7`?EHvJVP;gkb#_Ag&jINrP&$617OJvtw1uo38NB)Jud1peiNs{}(s zV@Iv_XGK$HH0DkzX?WpBH|HAo4Laml>lt14W_s(TbZ^6YZ_{P6Q0DtM`F_BLXz&la z#b*!~QYB3`T&MZIn>a226fPz(e_Ed9fU4|4RH#KDLUp&>`aX1K2Lr=*G9@Woh}zNM z7__YY^A08Gt??g}fxjRTTDqZb;m{2JD9I*yI26pbE|iKEXal0Bd)P~=Z`LinxcESx zB*&0#T)Ip23A#bq<`d3pha1q=V9}H9Ah5G#y?0t$``!|A6O|jmN0&c@2 zvOkIHQE-Sbx*qt!rV8P#*RfC8$c6o?T1vp`O8^UpO{7Dt z`r>NyMxb8~^~-zjdY@*4tSmz-o9}xDN^%5Of2|(XqrZQ=7Q`HF10Dde^;@nw$fUZR zz5H97dz!vfpDfuxwU+DEPW4eu9rTt%CTH&R*0IBSm8tnbMq(+OShiItmyuIlskkzh zE9VoB>mfXCJ{Fcjk8Q1p$ZVeVh|ulQe`)Vku*7pQ9|QtdWxv8A<6X{`jJZI&3|q)M z|*ek<{lWP5m9ms z5z4%+3+DbwpkB<`;*x1n$mF~nf$YVuOeuMIL=d;aSPY8Tg`pHpE8d{DVW}MbZ7Ni? zk_5{NQvB{$o%7N0eUudH zA1-prayK2s6vduN`@H?W_ph*DdQZIDS;>oNGdtM7fFCC2^wQixpvu;+;PNi}pd`!X zVIsDCh-X8JvS!>ghp>!kC>9t&g6GQdJ_AYlEY&#o%)!tGkX;fQQ z@d{z_eqy8XLiCv<;0M`+WuD`iY;PK=`T#Rm))>6~DNDdZcBzx{1V)w_d8xlHkGy%E z6V7-Rold}KG6kz}#}BHz5LC-?IyCq~LJc7%d&3vAMqQIH8OB^$CbilL8G%kyM^L2q z4y#jz)e`hD5Xz>;SFC#RBptr&XT80;bRBvz)lubtcp87u#2jBv@@ELrIBiDsEdrOL z8H9g)&++8FPkucb$z2qUr>~EUY@wOROSXGz}MpLx|Igxk+yN{^6<^92*g{eFpb)rNC#ir{U z+4(qBM3`B(Cf;~X*IQ!ue4aye9f7|?*A%dz2Hmp=((zXjGfN-s3IWEw++r^ve=Fu0 zb+kIV)ZM^?`=*tf2AJE)A};p55YAO7zhU~$*NM9R35v|r8lM(~1*41wPv-pK1VJ&m zQ>>8toELs)i%o9V8;bD9>tfyPEGOkh%@L?v@=J^(g#!XV@F=qP7zk3 z@p8ldHnhgtjMsDN(q3Q^F4)sibM^2Kf%SQzUN1h}8+~OS9K>!~;eFwcA*poN>m0jq z9f5*jN>5^TiXoPq#_EwK9q-u$z0>a6)3Kt4$FIB@_bQ-8;1n{$^GW*eSS% zeZAKU)?B3TR$2i5o#;s42i6mGYwP`?hfbTf4eK|B09B3oD&J=q*-AMkA{>)rYR3)M zB$`<)7C6PhD3ALxRdd=<|8U`M~A^VLRFfwI@GtFmQ zz7<(;?k5+~_PPP~=yr|Akc4oSu+7M+h5~-3Q%=SAc1zuhKa*7Jdf=&yB~*VfHaQ5W z(-^*EfH(uMV>oApUqgL>HJBfyz=VI=^ln-U7)@~I)oJAdd%S?6t5t`{Ldg1IL`5Zx6Z zd^Dh(aM=KF_D@ofr(HiHqrI+Ki;Toq0d3{j8q41G595L0M!Usqd?BAF`L$k171c6H z%Wv4a26XPa#OAKNl%{NW-#~BckFSNlHUfO_-%u?XwHsagiP9|Mmj=bb2i3l~uDJrv zd{^B@F^0SIeiYDDdqA##q539y9$g80(&bx}%_iUz{O-gQLEnw^1sy7x%SbQ5y{f2@ zFOSylf`!`(_G=E-VU1g{COnAW%Qh^Tn#=vs*3DI<_+a^)GZ8E@NnB!ejD%bqiEy@3 z$b@l|P4mw&CZ4(RdBN+BMG9=l@Pf=I{x3%a45O@K=TnW_6()U#F426g#WV*vM7Be1 zKs~@ElstUMD@_n1f5`#n)T`L`Z{IYj08P%vBU{TmQ;4_@)i#d|Ih@| zaAeXO0#Ihb(nZ74!_H{nleoDg3dvcZ5H&*N^dKU_WSWml@ncNp33h0HcQkZLYQD|7 z>9nq(!0N9FNn%oKbJ8GmS(0o!Z-2fru3DfG0<=)2S6?T8FL$$oE~5%PRy6D)))S%7@>bV=Sxdjep@rCg9)#81rb)2P=mzLOjfZZu1+-XNWp9c zjB;fsSY3{j3U*qZyJux0;@s#c*$lfCkU964s0EfC;C=V!XrjZ$Bu6Ht!g zNlJgz`&OK;r01bnbSRq-Za8szjs0M|0as;fEypvZk5X3zp%2x4jxWohA~|s$V_p9B~!QOMb1abi;wzT^FD$%#048Y8Tho8pTaFw3Vf5aRb-3u(A>p7o@#WHer+|dCxtxwUzlBvqdXk3 zU?z5Qxzz^^D$67tSI6zvpbPQ~0k!ivPz7qg3GqxIih?MP0tx>|3w=V`aPF$6UtDKCeq87_N@DPOPT>K9G&zFbF!lWI!>$U z`00az?54(3ESO$aU=u%cn+~x(f!Y$SS2%+rfH+h$>>mbF#!}b0;ThX`KhEQof5tw0 znys9Bh6jd@vxf&UzuW#;OGtRURBd8#Yt0yeb<;H(-RhLzNb{$9PO49s)g;H6US?Lc z^V;o2%l=dr2Aqc;v}`G^1ye!(`Sa4fCK|eE1e{0QyvI6Uya$Zs0MI## zD7EPmB=#6M>kjkNP;EIFF5rg1O|#QR+|<;R&)IULxT2zBm`LEy%ol_Z5GfrsQ`0*4iPK+RyA8 z-`yJ_aO}qIfGq@g(;ar>FZf%hr^tn?@TJM5AlR_u?YgxHUy9u?kpYMG{~ftFOJt*8 zqbqck^crmG(a1!^Y)J^7TKk$+F#m3}Y1q`jX-_mAm4v|6vujqlZ*Blxe{Sk50@JA# z><{r~mK(kI#~LQeHF*vBd~}8qT>%5^&KCI6=y(O7)y#TyVC*#;!KTbnNj$C1+!mRZi#@&w1wXU* z%&!zg5mgyAE4t@ux)?|Ls>$?1gp<~n@*vztXg2sW$ZNJU5JHp<7bSq^g5QNgb*I2h zTWuIPZ~a~&ZHn}nXzM7r7o#vT3`^rsC^@WJYjT=Eo2WG@qz}%sPo=N~H{#bXv*`1+ zTsSJUK6}odv1?W>-Cq{9*EJYqyXy|h&JPDTtT@mf|hPI!|UXDVkxRp&eH}@G~#iv1J*1JsN?qU!F zV=NNh^0<#aqYz?woVq4lH#L_*OGCl=gR9FxkdQN<-dRwFOQU|D*9SwN^|eDDIBAC5XF{{-uAH|mj_s6 z+Nk}Jupi`t8$qTNP#%d0VTCvxH!7Rzb3%evoTn8t%hXuBTnLx_G)P)K#@h)ArC~DU zSJ$_;9&Tg1I!Rv5lqUX4TI~QComzF;M49}kD-m4CG^6SPHeY(mF_F1yB+#?g&sJUL z7Q6o}Xtk#b0UPeuV~r0J64`%I{ID2NRBHugWIdkxSEJ=$8DndxoEJ!aXE`e1!E_np4>>+?;uIT%>Z&QI`P#6FBG8%nJ+4G!QpAYShzYMN4{*|Pcmz$J zQhhhjp`cI}O#P-Tcj(gLC8}7+cC0^HCTw(+ z9oJ&?&Q_{EE8UaTkTB*c|DDp}e13zRe4if zAmDcj#X@4YpdB%yf>BH0pq5%mGCWLh!Di7rYCk!do~kN&;4336Vg??JE(1vWWZ4g# z*@)VIhKRp-iBczjoBIU^jxaR&GKkSt_N_JBH3BYEkO(43Kka{aSaA^sD#f*}2A@o) z;1i+;EmD7tP)c6F19+Tim!V5a-qL4`8|w-Uzg4RLwoi9}3{nQAJJi~j(l`1=SAEL| z;FERq^RxeQR40y@pMI5pwJARAe~Z`% z^n*P9wRMkmveqsF-?GY)DkOr;J=ok+;9`6s<9>Cct0tFU!K>E_er)!fB7^jDYh(rM z%mtq-eC3Md6r-GrQAqgtO_iH-(rXkTaDW%C3mi;DE4v*Ig4plhy#-i(R_3A%S1b))7|PdFxh1# zN^hFi*)o|oJp99QMB!^yA)QdKS!aXHK-SIxqE@xGB_fiYG$JBm-n{Kc31(FATn_+6 zp8<+oj3d9grH2Yqawwe~aZW&DElI}xnx-?KxSl&GS&2Fg3zxJd@Mw;5Cv-87`AbhiZs-ND?!K&=IrVGu82k3NN5T2o z_uFw(5QO(<*SVPVxC`Cdj;1=T@0Gwoo5v4n_Bk@KH?p+4x;lG$zgoW9)nN5vUT0;j zakTeZyzlXQ$p=p>*afm8Dj^!Kyw@E4CC+tr94Wp1l@QiZ!HqL59u5z_-4izd)1&$5 z+AhV5@TjpyhxTQdnv;h3)ej}b4ws!M9=RTj(Sbe8>-(3)|DGsKr*=d?7fAjBWNmtz z*566kv$5#6*k6sd^(|*^1WdPWRhqluNKV6MqH7zdLvFpjG;^d+ke)GHv@G6oUe++` zo$l2O!llzsJJ8bCquf`W>AF*cTQgAZn0 z8nfboNpJ*Qw!yoPgn#_a$%-eHmY|Ixg81O{Cm7gvwB4EGh#t{nY7F`RS!aBuu9VZ) zz%htd#EB}TtrxnA_xM}pB0%?k-mz#DP#88cjqnx`H`d|4bsGe=0XP{Z=O(>hTgfl* z-a1|=w9xj`&RqS=@MS^cS~hlbb=@zfk&b^l8NLbni2W4hoQWg^${jQ>@UCAc)?_*mf=FUYNR6?8A z;9>-*8!%`68p9XBdUu|ExCqSPxyb3Ns&TQ-H{ZVE4ac`* zpG$pKnBQoKR)w05_73Fb0}+;nNBir2T6ottjly$xy5fQQDC61$j)wKlybA0AJaM?! zKRFZY@w!;8w^4fcH5_S6wwn1t=Ms{V9??-z$MD8XBc`-c!t!lDuI2p#cy{_`NrQmv z10Tq=9W_bVfNH)O4rF9|@@DOpVw`R*L--FFYu@J(2#y97YY23{cH9G^sQN>1}(E^N#OhhA9^)CN`{e*I}6cq6{TK z^b)gFV?p*3cD)d_8rflVx!bclO|Q@vb6cEj5HG^%p~K=sIP}cF&|vyAmg@ zG1!c0lb2zONi)SK;)6W_adYQGqwRy(7%WMRF6i)7Jo|s@Pr~xfZ*D+n8u5pXfQ(!W zYO_|zf8T>!*e;10PnaT0%QxR`nM+0;gTMQlAEspAWblT8{(@3Kwpq)^(XIRyuSO|v z6d>-?|Gzn{GqL>VtPTIe6vFcV`qkhfD!9S@L3+@Ik6Fe8`d5tdf2ah2*IKlc+XSXt z*LBIf?6wd<&+UG;erHQ6F!Y1G{`Rpr21;UNOlSbDR?E5?Ppjp-aJ7D!4@Ljn`WjRq ziY+6demc_L`FPij?F^m5*0eu;d!PAa5<-}?nU_W1eHXZjdiR1fLTj^BXK?^#t9rs- z7E92j`Eii$t#G`yOB=7SBTibf0B=k9n!el~8eH}d$#tSxVufB=7==!4ZuHGK-x>`T zou{@ppV~~lIEfl~{*-NGQ!JM5pDRADdTip#z5G!X<~ZdW8Gd;})j#pgR=T<5kJa@U zb(pG9tEgOjg!Sk=->55JZuU8__8VV;E%n=(P_^o!z_9B2g^@lWn3FoW0<7rafEg9| zBqZ;i)rKAGb}LP1&|r3@(8nllK#TNEyn-10B<1hxU6OITHO60;@VXMy`Z$tqI*9Rk zk{>BeN#0x!>3$qWh1a$|8vE1s#s<}1o}TAB=jTGdx1GUvW?fLnu_KxlR!!DyVv(=g zhc0SjX%ksg2K9GV6;J-afI)Iq$)0fSu462}6g$U`9&hYUOH6x&*2)L|t7xqGj&L^b z{+kMm^rJNL52=1Zj#tw*3Gu_6Toeug;C`$XT+3jbsu3*@#pnr7y5*Pj7!C>XGdBCy zd-m!UQtaLTbGbH_{ifs2C$#`rBt2KiMMQ&pG*nau;(|YO z(-6k;*zD3LKk|*b-iJnJO_s`7jCcaQC*iaCOg3_-sTCC=P|!*pm9kp8DXzm%VitzB zAD;-8A?JY}Pw$1EQ{;x0iC{FosW}A&lqLQ2h!ydkqF8edVFKufOSr2=Q?q z`-;&fKF)G{%7g^0Ga&vZ>f}x>KkHg$?zmTG4wV;H9VcT#TzlNtPS&_8@rC~rIcwqK3S3J8wiM6=n>cX>T zmB{v#JS|4Y;vb)rnz59>*4a(&*mm?nT2|x?FI%NZY;VwFWY|mPm}Za@0`kB7e0@=L zz!YQSgNbYi5aTG{=~~;O-Bxc{)Z^ph+uiRw7ci$5GrC_01nw2Ea}p>J1nC;RV&{Bw z{H*P~^$PevfZR_O0undeE_m3<3-d>gS<~sGk|w@(`R{>Cq+8j1lSyrj|1P^4>}3Um z`KG&Hw${kQWBo0V*UBnyuH1b>vzjVZzj6b z@(6XcZx%D*rlW(3AqQFGKJ^K~P78x!(2vnIU*)=q@oC_bzms3bbUqYV3GpPF;GXI}U zDgvc4n7_dhb#2ZvBHcl>)fMnC9Mcf<%7AoTrkZSm?jbpzLaso~0O!E|j% z4|viT2>x543+GmCdG=SXd8cpP@X+?R0qem{qvJvRnLv65$w+Zg5g~%)8WZDCpi+7= zmX%#9UFwKPp(_4zkpkgS3_g1(OZ#OnX;MHh^fZ{`-l0{YJ^caZcS}`j`l*%A3yBcp zEc^Mibg}y%irf-$!4N5#^zI(A&^1%SlpV3!D-*IRrFa4Cj%j6dj8Xm6()fUGI zArBh~hGM-CtLt$o+~8vRLJDra#CDh6!Gz@mJvuZ8OnClhV{5!|BB}P*k=%uGz=CA_ zdDfz*t_NxZ-xV`%p-_QVYS;I16XILMFKA@(Z}|}6MF|C5#;=duM7bI@4=2adTYZV5 z0e#~7%dg&%uE-bMGn|vOK)?fwl_A+$kr7#_QI3ntSv6fEfImJNlU~ry=r#UsdG`cGIyw=SewtHGo{u;c zU&94R06TL`GqEu9<~7=E9~F-ch2;D^FVdsCl!715|6%?bRmW^NiZ2lzIG=X=cKOP# zmrcN7y}6#>M|zH@lO`!50{X(v9&&t>vwwE>wheAW3O+wvu-sl>LxOg9cOQv_0|o5Q zS6f<^mX@TIL!?P3{L2HqeOJWUnE~ikC&>e+kphInZ+=;q6+UqvCC>h*X);ZHo*H2|x zbJ)#8jB3Hi&#D5Xon2>bPV3ey*)(x@vY9KHu7QAp9TI-rgaQv2e7ahj z=y+dyj>G$rTInbQ|E)Me`dQB@hR6N(aC+|c)_tqaVw4Xc=5fxmP*jW?cPb(xW6k7o z-b0m9s4bm%o*NvLPRhuzDKododuPQ`4e%4(kga*r{?Z_Yf>??+Y%93j?4S@ZUYoCh z9tS-2|Ce%jOWe%7c}B0!!Y5rWXZmCs(|Ub-+s~NLZ#6HMPK>NK{+3(u1NwFwe^30s z>bKkf9RW%+bhk=-cP`R21uv(ZRU&KdBJJ56oQ*#s#R>1=uhqEPGSvOOUJDL60jp@=_GS|gc`b)T9agIWz2KON3KBom z?33Y)!TwsDHJVI4zw!n|tG@<_Hwb{N?X<4bM$D+Ss&&$)q8tKP%oJ=725b>BY%x0Q z&kPj!Fns%_MGR|D2h8)s3Z2uvTLa=u1Tc+Z&0bJHUb>bK<>r*S^aUSoFajptl!9Q`7AcTpzT?&PQBg_C0n3N?;@X;NqOhN=ppYS zXv^DUm4k=3g~_PVdS78d9pi59#|ieU{z(E3zdzWKhi)uXgy10>3j2RNt?O+fh+1n8 z=FB*DAkf9bCZ*>VN4Ejoy*~)O`uBlW4uVR8SXgeyRS__A9_-TKIX!rqkKt_(|}P4i6U>mnTh768()@!jHmh_zIDv)gvdy;70Aq{+*u#wZgFD8w`(q~z4ܫ)!}g#5UrhvYO^VHb}RAw&MGDY z2Ra9FU`ZO3zjkbgRf!P_16P98uTPtZ-7$69&+)BFPY=g43{_o7d6K*|aGUg!Dq-{A zD~l`igZm;-lfm94Kya1&`c6qnZUPndiyyuPF6w!Q1C=HB6}x=lPdoe5*<4ZqKE7QB{CYlw;!}mWL$+!9Yrfp|wp~Zkmj}Cqd*>wNA?)+?`H;td+FM4hXii z3}Av>ZMQ3YMGj2roNMYB?}_} zwVvT~*<>7h!XiNcP#pJ3J(5(x8HEW2wJ96Cia+?wI!7xWXo#7nzl#U?rDcv(EuQq7 z4aA`9R%(tOau?qX4^Jb%+n(WKprR@r#xk0oQ#NVW7zgf%4^F-dT=YeDNk~cYy+7{6 z`#an{{Ua>kbLwm6zkjRo?Kk~fh+}%P&mzj>sm7$Ck&zq&;Im8J-%JX>fJY!x4)1)& z&F>w@E#_LzmH>* z7VpJH7qx$}Piu>bw%?TSyR~10M=XUW?c#?eHd7V&68)&e30rjbx)UGlk?Xt4qiWfs zIvmE+Y35S}RB5Z}vr$=b;j1~E4iuMp*JsZ+d6ZAmDBvl1ovkKLHK6$vT1KI5c9deW zS#0YW9_h5Wb-udJo|Yt==PSAah6+D9G%R6M4T=nz7=%yJcVJaS){F2 z1kc%Sbd&D5U)gy)?}}?UZ{_sL59@g0^slNK!6;7wHEpxnNb-4{buyYKJ-YCmRk^~D zh6TYmfZtn$S@Wi{%@h#BeseAK%Wh~Yv3${?vuXQADWlz#-COK4HhV%O%pM$6NEM!u z<11eT3@7rzM6JhB?&fegxa7N`0AU)1W5IFhw7X%qc`{=dG7w}oUT?~r!2Z1YXST^X zyuluTK>SlR8k-9bLX6+f3JwWg5zJU59LfQ+6!K~RuAPr-j}loO-u$-HYjS;X?C=pWifpUGexLiL}id3 z5z;|{feEXr6Zq|lt(_B`x?=*aP>ofXZvOyqX$ZeDXzb0>JU(HPNB+&tWAtPqgC6FE zU0zx7qXEfKVt}tpf%qRh>_{cWaE4-*ks;pk}M!hnYsigqSRhD)$Rw-Z|%lOq2 zM>8i+!b#FG5ueHzsR0(p%O{`#~`5CwTFg@Y`At(mgtrm2Y^rr26b1Cgqs~kgw_)vY^g)>{pstIMRu}6pfrW3U^HgE zVa??Iy-T2Mn~;BZLqX8yE1l)4YA%fXTN1Tg<)d`_IJbfubuO!cYE1a*^-I~_o{mpFhq~I|Vp09tcstU<vLbYat0c( z;KYOxz3D~|d>W!g!mWiC{uX&-`HH5L{O(NkYThBKZoTSgerD+YzBp;%S`yPIHLTff z3s=x_u7*I+ScQ0G{yrkEU}3uDX6&2$4LV4G4aRA+u3pQds9kTwc=s!%`l=LRWvG5I zP;j0*>I<(09^R9=@`Rl=t4sxJVQwY_csYAx*|6-D)f3tQ zufws#V%&%&*^Fz;PSR@`_L8xf^+zI4pZETi)qNNt7hf0lB-G=<_GWsk8w(M}>R>=- zU|Cuu`Y0IImORv`vluy&R_46PD6RVGiTkGwY*Ze$WKA}8q-w2>R8EU?rkf|#h!74t z;>XA)33SFq`p{Wl`h~+Dm?g@ySfd}Tdjca_ZJWdjF8vibBLnC57<)SJJAA!Kth|CL z<%r&0_ztyIQOG_a_{Yp~Jq=vZOW9n*sCstgZ zhLK7Fo&~hm=zcEC-l5j{b>!mU$nOmYgrR-wG+QX&8MjTnzM*MYNl|0?*i+KN~M9e-E zlb6PG1ApJ}#a7lpMrcQz6h!p1^4&ZaYvp2J9|N6ArSlR7rd2>{>)qV!Sb18rY{Iv) z^BpGbsvqXN<2g+rhmH}@18nnpogWBYU0v1gO&60mo{ye~GdG~yV?fh8)Acs){xO@B zw_T6dTbdigsQ%n zKO)E?-zKn$i2O9{tz_0YU`BXcPx>>|W94&oLCsQobUT~U5?5u*HQH#Ulq+p?fjVExjTPWwA_S-+tXB7c(fbR$q;TSh&NP$ zcLrmN$(Q4K&y0Yv|E{Qo9p;x>{Kz>6pVXi1NtV2{yg>u6*HK5jLBd8?ws4C(9$bm@ zWT}~iZHeIX@IA`5QaGLu^XgUvJxI*_{k%LGYT>kp`*r+cHf5io*VT2GuJf4Lxu#Js zJRLc&U3s)!eVzSB7k{mLakEmlzT7i;KXq!y^0w7vb7+81#jJeX@-cN(rEvOLXVubO z$ofbjfg{~39J~3No_TRek$ig0g;tX(9rMUjCI!p1>0EKF;A+j7<6~dr*V=PmrQGc| z1S+6huYRtw`r?2yh^%?+Ls5~e?gQ0xiIlVNl8Avp@GKo!XGTmZomFpVYSH1NTF%zu z=kuTbLi}&;z}%+kwqy2rNzuFF9(dMFC5T&^1x#(u;{^5m-L1omy9lCm?k&_V#ezS< zUk{i@D(>x z0xR87+c%vv)DkS;(}y`s71w5)rMT@Z6~7?w6+RVoIxrj|nPJ^dj*QGLKwHC_p)boA zbCi3P22s49DwucL`G`fjcR6jmpr>a@D*N=Nw*L-paP|%J{9w#f(xQxUUr-5qEfgRtx9try_P1^z9-Cn2i6Uk z+=3=m{oEy|g*wa0=dS`)N^UMAtXiJU z_q}^J$#>ebGT9c;e0`#;tJA723hNt2<>Yi1tL|li9?7)Djn{2oaY7}00mVyx141LS zKrvHjq6eAX3qqEeigz>eb#wC~4#w>J0}9nf&30y4OC)1iUaeLHSIQ4)WMa3{;rPs^ zAOU`+Kou20)K{dK7TJ-Jk*V#5io}|!62&h?EFN(ZlU;sLuKcmhF}jC7YKfs{Kv;iK z3TK)9o-x;jvc!Mr*G;r9-)-|~eRVQcxm;hYcpKqZLpcFUDz7Yu%DQmruqm8~uV{I6 zN(%C~IJF;)kNgcB)+071)(Y z?nCyP0#R%trU83FxW(|-S;w=jp|4|EQZ@k}K1cw^(>D*KaD1eG5_^6$W%8~U;;=c+ zoeED*{QQ~CJZ`tDJliy(fcRyi)4_ho*{2AT<-G&9L9GreM(SW3O96;=ZHpvs7%EZ= zTLwXfnuye_^*YuP@WQZ=fi}aMHu*thumEtM=(ipTGCRF1gG(QPiyjckWY1JI>guJ? z)S(P4Ge`5EHVn=^*j3D@?>b=3TR-&wWq7->OFsr5+b2UPmut<6irMKe>Ch9>yq}?I z7N~6#+&(B~+=-Ch>#y1s&>RS1VLzvLkiGP788+oOELsaC|Klx?!R0hc`aTW7GNTPcE0J|S%foJf)E&y*48h+h%69%nUD%Rc;Xsa0NL zqt?~EUlp)lh|tx$T-lLtlDrIDH*#>mip3y6%33n?*@K6J6U#n|^kwma*09RUzOOXz zMdB-%3ft@@F8eGuJ~#%Z^Z4B%pKH%uko7M9*_U+L<3dUG3|afVN;WaYG-0|{Rgc#A zdne>L4ml<$jOVf<+mG#|Jc z;BPjak7`&f#ut)zLTT5rwe9Fn`!H6Vi0T^oq;LiH+4rGs!P z@?@t6qdMtKJ5@U)+p4=1{FC(RxX#b%gEwuBEI>W4YT9G71>Q(JWJ$CV^wuIeMtH*rC;K`BUV+oZhvCfT!9>EKpo}FdR?62HI-DG(`JT5V}v5$$1tuuOIoTV#8W+UJQnA;zUNV-fBgr- z4A;MEnO8 z>vJT-&1_y;s(N>9d_?usFEt>F`}-fCVtsk*!J1w z1k%NRP=uJ>?sqdxgolh*j(C+jM0{v4wlV`NYaQn(;@$@)Seo2HNdxn=b$yCk>aFcV ziy$T+8dmF9`5;M$;5ThSifuufZ9cRVjhNEk8)+1&G1K5x3FUK5rlmyxx*Y;Wai7MB2miE6%;`$%m`L^Yt5|%rd;_1U7UkrTxK6?{<8q z2lKC~55%hDYz5V9R7AQ1*~}>f+LR|-VMEGWNh#3 zTu<>h+d`C06S$HtS0IlLi59;8Xi|>-Rj3)m-c{W3U?F{HK8s70m@Lc;k||qh`5pTG zGoJpST=Pt>$%X$%934T(R$7=3+9rENw#U}&t=EB+y3Qi6w% z$5gYB&JB%l(D8>Ul4%MbtC2A5+i)mJ{lkSEd-=sLCUQ1w;?j%b=sIE6q-!pi4cadv z3cyNfxKQUrX1`Ep1eak%2=#PrI@2Hph>kXUxnBX0ol4PZeC?&nwPEWED%BRdPGYI) za+Q{;=67CI4toI+!-sH&+R6Q|L}nZZ^y9R=_qGk9Az{j@nQeZLGmVX}UkuEiTT3o% z3gOMZCr?D+XQ!w!CO_!%{uz47mLx5gMjF~Tm>^k&ZvMT>T(>DM1k$aC^yfH%jt5m93Ve(7Dy13;nJ)}3>m=aXROv@*zC z^wSr|qQ(a?)-Qae9gWTHjZRtM>$R+(0uQu9f;^<`Jm?6`p@<@ki|N2iq!ARLE= zD^1kT=CQpK6(N$PGEszs2Okm?BTVg^k;bUywvO46D7IVUrR0PG0$H!EW`;@)Ro*>C zrm9qSmkkMtrE3IXmP_MkeKmn;(^t(pU*nqceB)}KNz!y&+(Ch(7j!6IScFkvl~}(i z%{v(XaVqQ=FFnk(s&KSqfnrd|Z9G)rz;4xJT(!?013e6<$H949xbg*#eK-;=$=RCi zTGQl6)EFcBvCi=oAA>ZL>r3YMt;|n!E8G1WVGa8&4-tjaNlMSSpBa=$Wgf5wsL{`4 ziP*!^d!Gq0U_hior9D?3G>o`&oX(8Rk_Hv-U0sz9UR$S&nJ?6fo-WEMJ*U-D!tYxX z`?1}Yd*F_ylT4z8_ZN)_i6mN_SW=HT2=qR#%b_tQUGQ0XHfgl?In>eBNy0Oeyb!CG zYOCF(Y%baEJlWvk_4TEgyf?e_j3XN^Rct@&kjjiw!M~^aGF2b=~hb=pM!u5y@f|@8{ZNgNicTBV`j( zpqH5v?>(TSZ&RMp+O9)+NAzKz`NFTdNgw6E-do9CpGDC)t`2rULtCGmdYz^z=D23g zg2Lb_} zVu_xQyccqBVgRT`_%Yl9Ggf%ymajZF2>a$@&(V9e6s$A5es+n)dmR zkL{sjb>}7V!Xa=?Sy}lMBpM(ju;|Iu>9U}S)LBn4%87|}kbTA+dhN=clIFm5w=mr^ zJ`4^Kb8RXg&gI^Ey#{fP57DKppPadv!?>6X%vN4$KD-?~^ekC;Y+k$y=ax|Te2vMsP}DFsd8K#^3BzatJRZ* z1+C{BFp(U|w^?JFfOm2MaGLUJX=y18RvLsKZFPoV8t;s{t2)&l2@$Q8Oj##IL1g@M zHR9k2*w>r zGuvL7z0U(k5MLH;r*(2KHr?%-)=R=##wM5a9dLMGzsGikQ3l+ zN10rG*riiDy=Ai*eXStLhQJ2^oNWa@7`kIr=NAX#7CKz((-jVwmz`gK0?KlEMsb0ckb7R&wfE< zO3y{l#315qO>9~py5h*=_{ZMVmBtFK{A8T)&FJyH-usaIAN~?Q0`!wYCcGfV(ZZ+U z)x=YjHhaAH@gLfr(yQ`eQKka|sQH=I#d4K2E1%ZnO6(OjdKRS*MqfT8R|6v|NHE~w zIPWLM`%+9m@strFrpfCZAx+eOi?=qN^_3$|t&Qb68_HGIUqBY|9!f*w^$`>PiZh>~ zgnO5BQ}8rtPSq++{ATr?36(<0Assi35A`2wW22!hv$+qKi199Db4;30^MiEl>R=AP z3{|qO?OM2hq<5j%*XiS*)#6p&I65|l11KgPot*pu zM?$q^_{jGB>HCqRy{anC?A+WAFzExi+7028tM?|9qM9HVLQjot^?q!l}nI_ZJ(hpZ86Us!^geXGxFz9BwI6#^E;SN9eT_U9| zoA{5>m6aXk3=Iv{gj&2kV!?$Pb*kI`EH!~# z>P&%e@k{xFlIS~uf^?;nYkL^k`L@5l4>nN|Sh*2X=c$@!DkPo<+9Tt0`xE^<0WqBNv^#VzVmL3+g@SmpUrGrZ*C9eGmWFmv%fQP8p=&}iiP8fWADL{@Qv;QKj+c>_l5pWVQXU#@r`pkdR+c!i{ zQ`LTX*5OdOVmi>9mZ}ruWHvQ?eMlFw+)BXD^y)fV$)WaX?eT^g8Y5a!msJWIX-lvYnH%QVqejO1Gru!9;s}0`Dn%oUNuOPndjzF+f-d= zm=`y&Yjj4-zU*+N(XhPDpBZJqh^ti7tlW6P!}})o)1_hxw!1@?blzpZbsVCIvMJH@ z{auSZjm?%IX-iI9FTRo=XLJ3t>AAl2(6E_%@lq z9_J>9q2c7dVvNgtQJ>d$MbpJv>!gU!2Up#nZ|xjeY4)Yp8e}~o@H9um3j`Q zNv4F)5g5f4=7Fj2!1Pw+%^$QSs{j*WI_S z@%fN4GDhbbtC-P?E#TaJb|)w?;K6xfWCbl(s5|uRjA$5chwVOtNw#>&smywQb2;kB z*RNCKXXX+voM~fa*@+Ol^KVfM4(Wv$daF{nM4kP~4R3 z=yh5^@A^Wf+{StQdR+C@NlLMxq}igNdk7{OF{jlyb$b(0+;AFt^v7k$c%tpolO!z4 zM^TuVL}0Hc{k2r?ItLhfe*&_*eWKucjd*h_s`!WbpfiGP_oF!sotj@q#5d1MY>bWJ zz4tgpny>Fi+2rfqUoomy+%6YES|i)vv}L8G`zSIqGn+xtXU}5{j4411sSh!Ry)Kw& zIyvJe&g1stUJgH_l>>&?^75D^q(4nr`aJ7m2h3Uv+wUc$=g3;~@agdJ@d526 z{3g=C&`>c))}IJ-CH?b1LBjXrP90y|*)nugbX!tU#I>4pPct|AxP5D`IIH|uvoa%} zYRAd#aWkC0pid2mFE)h)|5EMtk_&oH=7U3%voONd1k+!MyBIO({?ytTW+?Gzu5eRUpW6vptZ20NwrRxx%AcE zaj3bx`kunJJo(SrhJBHUums{K1-TJ+vKDMnp| zOwCj2xCFh}w1lwFfj6zYVH6g5G|te#uxyHMtCf^4f1`yqo@8PFyQN;arrpU<6Dp3E z(7CFOtC-kFdCSg$>P`9!#v=U@9urZw#mrw(Y2MC5$?@J;QjeYAx+q#kDq2UZu%X{J z<&4sYJ6*L!L$m<})KA}Vs^>DeVriQIfjuOj` zk_@sXGp#t*JGwXrLe1DbJabg6+$7vAq~hL#oBQbP5WJme2ck_>tjGc3%I0BTpAzA- zn$@-8O%=&F(TBKr+I>VhEv1vN5p!?e(;2&Y!GOJas!GN1L3pyyd@4yeCYc&|&$rgj zb;ITB;U91qxwOr*3*qkpAxdk77FSo4DY+H zO=Uy9vT%wUFtumi{dn|MxG8C&#oIQl272bJB6pD^OB;?Db3CCST>Z1c?Cl+3Nu@s2 zWFyW@dKz++35#OT3gzXsP9_2#Rs|WLfL#v>#s7PNNz#MJ%@JIUQff4b*4R z`5M);x?g{$tKrqCbmXGj&MIq%;@#=PP2=zE)xPMnM8_h0Av*JGJ-W|}!$+z;y7Wz~ z73VegXC5ZMPonPCT^ONC;MIm+m?M0z;s0S+)??aS7ezE~f8*{z=5>6WNh6Mg;imO4 z04M+)Y$uxTmGdb@>qgZ>hx|GG56z#0z_ajvRy+5NAP{ zMRPyIT+WLbkf~Ept7~_7~yt<{HhR?!v+g+um^0Q@fUAPo|Zg zbV!qHhSH||sT?Uuzw=u<)b2PQ*V&~PK3^Dp(#y82sV*s+pa~-LgdlC3K(XQw-F$I* zU!0?!u9edhlQ-Tj+_R=^f$w+*;q3HpH z?D~PKajs}**mwJ>l!_La;unIVJku5os+w2z`9v>baDygal z9v?eSgyPbX19=JvZ6l=`<%(I-o##Nw^s?5!_<9l(+8Z6Y?vbTW8#Ni_*}9D#+EDL` zjjlp`+}hM(&$Z{$kOFRh|CRThwil==@xD2%eI6v%4v4&)OMn}#k*T;Kf_KHq`o!*& zh0)G#KuTj=K+3YSOYzivd$F6imZ*9~(=&e3wyO%USgvoc!|^c)gC8S~$}+}Z&(6)E zKBk2H(L1{;m`EnFrQ>k1$OXPDvCmcw%>NOBBXcLP(e(GH`kCtH(MS$E9r4MBbNnq@ znova!IAYS;_J~--9bJ76)8JWN6o^*BJK}`y+3(!SJf9Xexsc zq4bfNDZuUCF%~42shBsTfhSULtG;Q7HtGu90Pnh&oY&1oIx$ULSEAY`D~&(kuu@yT z5nIpEW;9Xb6}8#Ev0|q;VZ00;R)$25G6rp+DI5B_in6kEuPMi3VL7ECdx6i*tJat3 zomA#-vlv3|wJdZjxTQSI(u#s!-uH)l2^e?8)lBL8WmbCpvdQ&LW{cPN%n!*AWpfZG zobmW)@AsDb6)(mh{p-1@Li@#q!R)$-UUz(LmoV{C&#x-vy(J5$6N5y&T75d4h>tJe zL{wrNg;`LSpKh5C)AuV}@0wi%X%`PKRof(*00jkJKygk_Pu~W}`!y5HDy@suzIsdR z4e~sk4>Xv;=j#bq&K}62w5^{wqeH~qL^M*@G&0JrYRfM*kzje=M`8(PNoF=Rd8e=4 z@bJYscRxQ#Fe^^mS4<$EI(F4tMyEteuC>0X?lYZ?*Q4Nr@rfyRt+FN77ws0U;gRPO zBAo}Ww#yG9ARsY%u;)w5s|N-12n(slEmsd)b+(j+Z_9IicE|WPmjF_2wkg-#i|rhvVvbUCH`bTerE%K&3;{R-T z0+Z}y8@vIIXAQt`(@NddbvlEIHrX?|U_RYt!Fr-!P`; zPZYRYp03rlZr$xd&z_=++uGS(1qB6h!~J-W?`;OVTMH>>9{E58IgC`1k1;!@cik-h zb=4a=E`Fb~Nk~g^s<%m4HeF}?^yt8)o z?buekGr>!LkfNZP@hpDwUbls$AN5_O`8!elQ@e+URZnI8(-md80%@-Ntux1+`|RY0 zw{o!>CKR!dhDl*Ki^i!(gD}IUY|#p0TiA!3r>H@vNQS#C8Mmxsn_Xs2eIqLO?^Kg< zhg4T(Y@R&vCbIBKv;OCHv{T?-yhD3c521RWaMN{!9g zPu50#L^BoX|K8d>gI61T2UC&06q0Q$!Uf3sk~M44SMopNb7}tb`Fj@geF{kr z>cZRjvkzm$Y=$uLA^iV5_VWYYgCuK*hc5!OYn1!XTeWiPJmel`Zj$};DvJ6TtgyRu z?RzNYL&(1mUmou2Pq32s-@BwR|I>=6{lY|imAwCJur$}h;pdq#c*er4*Z;humkxV((SVI;{SOSS?{B5T+12C|1|w+|2~(F z3o7|PZ~hsYk;qvL?~NRK9F_jtgi~U<=`Pd<&$X_{Vi!37>qc!> zav;S|4pqJ+1TmLgZ;`l8~_V3;sZCAwJ?E?`)JPKU@d&9T!2g*vaaGj+#<2q}N2&NU zo$~*#Lgd$3oCRw4am4@H(&w2sL9SJVFdnD1M+`bguMFG#23!pO>E5e{jpe=9X%bZ+ zdAJSsF(c%kR`ox8fU*cy1-7Xh$2w*InI}+t>sa`4+Pm0)r_uxNeY<`aT2AOO-GDE= z84ZOc*?%4gDbjz|$nvgQMN|1TO8?&%EmTr6yOeXO{cnpzE&pfqQyzQ;e;)9MzP(IQ z`Okv#pLu@PYFd$|l^ehM&u}U(VY^KJ*WL=1gw~FC&8(~bJF&86J>lkD-~8uAp`cT1 z*`foi|LYOT&hCuUScGkxXSW<#Si}GShY06srJj4-o?WKnG3AIG{BLN$5|bX}_TQnu z#fV5CiSE78X2N#>Kt=2E`=)dl&(v?U9OYe31%;6ipxTfGM7Z(*Sx!2{h5Zc;c5gG6 z27{%CcCYaO1qW0^I=>NET}#-pm;-v_!|nv^UmH_piLIpr6i~YaPtD3O^SBMp%juEp%;7el#-f}mX;Q^4GDt1Rq{YNNxIO})x`%%n{N{1 z;=}<%%o|XQrN!$`JKvimMO?>g1se5af3l=GFQ3_h)-QP4QYa`+lc|N*{YZCes!&4> z?7rOwqpM++?KN*vx+|?r>Wd5!gs!ghARjOW_>`U>^IDM zN&-6bu!j4Vd+tbTA1-iq9u!!VE*ktc_MRgdoL!{ydwy49z%*LO*^qOyROgu*jL+`?JtsdwPB@q!yP56qFK@$+K$2vPrU7 zaGd$Sl9EiP71^q#pu5(@x>mH)>AhevgOroD8UfRn8jz71QC3xz0LnjY@?Y3Qk)OE% z_RIjmDFCt|3Tme@qKyLI|IQo;;vRxH^y!Bt z7$GgPFNC~++|F6WwLv9MzP2ZdjD*YW;OBSwRKC|R9ulD1^k+)L;58hf){wvB-e_h3 z6E}C_<;_i8gX{jMg#}$P6w2CVJ82e9q`o@mj6ueyT5Uc=96x5MYByW)+RVX$LdSpB z(<-Zb{Y1UDt1G6fOF|hx=ez7g``B1{Xpp^b@&`3nMK5i-sC3Y^3kO8Kf1P}UeWko}U3BF)DRmH4Ha zx4XC3a15k&wm^HFH~aCN_a+%CeD6G`7Z-hA%dv`p3H)w#byW#yMk#SSEJbi6$tp=^ zvG-eYN~ZESJqNuat^|moBLN<%gcLw2Q#vCxRci1cD;KRqLdk)y5sg!^X7c>O2sKvj zm((d8btO=#ib}cy{P*CzkN!?jKLkwZI6yFIPhv zfSTctzn1~XY2+cWbVXdWJ?k3#h}#7tu9N;^>~ z1G`w$WPmA1&s~xc33^sZK97wkT3g|(wVhSYpR!g13x$R>HS}p7mYh-b;uC|;3_Bo) zPy%;0s0P_ocz%fLX>1s9E{QTZ;uceDbTP%tFOl~eIRj|THW#RZIM2A&Ka7s>ej#zc_!+yx+jCUGp?0^Lu4?`V)?U5- z-Kbu+#|Y$K=v}fuT7cWAUaZYMF)@)21Ob($0Ta|4pgCFZ`G@i3^t3@SH5c%w2Y{mC z3a3pOjv}pRyK9zG4Sch)>NU?@O)}KvBBz10<2RTD+($-6#<2fypzX z4rHMtiK_-6VOZN%@r8|+7o&6^2907CZ9>U{IW2{oBe93leZ7Kzxs0;oFoepL-(^Hb z%02QUGRqYx0@78)Vko=wwWUZRnzJ|Q@kvE3>Lql&Kow1oybu031n?8_@$h_kgp7AIHa&Nt2Kf!Jc7oyPu}!S^w;9{?4X2E3J>g_rm1Go=QsKdWst zSY*!1FJW_Vn#}m&P;F*aV;KvK4sf0rM@nW9zq0*;>gRx$tcL&({{+~I7|2MIc5-6Z znl8to)M=#**Pb#1>+bh-c9Y<_+1aZ{uwS6qJLxfHHmIcVzzgN&<2#po^X5z5#O_v~ zX@v(sm(Re7l%rIkQqt)3S8gCF(Utm-`RcF1B|D3r&d~J1N#~Y}<&!*}>)jmpeXrX~ z4k;jS!7Noeg9~GA0@9D6;o)yRU5SCV*gGK-9BYp}d*)Ad)-3F)^K!CzHF3SdvUC9g zdU%JAzG_XEL<2ji2LeSxCRH*rGK`$ss6o&B4cR0>&OxfjRAoyl2C)m?I|r!{S6W0B z&zKen^LA1rh6L^zeA^E3Jq2>xxU={lFz2zwP)>jZ-ue_$7SAIjB-&^S;U$naw0;Zd z;Q9f+@){Hn%l=)LF-dtu{tCPOwOBATyUVSu=pq_(_{#L3TVLY6kA(!jo??)Iv&Y#a z5+4k^+Ip(M5Y$BsC~2d8c)Yd-Es`5A{paf$%Mx=qp`CWq`;(59l@(H$F)R(w2Zu7d zGCUj&sM@ZstiS-42ll}LZ1|UOvX4edB1f&ON6Q~+<12nwJ^uYWaLm$HvG1B2`qg|v z{0I>d&l_wPv-Cspv#&t9(>v()L@GumhcPNLatf&R6|urb0t2DI3!p3+4zL_mrwOZR zkO!!8@oU+E&GWaVgoK14AnyVCxYV$Wnf=giV|KTl(RPp(QSeHy!KMB$>j?`Ch&2kA zyooXTBI&v}>91e&qM8 zdpL~2?iDg!jHNLQP%hWT`i^dvNOxgtettF{RE^uiuV|#|zj=ca78a(cs`?1zP4MvY zw)gct1|YR_Jt=AsJdi-LTx#M4`|63d{1GIK@rI+5V{;+P7A0GG(!HX1Vh(>;?e;B} zP?|*7TQ4jdCgkSkhPi!qB@SbPFDnc#Jh{8QIk& zJp*SrAaoWR9zO6GGo+G8L>T7N+|=Z$p2ct46G7Afh>&`EySp*!!H!nAJCQd4O^lCY zQ&3<5=|{j912|1Gv$G!o{VXRCU!#ytaRSF>_g7jY9ZhCO1Xg>9`Vhtu?m;W_$M91nTRQD(>rDWlPl?h$^;PbZ!G<|H zJAViWKmb9z)s2lu31*q&&`w4TOePf$^i6+-S^N@8wf5Zx^de&(=sBSQ5!aOTxVSR} zKXW4^qkx$rt$=U>*1c;)P8Y3(`tA-|-so+_V|KWF9L#!On+51Zw%Pr>-uuw-Q1aHF&AnY*IAaGk-^j>_0r}!fphawDvg(Lr(Qy<|7F9eKVLt=kXup7`>+|{GXMsI) z9zPN9A6fJ#23wXd;`^u22v}4>BCM&o`5JKBfCjNR5V!J5&J9?s* zy$Knxzqqp^5YuF+i9WEQwh9e)Uk8NPjgL=|0fjC8rI{ISR6j_~Gw?IH7-q;>(__RC zPz?SfUM7bK*aHzMCS4--H(zFjC+39hoA9rU9WT}753lSkEqBr)A|ix9RQ(Y2S*0TN zlWy?M+z4bC-Tb`(B8^_Ki2S~bn=9x_E|uGX9K2mH2vKw{FB`ms?r*1HTkw}%BO|}& z08f+f;K&G2=^nIg0qc%*p+>1a$m(G(kZe%-wbbl%{o4xm11?5YRn-)%kdlUm&w%_c z0#MBcf0AT_`CRw>%x2H481leD??Izet$gfBsDwOFocnIj+Jf5;N!rx^JT`}fd;_~) z?V*3!K|?uQP+c?bOwl`MZ33T05f>AC7B6F?cDjiJBzjREKlabcq5_mz*iW9oXN{rM zD?hGA9Q~pRHle2k8=@v~gKjKuO)_BA=fEmFCJQxKeH+~l%Phy9!+4Zpb7g67-U0INV6Yjj0;#!iDyb-R zgDOj<36Pz#dZJ>nw3L)dcrSjbHnvuY12xP+Z&N1Uxk|cdC$s@N$-O8`9U*sbZXDKz z%9ywbxvp^Qq3tLY#&|EFJnQBLq+bgFJH^l0+05_XQI>&nA0r>%bw;}(kA7-N5Dl}> z-ZgwEyTa1TibtSs3jND113Wx}5gXxXk=9Fdpy8&Bj2yyR$R+rdK%V<$CtH1B3=_~d zk7vLSp8%N}+8}qGmXi9H>m^f1I{{hp6`UCRc$n&Jtr~sFP5>~t^=Yty&o#IfT7eMH zH8>2NRBIRC0O0%*%%>@b#fGUWu&l%u7axu$YT?B71%ksK1-Y;<(`&2xScUD8bc%$S zm}lCJZp>iQ@zFCA7Nwn`;i-J!4>MwLYjpYdWxt-%NGxFHbXSL>{d$)6wOPfJV=} zgFsjExE&Azh22Q{A;d-{{~`efhTTLEfvj40Vs1UYqnu;E&?7F=%u zk8dWiNLbgLr+aN|Z2?8MRlST))v6U5e>y6l?-DMU>F$W=Sas4WF1PMp4cx1|=o)*B zz_PuKB?NYzi<&m;<41g{>m}+K-FlxyhOr&r;^(M!!y_ZnkcO_VH))$V zPyx7U@wxe1R@L%Xt2YbAsoCOvGK303W(9QQdldPpRtZu%cGwPaH|h z3Qo^#FJ26wx1qycBb|Nf*1@zRn;TY0HsM(Pai}R5+pe2-Yd_rIubi8cGiz0?twyu_ zr#Bdbq$-g`ui~wY%!h7cQSc}n3X14YA?z_oHBeyHKCDY}QPSnoBl|o0mef0f0X6GC z0$F44v!9C!r5m98VT&=rG8E~Lz&H(qz{>mM6@OK`_NvuNjUviG%||&vD;Em`HmF()WRS1boj4wQW~;p)=?dS0j7|t+WrbL6 zXDbi^Uc=$@drayv_`y0gJ^jIpW}Y>%&(s3oNkaB>Rr$)r>RDjP0c=-}ZceLT+ILsB zb}nyDbaOttZz(Jc4(4+tPeqN8y{vj0&XPWuWEXBD)h7D|xx$rFh>U+hKJTHq@Y;Uw zMhUfBK1j?dBbe^(GA0?{fmRdrzWj3EEWBKx41e(TYx+?g#qZqWN~hRZKDjb-9N7wvoZ~u_xt;`$FJMVMPOnHMVLkt*17Zx6#EkHSpu`O$gt!>uj+Uz>ZkHfWE9kQL{{FwndJ7|>N# zR_0{3%x@1|q5_~zpI@hY^!Rgv8$I`D6C_NC^!xb!p8`KWKjY7|M;blHV2_XgD&&)_ z$&^4~{S@!%Q&76=I9_fdMdWt@N~npP?ymoQ1P2eYBKsgcJw1!%W-o3IE-tRUjlMV~ zK*r%U34Zv6h>UE5`{apc<*e+{QoT4lF_$vJcaWlx z+fUrp1fdU?cH??o%_kfdfZObB_Q#Jm-&7g3 z&$F?pFzQ5d-WjFj@H)4ho|;k%Wpu6rg1;jmABYuIZLPrz|pCQB)Qs8 zXq~w*>`%x+cFlwM3waxMukW#tx?JKMeQj8Ml%v+ofDA0kJ+Uhx(h7Y6dC(8IGCQEJ ztPsul2qy37==c}v1p8V+?u+L@`IUm-&9CXjS7DLH+cmRsUX*guwg-aE$oo(UI?$k^~`!>Rnpr8>1G!hSWdOK|?{A08S~(`)tB zn*yT>#TORZ_$n&KSYMrPGJ-t1WFemhRMzR60u&s-Xggb5Ot5qEm>*@3=bBCQ#IXr; z*Mggc+6}Q%l*w2ofa6t|;P*tv7yYM1JN=iyvL{LIHq(uouO1isKLO|j{ z5D^d%5RgzxxG-Gnn9Wqp zh2OFnvMU`cXYOrSP3E~(X%vl&j8~I3<*Mu2mX)d7N=xgKKEJz>O;%8I$KRhpYxON>TYUEosjQ}$@}z4za6UMyqG75Ilsc-FbqRJhE{190}DU9P;k|; z@N+{GD^B6G{tiLi6aUpBZ+@TYdLK((US6cUv{cWSF)I(W-`Qbd-JT*MHR?dWgZv=2 zFgrUXS={Hz#da6xZg--fH8pkOY5U5J)^rDTJMBl*2lgraA{qlIt6$|2%L9%r%QZW1 zkbaEHchp7C#f{C)%a)+&YzL4}SU@0F+~=6D4m|YL1<~o%EQ#zJ9jQGHijB|8bbJi& z#Z4C#7S?ah&ABvqB?d?SS4^OGu)!_nwST((w?AF}a^DDi_unaH-ngTH2>EAH>}4c( z(@GNlQ6Z#WaCQ1#6gE<*jNJKqc<6Dwz0g(K+M`JK-Sp>X%YzH?*snZgpE0D(S_>Q{ zc<=PmeL<4=r6d|derp%$ktz%ZUT0DKnPy%6Z>-qVlTU#HF8rIJnaffr3I5ijCr$%C zoYEs{aPFV*DNGaM;nfhKus<1- zH!FVdr}ZM=oH~Z;_31PC1`9NW!Ofu8uZ@6xh!%1E%hd*D104#`eVeGLsCj7pu&-Tf zgO0Pl70(cfy-*?r;Jn!!%DaIuYC$R}@doK6pTYW@fCGgi?G9@za4rq-ZXV^R(V>5( z?#_=Fz#_nTII0mYq|~guIY$irtfK;OCN=gG0(E-#B+ME04M0%~-Ibl49n4h|_ts=5 zkA}liId51_Nl6g?CbfX=u5#&YjuzcwSu4zu*XBc5xaN|9`(V_U-O zA3Dtp*&%{zJcNv`5*VRYc!f^$--*lASZN7nRuCzPGJKhIVmkq9)W59``T(ZKnQE-& z*D;%JV*4u*VLpsIqLlHx62fNooh_EX(~^rS;&;7|mo{YecEWu4v@c%}%;n|f(pQ;C zh$fYR(Cu7>BKqm}7kVtV1fAj7(kXAu)_6=94O$1#{d_PVd_{dYIy}Vp-k!(l1r{zo zD#|&Q0oxLFLj7lc%OeBz1iC~l)Xu*@^KRNTFYJv04{UC34nbSPM5UIkQzFEnM)cSZ zIr+cS%2Yqd%Tr$C%0>eGFn5BK`V^n(C{}sOgN%%#qtMz*y7~8c`TL3ZS1vZ>w3%khVRr669F-tv!h)Hzl0IKu<&XgefX?&kz_N?*0A!X=s@Xiobo+nQ1b2)Eysr93#{d6uxSz zq=ZzMHdMn@Gcj7|7=AF`x)mmIamrigyzs;nYTm$0uc#FE!Y+RW|v4_?iVNaR}BG@CLd^zrPulUzmhKKR<4FW&=&-{t^ zyOS&wOQcsFS!$p9x3;%i7$yqXhga9s(39Z?8vY3!^p@v*ec4>hGe%|)CVM<@LnUpU zv{oTHLE1}i+pO7`CG_CGd*T~Y&{_5VV@x=pUw^#;ho#}f*w}o-Znv{wAX35>z-`YE z_dH!Nk)7&$hVOd2(Nmv?SB+E?IjH7bi%Uu-EKE&RjVvt>-0-AF9EC)-W`w?nJWs2* zl1j;BLbLkA(OXp(Z=8;ZoP1wEVbD?J{{6tA>*wdNC!6>bu8zw1ZT19t_>s*y(aTE- zG=@B{6rumqzH+}Wa*fVrvv-@!L`=jxj8y5fh*Xd0@s;?icq+-fji_hFX*eCtZS@b{O*mH5eXR-34 zL2#t5pDR)Q@@f9}uyQ%?_2)}QhdT|qT+>`F?<8LP#UX~*^v1tNkPrL#6dM##V4$Q` zo=tw@4_7GWeZ_DVx+{|6=lOER1S5%J?`7Sdd=D=CVN1gNTK&2A+4ixB?VDPiH&~QE zH&*csa`K{cECU-IO-#>{A70 z3LS|m#%GnB#VI_uApKBZl&$hhpzYT{@$$-FN;8l90yi3KPn(-Vk&^l$vPLRY?4Gzh z=D*KXnhEeI96$CwX$%z&@-hf15DUZQs59WKN4z;mZ5XT;Ulw;%PBzGY$k$Z=YTl`G zj{oWR_~!u~a#B(vlq6B>0Sfs|HB)-|Q{pxo zSqR&{&iaUEm*B{^V>enp)4IyD%1L>AnOi4Ellrf62lzsAG&l9GBolxPsK z&fvIC*}CW~qOGlaz&lVH(Qn0s|MJY#(|mzH-QYsGNM&qFVlTcp2YFdP9{U*OMuSa^ z9f)z`sf8no>#wUI>F}^-J4SzI>EzJPPW8gYXv*MnTl~_fQ~?G$voG_8(0ZdWs!xty zSS{<*3K|N%cV>d-u_QN2`F`M^tm3@X5j63p**}XymO*sI`rHWmRn$G2lg#ynkDD^6 z#uOa9UV=}Rhj&qSzmV&uCxe#JiSvB+b{gMU2Tkhuwx!rK(QZGMm%oM9*xA|nrFa?r zE$%C6rhxw5!7erw>eJSmw*P~oh7Ihs)98}{l7w@6Ck=mwpR@z8lspEVjx#ES&uTjD zOl9v3H4eL`Aid!qCG5X^J$LV~X_*|@_-uF4@~XfLBnpx7@rd;^c=U~&)+jS2c2-P( z%L(y|-_GCP-~0gP7Hoe>6&01<%1Vf+jO93?FjHc+;mbb0UEn!2Uj4#q0@s#Yi5#sl zH(sP>N`a%?bAL^{PnOmL@Bb9{y_H$!^&M8H|W6e!`m$<3C-gD_>jY}tez^9f;m>;FdgKB)nlt4tgH%G>D@m_a1Lnm4&kt%U1t^UPNrRqN?>w!K` z1qB5~U+!j`o0jklH~;;6=&>3^{{$Ta<0dKY0~ONUmuEApqeX-U&?HEyWwJh{O=LD= zdq9L>SoRwJ5puS}X2#zfG&3%cX)!APh2`SN4+q1!Om>;U@U&-T*5g!Zl@G4p^TYo5 zik&(g%ntro``x@UzWF0MeIk5)ZjG8AAp`6PYQ9F$mPf|K1YU|74DZnjv}zLz-TqA# zV=d+Q!e+Jd1L>P58B%aD14Z0uQ8J7C`Qs0B1D*lUA@Jbgn^5#1rS8|?YZB73L)y3B zDwE#6mQZD|wmOO1`wfqE)O-J7S-+g>4ek5mP>3-yFrX+n4N5sUIWNqhq_F*%*f3c* z_<=)q&YSF&YIA{ohU_F~vPjbtMMVoBVe!n(&5cTaef{>${}JN@NKFV<&qFkD0s^A9 zHa%}{=tNZIgbkMzt`Fb$7CE}o`*AR<6E2Q(i}5LlxyPp#cqig>?AqI@nt205w%Zpg z)k~oyDMa+MeYZkZlWJxX48*C3l4Bym#zgu3`0*qTVAs!Z3tV?(kx_ZoR9M?sm~!k4$X{w(5Px1_XA?2Z z-|~3atkbM2Zn5C(-^1X57DNN{79pM4hq$=Q543=@o1S3@hoHhHq$H>KuGh=zy{yn6 zxA8M=c39*NQ?jKO4ste@`oCyG)&3H}>r@r1priY1YXJ`ci07{g@uR zu8k4%TKsGT-1+v-5@!lVP(uuwN=>fBSezV6UZZewO~_?~(eB7qy+o>u{oCc;(NN5v z*H1+FHY_Z|u>KeWb?v=<`}+CvU$MDmfw>nKk1&|7y^od5gFbxKjOT{WQV%T{k*3w{ zrt8msAV9*U@9C@?u*i0B{*|Fwv-Wen`p8?nfeEBF;x3E$wB+P6^un%h#l7~~X(=dV zlf}GZ&zG~3|AG$Y7{0kwlHtzttB(|%c&z;TU;Hjy=-60ko(P+$dxu3iB6$LTDK!Wp zmH|&WZhVE|YGT5uucPxsmFB_Y_2*&3(Fm5DrR5Sy{8O2l>goYIfy5V1PARZ7|W_K%+t( zobYEJP5<=lO#X?yymf(w{LFD;yd)dLyR-nFbFf^`(FT zsKC>IErjaP%!;Dp4TcTxMm9Eh{FxHF1@xL{5%$S%=Akh%=}mQB2Yn!pfV5xiKq>h3 zw#}r}c9h^*4lvQ=TE!-T*{@r)$7zaS|D%k!sD7~<)yq~m8~}>_SXWnfY-~*O4k_d9 z+gBjW+?#It3qt|Z<0z?AA|O-Rqi)Oh)wnxqX=^vZ!A~pf+6XEoZpSH6Gc&}@kE)22Er8LU%~FU-K<^!`23mT8F25M?q4!}G0uaW`1LBCjO)F^q(c+&R^Ua zQolSDu0^jQk4TCaC(ZAg>&bx#DVh<<1EL@lyWoK+^gz?E@9NAuhRCRHDDTBE`JpKk zYfX&5*xT882q!x%{Y`k(%i1&qFag8Lv_u$B^c92EznP{X&|S^U&Z5ypTxE_vN~8#F z1L17?t$FABpkMk3=rFdw&Y5)yVQVRqac4pIVEr_GKQk8>QA~_8@IU{Kysh}Clu7qY zaO7mW6z-csq)MX^7yQ6i(3MJMJbQIHq8ok~e0b1kzyI_pEUx4qv++%muq07W=KvgJ z*oL2#jZH;c8z=rLR?L$?gSwYUu~J8S_#^FKBUll$&McrlRQ_pElB&k4qOKlTTPq5~ zF0#Ko%b99!_IGu6XSok4eIP@5t#|M010rk!f^spM8~1Neb;m8Vd#2$0#V z11G~A&*yu}h@#ecCW{xDoe0mS=d)Po@BI9TUB7SAy!Wuu9f4q0{45%Lnv@i=+fXnU z8cd=rWp3t8N=#hr*pqbMNLkJBuWqT+p-9KUeY{vkliqM_lnWXq+HdXyq03LM+=f3( zdWxaAEUS&21Ll*iv6JGeC@Z6q_t!61f*td9J%NcYR6|2UhtSHTe)~oO%%@SYmK&!) zqW%Fq2Xv;#&E4JC0P;TX-X>=WPJhAfeXuxOV&5K-jIy<*uB@&GvH%RlO~b=vAobma z6tgA@cfMsA14B_2(klT?et-U$KvDrCSQiBm$EntUtAxtx>Q}D2lG}Xvp-3vtf9D%~ zgl0V2pZZwu-hBY#tz5E@9)-74IKIBV_^6pJkH5dGcwcNz6_`#l4t)Xdh@cbm zCv&RF=U_S8cS{T8}J4Vkt z_YzNbjPgVC3)yu!Tdd~|>YjB<>Cb*J$R|W|FF!y3azj<=g-`h$=k1u~Yw0FG4=!@q z-+d`YihBi$EM)@&f+{@%@LO(cxTg1i|K8Qr5+QN^_S-ie6empqV%w&^J`IElWcD+% zvE@mRW`Vg3u5xpHY}|3L{>i$Tv>LA_zm$}^EX7YILLwr!Kotb)jEBaRU!eLpg=*QJD#>MvoM*Df{WKbEQ~Q!9&ApSv?B5j`@Hq{%7nP z4Xekq!W{=>NU~jPd~|OZ)C}Y%@In&7d86pWn((c$b6<$V^iQ z=5dAnp@xRW*KZ`RT4qi5R)*W{bt^VpsYwlv_K|PuySdlAE{1q*R|0~2mn59s+}3ZC z1QT7q9BYvhUDn;2@Jv?O zS%KAO!Xlut(zKM$%XwgJefM&rMrEZC5#}pUKm_RIoOX&b8xXS2VBKOgnQk~o_KMs= z)_{S*g)TXds5GKbP_Mw1 z&lef!qq$oDPuOWrJAu z0b}G4PQiEssr0K%YdDBu{*PWBd=0-X2M^`7dHGb?K|a{CTI}R78-cohs@g39?d?AK z7=rD0V(29~I;01++|$v%KIKeM)4^9>u1pOLtSUqgR%duf2riH#PE~qL%*-ol{QPm$ zb932h9Wed9jPd5prpUBA|It6lz%5`^rgJG&x_|!$v8d$&vcN*hkgc=);Lt22;F!ck1z#?6?a(OHUtq8^8R z4_RY$Zs5PMs9GCdS?@yPIO9N}ep%_j;CrA&Q|{oxLuSB!&xDhz{Py*0Oi-#SITUF) zI_}>z<`NBg_YU4}N|oL{Y=6LK#>(vzcWoK4P?StLXs9Trr+ZWOFD9e9Em{suu1l7f z7Ywfym4o1TZ@%;T9nuitRb4kXw@)s0Pnj_u5P`cy2yt6civi78W3_{WXO znmBU{i!?a-;h2-s)1wKex$h5en?X#B_GKL%sGMLwgGx4gNK-xR4o1jN)3oQMQF8t? zt$*~qL~2eoNFMj)O~bG=rDX9ygQ6h#M?uwBr_=xe>U8zveHUiEiPB&51Y-?4?X<{O z_k-QvYHUVUb>}bTSMAW&V5$*e3_Cdh z%eeOF^XJE;T=JNuBxnV9jAFkJ^4?`-{Q+E z^RlGdN{{H(I=xIrW9a-n2h9ue4&kBVd#ExwN`X;Y2~b7l30K)b&-k|Yy8A+Bzx~xC z-500(6OK)0JYa1M>WH9k85khB^cAq><+cxXxd~B9{+92dI2vLdeEnI?B+!dsjkbQN$ov}E_2Ub}tTc!9}&rX*e_+%vBAPz;6mqW^m})@gl|z;EjT znq>^AiR9Tf86#$sHyIvFB^xpuuK)V+cvpyn8g+AcQhQE~b98odWjV8I<@sr&Mpw@# z!^8A0Gafi9VPQ!zM}x@^g)%WUeaf*oyWro{KB*9)p?cWml`PSJZ=6zp*Q_S!-%+ZH<%O{}y)X z{Nf@bFYooOtu5S~rx<~g?@z1!GOjtD2Ybv3t#%YRJG-)f@9ZR|#>ax2V%2$fhIwK9G3Q6%LczAt9lW?n}mfX3$>@i zbbVM-63yxHY7vk8tC@nARRq*)$+v3B=z<8ONnlkG6BEnH$)Qk~n3zWUYrp!C)xD46 zK3G1&F>(EB7nn0wXYgu?JSVLZ7D+HwP>p09JDofSN`Ra0AVE9y!4@vGg%<>A)0syf zHHqp(l2#@-zxsHL>3jprgOi)v<=ix97nl2R+jK9e<`K|{^OwLo)_{Jk*a}$Tr<$6Y zeSBfCt6N)Jtzc2GAw|zAIckuF4ja|&oJlMjRKCmIJ7XnQv(06nYFs^8*xBEaZhQU= z%Ug0rGddHLePsGDbC!)WxKLf<{oxAtWtL_#e zYAI3C$r4^uwVswRJF*irOykmz9-a2R_k-j6O|g)mdpT9MT^b_5FCgD5?Q`bz`!&(@ z*FOHAz?Zi4^bo+A5}=V+w!O7w?O>;Ig#ckohilRw;@BTUVI2UYJTOonp4`5tSLtWo z6-&18OpLU9uQx6>R|o9{nIr?^hyRgw8mOIj2(wM}6OljCCd-2!-1i;DM`z0>9%m;n z&RwCQU!AlN)BWllE%A`0!h(dgt29d~c+r_|WI^@1r{;vk`H;`t@t%Cc@k(CGI1z!j z_(kNi)Jiirw2O#64Q;F)>b+Aa8>LoH4%{&#K2-+V&Nb~qOa@J(qcbVOIzNB2N{^EMLTM3NLb{+hZBpX^$Lax6no!XFEWLwZBAumRk3pAj`UpAc?YNqg>97WU` z6vD*Kke!-*XELX2!^5M>`jaVx_o7W=1T}j#CqCnSzp$DxT(Hv+J$6`LZ=f zK}vMw4BkFP+{91;F8n`yfzymQ2d{Fmf;if%4`1*!)g{KH7aq78Ksb+BeQurtQL!jr9ZvM}=U63h?`!=lEizi$3TyO%}Gu=A*u1s9p ztzP@W@c*HF24@eSnGGXoR>qCb{=@kotj*1cLfo<2wPF4=MS=BtGCWF@2de zD!=$_VQ(xx2PJug)J>|#toHl;$D7RxjFD?tk|1jDzWUx){5B#1zzZh$v%W8E%Om70 z0Zj~WpPac{B^R-@4>EbLh^IuJFwtJ6W?h{NjAuB%9vaH^r*qCyXv#nNmMs2@NdyOF zIk!zdTNIo(JOXx0=ib`?PB}Oi1Bi&Mw+2pP`!fiTT|7`_X8T*C(UYNOr)|l_5AHyLgYTSyCgeksrcs2Rn z)m+1XK^eS5-upC~0S23rD87KS5H}k)Iy^Z&obTt$N$dn2Z7HK7sK)8y&lacTz(J)d zdqgljjyvvjvfaTM@zuBx@n?XOahr{mwYq%ffCKF*mU4~s8J8b&%flzgRGvJvOpk#G z|JncHoJd2ubPD!EN9Qw8Pf2hCF&;H4+RDOBz`{y;)yHf4=>!BVaQlJ-gPJ2l>AO9TV@t2S#gs8K`vOYo zcCc&^g85?oL)QXZV(oM6f;gXgWF0-3K@LSk9fq|9qM=%PmPyLbN!~8$JPX?#x0>`) zq#H<8S!d^7&GcXIfOxrk_^Q(h$U>dOrdzXzx(IxZv0?-YjKO}hsNMG7|t9KkU- z&BVk+gYlJ~(_b(_c#alf1{lfb{Aei_Oed*HNlB7KnBbjx+1}RXrVo|7RG<_$ZQ~Jn z61@Z-Ug+PgxsICM&FSRT)m1zIQUDA7S>?Vt^#O{Ef`Z&!+*iv-B^hubM3U4ejvR%S#=eL0Mk^3Y+X`6TEV<&JO4J!_;-g5V#gNfu*T>It z_(&SVMrj#9u3+dm_O(foHD&-RzT@iLT$|Xt9Z(Rw2kPxyJ}sq4m!b#%ntt9%i6`NO z2kF7a6qdo4?weG95lqyG*JfQr;p9uB@uA1v&f)mZM@gL)zjD=bsblz8($U4;w}%>z5)Lb0`llsdo18Gh3@L^C00%A6;G9jyo~^ za;vOt`eFS1;iwc#9)9%Hf05B~nx}&&2N)6=*}lnqpHgaLT}HmzPqd=pQGClS`Br+P z=EX2+M+fyCf*{bJh$nre7kXdwuk-pyQKG;Vo|YCd4coGypGg-*Nf)cxZvI6LCr(Py zQlSjk*qG>#q@`a0RF!rIKpdHAU|BZiG@*VBBfsw()K4$HiB;9#mZ1HD41lS&PJs`hdS3DHm8^@KI!t~!`+H6 z&#V#DLBi}RC`}38fnm@Z{x}xcgYP{(_ddumO_eQq!Pl*U7+k~wdPFanc!mT$%W)<5 zJ5k6TiSz&1yOds8NeMM*J7gsRwhYFb=b&~vJ(<2JB;#WaHWp8o80+d<4T8;3b4e$3 zb_QRzq^F{yq8NdYYqFjcRNmCrIjnJcTBBx2BgbfQN^tGB-E3eI1(A8M_iy4f~JA#zTdgYV>Iw|Ta|R;E>PPPx<3lK7Cb?F{pM0d+67 zWcoqwFx$%MwPc%h(~HA}KOyZR}t!f>VFGH0L4-}$ER?OTVf%?1g-zGcc5uf3OF@A7OP(a$2MysO$yd%4xW zTQJb(+GDDM+g2n>){!rtErwD@G;Mv)Zm>c(e}Zv%MbZQ0)Rd^VkJ3!ypE8FB2U}~H zamPOe*Jbm>gf45$6WWAq$H(G0f4n*B;bmOh#Vdt3%G~PEHB5OgVkS&JXAe#v{=B94vy=8Yrl9! zk#ic5d3*#*QVDpjy!c0V;82GyC3;=>#oAlo9$@1>U?OSy@gsMm4uOX-gJxO*a1+CG0r|wCw>Z%GE3dtEbf{#)sMHf8Bf0ahkP8hoHQl_; z&E21vX?+Qe@bi;x)}J^eJjt+$xG?Fd$2cK$vZxc2KeOB#-l;L^P7q6mxsZECd0;~_r${weO#elp%u>@Tsq|;%>KSi+o8Jxg_rH9%mA{jomLTjwK<^8cfpteAp zMl7Pkdj-3>@upR3%dZ_m;m>s*mg9#w^kWCB5_GAyQm$97RH5nY%3FVz&8wrp3QH97 z9jJCQ#>TrQyOwi3MhY#bywoHF-D_W^uEEOAz|HN|YBh(7s%)6gbcSQY^Ge@!Oh)8Z z^Cq$AahQRO9^O~Eke3}fZmSOm{LwAzmA~szQLqS5;=8kO7#g^p4rEm0d}m==ZZ+ac zs+A3U@-!mMCn$Zi!yEHM?T;H+TDqPd>{?N=?Jp_GH3~TIWdE(U)3$!tkc@1l`K`~J zS&Lb`>we+xuEP?u;qbj9`(}?&YTrs0Qeqik#awa`5+VKvOdAjH#m#}Hc&yGgZoI#L zD-uHH{FC+S+tqqNffPf9k7Y8jz3?!q*12^5qEDa1M%&xpXtKvVqYiy1zl0Qma{V~2Ut##*8T$%N#V(z;LPCHfA5?4-!v%F)ahdT4un)9BQ`o^vP zivySX^m<{c^*EC)d35J#H;?*tBVx=~AWLW&86hVL#-!5q?L&j%3q2X?iHi8YDUUt5BWD_J{HFk9YaaXHY zDt!O`gB-i@y*#LEjls}D&q{8{6a%I7SLT(+5J9C^_mb>ne;p_wazLSsjE!G`D5Pa{lmZk7G6-zww~Hdt ztrHU>`|$r?@G0El;UNL|7TBKuL2yS#Mkx8Lh}PEEXa6^|A4bXj=baksI(|xa)sBt5 zeVr?m%7rGylu#|h9sL?C-jEPALqkDPp_Vmhf8rRnD4`0I*u*;A|1=-bGka9z{M#G~ z-=w;}ip)@vv8|&}zTyO(*Zq$?38PJS?j=b)-|SRv{rIg^Uprm=CHKbuKR-qNce(F;ojZC>sK?0M5(~Wc zIgnmdbX@9QTtL@?GaLvuT2;>GVQ{!5GhpjgAVH&N+4IifygkFmD&^O|KLVPZKR<}rV3bX0g(YyX@mDt*L<>dm`% ze5*%}UCnn1dUNW$=tK2S3h@uNZ6;UF+HPhwoGx~$>~ZLx+#30eNo4k;>P*D{OZE$< z2lGg$tqo`YFh;KyrWvKo6jN;Bs3X;eeD;5WT+Ywg_l58Lopl9G8ypxGrK+(pFMz z%z(t=|EMW=YW6QyR&2N^-wF2vU=X&w?F-|a>P6-0Mf_u z3`}v;<|k(hafYC)4S5{(<#G5vY*#7d=~H}Q8efC7WepU1@c3Kdka`~*`-WEJ#Z1j+ zeG8Zp6KiEI4*}vEH-4o92j>m_#n6yi?Zx@Y`%W|1_*YRtf0%-Z1^f*}xPeYDUMv=Z z;j5^w?yN6!1%M5FXwt#GaOt~npY{m?pkWRyDq59JHxX|ipUC&`{lJajpSjFT&jZ8a z=0W>rB9M3uD39D+R=C&yK>3;rmJ>B_*HkZp-YOR?&V8sAOiK`0aU^#8cD+`$;f$2i z0DV@3ZbL6Q85xX`#_^_$s37t4QN@gmj6{BQGqQ{R+~!QnOpmCj>*CI2WZti`RYdAj zd$$QI#@R2N@)Q*7Qf>?l6OHcX zjQ)U4<`N5v&Lr8A`y*?_53A{?Dg;UG#}89=4^r#$0|kAk$%<~gJv$oPidJP&8n!gI zuq=0*v9U@R;W#@yx%u>!t*lbAeNZaf@T(&hLc;s5v+U&9c8oEY(Hh86W(|_Q86^rtmp#A=GVg{QXaJY5tDgM0v(9geE*RXX!dBSBWeo0zwVb6fHxnBZ0O4)R5h;OrRvf)?z*8k&1&n1 zyHcxe4AGtN>nor_!p3Sq&zOc-ZMi!;OM&KPyxjhT8nDJTbZHfk^uW{&TM5K2O=4&iXp9Euk00CcQC%t^s;jBg)zzVdM9VB4wc=w0gT6NOvBJER z_#o7KC6$`J!@k1ha!X=2F22tX222%mDBQMJ%U%^J3y@TUTmi!EqD-9tNAy+k^u>X;* zWgWCY?~pNmQund8#}Ks=+AHyw%O`)qn(cGaFir26o448z38)ahF^}0lSL~Bf_Oow|KZW+{|BlztdcQo`)WAu{Vt7MwP>%8K8)-{t z;hvm#5k-%ry9HUpaBBCc>B1=aZDI|L8YJi1D!Zrzo+NASub+AM|0eE0gi3w>R+SJN z#B3*xot>n%Q{yHutZ`uaM}5o9RlMHPvJf51DKQZt z`_|it7PL7mtblk&z7e5lCWJ#Wu;E+u1mNq+Gz8kt3n5b%pWKJa<|2ES=HONVLAM(x z^neFbO-*R6UG`rZ5)b(swM862O36SHY~<(|0cl2{*~0)i!j9oU$%` zS?CHv4i8UiIJCa{dG8%%58J317=%N^90ltvCaJ5N7Gp+PH3=$;O5U8^=E`j>5>~ z-zenVcmW{0p>sk+FXWWc1=lDZr2H*E8sr-=~8az?q*q9hHXQ3ot5CIfIc@i5N`?a*R z6?l6isG|<1yf`&;)TW^DCwP*h$;!wZKxCO)4+1%{FAv!Ps7mnE#jTJQHO zXz7HK8t7DLjWV}xy4<-p`Zn%BI*LJZaM$tCNS;(Ev|86td-qo*LTy-vpvu7lqCc@4 zE4tHefT0gXSwb1D*Tut(fsV|(c4#-I5#z8SZ{s{+rU+Ly0=dGT*H`9F^~ zIFes%@9mu__$)Zz_YkEcfc=U~$GOHWqV79TbNzupy)ox@`5jyD_Q#JO?;tY+u+{hS2onifLpLJtgx$UfAV22f`g)yU)12)(C-ZK&^~ih%Uy{}Tlwm#V;L zIj6-qHnETka1Ks#yuFt``qPVB9w0V^TN-FXz^~f@m5`qH-cfiB7y;(Ln(%7KEfE~( zkjZ?#{~$_lerfJ~t>uBG&myPC^N6vM6W+Sy2%)0~&x*72D7y)MmOS?i<*P19@BMsY zz8%yxW%|ze$n zrDl9Hz1fJ13qkD%HS{)MV@Z>(4%=wP8MjdK-@pGfH6VZvL*1_mT$0_E-Nk~Y~?f!k&n&yOJyT4W{r)z(j#b1hbgqn zIGLk^yLHRI#zJ;!v-@3}yHr|O_G{iFisLu%vF?N*Qc&iBWGFH^Isk-A|2#zdkS*pE z!7&NEy;$6(2Ac&Np4x}C+*2 zb9y!o%P<#0V*-$n`eS`LxwkD9)4sY8Fq5`Am=%$ch%d>Db=pxO?{%+&@4o zwZdhmldh5XaH|(Ze92wh4sAD<;*#KG-ajfb^geIG7^xxqua-dG(&PE|Yon#wpd1bC z8%P?ppEuunmU*o=Qufd6U}HqnMDbIIR+Y)GvjzH}B}FRYb1y4Pa8TdB_xA-ygynLU z->bR!73=u@56>@u5qBy=M`gp>_e_;^>n9W*73&knBViATwqvYD>#5&dTMuMw5S3I3 z#)Xjv(2y#;k(YZcDjvXWCFsxWj1#rk^O3(|I$Oo`@7S2?F><|wP+x+i>Q;go_uUMc zFE_E(Z-4*NF&sj1or*bVxbkSv+(>hpVEs0)1qV?W4RS zJ)`#;rJYvWt4~G}Cz&Th33Oy$4YYmp`=+T4fdg;Tgl>eSu|FUpQhwv_=g&^|zAlwP z`Afz-f4je#fjwUos-px>!go#r%E{N{aF10RJjIi}VGVCayYz_NKd9RD>^-?hg#8&! z`ng5OK(pBobX3J}J$lFqx;brRg%Ml8i~9D<>SxiV&4V`HKsp&KpQv87$h~`g1N)_Nk9Ites=nj6^r=S!{xX?;?BqJ+I;B<#nX?NE zfgs_2i8!8uJQJ|YVVBlxg|)m?VR@F2UuQn{)tC-2hafO3!dP>#e{0T(Xmq=u9lM?G z4k}T>`P$i?}e!^6WZ)cLSf-V2YQriW9+fv@+tCZB|K;yI{) z5Onx5_#9Q~S@HcyBLPpUIjwW%W+Ab3V4^UJOYlSCRa8<&RDWbZbr-EU&y*mW;03h7 z)8Zu;hroZ))@vVe)jph0+0e6jvSNkOWhdk8@4w}6TDr&bh56IonX8TLb8F&jURRMv zt`2V$bT?PD9zFVVg@N5YOVc8UPjW-CJmA<7kK`byt3;ri2Uc`?7LFei<_uGN|l9kGZ03I(aC z{97eL;Q?CgZ=N!@fH8~9q!s&~4bxZ1QLKaSx#m}Wvj-OKr6YA_bG$4sCOO$q3qqnM2x)}AcEfNi+_Ws)djZgXUO04*!m-VMPaao>aJy&&|@W~qIgySF9Gu^4E}8>c4zq3>#O|C z<#|^$%8;3FjlBi;dSsMY1yILaR*|zTs$}QCKI4&v5qyI(JcfeEi|NmdIva%D| z8Htqa?2JM-*%30!C|i!Q2^Cq1tn9sI@0qC|Ko$ftMaxMJsB4+7a>7+EuVGRgXsa_J_o`>hu*2=AXbiS|l_t)jb)-mA|JQ^mHOC znp7(ygLZn&4LrFmocH$Zk6oO}Zi={)fzEXcEQzn^Mpr#20R9!Qok6uG)upd3toLOM z?k#jgL<=AxkF>Q%!O561c8tSVB+fTeH^^Z!W{-D(~ZgUH%nC8s*`@VNUnlNW@cj}Br1v$$EV&Z_~@6$ ztR?~hYLS4Y(mHKSxLgr8gJ!Ij0uJapAoKn-P8GZ;s}=P@HeKE0Xz`nk<7oMtR4?(Z zmgkS?iNqN{{}2*jVZeZ+fg-_vkPvWP+)0v>8r~Qw@(6CQF;hxc<+kk^0T|at;>K4-JwngtYAM!U7AhI=^XQg-8Z^uV{i4}5f@SPN) zEG%y%`7PGiLCA}PkII=SQyZ{syu-Rw^6KwyWr5UlW$pA6BJqe6ht0u4uHSJ}KF>@3 z_7H{GY;A4Pqdt9^lTcM{Z=>^Qx~s!bUTi+*cO^BQH)T4vnB6WOr^X)-y^P3^3n% zyL|u6;^tD#(a*0j-J3_4wcBigm<;<61H_QDLQVc6|5}q>w?M%5#YtkHLCNcPxoL9nG2`uiU)uhum6fp**wZO*1uMS)4DEWJj>7q&`WMS_RwkNVxZNyJ7|VMHm<) z>>y@D1t@04u(knZ)fF+jit=*(`JJP#i$p7L$lYuHNO_;p5)enQNr|0qT>*eA6xvO= zDn7GLvbZw!;zxP0a#mYjzxj^uesJ_AWAWhxg;t8W4Ls#{)I(jF@$Rxqs5+Fur2lf z!ME`1rjsYrw<$W133*i%d*%4}-hTkrux05EN&!8)cHJ1m+qFmGBUT z%e0(V!Y1hQFo0rgI^L`?!#_HDs9rnZ`ts50g7tlejLEFMwP{@I@u9U~{wd%ACBZBB zXJKJ>H(l-LpYU*#V40mtUWd^0jfaKuhV;pCaeqq7VEq?BhX|*eW@`R^Xhjr6n)mq*pnz-B|vHi%Yve>Lx8MA>fn1jLZNGCE&CXYX{CP%VHgo z0MpSV#OV34k|NFdAnkdCo<9yM{@E)onR&r07hPW6^Eg1ZjDx$=-yk<0hyH+03sIDi zl4^8KQ5}U=0Z5{d2c&f~DefzOut;)F3R}C6sdf*K{%^a9OT`AJ_`2ASSS6naMFa-7guMq?acGHkLa*Wk zK9aL%A=Fk;oa&J{UlX7ZKxiTl(5Rep&K{X-(;H+_M87(;Aqf<&e?rX8Up609BOK6E zK$ak}jQ4@|X5H5TH-VGq)N2%|E@xo_{=gQiM<`Bd6?`1KD-6*yJ7J68x}wt_zIUmL zeUA2e`d5X)+*OPzl(WXr^^hdC2xT%gH`ld%><%o!E^+Jxskv@$g+fHKb{3;U)R;cG zKyd5mDSg*i#j`j6n7??EdVf@JGoktFTE&W*qYq0lFB*FV6Vmr$2mUKGQY25_L>R@O zp_J&AH||rN?R<}&x1zIjUDqpp~WY2&D#AYlWWLWRZGKiQ%Kj5=8g z1-lLJO`zrBiZ4E&h(xT-=jeKxE#`~t#spr)Ud+dKpi*;D{JL)EDY2?3G>vOP7tIwH ztl7Hg5HextMZh<*^~~7u>@@|Su*kBqpHc+DMa>T?<&>c)jBkn7-6QZKe2Ubm!Ts=> zr}6VZ)JzL73nqlT`*t2eR}zi<=gVf_DIr>+Ne<^F#{kth_t+#RQ zQS$L~`N4I=4Gr^2kgiJ86~p@ty|$x$XZ%S@A1`+_hXG4ilRW${YD^?$O$IHB?epU~ zcf{QtxABGDP0uIh$L)jr&XlaL?t6v|#V(Wc+2@*#w2sFaF>O}(g_C6d4+4+{@BUsKA;LD~j_($`gj3f+ z9GM7tr4jKDopNTrJ580#stn`{VVuz8aopR1G;Kw8vOqP!3ZCoOx)Y>co(#F-Xtu$Z zb2s?D42)I3GX2Ky7<@i(9q2-FrVr=2JiQm`!l=s3>LApX{$Qr7;IGo}QvZsMm-@|> z{`VF^PID9G2Y+3oJ+>O0_?4~ia3~=o<9h`Kn~kb#GoHMX9}@2c&Es4{ISa4$pPymB z%`YuQZs8U{K3hxEcbZl^?+l^W6bxEdezf*Y-;4ezoS=+P8yZ7FJC$GxODpuymT^dT zP<~l_!!I!pBwX}#bn#-+R+?;NbDx>wO9PS3r{XWdA6EpiwfmV;UcVG2=@^A8$6cs%Z%F3MenTjN69y%O>>_3blrjNT}(T3k(7*DD~GodbV z?^{W^qO;Y6UwZlzeibL7FJm)k0=tk5=_f5K8wBo`^5tt z;X2t^3{udjrU1fe;}OvMlcB7riK+`}OPFmOK)iJwB@U-0O_LfA>JUs&pby!{WSD3{ ziQ{OZqSX8>IGM7B%{?W@lkra0>s>?nJZESzP1Hq*IM6Mdd|b(HgR1OF`Bjja-wsUN zhk%1KPt|nmCcAYvgy3sowbcTI=mwf<8^a>}=?{hO5Uzb&r*MFyG;W38q7yVTnofoY zf@uz@ufUy|gze#76tpieqT6=0wWX(ynj~7!$HTy2*f7ml^cv+~Pj}myk5}3}0F9o3 z0S$HQDI1Q4Zmq(1A#x~*3k|vsf_IT8rgTTaU`|9HUWPaw!x=gulB|Z#jYw+28h@g! zne8;C+kqdXUPOw*T7g<)x>(q8J?d?vKd}&M6h;4eAgOw$`Cb~-gbEa&~6AvbJwVzMFQS@c&^4EZF zP8AXn(BIcy^5_t!ZwL}^c}P~qh4{=e+gWrF^hi0Z^hvvd17O%9#$Y_EY;ngW9{QP_ z;7x!2_(6Zk@zHx5_WVF3W??UZU8IvOz{y#xWXz}={nkXG*c4A3n`lCfnI>K2jPeUy zZEJ1q8?*-3Rl{m4fyW)%O<|PGd(r5>tb`Uw#bd5~1oh<3>FMdYRfltUvo~%W7%nu3 z_kfOv3qpG8McCLLYv}0c?D&-a>iF~q`x&yk5JOWpepMp}krQ-J{apQ|>S$3{8jd7s zAKW$2NQ%Lz670C(25LtvOw6Z{JfZf_MVJd+l4>pfV!HLQ5_t(8?$1~A#h3E|SK~Ij zox|xi7X}JqBh*Nv`GkZjrdSOnANK+SdkT0s4nqX~NO7b&g$kLCNT_U;k_uUU!^4T^ zkU!&~FIc58J4>^%b5uFxO{7e=i7i={=qj*QNgUAhMf);MC~OaO&@l!cN2cyD^d&-w zS2ui2)c|qDqh@18b#CwOeu2G~AoQg@;U~jwx(QjV+uFGFWa5t5?*I`|ssm$8WR5!f z(m;zKuK7IOO<_Y7N%Ywp!Rp({(GHb{3i0=J)hDF}zbHg(R#X!ZanxKW?H=3Ein?V| zFVy%*QTmpfNK7_V3RfjlKRdG>RB2tRj5$$}F4(Lz5+MDv5Vhu`sHp&&U+%*y%*F%cjb4Ft6v6NIRMW`@f&^=6_MdL)B>xI`V=1@3hq{|zDO!e28?cz13gS>mD{1ZMOm}EJ3Hgq zs^r%$8=ioQS@yxZo(KzT90=PjiiMen^oDQrHPp*O7sy)tU4BzQe)M2zmoF z6a?IDLX{@+4&b34Xtn+TK->fN7|rw*aq-6JR+@ zL!v*yy8PVZ;_Lu)LEQ!wZ&!T2d?B&giRxm($jr<#ZUQFfZ`7wxTj#*otR2;1)A@@Y zFDKcds$YNf?p|73jk%kJ2V)Nl^eNbUDl@O0QsmgEVPkk7Re%&ah-K@olx-hOU+?ke z+4=WRax+fk&fmk+7p6uGOM^cNF6we?T$h_(9D#;#0CpFC)V#AQ;l50be|m&HJ&t@@ zw=$o-{wd_@vQ_bxa5E| zR}Q*8ut?{kyU#dwbhtgg7twFc*UiO-ux<6O?SboPSr*vUUYM^I6-1Gvcm5$Q1?*{Dy&B zBufH>m&(SMFBc<212|v}ROgG_%<5shkUE^1En=X(u8X*tI77YFWl;z6{bYBA38-Pi zLx>4(z{ADe(A2(G58O2622d1Gqp*DFe%{P-uF&-~H!p7s%hLuz;mcltH*&l;+^PQ$e>)v#W$P!E1F73ZMS+E+GYpLFnbkxzL zc=KoAc17BcA4TFRNX)e#MfW{oev&@m=5}{Gc=vmAV$;c{`m}xvO%g4%BJw-Z)iT~7 zD7x`6?&nHlvvZNoU+6rUz+s4k^&DJQDHxbx7Ydx~%3Gmda9e`?50EEl{h9?iwKRT1 zY<6gv>8KNQq`rX0S&9Iue~|JokZ^uFbc=n+JH%?p6=1wvuqeG=gAzed5SlT436N=4*# znz7~;K+4(<0`O0e*a4(8RYHpL*NJlHz1OQnPm)eHgsCF!+0S*_@gBK3B8hB$1qs~X zp7|r`u$K#w83Bmuv7@uBLeR zLfU-uv+oeYlL3rs7&QEa(mr^JKQ})=jd70v1wZsR@PgIBejdy#uBuRB64z`K*!04y zZMR3j6gH8F*}@8E=1+XIAEsAMR{4W*Fhpr!8yY@YnLg^i&^`xCB^)TSlg&eWZaD8fe3rywjqejNZ{jjjG ze#2p9IWgGG16KgoEXqM>QY|Pzs{d^~Xg?ES zDg$eP=FPc=9vy<8FM~#ASq-C`$gU~KyfE%>e#j&+s|=hVnI8n*JNy5KA0q+)os;}t^k}C z^JwZiwT0G@ObC4}G_DWn>1*XvR9zw?BMafH?!vppi75KJcL}M2eT}pcKD2AbM$sIc z<^VXx0@-uy;_51yt=TX+Ndv>$M$6I;(%IIgBGzR>v z2e1WxFvx`hW)Tx^Y(UQ#*wREGgU=WL#*6mOPQ6@Zwtc>OOh_ODF#urEAk@Bsg31}I z*qwN+0n0t4l~%-6Azs*po6@%q5=kIrr}Q7(0B)emZmBxkACCjz9uitAL_E3v?<%#- zi|QaH=Da+tpa7lxmYC+^T4kUo!u&`je5AjB2f&r*8Om%~_JMb}xQ3xn_2Ti17jw%h zNiqz4e2&7Xk5s(40RaJJKx=+R{{8!x`o(jgyW2(!5P4aLzhmU!J~Pzb|H8X8Y+&Rs zq)DT>S?J$p*Z%OoVuFv|*wQMzLmyv!#a*$mVB@^w)obXfnQH8%Q{0#Nl!XCP>*2xI zH)pF0dfzqI7B*IYM#?d>4W~&D=NRN*e6nEh3n1z{087sIZaBFuP>wPKO4y}?wc%?J z90Z>*SQdfW$1l)ybVy@K;BiXdD|b<`n#9Bx21#Ou+yr1xpnzaSh~>w)EIov9I!r*s zXb26L`d7DawlHvW7nD434`g0~nxHLkV}dqNB1N^Xzn>J=LojJHLs~!^#0@FNbS>^7 zAU2kc2nX?CW-~V^<$nxX!X z7sq0rxz)ow%6cgxhs`*MNTgsFkpH3yHy*q|7NGC-QD&2ZNFGYxw!&ba%iWRKjSJO_ zEUexi(jC*&(>|u7(JCs4%4e?1Ep)hD{?RUe22zBGjEPa;33LR8FA37%hqkjzrzFAi09{{p zTx@L1k}97y&Id<>vxM})vr`y86e65&R;Oe6zWJwyxJ zqtnaItjaCiVo`O^FT*HuxHEb7PH+63sGF+1S1-{|&CDC`mD#K}{(gy!uozT`g~?kKn^tpeaGFfi<2abaiC z3}Wd#m>ig)UoDMXFAGA1fpP^fI2iQMB($M^Fm4axaB^KM?TOQG@QQT*br!C`_!)oY zI`Nm-&tXb9gUdyT9SD8W!1yr_vuJQu76*rZMUfULh`xh=G6j|-J5YKQ0Mq*E=}vbi zTo(^^4vvY})XlH*>aeKK86@FSB0${5oVVY}-2(l?rP>xI1r7cjA zcWFJF0wu*N0NF!r3;$k4oaU*f4{RgOm1od-c3uD*gd!}@OBHst-re|Yb#@2Mp(G(T z7Us_*`WC}ElV1M*IH}hSoY5ds@{)ay;Cdcs#2vi|SWU>$FY4&~RCu{GqU$4@#lx{b zWu)Kj)SYbR9>YOnf{Y^-IP@I7a>>ias0-k|EL%FP4G-gwCvn#PAJw;GHlpVqiR}WM;Aac;( z7qbHuZ0qQC{Nr& z=JQ~ar1#4)7=|Jj)%0E1ued=&l#)C2+%{ior-vb27n1w_>6E?}p%s6Xz>7oBI0l5! zv!Fm+-C9YU+ipZj6d+Bjyq z3V=h>AIm#JW4Ki^0bUpM7o)HSa6bWIp7G1hD2AH?w)ChUiHVZfp2fauxx+RX%7ylP z413qzIHd)0Jzu?G+OGb+ToL~Z_yStsQQa|<(g&k7L2l3c)fi{6Uw8!M#! zjrC>>8`OA+?59K;jDa$*86Z3?2JhmZJYZ<~nI^XB)~AC&-x)aw)fNG8eSqI^)3tsu zNU3tw_Kut@YpMFnGe4vdxBio# zN@*jnzOHgC5z5|eDvvf;dxi_lnGK%$_2Or8=s-cd0@ynthT*#B0kusfTF5*!8p9}s zhLr2&c&ufYj<9dv0z*M~7;`187OTPe#;O$Ot;{A&h>}d$a<;Z!-vZfteRnq(^bZC} zGM!so;?N{NXxNJ0nSXes+nx8h^frAGyQRAvP}nHEvjWQ`OS=}!n4bp#gs+_eQF9Hr zGc=zJWdbGtUC+;7b0e}DII8Q7|OpY2W;=!%Tz#1TE#S+t?Q%?RJ&zr!ToPtDRAELFJTdPe%PvhYnfl*X^xDIbvHRbJxVGl zEL2)rKo(4|h=ZO8s!PTJI!c3G)0I3!ViejKv;N318mitkSfT>mJwr`*usPQlD-hZQOO$vySdsqzK*2DzVmnWWpV7US-go$8iTFX^ke_qkY38 zJ(SkvT(1s?KM?hidz$U#Y42?ujg(x~SV7P;{n|6S*#i@EhUU^nZR*NV%J?&U(kgp5 zB=`mo$_)~rJpNkkhveP}+F{h9`a-~!m^i;|UoX?q#EFRs*6JU^w3~JQ#7tR2)%nKz zC_y@^;Bn*XlboG40_syOU%OOP{q-Pu1s1gu)~C}2Ltpm%c^5tEK4qO?nva)omLo6- z^;4?bKvyO3Jf4cFYp)V0Cp46m^D+tRs&x~T*GuLUKdUfjINxllx;bRE>w(g9P+dt4 zfC>p7^(L2-RB#KlfS#2LLJyEL=rncvV_)9OM>Y;z(S_+}X%%&a!KG#PB<0Te@xc~# zx@RX*mLV+%{BQ4~I^#r6kV5F0l0(yq`B>ieB;|sg?Cg<%WzdH%@a5H9Q80|^Ftj}S z)2}p4WCwX47rSa!@a8%=7td+j;rb0@VqjQ9ni4+Tr5{edW?!{FjI1xbYos2^7W8`g zM3#19O&}+yn@qY1W_6yiz<)zpMb0HwFxp?dK1H&Ui|eouYU@KKVHe?-O&Ju=LlMAu z_RY+lo7=FjWowCQ#9N&fvkB`7DqqjietIwM>fS@+{~dJx!*T5(A%*uh9ys76rXBx0 zrizhqcmI|DhWcRy{Js8EU5Q-u{5;b5(|@?I|G~oG+m^ySiTb`0k@)!aPkR#~B+@uH zgkYc*96Wgm3rIgA?!4o&3}egR=~D-XC-Wy%LM87R6`ierE$)al$#(qb6M6YZf}(mZ zWtQnHRkX4~NUSK(sa9i0m7?Be2q|hX_gS83MrVkATNP+FY0KX;R1+EJOVFSba@nE4 z<~ayVt3c6fJn<~gaF#}rg=~pi-V>ph7n~l`FpJu(ZekwQcXj-J%`5vjH$#7EfVo-e z3lCdqI8)gT$#v(bHsZG!C|aL!EW+oh6xwu3895%bivd?(xUJmzeK+S-M|rIkXYX#clk$}TH zXtr1p?^v~s%4@Wu=zMVnrnqi0NJcP?ixbV$*Ee-w-qTVW@?10^_CucGhnyI(S2$T; zspm$?J{ogl@i^H>2;N@1ikda|G@iM)PK}S}#NrhGw8M+$4_+w+t$`E2&D7jqYDzh~ zk2fr8;%N`IvyQIR{~#=tvUb?5`-R3i-hFB^%U&ItTk|m~SYg&H{I1orPBHqqg{;c# zS_=6S`!rS-+*@b!0_>*9LF^;o)N*YJA(c}N-l)27gO_)7OWQZDHMFrCMg)HSBseEfE zM(1Ze*`H4gJ1wOP=+Ld|`h<)6&24wGUHSk$?hm6gbaG80W#wJL+qs z$&laScB1mtlm9q*n)#`PYO1bF>XzU}SN}asL1oKW2vzMADo{$eo%rBf=hAPAKUo>D zVBx!viy>(X4(4Sr5GZ&%%1?uhALKa0uHo)g!fn2zq)UP2w9fLEW=b!4fiXy> z8V)wXJkWc15}KGO-52XM;u9sMhiz((ED6h9_nze)GN+I&WsygrKIr_~QR?OR=(1p~ zy!RVT;tQ=P;Xth(?^jzS>B$iH!Qm112*yJPK!`!Ktk45ZKt=Ulc1aFRub=~4o8&~W5ZM}E* zUyVk*uz8J<+U6&dBzx}l*LKg%x5a*WeB@}~z4P3B!#+V#&19~VeJJdC^L2kgT+F49 zU-bk}+PwLrR^kys>e@12XUVF2rVH(ZG_EojZsfE`l$=Hc`TJRUW~TVHtC5ZgdMc-K zayJEV?rywiD=Q)$jl8B>Rq^r5X{G$GkYSFRdGVfjF2lQuzgO|M_87dcv=9@8NT`H9nFNALZ}z$jp2{p-McZPT(B0Vx^%g=cP))gFRTiekS0cJgYs zXC$*lhmp1B^mwoL@i93IYz}W+z~@tyxx|gSH=$wwycHT~#>-5-2oNqD1|@y#g+G5< zhfk1!)e_zZ??0q&9;YB(M<{_1Xglg_%VBkMUCUVZyiOoh8 zWvppIsz?cJN=G4cIda_faTrGApyVB1r|E&aGSbYbWF6a6CN&SN82u85S?Z2@or(lW ztNInIQA2Gijs|t@63RUMV21C)Jq`D+S{e7%=1uhZ3efpQ+vYmb^1S3~AR|u9m>3$vtj>Cl5}m8^Tup46YR(2 zX{MJS2($}2En&2an&VVf9L`JBYqI4wAwQ(zo(kS*@9nH2@C|mud|uN>P9B51MIQb8 zMM5Lyz2UYeS|4@GPvz;*;t%pfGM{r0RQ2NI;jd%dWK%t(A&B6Ue;9JS`_8kfPiqp6 zoP0H4YG&C`a!ms5`WFqvKc0xI^0@O;sVgb&(l`6y`blD%-gXI={$xhv!mrhv2C*30 z(XTw-CtCq}R|aLmO}nR(Ig9_gIsS2B)HRfAjI{%qnoaJ+_hrI!x*N0^oZ8XMdeMTf z4aN%ljgKA5M!7;0ZbmfY$6drVIbEBQ~V-V0VG@l?miIB1dArGz;~ghiAzbhfiR zT?NkSiMI4;8Uy58oN(DPd1jV3F|W4Cttlk8;Wnbjb~Gq);Jcdk9OfE30aaEs&&u?0 zt~F&{3H7r#ZPR;RT;ON(QPpZM+6?W}nU43u6D`_iy{mXQ?UnaBRoKrx<{A%T%{8#( zo-+RVdP5mWyPl{zUT&j9XJ-sHv%B|LeGagp4JEUs((<@EPcbjUm z+g}#3b4n-lZtcKM>MuU?sJnyqeZ9(tdv6tZs{L`LePr-7EEp};=A{;5r{9-1NGhu) zdw#}Z%g!G#1hq~xIekhpLl;)2Iv14BY zYm*A+j> zVUU`H+(okq@h_qieGy*e^+}@bYkv>UH!nvkG$#GP)060Rn@Ba>z&juNsX19BBJ3rF;q2SF?=M1rBH5u2GBNlI38&wtRdMxP z`7Y{EP;*r$G}c|Pghpxoi^hjVBbvm5i>Jo3U9=VY8^fWD9LEX37-lI0+Zs#Sk9(sZ!q=eEp z{oBnkyAd_Nn6e*bm$f-Ja(?^YJf7;Q!Fe@lUUAA_$5(J?0Sb6<7jz&okSab7#u0zO zW`Tu74A+LTAqs*QVtH_4e&z$xwE{5~71_^gM8)Xo={flMOY?}|OQU^45ou2TVna;; zw|LL}&=zzhA2P>U=4Km|!t4>C^uYHFKATj=5^qTc&>;d&2=}p3@yH8G-}w0WYsEUj zt;9@QfBRCFr)$K3my*D#0|E}Ymu4nl;8IPes;XLh@1yhrCkKZVIJJC3DBpLj4JW}! zco}#>=_>(Hx&dt;sUsJ@q^oO1wwmtiE?0I@9i@-A$nU<9{oVADrjOHADp%QhYG*uh zYXJBtrzDd$>a#1KV|9I}U$+~p25zfsTG?_4Pkc{CJ;$$#HjXWzLYxd2ao!hor#ior zDnJgDk&9IgKf;D*MyKE1(DcXMusu`IB7FPrJbd3&Ak)!X_*GzkK3&ZX-_7V_mDVc0 zW*BzG7NHzB$&arkkBk&4_TwrNf46e=ZaE9+Cqq&-`y*51N-Qe*rS9*v#ZCvbvQG@T z*mq85E%QA;JD0fnLjKwg{qt9o^U1tM+Qz~{*^4vL{jAR|#w#M{y)s)8_$iH&-{-wP zt1XaH*k=13(4892Z2H5zWcf53I}oq5;7~@E!|Gl|>-=im9Kw_M+{|-m{z#N&>u<=k zD8@)>+&ZIJkvZ{?XKAc_L>~->33CZUoM(--jC*l+YV$q~Rf{3WuRm)12aA6X$z;8p zoiKQgyxWz$3!gjXRg2_X{N?|8Q`Rx*eGdf(wr%-R?N3@sO-%}69la}Tw2wQm?>)Gt z^dP2fn^!khq@%Lxc@&WE&JT zH2SYTOF$DH}eVN?ZH^5pM@ZBvymDL<;2$10nE2 z3o4M{+&DZO8PTzD6Se=hbb4`fyfimkGgD+(J%O1bC_b<|0@O>=Dxj%>*gtx2E#?xf z2y(bv(ZM#=Q2+b;c0fEGASXn0bk`(tOb`f4k(bYRJ9v#xc@Kr(;LkBT3B7aBf)dh1 zOnlfl3L1Svfj5h@)<2*#5xmNPWP5?&a#U!Kw0`b)|8=5p)h)hnyY%>IY=^$y;^ANZ zrM(GZp4qxq(PTXJI(f9M2Vwq{xH*dAV@z&JkJCQtA2~tpZze4I`f5Hugu-#=>xC=~mmn z8gQGJNx>>!Tl?L<`HPx|YTB46Sbrne$NE|kM@&Jzue$E^$)=38hY$nD#g`pS1e#dpC{?WSikM7HLDf1jHYe?}nWjicjB2zxjKa)**j zzhXcpb8t~O;F7<)fa25usOe-SJX7W@0Besh#Cr;&OrKsotG$QM$jE5RK8vMz>UfpP zg^H!-01Fg0o{;XzdlciaI&hV>Td&r~s`OJB;z3QP=yA=+$VkAYZ?Vb{Gh|+6I%_@@ zFWUo%xxq&l@qeuHu!XMbH`Z`a4zWm4mZQRZXivtzuL~YzZmJy_2+nV?Q$MHKZ;h7; zxMk1mFq{o>hjE)5pj-Q)EJB9J^zfhTdtKJD} zM3+z>B|ZB?nqN=y@j(xTR@K=yx$hL(odYUWB~}gmE1s=}E4ljPWmuoaLUbK!4LG6% ztOwQ{6^>QtPw?5AajK%d63ftq%#cRbslH5tpP^wIPYdT#$e85c?rFYG(cEO(vo@aD z5yERw%Z&zK0EO=PKm%Qe+~9QP z&Y-^FBo%6`ydlBKYL*Wzv^}(gr`u|spN%T4nP7$EkAjYSk^4114G z$JYMvgL~O6XNEGA{D zbP(6Dv9s3$za2!5+oa5c%aQm+{1@9lO|9i z$UqqpJ1Hrt?&89N2CDV7+^lTK%>Zw2zo7j%89mO=kG;3HY-=D>`9p?V(4evV-|-Hh zNNqP{L@`)I8rcQ!(v5`@lTKqd@Q9S2UVi1U)3o&#I+C2iYy@u}1qN(VJ3e9p%g=}a zSz3#dJPOs@+q;yJOefUUN0mE$?a@|A!_3^*qulA(_4v@%@L>`qerv|4tM?XG?FZKMzl9!6Jx0m@)e<0i znaTI-Iwp^H1UF^M_kwWh%kMblJ0dSWXa)SGaC#lmJb#>?qv1D0b@0nXdyexX9{X1C;g6a*(h=sxh_TP0Vq3Hn0%otL$yW`q)$yF^gY=90~U>}!LJkog@? zL~_pKUIayuT%K-Z(#6G&V_Qo6*6&f^8toxxsk2wn@ixrC3P1TFY`B{NF>hu1??jE_s5(6U=f z!uSb<4VU-(pG2Q|>905MTFzEHHaI7di=j|28cWnLp0%pCY&b(vcQU-`W=>gOXf;b_ zM3es9j!xuu?KJPz^OUHPyQB}XIaaH8&rki%Fm(MmtM*^7FLk>@8hpJTuak34_`?$! z6Si+i?xI3!WYr;<_HV}>?d?0Gk0d@B-^%qh$gRm4UVGRH#Qk8m=t)+n0*e&^3c`0p zpY~tXxKOgv#3n%V@ykC;mXg&}%65LGri`bZ}&1|#z!xMFc#7&|JosphR zZu7f-iNewO4~+1Fpr6r4BHhA;ru*xi6O-j;@TqcR3M}f4j#>%}_`$^Xhr4E+#(6`o zF(bbL{f~{qrcY^wL+ZDZzZIyo7e%g#5qi`del{g%RJ_|WK9uMclK5+r5oUt!YAtn@ zKP-$A1)LX-9qud#ZtZR$n*~?|(GBR<~Q8;1+F*wT1E_o<8vqg zE5pxw;dAAhe0kaZ?)<#)AgTjPjtie9m#I#vfhe;*2g{7&&LMrV4Xp>SCj|Pll6jKJ zq<%b}!>^hkw{zl3*Pv?tBv;wI6AeNoVu~0qFWm@<+(CM#^npy|rwMuO#L$tey?sGl zjF4{!-R>+#e!vX{8A9Aojiy#T?QL1Ri7Md%ehklgva>>0=A}qBIAih0lpaJM7CPxX zoPQ$8epl@A)ZQ)Z+t%u^gdRYnc3q=Z!2KVazId8^Hnne%(A*i!Q~%OAw$e5t@(Q(q;UJ?3Uh zN|8l>a|Ix6fF;9xTVL2HwTmB%E-x>ySAo#Me0aE;nG4Ll-Ra?Was`h?%uv;KGxZ!4 zDS8@F3PY?s)lZ{*}QqtXutzyk;2E z_fL=sx?*^=cBhj&iT%}_+b-PNc! z$vTY=}g*p73WmbbJ@OQ!Z; z8{XK8rKM=tH&!rVEiH+Qc%AZ@LnKS|oJNZ&6VcdoO!WBnr!l(D$7Php_3dAC%h?mc zf)~bH%TweIT2d3m;{nI7xYQ~@%x<&4yy|5{x+I?3-ZGCTmdM6R5Se?2NJF`Y*t3o} zd+n-%+O0o{Z?33(xWPk6hq>z&&W4tH8>p#G?S;9J<~A_x?&7F zErK}4yP-nve6J3e&vQB0w0l4O(b|XQwI=5Viy6^9#y?71TQv?_Yt76xoG1aB9EIZ7 z>os><==Ne?vod0~q0l8VOBD4F);{npG5+d2EUOVbe8w%w&%z!2uJG)inVCSfrQ2%@ zla5HG+cTR6f&Dnzv%ndnP>}jc+Vb&6p$6oi-9{t2*#d%US7@hUj4*xj<(76}VpKeG zuH9W={qo6^w#Evc8@>VGcr5y;9fFlXpeJ757Dy^rPame?qEEb#Xmz#EW76eMJ+PHq zT4d1yhfDldyCvjE<@l>C#&hsG#EjSDzUHl;y!z%she8o_hh%m4lA8}a(k=PxjC`7R ziJ3j3x#gF{j899&-Iv3n%Kfi?YP)deeIH9h;9`9N520}P4tbYPrfF;Y@IW;7s%2$K zWJEdd?E2s@Qtb$*A8d?IvrS8?v)a%-p{_ZIVd+cvl#S8!xTXQcf-0Ied+gKS92Hu0 zT@x?fU6f0(D#}Tb5yWvlWozGI>qYVfhe@M;qIx>16raq z1vh-#_)HpV5+0q_e0_xsUq2w@xp3`*s)218N{U%`+?WqPe;md4{c(wNjZVROI%i6e z@bP?4A#J6+r~fbSEk3>oqTe4pJw3(uh%oBTuf|9^3ct7a(qOKT#$AHQ^#43&zD8xW zuc?xT#55qyA6e3raPCVXJ!CwXPbJhY|I>95`%-_b-W&={J+EHA;cfH(dEe>&Q+_pL zI?jX@<^R5vlH@Wz7vN);k1hKF!So_{^Zz`=&(hwhT0l4Le;)5$jZc&N(Et0u%6}?= z`QN`F1RAmk4Hh=`&e!4pdyY9b^Ez=1A>5_^c^HIT{m@H7^goZoH);8ynlANyuT2vw zUe}lZ@AHS$&Q(?ZJ!10zdvIHf|9v&|i(B61|MyzwFB9MPp|ilugDvA>%{(Ik zj>rHDBsfCbWkJ-D^7fN(&V^z8q@~9Xtqses)Y{#-W0T%@%KzCruv?z%c5p1+diq$~-PI+q*dN&D^!`raJEwbKmWi6^dIr zT3$9c$Q=CVS`}wT=?lMx*Y?PR3Jc%-dqamvgxzX$01w<<__Wr%JK@XK%ybEsX|O8R zsZLJzewI0?K>>on-7%i7t}etzS6e&fKfiT#Q=xe(b$nz*ouj0rggi(!UEvw~*A?g= zC|w)t<~~M&bE_{krh7ljx(HI)`;S~_=H|Yb*Lp-4D-juXh{+Spzz#)s;b8kka^~+( z1z}#Nymd|v4rx2Tf5&Jv z3L!;Abo4>=#d`gcJU|6b+5H-`Fg5Wef&+avhlO=~cDC`3sObA;-wY-No^JtE7Eu?z z@p-i&zWS?q*|K}x2j#s=(%QOQYPa49ZWP(w8L^9^f&<%=qSPb-BYI!FL0hpMav2lry&Jo37dcAMuC!)(fMagMUc-j8$D!y$c*Z zw$C6w z6X4)1z)QM?z`4h_S#%&G`!&PV#8{@A%=SPhLhf-v6fMS%JfTJh%@6_26eMpsj6Fa! zhh3cKde?bzJxP8F_zzLmK5?;V-qyI6A^sXMgweKI(s8=sqz1HqTVuhx2Xb+rjncZ{+%W(L2S zNh5?TUjMFEYDDQEd6AD2ioz#COl?~7tpzmMtjBfY$ir~|FK9P%K05=C%Bgr#XInod-v6508JnkrO9~9wwA@sD{IsVvYk1CL;qHEL33sIS&Uk6=9T5?OYO8M2<+ku!Js{)0fr`ot z;^DUIzXvkHRtZr2ROAxKp1Xve>_!rcVK-!Gh_Ln?E7Odqv>h01i4$RneZR1^WGGrZ z-)-9chP($$bCX@kki+qz;*2QZ2lkN8;WGP@_W22}HK?FIU3PjgrJ|RK(_s^|;z)}76tF4Ki zo^3`_5+)49ZXizB8s!Q&K7iZ|dZeZnrs@)e7X&8~<$rlIvWAI$=<5DXPS#!od3z}dL zRL}be*Y&~sh?vpUY9>fw1MuQI!CUbR*l`RH$E4amnWLxlD1r7l3yQPt_}9DgWjhbT zXAl$oPw(6%R`K?Dw!gNq&O(5VosDRonMqeuQR#UI*~5479KBXgjVn{w0VdQ7hm|>G zVy1h@9UTGN{@+D!o-GQopOxzId2aBzojV_(Ahyr9AGa)8HOllFMKqnU0!hL3E7*v% zK*qq2=sWbg*aE%eI6&?mSb#jU8%3x@uQbQd&28_lg-0DhUXM4MY;N8U6 z>`amP!H=XYj-rO9%RjvD(%rF0LJ~0+&0JrYrEp56=pa5IhF#-o};Zx7rLPsZC_XXa1EQs8=^v2lvG0p6wj${EopSu<&d2vW{S?I@&tPt_+_p zE`Bgzv3mRw(sE1#k8Y<5IEl=IgX;igY52hlr=D4Adyd!yQtpn8(&c8dJP~(BbDyTr zTa5u%U0+nhkQ#bk7N1FD}` zuNN>tROyiJ$Mi(xv#wDUuy{UV*HrwZwWJ+t`*V4p04QSm_dhIIyI_{;p~WT#=OOKm z&+5Bd?!2Z{(Yf6NYegI|uvx(xgaS@e$T~p+-%^?}UYlDt0Z*4-uIP>R={cXu3kHSv z554hmzh67EkS&%2e8%x^MRq=7gUUh(xMS3L2t?aSp$Y zLL`|~U+E0rSpD+SY<08}fr$R$#BKRhQkJi``J%XaV&YWN+IsY%OT!Tq)3iO zKraJdw39l;i0kV6psUM3UBFIftm1LoaM}{1J%=kS>%)hoSCJ*P58BCIOmkcRd{F#W z{H02oz=+@0vn=0m*<4TJH+GEyI|YN$;%BcZ!GH>+Q7%~G;(*U!H>CMQOCGsjZ%fR$EMz_(=06SAX#5l2kCVBq(Z}bx+iS}Oow9nY;iN15$ zFC&udImazWO3FqulbzkxjTyv0*JE~CvDfSapOR^j(i9i^sk5*r)>gU9iFdcP$r#mo zU;~>={i9as^dFr8b{3XWwkupILa*iL-X%JQCgjUVnQp}?{n4Ct9lN?`?#q`rQO5MQ zA_(Xtyd;SzJh71+h91GKIoLu1coV|1oslXnarfCuT?a(p|670E+ELxE!SS8%hWh^G zyN4}mSi+Uwye;nP1&i5n_d$?CnVb^aSYr5N8K2Y^cdUMOst% zC3PbYM8RY$BZGFG5Om$=fv_ydH1WCnNqgcw#jTt#`3sza<~DB!%=K@`2Hfn-Pz`-! ziyj&JTrRhTK-Z&&LKin(6;ei?OnHx@tuHMdn&rwxGD1MsBgn&1H!`|rK!Y=8ZO(Uf zratK620Ns6_9XGsF4ZGCyvJU=?FMMiV=zy0Fa#$*2FuL}?VkfPNt<7nV68}n8yY-k=wKuM zGNvnI3KIEjogy=*)G$Fuqh=BlN&B`jS1lQ{F^ZDLO2M5A)CbhaD>g%u{m&G=UihEy z_=;)rlyPUdxTu?>FWf5c&j~MB#N74t`hbPOo3xvW<|;9KUsp@3O-@#J{_;Yz$-&tf z|H+df)+@I-22<7?ZRfH?=N&V}H*YkWL!WkJa8>-lZcgksyzl6z+Bb6lJ~!rNdkZdb zhr+2lIF@|Hzkml2d3-HlQdCuy)6*kwgaCQvL@SDnRqTw_rXY0F4s9O2FT}A%p)6G^ zGRRcElczXu7RoFBVc-5Q@XhANHj!w8{qD!YMJ8hriL;mL1!vl@Z-Un?2Q%NW> zk{#+k8yARteTT|E~+Sq3TYaNCXVzNuG zWnQBrVsSqrGF&jut0{_~sV+tb>EHS!Q?U`aO`_0Rtwy!uOn{f&@C>JmGRk;Q{_#xL zYLky14BF3;X6{hd`xL2A;U1n~stm;_v~k6!1luUx(_dBzs~iq5d~jxIVS!qzXJq#E z?Q3i8qAoY;|53*W@|4J+m{|Y=?AlO4-%XY9AF0L9a*vF7P3REIvFy2Tb;1)R6RXg% zS_yDbzlvtDu%PsziW01O8UVsaE1=-6N*VA6@tqkN86#|ZQrD+)WR)zftwR=tl2cQ` zHQO>hO$|24H$cjCW9_pDiDlf(W06>e(xqh3QLmAtfYI!ijsM+jrL@GK=YNL1X0|V_ zZH($}eGd?IPnUZ~Q#Jj3(TlO6&23LK8l08add90@l<_7PI&g@-VN^-Y@;^cDfI;;8 zP=T7;K^aEsH1(40_d9|P(Tik@e5OvL?H7?`Z!ZyYDQRhfS|7DOfSWGvQPZm>jJ$nB>mG5zg|uqmUdW$kGCB=o(` zn;ah(7Z*!QOG!w;Y->Y9;=H;6MyM9B;jt>~1V)bPHBU{exGhda<}tEy+`ql9K+o*7 zwRaJkwJ=>^w~a(IzuZn>?{G6^Vq%&a;M;~-|FwG+LU@!jM1{p3KCGkK@O=xkv0TwO z?NJZCC+_AZdGb0Y9C7^oxBUESlGCRey=o1oj??9ZoiYqbkZGgKKl38e8NXc257~T^ zZ9ozItf0k8+%S~wZbKO$Vyi$_Y{ZS5qL1F$!}3zk5vL^MMmN#ga68@AlqaD|M|3U& zy#}XTQJ~XX9g1#%f$y#?F1~R|()iiaxfp8Wf} z2pI`BYOP^nNS-LwD?%?3npymaP|p`Zl6ri_hUZyC()SYYe9C`;gO9&s;CsP&?>0YQ z=@6n8{r@$qJWYfWOrCf933{CPe~;{^GYD%lmwPB-z~rmdriR2q8+nG=0<|;mty>Vk zru6+E1GX!o028Zf81aW1C4+w>1SMQX)2YMT;@ldkJqpe8Yo9cuax&tZk;%sN&>&D! z@l*35%i=BgVQFBCd8x(9|I(|&>&)L*0Ccnh9C0p@oc29+J1pBu*dqO2zI#W~ zCJ`<>wQ%E4R`Wr<1`!AFB_seC!vWSLvbvg@;8kCUKK)-*43$bM-}9m(HYA8a@Db-% z_VGv4E}vR$wFQha8&*T#Q=>D#Ddy_+JRBfKm8_n9vF6@%>G%^7F~n@oZR{<)p&u1L zb{GU2CID1NQH#HQf9O$RJ8%O)%+ioW2l*DLR8&;V#v%&~w`k~}41;M^(unxfJ0F*P z4jipt8qaqgK7_(f18HrY-v`b(L&(r@+bGBkvcFm{$TVO{P!!?d=s7>=lW?ISCLSbg zPMt)9BEFcVlm#m!H1E}I+i(`4P>gPr6;ef`I(IbP?>CvOEf>E^?Uj~2t1d0|y{jqa zyKm_@*VvFlQQFApu>OM4vWC_4^BGemuFz+MF( z)gpL9djn=If!Gi!C@5$OoW}|t4h|>dbitrJ#!vs;PHQJuWKg|F8fxVei*mPqrFZ+! zaQyX0%TPhk-WKJ$S?PZ;Qx({ylh$b0@4WDyHyr)GIKOO_P@of|;;w|(!-a@7f$g%P848C7I z73|KXJCe;ExWmedb8&X`0%9KCr=Q$g`eo92A$~)unK`$;YzvaY&fj2%1RIouC|lon z@&p}t=ukbsfQuh!I*+L!a+8Ih|0t&Pd}DLd;SByP8u(y$P!P9n#WR9++!Ur%HT~m- zI^SC8v2KvaBDKjmQW@sgp6c$^7b7V(B6OslRmtHXU{f0Zdc-hM?P7WjZu4uPO%q7K zFQWo%BQznRXgO#YAcm&IEFNU+_t-%Y-arfL;=hn@=(;y}pIYdWDnmS6)}7A#EtMcC zU>&YwzrmP#IeIfhp5e?DBv(2Bgwz2es+=ak0a@Nusn82b zcAl#0*#n;GT057rr(8ElGZ*5X`^`!ZlWa=r-1hi_y-v=-5DQOvc||D=?1-)RkN8|h z{4W55wX*I}`wbBSokOU zXOqdrWe)w1pkeq5)|WE4Qw{iR`#~0Hn;C5hkN~GkNJ69$6BA=X)jLre_l|4(n~;X; z)Wd+y;!}~&o^%Jj5GVNNxumxVp@eTUd(p&0vgp<35urx{J8tv>F0;YwLvo8qiDI;l zf&Mj?8eflKq+G}IJ9ZVeBN(fkMxn3K@OP*GrJk}c$;ik!iUj@p`wqAPupxKl^rVeI zBfI;l(Ph!9C&o4I%=$R=S7tsE3l949Ozf1SyL}68mgvt%#XDnlP1{ZVoG<*yOP(wPHYAQ{LcF*ViR^|5-$ovfjCXzQs;xIHROl$6pW&u?5cY4-`2$q`9Y z^3C9cTe2p-sOTm!a*_6TClT#j;EC~Rp?urB8S-}$(8_oSdcJ0=Shg37Lf0*cb2X!v zxpkbxw6gQPeFgoJc9HodlK_Tn(%OjBeQxq)4&pT09V#ay5CWhJiB?rnN%sQsK>+~I zKfD+5WW{Rk1tfO!eWk?1r{wvQ10f``7rU^w?+PFx;_s32Mx{;PRt|-nT7a-OrvLm; z**LSqw%_xa?h;qDs;d7SZ%>s;o5Cdl&<-?q;B{3}mh8)Gs}L!^$>D;04QipMJ_MiK zf(yRYE&Lda6uXUP4D8s3=f4-Teb=KkP1xcAhd41|h~l^`^k8Oqm;?;(BNvyJfGb4u zgv*2gdf71S<;%7hhHnq<-_Mil&@kpT^Xv)t3D*eIQADdaaj_zGDjiprOPY2fyvNIg zSaR6PH1ZcH4(^PpavW;l|7AB6ESmq-AXip%IQ`#ry*Ca{Wz94G8{fnDL*yO@FUphL zc0eei5jVdkkbBN#yY!(TIH%B+3)h4fxq^m)(Z~yZi%@_ww1IkarW&$hfu5Mh3qNVu zQA>-JYkWeUPg~yJN~&Ih7HrV)WC7p)$RwsPJ(0N`&V;CGWts+zg~onvA}RX3L%#Sp ztJ9Up;ibe!4FM^`IDYy3~!@m8HNm#Z2@BfdmLL|%Zn&=zU*hmhDiST93E z7hqi>7Y`5u0+>8QEAT8M-~7;e^B^HwWNUF@L37CVyGSL(wCx`pxUKx6;DbvW&OEQ; zbH!lT0uTUob)-5X(F!lp)@^x!K58*0B_$jxQFB=RfZ%5k2h6O&@jwqx&q_=E<8D~` zk12ukcXs$OHQEzsJ=SnH8XrT8rm19TJ<$fLTFRXB#pt~Cq$L_s^Wzu{a$!5N(PCkY zk6H$K3&v2!moSDd`f|FBR=%Ss*O}rlBt?eA#Nfs-V8iVj!w?SOaQGb(GvId^CGU$r z|5j){Y;oj0&j4|fG0A^O6x_JgNj^x~J$StH;@no;IY9QZpeaSnpu|fpZ?#A*T_o>5 zmN}Q=x!t?Re2HARy?{`9 zun&~pU46b-^M)vNB!$aDnG`WzQ&&uYSJyckF_nWKec8^y{~YaOV4%wAK`aLZmA#_w z*c0vJEIdpc?&;ay2P~u$blss}<&u(^XnhUL@5NBh9r*M)K zv)Mg>-?xGis4K1%!F?NprJGzEqilUGJ3K_fW2HPNssAA#FGqQw0TGn%%WrMH*d=4IC>+m&)R zTLi%zS!AMeHX6d`ZxyPQy%A;hMvndww|)ZW_{eg9s*oE!bc~|FIrhD~yJ*4O#c{Ye zbuDfn7Z1tyL{AS3zHvxn#e?;Li;XJu*tc)rGVWjzA@mFkHdK_A3CYP{1Dx(} z-+SS5UX>v#NR;;)IX0xn0yqdw^#df1fs-A21K3X99eJMThTnOB&-Iic;!$=mP?##M zc7cut6-JVP${-(fOI(jOv|q?+CNPD(ef>K4OBhG1bZ@K9gGV=+Fl+vL%PK4Xnxp8U zSDz%vwV7~n#S9Kl$Z$dXI!i7UYUUHi5DpEqbfX7Mumjma)*Uo$%xaK8rzfJOehXU^ zr1r&wJg$G;<6Gz&AYQ(=v}7xGoWNTh>9&l-_*aFjtAGCP1ABne+>iLezr>n1C!jTo zB57hWtAjA?&YYT@jLK%V&ydS4t?}8*$1r6ooi5L7%@Twi39``BFE|XxK90CkgV$3V^_5sj$k&7H%@p*?(x`Ew!FSIP(0P@LzkaadD+CL_k!IJ2-Tg)!OIXmdeC8_O83qy_{%g! zWAt;zA_J8?q-OZm)*vo6Z0^$4&d9em@bTZ)VCUs6-=H_(v`tM;{v{6G>Twu%;ax05 zaLPb)j#<#1m0Y0O@U}{#6)Id;(r(mYK)alW+N>VfNt{XDg2~CrU+pXX7JzCaVFV7C zb-0cIQ5p|tNosU01#|uF(y-9b5C#P#moRoR-}xP76+2H}6|MjG4M`Gu)bp{w9*WCY zcyVY^v|Um)5t`(a|B(lE|rlV=eZWW@R|%w6*a2KgajtK?^#D?aegF@8a|aN@JO@ zHZ6`-YCEU+l^BsG@}y;-hAOG+bV^3>DTHj>TrlysblLT42z8~u$ENF|MHMs?p{?{7 zA}|ddNIr;a+IiGIFHDu*G&S8plTsD;el{i&htNg7r{&1QSzNjoM(`mFmm&n%wRh?1 z&6PM9iypqIX1Erf#5Kdz#YC(phxGPS9{j}1nsH2meM4qP*XPIC- z+AV`DW8E!iXb4PLhlro)<-p*L*hw?5M~^~$A3eI^lkwQrw$K+oS(_$hJ_lfP-_|Hv z9UE!TA+t&!d;#;Xd9bjl+QU}73nva@F7q3+t2x5B9d6eY=<6s9s8_L}TQQ#?a4HTH z=IJb{7hXUDe*%ftNVqh=D{yOOArPj(eh_)35HlR^=+Y z#n<8H4&}+oCcvC*uH$;Pq0HbQ4wo^4$f|M}(?MKM1W82ub>wXgn6ze}l3Sw(cmI%i z&z8piCI^>aUpv{FiN;FK+H2yg9mV?Me9lzEmE*$lW;E>+O6$q!$`2Sm>DkO1F%aH> zOa{hU+V#=3)^;H0A5djdm38<9e<8aHztgP*5Q%OdSX+onc-aQWEZ{B;lGr&b9lE)dmZ(ui!l2O|MD5FBisUiu4Qk+Y)jppC|=aW2Ze>YdrM z=BB`*A}wEk$&DseAer?!EM`6&D5rN7?c1vlWr)=) z9^wc*WcX&1pH;u^+EpEIYMl1?{=t*EyE7xn#UFmUf6)H?!NIS1Y%?DB9ny4XW#zcl z;fUa3UoM4R`oI=N(#y+>H5d}&P3HhC273OuO?|m3z($LpAY=*KfY6_HSQ$ znt^<#@}9@)r%tRqatR}tS@0WswvjF&#+ZM~=ak$3O- zY<d3yAmAPi*Fl(|`3Fi%!gqmU4U4tU)FaG^=UF*O5exmZG^k%`6 zC&pu>!DU-^q`|g`5|m^_f0l_)o3*KjmO|^FhGepmxt@ zDy^=;6-WPnYR120n!<0iGfzzKE(cbymg6CrX-19X+4!x8r32qPz5f3n{3qA_P)vdQTLdcQ(-l{%qe|A3v)Oeq<&FWn1 z8-F)RS^Iv#kz_>VY<;V8OxL&W%s?6~Ur5Ai4HI_dIPgFRNU8^F(-9A>pdTMnqu6sEiE94K``3qT?vO;(F0+Umo z5rNUqC-!r6w944PV3Hnj)U%?3nrsF@#a{rU;DrjxO-iceF2VsZEUe`>U=u}CceE~W z)tYisi8L_N@8Z>ojnL%b&WLZzt0!Zm$iA86IE$smSgV`rA|i1e5nU#xq(s3%h+32y z#P4@^JB(3j5WhI4R{0UVSKpD3^8r@ChB$=mD;{BC-y6XnntU^D5l$$7v-$8kILH%Q zvsE1(9dFpCW@sf&T0McK^p8a4QwSu90kK>MG#5epX(~K-?>mBZPznBrI3^x1K&LlUe=EtA00bD2-WhxJ;&~ z^!7jwJ56qrlKrWI-GGF4nxlq{Mz5Mh?-X|}^=nI2!jzhknrc|2k3C3Sk}Ih;~PFy(2T-s4gI73;2_={z zTwgIS{e4a$*)ytAcDBA>zmk8siE31BD`#|wNaN-zGg8fuA&Zw+*>p-Y#-}Dyc-RXf zkjGl$$YZkYMRU3mHWro%)66S=S&i=?nn57u%EoBz`BI-IS`knhWJB#?n#26*Ik)Mr zGDooF`z8624iJJmiVk|ctS*2LhY}O+c&>Z={FM)KWl@tM_&zKJS{kIcZ?}IO*~o?D z=2axrw?@zjc1+C3P*o?fx`M74tVtxpVP?s+p4!h&-TnpGNtj;!t2sD8sXzF4t{m=2 zqV^4=@bqE0)yns$@%M?tM}>ui-m z8+o`}{{rM2LA6lMPs8BwDw~hUx*`^t$~!bTID0!><|Ryn@^p$KxeaES(_fyF2CFcu z828gKUo@fW={rx$$4xISE*{JR4gT!Ia=S>d8@422y%IeCVC@{ixP#)eC6X47! zt!W>6L4etdtfvWB`N#c^k+6tVE(!IPF;>o(0D>uJmhnIC#GmIP!dNA4;!!JqwKs4P z((Bsv-n3dBNzcy1lpyCGTxdXPr1!?e{8LZD?IxQZB<$a~J@EaUDdkOl=xrNOp1%vD zKZzLIMR2oN7IJ%?QV+@ZK1)orRTI(EiEafhob+oiRU$E)xY?VgwB9ayYdWZ`orKIo zXnaAF7HdhIs6y_*Yveh{2kF3Ha;M(5m6Vzcad1`lT|kH2+R7@O32UL_9m!%2`V)l0 z1C?sVJk7^CMU^OsNAz8hOkLIoE4|w4B<-Nw0bo86j9!v}^^6BngUiOKhr}=$o0%FI zK<>Souz2$1$^DD-Cf&@O6X)5Skwadapd*gXE{=&tFNb6k#xcIbBO<5Cs&4bvWP$=2 zS+Sa%iz`L$yxiQvRS-zr1Z>R+XimgrWJJNS?Cj$5d>0i?{`}Ggk&>$PQr%E#yWLI&2G*N>2Y@W|CkRaWLVHx1{C>r_G2Gy^<8O$gwVg6wjz zYWC&j=Z_{3CNW|yY_-0+34G*r^F;6!C0aQ}(@BVb1bF-kKoR0VmXupqh=u!I&)?6_ zAQ}`XbpX$xKu`x0b+gkqSR1?|+2Xf{?jVKqF>nMm1 z1^`6!=0oAN_RYE{)#|!+O97&e%)KEsi4p|YRHv=7@Q=j3F|`a)if3Enr3A2_ucJTZ z2}XyWG}5>`hdYiZm){FcSD8SBq}qkqXb1#&xolD_=aPr|R)aVCoyiwSRAPYx7ZoSf zJH%IrDG1Mm#&PSjzkvN(sFgbtAyY_S#V39Y zPWMNL3A=Ya(=j45S|a_`T%ENu2PgN_ef!t^-suXA65onXKpG@A;9!QSi~1+(Cv|Cx zjAOb?l(n|);?b>MBDx-xa>F^ZkL&H;F zJeq;(h>8@`C$IAuZ|_z*4`Gx{Rot~9yM0{i%T_!VTQ11QdQmRTtxs;;A)DXodOgsC zZB$zT+I7edpik>;+q|ub(GKW<_!Ni4w6ybHIJ?d+2<=Q&R8+8qzJ7~FxuldQ_M=$; zdu70`*w4Y1=SzBt^1lDZt+!9+yt~6A`B|!}db_lXv_Vn_I$AW9A*Z5P#Z}*81_g6c zDZ&^#R^~3#gkTEL2aRAzi)7Pm`>5-9mKrfF;PmhG- zC``*B@j!m^V_=<*`)W^9M)LdV0m5=Cd#4C(V}nGUQMGcmpEgr5!Ec;MnU;}Bk5^5s zaXv;tUx^U484@UQAn`Z}Wjw5w_pC2j0@>&eu_-er+fxu0PLKHN0AgE6Pnft#_Mmxc ziVFM^H6H84*SHYqrX&NzIa?(CvqA1iiCXpPU{K?wc*$cavz^!5=LGa3j!8{&C$5dj z4MLhdN{?+AnXLtZzdVw!F?8~K_AJT?+yAudp9x;lP+6RD#OMd>G0QSUF-&j!V^A^i z^=?S|_y`RS4P|Sw-i_}9DI4nwQwdWpkZrZhCdorTCZmItbFoKoP6oPd*Y{rJ=N4N} zySc^-6KL;_{p2JiBfD-+A%d@A1R#-}@5VE;N7~z8hcx-2V3oA!e~OQf--8h@y}0=0 z5EvIkQSZddGu%GuK-8xRIMq7CIQex%gtVpQlFD!sO9DSXf8@yK5p><38Oz=Z)0S7I*7PmnH{}6V_v~pY<6Pi>O;9M0PMvFf_xLx!4 z`gao9+IJ@7T`Hn|d1IxS+R6|{m99^D?5!*scvj)u8FLpvPnDK1a5-RpL#eBBU~;<$ z`8+snnabtx@_0krdesiE~tTwfMo+^on?jKFvtv<~#1LP043FPxQ;5cb`>AYy*LKf!F@|Bs7-p=|^j zgFi7u`|h!^-NgM4_dAG0!HKeVpKOGSgHDbP4vXi**$N1~<=?;mC{#PoDF0mHYKIl&&(WAE9fE5&$uvmc2X0&q zI^;j@#>=x!JIIiGXg?URzl8lx@&2!#9wp915gL#TM1VLu8wul;Q0gZt=j-CO{aJJ; zyK^py$;q!_O4_8wIgOPCJ&f?S5xz_@ z?OCy{t8X9T31%TSdfAiAyBqr&FLo$|qt1s%M?pza?>hrFvk%v%EzwO*rB_ieIM2`u@atc^1Zob6epHNMb zrS(rG!%7J&gqf?bO z-@5AEokgawQg;8W(c}7+5>|Ts2&(aa1ElYgbMxT`RXIffbQ_K$@V04#3MB-hj8jwYER0Wp&4$IOs zX@Y&>cusu;42*2(G&ZjGjZK$dA2eXO1Zxf?G&jfHSIQbmG|_>&i0$$RqRP+T|0E(j zTt9NK(SZ~4$GBovPqEp%Ng=;`YHO}(j$K%o0)SU~Fc^J+>~I4$El78Q%x!GQ7!wp# zU`ba6e~~7l>C%{ASc>o^2rHm016{AOva-6S=8XmuQ?nH_%W{ugIUFj=g*_c>m3+Ju z$}A6$XQ6rDNC@cUye==Q-8b)h9FnRQ%@JSlU8!YmUHWqFbMhN-{_>UAHBFY*%aC}V z@Sc4Dslc$Gyw9A}(C{hvPUzR4`4=r~hgM`bjgH*?w(I(Ba*u!SPsD%KzJG61K}m8N z*T7R;v7(meN$Y~ixC?V<-*eM6L@9J^^XdUlE_v3W`-D&@ohLc9Jtp1d57wnJj4h{~W3Q&TqD_A14M!T&Zzu;*%D z<{Y=@hSvD_IG>7w0?SFO2Y$in-=j?m{D}7V)8FFj&d!cZkrK~dPW24M!$2!LJG(XV zp*PNB0%~%y%tSeKbW8^Z1qEL_o(X#-WB{#8Xp~hNY%eB{lXr}68|a0}w9EK;ZjQ$? zDC|3V1bnTm4F5CQV@L@(ta@}0#53o<7*;zw!UP`#v>+F$!W(m z%hT7sm$)1oqw|^b2j`HrgY!yfz|dO%rZE}KA_dh8Cejy$e%14mFk^0?Ku%2Pq7;wV z@`=L%(YYLMoFdo)QA7Zj48-D_K>B)e@a^Nbsz7ViRSRbT3%-QGbukdT!G8_n%nI zJ~k4F4h-UCLoPQI@3a(g-;NwGNA#mfalug@j%An;?IG&SFZI}ez|Hj)hN2r-9AJkt zP>WlVk7Fo-NL83x3^XB;e|$u3`BKfJtz(lu5vx6315Y6c(NBvf_bbZEYI8L|64KB_ z!YlJaC)8@MkHW{p+uq*UxqMutQ?kL0`ywBylGY06n9IvcteZEbfo~WHJkU85$Itdu zCdrL>q4+dsf1rk2xqhe2Byh9?79uW0BcTE94#M2tnv>_})H5l>iPpe?{1Tr12h;-B zsXx~^Md0ii$Ky>5LzJU*5S3KGwdK+@)|@Z&S%84Vb0OC8UDRMnAHp>*m*Y-qaqYnXeR2 ziBto+iaLdnEu}(7p;$>T1}qbkbFD@3ItA2J>b)Vh!^Uwhv>}} zt;n4;mV0t`!z{y)A5gtjb4K;H2j}hW|gH~r5fqkU$h;HhXT7P%K5vJ2L`WhymRKBrWDsQ(p#B@mAaw- S_Q^6g-HiOEcEh>GwzKQ4LnQ7d0oMrP?pM~6dJ2YZY5)ct68i5WU` zhtbzC3=sdNEwyi=jVTL}9IZTK5^VZH+9jrS?}$I48cqA z4qRU2f#Gdo@T52@S#h%6e$9D9vI9;LLVYQ`nAfq4u=uzf5()Lo3slmoykG*T2l-96XlXM9;LS{d1HXJ@?2ClqgQP2qM@3SB5qM4p zo+ggFdUPF8nUbJlaZ4r1yZN09PK)2+`gv+^{#GSzEJ!f$=SxavtQUKE-DRIoSF-Oh z^`6j*q0F0c&LfeQbo8y#5vR;07`r(pzm11)j!z2b>PCNV14I1TTN<%J%H}yzk%g;L z!JB`1qDC+KUh3T65n%(5ekb4^^=s?u%9-D^9#IK$Sxlag3yzXeCcn^hmvTq<)6Y@w zYzc-;I%!u|F7nint4q@sE|1dw8{~!jltQD9!84enNR8jF8B&H`YpK)9iK`6q)%yU+vhk+4Ze2c3ZBeedje zd(#g-t|&x5DE4(>;h_eLdx<)8RFHJETJ?1bB5MM@fPg@8tN)WCj&}H^qRzW=T@z^+ z39BuU!J8Wjgq=UTqymhn!BOzKv)ZNop>=Ql@5v9?b+&Rj;xz%MWrXO9Wvrq)vYmsP z5-LzXeseus;~pBW81@dJjV6vj$G7NE2Fs02G)Bx9&J-wCZ`!O5v6H+1;wQLMJzznpL1snJ{RCNIxx7a>1}Yx7!a+*QeZ zsbJkhvr-e-Jz<$glr8dTjo9HUx?&(EH?L%i-bZkYKy3XzM#dFhDSkLU{XIY5Tpj>X z%%*OM!7`ssFSRqa1{xh59mrsP7zBM{FJ4*{2C^+3-)YbW4Wo2be zBFu~QcMAM{k-jCy4SxJ^>;XUAOE~^!f&=+pS%sV>aLV>Ke?Lmxr|a4za#(qVNEZuucc`=23os@UG^A{OABKp8GIl#gNsQd=y)m3s1-kFXS~ymFY!9 z&X|MU^7He{pwWOG`Sz_cgwsll_`HxMUL5`uH4C;pAzW{0r4s8qh4_|62C(IcyYVTy}#FTg+1| z*+YL!8qN#1-j!fU{c%UyYEkkz)lySV5(}t4$r>?{aXw2AamH0rW4O-{Z0UBdC@rLd z{i29<26P_pL6%tF($Zo9ai1aZn3o6yQaTh@3YG_04trPN+6jo5hQvs^{z?bkUFawS zT?*VMqWzmKE3V{#ei-7zLZnPg_*`9z@$m9MSn1vFzJeJe;{yu#yxxf2w;|7Ys~;xY z@yV@duP;MXv9r6cT0oGuZ*k8@#LmmBceB&AG9yx&C2p z9{X4yl9>decY`k`VjuGJ=_SDT2^@@X&@FHRWq&;EuQTAv`IW|NgJ0!5^QOOF9Tu=$ zI7T70JUl#7Ov+kg@W{wRzri#eLc?_rr#b!{9Ubi*u(_5MeE9GbnnxC>sHk?JT7n_| zE6tDZF5*iBN^(*93yr1UQY8^ASn2VZgvthYaFU~aQSTfmvkR-XhOj)mb*huz5&MKh+5mjY1u}y?i!rD(HErh z+{N0>A))hdv=Ed&@Lq+QECl?#nZV{B0TwzNKYo~jjz0y#e1Crl_&@J&f~L6# zhm7qzAS>WOzWfO=m4*1b-_m0He(nhEjtuv~0Ohgvmxn_BZR&93CDY}3eEdEvpkog`CMyfu3Q#sC&rJH^0!>Od?GKf{4gIj?p%mPZ(Ks#X?;I_l4Ck$rO z&dz)Q5rc33rZOsUV)1~Jg(d6R6}ic>smJxz)z!;zTXg(jgDVWp%F2olH$;AVa?%xw z*hk~d$iGwTC*HzNb!CLso5*#60-c%m0_xQ|PYl%Fx)_Pq>ck!A&cbO`#aVMcBL{|h z>EmjR1vaur_J{LX>nrEhqU5Y9?`G%=W4gHpc|Lj#i8F!~eeZLy=hxOIhjCdDY)Ehs zmoL`Mf}s+0t&?FWGY{{QUfPSxFyHSE(FAkJ5)4*N%JT z0y^*%K)5R^Dr7atfiVh=FeU`HjLOIE%b6`gV*LCIuvL-rB}E0w%e7zNfn~;n3*>ky zjXr_LAeb@m2#qEhlUB^R9a?_qDT^Ywh8AEJkaMZlCRplA3Wpjb2_W1mXyO&4X+%IQ z^tGm{svWGH1wlXMff53P94R3-woam!9MwCgrXXYF#BURDub1kdnD8EfN<_eW)A){( z5;HqH7PK1eKv+RK|Lu*aUv?NQZ@xbHH$ouNw#<~EB%3Rw9GOEfn5n`$TenM!8Vtyj z{8b@EcdLStQRXvNQroi+p(!${vUwg0OhznnL<8f?i(}WC|GDA5)eZSdrmT>d5`FtZ z{KfM77;_KtvZ|9)j11k6iWdubywVM6faS%(r1575UOUp+DbGPJFSoKRUCTIprByAH z`VWc1HD%6=IECDMd?e-LqqDQgxtg4^8q=i3xM;+v1cFJ)Q8`O_<}7WlEuACGY)$7z z&mU3hT@N;O0~$&@LnC{xLwLMq+q3)m&x~>28`Nd0jo91;8_&Wex#P$2#%a$ox4e0h zmWA9p<*ATc-oad}=*wrLmND;S9}`9{*zf5KqA;N)XuW-A%`v!Nc?+qrP6PkU~EZ!N2+kcVy>!g1ySnF$45>$NBQ zkc{#xfs#Mb^ZdfEGW7h^{A8~<|g$^lpp_ec5=MDnNKxAX^3KZOR z%z`=pd~@}wt`r%dr|L&N-Pps$=5L1W9SOokQ4q_wLVZm_Nr?rz{KUk9w|7~;LRsa; z@#3FHdYn?x$5mH+TwJbAXKZ}@=OG~&_tn&5laeCgK1>8lD0I{|JnOgQ9N8onLJl5J z7+9?TDqz||)%^+ay^(3#j8k`QTXJ)@jsWk8G0z>}2_egy?r$FP`OO)s*{D1cJLsp| zer4^Vo@P+NF7}Dp$i&##+|kiUN-46>#%lPZiaC{%S**_F_~43a_OLD!@pm|TkB)X& zGPANG6|e?{i%lT;))s0Gs2qua|8a=j;($77DvD+hL@b||!|)oedJfe2WlD7>oEhr? zmeX!Q>Eda@u) z%G_Wk{t5=2c2gBMU@*B2gg&X4cPePF-Xqod^CcRs%m-$0eFvL!YfcsxLo&j`drt+qLOn#>L>p`0Fzz>I|oPf>$HkErQsF;%#?zD54>GMoZO$6l| zps}}VONC6KP}c1u1=@Dy`bD3B*v<&*1jz#+OKl@R6k2^KrI8J~p233!<$rB((Hbqm^(dRDvJH=IP`LGRWZSa&vOkN%f;k zX71h*?qwV1P*vv$C?s|(rP)as7?<$|XyQ&0mzwSM76t+_B7(59k zLp{EU4B8!DEU?pW-)?gF(VJg`5gvucza~<}$*+;C#z^dc)40(WOOD?(cUZzE-ieK{ zvG92%D*z&l$O)?(7s=K6mjjgAqLL-TOSU9S20RsGuxhHoy)yBI^w?6;f4KxNu%XBc z4?O<+TP=>&8?Fv(>*R4mr%5+6WI@R(9N$8zFPRf7?Y84cY4b_Wy=+2!wYKRm%=RO3 zHv-#~qFyV>_}h{D?_`q1WSXv8EY-@^CxdyL+~KBlODsmST$YAh932s=ySrEJ26Le> zI|~pk&#Ejt-lYBMFJBvO#3KD7pYc@{D2H9FiZkmn|);^rA!#}{&v486KAGwNrd)W zOd97+FFJ(SBIh)99*d$3vp5G%3(w~-=H83m#*?CTs!xT}2KoipWp^#&!1R)fvTI&8K5-Uv$UcW%b$pL-0t5`U*N4jLzlI zCcR+I({{b0UyBZ&y7NqjGmSa6yQ`-M4@Ri1uw{?|G@omvr0$!*>tumJ*QMjgoN~rP zx;$KVwUHZEY}bm9h~K59Ey#$A*A*P|eeLaC*XAf9b8>Q01F_1(N*gse<)7&A-h)cL zd1JDCaS%G09bmD>+=7naJ+RpbfkD;*$MX&#(*%Pq2IUo-=huStV3FK(7)A1)LGOL3 zzHxz^?t1{GhGG)XY-eR==B*My-~(9taU*1btWZ0&VRiW@Z}YTm>e-{QSpX_)zb5$qbpJk z?mE10xNH7a?S)0$vPCFdYk0oD?HNw*R_FdxRqn>|E2^vQd!cIR{ez^$>w(8fTj&37 z7SxPesNBsSo&v;c-}tjn`3*%49y~lefJC(5Fzov_Fpy?K?>I@<&rLajnF@5JkC^z& z1N4&RVl&g7n75`r_#A>eu37W*dm(@H>uvDNZFE=U<3f8@kv*gHkzlP9siz-=?Pil_ zGE+H)4RN76s`C`QPqy<@j!!LL`Pf^Q}Z9_2tH&+7U- z*^gSJt3F6eC|kAhWzUyVk`J$&3oU6t?yI(P0JcF6O`^GAxfV4#s_kWLJnI#a`9QC1 za+h)vEe{JR)UHL`y|>OsqG^M7A}R8_qUb-NxZ*LT7}_Xa-rYVK%`(wfIgZh6UMK76!tO)o5GC0GvGL^TYU;sTr1OYywP7L3@AyI=BI0<;3yZEBOpNA{6>Frg4DlF6oev5(o`t zH=GKPq;>#nPy}WE=utaZYP?smPQC=Cmk2#(om*e+_V@Yd%mmX@&NSgP1|XMk*UON{ zPD;juk}uag=Wq9?Sw+)IX)mz`ZgH1c^y_xsBW|Z`RoN#uNW0F@@A4Hu-&56W&0M%6 zJ?3U-w|{*l16P8Fz(sxV_Uog2XdGy>MGq1i8XCrJDyI}p>?QGtwmw6aLpR()S&$PS z4H}iBye}T@0{7kc+mPBTa>PS`)_YV{R=+EAMc!I9_*GCLBm%D9GGGj zfI6h4rD-qer|@o=!~HLY-%|bW&f58b!aL-)a#vHi&4vs2>R9pl;zt}7{Svpd#L z+3~!|4x@5U4Kab;m($bTEmOqua*R>tQMNxpZk87P$L#DMu%jCu+iwQieHGEznaUTC zWmF$0*CxKv#HBqIjWgz)nU`9U7p zxBzu8#@?JNHh<$tr89jOt*P|1po~_yz~$%Vuf5j9=Z_+!nDu$y)js5qx=xDQrYLVw z2fu8!EdQ*rLsc*!&dbYdHaR_=qiYTG9o+ojlq`n{q$K5T+^=_BG9%aA8mOqL6(jFt zevC_sjn(+t^6;H}#&*SB*69MGCH@|oQXfx`&O)@KE4yM zUR7RRZ);`6QeIvj3ooHt2ghUMV2GCapfE!_&>hXs>n@D?PcvZ^@S zjpoH7aUGUm1v&BuIAWYrj}LOV+!LXiGN7cO=ma-C0aS0ZMbivCOf#T+s|bjS&ZEg{ zt35yus?Ex>vIG9pFJQd2qA&v$Bu@!xgkLW4hy$DaSj6jZh5bm5 zAnXtu=+JsWcX<=8glshbfARZ>RMS}Fr?K*anX;zil_7<>m866k0q%s0?!7&`Ug133 z!1<1j;onBCCHfNaD?`~N8@dx`Z;j{+8~$xK{-bR)JOVcJ`ESEBW1e^dz~3I()R2`; zZTibBym?f73|rh!wJ%*hY$3`9CuTp-7He||2@*w( zsV)n8i&{%T-9BNlCtKrQ$8C~_fu_|8iHD3$-lR`o*`H!2E6T|iwtxNMdH{2XgK#Jy z=!RE3wJwxA#n^H!Z#kyV8ggBxClw z^xHqWtB$eM{Cd|6r{+2izCa5K<6=S1;x0M{{!yud3R0?DE*6<58?W1OL!aK-Z>Gim zzyI?CjHQ2cOU*iuHcHL^xrDS9JN)18U6v(;zq@oDw7OmiGN62Y=AG;k zgoa6F9)$MKVqN)`N%%hk`5rV`KXM-bQ;HUd>n;6Wi7pV#^x_AqMWC0OycePQI=E!{ zO!jqwHkT7_b1rB6w>U>?;v;uaS}jX%G7vyM(8<>peR>u^*d|bVHx8dNvcnq=Kgx&k zw1<0pbOV;<<7hz-a*duq<{b-S)l^;h!~F1*QelSXNaef59@#)tkjeRXW#BU&1&l-m zMJz6B@1NlgCbs=Jf{k*3sHmzwMKdRP=&QX5n63YSO=Z`zXF~%I1viA-S-pJu@*+&4 z9ffiE#!0u2Q|84DI+)`~Vs2wTOEq_mL_KKgYiAEA{a1okWmxe2c0H@-giPG&>E6ns zu*aYKp6in&aPF?S0`K@G4CDe8NA^rm>ZnF}&KD1fbFDqo5P(#QjA~zv0bL0y%Gpoe z0|6sBYDSlsCvD4)yxhZ0bRW11bL<2k1T#GbbCiRkk9AzeX3-#N7L+4yl}OqA3I-Kq zw5W}o@jt04WQA^AefgUCkNGYt7#_ zAtDfI*A)pj;2CcK`RmM0d<=g6QZLj6Uq*+^Lc{S~&(Z_zzm=Lpe&4&Tw#Y_0F~ko) z*sWq11-E>$UyG?knI8@hMb_+nIj9%g!3na>I6@0DL(R^OVb!20)Qym2RFL#NW&YVQ ztQi~QLifpt6&PbJG&#>nylZTf1_;DY3~?CkhU=l0gp2BqG0a7^Qa*OMq?D65{6DOZBqscth2f;y0UZJyx& z58@Ga$N`u;gNCvX8p}K!eEc)|YhB7a`Ff@EIRGc_f?q+)(rzRIT(!#t*OSAo0aX>1 zody^TPC#sN=Bt<(v!LcoVZ9eHP^#ry-1Z7)lF=l;HVxPF9li96(JhJj#QCp^!nR+3 z2>DJ*Fj zf}a;5R;Zcr+aZ*NH>oa)YHT89p-RQd^%x0twjXN{F|2l0JNdJ;?|*P+Jy0o@miKG= z2pQQD5->F@jG)Li5gV*Y;*nHCp_p&d{vM7@+w_E_NFW={wzRaU#A6p{1Ca2$QvX_) zf)}vv$}HLj)8#NsA=WhE9edRkbU6?*ilWRdEHaF$9dtOfP$;;GeDBBoB1_Cky8xU~ zB^s49UrZzQUgpXB*S9`Z8^@+Y{lU9i_mD?bjP#}HPH3D~mqH8|k^1`QSro2?wcacCO0b^HyyAlgCCJPgNgtK@T04&Al~UGj~skA7Q&2XD8!Bf;suS zclwjJ3oD8+ri2bkA;mrdcTD-6vYE)9e_r3~2QPCz(pg}%ynyzYvAqg=V zSqRWQ3vGMfx6;FeM-aNY56x$Pdkj!9O+Lhv>w?hF|N3pa#5KkhJ^kfdlcYB??NF*@^%5%Pif%9#-vKeq6)LeXrYmnkRu+rw@I0*S!H-{i9kAy?G=TN~i;AAn^cbnhLH1>orI>2cVrrlzKcP~E3kpLY%nqk6%&^gTEk<|r@eRs=fR znOq%76ql4lBH-^JOhZ6MMb!zZ-YpsgVC%HF8B=xpYc~{{HU$`_CV8oc;U^kk^;)ZfsCr zop74$FKx^sg}VL3-rKUBd5k3BlvGtE3Ej%uNz7^b{maTH6<`rsvKKB_Mzn?R-R41E5r|o+fU!2lvyc^F9J5CBz5nm%kKQp z`2cU(-g{j08*Ktp05MdW)HlN*s z)B3#nmRYOzLNDx9lBm_``o-(toUUiO*d@(p;;0q{ZGlav2^N3U@FyZ_A=bT%^HW{0 zS%lnWYiIax`vw-jEt*e8t^pxbFiq#6S#`{K_yQjBb#Ta?d?Ny`kIX=|@*6->r4_&_ zP4u?UHWS%ZN4Y>|ks#)nk++M$3+gzcBSoO-nP|2^4SD((EF-x6oCVpvqM7-K7Lm4Ja{Z}uz!2n?h4)2CW(p7%>2-k-@tt`$xV*)Ci?joR~Do^Pv4H@$_@#N zim>b7vO}6p=BQolUtcCxRYNVpzE$u&nu3{{WXc0D=(_^58%yYw^FdN!q989nA3yp^ zf@R+RpGf6enb}nwZAO*?RJtr9E-y&DBe99h^zZ`{NAuA8w|EyM~x zXm5QuyQduVb9Kli3H1NrfI2&u{DCUK2#s!hgeRlE{&*i?F@3yH`Pt9DWH1hgwfkPs z3eyE-amcSfe+UnEcgfm2J2yYOEh_Pn7fBu}UI#+#Y0N3(luVm#&SDCCDTdCmZ%%*z z%lh#@mW#!-dK21(V_H2A2K>fU5%vF+mKaU4p@ttn`f%~q6fh5?I4-vx=@pXiYiplI z2L{y9n0{{&8+6DQ!mwTrrs~UpAwR4q|Np3tNx6kiCjUfgH-R;H07A2fE~m@l`1DV` z{0T+8i{V++gwa&FopI@>6PZJ}1Ja{ki?ce)4S8tRo z9vvSmo*W+s{Mk8CeVgj#lbxqls7uFd^59E?nCys7{S^Nz=#sURl$6qNcn#J2i}2Wq zr2{<6*$cZXL+2NpRqcj^>G8kcWO*)Hl2voyy*8TniX~qfX(Ui_SFQhBtaQv4LrtvH z$+TwqKo##&>K*@x~=`{30W!yF%#N!sMsG zhS=8w&ouLq_OLlyw_S}p%~3BR#Za?H5$Lz-VU-zyN)Dq~H&W#d+Ycz(#elu>sTiss zJlHh9%x!JMNm!IzfwX?)E-ng9{bw_%N=V4bp97~EXi;rlUEz>Jbf^q2E!)sM;{lAz zwf87Mx5TTV`n2Z0*fzhT$AgB%>D`t8t5?96#D`~X0+ z|B{aIb7chwfPZjvwyT~#{5^=D3O+``84BS)p$U9_mo?3|0;V$nrOitVi;C80s_SxA z6`Pda@c#POEF&(reB@2qm8yt(xuWfG2PY%`U}_893a_z&u$p|*kBG8sh!i~YaUpp7?TxFK zoPC&ne$?bV*jgacmf=VgqL!d=Qdaxo!OlQcoHJQj?fvEXKs!Z34=)X^u0hr*QZ+cT zM}-<0&h8&TkF^VKDF_=&UU_q?+@5RJ%`7h9$)cqjGfQf0P_lCTwj$B2M^zO&cYf%- z6l?U1?^vmdypjvPBe%-)xqd#FQLJAIG+>Q-wiC?yXkm=SPdD&z&YPP$%)&0wln`}e zBV}n9gZ<9ftAk4vI_q7UwL93X}w^rK(LXMc6h@85hL_seJd*q@4)mPJqmi%#_3 zPWGp73AOW`Huny=#NzpEUDYY+J|_5-^rUh-C3`QSQ38i+ti{by3)_8!OXf=FYa*pqVoiw*P#2aI?h{ zIa_q_`%x$Sk#-Nf<;^LkpkJ6Ew9$7n02vnG;ILy13Q#=F-q<&(jDF%YV$|@X{gy$A zTOY%~jt3_HJZjFC!) z_e~{(==#$Y)<{pJjMKk}tluLP_(6|e8psl-%6G>wOD{5QFPwI8vGH*e#qkyR$X5d(Rl4g3<)MoS4#g_0G-(p(Cs|V!z zH+s993+s|OSwatC%Y#sRk6?p3lg?ROn2JFj}e-lPTc=eR%N#+Xk#L@Pk-jGwH!yD*$!*T?7=z z>#LInwKa=jt>==Ze~;brx+Zd##GXGJ`41F%!S8y3gau^i6)sn1n=%wL1C=+a46T{#GW4J13dg=IEHDBIVF`_AWMYv5c=tnj zsk^|6X>{#eZXI7?G-Ki9x`ImAZdrNk3)Q>&cTpk>c+Sa~d78Mfcm1C{DJ!b&%El!rG%l!%wd0 z3lPV_&mv=f?85#Cx4On#>8QhHSh`aHzsj(9o{aum>rW_4#q^bL3PIYQg+>2Lg z2VO-QwL{^x{L;KpbzMzt|96!x$lLb6B~7~?k6X-q=c62WJH=GqaZQtM@`{_gj@1hsHg!nIc-1L{n`pKk+b35+j4twvma=tAsT1#%_(O&%y>akP_Sw7B^UwRou_fm zVnqjowJfnmUl=KAfszp5N6M8>y1zn6aC9?ia{TwrZoXE&93L|ZU_*u*u(BU3xRY=}yWWT0e8dsNEOGlOji5T) z$a?RK2C6fHT}4_32ALd~w~+yeZ;F~O{jRA+UhM--!ctpXn>tJ;?lpyWpBU{f{0B=8 zLbwZR^E`czkax^$%_Jm@KMl|6KgTluOgux%#6(uVL~6I3x~R@40lfRCmV6BA{nBWm zcVovcJ;?tw3>Ve!HB*l)X@@(55VZF$H!A)If)hxm;h4x$Oh5a8QCql;HTEIE_5X+T zNe(!uh>`5=O8FgRpBMW2{}kC(rldl=S{Huhf_LV65Xj3ABVr^ElSEx5fgr zNB(FVe*?2PxPYFjz(~TyG&MVQrF8=*?#WebVy1;5iG74OariMt`Wa2EwOQ6?NPUl} zxZ<70R?W1b$+|`CcfF}EoKDrv58i6Pu+S~EnvY=f#JV!aRx4yPiwgGAu`dlIoxMKZwlQoo`kO2bGTry1$JKiAv8CT8N?+HS+oy5V3rF=MKyQ zn?A^A_}oGoYoI>#H8iUja>V4QupIlpa5-k#CE6gAF;1(C6q<{@)^=o5;0N{SGJ(gu6CfEM?;X@5biCH#b`tTE22tMa0 z)#xn>C~KL~xzqXq@)yT5XiUpunH*<Pp-dX0um;}Zw5b(zkSf9$t7Z4qRmI_ z%1!P|N7%KppN34omSUhvAxyUy5H@+A97?O@8Z|UzUL^tf;{>W1@-r(V`zjHy=u(GX z3f}Im1F9!seh4+a!ihxSb+Ye{C;P`GV3aK$LG_2|A?WMyow};S~n-q~(VFPD7 zRG(z!=dZMaXy&_oX>8LyOi!?u+Gz&=pUd;(Yg82eXo(5!rHA7dSPH;`Q+Wd`vWefH zdX$pjx%~B;mo;tf>Dm(_dWkEgY}(R}H#3a$ZQRipk}g1N$Ot;lC2bKwq^>2?ZFi}% z-OY_SJk;X8GoPQ;GjEvUD8_xP{P%Lf#7Bw&_8motqSsqk3c!Dduiy=#n-#h+ZB}4H zi5n`P0sheiz%vibt}FVW73=m1CKHTJ0q~usl`C z4(4y@kY5H#g45kIGoNgIA7w2aDiBc4eCd2%gLvNXY|BU+FhoxF>;qqpu&F`Ua@j<~ z6|q&QU4WMN{m01A-M@Pb7>U=TYNVuP^WqWQFjf^sjR^}c&6hBhCL|;j_x;N{y2{@c z3j7)-A)&wgr8JSDFafB<4yGbBcb-cAIFhyGCaQRP{#5i&jf-MV&c|<5sCLk9M}*R% zicA{~86`o6dzT3Jq>$O>4O9IUY(m)zyr&wis3^j8&Y*F0^i!G>Rt2N3L_V}N1etNl z85R=vdI7c`G$T^;w3D=kU6RXpvPx6@N_oS;Q2vxl}_^bJStX7E#yV%P1#d-_R{ zg8qZv0;JpJZe3gYpW3nbyi&?t)*9UT#Y99*7XN4t_#QIqeIGBo?pXWpTAc{j+2i%j z=?&y+G>w?$#zAwiO*HN3)9bzsYzQ}ZPwv?sPrPy??%x-0)G76*-9~cIWXlH&a4#1; z9Cm8fOFDljU_4Oj6f`YzJAv>i1XGdfbBScG~Y*u5FrGe3;j(Oz@Hk2LY zxK}~CZQ@x5T?eVrWl@`Lo{Wez4q(4^$2 zoFSy>d`ihfZ*%T@v)>p{$Ct0c$bU+Q7cb)U@H!zLhN{%3lP}tj(9FyhzDa3*cduUt z@k_QpC=r){Eo1AFL#~JeV67Lt6j>}QXQn+3c->1xWL^QSX{)eWuFa!I`1vntxtXvr zG0Euqjs38~ry0D~aN#QGLr2-#BDPA*v5(9eJUL?s*4=F0-!5RP&_+=}nGij&ROtv! zV6*@6->y&wO#ys`afs9|2J7@n)$GiNgI;#qHs^RP0{08i=S=ZMP^LhIO|K5o$zMdh z);P+vGwKgy3z|UDpvpMUHo!>4U`(LWKjzY5cZd5iIM7AVQdn6bR#M0X-4(f($w?~6 zK@<=XQ3Pqr8cbk|1U6fsapd4yzwywxmHwXy3SE%#3R>0rIDTJ)uw0VuP^H-{ z+rd57xI@$=(Bwaif}7_Vu)e_;qB)+WBH|X~=NvSlL}+S z({$RYsS)a@r5(y6!eFo(nw%|t#i(XOxTi;@V}LeBzHrR);_NuxzQL!bzkj^vfl}`2 zu(vG5UMlJ1^grF`Cb6#W>@WUVZ8fxI){P%ZRtBsza;9f;U>!sMs z8}IHs9(vEgI{w~nlqyS5bloy?uDygwlboF7b;BM~;q=6|e~Tz0=&_s!B6euAury`s z{lsQL+WJrOq5qQP!gW*!x{rw2zT|Zrbq?vWpGj(>Loue`k2>rGvOjbOx>gPUnslNg zEbv(-9VAWTJ05?slKX}*@0ztto@BI7>$XDM&%$`_@_>=2{+|NLRPRMxCl=Qh+2hfF zHaRr~W5UIerJ`BODz7D&y~I%gx<*vb$f2mAQ9ZprxVi}bQ5}$9vqP?^ICjx= z(ooQ9sjbkZ(_C!?GHT?`o%U6jgq({x&-!4dm&@O4j?wiBbFi&IOmoA)OzG{rcW{Pc zz<{#&Y5LXgyT|Y$a)ICAD!4kZh33DIp@7xemK19%vmo=yEcb%m=a659F8bR!b~w1L zOrfEGJCj26y%)JFqRa-O($&>f!^JF3zY~~*$uq~MPbVnmYg+z$smc@TCeF)E-W>uvfCN*mNbl>B%@Y*4sz?avPI|S$D$ds92*EW zM-;WxAXhvtv_xSUd&Kg44@Sr#pWtABzwt8KYDR-R^!CLOh7?2TpZK^q^u(MU0GDrO zXJ?NPWWybSJO#H3M;JMP?k;gDtZVTHtXBO`Pk7ltr?9u@33sRkoT3z<;{!TtK{t{y&m z_r1K4{Ve5rBX;#B;)HmondIk2H& z2t1e2e+L-=VTQ#@FucX%2d6GH6elO=BcN>~9Wc35Iz2c!)Y8)&?YLGrVSrS+u@`M5 zU+NQqWK(HP{`xH)WAla6cTd(9;hf&&l$6pPpU*bc&DHWqpa)*{)d68uYBiAt%E2({`vU~)dZ}=-AjXl%LzUo-=^*7A6#^x zZS=4#pVaCSRxt!xJrg~B+h5@1$fw;r%f6T3;H_Gn@`JWXP#m2gOD@!Sr-H1M)DV&< zs3e~}rjOJ$HBD_j(;!DetGi+r{U5Q;hvR{Y`W zK&L)Cj&jRrDa$L=^YoPh9lHjHYn$5Vwlfj9Ku=7MG|Rg44xXcu5+-=1F3z?b8&?}T zJ)B$zG1n7ds;7WpbF)LnCmjbHpFDZ0;YfeK>N*OXiYfR^KOarD3ud&{K5y&_{QOt1 zNuO(jya6%STW=Dy!XN0%)6R#XD`c6j5N?qe1kH3H>`11|2>t58 z1=S(O)_8Y zQi&YV6y*N<%dFA11m_1i4YEe*F;= z+Fg)pIv5UDa&JXd)vR_vvKzupMqMlPW2UpzFTCZ!4G7)~0cs{(KeDK^*~x$EDiO6P zS+K~V)E4P}1}a-O5Ww+CcyFE!dkzSIRe88fK?PUtK|PWZABE8-@Ve*P!$N915jrsR zkT@~;Ik908zhGZjY#XmznZx(4tcuvqE>Uwfvd_M(1E8E2YQVn?SsFk?xrDEI`=9Us z6sdBW8Gq*(ZeId3N?yR15zj^ygnxGjuY{zYliOlV6u;Lw`Tj zki3X@BlY=jS!}E?Zti&KE~G~Gw4jOJP=K5bBDoY3S9)r1Oms62!Q z-1SO9{{DKIS%U}wMoFWs&5^E|-;!5tE^JuF`~1jZ#mA1C_t)0dkRiL)015Oc!w}D# ziG6YacWS&X1kB0yp;)#!q|M{QuzZNf|#h;Z7ogK~YDYk1Z zqcJQ81C-d=^a_;AW?uTV)wv`K#F5~%fDRhR*KglmK^S7NA~I7^*eH~q-b60&)+4(X zEnt{Vo;Kh@Nk{itKVO?+^k({QbyZc7RUh~Py)Q_ZLs%(Q)r>y&|FWU6G*^X1^5Xh0O8yO>#$q6p+Cj6!>%JQ zhPWf%(hX~J&8Y*B5Ch&UG$p4o&Kwl6;J-^ip~;FD>RhZ9;5Ni zNr}_nmT-&j8I>Ky+rC^BM;PuOrI8vC7*x#{xdhq|;lcnNFfXJ-V*D;ujop~&oCw7j zQ6XQESu+D<`Hakf5q%X76j=sDOxZ(hU4isxWk2jb>p9-WMd=1gM3v;_wE*D&0*<2D z)uRYct?iwh&TpuVSo!Shp@ew^3|=iV1A^xn=FM~k9=0~p9S=3i(cUg2J{vP#I+Yjo z?T>n8+6jv6c_uFYLSKKz_a`Z12oqEh6;#!=&%VU!LgT>_7oYmM6tK1z;m_Nn6aC8I zZK3|r6M~M&_CgT~*4Q%lZ~7d>K`h$VqgW=zC3ja1-lqI)lwQ3qgYOisKxrx1fS~vm z9>}KgIgz9xXLNz{ePzD3tk`l>F|!`Rn4ZLJ)A5jH137#W$c-)35VtqUicxFW~YN z$8m8H|63+GDb+_qi3gl`rubO`5Ss~G#~z6GNnpTV&CueXvcaPn`8(7Fe{`L|VisncMub7Pe9AUa5dXBY-U3cV&9eZuu7lEXWM2V)G&H1is-uo(!OfDxiz1K#!{U8?gU{NLHhJD38lfENA}MUk32AOs!=gY|z*bF^f>} zh9VWQUXNzGRZ2SwPR`bFLsnlCY35grl$bQMi3?wWl+l|2b@W9yHj%X6)0>%`^j}$A zT>NCwhKUx_r2rs;A>_(`L<<4|xRDp_E*M3;ffA`h=arzR0xPL>MNQ4-Xs$XVxHB_B zdjSBm-6v;yhQKpH^jhbubG7^&NCf0ze*y6+7^yLG#!DzPd7*9d25tJ>GP#Q~R<@oD zogt|57DkoP+2&Pr^6QsDH;yLY$?=?%6Pz_oK0PTeukhZOz6KQxR1dBm9&Ior?OG!< z{N|2n&&f|rM`vtRPb1-J7p-`YiFj1MhGV?UHJc-1l!3L9=ibgS;(sw)?~xCPH%YZ& z-^)A9Cjb_X!f5yyO0}>ef@@oihpBHq`Ds0pitfr#xB@bXu4>144biwbF3J*J#zXMP zgQ+Z*pzGpk3{?m}CVu{7^+ZW|CURL;a?92%N)a!oYR6^{$n>j9r>`k+}VZ zmuZ9!_yxGG=;?mZ@ivCH6Ue`?D=<;4Ys{YjCpyfFYKSVZ5BV;$bWGA ze?MVM50%8*q@(@cBm@NUpl_*Vt_*CHY#9Xdy004%m=QB#G@0=&hy;V_X_&#wi>3PC*>z2-m6%<+% z{uA|C7avF-6v{9LY&~$TH9db$UElG&ii@Mi^up9M881^u-p&S#63cP6`S?>JqQO0| zwwNqEOTB_i}|4u0DMDFbJyj zOlT^>X-p2>ph3#IJ#OSOX1x2o6$3hxEC@RZ<9%9%$vYz){*a@n>JRpF9Slaf=o|Mq zh~---WtrotoQ5(vaD~-EGC4r7yecO;0i4M7FJI*KP*PwS`_6iw&`@0dbLg>H#UFm- zHH4fY5RH=W7qm-t4Gm!W2=+02=hG-(sBJ7RC-;V z{wA_RCmYML;so>)v^vad zOK!XK|A(u$fU0tf+O{_!3Me5Zol3W~lqen2-GVeoN%No*N(x9y2#A!RAl*nwgMfr| ziimXAKRNIJj`4lp7#;`bjN=yeUe8)<&UxS0oibr!5!ZTSTAB3 zb8xuJ8eagQ`O=R%Ak_O^+pug=QH$lg=J^QoSEl(meIonTAYM&w)a>#zsc6$i~g0j?O`{tqV&H7aXdRFsq?sPhF_V27u_=nm2`i>49p1MmODJrNP0 zkry@$-~d?TUJXE2qDD!Z2m4+7m zLx!7J^zV;%@Aq5xH+|s%O=!Uzh83vs;!=EP3EL*c2}Y85%%#(azME6pp7 zs_1CRKwhi*2fa0PN=U|XoY%POLyje*YR|M1PQIySe}EuxVEZ+LVd~O}y}SPF7Ck-v ztH{VUunAiYHB z9NH6W5EimXMnMq<0CZU4-yoS6f!hD_ek0Lcx`W1VdAy1*&TG$?@kFkmt6TCP*?hRt zwF@jy7nkJbg)ND+(!;d;`cO|<4R)o ztq?&~SA1%_yr{Q!R^vgSwtJOAzF(v=$Hw#^hOJ2)qu&!ZS0mrAxEq0qyCA40UieU_8$u&3mLf^o?@k)@iYtM{ zHs%6gpu@jk`*DC9!HJx1$w@?aWIyRk?L?NBmf|lFOh2JOdEnx*h0C~Y@==RT^6$^0 zU;lu&k>c&^n+@{jAOh$yT!)V9CFn{+gK#?F#If3l>w@6(v8s-n2C>Y|sD&>MLs2;7{dwvRX{rP{l!v^O-y^`wm<#kt3Ji1DP5i znt%;y9ymr-K+A-I2WGheE@WVXMHGA*l<*{Lp!Bk$H7%I}b=UsHH^!54+%FmlDK9dV ze%_R~k_QI^$P$#w^~?cHU#iVUqOG)Rt#jQKN||-=8or`ejao3dIRuy9PvpeUR)1iM z(cr^8x5fz3{PT2rqJiAH(EvS0?bXq1a)B&+&lx;|S3#T9f(84|mG50^2=*Q(G@SpA z%yk)#>-isbYvDACQ=N;=5G%T8LXqF zt{6&M6+BAS-e1Bw9rfWZ(Gwm!vb9drRi3P9k{r`WW$4J4ZV;sYz*WmX_H@>qA)h|~ zvlPA`Y3%Xc#b^;gmQSLoL}D8ttb$!af8^J{r&OU}4t!}&1~xNpst%W$1)Jwo7fz2` z7fl1ixd^dYC+nV(-H|!g^}r5BKdoECVkE|)5pqvAPl^CprYOFJKBx$AvGcCpBqz_G zLxj0{o2-OfO+VnD9DhAH!1X`CSaF*2!J&_cuPdT^c&8SJ7Y8S)Jy2gFQ z$Va58puS11g$zto%SVof8N~tbBY4H@iS<)qI9**WQfA=zlAZ=+o;d(&P$zk%zVRv< zg?Lk!aI6_>X$6Ia;eeMT?vp{eA`=qVX_qP}KoRK-=_*~_-Ox3{CA@i)9(s#_Yc=WWvt2G5^r@Oy0KJwCb}6!;}jw(W%# z*6`b_=+CdhSR{#+U*R9>Y*bO-!TJ&9s zpplGcBtFY6IfBuH^<@Sv0^^-kfpAhRdJhWoNZD*?S3&``gi0Oh(5;MO$?7-l8WV*D z~#ypOTVa~u0Gfpm}vL_WZsQ4kX>aQM8GSf{yA0Xs&*!g==j9MbYZFGYts&T z6I1oIWF7t|I58MJg*vSVBhU~l7m8Qq0Cey!#j5CMu;d}o!4cGDh}n(lUMfOsnw%6< zfHY$r7Gg>>VZr#6g{s>{I%^xhf9q9eRVX^3HNE!zD;~IRWJ^3_@BU3SLt?52SlVe<-z63|vEfD7u>tB42=+v&QaH(*Q90HSCWvT}Q5Iqyro$nHu>wuDWq>amm89I1SBikDZef7hcTcykme& zNn0bR!R;2hHoIb>x@{)|on2fp-`qwxa{Mc5kJ*4K zX!>I|y-?WK7&Il7(yIbIl(&V48s())Y=!aujd_yW(a{l7jS@xE)7g9X z88vx=FS(&{?OJFWzlxB+a)&{Yj=Ln9Qyf;Xr__)Ng%6E~|5f^A5*!(V zz0%&#b7hs4jUBLBDPk&aK_@#+*>M{YSV8Xox!1fFL42`6V8EnGl>2(9)pnlWB}G^z z^{80N^~xr)Kl<( zz1YQQrrV!4g7J~qOi5-hE`R&hcun>?r<*mc>9zhq;|i5uZ4-iyx7KFKzjRNIcO1|f zIBB33j{MHOp|zm#d&~z}K~Op<*=)Xsek{}zF16YX_BK5Y4nD<7gUC9scZcPWi{ ze+e8;ByU;k^gP3L+C25sJuz&IK62V)c6x>kni@c--qG{fvjFgIzXgVH8Bt()e)ZjE z_{k0{GbiK{sX9$p$6ntR}2>jBRi$V@J8Bu5bQNEvbGOZi@@WozuCBZfg#mih@1K_F>| zivcnslc`wVkjIkKBVW*l`luB@f`_u7UgS!iq@lny^nQeOWEL&?wV~9qlQ00Vih!^i zd<@MeTIj$TUwMk&G$d5dp7xx4%4he`Y5Vj@tgYPs&}pSFGB2XCth(eNR_)aw9^MNz z>4E3yEI6-XNS@}BhlryXElO6Ky@rjWkjBcAD|a4sYHab$q~CeO&5g&Vn7%o7&gcR~^lLrfSkE8&~FA`C2xc{zeNyh`Ic?aTY?~d92qW zeu2;{&(bM;t(e2WX;AhZ;p0o&n_GsIw5YH!27m-Iz=6RGK_?u6$?eNilbyBER&l8D z-7md8`IIa2r(ekkFF2APn#kYQBz3Uhcz30%C#~*;tgE)D$Wb>eOI`r=23&ISqXEFy z81{yAzC_T`oaTc;(${C;#Yc9Y(aw|Y~odTxP~*wqZO9D)PG%< zr|8Ay^$`V9Z%=uAKF=>o)ZIVLxVgLaTP8Z^H`dLqaqXEY|1Mb_r7S6Ax@HV;g6!c( ztigZ{za?~l;c~Uk9Xac;4)MNEtgREZPLw(VZ%+C7s2VuU?5Dkv{cu;Ffw(~!*_5lG zJEK=;cU9<&v)N|YA|0=Hte0(FX+#n1G973jjOPDsOBW%j$M9*~J>0viM{7~S;&2oj ztmSgQL|WhA<4+)&8OXoICrV!$^fTF-6#2^8LduCmOygR^E91P~$88mOWh+I3T4_NrH|BwxF=|iVtqdOVjCv4_dgYM&_)_BeKj`$(e_O z^M`9`)2*@hwwm-GRmtdnkM#DLkLdn-wDgpWzWY-<+n>0bF& zZcfo>yLBGN!!)6qxkM#SQ>tSA2DUak+uPp`T^?V-r=8xU6!$p==&aX7wjvApw?xUa z-Jwgz$YXff$KXda0*l@kxN$(6#|P4ewGuTKmMJ=%8| za^d6nWVAKZfZ^qbcs?SDtJ3;zl9op|&sypp{^d!U^k2iHdffh~K|IC%XltcwWv^zH z-qz}V>gMtac6Yzs-?$rNJn2o0Vz07$uKl>^j#n)dNCG4Wr$=reKt4P^hWl$xbj;F( z4+30oBwfOPq5)>Lr9c!+A>!H>d|6C0F6=wv*?4rSm}j9sUlMw?>P3y`y4PG!j5w*5 z_tl4jM=0IEw`Y^XzCPYz!rw4|&wg%fjf+*x zk%PF-x!VL-O)gXrxChwRFle^CjgOzRwO~l`t$HjoCOtZSy(Q}V(zYsSy$-ud)payI zXMX?T)H5O9*7YB45_z1M_3>kFZp*iC=nyeP3XO}42hraPT5RpttU6!IT&qM*tCYKJ z=HI;0cqQ2D`)zz0LqFJVvc?VFrNnoz^!2qT0mHh4CCdY7nHAM?E-rSq4^m+|0VdqC zz)-oR25XM)OKLVp_fM+PfEkZN!m=FOBr#h;$dKcpm?z$RpLQ_k)u4rX)w4bf-C2QO zPkH`J8vzDaD46LfG!PltcxDX0lPT^-hZHppX^bYkuz51+27!GOS64zR3EySiYcywA z&wkFpQ^n7tY~^zuXPaj&P6G=wK{()4$k%j+Ce+Q93>i+7bzn)0g#z6SL`(AW@=pt= zvsKvQEnsRVW@>6G+ijaQ^giVmQ>Fh2Cc=ZR+XQWnlgHp{R~ypD3*Nsc8w9Yajcn7=K7w#eq-9 z4vnWcZL6Qxy?Z{sf0Z(q+H!4vQshnkTm(&-*YPeZWGjG5^s+2mbq7;X=7?QmUcrhn z;p;`@3~KVRQPPPhG{%~7!<2*WUUrrm7oqd5I`V8^(^`_mW~^xi?$_cbS=nNDG-7^l zj%PRO+oT)6sCIV7;;3u3HGLxuo<#?pJ1wJoMCZu2Z2Fvt1E6w3UL22U=^^d(rl$h8I=)D=!NARkb%f zS;N@)-?-~)IjMLR{GrZEQRM&arL6AG+U;tQnH}dkQF}IV7BFWLk^GVbQQN?y_oR`i zRTz95l4X;9D&ZwIJqG^H3INTaL$+W=MTjyJ)P(M~BYDjj z{>Z&&798EBCwp5pnC^KcmPHOvE`IRGs2efXG_20zW(H$k?YZt7=Sz1CA~tJT*ljI= zj^Yjt+wtMy;eRN?8(}yli$l?pxPU&VdnJaT*NaBHOnw#mLgOki=IwS`G?{UFK~_rf zUxwzhbf)2tLkVxq<{$&?+L{Q|<8^hA;Y9(zB53YjZTvSK2?aWcP2ivgy>g;xP>XcQW&nh%oWuYS_^g1f)BXn4ys|vqv6Jmq* z{!L1XA}swlY_oicERuJn&gf)(o;-bG4UM(dMAKidWk1>XqVZ*~`FpT4+W3R*4tX0l z7YE`nC^9h@*Wb{JZ=bNRwQe8WN0aj|=WRi=dq~iy*;>(Gw${qzR&GCz+9QVi6cgeQ zgi|A%WL}4wsbW8C1kU7GNJ_k}m{Z!$S8d%-qgps(;kN*+&+TeUGt|dgdM@4|37{n8l%8X6ERB?lEI_bmf#- zR>kPil?ci^pD?ZQoG=i}4mZ-VMfQQ&M#$38jHhAgdTz9E)Gr%~(RXn9--p6{N9^RS!70Sq4MBt=SXS>J$sSqe~fpN9$xQ;+^|0y?@d2(us6$UoCC|>Qx!Rv*vKeI7y z;Zr*ASaVR-#M`%KU!MDiKHXnE@}rkbqMc3I<)iL(=1kYeX2csU@9ia6uaP?U*==Sv z_>fG-lzZLn5*BL3h4VJgMZc zwm$wg>s4Pc3&V3Wsa!5&uOQ-=^S-mI{{&ciSs&V((0ie~+0cg|AwvkrZ?A8C@((ZSVRpsYvom}Z)@p`t-ya@| z3JV9ClZkn6UqQG{>QF5_13Fq#+D135)NhW3@nPwc;^@=-?Y-U9P4fCGhqKm8>B3`U z3oFc$91@%7O|z<7 zfS69P(d*9*$2ic)|E6o|AKcTU40$Px;^NfcTf7fL04ge~OF)3b*cUY9{3y3sS@*gw zW3lb9QH@SvTCBLASFO>#+6rK|kn#EMJA4LH=xFM}|;FnhX?5gO*TRAS$S;?(2FWi6%|f&LEA!aTCMn!drsiVaksN$gUuEt zW(u8de0X4#zEoCP11$RK-!a~xkdSQ%bN&bUjtwJf4Z03p4b`4!$p=>`e(e+5eqGM{ z;_2A7n(~9+#jJWJb#J{Tx$CZVKkbrmF}3?A;YDFQDD^MJ zHj0WkPQKZvjsGDRy^uCWRoPf*kA#~YpNpFx~ z8i5aC3uh%#A3WlBcBMX}yWLyOd)W0tftPt8nH+$$6`r^f+t5TQe;$(lL@Yju% zjWjJb@0$7|OnY-CS0qXBF-ccfxU3c#Z4?SJZN2vYlEaY}gpQ^cjQ%MLJuC}-AOc4^ zAvi6WINgcMX8ErL@k*Rh(c<-(YRrcTq=&+Pa8TgDMelCl>$17DqY+)I zG`lSMT3cJiP-^H+gs8-%Brm9axP~Ed6JNu2nylXu$_R!>E;8YMi-2eXyewexe7KzlbCT#Di77v z2w>8jnP~6oYm=fE*cgC?8xve#u=dTZ68AM{SQeJMvdqtx8W6$jD3Fl6LUysvbRp{= zflQMcRTHR_m=z&$5_IhKmnGjC8vkDh)j-W$r+L#0#Xw~y3>4Mafkxs-iN`!%HcJr+ zk&(DRKOYDci0LP^fjP|n<8`#a{uR#*sP?~y6a%~=et=+Qa!}5I*m+E*LBfBx*&daTR9YIx+ zdjVLLIo|vtF43&}JEfK0xoe(F7b&$I21UI|uOo;Q28iZgSm{F==zXR*dU!yOj^c+t zLt}AP_@4^JLzW*yG0)turKqI7>N736(!G`W=BwUJ5p9?vv6>6 zDVAUT69jM~Tn8v%*bXs85k z(lMkG_shm!D;-K-G`f1z|{08$R3xJGGXU7KpsEm($gg3~|#%JoLycG}QA?PZ>s*KA!BYvgBf8CCK4H3g#0 zBa5N<@3~l?*L)yDSG|7EmKip?x8O&Wpn7YiVN_3(tDdi=-j2hW(owjUXl0HDM{p}C z>0T}=?rZd~(An9)j4{EYA8YWxM;3CE_XY;cjYG`U3=G0dkuwrV53I(Uz4bCJS;v2F z@<{3a#v?3})F=b|qLknlc2MTvB3&a-%+{IFt8<$clnAH>&^z#{&EIPq^J@f;mf%=@ zkn9N0Rrtcv`#d|Ie34b*H;?VMz5eButl5PMCP$hJMrSn^h40^^fGYhEG@dXyd;zC5 zd?>R;mD2^)%aCLGDk@60JK;Do=qNa4h?~!%y>6%P-ZvOCJtsg%oSoVA^iy7DwQcTs zpsR^o{SA0{MJ3HL8JWeh=YRiUK2DaPj+s;ktfEdTWAA7E>s$JxF)vL*~M!4d4)9Ye(FRn zpSC1j^QW3J*wQGTeBs|;`CemCEl(t`EHHsN$R0W2`eM6!9ews+(Hcd(tXtpk=;czI zD3IBG{h^>g7?lot-^ysIU?)lpMWE-A_Gx;~`C5=TR_gO}LnvuiM|Em?8RMJqGeWr**Pq4y=0Wsnh zkQhZR%I`cujGvw>Ew2ZcKmKg=4DIZE$?GYlkm-ueuul_F7)JQ{mV|SCWIVSbq-*`e zJb7Sgi{N*Af0TSe@_hy6a;Sm*k;xA+35yIQAl(&J}831uixT&53blt z<(q>8N5I9ICkWm^#RfRJ2b!$u0yW>suExyx)w*qk;2NGXDJKQCgdQxMz0iYnkS?|+?r#o6=vzaL#QE!tXdGvx57C5bvd z&`9Vjncc*Y_O}90#x3m(Pfp_+cb|t3gB}Ch7>SJ5F$tK(W!M4j0Lk8VV?3R-_Y2Gg%5U$$YDE{XBJNHrzK)Ne0MCrt|K2!3Dv4w0NpL z9?ARcBJjt)RZdb$=OaaOwW6NB{?zc!&~eP;*G62l)$ZfBL#`D*4~u_1*C*}`p{C!jioQOtc?cn>1cv(3mgd+cIofHq4`0WV+)mJ$4S$F$ z(gHEHCMFVg(2JG`P*vlv2kI|$ziWE7JTEF-q{>cJ;||fGR+YwbfdOF74cONM zd9&rr2VTuRb@+#wd+uyLu#1>Or2uYHnC9-?o2KZS;wAX&i)A_lX}-o|3o6$c z@FAsHawmjNw02C@Z;a8mj!K?I-jws|$dIcc0q%MsCi>Zg6$ zHJRE|tjj$^g{)3uiYYY&DXnnLMk@(@b9LjZeTHSnNhRXHY+V~owXCmKZE+COQs?qj z!g$11ZRSqMzoP=5+e_Zn;X0qs8jQMGRt07pkv@&@rHR8e+^;iFG&9v4G}+>v05`9a zqrvHYe(L=h#QEKN2}LCdU4*KWe!DBhBdT~6Kb+FeCO*wP`>p6B`_H-D!bae&s#UeL zh~44$*CcH+Y*!G9tEv`gB-d@Q@D0MELrp)24)+oIYHoBZ@%OL{M`q@5Z#bj>H(y4M z4i-{rN7)Ao=2TGs z7%bfAFXe#x&t+#>rEF~yvq3W#?&s#v%m5$aCAu8)2(XHD?EfM`+}CG~My~HYB-Jj* zd^2tP0J0Th0N?)zYfhcGT)jx=5!gp#)lH;VQ44nC|POSlBt{%Z`d|^ z)c={uN;maa&B=H3>BXDbV;@O7%?X)Zzhl`El9ByZRS)Le#-W+$Dc_pcIvE?$Zkc&DhTO;7d8<(=Z_{|F}# zP)-PbTq$R%-^S6{4}kVvK)R)R8&KaQuB-9g+IIO zU~O(*qC!XDr8WAv9G|qiR4l~&Hb?h1N{wH|9uxg}Y!*wAPN52D^zLr*&E_@KQU3j1 z7(`0(#l{#F2r~4ap!I#s8b+alU~RFovuna&n?sb3ue1!JqF=%kTCuIYoq>xh3Z|J< z1*H}_{M#m3Z5GqM&z|k7NfTf}RlfD*L(o0W#IKFo*zN7p86#vf5IJuO`Fof(9Qifd zCbTnLTZR;qUsv+pA*U|8JK9_9_8IR4Cil-=GJ1}l%`9(7T%79-BC3ynj5qlEa))KL zqi-??l`#axsu8nhv9QrdeKIJDf}+@K>#8@BcC(nPFGVG%xfG2RW_~KsLe^QVg z$&RC$2z<)JzA6~*%X=q?uq^2_LGqqVx|sJ5mY9!)aZmK0H5zfvTrl0f)Tf;H23K+m z2zbnxD(Kz$favJdo7}?h?(VK7^96a#MO0~K!6$vwKQ(4B8MM98VuX5gU;Qm^pmd0N zAFy{O;hyVm&=}zFv3LTK8Q)&_r)(s(LhRvFC(hp&Ov(+!`=_THay0UZp&~I~Z@UJ% z)Q|o24T26F`NnVwt&hB;Z7SbfjE%?6Ha{^YfHa#wCL$#wii7oA75Z^?If%eIP>%?m zoc?x3|B5x!?c0{;krebf2@5~%M*buQgnk?ezAQ#A@Z67WwkW%IA^xdLE1hYW)bLpK zV@^&!YBJAfq(dCla{iCJr?2nd`?b^(hU0a6f`d>_Pi9&DC!+c9H|dvSCQ467N}SXO>RsRSx_$oq^?3Hh|Doey>O-hjF4#R-_EaQX}UC+_+G2=w<%QOcU3|5Z+801c6KWILW-xhKuZ;gA@gnDFqg>B;%v zA7rB=g1jX~aS*`d<EYXaG~9MVb@SFB7+w zP(?SK{~ZqxlD(~LX>Wf|lZAL+w{S$oHYEU5TU;;>rQNif{dPeH6|49^$cq&O(xV#a z%8H~jXEPvqL(KB~n|a7hX!se1JcRI%2C%i*@Y)Q}mD!CHSb&`W8$`X%?XC`GfTYaW z?zXXESXKa-b~;=pZ`a+J+SGmd(bflU8;n@=Cd4v11kzEiRJq(w3ne1ZH%V27s8N9n zRW_(xv<2PiGsHC|Il25As@jNVN7qGzc!UOpMgO^5M4K%>0ENOqg6EmZN~pE`-xNuF zXi1Dlp$5DCQK(3fkLP=@?0OJ^)={#ktD8TAu!(do0Bh2XMs?vic?ceG$xkOvwZC%j z=E}TxmBTv2zs)1nx=>&AWL%Ok@DfV0kX2Q)fA{XaU!LZk`ARo2F>k6hy%5i0qNtVS zP%mjE&1RAX*rO8IC##-qrj1Y%llZT$raTq*#Q@%I|bd3T@bpEUzuIKXIT;d^~LE!w%Zf*GZB7_eIH2Y zZwD%E82C^`KKUe@jcq$w#d~RBvj9mt$9;t0p}G0o6V%4TvQ~?&0!Wtdf?Hjq-`2cL zE=-200Kj%Y7~a;8I@G%9qzTH}OsEuOd^CgD(6GXi7^Y*ViA&Y6lM=aYZj*@(l` z;JeEC_z`hMNr7@7W?%a1q91eGNP-7#dPeQaF+exm?H+W`>(6#E>dQB?YA#XTXSknU ze_wEh&CHa1uTS=^ zX->OvE*a?1I|;@od_b*qyuiGUGP5F?$ru3PTHiH1Dgu~C=#D|+lJGs`UbYvX_I%RB z(9lo~-{Z~hAK4EmCB939XxD4p!kRL(o1Ut*PHb-e;z4kqZjMe!iDYw8RXWtoH~nH) zjO}rzD9v5y*+KakYR@mv&VB*Cys?hXPaYIZ zKz_AZl!)EAV>Mwa5QCI_e`mC4T0F>BGRnsOlm326GHJGK6w~qkM&j}55_`ylonu-_ z7iqZo$^FqO4q|1*Xm@U~4FD+2W4(*#!Td4~+uNV+Ow_w2?mRy`F+k--*lfY0QJF4@ zOpgo=5rN(U+&O^XkcI5{-s^_Hk*o6#3^N2b4}$!77p^no8$AYL z560fyw&n8YVibELFwd0O4Qh3?ragb_biQPV9N?oAY2@Q5#9Cs%Fx&H~SK~^&I1)b2 zN5WNe3%`1;9$PsYVos!rdf?Ri>{)S6&OUb+Wq`APKt6CIlxV)j%?O^4!+8dTIHoz*gLe3BM|R$?%IcU%dUmCn1|rg zrXMfQ0ICV?J!L>?x&u7Wt0#_5XHIe-x;Mfc_MFL?nFhxd;%B<{lS;h_0d zLb3oQDv*122XdpZfmMbh{*RJudHZzqdN8b$nmYU~(FDCYxVW zlwMzZ-HmD*q00`7d(PL^j+_33!i{<|$nowx4x-heE1w`i6y7F2Y`51i-#nhHl*n}n zfkBnAFc~;1#Ga;_C(WQ~5qCKn9sEP4BqhKmMT~-<<68D07QA==696;7Z%jzts;Dk1 zJk~Ou5Mo4szFRv}<7Rg_PB(Q*Fz&#m{0YzK9`B!LZ|D!>DlA)5t_?Bhh&z3tA0%-Z zIMbAU7JK^$bc!#-!@KPdSi{f*e{P^e7Qoos3;CM_6cnP_uo+QvBSuxTsW71!7#LUr z@>}TnAF=plh70xru5DbV@sBp7%3v*;AL-V6Y-3Zqd3fjr_;)OYA^u_Oerew|QW!@1 z?Eh6Tt@9dem$lfD=_yR|3u9<5wagL3cdb4x1lp4boF^@oeDPlVLdnXYiwb~zD~*^oHatulAVl`N`uhapMW>Pd zZxwTGlq<;$SuyQ7>YTCQVe_WpWU!sw@O?k+AR8Q>BY z_On%c*)%&L)}W_2C~XTr?K_B#XL^*(Cj&3Nz-BJ!G^r=yclb0;ip6nxbyfQ_@*Jt} zgTxMTfDHnqmeC0^y}E#EA*ziDNsQ_eR$at#wV}G9c(llmx9o2xT)ixkWwQk&0n+FM z{qL^#@9E_1c?2kM9i5${Ar;}!+Z$3^@nMs1f>F`t$wuR2c$aL3w~6F)G#~>6yp@B9 zXE5LAeJkDHa_*D}G+nmgnb(9_#m;i38cPo#3gjtwr+zpkmPtJ_xRGOy1BCh zJQ`{*)aHn;=@$ImFX4V*2IjtK*yul_emkj%Uc;pr=HuY_s{xI^DR52|Q;N7Q+B51Z zy3RY+n?yIwwr7b@I^D>-vBCSr(b#?WV=z8K+upmm6X)I9$|A^Z;^2(^!;zmN=FJ

*Q5LcE zQ31gT9M|<%ms&ju?*vH;eaf5C*ms{#f8U_V@N#`g@q8F(+UASRU{*a4q0S5um{8CL zeu=QY0+&(IFMxlgFES{vxk2}SQvbs{!+tPP*Z*R)wmX{*=8~eZDU9r00wocNVl78E{?k zan4mua|h4m_wU~W3++3Nkb8U7bR-NhSa85^?(hFY;NoSSJ@^U$BOh{eXO8Y|Yo&yr zb}y^HI7)j$SOMqqEvF=_84ZnFd(HON6D1i-;wJ%)S1|Qt-(b*V%%Q z3-4iT@|oLP#c9Ubqbqb5cujv$aWwKZ_*BWb(JyS~TT`D}>)vF}y7AFyTt|x=cG?+O zYVzn(us|;NT@O?po7al_otKMyz{`UQrlS~mxw()B`PjPpqBx1vu@uso5~S$Hu=Pfo z6U@30%hLEX09MvN?!e+sN83uAx;%0qf zU!27GGO;mCY7@@Q^Y8xrLyEEh;J-}g5_tsn6W_tuP_CDA&mEN zf2PK}@wp-Oq+c84(L?+}8Q8HpBnJ)uw||A(OCgk>JiGQQ;LCf&VCslH6x zl$K1zE)5Q1(N~9l>8iO(1{Dta=GvDrZD+qb!@V#S2#D{$p`y$m>+925oTa-t5iU&p zC`aRt<5bNEoAS%%CKV;67Vr(sO;_@ zgO3g&n}9b^7aZ2ky3%Bk?bLF38*(d7^=hM%X1%kvzy9d{5F8I}s!?HOCBIi@phBBM z`r2ty?XO||M1#BK^A8_x!*n-(*|oZeO<^Sq*5IxP9A}eRBh@~8Y(Q#`hUPY;L}g8V zM~^U33ljH13xCvL(Y7%b`u5eAtEuaVgRpK0SK-OXD}ey2*Du=lH`3|v%2s}+QqF>l z%`Xr{W7V7B*PDF4ruI?SR99CQ`jcQbTa^C+(sFO_Re&hf0F1x_-UTu^37`VNs5Zh& z`B-B0%jqQGf!qq`Mi6Yj z3J=FnN$kn(*@)|d8~+YmUCvK;9tDMlGLzp3ah_&Q(;l?ZulnAo{IlNW!`s}!6kL?- z)teYCp>}{9lmQbg0vb1Y1%>7Wm3KXk)YLoos%i=<941=-?D>HB6LiD7|E3HN^)t>_ zg9@Hjl5~qHb{`)D<89{n1SBSAj~`>api3?KZZuXkEZ!L@fe?0@N1E+|Hci)MhEmxwFxZj}~OhYFFP);W&C)OYbn3jzh zvprhUk=5NSL|od4u2)w(rMq zNfw4+yBk+umKE%EQj}`PBq=j(tGv*rX;5RaBS3TMf$p&6 zbG&i=dMza>>9f()r`sp>js1tpc4nZAviySi;6haESn;5%0w9SksR>}-Txfy+0|k0dkYLse1hy}gQS#djV*%Ah2CQBb{5Gii=7*uURO$zF zg*Qfz!dJrk((g&ZuJ(MQ;^Kqj*MUa~E;(Im1QV=9ow@C)!E{TxdY(_Hs^|TxER|Yu zxbw9XC#yY1tE@)S4^b`$yKA+j@98xLonA3_qUtYL8Ed8J5IrBjI9R`I4!l&soE~mX z90YNw2UgYAF2EB(#$y&J2)*!$nfTlvMvI7ya1NQ}Yl!Ju>{@aig*qtKr@p~P!D2>Y zXM<9RX3(yD0rgb(eE%1Pu2AK`^Osj|%4XjL4a~9(U@+>HAN5ySGp_uH+rk8DW;bMqzV4=1nu-;! zF!%Hoj7(oJo(9<2Ge_#zcKpGUyKTn+;1#gN{e`Dtsg%S1o^>CUZ;br#qIj3YWrw8* zD5zT`3bE_tAtGsD#U_-Bh~J35x`}}V#wO>$?y3+Ah(v&6w8544>~i0R{ecZc#R#<& zSD-nnYd8h?FW(@`0SAVK0D*n4#&Ws&NMrySz(@Y0a`KOV0A*V(ND*MUuNa%c9V0*Y zcfwBVqCZX~gQdy9`99K$pDzQs-P+&J&#^CHp2C{t9=x5J;lF=1_8R&L} zrq8R(-bCAfz>gP}<%RBav`@yb5DQHoG(GCF=>8SA9KQ-9WqKL4EB80m`c%v4tiOInU5Q73U~o z`JDh5CX{e+4wPSZcP`CxnKp7OhTnLUN1-fj$Y%}ew0tpWqm`n}WaVNS1b$%abg`SS zH$L`;WWRKK6YuegOw7e%dATjT#OuIG8Tq8GRJJ$Bm^y4%vhsJlXMQGsSWvS_=N7!J z!%yJ7hB;TBW-cDsH*8X_Dq!DtS;||RxzeP9lH$CT=P&M(O!uZcR=bjQepE`uSExCd z_Z_;WV3ZM+DS0#zJ0YIk-7R)yuNT{n4HVu!J`5m`gPlSfV~LQD=f=*Eb0cylXbVVJ zKR9VnSm;j+KUud~@B;5p>6O*Yrn(6ua|Gf3>1|@FC~?;jS<59#`pU%FT5R(dLy<<5 zpN$*No|@BBU^pLKyYk#n=$~;h_a-J5p*&sxbJTP6Z&)v~^uCTqK+*VxBOFaUlqn(! zX)0MlkxZ`D1e$FPN(N(%A>-qi(B!6vpfI5KDu9SL7s}>=#YIch_ke5P3HfLtR1Z3e zm)9orNLeDlWh|w{#0;K(?&*id5fWw-KRyuAUQ;7r|6anMqArfPq@yiIs&FLWI$dVf z98zz)v&=qKZ2WalPOfF`+<$;iUrn3n3uIOPmjtndprLetz6&{@aq(!@B1UEI&prif ziD9(R-zo7BP`P7ZTWVhyCmQW8<8Jh-ibrYY?fczdp@R(2F z88i0x^J74bHHM2fQErQIaym}d*2$|6dvBjOCJ4G0#FaCLLZ(u)hZ>4w%^Z^iLw{svm8MfDZz z1}PiLxTK^uo}S0{JmewOJAX#lGm*G#YB|k3Zh{{i-1~j&i2^Svz0m^q`+9dyYxaUl zY{}I;;MYQrzIdOagC0z1 zP9VOVzEo$c#pOmg$ql0({RX+<9>#zJ1U-j|24L%QNg`F)dde zKS_3Ygh+8^MTnYc)z^qTt;2;jPA3gJy^`#TG3msx_R%k@;sEQ52h^A@BBA&SvhR4G zx2X=DLcn@u&zkSrl`B`s=;_b#u3kTIgj~s!_<^P4yTZb#U|T=(N8uLA>*Y0@6OQ!X zrc}1wRV1CFQX;t9lS1?HQu=UD8mb6;8!(@GUB4IbZB}&K^XVDkLyP{ST2@Tj-qZRy z-D_sjW0z#Q);Df+m~c^f3o4&h#UXRK_u`r9rR0j4=-8$?vG;+1516i^vNC&V00t~DQ`AuB zn)tYGmx8ZI*}n4FlAl&AXbyF9pr$_zzvC^6&Ae0}SR*i-mzdbd5@++N0+ z@Al!gBV*HEN9d4z!nVabG@{;Ut*gBdMmh?liiB>b&p5Pc%JY1x(I{2+QlVdXwCi`s zltKW1(c#LMdws|H>#L_ikwUP;$W{wPxo8VuvIx+KcC{_-s?;p$qJ9Ab}gGCX$4 zLFhRQFiqgeQfo1U4H6hNU9BmA=S72%m{@IVFgx_DD~^c)4-+0IIneJy5H>2wnzM1r z4WjwrR5YD~CMehP+$ixY3?&ugVDC_{-+ zv%$d6LBir;Q~VIAgW5S8UoL(|>nuUMQ%w+A8}%w=|br7CC_ zT3?z4I*5LwSeTmCNjFJ6h!DJ5i4rR-$+%90TRQ24s}%pkO*qdP6Dd0Z)5f~MV?oWY z&Kf~M&8hzxYNB5149whB&yni`QNjW1L*qP>?zf zt=ng(zekM87JZ9^n^5C=D7KfFzpc3C>N0uQm-jdPPnH*&ACvl=Qtm*G)7Yw|H700N z4MG?uT*EaU*Lxv$&;1UA9}_9u^4$^g-lGGKmj1^2dOu|X6Dg?r!8Tq#$1dkfHiT)K zRU3WBlzUyd08Zyql#ZDT?1N98LGEMr8un}*UkYq0??Ob3Z4kJeynq>H)8EhU2CPLz z))yDOgargVi#ooyn|*XTprkrXzRXFHP~z2L`wAiBL@mt;Nb&C+lBzxIl=42{S+*VE zVHTT_XTHLz5ceXV@=BD|D6G+P{}EEQE-uJ@mY4seI8r;y;stDQcoSLDsKJE?&iM+R zX4gAXFIeB7QrT`2|&xWtJn2Fk3J3DcwK4F$*?u*-~ zrUrkc(o$4a5AD@^22Mv>9`#7N1$BP@q?5}4PcMyQ^ZlYD@5%4q#mz57By$7C?bY)X zZFkJf!h&;jbTn4IU)Zt4@!(PY zR~mM`f~I?QV|LYGhj2;%y@}F$f_ww?`&wuSQGi~djMymb{`~oeqzJ4wy;9|3aJI^# zgMEa<`PpfaZrfi-P0bK;%|uR*_D(az9e2atZyI6>y+B)>N=eK(c$-u^jD80isbQFs z)~hIHB{-D80v~4ehrLv%^P3J44b9DV`-|ffEeH}tOe&|f__)w38py(?M<#@qys zYjQXoQH37eh~CazkALU8*~0Wid5*5JA?Rq&1$?*7O#!HM12ZV18zO)I0Oc8lg6xD= zp}BxZhX6fM-*KRTW4EUf)|%`F^T#lET7bHbCsh?Pcs1E5zzmG=zaIw}UqcjX$ZY+z zt+2-dDpM?g$6@#6iLN(+YCN+@SOj8gb98L$s#he?{>vlI)#2U3%xu#?J+eEWoCK3! zauBYR)6!;Q2``}Ba%0`M?v8g6x7{#(DE7V!q3mOd_;)l*-qgG=yWd?M9_jGI$DR1u zra-ezq5ebT!eQdblRJXyufuRqnFb^M*TVh4g%ukjasY%oK$TD6xKINUk4(@5JqRGg$x*h*N;hGV8^!T!z>;y3%Ce=->F>vKMA3^AIKhII92 zZ;HmSL8^ps^$x4|qQS1)bdBr93`^%7o!biAoi6P{QF`_Y7TfVXd0_dm12Y_MJTnCS z@c1rkdhEHjRIkpJOio^=M*`N@Q~BG#u@I&`W+lsu{Zp8cvqe&4V`FccdX6U+(1loJ zIbeeT++02G8}D?51AqJKkT{<4HIMAFgohQ0OM6`7zct__YkD&#fKymVQLf8;D>Gbw zLnhNCvNh>@gX$?R8g0y$$TZN9> z^M<`>zICo6`ewIagU7M+^HGPoD8li|A3h6%YgmC?;V*JG=)`v(gm%>sk;kE`qCy_M zNMQE76wM&WqB{&FN8c>y(Aq_p7sxwYBJK;=x6tU`R|yGB*hKSq{UYbRHXA*Z}``pB%}u={ry z&w|!ffiWmNbr|5yR$k5{p%hPu-qocz>^HJ(17o@vXnAD82Y3PQE|gpT$Dk-{P%lzh zk@N72nbbd`y~VvLqpFR&FkFrLLTTj1NED_txHS7j`Bnvcn+catP7oAWCn#KoN!Axy z`uk2M=__NydF!WfO!zR;nPh7!LZ>LrK*odlgkjB<_T%{#A424baU^NcsO8SqD~gZJ z)8(I^*c+0lv`yh1ZyHxm36`8odBF)b1MZp-9;GmlDZ3m-s6Ewz<4t@$39XPW;Y9#5 zia!0}&o^s>2zT=`fw>A!)cp40N&K9ek`hMN0QZL|IM+c%Aq7Ip5|h+v5wEX%w^we? zJq}m2Uq}(TYLkScmhwcJQl9?}e}$b+jCML&pqt5+))&XzQCC@`U?igv#D|LE7XL69 zfOgX==Kt4@s6@yFF?Qy@q6RZ!iRGVP-FJZ%hxh>*|HA_a)qM+0l?3oh@HWiBd-meR zT>Q(IJo#`)cJ=p%x0y@n=up6(&mBDN4h{}}fZbi8aV=M`4L^tyA>L7cEY;T524%RT z*z8WEv86EY#P=kzkx?@ze@XPPXvdx6kmJU>I#;^*2=Bic7ut!s_`Aq@3cW@&5=Xyx ze#GB&nGWUKCqt8ya1v#xLtbP{ue)wO^hN8}mX)i|!V-?8vKj5%GjT`6df#>WS|N_~ z$?2&mV^AQJ;8_SEA(p*dB!$q|w~o275Cfw>E-V{{LVV!S}Qu=^(`zSMX~5Ln({k&`%H z=Lg<Agl{`No z2YYvMR22v;kLF=$_XSETSB-QIMnd;ffCS$H4g*&h81gZMcp<|39aLr~xG0Ky?if-9 zqbmV{*Nsct7Cq`&0v|XyICQJGX-J%l?e2#WerPHuGwWJ>3%tR_c`9ysG4yKsWOS8C zVjS90jfUVp&&G>G-hPxw4c&6c7}kTqx<;mZ+Sr>}y`MryCXZv;(`80KEs7bHo43us zkT@ztjDc^$17615@RW6d59H4sdLhypW~H->pv%hyVVGdC@Cg=F0~nFqWoDR~3;f05 zjW7NwIXz($Um@T!JHqn9YzZH%=b&ibHIFpK4IEQqn`va={fEOwa(>TRo(@h(XMwcJ(Iz2Jx|a*u=H?1t9oj-U(Dv#5g4hi>!{tl4 zm9~^fdhc?D|4)bwN_0Nlw;z1d<_e1{MvOOrsanCm^xiCJ-o0u`fQ>1El9iRUk_dl~FBpw|BN4~z=bTd8a_hs-!}uo}UvoD9gV@N9Ve4SQbmx-nz_ zf+g$z14TW28)sYh2eywJ?@JD3{d~DAMgaVc^{Af;@9m%DehldC(#>(nrVC*;jg+kZ zC+h9*NUinnecKgPN%$=NOO50$Ct_x4$A}og?V=)Kf98evl;vn45({e9V2czKN`{?* zTldp9JAu7BG-{`$QQZ|zfl1b-ooHwBYOC(}W$2~u0TgfptpJU}F_^sx(!}QL&c~zEmB60Un~>XclXIAR=tap4r>4{hILQXQ0uP*_)1Q{BT)&Dhj77tZiJ( z&Hr_N6zeNF+H;maI6_E@E)kBr`Lt3+JsbO)^x)ouMP_`=V5C4bk+RkFNvd($U0 z|Kn2%ku&aCvO*C1S0JJPn+PMMTK(m5_o6uTz82bw0q23=cSS@@%kCHSp91wEA9ic8 z#KgoMfTM5saJT#dV?LrnJoq|S)J*sLH!AhZ4ifG6hY;$>r-D4gn_XNyj0%0y1Ed%) zdK4mT&gz0JD?3Z{U5iTksVFGc>BW4@qk9&m%f>6g1=`HYr+4s%C{3EAzZG94T80d} z`ShQ$7o^m^_pw*deL0*$|Mk1{u~26g={)5^S=Vuk;aH;k3D~DkYTMr>$9^dI`r0>O z&Bew>A!d^W8WZKPoQ{E18}#-IuC!QrSy|woW2FJ)`0hZUx~(a^F=4Vdm?4E=vRsG# zhNSb9fQ6|k9msC`VPuQ5{6LKxig8`giRb9}c!XJr5xPfaC5aDwq5FRp5=2fYr`Du? zmW59ph6yIuy8DEExEb^7DYcmRBfh2iC?wBtFn>>aasJ6y8oVIL9?ks;4Uu7~o(jx# zl`xF>fXUqfDL@mavpYFtz~*DX3%R|ih^{<)SJERs0kNamKo#(I9e;lVBKK61@GcP6 z&2}6@%3qi%M%UQXMhu#*AxfQZ{?{+eCz_Ey-z~bCx(y}!Qdd$A4@8iiA5(@lTTNA- z38|dZKan6l1@?rss| zTs1)uIktB7qh0;8Lc7WB2Rmj>{&!j|+QZ3#=Up>CFyKlNOe2!PfNmuB;QtqUo zQE*7?55qx4w>5=SulW$Q3$WcOZvpRqwBe^dMU@Ob4}-MShS+_}iT6BFfS5W~3=s5=*Rb8gGar86Fs1Puutc>w_ z^~>m7N>$E?*1Q&9hn$}wBtRC404Hku=|U|gc!|L)QOutg zxLDyLLX+DGPNjb#dSKmf$RlymNqv83=ff*36*Ac*Wrc~&A}Ypfd>-8Hhhw_T*QuAE z5jptb=BRyP5e`^yzI*rI5EHx=;GUm6+!=xz6~2a7H?S$60S>_dNR5r1Z7uj}s~SFAGmENP zxw|p27zJXM=n70b1n*0o$x+XOz7;y+KCtlql`TUD12PesguRcC!Y}VFJ(`V86GBFn z_`Ozjz%a}LglhNaE+Q2Xf8eZA-?-5uWyZaAMGp& zQI(!i)4s#;6lkR`Yki3jw36tw&1u?vFZ2~o59kLdFG*XK7 zR5+=tlTe4xqZpzG%-=OrwU_}>g9I3zO9^1n*WS}ZD39b^2KE=glR*9nS1)M4Fr!OO z7Q(ptS&Rt}lQp5}^TgO_Urv|Cz~j0PWFxub30<*@17EHFounq^^QMT34Gf9}?B0#N zwmNw8XFN*kiw>>3X>aKG2-8|zQfAb5A8n6O-29&-d_2Xk`VoAa?RC4qbhf9JTTEkD z-u?OIg0M$Uzl}wYxu8cB#vU)w1DkL1Cd&8kvX(R;5e48~(Tm|GASmeVtQ!pEwF9Eo z!RXA%YTxC1s7u8mud}ksz^!T+jN;;e>?Zshk|?@?gdzt`#jv>V_K#;kW?2K?iOTcY zy0~1w9Y#Jr*3P~zp17;k1Ei`Irc8+OrKQdj&*g%Ye~?zRcef6gVMm;Y+qB-J!xf6q zV+d>+o*5V*z2oq$6{ZyESf4;=dlP(VARbkZMiW5UT-tC%O z1QWVtmC*c;OMun%L{55!us3t3k(Fh0k}0%%kX+B@+if)31gUkJtFMJMDY;w*z`S-1`)J_r7y}j4+OLIDEOVvhrJhy50Jf zK5;E?Cf(+|^|kuP-HX}-Y44dnI@HA$ZOrq19U18xAQ*j{92?umo2PvZ8(dv#zFYH6 z$`~6@Z+0M+t(#!O_MxTae7i;Kf#J=3NJ%+|`;Qy8Nk_)-fmx~Lamtkf^so(=x#sV# zFs5XU0`hze>uJg3pD!ejpeEk&zoaS=ya9Q;kPPUVmOp|9KCKeu-V?V@c~n_%sPuVo zK?*|$kOewKL`A<``~me}Ey-i#@o~>sQbAc|uC*fZO5%}n_oBbLo@0UJbUSYfZ+nXiXk$pEq(U@dHnc1IK@=E$WtGv zbm+hb`q!_&esm=&*U{ZhsMk z*ER3F5Hhhb^D$jEid_I&&R`#r40fqEA&B7+wR)Dk8jszIOL1rmxx{(fGHg>iKXyn< zcF(h{KO@Lm#I*iHz5n;?jF7i`^-l?_kuI~5D;J#qB(9m|a&^Dfop2hy2t}evj^qg(YHLhelQqRij7Y+)LyB-A;c!<4^XI?Q( zG&86EtqVAOJ;^sKzDeEax3ixFXkxWVA`;BTL|GGVgCX#pqX-H{3y_$Hc?49eV!0vhoqnJu(iKD@r-=j2NRj z!RX<{FtG}@?Xbp*SC^D*StT{Pa~SgFrx#$TE^kLxJU~9-HR2>V@Hrx8$cE6IHEV#h z=s{!6F?42Eh!EU%VhS9Y{$n!cH82)w_~y`XCtQt8PO`~~jHV;STI;#ET!t*8&rk6Y@{*0N0oZ83?>h$p zLBzn5y$ySlUZBFU|1FVc)9jmx_Jb_s4E!(6uh~J? z%zG2R??nNiSyHAso?~e`jZPQaJblOZz=9*@qvO`;SE^DZN@mNw^2nhoyc6}U9)8SP zVBV7a*_nrPp((1k*l~-Utn@Y@4Ko_}&KvEQNb%`AZxV;ftEVTwj4z^tu$(8rxr(?5 z8+maH0_SjA_s8-PGe`vsfGEh?NvH6vtT{>EXZOgW)3*Xi%x!m?&e;CU&=dV|(QQT3 zlvF$?nGu9=Ns)7FA&t)n}1};L5L@`G@cMM|hc_0i*#TS%~L;;lN=iB=FBn>Uzh4&Z2Y6EI%l$ zH+pRzMdhbhP%Efp+(}j4-rMuy*lXUNQx*Uu2_oyU$WVj2-lr|H6%+&=AhcPZ191|J zB7esWibqx$$Pm0buyI-gz(So~#ItaQMJj~RhHm!G7u}n{4@-J~Hyb1PBK{aE$;+Na zJUqNN;8d8C&SUYZ4DNvTukHQ`0E7q_t$l5HKPVpq=%=usp5By@Yeo>(i;J!I{Tyri zj{<5fMM2p2$eiR-th>y?F0xRsSYOA&+c*TN-{&xMn%CHLjgpRqGNVB*2%LSLx;JdoY$T{t*8O!0(zA-z%D5 zWHfSGbKp3Un@Ti_fX4L*Xnzj6II0w+brUtt*YQFaisSc5*$Oxq4beRz43RhTaFN6t z9s8TF7>(1TzmB|BtA62u2 z(j8L7_OpVH?0*5aD+vijLB5EnZ^NCru5$>lap2}IVQ+U=P0ugv~E-8tjZ{NLF8R!<7X`-AN%hOdq=Qv((?b+bs2<~Op=Hs{any-=}#b?yGei)Sgpug zi!Pr&YhdoOxL_XLph4hQH%%%zTe3vswv7 z^6fA3Be5~J4+FrD(JEYu!9beqX*Z4Pg5)|QS!>_d_d7NAU2~I&(dSr($UKyEO!$L8 zAx%xE2US&7!j8O<_i`cZ&NRT@Kzf9!5>`ymnnFp1QQ1(?@^fS$FiCpY z$rIW%z8|S)0ZRiPMS&($CKi8pS0t?91w8Pl2)ZQ z9El{4`@FPNs(hi(xH`lh)XYar0Qr&tlA4XcZULim@?qP%c;v&3 zNlcV!&-y~{#(rFPqN$tg$#4!6!&fTAVSV^kI(z%QLj&h2K)bKm4={VszViSTcUOww$tpZ&j_Mj?OoM40WO78-J8vDMX@R_uYxTCT61_ZO@k) z3ED^1uMoRz2B8`QX_nY-!Vsp0{B1q6h0s6?P)9z6nVG;3V714(+Vu2UHUes}8M!Wk zN=n@egQ05$M&%CB!Mi5CcC7A>eoZ7`aeYUwT2gZIzJ#|+ z0P5o~bIiaJB&5kOkbTrQ8AGD#u3+y(_ALI9W4xTqtOWZN5(xdZkb>YYn4c_5F@UaX zj6f(Tj3am`n7`!#r+uSWoC-%*mlYo$7Z(XI9DtnvBqHLHTKq3PipiTTEc#oy?=i|d zFC;-(dPXC+$?$%xu113n0`yg@ph{k@2C7UZF!+csm6uX{TSq>`CWTogN}Na7d94gv zUo_bY)_tGs)6UFmxG1F&>xU0_^T!B?+Cd%g?#~uHiSvMK?!pT^u&%gT!`C1ivo|I% zJg~J2a^8k4Q6H|NIDO9N!gt?GnKLD{mC7%*iTi(-8QPR_T=WC}N_ov|MU8l)x42nM zy3zFkw)HcK#p8L?U5jEF>d7$#AyQbN3mU=C)?BuzPwH7jYS2B>%vbIKRhli@-{_rt z2l$M66`}!BUB}KE*k@3>f_*ReE!#_G{CH-SGYu^YypUk|oT!-C*bQ^JAT?A7en{OT zxb-0!_Xi+%%M%}%0P4S}v{f$OY1oXktCW?mw-~eH05jwEO|Cp(wH!&X|Ld`^urO!| z5=V^1Qpw1%hk)$(uN(Lar4^wThLpg5qN^q{?f6HgOF#m)$`No3UxCU%iHT1VaZ%c| zDD+B=Se%A)yFDecB%^v3-#wH6$yKT+N-DJ}S)>3q3Zp{MKtB)@6Jwmk3WvRhKT10K z?K0`0f>wu@igEP%>*%sWHX~M~Mj7gPEj_Sp`@nS&Di>=4KG<|z2n?aq20$LRUc8Tf zt6sQz;Xu==#?8h?t%<*W0Kk3}6hGK-_Z=yh z+q_~m1P$v)Ff5<}VlgG4^eoOn2ix;*9v+)hAueE<6hM^Nfcnd<-Bczo1iF-aAqQx!Sm9)pWB7*B|boX5F2E0YTgo-FuOd%HGlJ6YTIYYt)7wx=uyJef-tZ5E zVb4acNqwU~bK-Z^`ZUu01q6l!6rkzgNCt*r#;s@9LsQAW(AVzNEJ0Yg!JGTGimjA? z)(*Vyl3k9&WO&C&7N_`YXL*QeYxp|;Uw?5}oAhUjufb4u1N8_xq#|RqIlQDB?5g4&J#J?!LEfT>_sT%6MIt z>zpx3g;nB|5$$c>+}uPO>RdN@RGgi86Z~rJXyEnNK}PF-a^UW{HWn)k!s#|>L15zD zx^?T8aabFVs*(}sskeQIuI^hf?#%_251eb1eKITUphpKe3~i!v2WV_4`(O=-tb@Z; zBG{3gp1*Dy1cI+PsG#Wv=G`XXULgVaY%N=deIOkM9V(QBZbv1A9rew-&FHXS1<n0o>_0>OPM`|TFD*p?UmGd}?C7DHQIjE)^_G*8&MyBFd6~%y#bfyyZxa6X zmG%dq$>E6{`prsJ@A!DxhC~t>%@w9Dglhn1B@`<@|4TXiFJBPKxV|4haXXI*MXCVV zn8`WTFQ#nGuE5=V`J8zGob+@Vn!Tkh;y!i56AM+rrpa_}|9q;kf1CAv)ngm^CWFnZ zSh$!eB>4|TNRrzmv8WNUZD}4dMQOqt(uU9Q?+9WGIjKJ4u0T)5TPI%Y+i#C&yiV1f zblWgvDfJ7@!18i`hH-!3*5kQG(6uvNSh}kLOAO>M(Qvxt47Gw(ypd#jc{oS11g~&2 z=PEUIByba!Jw<*kE<$AF7(~p?!kIkwYi;eg7N49|6Q+zELKOO)TFggChgdcWOESD? zip^7XB%?4jfQsO;F-9j(_wrH1o~?*6xGkf!Gr)Sn>@+UuoJ>F+v~XD>P2zoIMF zuZAJa!COG0xGZVYn_|{-yz^3j^YmCBC-0A#;j}lcX=PGbvaZfHs5lk~&7}ilQ@|`R zC@9DaBOK-u3HP!GQA|pZn*oivG@4R|F;3?$nz8r^;niW3Idls^_X5DpyP&wi7fLr! zZs9j>=o5_AMK|G;j11@MKf(y3`MVq_p6hV&x7W&Aq;rPMfqa5TL_|ySgIuBBDgAHi z@UXUvy?xQB2xzBD$FM{>{lrKj9^QyGA~7zel+%KyP(exxRpavgt0PqRI@?LiQb2Jw zphNM2WX!d1um(VsRaMg$H#dWpfWpIpjrpYL$)2dNkkB|X@Xw4jK}mI_N_PSphH3HE zA0G8>FjHBg3_e)mPz6sc5V_2wxw)6TSHIn!n603rq7s74>V>aBs1ygsyC_hzg3rSn z;7Gt4CNaONN`O`>&8Squ@|Nw(f`VH@kbWwl_MZx?!kQ4?$Plo6c>}SX@HHZ%qL7_m zJHB2uH;hXEDMGWgyGmIK3@0UEf|gkGv9rJXO7WJ-xx&w(cr54U8+#*G3IY{Ch2|Er zu3o>sR(_{=3N;wFYl|CWSDNiACnXj9T@3R{aCueie_6S_Q02!~PMh~}*X=O4_d(px1aNv6vSAY8}W9ajFtm`;1y==WEB*8vqWY&hdfmf#*CIZtYW z)@khT*4&&LS2Dd}qqlP?+R%7h*4gy*u)s9>m19?b9}@a@kQzDcZ*NDDV4-TfJ}Q1p zIErmbzY!q&yX!ftcDDoGq8ksZE z7Ae;XZ~czcD-IO%T-KaEc?AWu{~XY|6iFmVOI`i>@ITYX!*)E>bQiU5Y(=`~6(b4) zYs3+629>#|lRHgyb=2^ma3b380o4vb8*3tP>1?}PtS2Xj1LEE&u%xvUNb^92d@nV^ zKv7aq{jB9~`CL6(Y+;8U@t;5c z0^E~i1Yu(h7q0AZ*90>lc)%jUO@8&N3Uj-hq*C&NfgS(~KHwJ^R9N9pRXf^VHF!ZU z*$G9vm4`^;^zZ#D=V?m$9IZ&)@Ig1+S>*im8Gtug5X$Xu4eN0kybvBv(~k#)sj8g< z;kB~5;f?!r#$lR!?c-m1ESmow8;))9KjWmwa^==gNH9QL1ZeI+SKaUhrt2s$(^!Cy zls%evX-QXJ=4i4_X;E~*qfQ4=TZ0fJQDRbm#iO29K&>4ros|F$IT3Dqo`2oj-~Aaq zSliDhD@MHlT+9anEHDY%9NH?p!hJkf2gg>e9>a~rHNSg^4qkH;8?0<@kSo49R+5iM z-+ymKL`3w=>(Qg@`jG0~@$M=eoeMnEFDjE2*b|d9DHe%Q0B8Vv^yBgVR++r@wo{eE zs6#b4W>xdm7QmqkU`BPr2a_hd9DXt zFzm|xA%RSw60bC^s*4Z_pW-yKVd>VRlEuC!Hvh)-#o#-AD_)}e9be7eealvAdo%n) z^GW&`ReZr)_kvj4(2V`nsha0QfO*lGE^z+@CCANE-p%x9d>=-D1I+zNGfN@7rKsr$^eL(qxKyx8?6^= z<&aTPU5b7?SfD{qL3RFtx@&H(CExK|C4~_!NknXH>;rz##DVgsX&Am)HNY>w+M~+~ z8m~9_IACR{U&>IAfWr)2&J%AkF=2^hkemh4k?e+f**h-o?(T-l=YS0sY4-Tq{Lh~+ z2OT6Fz7?JWj5jXI$|^4j&-fWM2Y9KfxUZjgXnh9ZXT3FWX6%3!2XWW%S(hm(!{M!j z;zJK`;t{<2FQy(+<8JSODA(e$@kKw=(-ZpoH8M>u-Lr6PXL^UuO2d*fq^t8!Rc|{~ zBlCw?r5dOU3i&+%QM{zHU%FB{U#DqbQWdsfc~}Z~o5AwWpX5UgUXEZzxD7c>Nc1qQO*ZQqY=iJ|zopj|UJ^i~4C)EUGcghN(Vvnp#P$vYVt86e2rvbe`cl5q4{z>~Jy)7;#W(Dmb6uIb$lJ|0^o^iTzc9Vr&?9yK@$0UjCVa0?t zZPd$s(>*T@?;P~-@fkOi9RrZ5Oz7#))>-ivPE~X`Gzhlo)AL*gEJ^nH|>qWx2Yv=V~E0jvQy%8>Z0mCR8we2@u0!*7${gfbjGtFDldV19VHtA02Lo7n)i)i zzJdi#$iBn+4K>zGO*S!7b6>cuD3g1Ol<~s)OCro$&A>-%KHfck&KKZn`g?v*xNf`ob^h7IWDyTrN+;O zj7)t`jsfoOB0rcr$h5+aq>bmj&ZQb?)uAF^iQEjlLxz-=iJ54jAG*W&`)XtAi=jPq4uWhcKlCNWJ+0Mg3R- zb_pAq51==xWWJ(=t2Xk=s5D$Yr^qSSK20N@8I*Xi%Dr%20izdIu#ik@I)TIrUA>!Q z!S&Ft)560BtilI1O_~Xme)q@>3l1v8UTw7BaYV+@J$3>W-KfXF-xP#xcRyIYhV1R` z_7rFDhH@5w2h|_(4D~NS;NgcJ1z#PIM%+u6mcDfuV%f}s#Ag}^$$MT5p(W|-VujgRtmPib1Wl_emS)39Ulv~?3idAa|S%Hy7XednZ1fob?q zw5Os(I@=ubF90n!2)8gWMjd=7QHR}HIoK$p*Z1p-0I~Vj2Sa1#tk3&YLrym=`A$0^#@**I_ zoTPYoiWq}eq#lD$$4Sfi=~jsjd*Do~|2F_OW{sex#sV@zMJw*F(*m58i;2-}!A-ap z<>_E9{%3c4yUqhPOAWcXPr=mD$=?1pd{G0qg5V)B23H*l5@LCJdg@%jl03#+Zu+@m zUD7aVQMj?Ra-QxNTHUtFi&=@L*IA+E>qx^umad4xGwPic0P!ZEv#JD~MuQfdeyo=I zUVi~aV)`k>o=bX3i$IRe---*=8MHaV-asct2WxrR$4Q3%sCeqb;B<}|+-BaTtfE3l zlxL3+pqdYVzrKaOUjx8K4t_{i;o3McuFM$F=uY5j^j7m?fT!hsm{RMZF=pR~)nHt{ zy~s#g#IqInE}rpwtZ5JDAnA7xD>Yi0LtpW6m(eI#98-CscGSP?afZmeH>qU*+Rle_ z_)xmJLi!7lN}?m;^Y6M|@#qUQ2L=Kp#@~+&@LaR`IG=mU>(<89zFR_d85E&*K*? z%KE|X^J_lcAqshEyo%FP5d^?i*@TQD+2`q>?2*CFXt9^a^EUZYH&Kid!5D zZ`GrZclu4e;&hMmhwr4E$rIB{%oxqDFYC~a>K{Vtygby!VuD-kJPivA3qF^KsLR9N zvfZo3JgzG*-!9r5)faz0R>)h{eZA-QVjOo~#sMh-!Quh$&6Zr%0V1{JvYL{V5J~6eDtr7sdrvBUAr6Fknup+@G$9@8ZADC@h{an_)q6`R|-~E zRuW7Gu+I^$1yaCVVIi9l;)FTQ?$8}KBk6}Ggrr~*D)Fp{{kchm@LmHU#1zY;Ea8wy)mvZ2Hh zx|x}kv@xaR$(|O-*t3i6E!f*dSXkr8EGocx%H0g*uY+68$%waL zbAO4-;!}rutrYXVl-jB6cQAFDU{Dclz{o;v2gRkSTaN8Pjt_7 ze!|*|50$58_l>Jp>+^zaeW}>p8Lr9hAw{i6{cAEtPgp6XH1s#mG!}xuKl7QqiO+n8 zOulIu{ki1dkL=?d=LvriVlo3t*xm@F#`+WKx;heB}!lC+mDwZUF}tac{84xqNO^wd z@w+lEG>YMpx#wa*Oy%XHHm-8CXwCZ~nGgnbfyBWIk@o%8KmE1kGafEwgANX|b^m*f zk&cxGPj^9WJL2PQc>biV?TG%t$CF6w$q$Li6CczLrhZ^u&E5mvN}SGyJ>! z(;ctn5JIlHAMlsh7E)IM%bP#Y_88O7#h}P+2=%q@pOyQi4Q7UEd%3pl5|PPz_>RH))%8*`(t*7g?j9-I$8F0v$b;0RunBwB%3I zqsT1pz|){2932c6%zN|XHR}D!dxNtv1y=0 z!bknrWT|l?;)w3i+br8Z-g}wQ5qB6py#5bXb zZSZfsI$i(VkuQ}Fo@orP!J3^vf2J_s_yl4k^nI8_T)=VGN9))@TnLW%0lbhD*?4B% zIsQ~tR_HrUp_R$PWGmi~fdBXimS9b%Cnu}b!vF*VkUIzZ5fg~WzL6HcYws8r{`R?U zL^Y)+O7|a?!*FDYSoUAL^R}GuzQqc_Mv zf9drxvlvlP5TG2z$nZVrHLUryCvnA<8<&UoU@2uY{#-P(oM`c{0!d8C?ovk>4o)Ni z0cJ%0O=cxLd`#*1r?PCHmv4w}9~RwT&@lDuV5vE?0@SY(D&g1#FR>B8fd4D~lzny1lQJ54r^^fw$eeEDUzC>?hn+X;iyboLvi^*Gq@|vTO>FMc_z-SKyzhc1(%AG%x$m6Z1+H!Dkq2ze!NA>h; z3!odoNv=H$@3#5`5Z~PEJC2mf%F2|ZJL{bA=Hu;#FH~E?5ezbfyUk}ujv;_2d`rku zpARrH%DqWh;?LNgC8ax8Lau>VT7VJFabUcKaam@G+k|m)e-|e=@8tQn9!Z`0g7GfH zuHyiBIfz9s+e4psXN2KkwoOBYohkR* zwQ;|94+GcqK<5%SAqq&yAP=IDd%~==X4?aA-9-SI zgK>iRo&F`_J=yR98BPf!EAoOK?7T4J#XKiJKLuAGK!QjNC$( z@QWr>j%snVQ+t2LI1oFO_Q-$#?rR1rh&P(fy>h9yq^jpbImXPp>s&BXue+9tuTX3s zwm?zqXRr9=C4xtdE6{Ermz0^GJ-T+eP><>17`j}ZNkSsP01c)2!>tTd>(3obFld@W z-a;=+Wr6UFJW@M(zA6p(PvaK|9csjR@rBS6w?LCEogq#!`l~c$BknC_b z{T;@sEU$=8gTZQL2AJut7zU;)hGkKehOo~63bi=~h<HgfnD*f z^-tQrC<>+GkiU;DF7vl#E6xbtx36QoO~4*YqFjwZZp-!eXdoO>%Ok$()#-JDpe>u}IoP}f4pBn;p zgDQ|qL<+Q;{l|}%`WG<{>LfT`=&)zh1|ECUgU4jGk+ZW^Wo0GE?4{zF72~m!dqBe( zFfZ;p`!NjKoa`HV70ZxoasUiQBpzUPRdU$Uc3mik~Yvj_lzs~&`kl@hB! z+)fI38?(b_$&{JYYm1q;q7($tuB?@K_==eak4R1;iHzC!I#0-j#TPbp6~|Walnwd zYp&Uz%YCVh97CQn0Egg2fLo`=bMBPlHy5vzj2V`UwJzZX!A{YMYp(2hB$8iL33fLI0wbA);%N$IGDP>+5R{p~hEfVt>m#CjZJq z1cv&+sDe)>DKV-h0BK+7kX?YZQ|h#MBaI{^q67DGeG)>4xs7p!goIFlGz7oR#fCIK z_RiJI>c?Bah2jwwuKW5bd$Fv(FQgl>!c-f9H@p>iBz8&G`{U#12C_r2B+MQ;wb0zM z`KJV1?R$W}l`b(WRs8cfvz4N1u^+CehaNCA^=!8-d%x|<@u`urrghQqznvCNFW1&uaS%8! z{ZvkYsg02+Cnt{V8a_7{6=poPqksf&f$NJw%nRt6R?K(M5fW!30J$g-VG~4~NI-Ge zcZ8IP(tR=CZB!GeoIHH}VSD|84%Bqbu*huyt^#a#%7&y>7|4j8M@CM70+Y)S62w78 zXARlMtFyp@9EXEe+_EydEBg6!z0HXaKP3xAd)Wn~aY|$s^?UjKe)o77fADbkxsTWT^?E&*1CWWh zo%^Nh-@Vgr`1_l<2sgknUj`mPoC0uJ!FSmh%K6!nLHUbqBcP(%-H%od!ZC7fO{ATtsHvQ7x8mzJ}?Wre-^9MCB! zficy`hHP&^sWd>%63Uz6e(mghr*5&$p-6EuM2?7d+`kS&k3H894uvT}C#s+5k+NpZ zZTGS5P}Vo4^qSyl)2~RwD6^PSU|1JTL#u&$pgEhEWe3@8YQfcib>R;Vo96Lk3#%c` z`T6UtdnAou43wNs6esgKQdmv*AfaMc3;>ruH*oDe2^~-rVC$x)iDg|rjuA`Obn-TL zp=pt@hqo`%@JPeQM+%PRbo&e3`iTGz!Y24C9AQ8nZ2I>%1iYtE{LqI`0oxI%7J%nX zytsVF5 z3x=J_UR3x_^;THnx4e$Zm-MZ@;a-Y-r#a$CXQn8B*#4Cm3@$p!JwKo0i9$_Y-;Lnc z_mXGw3qJ83u_AAEl=3f%ujiAnFKRZLSr$`{;qQ-j-dM45M{9)zK#W+k`Ea3@1%`*B z*0lUAkN#tF63GNgI31F0(+899;4~chyRwm}bTw2QPm5&w3-)jz3^0)2gVkgp7HXR( zpo)&#+8ye;@=q@wcuazY{R-c)$lW)u)czoa5tQ=ACchu`LO- zguvT&cQg6+rQEK$4VL(RfO|$?DhLOJ48)~M5WnCn0sD5Du>D|pmDkLca3D02wVY~6 zSz{XxEh9V}Hzm1xty8bMKntx7hyiR5W4E_eX9WY;j*&QIVZoJ%+Pa4}nJ+E*@ONa&mKh>}FsM6w$Mk3zQ~n@v%aZjZQou zfHhILC*6)GU{HKS?-ShodySv~q$ML!w|5}pu!AP14+t?ew;vBVij)K@*)r#JEcvJ> zBKcD)F01#S_i~`i|EwMG;oto9r6h=>JogK0ZTR2U(Fu~E{)H0G)M=N7-CfZWT{qe+ zbRx2l?Ju&vJ+LFKC=LI^qPDkEq*@tQ1|G3F@cM<$pH~NG0!{6dg2rpVf%|`Syfo7j zjlh8s(cTPVN5BzMG3GIs&jCt_5P2+xn9yLBB3wxot_F*A;O9GOqaE;Ur_VB=poUkw zkJ0aa`W~}XrN)C&XLzw1Oc&&Ivv60t??<9oZV`6K+nC|4J%D&m{&CPpOWp7e{ zz0(q75sM#Si@#)7Ciq^Fmc;9{VQqdQ%HY{m7LGWX{wY(45RS`LazhTcIjg!bVgGp- zQ+W&>Bm`N9qsHrK-j*v~2%cs?(xTAfQVMTpI7wL5HR6h4VEh$*BHojW5Q8;gUHdK+ z$#1!Oh-Hw)>^)v~Wl|4wvaC4QdH6_7!X-)u`A$bsK1KXBG*uLJFeKDk*+B3BUj&L6VsEyp(@`=$xyDkh3Y=ICvTN*xg z&5O;!4jhQnz@TQ*p6ldBwzFrvz$bnwUNL{K? zclp?S%H$2#sp*-D3of)gTN*|693&nYV;d|gzBx-Cir7F~#h36Gq3=}_PR6vUu9QHU z9E=Bg{m>MI_pk7YiO~V4su=YOBU}wBLB~4$<5XW@6m$ZWzZF_#N_7StO)B5dU*#cl zNL~kTlgbTn_5FkA*T?3rcgaUNoQ14Py8_b@*6G&yT95wvir$Fe-_<(4Ds*C>8O-h6 zuf}WlRIdGuEejJh3L12)tRFY07SLPs2*8RrC>Pv(;-sR-IEA@Ff77VF0A1^k_YykE z5f^UGucm&NOP*uP!@a>qs9{s*&oXZoGHu;;XNPLLyhCDOh_3Zs=z}emH|rX659`W2 zOD&vPo!J_w|0^B3PyOTxRs5q9(sz|)PG~Zld28NJ(c{;!v}6TUObNVg8y6+w7vkgN z1+nQD%f`|6a4-Nsjsuf4r9pa;!T*kbWOr@E0HSBgR^9X>Zrn>v9gF2uL;?a={V)SE z?n_LuS}?mdH8p`?Cc7L+6qzA7h?V1mB60}@LCH8q^3w(k?YMBBrm_Gx0V?$9u5B4E zq*mOc(Uv>?`SXu)9oLPSD1hLaW9%#&o0^iMK`6^uew2_9J?Pxv)?byHoSc~u8!K7k zJV*-k935E8{N4eTB^V^k1B(z3>cKYu3!w9E2a%ei+jN5hNRFxRsfB?#H?NQo6|}UU z3Fakcbb*FxFbbM;qOY7##BJa-M`7M9KF%yDyPE@Mu)08msPAb1(G~L*XH5;%c!vYk z=(gARZOwq~)F1ovnGVvr0lV#kzs6bt|0TJ@DINacG`SHea@*sl?*OGJxff-!_p_Aw zgYc36r3Jy-EhZsB_y1`@v!^J7q9M#JMMqovmZ-=9Jo}eoA|lt;oY_BBioy*CUSY4D z2hq@EGs3wZu>#`dxl&-2SnOnF)NVqX1mWc z9VtT`+f{S(MSKXX9QMJ}_F!poaUYCu50vj7j&DHAbI*0OG^l@S>PR}|Ge{)>gN*{A z-PHuR3fB@~2*#{8U`?1bQp?+(p+|!=wgpOcKdY{cc6?d1%2)s0(J(O(aATFt-qPRs zR!=G7!9J2Xmrh&VH2*&0!L~z=O>okIkALz~wu7c1G!!zfQ>;uttVXxy2nBXU>NVb( z%pY>OFx;*{KKoPqu-Eh9+PP0lXWq*hlXAT^RjfR94oBpbS34v3>EkAgjZo3}da)$O z!!jpwXQ?zEW-8;HA$5bHvvuBi{&kP}slJjT1O5v-)(U|PQYzdGRO`0Prbz=pc>#z@ z$J^F+dOK?0*%D~F;!7(lMv$X2pLIOE8D_|vK#Qn4g>5brG&V8umJkskgu+=|4~;tU z`@+Hv&RChE3dYD#03k_3eh^ktgsOc1DBkSBjRBl&t6uOgSuDj9(D+KEmuUfqVke@- z#ekU$-hK!e*Ci$x3xOsI2*J*iZ_50cVao*=+5T+AsYT%Z+kH9kScZ3>?p0CIPoSio z5MVlaY;FnqItgIon!Ct6PoraaFZu8HSaVd#$l55(m2<`B!r%}q3hr(Hrf$zTfgeCL z+27rb8ANpf8V)i@c{BiT0Do6*-Y0s&WaHnd@Q{>p1aMNfSJXuXoGS6(+pd7f|!#U**;juB8!|w5FU3 zK`gE2PvelL5gOv|-xDu<)&|Uq-LxOD8iT1q$omm z*NbO`bJQHj9%gWLl1ja=J=G0H&(D$i?XW@hQZ3VExS5Ddi%<~rRE;2v+#NzCUq9NGe} z(Hrnm6lLs%S7Dse_H5i4jesAdhj>0=u!J8Y?mX4wPt@m6lt5jf4%hRJlm<>9(wCu- z;D@pK20Zcw(2XNOP-M6gR?aiVMv=q_P|auYW$^1icPqOxa#Xb++GL|*Rd%PN3O(WD zwfG)x=tS1GiuD{#YJtwwD6*&{&z#BjspO&isLS{DCDyY~Xsk!na)_H-wNcj^|5rN4 z2}V4LNl9X85n9v{Y8@D286q^MVUOEuNi$o3Hcuvr&RJ(}@sY3UcP77Z_f zc4^divh9OzkGKRa8CL=&eRM?23ov-q=sq45A#joA zBi2F>3a^I7T4QIf!S^MQPJ2k;%>bD>S^8XMjK9Q%z+go4&ZTB;!DdpfEL(Yl>=yF* zh_q-JW6X4GGBCU?hbM_@P^pD8WZ_=u3aAPPMTMdl&n<^xfot;MfJ%nmS0`% z+I`$U@x7;#R8m$Y*5`6NJ#4~5k+<>K*Hgt722EvLPCteIX)04`76IIE? z-aZc|8p%+gvcVdydc&8|u@C)!{3b=n`BW+K5G?^ALcJ+RaNzv>ZhW@1&l-Urzt6~aKgz%PULbGAlQagHkZCX2!+{G z@i?v%6Ym8%kIi^TM<$5r*j?HTv@uzwe0pkDQJ3Ng1r(n8%qLHHJx5C|Riz6lh2Kg} zOr!d~g1|tm7O0N=sXa~*YX+aeP2F{u;6QRLKO#l>d!+j|8`ocl=KDxUpn2ZdMg0Jc zpw|ELZ(f)REq=l`iPt=%%n(^BWh_AGBjerFeN)Vu!rho|6mgaK*<3b(;6T6eI5ib7 zQYnffQ~-V9+%xTzB`eLtp1!opFLibtM0?P}!YAQa(Y$lIx0moI=J&oRi&&I{y~J5y zxj8=k;*=&{9U1WAR$br78f}{d(BTn~@aEZEcLf{)wooXugzzf54oG9X4R;ywdUi#H zs>Tv4?TP3}!hLBO874rdSdh8pp??y)18lw7HDAYE27}j>U#f{JPPwXS?Qg$5b7>fJ z0yg_PCJtPB;ac`p_SJ5zq^Gmnv%c*-j}%!!EK-vnyn5(bs<`nnih2$?nyB{XQ)4Ij zKsBJ#;`rC~AiLNl%>aw5|-B6DKnV>GhufL1898Kr%W=!h#s{z$4T^Q{Z3J{Vny+9Y@D1_{t;G<~Y+17xrl(I{INlyx7MLpY z7P;|tTG%&OndXM4?GjUW}($Gsg_rSxn-)QDpU5jGA zA)@$RwStxEu~1ik>jLHK`rJnI`O&AsDnl-^Gs7K2r=5o`eVFXW4{))Nn7bn-f;t>1 zTI;PJc~T3DPcbj=h+Zcyv_*Fu?tagvV!}(My)ZEB_^>*}$zpj7@S6>=?R0iY!OOQb=_zSjffV})o-8#?#05rrIo4HU22?cC(?}>EupPKH zQg7VjH#gL-#be#F^6x!t_+?`+-mpx=L7DQ475zVcg)L9@9{5(bE%{KqxnB7jPviXj zm5{J78y(O0^S*yQ->VDOP=zS;c0OLotfJ1&^hd8SNUv<2;m_2}x`OTbg=t}*(^K%l z-JQr!@(;kI#|>E`J4I1`m4-j3Q=55KIkpmMl$O=%k5R)kFM6ffb&;?6{%U)wGy%fqVTjnSG0;Svq*^o{SSF zvwKy|>Yrc6g^3V^3%o&^K3p~!xyk7s=Z8re!v1hmrNHw|A7#^LtO)R?Jh;8pMUH*b zBJ;&pQ6W<^{k_IGxmPfzmv6}^efEppQzicqfh#t_Kh{iZq!fl@Q_zK0S#X6G */ -int datatoc_blender_icons_png_size= 226647; -char datatoc_blender_icons_png[]= { -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,213, 0, 0, 13,213, 1, 61,214, 88,241, 0, 0, 0, 7,116, 73, 77, 69, 7,220, 3, 15, 13, 43, 47, 99,146, 79, 17, 0, - 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183,215,239,114,233, 61, 16,146, 64, 32,148,132, 80, 20, -144, 94, 5,162,168, 8, 2, 34, 69, 44,136, 40,160, 40,168,136, 72, 87,233, 42, 32, 42, 77, 65,176, 1, 1, 41,145, 18, 72, 2, -132, 38, 61, 65, 18, 72, 35,237, 82,175,183,221,223, 31,201,157,151,203,181, 64,162, 63,116,223,247,237,119,119,123,187,111,103, -103,103,102,223,188,105, 0, 11, 22, 44, 88,176, 96,193,130, 5, 11, 22, 44, 88,176, 96,193,130, 5, 11, 22,255,106, 36, 38, 38, - 50, 13, 56,124,160,187,156,181, 91,159,255,119,206, 38,188,119,166, 17, 57,251,212,114,126,244,144,132,179,207,255, 43,167,249, -126, 27,192, 59,176, 33,233,168,177,226,211, 42,156, 76, 99,135,179,169, 56, 27, 43, 31,217, 9, 39,211, 4,207,253,163,135, 36, -156,125,254,223, 56,109,211,143,155,188, 13,226,116, 51, 77, 53, 52,156, 76, 99,135,179,169, 56, 31, 52, 31, 57, 9, 39,243,160, -105,201,193,179,255, 8,255, 33, 80, 77, 40,178,220, 70, 66, 66, 2, 97,197, 79,252,191,114, 90,199,131,153,191, 49,195,218,136, - 56,222,216,156, 54,241,217, 88,248, 40, 33, 33,129, 72, 76, 76, 60, 1,160, 79, 99,222,123, 99, 60,119,155,123,109, 20,222,251, - 16, 89, 13,226,108,172,116,223,212,156,141,149,151,108, 57, 27, 35,221,219,123,238, 77,248,140, 26, 43,156,141,146,151,154, 34, -205,219, 73, 63, 15,204,107,203,217, 24,121,201,150,179, 49,210,253,223,193,217, 24,121,201, 30,103, 99,164,123, 71,207,254,191, -102, 80,145,255,176, 32,176,205,224,125,255,159, 5, 81, 83,137,205, 6, 56, 48,255, 56,103, 35, 63,163,143,106, 57, 27,179,118, -211,183,177,158, 81, 83,164,119,107,206,198,226,183,229,105,140,231,100,143,243, 65,195,235, 32,156,141,126,239, 15,154,238,255, - 46,206, 70,126, 70,141,146,151,108, 56,251, 54,114,101,160,175,213,239,143, 26,147,179,177,242,146,157,112, 62,240,115,178,199, -249,160,225,117, 16,206, 70,191,247,198,120,135, 52, 21,239,191, 26, 77,213,124,214,216,156, 13,228,254, 87,113, 54,176,121,102, - 96, 19, 60,251,127, 52,156,141,201,105, 27,198,198,108,238,105,202,112, 54, 38,103, 3,194,250,175,227,124,216,158,251,255, 99, -124, 58,226,123,144,102, 41, 71,238,104, 83,132,179, 49, 57,221,228,254, 87,112, 62,192,179,255,215,129,250,127, 9,136, 57,226, - 27,185,102,130, 70,118, 96,154, 82,184, 54,102, 56,251, 54,133, 67,216, 4,104,244,112,214,214,148,231, 55,193,189, 63, 44,113, -202,230, 37, 54, 47,253,223,229, 37,155, 52,217,183, 17,157,162, 70,117,158,109, 57, 27,227, 26,214, 28,141,149, 70,155,250,222, - 27, 51, 47, 53,197,179,103,241, 0, 46, 4,203,201,114,178,156, 44, 39,203,201,114,178,156,255, 89,206,127, 37, 72, 54, 10, 88, -176, 96,193,130, 5, 11, 22, 44, 88,176, 96,193,130, 5, 11, 22, 44, 88, 60, 84,112,216,190, 27, 18, 18,146, 40, 22,139, 91, 58, -250, 95,169, 84,222,187,119,239, 94, 63, 54, 10,255, 57,176,207,136,197, 67, 4, 18,127, 57,232, 52, 0,166,118, 99,193,130, 5, -139,127, 53, 28,118,134, 23, 8, 4,145, 55,110,220,136,166,105, 26, 38,147, 9, 70,163,209,242,169,211,233,208,187,119,239, 6, -119,164, 15, 12, 12, 76,230,112, 56, 45, 26,114,142,201,100,202, 41, 42, 42,234,233,228,144, 84, 0,145, 4,241,151,102, 52,127, -119,244, 9,160,192, 96, 48,116,114,198, 73, 16, 68,164, 45,159, 3, 46,243,119,167,156,158,158,158,231, 40,138, 10,179,199,229, -232, 59, 77,211, 89, 37, 37, 37, 61,254,206,103,244, 95, 70, 96, 96, 96, 50, 69, 81, 13, 78,159,133,133,133, 14,211,103,112,112, -240, 69,146, 36, 67, 26, 64,201,161,105, 58,227,222,189,123, 61,157, 8,145, 84, 0,145, 78,107, 80, 54,233,137, 32,136, 60,147, -201,212,197, 85, 62,114,198,101, 39,141,186,226,180,136, 44,138,162,150, 5, 4, 4, 76, 85,169, 84, 26, 0, 12,135,195, 97,172, -194, 6, 0, 48, 26,141, 37, 21, 21, 21, 29,216,148,200,130, 5,139,255,132,208,162,105,154,212,106,181,200,204,204, 4,195,216, - 45,239, 77,247,113,189,232,243,191, 31, 9,240, 8, 8,132, 81,175,135,196,207,223,194, 93,116,253, 42,140, 6, 61,140, 58, 29, -154,119,237,102, 14, 3,218,182,109,203,113,193, 25,182,124,249,242, 0, 15, 15, 15,104, 52, 26,104, 52, 26,104,181, 90,104, 52, - 26,232,116, 58,232,116, 58,232,245,122,232,245,122, 24,141, 70,104,181, 90, 36, 37, 37,153, 12, 6,131, 83,206,197,139, 23, 7, -200,100, 50, 11,159,121, 51,115,154,121, 13, 6, 3, 52, 26, 13,142, 30, 61,234,148,147,162,168,176,130,130,130, 0, 30,143, 7, -134, 97, 64,211, 52, 24,134,169,179,217, 34, 42, 42, 74,239, 44,144, 77,244,140,254,203,136, 94,188, 99,127,128,167, 72, 0, 35, - 77, 35, 33, 46,202,242, 71,214,215,187,193, 24, 77,160,141, 70,180,122,125,188,101,127, 76, 76,140,211,244,201, 48, 76,248,226, - 29,251,189,220,229,148,203,229,234, 54,109,218, 20,160,198,109,118, 36,180,194,212,106,117, 64, 45,127, 61, 65, 68,146,100,157, -237,208,161, 67, 72, 72, 72,112,117,239, 97, 51,103,206, 12, 48, 24, 12,208,233,116,208,106,181, 48, 24, 12, 48, 26,141,150,205, -100, 50, 89, 54,157, 78,135, 51,103,206,184,235,100, 45, 31, 52,104,208,228,253,251,247, 75,126,253,245, 87, 73,139, 22, 45,192, -227,241,192,225,112,192,225,112, 64,146, 36, 40,138,194,163,143, 62, 74,176, 73,144, 5, 11, 22,255, 25,161,165,213,106,179,227, -227,227,153,218,239,161, 2,129,128,103, 83,203, 13,105,213,170, 85,134,237,121,174,154,171, 60, 2, 2, 49,183,153, 15, 0,224, -195,187,114,203, 11,226,147, 30, 29, 45,199,124,156, 95, 9, 0, 16,137, 68, 32,172,171,209, 14, 32,145, 72, 48,104,208, 32,240, -249,124,116,233,210, 5, 92, 46,215,238,198,227,241,192,229,114, 93, 70, 10, 65, 16,144, 74,165, 88,176, 96,129, 89, 36, 65, 34, - 20, 96,122,143, 46, 16,130,193, 87, 87,111, 65, 71, 51,160, 40,202,178,185,195,201,227,241,112,229,202, 21, 80, 20, 5, 14,135, - 99,249, 52,127,223,187,119, 47,158,125,246, 89, 80, 20, 5,145, 72, 4,184,152, 57,216,250, 25,233,116,186, 96, 62,159,175, 7, - 96, 22,103, 60,130, 32,130,238,231, 25,253,151,225, 41, 18, 96,194,250, 95, 0, 0,185,171, 94,183, 60,187, 51,175,125,104, 57, - 38,252,229,209, 32, 8, 2, 92, 46, 23, 36, 73, 54, 26,103, 89, 89,153,122,204,152, 49,167, 60, 60, 60, 14, 85, 85, 85,193,133, -128, 67,110,110, 46, 40,138,114,152,222, 73,146,196,202,149, 43,241,231,159,127,186,117,239, 26,141, 6,155, 54,109,130,201,100, -170,195,107,254,110,187,207, 77,145,181,104,240,224,193,227,247,239,223,239, 77, 16, 4, 62,255,252,115,240,120, 60, 12, 27, 54, - 12,190,190,190, 56,124,248, 48,120, 60, 30,222,121,231, 29, 54,241,177, 96,193,194, 89,153,199, 5,208, 17,128,127,173,137, 80, - 13,192,203,234,144,146,218, 79,127,243,111,130, 32,210,237,240,116,173, 61,166,132, 32,136,116,171,223, 58, 0,124, 59,251,229, - 0, 68,181,155, 22, 53,238,127,123,171,235,152,207,131,163,235, 82, 64,205,250, 67, 0,142, 3,232,155,144,144,112, 2, 0, 10, - 11, 11,135, 22, 22, 22, 2, 0, 34, 35, 35,111,100,100,100,180, 49,107,158,218,230, 41,158,209,104,140, 54, 55, 85,153,221,162, -129, 3, 7, 58,173,225, 27,245,250,122, 2,196,158,150,178,215, 92,225, 72,192,232,245,122,140, 30, 61, 26, 0, 28,190,116,172, - 55, 55,180, 27,116, 58, 29, 40,138, 66,235,102,254,152, 55, 36, 30,143, 48, 6, 40, 21, 4,140,149, 74,140,144, 26,112,163,109, - 39,108,204, 41,193,221, 42, 5, 40,138,114,139,147,166,105,135, 34,139,195,225, 96,253,250,245, 24, 51,102, 12, 56, 28,142, 91, -124,214,207, 40, 34, 34, 98,127, 70, 70,134, 47, 65, 16,218,218,103, 36, 48, 26,141, 50,163,209,232,107, 50,153,124, 27,242,140, -254,203, 48,210,180,221,116,232, 40,205,186,243,156,220,225, 44, 43, 43, 83, 39, 36, 36,156, 22, 8, 4, 91, 3, 3, 3, 11,242, -242,242, 92, 10, 45, 91,241, 99, 91,169, 88,177, 98, 5,214,174, 93,139,126,253,250,185, 21, 78,173, 86, 11,130, 32,176,113,227, -198,122,255, 45, 92,184,176,222,245, 92,112, 18, 0,200,144,144,144,215, 14, 30, 60, 40, 51, 31,235,231,231, 7, 46,151,139, 14, - 29, 58,192,195,195, 3,167, 78,157,130,201,100,114, 59, 95,178, 96,193,226,223, 11,123, 90,196, 10,189,231,206,157,219,101,217, -178,101, 75,186,119,239,190, 51, 53, 53,117, 7, 65, 16,137, 86,101, 98, 66,109,249,154,104,254,205, 48, 76, 87,107,209, 83, 43, -214,252, 9,130, 72, 52, 31,111,253,219,252,201, 48,204, 64, 0,124,243,239,185,115,231,182, 95,182,108,217,146, 57,115,230,188, -183,116,233, 82,222,220,185,115, 99,151, 45, 91,182,196,124, 29,123,225,176,231,104, 57, 93,123,202,220, 68,117,243,230, 77, 71, - 77, 84,214, 47, 0,167,165,165,196,207,223,226,100,125, 28,238,107,217,191, 32,175,194,242, 2, 91,215,185, 37, 36, 18, 9,134, -124,252,169, 91, 78,145, 78,167, 67,113,113,177,197,101,112,181,185,203, 41, 22, 9,145, 52,179, 3,114,229,124,124,148, 86,134, -253,151,254, 4,151,203,197,227,109, 59, 96, 40,207, 3, 31,132,243, 49,243,214, 29, 24, 24,247,250,244, 50, 12, 99, 87, 96,153, -191,155,155, 80,220, 21, 90, 54,207, 40, 87,163,209,200, 51, 51, 51,213,116,205,139, 93,196, 48,140, 55, 65, 16,213,181, 46, 87, -176,187,207,232,191,140,132,184, 40,139,235,116,198, 99,128,101,255,179,202, 43,150,103,242,214,250, 79, 0, 0,253, 58, 61,234, - 50, 63,184,195, 41,151,203,213, 61, 7,244, 61, 97, 82,235,182,140, 31, 63, 62,251,216,177, 99, 34,119,194,106, 79,104,153, 93, - 91,179,200,162, 40, 10, 58,157,206,173,123,215,233,116, 14,243, 7,143,199,187, 31, 71, 11, 74,165, 82,183,103,207, 30,172, 91, -183, 14,190,190,190, 24, 60,120, 48,130,131,131,177,123,247,110, 48, 12,131,215, 95,127, 29, 34,145,200,236, 94,179, 9,144, 5, -139,255, 54,156,105, 17,193,178,101,203,150,216, 10, 25,235,223,214, 2,202, 70, 76, 89,139,181,246, 46,222,255,137,182,226,201, -124, 93,130, 32, 18,151, 46, 93,154,224, 34, 28, 37,142,132,150,211, 41,241,181, 90,109,118, 92, 92,156, 91,106, 66,165, 82, 21, -186, 18, 27,246,106,245,214, 46,129, 84, 42,133, 68, 38, 5,233,102,185,107, 48, 24, 44, 66,229,200,145, 35, 16,137, 68, 24, 54, -108,216, 3, 57, 90,122,189, 30,124, 30, 23,164, 95, 32, 38,172, 58, 6,121,181,218,242,130, 57,158,149,141, 11, 69,197,152,217, -125, 0, 36,162, 98, 40,116, 58,183,156, 55,154,166,235,137, 44,138,162, 48,122,244,104,139,155, 96,221,111, 5, 78,154, 14,125, -125,125,207, 81, 20, 21,102,245,140,132,145,145,145,192, 95,253,122, 8,154,166, 21, 94, 94, 94, 63, 3, 8, 97, 24, 38, 12,128, -135, 59,207,136,133,253,244,105,187,159,182,113,170,238,135, 83, 46,151,171, 19, 18, 18, 78,155,212,186, 45,249,249,249,167, 1, - 8, 31,121,228,145, 6, 11, 45,179,192,226,114,185, 88,185,114, 37,214,174, 93,107,249,223, 93,161,101, 52, 26,235, 8,168, 91, -183,110,213,185,150,173,176,115,209,108,202,160,102,116, 33, 29, 25, 25,105, 57, 39, 40, 40, 8, 94, 94, 94,160,105, 26, 52, 77, - 67, 40, 20, 66, 36, 18,129,199,227,177,137,142, 5, 11, 22,206,180,136,122,206,156, 57,239, 17, 4,145, 88,235, 44, 93,117, 34, -168,236,105,143,174, 54, 98,173,196,193,113, 9,246,196,150,245,119, 51,230,206,157,219,222, 54, 28,246,154, 43, 45,165,170,205, -180,251,117, 96,221, 68,213, 88, 47, 49,103, 47, 50,169,151, 12, 34,137, 4, 28, 14, 9,130, 32, 24, 87, 92,122,189,222, 82,240, - 79,157, 58,213,105,191, 21,119,251, 83,233,245,122,144, 20, 7,247,130, 34, 96, 34, 79, 90,206, 53,111, 36,197,197,221,160, 54, -224,220,188, 8,174,155, 47, 92, 91, 71,235,245,215, 95,199,166, 77,155, 64,146,164, 37, 78, 40,138, 66,171, 86,173,144,157,157, -237,148,139,162,168,176,187,119,239, 6, 88,199,163, 89,196, 50, 12, 3,147,201,132,168,168, 40, 77,102,102,230,155,108,214,125, - 48,145,229,104,191,201, 68,187,237,194,216, 59, 78, 46,151,171, 71,141, 26,117,162,178,178,114, 75,187,118,237,110,161,238, 20, - 8, 46,249, 40,138,170, 35,176,204, 34,107,205,154, 53,117, 68,145,193, 96,112,171, 34, 96, 48, 24,234, 9,158,207, 62,251,172, -206, 39, 0,244,232,209,195, 45,103, 24, 0, 67,146, 36,195,227,241, 48,104,208, 32,196,198,198,226,215, 95,127, 5, 77,211,152, - 54,109, 26, 68, 34, 17, 86,175, 94, 13,163,209,136,229,203,151,179,142, 22, 11, 22, 44,156,105, 17,237,210,165, 75,175, 46, 93, -186,212,226, 44,217, 58, 90, 14,222,187,195,107, 69,149,191, 89,164, 1,208,218, 19, 68,246, 92, 50, 91, 1,102,189,111,217,178, -101, 75,108,195, 97,219, 92, 89, 71,104,253, 93, 40,188,118, 5,159, 62, 22, 15,160,110,115,225,250, 71,219, 64, 34,149, 64,226, - 33,197,168,189, 39, 1,160,182,208,159,227,150,163,101, 22, 90,114,185,220,169,200,106,136,163, 69,242, 41,252, 24, 86, 14,134, -207, 5,165, 51,212, 17, 90, 28,138,139, 92,223, 8,144, 92, 30, 40,147,209, 45, 78,134, 97,234, 53, 21, 78,156, 56, 17, 4, 65, - 88, 70,136,197,197,197, 89,115, 17,174, 94,142,179,125,106,250,224,217, 54,199, 46, 47,213,176, 57,246,126,210,231,185,175,113, -227,167,215, 0, 0, 61,149, 74,203,179, 88, 28,247,215,216,129, 85, 87, 78, 88,220,199,143,241,246,125,113,202,229,114,245, 35, - 49,237, 79,243,124, 60,183,228,228,228,156, 6, 64, 62,247,220,115, 94,113,113,113,110,229, 73,243,224, 10, 91,145,101,237,100, -153, 63, 93,140,176,181, 18,142, 38,183, 4,148,185, 25,209,141, 52,207,152,211,182, 76, 38,131, 84, 42,181,140,184, 21, 10,133, - 16,139,197,150,254,157,110, 10, 55, 22, 44, 88,252,119,225,109, 22, 58,181, 98,169,142,211, 84,219,183, 42,193,250,183, 61,199, -171,214,129, 74,118, 81,190,238,175, 21,104,118, 97,118,214,108,206, 73,116, 36,210, 40,179,130,180,254, 12, 10, 10,250, 77, 42, -149, 70,184,123,247, 13, 25,197,102, 50,232,235, 57, 91, 4, 65, 64,234, 33,133, 72, 42,129,200, 67,234,208,245,114, 38,180,204, - 78,145,249,165,179,117,235, 86, 72,165, 82, 76,154, 52,169,193,125,180, 44, 66,139, 71,226,176,224, 40, 56,124,170,142,200,162, - 40, 10, 28, 46, 23,133,210, 96,144, 92, 46, 40,163,123, 46, 89,101,101, 37, 40,138,194,188,121,243, 44, 53,120,107,145,213,144, -123,118, 6,146, 32,204,238,150,160,101,203,150,111, 19, 4, 17, 14,160,133, 82,169, 20,220,187,119,175, 63,155, 95,157, 40, 3, -147,161,158, 11,229,200,125,189, 95, 78,179,147,197,243,241,220,210,166, 77, 27,139,147, 37, 22,139,205,163, 77, 93, 63, 99,146, -180, 43,178,108, 71, 8, 82, 20, 85,147,150, 93,140,142,180,118,180,150, 46, 93,106,225,181,118,178,204,104, 72, 62, 50,135,245, -196,137, 19,184,112,225, 2,166, 78,157, 10,145, 72,132,181,107,215,194,104, 52, 98,225,194,133, 16,137, 68,224,243,249,108,226, - 99,193,130,117,179,234,104, 17, 27,148,216,244,131, 34,108, 68, 77,137, 61,129,101,221, 76,104,254, 78, 16,132,193, 14,175,206, -166, 73,209,118,191,249, 83,190,116,233,210, 99,102, 39,203,106,127,157,112,184,116,180, 4, 2, 65, 68,102,102,166,101, 34, 76, -103,159, 58,157, 14,253,250,245,115,219, 25, 51,143, 58,164, 40, 78, 29, 97, 33,246,144, 66, 44,243,128, 72, 42,181, 21, 28,132, -171, 66,220, 92, 35,182, 22, 90,243,231,207, 7, 69, 81,216,180,105, 19, 0,224,237,183,223,118,187,143,150,153, 19, 38, 2,121, -204,109,196,175,122, 22,186,239, 12, 40, 74,249, 3, 20, 69, 33,160,219, 80,208,143, 60, 11,149, 72, 10,202,100,116,123,212, 97, - 89, 89, 25,178,179,179,193,225,112, 48,107,214,172, 58,115, 29,217,142,100, 59,114,228,136,203,123,183,231,100,205,207, 41,179, -240,136, 68, 34,242,143, 63,254,136,160,105, 58, 82,173, 86,183,236,209,163, 7,205,102,101, 23,162,136, 54,186, 37,170,220, 77, -159,182,156,230, 62, 89,149,149,149, 91,114,114,114,206, 0, 32,199,143, 31,239, 37, 22,139,241,205, 55,223,168, 0,240,119,239, -222, 45,114, 37,138,204,233,198,149,200,226,114,185, 53,105,217,157,123,103,234, 78, 89,226,170, 99,188, 59,105,222, 28, 86,130, - 32, 96, 50,153, 32, 18,137,234, 56, 89, 66,161, 16, 2,129,128, 77,120, 44, 88,176,112, 85,150,164,187, 93,142, 51, 76, 87, 43, - 81,149,126, 63,188, 13,185,158, 43, 80,142,132,134, 86,171,197,245,235,215,221,229,113,123, 98,204,102, 93, 30,197,199,249,149, - 32, 8, 2, 95,245,104, 7,137, 76, 10,177, 68,130,145,191,158,176, 20,220, 87,150,188, 13,129, 68,138,144, 94,131,221, 42,200, -205, 77,135,214, 66,171,162,162, 2, 92, 46, 23,139, 22, 45, 2, 73,146, 88,190,124, 57, 66, 67, 67,113,239,222, 61,236,222,189, -219, 45, 71,139, 99,226, 32,248,133, 24,136, 39,122, 66,246, 66,111,120, 15,154,143,124, 29,133, 84,141, 24,189, 53,215,192, 63, -188, 6, 58,218,228,246, 8, 44,163,209,136, 19, 39, 78,216,118,120,183,244,169, 50, 26,141, 48, 24, 12,208,235,245, 88,190,124, -185, 59, 35, 60,235, 61, 55,115, 28,214, 78,130,202,201,200,200,240,103, 24,198, 7,128, 39,128, 82, 54,187, 58, 71,112,183,215, -225,223,229, 85, 0,192,222,165, 47, 90,246,207,187,242, 87,250, 92,249, 93,205, 2, 0,109, 90, 12,110, 16,167, 92, 46, 87, 63, -222,175, 71,178,134,230,110,238,208,161, 67, 29, 39, 75, 40, 20, 18,181,191,221,178,203, 72,146, 4,135,195,169,215, 92,232, 72, -108,185,211, 71,203,104, 52, 90, 38, 18,117,214,159,241,126, 28,173, 23, 95,124, 17,193,193,193, 22, 39,235,227,143, 63,134, 72, - 36,194,220,185,115, 97, 48, 24,176,102,205, 26, 54,241,177, 96,193,226,111, 23,101,127, 7,236,150,164, 26,141,230, 78,108,108, - 44, 28,252, 23, 42, 20, 10,185, 54, 55, 21,210,170, 85,171, 12, 59, 77,136, 3, 1, 36,217, 43,212, 9,130,128,135,204, 3, 66, -169, 4, 98, 27, 23, 75,232, 33,131, 64, 42, 5,201,179, 91,152,215,227, 52,247, 45,177, 22, 90,230,173,178,178, 18, 92, 46, 23, -235,214,173,131, 76, 38,131, 86,171,117,201,105,126,233,112, 56, 28,168,114,171,113, 99, 73, 18,248,194, 84,180, 28, 60, 6,193, - 92, 17,120,167,126,134,218,100,112, 53, 97,105, 61,206,232,232,104,124,248,225,135,245,166,117,112,132,208,208, 80,151,247,110, -235,100,173,108,215, 28, 60, 62, 15,111, 93,203,133, 86,171, 37,198,140, 25, 67, 3, 80, 3, 40, 81,171,213, 57,238,196,103, 35, -224,161,231,116, 54, 42,214, 12,154, 49,217, 19, 48,118, 57,205, 78,150,134,230,110,206,206,206, 54, 59, 89,158, 98,177, 24, 27, - 54,108, 80, 1, 32, 23, 46, 92, 40, 14, 15, 15,231,184,147,150, 56, 28, 14, 86,173, 90,101,183, 79,150, 61,209,213,144,124,100, -125,110,159, 62,125,236, 78, 88,234, 64,188,213,227, 52,135,213,215,215,215,226,100,153, 76, 38,203,104, 67,243,236,243, 78, 42, - 21,108,250,100, 57, 89,206,255, 14,231,191, 18,118, 75,224,123,247,238, 61,238,232,132,168,168,168,204,204,204,204, 86,230,165, - 56,106, 11, 78,158, 70,163,137,238,209,163,135, 75,107,135,166,105, 8, 4, 2, 48, 12,131,254, 31, 46, 3, 65, 2, 36,234,190, -196, 2, 30, 27, 0, 14,135, 2, 93,179,212,135,203, 81,135,106,181,186,206,203,193,222,166, 80, 40,160,213,106,221,158,205, 91, -163,209,212,153,130,129, 96,104,220,253,125, 87,189,209,135,230,205,221,126, 59, 66,161,176, 78,211,143, 11,199,138,112,199,209, -178,110,122,228,241,121,160,120, 92,179,163, 85,125,235,214,173, 81,108, 50,119, 31,230, 1, 11, 0,208,186,199, 48,208,180, 9, -140,201, 84,103,153,164,152,136,199, 65, 51, 38,232, 13, 42,104,181, 90, 87,211,158, 16,165,165,165,234, 81,163, 70,157, 0,240, -237,136, 17, 35, 50, 80, 51,187, 48, 35,149, 74, 5, 92, 46,151, 6, 80, 6,128, 41, 47, 47,247,204,207,207,167, 53, 26, 77,115, - 87,225,220,191,127, 63,174, 95,191,142, 94,189,122,213, 89, 14,202,236,138, 90,207,238,238, 78,250, 52, 55,151,219,155, 17,222, -145,144,115, 23, 28, 14, 7,158,158,158,224,241,120, 88,180,104, 17,120, 60, 30,196, 98, 49, 0, 96,205,154, 53,150,201, 87, 89, -176, 96,193,226, 63, 35,180, 92,149,155, 78,154, 21,157, 54, 33, 26,141,198,188,240,240,240, 6, 93,204,100, 50, 21,185, 16,110, -121,187,119,239,230, 89,187, 16,174, 62, 25,134, 41,114,241,178,205,219,187,119, 47,207,158,187,225,104,129,105, 87,156, 38,147, - 41,175, 69,139, 22, 14, 29, 19,123, 48, 24, 12,249,174, 68,235,178, 18,117, 29,145,240,214,181, 92,135,107, 39,178,112,153,214, -156,164,207,247,239, 55,125,222,106,221,186,117,190,151,151,215,129,192,192, 64,121, 74, 74,138,111,215,174, 93,125,173,143,233, -218,181,107,176,205,105, 58, 56, 94,231, 16, 4, 65,228,141, 24, 49,194,110,154, 55,139, 38, 59,233, 51,207, 85,154, 63,123,246, - 44,207,250,124, 71,252, 86,249, 40,207, 13,225,122, 55, 62, 62,158,180,230,113,148,246, 13, 6, 67, 9,155, 10, 89,176, 96,241, -159, 23, 90,106,181, 58, 55, 54, 54,214,232,224,191, 28,103,231,202,229,242, 46,141,125, 3, 6,131,161,199,195,192, 89, 90, 90, -218,168,247,110, 52, 26,243,106, 39, 40,117,122, 12,155,196,255,185,103, 4, 0,197,197,197,143, 0,128, 82,169,132,171,101,117, - 26, 32, 8, 27, 61,125, 26,141,198, 30, 77, 17,167,101,101,101,221,217,148,197,130, 5, 11, 86,104, 53, 0,236, 98,196,255, 31, -104, 10,209,202,130, 5, 11, 22, 44, 88,176,104, 92,144,108, 20,176, 96,193,130, 5, 11, 22, 44, 88, 52, 13, 8,212,140, 28,176, -135,134,140, 38, 24,120, 31,215, 78, 98, 57, 89, 78,150,147,229,100, 57, 89, 78,150,243, 63,199,233,138,155, 29,205,216,196, 2, -140,229,100, 57, 89, 78,150,147,229,100, 57, 89,206,255, 30,231,191, 18,108,211, 33, 11, 22, 44, 88,176, 96,193,130, 69, 19,129, - 98,163,224, 31, 3, 7, 13,152, 81,223, 21, 24,134,241, 6,224,104,193, 56, 29, 65, 16,229,247,193, 73, 0,224,213,110,230,137, -142, 12, 0,244, 0,244, 4, 65, 48,174, 57, 62, 34, 11, 10,188,219, 51, 38,110, 87,134, 32,184, 52,141, 75,205,155, 55,187, 72, - 16, 67,117, 0, 32, 9,140,105, 43,149,136, 6,106,245,186, 8, 1,151,127,189, 66,169, 56,162, 45,206,188,195, 38, 15, 22, 44, -254, 17, 60, 1, 96, 1,106,186,149, 44, 5,176,139,141, 18, 22, 44,154, 72,104, 73,165,210,115, 36, 73,134,185,154,159,199,140, -218,181,204,242,202,203,203,187, 52,224,218,163,164, 82,105, 63, 46,151,251, 24, 0, 24, 12,134, 20,133, 66,113, 12,192,110, 0, -198,251,188, 39, 25,128,209, 0,198,213,254,254,190,182,176,168,186, 79,190, 88, 79, 79,207,159,184, 92, 46, 83, 90, 90,218, 13, - 0,124,125,125, 79, 27, 12, 6,162,170,170,106, 36,128,203, 13,228, 35,185, 92,238,202,110,221,186,245, 62,121,242,228,183, 0, -214, 53,210,179, 20,144, 36,105, 87,160,208, 52,221,226, 62, 68, 22, 15,128,231,186,117,235,124,183,111,223, 30,159,151,151,215, - 1, 0,194,194,194,174,140, 31, 63,254,226,244,233,211,229, 12,195, 84, 18, 4,161,119,198, 83, 80,224,221,190,184, 48,107,106, - 81,241,245,209, 0, 16, 20,220, 97, 23,135, 67,242, 24,230,124,154,216,111,156, 95,171,150, 45, 94,221,249,205, 58, 94,139,136, -102, 56,154,122,161,227,244, 55,223,107,159, 15,172, 96,197,214,223, 7, 15, 15,143,115, 36, 73,134, 57,203,227,246,242,188,201, -100,202, 43, 43, 43,235,226,136,147,162,168, 48,103,229,133,189,125, 52, 77,103,149,150,150,218,157,106, 66, 38,147,165, 81, 20, - 21,225, 46,151,249,211,104, 52,230, 57, 26,165, 43,147,201,206,113, 56,156, 48,103,247,105,239, 63,154,166,179, 74, 74, 74, 28, -133,179,222,189, 55, 70, 56,239,135,211, 89, 56,205,229, 17,128, 53,190,190,190,143,202,229,242,231, 1,188, 87, 85, 85, 21,199, -225,112,224,227,227,243,158, 78,167,251,211,211,211,243,235,202,202,202, 84, 0,111, 2, 96,215, 75,101,193,162,177, 32,147,201, -138, 20, 10, 5, 99, 6, 77,211,140,193, 96, 96,180, 90, 45,163, 86,171, 25,165, 82,201, 40, 20, 10,166,170,170,138,169,172,172, -100,228,114, 57,227,239,239,111, 59,121,163,163, 54,220, 14, 50,153, 44,115,217,178,101,218,236,236,108, 70,175,215, 51,122,189, -158,185,115,231, 14,243,233,167,159,106,101, 50, 89, 38,128, 14, 14,206, 29,232,160,176, 24, 4, 96, 71,124,124,188,110,255,254, -253,140, 70,163, 97,148, 74, 37,179,107,215, 46,166, 93,187,118, 58, 0, 59,106,143, 33,221,228, 4,128,158, 65, 65, 65,121,183, -111,223, 54, 29, 57,114, 68,239,233,233,153,228,233,233,153,116,231,206, 29,211,237,219,183,105, 63, 63,191, 60, 0, 61, 27, 16, - 78, 0,120,246,173,183,222, 42,186,115,231, 14,211,167, 79,159, 75, 86,251, 9,184, 94,231,110,160, 61, 39,139, 97,152, 32,134, - 97,130, 81, 51,201,101,189,141, 97,152,224,218, 99,188,221,228,148,100,101,101, 53, 11, 12, 12, 92, 70, 16,132,206,150,143, 32, - 8, 93, 96, 96,224,178,172,172,172,102, 12,195, 72,156,113,230,229,172,127,233,192,254, 1, 21,202,242,155,140,178,252, 38,243, -237,230,190, 85,175, 76,127,126, 71,112, 84,167, 77, 94, 97,237,215, 93,191,121,107, 35,195, 48, 27,143,165,103,110,156,255,229, -111, 27,159,158,190,122,131,111,120,252, 43, 13,136,207, 7, 1,203, 9,192,203,203,171, 80,169, 84, 50, 12,195, 48, 38,147,137, -209,235,245,140, 86,171,101, 84, 42, 21,163, 80, 40,152,234,234,106, 75, 62,175,172,172,180,124, 15, 8, 8,112,152,223,189,189, -189,139,212,106,117,157,178, 67,167,211, 89,202, 15,149, 74,197,168, 84, 42, 70,169, 84, 90, 54,133, 66,193,132,132,132,228, 58, - 9,231, 61,115, 56,105,154,102,140, 70, 35,163,215,235, 45,188, 26,141,166,206,166,213,106, 25,173, 86,203,132,135,135,187, 29, - 78,119, 56, 53, 26, 13, 19, 22, 22, 86,224,136,211,199,199,167, 72,163,209,212,225,180,190,127, 91, 94,243,239,160,160,160,194, -134,112,186, 19, 78,103,241, 89,139,117, 25, 25, 25,140, 90,173,102, 66, 67, 67,229, 35, 71,142, 52,152, 76, 38,102,255,254,253, - 76,124,124, 60,221,183,111, 95,125,105,105, 41, 51,105,210, 36,198, 73,165,144,205, 71, 44, 39,139,251,113,180, 8,130,128, 68, - 34,193, 15, 63,252,224,112, 57, 14,235,239,205,155, 55,119,247,154, 93, 34, 34, 34, 78,156, 58,117, 74, 20, 28,252,215,132,216, - 58,157, 14,222,222,222,152, 54,109, 26,255,137, 39,158,104, 53,120,240,224,211,119,239,222,237, 3,224,156, 11,190,103,252,253, -253, 63,159, 55,111, 94,224,115,207, 61, 7, 95,223, 58,147,110, 99,212,168, 81, 24, 57,114, 36, 47, 35, 35, 99,204,214,173, 91, -199,172, 95,191,190, 80,161, 80, 76, 7,240,179, 51, 82,145, 72, 52, 34, 36, 36,100,195,169, 83,167, 2, 2, 2, 2, 16, 25, 25, - 73,190,243,206, 59,173,162,163,163, 69, 97, 97, 97,228,189,123,247,240,235,175,191,134,142, 29, 59,246,199,162,162,162, 87,245, -122,253, 30, 55,238,157,239,235,235,251,222,171,175,190,234, 87, 85, 85,101, 60,127,254,124,166,121, 63,159,207, 95,216,189,123, -247,174,199,143, 31,255, 14,192,215,247,227,100, 49, 12, 83,133,191,154,248,204, 48,152,255,119,199,217, 98, 24,134,127,233,210, - 37,159,238,221,187,255,172,213,106, 59, 77,157, 58, 53,103,201,146, 37, 34,153, 76, 38, 3, 64, 84, 85, 85,149, 47, 88,176, 64, -183,122,245,234,119,219,182,109, 59, 32, 45, 45,237, 25,134, 97, 12,181,130,172, 62, 31, 65, 88,194,147,155, 95,130, 19,169, 52, -255,195,185,111,135,125,178, 56,226,110,250,181, 92,154, 18,201,176, 47,249, 42,138,228, 10,252,150,118, 13, 65,190, 30, 4, 79, -192,109,239, 25,218,174, 79,101,254,181,100, 56,153, 33,157, 69,227,128, 32, 8,136,197, 98,236,219,183,175,222,210, 85,246,150, -181,162, 40, 10, 94, 94, 94, 46, 87, 55, 16, 10,133, 56,114,228,136,221,181, 23,237, 45,233,227,233,233, 9,103,149, 13,130, 32, - 32, 20, 10,145,146,146, 2,146, 36,237, 46, 13,100,187, 79, 34,145,128,116,178,214,149,153, 51, 57, 57,217, 37,151,249, 83, 42, -149, 2, 53, 77,255,142, 51,165, 64,128, 83,167, 78, 57,188,103,219,239,210,218,245, 94, 93,113,166,164,164,212, 89,250,203,118, - 73, 48,235,223, 18,137, 4,132, 11, 82,111,111,239,110, 97, 97, 97, 56,123,246, 44,118,239,222,237,211,190,125,123,220,186,117, - 11, 4, 65, 96,201,146, 37, 68,187,118,237,184,133,133,133,232,213,171, 23,126,249,229,151, 30, 85, 85, 85,108,134, 97,241,143, -128, 97, 24, 46,128,142, 0,252, 81,211,237,166, 26,128, 23,106, 86,210,224, 3,144, 3, 16,213,110, 90, 0, 10, 0,126,181,167, -151,214,150, 45,214, 2,161,196,122,241,105,134, 97,186,214,114,155, 87,168,240,183, 58,214,124, 13,219,223,182,159,118,185, 41, - 0, 72, 76, 76, 52,191,204,250, 38, 36, 36,156,176,190, 57,119, 68,150,121,157, 50, 59,121,218,118,136,166, 64, 34,145,252,116, -250,244,105,145,191,255, 95,247,160,213,106, 81, 93, 93, 13,133, 66,129,234,234,106,120,120,120, 96,247,238,221,162, 1, 3, 6, -252, 84, 93, 93, 29, 93, 27,105,142, 56, 87,221,187,119, 47,208,104, 52,130,207,183,223, 69,137, 36, 73,196,196,196,224,189,247, -222,195,144, 33, 67,130,250,245,235,183,202, 70,104,213, 27, 74, 42, 22,139, 55,156, 63,127, 62, 64, 44, 22, 35, 51, 51, 19,121, -121,121,120,235,173,183,154,209, 52,141,220,220, 92,220,186,117, 11,249,249,249,216,186,117,107,192, 83, 79, 61,181,193,142,208, -178, 55, 60,117,234,204,153, 51,219,120,123,123,147,159,126,250,105,133, 82,169,252,162,118,255,135,107,215,174,125,161,119,239, -222, 1, 83,166, 76, 97, 82, 82, 82,182,215, 62, 56,135,241,105,221, 39,171,182,153, 15,181,137,239,134,205, 57, 49, 86,255,131, - 97,152, 32, 0, 90,130, 32, 42,236,112, 18, 0, 60, 7, 15, 30, 60, 75,171,213,118, 58,117,234,212,159,143, 61,246, 88, 56,128, -123,230,196,231,233,233, 41, 89,181,106, 85, 96, 66, 66, 66, 70,255,254,253, 59, 13, 30, 60,120, 86, 73, 73,201, 18,134, 97, 74, -172,250,108, 89, 56,105, 26,151,130,130, 59,236, 74, 78,155, 62,250,120,138,142,247,246,155,243,115,154, 55,107, 81,121, 41,179, -204,116, 45,171, 4,213,106, 35,158,238, 95,179,128,121,183, 14,205,241,249, 15,167, 48,109,198,251,220,159,119,109, 27,249, 39, - 3,137,162,224,218,126, 39,241,249,160, 96, 57, 97,105, 98, 2,151,203,197,208,161, 67, 65, 16, 68,189,181, 60,185, 92, 46,210, -210,210,208,191,127,127,112,185, 92,188,248,226,139,110,113, 82, 20,133,193,131, 7, 91,214, 81,180,230,179, 21, 13, 14, 52, 65, -146, 77, 97, 11,138,162, 64,146,164,195,133,180,109, 57, 93,149, 75,230,112, 58,227,178,254,207, 85, 56,107,151, 60,114, 91,100, -185,203,105, 14, 39, 69, 81,232,209,163, 7, 46, 94,188,232, 84,116, 57,208,151,117,238,189,188,188,124, 66,116,116,116,242,186, -117,235,124, 0, 64, 46,151, 91, 22,188,231,112, 56,184,121,243, 38,116, 58, 29, 62,250,232, 35,125, 85, 85,213, 20, 54, 31,177, -156, 77,201,233, 76,139, 0,232, 61,119,238,220, 46,203,150, 45, 91,210,189,123,247,157,169,169,169, 59, 8,130, 72,100, 24, 38, -193,252, 57,119,238,220,246,203,150, 45, 91, 50,103,206,156,247,150, 46, 93,122,149, 32,136, 68, 0,176,253, 93, 91,150, 36,216, -136, 56,127, 51, 79,109,158,171,115,172,189,223,182,159,246,184,235, 56, 90, 9, 9, 9, 68,237, 77, 18,214,133,154,187, 66,203, -157,181,251, 40,138,122,125,201,146, 37,129,206, 68,150, 66,161, 64, 65, 65, 1,194,195,195,241,226,139, 47, 6,174, 91,183,238, -117,163,209,248,153, 19, 90, 30,135,195,193,217,179,103, 81, 92, 92,140,216,216, 88, 68, 68, 68,212, 57,224,246,237,219, 56,112, -224, 0, 42, 42, 42,208,185,115,103,160,166,115,183, 93,196,197,197,125, 20, 19, 19, 51,152, 36, 73,163, 72, 36,194,165, 75,151, -208,169, 83, 39,252,240,195, 15,104,222,188, 57,196, 98, 49, 50, 50, 50, 16, 27, 27,139, 19, 39, 78,192,223,223, 31,241,241,241, -198,170,170,170,147,101,101,101,199,238,222,189,251,145,163,112,134,134,134,206,127,229,149, 87,248, 5, 5, 5,244,150, 45, 91, - 78, 1, 56, 5,224,245,247,223,127,127,242,144, 33, 67, 2, 46, 92,184, 80,153,158,158,126,198,129,200,114,199,201, 50,218,190, -148, 76, 38,147, 86,173, 86,235,180, 90,173,129, 36,201, 59, 4, 65,232, 76, 38, 83,180, 35, 19, 98,226,196,137, 81,165,165,165, -211,102,204,152,145, 93, 43,178,110,162,166, 3, 60, 0,192,104, 52,106, 21, 10, 69, 85,247,238,221,195,199,142, 29,251,231,142, - 29, 59,166, 77,156, 56,113,247,150, 45, 91, 20, 0,212,182,132,205,155, 55,187,200,225,144, 60,101,181, 79,214,143,187,191,158, -121, 96,239,235,205,114,115,243, 91,249,250,249, 43,121, 82,255,130,221,223,111, 62, 7, 64, 87, 80, 82,133,203,183, 11,193,229, -114,112, 61,183, 18,189, 31, 31,197,253, 51,115,113, 79, 0,251,217,186, 92,211, 87, 22,205,139, 80, 31, 63,126,220,169,163,149, -150,150, 6, 46,151, 11,145, 72,132,213,171, 87, 59, 37, 53, 11, 3,179, 91,228, 74,204,152, 23, 71,119,230, 62,209, 52,109, 89, -232,221,118,251,226,139, 47, 48, 99,198,140, 58,215,168, 21, 27,132, 43, 78, 71,225, 11,111,209, 2,197, 69, 69,117,246,185,179, - 40,189,201,100, 2,151,203,197,166, 77,155,144,144,144,128,196,196, 68,167,159, 67,135, 14, 5, 73,146,140, 59,241,217,163, 71, - 15,232,245,122, 75,152,111,222,188,105,151,119,253,250,245,174,130,249, 4,128, 5,157, 58,117,146,245,235,215, 15,201,201,201, - 24, 57,114,164, 86,175,215,103, 2,192,240,225,195, 91,175, 91,183,142,127,254,252,121,248,250,250,114,115,114,114,190, 5,219, - 65,158, 69, 19,195,158, 22, 49,191,243,150, 45, 91,182,196, 86,196, 88,195,252, 63, 65, 16,137, 75,151, 46, 77,176, 22, 69,214, -191,205,174,147,141,136,107,111,237, 72, 89,139, 40, 71, 2,202,230,125,107,125,124,137, 93,161, 85,123, 99,125,173, 93, 32,115, -225,235, 74,100, 57,169, 57,214,129,167,167,231,176,167,159,126,218, 34,114, 52, 26,141, 69, 96,153, 69,150,249,119, 70, 70, 6, -186,116,233,194,243,244,244, 28, 38,151,203, 63,115, 67,196, 33, 36, 36, 4,165,165,165,184,114,229, 10,194,195,195, 97, 48, 24, -112,232,208, 33, 84, 86, 86,130,203,229,130,199,227, 65,175,119,218,119, 27, 49, 49, 49, 67,183,111,223,222,101,219,182,109,229, -230, 26,221,247,223,127, 15,134, 97,224,239,239, 15,149, 74,133,162,162, 34, 28, 59,118, 12, 70,163, 17, 82,169, 20,145,145,145, -252, 17, 35, 70,244, 92,176, 96, 1,215,137,208,234, 49,114,228, 72, 79,153, 76,134, 55,223,124,147,209,235,245, 75,107,247,205, -159, 62,125,186,239,157, 59,119,116, 47,189,244,210, 89,189, 94,255,169,217, 76,180, 22, 56, 14, 30,172, 67, 39,203, 96, 48,152, -227, 52, 91,161, 80,192,207,207, 47,220,218,217,114, 36, 6, 83, 82, 82,122, 0,224, 44, 92,184, 80, 8,160,200, 58, 12, 58,157, - 14, 10,133, 2, 74,165,210, 80, 89, 89, 89, 60,123,246,108,227,142, 29, 59, 56,181,231, 92,183, 39,180, 8, 98,168, 78, 38, 19, -243, 25,134,243,254,198,141, 27,165, 67,134, 12, 33,165, 82, 41,170,171,171,101,191, 29, 60, 40, 29,208,175,103,228,146,101,159, - 28,150,133,197, 22,165, 92,202, 66,126, 97, 37,116, 6, 3, 34,131, 61,107,252, 48, 22, 77,142,218,129, 44, 22, 71,203, 90, 84, - 36, 39, 39,227,241,199, 31,183,228,117, 30,143, 87,199,249,114,197, 73, 81, 20, 30,127,252,241,122, 14,207,241,227,199,237,186, - 79,174, 96, 45,138,108,197,145, 61, 1, 70,146,164,203, 5,214,205,110,158, 61,177,101,237,234,219,136, 55, 87,205, 28,160, 40, - 10,211,167, 79, 7,151,203,197, 59,239,188, 3,138,162, 16, 31, 31, 15,138,162,208,189,123,119,112,185, 92,244,239,223,191,193, -247,126,250,244,105,116,234,212,201, 18,166,248,248,120,116,237,218, 21, 20, 69,161, 87,175, 94,224,114,185, 24, 60,120,176, 59, -156,239, 85, 87, 87,199, 73, 50, 7, 8,223, 0, 0, 32, 0, 73, 68, 65, 84,165, 82,100,100,100,128,195,225,128, 32,136, 91, 0, -226, 0, 32, 56, 56,248, 79,149, 74, 21,165,209,104,240,202, 43,175, 16, 58,157, 46,246,157,119,222,121, 95,163,209,176, 66,139, - 69,147,193, 86,139, 88, 65, 61,103,206,156,247, 8,130, 72, 52, 59, 84,182,206,147,189,223,118,202, 38,179, 3,149, 94,155, 87, -187,218,136,184, 18,130, 32,210, 25,134, 25,238,232, 92, 0, 58, 27, 97, 85,167,233,208,186,217,208,165,163,101, 46,124,221, 21, - 90,174,160,209,104, 58, 6, 4, 4, 56, 20, 89,214,159, 58,157, 14, 17, 17, 17,208,104, 52, 29, 27,250,210, 8, 14, 14,134, 94, -175,199,215, 95,127, 13, 30,143, 7, 30,239, 47,125,161,211, 57, 55,139,174, 93,187,150,125,250,244,233, 78,157, 59,119,246,254, -229,151, 95, 74,250,244,233,227, 63,100,200, 16,136, 68, 34,168,213,106, 24, 12, 6,116,235,214, 13, 49, 49, 49,200,203,203,195, -111,191,253, 86, 26, 29, 29,237,119,230,204, 25,186,176,176,240,174, 19,234, 65, 3, 6, 12, 0, 65, 16, 56,120,240, 96, 41,128, -116,129, 64,112, 96,241,226,197,222, 58,157,142, 30, 63,126,124, 78, 89, 89,217, 12, 0,122, 62,159,191,182, 79,159, 62,221,147, -146,146,190,163,105,122,117, 67, 19,170,109,220, 42,149, 74, 8,133, 66,119,166,146,224,150,149,149,117, 0, 0,137, 68,226, 3, -224, 79, 75, 10, 87,171,235,136, 97,157, 78,167,241,241,241,145, 0, 64,237, 57, 92, 7,156,254, 70, 35,126,188,123, 55,203,195, -186,255,156,151,151, 23,198,141, 29, 75, 62,214,163, 7, 63,174, 99,199,193, 31,172,216,246, 67,136,175, 76, 23, 25,226, 11,131, -201,128,164,195,135,104,134, 54, 28,102,139,157,191, 71,104,153,197,134,173,163,197,229,114,113,226,196,137,122,251,120, 60, 30, -190,250,234, 43,183,132,129, 89, 84, 57,106, 58,179,105,234, 34, 92, 9, 24, 46,151, 11, 14,135,131, 77,155, 54,129,166,105,204, -156, 57,179, 78,115,162, 53,191, 91,118,158,149, 8,140,153, 79, 3,208, 33,111,165,192,114,190,109,120,107,207,113,203, 37, 91, -183,110,157, 91,142,214,240,225,195, 93, 10, 87,235, 22, 6,235,112, 93,188,120,209, 46,239,198,141, 27, 93,198,167,201,100,194, -254,253,251, 45, 34,213,140, 15, 62,248,224, 21, 62,159, 31,120,242,228, 73, 20, 22, 22, 66,169, 84, 66,161, 80,160, 91,183,110, -145, 36, 73, 94, 42, 44, 44,188,115,253,250,245,167,217,220,195,226,111,116,180,180, 75,151, 46,189,186,116,233, 82,187,142,149, -173,179,228,204,121, 50, 11,172, 90, 65,228,111, 22,111,168,233, 86,147,238,234, 92, 0,124,219,166, 67,167, 70,144,141,138, 92, - 96,175,240,117,167,249,208, 77, 59,157, 34, 8, 2, 26,141,198,174,192,178, 22, 7,122,189, 30,101,101,101, 48,153, 76,247, 61, -215,151,189,154,172, 43,161,117,229,202,149, 73,147, 39, 79, 46,240,244,244,140, 43, 41, 41, 41,166,105,186,127, 90, 90,154, 63, - 69, 81,144,201,100,144,201,100, 56,112,224, 0,196, 98, 49,166, 79,159, 94,108, 50,153,146, 61, 60, 60,124,213,106,245, 31,133, -133,133, 31, 56, 84, 48, 92,238,224, 94,189,122,225,252,249,243, 40, 47, 47, 63, 2, 32,254,249,231,159,127,188, 89,179,102,196, -226,197,139, 53,183,111,223, 94, 13,160, 88, 34,145,108,223,190,125,123,191,206,157, 59,123,140, 31, 63, 30, 39, 78,156,216, 8, - 64,227,238, 61, 43,149,202, 58, 2,171,170,170, 10,213,213,213,144, 72, 36, 70, 55,227,140,139,191, 70, 24,130, 97, 24,203,179, -169,117,179,204,207,135,161, 40,202, 60,170,209,145,200,130, 68, 34, 89,184,109,219, 54,145,237, 32, 5,147,201,132,162,162, 34, -200,100, 50,204,251,224, 3,222,199,111, 77,233,196,145, 6,166,145, 36, 1,157,158,169, 96,104,221, 33,101,209,115, 39,129,143, -216,146,231,111,128, 89, 24, 60,249,228,147,245,154, 11,121, 60, 30,142, 28, 57,130,167,158,122,202, 82,113,233,220,185,179,203, -202,149, 89, 24, 60,241,196, 19, 22,103,232,208,161, 67,118,155,253,204,142,148, 59,130,208,124,236, 27,111,188, 1,138,162,240, -249,231,159, 99,214,172, 89, 32, 73, 18, 43, 87,174, 4, 73,146,248,240,195, 15,221, 22,153,214, 2,230,206, 39, 53,159, 97,179, -170, 32, 95, 31, 8, 0,240,144,201,204, 55,212,160,178,135,162, 40,139,147,213,177, 99, 71,112,185, 92,116,239,222, 29, 20, 69, - 89,156,172, 97,195,134, 89,199, 35,227, 14, 39, 69, 81,200,204,204,180,132,185,123,247,238,117,156, 44,138,162, 48,124,248,112, -119,130,185,196,203,203,107, 65, 76, 76, 76,219, 85,171, 86,113, 57, 28, 14, 6, 12, 24,208, 58, 40, 40,232,174,209,104,244, 93, -184,112,161,216,206, 57, 34, 0,113,109,219,182,149,176,185,134, 69, 19, 58, 90, 11,236,252,229,109,221,231,170, 1, 21,201, 68, -235,227,205, 28,182,226,168,214, 33, 75,118,197,101,239, 92, 87,160,204, 10,210,153,165,238,142,208,170,181,157,157, 94, 76, 44, - 22, 95, 46, 46, 46,238, 46, 18,137,234,136, 44,123,130,139,195,225,160,176,176, 16, 98,177,248,178, 86,171,109,180,135,232,170, -233, 16,128,230,214,173, 91,111, 89,253, 30, 56,108,216,176, 45, 71,142, 28, 9, 78, 74, 74,194,153, 51,103,224,239,239,143,117, -235,214,221, 43, 42, 42,154, 4,224, 72,105,105,169,203,235, 70, 69, 69,117,144, 74,165, 72, 73, 73, 1,128, 19, 0,166, 76,155, - 54,141, 48, 24, 12, 88,191,126,189, 18,192, 65, 47, 47,175,253,187,119,239,238, 20, 23, 23,199, 79, 74, 74,170, 58,115,230,204, -239,110,138, 44, 19, 77,211,245, 4,150,117,156,122,120,120,184,227,104, 25, 60, 61, 61,175, 84, 85, 85,141, 82,171,213, 85, 2, -129,192,163,170,170, 74,107, 45,176,204,252, 20, 69,113, 51, 51, 51, 11, 0, 68,122,122,122, 94,129,131,102, 78,138,162, 6, 12, - 24, 48,128,178,125, 6, 69, 69, 69, 40, 44, 44,132, 94,175, 71,231,206,157, 9, 14, 97,224,148,231, 94,182,153,214,129, 21, 89, -127,147,163,197,152,243,186,121,148,160,189,145,134,135, 14, 29,178,252, 38, 73, 18,155, 55,111,118, 75, 20, 29, 57,114,196,105, -135,117,155,166, 67,151,214,184,249,248, 47,191,252, 18, 12,195, 88,156, 44,146, 36, 49,103,206, 28, 8, 4, 2, 44, 94,188, 24, -115,230,204, 1, 69, 81, 46,155, 14,173, 5, 76,139,119, 84,214,149,163,154, 76, 81,219, 31,138, 32, 8,107,177, 69,184, 43,222, -156,185,121,238,180, 4, 88,115,154,207, 19, 10,133, 14, 59,194,219,112, 58,187,192, 62, 0, 89,193,193,193, 41,221,187,119,247, - 60,119,238, 28, 86,174, 92,201,211,106,181,205,147,146,146, 44,215,181, 23, 95, 74,165, 82,196,230, 28, 22, 77,225,102, 57,249, -187,196,166,127, 21, 97,221,140,231,228,211,246,120, 88,237,179,230, 45, 33, 8,194, 96,231,122, 37,118,196,149,237, 53,172,143, - 41,113,232,104,185, 42, 44, 92, 9, 46,119, 28, 45,149, 74,245,251,193,131, 7,187,142, 29, 59,150,114,214,108,168, 84, 42, 17, - 24, 24,136,171, 87,175, 26, 85, 42,213,239,110, 56,101,141, 41,180,108,145, 84, 92, 92,204, 49, 24, 12,104,213,170, 21, 66, 67, - 67,161,209,104, 80, 81, 81,193, 1,112,196, 77, 14,158, 68, 34,225, 0, 64, 69, 69, 5, 80, 51,212,180,117,116,116, 52,206,159, - 63,143,178,178,178,159, 1, 12, 89,176, 96, 65,231,110,221,186,241,126,248,225, 7,213,212,169, 83,127, 54, 24, 12,110, 41, 13, -154,166,117, 70,163, 49,130, 36, 73,125, 69, 69, 69,190,117,124, 6, 6, 6,250, 72, 36, 18,162,168,168,200,224,142,208,138,139, -139, 59,155,147,147,131,133, 11, 23,150, 44, 89,178, 36,186,186,186,186,188,178,178,210,104, 45,182, 52, 26, 13,233,231,231, 39, - 88,191,126,189, 8, 0,226,226,226,206, 58, 18, 90, 74,165,178,153, 88,252, 87,197, 88,171,213,162,176,176, 16,133,133,133, 40, - 42, 42, 66,117,117, 53, 34, 35, 35,161, 82,169,194,217, 98,230, 31, 19, 90,117,154,207,172,243,183,245,139,188, 33,121,221, 90, -192, 60,249,228,147,150,190, 93,102,135,204,188,253,248,227,143,182, 29,204,221, 18, 90, 95,126,249, 37,222,120,227, 13, 8,133, - 66,172, 90,181,170, 78,211,161,173, 56,160,105,154,112,231,222, 35,222, 85,163,112,173, 15,184, 92, 46,124,167, 22,213,105,162, -179, 35, 56,220, 10,231,146, 37, 75, 26,165,233,208,154, 51, 60,188, 38,171,108,218,180, 9,163, 70,141,194,201,147, 39,239,187, -233,176,125,251,246,223, 39, 38, 38,122, 94,187,118, 13, 85, 85, 85, 40, 41, 41,129, 86,171, 69, 94, 94,158,195, 86,129,218,178, - 92,200,230, 28, 22,127,115, 57,149,254,119,242, 54,230,245, 40, 23, 47,112,183,133,150, 59,142,150, 86,171, 93,245,230,155,111, - 78, 27, 56,112,160,143,135,135, 7, 10, 10, 10,234,137, 44,133, 66, 1,169, 84, 10,181, 90,141,189,123,247, 86,105,181,218, 85, -174,196,129,193, 96, 64, 64, 64, 0, 74, 75, 75, 65, 59,232, 63, 77,146, 36, 68, 34, 17, 20, 10, 5,224,162,147,185,189, 23,134, - 94,175,135,193, 96,128,193, 96,128, 94,175,119, 89, 75,182, 53,243, 36, 18,137, 89,120, 0,128, 50, 36, 36,164,149, 80, 40, 68, -118,118, 54, 80, 51,178,111,224,227,143, 63,206,149,203,229,204, 75, 47,189,116,138, 97,152, 87,224,124,118,124, 93,114,114,114, - 4, 0,136, 68,162, 12, 0,200,203,203, 51, 84, 84, 84,212,113, 10,197, 98, 49,243,212, 83, 79, 5, 51, 12,131,228,228,228, 8, - 30,143,199,192,241,168, 70,205,158, 61,123,174,121,122,122,238, 88,182,108,217,216,132,132,132,171, 29, 58,116,136, 80, 42,149, -197,106,181, 90,173,209,104, 24, 14,135,195,243,246,246, 22, 30, 62,124,248,207,180,180,180,129, 50,153,108,199,158, 61,123,174, - 57,114,222, 36, 18, 73,158, 74,165,106, 97,126,166,214, 34,171,176,176, 16, 12,195, 32, 43, 43, 11, 98,177, 56,199, 85,179, 46, -139,166,131,185, 82,101,235,188,216,238,115, 87,100, 89, 11,131,195,135, 15, 59,157, 67,203, 93, 78,107, 81, 52,107,214, 44,172, - 93,187,182,158,163,181,120,241, 98, 0,192, 7, 31,124,224,118, 31, 45,179,123, 85,184,214, 7, 65,111,148,213, 9, 59, 0, 16, -230,240, 53, 44,207,131,162, 40, 44, 92,184,176, 94, 39,117,235,166, 61, 55,155,248,234,132,179,184,184, 24, 20, 69,193,199,199, - 7,227,198,141,195,224,193,131, 45, 77,144, 13,229,189,113,227, 70,202,187,239,190, 27,219,190,125,123, 44, 90,180,168,204,203, -203,203,227,229,151, 95,166, 42, 42, 42, 8,103,142, 22, 43,180, 88,176,104, 4,161,101,206, 96,238,142, 58,116, 80, 88, 14, 68, -221,185, 54, 42, 85, 42,213,184, 65,131, 6,253,178,107,215, 46, 81, 84, 84, 20,110,220,184,129,178,178, 50,232,116, 58,240,120, - 60, 4, 7, 7,163,162,162, 2,155, 55,111, 86,171, 84,170,113, 0, 42, 93,112,190,223,165, 75,151, 13,159,125,246,153, 48, 62, - 62, 30,101,101,101, 80, 40, 20, 22, 33, 68, 16, 4,100, 50, 25, 68, 34, 17,206,158, 61,139, 67,135, 14,169, 1,188,239,130,211, -158,154,131, 94,175,183, 8, 46, 55,132,150, 53,167,196,236,234,168, 84, 42, 0, 48, 52,107,214, 44, 8, 0,178,178,178, 0,224, - 78,100,100,228,130,168,168, 40, 98,251,246,237, 12,195, 48,135, 28,136, 44, 11, 39, 65, 16,101, 12,195,148, 3, 8,210,233,116, - 60, 0,168,172,172,212,251,249,249, 5, 8, 4, 2, 90, 36, 18,209, 66,161,144, 46, 40, 40, 48, 26,141, 70, 30, 0,244,234,213, - 75, 7,160,208,102,141, 66,107, 78,154, 97,152,170,141, 27, 55, 46, 24, 63,126,124,247, 30, 61,122,180,127,237,181,215,174,188, -244,210, 75,100,104,104,168,119,117,117,181,230,214,173, 91,229, 43, 86,172,168, 62,125,250,244, 64, 46,151,123,119,227,198,141, - 11, 0, 84, 17, 4, 65,219,227, 52, 26,141,191, 39, 37, 37, 77, 74, 72, 72,160,242,243,243, 81, 84, 84,100, 17, 89, 69, 69, 69, -136,137,137, 65, 90, 90,154, 73,175,215, 39, 53, 32, 62, 27, 11, 44,103, 77, 37,132, 49,231,117, 71, 2,203, 92,153,114,151,211, - 90, 20,141, 26, 53,170,142,139,197,227,241,240,211, 79, 63,217, 45, 55,236,228,171, 58,247,110, 61,199,215,187,239,190, 91, 71, -180,205,155, 55,207, 97,113,230, 42, 62,205, 60,149,155, 66,235,142, 58,116,144,207,157,133,211, 92,118,114,185, 92,204,155, 55, -207,109, 71, 11,245,251,104,213,227, 52,223,123,159, 62,125,160, 82,169, 44, 66,214,145,163,229, 42, 62, 77, 38,211, 27,107,215, -174,101,100, 50,217,163, 85, 85, 85,207,231,228,228,108, 85,169, 84,143, 84, 86, 86, 58,117,180,180, 90,173,128,205, 71, 44, 39, -154,102,126,174,255,142,208,170,125, 73,162, 89,179,102,117,214,206, 34, 73,178,206,214,144,126, 6,181, 56,156,153,153,249,204, - 99,143, 61,246,221, 27,111,188,225, 17, 31, 31,207,109,209,162, 5,148, 74, 37,178,179,179,113,245,234, 85,227,158, 61,123,170, - 84, 42,213,243, 0,220, 25,117,182,237,218,181,107,135,134, 12, 25,242, 97,183,110,221, 94,157, 63,127, 62,167,117,235,214,168, -172,172,132,183,183, 55, 2, 2, 2,112,243,230, 77,236,221,187,215, 84, 90, 90,186, 1,192,199,176,211,134,234,170,194,175,215, -235, 49,102,204, 24,208, 52,141,213,171, 87,195,157, 5,149,173,160,215,235,245, 12, 0,162,182, 63,151,170,118,118,105,220,186, -117, 11, 0,238, 70, 68, 68,120, 0, 64, 82, 82, 18,129,154,249,181,220,169,225, 51, 12,195, 88,156,173,152,152,152,108,219,194, -209,236,100,153, 93, 48, 87,225, 38, 8, 66,195, 48, 76,177, 74,165, 26, 50,107,214,172, 15,191,252,242,203,177, 95,126,249,101, -189,227,100, 50,217,142,149, 43, 87,126, 60,122,244,232, 98,130, 32, 28,246, 35, 83, 42,149, 31, 76,152, 48, 97,244,229,203,151, - 61,132, 66, 33,148, 74, 37,228,114, 57,244,122, 61, 34, 35, 35, 81, 92, 92,140,109,219,182, 85,171,213,234,143,216,236,248,207, -192, 90, 24, 56,114,181,220, 16, 89, 14, 93,157,125,251,246,217,157,163,170,161,156,182, 98,195,221,185,173,156, 85,138,204,211, -210,216,155, 50,162,129,229, 90, 61, 94,138,162,240,233,167,159, 90, 38,109,181,231,100, 53,196,209, 50,115,250,248,248,212,216, -228, 98, 49,104,154,198,240,225,195, 31,132,151, 6, 48,221,106,198,247, 37,179,103,207, 94, 16, 19, 19,211, 26,128,192, 58, 14, - 26,232,226,179, 96,193,194,149,208, 50,153, 76,121,109,218,180,169, 83,192,185, 90,204,212, 96, 48,228,185,121,221, 67, 74,165, - 50,114,229,202,149,111, 74, 36,146,129, 42,149, 42,182,182,224,184,172, 84, 42,147,180, 90,237, 26, 52,108, 17,232, 18, 0,175, -159, 62,125,122,245,144, 33, 67, 22,247,239,223,255,217,183,222,122,139, 96, 24, 6,235,215,175,103,110,223,190,253, 99,173,139, -117,251,126, 34,201,199,199,231,218,230,205,155, 3,127,249,229, 23, 24, 12, 6,172, 89,179, 6, 30, 30, 30,215,202,202,202,220, -165, 40, 62,122,244,232,150, 30, 61,122,188,144,150,150,182, 13,192, 31, 39, 78,156,216,218,179,103,207, 9,105,105,105,223, 3, -184,122,236,216,177,173,221,186,117,155,144,158,158,190, 27,192,197, 6, 20,190, 22,103,203,104,180,223,210,232,192,201,114,198, - 89,197, 48,140,126,242,228,201,111,141, 30, 61,250,235,244,244,244, 71, 42, 42, 42, 98, 1,192,203,203,235,114,215,174, 93,207, -238,218,181,235,102,173,147,229,170,179,126,137, 82,169,124, 42, 54, 54,246,231, 69,139, 22, 73,218,183,111, 79,181,106,213, 10, -119,238,220,193,149, 43, 87,140,223,126,251,173, 66,173, 86, 63, 9,160,156,205,142,255,156,208, 98, 24, 6, 94, 94, 94,117, 42, - 81,230, 33,255, 13,109, 46,180,126, 49,155,151,234,177,229,117,196,233,108,218, 4, 51,164, 82,169,101,114, 83,119,186, 44,208, -180,243,249,216, 24,134,177,112,154, 55, 55, 68,150,203, 17,130,181, 75,224,184,205,233,206,244, 14, 18,137, 4, 6,131,193,194, -235,198,200,207,134,170,197,125, 0,246, 25, 12,134, 91, 0, 90,178,226,138, 5,139, 38, 20, 90,229,229,229, 93,154,248,218, 85, - 90,173,246, 99,173, 86,251,177,121,135, 70,163,121, 80,206,219, 0, 70, 31, 61,122,244,179,163, 71,143,154,219, 17, 22,194,245, -122,137, 78,113,227,198,141, 4, 46,151,251,213,142, 29, 59,186, 49, 12, 3, 79, 79,207,211,119,238,220,121,185, 33, 28, 38,147, -105,114, 90, 90,218, 52,212,246,101,210,235,245,147, 83, 82, 82,222, 68,205,122, 76, 48,153, 76,147,207,156, 57, 99,249,221,192, - 23, 37,195, 48,140,150, 97,152, 16, 7,135,104, 27,232,192,153,157, 45,221,174, 93,187, 20, 0, 46,225,175,121,178, 12,181,155, -198,166,185,208, 25,142, 41,149,202, 86,243,230,205, 91,194,225,112, 6, 40,149,202, 80,137, 68,146,107, 52, 26,127, 87,169, 84, -239,163,102,141, 42, 22,255, 16,116, 58, 93,126,155, 54,109, 40,123, 21, 40,103, 47,114,103, 21, 43,147,201,148, 23, 29, 29,237, -178,114,102,135, 51,223,137,104,184, 27, 25, 25, 73,186,203,101,134, 94,175, 47,118, 22,206,200,200, 72, 52,148,211,213,189, 71, - 68, 68,216,189,119, 23,130,208,225,189, 27,141,198,251,226,116, 22,159,206,160, 86,171,203,253,253,253, 21, 26,141,134,171,213, -106,185, 70,163,177,142,253, 40, 18,137, 74,212,106, 53,155,121, 88,176,120, 16,161,245,144,227, 28,106,150,151,104, 44,104, 47, - 95,190,252,130,197,158, 42, 46,190, 95, 30, 91, 37,169,112,241,187, 33,194,168,209, 29,161, 90, 33,165,106, 36,186, 82,133, 66, -241,146,249,135,185, 15, 8,139,127, 30,114,185,252,209,198,230, 44, 43, 43,107,244,138, 90,105,105,105,247, 38,184,247, 46,255, - 85, 78,103, 40, 40, 40,120,212,133, 16, 99, 51, 14, 11, 22,110,130,100,163,128, 5, 11, 22, 44, 88,176, 96,193,162,105, 64,160, -102,228,128, 61, 52,100, 52,193,192,251,184,118, 18,203,201,114,178,156, 44, 39,203,201,114,178,156,255, 57, 78, 87,220,236,104, -198, 38, 22, 96, 44,231,255, 63, 39, 7, 0, 33, 18,137, 8,161, 80, 72,136,197, 98,130,141, 79,150,147,229,100, 57, 89, 78,150, -147, 69,125,252,227,125,180,252,253,253,147, 41,138,138, 86, 42,149,202,234,234,234, 40, 15, 15,143,219, 18,137, 68, 98, 52, 26, - 51, 75, 74, 74,122, 63, 32,253,100,129, 64, 48, 51, 46, 46,174,221,205,155, 55, 51,170,170,170, 86, 0,248, 6,246, 71, 12,113, -109,246, 19, 0,226,155, 55,111,190, 85, 40, 20,138, 51, 50, 50,230, 0,248,222,141,120, 36,224, 98, 68,146, 53,188, 37, 60, 46, -106,250,147,245, 5,112, 28,192,190,114,165,222,240, 32, 55,125,191,156, 82,169,212,167,101,203,150,235, 35, 34, 35, 35, 25, 64, -203, 48, 53,243, 15, 25, 13,122,222,213, 43, 87,146,239,220,185,179,161,127,255,254, 95,135,133,133, 5,114,185, 92,131,121,212, -151, 74,165,226,109,219,182,173, 21,155,157, 88,176, 96,193,130, 5, 11, 55,133,150,164, 57,218,240, 37,196, 54,147, 1,106,163, -150,153,170,204,197, 13,105, 51,244, 96,128, 23, 24, 32,130,228,144,254, 38, 19, 93, 72,107, 8, 35,215, 32,138, 38, 25, 74, 88, - 85, 85, 21,218,224, 0, 80, 84,116, 65, 65, 65, 64, 72, 72,136,121,241, 99,137,249,247, 3,128, 0,240,197, 43,175,188, 50,245, -213, 87, 95,133,183,183, 55, 12, 6, 67,235,157, 59,119,110,154, 55,111, 94,119, 0, 47,218, 17, 67, 12,234, 78, 18,218, 58, 54, - 54,118,127,106,106,170,111, 69, 69, 5, 58,119,238,188,162,184,184,216,145,208, 50, 54, 52,128,222, 18, 94, 27, 0, 47, 6,121, - 9, 38,125, 51,171,191,119,139, 1,175,225,202,143, 11,166, 77,255,230,114, 57,128,205, 0,190, 41, 87,234,111,254, 93,156, 30, - 30, 30, 1,109,162,163,119,253,248,243,207,189, 79, 31, 59, 6, 31, 1, 31, 18, 17, 31, 96,128,192, 86,109,240,218,236,217,198, - 71, 30,121,164,223,119,223,125, 23,151,158,158,142,208,208, 80,136, 68, 34,136,197, 98,200,229,114,108,219,182,237,190,211, 17, - 77,211,247, 0, 28, 37,141,216,167, 40,192, 45, 54, 91,178, 96,193,130, 5,139,127,189,208, 98,104,172, 88,125, 96,114,231, 43, -101,191,225,139,103, 10,151,138,194, 96,236, 49, 34,250,233,132,137,157,224,233, 47,134, 80, 74,161, 66, 94,213,225,230,133, 92, - 28,223,253, 39,188, 13,173,145,246,251,249,235, 42,149,170,237,253, 4, 68, 44, 22,139,131,131,131,139,196,214, 11,227,221, 31, -132, 0, 86,188,250,234,171, 83,223,121,231, 29,252,254,251,239,216,179,103, 15,198,143, 31,143, 25, 51,102, 64, 42,149, 78,154, - 49, 99, 70, 26,128,175,157,112,180,142,141,141, 61,149,154,154,234,171, 86,171,113,229,202, 21,148,149,149,253,209, 88,145,238, - 45,225, 45, 91,255,114,220,187,221,158,158, 14,255,246,131, 64,144, 53,143,161,215,236,189,184,248,166,218, 59, 47,229,187,183, -246,252,248,253, 91,203,247,220, 90, 94,174,212,207,249, 59, 56,163,162,162,214,237,250,233,167,222, 97, 97, 97,216,159,125, 27, - 45, 35,130,209,172, 77, 39, 84,102,223, 70,201,221, 44,232,244,122,244,237,219, 55,238,212,169, 83, 40, 40, 40,128,159,159, 31, - 52, 26, 13,210,211,211, 33, 20, 58, 94,141,163, 1,233,104,200,177, 93,183,150,223, 58, 95,178, 76,153,131, 15, 1,152,216,236, -249,175, 65,235,102,205,154,253, 44, 18,137,100, 25, 25, 25, 31, 0,216,210,132,215, 26,215,173, 91,183, 53,151, 46, 93,186,160, -213,106,223, 4,144,193, 70, 63, 11, 22, 44,254, 73, 56, 27,117, 24,236,239,239, 7,191, 72, 46,188,125, 36, 67,151,255,244,252, -211,175, 45, 29, 0, 94, 84, 62,202,164,103,112,151,249, 29, 26,223,155,104, 51,132,135,183,191,233, 7,223,238,114,192, 71, 85, -128,112, 8, 28, 17,250,248,248,252, 28, 16, 16,144,106,189, 25,141, 70,225,156, 57,115, 76, 25, 25, 25,146,130,130,130,128,140, -140, 12,201,156, 57,115, 76, 70,163, 81,232, 31,232,115,193,163, 57, 47, 47,162,183,168, 68,210, 28,175,187,112,176, 62, 11, 10, - 10, 82,141, 29, 59, 86,221,161, 67,135,169, 12,195, 96,235,214,173,120,249,229,151,119,254,246,219,111, 17, 99,198,140,217,122, -244,232, 81, 76,153, 50, 5, 94, 94, 94, 51,220, 21, 89, 23, 46, 92,192,132, 9, 19, 74,140, 70,227,140, 70,140,247,137,163, 86, -156, 65,200, 35,207,130,195, 19, 89,214, 82, 35, 72, 18, 92,145, 12, 97,143, 61,143, 87, 22,127, 7, 0, 19,255, 46,206,200,168, -168,150,231,146,147,241,237,194, 69,104, 29, 16,128,208,102,161,240,105,211, 1, 30,254,126,160, 40, 10, 12, 3,134,207,231,211, -229,229,229,144,203,229,144,203,229,200,206,206,198,241,227,199,113,239,222, 61, 52, 70, 58,154,253,109,127, 50,225,181,182,239, -137,155,225,160,179,116,196,226,225, 18, 89,177,177,177,167,110,220,184, 17,147,148,148, 20, 18, 26, 26,250, 73, 83, 94,172, 75, -151, 46,203, 79,158, 60,233,115,240,224,193, 65, 65, 65, 65,201, 0, 90,223, 79,152,155, 55,111,126,189,117,235,214,121, 0,198, - 53,114, 16, 39,118,239,222,189,140,207,231, 31,186,207,176,177, 96,241, 48,161, 3,128, 88, 86,104,185,129,197, 59,199, 82, 62, -109,181,184, 82,126, 0,187, 62,249, 3,159, 12,189, 73, 47,238,158, 77,127,254,194, 13, 28,222,245, 7,138,241, 7,134,189,214, - 18, 99, 63,232, 56, 80,108,194, 34,153, 76,118,193, 30, 15,143,199, 11,204,200,200,240,205,202,202,242,189,125,251,182,111,102, -102,166,239,181,107,215,138, 42, 42, 42, 20,195,135, 15,167, 1, 96,248,240,225,244,221,156,187,170, 65, 79,247,161,195, 7,160, -227,172,159,218,133,206, 73,236,228,231, 29, 44,152,235,232, 30, 56, 28,206,158, 47,191,252,242,173,220,220, 92,209,247,223,127, -143,244,244,116, 68, 69, 69, 97,209,162,133,229, 35,122,180,237,245, 72,148,239, 42, 79, 17,247,179, 45, 91,182, 64, 44, 22,163, - 99,199,142,142, 92,183, 22, 29, 58,116, 72, 49,139,172,139, 23, 47,226,249,231,159,215,203,229,242,171, 0,150, 1,216, 67,145, - 68,178,191,167,164, 66, 34,160,238, 18, 4, 14,160,166,207, 87,120,195,163,158, 64,229,221, 75, 48,233,213,160, 4, 18,112,120, - 66,144, 20, 31,101,183,210,144,241,235, 66, 84,100,221,207,194,225, 15,192, 73,146, 26, 79, 46, 23,113,126,190,136,141,136,132, -143, 80, 6, 85,218, 49,160, 66, 1, 30, 79, 0,128,129, 64, 32, 64,117,117, 53, 46, 92,184,128,235,215,175,227,220,185,115, 56, -123,246, 44,138,138,138,112,191,233,104, 73,143,108,173,163,116,196,150, 81,255, 14,145,149,154,154,234,171,209,104,112,227,198, - 13,148,148,148, 92,108,202, 11,102,100,100,148,167,166,166, 34, 44, 44, 12,223,127,255,189,127, 68, 68,196,201, 6, 10,154,214, -177,177,177,167,174, 95,191, 30,147,148,148, 20, 26, 16, 16,176,162, 49,195,247,200, 35,143, 44, 62,121,242,164,247,225,195,135, - 7,251,251,251,223,175, 16,100,193,226,255, 25, 2, 0, 47, 16, 4,113,182, 67,135, 14,151,219,183,111,255, 7, 65, 16,105, 0, - 70,225,223, 59,119,167, 83, 88,110, 58, 49, 49,241, 4, 0, 36, 36, 36,244,177, 61, 72, 17,112, 30,249,217, 69,216, 60,177,152, - 86,151,160, 98,209,123,159,237, 57,127,250,226, 83,111,206,120,211,123,245,198,229,216,158,118, 0, 99, 86, 24,209,107,116, 59, -156,217,159,243,214,196,126,115,241,214,140,217, 64,253, 33,154, 12, 73,146, 72, 73, 73,129,201,100,130, 78,167,131, 78,167, 67, -187,118,237,202,142, 29, 59, 38, 5,128,204, 63, 51, 24,174,175, 78, 48,240, 29, 25,111,202,128, 24, 40,228,122,124,247,110, 38, - 74,179,181, 63,214,114, 36,213,145, 7, 36,249,245,134, 13, 27,158,152, 50,101, 10,190,248,226, 11,236,220,185, 19, 79, 62,249, - 36,158,123,238, 57,148,148,148,120,135,226, 30, 6,180,243, 11,233, 59,125, 67,159, 49, 99,198, 64,161, 80, 32, 61, 61,253,186, - 77,184,146, 80,211, 25,254,245,227,199,143,251,168,213,106, 84, 87, 87,163,111,223,190,144,203,229, 60, 0,253,237,196,157, 39, -128,230,106,181, 26, 45, 90,180,104, 93, 82, 82,210,195, 14,103, 61,120, 75,120, 22,113,171, 87,150, 67,175, 44, 7,135, 39,132, -208, 59, 12, 87,191,155, 1,134,174,105, 49,243, 12,239,104,239,244, 38,227, 20, 11, 4, 72, 76, 77,193,241,196,125,104, 27, 25, -137,158,177,177, 56,117,249, 10,120, 36,129,145,147, 38, 3, 52, 19,144,146,146, 66,148,148,148,224,242,229,203, 88,184,112, 33, -114,114,114,112,224,192, 1,152, 76, 38,183,194,105,147,142, 84,139,222,251, 44,123,236,179,207,223, 60,120,228,183, 59,137,191, -255, 52,104,123,218,209,248, 49, 43,140, 68,175,209,237,112,246, 64,206,204,108,162,252, 91,101, 46,110, 56,227,124, 64,176,156, - 77,199,217,190,125,251,246,167, 83, 83, 83,197,106,181, 26,187,119,239,198,252,249,243, 13,122,189,158, 2,176,199,206,185,233, - 0,190, 64,253,165,183,236,133, 83, 6, 96, 26,128,174,245,210,152, 66, 81,242,204, 51,207, 24, 22, 44, 88,192,125,252,241,199, -177,111,223, 62,191,145, 35, 71, 94,204,200,200,136,199, 95,205,136, 73,174,132,225,125,116, 25,112, 43, 62,107,133, 96,112,104, -104, 40,182,111,223,238, 63, 97,194,132,228,162,162,162,222,176,223,196,201,166, 37,150,243, 97,226,108, 1,224, 85,169, 84, 58, -165,111,223,190,222, 79, 62,249, 36,124,125,125, 97, 52, 26,145,155,155,219, 45, 49, 49,177, 91,106,106,106,129, 78,167, 91, 11, - 96, 19,128, 10,123,164,206,180,200, 67, 45,180, 18, 19, 19, 25,212,140, 80,179, 11,149, 73,142,248,224,161,232,246,187,148,172, - 40,171,210, 47, 24,185,244,104, 69,142,254,169,175,190,250, 10,207, 61, 49, 1,251,126, 23,227,244,206,189, 24, 56,190, 16, 3, - 39, 71,226,207,147,142,187, 69, 24, 12, 53,131,223,140, 70, 35, 12, 6, 3,244,122, 61,244,122, 61,196, 98, 49,174,221,188, 2, -163,119, 9,231,249, 53,173, 56,161,109, 36, 72,221, 89,136, 3,171,115,116,138, 98,195, 92, 93, 57,126,170,103,223, 0, 95,175, - 90,181,106,210,148, 41, 83,176, 96,193, 2,252,244,211, 79,204,138, 21, 43,136,121,243,230,161,188,188, 28,253,250,245,195, 43, -147,159,199,181,184, 16,188, 59,127,177,108,212,168, 81,248,248,227,143,161, 84, 42, 87, 57, 8,158,151, 78,167,179, 44,118,155, -151,231,122,233,198,156,156, 28, 48,206,151, 82,131,183,132, 39,244,146,240,150,112, 72,226, 57, 14, 1,127,131,137,193,241, 5, -189,192,137, 25,137,249,107,119,194, 68, 51, 24,247,212, 32, 68, 42,170, 32, 18, 75,106, 20, 41,109,186, 47,206,232,161,111,130, -228, 10, 97,210,107,176,101,203,102,236, 57, 84, 1,157,252, 14, 94,123, 60, 10,129, 78, 56,141, 70, 35,211,188,121, 27,180,108, -175, 3, 35,224,225,216, 93, 45, 98,251, 36,224,198,181,219,200,175,212, 35, 46,182,125,139,201,147, 95,132, 64, 32,192,237,219, -183,177,100,201, 18, 40,149, 74,119,215,133,179,151,142,164,171, 95, 91, 43,124,245,197,215,222,187,144,126, 49,119,235, 23,187, -126,153,246,238,148,175, 79,239, 60, 24, 59,112,124, 33, 6, 76,138, 36, 55, 92, 42,127, 22,192, 2,182,130,248, 80, 98,195,153, - 51,103,196, 42,149, 10,213,213,213,120,249,229,151, 49,109,218, 52,174,189, 74, 75,113,113, 49, 82, 82, 82,158,156, 62,125,250, -152,194,194,194,222,112,190,238,165,119,167, 78,157, 82,143, 29, 59,214,218,195,195,195,178,147,166,105,232,245,122, 75,153,162, -213,106,161,213,106, 33,147,201,144,154,154, 42,244,241,241,217, 5,231, 77, 24,127, 71,151, 1, 84, 85, 85, 61, 59,106,212,168, -228,109,219,182,249, 71, 70, 70,226,251,239,191,247,127,241,197, 23, 79,222,189,123,183, 23,216,254,100, 44, 30, 94,204,121,230, -153,103, 22, 7, 6, 6,146, 29, 58,116, 64,112,112, 48,180, 90, 45, 42, 43, 43,193, 48, 12,252,252,252, 48,105,210, 36, 60,245, -212, 83, 33,201,201,201,203,143, 29, 59,182,160,188,188,124, 51,128, 53, 0, 50,173, 68,150, 83, 45,242,208, 59, 90, 9, 9, 9, - 39,234,168, 24, 2,233,103,254, 56, 21, 43,140, 1, 8, 18,200, 37,143,129, 0,129, 10,131,158,103,168, 34,215, 30, 62,124,216, - 91,169, 84, 66,161, 80, 96,104,223, 17,152,187,225, 23,244,124,190, 10,205,218,132, 96,245,135, 7, 12,174,132, 22, 77,211, 48, - 26,141,168,174,174, 38, 79,156, 56,225, 23, 30,209,140,120,254,173, 33,152,254,125, 59,200, 2,120, 56,248,121, 14,202, 83, 67, -148, 76,105,197, 29, 93,121,217, 86, 59,133,239,228,247,223,127,127,210, 27,111,188,129,229,203,151, 99,217,226,143, 79,135, 4, - 5, 62, 18, 31, 31, 79,124,244,209, 71,152, 61,123, 54,194,195,195,193, 17,120,160,101,223,231, 49,107,214, 44,172, 93,187, 22, - 95,173, 94,170,111,231, 35, 77,187, 86, 86,111,181, 27, 3,128, 69, 3, 6, 12,120,226,240,225,195, 62, 66,161, 16, 87,175, 94, -197,248,241,207, 67,204, 5,184, 28, 18, 96,104, 48, 52, 13,130, 96,224, 47, 19,192, 91,196,129,191, 7, 23, 49,126,116,251,114, - 70,218,250,106,153, 34,195,158, 32,242,245,224, 95,221,241,193,136,176,216, 73, 95,240, 40,129, 20,218,202, 66,252,182,102, 26, - 22, 45,254, 26,167, 82, 79,163,162,162, 2,131, 7, 14,192,154, 81,126,127, 89,127, 78,196,155, 35,206, 27,187,222,195, 43, 83, -167, 99,227,250,117, 32,185, 66,252,118,226, 28, 14, 31, 61,137,148,148, 20,188, 52,113, 44, 62,143, 46,116,200,105, 50, 25,224, - 31, 16,142,199,250, 68, 65,234, 33, 5, 73, 0, 45, 34,252,225,231,155,135,160, 32, 2,105,167,143, 34, 57, 57, 25, 30, 30, 30, -136,136,136,192,218,181,107,145,157,157,141,151, 95,126, 25,124, 62,223, 33,175,163,116,164, 32, 12, 32, 76,252, 86, 30, 30, 30, - 59,116, 58,221, 42,189, 94,191,247,249, 81,147,119,188,188,228,231,118, 61,159,175,226, 52,107, 19, 2,130, 65, 31, 86,104, 61, -180,144, 24, 12, 6,152,215,115,206,205,205,117,122,112, 92, 92, 28,182,108,217,210,110,226,196,137,201,133,133,133,143,193,254, -162,242,178, 78,157, 58,165, 38, 39, 39,183,214,104, 52,200,202,202,114, 43, 32,181, 11, 35, 43,157, 28, 98,238, 50,224, 99,221, -101,160,172,172,204,220,101,192, 30,202, 80,179,142,234, 93, 59,255,133, 3,120,179,182,134, 15, 59,194,242,234,248,241,227,123, -110,223,190,157, 23, 21, 21,133,125,251,246,249,141, 26, 53, 42, 37, 35, 35,163, 43,128,108, 54,233,176,120, 8, 49,113,225,194, -133,164,201,100, 66,105,105, 41,180, 90,109,189, 60,200, 48, 12,196, 98, 49,134, 14, 29,138, 33, 67,134, 8,206,159, 63, 63, 53, - 41, 41,233,213,172,172,172,249,181,121,201,174, 22,249, 87, 9,173,122, 47, 94, 10,139, 62, 29,147,234, 37,144,146,177,160, 9, - 47, 63,191, 0, 9,151,203, 37,188,196,129, 94,171, 86,206, 46,187,121,243,230,189, 93,187,118, 5,119,239,222, 29, 96,128, 78, -205, 6, 67, 94,120, 26, 94, 92, 53, 74,229,165,142,230,145, 98,126, 61,176, 91, 82, 94, 94, 73,183,137,108,167, 86,169, 84,228, -129, 3, 7,194,122,245,238,201,219,155,250, 29,241,236,178, 96,200, 2,120,248,109,237, 93, 92,252,222, 64, 79,155, 56,162,242, -207, 75,107,170,237,213,112,121, 60,222,140, 55,222,120, 3, 59,119,238,196,156, 57,115,182, 60,213,173,229,160,103,134,245, 37, - 83, 82, 82, 48, 98,196, 8,228,231,231,227,151, 95,126,193,252,249,243, 49, 97,194, 4,124,241,197, 23,184,240,227, 39,184,190, -164, 43,111,238,206,219,215,232,155,196,240, 27,165,213, 7,109,104,179,111,220,184,241, 88,255,254,253, 79,238,221,187,215, 47, - 38, 38, 6,219,182,109,199,204,215, 95,197,143, 11, 70, 33, 58, 80, 12,232, 21,160,117, 42, 16, 60, 17, 96, 80,131, 41,191, 11, -189, 94, 45,125,119,199,237,235, 38, 59,156, 94, 18,222,146,239,223,127, 34,172,211,212,109, 60,243,190, 91,183,239, 96,237,241, -114,156, 74, 61, 13,115, 19, 69, 72,128,183,109, 84, 57,124,104,246, 56, 9,146, 66,199,151,190,198,220,170, 4, 28,218,188, 4, - 67, 95, 94, 8,121,105, 49, 82, 83, 83, 17, 26, 26,138,207, 55,110,198,140,233, 83, 97,162, 25, 71,207,156,215,166, 77, 36, 56, -156, 2,240, 5, 52, 8, 0,122,125, 57,252,252, 40, 52,107,230, 7,128,176,184, 87, 4, 65, 96,216,176, 97,122,134, 97,138, 52, - 26, 77,233,174, 93,187, 8,103,233,232,147,209,169,161,124, 49,249, 40, 1,210, 51, 32, 32,144, 16, 8, 5, 8,244,142,192, 7, -111,190, 6,197, 11,234, 71,183,109,219,182,235,219,111,191, 45, 72, 77, 77,221, 78, 8,124,110,203, 11, 21,209, 94, 92, 53,192, -144,205, 1,154, 45,194, 30, 78,140,126,228,145, 71, 46,254,246,219,111, 66, 62,159,143,189,123,247, 98,254,252,249,134,178,178, -178,147,182,162, 39, 48, 48,176,253,214,173, 91, 35, 34, 35, 35,177,110,221,186,118, 35, 71,142,156, 6, 96,137, 29,206,105,199, -142, 29,107,173,209,104,112,241,226, 69, 76,152, 48, 33,187,168,168,232,170,173,192,139,136,136,232,181, 98,197, 10,110,231,206, -157, 81, 85, 85,133, 65,131, 6,169, 0,188,234, 36,172, 13,233, 50, 0,160,102,173, 63, 7, 93, 6,224,235,235,251, 77, 78, 78, - 78, 63,145, 72,228, 52,130,244,122, 61,242,242,242,224,229,229,133,196,196, 68,159,150, 45, 91,126, 0, 96, 50,155,116, 88, 60, -140,208,233,116,216,185,115, 39, 58,117,234,132,182,109,219, 66,161, 80, 88, 68,151, 78,167,131,209,248,215, 44, 72, 36, 73,162, -107,215,174,136,142,142, 38,102,206,156, 57,206, 90,104,253, 27, 97,126,233, 46,176,109, 23,213,100, 35, 23,192, 56, 90, 36,120, - 95, 40, 20,142, 14,111, 30,139, 54,109,218, 8,159,126,250,105,190, 78,167,147,158, 56,154,252,103,207,158, 61, 81, 86, 86, 22, - 60,103,206,156,178,176,102, 97,116,242,164,114, 95,130, 41, 7, 71,199, 79, 1,234, 47, 58,170,229, 84, 55,223,251,231,242, 96, - 0, 56,158, 22, 81,253,204,160,177,165, 28, 14,135, 58,125,227, 24,209,123, 6, 5,255, 22, 34,164,237, 46, 4, 63,187, 51, 34, - 3, 43, 33,147,201, 28,206, 79,213,177, 99,199,118, 36, 73, 98,231,206,157, 0,240,193,141,236,194, 75,146, 35, 39, 62,219,179, -120, 11,247,221,247, 63,196,220,185,115,241,210, 75, 47, 65,175,215, 99,249,242,229, 72, 77, 77,197,175,191, 28,135, 49,105, 46, - 86, 60, 93, 70,190,252,157,230, 87,189,201,219,255,118,121,121,181, 13,117,198,173, 91,183,122, 13, 29, 58,244,228,238,221,187, -253, 90,183,110,141, 21,107,191,196,248, 55,167,224,236,210, 65,128,200, 7,188,222,239,130,240, 10,175,145, 67,101, 89,192,225, -119, 29,114,114, 72,226,185,216,137, 95, 88, 4, 81, 70, 70, 6,166,207,122, 7,191, 29, 60, 12,115, 19,197,204, 55,167, 99,235, -218,143,161, 60,179, 1, 66,159,102,144, 4, 68,161,234,238, 37, 0,144,219, 28, 42, 43,123, 0, 0, 32, 0, 73, 68, 65, 84,187, -119, 91, 78, 0, 80,203,239, 66,113,239, 38, 34,135,188,137, 15,198,141,199,208,151,129,181,139,222,193, 11, 19,198,224,243,141, -155, 17, 25, 25,137,207,215,111,194,228,201,147,100, 85, 57,185,173, 97,211, 76,113, 46,253,194,141, 85,171, 23,138, 85, 42,165, - 39,143,207, 15, 2,195, 32, 56, 56, 24, 85, 85,213, 48, 24, 12, 80, 42, 85, 32, 73, 18, 36, 73,130,195,225, 96,196,136, 17,188, -228,228,228,102,127,252,241,135,127,173, 5, 28,109,109, 1,155,161,201,198,216,103,158,121,102,112, 96, 96, 32,233,235,235,139, - 62,125,250,192,100, 50, 65,171,213,130,166,105,240,249, 38,139,165,124,242,228,201, 57,122, 83,184,113,203,132, 36, 13,135, 40, -215, 82, 90, 97, 82,227,173,105,205,226,111, 70, 70,102,102,102,252,192,129, 3, 79,254,248,227,143,126,195,134, 13, 67,203,150, - 45,185, 79, 63,253,180,191, 74,165, 26, 96,125, 96, 81, 81,145,247,132, 9, 19,206,229,230,230, 70,212,238,234,234,128,179,171, -135,135, 7,178,178,178,204, 34,171,139,109, 37,140,207,231, 31,186,116,233, 18,151,207,231, 35, 61, 61, 29, 19, 39, 78, 44,205, -206,206,118,213, 44,119, 95, 93, 6,104,154,214,218,251,143, 36, 73,193,249,243,231,225,106, 46, 64,146, 36,193,227,213,201,198, - 21,108,178, 97,241,144,194,160,211,233,208,165, 75, 23,100,103,103,227,252,249,243, 22,193, 85, 90, 90,138,130,130,130, 58, 7, -159, 61,123, 22, 23, 46, 92, 64,239,222,245,230, 36, 95,240,111,236,163,101,113, 34, 18, 19, 19,251,216,216,118,124,137, 68,114, -246,185,231,158,107,246,244,211, 79,123,113, 56, 28,104, 52, 26, 24,141, 70,164,165,165,161,109,219,182,170,118,237,218, 85, 12, - 31, 62,156, 40, 45, 45,237,127,245,234,213,172,210,210,210,120,153, 76,150,245,216, 99,143,105, 52, 26, 77, 61,165,229, 21, 69, -233,150, 95,236,198, 3,128,228,237, 5,200,217,239,163, 48,168, 77,226,200,145,149,100,159, 9, 33,168, 42,214, 99,245,179, 55, -240,235,166,163, 88,241,217, 10, 83,239,222,189,243, 22, 47, 94, 92, 80, 80, 80,240,152, 45,151,167,167,231,181,228,228,228,182, - 71,143, 30,197,236,217,179,191, 51,153, 76,203,132, 92,206,193, 73, 47,189, 18,166,215,235,113,254,252,121,248,248,248, 32, 39, - 39, 23,188,128, 56,196,246,123, 1,111,143,235,138, 56,239,114,232, 54, 15,198,141, 2, 53,198,239,210, 46,186, 89,172,156,231, - 32,110, 90,135,134,134, 38,111,223,190,221, 63, 48, 48, 16,227,158, 25,134,180,247, 98,193, 27,186, 2,151, 74,196,248,236,251, -115, 0,128,183,199,117,113,200,233, 45,225,145, 1, 50,190,225, 70,126, 53, 9, 0,119,238,220,193,132, 23,198,227,224,161, 26, -145,117,241,226, 69,140, 27, 55, 14,237, 99,162, 33, 22,242,161,173, 44, 2,109, 50,224,110, 94, 33,242,203, 52,101, 70,154,190, -202, 48,200,134, 85, 19,133, 45,231,221,187,119,177, 98,249, 98,220,186,126, 9,122, 69, 25,120, 18,111,164,157,191,130, 62,125, -250,130,161,141, 40, 47,202, 69, 78,169, 10,155,183,108, 69, 84, 84, 20, 84, 42, 21, 70,141, 26, 85,230,164,153, 34,227,198,141, - 27,209,107,215,174,197,252,249,243,241,203, 47,191,192,100, 50, 65, 32, 16,128,162, 40,240,249,124, 68, 69, 69,225,250,245,154, -241, 4, 52, 77,227,252,249,243, 72, 74, 74, 98,108, 45, 96,107, 62,147,201,132,146,146, 18,232,116, 58,168, 84, 42,168,213,106, - 48, 12, 3, 14,135, 3,134, 97, 44,181, 29, 14,135,131,172,172, 44, 92,190,124,153,217,183,111,223, 39, 12,195,204, 97,203,176, -135, 26,173, 67, 66, 66,146,183,109,219,230, 31, 28, 28,140,126,253,250,229, 22, 22, 22, 54,183,115,220, 30,134, 97,158,204,202, -202, 66, 84, 84,212, 94, 0, 35,238,231,152,240,240,240,146,244,244,116,191,107,215,174, 97,220,184,113, 37,181,125,190, 92,245, -125,138,136,137,137, 73, 63,124,248,176, 15, 73,146,184,122,245, 42,198,141, 27,167, 47, 43, 43, 59, 5,199, 77,142,119, 80,211, -191,228,174,157,255,194, 1,204, 3,224,227,224, 92, 73,116,116,116,207,115,231,206,241, 8,130,192,157, 59,119,204,121,178, 75, - 45, 47, 11, 22, 15, 27,158, 10, 9, 9,249,118,218,180,105,158,221,186,117, 67, 94, 94, 30,242,243,243, 81, 94, 94,142,248,248, -120,180,111,223, 30,183,111,223,198,161, 67,135,112,225,194, 5, 8, 4, 2,132,133,133, 65,186, 99, 39,190, 34,112, 13, 64,123, - 39, 90,228,223, 35,180,108, 33, 16, 8, 62,152, 56,113,226,140,215, 94,123,205, 71, 32, 16,224,236,217,179,224,241,120,160,105, - 26, 3, 6, 12, 64,118,118, 54, 70,140, 24, 81, 86, 88, 88,248, 52,128,147,238, 92, 76, 22, 44, 40, 28,254,126,112, 96,239,241, - 53, 53,189,228,237, 5, 56,183,183, 24,179,118,117, 4,201, 33,240,205,244, 27, 48,101, 54,167, 91, 71,197, 48, 0,140,205,154, - 53, 43,220,186,117,171, 93,161, 5, 96,242,148, 41, 83,190,153, 60,121, 50, 78,156, 56,129, 93,187,118, 97,216,176, 97, 24, 62, -124, 56,190,253,246, 91,120,201, 79,227,147, 95,175, 97,236,135, 7,112, 53,171,198, 24,106, 31,233,139, 29, 31, 15,131,230,243, -120, 48,165, 25, 72,216, 73,221, 56,246,167,194,209, 84, 15,100, 11,111,209, 79,126,254, 94, 79,105, 24, 30, 94,237, 46,198,139, - 67,226,192, 31,181,189, 65,156,173,130,165,133,215,179, 10, 2, 41,129, 20,111,188,250, 34, 62, 90,242, 41, 76, 38, 19,170,171, -171, 17, 22, 22,102, 91,163,173,135,218, 38,138, 52,235, 38, 10,107,206, 39,135, 63,142,157,187,127,134,187,205, 20,124, 62, 31, - 90,173, 22, 45, 91,182,220, 12,251,205, 20, 25,151, 46, 93,138, 94,188,120, 49, 54,108,216,128,125,251,246,193,104, 52, 66, 32, - 16, 64, 34,145, 64, 36, 18,193,207,207, 15,151, 47, 95,174,115, 82, 85, 85, 21,102,206,156,153,137,250,195,213, 51, 46, 93,186, - 20,237,204, 82, 54,247,219,179, 36, 74,130, 64,101,101,165, 35, 62, 22, 15,161,216,226,241,120,171,253,253,253, 59,230,231,231, -207, 66,253,165,172,188,159,125,246,217,171, 63,252,240, 67,240,157, 59,119,220, 18, 90,143, 61,246,152, 93, 71, 11,192,196,160, -160,160,143,171,171,171, 43, 85, 42,213, 40,184,223,193,188,117,171, 86,173, 78,238,221,187,215, 79, 44, 22,227,250,245,235, 24, - 63,126,124,137, 92, 46,239,141,198,237,164,222,186, 77,155, 54,167,206,158, 61,235,203,229,114,145,158,158,142, 9, 19, 38,148, -178,157,225, 89,252, 11,224, 1, 96,118,100,100,228,219, 83,167, 78, 21,180,107,215, 14,121,121,121, 40, 41, 41, 65,121,121, 57, - 78,159, 62, 13, 0, 8, 13, 13, 69,104,104, 40,110,222,188,137,148,148,148, 42,133, 66, 49, 25,192, 47,255,230,136,113,216, 71, - 75, 44, 22, 63,247,194, 11, 47,248,152, 76, 38,244,238,221,187, 76,167,211,153,102,207,158,237, 31, 20, 20, 4, 15, 15, 15, 12, - 26, 52,168,188,170,170,170, 59,224,254,146, 41, 2,147,236,110,241,239,193,210,100, 20,136,123,143, 15, 65,239,241, 33,232, 58, - 34, 0, 36,135,192,229,195,114,240, 75, 91,170, 94,152, 50,165,178, 89,179,102, 6,146, 36,209,188,121,115,227,246,237,219, 29, -117, 86,250,246,235,175,191,126,212, 96, 48,188,244,242,203, 47,163, 79,159, 62, 48, 26,141,216,190,125, 59,100,185, 7,176,240, -249, 46,142, 3, 98, 50,128,224, 73, 16,232,105, 10,115, 36,178,218, 6, 74,191, 89,246,106,191,167, 6,117,240,197,222, 99, 23, - 49,172, 13, 23,208, 85,223, 15,231,174, 43, 91,223,152, 26, 59,233, 75, 94,105, 81, 30, 26,169,137,194,194,169, 85, 85,163,145, -155, 41, 12, 58,157, 14, 18,137, 4, 92, 46, 23, 2,129, 0, 70,163, 17, 4, 65, 32, 62, 62, 30,205,155, 55, 71, 78, 78,142, 59, - 22,112, 99, 91,202, 44, 30, 94,100,232,245,250, 33,249,249,249,214,142,143,165,179,248,179,207, 62,219,101,251,246,237,193,133, -133,133,248,227,143, 63,128,154,169, 30,236, 33,189,168,168,232, 73,177, 88,140,173, 91,183, 70, 76,152, 48,225,156, 85, 31, 45, -115,231,244, 45,133,133,133, 91,238, 39,140,182, 93, 6,182,110,221,234, 63,106,212,168,221, 42,149,170, 67, 99, 69,132, 72, 36, - 90,115,230,204, 25, 95, 46,151,139,180,180, 52,140, 27, 55,174,196,201,244, 14, 44, 88, 60, 76,168, 6, 48, 47, 43, 43,235,243, -183,223,126,251,131,118,237,218,189, 58,101,202, 20,170,109,219,182,200,207,207, 71,118,118, 54, 90,182,108,137,220,220, 92,124, -247,221,119,186,146,146,146,213,168, 25,108, 82,249,159,141, 49, 47, 47,175,187, 59,119,238,100,130,130,130, 44,253,132,124,124, -124,138,230,207,159,207,200,229,114,198,215,215,183,192, 13,154, 58,171,123,135,132,132,156,184,120,241, 98, 86, 79, 95, 40,199, -125, 17,193,124, 85,221,147,249,170,186, 39,179, 38,191, 27, 19,209,195,219,248,218,180,215,242, 62,255,252,243, 91, 27, 54,108, -200,252, 31,123,215, 29, 30, 69,181,183,223,153,237, 37,189,147, 4, 18, 32,244,208,139, 32, 29,129, 32,132,122, 85,138,128,162, -126, 72, 64, 44, 8, 4,244,114, 17,145, 4, 68,165,233, 5, 47,150, 0,210,171, 20,169, 66,128, 80, 36, 32, 37,161, 5, 18, 72, -207,166,111,175,115,190, 63,178,179,110,194, 38,187, 27,192, 58,239,243,204, 51, 59,237,221,211,230,156,247,252,206,239,156, 89, -187,118,237,157,252,252,252, 59,225,225,225,103,234,224,164, 2,228,130,189,221,219, 69,145,231, 7, 63, 71,122,182,141, 32, 97, -222,162,156,107,241,145, 68,187, 44,130, 88,138,210,201,229,219, 69,100,220,191, 15,144,113,255, 62, 64, 46,223, 46, 34,150,194, -235, 68,179, 64, 76,212,203,155,145,103, 26,251,220,114, 20,206, 86, 33,178, 37,251, 23, 12, 35,134, 29,147,201,182,184,182,164, -117,176,236,102,125, 57,125,229, 66, 73,179, 6, 30,247,206, 38, 12, 50,156,223,183,142, 60,211,181, 19,201,201,201, 33,121,121, -121,228,240,225,195,196,207,207,207, 0,224, 56,170,214, 22,114,180,125,129,223, 22, 68,125,132,243,226,143, 95,147,151,134,245, - 37,189,163, 27,144,168, 16, 57, 35, 21,241,212, 0,246,219, 61,127,188,121,243,230, 6,165, 82, 73, 84, 42, 21,185,126,253, 58, -105,209,162, 69, 9,126,155, 17, 53,208,129, 9,184,124,252,248,241,196, 17,146,147,147,201,181,107,215,200,212,169, 83, 73,231, -206,157, 73,207,158, 61,201,184,113,227,200,255, 17, 16, 0, 55, 28,112,142, 10, 13, 13, 45, 95,178,100, 9, 57,121,242, 36,217, -176, 97, 3, 89,178,100, 9,121,255,253,247,201,230,205,155,201,141, 27, 55,200,158, 61,123,156,241, 57, 10,231,147, 0,199,249, -199,112, 30, 78, 75, 75,179,149, 41,139,197, 66,114,115,115,201,145, 35, 71, 72, 72, 72,200, 13, 84,173,147,229,136,211,171,117, -235,214, 55,111,221,186, 69, 30, 62,124, 72,140, 70,163,141,227,230,205,155, 4,192,169, 39, 16,206, 22, 97, 97, 97, 69, 39, 79, -158, 36,183,110,221, 34, 33, 33, 33,217, 79, 50,238,145,145,145, 69, 10,133,130,156, 56,113,130, 4, 6, 6, 22,161,110,139, 45, - 87,150, 56,206,191, 50,103, 36,128,141,157, 59,119,182,172, 90,181,138,188,249,230,155, 36, 34, 34,194,130,170, 69,190,195,240, - 15, 66,173, 22,173,242,242,242,136, 55,223,124,243,242,179,207, 62,219,181,160,160,128,237,141, 25,104,154, 38, 10,133,130, 49, - 26,141,185,238,254,153,209,104, 44,184,126,253,122,192,138, 35,151,139,102, 47,154, 25,148,140, 60,217,179, 47,133, 96,239,178, - 76,188,216,127, 74, 89,108,204, 40, 83,100,100,164,205,130,117,235,214, 45,232,245,122,109, 29,148,228,153, 38, 62,221,118,204, -110,141,125,103,239, 98,209,181,226,239,229, 34,222,174, 93,151,203,246,207,237, 9, 24,183, 79, 64,251, 23, 54, 96,243,162,161, - 0, 0,166,232, 6,140,219, 39,130,146, 5,224,116,174, 0, 21, 90,227, 1, 71,164, 77, 2,101,175, 14,108,198,199,222, 19,151, -176,104,239,195,239, 45,132,212,155,179, 76,109,212, 1,136,158,178,250,124, 2,112,126,172,222,104, 9, 24,208,191, 31,246,253, -184,159,110,213,170, 21, 54,109,218, 36,156, 56,113, 98,180, 59, 67, 20, 53, 57, 45, 12, 9,160,128, 98, 2,108, 17, 11,120,243, -181, 6,139,142,109, 52,172,195, 20, 66, 7,195, 20,181,249,130,236,201,203,203, 59,113,225,194,133, 11,111,191,253,118, 11,137, - 68, 66, 9, 4, 2, 88, 44, 22, 48, 12, 3,139,197,130,242,242,114,220,186,117, 11,141, 27, 55,182,153,128, 15,120,122, 84, 2, -170,255,212,198, 55,127,254,124,155, 73,185, 99,199,142,200,201,201, 65, 86, 86, 22, 46, 95,190,108, 51, 41,187,200,199,225,175, - 15,241,249,243,231, 33, 22,255,246,149,165,171, 87,175,226,173,183,222, 74,179,250, 84, 85,214,242, 92,101,122,122,122,207,161, - 67,135,158, 94,181,106, 85,107,251, 33,231,147, 39, 79, 2,128,254, 73, 88,223,114,115,115,251,196,196,196,172,244,247,247,239, - 80, 80, 80,176,224, 73, 70, 60, 43, 43,235,189,118,237,218, 45, 81, 42,149,149,110, 14,109,114,224,240, 87, 67, 22,128,137,169, -169,169,203, 82, 83, 83, 63, 64,213, 84,250,197, 0,210,185,164,169, 5, 97, 97, 97,119,231,206,157,171,187,120,241,162, 37, 46, - 46,174, 68, 46,151, 79,171,135,226,149, 6, 4, 4,108, 13, 10, 10, 74,241,247,247,191,228, 17, 44, 82,200, 27,210, 70,207, 64, -113,129,143,143,207,245,160,160,160,115,246,223, 65,244,243,243,251, 25, 64,120, 93,156, 45,131,229,211, 95,232,232,159,219, 42, - 68,182, 18, 85,159, 20,162, 90, 4,203, 14,239,158,224, 73, 52, 31,251, 17,205, 34, 47,162, 93,217,150,104, 87,182, 37,154,197, -254, 68,187,162, 13,185,147,208,157,116,139,244,206,111, 26, 44, 15,248,189, 56, 89, 88, 87,113,111, 17, 25, 25,169,184,116,233, - 18,201,202,202, 34, 7, 15, 30, 36, 50,153,236,122,125,123, 16,246, 43,195, 87, 75,108,169,244, 72,101,101, 37,209,233,116,228, -196,137, 19, 36, 56, 56,216, 81, 15,186,174, 94, 73, 16,128,213,109,218,180, 49,173, 88,177,130,236,221,187,151,172, 89,179,134, -140, 26, 53,138,204,153, 51,135,140, 29, 59,150, 4, 6, 6,234,173,230, 95,111, 23, 56,235,203,199,245, 28,255, 94,156, 17,214, - 94,173,189,229,118,126, 13, 75, 86, 93,156, 94,214,251,107,179,252,114,121,196,113,114,156,127, 77,206,127, 46, 2, 3, 3, 63, - 93,176, 96,129,250,167,159,126, 50,206,156, 57, 83,213,160, 65,131,211, 79, 40, 35,130, 0,116, 7,208,165,150, 74,182, 94,153, -219,222,219,219,187, 69,144,236,231,185,207,249,145,203,115,155,144,138, 21, 29,136,230,171, 30,228,110, 66, 87,242,229,203,205, - 73,135, 80,207,135,205, 3,101,109,255, 96,206,250, 12, 81,184, 85,176, 93, 28,166,112,133,211, 93, 19,240,211, 48, 41,115, 21, - 26,199,201,113,114,156, 28, 39, 39,180,254,190,104,214,172, 89, 70,187,118,237,238,199,197,197,165,253, 69, 50,151,106, 25, 36, - 31,219, 34, 72,190,187, 85,144,244, 94,155, 96, 89, 78,139, 32,217,177, 22,129,178,247, 59, 53,128,244, 79,194,217, 66, 36, 18, - 29, 9, 13, 13, 85, 0,120,229, 41,164,231,132,144,144,144,135, 86,107, 89,139, 39,192, 25, 13, 96, 43,128, 45, 0, 90, 63,129, -112,186,202,199, 85,104, 28, 39,199,201,113,114,156,156,208,250,123, 98,218,180,105,124,174,192,112,156, 28, 39,199,201,113,114, -156, 28, 39,199,201, 9, 45,247, 65,213,145, 88,199,158,114,130, 31,227, 56, 57, 78,142,147,227,228, 56, 57, 78,142,243, 31,199, -233,140,251, 24, 56,112,202,156,227,228, 56, 57, 78,142,147,227,172,149,147,178,110,180,117, 99,143,255,204,113,167,254,196,113, -255,167,112,254, 45,193,255,131,254,151,205, 8, 6,117,125, 61,153,195, 31, 9,251, 23,132,112,249,196,225, 79, 10, 15, 62,159, -255,174, 72, 36,234,107, 54,155, 91, 3,128, 64, 32, 72,215,235,245,167,204,102,243, 23, 0, 84, 92, 18,253, 97,117, 7,207,174, -177,181, 88, 55,252, 9,235, 18,123, 81,192, 60,102,187,244, 52,226,254, 79,230,252,219, 11,173, 14,114,185,252, 63, 34,145,168, - 9, 69, 81, 22,181, 90,125, 77,175,215,175, 3,112,238, 49,255,243,155,224,224,224, 87, 74, 74, 74, 24,246, 35,197, 20, 69,129, -166,105, 8, 4, 2,109, 69, 69,133, 87,125, 72, 3,219,142,122,159, 79, 81, 51, 45,196,178,174,232,250,190, 79,156,157,231, 80, -247, 11, 35, 20, 10,199,248,249,249,249, 40, 20, 10, 66,211, 85,171, 71,240,120, 60,118,133,121,115, 69, 69,197,247,174,146,249, -250,250, 94,244,243,243,243, 97,159,167, 40, 10, 37, 37, 37,229, 69, 69, 69,221, 0, 64, 34,145,156,149,203,229,254,124, 62, 31, - 60, 30, 15, 60, 30, 15, 26,141,166,164,164,164,164,231,239, 25,105, 95, 95,223, 20,154,166,155,184,243, 12,195, 48,247,203,202, -202,158,229,138, 76,117,108,223,190,157, 23, 19,246, 90, 20,159,104,219,211, 52,241,102, 24,170,194, 76, 73,175, 30,206,253, 38, -195,149,231, 95,124,241, 69,139, 11,183,245,241,242,242,218,176,123,247,110,223, 78,157, 58,209,197,197,197,104,220,184, 49, 74, - 75, 75,187, 37, 39, 39,119,126,237,181,215, 94, 83, 42,149,147, 0, 36,115, 57, 82, 55, 68, 34,209,138,224,224,224,215, 85, 42, -149,134,162, 40, 66, 81, 20, 40,170,170,159, 85,115,111,177, 88,114, 74, 74, 74,186, 56,105,108, 5, 34,145,232,243,144,144,144, -201, 26,141, 70, 99,229,115,200, 11, 0, 38,147, 41,167,184,184,184,139, 75,117,125, 96,224, 58,169, 84,250,178, 70,163, 81, 83, - 20,197,216, 95, 35,132,216, 55,230,247,138,139,139,123, 59, 19, 6, 34,145,104,101,112,112,240,171,214,184,219,194,249,184,113, - 15, 14, 14,158,172, 86,171, 93,226,172, 35,238,143,112, 62,141,112,254, 73, 57,255,254, 66,171, 99,199,142, 91, 46, 92,184,208, - 92, 32, 16, 0, 0,116, 58, 93,187,213,171, 87, 79,154, 59,119,110, 34,128,121,245,252,191,164,222,189,123,143, 75, 78, 78,166, -247,238,221, 75,119,237,218, 21, 20, 69,193, 98,177,192, 98,177,160,109,219,182,210,250, 70,196, 91, 46,139,191,124,244,107, 73, -135,129,111,204, 44, 2, 62,113,118,190, 46,129, 9,224, 67, 0, 77,220, 12,130,194,154, 46,151,127,175, 70,252, 41, 9, 3, 74, - 40, 20,254,171,119,239,222,222,199,142, 29,163,178,179,179, 41,169, 84,106, 91,172,212,100, 50,161, 77,155, 54,110, 89, 66,125, -124,124,188,226,227,227,163,158,127,254,121,236,220,185, 19,147, 38, 77, 66,175, 94,189,238, 20, 21, 21, 1, 0,228,114,185,127, - 90, 90, 90,115, 63, 63, 63,104, 52, 26, 84, 84, 84, 96,208,160, 65, 40, 41, 41,121,236, 2,238, 21,142, 38, 22, 1, 22, 7,134, - 75, 7, 40, 30,104, 23,169, 31, 98, 77,109,247, 10, 4,130,240, 7, 15, 30, 4,137, 68, 34, 16, 66,192, 48,140,195, 61,251,219, -104, 52,162, 77,155, 54,198,218,248,158,233, 24,190,152,162, 41,219,135,133,137,217, 82,122,225,106,222,135,143, 27, 39, 63, 63, -191,203, 98,177, 56,216,169, 90,182,107,200,116, 58, 93, 97,105,105,105, 39, 39,143, 68, 2, 24,206,227,241,154,241,249,252,150, - 0, 34,205,102,115, 48, 0, 8,133,194, 66, 30,143,151,101, 50,153,110, 25, 12,134,187, 0,126, 68, 29, 31, 64,142, 9,123, 45, -138, 50,107, 94, 80,234,153,161,178,166,137, 45, 52,247,226,111,203,196,154,131, 49, 97,175,237,112, 85,108, 57,193,192,254,253, -251,111,217,191,127,191, 68, 40, 20, 66,171,213,226,198,141, 27,240,246,246,134, 72, 36,194,200,145, 35,121, 61,123,246,244,239, -215,175,223,206,219,183,111,143,135,123, 62, 31, 45, 0,108, 67,213, 7,165,223, 68,245, 47, 20,212, 7, 97, 0, 70,160,234,155, -143,141,141, 70, 99, 49,128, 84,107,152,238, 0,136, 8, 12, 12,252,129, 97, 24,125, 73, 73,201,107,112,240,161,234,238,157, 27, - 94,162,105, 58,156,181, 9, 48,196,146,115, 62, 53,231,137, 52, 80, 52, 77,175,140,141,141,125,117,199,142, 29,178,212,212, 84, - 89,235,214,173,109, 29, 34,182,204,219,163,113,227,198,206,172, 26,124,154,166, 87,188,240,194, 11,227, 55,110,220, 40,123,240, -224,129, 44, 52, 52,212,198,105, 47,182, 88, 56,251,132,152, 93,217,255,102,240,224,193, 19, 55,108,216, 32,216,183,111,159, 52, - 32, 32, 0,254,254,254, 14,191, 25,219,179,103, 79,198,121,212,233,149, 35, 71,142,156,184,117,235, 86,217,133, 11, 23,100,109, -219,182, 5,143,199,123,236,184,143, 26, 53,106,252,150, 45, 91,100,215,174, 93,147, 53,107,214, 12,172, 81,161, 38, 31, 77,211, -104,216,176,161, 75,156, 35, 70,140, 24,191,109,219, 54,217,229,203,151,101, 45, 91,182,180,165, 39, 91, 39,213, 39,156,127,114, -206,127,132, 69, 75,100, 52, 26,113,234,212, 41,208, 52, 13, 63, 63, 63,188,242,202, 43, 56,122,244,104,252,137, 19, 39,246,215, -195,178,245,141, 85,100, 9, 0, 96,215,203,163,112, 95, 0,188, 85,100,128, 80, 40,196,189,123,247,192,227,241,220, 54, 45,138, -197,226,201,132,144,127,107,114,127, 17,107,181, 38,232,242, 46,201,164, 82,169,173, 1,208,228, 89,207,231, 95,146, 73,165,210, -123, 60, 30,239, 99,149, 74,149, 84, 27, 95,179,102,205, 54,221,184,113,163,149,179,143, 61,215,132, 70,163, 65,163, 70,141, 34, - 74, 75, 75,155,253, 30,141,184, 51, 78,179,217, 12,137, 68, 2,214, 26,101, 48, 24,160, 82,169,156,113, 82, 66,161,112, 12, 43, -178, 0, 96,243,230,205, 8, 9, 9, 65, 80, 80,144,237,163,210, 44,167,171,224,241,120,136,137,137,193,194,133, 11,145,152,152, -136,217,179,103, 87,171,104, 5, 2, 1,252,252,252,240,211, 79, 63,193,203,203, 11, 17, 17, 17, 96, 5,126,173, 2, 42,130,166, - 76, 38,134,214,230,193,177,229,163, 1,164, 82, 30,150, 70,245,242,121,115,216,187,145,252, 6,205,101, 88, 60,248,210, 60,245, - 67,253,154,186,132,137, 80, 40,196,245,235,215, 31,169, 16, 28,222,207, 35, 48,136, 43,253, 26,247,145, 42, 28,137, 56,138,166, -252,206, 93,122,104,179,208, 14, 25,208,138,255, 76, 39,254, 87,214,166, 18, 52, 13, 48, 76, 85,211, 73, 81, 32,102, 19, 83,118, -233, 90,222, 2, 23,210, 51, 52, 43, 43, 43,200, 89, 26,177, 48,155,205, 8, 13, 13,229, 57,185,109,104,116,116,244,174,184,184, - 56, 97,179,102,205, 40,161, 80, 8, 62,159, 15, 62,159,207, 10,244, 8, 66, 72, 4,195, 48,253, 10, 11, 11,201,234,213,171,151, -157, 60,121,114, 52,128,131, 14, 43, 22,162,109,175,212, 51, 67, 79, 95, 65,183, 23, 6,206,197, 79,219,227,187,245,238,200,192, - 83,166,205, 0, 80, 47,161,197,138, 13,139,153,161,238,100, 86,248,237,220,185,131,162,105, 90,175, 84, 42,193, 48, 12,122,246, -236, 9,154,166,113,253,250,117,124,240,193, 7,216,181,107, 23,246,236,217, 35,237,220,185,243,183, 26,141,166, 53,170,190,197, -230, 84,100, 69, 71, 71, 95,185,112,225,130,196,104, 52,162,123,247,238,231,111,223,190,221, 25,245, 91,193,221, 23,192,103,243, -230,205,155, 24, 23, 23,199,243,241,241,129, 72, 36,130, 82,169, 68, 70, 70,198,228,239,191,255,158,172, 93,187,246, 75, 0,158, - 89, 89, 89, 61, 46, 94,188,136,254,253,251,191, 13,224,221, 71, 21, 1, 47,252,236,197,204, 32,246,120, 68, 76, 59, 97,143, 46, -116, 97,149, 21,167,230,221, 4,140,133,201,185,248,107,174, 43, 66,108,217,168, 81,163, 38,236,216,177,195, 3, 0,254,251,223, -255, 98,204,152, 49,240,243,243,131, 76, 38,131, 80, 40,132, 64, 32,168,182,119,210,216,242, 0, 44, 27, 59,118,236, 11, 27, 55, -110,244, 4,128,141, 27, 55, 98,212,168, 81,240,247,247,135,167,167, 39, 68, 34,145,237,123,175,110,118, 48,190,233,213,173,219, -148, 13, 27, 54, 0, 0, 62,120,231, 29, 60,255,204, 51,240,144, 73, 33,147,138,192,166,133,136, 39,192,144,183,102, 58,213,151, - 0,150,143, 25, 51,230,165,173, 91,183,122, 2, 64,106,106, 42,138,138,138, 16, 28, 28, 12,169, 84, 10,145, 72,100,139, 51, 69, - 81,144, 74,165, 46,197,125,204,152, 49, 47,108,217,178,197, 19, 0,146,146,146, 16, 19, 19, 99,139,187, 88, 44,134, 80, 40,172, -182,213, 20,157,142, 56, 71,143, 30,253,194,182,109,219, 60, 1,224,251,239,191,199,192,129, 3,225,235,235,107, 75, 79,150,203, -157, 60,250,147,115,254, 51,132,214,149, 43, 87,254, 37,151,203, 19, 0, 4,138, 68, 34,159,241,227,199, 55,156, 50,101, 10,198, -142, 29,139, 19, 39, 78, 76,117, 83,104, 81,193,193,193,175, 36, 39, 39,219, 90,104, 3,121, 68, 48,185,221,128, 91,241,239, 75, - 83,167,134, 36,102,168,112,254,226, 45, 72, 64, 83, 23,151, 47, 15,212,221,189, 11,139,193,128, 69,247,148, 85,231,205,132, 58, -245,222, 91, 33, 29, 86,124,249,111, 0, 73,117, 52,182, 98,189, 94,143, 59,119,238,184, 21,136,236,236,108, 71, 31,127,174,119, - 35, 30, 17, 17, 81,215, 11,232,148,243,240,225,195,152, 53,107, 22,110,221,186, 5,246, 83, 37, 46,112, 82,126,126,126, 62,172, -200, 98, 69,144, 84, 42,133, 64, 32,160,248,124, 62,197, 14,237, 89, 95, 46,151,132, 49, 77,211,216,180,105, 19,150, 46, 93,138, - 57,115,230, 96,221,186,117,104,223,190,253,111,133,144,207, 71,101,101, 37,124,125,125,225,235,235, 91, 77, 32,214,134,202, 7, - 12, 1, 28,139, 44,105, 35,132, 72,165,252,131, 99, 63,137,234,208,246, 57,127,168, 74,140,216, 52,247, 14,138, 51,245, 59,156, -165, 39, 33, 4,237,219,183, 7, 69, 81, 54,161,193,110, 2,129, 0,124, 62, 31, 60, 62, 15, 58,170, 18, 77,122, 9,241,206,206, - 86,210, 6,205,101, 82, 71, 34,174,102, 54,127,254,197, 42, 25, 24, 82,229, 4, 66, 24,128, 1, 8, 8, 24,194,160, 48, 55, 3, -255, 89,248,169,203,173,143, 64, 32,192,221,187,119,109,225,102, 45,195,172, 48,178,183, 26, 68, 70, 70, 58, 45, 75, 66,161,240, -163, 61,123,246,136, 54,109,218,132,173, 91,183,130,162, 40,136,197, 98,200,229,114,248,248,248,192,223,223,223,182,133,135,135, - 83,223,126,251,173,176,125,251,246, 31, 85, 86, 86, 30,116,156,231,196, 91,214, 52,177,197, 11, 3,231, 2, 0, 94,152, 75, 80, -118,231,147, 14,116,249, 2,239,250, 91, 94,170,196,198,226,197,139,241,241, 51,207, 64, 36, 18,145,138,138,114, 9,219,185,224, -209, 60,164,165,221,192,138, 21, 43, 48, 97,194, 4,220,187,151, 65, 34, 34, 34,245,179,102,205,242, 72, 76, 76,124,199,104, 52, - 46,114, 38,178,218,181,107,119, 38, 37, 37, 69,162,209,104,192, 48, 12, 14, 30, 60, 40, 27, 56,112,224,233,204,204,204,222,238, -138,173,200,200,200,125, 41, 41, 41, 61, 3, 3, 3, 81, 81, 81,129,202,202, 74,152, 76, 38,240,120, 60, 68, 68, 68, 96,217,178, -101,212,200,145, 35,103, 76,158, 60, 89, 39,149, 74, 89,203, 70,164, 35,174,154,239,247,234, 53, 95,249, 16, 82, 85,126, 8, 67, -170,237, 75,139,178,240,206,123,174,125,189,170, 97,195,134,111,238,220,185,211,195,222,178,100, 47, 2,236, 69, 22,187, 57, 17, - 6,116,163, 70,141,166,252,240,195, 15, 54,206,128,128,128,106,239, 15, 77,211, 56,125,250, 52, 18, 62,154, 7,223,192, 80,172, - 90,243, 95,151,134, 11, 99, 98, 98, 94, 78, 74,250,173,234,110,215,180, 41,134,245,124, 6, 65, 1, 94, 8,240,245,172, 74, 39, -134,194,213, 91,153, 78,219, 35, 0,116,195,134, 13, 95,219,190,125,187,135,125,135,144,141, 43,219,121,102,173,248, 6,131, 1, - 93,186,116,113, 41,238,246,156,172,181,141, 21,109,108,122,178,255,195,190,175, 78,194, 57,133, 21,194, 86,193, 89,141, 67, 32, - 16, 96,251, 79, 27,106,181,102,215,151,211,221,124,175,201,153,149,149,133, 37, 75,150,128,237,180,217,187, 10,133,133,133, 97, -213,170, 85, 78,235,165, 26,239, 64, 87, 0,129,118,167, 12, 0, 68,118,123, 5, 69, 81,191, 56,184,143, 61, 47,176,142, 88, 5, - 90,219, 14, 37, 0, 31, 7,124,181,241, 20, 91,219,188,192, 26,247, 87,251,159, 90,133,214,254,253,251,217,183,184, 95,108,108, -236, 41,235,239,114,177, 88,156, 45,147,201, 66, 0, 40, 15, 30, 60,136,255,251,191,255,131,213,180, 58,194,219,219,251,134, 3, -171,206, 21,189, 94, 63, 23, 64,161,245, 20,107,174,167, 75, 75, 75,153,163, 71,143,210, 27, 71, 15,134,129, 0, 29,255,157,128, -152,216, 88, 28, 14, 19,129, 7,160,219,205, 98,200,100, 50,126,101,101,165,201,222,111,203,129,239,214,177, 26, 5,138, 39,225, -243,209,253,204, 1,204, 58,115, 0,221,228, 34,148,236,216, 6,229,217,100,208, 52,133, 62,242, 0,204,158,112, 20,207,122,137, - 33,210,171, 65,211,180,163,146,109,227,188,115,231,206,139, 94, 94, 94, 9, 53, 18,216, 21,220, 71,213,119,156, 80, 75, 56, 93, -106,196,217,237,242,101,135, 35,144,181,114, 90,135,224, 32,151,203,113,252,248,113,219, 61,207, 61,247, 28,116, 58, 29,252,252, -252, 92,226, 84, 40, 20, 36, 47, 47,143,218,184,113, 35, 4, 2, 1,252,253,253, 33,147,201,168, 13, 27, 54,204, 19, 10,133,225, - 58,157,142, 49, 24, 12, 16,137, 68,171,216,252,225,243,249,234,202,202, 74,255,218, 56,121, 60, 30,226,226,226,240,254,251,239, - 99,221,186,117,152, 58,117,234, 35, 22, 47,157, 78,135,128,128, 0,155,216,114,240, 2,186, 52,244, 35, 11, 67, 91,159, 96,209, -145, 41,171, 90, 5,135,181,148, 35,101, 75, 1, 14,172,204,202, 81, 23, 90,190, 48,148, 97,167, 51, 78, 66, 8, 50, 50, 50,106, - 21,195, 37,101,197,120,255,227, 55,209,241, 53, 57,106, 17,113,191,113, 50, 4, 55, 46, 31, 70,218,181, 99, 96, 44, 12, 44, 12, - 1, 33, 22, 48,102, 32,245,232,249,230,249,247,243,194, 8, 72,149,235, 45, 0,113,133,202,220,215, 95,212, 18,192,222, 83, 37, -134, 21,206,226,206,231,243,161,211,233,176,103,207, 30,220,188,121, 19, 7, 15, 30,132, 86,171, 69, 64, 64, 0,124,124,124,240, -204, 51,207, 96,242,228,201,136,140,140,116,154,239,132,144,164,236,236,236,142,189,122,245,162,202,203,203, 81, 94, 94, 14,173, - 86, 11,139,197, 2,179,217, 12, 62,159, 15,137, 68, 2,169, 84,138,224,224, 96,232,116, 58,162,215,235,147,106,227,100, 24,170, - 66,115, 47,254,246, 79,219,227,187,189, 48,151, 96,199, 82, 10, 81,141,196,154,227,151, 60,167,236, 61, 51,123, 16, 0,194, 16, -155,105,129,152, 44, 76,241,251,243, 62,155, 81, 87, 56,217, 60, 73, 73, 73,193,140, 25, 51, 96,177, 88, 40, 1,159, 15, 66, 8, - 40,154,198,237,219,183,177,122,213,106,140, 27, 55, 14,205,162,162, 96, 48, 26,161, 82,169,208,191,127,127,193,170, 85,171,250, -217, 9,173, 99,117,136, 44,127,173, 86, 11,165,178,202,248, 37, 18,137,176, 99,199,142,128,225,195,135, 39,231,229,229,213,245, - 61,210, 71, 56, 61, 61, 61, 35,120, 60, 30,174, 95,191,142,181,107,215,226,248,241,227, 40, 44, 44, 44, 11, 13, 13,245,238,215, -175, 31,253,206, 59,239,160, 99,199,142,248,238,187,239, 36,206, 56, 9, 33,200,186,115, 26, 89,119,207,128, 97,170,132,101,213, -230,248,119, 29, 61,160,106,225, 84,171,213,186, 43, 87,174,120,172, 95,191, 30, 65, 65, 65,104,220,184, 49,100, 50, 25, 36, 18, - 73,181, 70,214,190,225,117,246,110,106,181, 90, 93, 86, 86,150,199,150, 45, 91,224,239,239,143,200,200, 72,200,100, 50,136, 68, - 34,240,249,124, 80, 20,133,141, 27, 55, 98,243,194, 9,200,186,117, 13,163,134, 13,114, 26, 78,153, 76,246,114, 82, 82, 82, 53, - 19, 72,176,175, 47,248, 2, 26, 60, 1, 5,223,231, 70, 3, 0,202, 78,236,174,178, 85, 57,143, 59,165, 84, 42,117, 23, 46, 92, -240,184,116,233, 18, 24,134, 65,100,100, 36, 52, 26, 13,188,188,188,108,241, 63,122,244, 40, 70,142, 28,137, 77,155, 54,161, 71, -143, 30, 78,227,174, 82,169,116,215,174, 93,243,248,225,135, 31,224,231,231,135,134, 13, 27,218,226,206,110, 2,129, 0, 60, 30, - 15, 77,154, 52, 65, 69, 69, 5, 60, 60, 60,156,230, 81,106,106,170,199, 15, 63,252, 0, 95, 95, 95,132,135,135,219, 44,110,172, - 56, 90,250,213,194,106, 4, 18,170,193, 99,115,186,155,239, 53, 57, 71,141, 26,133,168,168, 40,120,121,121, 65, 46,151,219,184, -235,226,172, 69,139,216,244, 54, 69, 81,251,237,222,137, 88,138,162,246,219,239,107,187,207,250,179,207,188,121,243,186, 36, 38, - 38, 46,233,209,163,199,150,148,148,148,205,181,241,213,198, 51,111,222,188,232,196,196,196, 37,246,247, 59,248,159,218, 45, 90, -177,177,177,148, 53,146, 20,128,198,157, 59,119,254,229,196,137, 19,126,158,158,158,182,155, 31, 62,124,136,242,242,114,120,122, -122,122,125,254,249,231, 94,253,250,245, 67,112,112,176,173, 7,112,231,206,157, 54, 45, 90,180,168, 4, 80,211,110,203,208, 52, -141,103,159,125, 22, 55,172,163, 29, 49,177,177, 8, 15, 15,183, 57,121, 72, 36, 18,204,152, 49,131,154, 53,107, 22,159,181,102, - 16, 66,160,213,106,209,160, 65, 3,105, 93, 86, 8, 0,136,214, 22, 99,119,191, 62,160, 41, 64,115,249, 34,132, 34, 10, 52,143, - 66, 39, 82,130, 67,253,251,128, 2, 96,248,245, 28, 92,176,194, 92, 6, 48,232,105,152, 15,157, 53,226, 14,226, 69,213,151,147, -181,104,164,164,164,192, 98,177,184,202, 73,104,154,134, 92, 46, 71, 72, 72, 8,164, 82, 41,100, 50, 25,181,101,203,150, 15, 27, - 55,110,220, 96,214,172, 89,116,101,101, 37,253,236,179,207, 98,204,152, 49,124,118,136, 51, 58, 58,218,105, 92, 78,157, 58,133, -181,107,215, 98,234,212,169, 14, 45, 90, 20, 69, 33, 48, 48, 16, 94, 94, 94,245, 78, 95,113, 35, 68, 6,132, 75, 78, 77,255,174, -173,143, 87,144, 16, 63,173,121,136,195,171,179,119,235,138,241, 57,204,184, 5,160,204, 85,139,150, 35, 1, 12, 30, 3,139, 95, - 9, 94, 93,221, 28, 97, 45,189,145,178,165, 0, 7,191,120,104, 81, 41, 76,179, 29,136, 56, 48, 0,140,102, 19, 52, 42,173,109, - 72,215, 98,177,224,218,201, 95,155,223,255,245, 78,244,254, 45,155, 4, 0,160, 59,185,187,218,160,231,152,175,182,181,232,235, - 43,184,112,170,204,116,161,174, 50,207,231,243,241,202, 43,175, 32, 49, 49, 17, 47,191,252, 50, 14, 30, 60,136, 5, 11, 22,224, -245,215, 95,127,196,170,229,172,231,104, 50,153,190,158, 52,105,210,212, 29, 59,118,180,156, 59,119, 46,205, 90,180,100, 50, 25, - 40,138,130, 78,167,131, 94,175,135, 86,171,197,173, 91,183,152, 55,222,120,227,182,193, 96,248,186,214,225, 74, 74,122, 85, 38, -214, 28,108, 26, 78, 71,169, 51, 63,245,236,245, 76,164,150,146,118,174, 24,221, 98, 32, 25,250, 74,164, 47, 8, 1, 97, 0,134, - 0,122,189, 26, 51,102,188,205,115,165,172,103,221, 57,141, 43,151, 47, 66, 42, 21, 67,165, 84,193,194, 88, 64, 24, 2,177, 80, -128, 15, 63,152,143,113,227,198, 35,170,105, 83, 88, 44, 22, 8, 5, 66,124,255,253,247,232,210,165, 11, 12, 6, 67,107, 23, 44, - 89,254, 58,157, 14, 87,174, 92, 65,255,254,253,145,157,157,141,244,244,116, 52,111,222, 28, 27, 54,108, 8, 28, 63,126,124,114, - 81, 81,145,203, 31,127,191,118,237,218,188, 14, 29, 58,172, 84,169, 84,165, 42,149,106, 37,128,205, 0,202, 51, 50, 50, 90,103, -100,100,172, 62,124,248,112,239,255,252,231, 63,188, 26, 62, 58,188, 90, 34, 15,147,201, 12,173, 86, 95,167,192, 98,143, 9, 97, - 92,122,103, 40,138, 34, 45, 91,182,196,240,225,195, 33, 16, 8, 32,147,201,224,225,225, 81,109,216,172,166,224,170, 43,139, 0, - 48, 20, 69, 33, 52, 52, 20, 67,135, 14,133, 80, 40,172,198,201,150,195,161, 67,135, 98,230,162,127,227,235,153, 3,176,118, 82, -115, 12, 92, 92,232,204, 53, 67,245,243,207, 63, 75,223,159, 58, 21, 29,154, 53, 67,128,151, 23, 26, 5, 7, 66, 42, 22, 65,104, - 31, 38,202, 37, 35, 59, 1,192,240,120, 60,180,109,219, 22,133,133,133,200,204,204, 68,102,102, 38,104,154, 70,175, 94,189,108, - 86,152,187,119,239, 98,209,162, 69,208,235,245, 46,199,189, 89,179,102, 24, 48, 96, 0, 68, 34, 17,100, 50, 89,181, 33, 67, 54, - 77,149, 74, 37,162,162,162,176,119,239, 94,180,104,209,194, 41,103,171, 86,173,208,183,111,223,106,233, 41,149, 74,109,162, 8, - 0,178, 47,168,108,255, 17, 22, 22,230, 22,231,145,139, 15,177,254,232,207,208, 27, 24, 84,106, 76,213,189, 48, 2,188,112,230, -135,185, 46,197,157,229,252,223,255,254,135,242,242,114, 91,221,201,118,202, 89, 35, 74,195,134, 13,241,223,255, 58,182,100,214, -208, 34,142,234,129, 88, 23,219, 91,246, 62,182,112,137, 19, 19, 19,151,212,124,222, 25,159,253,245, 26,207, 27,106,136,179, 66, -183,134, 14,197, 98,241,252,159,127,254,217,175,162,162, 2,119,239,222, 5, 77,211,182, 49,117, 62,159, 15,163,209,136,123,157, -170, 47, 17, 0, 0, 32, 0, 73, 68, 65, 84,247,238,193,207,207, 15, 69, 69, 69, 16,139,197,224,241,120, 48, 24, 12, 0,208,169, -182, 6,156, 16,130,153,138, 42, 23,161,159, 66,133,200, 2, 48, 76, 81,245, 98,176, 14,241, 59,119,238,132,135,135, 7, 60, 61, - 61,109,123,103,195, 72,215, 50, 51, 80, 40,160, 64,159, 59, 13,138, 6,104, 10,160,120, 0, 77, 19,208, 20, 5,250, 92, 50, 40, - 10,144,251,251,186,219,118, 59,115,140,175,211, 1,222,157, 70,188,230,239,147, 39, 79,194, 85,206,168,168, 40,120,120,120,216, -182,195,135, 15, 87,179,104, 89, 44, 22,248,251,251,187,194, 73,172,254, 56, 8, 10, 10,130, 64, 32,160, 54,108,216, 48,175, 73, -147, 38, 13,222,123,239, 61,154,199,227,225,242,229,203, 72, 75, 75, 67,100,100,164,203, 62, 91,229,229,229,249,243,230,205,179, -204,155, 87, 53,135, 34, 58, 58, 26,229,229,229, 69,182, 97,192,202,202,146,193,131, 7, 87,243,219, 40, 46, 46, 46,169,197,179, - 66, 32, 15, 71, 44, 33,168,212,100,227,103, 54,204,222, 17,240, 22,120, 10,142,188,254,101, 43, 31,175, 32, 33, 14,173,122,128, - 35, 95,230,236,212, 21,224, 67,171, 79, 16,227,106,166, 59, 26, 54,206, 45,200,198, 27, 31,142,198,164, 53,209, 96, 69, 28,239, - 78,123,144,146,242, 82, 67, 89,105,146, 35, 17,199, 48, 12,204, 70, 51, 52, 58, 29, 84, 74,141,205, 58, 84,148, 87,232, 51,119, -214,187,130,229, 51, 94, 5, 0,204, 90,177, 6,202,117,191, 85,100,187,103,141, 11, 26,253,217,214,120, 0, 35,235, 10,167, 74, -165,130, 78,167, 67,211,166, 77,145,146,146, 2,165, 82,137, 33, 67,134,128,162, 40,219, 12, 81, 55, 96,200,205,205,237, 25, 27, - 27,251,203, 23, 95,124,209,180,117,235,214,148, 90,173,134, 70,163,129,253,254,218,181,107,100,243,230,205,247, 53, 26,205,179, - 86,211,185, 67, 28,206,253, 38, 35, 38,236,181, 29,199, 47,243, 98,131,162,110,123,229,150, 53, 53,151,228,138,213,149,218, 91, - 58, 11, 73, 3,177, 0, 22, 48, 32,102, 6, 22,235,176,151, 11, 53, 39, 76, 38, 51, 44, 22, 6, 15, 31, 62, 68,122, 90, 26,218, -181,109, 9,157,222, 12, 33, 95,128,153, 55,110,160,213,120,192, 32, 20,128, 97, 24, 80, 20,141,169, 83,167, 26,173, 67, 6,181, - 66, 42,149,174, 62,115,230,140,191, 78,167, 67,106,106, 42, 38, 78,156,104, 40, 46, 46, 22, 1,192,203, 47,191,108,216,184,113, -163, 40, 42, 42, 10, 27, 54,108, 8, 28, 51,102,204,118,181, 90,221,214,197, 52,221,148,159,159,191,169,230, 73,127,127,255, 85, - 15, 31, 62,236,103,239,243, 99, 54,155,109,193,113, 24,117, 6, 48,153, 76,208,106,245,168,168, 80,194, 96, 52, 89,235, 76, 6, - 22,139,217,186,103, 96,182,214,163, 34, 33,223,179, 83,219, 16, 21, 33, 4, 52, 69,149,167, 94, 47,104, 88,151,104,119, 52,196, -229,162, 53,171, 38, 44,236, 44, 51,127,127,127, 8, 4, 2,108,218,180, 9, 87,207, 30,134,136, 71, 96, 49,155, 96, 54, 25, 97, - 49, 25, 32,224,241,112,252,114, 38, 6,181,242,116, 73, 16, 6, 4, 4, 96, 88,143, 30,136,237,209,163,106,122, 27,159, 15, 15, -177, 24, 50,161,164,202,146, 5,128, 88,104, 87, 23, 17, 96,216,112, 6, 7, 7,227,210,165, 75,152, 57,115, 38,150, 46, 93, 10, -169, 84,106,155,253,124,243,230, 77,108,219,182, 13,131, 6, 13,114, 59,238,172, 5, 47, 62, 62, 30,121,121,121, 88,177, 98, 5, - 58,119,238, 12,129, 64,128,242,242,114, 60,251,236,179, 40, 44, 44,116,137,211,126,120, 79, 36, 18, 85,179, 62,177, 2,208,221, - 60,178,231,124,117, 84, 3,236, 59,187, 25, 20, 40,156,255,225,221,106,162,240,191, 91, 79,187,205,185, 96,193,130,106,225,116, -197,154,229,178, 31, 82,117,171,147,211,251, 40,138, 74,101,141,173,241,241,241,243, 41,138,218, 31, 31, 31, 63, 63, 33, 33,225, -134, 43,124,142,174, 83, 20,117,192, 42,194,134,217,157, 75,117, 75,104,201,100,178,110, 30, 30, 30,184,123,247, 46,134, 12, 25, - 98, 40, 41, 41,185, 45, 16, 8,154, 23, 23, 23,139,139,138,138,160,209,104, 84, 31,127,252,113, 38, 0,105,247,238,221,163,142, - 31, 63,142,236,236,108,108,220,184, 17, 0,118,215,230,167,195, 48,140,173, 80,212,236,182,241,120, 60,156, 59,119, 14,231,206, - 85,119,253, 90,191,126,189,211, 6, 99,204,158, 31,113,249,242,101,216, 47, 15,192,254,182, 63, 39,145, 72,128,186,103,120, 84, -131, 51,199,120,103, 14,240,174, 54,226,181, 85,128,174, 22,196,220,220,220, 90,159, 63,119,238, 92, 53,139,150, 51, 78, 30,143, - 7,139,197, 2,169, 84, 74, 9,133, 66, 74, 40, 20,134,179, 34,139,199,227,217, 94, 24,177, 88, 12,177, 88, 92,173,151, 90, 27, -242,242,242,250,231,229,229,213,122, 93,161, 80,244, 84, 40, 20, 46,197, 85, 22,134,143,158, 29,219, 96, 30, 0,156,221,154,255, -157,230, 33, 94, 7, 0,194,167,118,189,250,121,139,168,192, 72, 41,206,109, 47,192,145, 47,115,246,232, 10,176,208, 58,164,203, -184,154,230, 7,142,238,197,155, 83,167, 65,204,147,217,249,100,209, 40,231,101, 99,250,198, 22, 96, 69, 92,234, 70, 3,246,111, -253, 8, 41, 71,159, 55,213,101, 41, 51,154, 76,208,106, 12, 80,170,180,248, 40,225,187,170,147, 31,225, 2,128, 11, 61,223,156, -137,184,152, 65, 3,220, 29,166,102,211, 59, 40, 40, 8,167, 78,157, 2, 69, 81,216,190,125, 59,188,189,189, 17, 19, 19, 3, 47, - 47, 47,196,199,199,227,197, 23, 95,116,183, 50,171, 40, 41, 41,233,249,206, 59,239,252,242,233,167,159, 54,106,216,176, 33, 12, - 6, 3,140, 70, 35, 12, 6, 3, 50, 50, 50,176,121,243,230,108,141, 70,211, 19, 64,133, 51,178,195,185,223,100,236, 74,158,149, - 55,112,236, 24,237,205,194,159, 80, 80, 80, 2,179, 57, 23,140,197, 12,163,217, 82,101,225, 51,155, 97, 54, 91, 32, 20,242,188, - 62,253,228,221,163, 12, 8,104,154, 50, 0,120,190, 54,177, 17,209, 48, 8, 94,158, 94,104,221,170, 9, 78, 28, 90, 15,131,209, - 12,163, 65, 13,227,244, 24,164,103, 29,135,229,254, 49, 88, 24, 11,206,164,164,233, 77, 22, 34,144, 74,229, 84,195, 6,158,188, - 59,247,117, 14,195,233,227,227, 19,173, 80, 40,112,231,206, 29, 76,158, 60,185,160,164,164, 36, 29,192,115, 0, 80, 82, 82,114, -102,226,196,137,173,147,146,146, 66, 26, 55,110, 12, 15, 15, 15, 47,181, 90,237, 44,234, 30, 0,226, 0, 12, 70,117, 7,252, 82, - 0, 31,211, 52, 45, 78, 77, 77,125,100,166, 93,114,114, 50, 0, 92,112,220, 3,178, 90,180,116, 58, 40, 74,202,240,250,155, 31, -254,214, 51, 2,169, 38, 46, 8, 8,166,189, 5, 9, 0, 20, 23,102,224,213,215,103,138,235, 84, 28, 12,227,176, 33,116,195, 71, -167, 90, 71,141, 45,163, 30, 30, 30, 85,195,111,123, 55,227,192,103,111, 2, 22, 35,136, 73, 11, 24, 53,128, 81, 5,198,160, 1, - 37,148, 2, 38,173, 75, 66,203,195,195, 3, 30, 82, 41,130,124,124, 64, 8, 1,159,199,131, 64,192, 7, 99, 2, 40, 11,101, 43, - 35,140,197,165,178,110,235, 84, 74,165, 82,100,101,101, 33, 46, 46, 14, 70,163, 17,163, 70,141,130,193, 96,128, 78,167,131, 86, -171, 69,147, 38, 77,160,209,104, 92,226, 99,103, 43,122,120,120, 64, 40, 20,226,221,119,223, 69,151, 46, 93,176,104,209, 34,204, -153, 51, 7, 77,154, 52,193,180,105,211,176,121,243,102, 68, 71, 71, 59,227, 37,246,121,196,166, 39, 43,182,236,135,248, 0,184, -157, 71, 53, 57, 41,138,174, 38,216,216,237,237, 73,207,185,205,153,152,152, 8,133, 66,241,136, 37,139,253, 29, 22, 22,134,175, -190,250,170,190, 35, 67,172,245, 40,216,193,181, 97, 53, 45, 81,132,144,174, 86,223, 41,125, 66, 66,194,141,132,132,132, 88,138, -162,246, 39, 36, 36,196,214,102,209,114,196,227,224,186,194,213, 48,243,107,140,141,246,179,191,200, 38,180,159,159, 31,175, 81, -163, 70,180,151,151, 23,202,203,203, 17, 24, 24, 72, 20, 10,197, 88,153, 76,182,112,203,150, 45, 81, 42,149, 10, 55,111,222,196, -170, 85,171, 46, 0, 88, 89,151,208, 58, 24,104, 53, 29, 91, 45, 89,246,199,195,135, 15, 71,227,198,141,171, 89,179,164, 82,105, -157,133,135,189,102,107, 20,121, 60,180,104,209, 66,122,255,254,125,173, 80, 40, 68,120,120,184,180,160,160, 64, 43, 20, 10,221, -158,233,226,204, 49,222,153, 3,188, 35,225,211,181,107,215,106, 22, 44,251,189,253,239,125,251,246, 57, 29, 58,100, 57, 91,183, -110,109, 75, 47, 79, 79, 79,246, 89, 0,192,144, 33, 67,192, 48, 12, 2, 2, 2, 92,226,100, 69,173,213, 1, 30, 58,157,142, 81, - 42,149,116,106,106, 42, 68, 34, 17, 60, 61, 61,109,190, 58, 18,137,196,102,205,252,189, 32, 16,209, 83,198,124, 80,101, 96,244, -111, 40,126,117,239,178, 76, 80,192,229,161,111, 71,246,111,218,213, 27,149, 69, 70,236,255, 60,235,129,174, 4, 9, 0,110,185, - 99,201,210,209,149, 94,235,206,188,131, 14, 47,139,208, 64,215, 11,159, 46,168, 42,202, 19,103,140,198,176,215,249, 96, 69, 28, -125,167, 29,182,127, 55, 31,205,154, 53, 3, 33,132,170,189, 66, 96, 96, 48,153,160,213,106,161, 82, 85,173,155,153,113,189,250, - 8,163, 81, 95, 89,255,180,176, 86,176,165,165,165, 56,124,248, 48,126,250,233, 39,116,233,210,197,161,168,118, 67,112, 41, 74, - 75, 75,123,205,158, 61,251,252,226,197,139, 67,253,252,252, 96, 52, 26,241,240,225, 67,124,251,237,183,121, 26,141,166,151, 59, - 21, 12, 8, 96, 50,153,161,211,232, 81, 81,169,196,194, 79,190,175,181,232, 1, 64,105,209, 45, 12, 31,241,162,168, 46,177,209, - 48,204, 7,201,201,201, 24, 52,176, 23,134,141,156, 92,171,216,120,115, 70, 53,177, 33,172,163, 35,240, 94,175, 94,189, 62, 81, - 42,149,229, 26,141,230, 69, 0,203,237,251, 83, 37, 37, 37,189, 71,140, 24,241,133,159,159, 95,231,162,162,162,249, 46,196, 58, - 62, 43, 43,107,126, 68, 68, 68,181,147,122,189, 30, 17, 17, 17, 45,138,138,138, 38,244,233,211,231,223, 0,252,236, 46,123, 2, - 56, 2,224,171,218,202, 18, 59,116,168, 82,105,225,229,211, 0,185,153,167,156, 6, 68,200,211,129, 48, 76,157,117, 8,219, 1, -174,109,115, 50, 51,238,145,160,178,247,178, 13,246,243,255,154,132,231,227, 18, 33, 19, 0, 75, 94,237,137, 38, 62, 0,164,126, - 16,246,153, 11,202,199,154, 70,113, 63,186, 68, 62,103,237, 90, 92,182,214,199,225,129,129,152, 61,118, 44,136, 9, 72, 73, 75, -195,214,159,127,198,216,254,253, 33,147, 72, 92,238,176, 48, 12, 3,161, 80,136,140,140, 12,164,164,164,160, 85,171, 86,184,123, -247,110,181,101, 40, 8, 33,174,198,223, 22,119,177, 88, 12,129, 64,128,130,130, 2,196,198,198, 66, 40,172, 26,198, 62,117,234, - 20,102,207,158,141, 41, 83,166,160, 95,191,126, 72, 79, 79,119,137,147, 16,242,200,108,197,154,195,185,238,230, 81, 77,206,154, -237,126,125,242,157,229, 92,188,120,177,195, 9, 21,174,112, 58,210, 34, 14,242, 46,213, 94, 12,177,150, 39,123, 97, 84,243, 24, -128, 47,123, 46, 62, 62,126,190,171,207,217, 31,179, 22, 49,119,134, 48,109, 66, 43, 54, 54,182, 90,204, 75, 75, 75,207,159, 63, -127,190,141, 92, 46,199,173, 91,183, 68, 94, 94, 94,109,216, 10,157,166,105,108,223,190,221,115,232,208,161, 71,151, 47, 95, 30, -206, 48, 12, 10, 11, 11,241,254,251,239,171,204,102,243, 56, 0,230,218, 26,112,103,150,169, 31,127,124,244,101,219,187,119,175, - 75, 67, 32,172,144,226,243,249,240,245,245,213,106,181, 90,200,100, 50,248,250,250,106, 53, 26, 13,228,114, 57, 59, 86, 76,227, -183,153, 10,206,172, 79,206, 28,227,107, 58,192, 59, 69, 90, 90,154, 75,247, 89,135, 90, 93, 42,229, 89, 89, 89,181, 86, 36,167, - 78,157, 2, 99,173,104, 93,229,180,246,242, 8, 43,252,100, 50, 25,252,252,252, 32, 22,139, 33,149, 74,171,137, 44,177, 88,236, -244,197,113,182, 32,169, 68, 34,185, 40,151,203,125,216,235, 2,129, 0, 74,165,178,188,180,180,180,219, 35, 22, 34, 13,115, 48, -121, 99,222,148, 62, 19, 67,209,103, 98, 40, 0,188,122,105, 95,209, 43,189, 95,174,114,254,220,185,248, 30, 81,230, 89, 18, 97, - 66,154, 59, 34, 11, 0,136, 72, 47, 27,243, 65,135, 42,235,194,198,243,152,187,248, 29,180,107,213, 1, 62,207,230,162,105,215, - 80, 84, 22, 25,241,235, 22, 11, 86,254,231,125,180,110,221,218,169,192,100, 64, 96, 54,154,161,213,234,160, 82,106,241,164, 97, - 48, 24, 32, 22,139,177,121,243,102,244,236,217, 19,221,187,119,127, 68,100,213,211, 60,159, 83, 90, 90,218,111,229,202,149, 23, - 62,255,252,115, 95,149, 74,133,239,190,251,174, 66,165, 82,245, 3,144,227, 86,154, 50, 4, 38,163, 17, 26,157, 30,106, 85, 85, - 26,220,187,177,179,158, 61,217, 42,177,209,179, 91,115, 76,159,254, 38, 50,239,103, 64, 85,126,247,177,197, 6,128,205, 5, 5, - 5,155,235,184,126,207,108, 54,199,178,235,190,185,128,103, 34, 34, 34, 80, 80, 80, 80,237,228,131, 7, 15, 96,177, 88,244,168, - 90, 39,235, 53,123, 67, 50,106,153, 65,107,215,131,174,178,142,106,245, 80,169,170,172, 32, 58,117,241, 19, 41, 71,172,216,168, -205, 39,171, 62,101,136,162, 40,155,211,247,140, 25, 51,112,237,234, 85, 60, 23, 90,137, 38, 33,158, 32,149,185, 16, 14,248, 15, -126, 85, 72,177,252,139,131,110,115,111,179,115,129, 88,190,109,155,195,107,247, 70,142,116, 43,238,183,111,223,134, 84, 42,133, -197, 98,121,164,189,113, 55,254,246, 2,230,139, 47,190,192,236,217,179,241,253,247,223,227,218,181,107,232,208,161, 3, 6, 14, - 28,136,162,162, 34, 92,189,122, 21,122,189,222,229,112,218,251,205,221,190,159,134, 99, 41,135,240, 32, 39, 19,121, 5,217,245, -206,119,123,206,154, 66,107,215,177, 43,248,215,160, 78,245,226, 92,184,112, 33,138,138,138,170, 89,178,236,235,165,218, 44, 90, - 53,181, 72, 13, 20,215,240,133, 98,143, 13, 53, 68, 79,205,227,154,247, 3, 64, 17, 0,158,147,231,106, 30, 23, 39, 36, 36,156, -100, 45, 97, 86, 94,158, 51,255,172, 90,135, 14, 1, 36,142, 28, 57,114,196,170, 85,171, 2, 37, 18,137,109, 6, 82,124,124, 60, -102,207,158,141,166, 77,155, 34, 32, 32, 32,204,199,199, 7, 37, 37, 37, 88,186,116, 41,178,178,178,254, 15, 14, 22,218,171, 41, -180,122,223, 87, 66, 36,250,173,195,202, 90,182, 0, 96,202,148, 41,143, 88,180,216, 12,170, 11, 38,147, 9,254,254,254,208,104, - 52,224,241,120, 24, 53,106, 20,239,250,245,235,150,152,152, 24,140, 30, 61,154,119,245,234, 85,203,176, 97,195,192,227,241, 48, - 96,192,128,202, 93,187,118,205, 2,240,153, 11, 98,235,137, 57,198,179,133,204,213,181,143, 92, 17,151,117,113, 82, 20, 5,141, - 70, 3,190,117, 86,150,171,156,236,208,161,253, 11, 72,211, 52,124,124,124,108,149, 7,107,209, 98,133,150, 51, 94,103, 11,146, -202,100, 50,175, 91,183,110, 69,177, 19, 47,138,139,139, 49, 96,192,128, 59,165,165,165,143,112,105,243, 49,127,207,146,204, 16, - 0, 67, 88,177,213,117,100, 16, 69,243, 40, 92, 59, 82,130,171,135, 74, 47,155, 42,209, 27,192, 90, 0,255, 5,176, 20,192, 92, - 0,211,236,142, 31, 58,172, 32,117, 66,125,242,198, 60, 25,203,155,188,241, 28,190,220,181, 23,239,110,173,114,220,223,245,201, -125, 76,125,105, 33,218, 69,183,115,109, 45, 32, 6, 48,154, 45, 80,105,117, 80,105, 53,120, 82, 96,223,135,117,235,214, 33, 61, - 61, 29, 58,157, 14,171, 87,175,182, 77, 42,176, 23, 89,143, 33,184, 50,164, 82, 41, 51,100,200, 16,156, 63,127, 30, 98,177,216, -132,122,172,127,197, 16, 6, 70,179, 25, 58,173, 22, 42,231, 67,110, 78, 27, 48,163,201, 4,134,177,160,107,135,112, 92,191,118, - 13,114, 94, 49,254,132,176,169,234,244,244,116, 24, 12, 6, 44, 90,180,200,242,203, 47,191,156, 68,213, 2,168,172, 5,111, 66, -223,190,125, 63,150,203,229, 62, 7, 14, 28,120, 27,192,247,117,197,221,100,182,138,246,199, 76,199,218, 70, 4, 28,249,100,213, -103,201, 29,251,134,149, 97, 24,252,223, 27,111, 96, 96,104, 37, 70,119, 14,132, 58,255, 14,100,222,129,160,124, 34,177,252,139, -131,184,113,223,229, 69,137, 9, 0, 12,233, 59, 18,237, 91, 61,186, 60, 88,175,231,170,250,100,103,142, 95, 68, 97,113,158,219, -113, 87,171,213,181, 90,174,220,176,104,217,222, 57, 54,253, 58,118,236,136,230,205,155,227,228,201,147,232,212,169, 19,238,222, -189,139,187,119,239, 34, 43, 43, 11,215,174, 93, 67, 89, 89,153,219,121,180,231,200, 86,148, 41, 75, 33, 18,138, 80, 90, 94,140, - 7,185,153, 8,246, 15,121,236,124,103,209,114,216, 66, 0, 64,104,160,183, 91, 66,203,158,115,217,178,101,143,136,247,122, 46, -223,100,207,127,177,174, 99,119,159,255, 61, 81,155,208,202, 84, 40, 20,221,199,142, 29, 27, 15,160,171,245, 92, 5,128,109, 71, -143, 30, 29, 25, 20, 20,212,191, 71,143, 30,124,145, 72,132,148,148, 20,236,218,181,235,123, 0, 91,235,250, 35,145, 72,164,141, -140,140,148,178, 5,145,125, 17,189,188,188,120, 75,151, 46,165,214,175, 95, 95,171,149,203, 89, 6, 85, 84, 84, 64,173, 86,195, -219,219, 27, 70,163, 17, 67,134, 12,177,164,167,167, 67, 40, 20, 98,196,136, 17,150,180,180, 52, 91, 70,255,239,127,255, 11,215, -106,181,207,254,244,211, 79,131, 1,244,113, 35,173, 88,199,120, 15,184,232, 0, 95, 91, 47,207, 21,184, 58, 28, 87, 27,231,204, -153, 51,235,197, 41, 20, 10,205,236,202,239, 52, 77,195,104, 52,162, 83,167, 78, 40, 42, 42,178,189, 52,114,185,220, 38,178, 92, - 17, 90,206, 22, 36,229,243,249, 48, 24, 12,232,211,167, 15, 40,138,194,154, 53,107,234, 10,107,145, 54, 15,111,236, 89,146,249, - 63, 86,108, 73, 60,248,208, 41,205, 56,241,101, 25, 12, 37,240, 26, 51,102,204,248,157, 59,119, 98,233,210,165,211,226,227,227, -149, 47,188,240,194,180,237,219,183,219,142, 1,196, 59, 34,150, 18,239, 74,205,249,230,178,100,220,129,157,136, 3, 43,226, 42, -110,120, 34, 89,119, 6, 87, 83,175, 3, 0,214,174, 93, 11,212, 53, 20,203, 48,148,135,135, 63, 66, 67, 91, 32, 48, 72, 7,198, - 69,231, 17, 87, 49,103,206,156,106, 98,202,209,202,203,246, 67,140,245, 17, 54,246,251,122,113, 0,182, 33, 47,181, 90,247,216, - 66,139, 21, 27, 62, 94, 66,132,133, 53, 64, 69,129,253,176, 62, 5,118,170, 82, 85,152, 73,189, 29,110, 89, 4, 5, 5,117, 47, - 42, 42,218, 91,227,116, 41,128,143,235,232, 88,218, 50, 58, 59, 59, 27, 49, 49, 49, 56,116,232, 16,111,247,238,221,207,237,219, -183, 47,237,206,157, 59,217,157, 58,117,106, 56,117,234, 84,113,159, 62,125, 80, 92, 92,140,206,157, 59,127,148,155,155, 91,135, -208,178,166,163, 78, 15,181,250,201, 91, 71, 29, 89,179, 30,167, 97,100,211,125,193,130,127, 99, 96,131,114,140,234,224,141,164, -253,103, 49,161,163, 20, 48,136,221,230, 99,195,226, 23,218, 24,145,209,221, 31,185, 46,246,170, 90,203, 53, 50,186, 59,232,236, -187,110,199,221, 62,204, 53,203, 76,125,202,144,125,122,190,254,250,235,152, 59,119, 46, 6, 15, 30,140,187,119,239, 34, 57, 57, - 25,119,239,222,197,204,153, 51, 17, 29, 29,141, 14, 29, 58,184,197,185,239,216, 14, 84,170, 42, 64, 83, 52, 74, 43, 74,160,211, -107, 49,103,218,130,199,206,119, 91,227,127, 44,161,106,116,224,232,229,122,115,126,240,193, 7, 40, 40, 40,168,102,201,122, 28, -191,172,191, 58,234, 90, 45, 45, 19,192,255, 57, 24,174,240, 92,180,104,209,160,128,128, 0, 80, 20,133, 47,190,248, 2,126,126, -126, 61, 1,220, 48, 24, 12,197,106,181,122,182,157, 8, 25, 8,235, 90, 27,133,133,133, 14,231,237,171,213,106,227,160, 65,131, - 4, 13, 26, 52,168, 54,219, 80, 46,151,215,102,221,177,113,178,215,204,102, 51,230,204,153,131, 37, 75,150,160, 81,163, 70, 24, - 54,108, 24, 98, 99, 99, 65, 81, 20,134, 12, 25,130, 97,195,126, 27,202,245,241,241, 17, 30, 58,116,168, 47, 77,211,105,118, 13, - 72, 53, 78, 71, 96, 29,227, 77, 38,147,171, 14,240,213, 56,217,194, 54,115,230, 76, 44, 89,178, 4,243,231,215,237,234, 81, 75, - 35,254,212, 57, 75, 75, 75,171, 85,246, 50,153,108,205,232,209,163,249,217,217,217,213,196,149,253,230,160, 34,170,198,233,108, - 65, 82, 30,143,135,224,224, 96, 44, 94,188, 24,254,254,254, 8, 9, 9,113,180,144,159, 61,103,158,189,216,122,246,165, 16,236, - 93,150,137,231,187,141,197,237, 83, 43,245,110, 52, 16,213,194,105,177, 88,178,222,121,125,110,208,138,245, 75,121,172,216, 98, - 69,220,233,175, 85, 88,149,248, 45,250,244,238, 99, 51,179, 39, 39, 39,155, 29, 88,121,108,156, 22,194,164,126,154,248,239, 94, -223,109,220, 39, 16,139,128,115,201, 59, 81, 89, 86,125, 56, 73,111,252,109, 42,181,168,211,115, 48, 92, 62,238, 82, 89, 98,197, -244,194,133, 11,177,112,225,194, 58, 35,185,110,221, 58,167,156,174,138, 46,119,210,211,106,210,162,100,114, 95, 72,228,161,104, - 19,237, 11,134,152,221,173,163,108,156, 53,197, 70, 64,128, 63, 42, 10,170,203, 58,202,150, 70,117,106, 96,103,113,255,229,226, -197,139, 35,252,253,253,145,147,147, 19, 40, 16, 8, 70, 84, 51, 87,105,181,136,140,140,108,161, 80, 40,158,117,198, 57,115,230, - 76,253,135, 31,126, 40, 30, 55,110, 28, 70,143, 30,141,113,227,198,137,133, 66, 97, 51, 66, 8,140, 70, 35,114,114,114,112,252, -248,113, 40, 20,138,155,117,133,147, 33,132,146,202,124, 32,145, 55, 64,155,182, 62, 96, 24,115,125,235,124,135,117, 72, 77,107, -150,155, 34,203, 97,249, 4,128, 95,142,239,197,130,119,219,226,251, 3, 23,176,234, 34,208,222,167, 8,109, 2, 21, 96, 20, 55, -241,254,132, 46, 88,254,195,165,170,119,233,148,211, 60, 34,117,149, 65,157,214,248, 88,113,183,183, 92,217,255,143, 11, 62, 90, -143,112,178,157, 68,165, 82,137,242,242,114, 36, 37, 37,225,213, 87, 95, 69, 81, 81, 17,178,178,178,112,231,206, 29,108,217,178, - 5, 50,153,172, 94,121, 52,235,141, 15,240,225,242,247, 64, 64,208, 50,170, 13,226,227, 22,162,107,251, 30,143,157,239, 53,225, -130, 53,171, 86,206, 21, 43, 86,212,183, 44,253,227,132,150, 67, 4, 4, 4,140,235,219,183, 47,116, 58, 29, 2, 3, 3,145,149, -149, 5,154,166,155, 2, 85, 67,120, 97, 97, 97,219, 20, 10, 69, 83, 87,249,120, 60, 30,204,102,179,205,247,135,221, 0, 96,248, -240,225,248,241,199, 31,157,246, 40, 66, 66, 66,208,176, 97, 67,188,243,206, 59,143,204,114,176,159,233, 32,149, 74,113,224,192, -129,130,210,210,210, 82, 66,136,194,157,120,179,142,241,103,206,156,113,217, 1,222, 30, 70,163, 49,251,206,157, 59, 13,214,173, - 91,199,171,163,241,179,161,150, 70,252,169,115, 58,234,153, 18, 66,106, 21, 89,174, 44, 35,224,108, 65, 82, 62,159,143,219,183, -111, 99,193,130, 5,160, 40, 10, 59,119,186,228,195,147,167,205,195, 27,187, 23,103, 46,221,147,144, 57,218, 84, 1,201, 73,245, -202, 59, 0, 86,239,216,177,163, 3, 69, 81,236, 80,225,127,119,236,216,225,105,127, 92,171,169,172,168, 40,230,197, 23, 95, 60, - 74, 81, 84, 83,221,201, 10, 79, 0, 34, 86,196,229, 94,211,169, 94,158,240,178,129,207,231, 91,126, 51, 88, 49, 89,133,133,133, -207,215,198,119,253, 86,201,122,154,166,125,135, 63,223,171, 29, 40, 10, 70,195,163, 35,213, 30,101, 42,155,200, 26,253,217, 86, -236,158, 53,214, 21,209,147,113,250,244,105,191,117,235,214,241, 93,201,247,211,167, 79,155, 9, 33,110, 15,251,177, 13,142,209, -104,132, 86, 91, 63, 43, 10, 33, 36, 37,225,147, 15, 7,109,216,116, 80, 64, 81, 6,156, 59,181, 19, 21,229,142,221, 25, 68, 2, - 62,214, 39,237, 50, 11, 5, 60,135, 78, 39, 79, 80,108, 56,195,151,163, 70,141, 26,183,122,245,234, 54,142, 46,186, 48, 9, 38, - 75,167,211, 33, 55, 55, 23, 26,141,102,199,188,121,243,140, 7, 15, 30,124,109,204,152, 49,232,208,161, 3, 26, 52,104,128,252, -252,124,100,100,100, 32, 41, 41,137,156, 61,123,118, 7,128,233, 78,210,113,111,226, 39, 31, 78, 78,250,225,160,136,166,140, 56, -151,188, 19, 21, 53, 68,251,163,214,105, 1,190,249,126,151, 81, 40, 20,220,114,102, 45,178,183,102, 61,201,134,113,196,196, 56, -140, 94,185, 10, 77,187,198, 32,113,233, 64,124,243,201,139,248,124,136, 16,198,237, 19,208,254,133, 13,216,188,104, 40, 0, 32, -244, 27, 23,173, 37,124, 33, 30, 58,176, 88,149, 87, 72,172,226,198, 61,171, 41, 27,247,186, 44, 87,238, 90,180,104,154, 70,227, -198,141,209,180,105, 83,244,236,217, 19,157, 58,117, 66,255,254,253,113,245,234, 85, 92,189,122, 21, 51,103,206,172, 75,100, 57, -205,163,126,207, 14,194,133,222,183, 30, 59,111,106,230,251,147,128, 43,101, 41, 46, 46, 14, 0,254, 81,214, 45,183,133, 86,101, -101,229, 85,134, 97,218,121,123,123,179, 22, 41,219,181, 7, 15, 30,128, 97, 24,141,187, 25, 99, 48, 24,216,197, 49,171,173,203, -196, 58,199,215,245,226, 19, 66, 44,165,165,165,232,219,183, 47,122,247,238,109, 27, 62,177,223,236,132, 9,118,239,222, 13, 66, - 72, 55,119,227,109,231, 24,175,130,155, 14,240,108, 35,222,167, 79,159,163,124, 62,223,165,175,104, 58,107,196,159, 22,167,163, -252, 97, 24,166, 86,145,229, 74, 69,228,108, 65, 82, 62,159, 15,185, 92,142, 61,123,246, 32, 32, 32,192,157,224,229,233, 10, 48, - 11,192,151,168,154,132,113, 23, 0, 59,141, 47,206,254,221,174,113, 92, 27,212, 10,133,130,237, 26,134,238, 94,156,185,116,239, -210,204,129,140, 30, 59,117, 10,252, 0, 40, 47,194,137,211,114, 77, 92, 77, 87, 44,171,235,122, 95,127,209, 41, 0,129,163, 63, -219,250,240, 84,137, 49, 98,244,103, 91, 31,236,158, 53,182, 81, 93,207, 20, 20, 20, 12, 30, 59,118,236, 33, 87,243,221,108, 54, -103, 22, 20, 20, 60,239,110,153, 37,132,224,214,173, 91,204,235,175,191, 94,172, 80, 40, 94,172, 79, 5, 19,191, 96,213,231, 75, - 62,154,225, 63,100, 80,247,174,160, 1, 67,237,206,191,132, 2, 8, 95,192,203,158, 61,127,197, 27, 47,190,248,226,239, 42, 54, -106, 86,115, 5, 5, 5, 61,255,245,175,127, 77,199,111,174, 19,213,132, 20,106,153, 93,109,197,202,134, 13, 27,182,229,241,120, - 98, 0, 11, 0, 60, 56,123,246,236,151,103,207,158, 29, 12,224, 25, 30,143,215,192, 98,177,228, 90, 59, 61, 91, 1,252,234,188, - 28, 21, 77, 5, 97,194,135, 12,124, 38, 6, 20, 69, 12, 6,189,147, 14, 18, 8, 8, 33, 66,161,224,214, 47, 87,243,219,215,213, -145,178,251, 2,199, 19,159, 65, 60,125,250,116, 76,159, 62,221, 86,158,214,172,233,141, 29,215,207,224,133,246, 57,208,127,221, - 11,148, 87, 35,151, 59,124, 0,240,193,191, 95,127, 98, 97,179,143,187,189, 69,203,209,123,224,142,143, 22,143,199, 67,113,113, - 49,110,223,190,141,194,194, 66,104, 52, 26,164,167,167,195,104, 52,162,172,172, 12,109,219,182,173,119, 56,159, 84, 30,253,145, -156,255,196,225, 67,183,133,150,209,104,252, 79,227,198,141, 5, 18,137,164,141,197, 98, 1, 33, 4, 22,139,133, 88, 69,141,219, -179,240, 4, 2,129,174,121,243,230,148,163,217, 9,236,111,185, 92,174,173,195, 90,146, 16, 25, 25, 57,143,162, 40, 94,109,189, - 16,246, 55,195, 48, 22, 62,159,159, 80,207,180,122, 92,199,120,251, 70,252, 73,225,105,112,214,204, 31,117,171, 86,173,108, 95, -180,175,185, 38,138,245, 99,171,106, 39,226,188,206, 5, 73,213,106,117,126, 76, 76,140,197,254,186,253,130,166,206, 52,172,117, -123,210, 96, 69, 92, 99, 59, 17,103,121,226,255, 66,145, 7, 67,199,189, 22,113,170,196, 24, 1, 0,172,216, 2, 33, 15,234,120, - 74, 91, 80, 80,208,247,105, 87, 14,247,239,223, 55, 60,243,204, 51,155,148, 74,101, 28,128,122,123,243,207,255,207,154,249, 79, - 34, 60, 79, 75,108,212, 86,108, 1, 44,169,103, 80, 31,148,148,148, 12,168,113,238, 87, 86, 80,177,235,218,185, 29,255,155,197, -207, 63,233, 60, 54,155,205, 57, 77,155, 54,117,203,114, 99, 50,153,114,156, 93,175,185, 70,152, 61,110,192, 27,243,207, 3, 85, -147,191, 75, 92,226,212,233,116,165, 61,122,244, 16,184, 25,183, 34, 87,227,222,160, 65, 3,132,134,134,218,246, 44,106,158,119, - 22, 78,179,217,156, 19, 30, 30,142,128,128,128, 90, 87,124,175,233,147,229, 10,231,147,206,163,186, 56, 67, 67, 55, 60,113,206, -250,134,147,131,107, 24,200,113,114,156, 28,231, 95,150,147,199,165, 39,199,201,113,114,156,191, 35,231,223, 18,156,151, 26, 7, - 14, 28,106,131,133, 75, 2, 14, 28, 56,112,120, 60, 80,117,168,210, 99,110,240,212, 71,217, 30,227, 56, 57, 78,142,147,227,228, - 56, 57, 78,142,243, 31,199,233,140,251, 24, 56, 60, 85, 1,198,113,114,156, 28, 39,199,201,113,114,156, 28,231, 63,143,243,111, - 9,110,232,144, 3, 7, 14, 28, 56,112,224,192,129, 19, 90, 28, 56,112,224,192,129, 3, 7, 14,156,208,226,192,129, 3, 7, 14, - 28, 56,112,224,192, 9, 45, 14, 28, 56,112,224,192,129, 3, 7, 78,104,113,224,192,129, 3, 7, 14, 28, 56,112,224,192,129, 3, - 7, 14, 28, 56,112,224, 80, 5, 10, 0,246,239,223,111,251, 32, 96,108,108, 44,197, 37, 11, 7, 14, 28, 56,112,224,192,225,247, -196,223, 90,139,216, 71,142, 3, 7, 14, 28, 56,112,224,192,129,211, 34, 79, 6, 52, 39,182, 56,112,224,192,129, 3, 7, 14,156, -216,226, 34,198,129, 3, 7, 14, 28, 56,112,224, 68,214, 95, 10,213, 44, 90,156,224,226,192,129, 3, 7, 14, 28, 56,252,145, 98, -235, 47,170, 69,136,117,179, 63,230,192,129, 3, 7, 14, 28, 56,112,224,240,152, 2,171,174, 61, 7, 14, 28, 56,112,224,192,129, - 3,135, 39, 36,184,216,223,191,155,208,226,190,108,206,113,114,156, 28, 39,199,201,113,114,156, 28,231, 63, 22,124, 46, 9, 56, -112,224,192,129, 3, 7, 14, 28, 30, 27,246, 86, 44,138, 19, 90, 28, 56,112,224,192,129, 3, 7, 14, 79, 78,100, 81,142,142,185, -111, 29,114,224,192,129, 3, 7, 14, 28, 56, 60, 37,112, 22, 45, 14, 28, 56,112,224,192,129, 3,135,199, 3, 5,110,232,144, 3, - 7, 14, 28, 56,112,224,192,225,169,138, 45,135, 39,107,155, 57,112,204, 13,242,250,204, 62, 56,198,113,114,156, 28, 39,199,201, -113,114,156, 28,231, 63,142,211, 25,247, 49,252,245,208, 23,192, 73, 0,253,172,251, 90,133,215,147, 6, 55,245,149,227,228, 56, - 57, 78,142,147,227,228, 56, 57,206,191, 59,106, 93,168,148,115,134,231,224, 12,124,212, 61,196,236,236, 58, 7, 14, 28, 56,112, -224,240, 79, 19, 91,196,190,145,116,132,102, 0,230, 3,240,182, 59,119, 17, 64, 66,141,251,126, 0, 32,179, 59, 86, 3, 88, 4, -224,174,211,208, 16, 34,180,242,139,173, 27, 3, 64, 7, 64, 15, 64, 73, 81,148,137,203,179, 63, 28, 61, 0,196, 90,127,239, 7, -112,206,205,235,127, 43, 52,104,208, 64,234,235,235, 59,248,242,229,203,162,244,244,116,156, 62,125,154,172, 95,191,222, 88, 86, - 86,118, 36, 63, 63, 95,203, 21,151,191, 5, 98, 0,196, 91,127, 39, 2, 56,252,152,124,148, 76, 38,155, 41,151,203,135,138,197, -226, 80,179,217, 76,105, 52,154, 60,181, 90,125,212,108, 54,127,102,173,247,220,197, 72, 63, 63,191,215, 90,182,108,217, 44, 43, - 43, 43, 55, 47, 47,239, 7, 0,219, 1,188, 24, 26, 26, 58, 33, 50, 50, 50,236,214,173, 91,119, 75, 75, 75,191, 1,176,247, 15, - 12, 39, 7, 14,255, 36, 80,117, 89, 35, 28, 97, 1, 33,100, 66, 53, 6,234, 81,142, 1, 3, 6,140, 56,114,228,136,140, 97, 24, -176,155, 84, 42, 53, 3,120,197,137,200,242, 79, 73, 73,137,136,139,139, 27,157,151,151,215, 69,169, 84,118, 3, 0,153, 76,118, - 33, 40, 40,232,151,149, 43, 87,110, 33,132,228, 80, 20,165,116, 51,162,124,129, 64,240,170,175,175,239, 80,179,217,220,137, 16, - 2,129, 64,112,185,172,172,236,176,201,100,250, 6, 64,125,196,155,136,207,231, 79, 23,139,197, 49,102,179,185, 29, 0,240,249, -252,107,122,189,254,176,217,108,254, 18,128,161, 30,156, 18,145, 72, 52,221,203,203,107,144,193, 96,104, 7, 0, 34,145,232, 90, -101,101,229, 81,131,193,240,165, 85,112,254,209,224, 3,136, 37,132, 8, 0,128,199,227,141,236,214,173, 91, 4, 69, 81, 12, 69, - 81,132, 16, 66, 93,184,112,161,163,197, 98,161,173,229, 35, 22,192, 47, 0,204,127,197, 55, 36, 32, 32, 96, 9,195, 48,161,117, -102,154, 68,210,229,242,229,203, 45,183,109,219,102,249,250,235,175,203,167, 76,153,226, 17, 23, 23,199, 95,179,102,205,151,249, -249,249,111,215,188,223,223,223,255,115,154,166, 3, 92,249,127,134, 97,138, 75, 74, 74,222,251,163,226, 63,121,178,174,154,185, - 59, 41, 73, 18, 5, 32,167,158,229,251,233,113,234, 38, 19, 0, 72,146, 36, 69, 77,214, 77,206, 96,127, 63, 46,175, 29,226,191, - 58,166,236, 67, 8, 48,125,144, 39,253,184, 66, 43, 44, 44, 44,105,242,228,201,227,218,181,107,199, 39,132,192,100, 50, 65,175, -215,183, 60,119,238, 92,191,157, 59,119,118, 81, 42,149, 47,186, 73,249,198,220,185,115, 23,127,252,241,199, 1, 2,129,128, 50, -153, 76, 81,219,182,109,235, 52,117,234,212,119,214,173, 91,215,240,165,151, 94,242,100,207, 47, 88,176,160,107, 98, 98, 98, 19, - 0,159,253, 1,225,228,192,225,159,134,190,168,238,163,245, 17,128,133,117, 9, 45,185,181,241, 44,180, 90,178, 96,183,183,225, -196,137, 19,251,248,124, 62,107,209,234,166, 86,171,131,107, 88,193, 28,137,172,200,137, 19, 39,246,216,177, 99,199,146,151, 94, -122,169, 64, 38,147, 53, 31, 51,102,140,146,162, 40,222,182,109,219, 58, 54,109,218, 84, 58,124,248,240,137, 3, 6, 12,152, 69, - 8, 57, 77, 81,148,194,197, 72,182,241,243,243,219,181,108,217,178,136,152,152, 24, 97, 64, 64, 0, 8, 33,200,203,203, 11, 59, -112,224,192,144,143, 62,250,104, 86,105,105,233, 40, 0,105,110, 36, 92, 87,169, 84,186,227,163,143, 62,106, 48,100,200, 16,126, - 72, 72, 8,116, 58, 29,210,211,211, 7, 30, 62,124,184,207,186,117,235,222,214,106,181, 47, 88, 5,134,171,232,230,237,237,189, -243,187,185,115,131,187,191,250, 42,223,207,207, 15,132, 16, 40, 20,138,129,103, 54,108,232, 55,109,217,178,183, 43, 42, 42,254, -229, 40,189,255, 72,136, 68, 34,122,227,198,141, 29, 68, 34, 17, 0,192, 96, 48, 32, 58, 58,154,250,187,188, 33, 20, 69,133,231, -229,229,121, 11,133, 66,135,215, 45, 22, 11,250,244,233,211, 88, 40, 20,226,179,207, 62, 51, 21, 23, 23,119, 92,189,122,245,229, -205,155, 55, 7,124,249,229,151, 47, 0,120, 68,104,209, 52, 29,144,147,147,227,144,211, 98,177,192,104, 52,194,108, 54,195, 96, - 48,160,117,235,214,127,104,252,147,146, 36,225, 0,222,155, 60, 89,247,174,245,212,103, 0,102, 1,184,143,122,126,179,235, 41, -112,218,151,183,207,237,126, 63,118, 88,237, 16, 1, 0, 7,175,234, 0,192,239,113,211, 85, 46,151,183, 26, 63,126, 60, 95,161, - 80, 64, 32, 16,192,104, 52,162,160,160, 0,209,209,209,188, 77,155, 54,181,112,151, 47, 42, 42,106, 74, 98, 98, 98,224,193,131, - 7,141, 27, 55,110, 52, 12, 26, 52, 72, 48,101,202, 20,175, 62,125,250,180, 14, 15, 15,167,191,253,246, 91,253,209,163, 71, 77, - 19, 39, 78, 20, 37, 36, 36, 4, 30, 56,112, 96,120, 90, 90,218,103,191,119, 56, 57,112,248, 7,226, 36,126, 91,226,129,221,215, - 41,180, 96, 39,174, 70, 2,128, 64, 32,232, 24, 28, 28,156,100, 54,155, 67,172, 86,157,130,194,194,194,207, 76, 38,211, 21,235, -189,123, 25,134, 25,225,204,146, 53,113,226,196, 30,135, 14, 29, 90,126,238,220,185,138,146,146,146,144,125,251,246,233,102,205, -154,149, 5, 0,247,239,223,111, 50,124,248,240,176, 25, 51,102,228, 12, 30, 60,120,101,255,254,253,223, 34,132, 28,165, 40, 74, -237, 76,100, 69, 71, 71,167, 36, 39, 39,123,250,248,248, 84,187, 16, 25, 25,137,183,222,122, 75, 56, 98,196,136,166,207, 61,247, -220,217,140,140,140,222, 0,174,187, 34,136,154, 53,107,118,236,196,137, 19, 30,190,190,190, 40, 47, 47, 71, 65, 65, 1, 52, 26, - 13,188,188,188,240,210, 75, 47, 9,251,246,234,217,112,198,204,183,143,229,228,230, 14,116, 81,108,117,235,217,166,205,177,205, - 9, 9, 30,166,135, 15, 33,149, 74,161, 82,169, 0, 0,158,158,158,232,210,184, 49,255,210,134, 13, 97, 19,230,204, 57,246,203, -237,219, 3,255, 32,177, 37,182,238,245, 0,246,243,120,188,145, 34,145,136, 30, 57,114, 36,142, 29, 59, 70,233,116, 58,190,213, -186, 99, 30, 57,114, 36,164, 82, 41, 12, 6,135,200,170, 5, 0, 0, 32, 0, 73, 68, 65, 84, 3,131,170,161, 67,243, 95,249, 45, - 17,137, 68,200,200,200,168,118, 78,169, 84, 66,161, 80,160,164,164, 4,122,189, 30,229,229,229, 96, 24,134,146, 74,165, 10,134, - 97, 64,211,116, 77, 1, 80, 13, 66,161, 16,183,111,223,174,118,206,108, 54, 67,173, 86, 67,175,215,195,104, 52, 66,169, 84, 74, - 61, 61, 61,155, 5, 4, 4,228, 0,216, 91, 90, 90,250, 89, 97, 97,225,131,223, 57,250,197,172, 32, 74, 74,146,220, 3, 32,250, - 51,114,218, 89,178,194,172,199,191, 62,161,176,178,120,184,255,138,174,145,213, 58,150,249, 4,248, 24, 0, 56,125,250, 52, 10, - 11, 11, 81, 92, 92, 12,133, 66,129,240,240,112, 16, 66,220, 30,142,203,200,200,248,170,109,219,182,212,141, 27, 55, 14, 3, 88, -179,109,219,182, 87, 74, 75, 75,227,103,207,158,237,247,233,167,159,150,206,153, 51, 39, 17,192,247,219,182,109,123,179, 85,171, - 86, 67,111,222,188,185,238,143, 8, 39, 7, 14, 79, 26,132,144,174, 0, 2,217,186,197, 90,239,250,219, 29, 95,165, 40,202, 96, -119,159,193, 90, 55,212,220,179, 96,143, 21, 20, 69,253, 98,247,156,130,162,168, 95,234, 27,204, 26,251,170, 78, 55, 0,236,223, -191,159,176,155,163, 39,131,130,130,102, 14, 24, 48, 96,121,106,106,106,235,252,252,124,223,252,252,124,223,212,212,212,214, 3, - 6, 12, 88, 30, 20, 20, 52,211, 46, 33,106, 62,122,204,238,154, 48, 37, 37, 37, 98,215,174, 93,137,199,142, 29,171,232,216,177, -163,225,196,137, 19,230,193,131, 7, 23, 89, 27,104,243,224,193,131,139,126,254,249,103, 75,247,238,221,165,135, 14, 29,202, 62, -123,246,236,231, 59,118,236, 8, 38,132,240, 28,113, 90, 33,240,241,241,217,115,234,212,169, 71, 68,150, 61, 26, 54,108,136,253, -251,247,123,249,248,248,236, 5, 32,172, 45,156, 86, 72, 36, 18,201,206,159,127,254,217,195,211,211, 19, 69, 69, 69, 16, 8, 4, - 8, 10, 10, 66, 69, 69, 5, 10,242,243,241,224,206, 29,208, 6, 3,190,248,228, 99, 79,169, 84,186,195, 65,101,255, 8,167,183, -183,247,206,205, 75,150,120,148, 28, 59,134, 95, 23, 47,134,209,104,180, 13,185, 26,141, 70,156,141,139,131,226,248,113,124,187, - 96,129,135,183,183,247, 78, 0, 18, 39,156, 79, 2,246,156,113, 0, 74,173, 91, 28,128,115,209,209,209,169,233,233,233,232,221, -187, 55,182,111,223,222,126,246,236,217,113,179,103,207,142,219,190,125,123,251,222,189,123, 35, 61, 61, 29,209,209,209,169,168, -238,159,245,180,195,249,212, 56, 45, 22, 75,181,141, 97,126,107, 99, 66, 67, 67,139,118,237,218,133,151, 94,122,137, 22,137, 68, -249, 99,199,142, 21,159, 57,115,134, 88, 69,166,203,225,212,233,116,208,106,181, 80,171,213,184,127,255,190,116,217,178,101,189, - 22, 46, 92, 24,117,236,216,177,176,249,243,231, 79, 11, 12, 12,188, 28, 28, 28, 28,241, 59,199,221, 88,227,247, 23, 0,114,221, -180, 16, 61,109, 78, 98,125, 30,147,117,147, 59,216, 85,176,238,242,214,149,158, 5,214,176,170, 1, 60,120,156,178, 52, 96,192, -128,182, 81, 81, 81,193,219,110,248,162, 76,216, 18,140,208, 7,140,208, 7, 22,255,174,200, 16, 61,143, 70,141, 26, 5,123,120, -120,244,112, 51,156, 27,111,220,184,241,140,181,167, 92, 2, 96,249,156, 57,115, 62,162, 40,234,244,156, 57,115, 62, 6,176,220, -122,126,241,205,155, 55,187, 3,216,252, 7,133,243, 47,241,190,115,156,127, 46, 78, 39, 90, 36,144,162,168,253, 20, 69,237,159, - 55,111, 94,127, 0,254, 53,142,159,181,191, 15,128,200,209,158,221,236,206, 7, 18, 66,134,217, 61, 23, 88,207,224, 83, 14,182, -223,132, 22, 0,196,198,198, 82,177,177,177,236,133,139, 20, 69,237, 3,112, 81, 32, 16,116,236,208,161,195,200,159,126,250,201, - 51, 48,240,183,255, 15, 12, 12,196,142, 29, 59, 60,219,180,105, 51, 82, 32, 16,116, 4,112,209,203,203,107, 95, 29, 86, 24,159, -184,184,184,209,147, 38, 77,170,236,216,177, 35, 0,148,167,165,165,201,186,119,239,174, 54,155,205,148,217,108,166,186,119,239, -174, 78, 75, 75,147,153, 76, 38,101,215,174, 93,229,207, 61,247, 92,214,123,239,189, 55,209,129,224,176,199,248,165, 75,151,134, -251,250,250,214,165,132,161, 84, 42, 17, 28, 28,140,184,184,184, 16,129, 64,240, 90, 93,169,197,231,243,167, 47, 93,186, 52,200, -199,199, 7,101,101,101, 8, 15, 15,135,193, 96,192,237,219,183,161, 83,171, 96, 82, 86,194, 84, 89, 14,197,189,187,240, 17,240, - 49,113, 68,108, 48,159,207,159,238,196, 90, 50,253,155, 57,115,130, 13, 89, 89,184,191,125, 59, 44,230, 71,141, 63,102,163, 17, -215,254,247, 63,232,114,114,144,248,250,235,193, 34,145,104,250,239,108,201,250,148, 16, 34, 37,132, 72, 41,138, 90,217,163, 71, -143, 77, 82,169, 52, 46, 33, 33, 33,230,200,145, 35, 67,146,147,147,251,153,205,102,129,217,108, 22,156, 62,125,186,183, 78,167, -227,139,197, 98,240,249,124,130,191, 41, 4, 2, 1,132, 66, 33,164, 82, 41,122,245,234,117,111,253,250,245,166,240,240,112,193, -206,157, 59,125, 67, 67, 67,229,107,214,172, 41, 87, 42,149, 75, 93,229, 51, 26,141,208,235,245,208,106,181,208,233,116, 56,113, -226, 68,227, 25, 51,102,240,117, 58,157,101,248,240,225,165, 38,147, 73, 63,103,206, 28, 47, 63, 63,191, 89,191,103, 60, 39, 79, -214, 49, 86,203,211, 77,171,104,201,196, 99,250, 60, 61, 13, 78, 0, 6,171, 79, 22,139, 0, 43,183,225, 9, 37,133, 25,128,202, - 42,180,244, 53,222,143,118,118, 22, 95,167, 40, 47, 47, 95,247,205, 55,223,132,211, 98, 31,156, 49, 12,197, 22,230, 35, 28,241, - 94,131,162,136,247, 17, 20, 30,133,113,227,198, 5, 17, 66,214, 60,129, 48,175, 6,208, 7,192,202,250, 60,252, 59,132, 51, 66, - 46,151,111,247,244,244, 60, 35,151,203,183,195, 58, 60,251, 56, 24, 20,133,129, 35, 90,209, 57,131,154,130,140,104, 69,231, 12, -138,226,150, 26,248,187,160,134, 22,177,135,130, 16, 18, 75, 8,137, 77, 76, 76, 92, 98,215,190,179,199, 82, 23, 45, 99,177,132, -144,216,106, 10,169, 74, 96, 61,182,209,205,193, 86,165, 41,236,149,164, 93,228,108,179, 11,131,131,131,147,146,146,146, 60,107, - 50,230,231,231,163,178,178, 18, 31,126,248,161,231,164, 73,147,222,206,201,201,153,236, 36, 16,162,130,130,130, 78, 19, 38, 76, -144, 24,141,198, 50,134, 97,232,202,202, 74,190,183,183,183,133,189,193,219,219,219, 82, 81, 81, 33, 80,171,213, 60,139,197,162, -159, 52,105,146,232,245,215, 95,239, 2,128, 87, 27,105, 96, 96,224,160,161, 67,135,214, 58,116, 96, 50,153,160, 86,171,161, 86, -171, 97, 52, 26,209,171, 87, 47,241,250,245,235, 7, 23, 21, 21,253,183, 86,197, 33, 22, 15, 26, 52,104,144,160,180,180, 20,222, -222,222,120,240,224, 1, 50, 51, 51,161, 87,169, 96, 84, 85,194,168, 82,194,172,172, 4,169,172, 64,201,221, 91,232,222,170,165, -240, 7,177, 56, 70,173, 86,127, 94, 27,167,151,151,215,160,238,175,188,194,151,203,229,232, 55,161,106,158,193,161, 86,173, 64, - 44, 22, 48, 22, 11, 44,102, 51, 98,110,223,134,201,100, 2, 77,211,232, 90, 90,202,247,218,176, 97,144, 66,161, 88,254, 71, 20, -118,177, 88,204,223,184,113,227,120,145, 72, 4, 66, 8,101, 48, 24,112,228,200,145,127,220, 75, 47, 18,137, 32,145, 72, 96, 52, - 26, 17, 25, 25,169,157, 48, 97, 66,202, 39,159,124,210,136,166,105,185, 80, 40,252,169,164,164,100, 73,126,126,254,125, 87,249, - 76, 38, 19, 12, 6, 3, 12, 6, 3,180, 90, 45,238,221,187, 23,210,184,113, 99, 42, 46, 46,206,162,209,104,154,172, 90,181, 42, -227,200,145, 35,178,165, 75,151,142, 1,240,214,239, 29,223,201,147,117,173, 0,180, 74, 74,146, 8,173,150, 95,195,159,140,147, -160,202,241, 29, 73,146,164,116, 0,138, 39, 40,178, 68, 0,188, 27,249,243,213, 2, 30, 84, 0, 60,173,162, 96, 12, 69, 81,221, - 91,183,110,237,155,158,158, 94, 70, 8, 57, 15, 96, 11,128,252,186,200, 24,134,161, 24,134,193,212,110,229,136,235,193,131,201, - 84,129,138,138, 10, 60,120,240, 0,105,105,105,184,112, 33,173,190,239,230,107, 30, 30, 30,131, 37, 18, 73,164,217,108,166, 85, - 42,213, 3,141, 70,115,140, 97,152,117,168,135,143,218,211, 10, 39, 11,185, 92,190,108,254,252,249, 61,189,189,189,113,229,202, -149, 38, 91,183,110, 93,166, 86,171, 31,203,185, 94, 34,160,191,253,124,197,154,176,176, 32, 31, 92, 77,254, 49,108,201,218,109, -223, 2, 76, 56, 39, 83,254,250,168,161, 69,236,197,208, 47,132,144, 97, 20, 69,237,175, 41,148,220, 50, 59, 61,230,243, 78, 44, - 90, 53, 63, 44, 93, 93,104,213,162, 32, 97, 54,155, 67,236, 45, 89,132, 16,228,231,231, 35, 55, 55, 23, 10,133, 2,190,190,190, - 48, 26,141, 33,174,212, 15, 74,165,178,155,191,191,191, 70, 32, 16,232,181, 90, 45,100, 50, 25, 35, 16, 8,136,245,127, 40,235, -172, 69,139, 94,175,167,248,124,190,201,211,211,211, 67,175,215,183, 68, 29,190,100,132,144,110,254,254,254, 14,175,233,245,122, -168, 84, 42,168,213,106,168, 84, 42,232,245,122, 4, 7, 7,195,108, 54,119,170,179, 75,107, 54,183, 11, 12, 12, 68, 94, 94, 30, -164, 82, 41,114,114,114, 96, 80, 41, 97, 84, 42, 97, 86, 87,194, 82, 81, 1,166,178, 18,140,186, 18, 38,131, 6, 97,205, 91,129, -157,145, 88,107, 55,220, 96,104,231,239,239, 15,181,250, 55,119, 51, 98, 21, 88,102,179, 25,102,171,115, 52, 59,156, 24, 16, 16, - 0,118, 70,226,239, 4, 61,128,217, 52, 77,175, 20,139,197,252,105,211,166, 33, 63, 63,191, 90,153,152, 54,109,154,205, 39,171, - 79,159, 62,167, 37, 18,137, 89,161, 80, 64,175,215, 11,254,174, 47, 61, 69, 81,160, 40,170, 42,143,204,102, 4, 4, 4,168,139, -139,139, 47,148,151,151,143,175, 15,159,201,100, 98,103,116, 65,171,213,130, 16,130, 43, 87,174, 64, 34,145, 8, 44, 22,203, 13, -179,217, 44, 19, 8, 4,160,173,206, 95,191, 23,172, 51, 2, 63, 3, 16,110,181, 16,189,134, 42,135,243, 92, 7, 21,137, 75, 73, -231, 34,167,251,194, 77, 55,153,181, 52,229,162,126,195,145,142,208,175,165,143,232,243,132,238, 65, 62, 29,134,203,213, 50, 17, - 79,205, 60,232, 16,249,221,167,105, 91, 39, 77,124,205,115,209,162, 69, 17, 1, 1, 1,146,140,140, 12,221,199, 31,127,220,120, -227,198,141, 20,170,134,233,106,197,195,135, 15,119,207,159, 63,223,111,232,208,161, 77,196, 98, 49, 85, 81, 81, 1,133, 66,129, -194,194, 66,100,102,102,146,171, 87,175,222,211,235,245,219,221, 9,100,131, 6, 13,214,143, 31, 63,126, 82,231,206,157, 5,172, -133, 84,173, 86,119, 60,117,234,212,136, 67,135, 14,245, 86,171,213,110,151,203,236,236,236,237, 31,124,240,129,252,249,231,159, -111, 41, 22,139,233, 39, 17, 78,123,208, 52, 29,236,225,225,129, 99,199,142,193,199,199, 7, 52, 77, 7, 63,110,121,213, 25,153, -176,208, 16,127,232,206,126,142,150,129, 17,208, 25,153, 48, 78,162,252,125, 44, 90,181,180,245, 93, 89,139,148, 19,177,164,141, -143,143,159, 79, 81,212,254,248,248,248,249,142, 44, 90,214,159, 22,251,251,236,238,215, 63,105,177,229,214, 66,147, 12,195, 32, - 55, 55, 23,121,121,121,200,205,205, 69, 73, 73, 9,104,154, 6, 33,196,149,217,103,132,162, 40,230,232,209,163,190, 41, 41, 41, -234,174, 93,187,150,179,254, 47,102,179,153, 50,153, 76,148,213, 47,134,122,240,224,129,240,204,153, 51, 62, 55,111,222, 12,182, -246, 86, 25, 39,166,192, 71,206,177, 2,203,126,211,233,116,144, 72, 36,174,169, 14,107, 67,120, 37, 53,181, 74,100,169,148,214, - 33,195, 10, 88, 42, 43, 64,212, 74,136, 44, 38,136, 64, 64,233, 52, 46,167,159, 61, 88,145,101,180, 10, 45,131,193, 0,147,201, - 4,134, 97, 96, 54,255, 33,126,229, 95,181,111,223,190,211,238,221,187,167,228,230, 62,218, 22,142, 26, 53, 10,111,189,245, 22, -102,204,152,113,115,216,176, 97, 87,127,252,241, 71, 76,159, 62, 29, 12,195,116, 0, 80, 1,224,208,223,237,165,215,235,245, 54, - 11,148, 78,167,131,209,104, 4,220,248,172, 66,205,178,201,230,173,217,108,102,185,169,221,187,119,225,244,233,211,116, 90,218, -141,240,105,211,226, 88,135,251,223, 59,170, 57,168,154,185, 39,178, 86, 20, 6, 84,249, 63,213,182,164, 66, 83,212, 61,100, 71, -234,226,124, 28,180, 95,219,254,165,119,223,125,119, 16,170,102, 56,223,127, 76,139,214,243, 34,154,250,122,102, 59, 63,201,172, -246,254,106, 17,159, 82,221,254,122,190, 42,179,145,151, 58,184,161,204, 16,222,216, 39,116,201,146, 79, 26,220,188,121, 75,255, -225,135, 31,166,143, 29, 59, 54,104,214,172, 89,173,119,238,220,217, 91,167,211,125, 3,160,188, 54,163,203,136, 17, 35,206, 7, - 5, 5, 53, 94,187,118,109, 81,118,118,182,175,201,100,146, 27,141, 70, 70,173, 86,103,106,181,218, 99, 70,163,241, 24,128, 84, -119, 2,235,233,233,217,254,149, 87, 94, 17,148,151,151,131,207,231,195,104, 52,162,168,168, 8, 61,123,246,228,237,219,183,175, - 77,125, 18,160,172,172,236,243,111,190,249,230,228,230,205,155, 7,123,121,121,117, 22,139,197, 33, 0, 44, 74,165,178, 80,173, - 86,255, 90,159,112, 86,171,231, 44,150,194,212,212,212,166, 94, 94, 94,120,248,240, 33, 44, 22, 75,225,227,150, 1,137,144,206, -190,150,188,175, 97,171,128,198, 56,147,114, 30, 18, 33,157,205, 45,245,245,183, 7,235, 67, 5,123, 1,229, 64, 32,165, 36, 36, - 36, 72, 19, 19, 19,145,144,144,112,195,145, 69,139, 21, 92, 9, 9, 9, 55,216,251,236,238, 79,126,140, 48,214,110,209,170, 77, - 65, 2, 85,179, 11, 21, 10,133,175,143,143,143, 77, 96,229,229,229, 33, 47, 47, 15, 34,145, 8, 15, 30, 60,128, 72, 36,202,119, -165, 19, 34,149, 74, 47,117,236,216,177,197,253,251,247,133, 31,127,252,113,195,212,212, 84,175,158, 61,123,182,149, 74,165, 22, - 66, 8,116, 58, 29,157,158,158,238,177,124,249,242,176,110,221,186, 25,186,117,235,118,121,219,182,109, 90,212,177,254, 21, 69, - 81, 23,243,243,243,155, 68, 70, 70,178,162,173,154,184,178, 23, 92, 64,213,144, 39,159,207,191, 92, 87, 64,249,124,254,181,219, -183,111, 15,148, 73,196, 48, 40, 43, 97, 84, 85,194,172, 84,194,162,172,128,165,162, 2, 80, 87, 66,100, 54, 67, 96, 49, 65, 42, -145, 32, 55, 39, 7,124, 62,255, 90, 93,156, 34,145,232, 90, 97, 97,225, 64, 31, 31, 31, 91, 35,106, 50,155,171, 54,139, 5, 6, -179,217,102,209, 18, 8, 4,200,206,206,134, 72, 36,186,246,123,151,100,154,166, 45,236, 18, 14,181,196, 3,193,193,193, 76,247, -238,221, 49,125,250,116, 88, 44, 22,107, 54, 80,253, 0,156, 65,149,127,203, 95, 18,142,196, 45,235,180,174,213,106,161, 82,169, - 80, 86, 86,198,151, 74,165, 45,194,194,194,206, 27, 12,134,237,102,179,249,219,204,204,204,202,218, 56,173,194,204, 38,186, 24, -134, 1, 33, 4, 22,139, 5, 38,147, 9, 66,161,144, 57,117, 42, 25,203,191, 88,134,164,111, 55,146, 17, 35, 70, 80,251,246,237, - 3,195, 48, 57,191,115,244, 13, 86,209, 82, 87,165, 81,115, 73,133,247, 81,247,146, 10,181,113,218,247,254,236,207, 81, 14,238, -121, 4,239,190,251,238, 97, 84, 13, 25, 22, 91,197,220,227,112,126, 86,190,229, 19, 9,204, 22,181,254,212,102,213,166, 59,149, -234, 69,155, 86, 92, 50,136,120,149, 93,250, 6,183,107,210,184, 5,207,199,199,151,254,239,186,149, 37, 63,108,220,145,241,240, -225,195,202, 47,191,252,178, 71,139, 22, 45,188,127,253,245,215,176,218,132,150, 76, 38,107,246,218,107,175,189, 82, 86, 86, 38, - 76, 74, 74,218,150,159,159,127, 9, 85, 75,203,216,207,160, 30, 6,224,123,171, 16, 13,182,214,115,103, 0,124, 92, 87,127,141, -162, 40,252,252,243,207,143,204, 14,100, 30, 79,157,251, 68, 69, 69,189,116,255,254,253,211,133,133,133,255,170,121, 81, 40, 20, - 46,106,222,188,121,204,141, 27, 55, 62, 2,112,208, 29, 98,141, 70, 51,103,199,142, 29,159,242,120,188, 80,139,197,146,247,255, -236, 93,119, 88, 20,215, 23, 61, 51,219,151,222, 97, 5, 65, 65, 84, 20, 53, 63, 75, 52,177,160,177,196, 88, 18, 19,193, 30,141, - 49, 26,147, 88, 99,139, 93,212, 24, 53,177, 17,187,198, 32,177, 18, 75, 68, 77,212,216, 21, 27, 6, 27, 54,164, 73, 7, 5, 22, -182,239,206,204,239, 15,118,201,178,236,194, 46, 26,141,102,206,247,237,183,187, 51,111,206,123,111,234,153,251,238,189, 79,161, - 80, 76,123,102,139,150,150, 30,181,100,253,238,205, 10, 53,229, 47, 22,112, 50,148, 90,250, 51, 86,135,188,190,214, 44, 61, 10, -140,172, 81, 5, 0, 8,147,255,137,250,135,145,154, 97, 24, 67,217, 2, 35, 43,150,218,196, 10,102,110, 93,193, 51, 36, 75,103, - 44,221,227, 44, 89,180,190, 1,240, 38,128, 43,121,121,121,171, 63,254,248,227,239,119,236,216,225, 40,149, 74,145,151,151,135, -252,252,124,112,185, 92, 56, 57, 57, 97,221,186,117,138,188,188,188,213,198,219,160,106, 6,121, 0, 80,122,120,120, 92,139,137, -137,241,217,180,105, 19,119,248,240,225,233,189,123,247,110,188,110,221,186, 20, 62,159,207, 80, 20, 69,168, 84, 42, 98,204,152, - 49, 65, 43, 87,174, 76,227,112, 56,118, 3, 6, 12, 32,236,237,237,175,160,154,180, 1, 5, 5, 5,199, 15, 28, 56,240,225,228, -201,147,133,106,181,218,172, 37,203,176,204,197,197, 5, 23, 46, 92, 80, 23, 21, 21, 29,171,193,138,113,252,247, 35,135, 59, 13, - 29, 56,144,175, 45,149, 66, 91, 42,133, 78, 42, 5, 85, 90, 12,162, 76, 10, 30,165,131,152, 79,195,199, 79, 4,157,194, 1,135, -175, 38,106, 85, 42, 85,181,137, 13,165, 82,233,241,243,209,209,157,223, 12, 8,224, 94, 24, 63, 30, 26,173, 22,239,221,191, 95, - 33,174, 52, 26, 13, 14, 54,111, 14,138, 32,240,198,232,209,120,168,211,233,164, 82,233,241,127,227,197,112,227,198,141,252, 33, - 67,134, 36,208, 52,221, 18, 47,104,210,204, 23, 1,173, 86, 91,197, 26, 69, 81, 84,185,213,177,220,114, 32, 56,124,248,112,167, -164,164, 36,254,173, 91,183,112,238,220,185, 55,118,236,216,241,141,191,191,127,243,140,140,140,220,154,196,155,185,164,191,208, -251, 31,238,217,185, 23,159,127,254, 57,145,155,155,139, 93,187,118,161,166,228,169,255, 4,134, 15, 87,210,209,209,162,186, 48, -241,123, 50,147, 82,225, 47, 88,153, 82,193, 18,167,114,120,185,149, 76, 20, 93,158,108, 84, 57,188,124, 56, 80, 20, 93,163,165, - 12,195,149,195,165,122,135,248,156,231,192, 41,131,142, 18,171,207,236, 44,235,125, 36,163, 52, 62, 71,177, 16,192, 31, 80, 82, -204,195,235,204,141, 86,173, 92, 61, 0, 64,165,164,124,130,131,131,195,184, 92,174, 0, 0, 28, 28, 28, 90,185,187,187,175,123, -242,228, 73, 7,115,199,180, 79,159, 62,237,188,188,188,254,119,244,232,209,196,156,156,156,219, 0, 46,155, 22, 10, 10, 10,154, -125,247,238,221, 54, 60, 30,143,168,225, 28, 1, 0,132,133,133, 53, 18, 10,133,238, 71, 30, 56, 67,202,111, 0,134, 83, 2,112, - 69,160, 92, 90, 32,157,223, 4,126,126,151,220,139,138,138,222, 40, 41, 41, 73,180,241,208,119,249,240,195, 15,127,138,142,142, -246, 11, 11, 11, 99,174, 95,191, 78,154,142, 34, 4, 5, 5,245,136,143,143,111,249,217,103,159,109,216,189,123,247, 23,168, 28, -105, 91, 19,210,245,249, 6,159, 27,142, 39,227, 4, 64, 5,232,109,102,172, 66,249, 15,192,150,148, 11,207,144,158,225,153,154, -104,209,128, 97, 97,249,155,250,156, 88,111,106,181,218,191,110,220,184,113,112,192,128, 1,101, 79,158, 60,129,187,187, 59,234, -213,171, 7,130, 32,176,110,221, 58, 69,106,106,234,175,250, 92, 90,111,102,103,103,191,175, 23, 91,230, 80,186,102,205,154,221, -219,183,111,119, 73, 72, 72,224,232,116, 58,167,198,141, 27,203, 47, 94,188,232,192,227,241, 24, 62,159, 79, 39, 36, 36,216, 5, - 5, 5, 41, 9,130, 16,254,249,231,159, 79, 46, 93,186,228, 63,117,234,212,173,168, 28, 38,110,138,157,139, 22, 45,202, 74, 73, - 73,129, 74,165,130, 84, 42, 69, 73, 73, 73,197,167,184,184, 24, 37, 37, 37,224,241,120,200,205,205,197,190,125,251,114,244, 89, -226,171,179,108,172,253,113,221,250,130,156,140,116, 56,217,137,161,147, 22,131, 42,121, 2,148,150, 64,160,213,192,158, 71,161, -110, 3, 49, 68,118, 78,200,147,150, 33,250,226,213, 92,125,150,120,203,230, 2,181,122,237,184,149, 43,243,116,124, 62, 2, 34, - 34,160,209, 15, 21, 26, 11, 45,138, 32,224,223,181, 43, 72,103,103,124,251,235,175,121,250, 44,241, 47, 20, 52, 77,115,212,106, -117,117,253, 0, 77,211,153, 73, 73, 73,187, 1,156, 38, 8,130, 33, 8,130, 65,121,178,182,178, 87,249, 66,214,106,181,152, 59, -119, 46,248,124, 62,230,206,157,139,121,243,230,225,251,239,191,199,250,245,235,241,203, 47,191,224,240,225,195,245,207,159, 63, -207, 63,123,246, 44,179,100,201,146,194,160,160, 32,206,232,209,163, 93,196, 98,241,164,234, 56,167, 77,155, 6, 71, 71, 71, 76, -155, 54, 13,203,150, 45,195,150, 45, 91,112,240,224, 65, 92,184,112, 1, 28, 14,135,206,204,124, 12,165, 82,201,172, 89,179, 38, -235,224,193,131,138,213,171, 87,131,203,229, 18, 47,233, 38, 49, 73, 47,168,140, 45, 65,166, 41, 21,158, 0, 88,133,154,125,163, - 44,113, 66, 20, 29, 93, 87, 47,142,146,141, 4,209, 33, 0,147, 81,125,120,181,129,227, 11, 0, 62,207,129,115,150,120,200,156, - 36,151,205,247, 30,197,231, 40,102, 1,248,221,208, 39, 39, 39, 39,241,254,253, 7,184, 0,240,107,236, 62,222,253,251,247,157, - 15, 28, 56, 32,242,242,242,194, 47,191,252, 34, 18,139,197, 94, 22, 56,169,131, 7, 15,170, 4, 2,129,251,168, 81,163,122,182, -105,211,102,162,254, 69,180, 43,128,166, 40,143, 94,236,254,232,209,163, 59, 30, 30, 30, 15,142, 29, 59, 38,179,230, 0,149,150, -150,110,253,249,231,159,235, 61,165,220,112, 68,246, 33,162,233,229, 56,236,242, 19,210, 3,230,193,174, 78,107, 12, 30, 60,184, - 14, 69, 81,155,109, 60,238,131,251,245,235,247,115,116,116,180,223,168, 81,163,114,175, 95,191,158, 7, 32, 26, 64,140,241,231, -238,221,187,133, 31,127,252,113,206,230,205,155, 37, 3, 6, 12, 88, 15,160, 63,251,232,103,193,162,242,187, 16,106,138, 58, 52, -243,192,173,248,157,159,159,191,166,168,168,232,194,195,135, 15, 39,168,213,106, 9, 65, 16, 12,159,207,207,205,203,203, 91,109, -148,176,212,156, 95, 73, 55,232,115,109, 16, 4,161,101, 24, 38,179, 75,151, 46,147,186,118,237, 26, 21, 23, 23,167,236,220,185, - 51, 98, 99, 99, 61,186,116,233, 34,167,105,154, 57,114,228,136,199,187,239,190, 43, 63,125,250,180,108,204,152, 49,141, 27, 54, -108, 56,122,218,180,105, 5, 4, 65,208,230, 56, 13,207,178,226,226,226,126, 61,123,246,188,240,235,175,191, 58,185,184,184, 64, -167,211, 65, 46,151, 67, 46,151,131, 97, 24, 56, 59, 59,163,160,160, 0, 11, 23, 46,148,150,148,148,124, 96, 70,184,153,114, 42, -149, 74,101,255, 47, 38, 78, 62,190,122,193, 92, 71,255,250,245,241,228,158, 18, 58,165, 28, 60,134, 68,221, 70,206,224, 11,196, -120,120,191, 20, 83,118,239, 47, 85, 40,149,225,102,222,150,171,112,150,148,148,244, 31, 62,111,222,137, 13, 83,167, 58,252,207, -219, 27, 28, 14, 7, 42,149, 10, 20, 69,129,199,227, 33,116,248,112,240, 61, 61, 49,123,247,110,153, 84, 42,237,143,170, 83,241, -152,114, 62, 15, 24,115,126,113,227,198,141,143, 67, 66, 66, 48,118,236, 88,244,235,215,175, 82,193, 3, 7, 14, 96,253,250,245, - 80,169, 84, 31, 3,184, 14, 96, 29,202,135, 58, 96, 34,178,254,233,118, 62,119, 78,138,162,138,238,223,191,239,180,124,249,114, - 66,163,209, 96,193,130, 5, 48, 8, 78,195,121,253,229,151, 95,214,113,116,116,196,252,249,243,213,133,133,133,239, 44, 91,182, -236,100, 76, 76,140,199,214,173, 91, 7, 3,152,102,202, 73,211,116,254,205,155, 55, 29, 55,108,216, 64,234,116, 58,172, 88,177, -162,202,240,228,200,145, 35,161,209,104,193,225,112,213, 74,165,170,169, 88, 44, 78,118,119,119, 23, 51,149,157,187, 94,228,254, -244, 69,121, 10, 3, 99,199,119,181,177,127, 22, 44,167, 84,176,133,179, 64, 20, 29,221, 89, 57,124,248,105,189, 32, 74,210,151, -137, 53,152,244,109,224, 52, 8,194,218,112, 30,215,127,106,132, 82,169, 68, 65, 65, 1, 10, 11, 11,225,226,226, 2, 14,135, 67, - 88,106,167, 74,165,186, 53,101,202,148, 27,155, 55,111,238, 22, 31, 31,223,247,236,217,179, 93, 78,156, 56,161, 76, 79, 79,215, -105,181, 90, 70, 34,145,112, 59,116,232, 32,234,213,171,151,189, 80, 40, 36,103,205,154, 85,184,120,241, 98, 15, 84,246, 97, 51, -237, 59,135, 32, 8,124,221,169, 20,211,186,112,160, 86,107, 80, 92, 92,140,172,172, 76,220,185,115, 7,241,241,247,192, 48, 12, -105,195,113,119, 7, 48,107,215,174, 93,190, 2,129,128,216,189,123,119,157,221,187,119,215,104, 73,221,177, 99, 71,157, 61,123, -246, 68,234, 71, 47, 50, 95,197,235,157,229,252,215,114,190,202, 48,205, 12,143, 26,133,150,254, 62,255, 38,244,147,146,106,181, -218, 43,102, 82, 56,124, 3, 96,174,145, 21,172, 38,115,158,148, 97,152,115,221,186,117,251,178,107,215,174, 43,123,244,232,145, -147,147,147, 19,184, 98,197, 10, 63,157, 78,167,185,115,231, 14,153,156,156,156,126,237,218,181, 6, 13, 27, 54, 28,125,247,238, -221, 51, 4, 65,104,172,232,224,157,228,228,228,246, 93,186,116,217, 55,122,244,104,255,118,237,218, 9, 92, 92, 92,192,229,114, -145,146,146,130,196,196, 68,245,158, 61,123, 50,139,139,139,109,153,130,231, 74, 90, 86, 86,247, 1, 95, 77,248,117,116,191,190, - 30,109, 27, 55, 18, 72, 36, 18, 64,161,192,189,140, 92, 92,186,151,168,217,114,238, 82,129, 74,165,234, 15,235,167,224,185,114, -237,225,195,110,239, 76,157,250,107,228,208,161,222,200,201,225, 74, 36, 18, 8, 4, 2,164,166,166, 34,153,166,117, 75, 55,110, -204,211,139,172, 23,157, 21, 94, 8, 96, 57, 77,211, 92, 0, 16,139,197, 24, 55,110, 28,140,167,220, 89,191,126, 61, 20, 10, 5, - 0,112, 9,130, 88, 14,224,167, 87,221,138,101,192,211,167, 79,103,191,247,222,123, 75,184, 92,174,197,172,183,174,174,174, 40, - 45, 45,133, 78,167,163,178,178,178,238,185,186,186,130,199,227,129, 97, 24,179,215,209,147, 39, 79,102,247,239,223,127, 17, 73, -146,150, 44, 31,112,114,114, 74, 63,121,242,100,240,103,159,125, 70,110,219,182, 45,101,212,168, 81,194,147, 39, 79, 82, 12,195, -236,123,209,251,160, 99,199,157,192,134,225,225, 0,194,129, 42, 14,239, 89,250,101, 54,165, 84,232,216,113, 39, 54,224,111, 78, -227, 97, 60,131, 32,210, 91,161,154,136,162,163, 87,162,220,207,162, 90,238,142, 59, 59, 98,195,112, 60, 87, 78,107, 96,172,125, -101, 50, 25, 40,138,170,206,154,247, 87,108,108,236,202,107,215,174,121,126,249,229,151,129, 67,135, 14,117,234,210,165,139,131, -113, 1,133, 66, 65, 31, 58,116, 72,182,126,253,250,146,115,231,206,165,141, 28, 57,178, 93,117,237,204,200,200, 56,252,237,183, -223, 58,247,234,213,171, 33,128, 10,255,172,130,130, 2,164,167,167,227,214,173, 91,233, 26,141,230, 55, 27,186,244, 4, 64,228, -160, 65,131,150,111,223,190,189,206,168, 81,163,114,247,236,217,115, 11,229, 9,139, 77,225,210,175, 95,191,230,219,183,111,151, -140, 26, 53, 42, 23,229,126,100,153, 96,193,130,133, 1,157, 81,213, 79,171,218,145,137,159,213,106, 53,163, 84, 42, 25,185, 92, -206,148,149,149, 49, 48, 63, 11,252,193,236,236,108, 38, 51, 51,147,201,200,200, 96,210,210,210, 24, 0,191,152, 40, 94,115, 55, - 44,251, 29, 59,118, 52,240,245,245, 93, 96,103,103,247, 7,135,195,145,114, 56, 28,169, 80, 40,252,221,221,221,125,222,210,165, - 75,125, 25,134,225, 87,163,162, 45,129,203,227,241, 62,243,242,242, 58,232,230,230,150,233,234,234,154,233,229,229,117,144,199, -227,125, 14,128, 87,131, 50,183, 4, 17,151,203,157, 98,111,111,127, 92, 40, 20,230, 11,133,194,124,123,123,251,227, 92, 46,119, - 10,170, 79,164, 90, 45,167, 64, 32,152,226,233,233,121,220,201,201, 41,223,201,201, 41,223,211,211,243,184, 64, 32,120, 22,206, -103,121, 43, 49, 8, 45, 57,163, 7, 65, 16,218, 55,222,120, 99, 67,203,150, 45,215,181,108,217,114, 93,139, 22, 45, 54,233,173, -146,140,222,218, 34,135,229,228,141,255,100, 59, 95, 26,103,104,104,104,204,246,237,219,233,217,179,103, 75, 27, 54,108,248,116, -246,236,217,210,237,219,183,211,161,161,161, 49,181,229,244,246,246, 14, 8, 13, 13,125,186,121,243,102,221,253,251,247,153,205, -155, 55,235, 66, 67, 67,159,154,100,134,127, 17,125, 39, 0, 4,233,173, 63,191, 1,216,139,114,231,119, 95, 0,196,112,229,112, - 70, 31,125,248, 7,128, 30, 22,142,189,181,156,126,202,225,195, 25,189, 79,213, 49, 0, 73, 70,255,195, 80,217,255,235, 69,112, -154, 69,211,166, 77, 31, 50, 70, 80,171,213, 76, 65, 65, 1,115,255,254,125,230,220,185,115,140,159,159,223, 67, 43, 56,221, 1, -140, 1,112,200,199,199,231,238, 91,111,189,149,209,190,125,251,140,128,128,128, 20, 30,143, 23,143,242, 12,239,161,250,207,114, - 0, 13,107,224,124,203,197,197,229, 91, 63, 63,191,223,130,131,131, 47,212,171, 87, 47,222,205,205, 45, 78, 36, 18,125,135,191, - 51, 99,219,122,206,119,249,240,195, 15,211,203,202,202,168, 86,173, 90,221, 53,183, 81, 72, 72,200,249,178,178, 50,106,224,192, -129,153, 0,250,252, 23,174,119,150,243,165,112,254,167, 16,172, 23, 76, 7,141, 62,223,152, 41,247,141, 73,153,159,245,219,214, -120, 32, 24,134,225, 48, 12, 99,207, 48,140, 51,195, 48,110, 12,195,184, 48, 12,227,192, 48,140,176, 6,243, 55,123, 98,255,115, -156, 95,232, 5,148, 92,255,219, 20, 53,173,127,173,247,167,175,175,175,107,155, 54,109,190,218,191,127,255,148, 71,143, 30, 77, -217,191,127,255,148, 54,109,218,124,229,235,235,235,250, 44,237,244,246,246, 14,104,210,164, 73, 84, 72, 72, 72,102,147, 38, 77, -162, 76, 68,214,139,236,187, 64, 47, 98, 66,244,159, 64,253, 50, 2,229,185,176,214,234,133, 77,144,133, 55, 53, 91, 56, 13,124, -191, 1,120, 87,255,249, 77,191,204,239, 37,112, 86, 65,253,250,245,143, 54,111,222,252, 97,139, 22, 45,146, 91,180,104,241,176, -105,211,166, 15, 27, 55,110,252, 48, 40, 40,232, 97,221,186,117, 31,122,120,120, 28,173,197, 49,114, 3, 32, 65,213,105,192, 94, -246, 57,223, 57, 52, 52,244,146, 72, 36, 50,155, 27,140,203,229, 70,182,104,209,226, 38,202, 35, 37,217,251, 39,203,201, 10,173, -127, 17,216,147,240,213,227, 20,162,250,105, 70,106, 90,207,238,207, 87,155,211,236, 92, 93,122, 33, 19,168, 23, 56,130,231,192, -105,204,103, 56,167,130,140, 68,211,203,224,100,207, 37,150,147,229,100,133,214,115, 7,151,221, 5, 44, 76,160,122,198,245, 44, - 94,109,216,146, 19,235, 89, 56,205,241, 61,122,201,156, 44, 88,176, 96,241,188,238,157,157, 1,156, 49,188, 21, 90, 82,165,182, - 68, 19,212, 70,217,158, 96, 57, 89, 78,150,147,229,100, 57, 89, 78,150,243, 63,199,105,192, 74, 11,203,239,153,252,223,244,138, - 10,175, 23,146,166,135, 53,171,178,156, 44, 39,203,201,114,178,156, 44, 39,203, 89, 91,140,126, 69, 69, 86,152,225, 15, 59,116, -200,130, 5, 11, 22, 44, 88,176, 96,241,252, 80,115, 30,173,189,123,247,114, 12,191, 7, 13, 26, 52,146,162,168,175, 12,255, 57, - 28,206,143,187,118,237,250,169,186, 26, 34, 34, 34,168,234, 56,205,161,166,122,204,113, 54,109,232, 52,214,221,217,110, 66,113, -137,124, 85, 74, 54,117, 78,169, 84, 54, 49,172, 19,137, 68, 73, 63,253,244,211,131,231,221,206,145, 35, 71, 54, 52,173,167,158, - 31,175,179,155,163,104,220,211,226,178, 21,183, 31,150,109, 98,207,177,151, 2, 15, 0,125, 28, 69,252,247,155,186,240,223,186, -245, 68,121, 81,166,161, 14,161, 60, 26,182,232,117,236,176,143,143, 79, 99, 39, 39,167, 97, 0,154,202,229,114, 47, 59, 59,187, -124, 0,119,164, 82,105, 76,110,110,238, 61,107,121,194,234, 33, 29,128,191,254,111,198,153, 52, 4, 88,179,174, 38,244, 8,130, -146, 1,132, 4, 1,205,177,228,191,157,209,223,109, 0, 37,205, 84, 93,222,163, 1,212, 12, 3, 62, 1,168,142, 61,130,232, 53, - 58, 84, 78, 0,186,163, 60,133,195, 13,148,167,159,144,179,151, 44, 11, 22,175, 21, 76,135, 10, 43,254,115, 45,136,137, 78,124, - 46, 17,197,128,113, 1, 24,119,149, 74,197, 19, 8, 4, 80,171,213,176,179, 19,175, 29, 51,106,228, 2,144, 40,214,234, 48,238, -167,159,126,170,245, 76,215,182,212, 3,224,148,233,246,174, 78,226, 69,167, 15, 77,119,237,212,123,233,119,234,212,194,105,165, -165,165,164, 80, 40,132, 74,165,130,179,179,115,251,177,163, 71,183, 34,121,140,154,207,183,191,184,114,229,202,220,218,182,115, -210,164, 73, 62, 26,141,242,109,154,166, 5,106,181, 90,104, 90,143,179,157,253,210,211,135,166,219,133,245,249,110, 1,192, 10, -173,151, 0, 65,128,171,253,153, 85,131, 58,135,188,213, 52, 24,244,157,179, 80,170, 53,239,159,206, 44,123,127, 94,124,246,228, -204, 50, 77, 75, 60,135,132,149,255, 34,112, 2, 3, 3,191,244,244,244, 28,184,113,227, 70,126, 96, 96, 32, 68, 34, 17, 20, 10, -133,228,209,163, 71,146,177, 99,199,134,137,197,226,221, 41, 41, 41,107, 97,221, 68,112,254,167,127,158, 3, 0,104, 63,108,161, - 63,202, 39,139,150,155,174,235, 60, 98,161, 63,128,169,168, 60, 49,114, 14,202, 83, 40,152,187,235, 8,226,182,127,143,247, 63, -158,194, 5, 48,182,162,241, 36,240,251, 47,171,209,115,208,132, 74,203, 9, 6,220, 67,219,191, 71,159,143,167, 88,156, 71,241, -221, 96, 66, 75,211,140, 69, 75, 60, 73, 18,186, 63, 30, 50,230, 38, 24,206, 67,121, 14,176, 42,148, 40,159,208,217,108,249,222, -141, 57,121, 26, 45,101, 54,225, 44,159,199,201, 63,124,143,170,178,237,240,255, 65,171,165,202,239,173,124, 46,168,131, 41,206, -167,103,205,154,197,237,211,167, 15,182,108,217,210, 97,211,166, 77,163, 75, 75, 75,255,212,239,183,100,246,242,101,193,226,181, - 22, 92,230,133, 22,151,131, 13,191,253,250, 83,131,188,252, 66, 12,255,236,107,236,220,185, 19, 69, 69, 69,112,117,117,133,128, -207,231,173, 90, 62,199,199,201,201,222,103,248,232,105, 27, 0, 52,174,109,107,108,172, 39,216,116,123, 66, 63,149, 14,151, 67, -242, 4, 2, 1,185,123,247,110, 20, 23, 23,195,197,197, 5, 2, 1,143, 92,249,221, 55, 98, 39, 39, 7,241,167, 95,204,232,128, -242,252, 63,181,130, 90, 93,214, 97,255,206,159,156, 10, 10, 10, 48,226,243,105, 48,173,135,207,231, 83,134, 7, 11,123,142,189, - 20,204,218, 56,238,227,144,102,142,128,230,246, 5,240, 56, 28,216, 57,187,162, 59,151, 3, 14,129, 38,195,255, 72,155, 9, 96, -222,235,210,217,192,192,192, 47, 35, 34, 34, 6, 46, 90,180,136, 79,146,229, 41,231,100, 50, 25, 20, 10, 5,124,125,125,113,250, -244,105,254,236,217,179, 7, 30, 56,112, 0, 41, 41, 41,107,108,229,191,125,251,118, 61,127,127,127, 37, 0,244,109,238,104,186, - 46,192,176, 14, 0, 28, 29, 29,107,228,115,119,177, 87,221,190,125,169,169, 97,187, 47,187,250, 82, 22,150, 43, 1,216, 85,199, - 69,211, 12,247, 88,212, 88,139,235, 63, 91,180, 67,119, 99,239,185,198,129,129,129, 10,227,229, 14, 14, 14,150, 54,241, 46, 43, - 43,243, 55, 93,104, 40,175,209, 82, 94,150,234,235, 49,110,189, 89, 1,166,165,192,221,177, 99, 7, 0,224,135, 41, 67, 56,155, - 47, 23,114,185,220,242, 91,237,242,229,203, 17, 25, 25, 41,248,227,143, 63,122,109,223,190,189,215,193,131, 7, 87, 89, 18,170, - 44, 88,176,120, 37, 69,150,241,183,101,161, 69, 18,132,163,147,163, 3,194, 7,143,193,209,163,191,163, 83,167, 78, 21,235,234, -215,175,143,136,254, 31, 96,215,207, 43, 1,192,241, 89, 90,244,172,245, 20,149,200,230,245, 28, 24,181, 48, 35,183, 44, 62, 46, - 46, 14, 29, 59,118,172,180,253,224, 1,225,248,101,235,114, 84,147,101,222, 42, 16, 12,201,119,116,178,199,160,225,159,195, 92, - 61,163, 71,244,139,123, 55, 98,117,183,188, 39,178,149,236,121,246,226,209,192,199,189, 71,243,144,198, 40,218,183, 22,137,197, - 74, 28,205, 86,226,211,238,109, 17,234, 38, 70, 71, 29, 5, 31,123,222, 59,185, 50,237,107,109,100,132,121, 0, 0, 32, 0, 73, - 68, 65, 84, 33,180,124,124,124, 26,123,122,122, 86, 18, 89,165,165,165, 40, 43, 43,131, 84, 42, 69,105,105, 41, 72,146,196,180, -105,211,248,103,206,156, 25,232,227,227,115,194,138, 97,196, 12,189, 37, 11,224,240,202,230,206,157,171,242,242,242, 82,217,217, -217, 49, 92,190,176,180,243,136,133,142, 0, 64,114,249,165,171, 86,173, 82,251,250,250, 42,185, 92,174, 96,194,132, 9,164, 53, -109, 86,169, 84,140, 49,167, 90,173,170, 88,190,116,233, 82,181,183,183,183,202,206,206,142,209,104,172, 55, 58,222, 76,125, 10, - 33,159, 3, 33,159, 3,145,128, 7,199,122,109, 32, 44,186, 5,157, 78,135,101,203,150,105,124,124,124,212,118,118,118,140, 64, - 32,224,143, 31, 63,190,198,118,142, 28, 57,146,113,113,113,209,216,217,217,241, 35, 35, 35,171, 68, 10,157,188,145, 5,177,128, - 7, 59, 33, 23,193,245,253, 32,100, 20, 86,183,149,195,169,236,141, 32, 20, 10,209,161, 67, 7, 52,109,218, 20, 7, 15, 30,236, -204, 10, 45, 22, 44, 94, 11, 88,140, 48,228, 2, 64, 92, 92, 92, 24,202, 39, 68, 68,159, 62,125,136,242, 45, 24, 76,253,178, 63, - 62, 29, 49, 8, 20, 69, 87,204,243, 69,144, 4,190,248,164, 23,104,218,154, 17,137,154, 67, 60,107, 81, 79, 5, 39, 67,144, 28, - 0,104, 16, 32, 97, 70,127, 58, 20, 20, 77,255, 61, 80,194, 1,198,140,232, 89,190,236, 57,180,147, 3, 10, 95,143,253, 8,230, -234,105,220,160, 14,169,211, 40, 65, 84,158,236,241,159,152,108,147,229, 52,131,166,117, 37, 65, 90,133, 2, 74,165, 22,209,247, -158, 42,142,103,201,188, 72,151,180,130,213,225,237, 68,156,130,108, 4, 56, 10,130,115,101,218,215,162,239, 78, 78, 78,195, 54, -110,220, 88, 69,100,229,229,229,145,101,101,101,208,104, 52,116,105,105, 41, 40,138,194,140, 25, 51,120,179,103,207, 30,150,155, -155, 27,105,208, 60,230, 56,245,126, 87, 83,111,223,190, 29, 48,107,214, 44,205, 59,239,188,147, 81,191,126,125, 25,135,195,129, - 68, 34, 89,221,189,123,119,183, 69,139, 22,105,122,245,234,149,198,225,112, 16, 28, 28, 44,187,117,235, 86, 0, 0,177,181,125, - 55,230,252,233,228,143, 12, 0, 16, 4,129,238,221,187,167, 7, 7, 7,203, 56, 28, 14, 30, 28, 90,202, 88,187, 63,121, 92, 18, - 13,125,157,245, 55, 17, 2, 16, 59, 84,120,226,117,239,222, 61,179,113,227,198,101, 36, 73,226,230,205,155,126,168, 58,173, 85, - 21, 78,177, 88,172, 29, 60,120,112,198,189,123,247,204,149, 7,151, 67,162, 93, 99,189, 1,203,183, 37,144,121,222, 98, 59,121, - 28,232,102,127, 57,132,235, 34, 2,132,142, 30, 42,169, 84, 10, 39, 39,167,114, 11,153, 70,131,191,254,250, 11,111,189,245, 86, -216,222,189,123,207,176,215, 59,203,201,114,254, 13,115, 90,228, 21,180,102, 25, 79,116, 95,201, 71,235,180,105,167, 40, 74,135, -250,254,222, 88, 58,103, 36, 40,138, 6, 69, 81,208,233,191, 41,138,130, 86,163,121, 46, 45,123,150,122, 92,157,196,139,126,223, - 61,206,245,157,126,203,187, 46,153, 53,226, 56, 69, 1, 52,173,133, 86, 11, 80,180, 22, 52, 69, 65,171,125, 62,174, 57, 90,154, - 70,128,159, 15,150,204, 26, 1,211,122, 98,118,237,237,123,242,183,105,118,157,250,124,247,245,131,116,249, 50, 86,216,191, 88, -136,248, 66, 46,195, 21, 65,173,214,161, 84, 77,171, 1,200,148, 90, 90,195,216,123,136, 0,128, 75, 18,175, 83,116,109,211,192, -192,192, 74, 34,235,251,239,191,247, 88,183,110,157, 47, 0,244,239,223, 63,171,107,215,174,133,247,239,223,135, 68, 34, 33, 10, - 11, 11,123, 3,152,160,223,118, 42,128,117, 22,120,101,254,254,254, 74, 79, 79, 79,149, 65, 16,145, 36, 9, 46,151, 11,127,127, -127,165,151,151,151, 42, 56, 56, 88,198,231,243, 65,146, 36, 12, 66,207,170,215, 60,130, 0,135,195,129,129,211,212,218, 99,224, -180, 5, 60, 46, 89,245,246,102,196, 73,146,164,217,250, 44,158, 67, 34, 17, 3,192, 98,121, 14,105,116,123,228, 86,239, 33, 16, -253, 23,120, 0, 78, 51, 12,131,235,215,175, 35, 37, 37, 5,124, 62, 31, 62, 62, 62,136,140,140,132, 74, 85,174,119, 35, 34, 34, -194, 0,220,100,175, 96, 22, 44, 42,112,250, 21, 20, 88,166, 86,173,234,125,180,226,226,226,194,250,244,233,115,198, 32,128,202, -197,142, 25,241,163,213, 65,171,213, 0, 12,243, 92,132,150,165,122, 40,138,174,182, 30,131,143, 22, 77, 51, 92,179, 34,139,166, -161,211,106,159,203,222,163, 41, 45,104, 90, 11,115,245, 16, 4, 73,233,111,248,124,246, 58,121,241,240,241, 15, 32,181,254,245, -113, 78,167,132,175,187, 80,128, 66, 5, 2, 27,133,112,254,146,107,113,225, 70, 18, 60, 28,156, 94,155,227, 34,151,203,189, 68, - 34, 17,100, 50, 89,133, 37,107,221,186,117,190,106,181,154, 4, 0, 46,151,231, 87, 64,251,138, 40, 26,112,118,202, 65, 81, 81, -137, 59,195, 48,132, 94,240, 44, 7,240, 19,170,201,238,207,231,243, 43, 4,138,177, 0, 18, 10,133,181, 18, 48, 6, 24,196, 25, -159,207, 55,187,220,116,120,173, 38,240,141,133, 22,152,114,171,150,137,216,226,112, 56, 48,248, 70,213, 4,129, 64, 80,209,119, -115,224,114,140,234,227,216,238,138,169,209,104, 80, 86, 86,134,226,226, 98,136, 68,229, 6, 51,134, 97, 64, 16,196, 4, 0, 19, -217,171,152, 5, 11,243, 90,228, 21, 22, 91,230,133, 22,202, 77,118, 4, 0,232,180, 26,179,226,103,239,161, 11,200,200,149,193, -199,227, 10, 24, 27,179,158, 14, 28, 56,240,103,137, 68,210,206,240, 95, 40,118,112, 31, 61,110, 62,116, 58, 13, 28,197, 36, 62, - 27,214,179,146,200, 42,183,104,169, 45,206, 9, 82, 84, 34,155,215, 51, 98,205, 66,103, 39,247,120, 83,241,179, 36, 58, 33,188, - 72,170,242, 35,201,171, 40, 34, 36, 84,196,152,249, 35,141,110,238, 55,118,175,159, 59,217,106,123, 32, 65,242,194,199,174, 30, -205,112, 29,154,216,145,165,103,167,143,104,187,223, 88,204,185,185,185,197,245, 8, 95,213, 45,239, 41,235,163,245, 50,224,232, -236, 66,250,181,238,140,214, 19,162,112,242,155,233, 12, 80, 4,119,137, 47,217,229,203,197,112,104,221, 23,151, 62, 27, 70, 3, - 79, 95,139,190,218,217,217,229,203,229,114,137, 66,161,128, 84, 42,133, 84, 42,173, 44, 8,120, 60, 98,244,231, 95,121,240,248, - 2,104, 53,106, 28,141, 89, 92, 35,167, 33,133, 67,223,230,142,224,240, 4,165,119, 2, 3, 87,115,185, 92,144, 36,137, 67,107, -167, 79,216,183, 98,156, 35, 0,220,136, 91, 43, 29, 52,237,199, 53, 36, 73, 66,165, 82, 9,109,105,247,227,199,143,253, 84, 42, -149, 82, 47,208, 12,194, 15,169,169,169,117, 85, 42,149,194,120,185, 53, 16,219, 57, 2, 46,245, 1, 59,175, 42,214,179,180,180, -180, 58, 90,173, 86,206,229,114,161, 86,171,173, 82, 69, 36, 73,242,111,222,188,233, 71,211,180,217,242, 77,131,234, 0, 62,205, - 1,129,179,213,125,102,172,120, 17,213,139,173, 23,150, 65,154, 5,139, 87,197,178,245, 10, 94, 19,132,133,223, 21, 66,171,115, - 92, 92, 28, 99,252,134,168,211,106,245, 34,235,111,209, 67, 81, 52,178, 11,148,184,127,255, 1, 86,173, 90,133, 11,151,166, 56, - 47, 90,180, 72, 56,123,246,108,213,192,129, 3, 87,208, 52,221,130, 36,201, 27,248,123,168,162,178, 85,136,166,235, 38, 36, 36, - 4, 26,254,107,181, 90, 56, 58, 58,194,209,209, 17,141,131,253,170,136, 44,138,162,160,169,102,232,208,224,163, 69, 48, 52,163, -213, 82,160,104,186, 66,252, 20, 73, 85,126,191,157,184,222,192,168,120, 35,195,143, 14,109,154, 88, 22,131, 99, 35, 43,250,177, -123,253,220,201,139,182,108, 17, 22, 81,158,227, 7,133,127, 26, 26, 49,104, 24, 6,127,244, 94,152, 74,173, 62,200, 33, 25, 90, - 91, 81, 31, 72, 48, 48,245,209, 98,241,130,144, 92, 44,211,242,132, 98, 56,248,212,195,131, 50,138,207,225,112,174, 60, 42,150, -243, 73, 14, 23, 36,151,143, 59, 69, 74,237,107,212,221, 59,201,201,201,146,186,117,235, 66, 42,149, 66,167,211,209,253,251,247, -207,226,114,121,126, 92, 30,143,232, 51,232, 43, 58, 55, 55, 91, 75,146, 28, 48, 12,133,247, 34,198, 18, 66,145,152,175, 81,171, -117, 40, 31, 58, 52,103,205, 50, 78,225,224,216,189,123,119, 55, 67, 36,224,190, 21,227, 28,141,214, 57,181,106,213,202,205, 56, -234,208, 74,107, 17, 49,112,224, 64,177,191,191, 63, 1, 0, 87, 99,102, 25,172,103, 68,223,190,125, 69,254,254,229,126,248,127, -174, 29,103, 53,167,135, 29, 3,148,164, 2, 37,105, 85, 44, 89,125,251,246, 21, 6, 6, 6,218,116, 45,234, 29,224, 45,230,238, -178,231,234,128,220,235, 86,113, 13,255, 31,180,190, 14,224,174,120,143,132,192,193, 93,213,110,250, 31,151, 89,177,197,130,133, - 85, 48,209, 34,175, 20,194,244, 2,177,179,254,187, 66,112,113, 1, 64,111,162, 35,140,116, 22,180, 58, 77, 21,145, 69, 81, 20, -120,132, 10,171, 86,173,194,196,137, 19, 1,128, 63,121,242,228,253,139, 22, 45,250,144,166,233, 22, 12,195,116, 36, 8,162,186, -183,198,211, 18,137, 36,143, 97, 24, 30, 73,146, 29,215,174, 93,235,214,171, 87, 47, 56, 58, 58,130,161,153, 42, 34,139,162,104, -104, 52,106,139,211,220,186, 58,137, 23,253,190,119,188,235, 59, 31, 44,239, 74,209,244,113,131,200,162, 41, 10,160,203, 55,122, -146,159,133, 99, 71, 15, 98,195,250, 13, 69, 32,152,187, 96, 64,235,197, 32, 44,136,193, 22,231,175, 38,117,236,208,166, 9, 22, -109,217, 34,188,157,144,179,255,171, 73, 51, 67, 35, 6, 13,195,222, 93, 49, 32,117,197,215,141, 69, 22,165,165, 81, 82, 84,216, -247, 20,235,163,245,178,224,118,236,248,113, 98,216,176, 97,116,105,105, 41,248, 2, 1,173,213,106, 57,111,191,253, 54, 53,113, -226, 68, 50, 55, 55, 23,210,210, 50, 46, 0, 55,188, 6,102, 45,169, 84, 26, 51,118,236,216,176,179,103,207,242, 73,146,132, 84, - 42, 69,151, 46, 93, 10, 11,104, 95,209,232,207,191,242,200,206,206,210, 57,137,185, 42, 62,159,135,252,252,124, 58,172,215, 16, -197,160,145, 19,235, 76,156,181,100, 99,206,197,245,235,172,169,195, 56, 18,208,116,221,230,205,155,213,190,190,190, 74,161, 80, - 40, 24, 49, 98,132, 85,227,135,106,181,154, 89,186,116,169,202, 52,186, 80,173, 86, 51,171, 86,173, 82,251,249,249,169,196, 98, - 49,163,213,214,236,247, 73,146,132,238,179, 69, 59,116, 58,157,174,146, 21,203, 32,178,180, 52, 81, 22, 21, 21,165,241,243,243, - 83,219,217,217, 49, 66,161,144,111, 77, 59,191,250,234, 43,198,213,213, 85, 99,111,111,207,159, 54,109,218, 51, 69, 29,106, 41, -112, 23,173,173, 72,239, 32,116,116,116, 68,105,105,105, 69, 91, 37, 18, 9, 43,182, 88,176, 48,131, 42, 90,228,213,180,194, 89, -151, 71,139, 6,202,242,242, 11,189, 60,188,235, 65,167,211,233, 63, 90,232,180, 90,140, 31, 51, 8, 43,214, 71, 1,128, 65,108, -117,159, 60,121,242,126, 0, 53,222,204,118,239,222,189,112,242,228,201, 78,121,121,121,127,252,252,243,207,110, 67,134, 12,193, -212,169, 83,177,124,249,114,240, 4, 34,184,121,214,173,168,199, 80,111, 97,193, 83, 48, 96,202, 44,216,233, 52,229, 55, 41,112, -221, 61, 3,160,165,180,160,181, 90,104,181, 90, 16,156,242,174, 29, 59,122, 16, 67, 62,249, 10, 60,161,147,235,143,171,150, 41, - 66, 91, 75, 62,156, 61,106,148,202, 10, 35, 32,121, 59, 33,103,255, 87, 19,167,117, 55,136,172, 95, 99,214,223,253, 97,198, 7, - 59,133, 2,110, 69, 61, 90,154, 6, 73,114, 88, 31,173,151, 36,178,132, 66, 97,236,145, 35, 71, 30,182,108,217,146,144,201,100, -208,106,181, 40, 44, 44,196,254,253,251,239, 48, 12, 3, 87, 87, 87, 28, 57,114,132, 30, 50,100, 72,172, 74,165, 10,127,213,197, - 86,110,110,238, 61,177, 88,188,123,230,204,153,131,102,204,152,193,163,105, 26,247,239,223, 7, 8,130,225,241, 5, 32, 73, 18, - 60, 30, 23, 37, 37, 82,218,206,193, 37, 71,195,112,236,120,124, 1, 72, 14,191,186, 48,225, 12,125, 50, 82,144, 92,126,169, 33, - 18,144,207,231,227,210,222,239,165,157, 71, 44,116, 2, 0,190, 80, 92,212,163, 71,143,244, 38, 77,154,200,174, 93,187, 22,128, -170, 81,135,166,215,167,174,223,136,105, 28, 59,177, 72,214,189,123,247, 12, 3,103,218,241, 31,165,195,190,152, 69, 16, 28,129, -172, 79,159, 62,233,161,161,161, 50, 14,135,131,164,131,203,164,253, 70, 76, 19, 17,213, 36, 89,253,227, 33,243,217,141,189,231, - 26, 47, 94,188, 88,219,171, 87,175,199, 6,127,177,180,180,180, 58,189,123,247, 22,174, 92,185, 82,219,187,119,239,204,102,205, -154,149,145, 36,137,132,132, 4,191,234, 44, 85, 6,136,197, 98,237,167,159,126,154,113,235,214,173,218, 70, 29, 86,139,186,117, -235,130,166,105,116,233,210, 5, 74,165,146,181,108,177, 96,241,122,194, 52,143,150,229,204,240, 90,157,246,171, 49, 19, 22,252, - 8, 16, 14, 70,119,129,191, 13, 75, 12,136, 41, 83,190,182, 7, 32, 54,136,173, 73,147, 38,213, 56,205,137,145,200,106, 61,100, -200, 16,124,243,205, 55,248,225,135, 31,168,229,203,151,115,238, 61, 72,213,140,248, 98, 94,177, 73, 61, 96,192,148,209, 90,250, - 43,115,124, 69, 37,178,121, 29,123,127,183, 32, 43, 79,126,126,196,216,217, 21,119, 47, 10,128,148,144, 80, 0,176, 97,253,122, - 25, 79,232,100, 31, 49,104, 24, 0,116,255,113,213,178,253,139,176,165,102,177,197, 16, 33, 95, 77,154,230,106, 16, 89,107, 87, - 46,190,229, 76,228, 69,141,251,250,142,214,184, 30, 0,112,115,196,254,142,189,191,123, 55,255,169,108, 53,123,158,189, 56, 8, - 4,130,133, 39, 79,158,180,111,222,188, 57,241,228,201, 19, 80, 84,249, 17,209,104, 52, 40, 41, 41, 65,105,105, 41, 84, 42, 21, - 90,181,106, 69,174, 89,179,198,126,220,184,113, 11,213,106,245, 23,175,122,191, 83, 82, 82,214,254,246,219,111, 56,115,230,204, -192, 25, 51,102,240,124,124,124, 8,103,231, 60, 66,171, 81, 3, 96,152,130,130, 2,218,206,193, 37,199,195,219, 47, 35, 59, 55, - 63, 68,171, 81,131,166, 52, 22,189,205,245,233, 29,166,220,190,125,187,222,247,223,127,175, 54,142, 4, 28, 52,237,199, 53,173, - 90,181,114,139,138,138, 82,247,233,211, 39,221,224,188,110,141, 51,252,177, 71,152,112,251,246,205,166,166,156,157, 71,127,191, -213,192,105, 28,141,216,247,235,141, 91,131,131,131,221, 66, 67, 67,211,171,227, 13, 12, 12, 84, 72, 36, 18,117,227,198,141,203, -120, 60, 94,185, 37, 75,171,149, 7, 6, 6,210,222,222,222,234, 38, 77,154,148,217,234,180, 47, 22,139, 25,131, 85,204, 28,108, -137, 58,228,113,160, 27, 50,100, 72, 69,102,248, 41,193,193, 57,195,134, 13,147, 76,158, 60, 25, 91,183,110,197,133, 11, 23,170, -136,253,176,176, 48,156, 61,123,118, 1, 94,163,196,186, 44, 88,252,199, 80,125, 30, 45, 83,108,219, 22,243, 39,140,124,154,204, - 97,209,162, 69, 66,189, 37,171,251,196,137, 19,161, 80, 40, 92,205, 20,235, 6,125,174, 13,115, 34,107,217,178,101, 59, 25,134, -241, 3,208,129,162,232,203,155,183,108,235, 98,169,190,136,136,136, 42,156, 12, 65,114, 72,146, 40, 19,240,152,191,214,111,218, -250, 75,165,242,229,206,239,141, 64,224,198,143,171,150, 41, 0,116, 55, 21, 91,248,123,154,145, 10, 78, 3, 62, 31,251,121,133, -200,250,113,213,178,227,161,173,253, 63,156, 61,106,161, 89,113,182,112,222, 24,123,146, 36,222, 54,241,209,170,194,249, 28,192, -114,254,141, 46, 67,134, 12,105,209,182,109, 91,210, 88,100,169,213,234,138,196,157, 6,103,241,172,172, 44,132,133,133,145, 45, - 90,180,104,118,229,202,149, 46,248,123, 58,167, 87,181,239, 84, 74, 74,202, 26, 31, 31,159, 19,115,231,206, 29, 86, 88, 88,216, -187,168,168,216, 61,110,219, 66,244,140, 24, 75,132,245, 26, 44, 83, 51, 92, 81,102, 78, 94,227,211, 71,118,184, 29,221,189, 22, - 26,181,122, 12,128,187,248, 59,189,131, 41,167,220,144,198,161,113,227,198, 50, 99,161,226,239,239,175,172, 83,167,142, 42, 52, - 52,180, 98,185,133,104,190, 42,125,183,149, 83,239,255, 37,171,105,127, 26, 68,155,105,218, 8, 59, 59, 59, 24,196,151, 45,237, - 52,142,182, 52,123,163,172, 57,234,176,130, 83,159,222,161,146, 78,139,137,137,233, 22, 19, 19,211, 26,192, 95, 40,159,235, 80, - 11,148, 15, 37, 26, 57,205,207,215,127,216,235,157,229,252,175,114,190,202, 8,195,223,190, 89, 64,185,175,214, 25,139, 66,171, - 38, 24, 28,223, 1,144,147, 38, 77, 42, 82, 40, 20,174,195,134, 13,171,118,155,220,220,220,173,209,209,209,149, 68,214, 71, 31, -125,244, 73,108,108,236,137,252,252,252, 90,245,202,213, 73,188,232,204,161,233,174, 97,125,190,155, 8, 96,185, 5, 67, 30, 29, -218, 90,242,225,143,171,150,237, 55, 17, 91,219, 1,124,100, 73,149,246,120,239, 3,236,216,246,163,193,183, 75,124,235, 90,214, -209,129,215, 35,205, 70, 43,186, 56, 8, 35,245,237,152,204,250,104,189, 24,240,249,252,206, 51,102,204,224,203,100,178, 42, 34, -203, 84,104, 73,165, 82,220,184,113, 3, 35, 70,140, 16, 38, 38, 38,118,214,104, 52,167, 94,135,125,144,155,155,123, 79,159,140, -116,130, 33,133,131, 80, 36,230, 15, 30, 57,209,175, 34,234,112,247, 90,168,148, 10, 0,224, 90,147,222,129,203,229,242, 19, 19, - 19, 3, 12, 86, 43,141, 70, 35, 52, 44,191,118,237, 90,128, 33,183,150, 82,169,180, 58,234,240,159,226,188,121,243,166,159, 33, - 58,210, 16, 93,200,229,114,249, 9, 9, 9,126, 6, 78,149, 74,101, 85,212,161, 64, 32,224, 39, 38, 38,250, 81, 20,245,220,162, - 14,141,133, 49,202,231, 89,172, 52,215,162,222,183,140, 32, 8,130, 97,135, 13, 89,176,120,229, 97, 26, 41, 89,253,164,210, 53, -193,224,248,110,195, 38,220,186,117,235,246, 24, 52,104, 80, 37,145, 21, 30, 30, 78,237,219,183,239,180, 68, 34,201, 35, 73,242, -158,173,237,168,240,209, 66,149, 55, 72,144, 36,121,163, 67,155, 38, 32, 73,242,198,236, 81,163, 84,139,176,165,146,216, 58,184, -127,207,187,153, 69,119,204, 75, 51, 0,238, 94,190, 24,242,201, 87, 24,242,201, 87,174, 0,218, 3,150,163, 21,171,107, 7,139, -127, 6, 4, 65, 8,234,212,169,115, 75,169, 84,130, 32, 8,168, 84,170, 10,129, 85, 90, 90,138,146,146,146,138,255, 26,141, 6, - 5, 5, 5,240,247,247, 7, 65, 16,175,181, 31,157, 70,163,209,205, 88,240,125, 52,135,203,215,209,180,134,208,104, 52, 35,109, -185,206,103,204,152, 65,194,140,239,213,184,113,227,204, 46,127, 89,156, 51,103,206, 52, 27, 37, 56,110,220,184,106,163, 7, 45, -225,235,175,191,126,110, 81,135,214,223,190, 88,176, 96,241,154,193,108,232, 94,173,132, 22, 73,146, 55,204, 68, 23, 18, 0, 24, -146, 36,111,152,201,114,160,203,200,200, 88,224,226,226, 50, 70, 38,147,253,254,209, 71, 31, 77, 10, 15, 15,167,128,114, 7,249, -218,246,168,168, 68, 54,175,115,223,165,147,139,203, 84, 81,166,235, 76, 45, 79, 6,177,181,118,245,178,117,251, 99,119,133,231, -102,103,174,179,212, 55, 75,130,202, 82,180, 98,137, 84,177,160,115,223,165, 19,139,164, 10,214, 71,235, 5,129,162,168, 99, 98, -177,152, 48, 76,166,108,108,189,146, 74,165,144,203,229,208, 79, 73, 3, 0, 40, 43, 43,131,179,179, 51, 40,138, 98, 94,179, 93, -161, 2, 48, 85,111,173, 2,128,169,169,167,215, 24,159,219, 55,141,215, 85, 99,205,202,177,102,130,104,115,219, 85,183,238, 31, -224,204,171,102,130,232,234,144,103, 35, 95, 30, 0,240,121,156,124, 75,147, 71,243,121,156,252,106,252,246,109,124,111, 32, 24, - 0, 11,216, 43,155, 5,139, 87,247,253,255,101, 85,220,141,229,100, 57, 89,206, 23,194, 41,212,127,172, 93,199,238, 79,150,147, -229,100, 57,255,109,156,230, 48,250, 21, 17, 90,140,153, 15,128, 90, 90,180, 88,176, 96,241,175,131,170,150,235, 88,176, 96,193, -130,197,179,163,202,100,210,198, 43, 44,169, 82, 91,162, 9,106,163,108, 79,176,156, 44, 39,203,201,114,178,156, 44, 39,203,249, -159,227,172,137,219,120,251,209, 0, 54,189, 34, 98,235,165, 4,180,176,102, 85,150,147,229,100, 57, 89, 78,150,147,229,100, 57, -107, 11,118,232,144, 5, 11, 22, 44, 88,176, 96,193,226, 63, 14,219, 18,150,178, 48, 3,255, 15,102,131,198, 76,253,238, 92,134, -199, 7,231,191,110, 93, 12, 15, 15,231,216, 82, 62, 53,213,133,188, 14,201, 15, 78,246,252,190,101, 50,237, 15,244,245,121, 81, - 53,157,136, 30,129, 45, 63,182, 19,217,125,161, 86,171,235, 59, 56, 58,230, 63,125, 82,176,225,105,198,205,181, 70,101,156, 46, - 95,190, 44,105,219,182,109, 54,128, 82,163, 55, 5, 22, 44, 88, 60, 79,184, 52,169, 11,130, 24, 9, 48,127,135, 93,210,204, 29, -148,220,221, 86,169,156,115,200, 39, 32,137,166, 70, 75, 20, 96,176, 25,197, 73,143,107,120,224,184, 36, 39, 39, 7, 52,104,208, - 32, 29, 64,177,105,237,102,214,177,215, 57,139, 87, 25, 97,168,156,176,180,226, 90,120,118,161, 21,252, 81,125,232,200,225, 96, - 48, 20, 4, 18,145, 26,219,191, 86, 60, 65, 31,250,130,230,190, 9,160, 37,192,180,180, 23,139,254,167, 80,107,242,105,134,249, - 24,143,246,252,101, 51, 95,253,240,177,176, 60,157,197, 2,164,198,174,183,137,143,102,102, 93, 61,187, 79,232, 98, 71,160, 65, -171,143,166,161,114, 6,231,218, 66, 0,160, 35, 73,146, 77,237,236,236, 36,114,185,188,128,166,233,199, 40, 31,159, 46,170, 37, - 39, 9,224, 83, 7,123,251,158, 1,142,130,150, 25,133, 37, 89,165, 90,234, 28,202, 19,186, 22, 61,175, 51,170, 92,100,249,108, -154, 56,184,237,136,101,227,187,193,165,243,210,105,114,160, 58,161, 69,248, 53,122,251,224,192, 65, 17,157,191, 28, 61,194,193, -215,211, 1, 57,133, 50,247,245, 91, 99,190,143,137,217,209,103,212,192,238, 61, 1, 96,225,194,133,253,234,214,173, 91,143,195, -225,164,206,153, 51,103,251,188,121,243, 24,194,242, 76,229, 18,253, 57,108,184,225,219, 3, 8, 5, 16, 8, 32, 5,192,109, 84, -206, 50, 94, 27,188, 18,156,190,190,190,117,104,154, 30,229,237,237,221, 59, 47, 47,239, 48, 73,146, 91,178,178,178,178, 95,230, - 93,135, 97,152,141, 4, 65,140,102, 24,102,147, 13,223, 99,108,169, 67, 36, 18,229, 41,149, 74, 47,253,239,124,165, 82,233,253, - 79,245,231, 69,214,245,130,222,191, 63, 59,118,254,118, 79,227, 69, 61, 58, 52, 53,115, 71, 33,154, 30, 59,127,167, 83,229,114, -161,148,133,123, 32,193, 48, 12, 22, 44, 88, 64, 68, 70, 70,126, 18, 20, 20, 20, 76,146,228,253,185,115,231, 86, 74,125, 99,186, -206,232, 58,103,197, 22,139, 87, 21,182, 77, 42, 93, 35,154,132,219, 67,201,132, 3,196,136,176, 54,255,235, 48,230,227,190, 4, -195, 17, 97,240,103,211,117, 54,115, 5,140, 16,130,163, 88,212,188,105,163, 73, 17,125,187,145,173, 67,235, 65,226,233, 12,144, - 60,108, 60,146,230, 30,181,108,206, 58, 0,109,107,209,202,121,143,226,119,122,229, 20, 83, 32, 8,128, 32, 0,146, 0,202,148, - 52,122,244, 27, 62, 15,192,122, 27,239, 74,164,139, 29,129, 73, 59,149, 0,192,121, 14, 7,165,158,167,167,231, 39, 19, 38, 76, -176, 15, 13, 13,117, 17,137, 68, 2,165, 82,233,157,156,156,236, 57,103,206,156, 80,133, 66,113, 8,192, 85, 27, 57,253, 27,248, -213,217, 19, 53,233,211, 55, 91, 4, 6,128,167, 46, 3,173,146,213,125,144,252,240,173,207,215,237,253,236,206, 83,229, 32,212, - 98,202,132,194,194, 66, 2, 0, 60, 60, 60,152,202, 34,171,221,136,149,147,123, 96,210,138, 99,144, 43,213,191, 84,199,225, 86, -239,141, 97, 31,126,248, 65,231,197,179,198, 57,100, 61,209, 32, 49, 85, 1, 55, 7, 62,230, 77, 29, 43, 80,169,180,111,173,219, - 30, 51,250,199,239,166,111,166, 40,234, 29, 0,173, 41,138,186, 6, 96,251,130, 5, 11, 44,221,124, 35, 1,204,212,159,208, 59, - 56, 28,206,241, 46, 93,186,212, 31, 53,106, 20,209,170, 85, 43, 36, 36, 36, 4,238,220,185,179,219,225,195,135, 83, 41,138,186, - 9,224, 62,244,211,158, 88, 1, 30,128, 70, 28, 14,167,249,191,153, 83, 34,145,136,213,106,245,112, 63, 63,191,209,111,191,253, -118,243,190,125,251, 18,141, 26, 53,194,189,123,247, 90, 29, 61,122,116,222,185,115,231,110,102,102,102,110, 18, 8, 4,209, 57, - 57, 57,138, 23,254, 28, 39,136,209, 0,234,232,117,242, 2, 43,190,179, 81,158, 75, 42,199,218, 58,148, 74,165,151, 97, 10, 27, -130, 32,188,254,201,254,216, 88, 87, 18, 65, 16,110,250,178,168,238,155, 36, 73,232,116, 58, 25, 69, 81, 65, 53,112, 54,210,191, - 72, 89,173,117, 1, 84,151, 8, 90, 12, 0, 61,218, 55,125, 10, 2,119, 42, 44, 90, 85, 95, 50,239, 84, 8, 48, 6, 77,143, 93, -184,227, 86,201, 10,102,250, 22,187, 96, 1, 49,111,222, 60,204,159, 63,191, 47,128,142, 52, 77,159, 11, 9, 9, 89, 83,137,146, -166, 43,214,205,155, 55,111,117, 53,215, 57, 11, 22,175, 10, 58,195,150, 73,165, 45,190,255, 4,245,239, 4, 10, 35, 2,220,189, -194,199,143, 26, 32, 14, 13,105, 0, 37, 28,144, 86, 72,225, 72,220, 81, 0,216,109,155,213,105, 64,107, 46, 87, 25,189,108,254, -212,198, 29,223, 12,197,173, 44, 45,174,101, 81,144,167,106,193, 33,181,160,104, 6, 96,160,172,109,175, 51,139,116, 56,127, 95, - 13,146, 0, 56, 36, 64,146, 4, 56,100, 45,201,104,245,131,133,219,174,135, 22,230,209, 0,173,126,240,140, 7,164,105,195,134, - 13,135, 69, 70, 70,186,228,230,230,218, 39, 36, 36, 64, 40, 20,194,213,213,149, 35,145, 72,234,172, 88,177, 66, 49,126,252,248, -222, 26,141, 38, 13, 64,161,149,156, 33,189, 90, 55,191,184,105,217, 66,103,237,229,163, 40,222,245, 43, 56, 36, 3,190,189, 3, -234,139,197, 56,250, 97, 3,183,240,184,212,125, 87,242,100, 33, 0,178,106, 34,187,123,247, 46, 71,165, 82, 13,114,114,114,106, -199,227,241,188, 69,174,245,232,108,110,235, 39, 5, 68, 96, 74,190,151,188,211,228,110,222, 61,127,152,216, 5,147, 86, 28,195, -170,157,151,126,110,137,220,185,213,229,205,182,179,115, 24, 51,254,139, 81, 14,153,133, 26, 44,218, 87,136,109,103,165, 24,222, -209, 17,147,222,115,198,144,193, 3,237,247,254, 26, 59, 6,192,102,163, 77,238,133,132,132, 16,119,239,222, 53,119,243,117, 5, - 48, 93,173, 86,147,124, 62,159, 16,137, 68,195, 22, 47, 94,172, 25, 60,120,112,166,161, 64,199,142, 29,209,177, 99, 71,162,180, -180, 52,240,212,169, 83,129, 49, 49, 49,186,248,248,248, 36, 0, 7, 45, 91, 44,196, 25, 74,165,162,174, 72, 44,150,175, 95,183, -238,135, 78,157, 58,209, 66,225,223,233,167,106,195, 9, 0,206,206,206,155,189,188,188,136,111,190,249, 38,251,121,113,214,171, - 87,239,216,155,111,190,217,165, 71,143, 30,220,246,237,219,163, 78,157, 58, 21,235, 60, 60, 60,208,177, 99, 71,226,241,227,199, - 45,206,157, 59,183,238,216,177, 99,107,254,250,235,175, 83,105,105,105, 61, 94,176, 69,107,147, 94, 76,228,216, 88,254,149, 7, - 65, 16, 14, 27, 55,110,244, 50,204,201,168,213,106, 65, 81, 84,197,183,225, 67,211, 52, 40,138,194,226,197,139, 41,153, 76,102, -205, 62,146, 25,189, 53, 27, 62,180,185,111,129, 64,224, 97, 72,216, 91,195,157,253,142, 68, 88,220,196,222,222, 62, 0, 64, 47, -120, 6, 79,175, 92,160,252,253, 89, 38,147,165,231,168, 92,238, 0,232, 84, 13,155, 75,100,100,228,240,249,243,231,127, 96,100, -165,109, 30, 17, 17, 97, 58,237, 85,115,253,183,140, 32,136,211, 36, 73, 30, 2,176, 13,207,209,234,206,226,245, 2,195, 48,109, - 0,120, 26, 45, 82,163,124, 84, 8,250,231, 36, 1,192,221,100,185,113, 57,195,119,129,126,185,167,126, 59,198,136,183,128, 32, -136,171,181,108,226, 25, 88,240,211,226, 2, 64, 92, 92, 28,211,167, 79, 31,194,240,109, 94, 20,133, 31,249,116,240,251, 61,123, -119,125, 27,164,200, 21, 15,242,129,248, 12, 6, 92, 82, 11, 18, 12, 46, 95, 56,197,128, 75, 71,155,108,101,217,122, 82,175,255, -215,205, 67, 67,150,110, 89, 54,129,147,148,207,197,182,115,114,104,148,101, 40,200,205, 64,126,118, 58,114, 50, 83,144,149,145, -114, 19, 32,230, 89,205, 89,229,192, 0, 20,173,127, 7,164,129,106, 34, 47,107,230,212,200,238, 6, 54, 10, 13, 45, 18, 80,128, - 70,118,215,138,234, 45,113, 54, 11, 14, 14, 30, 60,107,214, 44,183,219,183,111,139,229,114,185,234,232,209,163,247,210,210,210, -156, 36, 18,201,211,177, 99,199, 6,215,169, 83,199,233,163,143, 62, 18,236,218,181,171, 31, 42,135,181, 90,226, 12,125,191,221, -255,226,183,174, 89,105,255,100,111, 20,212,201, 55,112, 36, 71,134, 11,121,114, 38,208, 89, 72,124,213,194, 19, 14, 66, 46, 22, -182,175,227,208,107,127,242, 82, 45, 77, 15,169,142,243,226,197,139, 18, 59, 59,187, 21, 67,135, 14,149,140, 27, 55, 78, 72,113, - 93,184,177,241, 79,156,167,175,139,175, 35, 87,105, 56,131,187,212,195,228,161,205, 49,121,213, 73,131,200, 26, 93,191,126, 49, -125,253,186,101, 78,173, 70, 83,223,207,203, 9,137,105, 10,108, 59, 43,197,159,179,234,160,235,226,108,124,212,146,139, 16,127, - 7,232, 52,218, 70, 17, 17, 17,209,250,183,246,171, 0,250, 69, 68, 68, 52,230,112, 56, 39, 1, 28,168,233, 24,137, 68,230,103, - 79,113,117,117, 69, 88, 88, 24, 66, 66, 66,184,157, 58,117,106,110, 34, 96, 42,113,106, 52,106, 9, 77, 51,112,116,116, 20,187, -187,187,187, 58, 58, 58, 62, 49,247,160,178,133, 19, 0,220,220,220,250,135,133,133,113,119,238,220, 89,152,154,154,122,121,240, -224,193, 41, 78, 78, 78,149,172,191,246,246,246, 8, 14, 14,198,156, 57,115,184, 61,123,246,172,145,211,219,219,187,123, 76, 76, - 12, 8,130,168,120,104, 87, 49, 22, 7, 4,192,199,199, 7,189,122,245,226,246,239,223,191,123, 90, 90, 90,173,174, 35, 27,112, -194,140, 69,107,129,201,113,178, 56,252,102,174,188, 21,199, 61,223, 96, 93,210,243,225, 25,174,205,106,135, 59, 69, 34, 81,133, - 21,202, 76, 93, 85, 56, 73,146,196,236,217,179, 65, 16, 4,120, 60, 30,248,124,190,217,239,206,157, 59,219,218,206,199, 4, 65, -144,124, 62,127, 58,151,203, 29,165, 82,169,252, 68, 34, 81, 54, 69, 81, 63,171, 84,170,197, 0,180, 12,195,184, 88, 16, 89,102, - 57,237,237,237, 3, 30, 60,120,208,208, 82, 67, 84, 42, 21,154, 55,111, 14,168,144, 84, 29,103,114,114,114, 64, 80, 80, 80, 35, - 0,134, 41,218,206, 50, 12,211,201,232,191, 49,206, 50, 12,243,158,254,247,253, 71,143, 30, 5, 52,104,208,160,232, 69,157,159, - 44,231,191,143,179, 6, 45,226, 73, 16, 68,156,209,181,218,199,240,127,198,140, 25, 51,151, 44, 89,114,155, 32,136, 56,227,229, -198,229,140,191,245,247,155, 56,134, 97,250,124,243,205, 55,161,223,125,247,221,183,134,178,255,132, 72,180,197,162,229, 84,160, -180,199,185, 12, 39,112, 57, 20,184, 36, 1, 46, 7, 0, 67, 32, 61, 45, 25,165,210,226,243, 72,221,151,106,157, 37, 43,188,253, - 27,111, 52, 91,182, 99,213, 52,242,167,115,114, 20,203,148,184,251,215,105, 92, 61,125, 32,151,210, 81, 7, 64, 48,215, 0, 50, - 1, 41,244, 61, 32,182,118,115, 92, 16, 12,183, 92,104,233,197, 85, 37,177,245,210,208,162,113,227,198, 3,231,204,153,227,113, -253,250,117, 81, 73, 73, 73,233,142, 29, 59,178, 85, 42, 85, 26,128, 63,210,211,211, 27,175, 94,189, 90,176,108,217,178,102,205, -154, 53,147,236,217,179, 71,109,102, 58,163, 42,156, 83, 71, 12,137, 31, 53,126,162, 40,105,207, 90, 8,146, 18, 48,251, 70, 33, -245,103,142,124, 22,128, 85,120, 92,214,190, 64,169, 59,190, 50,172, 46, 89,207,145,143, 6, 46,130,206,119,159, 42,171,181,100, -217,217,217,173,136,137,137, 9,104,211,166, 13, 9, 0,231,238,235,132,211,215,197,215,249, 99, 73,123,162,125, 83,119,228, 23, -171, 48, 97,109, 34,142,198,231,255,110, 16, 89, 53, 53,210,209,209,177, 32, 51, 95,234,237,238, 32,194,199, 29, 28,208,117,113, - 54,194, 91, 11, 33,228, 19,184,151,154,139, 6, 65,245,136,196,243, 7, 91,235, 69, 86,155,156,156, 28, 0,104, 13, 32,245,241, -227,199,146,182,109,219,150, 24,209, 21, 1, 88, 42, 16, 8,102, 19, 4,193,180,105,211, 38,177, 89,179,102,101,174,174,174, 80, - 40, 20, 80,169, 84,224,243,249, 80, 40, 20, 72, 79, 79,199,229,203,151,225,234,234,106,211,129, 42, 43, 43,131,163,163, 35,104, -154,126,102, 78,138,162,136, 13, 27, 54,216,223,190,125,219, 62, 54, 54,214,123,210,164, 73, 79,154, 52,105,114,109,224,192,129, - 15,189,188,188, 84, 55,110,220,192,197,139, 23, 81, 84, 84,132,118,237,218, 89,197,169, 86,171,193,229,114,161, 80, 40, 32, 20, - 10,193,229,114,161,211,233, 64,211,116,133,248, 42, 43, 43,195,211,167, 79,193,231,243,161, 86,171, 95,198, 27,104, 21, 11, 85, -117,195,111,181,177,104, 25, 11, 53, 43, 69, 86, 77,150, 40,139,195,157,197,197,197, 98, 23, 23,151,233, 0,114,106,170,139, 32, - 8,112, 56, 28,240,249,124, 16, 4,129, 78,157, 58,225,211, 79, 63, 69,203,150, 45,145,156,156,140, 93,187,118,225,234,213,171, -224,241,120, 21,229,173, 30,159,232,220,153, 35, 18,137, 46,190,255,254,251,161,179,102,205, 18,213,171, 87, 15, 73, 73, 73,254, -223,125,247,221,244, 19, 39, 78,124, 32,147,201, 90, 27,238,118,213, 91,233,245, 67,130,229,195,133,189, 84, 42, 21,146,146,146, -108,217,166, 10, 26, 52,104,144, 78,146,228, 67,154,166,207, 1,104,206, 48, 76, 39,130, 32,142,162,220, 47,209, 24, 50,134, 97, -222, 35, 8, 66, 10,224, 38, 73,146,247,105,154, 78,103,237, 54, 44,172,184,175,244, 49,253, 79, 16, 68,220,146, 37, 75,250,152, - 19, 87,102,174,205, 74,203,191,251,238,187,111,141,254, 63,139, 69, 53, 12,149,157,225, 59,235,173, 92,127, 11,173,184,184,184, -234, 21, 8,141,143,226,246,237,188,212, 85,131,128,208, 86, 29,141,172, 67, 12, 18, 46, 95, 4,192,252,108, 85, 83, 36,125,196, - 36,135,251,243,134,111,199,145, 27, 79,203,241, 56, 59, 31, 23,143,252,140,130,156,180,109, 0, 51, 9,169,177,210,103, 62, 18, -245, 62,106,230,229,238,225,162,212, 48,160, 25, 0, 85,196,214, 75, 65,203, 70,141, 26,245,143,143,143,247, 80, 42,149,162,243, -231,207,203, 99, 98, 98,114, 53, 26,205,105, 0, 23,244,101,174, 23, 20, 20, 68,232,133, 9,135,203,229, 10, 52, 26, 77,117,190, - 11, 45,167,142, 26,126,126,233,134,173,162,135,183, 18,177, 58,246, 8,138,229,114,234,116,190,162, 31, 0,131,162, 63,121,189, - 80,145,197,128,169,203, 35, 9, 72,236,121, 62,119,159, 42, 69,128,249, 33, 89,149, 74, 53,120,232,208,161, 18,131,200, 2,128, -194, 82, 45, 87,174,210,114,218, 55,117, 71,171, 46, 17, 72, 56,181, 23,123,206,102, 33,200,211,238,108,125,251, 98,171,246,104, - 65,126,206,134,149, 81, 27, 87, 46, 93, 48, 85, 48,185,151, 51,194, 91,243, 32,226, 19,112,178,227, 97,241,154,205,218,235,151, -207,222,144, 72, 36,113, 0,250,229,228,228, 64, 34,145,148, 1,184,207,225,112, 82, 41,138, 50,231,212, 61, 23,128,119,116,116, - 52,169,213,106,203,146,147,147,225,227,227, 3,111,111,111, 56, 59, 59,227,238,221,187,248,243,207, 63,113,239,222, 61,208, 52, -141, 55,222,120,195,166,131,245,228,201, 19,220,184,113, 3,189,122,245,158, 84, 80,144,239,228,234,230, 46, 59,127,238,236,247, -181,225,164,105,154, 0,128,208,208, 80,132,134,134,138,178,178,178,252,226,226,226,188, 22, 45, 90,148, 17, 16, 16,176, 67,161, - 80, 84,178, 28, 88, 43,180, 12,226,194, 32, 2, 69, 34, 17,248,124, 62,164, 82, 41,242,242,242, 80, 90, 90, 30,180,233,226,226, -242, 82,132,150, 5, 11,213,115, 43,255, 15,139,195, 42,195,157, 46, 46, 46, 67, 1, 76,183,178, 47,208,233,116,224,243,249,104, -219,182, 45,162,162,162,112,245,234, 85, 28, 56,112, 0,254,254,254, 24, 49, 98, 4, 72,146,196,237,219,183,109,109, 34, 29, 31, - 31, 63,189, 95,191,126,161,209,209,209,162,244,244,116,220,187,119, 15, 46, 46, 46,136,138,138, 18,142, 30, 61,186,193,169, 83, -167,230,162, 60,248,165,122, 24, 69, 23,202,196,146, 1,205,155, 55,175, 82,196,199,199,199,249,143, 63,254,240,170, 16, 96,166, - 17,137, 85, 81, 60,119,238,220,149, 33, 33, 33,171,244,195,133, 29, 1,216, 51, 12,211, 57, 54, 54,150, 0,128,240,240,112,134, - 32, 8,195, 3,233,230,222,189,123,187,220,189,123,151,153, 63,127, 62,235,163,197,194,146, 22, 25,109,184, 38, 45, 9, 40, 91, -132,154,177, 60,104, 55, 9, 0, 0, 32, 0, 73, 68, 65, 84,197,203,128,111,190,249, 38,116,201,146, 37, 87,158, 81,100, 25,191, - 49, 49, 6,177, 85,241, 48,181, 56,100, 88, 97,251, 34, 37, 62, 94,238,110, 51, 70,180, 7, 77, 3, 58, 10,208, 81, 12,100,114, - 5,146,110, 93,149, 67, 68,196, 90,213, 28,161, 96,217,162, 89, 19, 3, 19, 51, 73,100, 23,105,112,230,224, 70,166, 32, 39,173, - 63, 82,247,142,124, 62, 34,107, 64,115, 31,111,175, 51, 59, 55, 46, 36,175,166,168, 65,209,229, 58,139,166,153,138,223, 47, 1, - 62,158,158,158, 67, 46, 93,186,228, 41, 20, 10, 69, 15, 30, 60,160,247,238,221, 91,164,209,104, 78, 24,137, 44, 0,104,223,186, -117,107,157,131,131, 3,100, 50,153, 70,163,209, 40,171, 17, 89,126,157, 91,182, 56,187,116,195, 86,145, 82,173, 70,137, 66, 5, -142,187,151,169,200, 2,128,183,187, 52,244,245, 37, 68,142, 96, 0,164, 73, 53,217,150, 68, 22, 0, 8,133,194,110,227,198,141, -171, 52, 47,158,135, 35, 79,103, 39,228, 81, 23,238, 20,210, 9,167,246,226,220,237, 66, 90,196,231, 80,158, 76, 74,160,181, 59, -160, 56,243,206,134, 3,191,197, 29,255,122,206,178, 50,185,172, 20, 65,117,196, 40, 43, 45,193,226, 37, 75,181,241,241,231, 78, - 79,159,244,249, 91,123,247,238,253, 14,229,206,224, 0,112,127,239,222,189,195,231,204,153,179, 29,127,167,121, 48, 69,246,144, - 33, 67, 50,155, 54,109, 90, 18, 18, 18, 82,242,228,201, 19,220,185,115, 7, 69, 69, 69, 88,189,122, 53,146,146,146, 96,176, 8, - 90,229,171, 82, 85, 32,161,168,232,169, 3,195, 48, 40,122,250,196,126,214,172, 89,206,181,225,164, 40,170,210,181,229,235,235, -139,177, 99,199,242,229,114,185, 75, 70, 70,134,147,241, 58,107, 57,213,106, 53, 12,150, 33,134, 97,160, 86,171, 81, 82, 82, 2, -181, 90,141,135, 15, 31, 86,136, 44,125,253, 47,205,162,101,248, 45, 18,137,242, 12,231,178, 97, 8, 78, 36, 18,229, 91, 42,255, - 44, 48,170,139,209,255,182, 85, 28,214,216, 31, 43,143, 59,248,124, 62, 62,253,244, 83, 92,185,114, 5,201,201,201,224,112, 56, -144,201,100,144,203,229,232,222,189, 59, 4, 2,129,173, 22, 45,134,207,231, 15,157, 57,115,166, 40, 53, 53, 21,133,133,133, 6, -103,122, 80, 20,133, 73,147, 38,137,133, 66,225, 80, 91, 77,247, 57, 57, 57,239, 62,124,248,176,145,233, 39, 55, 55,183,196,216, -167,176,182,136,141,141, 37,194,195,195,153,240,240,112,198, 32,184, 88,176, 48, 7, 11, 90,100,147, 37,139,214,243,176,138, 25, - 44, 91,208, 7,136,212, 2, 6,145, 21,102, 36,188, 8,131,133,203,186,161,195,160, 1,255,243,118,119, 59, 21,189, 54,210, 33, -238, 22,129,204,199,105, 40,200, 73, 71,235,183, 58, 35,233, 86, 34,104, 45,181, 15, 15, 99,107,246,228,172, 23,222, 48, 36,164, -201, 23, 97,111, 53,195,178,184, 50, 60, 72,248, 3,197, 5, 57, 63, 34,109,239,190,231,114,132, 2,194, 91,120,123,185,157,218, -190, 54,210,229,232, 29, 18,143, 31,167,225,224,246,149,140, 86,163, 42, 70,229, 72, 46,155,223,154,197,180, 90, 80, 86,156, 7, -117, 41, 5, 17, 41, 23,217, 56, 72,145, 11,224,220,202,149, 43,187,182,107,215, 78, 48,100,200,144,220,162,162,162,131, 0, 46, - 25,149,105,218,176, 97,195, 94, 81, 81, 81,222,143, 31, 63,198,137, 19, 39,114, 81, 30,250,111, 9,153,103, 19,111,173,251,115, -251,230,169,226,192,198, 88, 61,243,107, 93,236,213, 59,239, 3, 56,106, 84, 38,164, 91,243,134,113,139,166,124, 73,210,215,127, -199,141,244, 60,164,148,168,254,180, 68, 88, 88, 88, 72,200,229,242, 0, 23, 23, 23,227, 19, 18, 18,123,153,106,218,128,134,217, -221,167,159,175,163,212, 80, 16,242, 72,102,194, 7, 1,217, 87, 14,198,186, 23, 42, 11, 9, 67, 52, 98, 77,248,108, 96,183, 15, -214,198,236,255, 56, 46,238,240, 23, 26,149,178, 89,227,198,141,152,107,241,167,110, 76,159,244,121,207, 90, 30,113,135, 43, 87, -174,144, 28, 14,167,146, 64, 55,182, 16,217,106, 41,178, 5,214,114,154, 10, 45, 3,116, 58, 29, 81, 91, 78,149, 74, 85, 33,180, - 76, 31,238,230, 4,227, 63,209,127, 91, 44, 84,198, 67,134, 6,127, 58,165, 82,233,165,247,217,242,126,158, 22,173,103,137, 68, -172,110,248,210,150,246,145, 36, 9,154,166,193,231,243,241,198, 27,111, 32, 46, 46, 14,110,110,110,112,114,114,130,147,147, 19, -196, 98, 49,220,221,221, 43,132, 22, 73, 90, 29,165,195,168, 84, 42,127,127,127,127, 60,124,248, 16, 34,145,168,226, 35, 20, 10, - 17, 26, 26, 10,153, 76,230,139,151,105,187,103,193,226,159,189,175,196, 25,139, 37,130, 32,226,102,204,152, 49,179,182,124, 51, -102,204,152,105,206,194,245,140,130,171,146,117,139,107,172, 32,205, 42, 73,189,200,218,246,227, 2,167,253,127, 1,153,153,169, - 56,190,103, 77,169, 86,163, 46,162,105,109, 64,202,189, 68,128,196,207, 86, 53,129,100,222,252,160, 87, 23,226,248,109, 53,164, -197, 5,184,127,237,143, 52, 40, 4,223, 60, 55,145,229,237,113, 42,122,237, 2,151, 67,183, 8, 60,126,156,134,163, 59, 87, 75, -181, 26, 77, 55,164,198, 94,123, 22,234,161,124,254, 7,252,186, 25,125, 70,117,204, 6, 69, 80, 24,154,116,247,189,252, 92,124, -144,115,190,250,200, 48, 99, 20, 20, 20, 28, 92,185,114, 37,177,124,249,242, 48,165, 82,249, 43, 0, 99, 19,101,179,160,160,160, - 65,155, 54,109,114,123,252,248, 49,239,252,249,243,178, 83,167, 78, 49, 0, 14,213, 96,113,153,214,125,228, 88, 78,203,122,190, -227,174,167,101,189, 15,224,119,163,213,161,125, 90, 53,189,176,117,201, 92, 71,237,133, 88,148,229, 60,198, 55, 23, 50,165, 0, -172,222,223, 90,173, 22, 37, 37, 37,208,150, 61,209,181,150,200, 74,230, 71,120,169,242,138,148, 92, 30, 45,215,133, 56,229,171, - 78, 61, 73,225,216,217,217,217,180, 47,215, 46,153, 26, 3, 32, 38, 34, 34, 34,250,102,252,225,214, 18,137,228,112, 72, 72, 8, - 1, 0, 22, 34, 12, 45, 33, 18,192,164,183,223,126,155,104,219,182,237,229, 85,171, 86, 29,171, 78,172,212,198,162, 85, 19,172, -229,164,105,154,180,176,127,137,218,114, 26, 91,180,106, 18, 90, 47,211,162,101, 78,180, 24,139, 68, 99, 33,244,111,136, 58,172, - 78, 76,217,210, 62,131,159, 28,159,207, 71, 98, 98, 34,234,214,173, 11,141, 70, 3, 71, 71, 71, 56, 58, 58,194,193,193, 1,165, -165,165,224,241,120,176,177,207,180, 72, 36,202,184,115,231, 78, 35, 79, 79, 79, 80, 20, 85, 73,108, 61,120,240, 0,246,246,246, - 89,182, 90,180, 36, 18,201, 31,250,168,195, 74,240,241,241,113,126, 30,251,213,216,146, 21, 30, 30,206, 14, 17,178,168,214,154, -101,193,170, 85, 96, 98,137, 82, 27,253, 47, 64,121, 14,183, 62,250,223, 48,243, 91,109,102,217,147, 37, 75,150,156, 50,242,239, - 42,120,198, 46, 24, 82, 60, 84,138,112,225,214,100,201,242,114,115, 61,181,101,245,124,167, 61, 9, 64,214,227, 84,156,217, 23, - 85,162,163, 52,239,128,102,114,226, 79,236,139, 5, 1, 57, 82, 98,207, 88,119,139, 64,203,150, 77, 2,112,224,182, 22, 5,153, - 15,192, 48,244, 54,228,199,200,159,249,232, 4,125,244,134,151,155,199,169,109, 81,243,157,247, 39, 18,200,124,156,138,227,123, -162,164, 58,173,188, 43, 82,247, 37,212,150,246, 83,192,149, 99, 47, 90,215,191,115,203, 1, 1, 65,126,160, 25, 45,104, 62,131, -143,166,121,112,239, 95,151, 31, 56, 39, 42,217, 67,151,209, 95,100, 93,178,206,129,174,172,172,236, 0,128,107,168,156, 94,161, - 69,112,112,240,128,117,235,214,121,102,102,102,138,174, 95,191,174,216,184,113, 99, 62, 77,211,251, 1, 88, 51,148,250,245,245, -180,172, 45,168,156, 47,167,197,212,145, 67,226,135,124, 50, 74,148,122, 34, 6,174,169, 73,152,114, 33,155,186, 95,164, 30,172, -183,174,153,133,135,135, 7, 83, 88, 88,152, 94, 92, 92,220,200,222,222, 30, 79,158, 60,193,211,167, 79, 81, 82, 82, 2,149,244, -169,206,157, 42,150, 17,186,167,224,241,120,200,127,172, 5, 69, 81,185,214, 90,179, 0,184, 70, 70, 70,126, 70,211,180, 33, 35, - 98,165,232, 66,163,114,134,243,161, 81, 68, 68, 68,180, 81,212,161,177, 51,188, 33,189, 3,161, 79,239,208,238,247,223,127,191, -219,179,103,207, 76,115, 98, 69, 40, 20,218,236, 40,109, 41,138,177, 54,156,150, 44, 90,166,203,109,225, 52, 12, 95, 26,156,224, - 77,151, 27,192,225,112, 64,211, 52,172, 8,170,248, 71, 69,139,113,116, 96,109, 68,142,201,177,169, 54,113,104, 45, 35, 17,159, -171, 69,203,112, 44,248,124, 62,126,251,237, 55,124,242,201, 39,160, 40, 10,118,118,118,112,112,112,128,189,189, 61,246,237,219, - 7, 67,250, 7, 91,244,171, 86,171,253,101,201,146, 37, 51, 55,108,216, 32,102, 24, 6, 2,129,160, 66,104,205,159, 63, 95,161, -209,104,126,177, 74,104, 25, 50,190,211,204, 29,123,123, 93,181, 81,135,230,182,177,224,175,229, 18, 25, 25, 57,156,166,233, 15, - 96,146,194,193,164, 92,165,212, 15,108,122, 7, 22, 86,220, 79,174,254,139,155,103, 16, 88,132,145, 37,171, 66,112,145,213,137, - 23, 79, 87,151, 83,155, 87,207,119,218,113,149, 64,106, 74, 10, 78,255,186,166, 92,100, 61,218,243, 23,210, 99,243,144, 26,219, - 1, 41,177,239, 90,253,246, 68, 16, 45,235,120,185,224,169,140,134,180, 48, 3, 96,112,253,121,136, 44, 79, 87,207, 83, 63, 69, -205,119,222,251, 23,137,212,212, 84, 28,223,179,166, 68,167, 83,190,243, 44, 34,107, 40,159,255, 65,112, 67,191,228,217,159,125, - 48,160,109, 3, 31,184,103,220,197,161, 17, 3,176,112,215,135,112,244,228,224,205, 94,142,248,116,177,207, 0, 73,168,240,161, -164, 3, 62,176,129,218, 88,100,181,172, 95,191,254,128, 75,151, 46,121, 52,111,222, 92,116,239,222, 61,229,198,141, 27,243, 21, - 10,197, 49, 0,137, 54,112, 26,139,172,150, 51, 70,143,136, 95,186, 57, 90, 68,242, 5, 88,246,203, 33,140, 63,155, 73, 29, 78, -151, 70,160,242,176,162, 89,168, 84,170, 19, 81, 81, 81, 42,146, 36,241,244,233, 83, 20, 22, 22, 34, 63, 63,191,226,187,184,184, - 24, 28, 14, 7, 39, 79,158, 84, 75,165,210, 75,214, 54,240,226,197,139,245,179,178,178, 66,114,114,114, 90,235, 63,247, 80, 30, - 93,232, 96,180,172,117, 78, 78, 78, 24,128,171,134,229,153,153,153,245, 46, 95,190, 44,169,137,223,209,209, 17,124, 62,191,146, - 69, 75, 40, 20,194,219,219, 27, 58,157, 14,187,119,239, 6,128,167,213,113,240,249,130, 28,146, 36, 64, 51,180, 74, 36, 18,209, - 18,137,196,172,192,178,133, 83,143,204,247,222,123, 79,153,144,144, 96,214,162, 85, 27, 78,134, 97,228, 61,122,244, 64,118,118, - 54, 68, 34, 81,197,195,218, 32,168, 72,146,132, 80, 40, 68,110,110, 46,198,140, 25, 3,134, 97,228, 47,250,206, 99,236,211,164, - 23, 67, 4, 0, 66, 47,132,170,248,105, 89,235, 3,101, 24, 26,100, 24, 6, 6,193,101,178,190,162, 46,107,178,183,155,248,116, -141, 46, 46, 46, 94, 90,222, 28,102,163,201,247, 38, 27, 30, 10, 21, 66, 43, 41, 41, 9,209,209,209, 40, 46, 46,134, 64, 32, 64, - 81, 81, 17,182,110,221,138, 59,119,238, 64, 32, 16,192,176, 47,172,213,111,109,219,182, 93,122,238,220,185, 59,131, 7, 15, 86, - 36, 38, 38, 66,161, 80, 32, 49, 49, 17,239,190,251,174,242,194,133, 11,201, 10,133, 34, 18,214, 12, 29, 26, 50,190,235,167,215, - 81,169, 84,184,126,253,186,217,143,165,109, 76,145,156,156, 28, 64, 81, 84, 35,134, 97, 58, 50, 12,227, 4,125, 10, 7,253,127, -227,207,123,250,117, 78, 12,195,116,164, 40, 42, 56, 57, 57, 57,128,149, 19, 44, 94, 81,156, 49, 18, 91,140,145,200, 58, 83,189, - 69,139, 38,163,182,172, 89,224,244,203, 21, 18,143,211,147,113,237,200,186, 18,138,214,190, 99,227,116, 56,221, 96,148,107, 67, - 36,182,111, 70, 19,229,225,204,210,194,199, 0,195,169,141,208,170,196, 9,154,140,218,186,102,190,243,206,107, 4,178, 31, 63, -194,133,131,107, 75,116, 58, 85, 87,164,196, 94,175, 13,231, 80, 62,127, 14,143, 67,204,238,209,254,127,252, 14,255,107, 8,251, -252, 52,228,102,102, 99,119, 82,193,211,228, 34,213,168, 11,132, 6,233,143, 84, 91,122,125,230,230,230,234,195, 67,159,207,221, -221, 46, 29,146, 30, 32,120, 50, 13,163, 97,150,228, 92,168,152,150,162,114, 59,171,194,199,209,209,113,240,181,107,215,156, 68, - 34,145,248,218,181,107,244,198,141, 27,159, 40, 20,138, 35, 0,226,173,234,123, 85,248,181,105, 24,116,230,219,181,155, 69,101, - 50, 57,100,106, 13,132,222, 18,106,127,252,173,254,176,156, 0,179, 18,167, 80, 40,220,185,115,231,206, 94,157, 58,117, 10,104, -214,172, 25,249,244,233, 83,148,149,149, 85, 56, 87,123,122,122, 34, 41, 41,137, 78, 77, 77,205, 22, 10,133,187,172,109,231,219, -111,191,157, 74,146,228, 61,253, 48,218, 61,152, 68, 23, 26, 21,109,148,147,147,211, 70, 34,145,156, 1, 96,103, 20,117,104,204, -105, 72,239, 48, 19, 0, 73, 16,196,213,196,196,196,178,158, 61,123, 66, 44, 22, 67, 38,147,193,223,223, 31, 58,157, 14, 71,142, - 28, 65, 66, 66,130,140,166,233, 51,102,196,107,165,118, 42,149, 10,127, 0,164, 66, 46,127, 99,248,240,225, 97,147, 39, 79,174, - 20,146,238,229,229, 5, 55, 55, 55,155, 56, 1,224,233,211,167, 77,126,255,253,247,137,137,137,137, 95,247,234,213,203,121,230, -204,153,194,250,245,235,131,162, 40,178,182,156, 69, 69, 69,206,215,175, 95,255,190, 67,135, 14, 95,246,236,217,147,251,237,183, -223,194,217,217, 25, 20, 69, 65, 44, 22, 67, 42,149, 34, 50, 50, 18,231,207,159,215, 49, 12,179,182,164,164,100,138,141,231, 18, -158,245,218,180,100, 1,178,148,146,193, 66,249,127,188,157, 38, 62, 93,208,167,112,152,110, 33,131, 61,172, 61,231, 13, 66,139, -195,225, 32, 45, 45, 13, 27, 55,110,172,146, 71,203,144,254,193, 2,183,185,190, 51,167, 79,159,166, 8,130,120,235,218,181,107, -211, 63,254,248,227, 81, 50,153,204,207,222,222, 62, 91,171,213,254,172, 80, 40, 22,163,220, 31,149,111,203, 61, 68, 38,147,165, -155,139, 58, 52, 45, 3,184, 84,203,105,146,222,161, 82, 10, 7,147,109, 42,165,126, 48,147,222,225, 31, 63,238, 44,231,191,146, -243, 85, 23, 91,150, 19,150, 86, 65,203,209, 60,158, 66,219,252, 92, 50,241, 44, 34,171,170,181, 68, 41, 79,158,187, 51,227,127, -106,149, 18,178,146,188,251, 72,219,157,255, 76,221,210,183,243,108, 50,129,180,212, 71,184, 18,183,182,188,157, 41,177,181,110, - 39, 1,124,179,254,104, 44,159,112,118,195,141,137,159, 32,187, 88,134,163, 41, 69,123, 24,185,234,139, 95,128, 34,156, 7, 72, -157,234,220,214, 89,185,235, 58,126,228, 60,192,195,151,135, 21, 83,127,134,104,134, 59,255,205,174,157,108,153, 3, 49, 87, 36, - 18,157, 91,189,122,117,183,142, 29, 59, 10, 35, 34, 34,204, 57,200,219,138,204,171, 15, 30,173, 63,188,225,135,169,238,205,219, -225,199, 57,211,168,157,241,183, 76,163, 16,171, 69, 72, 72, 8,117,241,226,197,201, 99,198,140, 89,209,173, 91,183, 58,239,191, -255,190,192,223,223, 31, 66,161, 16,143, 30, 61,194,185,115,231,212, 41, 41, 41,217,114,185,124,114,139, 22, 45,108,201,113, 86, - 52,119,238,220,165,250, 58, 8,253,112, 97,107,232,163, 11, 13,133,244, 73, 75, 91, 3,176,155, 63,127,254,199, 0, 96, 33,236, -123, 46,128, 13, 0,184, 12,195,228,198,196,196,188,117,240,224,193,183, 38, 77,154,196,239,213,171, 23, 46, 93,186,132,227,199, -143,107, 52, 26, 77,188, 94,184, 90, 59, 85, 14, 13,224,186, 78,167,187,181,108,217,178,183, 56, 28,206, 92,195,138, 59,119,238, - 96,219,182,109,181,225,212, 1,248, 62, 47, 47,111,125, 76, 76,204,220, 19, 39, 78,140, 28, 62,124,184,147, 86,171, 69, 82, 82, - 18,126,250,233,167, 90,113,150,148,148, 76,244,240,240,152,125,228,200,145,159,143, 29, 59,214,111,216,176, 97,228,248,241,227, - 17, 21, 21,133, 95,127,253,149,166, 40,234, 32,143,199, 27, 94, 88, 88, 40,123, 25,119, 29,253, 48, 92,182,141,115, 29,214,200, -251, 44, 67,131, 86, 34,231, 89, 9, 12,253,232,220,185,115,133,149,209, 96,133, 51, 46, 67, 16,132,205, 67,135, 0, 92, 24,134, -161, 1,172, 69,249,252,162,198, 89,225, 57,248, 59,115,188,181,140, 77,115, 84, 46,119,160, 66, 82,245,147, 74,187, 0, 12,154, -214,192, 86, 60,119,238,220,149,243,230,205, 91,105,154,194,193,184,144,105,234,135, 5, 11, 22,128, 77,239,192,226,117,133,121, -161,117,125,147, 86, 27,216,127,230,234,111,167,205,211,105,213, 37, 12, 52,225,120,180, 47,241, 89, 43, 99,104,102,198,201, 29, -243,163,192,160,136,161,116,211,159,185,245,255, 80, 59, 9,103, 55,148, 70,142,197,175,183,179,153, 92,153,246,195, 95, 52,154, - 74,214,160,114,159, 44,122,224, 41,101,209,110,215, 58,188,253, 19,223,113, 39, 14, 63,253,216,230,122,242,243,243,127, 91,185, -114, 37,249,195, 15, 63,132,201,229,114, 83, 7,249,218, 98, 90,223,113, 51, 56,111, 6, 7,140,187,242, 48,253, 3, 88, 49, 92, -104,138,183,223,126, 59,231,238,221,187, 67,142, 29, 59, 54,248,236,217,179,221,100, 50, 89, 0, 65, 16,176,179,179, 75, 87,169, - 84, 39,132, 66,225, 78, 27, 69, 22, 0, 96,222,188,121,204,130, 5, 11,136,187,119,239, 50, 28, 14,231, 79, 0,169, 28, 14, 39, -205,216, 9,222,120,185, 97,155,249,243,231, 91,243, 64, 60, 91, 86, 86,150, 16, 25, 25,217, 41, 50, 50,242, 13,189, 85,232, 44, -254,246,249,178, 21, 90, 0,103,249,124, 65, 54, 65, 16,126,124,129, 80,118,241,226,197, 19,207,200, 41,215,104, 52,211, 31, 63, -126,188, 98,197,138, 21,139,237,237,237,219,220,185,115,231,207,103,225,212,139,168,254,110,110,110,117,162,163,163,247,110,221, -186,181, 29,151,203,189, 68, 16, 68, 68, 73, 73,201, 75,157, 84, 90, 63, 65,244, 2, 27,230, 58,180,138,247,121, 39, 41,253, 39, -132, 27, 69, 81,101,179,103,207,206, 55, 21, 94,166,214, 43,195,127,125, 42, 23,107,246,169, 45, 81,148, 53, 8, 23,162, 12, 0, -202,231, 46, 44,159, 86,199,218, 73,165, 1, 40,106,186,206, 73,146, 60, 8,224, 62, 73,146, 15, 77, 3, 93,140,215, 45, 88,176, -160,166,235,156, 5,139, 87, 26, 86,220,217,230,147,192,252,218,122,210,190, 64,115,229,243,105,231, 16, 62,127, 1, 9, 76, 5, - 64, 48,192,138, 95, 52,154, 89,213,109,232,243, 54, 22, 51, 4, 38,233,119,230,183,185, 23,176,168, 22,125,247,133, 21,243, 15, -218,200,217, 24,213, 79, 40, 91,133, 51, 60, 60,156, 99,225, 97, 94,105, 82,105, 75,136,141,173,200,226,111,169,157,198,231,155, -227,229,203,151,235,180,109,219, 54, 7,149,157,254,205, 45,103,108,236, 59, 7, 0,245,156,247,231, 43,193, 25, 20, 20, 36,120, -244,232,145,250,223,117,109,178,156,255, 74, 78,151, 38,117, 65,224, 51, 24,231, 14,170,214,162,101, 36,208, 24,230, 39, 20, 39, - 61,182,208, 78,195,117,238,146,156,156, 28,208,160, 65,131,116, 0,197, 38,237, 48,183,142, 97,143,209,127,158,211, 28, 70,163, -242, 84,116, 44,204, 28, 8,150,147,229,100, 57, 89, 78,150,147,229,100, 57, 89,206,218, 10,173, 87, 26, 36, 88,176, 96,193,130, - 5, 11, 22, 44, 88,252, 35, 32,170, 81,165,182,152, 4,107,163,108, 79,176,156, 44, 39,203,201,114,178,156, 44, 39,203,249,159, -227,172,137,219,120,251, 87,117,232,240,133,181,155, 53,171,178,156, 44, 39,203,201,114,178,156, 44, 39,203,249, 44,130,229,149, - 6, 23, 44, 88,176, 96,193,130, 5,139, 87, 6,221, 26, 66,194,165, 64,254,254,200,170, 32,170, 26,209, 51, 8,190, 0,240,188, -248,254,163,144, 0,232,109,244,255, 48,244,145,241,172,208,122,117, 17, 12, 96, 38, 0,227,185,200,174, 0, 88, 98, 82,110, 7, - 0,227, 9, 9,101, 40,159, 39,240,161, 45,149,145, 36,185,164, 83,167, 78, 95,156, 63,127,254, 7,157, 78, 23, 89,139,246, 6, - 72, 36,146,165, 4, 65,180, 2,192, 35, 8,226, 81, 94, 94,222, 18,157, 78,247, 44, 81, 43,129, 62, 62, 62,223, 1,248, 31, 73, -146, 60,130, 32,146,243,242,242, 22,233,116,186,211,207,192,233,232,237,237,221,158, 97, 24, 31, 0, 28, 30,143,247, 36, 43, 43, -235, 50,106,153, 91, 41,124,126, 18, 95, 42,211,241, 0,192,201,158,171,141,157,223, 68, 99,237, 50,246, 20,103,193,226,191, 13, -166, 60, 50,185, 18,222, 13,194, 98, 70,135, 41, 20, 64,244,168,143, 53,127,164, 98,138,165,237, 9, 51, 81,205,166,156,239, 6, - 97, 49,197,148,115,244, 8,194,247,127, 60, 66,181,145,246,214,112, 26,176, 9, 32, 71, 91, 49, 75, 1, 97, 93,244,245,191, 29, -189, 81,121,168,176, 98,232,176, 90,161, 53,176, 33, 36, 20, 23,220,216, 36, 24,194,120, 29, 1,188,161,127,200, 63, 68,121,174, -162,210,103,108,220,171,194,249,111,195, 92,134, 97,134, 84, 58, 89,205,228, 33,122,231,157,119,222, 63,118,236,152,157, 97,190, - 59,154,166, 33, 22,139,117, 0, 70,216, 80,151,215,192,129, 3,103,108,217,178, 5, 3, 6, 12,152, 29, 23, 23,183, 18, 64,153, -181, 27,187,186,186,134,187,184,184, 68,109,222,188,217,179, 93,187,183, 8,129, 64,128, 71,143,146,253,198,140, 25,211,236,238, -221,187, 7,243,243,243, 71,217,218,121, 55, 55,183,161, 46, 46, 46, 43, 54,110,220,232,209,161, 67, 7, 16, 4,129,132,132, 4, -191,137, 19, 39,190,145,145,145,177, 43, 47, 47,239, 75, 91, 57,221,221,221, 27, 58, 59, 59,119,249,241,199, 31,197,237,219,183, -135, 72, 36, 66, 98, 98,162,195,231,159,127,238,147,149,149,149,148,151,151,119,198, 86,145,117, 51,225, 80, 63,157, 70,181, 12, - 0,184,124,225,180,118, 43,226, 15,221, 60,117,168,111, 77,203,194,231, 39, 29, 96,197, 22, 11, 22, 44,140, 49,180, 14,124, 24, - 6, 83,143,253, 52,135, 4,128, 30, 35, 23,142, 31, 90, 7, 63,252,146,109,121, 14, 91, 27,249,166, 12,247, 69, 84,116, 22,242, -158,165,157,155, 0,114, 34,151, 59,254,205,182,109, 61,190,186,112, 33, 89, 3,252,252, 31, 57, 68,102,135, 57, 45, 10,173,254, - 77, 16,169, 43,183,152, 16, 61, 27, 96,215,241, 84,206,185,119,222,121,167,193,167,159,126, 74,180,108,217, 18, 9, 9, 9, 13, -119,237,218,213,251,240,225,195,201, 20, 69, 37, 0,184, 13,235,179, 90,243, 0,132,114, 56,156, 86,255,114,206,127, 51,236,245, -226, 42, 15,127, 39, 58,173,146,240,244,228,201,147,191,113,185, 92,131, 69,235, 77,153, 76,230,109, 98, 5,179, 6,245,180, 90, - 45,238,221,187, 7,146, 36,121, 0,234,163,234,148, 26,150,224,103,103,103,183, 46,254, 74,130, 59,193, 21,163, 72, 9, 64,169, -129,192,193, 27, 91,182,197,184, 77,158,240,101,255,211,167, 79,159, 43, 45, 45,221,110, 67,123,234,219,219,219,175,188,113,227, -134,187,157,157, 29,104,154, 70,105,105, 41,124,124,124,176,121,243,102,151,201,147, 39, 15,145, 74,165,167,149, 74,229,175,182, -136,115,103,103,231, 46,183,110,221, 18, 27, 38,148, 86,171,213,240,243,243,195,142, 29, 59,132,227,199,143,111, 82, 92, 92,156, -169, 86,171, 83,172, 37,148,202,116, 60,157, 70,181, 44,122,237,252,186, 0, 48,252,203,249,203, 4,165, 78, 71,172, 89, 38,149, -233, 14, 3, 96,133, 22,139, 23,141, 86, 30, 30, 30,177,133,133,133,103, 0,140,194,243,177, 52, 52, 20,137, 68, 45,104,154,246, - 33, 73, 18, 28, 14, 39, 87, 38,147,221, 0,240,160,182,132,238, 65,157,251, 66,104,247, 9, 24,250, 13, 18, 0, 65,146,137,148, - 70,190,237,201,131,211,135,158,137, 83, 32, 30, 9, 48,111,144, 0, 77,144,228, 13, 90, 39,223, 92,120,239,244,209,127,203,193, -185, 84,130, 70, 65, 62,214, 79,140,249, 60,248, 6, 5, 66, 66,210, 32,119,164, 89, 63,172, 56, 14,232, 53, 97,194, 4,159, 47, -191,248,130,248,100,196,136,224, 51,231,207, 19, 97,182,204, 86,240,106,194,162,227,187, 89,161, 21,222, 4,174, 12, 48,125, 87, -212, 76,146,203,225, 16,131, 39, 44, 25,178,117,237,247,100,247,190, 17, 21,195, 39, 29, 59,118, 68,199,142, 29,137,101,203,150, - 5,255,249,231,159,193, 59,118,236,208,197,199,199,223, 0,176,219, 82,101,239, 6, 65, 65, 3, 34, 62,143, 43, 27, 60,103,251, -198,182,109,219,254,159,189,243, 14,139,226,106,219,248, 61,219,251, 46, 11, 11, 75, 71, 84, 58, 54,136, 98, 87, 44,216, 80, 44, -137, 93, 99,124,237, 45,209, 68, 99, 98, 52, 38,182,216, 98, 84,140, 26,107,236,250, 26,123, 47,177, 87, 80, 64,197, 74,103, 89, -154,244,178,253,124,127, 0,126, 72, 40, 11,152,215,148,249, 93,215, 92, 11,103,103,238, 61,211,206,220,243,156, 6, 30,143,135, -250,104, 2, 64,247,198,140, 24,182,101,195,136, 97,211,230,199,183,110,221,150,188, 11,205,191, 17,119,129, 55,147, 90,203,157, -156,156,218, 25, 12, 6, 62, 0,176, 88,172,226,196,196,196,105, 40,153, 27, 16, 0,142,154, 76,166,126,181,208,102, 0, 88,208, -175, 95,191,121, 83,167, 78,133,179,179, 51,166, 79,159, 14,189, 94, 31,118,250,244,233,249, 0,150,161,134,155,199,198,198,102, -254,134, 13, 27, 44, 89, 92, 17,252,230,196, 34, 37,219, 0, 0, 16,243,128, 99,147, 8,166, 79,159, 46,189,127,255,254,162,218, - 24, 45, 27, 27,155,239,126,249,229, 23, 75,161, 80, 8, 66,200,155,185, 24,243,243,243,145,159,159,143, 41, 83,166, 72,159, 60, -121,242, 67,109,140,150, 82,169,108,183,126,253,122, 1,159,207, 71,126,126, 62, 71,167,211, 81,121,121,121, 40, 44, 44, 36, 90, -173, 86, 55,109,218, 52,222,163, 71,143, 58,167,164,164,196,128,230,175, 2, 19,192, 0, 54,155, 61,176,113,227,198, 31,188,120, -241,226,129,193, 96, 56, 12,224,240, 59,120,153,234,106,111,111,191, 88,165, 82,173, 7,176,235,223,114, 64,149, 74,229,225,155, - 55,111, 58,109,216,176,225,227, 85,171, 86,157, 2,240,223,122,200,113, 56, 28,206,160, 78,157, 58, 57,141, 30, 61,154,171, 84, - 42,161,209,104, 16, 27, 27, 43, 61,112,224,128,203,195,135, 15,147, 74,103,196, 48,251,133,194,202,189,173, 24, 44,233,190, 54, -109,219,181, 31, 60,104,128, 68,105, 37, 67,145,214,136, 23,241, 41,206,103, 78, 29,235, 20,205, 17,220,212,233,114,134,102, 62, -191,153, 95, 91,205,192,192,174,237,187,117,237, 42,145, 89,200,144, 83,160,195,171,184,100,151,203,231,143,119, 96,177, 4, 87, - 77,148,126,100, 90,212,249,194,247,121,110,166, 3,172, 2,190, 85,179,230,109,253,238, 7,141, 93,244, 1, 33, 4, 12,130,181, - 21,163, 89,211, 1,214,218,146,105,191,106,165, 7, 66, 8, 69, 97,101,249,104, 86,143, 70, 88, 76, 8, 62, 7, 3, 84,143, 26, -170, 41,203, 8, 2,120, 22,150,150, 1, 19,199,143,167,242,114,115,241,240,225,195,194,138, 38,235, 71, 7,112,174, 50,208,224, -104, 98,221,205,246, 95, 52,154, 85,105,213,161,217,227,104, 9,133,194, 74,211,101, 50, 25, 2, 3, 3,177,116,233, 82, 22, 0, -255, 10, 95,191, 61,201, 42,192, 59,177,113, 46,100, 34, 30,195,217,217, 89, 34,149, 74,235,173, 9, 0, 32, 38,215,182,206,164, -215,189, 95,191,250,248,194,158,213,190, 5,121,217,236,138,171,136,197, 98,120,120,120, 96,222,188,121,230,105,214,159,255,169, -166,173,173,173,103,135, 14, 29,252, 47, 93,185, 98,161, 82,169,120, 42,149,138,119,238,210, 37,139, 54,109,218,248,219,218,218, -122,190, 57, 84,132,212, 38,159,223,135,134,134,206, 63,122,244, 40,163, 67,135, 14,144,203,229, 8, 12, 12,196,169, 83,167, 88, -171, 86,173, 90, 2, 96, 94, 77,249,100, 48, 24,237, 59,116,232, 64,129, 16,168,115, 12,184,179,212, 19, 15, 87,122, 33,175,152, -224,117, 78, 46,138,138,138, 33, 20, 10,249, 40,169,238, 53,119,223,219,182,105,211,134, 2,240,198, 92,229,229,149, 44,249,249, - 5,208,106,117,224,241,120, 18, 0,124,115, 53, 9, 33,182,237,218,181, 3, 0,232,116,186, 55,111,120,217,217,217, 84, 78, 78, - 14,180, 90, 45,216,108, 54, 7, 53,183,107,124,163, 41, 21,177,244, 44, 14,111,246,232, 41,223, 38,142,158,242,109, 34,139,195, -155,173,149,228, 26,205, 73,147,138, 88,250,247,124,125, 90, 51, 24,140,109,141, 26, 53,122,194, 96, 48,118, 2,176,173,167,102, - 75, 0, 75, 4, 2,193, 5, 47, 47,175, 68,161, 80,120,169,212,168,183,169,163, 38, 87, 40, 20, 94, 90,178,100,201,193, 7, 15, - 30, 12,190,120,241,162,107,100,100,228,160,229,203,151,239, 19,139,197,215,240,118,187,196, 90,223,155,174,174,174, 91,239,220, -185,211,178,109,219,182, 91, 0,240,222,209,253,206, 4,208, 2,102,205,200,241, 94,206,187,189,159,159,159, 19,159,207, 71,183, -110,221, 0,160,115,125, 52, 57, 28,206,160,121,243,230, 53,250,230,155,111,184, 41, 41, 41,184,116,233, 18,238,222,189, 11,131, -193,128, 73,147, 38,241, 70,143, 30,221, 80, 34,145, 12,170, 85, 62, 89,210,125, 51, 62,253,172,231, 23,211,199, 73, 34, 18,116, -216,126, 33, 1, 71,110,165, 32,173,144,139,190,131, 70,203,122,132, 12,233,193,229,201,246,213, 86,243,203, 57,115,122,142,255, -100,184,228,113,138, 9,199,110,171,113,251,105, 14, 12,108, 11,244, 30,244, 31,121,243,118, 61,251,176,192,222,241,190,207,209, - 47, 64,235, 25, 51,102, 88,207, 94,185,251,134,125,203, 1,107,211,179,208,161,188,241,113, 7, 44, 44, 69,162, 1, 79, 59,117, - 26, 39, 40,153, 47,182, 90,205,183,244,252, 67,214,165,101,161, 99,249,246, 89, 29, 45,225, 86, 90,173,200, 60,183,237, 27, 6, -161, 48,125,132,253, 91,229, 64,165,249,252, 29, 24, 60,227,179,207,216, 50,185, 28,161,161,161,208, 20, 20,188,213,102,182,171, - 19,122, 94, 16,178,146, 26,122, 57, 62, 9,116,161,174,253, 3,223, 87,198, 87, 25,209, 58,113,226, 4, 9, 14, 14,166, 0,224, -208, 19,100, 13,242,198, 15, 67,166, 46,153, 71, 49, 40,210,192,183,237, 99,135, 70, 62, 5, 86, 86, 86, 40, 44, 44,132, 70,163, - 1,135,195, 65,113,113, 49, 18, 18, 18,112,251,246,109,200,229,242, 90,229, 36, 55, 55, 23, 98,177, 24, 98,177,248,157,104,206, -253,184, 27,239, 85, 98, 58,239,236,237,223, 59,253, 52,249,191,173, 27,181,232, 28,217,117,200,244, 40,169,181,125,113,100,100, - 36,110,222,188,137,172,172, 44, 4, 4, 4,252, 83, 78,230,221,210, 54, 89,119, 1,200, 27, 55,110,236,120,246,194, 85,121,126, -177, 73, 26,151,170,103,155, 76, 38, 8,133,118,134,253,135,142,229, 12, 30,212,151, 82,171,213,105, 0,238,150,154,219,154,230, - 84,228, 3,240,252,240,195, 15,191,156, 60,121, 50, 94,190,124,137,113,227,198, 21,221,189,123, 55,179,109,219,182, 86,191,252, -242,139, 96,230,204,153,184,114,229,202,130, 19, 39, 78,252, 6, 32, 22, 64,165,115,181, 17, 66, 56, 28, 14, 7,134, 82,219,160, - 51,154,222,248,251,220,220, 92,144,162, 44,112, 56, 28, 38, 0,107,152,217,142,206,100, 50,113,216,108,246, 27,147,149,144,154, -139,132,180, 66,228,230,107, 81, 84,100,128,182,136,128, 41,180, 98, 1,113, 74, 0,113,230, 70, 71,248,124, 62, 12, 6, 3,242, -242, 74,178, 81, 22, 41,211,106,181,200,201,201, 1,147,201, 20, 3,144, 2,120,109,142, 96,105, 35,247, 35,165,213,128,184,183, -187,159,226,197,201,185,111,165, 73, 69, 44,253,161,153,222, 76, 43,199,230,215, 91, 12,222,225,245, 38,237,253,182,207,226, 89, - 91, 91, 95, 62,120,240,160,183,155,155, 27, 98, 99, 99,189, 62,250,232,163,128,148,148,148, 22,168,253,156,140, 66, 6,131,241, -195,232,209,163, 39, 15, 27, 54,140,114,119,119, 7,139,197,130,193, 96,112,124,249,242,101,224,129, 3, 7,230,108,221,186,245, - 23,163,209, 56, 11,230,183,251, 99,112,185,220,253,155, 54,109,234, 24, 16, 16,128,157, 59,119,226,238,221,187,166,150, 45, 91, - 50, 70,141, 26, 5, 23, 23,151,128, 81,163, 70, 29,209,104, 52,189,235, 24,217,114,105,211,166,141, 19,147,201, 68,219,182,109, - 57, 55,111,222,244, 3,112,179,158,199, 84,236,232,232,120,165,115,231,206, 45, 46, 92,184, 16,174, 86,171, 59,215, 98,127, 1, - 32,196,222,222,126,185, 76, 38,147,215,162,140, 45, 76, 78, 78,254, 28,192, 33, 51, 55,105,237,239,239,143,248,248,120,120,122, -122,130,195,225,180,209,233,116, 19, 0,244, 4,240, 53,128, 39,181,200,175,123,215,174, 93,157, 58,119,238, 76, 29, 58,116,232, - 77,251, 80, 6,131, 1,131,193, 0, 14,135,131,214,173, 91, 51,194,194,194, 28,238,221,187,231, 14, 51,170, 17,173, 26,117,238, -219,182,125,167,246, 29, 3,154, 49, 86, 29,122, 1,163,201, 8, 38,101, 0,139, 50,193,164,231,129,199, 97,194,221,247, 3,230, -211, 71, 17, 1, 90,141,174,111,230,243, 11,199,205,209,236, 25,212,189,131,183,167, 59,227,167, 35,175,144,157,252,196,152, 28, -125, 53,131,193,100,192,219,191,139,194,221,167, 5,179, 69, 64,103,182, 42,246, 81, 96,113,113,199,110, 89, 47,175, 94,120, 31, - 55,228, 66,128,233,232,160, 24, 16,220,189, 51, 39, 69,165, 42, 56,112,232,120, 84,161, 30,183, 1,224, 10, 64,245, 6,154, 53, -109,213,170,211, 47,203,150, 89,217,217,217,177, 71, 14, 27,102,216, 28, 30, 30,142, 42,170,126, 23, 2, 76,133,173,109,183,137, - 19, 39, 50, 83, 84, 42,114,224,240,201,200, 50, 61,148,188,165, 52,109,230,232, 21,140,130,167,181,170,166,236, 11,112,149,182, -182,222, 19, 38, 76,128, 90,165,194,206, 93,187,242,139,129, 91,101, 81,172, 99, 76,172,247,105,100, 59,102,246,127,250, 81, 78, -118, 10, 76, 92,176,185, 77,160, 46,173, 17, 82,254,255,252,151,247, 34,127, 99,147, 53,190, 82,163, 85,145,255, 62,193,124, 9, - 7,174, 7, 14,236,101,164,231,233, 10, 94,190,124, 9,133, 66, 1, 59, 59, 59,200,100, 50, 60,126,252, 24,151, 46, 93,194,179, -103,207, 96, 50,153,208,188,121,243, 90,229, 38, 35, 35, 3, 17, 17, 17,144,203,229,239, 76,179,145,147, 53,166, 58, 89,115, 82, - 51,115, 57, 23,238, 62, 11,216, 60,119,144, 15,195,107,208,214,242,147,196,106,181, 90,252, 67,120,211,187,208,201,201,169,221, -246,237,219, 57, 26, 3, 36,238, 19,110,173, 40, 40, 54,138, 0, 64,196,103, 22,132, 45,247,152,245,253,247,223, 23,124,242,201, - 39, 94,137,137,137, 75,205,136,245, 47,238,218,181,235, 23,132, 16,246,140, 25, 51, 0, 0,163, 71,143,206,189,125,251,182, 59, -128,180, 75,151, 46,217,143, 29, 59,246,249,229,203,151,133,159,125,246, 25,211, 96, 48, 60,102,177, 88,228,196,137, 19,223, 1, -248,246, 15, 79, 68, 6,227,126,120,120,120, 3,123, 23, 15,184, 88, 49,208, 97,222,179,146, 2, 78,104, 66, 82,220, 43, 68, 71, -222,133,173,173,173,204,206,206,238, 73, 82, 82,146, 46, 57, 57,121, 78, 65, 65,193,134, 26,242,248, 48, 44, 44,204,206,197,197, - 5,249,249,249, 72, 74, 47,196,244,195, 66,228, 22,149, 4, 49,216, 40, 66, 11, 39, 15,137,128,161,189,155,150,150,166,211,106, -181,223,228,228,228,108,175, 78,147,205,102,103, 70, 70, 70,138,157,157,157, 81, 92, 92, 76, 94,191,126, 77, 21, 20, 20, 32, 47, - 47,143, 58,121,242,100,255,148,148,148,150,174,174,174,148,163,163,227,119, 41, 41, 41, 69,201,201,201,227,204,169,154, 44, 53, - 76, 70, 22,139,181,106,252,248,241,131,127,251,237,183,251,135,190,245, 14, 41, 87, 93, 34,243,245,245, 61,219,172,153,143,253, -174,149, 77,215, 2, 88,241, 23,184,182,198,124,245,213, 87,222,150,150,150,152, 56,113, 34, 22, 46, 92,136,249,243,231,187, 77, -156, 56,113, 60,128, 31,107,161, 35,176,181,181,189,247,211, 79, 63,121,181,107,215, 14,167, 78,157,194,222,189,123, 17, 19, 19, - 99,112,117,117,101, 5, 4, 4, 96,193,130, 5,232,209,163,199,184,105,211,166,117, 82,169, 84,126,102,154,143, 79, 22, 44, 88, - 16,210,190,125,123,124,252,241,199,154,223,127,255,125, 48,128,115,231,207,159,239,114,229,202,149, 67,187,119,239, 22, 44, 89, -178,164,219,204,153, 51, 39, 2, 88, 87,135,253,239,223,177, 99,201, 28,202,237,219,183,199,242,229,203,123,212,211,104,113,173, -172,172, 78,238,220,185,179,133,135,135, 7, 70,142, 28,233, 55,120,240,224,147, 89, 89, 89,221, 1,152, 85, 32, 57, 56, 56,252, -112,244,232,209,198, 85,213, 44, 84,134, 70,163,177, 28, 48, 96,192,178,184,184,184, 90, 25,173, 61,123,246,224,243,207, 63, 71, -243,230,205,155,181,110,221,122,227,132, 9, 19,240,225,135, 31,118,125,252,248,177, 18, 37,189,150,107,132,207,231, 55, 27, 58, -116, 40,247,206,157, 59, 0, 0, 95, 95, 95,180,104,209, 2,155,104,178,222, 0, 0, 32, 0, 73, 68, 65, 84,241,241,241,184,127, -255, 62, 52, 26, 13,148, 74, 37, 6, 14, 28,200,143,139,139,107,150,145,145, 81,163,209, 98,240,132, 99, 66,130,123, 75,142,221, - 78,129,209,100,192, 7,141,165, 8,240,178,193,211,164, 92,132, 61, 73,130, 81,203,129,212,210, 10,109, 58, 5, 89,170,147, 99, -198,100, 2, 53,183,215,226, 9,199, 12, 12,233, 35, 62,118, 75,133,108, 85, 52,121,113,247,183, 75,250,226,130,113, 0,112,255, -226,190,141,182, 86,130,238,238,254, 31, 48, 59,119,239, 39, 63,188, 87, 61, 38,235,127, 51,183,223, 31,184,226,132, 77, 46,236, -140,209,179,135,119, 32,108,185,227, 93,137, 94,191,190,236,187, 30, 64,208,156,175,190,106,253,159,241,227,249, 38,147, 9,187, -127,253, 53, 55, 34, 60,252,233,120,192, 52,161, 10,189,245,128,203,224,144, 16,158, 68, 42,197,167,211,167, 67,162,215, 95,126, -115, 72,128,174,159,126,241, 69,187, 41, 83,166, 8, 54,126, 55,249,126,143,177,139,252, 77,132, 80,101,213,148,123,170, 15,197, -181, 28, 27, 18, 2,137, 84,138, 25, 51,102,128,210,233,206,190, 49, 80, 44, 92,254,164,127,135,128,225,125,219,131, 2,133,189, - 39,174,227, 69,124,122,228,229, 20,188,250,187,186,170, 10, 84,217, 70,171,218,170,195, 60, 29, 82,187,246, 25,148,226,238,238, -158,231,230,230,150,151,153,153,137,168,168, 40,100,101,101, 97,221,186,117,136,142,142,134,201,100,170,179,129, 49,153, 76,120, -215,154, 0,160,180,146, 98,100,239, 86, 44, 77,113, 1, 63, 61, 61,253,173,234,163,127,144,209,122,131,193, 96,224,187,186,186, -130, 1, 80, 57,133,122,177,122, 79, 71, 74,189,167, 35,149, 83,168, 23,107,181, 90,134, 88, 44,134, 70,163,225,155, 33,197,238, -213,171,215, 23,191,253,246, 27,123,241,226,197,104,210,164, 9,116, 58, 29,110,223,190,157, 4, 32,173,116, 29,213,213,171, 87, - 85,101, 70,120,233,210,165, 56,124,248, 48,213,173, 91,183, 57,149, 93, 79, 41, 41, 41, 63, 76,152, 48,225,117, 97,222,107,108, - 26, 82,132, 67, 35,211,177, 45, 36, 6,195,172, 14,226,117,106, 2, 54,111,222,140,243,231, 47, 80,231,206,157,231,252,254,251, -239,162, 62,125,250,172,117,112,112, 56, 81, 93, 38, 85, 42,213,226, 41, 83,166,100,231,229,229, 33, 47, 47, 15, 69, 69,197,120, - 93, 0, 68,174,246, 70,228,106,111, 20,155, 4, 8, 93,191,129, 17, 25, 25,169,136,137,137,177,239,219,183,239,106, 59, 59,187, -173,213,105, 38, 39, 39,223,153, 58,117,106,113,110,110, 46,180, 90,173,206,104, 52,106,139,138,138,244,251,246,237,251,204,202, -202,170,205,169, 83,167,216,231,207, 95, 96,253,254,251, 21,206,165, 75,151,100,129,129,129,251,149, 74,229, 14,115, 34,101, 76, - 38,115,205,174, 93,187,198,132,134,134, 42, 3, 2, 2,124, 42, 84, 69,217,117,239,222,189,193,175,191,254,234,176,124,249,242, - 57, 40,233,128,242, 94, 81, 40, 20,211, 66, 66, 66, 16, 26, 26,138,227,199,143,207, 92,187,118, 45,122,245,234, 5,123,123,251, -169, 48,191,218, 11, 0, 86,252,248,227,143, 94, 94, 94, 94, 24, 61,122,180,118,220,184,113,179,182,111,223,238,122,237,218, 53, -206,142, 29, 59, 26, 76,156, 56,113,198,240,225,195,139, 27, 54,108,136,117,235,214, 53,102, 48, 24,107,204,186,191,149,202,207, -134, 13, 27,134,149, 43, 87,226,247,223,127, 31,132,146, 7,170, 22,192,233, 27, 55,110,244, 93,178,100, 9, 6, 13, 26, 4, 71, - 71,199, 25,117,137, 60,121,123,123,127,211,179,103, 79, 92,187,118, 13,126,126,126,104,211,166,205, 76, 0,138, 58, 30, 78,134, - 88, 44,222,191,125,251,246, 14, 13, 26, 52,192,162, 69,139,208,168, 81, 35,108,221,186,181,131, 72, 36,218, 15, 51,155,111,200, -100, 50,177, 80, 40,196,156, 57,115,200,160, 65,131, 94,215,180,204,156, 57,147,240,120, 60,200,229,114,115, 59,190, 8,248,124, -126,219, 38, 77,154,224,246,237,219, 56,127,254, 60,230,205,155,135,207, 62,251, 12,233,233,233, 24, 58,116,168, 16,192,135,181, -216,111, 27,107,107,107,228,230,150,204, 11,223,164, 73, 19, 60,120,240, 0,233,233,233,112,116,116,132, 90,173,134,149,149, 21, - 60, 60, 60, 96, 50,153,108,204,147, 36, 77, 20,150, 50,164,101,105,192,130, 1,254,238, 10, 92,142,202, 68, 66,186, 22, 54, 86, - 22, 80,167,165,195,193,138, 15, 39, 39,103, 16, 98,106, 98,150, 3,102, 50,252,121,124, 1, 94,231,233,144,252,228,247, 76,157, - 81, 51, 33, 59,246, 70, 98,118,236,141, 68,157,166,120,194,253,235,231, 51, 27, 40, 5,112,114,114, 2, 69, 76,173,222,199,253, -248,145, 51,156, 68, 2,214,232,243,219,190,161, 78,252, 50,151,210,100, 38,180,236,169, 44,137, 44, 91, 3,174, 31, 13, 29,218, -118,214,172, 89,252,212,212, 84,211,240, 33, 67, 94, 47,254,246,219, 11,103,106,120, 49,200, 7,220,186,119,239, 14, 6,128, 51, -231,206, 21,168,129, 36, 0, 80, 2, 78,253, 6, 12,232,248,213,151, 95, 10, 50, 50, 51, 77,183, 95,230, 31,139, 78, 35, 3, 45, -141,112, 53,167,125,150, 17,104, 90,166,123,246,236, 89, 82, 4,220, 7,128,206, 78,152, 26,212,206, 55, 96, 84, 72, 71,164,164, -101, 97,198,226,109,216,120,224,202, 89,153,158,116,249, 7, 61,138,199,215,201,104,149, 86,253,252, 33,173,176,240,143,181, 7, -245, 53, 48,127,134,102,101,252, 19,141, 86, 25,122,125, 73, 45,137, 86,111,130, 86,111, 42,123,171, 69, 81, 81,145,217, 18,103, -207,158,221, 57,125,250,116,172, 94,189, 26,207,159, 63, 7,135,195, 65,147, 38, 77,236, 0,136,203,202,124,127,127,127, 27, 6, -131,129,167, 79,159, 98,213,170, 85,248,228,147, 79,200,205,155, 55,183,162,242,241, 82, 30,188,126,253,122,253,132,113,159,100, -103,165, 38, 64, 95,148,133,180,228, 87,208, 20,100, 99,209,210, 31, 80,168,103, 65,157,163,131, 58, 71, 7, 6,207, 18, 27,127, -217,206,244,246,246,238,201,100, 50,131,171,201,231,237,212,212,212, 95, 38, 77,154,148,173, 86,171,223,236,159, 86, 79,160,213, -191,125,189, 10,133, 66,172, 89,179, 70,230,238,238, 30,194, 98,177, 2,171,209, 76, 73, 76, 76,140,158, 52,105,146, 54, 53, 53, - 21, 57, 57, 57, 56,118,236, 88,223, 6, 13, 26,200,151,173, 88, 77, 21,232, 88, 80,103,235,160,206,214,129, 43,182,193,254, 67, -191, 49, 61, 60, 60,134,179, 88,172, 54, 53,153,172,221,187,119,143, 26, 50,100,136,100,197,138, 21,175,143, 30, 61, 26, 10,160, -252, 9,121,186,102,205,154, 3,251,247,239,207,251,226,139, 47, 44,151, 47, 95, 62,243, 61,155,173,192, 33, 67,134,120,154, 76, - 38, 28, 60,120, 48, 18,192,143,191,253,246,219, 61,141, 70,131,161, 67,135,186,150, 86, 35,153, 67,203,225,195,135, 79,238,208, -161, 3, 62,253,244, 83,221,133, 11, 23,252, 1,172, 70, 73, 85, 46, 1, 16, 15, 96,237,149, 43, 87,154, 79,155, 54, 77,211,170, - 85, 43,124,252,241,199,159, 0,232, 80,131,110,219, 97,195,134,121,153, 76, 38,236,219,183, 47, 2,192,169, 10,223, 95, 58,116, -232,208,109,173, 86,139, 17, 35, 70, 52, 4, 80,155,130,156,195,227,241, 14,126,255,253,247, 22,201,201,201, 24, 53,106,148,230, -233,211,167,248,246,219,111, 5, 50,153,236, 84,185,123,192,108,120, 60,222,230,159,127,254, 57,164,105,211,166,152, 52,105,146, -118,195,134, 13,211, 39, 79,158,172,245,247,247, 71,104,104,104, 8,151,203,173,213, 20, 29, 42,149, 42,251,201,147, 39, 86, 53, - 45, 73, 73, 73,230,118,207, 23,138,197,226, 91,190,190,190,185, 77,154, 52,249,192, 96, 48,224,241,227,199,175,118,238,220,105, -106,210,164, 9,214,175, 95,143,229,203,151, 35, 56, 56, 24, 76, 38,211,108,163,197,100, 50,161,211,233, 32, 20, 10,193, 98,177, -240,234,213,171,178,161,101,192,225,112, 0, 0, 34,145, 8, 2,129, 0, 12, 6,195,172,222,104, 20, 5,146, 91,168, 7,155,205, - 0,139, 97, 66,116,124, 14,116,122, 19,248, 28, 38,216, 44, 10, 32, 38, 88,136,216,224,115,153, 96, 80,148,201, 76, 77,228, 20, -232,192,229, 48,192,230,112, 41,134,193, 40,120,243,112,100, 25, 5, 2, 1,151, 82, 72,121,224,115,254, 66,211, 2, 83, 37, 13, -203,199, 0,108,145,179,243,224,149,171, 86,113,115,243,243, 49,104,208,160,215,113,247,238,237, 42, 2,238,117,170,161,147, 18, -131,197,114,239,220,169, 19,194,194,195,145,151,149,245, 2, 40,105, 28,207,181,183, 31,178,102,205, 26,110, 81,113, 49, 6, 13, - 28,152,253,252,250,245,221,137,249, 56,177, 47,190,196,136,213,120,222, 57, 28,219, 50,221,156,172,172, 44,160,100, 8, 9,165, -181,120,217,148,225, 61,144, 87, 88,140,217, 63,236, 50,133, 71,167, 76,189,150,132, 62,191,169,144,243, 15,123, 12,143,175,176, - 0, 48, 99,192,210,178,232, 82, 77,102, 69,163,209,188,115, 3, 84, 95,205,202, 76, 98,125, 53,255,138,176, 88,172,226,103,207, -158,113,165, 86,246, 38, 43, 9, 59,171,193, 39,215,101, 0, 96, 41,102,229,232,140,122,147, 74,165, 2,143,199, 43, 54,179,186, - 97,220,230,205,155, 23, 1,240, 97,177, 88, 39,182,111,223, 78,237,218,181, 75, 62,108,216,176,151, 79,158, 60, 73,246,245,245, -117,217,190,125,187, 20, 0,214,174, 93, 75,246,239,223,223, 3, 37, 67,102, 84, 57,142, 75,106,106,234,183,153,153,153, 55,167, - 76,153,178,142,203,229,202, 69, 34,145,213,181,107,215,168, 98, 29, 65,203,175,226,223,244, 68,148, 10, 24,184, 58, 87,138,241, -227,199, 51,159, 60,121,178, 52, 57, 57,249, 68, 53,154,115,178,179,179,175, 61,127,254,124,181,204,177,133,181,200,229, 43, 89, -192,220,167, 0, 0, 23, 5, 27,140,210,114, 49, 59, 59, 27,233,233,233,152, 60,121,178,252,229,203,151,115,146,147,147, 47, 87, - 19,213,186,146,145,145,145,244,232,209,163,206,108, 54,155, 43, 18,137, 90,222,186,117,139, 42,214,154,208,108, 78, 60, 94,231, -151,228,211, 82,204,194,253,239,149,152, 58,117, 42,235,197,139, 23, 63,164,164,164,180,175,180, 48, 99, 48,150,151, 55, 89,179, -103,207,126, 8,160, 33,128,183,170, 70,141, 70, 35, 53, 98,196,136, 40, 0, 77,190,248,226, 11, 75, 66,200,204, 57,115,230,188, - 6,176,233,127,125, 45, 73,165,210,101, 19, 38, 76,192,254,253,251,145,149,149,181, 6, 0,114,115,115,127,220,179,103,207,190, -113,227,198,225,215, 95,127, 93,150,158,158,126, 6, 53,119,213,238, 53,116,232, 80,156, 62,125, 26, 23, 47, 94,252, 6,192,227, - 42,214,123,126,237,218,181, 57, 71,143, 30,253,105,216,176, 97,216,182,109, 91, 79, 0,213, 53,144,237,222,163, 71, 15,156, 58, -117, 10,153,153,153,161,149,173,144,157,157,189,225,216,177, 99,173,123,244,232,129,165, 75,151,118, 7,112,201,140, 93,247,146, -201,100,219,127,250,233,167,150, 77,155, 54,197,240,225,195,139,117, 58, 93,207, 47,190,248,226,248,222,189,123, 37, 59,119,238, -252, 96,252,248,241,119, 74,199,124,187,109, 86, 40,139,193, 88,178,106,213,170,177,157, 59,119,198,204,153, 51, 13,103,207,158, -237, 7,224,220,153, 51,103, 94,206,158, 61,251,228,170, 85,171,152, 43, 87,174, 28, 59, 99,198,140,116,147,201,244,190,204,245, -247,107,215,174,109, 29, 20, 20,132, 87,175, 94,225,246,237,219,208,233,116,191,222,186,117,235,170,155,155,219,247, 90,173,246, -184, 72, 36, 26, 45,145, 72,124, 91,180,104,209,229,254,253,251, 66,152,215, 78, 47, 53, 54, 54,214, 66, 38,147,193, 96, 48, 32, - 50, 50, 18,206,206,206,208,233,116,136,137,137, 65,211,166, 77,193,225,112,144,154,154,138,114,209,242, 26, 76, 17, 35,242,101, -156,170,161,165, 68, 4, 24,249,120,240, 52, 9,214, 10, 57,140, 20, 3,106,117, 10, 90,120, 58,130,162, 40,100,103,170, 65, 81, - 84,148, 57,154, 70, 98, 10, 75, 80,165, 57, 88, 73,120,104,218, 58,200,234,214,153,244, 93,210,134,237,198,179,152, 20,147,203, - 19,111, 26,251,241,199, 10,147,137, 32, 59, 51, 21, 44, 6,227,238,251, 56, 65, 7, 19,144,216,169, 17,255, 65,208,216, 69, 45, - 40, 2, 82,164,195,206,109,169,200, 18, 2, 45,214,126,253,181,133,149, 66,129,225,195,135,155, 50,147,147, 47, 20,154, 57,176, -114, 67, 55, 55,165, 88, 34,193,141, 27, 55,192, 44,105, 99,139,173,128,215,242,217,179,173,108,108,109,241,201,216,177,166,212, -132,132, 75, 69,128,170, 54,121,109,216,168, 17,187, 76,151, 81,170,155,194,196,244, 47,250,117,224,137, 4, 60, 44,217,248, 27, - 18, 51, 10,246,221, 74,193,198,127,104,188, 99,115,181, 17,173,170, 26,159,149, 52,170, 22, 86,107, 86,248,124,254,155,104, 74, - 45,222,244,222,185,102, 77,252, 25,154,239,145,185, 0,142, 2,152,155,152,152, 24, 61,118,236, 88,157, 65,167,201,187,185,168, -225,151,225, 75, 27, 76,186,245,173,221,164, 35,211,101, 95, 22,230,188,206, 91,187,118,173, 62, 49, 49, 49,186,252, 54, 53,104, - 39, 0, 56,181, 99,199,142, 13, 7, 15, 30, 68,147, 38, 77,240,248,241, 99,155,130,130, 2,191,168,168, 40, 75, 47, 47, 47,236, -218,181, 11,251,247,239, 95, 13,224,124,117, 38,171, 12,131,193,112, 65,173, 86,123,196,199,199, 55,182,176,176,208, 91, 88, 88, -160, 98, 79,196,220, 34, 19, 50,179,115, 96,105,105, 5,169, 84,234,106,134, 57, 63,165, 86,171,221, 77,114,207,142,238, 25,107, -114,194,150, 56, 33,108,137, 19, 78,205,177,135,157, 5, 23, 89, 89, 89, 72, 79, 79, 71,122,122, 58, 40,138,130, 94,175,247, 54, - 67, 51, 38, 37, 37,101, 75, 66, 66,194, 81,165, 82, 9,137, 68, 2, 2, 64,157,173,199,195,149, 94,120,184,210, 11,234,108, 61, -114,243,242,208,160, 65, 3, 72, 36,146,170,170, 40, 24, 14, 14, 14,189,135, 12, 25, 34, 1,128, 82, 3,213,149, 16, 50,169,146, -101,162,193, 96,104, 87,182,238,231,159,127,110, 9,160,199,255,248,122, 98, 2,152, 50,110,220,184, 15,248,124, 62,214,175, 95, - 31, 3, 96,119, 89, 89,191, 97,195,134,167, 0, 48,125,250,116, 95, 0, 51, 81,197, 72,208,111, 66, 67, 28,142,191,183,183, 55, -110,221,186, 5, 0,191,213,240,219,135,110,222,188, 9, 55, 55, 55,240,249,252,150, 53,172,235,234,228,228,132,167, 79,159, 2, -192,131, 42,214,121,240,244,233,211,146,234, 30,138,114, 53, 99,223, 67,130,130,130, 34, 47, 95,190,220,178,109,219,182, 24, 59, -118,172,246,206,157, 59,189, 1, 92,125,240,224, 65,224,136, 17, 35, 10,220,221,221,113,229,202, 21,175, 17, 35, 70,220,100, 48, - 24,139,204,208,252,228,187,239,190,155,219,191,127,127,124,247,221,119,228,192,129, 3,195, 1,156, 43,253,238,236,190,125,251, - 70, 45, 94,188,152, 12, 28, 56, 16, 11, 23, 46,156, 11, 96, 82,117, 98, 5, 5, 5, 57, 70,163, 17, 5, 5, 5,102,133,228,205, - 93, 95,161, 80,244, 10, 10, 10,194,188,121,243,224,224,224,128,227,199,143, 19, 0, 39, 0, 92,211,106,181, 29, 1,172, 42, 40, - 40, 56,114,235,214, 45,116,239,222,157,131,183,167, 24,169,238,247, 35,247,236,217,163,145,201,100,112,113,113, 65,195,134, 13, -161, 86,171, 17, 23, 23,135,166, 77,155,194,223,223, 31, 6,131, 1, 91,182,108, 41,206,203,203, 51,107, 76, 62,131,182, 96,231, -249,147,135,115,172, 36, 60, 56,218,200,208,192,193, 18,249,217, 25, 72, 87,171,224,239,237,140, 78,254, 13,144,145,163,197,217, - 19,135,179,242,242, 10,119,154, 21,194,215, 20,110,191,112,230,120,142, 92,194,129,135,167, 47, 70,140,157,222,162,133, 95,192, -249, 86,173,218,157, 93,177,108, 73,179,174,109,188,169,164,140, 98,156, 62,241, 91, 86, 78,110,238,246,247, 81,208, 47, 4,152, -197, 50,247,171,161, 71,195,182,248,244, 28,183, 37, 58, 9,107, 0, 64,207,100,122,245,238,213, 11, 73, 73, 73, 56,124,240, 96, - 74, 33, 16, 97,174,158, 64, 32, 96, 0, 64, 78, 78, 14,120,165,237,238, 12,128,103,159, 62,125,144,158,145,129, 61,187,119,167, -159, 6,194,107,147,207,190, 0, 87, 40, 40, 9, 8,230,228,228,128, 2,114, 1,128, 98,161,119,171, 38,110, 72,127,157,139,203, -119,163,243, 27, 20, 97,114,117, 58,127,227,134,240,117,107,163, 5, 32, 99,230,204,153,224,241,120,176,179,179,123, 99,142,202, -204, 10,151,203,133,157,157, 29, 12, 6, 3,246,237,219, 7, 0, 25,213,190,225, 1,154,126,147,150,154, 52,122, 82,200,102,179, -223,137,102,233,155,163,102,208,236,109,166, 51, 55, 43,239, 20, 83, 23,205,191, 1,173, 74,199,196,106, 5, 32, 43, 46, 46, 46, -105,240,160,126, 57,241, 47, 31,169, 11,178, 85, 41,185,153,137, 41,137, 49, 81,234,175,230,204,204, 73, 74, 74, 74, 68,201, 88, - 90,173, 84, 42, 85,217, 54,230, 48,115,240,224,193, 63,143, 27, 55,142, 60,124,248, 16, 0, 16, 22, 22,134,143, 63,254,152,140, - 26, 53,106, 13,128, 47,235,144,239,130,162,162,162,183,162, 33, 58,163,233, 77,149, 95,110,110, 46, 84, 42, 21,180, 90,173,217, -142,248,249,217,149,207, 94,199,221,215,251,186,136,224,235, 34,130,151,147, 16,148, 33,255,141,201, 74, 79, 79, 47,123,115, 46, -174, 69, 62,115, 53, 26,205, 91,249, 44, 95, 53,153,155,155, 11,181, 90, 13,163,209, 88,213,131,204,148,156,156,124,118,255,254, -253,121, 0,176, 98,197,138,215, 20, 69, 93,164, 40,234,231, 74,150,141, 44, 22,235, 70,217,186, 43, 87,174,124,141, 63, 86,137, -253,153,244,111,218,180,105,214,220,185,115,215,207,152, 49, 3, 27, 55,110, 68, 74, 74,202,151,248,255,177,120, 76, 25, 25, 25, -179, 67, 67, 67, 49,102,204, 24,204,159, 63,127,165,159,159, 95, 46,128, 17, 85, 9, 90, 91, 91, 59,178, 88, 44,132,135,135,231, - 2,120, 85,195,239,171,195,195,195, 83, 41,138,130,157,157, 93,163,234, 86,180,180,180,108, 44,145, 72,144,156,156, 12,148,190, - 49, 87, 66,156, 74,165, 34, 92, 46, 23,246,246,246,110, 53,237,188, 92, 46,159,189,101,203, 22,214,163, 71,143,208,181,107,215, -164, 43, 87,174,116, 7, 80,214, 37, 61, 60, 44, 44,172, 67, 96, 96,224,179,243,231,207,227,135, 31,126,160,154, 55,111, 62,169, - 38, 77, 23, 23,151,137,159,124,242, 9,214,173, 91,135, 77,155, 54, 77, 2,112,176,194, 42,123, 67, 67, 67,167,111,218,180, 9, - 99,199,142,133,171,171,235,136,234,244,226,227,227,231,116,238,220, 57,236,249,243,231,102,205,120, 96,230,250,129, 1, 1, 1, -141,139,138,138,176,125,251,246, 87,141, 27, 55,190,119,240,224,193,153,248,227, 3,251,200,225,195,135, 49,114,228, 72, 52,111, -222,124, 59,128, 97,230,220,150, 79,158, 60, 73,188,116,233,146,137,195,225,192,197,197, 5,193,193,193, 24, 62,124, 56,154, 53, -107, 6,157, 78,135,195,135, 15,155,162,162,162,146,180, 90,173, 89, 99, 41,101, 62,255,253,120,108,236,179, 27,225,119,174,234, - 89, 76, 6,156,237, 44, 49,160, 91, 11,252,231,195,118,240,247,114, 64,124, 90, 17, 46, 93, 58,175,143,141,125,117,203,156, 30, -135,101,154,209,143, 35,110, 62, 10,191,110, 96,179, 40,120,121,186, 99,222, 87,179,229,139, 23,204,177,112,111,228,140,136,152, - 28,156, 63,119, 90,175, 74, 74,188,252,190,122, 28, 94, 1, 56, 98, 30, 37, 98, 50, 24, 48, 50,120, 5,204,210,142, 52, 77,124, -124, 60,148,182,182, 56,121,242, 36, 24,181,232, 17,122, 5,224,136,197, 37,181,224,249,249,249, 40,211,107,236,233,233,233,236, -226,130, 83, 39, 79,130,105, 50, 61,233, 84,203, 1, 70,159,150, 84, 67,191,209,165,128,226,201, 78,144, 52,118,178,241,148,203, - 68,184, 19,241, 2, 26, 61,185,187, 59, 11,239,117, 60,178, 63,145,241,168, 99,213,225,138,141, 27, 55,182,218,178,101, 75,247, -153, 51,103,138, 71,143, 30, 13, 62,159,143,194,194, 66, 56, 58, 58,194,104, 52,226,204,153, 51,184,127,255,126,190,201,100, 58, -143, 63, 14, 27,208, 13,229,122,105,156,125, 5, 65,137,223, 42,108,117,244,163,143,222,137, 38, 0,136, 95,152,164,153, 13,180, -187,214, 30,188, 62,112,207,217,112,234,211, 97,157, 24,254,158, 78, 0, 0,165, 82, 9,169, 84, 90,107,205,119,192,159,174, 89, -190, 90, 87,173, 86, 63, 85,171,213,105,227,198,141,243, 42,107,248,206,227,241,138, 75, 35, 89, 89,149,109, 99, 70, 62,117, 0, - 38,111,217,178,229, 88, 78, 78,206,217, 47,190,248, 2,139, 23, 47,198,241,227,199, 59, 0,184, 81,199,125, 55,102,101,101,101, -223,189,123, 87,233,230,237,135,134, 54,108,116,252,230, 57, 8, 33,176, 18, 18,228,101,191,198,131, 7,225,200,203,203,187, 83, -155,124,234,116,186,236,180,180, 52,133,141,141, 13, 94,191,126,141,140,140,140, 55, 38, 43, 43, 43, 11,175, 95,191, 38, 20,245, -135, 49, 91,170,211, 44, 72, 75, 75, 43,140,142,142,230, 42,157,220,208,200,134,131,128,175,158, 2,132,192,217,146,129,188,220, -108,220,186,117, 11, 57, 57, 57,191, 87,165,105, 50,153,102,141, 24, 49,130, 9, 96,212, 23, 95,124, 97, 9,160,249,236,217,179, -207,163, 66,207, 66, 22,139,245,227,174, 93,187,154,148, 85, 49,206,153, 51,103, 53,128, 45,255,171,107,201,202,202,106,214,201, -147, 39, 37, 58,157, 14,107,215,174,197,234,213,171,183,226,143, 3, 85,158, 92,191,126,125, 40,131,193,152, 50,117,234, 84, 76, -152, 48, 65,248,193, 7, 31,204, 76, 73, 73,217, 93,153,102,114,114,242, 60,127,127,255,249,105,105,105, 75,204, 50,203,207,159, -143,247,247,247,159,151,150,150,182,188,186,115, 36, 18,137, 68, 70,163, 17,177,177,177, 89, 64,149,237, 59,138, 99, 99, 99,147, -141, 70,163,163, 80, 40,180,172,233,250,204,202,202, 90,242,193, 7, 31,124,155,154,154,122, 14,192,162, 74, 12,249,195,148,148, - 20,223, 25, 51,102, 76, 91,182,108,217, 64,181, 90,189,175, 38,205,248,248,248, 37,129,129,129,223, 60,123,246,108, 7,170,174, - 2, 94,191,112,225, 66,221,174, 93,187, 38,197,198,198, 46,173, 65,243, 68, 70, 70,198,137, 90,156,223,170,214,127,163,201,100, - 50,103, 47, 91,182,140,177,113,227, 70, 16, 66, 86, 26,141,198,170,242, 25,113,228,200,145,157,237,218,181, 27,125,240,224, 65, -190,175,175,239, 4,141, 70,179,183,166,235,179,176,176,240,240,193,131, 7, 7, 70, 68, 68, 56,142, 30, 61,154,239,225,225, 1, -157, 78,135,148,148, 20,108,220,184,177, 56, 42, 42, 42, 41, 59, 59,251,112,109,202, 16,131, 54,119,216,205, 75, 71,247,198, 61, -143,106,211,185,103,136, 92,171,115, 4, 47,147,137,236, 76, 53,206,156, 56,156, 21, 27,251,234, 86, 97, 97,246,176,218,104,234, - 52, 57, 67,111, 93, 62,182, 47, 41, 54,186,117,199,192,222,242, 98,173, 11,120, 28, 6, 50, 83,147,113,230,228,209,215,177,177, - 49,215,138,245,154,143,223, 87, 57,207,116,197, 34,166,250,254,184,137,125, 91, 64, 32,119,124,192, 6,214,182, 3, 4, 10,165, -146, 83,122,239, 64, 92,210,230,209, 44,205, 84,128,235, 86, 90, 75, 85, 88, 88, 8, 54,160, 29, 3,176,173,173,173, 5, 0,240, -236,217, 51, 8, 75,106, 53,106,149,207,124, 64, 36, 44,167,203, 0, 10, 51, 89,112,104, 44, 21, 81, 0,144,164,206,132, 86, 95, -237,115,227,239,206,230,114,134,107,115, 93, 4, 56, 0,186,137,197,226,197,243,231,207, 95,121,231,206,157,149,193,193,193, 43, -121, 60,222,226,210,131,205,169,230, 68,252,207, 52, 91,218,195, 50,176, 17,117, 53,168, 49,101,154,216, 65,110,252, 56, 64,164, -237,210,165, 75,104, 61,243, 89,159,155,229,207,212, 60,170,215,235, 9, 74,170,237,142,162,234, 42,193,185,229,190, 87, 39, 36, - 36,144,210,191,107,147, 79,197,144, 33, 67, 76,121,121,121,100,240,224,193, 4, 53, 79,225, 83,173, 38,143,199, 11,236,216,177, -163, 62, 53,253, 53,121, 26,147, 76,110,135, 61, 38,103, 47,221, 36,251, 14,159, 36,235, 66, 55,145,102,205,154,105, 1,184,212, - 70,147,197, 98,117, 9, 12, 12,204, 76, 77, 77, 37,209,209,209,228,234,213,171,228,208,161, 67,100,211,166, 77,228,231,159,127, - 38, 78, 78, 78,169, 0,148,181,209, 20, 8, 4, 33,189,122,245,210,103,231, 22,146,216,228, 76, 18, 25, 29, 75,110,220,141, 36, -103, 46,221, 32,187,247, 30, 36, 62, 62, 62,197,102,104, 50,153, 76,230,186,125,251,246,229, 18, 66, 72, 72, 72, 72, 18,222, 30, - 72,181,225,172, 89,179,210, 8, 33,100,249,242,229,153,168,188, 33,252,159,125, 45,245,116,112,112,120,202,225,112, 78, 2, 24, - 85,195,118, 67, 89, 44,214,113, 91, 91,219,123, 0, 6,188,135,251, 40,216,198,198,230, 54,128,154,102, 56, 40, 91,175,255, 63, -228,126,255, 51, 52,187,176, 88,172,171, 64,245,147, 8,151, 43,175,191,103, 50,153,167, 0,116,173,101, 62,221, 21, 10,197, 96, -185, 92,254,169, 92, 46,255,212,198,198,102, 48,151,203,117,175,207,190, 91,185,119,235,235,236,215,239,136, 83,243, 62,241,206, - 45,130,227, 93,253, 67,142, 88,185,119,235, 91, 95, 77, 23,255,144,163,206, 45,130, 19,156, 91,244,141,107,216, 50,228,136,194, -179, 91,175,247,121,142, 70, 57,192,190,123, 67, 24,200,213,111, 8,185,250, 13,233,214, 16,166, 54, 22,240,105, 5, 72,122,116, -235,182,138, 24,141,171, 6,246,239,191,202, 13,176, 34, 0,179,226, 82,153,166, 31, 32,125,179,109, 72,200,170, 70,128,162, 59, - 32,236,212,161,195, 74, 98, 52,174, 26, 49,116,232, 42,103,192,182, 50,189,170, 52, 9,192,116, 0,236,203,235, 42,128,198, 31, -186,194,119,110, 95, 87, 66,174,126, 67, 22,126,228, 65,252,149, 24, 85,131,102, 85,145,162,191,117, 68,171,182,136, 74, 11,215, -165,165,159,162,119,112, 17,190,115,205,214,118,240,232,214,152,138,238,237,201,122,141,146, 46,201,162,127, 96, 33,185, 67,171, -213,146,226,226, 98, 82, 88, 88, 72,242,243,243, 43, 26,168, 55,134, 76,165, 82,145,164,164, 36,146,144,144, 64,226,226,226, 8, -254,191,237,141,217,249,148, 74,165, 91, 62,250,232, 35, 35,155,205, 94,247, 46,246,221,210,210,114,105, 64, 64,128,238,167,159, -126, 34, 71,142, 28, 33,191,252,242, 11,153, 58,117, 42,105,210,164,137,198,194,194, 98, 88, 93, 52,109,109,109,231,121,122,122, -102,110,221,186,149,236,222,189,155,172, 89,179,134,124,253,245,215, 70, 71, 71, 71,181, 68, 34,233, 81, 23, 77, 27, 27,155,205, -237,219,183,215,109,222,188,153,156, 63,127,158,236,217,179,135,204,154, 53,139,120,121,121,105, 68, 34,209, 32, 51, 53,153, 44, - 22,107,213,196,137, 19,213,246,246,246, 39, 43,124, 39,244,241,241,185, 55, 98,196, 8, 21,128, 57,255,160,235,147,214,164, 53, -105,205, 63,193,104, 13,183,135, 3, 1,152, 66, 14,103,104,167, 14, 29, 86,114,128,161,181, 53, 69,124, 38,243,195,118, 1, 1, - 43, 57,192,176,178,117,249, 76,230,135,157, 58,116, 88,201,102, 50, 71, 86,165, 87,157, 38, 1,152, 28, 22,107, 78,187, 54,109, - 86,177,128,175,202,210,186, 52,164,158,204,234,233, 68, 58,184, 80, 47, 70,218, 64,248, 15, 54, 90,239, 28,214,159,112, 17,254, - 93, 52,255, 42, 55,181, 91,169, 97, 58, 90,139,136,214, 81,148,204,162,238, 86,199,124, 10,222,241,190, 55, 85, 40, 20,167,221, -220,220,210, 27, 52,104,160,146,203,229,123, 1, 56,214, 83,211,215,214,214,246, 87,165, 82,249,220,206,206, 46, 66,161, 80,252, -136,146, 81,231,235,172,201,102,179, 3,148, 74,229,239,174,174,174,217, 46, 46, 46,169, 10,133, 98, 95, 37,145, 44,115, 52,237, - 80,121,161,194, 41,253,142,126,232,208,154,180, 38,173,249,150,129, 9,106,132,101,221, 27,194,208,189, 33,140, 65,174,248,177, -188, 65, 9, 6, 4,117, 53, 69, 31, 3,188,138,235,215,164, 87,147, 38, 1,152,109, 1,113,197,109,122, 59,194,199, 76,205,191, -123, 68,171,172,156,175,221,240, 14, 85, 96,248, 19, 50,249,119,209,252,171,240, 2,213, 52, 70, 46,199,210,119,248,155, 69,239, -120, 31, 34, 51, 50, 50,122,101,100,188,211,190, 9,143,212,106,245,168,119, 41,168,215,235,239,164,166,166,118,126, 7, 82, 85, -117,189,214,193,204,110,217, 52, 52, 52,255, 30, 40,192,136, 87,248,178,155, 59,214,178,140, 96,156,137, 65,114,133, 46,121, 69, - 84, 93, 52, 75, 48,238,168,164,140,167,234,154,207,255, 39,255, 15, 26, 73,120, 76,253,123, 78, 91, 10, 74,218,104,213,219,104, -209,208,208,208,208,208,208,252, 15,184,240,156,126, 17,251, 27,112, 18,111, 71,223, 78,150, 51,162, 85,134, 62,107,211,147,162, - 46,225,211, 11,180, 38,173, 73,107,210,154,180, 38,173, 73,107,254,235, 52,203,168,106,238,212,167, 21,254,175, 83, 47,190,127, - 11,116, 61, 59,173, 73,107,210,154,180, 38,173, 73,107,210,154,255,116,234, 60,142, 22, 13, 13, 13, 13, 13, 13, 13, 13, 77,245, - 84, 25,117,163,141, 22, 13, 13, 13, 13, 13, 13, 13, 77,253,176, 67,201, 20, 85, 39,241,255, 83, 85,109, 6,106,158,130,231, 45, -150, 45, 91,198,112,115,115, 19,115,185,220, 38,175, 94,189, 98, 76,158, 60,185,222, 29, 9, 86,254,184,142,225,226,226, 34, 6, -208, 36, 51, 43,143,241,201,127,190,160,232,243, 69, 67, 67, 67, 67, 67, 67,243, 55,162, 79,169,177, 42,251,124, 19,225,170,149, -209, 90,180,104, 17, 18, 18, 18, 68, 0,134,248,250,250,114, 55,108,216, 64, 14, 28, 56, 80, 47, 99,244,213,156, 89,136,143,143, - 23, 1, 24, 98,163,176,224,110,219,178,130, 28, 60,126,253,157,155, 45,133, 66, 97,245,191,220,142,134,134,134,134,134,134,230, - 95,197,248,114,159,227,235,100,180, 88, 44, 22,147,203,229, 54, 98, 48, 24,189,248,124,126, 75, 0, 40,157,146,165,206,176, 88, - 44, 38,151,199,107,196,100, 50,123,241,120, 37,154, 31,245,109, 95, 95,205,174, 34,145, 40, 81, 40, 20,222, 7, 32,144, 72, 36, -225, 58,157,238,177, 68, 34,185, 89, 27, 29,137, 68,114,179,116,187,112, 0, 2,161, 80,120, 95, 36, 18, 37,178, 88,172,174,244, -245, 68, 67, 67, 67, 67, 67, 67, 83,202,230, 74,150, 63,114,226,196,137, 42, 13, 14,151,203,101,248,250,250,182,119,113,113,185, -225,237,237,173,117,116,116, 60, 36, 20, 10, 69,245,204, 24,195,205,195,171,189,189,157,242, 70,139, 70,118, 90, 27, 27,155, 67, -108, 54,187, 62,154, 76,137, 68,178, 38, 40, 40, 40,231,198,141, 27, 68, 42,149,166, 2,176,176,182,182, 86, 17, 66,136,173,173, -173,169, 54, 98,182,182,182, 38, 66, 8,177,182,182, 86, 1,176,144, 74,165,169, 55,110,220, 32, 65, 65, 65, 57, 18,137,100, 13, -106, 30,209,150,134,134,134,134,134,134,166, 22, 84,231, 69,254,194,148, 69,177,236,234,188,115, 92, 46,215, 79,161, 80, 68,125, -246,217,103,198,205,155, 55, 19, 23, 23,151,187, 54, 54, 54,109, 20, 10,197, 91, 13,234,199,140, 25, 83,155,106, 63, 63,137, 84, - 22,181, 99, 70, 79, 99,209,182, 16,226, 96,103,115,215,194,194,162,141, 84, 42,125, 75,115,196, 39, 19,204,209,180,151,201,100, - 17,203,150, 45, 43,206,206,206, 38,132, 16, 34,147,201, 82, 1,200,149, 74,165, 42, 38, 38,134, 40, 20, 10, 2,243,163,120, 12, -133, 66, 65, 98, 98, 98,136, 82,169, 84, 1,144,203,100,178, 84, 66, 8,201,206,206, 38,203,150, 45, 43,150,201,100, 17, 0,236, -233,219,130,134,134,134,134,134,230, 95,109,180, 42, 26, 46,243,170, 14, 91,182,108,201, 83, 42,149,109, 36, 18, 73,127,177, 88, - 28,218,175, 95, 63,223,129, 3, 7, 50, 52, 26,141,209,215,215,215,222,213,213,117,154, 92, 46, 31,197,231,243,155,113,185,220, -145, 82,169,212,110,239,222,189,110,213,105, 54,109,254, 1,207,194, 66,222,134,203,229,245, 23,139, 37,161, 19, 63,236,226, 59, -106,230, 32, 6, 71, 27,103,236,210,204,217,190, 73, 35,187,105,182,114,209, 40, 22,147,209,140,162,168,145,124, 62,223,110,247, -182, 77,110, 53,236, 88, 35,123,123,251,240,189,123,247, 54, 25, 50,100, 8, 47, 58, 58, 26, 0, 96, 52, 26,185, 0,244, 76, 38, - 19, 60, 30, 15, 58,157, 46, 11,128,185, 39,144,232,116,186, 44, 30,143, 7, 38,147, 9, 0,250, 82, 61, 68, 71, 71, 99,200,144, - 33,188,189,123,247, 54,177,183,183, 15, 7,208,136,190, 53,104,104,104,104,104,104,254,181,148,153,171,147,168, 80,117,200, 42, -115,143,193,193,193,111, 69,141,184, 92,238,134,103,207,158,181,179,180,180,108,196,102,179,141, 67,135, 14,229,141, 24, 49, 2, -233,233,233,166,252,252,124,166,159,159,159,242,222,189,123,189, 12, 6, 67, 7, 11, 11,139,194,236,236,108,133, 70,163,121, 1, - 96, 90, 53, 25,217,240,252,105, 84, 59, 43,185,101, 35, 46,155,105,156, 58,118, 4,239,171, 57, 61, 65,105,194, 76,198,180, 76, -230,247,254, 22,202, 31,111, 22,244,122,166, 51,118, 40,144,241, 11,213, 57,154, 26, 53, 21, 10,133, 63,135,195,185,127,250,244, -105, 8,133, 66,228,228,228,128,203,229, 2, 0,242,243,243,101, 0, 88, 20, 69,129,203,229, 34, 55, 55, 87, 94,155,163,150,155, -155, 43,231,114,185,160, 40, 10, 0, 88,165,122,224,114,185,200,201,201,129,155,155, 27,117,250,244,105,155, 94,189,122,189,212, -233,116, 31,100,100,100,132,209,215, 26, 13, 13, 13, 13, 13, 77,237,169,204,139,252,141,168,113, 28,173,206,165,161,186,242, 19, -231,238,180,182,182,182, 21,139,197,222,227,199,143,103, 40, 20, 10,220,191,127,223, 84, 80, 80,192, 96,179,217, 96,179,217,204, - 46, 93,186,136, 13, 6,131,240,212,169, 83,212,203,151, 47,211,245,122,253,247,153,153,153,247,170,201,200,206,198, 22, 60, 91, -129, 5,215,251,248, 23, 29, 25,214,110,153,192,217,133, 38,146,159,198, 96,153, 8, 20, 34, 19,115, 85, 7, 74,172,150,185, 10, -167,238, 75,167,174,189,204, 78,215,235,245,223,231,229,229, 85,167,153, 12, 0,165,121,130, 84, 42,133,209, 88,126,126, 75, 16, - 6,131, 1, 30,143, 87,167, 35,199,227,241,192, 96, 48,128,114,145, 48,153, 76, 6, 38,147, 9, 6,131, 1, 54,155,253, 86, 62, -104,104,104,104,104,104,104,234, 68,101, 94,228,239, 66,249,113,180,204,155,155, 82,169, 84, 82, 82,169,212,174,121,243,230,223, - 6, 5, 5,197, 12, 24, 48,160,240,167,159,126, 34,171, 87,175, 38,171, 86,173, 34, 91,183,110, 53, 94,190,124, 89,255,159,255, -252,167,216,221,221,253, 69,104,104,168, 55, 0,244,238,221,187,202,234, 72, 11,185, 37, 37,230,178,236,124,188,155,126, 59,188, -115,147,152,111,250,123, 20,234,118,248, 17,211,124, 39, 98, 92,231, 74,140, 7,187, 26,201,179, 21,250, 37,227,186, 22, 55,112, -105,240,226,231,173,251,189, 1,160, 91, 80,239,106,171, 56, 21, 10, 69, 75, 71, 71,199,212,115,231,206,153,178,178,178, 72,102, -102,102, 89, 27,173,108, 0, 50, 23, 23, 23,149,193, 96, 32,114,185,252,117,109,142,154, 92, 46,127,109, 48, 24,136,139,139,139, -170,196, 95,201,178, 9, 33, 36, 51, 51,147,100,101,101,145,115,231,206,153, 28, 29, 29, 83, 21, 10, 69, 75,250,254,160,161,161, -161,161,161,249,215, 50,190,194,103,205,180,107,215,142,146, 74,165,140,166, 77,155,138,237,237,237, 91,219,219,219,223,249,241, -199, 31,201,234,213,171, 13, 27, 55,110, 36,191,254,250,171,225,227,143, 63,206, 21,137, 68, 39,185, 92,174, 28, 0, 92, 93, 93, -171, 13,249,181,108,221,134, 18,240,121, 12, 79, 79, 31,177,194,202,170,181,181,149,229, 29,221,234, 38,132, 44,116, 48,144, 45, - 45, 8, 57,216,211,176, 98,112,171, 92, 54,155,115, 18,128, 28, 0, 28,237,237,204, 13, 35,218,219,216,216, 68, 44, 92,184,176, - 64,167,211,145,210, 94,134,169, 0, 44, 92, 92, 92, 84,132, 16,226,232,232,152, 8, 64, 97,166,158,194,209,209, 49,145, 16, 82, -102,180, 44,108,109,109, 83, 9, 33, 68,167,211,145,133, 11, 23, 22,216,216,216,208,141,225,105,104,104,104,104,104,104,170,156, -235,176,202, 72,209,141, 27, 55, 72,110,110,174, 41, 57, 57,217,152,159,159, 47,245,243,243,147, 51,153, 76, 40,149, 74, 38,147, -201, 52, 21, 20, 20, 48, 21, 10,133,138,205,102,239,214,106,181, 89,253,251,247,167, 98, 99, 99,171,109,104,126,239,246, 45, 82, - 84,172, 49, 37, 37, 37, 26, 11,243,115,165,163,154, 89,202, 89, 6, 29, 76,126,237,152,185, 2,119,147,169, 40,139,233,101,199, - 83,113, 56,236,221, 0,178, 6, 4,247,161,146, 84, 41,230, 54, 94, 87,165,165,165,249,109,216,176, 97, 75,199,142, 29,179, 10, - 11, 11,203,218, 86, 85, 28,130,193,194, 76,189,138,235, 49, 41,138, 66, 97, 97, 33, 58,118,236,152,181, 97,195,134, 45,105,105, -105,126, 0, 84,244,245, 69, 67, 67, 67, 67, 67,243,175,166,202,113,180,106, 28,234,160,176,176, 80,206,225,112,186,181,106,213, -170, 65, 65, 65,129,105,209,162, 69,137, 63,253,244,211,174, 23, 47, 94,232, 45, 44, 44, 26, 9, 4,130, 79, 81, 76,136,102, 0, - 0, 32, 0, 73, 68, 65, 84,135, 12, 25,162, 56,114,228, 8,233,208,161, 67,197,232, 83,165,179,123, 23, 21,229,203,121, 28,118, -183, 79, 3, 36, 13, 18,117,114,147,247,167,119, 19, 59,205,191,185,235,183, 71, 44,125, 83,203,162, 70,150, 92,234,211, 33, 67, - 6, 43,126, 59,113,146,180,105,211,218, 44,205, 82,140,105,105,105,159,222,191,127,127,112,195,134, 13,147,244,122,125, 18,128, -204,162,162,162, 84,123,123,251, 52,157, 78,151, 4, 64, 87,201,118,149,105,234,116, 58, 93,146,189,189,125, 90, 81, 81, 81, 42, -128, 76,189, 94,159,212,176, 97,195,164,251,247,239, 15, 78, 75, 75,251, 20,128,177,154,188,208,179,186,211,154,180, 38,173, 73, -107,210,154,180,230,191,135, 63, 68,179, 0, 51, 38,149,230,241,120, 29,157,157,157,219, 63,122,244,200,120,235,214,173, 28, 6, -131,241,115,239,222,189, 15, 29, 62,124, 56,192,210,210,210,198,201,201, 73,121,241,226,197, 64, 0, 7,174, 93,187,102, 86,244, - 73,192,227,116,108,225, 40,107,191,249, 33, 49,110,187,255, 60,199,200,228,253,220,101,208,160, 67,211,119,237, 9,176, 87, 72, -108, 90,216, 73,149,167, 78,157, 9, 4,112,224,214,173,219,181, 30, 79,195, 96, 48, 92, 76, 75, 75,115, 42,251, 63, 61, 61,221, - 79,161, 80,120,163, 36,250,148, 99,166, 76,188,201,100,234,109, 50,153,236, 51, 50, 50,158, 0, 64, 70, 70,198, 7,244,117, 68, - 67, 67, 67, 67, 67, 67, 83,137,201,218, 92,217,255,213, 70,180,184, 92,174, 3,147,201,244, 73, 74, 74,138, 63,117,234,212,163, -150, 45, 91,246,138,143,143, 95, 70, 8,137, 19, 10,133,227, 19, 19, 19,159, 39, 38, 38,106,139,138,138, 38,214, 34, 51, 14, 96, -112,124,238,171,138,226,127,184,248,248, 81,211, 54, 61,122,169,213,170,101, 70, 66,226,184, 66,233,248,103, 9,233,207,111,167, -105,180,197,197,181,210,172,145,140,140,140, 39, 25, 25, 25, 57,181,220, 38,167,204,100,209,208,208,208,208,208,208,208,212,150, -154, 34, 90, 58,163,209,184, 66,163,209,200,127,251,237,183,228,160,160, 32, 13, 0,108,216,176,193, 52,118,236,216,235,175, 94, -189,234,250,228,201,147, 94,182,182,182,151, 0, 80, 49, 49, 49,230, 68,159,116, 38,147,113,133, 86,171,145, 95,188, 28,150,220, -177,125, 83, 13, 0,108, 92,191,214, 52,116,252,140,235,175,162, 31,117,125, 22, 21,222,203,214,214,246,146,209,192,162, 82,212, -113,132, 62, 77, 52, 52, 52, 52, 52, 52, 52,127, 97, 54,227,237, 42,195,205,102, 25, 45,173, 86,155,174,213,106, 1, 32, 43, 40, - 40,232,173,239,182,110,221, 74, 0, 20, 0, 56,152,153,153, 89,155,204,164, 23, 21, 21, 1, 64, 86,199,246, 77,223,250, 98,223, -230,159,222,104,230,231,229,210,167,141,134,134,134,134,134,134,230,239,100,182,254, 0,131, 62, 46, 52, 52, 52, 52, 52, 52, 52, - 52,245, 98,124, 85,255, 83,168,186,231,192,133, 90,252, 64, 93,122, 31, 92,160, 53,105, 77, 90,147,214,164, 53,105, 77, 90,243, - 95,167, 89,147,246, 5,252,253,168,178, 49,252,159, 13,221,245,149,214,164, 53,105, 77, 90,147,214,164, 53,105,205,127, 58,118, -120,123,120, 7,187,178, 47, 88,244,177,161,161,249,123, 67, 14,130,137, 44, 79, 87, 16, 98, 15, 38, 55, 5, 41,145,175,168,111, - 97,170,183,102,170,143, 11, 4,122, 37, 12,252,116,164, 70,196,212, 87,147,134,134,230,159,135,109,219,201, 3, 40, 6,243,103, -138,152, 80,148, 26,205,227, 20,197, 9,211, 82,226,255,141,222, 34, 5, 85, 68,176,104,163, 69, 67,243,119, 39,221,203, 3, 44, - 44, 5, 3,118, 32,186,151,176,246, 89, 10, 60,142,170,183, 38,199,180, 8, 70,134, 35,136,238, 25,108, 60,151, 1, 79, 31,211, - 7,251,159,199,180,169,147,200,147,168, 59, 72, 72, 80,161, 81, 99, 59,120,120,181,197, 79,107, 67, 41,250,200,208,152,247, 86, - 70,109,238,214,119,132,165, 64, 40, 1, 0,152, 12,122,108,157,217,226,188,193, 96,216, 9,224, 8,128,162,127,251, 33,250,159, - 55,134,103,179,217,169, 0, 76,124, 62,255, 48,202,133,214,104,104,254, 4,236, 74,175, 51, 83,233,117, 87, 27,196, 44, 22,107, -190, 80, 40,188,204,227,241,210,120, 60, 94,154, 72, 36,186,204, 98,177,230, 3, 16,255,101,202,184, 95,155, 8,193, 48,246,210, -234, 77, 14,103, 34,179,109, 10, 53, 70, 15, 48, 12,189,201, 86,119,113,189, 52, 89, 84, 80,177,206,228,188,251,110,161,178, 64, -107,240, 6, 65,189, 52,203, 97,193,225,112,206,192,252, 57, 71,105,254,100,226, 99,162,112,234,196, 42, 44,250,110, 52,182,111, -158,136,167, 79,110,215, 75,207, 27,248,224, 3, 22,235,115, 47,160, 11, 74,218, 1,211,252,147,161,200,248, 11,199,119,167, 31, -223,187, 62,125,255,170,137,228,232,210, 96,172, 93,187,182,219,232,209,163,119, 59, 59, 59,167, 3,248,136, 54, 90,255, 99,244, -122,189, 77, 70, 70, 6,181,115,231,206,126, 50,153,236, 37,139,197,154, 11,128,243,111, 57,224, 98,177,248,166, 84, 42, 77,149, -201,100,169, 82,169, 52,188,166,244,127, 40, 30,214,214,214,241,150,150,150,207,202, 39, 90, 55, 27,208,214,173,221,168, 5, 86, - 62, 33,157,234,169,207, 97,177, 88,115,101, 50,217,203,157, 59,119,246, 75, 78, 78,166,244,122,189, 77, 45,182,239, 40,151,203, -159,220,185,115,231,155,140,140,140, 78,137,183,183, 90,171,239,108,178,142,255,125, 85,231,251,167,214,125, 99, 97, 33,123, 12, -160,227, 95,226, 72, 22,155,148, 96, 48, 3, 31,165, 20, 10, 83,114,245,202,176,184, 66, 9,192,236, 12,109, 61, 94, 98,114, 76, - 74,128,116,121,152, 84, 36,186,249,218, 90,121,237,149, 70, 10, 6, 35, 16,197,148,109,189, 11, 28, 6, 99,146,201,100,234,206, -225,112, 62,165,159, 80,127, 13,120, 60, 14, 64, 8,196, 34, 62, 0, 2, 70, 61,173, 17,151,193,104,119,179, 95,191, 69,115,154, - 53,155,230, 5,244,173,194,108, 81, 0,166,123,121,121,157, 6, 48,244, 29,238,206, 15,158,158,158,201, 0,102,188,171,114,201, -223,223,191,109, 96, 96,224,130, 22, 45, 90,116,122, 87,154,255, 36,212, 55, 55,252,150,114,125,157,141,234, 70,168, 77,118,204, -213,233,118, 74,185, 41, 38, 38, 6,125,250,244,193,250,245,235,133,190,190,190,187, 0,216,255, 11,110, 37,191,178, 23,124, 84, -104,163,101,182,209,250,208, 21,237,134, 53,196,149,193,174,200, 27,210, 16,249, 35, 27,226,250, 32, 87,116,169, 75,110,172,172, -172,208,177, 99, 71,102,114,114,178, 96,214,172, 89, 11,248,124,126, 44,128, 30,117,209, 18, 8, 4,247,133, 66, 97, 34,139,197, -122, 43, 47, 66,161,240,190, 72, 36, 74,100,177, 88, 93,203,167, 75, 36,146,155, 82,169, 52, 85, 34,145,132, 87, 97,132,238, 75, -165,210, 84,177, 88,124,191,124, 58,139,197,234, 42, 22,139,147, 36, 18, 73,197,244, 46, 18,137, 36,177, 98,122, 85,176,217,108, -199,196,196, 68,155,164,164, 36, 27, 46,151,171, 44,159,158,144,144, 96,147,152,152,248, 86,122,109, 96,177, 88, 93, 68, 34, 81, -162, 80, 40,188, 95, 89,122,197,125,170,138,114,199,174,139, 57,233,181, 45,120,130,130,130,174,167,164,164, 56, 91, 88, 88,188, - 53,113,183,165,204,162,199,175, 91, 67,103,134,244, 14,154,100,237,221,191,105, 29,245,123,240,249,252,216, 89,179,102, 45, 72, - 78, 78, 22,180,105,211,134,201, 96,212,234,125,162, 91, 72, 72,200,209,212,212, 84,135,230,205,155, 51, 13, 6, 3, 30, 29,155, - 15, 97,196,167,224,199,110,132,147, 32,157,245,242,252, 50,199,160,206, 31, 28,197,123,110, 12, 74, 14,122,115, 64,153, 58,154, - 8,177,126,146, 92,108,221,167,223, 71,172, 7,137, 69,214,122,163,209, 18, 96,118, 38,219, 93,120,117,210,100,233, 59,152, 8, - 81, 94,140, 99, 91, 7, 14,158,198,188, 20,199,178,214, 27,141, 86, 96,160, 83, 93, 52,203, 95,254, 76, 38,115,230,170, 85,171, - 24, 0,166, 2,224,254,155, 12, 77, 43,123, 56,116,105,204,188,235,103,135,118,239, 80,214,183,244,126,247,168,175,208,150,237, -167, 49,118,194,102,184,123,181,174,151,142,214,100,122,186, 47, 38,230,236,200,198,141,131,231, 52,107, 54,166, 18,179, 69, 1, -152,179,108,217,178, 81,143, 30, 61,178,110,216,176,225,132,119,244,210,191,102,217,178,101,179, 31, 61,122,100,239,234,234,186, -176,150,154, 85,150, 75,114,185,188,199,150, 45, 91,102,246,233,211,103,146,191,191,127,211,119,161,249, 15,102,253,195,135, 15, -157, 87,173, 90,245,229,216,177, 99,115, 1,160,107,215,174, 28, 0,109,234, 93,222, 17,194, 37,132, 4, 18, 66,250, 16, 66,186, - 18, 66, 90,149,254,221,178,116,233, 67, 8,233, 86,225,179,101,233,182,101,223, 7, 84,161,209,167,226,118,229,182,169,248,255, - 91,127, 87, 98,180,250,160,164,173, 86,159,183,118,224,196,137, 19,164,252,103, 69,134,184,226,219,105,109, 29, 10,159, 28,223, - 67,242, 19, 99, 72, 86,244, 3,242, 96,243, 18, 50,173,165,117,225,240,134,248,161,246,199,139,144, 27, 55,110,144, 71,143, 30, -145,252,252,124,242,252,249,115, 18, 16, 16, 80, 36, 20, 10, 47, 2,112,173,141,152, 68, 34, 73,189,120,241, 34, 9, 10, 10,202, - 17,139,197, 43,203,110, 46,169, 84,154,122,227,198, 13, 18, 20, 20,148, 35,145, 72,214, 0, 96, 2,192,160, 65,131,210, 8, 33, -196,218,218, 90, 85,153, 94, 72, 72, 72, 22, 33,132,200,100,178,178,170, 38,166, 68, 34, 89, 51,101,202,148,252,123,247,238, 17, -185, 92, 94,150,206,144, 74,165, 43,167, 78,157,154, 31, 22, 22, 86, 62,189, 90, 44, 45, 45, 19,141, 70, 35, 57,126,252, 56,177, -177,177, 81,149,187,153, 19,141, 70, 35, 57,122,244,104,149,121,171, 46, 80, 32, 22,139, 87,140, 28, 57, 50, 47, 46, 46,142, 88, - 89, 89,165,150, 75, 95, 57,122,244,232,188,132,132, 4,162, 80, 40,204,202,163,149,149, 85,234,205,155, 55,201,192,129, 3,115, -203, 31, 83, 43, 43,171,212, 91,183,110,149,165,175, 48,167, 32,179,183,183,159, 96, 99, 99,163,178,177,177, 81, 89, 88, 88, 44, -182,179,179, 83,167,167,167, 19, 66, 8,105,212,168, 81, 90,249, 72,150,141,111,191,207, 54, 30,188,117,231,106, 84,102,122,179, -238,147, 86,200,154,133,200,106,113, 12, 92,133, 66,225,197, 78,157, 58, 21, 37, 38, 38,146,130,130, 2, 18, 17, 17, 65,110,220, -184, 65, 94,188,120, 65, 0,152, 51,195,128, 68, 44, 22, 39,107, 52, 26,147, 70,163, 49,165,167,167, 27,211,210,210,140,209, 43, -237, 8,217,198,126,179,100, 31,237, 75,212, 87,151,154,164, 98, 97, 18, 0,201,123, 51, 90,161, 62,142,100,147,231,190,199,243, -157,163,175, 46,235,169, 39,113,151,200,158, 49,214,250, 43,159, 57,188, 36, 63,123,253,151,108,242,118,170,147,230,207,222,123, - 34,190,118,126,186,110,225,116,125,124,124, 60,249,124,116, 79,195,185,105, 14,175,200, 70,175,131,117,209, 44,199,176, 1, 3, - 6,228, 39, 36, 36, 16, 31, 31,159, 2, 38,147, 57,246,223,100,178,186,121,112,147, 35,118,127,110,234,235, 43,204,124, 71,102, -203,215,198,198, 38, 99,199,142, 29, 68, 34,145,164,213,213,108,125,216,191, 51, 41,202,185, 72,250, 7,183,170,246, 30, 25, 60, -120, 48, 9, 12, 12, 36,211,166, 77,171,233, 94,162,188,128,126, 59,155, 53, 59,106,250,240, 67,227,206,102,205,142,122, 1,253, - 74, 13, 22, 5,224,203,229,203,151,135,233,245,250,176,237,219,183,135,245,235,215, 47, 12,192,231,245, 60, 22, 63,253,240,195, - 15, 68,175,215,147,237,219,183,147,126,253,250, 17, 0,107,235, 83, 46,149, 69,178,252,252,252, 62, 59,114,228,200,157,167, 79, -159,166, 7, 7, 7,175,104,214,172,153,172,174,154,127, 69,196, 98,177, 91,211,166, 77,119,249,248,248, 36, 52,111,222, 92,235, -237,237, 93,236,225,225, 17,231,235,235,187,131,199,227,185,214, 81,182,117,187,118,237,140, 87,174, 92, 33, 3, 6, 12, 32,229, - 76, 72,181, 84,231, 69, 8, 33,173,190,252,242,203,185, 0,200,151, 95,126, 57,151, 16,210,167,212, 79,244, 41,255,119,197,207, - 50,243, 84,246,127,101, 26,101, 75,101,154,149,253, 70,133,223, 65, 21,145,172,241,127,216,185, 19, 39, 78,116, 58,113,226,196, -149,138, 59,247, 81, 67,180,157,214,214,161,168, 40, 61,133, 68, 45,249,148, 92, 14,116, 36, 55, 58,219,146,103, 51, 7,144,148, -221,107,200,228, 22,242,194, 15, 27, 34,176,182, 70, 43, 44, 44,140,132,133,133,145,240,240,112, 18, 27, 27, 75,114,114,114,200, -254,253,251,141, 86, 86, 86, 69, 60, 30,111, 25, 0,129, 57, 98, 82,169, 52,149, 16, 66, 52, 26, 13, 89,188,120,113,113,105,164, - 74, 41,147,201, 82, 9, 33, 36, 59, 59,155, 44, 91,182,172, 88, 38,147, 69, 0,176, 87, 40, 20,137, 49, 49, 49, 68,169, 84, 86, -106,102,228,114,121,234,211,167, 79,203,140,147,131, 92, 46,143, 58,118,236,152,142, 16, 66,146,146,146,136,165,165,101, 42, 0, -165,149,149,213,131, 19, 39, 78,232, 8, 33, 68,165, 82,149,165,155,101,180,138,138,138,200,185,115,231,222,202, 67, 89,250,233, -211,167,223, 50, 96,102,160,148,201,100, 97,251,247,239,215, 26,141, 70, 18, 21, 21, 85,102, 18,149, 22, 22, 22,225, 7, 15, 30, -212, 26,141, 70, 18, 29, 29,109,182, 25,108,208,160, 65, 26, 33,132, 24, 12, 6,178,113,227, 70, 77,217, 49, 45, 75,215,106,181, -100,195,134, 13, 26,169, 84, 26, 6,160,218,232,155, 66,161, 80,105,181, 90,146,157,157, 77, 2, 2, 2,242,111,220,184, 65,114, -115,115, 9, 33,132, 52,104,208, 32, 13, 0, 60, 59,141,253,254,206,243,252,220, 79,102,135, 30,112,109, 53,124,201,217,187,201, - 73, 91,142,220, 15, 83,248,134,244, 52, 39,168,201,227,241,150,217,217,217, 21, 95,187,118,205,168,211,233, 72, 66, 66, 2, 9, - 15, 15,127,115,141, 69, 70, 70,154,101,180, 88, 44,214,252, 59,119,238,232,140, 70,163, 41, 35, 35,195,152,150,150,102, 76, 75, - 75, 51, 84, 52, 90,100, 27,155,100,156, 30, 71, 78,110,158,161,229,112, 56,243,223, 79, 52, 11, 76,178,201, 51,132,108,242, 12, -219, 49, 82,145,145, 23,190,151,144,243, 51,200,171,239, 27,146,249, 61, 37,121,166, 77,158, 97,100,147,215,135,228,219, 78,172, - 90,105,110,246,238, 75, 54,121,134,253,240,145, 75,230,131,176,123,228,202,149, 43,100,195,154,229,100, 90, 55,135, 2,211, 38, -207, 48,242,179,247,192,218,104,150,135,199,227, 61,191,126,253, 58,185,122,245, 42, 89,184,112, 33, 17, 10,133, 9,239, 34,170, - 71,126,246,112, 33,191,120,116, 34, 91,221,237,200,239,157,254,114, 29,124, 90,217,195,161,187, 7, 55, 41,227,193, 17, 66, 94, -191, 32,234,149, 62,164,167, 39,187,190,102,203,215,198,198, 38, 61, 46, 46,142,168,213,106,178,122,245,106, 34,149, 74,235,100, -182, 62,236,223,153, 20,101, 95,168,214,104,133,132,132,144, 31,127,252,145,232,245,122,210,186,117,107,115, 94, 90,254, 96,182, - 60,129, 16, 0,115, 87,172, 88,241,198,100,133,134,134,134, 69, 70, 70,134, 57, 59, 59,159,170,199,177, 88,187, 98,197,138, 55, - 38, 43, 52, 52,148, 68, 70, 70, 18, 23, 23,151,196,250,148, 75,221,187,119,255, 62, 54, 54, 54,119,222,188,121, 7, 58,118,236, -184,228,193,131, 7, 73, 39, 79,158, 12,243,243,243,235, 89, 87,205,119, 16,213, 97,149, 70,118,184,132, 16, 54, 33,164,204,188, -178, 0,176,203, 2, 10,230, 48,114,228, 72, 97,219,182,109,195, 70,140, 24, 81,184, 99,199, 14, 18, 23, 23, 71, 34, 34, 34,200, -138, 21, 43,200,130, 5, 11,200,182,109,219,200,192,129, 3, 11, 2, 2, 2,238,124,248,225,135,252, 90,100,211,199,213,213, 53, -231,232,209,163,100,207,158, 61,132,195,225,156, 52,119,195,234,188, 72, 85,102,170, 42,131, 85,241,187,106,140, 88,181,134,205, -140,223,251,163,169,170, 24, 9, 41,247,247,239,193,193,193,157,254,240,240, 33,248,110,252,172,239,249,177, 59, 86, 35,117,255, -122, 48,179, 83,193,206,203,132,230,250, 73,232,175, 31,195,168, 54,109, 4, 2,138, 90, 84,219, 11,134,203,229,130,203,229,130, -195,225,160,176,176, 16, 42,149, 10,237,219,183,103,132,135,135,243, 39, 76,152, 48, 67, 32, 16, 36, 0,232, 95,227,221, 76,149, - 68,164,111,222,188,137,113,227,198,241,118,237,218,213,220,218,218,250,161,209,104,228, 2, 64,116,116, 52,134, 12, 25,194,219, -187,119,111, 19,123,123,251,112,157, 78, 39,228,241,120, 96, 50,153, 85,234,113,185, 92,232,245,122,158,187,187,123,196,195,135, - 15,125,131,131,131,217,241,241,241,136,137,137,129, 94,175,231,122,120,120, 68,134,135,135, 55,239,211,167, 15, 59, 49, 49, 17, -241,241,241,111,242, 97, 78,126,181, 90, 45,120, 60, 30,202, 87,105, 81, 20, 5,141, 70, 3, 46,151,107,182, 22,139,197,234,226, -229,229, 21,249,240,225, 67,191,144,144, 16,206,189,123,247,144,148,148, 4,163,209,200,245,246,246,142,124,248,240, 97,139,126, -253,250,113, 34, 34, 34,144,154,154, 10,115,171,208,202,214,123,248,240, 33, 70,140, 24,193, 61,115,230, 76, 11, 59, 59,187, 8, -131,193,192, 5,128,200,200, 72, 12, 25, 50,132,123,246,236, 89, 63, 39, 39,167,136, 26,170, 18,153, 0,160,215,235, 49, 97,194, - 4,145, 84, 42, 69, 98, 98, 34, 76, 38, 19,140, 70, 35, 0, 32, 51, 43, 51,242, 97,100, 84,244,168, 97, 31,117, 42,210,105, 52, -183,238,222,127,210,168,129,139, 35, 69,145, 6, 53,100,181,191, 72, 36, 74, 88,185,114,229,103,113,113,113, 60, 47, 47, 47,198, -171, 87,175,144,151,151, 7, 14,135,243,230, 26, 51,119,191,185, 92,110,103, 31, 31, 31, 86,113,113, 49, 76, 38, 19, 0, 16, 6, -163,242, 22, 43,252,236,235,240, 86, 26,216, 2,129,160,243,123,121,122,231,250, 88,193,132,238,241,233, 90, 30,207,194, 81, 34, -182,243, 0, 18,174,162,161, 53, 15, 76, 6,147,127, 47,166, 80, 4,144,238,112,206,176,170,157,166,169,123, 76,154,150,167,183, -108, 34,182,119,116, 70,102,102, 38,156, 26,121,161,152,107,205,189,249,162, 64, 12,170,150,154,255, 79, 7,119,119,119, 91, 55, - 55, 55,100,100,100,192,207,207, 15,114,185, 92, 14,160,123,157, 31, 58,219, 93,120,200, 69, 59,128,177, 18, 70,106, 33,244,172, -165,120,145,238, 71, 54,249,177,255, 74, 38, 75, 42,230,222,222,187,111,191,131,149,179, 55,112,242, 19, 40, 45,120,216, 58,201, -207,210, 90,198, 59, 90, 71,179,229,171, 84, 42, 47,221,185,115, 71,193,231,243, 17, 30, 30, 14, 31, 31, 31,172, 94,189,218, 90, - 46,151, 95,173, 91,100,139,128, 80, 85,155,172,142, 29, 59, 98,234,212,169,216,181,107, 23, 44, 45, 45, 49, 98,196,136,154,204, - 22,137, 6,142,255, 16, 17,177,125,215,203,151, 39, 70, 54,110, 28, 60,194,195, 99,241,196,161, 67,199, 78,159, 62, 29,203,151, - 47,199,209,163, 71,209,174, 93, 59,140, 31, 63, 94,159,144,144,176,179,174, 85, 85, 43, 87,174,156, 54, 99,198,140,138,154,186, -248,248,248, 31,234, 85, 46,101,102, 70, 70, 68, 68, 68, 15, 27, 54,172, 83,113,113,177,230,238,221,187, 79, 92, 93, 93, 29, 1, - 52,168,171,102, 61, 12, 22, 69, 8,225, 3, 16,150, 46, 34, 0,194,189,123,247,202, 66, 66, 66,164,165,105,130,210,165,198,234, -125, 31, 31, 31,199,231,207,159, 39,207,156, 57,211,111,215,174, 93, 2,161, 80,136,236,236,108,252,242,203, 47,152, 59,119, 46, - 40,138, 2, 33, 4,219,182,109, 19,142, 25, 51,166,213,203,151, 47,147, 93, 92, 92,204,105,210,194, 19,139,197, 7, 23, 47, 94, - 44, 53,153, 76,152, 51,103, 78,134, 78,167,155, 90,250,221, 60, 11, 11,139,219, 40, 49,220,213, 81,169, 23, 41,247,172, 60, 81, -225,216, 4, 87, 76,171,248, 29, 33, 36,184, 58,141, 90,158,139,202,126,239,100,117,102,171,252, 19,168,115,165, 46, 18,104,102, -235,234,137,156,243, 7, 33, 96, 81, 16, 48, 75, 23, 22, 5,198,171, 72, 56,241,217,208, 19,226, 91, 87,163, 85,182,176,217,108, - 20, 22, 22,194,104, 52, 98,238,220,185,188,115,231,206, 89, 49, 24,140,255,214,164, 83,222, 48, 61,123,246, 12,222,222,222,212, -241,227,199,149, 83,167, 78, 21,148,253, 78, 78, 78, 14,220,220,220,168,211,167, 79,219,124,253,245,215,226,234,204, 12, 69, 81, -224,112, 56,152, 49, 99,134,224,238,221,187,150,246,246,246,120,245,234, 21, 94,191,126, 13,177, 88,140, 25, 51,102, 8,238,220, -185, 99,109,111,111,143,184,184, 56,228,228,228, 64, 44, 22,215,218,104,113, 56,156,183,182,161, 40, 10, 58,157,174, 86,198, 64, - 38,147,237, 9, 11, 11,179,150,201,100,136,136,136,128,193, 96,128, 76, 38,195,180,105,211, 4, 97, 97, 97,214, 22, 22, 22,136, -142,142, 6, 33, 4, 82,169,180, 86,121, 4, 0,147,201,132,232,232,104, 52,104,208, 0, 87,175, 94,181,153, 56,113, 34,191, 44, -253,197,139, 23,112,116,116,196,213,171, 87,109, 68, 34,209,158,170,180, 76, 38, 19, 82, 82, 82,240,232,209, 35,188,122,245, 10, -233,233,233,200,200,200, 64, 94, 94, 30, 12, 6, 3, 0, 64,152,151,123,114,239,129,227, 15, 5, 2,129,208,199,195,221, 57, 50, -234,113,154, 64, 32, 16,186, 56, 59,123, 0,223, 50,170, 49,132,255,141,143,143,183, 26, 51,102, 12, 71,173, 86, 35, 43, 43, 11, - 44, 22,235, 15,215, 22,151,107, 94, 83, 32,131,193,224,205,231,243, 41,157, 78,247, 38, 2,198,229,114,241,217,158, 66,248,204, -199, 91,203,208, 53,105, 32, 70, 61,180, 90,173,247,255, 60,154, 5, 80,160,180,238,160, 40,191,219,175, 10, 44, 59, 4, 15,227, - 32,230, 12, 96,210, 3, 12, 22, 58, 55,115,100, 29,141, 44, 80,130,160, 25, 52,240, 34,164,230,158, 95, 4,160, 0,157, 27, 64, -125,112,238,185,193,170,221,128, 73,156,228,228,100,112, 56, 28,240,120, 60,248,117, 25,196,218,251, 80,111, 11, 10,205,161,131, -167, 57,154,111,133, 29, 5,130,111, 22, 44, 88, 32, 42,175, 57,118,236, 88,145, 76, 38, 91, 80,103,147, 85, 32,108, 3, 3,153, -241, 40,185,176,193,226,147,106,239,151,105, 69,158, 32,100, 38,160,111,241, 14,204, 86,103, 30,143, 23, 3,160,125,189, 76,150, -132,123,107,223,190,253, 14,150, 78, 37, 38, 11,134, 98,128, 45,128,173,181, 5,182,126, 22,104,105,109, 33,168,173,217,242, 85, - 42,149, 23,111,223,190,173,224,243,249, 8, 11, 11, 3,135,195, 1,159,207, 71,211,166, 77,177,105,211, 38,107, 75, 75,203, 90, -155, 45, 2, 82,105,204,183,127,255,254,164, 99,199,142,152, 50,101, 10,118,238,220, 9,173, 86,139,197,139, 23, 35, 62, 62,222, - 44,217,104,224,248,178,136,136, 29, 75, 31, 61,122,246,165,175,175, 87,127,145,200,114,202,136, 17,178,175,191,254,250,196,177, - 99,199,182,247,233,211, 39,227,238,221,187, 63, 2, 56, 88,203,195, 75, 1, 8, 93,181,106,213,148, 50,227,246,245,215, 95,111, - 59,118,236,216,210, 62,125,250,164,220,189,123,119, 38,128,208,250,148, 75, 38,147,233,228,127,255,251,223,135, 2,129, 64,232, -233,233,233, 28, 21, 21,149, 38, 16, 8,132,206,206,206, 30,157, 58,117, 98,212, 69,179, 46,216,216,216,116,189,125,251,182, 15, - 74, 58,141,241,202,140, 86, 84, 84,148, 69,110,110,174,133, 88, 44,182,176,179,179,147,148,153,173, 1, 3, 6, 88,176, 88,172, -106,175,219,252,252,252, 99,243,230,205,147, 13, 24, 48,160,236,127, 92,191,126, 29, 59,119,238,132, 72, 36,122,107,221,126,253, -250, 97,220,184,113,114,173, 86,251, 95, 51,178, 59,122,194,132, 9,158, 74,165, 18,223,124,243,141, 38, 57, 57,185, 43,128,120, - 0,178,110,221,186,125, 31, 21, 21, 21,208,170, 85,171, 3, 0,252,171,187,247, 42,243, 34,229,141,142, 57,105,117, 93,223, 92, -179, 85, 33,169,202, 49,180,222, 50, 90,193,193,193, 87, 80, 69, 79, 42,221,235, 84,240, 96,132,128, 73, 65,200, 44,103,182, 96, - 2, 43, 39, 13, 84, 29,122,169, 84,246, 48,228,114,185, 96, 50,153,208,106,181, 48,119,162,234, 50, 83, 32,149, 74, 33, 22,139, - 81, 84, 84, 4,131,193, 0, 62,159, 95,102, 70, 32,149, 74,193,102,179,193,102,179,193,231,243,255, 16, 77,170, 24,205,225,112, - 56, 16,137, 68, 72, 73, 73, 65,124,124, 60, 76, 38, 19,196, 98, 49, 68, 34, 17,184, 92, 46, 84, 42, 21, 84, 42, 21, 8, 33, 16, -137, 68, 16,137, 68,168, 77,131,107,163,209, 88,233,195, 95,175,215,215, 42,162,101, 48, 24,240,228,201, 19, 36, 36, 36,128,207, -231,191,217, 87, 30,143,135, 23, 47, 94, 64,173, 86, 67, 40, 20, 66, 42,149, 66, 38,147,153,173, 91,182, 47, 18,137, 4, 2,129, - 0, 89, 89, 89, 40, 44, 44,124,115, 76,165, 82, 41, 68, 34, 17,114,114,114,144,150,150, 86,237,190, 27,141, 70,168, 84, 42,164, -167,167, 35, 49, 49, 17, 25, 25, 25,111, 10,160,210,168, 81,253, 2, 59,185,185,200,204,204,124, 19,137,172,106, 49, 7,147,201, -132,188,188, 60,220,190,125,155, 50,153, 76,200,206,206, 54,165,171,213,198,201, 42, 46,142,126,251, 51,217,127,230, 65,241,222, - 83, 97, 69,135, 47, 62, 42, 10, 61, 28, 89,196, 15, 88,104,192,251, 96,131,175, 12,122,118, 80, 70,190,158,151,174,227,200,148, -190,221,128,152,211, 0,131, 5,240,229,104,221,164, 33,226,179,140,162,167,169, 90, 62, 40,244, 64,168,135,220, 44, 77, 35,187, -123,122,158,158, 23,167,179,150,122, 55,243, 71,106,106, 42,120, 60, 30,120, 60, 30, 62,104,215, 13, 49,153, 70,225,227,228, 34, - 33, 8,130,204,210,252,127, 26,137,197,226, 54,237,219,183,167,202,107,246,238,221, 27, 20, 69, 53, 5,224, 85,171, 66,110,109, - 35, 46,116,194,214, 96,145, 25,143, 83, 10,237,143, 70, 21,123,244,237, 63,200,242,167, 11,105,222, 79,212, 26, 87, 16,253, 44, - 16,157,127, 61,204, 86, 39,137, 68,114, 98,221,186,117,174,124, 62,255, 52,128, 14,117, 17, 17, 11,152, 27,191,153, 50,204, 65, - 94,102,178,244,133, 0, 75, 0,176, 5, 0, 75, 0, 91, 27, 5, 22,141,235,110, 41,228,179, 15,215,194,176,238, 13, 13, 13,181, -174,104,178,202, 22, 63, 63, 63,204,159, 63,223,218,210,210,114,143, 57,122, 43, 87, 44, 39,217, 57, 57, 0, 1,114,115,243,177, -114,197,242,172,178,239, 6, 12, 24, 64, 58,116,232,128, 41, 83,166, 96,233,210,165, 56,117,234, 20, 90,183,110,141,241,227,199, -163, 85,171, 86, 53, 73, 7,201,100,178, 93,221,186,117,187,173,146, 72,198,165,248,251,115, 47,202,100, 57, 93,115,114,100, 46, - 81, 81, 58, 79, 32, 18,192,134,164,164,164,158,181, 48, 89, 67,165, 82,105, 88,215,174, 93,117, 18,137, 36, 97,245,234,213,147, -167, 78,157,138,229,203,151, 99,222,188,121,191, 0,248, 15,128,175,146,146,146,236,171, 51, 89,127, 86,185,244,103,149,117, 70, -163, 49,241,224,193,131,173,116, 58,157, 99,105,245, 32, 47, 59, 59, 91,250,250,245,107,137, 78,167, 19,153, 76, 38,145,133,133, -133, 24,128,112,212,168, 81,172,199,143, 31,123, 27, 12,134,228,234, 52,213,106,245,240, 57,115,230,100,100,100,100, 0, 0,154, - 54,109,138,236,236,108,124,254,249,231,248,244,211,146, 14,193, 45, 90,180, 0, 33, 4,169,169,169, 88,185,114,101,170, 90,173, -254,216,140,236, 54,118,119,119, 71, 84, 84, 20,158, 60,121,114, 1,128, 9, 37,237, 88,115, 30, 60,120,240, 48, 61, 61, 29,123, -246,236,225, 56, 56, 56, 28, 67, 21, 67,188, 84,231, 69,234, 2, 69, 81, 39,235,178, 93, 89,228,170,178,136, 88, 21, 84, 31,209, - 10, 14, 14,166,202,127,190, 21, 49,162, 16,145,112,255, 42, 44,125,253,223,138,102, 9,153, 20, 4, 82, 25, 98, 18,227,193, 1, -245,232, 93, 25,173,172,172, 44, 76,158, 60,185,104,248,240,225,153, 38,147,105,144,185,166, 64, 38,147, 65, 38,147,225,241,227, -199,100,224,192,129,169,171, 87,175, 46, 42,111,180,158, 61,123, 70,130,130,130,210, 22, 44, 88,144, 95,157,209, 42,139,104, 45, - 91,182,172,168,115,231,206,233,143, 30, 61, 34,101,102, 74, 44, 22, 99,229,255,177,119,221,225, 81, 84,111,247,204,204,246,150, - 94, 73, 72, 8,161, 36, 64, 32,132, 22, 64, 80, 32, 64, 64, 58, 34,130,136,130, 34, 69, 68, 20, 17, 21,233, 2,210,155, 82, 20, - 69,105, 2,130,210, 17, 8, 85,105, 9, 45,148, 52, 72, 47,155, 77,207,246,221,153,185,223, 31, 73, 48, 64,202, 38,168, 63,245, -219,243, 60,243,108,246,238,204,201,109,115,231,204,123,239,125,223, 21, 43, 12, 61,122,244, 80, 95,187,118,141, 84,164,213,197, -162, 69,211,244, 35,161, 85,249, 26,154,166,193,243,124,157,132,150, 78,167, 27,253,226,139, 47,170,239,223,191, 79, 42,202,233, -232,232,136, 85,171, 86, 25,122,247,238,173,190,115,231, 14,169, 72,115,112,112,176, 89, 12, 86,252,127,149, 74, 5, 7, 7, 7, -220,189,123,151,244,233,211, 71,189,110,221, 58, 99,229,244,123,247,238,145, 65,131, 6,169, 75, 75, 75, 71,215, 36, 94, 42,166, -243, 88,150,133,209,104, 68, 94, 94, 30,210,211,211, 31,153,211, 13, 10,135,200, 81, 47, 15, 12, 53, 24, 12,250,187,241, 9,105, -173, 67, 90,122, 24, 12, 6,125,106, 90, 90, 60, 48,143,175,129,123,120,171, 86,173,242, 39, 79,158,108, 40, 44, 44,124,102,161, - 37, 22,139,239, 11, 4, 2,210,173, 91, 55, 98, 54,155, 73,122,122,186, 53,175,176,144, 13, 94,188,152,220,153, 62,157,146, 69, - 71, 75,148, 74, 37, 85,206, 73, 63,120,240,128,151,201,100,247,255,118,161, 69,243, 94,160,200,115, 23, 18,180, 78,189, 7,142, - 20, 83, 57, 87, 1,139, 22,144, 56, 3, 18,103, 8, 20,174,232,215,173, 45,179,237,114,137, 23, 8,223, 5, 34,137,111,173,156, - 66,226, 9,240,221, 78,198, 27,157,159,123,105,170,184,160,160, 0, 12,195, 60, 18, 69,114,133, 2,189,134,188, 70,127,123,213, -228, 5,144,174,160, 24,223, 58,220,235, 51, 63,251,236, 51, 81, 97, 97, 33,104,154,254,131, 83, 46,199,196,137, 19, 37, 14, 14, - 14,179,109, 30,252,246,182, 16, 65, 40, 9, 7,200,123,113, 57,198, 6, 7,111, 27,130, 62, 88,186, 85,214,170,109, 71,188,253, -130,135,108,233,145,220, 86, 55,211, 13,141, 1,110, 58, 88,115,251,122,136,173,110, 42,149,234, 72,116,116,180,188,127,255,254, - 88,177, 98,133, 66, 38,147, 29,171,207,192,175,211,114,239, 44, 88,247,131,250,214,234,190,128, 69, 87, 38,176, 42, 29,185, 90, - 30,115,182, 70, 21, 91,173,100,148,173,156, 6,131, 97,236,155,111,190,153,191,127,255,254,167, 68,150, 84, 42, 69,114,114, 50, - 62,255,252,243,130,130,130,130, 90, 31,138,171, 86,174,136,137,189,121, 6,223,126,189, 0, 0,193,250, 85,147,112,233,194,110, -167, 23,158,239, 78, 26, 53,106, 68, 58,118,236,136,201,147, 39, 99,209,162, 69,136,139,139,131,155,155, 27, 38, 77,154,132,231, -159,127, 30, 43, 87,174,172,105,144,234,243,206, 59,239,124,158,145,145, 17,116,242,228, 73,129, 70,163,241, 88,249,205, 55,197, -251,138,139, 11,150,196,198,198,125, 18, 18,210,108, 86,155, 54,175,215,224,250,161, 74,145, 53,101,202,148, 93, 25, 25, 25, 97, -167, 78,157, 18,106, 52, 26,223, 41, 83,166, 96,249,242,229,152, 61,123,246,102, 0,111,195,182, 13, 47, 54,143, 75, 12,195, 68, - 14, 31, 62, 60,212, 96, 48,232,227,226,226,210, 66, 66, 66, 60, 12, 6,131, 62, 45, 45, 45,254,220,185,115,124,125, 56,235,131, -252,252,252,164,157, 59,119,198, 79,157, 58, 53, 44, 35, 35,163, 5, 0,215,210,210, 82, 69,105,105,169,196,108, 54,203,156,157, -157,157,219,182,109,235, 54, 97,194, 4,229,141, 27, 55, 90,100,100,100,104,203,173, 72,213,194, 98,177,196, 21, 22, 22, 14,232, -219,183,111, 81, 97, 97, 33,218,180,105,131,129, 3, 7,194,203,203, 11, 13, 26, 52,192,224,193,131,209,188,121,115,228,231,231, - 99,212,168, 81, 5, 26,141,166, 47,128, 7, 54,100, 55, 41, 39, 39, 7, 93,186,116,193,130, 5, 11, 6,140, 24, 49,226, 78,183, -110,221, 74, 66, 66, 66,244,190,190,190,193,107,215,174,133,143,143, 15,246,238,221,235, 45,145, 72,118, 86, 33,178,170,213, 34, - 0, 52,229,130,199,252,196,167,166,150,223,108,189,182,202,191,109, 56,239, 73,177, 85,249,120,106,234,176,234, 6, 1,230,124, -191,119,155, 81,236,215, 20,142, 65,161,144, 75,165,144,137,197,144, 57,187,194,196,243,248, 38, 57, 71,175, 35,100,118, 93, 59, -207,147, 15, 66,138,162,176, 97,195, 6,182,115,231,206,198,168,168,168,245, 6,131,193, 15,101, 94,101,109, 22, 5,235,214,173, -211, 79,155, 54,237,102,110,110,110,168, 84, 42, 53, 87,164,175, 95,191, 94,255,218,107,175,197,102,100,100,132,201,229,114,125, -117,235,179, 42, 11, 45,137, 68, 98,202,205,205,237, 56,126,252,248,251, 95,125,245,149, 78, 46,151, 67,161, 80, 64, 34,145,152, -115,115,115, 67, 39, 79,158,124,115,249,242,229,122,153, 76, 6,133, 66, 81,167,105, 57, 66,200, 83,130,170,114,186,173, 96, 89, - 54, 42, 55, 55, 55,116,218,180,105, 55,214,174, 93,171,171, 16, 64,149,243,184,114,229, 74,189, 82,169,172,147, 69,171,226, 60, -133, 66,129, 53,107,214,232,167, 78,157,122, 51, 55, 55, 55, 84, 34,145,152, 43,165,235,222,121,231,157, 27,185,185,185,161, 44, -203, 70,213,240, 54,198,149,148,148, 64, 32, 16, 32, 54, 54,214, 36, 18,137, 64,211, 52, 18, 19, 19, 31, 13, 62, 46, 46, 46, 45, - 67, 91,135, 4,255,176,107,239, 57,153, 72, 34,233,220,177,125,139, 7, 41,169, 25,132, 80, 41,181,100,245,103,131,193,224, 23, - 21, 21,181,190,115,231,206,198, 13, 27, 54,176,213, 89,182,108,129,201,100, 58,119,253,250,117,171, 84, 42,165,178,179,179, 89, -134, 97,192,113, 28, 49,117,236,104,106,189,118, 45,185, 59,107, 22,229,160, 80, 8, 68, 34, 17,228,114, 57,117,252,248,113,179, - 94,175, 63,247,247, 11, 45,200, 65, 65,150,144,107, 82, 73,105,150, 66,252,207,101, 34, 75,234, 4, 72,157, 1,169, 51,124,124, -124,113, 53, 89,175, 2, 13, 49, 56, 27,124,136, 17,162, 0, 5,121,172, 26, 42,161, 88, 70,229,228,228, 60, 18, 68, 21, 71, 64, -211, 22,184,158,170, 85,130, 34, 18, 48,168,139, 11,146, 1,174,174,174,130,236,236,236,167, 56, 91,182,108,201, 88,173, 86,219, - 93,187,100,113,222, 0, 63, 37, 62,199,232,125,224,166, 46,104,250,146,111,101, 50,174, 8,136, 94,135, 86,129, 13, 48,253,165, -182,226, 79, 15,106, 90, 93, 75,209, 7,130, 33,111,131,215,186,215, 33,159,207,169, 84,170, 99,215,174, 93,147,171, 84, 42, 60, -120,240, 0, 29, 59,118,196,150, 45, 91,228,114,185,252, 40,128, 58,173,199,187,162, 70,170,182,148,235, 60,115,111, 90,206,173, -108,246, 49,145,165,209, 17,188,249,197,193,162,194, 18,227,240,203,233,213,223, 63, 85,224, 70, 81, 81, 81,159,217,179,103,231, -107, 52,154,199, 68, 86,106,106,106,197, 67,241, 5, 0,181,190,252,158, 61,115, 34,108,241,162,105,184, 22,125, 7,253, 6,188, -135,235,183,146,240,201, 71, 67,224,228, 32, 67, 84, 84, 20,134, 14, 29,138, 5, 11, 22, 32, 49, 49, 17, 63,254,248, 35,181,101, -203, 22,234,242,229,203,212, 23, 95,124, 65,213,178,164,225,213, 37, 75,150,224,218,181,107,232,223,191, 63,206,159, 63,143,130, -130, 2,236, 62,118, 44, 97,103, 66,194, 39, 21,107,182,170,113,253, 80, 37, 28, 28, 28, 62, 88,178,100, 9,162,163,163, 31,113, -230,231,231, 99,201,146, 37, 25, 0, 38,213, 69,100,213,101, 92,106,211,166, 77,240,174, 93,187,206, 73,165, 82, 73,199,142, 29, - 91, 36, 39, 39,103, 0, 72,169, 7,103,201,179,204, 84,229,229,229,253,190,101,203,150,203, 61,123,246,148,143, 29, 59,214,253, -151, 95,126,113,213,235,245, 13, 36, 18,137,135,217,108, 22,223,187,119,143,217,183,111,159,215,221,187,119,147,141, 70,227, 85, - 91,234, 35, 55, 55,247,106, 92, 92, 92,223, 54,109,218,220, 91,191,126,125,134,183,183, 55, 63, 97,194, 4,188,249,230,155,112, -119,119,231,214,172, 89,147,214,173, 91,183,216,164,164,164, 8,189, 94,127,219,198,188,126,183,120,241,226,223,118,237,218,133, -129, 3, 7,226,139, 47,190,192,238,221,187,113,230,204, 25,217,133, 11, 23,196, 91,182,108,129, 72, 36, 66,120,120, 56,250,244, -233,211,171,124,186,211,214,231,210, 53,138,162,142, 80, 20,117,234,137,207,107, 53,253, 86,135,107,171,251,187,198,243,158,200, -230,150, 39, 14,219,241,106, 32,230, 77, 12, 81,233,127, 31, 19, 78,114, 38, 60, 71,212, 35, 91,144,139,207,187,144,241, 77, 40, -221,216,122,186,119, 48, 24, 12,143,142,253,251,247, 19, 47, 47, 47,157, 74,165,170,179,123, 7, 47, 47, 47,117, 73, 73, 9,233, -208,161, 67,129,187,187,251, 35, 87, 4,222,222,222,106,157, 78, 71,194,195,195, 11, 60, 60, 60, 30,185,119,240,245,245, 77, 39, -132, 16,127,127,255,172,234, 38,158,227,147, 0, 0, 32, 0, 73, 68, 65, 84,248, 88,150, 37, 94, 94, 94, 21, 59,244,132, 46, 46, - 46, 27, 59,117,234, 84,160, 86,171,137,183,183,247, 35,215, 9,238,238,238, 43, 58,118,236,248,100,122,109,249, 77,207,200,200, - 32, 25, 25, 25,164, 97,195,134, 89,149,211, 83, 83, 83, 73,106,106, 42,241,245,245,173,179,123, 7,119,119,247,229, 85,228,165, - 94,121,244,243,243, 83, 27, 12, 6,210,165, 75,151,199,234,212,207,207, 79,109, 52, 26, 43,210,109,114,239, 32,147,201,222,150, - 74,165, 89, 82,169, 52, 75, 34,145,124,222,168, 81,163,220, 61,123,246,144, 53,107,214, 84,108, 73,135,123,203, 65,157,155,118, -121,253, 19,247,150,131, 63,120, 22,247, 14, 42,149,234,180,151,151,151,110,255,254,253,143,245, 47,131,193, 96,179,123, 7,153, - 76,150,161,213,106,121,181, 90,109,253,237,183,223,244,209,209,209,250,216,216, 88,125,114,114,178, 33, 63, 55,215,162, 86,171, - 13,197,197,197,166,155, 55,111,154,228,242,255,141,123, 7,178,165,121, 83,178, 49,248, 96,210,130,128,187,211,186,203,141,183, - 23,133, 18,242,211, 80, 66,142,190, 73, 72,212, 76,114,117,243, 4,210, 37, 64,194,253, 54,163, 97, 60,217, 20,116,192, 22,151, - 12,100, 75,235,166,100, 99,240,209,132,249, 1,119,199,118,107, 96,252,230,171, 53,228,202,149, 43, 36, 54, 54,150, 60,120,240, -128, 28,253,121, 15,233, 18, 40, 47,227,220, 24,124,176,142,110, 30,186, 74, 36, 18,237,170, 85,171,200,229,203,151, 31,113, 30, - 60,120,144,200,229,114, 61, 96,219,174,101, 2, 80,100, 99,203, 33,236, 87, 65, 23, 62,237,173, 44,205, 63, 60,147,144,219,219, - 8,217,210,138,144,239, 58, 17,178,231, 69, 66, 14,189, 78, 46,175,121,137,116, 13, 16, 89,201,166,160,243,100,115, 75,155, 23, -219, 11,133,194,146,253,251,247,147,172,172, 44,114,254,252,121, 18, 29, 29, 77,238,223,191, 79,210,210,210,200,145, 35, 71,136, - 80, 40, 52,162, 30, 97,203, 58,121,194, 63,162,153, 40,251,230,210,174,132,252, 50,138,104,118,190, 74, 6,132,168, 10,194, 27, - 62,147, 63,186,182,174,174,174,121, 71,142, 28, 33,201,201,201,228,220,185,115,196,195,195, 35, 15,128,205,235,101, 7,244,235, - 70,136,249, 38,233,209, 61,132,180,105, 19, 66,158,239,218,140,100, 38,173, 35, 29,219, 53, 34, 27, 55,110, 36,106,181,154, 52, -106,212,136,212, 53, 99, 17, 17, 17, 87, 8, 33, 49,253,251,247,143, 1,112, 60, 34, 34, 34,230,225,195,135, 49, 29, 59,118,188, -140,154, 93, 63, 84,139, 94,189,122, 89, 8, 33,164,127,255,254, 4, 64, 86, 68, 68, 4,121,248,240, 33,233,216,177,163,185, 62, -149,103,203,184, 20, 22, 22,214,185,103,207,158,159,132,133,133,125, 96,139,123,135, 90, 56,255, 44, 39,212, 12,202,156,127,182, - 4,208,190,252,104, 81,158,198, 60, 3,231,235, 66,161,240, 27, 23, 23,151, 51,206,206,206, 81, 12,195,108, 1, 48, 6,245,243, -111, 70,151, 91, 24,127,117,119,119, 79,108,211,166,141,161,111,223,190,164, 95,191,126,100,202,148, 41,132,231,121,178,103,207, - 30,178, 96,193, 2,210,196,213,149, 93, 3,228,109, 2,222,128, 29,101, 14, 75,223, 8,164,206,141,110,140,210, 81,141,161, 29, -215,132,178,197, 97,105, 68,117, 66,139,231,121, 18, 31, 31, 79,122,244,232,161, 83, 40, 20,153,176,221, 97,233, 99,156,110,110, -110,209, 30, 30, 30, 79, 57,209,172,148,254,152,195, 82, 15, 15,143,223,189,189,189,213,238,238,238,215,171,226,116,115,115,139, -246,246,246, 86,187,185,185, 61,230,220,147, 97,152,254,110,110,110,153, 79,166, 11, 4,130,158, 30, 30, 30,233, 79,166, 87, 83, -118,120,121,121,165,103,101,101, 17,141, 70, 67,252,252,252,178,158, 20, 96, 57, 57, 57,143, 9, 48, 91, 56,107,203, 75, 13,121, -172,146,211,134, 58,173, 79,187, 87,160,185,143,143, 79,238,202,149, 43,137, 82,169,124,108,203,115, 80,247,113,159, 93, 73,208, -150,188,249,209,198, 61, 85, 56, 44,181,213, 57,104, 95,133, 66,145,217,163, 71, 15, 93,124,124, 60,225,121,158,240, 60, 95,157, -208,170,138, 51,178,125,251,246,249,121,121,121, 92,105,105, 41,155,158,158,110,122,248,240,161, 97,209,162, 69, 22,141, 70, 99, -212,106,181,230, 91,183,110,153,188,189,189, 53, 0, 34,235,218, 70,245, 68,196,147,211,103,100,115,139,174,100, 83,139, 35,247, -231,250,223,123,189,147,194, 20,179,178, 63, 33, 81, 51,201,229,141,111,146,206, 1,226, 50, 65,180, 57,248, 24,249,182,121,119, -178, 46, 80,108, 19,231, 55, 77,186,145,205,193,199,238,206,241,191, 55,180,157,187,121,215,182,205, 36, 49, 49,145, 28,220,183, -147,132, 55, 46, 23, 89,155, 90,252, 74, 54,182,232, 97, 11,103, 85, 98,107,235,214,173, 36, 49, 49,145, 28, 56,112,192, 86,145, - 21, 81,149,208,250, 56, 66, 89,244,102, 39,169,105, 84, 91,177,121,112, 43,145,165, 79, 83, 17,219,197, 95,192,133,122,211,124, - 11,119,144, 62, 65, 50, 19,217, 20,116,158,108,106,209,215,214,124,138,197,226, 52, 84,242,169,243,228, 33,145, 72, 52, 53, 8, -173,136, 90,197, 86,115, 73,246,233, 5, 61,201,192, 54,170,124, 27, 69, 86,109,125,169,173,155,155, 91,222,119,223,125, 71, 60, - 61, 61, 53, 54,138,172, 71,156,131, 6,244, 33,169, 73, 71,201,129, 61, 75, 72,143,238, 45,200,246,173,211,200,149,243,115,201, -139,253,122,144,136,136, 8,146,151,151, 71,122,246,236, 73,234,154, 79, 71, 71,199,237, 90,173, 54,230,196,137, 19, 49, 17, 17, - 17, 49,219,183,111,143,185,120,241, 98,140, 92, 46,223, 94, 97,156,120, 82,108,181,120,122,252,143,120,194,162, 21, 83, 90, 90, - 74, 78,156, 56, 65, 34, 34, 34,200,246,237,219,201,197,139, 23,137, 92, 46,143,169,239,125,100,235,184,212,187,119,239,207,146, -147,147, 75,230,204,153,179,167, 10,135,165,182,114, 38,254, 73,249,252, 83,198,144,255, 1,167, 74, 38,147,197,220,188,121,147, - 20, 22, 22,146, 16, 79, 79,178,152, 97, 72,134, 72, 68,178, 68, 34,178, 17, 40,248, 15,200,164, 9,213, 77, 29,254,213,168, 82, -104, 25,141, 70, 50, 99,198, 12,179, 84, 42,213,139, 68,162,186,134,224,249, 87,119, 66, 55, 55,183,223, 61, 61, 61,213,158,158, -158,143,137,189,202,233,110,110,110,215,255,227, 55, 96,115,145, 72,148, 42, 20, 10, 31, 15,193,211,114, 80,231, 38, 93,199,206, -246,108, 53,168,223, 51,230, 83, 36, 18,137, 62,150, 74,165,250, 25, 51,102,152,181, 90,109, 93,132, 22, 0,244,150,203,229,153, -223,127,255,189, 33, 33, 33,193, 90, 80, 80,192, 94,185,114,197, 26, 29, 29,109,158, 55,111, 94,169, 92, 46,207, 68,245,110, 9, -254,150,250, 36,235, 2,197, 21, 98,235,246,108,255,251, 3, 67,228,150, 45,239,247, 33,157, 27, 61, 33,178,170,247,228, 94, 53, -103,185,216,186,241,169,223,253, 30,205,149,236,146,217,211, 73,120, 99,217,227, 34,171, 14,156, 79,138, 45,185, 92, 94, 58,119, -238,220,186, 88,178, 30, 23,132,223, 4,249,145,205,193,219,203, 68, 84, 45,199,198,160,175,201,134, 32,191,127,202,125,212,201, - 19,254,189,154, 75,238,212,193,146,101, 75, 62,219, 58, 59, 59,223,171,131, 37,235, 17,231,134, 13,235,201,171, 35,123,147,164, -123,251,137, 54,255, 40,185,126,105, 21, 25, 54, 40,140,132,135,119, 36,155, 55,111, 38,113,113,113,164, 67,135, 14,164, 30,249, -236, 51,113,226,196,152,135, 15, 31,198, 60,120,240, 32,230,226,197,139, 49, 67,134, 12,137, 1,208,167,242, 76, 80,133,216,178, - 12, 27,102,106, 75,211,211,107,225,124,101,226,196,137,228,225,195,135,228,193,131, 7,228,226,197,139,100,200,144, 33, 4,117, - 11,223, 83,175,113, 41, 44, 44,172,115,143, 30, 61,102,183,107,215,174,223,159,197,249,255, 80,104, 41,134, 14, 29,202,115, 28, - 71,250,245,235,199,173, 5,138,182, 80,148,122, 11, 69,169, 55, 3,154,255,186, 69,235,175, 14,248, 25, 1,224, 84,229, 4,169, - 84,170, 54, 26,141,238, 74,165,242,103,173, 86, 59, 21,101,219, 34,159,137,243,175,200,167,157,243, 63,193,233,173, 84, 42,215, -107,181,218, 33, 82,169, 84, 99, 52, 26, 61,235,192,233, 36,145, 72,166, 75,165,210, 30,122,189,190, 57, 0, 40, 20,138,120,147, -201,116,198, 96, 48,172, 6, 80,244,191, 46, 59, 89, 23, 40,134, 88,220, 30, 4,179, 98,210,116,141,151,156, 40,240,127,191,167, -115, 90,151, 38,138,100, 8,249, 47, 64,153,174, 82,111,164,154,234,204, 41,163, 58,130, 19,206,186,154,162,111,244,197,201, 82, -255, 15,122, 40,211,186, 4, 42,211, 64,240, 5, 36,250, 75,117,229,124, 82,108, 41, 20,138,239,117, 58,221, 91, 0,206,212,181, -236,100,111, 11, 17,116, 86, 31, 88,153, 16,144, 26, 66,248, 16,162, 7,205,196, 34, 7,106,106,222, 61,139,253, 62,170,154,243, -171,175,190, 36,167, 78, 30,133, 73, 95,128,236,220, 18,188, 58,102, 28,218,182, 13,131,155,155, 27, 22, 47, 94,140,166, 77,155, - 98,193,130, 5, 84, 61,242,217, 71,169, 84,190, 26, 28, 28, 28,120,247,238,221, 7,122,189,126, 7,128, 95,159,124,254, 4, 3, - 61,228, 2, 65,168,129,101,207,223, 3,162,107,225,124, 69,169, 84,126, 16, 28, 28,220,234,238,221,187,119,244,122,253, 74, 0, -187,237, 99,221,191,131,147,166,233,213,254,254,254,195,146,147,147,103, 1,216,133,255, 71,248,219,133,150,157,211,206,249, 47, -228,172,184, 79,200, 63, 45,159,127,136, 45,126, 42, 40, 52, 6,161, 50, 32,226,215,212, 34,178,106,231,148, 81, 29,193, 10,222, - 3,133,134, 32,200, 1,161, 87,215, 34,178,254, 94,145, 9, 80,152, 87,195,248, 53, 15,132,170,190,189,236,125,190, 10,124,246, -217,103,228,248,241,227,144,203,229, 48, 24, 12,232,219,183, 47, 22, 46, 92, 72,217,199, 16, 59,231,223,200,249,159,132,192, 94, - 5,118,216, 81, 43,200, 63, 53, 99,212,187, 15,204,100,111,139,107,200, 99,102,128, 70, 99,128, 77,133,142,205,161,222, 77, 53, - 63, 35,231, 21,228, 81,211,192,160, 57,196,108, 18,180,230, 28,106, 82,253, 57,255,130, 55, 68,130,121,255,220,118,249, 55,226, - 73, 81, 21, 29, 29,109,175, 20, 59,236,176, 29, 19,240,248, 78,195, 71,223,237, 66,203, 14, 59,254,229,160, 70,220,179, 0,200, - 40, 63,254,177,156,118,216, 97,135, 29,255, 15, 5, 23, 40, 84,191,160,173, 46, 38,193,250, 44,180, 59,101,231,172, 23, 39, 3, -192, 17,128, 19,202,124,144, 84,108,233,173,205,205, 70, 63, 0, 86,123,125,218, 57,237,156,118, 78, 59,167,157,243,127,204, 89, - 27,247,191,113, 74,178,170, 93,134, 91,254,142,127, 28, 97,231,252, 83,209,247, 63, 83,118,130, 80, 16,172, 41, 63, 66,237,237, -110,231,180,115,218, 57,237,156,255,239, 57,255,147,176, 79, 29,254,187, 32,253,215,230,156, 16,111, 0, 21, 78, 46, 99, 97,164, -130, 33,197, 52, 0, 64, 41,174, 19,130, 4, 0, 33,229,191,167, 83, 84,157,119,163,218, 97,135, 29,118,216, 97,199,255, 10, 97, - 0,174, 3,240, 6,240, 34,128, 35, 40,247,170,240, 63, 21, 90, 50,215,102,222, 16,208,109, 40,158, 4, 3, 0,161,169,251, 96, -249, 91,134,252,132,103,126,200, 42, 27, 52,119, 33, 16,239,165, 96, 30,161,205,138,127,102,103,104, 33,205, 29,134,121,186,169, - 94,205,201, 47,254,254, 78,156,246,151,186, 92,235,232,232,239, 40,117,113,126,201,100,177,134,136, 69,162, 52, 75, 81,201,150, -194,194, 7,165,245,200,134, 75, 77, 63,206,155, 71,168,195,217,215, 41,145,220, 66,187, 58,136, 40, 45,180, 68,155,173,228, 3, -138,146,201,190,125, 35, 72, 93,219,134,162,241,130, 66,165,106, 39,145,202, 59,202, 85,206,205,120, 2, 20,168, 51, 83,204, 86, -246, 34,103,214,199, 16, 30,103,235,208, 86,175, 1, 88, 2, 0,232,217,243, 20, 66,224,128,213, 21, 25,199,164,158,183,241, 90, - 84, 20, 42,156,203,126, 12, 96,105, 29,178,235, 4,192, 31, 64,113, 72, 72,136, 62, 54, 54, 86,243,103,245,209,103,105,247,154, - 32,145, 72,101, 86,171,197,194,113,220, 51, 7,166,150,200, 29,230, 62, 21, 94,137,162, 97,212, 22,206,183,143,125,118,216, 97, -135, 29,127,171,208,122, 17,101, 83,134,181, 47,134,247,111,249,220, 53,169, 84, 22, 0, 0, 60, 33,224, 9,160, 43, 41,138,201, -121, 16,221, 23, 0,220, 26,133,157, 16, 74, 29,218,241,164,236,119,142, 7, 88,139, 49,185, 36,245, 74, 7, 91,114,164,112,111, - 62,180,103, 68,175, 97, 3, 6,188, 24,212, 58,164,117, 19, 0,184, 29,123, 59,233,240,225, 35,113, 81,167,168,253, 58, 77,252, -129,103, 50,160, 64,186,176,125,251,182,207, 69, 71, 95, 95, 0, 96,202,179,214,160,171,171,114,234,175, 63,205,232,222,107,216, - 10, 5, 80,183, 7,174,212,197,249,165,193, 3, 35,219,126,248,238, 68,250,205, 25,139, 3,174,253,118,118,153,210,187, 85, 17, -225,173,191,234,212, 35, 47,212, 20, 56,249, 73,253, 88,157,192,218, 81,112,156, 94,243, 93,103,103, 67, 65,210, 72,194,115, 35, - 41,138, 2, 35,150,239,115, 15,124,110,143,211, 11,239, 23, 2,176,121,199,152,131,119,203, 8, 15,111,223,253, 35,199, 77,151, -202, 29, 61, 5, 96, 68, 0, 40,100,165,220, 67,212,238, 37,206,239,205,223, 26,246,219,173, 84,246,244, 79, 95, 26, 41,145,112, -152, 62,251,110,237,243,233,169,169, 78,240,247, 47,251,251,235,175, 63, 67, 64,227,219, 40, 91,107, 6,172, 66,241, 15, 89, 8, - 1,202,132, 86, 74, 10,156,109,205,107,223,254, 47,247, 78, 75, 77, 88,144,149,153,246, 11, 45, 16,240,133,197,186,247, 93, 93, - 61,180,249,249,185, 61, 80,190,144,219,205,205, 77,145,151,151,103, 1, 96,249, 59,219,253,165, 55, 22,126,189,239,187,207,222, -170,234,183,201,239, 45, 92,237,239,235,164,120,119,202,248, 42, 3,114, 63, 31, 57,254,195,115,199,183, 46,175, 85, 16, 43, 84, -115,135,191, 53,123,222, 11, 61,251, 60,150,126,229,210, 69,236,220,240, 25,116,165,118,177,101,135, 29,118,216,241, 55,224, 72, -185,184, 58,242,228, 15,213, 10, 45,169, 84, 22,112,249,236, 97,151, 3, 23,211, 1, 0, 17, 97, 94,248,100,209,250, 62,219,215, - 69,199, 1, 64,231,158, 3,154, 47,248,248, 93,252,126, 39, 23,132, 16,180,109,234,138,126,131, 71,216, 38, 60, 60, 91,116,120, -233,165,225,163,103,204,248, 96, 80, 98, 98, 98,202,174, 93,187, 46, 0, 64,183,238,221,155, 46, 94,188,248,229, 21,206, 46,146, - 31,247,253,148,105, 84,223,187, 86,159,210, 74, 27, 4,250, 4, 53,107,252,234,143,223,174,167, 95,232, 59,124, 84, 10,116, 75, -140, 89, 15, 50,109,185,214,205,205,109,154, 80, 40,116, 4,202,162,177, 87,192, 98, 33, 94, 0,192,114,188,202,185, 65, 80, 41, - 35,146,114, 18,137,232,110,169, 86,251,125, 73,230,189,111,106,226, 52, 89,173,173,222,155,244, 6,125,227, 65, 62, 2, 90,117, - 99,214, 44,249, 20, 60,103,117,158,254,241,162,151,162,175,252, 8,157, 26,231,108, 44,154,240,201, 4, 31,159,112,102,225, 18, -101,111,138,194,235,254,157,199, 13, 89,176,109,159,176,125, 83, 7,152,172, 60,142,197,228,119,222,184,122,225,242,223, 54,190, -120, 8,192,102, 0,167, 1,212, 42,234, 92, 92, 93,118, 76,155,189, 90,169, 51,255, 97, 37, 41, 23, 89,248,250,251,189,184,153, -206, 35, 56, 40, 88,224, 53,109,153,114,243,162, 9,219,244,101,113,182,170,146,187,129, 0,186, 2,247, 93,240,246,252, 94,248, - 97,233,231,240,240,208, 65,165, 74, 3, 5, 79, 0,205,202, 79, 76, 16,231, 33, 29,192,199,185,185, 80, 44,152,136,190, 55,128, -143, 66,129, 92, 0,191, 81, 53, 69,141, 39,236,146,247,102, 45, 15,113,111, 28,210, 49, 54, 46, 19,151,143,124, 9, 77, 78,170, - 83, 97, 97,222,247, 13,155,134, 18,133,163,123, 88, 81,206, 67, 56, 56,225, 33, 69,184,193,197,197,133, 57, 0,108,178, 34,121, -121,121,205,245,241,235,212,189,162,221, 93,252,219, 22, 86,252, 70, 51,130, 29,121, 15,175,189, 91,211,245,254,193, 3,199, 47, -249,178, 91,143,251, 55, 79,236, 77,123, 16,115,145,181, 90, 76,205,130,218,180,127,227,245, 81, 47,223,207,116, 11,213, 20,153, -112,243,246,157,182, 75,151,126,177,244, 78,236,237,219, 42,149,147,115,227,230,161,157,130,219,244, 31, 85, 96,118, 9,180, 69, -104,177, 44, 7, 87,175, 64, 8,165, 42,248,122, 58,162,168,212, 4,157,137,133,155, 87, 99,176, 44,107, 31,250,236,176,195, 14, - 59,254, 30,100,227,241,197,239, 91,106, 21, 90, 0,160,148, 9, 16,247, 48, 7, 0,224, 36, 3,166,190, 61, 22,249,121,154,230, -102,150,199,184,177, 99,112,253,126, 54,226,146, 53, 32,132,160,185,175,205, 65,184,193,128,111, 63,110,252,184,231, 79,252,250, -235,213,207,102,127,246, 3, 69,225, 18, 0,108,222,242,117,231, 57,115,231,188, 53,102,236,152,222,251,246,237,187, 3,160, 94, - 66, 75, 64,169,214, 47, 95,250,185, 56, 35,207,104,156, 54, 99, 22,255,193,251,211,214, 0, 24,110,147,146, 17, 10, 29, 51, 50, - 50,148, 52,253,120, 44,205, 47, 62,159,117,190,247,176, 21, 9, 41,105, 69, 55, 78, 28, 60,216,161,101,203,150,200,200,204,233, -186,108,237,166,208, 99, 39,100,111,148,150, 24,134,233,243,238, 85, 25,180, 89, 34, 20,222,153,191,108, 99, 91,222,169, 41,253, -201, 91,253,209,170, 73, 3,100,230, 22,161,123,223, 65,130,152,107,215,250, 0, 54, 11,173, 39,157, 7,190,100,230,115, 67, 23, -127,127,165,215,144, 46, 13,218,211, 52, 3,173,193, 10, 77,177, 9, 28, 15,116,107,225,136,200,237,107, 5, 5, 58,235,208, 69, - 63,165, 15,189,180,110,128,218, 88,156,245, 14,128,253,181,216, 3, 93,124, 61, 28, 16,151, 94, 90,165,200,210, 25,203, 30,224, - 34,134, 3, 5,226, 90, 3, 81, 87, 0,223, 1,193,192,201,119, 70,195,211,115,151,167,167,231, 75, 30,158, 94, 49,205, 71,191, - 65,249, 4,180, 80,105, 13, 22,220,189,115,187,180,101,187, 88, 82, 90,144, 59,221,168, 43,220,119, 15,136, 13, 6,246,148,115, -188,129, 26,132, 86, 66,194,189,162, 55, 94,233, 33,184,145, 84,138, 7, 10, 5, 90,117, 25,130, 98, 77,134, 48,242,141,249,157, - 12,165,197, 82, 87, 79,127,220,251,125, 47, 52,105,137,109,141,102,211, 1, 23,191,206, 61, 14,125,247,145,185, 54,235,150,151, -151,215,220,183,223,126,123,158, 38,251,254,194,222,195, 86,180, 73, 73, 43,186, 49,122,254,153, 14,147,135, 54,197,177, 91, 37, -248,124,124,143, 87, 1,212, 40,180, 24, 1,225,164, 74,175,128, 97,175,188, 51,171,129,187,116,150, 92, 70,195, 73, 33,198,175, - 87,114,241,227,175,233,176,178, 4,225,109,154, 53,159,250,225,234,109,222,174, 98,100,231,153,145,169, 49, 66,157,103,132, 54, - 95,111,178,169, 67, 80, 20,114, 53,249, 56,114,232, 8, 40,161, 20, 20, 77,193,106,177, 64, 64,211,160,104,202, 62,244,217, 97, -135, 29,118,252, 61,168,118,215,161, 0, 0, 14, 31, 62, 76, 6, 12, 24,240,212,168,204,113, 4,113,201,101, 75,112, 24,134,193, -139,207, 53,197,154,101,243, 97, 48,179,184,249,176, 24, 7,126, 79,135, 89, 87, 4, 66, 8,242, 90,121, 84,245,143, 31,155, 82, - 90,177, 68, 22,198, 72,132, 35,127,187,162,104,228,226,236,236,156,112,231, 7,221,156,247,213, 45, 4,196, 18,179,232,139,166, - 15, 69, 46,130, 46,123,247,238,105, 57,112,192, 0,177, 82,169,154, 73, 4,161,190, 66, 29,249,160,184,248, 86,113,117,156, 79, - 66,230, 17, 60,104,208,139,145, 61,189,188, 60,249,209,139,175,220, 95,255, 78,152, 95,179,166,205,186,198, 89, 13,131, 12,185, - 9, 7,171,185,236, 17, 39,207,243,160,105, 26,106,181, 26, 28,199,193,100, 50,193,106,181, 34, 61, 61, 69,205, 19,226,203,129, -167,189,189,125, 33, 16,136, 17,208,200, 31, 27,215, 44,145,111,255,241, 96,199,143, 62, 91,248,139, 62, 15,225,248,195,185,229, - 35, 78, 99, 65,225,190,163,199,127,117, 39,136,106,240,201, 91,253,153,220, 66, 45,162,174, 37,226,250,221,244,186, 54,228,147, - 46, 28, 26,101,166, 38,150,172, 88,177,130, 89,112, 44, 49,189,103,191,225,156,127,147, 54,141, 76, 28, 1, 64, 65, 34, 18, 64, - 36,160,225,239, 46,197,207,179, 66,112,101,240, 45,207, 62, 97,238,171, 9, 33,251,107,170, 79,147,201,202, 61, 23,172, 96, 66, - 3, 29,113, 43,169, 16, 87,143, 93,194,180,217,171, 17,253,208,132, 82,173, 30, 20,103, 2, 67, 76,200, 75,125, 0,150,227, 72, -109,237, 94,134,176, 66, 0,144, 72, 36, 31, 31, 56,116,188,129,137,151, 34,167,200, 4,117,161, 9, 77,195,135, 41, 82, 51, 53, -248,110,254,203, 31, 3,216, 23, 12,148,218,192, 41, 1,208, 35,229, 97,188,213,108,230,120,163,133,163, 91,249, 57,226,155,147, -215, 16,210,227, 21,163,152, 97,100, 42, 71, 55,128, 0,173,186,191,130,171,191,108,128,146,102,218,201, 28, 36,161, 0,174,214, -212,151, 42, 68,214,220,185,115, 49,229,237,151,193, 19, 34,228,192,211, 0,240,213,129, 68,248, 7,120,212,212, 70,127,132,139, -225,104,202, 98, 33, 40,213, 90,161, 41, 50, 67, 37, 21, 32, 62, 77,135,196, 84, 45, 94,238,235,131, 97,189,188,193,241, 4, 99, -102, 94,199,240, 62,222, 24, 61,192, 23,160, 40,228, 21,154, 97, 50,115,213,150,157,166,233,198, 12,195,132,113, 28,119,189,236, - 59, 3, 14, 64, 73, 97, 30, 76, 38, 19, 24,134,129,179,139, 59, 0,234,177,115,121,158,127,104,235,125, 84, 79,216, 57,237,156, -118, 78, 59,103,189, 81,157, 22,249,151,160, 90, 87, 14,116, 77, 87, 37,165, 23, 32,238, 97, 14,218, 5,251,160, 73, 35,111, 92, -141, 47,196,142,168,116,108, 61,145,138,168,155, 26,240, 2, 21,114, 74,128,132, 20, 53, 18, 82,243,106,245,159,205, 72,132, 35, -223,123,175,120, 70,235,150, 37,225,103,143, 77,133,143,123, 66,203,143, 62, 42,154,202, 72,132, 35,157, 27,170,118,205,154, 49, -253, 85,149, 92, 46, 54,155,204, 8,108,236, 47,125,247,157,169,111, 80,206, 18,155, 99, 34,169,124, 90, 56, 75,100,178,111, 22, -205,155, 41, 89,125, 32, 33, 77,103,134,110,255, 37,245,131, 15,102,205, 41, 16, 8,165, 27, 85, 62, 45,108, 94,251, 99,181, 90, - 97, 50,153, 96, 54,155, 97,177, 88,144,153,126,111,208,233, 3, 31,246,109,220,208,165,175, 68, 42, 5, 1, 80, 98, 96,241, 48, - 91,143, 30,189,122, 51,237,194,194, 90, 41,189, 91,140,175,138,171,184, 56,181,152, 39,140,234,240,207, 59,153, 61, 39,111,224, -135,195,215,240,203,153, 27,184,122,238, 24, 75,120,235,163,248, 95, 74,239,166,205,149,222,173, 83,149, 13,218,168, 31, 29, 62, - 33, 53,186,103,102, 24,154,244,232, 21,113,234,237, 41,239,158,213,151,230,231,126,179,126,126,166, 38, 43,229,158, 68, 68,177, -114, 9, 3,173,145,197,182,211, 89,120,105,201, 77,220, 77,211,130, 16, 82,107, 0,111, 30,120,127,228,248, 15, 57,171,197,130, - 32, 63, 37,118,110, 89,138, 65, 61, 66,209,179,181, 51, 58, 52, 81, 64, 46, 48,225,206,253, 56,236,222,185,141,229,121,250,131, - 90,110,196,200,242, 35, 6, 0,180, 90,237,135, 31,205,252, 64, 99,102,121, 88,172, 60, 44,229,159,167,119,127,161,225,140,250, - 15,203,175,139,169,116, 93,117, 55,243,186, 55, 39,127,212,227,155, 29,167,122,239, 63,159, 77,171,243, 45,136, 58,190, 15,222, - 13, 3, 33, 98,104, 25, 40, 0, 20, 5, 80, 20, 8, 33,112,247,111, 1, 35,207,227,167, 77,159,250,160,134,245,106, 21, 34,107, -194,132, 9,184,119,239,222, 99,237,158,148,152,140,164,196,100,156, 58,113, 25, 0,224,226,223,182,208,197,191,109,161, 91,227, - 14,155,171,226, 50,115, 86,222,192,114,200, 41, 50, 66, 46,165,225,231, 35,199,208,158,222, 88,255, 73, 27,140,238,239,131, 12, -181, 30, 19, 22,222,132,167,167, 16, 63,159,207,198,186, 93, 73,104,230,175,192,144,158, 13,240,250, 64,223,170,173,181, 2, 65, - 63,161, 80, 56,106,200,144,161,243, 37, 82,197,146,119, 22,238,152, 39,147, 8, 42,172,177, 96, 24, 6, 86,171, 21, 52, 77, 97, -228,180,245,243, 36,114,213,146, 33, 67,134,206, 23, 10,133,163, 4, 2, 65, 63,251, 75,167, 29,118,216, 97,199, 95,102,209,170, - 56,188, 31, 27,183,171,187,194,104, 52, 36, 15, 31, 57, 6,222, 30, 94,202,193, 47,188, 46,138, 73, 42,130, 38, 59, 21,137,241, -177,208, 27,173, 16, 57, 55, 6,164, 94,104, 20,224,143, 91,113,191, 88,214, 45, 63,162,229, 89, 83,114,117,124,131, 6,121,251, - 38,222,167,232,229,203,252, 46,199,199, 21,182,219, 57,251, 59,140, 30,173,116, 91,190,204,239,114,202, 3, 5, 45,151,146, 46, -111,140, 29, 69,209, 20,193, 71, 31,205,192,224, 1,145, 24,247,198,107,212,247,223,111, 11, 47,178,177,148, 60,132, 27, 62,254, -116,190, 88, 93,196,154,175,198,107, 77,114,133, 76,246, 91,130, 86,215, 42,192, 79,214,127,216,235, 89, 71,246,126,179, 26,192, - 88, 91,184, 42, 4,150,213,106,133,197, 98, 1, 0,174,204,122, 80,246,153, 95,106, 70,110,145, 9,234, 34, 19, 88,142,199,176, -145, 99,101,215,162,111,142, 5, 80,205,122, 45,158,183,178, 86,236, 63,121, 29,153,215,246,241, 20,205, 20, 87, 90, 12, 15,165, -119,211,230, 94, 94,126,231, 7, 12,123,205, 93, 44, 45,155,134, 45,213,153,240,253,166,101, 53,230,147,166, 40,194,115,108, 17, -107,181,234, 2, 27, 7,102, 6,183, 12,149, 94, 60,123, 98,208,111,167,246,107,217,192,215,156,146, 82,178,193, 8, 37, 96, 68, - 82,152, 44,182,109, 60, 84, 39, 94,254, 18, 0, 53,126,242,140, 53,211, 63,252,132,121,127,221, 5,152,141,122,152, 12, 58,148, - 20, 23, 66, 38,176,226,206,239, 7, 89,194, 89,167,235,178,111,124, 89, 61, 19,149, 5, 32,171,114, 74, 65, 65, 65,212,239, 23, -206, 31,186,242,251,133,113, 94,129,237,104,179,149, 71, 98,236, 21, 62, 51, 33,250,144,201, 84, 18, 5, 0, 20,144, 15,224, 68, - 77,134, 75,149,131,147,227,184, 41, 31,142,119,146, 41,232,216,140, 34,164,102,151,128,147,249,192,203,183,201, 31,243,171,124, - 89,121, 59, 6,185,163, 79,232,203,184,120, 59,141, 59,177,231,203,222, 0, 14, 2,208,215, 36,178, 98, 98, 98, 32, 18,137, 30, -107,247, 38, 77, 3, 80, 49,117, 88, 84, 48,213,105,219,242,215, 1, 0, 61,159,235, 62, 1,192,219, 79,189,168,228,148,192,213, -204,162, 83, 11, 23, 4, 53, 86, 34, 51,223, 12, 66, 9,176,247,116, 30, 18, 50,116, 56,121, 85, 3,111, 23, 49,120, 51, 13, 70, - 2,236,191,152,137,139,119,242, 48,166, 95, 67,220,127, 88, 80,141,176,102,194,222,255, 96,198,130,181,107,215,157, 25, 62,121, -249, 75,221,194, 2, 81, 82,170, 69,102,129, 21, 90, 93, 41,116, 90, 29,100,114, 57, 36, 98, 49, 24,129, 0,253,222,248,252,165, -163,223,125,122,246,253, 15,102, 44, 88,181,114,197, 28,150,101,143,217,199, 67, 59,236,176,195,142,191,212,162, 53,161,114, 90, -181, 66, 43,245,238,197, 14, 0,208,188,125,159,124,165, 84,224, 34,160, 41,168, 51,146,240,253,138,105,224,121,130,254,111, 45, -135, 42,192, 11, 50, 17, 3,147, 54, 95, 91,144,116,174,166,181, 58,160, 40,107,239, 47, 55,103, 6, 76,158, 20,232,176,115,167, - 86, 8, 0, 59,119,106,133,147, 38, 54,116,248,106,115,114, 64,167,231,218,129,112, 28, 6, 12, 30,142,145,175,140, 68, 74,142, - 30, 63,157, 79,131,206, 96,182,105,183,156,204, 45, 56,212,205,213, 61,242,189,215, 35, 21, 2,134,162,154,249, 59, 50,233, 26, - 43,203, 48, 66,238,208,181,226,172, 97,195, 94,113,139, 58,186,167, 39,231, 22, 28,106,200,187,127,179, 54, 62,147,201,244,216, -212,161,139, 91,227,163,189,135,175,200,200,206, 41, 61,146, 83,104,236,164,179,178, 80, 23,153,144, 91,100, 66,145,206, 2, 47, -149, 51, 88,171,185,117,117,124,132,144, 31,134, 12, 31,243, 26, 0,154,162,217,239,180,217,247,227,203,126,249, 67,100, 69, 14, - 30,237,126, 62, 38, 9,137,209,199, 10, 9,207,150,121,113,167,248,140,154,235, 21,132,161,192,139, 4,148,149,161,105,222, 98, -209, 90, 61, 60,220,163,206, 69, 29, 31,104,100, 31,128, 17, 73, 30,157,107,120,124, 58,170, 54,177,181, 1, 0,214,174, 91,179, -178, 75,239,209,162,115,215,147, 97,176, 2,157,195,154,227,231, 31,191, 54, 17, 98,253, 80,151,125, 99, 67, 29, 58,161, 83,195, -134, 13,167, 9,197,226,158, 50,185,170,161,187,183, 31,109, 97, 57, 88,172, 28, 20,174, 62,180, 68,233,210,155,167, 69, 23, 89, -139, 57,202,162,211,172, 5, 80,173,190, 62,121,249,110,207, 77,107, 87,190,228,237,170, 64, 67, 55, 17, 14,157, 43,228,172, 2, -158,246,240, 15,162, 0,192,207,195, 1,119,175,159,197,173, 91,183,209,186,115, 36, 92, 85,190, 80,138, 56,146,151,248, 91,129, -167,151, 79, 91,117, 78,166,232, 73,161,229,229,229, 53,119,204,152, 49,243,188,189,189,177,102,205,154, 71,233,149,219, 61, 4, -232, 84,121,234,240,171, 3,137, 53, 22,248,141, 1,141,240, 92,168, 7,120, 30,120,119,245, 45,196, 38,149, 96,203,199, 97, 24, -214,195, 7,155,127, 73, 70,155,102, 10,104, 13, 60, 44,102, 14, 34, 49,141, 22,141,149,144,136, 24,156,185,158,135, 82,157,174, - 70,110,138,145,160,119,143,206,200, 43,210,195,221, 81,140,198, 13,221,161,148, 55, 70,169,129, 69,106, 78, 49,138,117, 86,228, - 21,234,208,181,115, 71,252,186, 93,108, 31, 2,237,176,195, 14, 59,254, 30,171, 22, 80,201,135,214, 99, 66,235,240,225,195, 4, - 0,170,154, 31,205, 84, 23,192, 85, 41,128,123,131, 0,188, 58,109, 37,126, 88,253, 62, 56,206, 10, 66, 0,150,179,205, 51, 1, - 33,194,147, 83, 38, 5, 4, 55, 10, 96,220, 95, 29, 45, 55,236,216,169,151,189, 58, 90,110, 8,105,237, 90, 60,101, 82, 64,114, -169,209,175, 43,203,113,248,237, 78, 46, 98,147,139, 17,155, 82, 2,165,204,118, 55, 95,140, 88, 52,105,217,210, 37, 34, 1, 67, - 81,119, 82,181,218,140,124, 86,203, 8,133, 22,185, 76, 76,204, 68, 96, 74,201, 35,249,189,134,188, 97, 56,180,125,237,120, 0, -239, 84,107, 21, 43,223,105, 88, 97,201,170,248, 36,132, 16, 10,224,121,138,227, 50,242,140,208, 90,172, 80, 23,254, 33,180, 40, -182,250,153, 83,165,119,211,230, 14, 42,229,113,134, 97, 36,132, 0, 86, 11,251, 50,188,155,246,213,102, 39,198, 87, 22, 89,151, -239,100, 33,233,198, 41, 53,103,209,143,209,231,198,157,182,181,236, 20, 5,194, 48,224, 25,154,226, 41, 10,188,144, 38,102, 16, -194, 63,153, 35,125, 29,132, 86,133,216, 18, 11,153,217,191,238, 94,237, 49,238,197, 22,248,241,124,153,230, 51,150,106, 74,116, -153,117, 18, 89,112,117,117, 29, 59,115,230,204,185,131,134,143, 70,177,145,130,186,176,204, 26,104,182,242, 16, 41,220,208,123, -202,183, 13,179, 53, 37, 13, 19,175, 30,234,154,119, 99,103,177,213, 88,188,166,218,124, 37,101, 93, 53,232,117, 40, 49,148,149, -103,198,216, 32,230,179, 47, 79,130, 37, 2,184,184,251,192,221, 65,132,215, 95,238,135,243,254,141,112,239,254,125,204,158,127, - 4,158, 78, 14,177,151,206, 30,108, 18, 22,222,109,213,209, 3,187,158, 18,113, 57, 57, 57,243,183,111,223,142,208,208,208,121, -237,218,181, 67, 78, 78, 78,133, 64,126,212,238, 73,137,101, 6,219, 10,161,117,253,250, 45,132,133,181,169,182,204,173,155, 56, - 96,223,153, 44,124,123, 56, 5, 50, 9,131, 0, 31, 41, 38, 45,187,129, 30,109,221, 48,117, 68, 99, 40,101,254, 40, 42,181,194, -108,229, 97, 48,177,200, 47,177, 32, 51,223,136,116,181, 1, 22,107,205,107,225, 9, 8, 98,227, 51, 96, 50, 25,225,236,236, 12, -165,220, 8,169,147, 31, 0, 6,133,234,226,178,221,135,122, 35,228, 50,137,125,232,179,195, 14, 59,254, 53,168, 73,139,252,139, -172, 90, 79, 91,180,106, 42, 16, 33, 64, 66,106, 30, 26,249,186,195,183, 81, 19,196,223,187, 85,105,176, 7, 88,206,182,233,168, -131, 7,179, 51, 86,174,116,224,223,127,191,184,243,178,101,126,151, 38, 77,108,232, 24,210,218,181,120,230,204,180,206,171, 86, - 57, 94, 58,121, 89,200,145,114,127, 93, 21,190,185, 8,169,139,143, 77,186, 99,104,203,198,204,252,157, 9,105,167,111,151,230, -138, 68, 34,171,151,179,148, 82, 41,197, 12, 67, 11,197, 38, 43,109,106,222, 42,140, 57, 68, 83, 97, 53,177, 84, 8,173, 39,167, - 14,243, 53, 73,131,126,253,105, 70,200, 11, 67,150,187,100,106, 12, 40, 54, 51,143,166, 14, 25,154,194,237,123,169, 0, 35,138, -173,138,211, 65,229,114, 98,215,142, 31,252, 86, 45,251, 28, 22,150,195,148,247, 63,195, 27, 99,199,156,128,119,211,190,126, 1, - 65, 49, 23, 14,125, 39,239, 59,113, 35, 82,227,162,115, 88, 83,201,238,186,136,172, 71, 98, 11, 32, 28,225,233,130,194, 18,165, -137,133, 20, 85,232, 62,147,133,175, 87,207,209, 26, 88, 28,186,146,131,195, 7,118,195, 81,165,168, 23,135,163,163, 99,139,238, -221,159, 7, 37, 16,195,108, 53,193,204,242, 48, 87, 90,163,101,177,242,176, 18, 33,228,222,109, 80,112,247,231, 22, 48, 22, 87, -203,245,218,107,125, 10, 90,182,110,183,247,211,247,223, 26, 49,226,213,113,232, 20,254, 28,226,110,253, 14,207,134,193, 80, 58, -185,145, 75,201,133,108,231, 96, 63,193,216,193, 29,168, 40,223, 64, 4,180,232,130,132,187,215, 90,139, 68,162,219,105,137,247, -171,157,146,204,201,201,169,240, 57, 53,175, 93,187,118, 72, 75, 75, 67, 65,165,118,111,210, 52, 0, 0, 16,127,191,108, 19, 67, -133,200,226,249,170,251,233,132, 37, 55, 80, 98,224,224,230, 44, 6, 67,209, 0, 33,104,228, 45, 67,116, 66, 1,198,204, 47, 68, -120, 75, 23,248,121,203, 1, 66,160, 53, 90, 97, 54,243,176,240,128,217,200,130,161,171,221, 50,200,113, 28,199,209,196,202, 92, -143,141,135, 88, 36,132, 99,145, 14, 50,153, 12, 34, 81, 30, 40,154, 6,203,242,176, 88,173, 48,232, 13,216, 27,125, 25,132,179, - 48, 28,199,113, 40,159, 6,181,195, 14, 59,236,248, 39,226, 95,188, 16,190,178,184,170,222,162, 85, 19,252,125, 61,113, 37, 54, - 25,173,131, 27,195,209, 65,133,251, 73, 25, 96,104, 33,104, 10,176,178,182,139, 33, 98,177,254,184,106,149, 35, 82,147, 21,244, - 87, 27,147, 3,166, 76, 10, 72, 94,181,202,241, 18,177, 88,127, 4, 48,134, 16,160, 76,108,149, 9, 46,174, 14,186,128,240,214, -134,158, 46,114, 38,250,129, 46,159,166, 25,147,171,163,148,119,117,148,208,174, 42,177, 80, 36,100,120,150,208, 22, 95,143, 0, - 35,225,121, 91,226,234, 61, 54,117,200,113, 28, 40,138,230,202,133,152, 34, 61,223,128, 98, 35, 3,117,145, 9,133,165, 22, 52, -243, 81,224, 84,212, 62, 61,103, 53,236,172,210,218, 38, 20, 57, 54, 9,240,197, 39, 11, 87,193, 96,226,144,144,169,133, 72, 34, -241,242,244,106,117,115,204,228, 89,146,119,183, 36, 97,124, 79, 87,188,127, 33, 41, 83,175,150,206,170, 75,203,114, 28, 7,131, -209, 44, 82,231, 21, 58,151,148,234, 28,100, 82,137,193,221,197, 49,175,170,115,141,230,250, 61,103,229, 82, 1, 6,134,123,193, -104, 25, 5,131,137,197,239,167,247,215,135,166,177,103, 3, 95,104,205,149,196, 85,185,216,170, 44,186,132, 74,119, 0, 84,227, -218,138,125,247,118,204,203,119,111,199, 44,184,118,233,220,174,101,223,156, 14,217,190, 97, 14,214,255,146, 4,134, 97, 40, 98, -101,133,107,127, 73,134,175, 19, 67,180, 86, 33,101,228, 40,232, 10, 52, 8,234,216,175,213,174, 47, 63,157,133, 50,151, 17, 38, - 91,196, 86,161, 58,250, 81,187, 31, 63,246,104,223, 2, 10,111,110, 43, 74, 58,179,190, 76,226, 51,130,125, 85,171,118,139,217, -195, 81, 76, 56,214,194, 87,246,104,229, 40,163, 64,120,224,218, 29, 53,174,199,211,112,117, 16, 65, 41, 19,194,202,242,208,155, - 89, 24,140, 28,205,179, 22, 83, 53,237,125,125,237,154,213,115, 70,141, 26, 53,105,247,158,121, 7, 67, 35,223, 27, 84, 82,148, - 15,161, 88, 6,145, 64, 4,154,161,193,114, 28,204, 70, 29, 10,139, 10,144,252,219,247, 7, 71,142, 24, 26,182,118,205,234, 57, - 21,187, 20,237,176,195, 14, 59,236,248,203,172, 89, 79,193, 38,161,165,148, 75, 65, 24, 41, 46,196, 36, 33,168,101, 27,108, 59, -120, 21, 77, 91,135, 35,187,148, 5, 1, 93,235,110,195, 10,204,248,216,112, 29,192,245, 65,131,228,190, 67,135,250,244, 38, 68, -120,114,227,230,146, 12, 0,104, 28, 82, 70,195,243, 4,132, 0,132, 47, 19, 92,182,155,116, 4,169,201,217, 37,141, 2,188, 20, -184,155, 97, 49, 41, 36, 34,218, 89, 33,102,220, 29,197, 34,145, 64, 0,142, 80,166,236,236, 36, 19, 5,164,216, 66,247,228,212, -161, 92,233,125,180,215,144,229,154,148,180,226,232,102, 5,250,208, 98,139,179,110, 80,142, 0, 0, 32, 0, 73, 68, 65, 84, 24, -132, 0,205,124, 20,136,189,124,132, 83,103, 38, 38, 24,212,113,155,170,182,146,129,177,176, 60,110, 62, 40, 70,145,206,138, 34, -173, 5, 93,123, 12, 20,117,141, 24,132, 11,177,121,224, 89, 43,150,125,125,164,148, 35,214,145,192, 61,107, 29, 10, 77, 95,185, -126,199, 87, 83,168,147, 8, 5,130,162,224,166,254, 15,197, 34, 33, 91, 82, 82, 34,126,252, 44, 6, 10,153, 24, 5, 90, 43, 0, - 88,235,218,123,138,117, 86, 28,188,156,131, 67,251,119, 65, 38,147,129,212,163, 7,138, 68, 34, 39,161, 72, 10,139,174,108,186, -176,226,176, 60,113,208, 2, 9, 64, 11,156,108,164,189,103, 54, 27,126, 79,142,187,220,130,235,209,148, 25, 27, 17,128,215, 38, - 76,135, 79,147,214, 24, 56,112, 40,218, 4,168,168,253,151,210, 96,181,178,165, 94,129,173, 84,164,108,151,109, 2,128, 80, 0, -151,109,177,108,169, 42,181,123,139,174,129,161,127, 8, 45,160, 32,245, 70,141,187, 88, 57,115,126,166,222, 76,211,132,240, 85, -190, 50, 8, 1, 16, 51,160,206, 38,200, 1, 32,160, 1, 1, 67, 3, 20,197,112, 28, 87,101, 59,177, 44,251, 43,207,243,234, 29, - 59,118,168, 57,142,187, 30,115,100,229,205, 38, 47, 76,156, 7,182, 0, 86,107,217,114, 70,177, 68, 14,158,162,145,116,254,219, -121,156,197,240,203,142, 29, 59, 42,220, 59,220,182,143,133,118,216, 97,135, 29,127, 9, 42,199, 56,124,177,178,248,178, 73,104, -113, 60,129,155,171, 11,172, 68,128,100,117, 49,116,148, 7,140,122, 2,142,163,192, 17, 82,147,171,241, 8, 84,177, 61,255,224, -193,236, 12, 0, 91,159,176, 73, 61,178,100, 61,250,172,122, 74,166, 74, 78,138,112,167, 14, 30, 59, 59, 98, 80,183,158,206,247, -179,115, 50, 68, 66, 90, 32, 16, 49, 66,145,128,166, 68, 2,218,236, 32, 19, 48,251, 54,239, 22, 19, 10,103,107,227, 52, 26,141, -136,136,120, 60, 48,121,220,157, 75, 30, 5,185, 9,102, 66,241,188,187,184, 20,110,142,238,120,152,146,134,211,199,246,235,213, -153,137,113,156,201, 56, 24,143, 75,206, 63, 56, 9,225, 11,138, 77, 48, 90, 56, 20,106, 45, 40,210, 89,192,186,119,198,207,191, -103, 65, 42, 98,160,190,185,207,160,201,201,152,102,202, 77, 76,174,165, 41, 62,194, 99,190,180, 72,198,155,227,198, 10, 87,175, - 88,102, 10, 11,107, 71, 10, 10, 10,160,213,106,255,168, 19,138,130,212,193, 3, 42,153, 0,137,215,142, 34,241,244, 42, 3,128, - 79,109,169,207,202,112,144, 11, 48,168,147, 23, 76,150, 81,200, 43, 54,225,218,217,159,107,235, 50, 79,113,202,229,114, 89,133, -245,170,178, 91, 7,115, 37,171, 22, 87,222,222,180, 64, 34,171,130,179, 55,128,147, 79, 38,150, 20, 23, 31,185,126,233,212, 36, -227,132,215,160, 46, 50,193,144,159,132,239,127,222,116,218, 82,154,208,163,207,234, 21,244,244,193, 77,112,250,122,129,234,182, -128, 1,120, 32,114,212,140,151,142,239, 90,177,189,182,178, 87,136,173,231,187,117,152, 71, 51,212, 33, 66,253, 33,150,178,178, -178,108, 42,123,177, 58,177,220,130, 84,167, 57,112, 80, 20,205, 16,254,177, 24,136,143,229,147,231,249,219, 21,162, 73, 64, 81, -131, 85,114, 57,242, 52,197,168,112,178,107, 52,148,194,197,173, 1,104,138,130,181,210,185,117,109,247,122,192,206,105,231,180, -115,218, 57,255,191,226,169, 24,135,117,176,104, 17, 4,122, 43,208,212, 71, 1,163,197, 3, 70, 51, 7,157,145, 67,137,222,130, - 18,189, 21,201, 57,122,196, 30,124,246, 28,150, 89,177,202, 92,159,147, 50,127,155,224,120, 98,179,245, 68,108, 49, 47, 92,185, -108,241,203,187,195,218,154,223,125,209,187,225,173,100,115, 22, 69,209, 6,154, 17, 88, 93, 84, 2,225,253,251,183, 52,151,206, - 31,237, 46,101,185,215,244, 53,240,176, 44, 91,236,227,227, 83,241, 64,123,148,222,162,137,108,240,111, 71, 62,106,252,252,160, -101,238,171, 63,159,161,167, 25, 17, 79, 9, 68,177,156,213,176,203,160,142,219,136, 26,236,122,180, 72,122,239,202,141,187,225, - 78, 46, 13,145,152,169,131,206,200,194,194,242,112, 86,138,144,113,251,132, 37,249,126,244, 30,109,214,173,109,245,168,182,157, -241,247, 98,125, 35, 35,251, 14, 15, 15,239,204,204,153,243, 25,130,130,130, 96, 48, 24, 64,211, 52, 26, 54,106,130,228,248, 27, -184,124,100, 33,167,207, 79,217, 4, 96, 1,128, 58, 7, 92,206, 43, 49,227, 88,116, 46,142, 28,248, 17,140,176, 94, 59,216,104, -153, 76, 38,173, 74, 92, 85, 22, 93,143, 78, 22,138,165, 40,179, 62,241,143,117,196,170,113, 60, 41,254,238,189,215, 95,125,165, -133,202,209, 9,253,135,142,204,189,116,225,244,128, 3,223,111, 94,147,159,146,254,242,103, 75,214, 57,244,110,239, 77,185, 40, -197, 40,210,241,216,153,122, 47, 16, 54,218, 96,115,114,114,230,167, 39, 71,143,249,237,200, 71, 3,159, 31,180,204, 61,250,167, -217,143, 22,209,211,140, 96, 71,109,215, 23,164,199,156,174,171,200,170,144, 90,132, 16,155, 38,206, 9, 0,161, 72, 12, 15, 15, -111, 80, 20, 96,101,121,152,173, 44, 4, 66,251, 78, 67, 59,236,176,195,142,191, 25, 19,158,248,180,205,162,101, 52, 26,147,159, -139, 24, 8,158, 39,224, 8,192,115,229,150, 39,254, 15,235, 19,103, 53, 38, 63,107,238,120,158,187,186, 97,203,214,254, 97, 29, -159,103, 90,250, 41, 81,146,159,131,203,191,157, 97,193,147, 75,182, 92,159,159,159,160,149,121, 54, 29,254,242, 75, 67,247,142, - 29, 55,177,168,123,143, 30, 10, 15, 15, 47, 83, 70,102,134,254,219,237, 59,172, 39,142,254,210,157, 7,251, 74,126,126,162,182, - 38,158,226,226,226,181, 85,165, 75,196,202,174, 0, 26, 51, 2,202,108,208, 36,212,105, 69,120, 94,102,250,176,197, 11,231,165, -140,126,107,186, 56,208,167, 9,114,139, 25, 36,103,228,224,254,249, 95, 76,153,241,215, 14,148,100, 92, 31,111, 35, 85,118, 21, -105, 25, 0, 86, 95,190,124,169, 85,100,100,100,223,158, 61,123,146, 9, 19, 38,128, 16,224,244,150, 73,164, 32,249,242,190,114, - 43,214,131,122,182, 75,234,249, 75, 55, 92, 70,116,111, 47,112, 85,141,199,214, 31,143, 90, 65,248,212, 58,210,120,250,250, 53, - 18,148, 77, 23,150,185,116,120,242, 48, 91,255, 88, 63, 38, 82,122, 10,244,136,245,172,166,188, 79,105,141,196,248,187,173, 19, -227,239,142, 3,144,187,119,199,215,135, 0,192,100, 48, 76,140, 58,125, 48,245,238,157,232,215, 6,189,250, 65,147, 86,161, 29, - 4,251,182,173,134,197,168,219, 15,192,230,254, 42, 17, 51, 41, 21,237, 94,219, 84,225, 83,237,158,114,249, 40, 69, 51, 2, 91, - 69, 83, 37, 75, 36, 77,120,222,166, 5,117,132,231,144,249,224, 54, 92,188,252,160, 82, 57,130, 39, 22,192,108,130, 38, 61, 14, - 28,103,143,117,104,135, 29,118,216,241, 55,161,254,107,180,210,239,149,249,211,250,171, 81,154,147, 59,102,219,182, 31, 22,253, -176,125,119, 87,163,217,236, 67, 32, 74,231, 88,243, 57, 45,135, 57,182,114, 24,212,137,209,174,174,205, 66,190,253,122,195,167, -223,110,253,234,121,240, 92, 48, 5,164, 16, 10,103,165, 86,110,108,109, 34,171,198,135,102, 94,233,230,222,195, 87, 24,242,243, -181, 63,212,245, 90, 67,126, 92, 14,205, 88, 26,110, 94,179,112, 57, 77, 51,125, 56,142, 23,242,156, 53,145,179, 24,191, 48,104, -226, 14,194,230, 85,110, 40,168,225,183, 59, 0,238, 68, 69, 69,117,139,138,138,234, 8, 96, 45,202, 98, 40, 70, 63, 75,187,152, -242, 75,123,125, 56,227,195,211, 31,128,242,231,121, 2,150,227, 83, 69, 6,125,175, 58,210, 52, 12, 12,108, 34,183, 88,185,167, - 22,192, 87, 94, 8,255, 72,104, 57,250,202, 1, 52,180, 81,104, 1,101,187,233,190,126, 42,145,101,151,102,103,165,255,184,241, -139,105,111, 3, 8, 0,112, 17,192,134,191,171,221, 45,198,146,188,191,250,190, 97, 45,166,249, 25,183, 14, 34,235,142,200,155, - 18,148,185,114, 32,156, 25, 60,107,206,102,173,150,249,246,177,207, 14, 59,236,176,227,111,179,102,109,169,234,187,224,159,146, -195,194,194, 7,165, 40,172, 57, 72,175, 45,200,207, 79,208, 2,120,106,231,158,254, 25,121, 99, 19, 74,126, 66, 66,201, 79,245, -189, 94,151,251, 80, 3, 60, 28,251,140,217,176,101, 33,251,133,242,227, 79, 65, 94,222, 61, 29,242,208,233, 89,155,101,231,142, -237,247,119,239,254, 81, 72,104, 70,200, 19, 70,196, 18, 74,200,242,148,208,106,229, 97,178, 88,173, 22,150,181,130, 99, 45,224, - 57, 43,225, 45, 86,148,121,135,255, 51,144, 10,224,227,255, 85,187,255, 29, 96,173,150,249,176, 90, 0,232,236, 67,157, 29,118, -216, 97,199, 63, 75,112,253,115,132,150, 29,255,105, 60, 72, 74,140, 15,183, 87,131, 29,118,216, 97,135, 29,255,113,145, 85,249, - 19, 64,217,218,243,136,106, 46,168,203,110,130,136,122,100,232,148,157,243,153, 57,133, 0,196, 0,148, 0,106,155,218,234,139, -186, 59,172,252, 95,148,253, 35, 0, 55,236,237,110,231,180,115,218, 57,237,156,255, 89,206,218,184,237,187, 25,255, 98, 1,102, -231,180,115,218, 57,237,156,118, 78, 59,167,157,243,255, 31,231,191, 25, 19,170, 56, 0,216,167, 14,237,176,195, 14, 59,236,248, -127, 8, 87,215,102, 74,224,209,186,222, 90, 33,119,107,225, 9, 0,250,188,123,106,123,237,217, 81, 5, 42,199, 57,124,108,141, - 22, 93, 79, 66, 33, 45, 16,127, 40, 87,185,222, 83, 56,186,102,254, 63,175, 92,170,121, 35,197,212,222,221, 3,126, 14,106, 44, - 27, 92,151, 11,229,238,205,191,243,106,210, 41, 77,225,209,124, 42,188,195,100,207,146, 9,133, 71, 99,119,101,195,246,191,169, -124, 90,245,251, 11,202, 40,105,217,178,101,231,150, 45, 91,118, 6,240,167, 68, 41,150,123, 52, 31,229,219, 52,252,188, 71, 96, -219, 51, 10,207,102, 47,253,217, 25, 86,122, 55,117, 85, 54,108,247,147,178, 65,155, 66,165,119,155, 18,165,111,187,115, 42,183, - 22,129,181, 93,215,112,208,226,224,249,187, 98,119, 53, 28,180, 56,184,170,223,157, 35,215,169,230,238, 78,248,220,117,224, 23, - 74,251,184, 82, 63, 52,236, 58,202,201,251,249, 15, 92,235,122,157, 79,243,240, 59,141, 90,117,203,109,208,172, 83,172,173,215, -248, 6,117,190,238,223,178,171,218,183,121,231,104,123,205,219, 6,169,123,227,206, 82,103,191, 35, 18,103,191,163, 18,151,198, - 61,158,149,207,219,219, 91, 22, 28, 28, 28, 25, 30, 30,254,118,175, 94,189,222,107,219,182,237, 4,127,127,255, 62,255,203, 23, -125,185, 71,243,143, 77, 66, 42,207, 36,164,242,228, 30,205,107,221, 44,163,240, 8, 90, 68,209, 92, 22, 69,115, 89, 10,143,160, - 69,255,148,182,146,120, 54,247,151,123, 52, 95,165,242,106,121, 85,230,209,108, 96, 93,175,119,118,118,238,227,238,238, 62,164, -226,112,118,118,238, 99,191, 3,234,141,202, 86,172,103,182,104, 49, 66,137,252,226,232,113, 83, 66,150,206,155, 37, 93,179,245, -103,172,249,124,198, 93,147,174,168,229, 63,177,228,110,141, 59, 70, 51, 52,227, 91, 57,141,227,185,140,188,135, 87,219,255, 25, -252, 65,141,100,227, 63,157, 57,230,253, 81, 47, 71,248, 71, 12,152, 70,197, 61, 52,252, 98,187, 68, 67,232,158,159, 14, 52, 60, -127,246,204,186,173, 91,183, 44,208,176, 65,171,132, 18,193,134,146,244, 59, 69,117,201,131,131,123, 96, 99,129,194,237,252,115, -131,167,120,197,156,218,177,141, 51,243,189,245,121,149,162,127,215, 31,238, 77,154, 52,233,192, 48,140,235,212,169, 83, 69, 0, -176,122,245,234,166, 28,199,229, 39, 37, 37, 93, 67, 61,156,159,150, 9,204,160, 49,107,151,207,255,161, 95,191,254,200,202,211, - 97,217,170, 47, 95, 56,126,120,207, 8,157, 58, 97,223,159,209, 38, 78, 78, 1, 14, 16,169,110, 79,155,185,192, 35,242,133, 14, -140,214,200,226,248,249, 27,221,118,124,185,224, 42,208,162, 99,105,222,189,106,125,138,241,250,226,217,158, 74, 18,201,235,139, - 1, 96,212, 83, 15,123,165, 53,194, 93,198, 69,122, 75, 4, 55,242,129, 90,131, 62, 58, 53,234,122, 66, 40,145,248,211, 52, 13, -154, 2,104,154, 2, 67, 81,101,113, 66, 45,134,212,204,251, 23,250,254, 19,238, 19,149, 95,199, 28, 48, 2, 87,154,250, 35,127, - 20, 93,254, 73, 72, 73, 78,194, 69,215, 63,225,223, 56,134, 52,117,106,213,181,169,238,219,115, 15, 11, 20,130,238,239, 29,161, - 8,253, 85,218,133, 85, 55,109, 18, 0, 82,169,243,161, 67,135,220, 35, 35, 35, 29, 61, 90, 13, 62,103,203, 53, 98, 70,219,242, -240,225,131,162,200,200,190,117,232,159,205,123,131,166,183, 83,128,144,231,201,106,134, 39,123,180,249,241, 73, 64,221,162, 79, -201, 60,130,198,211, 32, 54,143, 51, 60,168,104, 67,110,220,214,250, 86,174, 64,226,208, 75, 40, 18,189,215,184,121,235,176,204, -148,196,104,157,182,116, 21,107, 42, 62, 87,103, 34, 43,251,225,169, 11, 49,253, 4, 66, 33, 21,217,171, 19, 99, 2,206, 60, 75, -163,123,122,122, 14, 89,191,126,125, 96,231,206,157, 1, 0, 44,203, 58,236,221,187,215,107,225,194,133,138,248,248,248,253,245, -164,245,113,119,119,247, 19,139,197, 62, 0, 96, 54,155, 51, 53, 26, 77, 26,128, 90, 95,252, 21,158,129,110, 32, 88,112,225,252, -121, 1, 0,116,235,214,125,145,223,115,239, 56, 51, 34,165,161,202,234, 48,151, 42,138,146,206, 76,191,124,229, 18, 5, 0,225, -157, 58,207,146,187,181,216,240,191,180,108, 73, 61,130, 58,209,192,251,225,221, 34,134,141,124,101, 12,221,170,153, 31,250,244, -238,249,145, 1, 56, 84,167, 62, 35, 16,200,174, 94,189,218,132,166,105,134,101, 89, 99,120,120,120,218,179,228,171, 65,243,206, -191, 83,160, 27, 90, 88,243,215,154, 7,209,139,128,167, 2,199, 48,142, 13,195, 62, 5, 35,120,139,231,249,244,210,180,232, 46, -255, 65,139,214,211,245, 92, 87, 38, 90, 32,126,111,212, 27,147, 67,166,127,240,137,116,218,154, 40, 28,249,114, 86,222, 63, 85, -100, 1, 0, 67, 51,190, 39,126, 61,225, 33, 23, 51, 0, 0,173,145, 69,191,200,200,218,159, 8,141, 58,158,165, 41, 42,168, 34, -148, 56,199, 90,164, 2,161,216, 72,149, 9, 36, 80, 0,220, 26, 52,138,242,100, 47,202, 71,189, 28,225,191,125,247,201,140,180, -140,252, 58, 15,106, 20, 35, 66,120,247, 62,136,232,221,215,241,234,149,223, 23,108,217,180,241, 99,214, 98,221,200, 91,249, 85, -198,130,196,172, 90, 7,115,175,102,237,196, 74,183,227,195,222, 94,232,106,164, 93, 48,231,243,181,110,231,143,237, 60,151,153, - 30,202,167,166,166, 27, 9, 69,221, 45, 44,200,126, 79,151,147, 20,103,107,149, 41,149,202, 64,165, 82, 25,218,166, 77, 27,233, -140, 25, 51,132, 47,188,240,194, 31,146,125,194, 4,209,217,179,103,189, 87,172, 88,209,255,214,173, 91, 70,173, 86,123, 83,171, -213, 62, 64, 29, 22,218,123,121,185,191, 51,124,232, 64,244, 28, 54, 5, 28, 79, 97,194,228,233, 56,113,108,255, 68, 0,127,138, -208,178,202, 29, 22,190,245,246, 12,247,240, 14,109,153, 5, 59,227, 32, 19, 11,208,183,125, 16,245,198,212,217, 78, 91,215, 45, -248, 6,121,120,190, 42, 75, 22,175, 47,158, 29,226,102,126,101, 80,231,198, 56,184,203,252, 10,122,205, 4, 45,119, 92,148,126, -240,147,251, 0, 16, 24, 57, 85, 37,225, 52,235, 27, 56, 49, 30, 18, 78,179, 62, 48,114,234,169, 7,199,215,151,214,148, 23,161, - 68,226,191,107,231,206,102,206, 42, 17, 4, 52, 5,134,161, 32, 96,104, 24,205, 28, 70,188,252,202,159,214,205,101, 30,205,250, -211,101,193,178,193, 3,223, 25,114, 19,142,214,165, 77, 40, 70,228,122,248,224, 1,129,135,163, 4, 12, 67,129,161, 1,134,166, -144,162, 54, 96,252,248, 55, 28,159, 85,176,247,235,234,209,225,195,145, 65,125,195, 67, 92,218,252,120,137,114, 12,239, 55,210, - 53,207, 40,127,125,247, 47,103, 94, 33,221,166, 95, 33,132, 95,158,113,113,237,175, 53,145,152, 76, 38,117,223,200,126, 14,148, - 64, 33, 63,245,243,182,238, 2,154,130,149, 35, 96, 57, 2,174, 60, 54, 42, 85,254, 6, 67,211, 20, 8, 79,240,214, 91,227,209, - 55,178,159,158,103,249, 12,219, 7, 57,122,251,241, 83,191,185,155,172, 60, 86,172,223,186, 64, 87,172, 89,240,240,190,107,138, -182, 56,111,186, 33, 55,193,230, 56, 24, 52, 72,251,244, 7,177,111,239, 60,124, 25, 33, 45, 91,128,227,203,242, 25,228,171,192, -206, 35,151, 17, 28, 20, 92,150,111,158,160,121, 67, 37, 58,180,239, 0, 60, 21,154,204, 86,145,165,154,243,252,139, 99,230, 15, - 24, 49, 14, 30,238,238,160,137,117,192,169, 35, 59, 7,124,247,213,242, 15, 89, 99,201,138, 58,145, 17,238,209,115,129,240,252, - 51, 91,157, 26, 52,104,224,222,161,195, 31,238, 24, 89,150, 69, 64, 64, 0, 50, 51, 51,131,234,243,158,230,237,237,253,226,220, -185,115, 61,250,247,239, 47,244,242,242, 2, 0,228,228,228,248, 28, 63,126, 60,108,238,220,185,185,217,217,217, 71, 80,131, 71, - 31,206, 74,139,104, 1, 24,169, 84, 94, 86, 70, 80,244,140,119, 94,107,227,233,221,160,202, 64,238, 26, 77,142,120,230,148, 51, -148, 64, 32, 42, 63, 31, 52, 33, 60, 85,131,149, 40, 66, 40, 20, 86, 57, 67, 97, 97, 28,194,137,208,241, 77,154,161,203, 58, 43, -107,213, 20,166, 93,111, 81, 7, 75, 92, 43,161, 88,180,113,248,200,113, 93, 94, 26, 54, 24,222,238,142, 56,117,241, 22, 38,190, -243,190,149,181, 88, 87,213,107,240, 96, 24, 65,110,110,110,138,179,179,179,215,179, 63,111,169,198, 39, 79, 28,243, 56,117, 58, -106,214,202, 53,235, 38, 89,204,172,149, 39,228, 81, 28, 99,153, 76, 34,236, 61,224,101, 7,143, 38,225,210,117,115,223, 20,254, - 7, 45, 90, 91,254, 20,161, 37,150,169, 94,254,108,230, 84,233,194, 29,151,113,228,203,137,121,250,146, 60,247, 71,111, 10, 14, - 78,215,117, 37, 69, 97,245,201,161,210,189,121,103,138, 17,188, 77, 49,140,130,162, 41, 49,207,241,233,172,217,188,200,144,159, -144,253,172,165,231,121,130,159,126,207,173,155, 0, 34,104,186,253,199, 3, 30,158, 78, 18, 24, 45, 28, 70,142, 26,131, 31,126, -248, 65,229,238, 40,134,209,204, 98,249,202,149,165,218,148, 35, 30, 41,233,133,153, 17, 3,223,255,245, 65,114,110,108, 90,182, -113, 79, 93,243,102,178,112, 40,209,179,208,155,104, 52,107,213, 1,203, 87, 5, 75,211, 82, 31,190,191,237,187,111,222,189,123, -151,249,129,103,232,249,198,236,123,233, 85,222,116, 94, 33,125, 29,156, 93,119, 13,125,251,115,167,132, 92, 1, 8, 44, 72,114, -144,226,229,215,223,117, 8,244,146, 65, 33,101,156, 30,166,102,122,207,248,240,195,139, 15, 56,210,177, 68,243,224, 97,109,249, -105,212,168,209,176, 1, 3, 6,200, 63,248,224, 3, 97,195,134, 13,241,221,206,189,254,221,250,142, 24,152,149,173,110, 72, 8, -129,167,135, 71,250, 91,111,140, 56,116,244,232,209,212,244,244,116,225,178,101,203, 58, 29, 56,112,160,101, 78, 78,142,205,111, -166, 28, 33, 48,154, 56,112,229, 15, 72, 77,177,169,206,250,212,199,199, 71,146,153,153,105,170,100,101,160,254, 48, 20, 82,125, -123, 61,223, 73,176,249, 88, 50,180, 70, 14, 10,169, 16,201,106, 61,218,183,109, 77,125,205,177,161, 85, 17,142,127,249,197,217, -158, 74, 18, 57,168,115, 99,120, 56,203,241,237,134,207,113,240,210,195, 72,181,150,194,122,194,188,237, 45, 17,244, 86,240,217, -235, 95,104,223,196,171,103, 59,127, 92,107,223,196,235,124, 76, 92,188,108,196,202,169,153, 90,225,169,194,227,239,150, 86, 61, -240,208,112, 81,137,176,245, 68, 42,228, 82, 1, 20, 82, 1, 20,146,178, 79,154,166,158,237,173,214,187, 69, 67,134,231,198, 51, -140, 96,252, 43, 47,143,104, 48,250,149, 17, 4, 12,141,189, 63, 29, 26,188, 99,199,246,108,171,197,252, 13, 71, 51, 91,171,235, - 63,143, 85, 40, 13,120, 56,138,241,225, 55,177,112,144, 9,161,146, 11,225, 32, 23,162,103, 27,119, 48,116,189,179,232, 60,113, -112, 96,255,137, 67, 27,245, 8,242, 83, 54,187,153, 84,124,119,252,162,232, 53,103,139,122,188,183, 97,117, 75, 87,109,145, 89, - 48,103,198, 91,130,140,172,172, 30,123, 15,157,235,201,153,199,197,177, 22,221, 39,154, 91,123,171,180, 10,103,196, 93, 10,243, - 9,127, 73,106,209, 90,111,223,140,203,104, 82,104,146,224, 78, 74, 9, 20, 82, 1,148, 21,117, 43, 21, 64, 33, 21, 66, 41, 21, - 32, 43, 35, 25, 5, 58,230, 98,166, 43,221, 3,231, 46,213,201, 77,190,209,194,225,198, 67, 45, 26, 5,181,133,183,119, 3,152, -251,191,218,232, 74,212, 79,191, 92, 61,247,243, 18,125,206,253, 79,108,229,217,121,248, 50,102, 77,127, 59,134, 2,174,151, 63, -164,195,230, 44,253,178,221,130, 89, 83, 30, 75,155, 49,127, 93,187,250, 91,178, 84,179,123, 14,157, 60,191, 91,239,161, 40, 45, - 80,227,247, 95,247,160,239,128,225,120,117,220, 52, 56, 57,185, 45, 95,181,104,230, 77,214, 84, 18,245,212,152,235, 21,252, 92, -235,144, 22, 59,124, 26, 52,104,200,243,101, 81, 62, 8, 1,180,165,197,152,249,222, 91,224, 9, 65,104, 88,199,158,210,110,189, - 9, 41,143, 6,146,151,159,167,139,187,127, 55,194,152, 27,119,197,230,186, 52, 26,173, 26,141, 6, 55,110,220, 64,124,124, 60, -238,220,185,131,252,252,124, 56, 58, 58,106,117,186, 58,249,126,115,104,211,166,205,232,168,168, 40,169,179,243, 31, 65, 26,204, -102, 51, 84, 42, 21, 70,143, 30, 45,236,211,167,143,207,139, 47,190, 56, 54, 54, 54,118, 39,128,146, 42,243, 83,144,152,165,242, - 12,218,244,252, 11,207, 79, 2, 0,153,131,247,195,245,223, 29,186, 83,227, 11,173, 99, 3,255, 46, 93,186, 54, 1, 33,160, 64, -214,234,243,227,115,106,176, 18, 41, 46, 95,190, 28,200, 48,140,224,143,103, 16,143,175,190,253, 49,248,228,133,219,195,150, 46, - 95, 33,117, 80, 72,160, 41, 54,227,205, 87,135,218,252, 12,150,121, 6,245,239,210,165,251, 47, 11,230,127, 38, 80, 42, 20,248, -245,202, 3, 76,125,239, 67, 99,118, 74,236, 10,194, 11,191,212,107,226,115,159,241, 81, 73,240, 39,160,153,175, 18,170, 65,125, -165, 19, 95, 27, 36, 53, 91, 57, 20,233,172, 48, 89, 56,112, 60, 65,177,206,138,187,105,165,112,115,168,123,136, 48, 66, 72, 7, - 0,238, 0, 52, 20, 69, 93,171,252,189,226,133,174, 66, 27, 63,241, 61,175,252,249,224, 10,192,140,178,157,250,143,186, 79,249, -247,234,210, 43,174,191, 11,160, 69, 57, 39, 7,224, 42, 69, 81,133,213,136,173,167,172, 92,130,195,135, 15,147, 1, 3, 6, 60, - 26,241,159,252,254, 36, 36, 34, 97, 3,133,163, 59, 8,185, 7,138,250,227, 52, 15, 47,159,252, 21,171,214,184,188, 51,249,237, -212,146,162, 2,255,242,228, 83,182, 60, 44, 4, 20,179,234,249,174,225,125, 38, 77,158,140,160, 64, 95, 17,199,113, 36, 54,254, -161,117,219,214,111, 95, 63,127, 73,188,166, 36, 35,118,118, 37, 19,100,157,182,125,114, 60,151,241,164, 5,139,227,185, 39,223, -110,159, 14, 82, 77, 1, 78, 74, 49, 54, 29, 75, 6, 33, 0, 5, 2, 71,133, 16,187,207,102,224, 97,204,254,146, 1,161, 37,186, -209, 75,231,245,236,209,255,221,168,187, 73,198, 61,185,185,198, 19, 0,114,106,226,172,122, 64,231, 97,178,112,176,178, 44,246, - 29, 58,132,200,158,157,208,165, 75, 39,116,239,214, 69, 16, 29,115,107,220,228, 73,111, 53,196, 31,187, 59, 30,113, 74, 61,155, -118, 80, 58,186,237, 25, 54,105,153,234,118, 6, 11, 1, 3, 52,246,146,193, 69, 37,130,153,165,144,162,177,148,223, 57, 78,152, - 58, 99,190,203,172,247, 39, 29, 45,209,136, 67,128,123,150,154,202,174,215,235,197, 99,198,140, 17, 90,173, 86,203,232, 55,167, -245,201,201,209, 12,254,106,237, 23, 18, 15, 15, 79,232,141, 44, 98,238, 36,182, 88,176, 96,126,227, 67,199,207,254, 60,239,195, -137,191, 68, 70, 70, 58,254,248,227,143,124,109,245,249,216, 27,162, 58,111,195,183, 59,246,253,176,122,197, 98,196,165, 22, 98, -235,230, 47, 65, 56,118, 83, 45, 85, 85,153,147,140, 25, 51, 70,246,243,207, 63,251,102,100,100,148,232,245,122,205, 99,246, 8, -154, 18,168, 11,244,112, 83,137, 33, 18,208,240,116,150,194,195, 81, 2, 33, 3,208, 20,197, 85,197,185,117,207,145, 69,188,190, - 24, 7,119,153, 95,249,118,195,231, 24,247,206,167,136,205, 19, 31,167,229,142,139,166,188, 50,108,150,187,140,139,108,224, 68, -123,244,108,215, 8, 10,169, 8, 31,191, 59, 6, 29, 99, 82, 60, 50,139,248, 79, 53, 6,166,237,252,227,143,130,117,159,122,220, - 56, 82,102,193, 82,201,133, 56,190, 99,121,174,174, 88, 83, 92, 49, 37,103, 54, 25, 83,109,236,198,167,170,120,179,157,213,182, -117,171,207, 39, 77, 24, 79,119,237,220,145,208,180, 16,121,165,102,138, 16,224,189,169, 19, 49,101,226, 91, 94,233, 89,185,115, -190,252,114,211,236,168,147,100,161, 78,115,127, 94, 77,156, 52, 85,102, 5, 82, 74, 5, 80,202,202,132,139, 82, 42,128,209,204, -129,162,192, 56,249,133, 21, 83,101,150,220,172,130,212,106,223,192, 31,227,116,241,107,117,250,228, 67, 85,112,225,158,194, 75, -201, 89,119, 22,197,220, 82, 95, 5, 80,208,176,187,211, 88, 11, 75,160, 53,178, 72, 86,235,193, 90, 8, 53,174,159, 63, 2, 94, -162,130, 22,127,123,253,135, 99,183,224, 80,105,208,127,140, 51,243,242, 62,163,107,200,208,145,171,215,109,190,182,226,243, 79, -153,188, 98, 51,120, 66, 32, 21, 51,144,137, 5,229, 7, 3,131,174, 24, 95,110,252, 58,135, 5, 53, 12,231,206,177,117,233,159, -224,201,171, 67,251,119,223, 77, 1, 98,138, 22,101, 52,240,111,228,223,107,224,235,210, 94,131,198,128, 99,205,179, 98, 46,144, - 51,250,220,184,211,182,112,134,180,108, 1, 10,184,174,203,141,159, 8, 0, 10,143,230,155,130,131,130,219, 61,153,214,180,105, - 80, 59, 91,218,253,145,165, 84,170,122,199,217,197,253,211,160, 86,109, 61,212,133, 38, 74,229,234,139,228,132, 27,216,181,113, -206,118,222,104,158,127,250,200,158,207,215,108, 61,240,114,175,200,161,248,246,171, 47, 62,206,207,126, 36,180, 78, 85,178, 86, -189,186,237,155, 45, 13,133, 98, 9,172, 44, 15, 43, 71,202, 62, 89, 14, 5, 5,133,176,178, 60,164,114, 21, 88,158,130,149,227, - 97,101,121,152,204,172, 98,226,152, 23, 39, 27,129, 43, 85,229,211, 39,248,249, 19, 34,137,196,159,160, 44,118, 45, 33, 4,201, - 57, 6,218,219,219,123, 39, 0, 72, 36, 18, 72, 36, 18,240, 60,143,152, 56,205, 59,110, 65,205, 39,161, 92,224,113, 22,115,106, - 81,202,111,125,171, 43,187,151,151,215,192, 39, 69,150,209,104,132, 86,171,197,133, 75,215, 28,191,249, 97, 95,100,114,106, 70, - 32, 79, 28, 77, 42,143,192,190,165,185, 15, 6, 86, 87,159,165,234,184,201, 14,225,111,209, 31, 76, 25,219,116,221,182,195, 87, - 19, 79, 44,170,113,157, 86, 64,175,143,204, 31,188, 61,188,253,210,181, 91, 19, 10,127,219, 52,189,182, 54, 18, 8, 4, 66,141, - 70,243,232,254, 94,255,245,174,246,215,227, 50,135,172, 89,189, 70, 26,243,160, 20,183,147,179, 48, 54,194,175,236, 13,199,134, -118, 87,120, 6,186, 53,110,210,100,231,151,107,151, 10, 18,178,140,216,176,255, 42,162,126,217,116, 33, 39,247, 74, 36,212,217, -134,250,140, 33,127,130,208,170,150,243,204,173, 60,104,141, 44, 76,102, 22, 86,158,160, 68,111, 69,110,145, 25, 37,122, 11,180, - 6, 22, 99,123,251, 85,121, 93, 45,122,196,157,162,168,195,132,144, 1,132,144, 8, 0,226,138,239,101,207,108,234,112,185, 32, -123,236,251,172, 89,179, 62, 89,178,100,201,157,138,115, 43,210, 43,206,173, 41,189,210,245,174, 31,127,252,113,200,210,165, 75, - 23,119,238,220,121,247,239,191,255,254, 16, 64,161,173,211,135,130,202,133, 57,124,248,112,109, 21, 29,104,177, 90, 36, 14, 50, - 33, 26, 7,248,225,141, 79,190,117,251,126,233,248, 92,169, 88,192, 28, 59,118,204, 37,223,172, 4, 77, 51, 54,191,162, 40,221, -155,117, 17,137,196, 71, 86,174, 92,137, 87, 6,118,147,165,229, 89,181,183,210, 12,106,157, 25,172,135,123,115,241,162,197, 75, -149, 75,151, 45,159,114,248, 32, 95,164, 85,223, 93, 94,245, 20, 95,251,104,134,170,180, 6,139,162, 64,120, 46,163, 48,229, 90, -123, 0,120,150,181, 88, 90,163, 21, 76,249,218, 26,138, 2,244, 70, 22, 12, 67,229, 22,197,237,185, 59,122,225,162,158,219,119, -159,204, 34,180, 83,169, 78,151, 44, 71, 89,204,193, 58,195,104,230, 96,178,114,184,115, 51, 6,221,195, 91,162, 75,251, 96,232, -141, 28,244, 38, 22, 1, 77,130, 0,192,173,202,134, 99,232,135,132,179, 26, 9,225, 84, 3, 58,184,195,195, 73, 12,111,103, 9, - 36, 98, 1,172, 44, 96, 48,243, 48,154, 57,164,228, 26, 80,106,144,161,245,243, 35, 26,187,122, 71,155,114, 82,100, 63, 23,164, - 69, 15,171, 81,156,114, 28,182,237,220,215, 52, 43, 75, 61,248,232,207, 59, 36,154, 18, 43,110,165,232,144, 91,100, 2, 24,119, -204, 93,188, 65,242,209,244, 9, 67,182,237,250, 41,181, 87,183, 78,169,117, 45,179, 94, 19,183,125,207,222,125,155, 6, 12, 24, - 34,187,115,229, 40, 18,110,156,254, 92,151, 91,167,245, 89,116,104,104, 40, 59, 97,194,132,210,197,139, 23, 55, 60,120,240, 96, -128, 70,163,185, 1,192,234,228,228, 20,220,188,169,255,205, 95,143, 31,243,121,113,200, 8, 97, 70,158, 1,142,114, 17,252, 61, -228,184,116,225,132, 85, 44, 22, 86,185,222,164,124,122,112, 20,122,205,196,193, 75, 15, 35,239,228, 75,207,190, 53,126,108,234, -175,231,227,242,215,255,240,235, 23, 62, 74,235, 13, 41,175, 89, 31,221,190,137,215,172,169, 99,176,100,221,118,156,139,137,203, -213,209,222,159,103,155,216,147,213,155,210, 1, 1, 67, 65, 37, 19, 66, 87,162, 41, 78,186,126,188,249,159,100,166, 30,251,235, -207,219,233,130, 82, 43,210,243,140, 84, 86, 65, 41, 56,158,192, 73, 46, 2,203, 19, 20, 21,228, 81, 59,182,255,128,107,215, 46, -209, 96,232, 55, 1,204,171,177, 66,169,178,169, 66,165, 84, 88,102, 17,146,149,125, 90, 57, 30, 65, 77,155, 96,203,250, 85, 14, -110, 30,158,120,174,187,237,107,163, 85,174,254,161,187,191, 91,143,179,191, 95,127,225,220,154, 13, 29,148, 13,220,215, 81, 20, -183, 2, 4, 70,147,133, 67,113, 81, 33,196,230,116,116,244,209,192, 69,206, 33,165,196, 27,177, 57, 9,202,218, 6,252,252,216, - 3, 55, 40, 50,100,246,190, 67, 81, 75,250,246,126, 1,177, 41, 37,144,137, 5,144,138, 25, 72,197, 12,132, 20,135, 85, 27, 55, - 89, 11,139, 75, 7,228,223,249, 37,175, 30,253,243, 84,249,219,111,153,184,227,180,238,219,215,205,254,254,173,153,203,250, 70, - 14,125,157,138,189,118,230, 19, 61,112,218,182, 23, 61, 98, 83, 26,207,219,254,140,147,170,220,214,190,251,209,162,119,251, 12, - 24, 1,134, 17,192,106,181,226,167, 31,183,227,187, 13,115,239,155,181,249,175, 3,224,205,185,204,132, 61,219, 55,142,152, 57, -103, 21, 21, 18,218,177,211,153,236,167,195,123,254, 31,123,231, 29, 21,213,213,181,241,231, 78, 99, 26,189,131,130, 21, 4, 11, - 40,246, 94,163,198, 30, 53,193, 18, 49,177, 39,198, 36,198, 68,141, 38,106,212,104, 76,236, 45,177,197,168,177,247,142, 13, 91, -140, 10, 40,138, 40, 72,239,157,233,125,230,158,239, 15,192, 88, 40,131,229,123, 83,206,111,173, 89,112,135,225,153, 91,207,125, -238, 62,251,236,195,114,153, 95,198,140,155, 20,234,225,225, 97,247, 87, 68,139,160, 81, 64, 19,244, 27, 52, 12,103,143, 30,198, -131,216, 24,176,164,212, 48,177, 44,129,172,164, 40,215,108, 50,108,175,180,199, 67, 36,170,179,237,215, 29,254, 28, 14,243,100, - 2,249,207, 63,250,192, 48,249,179,175, 59,245,235,221, 53,214,134, 11, 69,106,122,142,227,141,232,184, 32,150,111,235, 51,110, -198, 10,129, 78,111,129, 92, 99,194,169,173,149,123, 29,145,147,111,251,186, 45,251,141,155,252,205, 38,161,144,203, 49, 54,109, -228,147,220,181, 93,211, 12, 95,111, 87,229,119, 75,215,181,185,118, 51,186,223,123,163,198,137,194, 2, 91, 50,222, 46, 98,187, - 15, 70,189, 19,108, 49, 27,199,104,138, 51, 42,173, 47,200,151, 56,201,124,235,249,105,254,138, 24, 53, 58,196, 16,212,127,198, -121, 48, 72,214,230,197, 15, 5, 0, 47,111, 95, 29, 95,104,175,172, 65, 4,134, 0,192,154,205,187, 91,221,141,207,158,176,114, -229, 42, 73, 84,146, 18,119,146,228, 16, 10, 56, 48,154, 88, 48, 86, 6,181, 89,194,157, 52,103,246, 44,251, 18,181, 5, 17, 49, - 5,136,141,188, 68, 12, 42,221, 40,137,217,126, 40,220,237,198, 0,104, 8, 32,145, 97,200, 47,234, 60,207,163,192,229, 26, 79, -116,202,178,165,207,203,246,110, 13,234, 91,120,194,126,124, 27,105,123,134, 33, 77, 25, 2, 39,128,100, 21,151,221, 83,173,117, -106,234,188,120, 44,251,254, 91,172,222,114, 24,217, 69, 58, 56, 88, 50,112,116,235, 34,124,177,228,119,104,245,149,103, 53, 84, -231, 71, 42, 50, 70,207, 27,174,242,223,203, 63,183,100,201,146, 1,207, 29,155, 1,149, 28,179, 23, 62, 87,254,255, 75,151, 46, -253,254,169,191,107,172, 53, 89, 79,140, 86,249, 70, 85, 99,182, 26,185,121,213,249,227,232,145, 67, 78, 37, 42, 35, 68, 2, 46, -124,235,249, 97,254,218,163,110,111,183,114, 69,161,209, 1,187, 55,253, 84,172,211, 40,247, 90,213, 88,184, 7,180, 21,219, 74, - 79, 29, 58,120, 24, 13,124,221, 5,187,174, 22,167, 68, 39,107,159,132,122, 21, 5,105, 54,245,236, 53,188,161,239,188, 35,185, -112,241,210,103, 42,160, 66,163,197,101,184,181, 55,239, 56,232,110, 39,230,131, 97, 0,165,214,140, 9, 99,134,189,250,109,140, -176,220,113, 99,195,192,148,153, 44, 69, 81, 46,190,158,249,145, 78,106, 74,120,144,158,154,158,213,107,224, 23, 23, 20, 42, 70, - 23,250,254, 71,183, 31,196, 47, 41,209,104, 94,110,146, 31,189,193, 2,189,145, 69, 82, 82, 34, 62, 15,123, 11,124, 46, 7, 92, - 46, 91,154, 44,109,174,252,100, 84,101,199, 23,195, 83, 48,124,231,242,169,155,189, 61,220, 93,108,165, 98, 98, 43, 17, 50, 77, - 3,253, 5,237,218,117,176,169, 23, 16, 44,184, 26,167, 69,122,129, 22,201,217,114, 8, 61, 90,240, 70,244,120, 27, 59, 87,205, -232, 86,156, 30,201,193,139, 73,138,207,112, 46,226,207,129, 91, 54,174, 20,230,201,140,120,152,174, 66,110,137, 14, 57, 37,122, -228, 22,235, 96, 43,230,163,203,160,137,194,147, 71,127, 25,216,179,115,219, 53, 47,179,221,201,201, 41, 39, 83,179,114,222, 13, - 14,105,131,157,191,253,218,217,209,177,158,189, 76,150,162,176,246,232, 44, 90,180,200,102,233,210,165,188,181,107,215, 42,218, -181,107,231, 57,123,246,236, 62,249,249,249,183,234,214,173, 27,112,246,208,246,139, 45,186, 12,110, 13,214,232,214,185,107,119, -129,144,229, 33,252,196, 9,227,190,189,187,138,180, 90,229,228, 42, 13,135,196, 97, 81,158,138,129, 91,173, 90,177,182, 54,150, -183,120, 28, 89,124,201,153,105, 59, 74,128, 67, 13,250,126,114,254, 82,228,163,248, 86, 81,169,238, 23,163, 30,231, 23,107,140, -141,146,206,124, 81,101,195,203,101, 24,240,185, 28,216,137,121,224,148,181,170,182,222,193,143,193, 48,110,229,145, 83, 6, 76, -217, 79,128, 97,144, 93,146,126,199,138,156, 13,134,176, 4,120,148,169,134, 74, 87, 26,154,175,237, 42, 65, 65, 94, 38, 54,172, -217,142,232,200,219,232,253,246, 32,172,223,188, 11, 19,198,188,171,171,238,233,135,195, 41,139,104, 61, 21,205,178, 21,243, 0, - 48,144,169, 77, 56,120, 45, 3, 13,235,115,172,190, 49, 0,128,157,173, 4,114,165, 22, 28,129, 29, 18,163, 78, 73, 78, 95,186, - 57,123,238,194,149, 95,150,228,196,164, 63,190,119, 21, 1,174,114,212,175,101, 68,108,174, 61, 34,139,234, 33,192,175, 1, 56, -130,219, 86,105, 23,198, 6, 45, 59,202, 57, 56,160, 85,139, 38,237,235,184, 59, 66,107,176,148, 69,181,184,248,117,219, 14,164, -166,100,142, 43,122,112, 52,250,117, 56, 90,117,126,114,129,208,221,239,227,123, 55, 47, 36,191, 51,234, 99,120,213,242,109, 46, - 75,191, 99,229,205,203, 58, 83,101,177,210,104, 9, 36,142,179, 63,159,243,195,180,222,253,135,227,207,171, 23,112, 39, 54, 17, -109,219,182,198,219, 67, 70, 64,169, 40, 14,220,191, 99,213, 91,102,141,242, 44, 79,104,158,214,166, 67, 15,134,181, 88,144,240, -240,126, 98, 69, 90,218,156, 71,119,110,228, 60,178,127,166,123,202, 53,176,185,173,131,243, 29,189,209,130,172,172, 76, 92,255, - 35, 34, 68,155,243,168, 70, 5,132,133, 2, 46,194,163,243, 97, 44,155,195,180, 75,215,183, 12, 2,142,190,243,226,149,219,169, - 20,239, 5, 0, 0, 32, 0, 73, 68, 65, 84,218,229,100,231,112,164,246,174,172,115,173,198, 2, 47,161, 81,127, 55, 73, 46, 48, -154, 88, 52,240,150, 86,169,233,230,237,247,253,140, 25,159, 55,230, 10,196, 80,170,245,134,156,236, 44,207, 77,187, 47,169,226, - 30,222,171, 85,219,221,193,254,135, 85,191, 8, 20, 58, 6,249,114, 61,138,149, 10,102,212,164,175,188,183,172, 91, 50,186, 42, -163, 85, 65,186, 72,253,147,225, 87, 3,157,236, 4,140, 74,103,102,139, 20, 70,203,168, 33,175, 54,232,178,204,100, 77, 92,185, - 98,149, 36, 58, 73,137,187, 73,114,136, 4, 92,216, 8, 56, 48,152, 88, 88,121, 57,113, 60,221, 61, 39,119,104, 21,132,179,119, - 10,193,229,114,160, 85,150,104,120, 40,138,111,213,173,183,164,101,155,118,232,222,173, 43, 30,199, 63,242, 61,113,236, 96,207, - 27,215, 47,231,154,141,141,166,170, 11,226, 15,215, 40,176,160,209,112, 77, 54,158, 31,120,213,170,219,113,232,136, 15, 28,234, -248,214, 98,220, 93, 93, 96, 38, 60, 76, 28, 51,204,234, 43,191,212,152, 3, 75, 23,206,134, 94,111,128,155,163, 13, 8, 1,182, -173,153, 15,131,193, 0,111, 23, 33,228,234,202,103,147,171,206,143, 84, 22,133,170, 81,238,201, 83,102,172,170,247, 25,134, 57, - 49,107,214,172,175, 1,144, 89,179,102,125, 93,190,188,100,201, 18, 45,128,236,106,186, 14, 55, 61, 99,180,202, 55,174,242,171, - 91, 16,224,234,226,117, 35,252,236, 25,135, 35,119, 89,252,121, 56, 18,253,219,122, 65,192,227, 64,226,224,141,187, 41,114,156, - 60,180, 81,118,116,207, 47, 89,122,189,254,199,234,251,154,253, 90,217, 74,164,103,127,219,185,151,117,117,113,225,108, 8, 47, - 72, 42, 82,154,159,116,105,197,223, 60,198, 70,158,221,228, 69,192,156, 17,137, 68,126, 6,131,193,169,186, 3,187, 45, 60,173, - 44,137,151,121, 29,109, 43, 24, 46,215,178,115,215, 78,184,218,219, 64,111, 98, 49,235,203, 79,181, 97,189,109,101,163,222, 27, -209,163,123,191,105, 23,249, 82,255, 11, 29, 66,252, 73,139, 22, 45,100, 92, 46,215,170, 84, 10,119,119,247,249, 28, 14,103,164, -141,141,141,157,193, 96, 80, 26, 88,157, 68,173, 51, 64,103, 4, 52, 26, 29,248,130, 82,179,200,231, 50,208,234, 12,208,104, 13, - 85, 95, 24,185,247,175, 1,104,164,120, 42,166,116, 33,174,129,205,239,251,143,126, 58,252,189,208,185,181,154, 15,177, 77,201, -145, 67,192, 24,209,186,177, 23, 46,157, 57, 76, 50, 83,227, 63,175,206,100, 1, 64,126, 65,177,143,155,155, 7,162,147, 85,200, - 42,210, 34,183,204,100,229,148,232,161,212, 42, 17, 92,199, 27, 50,185,220,231,165,247, 47,112,248,236,217,179,239,246, 27, 28, -138,105, 95, 46,232,180,117,227, 79, 49, 82, 27,254,135,234,188,132, 8,107,140,214,253,251,247,139,103,206,156,217,112,243,230, -205,156,209,163, 71,107,131,130,130, 68,239,191,255,126,167, 29, 59,118,136, 36, 18,145,246,238,213, 99,115,199,127, 50,107,240, -166,213,139,154,151,148,148, 48,102,147,233,180,177,164,100,150,170, 26, 51,151,113,236,235,135,243,146,140, 99,223,234,236,118, -204, 89,194,105, 42, 36,134, 17,104, 60,127, 47,226,230, 27,147,206,172, 85,138,223, 93,254, 73,182,140,157,163,227,184, 47,174, -206,100, 1, 0,135,203,192, 96,182,192, 78,204, 7,135,195, 41, 55,241, 94,191,238, 61, 45,113,115,176, 1,159,203, 1,143,203, - 64,161, 49,161, 80, 97,196,199, 31, 88, 91, 33,132,176,102, 11,129,214, 96,134,166,236,233, 80,169, 40,196,236, 47,167,227,237, -129,239, 96,252,228,233, 40,209, 2,145,201, 74, 24, 77,166,106, 47, 10, 14,195,129, 70,111,198,135,189,235,160, 88,101,132, 90, -107,134,193,204, 66, 98,195, 3,159,199,129, 84,196,131,189,132, 15, 16, 34, 40,111, 76,248,124,190,206,100, 50,237,172,226,137, - 30,245,124, 60,160, 53,113,208, 38,244, 39,244,106,223, 8,177,215, 14,242, 46,255,121,175,254,103, 95,206,193,167, 19, 6,226, -192,195,134,112,118,175, 3, 91,169, 24, 38,194, 1, 64,172, 76,216,155,207,114,140,239,140,252,121,243,182, 71,223,125, 59, 75, - 36, 83, 51, 16, 10,184,184,120,225, 60,110,220,140, 92, 93,248,224,232, 78,188, 70,248,132,227, 97,111,111, 15,145, 13, 23, 6, -163,222, 96,125,234, 2, 1, 1, 66,164,238,141,126, 46,123,226, 15,177,176,168,224,189,234,141, 22, 79,100, 63,107,234,151,223, -125,223,187,255,112,132,159, 56,128,253, 7,246, 90,218,247, 29,199,221,245,235, 70,116,234, 53, 8,157,122,135,226,244,225, 29, -211,213, 44,211,100,226,180,185, 11,187,244,232,135,240,147, 7,144,151,155,185,220,218,245,229,242,153,105, 61,222, 26, 8,157, -193,130,206, 61, 7,224,204,241,195,159,160,108,144,133,245, 55,177,231,218,103,112,204,211, 63,159,198,207,151, 25,248, 5, 10, - 3, 50, 11, 52, 72,201,211,224,232,158,173,196,250,246,194,208,186, 75,112,109,254,196,101, 23, 51,124,106,123,233,249,122,173, - 56, 62, 49, 41,112,252, 7, 97,252,250,126,129,156,124,185, 30, 5,114, 61, 10,229,122,168,116,102,248,213,246,231,152,204, 76, -251,154, 30,103, 87, 7, 27,254,250,227,201,176,151,242,209, 33,240,229, 7,218,178, 44,251,151,201, 90, 89,106,178, 98,146,229, - 16, 10,184, 16, 10, 56, 16, 10,184, 48, 91,136, 85, 15, 46, 98,247, 70,253, 62,158,250,145,183,193, 12, 20,201, 13,224,113, 25, -184,187, 58, 73, 91, 55, 31,137,109, 63,125, 2, 0,152, 48,115, 3,198,127,248, 62, 26, 55, 13,130,172,164,196,115,228,240,126, - 43, 1, 28,182,118, 93, 79,133, 71,248,134, 95,137,158,249,241,140,121,182,239, 13,236,206,189,147, 36, 71, 78,177, 30,137,241, -202, 26, 69,222, 0,192,108, 97, 65, 64,176,125,239, 9,136,109,120, 40,144, 27, 65, 8,193,162,181,251, 96, 39,230, 35,167,164, -180,187,191, 42,170,244, 35, 85, 68,164,106, 16,109, 28,128,210, 92, 46, 55,107, 35, 90, 75,150, 44,137, 93,178,100, 73,133, 17, -178,167, 76,214,203, 77, 42, 45, 16, 72, 3,237, 93, 92,255, 12, 63,115,202,238,240, 93, 11, 46,221, 45,194,240,206,181,161, 42, - 78,199,143, 95,190, 87,204,128, 24, 56, 92,174, 76,175,213, 28,210,106,213,139, 1, 24,171, 60,105, 60, 27,133, 72, 69,182,231, -215,111,250,205,236,234,238,142,157, 87,139, 51, 75,212,102,211, 95,221, 86, 38, 38,242,236,166,250,102,214,212, 87,151,247,248, -118,117, 79,226, 44,129, 96,201,198,163, 0, 8, 88,150, 5, 97, 89,240, 69,182, 82,215, 6,237,242,202, 26, 58, 17,143,195,232, -158,110, 1, 8,107,206, 44, 76,174, 58, 12,202, 0,112,144,240,177,247,114, 22, 0,228,113,149, 81,113,163,222, 43,237, 46,212, - 25, 68,138,166, 13, 27,146,214,173, 91,203,196, 98,171,202, 95,113, 61, 60, 60,110,205,157, 59, 55,112,252,248,241, 66, 27, 27, - 27,152,205,102,231, 95, 54,109, 98, 55, 45,158,128,161,159,172,135,192, 70, 8,173,206, 8, 62,159,135, 18,185, 10, 50,133, 6, - 74,141,169,230,103, 80, 82,146,161, 0, 88,118,228,176,205, 59,125,108,131,219,216,112, 4,104, 25,224,133, 75,103,143,144, 63, -207,108,155,160,205,143,255,205,202, 19, 17, 42,157, 9,217, 69, 58,100, 21,233,144, 91,162, 67,110,177, 30,185, 37, 58, 48, 12, - 3,157,193,252, 74, 55, 46,117,254,163,253, 59,127,219, 50, 72,111,196,136, 46,189,223,193,244,121,235,235,236,252,121,233,249, -100,194,233,104,101,162,173, 37, 54, 54, 54,245,131, 15, 62,104,190,123,247,110,110,179,102,205,180,113,113,113,146, 50, 19,105, -180,181,149,136,183,174, 91,114,182, 77,155, 54,123,179,226, 31, 94, 40,235, 79,175,182, 97,175,211,117,172, 80,108,140,158,232, - 43,237,208,167,129,167, 4,190, 82,101,159, 64,219,187, 63, 22,245,248,244,251,130,139,171,243,115,244,230,115, 5, 90,110,139, - 44, 21,223,170, 28, 60,147, 94,151, 54,116,248, 8,112, 25, 14,140, 58, 77, 90,249,201,229,238, 96,131,249,187, 30,194, 86,196, -135,157,152, 7, 91, 49, 31,157,154, 56,163, 6,237, 25, 49, 89, 88,104,244, 22,104,245,102,232, 12,102,184,250, 56, 97,243,206, -253, 72,207,215,226,232,237, 66, 60, 74, 83,194,191,182, 20,132, 84,223, 76,178, 22,147,122,224,176,209,118, 92, 14, 3, 46,135, -225, 52, 9,108,132, 98,149, 17, 2, 30, 7, 2,145, 24, 82, 33, 15,246, 98, 62, 4, 2, 62,242,243,243,161,215,235,225,235,235, - 43,170,218, 10, 18,216,217,138,225, 95,223, 27, 70,147, 25,167,174, 60,192,226,207,135,226,173, 46,173,192,240,109,241, 80, 31, - 2, 59,103, 59,176, 28, 14,140,102, 22, 6,163, 5, 0, 71, 87,153,158,143,143, 79, 15,169, 84, 42,213,104, 52,202,244,244,244, -136,220, 71,135,211, 45,220,193, 19,207,132, 95,220, 57,224,237,183, 16, 29, 19,139, 3,135,143, 93, 45,116,145,207, 40,255,159, -166, 77,155,182,115,117,117,181, 45, 42, 42, 82,220,191,127,255,214,203, 62, 23, 16, 14,231,179,246,157,186, 65, 37,203, 71, 94, - 70,138,213, 79,209,141,235,216,225,155, 37,235, 91, 6, 52, 10,104,105, 33,165,198,171,137,175, 29,190,152,183,166,101, 67,255, - 70, 45,203, 7,132, 52,246,173,186, 44, 27, 79, 98,215,123,204,248,233, 75, 6, 13, 31,139,139,225,199,176, 98,241,151, 59,165, - 14,110,141,157,157, 28, 90, 52,107,215, 27, 87,207, 31,131,200,206, 19, 78, 46,158,157, 70,127, 56,181,215,240,209,147,112,227, -234,121,172, 94,250,245, 14,139, 94,249,187, 53,235, 42,117,175,239,214, 60,164,205, 40, 59,103, 15,200,228, 74,216, 57,185,163, -113,112,235, 81, 15,238,234,103,170,243,147, 11, 94,218,116, 16, 2,189,145,160, 68,101, 68, 70,129, 22,169,185,165, 70,139,101, -107,144, 19,100, 97, 25, 91, 17,143,231,108,122,236,123,239,252, 69, 82,199,199,131, 89,182,240, 75,174, 17, 34, 20,200, 74, 77, - 86,129,194,128, 2,185, 1, 42,157, 9,206, 82, 30, 88, 11, 91,227,167,238, 18,149, 17,118, 18, 62, 28, 36, 2,171,163,140, 21, -177,241,215,189, 1,119,227,179,135,172, 88,177, 74,114, 39,249, 41,147,197, 47,141,102, 9, 5, 92, 88, 88, 22,176,226,138,231, -243,248,211, 6,247,235,133,140, 66,109,233,168,101, 14, 3,255,160, 54,112, 21,179,232, 25, 58, 11, 0, 48,176, 95,105,106, 91, -114,142, 26,199,255, 44, 0,158, 77,236,174,186, 45,214,106,185,155,118,157,252,108,255,190, 61, 14, 58, 11, 15,191,156, 78,133, - 70,111,134, 72,192,133, 80,192,133, 88,192,125, 38, 31,187,122,163, 85,154,115,151, 94,104,130, 70,167,131, 66,107, 2, 1,112, -235,177, 10, 90,131, 25,114,181, 9,237, 2,157, 94, 45, 16,194, 48, 39, 9, 33,253,159, 55, 68,207,155,165,167, 34, 82, 21,105, -220,126, 90,163,252,243,149, 25,185,167,115,182, 0,212,104, 4, 23,239,121,231,248,244,178, 64,234,212,216,193,206,225,207, 51, -167, 79,216, 30,190,203, 34, 34,166,212,100,153,180,133, 88, 62,115,100,166, 66, 86,216, 29, 64,146,181, 95, 38,113,109, 28, 44, -178, 17, 94,252, 97,213, 47, 70,119,143, 90,236,161, 63,101,249,114,141,229, 25, 55, 97,209,235, 57,132, 37, 2, 93,222, 99,171, -250, 16, 56, 28,198, 56,239,147,119,192, 18,130,249,171,246,227,251, 25,161,176, 21,143,150, 48, 12, 35, 81,235,204,248,124,193, - 22, 44,255,102,156,157, 68,200, 3,195,148,230, 68,141, 25,241,142,117, 39,160,206,140,196,155,187, 85,202,228, 19,113, 79,119, - 23,182,237,244,118,100,219,182,109,101, 78, 78, 78, 16,139,197,127, 69, 42, 42,193,195,195,227,155,121,243,230, 5, 76,158, 60, -249, 73,177, 79, 30,143,135,143, 63,250,136, 99,177, 16,156, 62,189, 13,110,117, 67,112,236,220,159,232,219,163, 53, 84, 26, 29, -138,101, 74,176,224,190,244,137,168,148, 21, 94,204, 77,189,215,166, 99,247,129,136, 56,123,132,252,121,122,235,132,154,212,232, -113,114,118,202,136,186,151,216,152, 97,156, 75, 35, 90,101, 38,203, 96, 98, 81,199, 67,130,140,212, 68, 56, 58, 56,100, 88,171, - 39,118, 11, 24,204,112,200,100, 6,100,155, 58, 47, 97, 63, 0,162,206,137, 27,185,255,247, 77, 49,177,247,239, 44, 30, 48,106, - 26,175,247,240,143,184, 63, 47,153,250, 53, 0,107, 11,239, 25, 31, 61,122,244, 96,220,184,113, 29,110,220,184, 97, 1,160, 97, - 24,198,196,229,114, 37, 6,131, 65,208,189,123,119,249,195,135, 15, 35, 80,113,210,226, 51,116,250, 96,191, 43, 35, 84,190,109, -195, 26, 71,214,177, 83,190,213,189,115,123,180,111,234,131,140,206,237, 1, 96, 90,154,202, 54, 64,215,112,203, 94,147, 89,124, -234,231, 95,143,127, 63, 33,180,215,231, 59,121,243, 87,228,156,152, 95,101, 34,106, 70,220,229, 62, 21,217,120, 30,151, 3, 59, - 49, 31,182, 98, 30,236,196,124,216,137,248, 48,153, 73, 77,158, 28,137,201,204,150, 70,180, 12,102,168,180,102, 92,188,147,135, - 92,185, 1, 50,165, 17, 90,163, 5, 4,164,244,105,212,138,214,188,224,241,117,199,242, 59,169,163,111,136,124,211,218,159,236, - 15, 94,203,124, 50,162,207, 65, 98, 3, 59, 73,233,104,236, 43, 87,174,192,197,165,250,167,125,150,101,113,224,204, 45,172,216, -126, 17,103,182,125, 5,145,128,139,224,193, 11, 48,118, 72, 91,176,132, 69,226,163,216, 60,255, 38,205, 61, 56, 28, 49, 56, 12, - 3,189,137, 5, 64, 42,221,159, 6,131,193, 37, 61, 61, 93,225,231,231,231,233,237,237, 61,156,203,229, 18, 40,239,232,143,236, - 41,214, 92, 56,241,187, 68,173,213, 91, 36,102,249, 54,191, 28,109,127,248,249,129, 97, 24, 98,111,111, 47,184,120,241,162, 42, - 40, 40,200,237, 37, 47, 37,142,216,189,209,234,241, 83, 62, 27,222,176, 65, 3,236,255,125, 27, 8, 97, 14, 90,251,207,187,142, -223,192,194,217,207,142, 48,252, 98,222,154,150,203, 23, 76,123,230,189, 41,179, 87, 84, 57,234, 80, 44,180,157, 49,116,228, 68, - 68,222,250, 3, 63, 46,248, 98,143, 94, 85, 60,214,100, 54,189, 91,156,147,188,167,126,147,182, 32, 70, 37,194,247,253,132,208, -247, 39, 8,123, 15, 24,142, 27, 87,207,227,251,175,167,236,210,200,242, 63,128,149, 73,206, 44,225, 79,238,222,103, 8, 95,171, - 55, 98,205,178,111, 49,105,198, 98,180,235, 49,144,127,255,206,159,147, 1,124,103,117, 58,132,209,130,238, 65,174,165,230,217, -196,226, 88, 50,151, 87,209, 25,200,227, 50,156, 22, 13, 28,161, 53,152,161,168,230,161,146, 39,224,231,202,228,138,186,235,190, -255,140,171,214,153, 81, 32, 55, 32, 95,174, 71,161,236, 47,131, 85, 40,215,163, 64,110, 0,159,199, 32, 62, 41, 13, 28, 62,175, -198,249,121, 37, 42, 19,218, 52,114, 42,189, 70, 95,178,119,196,196,179,111,123,230,242,221,161, 43, 86,172, 20,221, 77, 81, 34, - 38, 89, 81, 22,201,226, 66,200,231,192,166,236,119, 11, 91,154, 27, 89, 21,246,110, 13,234,135,141, 25,221,211,222, 86,140,236, -132,124,240,184,165, 37, 98, 28,220,125,224, 32,212, 97,234,148,137,112,117,113, 68,122,161, 30,171, 15,199, 35,230,193, 99,176, -218,154,109,246,154, 95,246,244, 29,255,241, 23,142, 28,190, 13,118,156, 77, 41, 93, 79,174, 5, 15,255, 60,174,203, 78,188,167, - 86, 41,138, 8,136,197,202, 28,100,134,152, 45,165,167,219,247,243,103, 97,207,246, 13, 56, 27,149,255,228, 12,188,118,112, 57, - 62,155,189, 8,133, 10, 3, 42, 58, 47,171,242, 35, 0, 10,158,138, 68,189,176,252,148, 57,170,104,153, 41, 91, 54, 84,162, 97, -120,206, 92, 25,158,123,223,240,156, 94, 69,181,255, 54, 85,219,117,248,130, 41,114,116,107, 38, 17, 73,255, 56,125,250,184,244, - 72, 12,121, 98,178,140,154, 66,178,120,218,192, 76,133,172,160,119,141, 76,150,155,127, 51,161, 68,120,121,238,162,213,122,143, - 90,117,205,167,238, 40,138,148, 58,139,249,197, 28, 4,169, 69,234,224,166,227,217, 8, 87,240,181,134,111, 11, 11,227,212,213, - 69,158, 88, 66,112,226,102, 46, 8, 41,125, 68,218,119, 37, 11,101, 79,230,176,176,165,221, 42,231,238,228,131, 87,150,135, 98, -109,248,123,227, 47, 27, 20,253,131,228,234, 81,223,207,127,210, 93,216,174,121,105, 36,203,222,222, 30,142,142,142,176,181,181, - 69,117, 93,135, 12,195,140, 25, 63,126,252, 11, 79,255,249,249,249,232,213,179, 59,214,110,216,140,230, 61,195,112,238,250, 89, - 24, 77, 44,130,155, 52, 64, 93,111, 39,100,228, 41, 95,234, 66,151,122, 4,124,220,166,251,144,175, 59,245, 24,136,139,103, 14, -145, 63,207,252, 58,177,166,133, 16,251,247,234,112,124,225,194,249,245,231, 46, 94, 39,180, 19,241, 16,167, 50,128,195, 48,168, -227, 33,129,139,148,131,136, 35, 59,116,161, 3, 59, 88, 93, 28,207,199,167,214,206,229,107, 55, 73,151, 47, 93,208, 61, 50,138, -185,168,202,142, 47, 6, 0, 77,222,163,101, 15,129, 7,181,255, 8, 63,213,188,235, 59,240,240,110,240, 86,114,222, 67,171,205, - 6, 0, 77, 82, 82, 82,242,220,185,115, 3,150, 46, 93, 74,184, 92, 46, 11, 64,184,106,213, 42, 77, 66, 66,194, 29,148, 14,205, - 69,117, 55,155,158,111, 53,253,220,214,198,210,206, 89,194,105,218,192, 83,130,246, 77, 75,123, 69, 67,251,119,130,143,175, 47, -146,114, 53, 45,138, 53, 44, 95,101,224, 54, 88,255, 75,204,237,122,174,220, 9,102,173,225, 1,128,163, 53, 61, 62, 12,254, 74, -144, 47,143,102,217,137,249, 96, 75,207,149, 26, 25, 45,189,209, 2,173,222, 2,173,193, 12,181,193, 2,141,193, 2,150,148, 94, - 19, 12,195,192,104,102, 97,213, 99,243,115,231,190,189,179, 43, 26,212, 99, 96, 47, 41, 93, 55,251,178,114, 15, 12, 0, 23, 23, - 23,184,187,187, 91, 21, 21, 53, 24, 75, 47,113,131,137,125,210,173,111, 48,154, 65, 8, 65,124,252,163,175, 82,147,147, 7,251, -249,251,117,105, 18,220,220, 89, 34,228, 0, 64,165, 70, 75,163,209, 88,236,236,236,220,157,157,157, 57, 89, 89, 89, 79,204,179, - 95,139,238,230,195,135, 14, 98,232,208,119, 84,113,183,238, 62, 25,226,174,213,106,153,142, 29, 59,218,251,248,248,112,244,122, -189,162,166,135, 73,234,214,104,136,147,139,243,226, 49, 31, 76,106,212,189, 87, 95, 92,186, 16,142,163,135,118,255,166, 41,136, - 15,183, 86, 36, 32, 32,240,133, 81,135, 13,253, 27,189, 48,234,176,110,125,255, 42,141, 86,147,224,214,109, 9,195,195,217, 19, -251,136,142, 99,156, 2,128,181,232,148,251,246,110,252,230,187,145,147,103, 55,236, 55,104, 36,198,188, 63, 22, 60, 30, 23, 17, -231,142, 99,249,130,233, 39, 85,242,252, 48,107,210, 4, 74, 67,111,141, 5,181,196, 62,159,250, 54,108,134,168, 63,175, 34, 49, -254,126,236,221,219, 55,154,250, 5,181,131,155,119,157, 79,211, 92,185, 75, 17, 23,103,172, 78,198,160,211,165,141, 13,123, 31, - 79,143, 58,108, 31, 18,224,194, 60,127, 1, 0,208, 40,243,141, 91,127,250, 60,161,124,212, 33,107, 52,164, 85,166, 43, 47, 41, - 56, 16,113,253,230,140,193,253,251,114, 10, 21,134,210, 8,150,220, 80,246,210,163,176,252,119,133, 30,254,222,182,120, 20, 27, -197,234,228,133, 7,107,120, 93,234,198,190,219,231, 65,249,185,203,178, 4, 12,160,171,113,183, 20,223,126,226,178, 31, 87,136, -238, 38,171, 16,147,162, 40,237, 42,228,115, 75, 13, 22,159,243,196,116,149,142,102,175, 38, 58,196,112,191,255, 48,108, 4, 10, - 21, 70,176, 44,192,227,114,202, 94, 2,164, 43, 25,100, 40, 53, 40, 44, 41, 64,114,106, 26,100,185,137,224,112, 56,112,245,110, -100,117, 37,105, 11,177,241,210, 24, 72,208,240,254, 93,120,135,254,200,129, 68,200,131, 94,153,135,211,123,127, 42,208,171, 20, -139,181, 26,213, 33,107,234, 57,254,149,130,192, 20, 40, 84, 58, 15, 33,159,139,253,219,215,225,221,177, 83,158,105,125,191,154, -179, 16,224, 48, 40, 46, 81,130, 97,152,130,154,181, 75,204,237,170,150, 95, 50, 50,246,202, 26, 21,152,173, 23, 31, 20, 42,127, - 26, 37,167,195,207, 28,151, 94, 75, 21,226,214,163,156, 50,147, 85,192, 46,250,164,127,166, 82, 94,220, 7, 64,124,205,158, 11, - 57,125, 66, 63,156, 17,219,160, 81, 19,253,165,251,170, 20,153,218, 84,105,158, 67,251,225,115, 99, 35, 79,174,237, 39, 55, 37, -125, 36,245,106, 98, 97,205,230,101,218,130,248, 5,149,116, 29,218, 44, 88,189,255, 73,183,225,204,165, 59, 74,127,183, 88, 96, - 33, 44, 8, 11, 76,253,102, 35,204,172, 5,172,197, 2,214, 66, 96,178, 16, 73,117,171,235,238, 93,247, 80,201,195,125,129,163, -190,123,177,187,208,209,209, 17, 46, 46, 46,112,113,113,129,189,189,125,181, 70,139,207,231,219,242,120,207,238,234,180,180, 52, -164,166,166,194,222,222, 30,132, 53,193, 96, 2,154,181,235,141,123,137,247,113,254,218, 29, 16,214, 2,169,109,205,103,121,145, -122, 4,124,212,186,219,224,117, 61, 6,141,195,185, 67,191,144,219, 87,142, 79,210,230,199,111,177, 58, 66,111,177, 48, 38,147, - 9,253,123,119, 75,139,142,125,124,102,206,140,201,125, 59, 12,152, 36,108, 31, 80, 11, 58,131, 5,153,169,137,136, 56,242,171, -174, 81,125,175,179, 61, 59,183, 77, 51,153, 76,176, 88, 44,213,222,200,117, 6, 99, 33,151, 47,150,142, 24, 49,138,127,251,214, -173,131, 82, 55,255,253, 22,134,115,151, 33,108, 48, 67,200,208,224,224,198, 48,154, 88,104, 52,138,146,154,110,179, 82,169, 76, -222,182,109, 91,253,176,176, 48, 73,147, 38, 77,248,137,137,137, 88,190,124,121,145, 82,169, 76,182, 86, 35,252,202,163, 85, 60, -166, 36,161, 60,162,149,222,169, 61, 70, 12,232,132, 61, 39,175, 33,226,234, 13,164,169,108,239,168,204,188, 35, 25,105,217,250, -166,206,138,131,131,218,215,229,238,223, 94,114, 48,182,219,172,247, 8, 17,134, 23, 94,158,175,182,254,226, 6,148, 90, 19,236, - 37,165,245,158,202, 35, 91, 92,134,177,218, 17, 49, 64,242,213, 27, 81,205, 90,249, 55, 65,116,178, 28,249, 50, 61,180,122, 51, - 88,150,128, 5,129,139,157, 13, 68, 2, 14,210, 83,147,193, 18, 99, 74, 13,111, 21, 5, 93,187,116,229, 1, 12, 24,134,240,248, - 60, 30, 8, 74,235, 43,138,197, 98,149,187,187,187, 85, 17, 45,163,217,140,161,125,219,162, 93,235, 96, 12,158, 84, 90, 51,243, -194,111,179,224,100,203,199,158,157, 91,144,113,101,213,206,250,237, 39,135,223,191, 23, 59, 44, 54,250,143, 81,111,183, 20,183, -240,228,101, 11, 42, 11,147,170,213,234,131, 0,108, 4, 2, 65,223, 46, 93,186, 56, 31, 60,120, 80,230,234,234,202,218, 8, 4, - 5,131, 6, 14, 96,249, 2, 65,113,249,103,175, 95,191,206,159, 52,105,146, 93, 73, 73, 73,122, 94, 94,222, 13, 0,166,170, 31, - 4, 3,122,129,131,221, 96, 24,145,173, 88,146, 86,175, 94, 3,239,214,237,218, 58, 12, 25,250, 46,132, 54, 66,156, 11, 63,131, - 53, 43,151,238, 83,229,196,125, 88,147, 61,249,186, 70, 29,102,166,167, 36,107,180,250,160,102,173,186, 49, 87,195,143, 76, 51, -194,117, 37, 87,104,252,169,215,208, 41, 13,147,179, 85, 88,179,228, 43, 56, 57, 72,145,146,248, 80,155, 16,119,111,163, 73,167, -248,202,106,147, 5, 64, 82,100, 25,214,254,253,190, 78,122,163, 5, 87, 46,158,212,177,102,182,239,141,203,167, 18,107, 55,106, - 45,106,214,186,167, 83,225,209, 45, 67, 53,192,158,234,116,178, 30,190, 24,193, 37, 6, 89,202,133,139,231, 29, 60,234, 52,229, - 50, 96, 96,212,235, 80,144,116,219,172,201,123,168, 80,100,221,183,106, 20,110, 81, 6,190,153, 61,239,135,143, 90,183,106, 37, - 37, 16, 61, 19,193, 42, 55, 88,133, 10, 3, 92,237,108,160, 85, 20, 32,225,246, 25,157,166,128, 91,101,189, 51,179, 65, 45, 41, -204,207,179,249, 43,157, 33,190, 93, 85,159, 47,204,207,179, 49, 27,212,146,234,111,117, 92,216, 75,109,112, 47, 37,235, 73,226, -187,144, 95,154,155,101,195,231, 62,201,211, 42,111, 11,170,161,155, 64,228,136,172, 34, 29, 24, 16,176, 22, 51,204, 38, 3,148, - 10, 5,178,178,115,145,151,155, 7,165, 82, 6,137,173, 19,154,181,104, 3, 59,169, 8,119, 35,246,129, 16, 98, 85, 93, 67, 19, -195, 15,104,221,174,179,240,126,106,105, 46,150,136, 79,112,124,247,210, 34,149, 34,191,179, 42, 39, 33,161,166,109,177,217, 98, - 57, 31,243, 32,161,105,109,175,122,204,157, 68, 57,118,110, 94, 11, 67, 89,100,211,100,178,224,126,186, 26, 57,197, 26,164, 39, -197, 17,214, 98, 57,143,255, 8,188,202, 3,128,224, 5, 55,107,140,222,163,135, 96,195,134,141, 72, 74, 78,101, 23, 79,235,151, -174, 82,202,222,174,129,201,234,133,178, 90, 27,154,188, 71,203,180, 78,173, 51,143, 69, 23,115,180, 6, 82,101,130,143,200,173, - 14, 58,127,184,252,172, 86, 89,108, 99,209,107,120,199,119,126,184,187, 34,205, 82, 7, 13,195,226, 47, 66, 97, 43,230,129, 97, - 24,148,119, 23,174, 95, 56, 17, 18, 97,105,223,178, 86,111,198,232,207, 87, 96,231,138,233, 32, 0, 70,190,123, 77, 83,217,122, -162,116,238,194,169, 94,184, 85, 59, 45, 53, 63,171,215,192, 47, 46,232,140, 66,253,128,119,194, 34, 91,181,106, 37, 19,139,197, - 16,139,197,176,183,183,135,147,147, 19, 28, 29, 29,171,221,118,147,201,164, 50, 24, 12, 46, 54, 54, 54, 96, 89, 22, 41, 41, 41, - 72, 73, 73,129, 92, 46, 71, 65, 65, 1,212, 42,133,249,214,133,253,188,102,237,251,193,187, 65, 16,234,248, 55, 7,159,203,128, -199,227, 32,226,216,230,202,214,179, 98,147,213,117,208,250,158,131,199,227,220,161, 77,228,246,149,227,147,181,249,241,155,173, - 61, 70,101,221, 61,119,135, 14, 29, 26, 52,105,210, 36,193,188, 25,147,206,158, 12,143,136,223,127, 98,211,192,146, 18,153, 15, - 33, 4,142, 14, 14, 25,161, 3, 59, 28,239,222,177,117,218,133, 11, 23,216,221,187,119,235, 25,134,185, 87,149,102,105, 35,149, -255,219,133,243, 23,231,119,238,218, 13, 91,182,239,238, 26,251, 32,174,107, 98, 98, 2,124,234, 52, 64,189,250,254,208, 48, 78, -184,120,249, 42, 84,178,252,223,172, 89,207,231,162, 90, 76, 73, 73,201, 31,161,161,161,189,175, 93,187,198, 9, 13, 13,213, 20, - 22, 22, 94,127, 42,138, 69,170,211,188,241,243, 59, 5, 0,126,171,211,117,236,190, 44,163,236, 83, 0, 75,125,235,248, 34,226, -234, 13,220,184,118,115, 99,161,196,119,193,135,163, 63,152, 88,119, 16,119,252,160,246,117,185,238, 78, 18,252,190,105, 57,247, -216,141,212, 21,169, 69,150, 45, 75, 47,207, 95,104,205, 49,122,114,227, 80, 26,209,177,177, 51, 76, 22, 2,150,148, 54,184,118, - 34,126,101, 13,239, 11,154, 60,131,240,195,201,147, 38, 37, 54, 11,110,241,217,232, 15, 38, 11, 90, 52,240,193,173,199, 50,128, - 97,224,236, 41, 69, 78, 78, 14,174, 28,216,100, 46,201,122,184,145,203,101,191,171,193,254, 68, 73,218, 29,191,167, 22, 39, 22, - 22, 22, 34, 34, 34, 2,229, 6,203,205,205,173, 50,163,245,140,102, 81, 94,246,245,133, 63,254,210,113,194,152,119, 48,160, 91, - 83, 92,190,157, 8, 67, 89,189,166,242,161,228,201, 55,126,182,249, 52,180,129,225,163,161,141, 20, 90,147, 77,234, 55, 41,242, - 43, 40,157,131,149,173,100, 61, 13,197,197,197,199, 30, 61,122,212,169,121,243,230,117, 79,157, 58, 85, 28,123,243,236,180,167, - 87,226,139, 47,190,176,221,176, 97,131,132, 16,114,221, 96, 48, 36, 89,181,237, 28,252, 30, 21, 25,233, 98, 52,177,184,122,243, -110,227,158, 29, 91,128, 37,192,237,219,183,177,101,235, 22,221,189,152, 59, 63,169,243, 60,191,171,194,188, 84,184, 63, 45,175, - 54,234,240,137,102, 78, 86,234, 79,231, 78, 30,216,217,186,235, 64,140,154,250,221,119, 17, 39,119,207,111,217,121, 0,167,113, -235,222,136,186,113, 17,231, 79,157,249,193,168, 42,158,143,234,115, 71, 42, 92, 79,161, 88,242, 73,147,150, 93,145,158,150,138, -148,132,251,191,233,138, 31,103,167, 37,114,127,203,206, 76,155, 92,191,105, 71, 92, 59,187,103, 90, 21, 70,171,202,115,222,199, - 77,188,233,212,137, 99, 35, 50, 51,127,246, 84,107,117, 66, 66,136, 78,104,195,203,181,229, 40,247, 42,172, 94,207, 56, 99, 65, -118,221,161,239,142,158,124,114,205,154,149,124, 15, 71, 9,114, 75,116, 80,104,141, 80,106,140,224, 48, 12,252,188,165,208, 40, -139,113,249,192,143, 38,131,170, 36, 20, 72, 52, 86,166, 41,117, 15, 88, 84,242,248,226,212, 47,166, 92,130,141,131,143,119,189, - 30,179,171,140,214, 41,179,238, 12,252, 98,202,241, 0, 66, 72, 79,169,123,128, 82,157,255,104,110,101,219,206, 48,165,215,247, -168,238, 62, 48,154, 75,235,143,153, 89,192,194,178,101, 81, 62,128, 60,233,207,103,170,217,118,134,221,123,242, 58,178,243,100, -208, 26, 76,208, 27,204, 48,154, 44,224,112,185,112,116,114,132,127,189, 16, 56, 56,218, 35, 47, 55, 27, 55, 46, 28, 67,124,204, -229,235, 12,193, 2,109, 65,194, 5,107,142,145, 64,236, 24,224,229,237,201,201, 81, 24, 32,182,225,226,206,229, 83, 70,147, 65, -255,147,149, 38,235, 5, 77, 89, 81,241,138,207,102,124, 57,242,215,109,219, 61,131,234,219, 35,179, 80,139,204, 2, 29,148, 58, - 83,153, 17, 99,161, 87, 21, 34,230,226,246, 92,139, 78,185, 2,255, 17, 42, 53, 90,102,163, 78,121,240,204, 45,151, 89,243,127, -228, 62, 78, 76, 50, 45,250,180,127,166, 86,165,232, 87,227, 72,214, 83,252,250,113,253, 61,111, 98, 35, 94,232, 46, 36, 44, 88, - 66,112,252,102,238,147,238, 66,182, 44,243, 50, 58,177,234,105, 4,159,158,187,176, 91,191,105,231, 98, 30, 41,119,105,181,121, - 14, 15, 31,255, 84, 2, 0, 92, 46,247,201,171, 60, 55, 75,167,211, 25,170,233, 66,217,177,121,243,230,153,147, 39, 79, 22,102, -100,100, 32, 49, 49, 17, 50,153, 12, 34,145, 8,103,206,156, 49,129, 53,255, 20,115,237,112,202,163,168,240,111, 3, 90,245,174, - 29,212,190, 31, 36, 18, 41,120,196,250,100, 76,137,123,163, 17,173,186, 14, 90,215,115,200, 4,156, 63,188,153,220,190,124,108, -138,182, 32,126, 83, 77,247,165, 76, 38,139, 5,144,240,211, 79, 63,181,216,178,101, 75,253, 25, 51,102, 36,237, 88, 55,127, 13, - 0, 20, 21, 21, 1, 0,162,163,163,201,148, 41, 83,244, 58,157, 46,185,164,164, 36, 10,213, 12,128, 0, 0,109,129,228,251, 45, -235,151, 54,203,200,202,121,167, 65,179, 54,112,171,223, 6,158,126,109, 81,162, 52,226,214,227,108, 36,197, 93, 64,220,213, 3, -167, 52,182,230,249,168, 97,125,227,230,205,155,251,112, 56,156,122, 42,149,202,179, 73,147, 38,205,165, 82,105,116,243,230,205, - 67,120, 60, 94,102,100,100,100,106, 77,180,210, 46,111,215,215,233, 58,118,117,154,210,174,123, 82,174, 38, 36, 77,105, 23,173, - 17, 58, 76, 47,184,184, 90,255, 43,183,214, 10, 98, 44,140,221,191, 93,113,240,247, 77,203,185,163, 39,126, 97,185, 47,119,250, -148, 39,182, 57, 87,179,112, 53, 39,231,163,176,193,127,149,119, 40,139,100,149,253,110, 85,152, 94, 46,143,145, 3,152, 25,243, -128,191,238,254,167,147, 22, 6,183,238,248,126,151,183, 67, 57,102,129, 45,206, 30,254,153, 36,199, 92,220,207, 35,150, 57, 90, - 43,102, 3,168,182, 59,200, 96,176,198,100,189,184,142, 25,210,110,251,119,111, 29,123,240,240,161, 37, 67, 6, 13,118, 89,255, -205,123,248,241,151, 35,144,138,133, 32, 44,139,247,186,251, 12,255,118,124,224, 64, 31, 15, 81,173,131,151, 50,175, 76, 93,121, -127,166, 70, 99,140,183, 34, 18, 67, 10, 11, 11,175,218,218,218, 22,116,234,212,169,157, 80, 40,100, 10, 11, 11,121,238,238,238, -102, 7, 7, 7, 67,102,102,166, 70,175,215, 31, 4, 80,163,178,227, 70, 19,139,148, 60, 29,142, 30, 58,136,187, 55, 47, 32, 46, -238,145, 50,238, 65,220, 90,134, 71, 86,170,243, 18,138,129, 26, 63,224,131,173,112,212, 33,169,241,168, 67,139, 94,249,251,142, -141,139,122,104,116,250,177,205, 59,244, 71,221,198, 29, 57, 70,147, 5,247,110, 95,194,165, 3, 43,127, 52,170,138,103,189,202, - 49,246,174, 93,223,159,112,109,240, 71,196, 73, 16,150,221, 8, 0,132,101, 55, 70, 95, 59, 53,185,109,191,241,112,118,175,219, - 92,150, 30,205,224, 37,170,135, 11,120, 28,245,233,131,191, 30, 78, 73, 73,193,195,135, 15,241,248,241, 99, 20, 23, 23,227,247, -223, 83,106,116,124, 52, 37,169,231,226, 31,112,250, 12,123,111,212,241,225, 35,198,136,234,251, 7,113, 2,106, 59,193,197,150, -135, 71,143, 83, 17, 31, 25,195, 62,186,117, 74,103, 84,228, 15,209,150,164, 86,106,252, 36,174,141, 61, 0,203,172,242,185, 11, -219,183,239, 24,240,229,226, 37,237, 92,220,220, 43,108,199,139, 10,242,109,190,154,122, 44,224,198,159,127, 88, 53,215, 33,107, -177, 20, 77, 28, 27,202,114, 75, 39, 10,197,147, 56,117,217,222, 43,125,152, 42,125,159,176,230,106, 35,248, 31,188,211, 25,102, -150,133, 90,107,132, 66,173,135, 92,169, 67, 78,126, 17,238,198,196,224,242,241, 99, 72,124,116, 55,217,100, 48,132,115, 56,204, - 1,109, 94,252,229,154,245, 52,241,234,187, 56, 59, 35,185, 88, 5,145, 13, 15,169,241,145,122,181, 66,190,235,101,207, 35,109, - 81, 66, 78, 62,151,233, 29, 26, 58,226, 76,143, 62,131, 28, 90,119,232, 37,113,181,119,132,128, 71,144,144,146,141,168,235,103, -212, 73,119,175, 40, 76, 6, 85,223,215, 49,235,203,223,156,234, 71, 29, 26,245,234,129, 35, 7,119, 61,196,229,242,108, 88,214, -172, 55, 26,244,195, 94,197,100,189, 41, 8,177,100,142, 29,249,206, 51,207, 6,102,150,136, 71,190,123, 86,251,244,179,130,201, - 66, 36, 35,223,189,174, 41,109, 64, 42, 79,236,243,242,114,238, 95, 62,119, 97, 90, 90,209,237,226, 98,253, 37, 0,153, 58,157, -238,165,215, 49, 47, 47,111,225,226,197,139, 7,104, 52,154,192,110,221,186, 9,237,237,237, 81, 84, 84,132,240,240,112,211,137, - 19, 39, 30,228,231,231,127, 11,228,155,181, 8,249, 45, 70,119, 56,236, 81,100,248,183,129,173,250,212, 14,234,208,207,250,198, - 76, 40,158,208, 99,208, 56,230,252,145,205,228, 86,196,145,143,180, 5, 9,191,188,194,110, 53,234,116,186,155, 58,157,238,254, -156, 57,115, 90,123,120,120,120,124,251,237,183, 34,133, 66,193, 95,191,126,189,174,176,176, 48, 87,161, 80,220, 64, 21,249, 52, - 47, 18,109,146,103, 97,232,233,131,155,187,147,131,155,223,114,116,173,213,219,193,173,118, 67, 89, 65, 86,178,188, 32, 59, 28, -192,249,178, 66,145, 53,162, 69,139, 22, 13, 24,134, 9, 5,208, 76, 42,149,250,217,218,218, 10, 9, 33,129, 12,195,196,178, 44, - 27,211,164, 73,147, 19, 15, 30, 60,168, 81, 49,217,180,203,219,245, 62, 1, 29,119, 23,107, 88,129,129, 35,216,157,118,121,187, - 30, 0,242,207,125,169, 1,112,244, 65,183,153, 67,143,221, 72, 93, 19, 91,226, 48,173, 32, 98,201,177,154,174,179, 60,243,174, -223,235, 58,255,117, 57, 15, 50, 1,140,141,137,196,242,123,209, 55,230, 49, 4,124, 11,204,139,180,249,143, 35, 95,135, 62,159, -207,215,213,170, 85,171,194,209,133, 66,161, 80,167,215, 87, 21, 64,185,108, 86,229, 96, 11,208,117,251,161,125,219,199, 30, 57, -118,116, 73,151,158, 67, 92, 68,181,107,163,158, 59,131,237,179, 90, 78,187, 16, 93,112,107,208,151, 87, 54, 36,101,235, 98, 80, -195,124, 24,149, 74, 21, 15,160, 68,165, 82, 13, 38,132,100, 48, 12,227, 83, 82, 82,114,199,100, 50,221,171,177, 33, 96, 49,170, -125,251, 54,191, 51, 12,195, 35,102,118,217, 13, 62,119,183, 46, 39, 46, 19,175, 56, 45, 73, 80, 61,123,124,254,237,234,150, 13, -253, 26,181, 44,159,235,176,105, 93, 59, 76,154,185,188,101,221,250,254, 45,255,154,255,176,218, 52, 1, 98,210,148,124,120,104, -235,178, 43,209,127, 94,250,218,213,171,110,221,220,204,164,184,140,199,119, 22, 90,116,138, 67,175,122,156, 83, 30,199,174,220, -242,211,204, 25, 57, 89,201, 91, 52, 5, 9,247, 1, 64, 83,144,112, 63, 46, 10,223, 20,230,102,206, 40,202, 79,250,233,101,247, -133, 90,173,206,222,181,107,151, 99,199,142, 29, 57, 30, 30, 30, 40, 40, 40,192,165, 75,151, 88,150,101,179,106,172, 85,156,124, - 73, 93,204, 56,255,246,203,186,101, 2,169, 93, 63,179,217,236, 77, 8,192,227,241,114, 12, 26,197, 25, 37, 71,250, 37, 74, 82, -117, 85,223, 51, 88, 6, 0,167,124,238, 66,150,101,153,101,107,182,167,242, 69,118, 21, 22, 67, 52,233,148, 18,150,101,173,158, -235, 80,150, 30,213,240,117, 93,223, 12, 33, 11,154,183,106,247,181,201,100,212,149, 93, 31, 58, 0, 58, 66, 80,196,225, 48,151, -185,172,233,172,226, 21, 30,166, 24, 6,246,132,225,193, 78,204, 3, 3, 6, 42,121, 49,169, 73, 78, 86,133,134, 56, 63, 62, 86, -147,223,181,206,105,195,190,176,139,231, 78, 53,148,119, 13, 0, 0, 32, 0, 73, 68, 65, 84,189,107,177, 88,234,149,197, 12, 82, -244, 90,245,126, 85,142,211,111, 64,164, 25,255,126, 78,150,155, 45,230, 13,127,145, 85,221, 40,127, 39,205,128,250,226,193,181, -107,121,132,165,164,230,223, 74,202,208,252,134,103,167,213,121,149,245,228,122,120,120,124,195, 48,204,251, 54, 54, 54,182, 6, -131, 65, 77, 8,217,145,151,151,183, 16, 47, 76,254, 27,194, 23,187,107,195,108, 68,146,185, 70,157,250, 15, 77,126,252,168,234, -182, 93,226,214,168,183, 72, 42,157,169,211,170,119,104,242,226,183,191,230,253,233, 32, 20, 10, 67,108,109,109,249,133,133,133, - 55, 1,200,255, 78,199,189,121,243,230,190, 28, 14,167, 30,203,178, 30, 0, 28, 80, 58, 42,164,144,199,227,101,149, 69,180, 72, - 77, 53, 59,125,176,223,181,231, 91, 77, 63, 15,191,242,104, 85, 89,183,226, 19,106, 13, 95, 33,122,191, 95,247, 47,126, 59,116, -180,162, 81,135,255,184,115,254,255, 79,179, 43,207,214,171,112, 44,199,198, 97, 81,207, 0,157,166, 48, 59,107,202,213,123, 5, - 55, 1, 40, 95,101, 61, 5, 2,193,104,163,209, 40, 22, 8, 4, 90,163,209,184,235,239,178,237, 98,247,128,113, 28, 16,171,103, -166, 96,193, 68, 62, 55,104,229,223,114, 46,113,131,130,130, 58, 11, 4, 2, 95,139,197, 34, 49, 24, 12, 26,173, 86,155,146,154, -154,250, 7, 42,159,248,252,141,174,167,212,221,127,165, 64, 32,252, 20, 0,140, 70,253,106,117,126,194,231, 85,253, 99, 21,159, -255, 71, 31, 35,215,122,173, 18,120, 92,190, 27,202, 10,115,179,102,115, 65, 94,242,109,255,255,225,122, 82, 94,242,224, 82, 77, -170, 73, 53,169,230,243,112,232,254,164,154,255, 75, 77,145, 87, 99, 31,145, 87, 99,171,139, 46, 87,242,121,186, 63, 41,229, 76, -172,224, 5,192,138,130,165, 20, 10,133,242, 6, 96,233, 46,160,252, 47,209,229,196,101,188,201,207, 83,254,115, 84,154, 19,205, - 84,225, 74,107, 18, 18,124, 25,103,123,158,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,234,180,255,137, 93,146, 19, -159, 91, 62, 9,224,255, 37,225,159,134, 85,169, 38,213,164,154, 84,147,106, 82, 77,170,249, 95,227,137,241,226,208,125, 65,161, - 80, 40, 20, 10,133,242,102,160, 57, 90, 20, 10,133, 66,161, 80, 40,175, 70, 69, 93,135,212,104, 81, 40, 20, 10,133, 66,161,188, - 6, 42, 77,134,167, 93,135, 20, 10,133, 66,161, 80, 40,175, 70,121, 68,203, 11,207,149,119,160, 70,139, 66,161, 80, 40, 20, 10, -229,245,144,131,138,162, 91, 39, 78,156, 32, 21,253, 78,161, 80, 40, 20, 10,133,242,255,193, 63,220,139, 60, 29,201,154, 88,182, - 12,224,169,136, 22, 53, 88, 20, 10,133, 66,161, 80,254, 46,102,235, 31, 70,121, 36,171,252,149,243,130,209, 26, 48, 96, 0, 67, -205, 22,133, 66,161, 80, 40,148,255, 21,255, 70, 47,194,121,126, 3,233, 97,166, 80, 40, 20, 10,133,242,191, 52, 91,255,166,237, -161,229, 29, 40, 20, 10,133, 66,161, 80, 94, 13, 47, 0,253,159, 90,254,127,155,130,135, 66,161, 80, 40, 20, 10,229,223,206,196, -202,150,105, 68,139, 66,161, 80, 40, 20, 10,229,245,155, 45, 10,133, 66,161, 80, 40, 20,202, 63, 25, 58,179, 57,213,164,154, 84, -147,106, 82, 77,170, 73, 53,255,237,148,215,209, 2, 42,171,163, 69,161, 80, 40, 20, 10,133, 66,121, 41,250,163,180,126,214,196, -178,159,253,169,209,162, 80, 40, 20, 10,133, 66,121,189,188, 48,253, 14, 53, 90, 20, 10,133, 66,161, 80, 40,175,215, 96,109,162, - 70,139, 66,161, 80, 40, 20, 10,229, 13, 67,141, 22,133, 66,161, 80, 40, 20,202, 27,130, 65,229, 35, 7,206,215, 64,231,101, 70, - 31,156,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 58,237,243,248,231, 81, 94, 25,254, 36,254, 74,132,223,244, -255,241,197,116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,237, 76,124,238,231, 19,104,215, 33,133, 66,161, 80, 40, - 20,202,235, 53, 91,116, 10, 30, 10,133, 66,161, 80, 40,148,215, 68,165,221,132, 52,162, 69,161, 80, 40, 20, 10,133,242,106, 84, - 58,169, 52, 53, 90, 20, 10,133, 66,161, 80, 40,111,198,112, 81,163, 69,161, 80, 40, 20, 10,133,242, 26, 77,214,196, 10,255,122, -226,196, 9, 66,247, 17,133, 66,161, 80, 40,148,255, 21,255, 90, 47, 82,190, 97,212,108, 81, 40, 20, 10,133, 66,161, 94,164,198, -120,225,175,209,134, 19,203,150, 1,208, 81,135, 20, 10,133, 66,161, 80, 40,175, 74,127, 60, 59,242,112, 98,249, 50, 53, 90, 20, - 10,133, 66,161, 80, 40,175,206,196, 42,255, 74,187, 13, 41, 20, 10,133, 66,161,252, 47,249, 55,122, 17,134, 30, 86, 10,133, 66, -161, 80, 40,148, 87,162,162,104,214, 38,186, 91, 40, 20, 10,133, 66,161, 80,222,172,225,162, 80, 40, 20, 10,133, 66,161,188, 9, -147,245,166, 11,150,210,153,205,169, 38,213,164,154, 84,147,106, 82, 77,170,249, 95, 49, 89, 79,151,120, 0, 64, 71, 29, 82, 40, - 20, 10,133, 66,161,188, 42,116, 82,105, 10,133, 66,161, 80, 40,148, 55, 4,157, 84,154, 66,161, 80, 40, 20, 10,229,255,217,112, - 81,163, 69,161, 80, 40, 20, 10,133,242, 26, 77,214, 51,102,139,230,104, 81, 40, 20, 10,133, 66,161,188, 26,149,230,104, 49,168, -124,228,192,249, 26,124,193,203,140, 62, 56, 79, 53,169, 38,213,164,154, 84,147,106, 82,205,255,156,102,117,218,231,241,207,103, - 34,254,159, 10,150,210,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,175, 65,203, 59, 80, 40, 20, 10,133, 66,161,188, -110, 99,245, 60,212,104, 81, 40, 20, 10,133, 66,161,188, 26,180,142, 22,133, 66,161, 80, 40, 20,202, 27,194, 11,165, 81,173,242, -159, 33,212,104, 81, 40, 20, 10,133, 66,161,188, 30,250,163, 52,170, 85,254,147, 26, 45, 10,133, 66,161, 80, 40,148,215, 72,133, -117,180, 24, 0, 56,113,226, 4, 41, 91,238, 54, 96,192,128,203,116, 95, 81, 40, 20, 10,133, 66,249,255,228,223,234, 69,158, 68, -180, 6, 12, 24,192, 0,136,160,135,154, 66,161, 80, 40, 20,202,255,130,127,163, 23,225, 60,231, 36,187,209,195, 76,161, 80, 40, - 20, 10,229,127,193,191,209,139,240,158,115,145, 20, 10,133, 66,161, 80, 40,255, 19,254,193, 94,196, 11,165,137,240, 39,203,126, - 2,101, 37, 31,104, 29, 45, 10,133, 66,161, 80, 40,148, 87,163,124,180,225, 11, 83,239,208, 40, 22,133, 66,161, 80, 40, 20,202, -171, 81, 81,101,248, 77,116,183, 80, 40, 20, 10,133, 66,161,188, 65,104, 68,139, 66,161, 80, 40, 20, 10,229,213,121, 58,170,245, -255, 22,205,162, 51,155, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243,191,100,178,158, 89,166,149,225, 41, 20, 10,133, 66,161, - 80,222, 16,116,212, 33,133, 66,161, 80, 40, 20,202,171, 81, 62,226,240,233,101,106,180, 40, 20, 10,133, 66,161, 80, 94,163,217, -122, 1,218,117, 72,161, 80, 40, 20, 10,133,242,106, 76,172,236, 15,212,104, 81, 40, 20, 10,133, 66,161,188, 33,195,197,160,242, -145, 3,231,107, 32,252, 50,163, 15,206, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,157,246,121,252,243,248,159, - 21, 44,165, 67, 95,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,133,118, 29, 82, 40, 20, 10,133, 66,161,252, 13,140,150, - 27,143,199,251, 90, 44, 22,111, 16,139,197,191,240,120,188,159, 0, 56,213,244, 11,165, 82,233, 52, 79, 79,207,135,158,158,158, -153,190,190,190,167,236,236, 36,159, 53, 16,162, 11, 0,254,107,218,158, 0, 0,159,137,197,226, 56,145, 72,148, 10, 96, 39,128, -207, 0,184,190,138,240, 66,111, 12,187,255,233,224, 35, 11,189, 49,236,185, 63,245,247,240,240,184, 10,160,247,235, 58, 40, 35, - 36,232, 53, 92,138,244,225, 82,164,143,144,188,252, 83,131,157,157,221,251, 94, 94, 94, 55, 92, 92, 92,178,188,188,188,174,139, - 68,162,225, 53,148,112,247,240,240,248,209,199,199, 39,222,219,219,123, 21, 74,103, 39,255,219,210, 89,136,206,237,132, 40,104, -111, 3,101, 71, 27,108,104,111,131,183,222, 2, 36, 47, 41,215, 9,192, 1,123,123,251, 59, 60, 30,239, 4,128,161,101,231,215, - 80, 30,143,119,194,222,222,254, 14,128, 3,101,159,123,153,243,244, 71, 0, 89, 0,190, 47, 91,254,196,199,199, 71, 25, 28, 28, -156, 26, 28, 28,252,171,159,159,223, 24,107,197, 36, 18,201, 91, 62, 62, 62, 7,125,125,125, 83,219,183,111, 95, 92,171, 86,173, - 71,181,107,215,222, 46, 20, 10,187,209, 38,142, 66,161, 80,254,254, 12, 4,176, 4,192,218,152,152,152, 40, 66, 72, 20, 33, 36, - 42, 38, 38, 38, 10,192, 6, 0, 75, 81,121, 8,241,153,247, 93, 92, 92, 22, 44, 90,180, 72,151,147,147, 67, 10, 10, 10, 72,124, -124, 60, 89, 57,119, 38,219,199,153, 71, 26,184, 57,105,188,188,188, 18,235,212,174,189,167,169, 45,103, 38,128,134,214,104, 62, -133,147, 88, 44,190, 57,119,238, 92,213,213,171, 87, 85, 6,131, 65,197,178,172, 42, 59, 59, 91,117,254,252,121, 85,199,142, 29, - 85, 0, 62, 7,192,173,129,230, 19,190,243,198,101,178,245, 27,242,157, 55, 46, 63,253,126, 96, 96,224, 3,150,101,201,176, 97, -195,244, 0,106,213, 68,243,121,106, 1,162,166,246,112, 28,110,139, 60,243,246,133,132,172,159, 65,134, 75,145,254, 50,154,238, -238,238, 71,167, 77,155,166,200,202,202, 34,122,189,158,164,167,167,147, 73,147, 38,201,221,221,221,119, 89,185,237, 46, 65, 65, - 65,121, 55,110,220, 96,101, 50, 25,137,136,136, 96,155, 53,107,150,103,165,217,234,245,220,186,108,242,246,246, 62, 85,147,151, -187,187,251,150,154, 30,163,182, 66,164, 27,163, 46, 17,114, 59,156, 28, 27,214,158,172,108, 85,155, 12,117,182,145,117,178,193, - 39, 93, 43, 46,101, 82,153,230,187, 93,187,118, 85,223,187,119,207, 82, 84, 84, 68, 30, 60,120,192, 78,152, 48, 65, 7, 32,118, -194,132, 9,186, 7, 15, 30,176, 69, 69, 69,228,222,189,123,150,174, 93,187,170, 1,140,175,193,122,114, 0,108,155, 63,127, 62, - 33,132,144, 69,139, 22,145,224,224, 96,210,163, 71, 15,162, 82,169, 8, 33, 36,149, 16,242,171,217,108, 30,107,141,166,131,131, -195,251,211,166, 77, 83,105, 52, 26, 82, 14,203,178, 68, 38,147,145,181,107,215,170, 61, 61, 61, 79, 85,242,144, 65,187, 60,168, - 38,213,164,154,127, 55,205,127, 50, 94, 40,205,211, 42,127, 89, 29,152, 24, 57,115,230,204,114, 83,117,186, 83,167, 78,183,198, -142, 29, 27, 53,118,236,216,168, 78,157, 58, 69, 0, 56, 27, 25, 25, 25,245,213, 87, 95, 69, 1, 24, 89,205,129,112,234,208,161, -131, 44, 55, 55,151,248,251,251,147,186,117,235,146,220,220, 92, 66, 8, 33,183,223,109, 73, 46, 52, 6,201,184,114,154,132, 31, - 62, 64, 38,120,241, 72,103, 47, 7,147,151,167,103,145,171,171,235, 98, 60, 59, 39, 99, 69, 7,247,157,198,141, 27, 43, 99, 99, - 99, 85, 9, 9, 9,170, 5, 11, 22,168,122,244,232,161, 10, 10, 10, 82, 13, 29, 58, 84,181,102,205, 26,149,209,104, 84,109,217, -178, 69,101,111,111, 31, 91,129,217,122,105,163,197,227,241, 86,199,196,196,144,196,196, 68, 82, 22,165,168, 76,211,193,209,209, -177,175,147,147,211,231,142,142,142,125, 1, 56, 0,128, 63, 96,219,220, 1,190,159, 52,111, 16,120, 98,100,175,134,107,123,181, -110, 57,220,142, 35, 51,173,155, 65,200, 48,223,151, 50, 90, 14, 14, 14,239,127,246,217,103, 74,189, 94, 79, 52, 26, 13, 81,169, - 84, 68,163,209, 16,165, 82, 73, 70,142, 28,169, 16,137, 68,239, 84,167,233,234,234,186,240,202,149, 43,230,220,220, 92,114,229, -202, 21,114,234,212, 41,178,126,253,122,214,221,221,125, 69, 77, 47, 64, 79, 79,207,115,225,225,225, 81,209,209,209, 81, 55,111, -222,140, 50,153, 76, 81, 70,163, 49,202,104, 52, 70,157, 56,113, 34,234,208,161, 67, 81,123,247,238,141, 50, 24, 12, 81, 6,131, - 33, 74,175,215, 71,213,175, 95,255, 76, 77,143, 81, 27, 33, 50, 12, 87,143, 17,178,226, 99, 34,255, 97, 10,145, 77,239, 71,242, - 39,117, 33, 27, 90,215, 38, 93,196, 56,142, 23,231,246,172, 80,147,207,231, 95, 78, 77, 77,101,103,207,158,109,104,210,164,137, -252,195, 15, 63,212,233,245,122, 66, 8, 33,122,189,158,124,248,225,135,186, 38, 77,154,200,103,207,158,109, 72, 73, 73, 97,121, - 60,222,249, 26,172,231,210,114,147,117,249,242,101,242, 52, 42,149,138,244,232,209, 35, 53, 56, 56,248,215,122,245,234,141,170, - 78,211,214,214,118,240,172, 89,179, 84,164, 2, 76, 38, 19, 81, 42,149, 36, 37, 37,133,173, 91,183,110, 54, 0, 23,218,152, 83, - 77,170, 73, 53,169,209,122, 99, 76,172,102,185,226,157,248,213, 87, 95, 69, 17, 66,162,230,204,153, 19, 85, 22,217, 18, 0,176, - 45,123,241, 0,140,152, 53,107, 86, 20, 33, 36,106,230,204,153,229,159,169,236, 64, 12,220,191,127,191,113,213,170, 85,196,195, -195,131,120,122,122,146,213,171, 87, 19,150,101, 73,238,137, 93,228, 66, 99,144,184,175,195, 8, 33,132,196, 47,158, 74, 46, 52, - 6, 73,218,248, 29, 25, 61,122,180, 70, 34,145,140,172,226,224, 58,183,108,217, 82,169,213,106, 85,219,183,111, 87, 73, 36,146, -219, 0,154,160,180, 43,146, 41, 91,215, 49, 77,154, 52, 81,220,191,127, 95,181,123,247,110, 21,128, 5, 86,158, 48, 13, 1,116, -151, 74,165, 67,103,213,226, 39,144,173,223,144, 89, 30,184, 7,160, 25, 0,183,178,207,120,207,156, 57,147, 16, 66,136,143,143, -207,149, 74, 52, 29,130,130,130,102, 38, 36, 36,204, 51,153, 76,243,162,163,163,231, 53,106,212,104,246,160,250, 94,237,143,140, -124, 43, 68,254,221,148, 16,178,124,122,208, 79,111,183,233,181, 39,180,219,200, 15,234,185, 94,253,208, 93,164,121,207,129,171, -124,174,235,208,170, 19,187, 86,173, 90, 55,211,211,211,159,152, 43,165, 82, 73,178,178,178, 72,114,114, 50,185,122,245, 42,241, -242,242,186, 80,157,166,167,167,231,131,244,244,116,178,113,229, 74, 50,172, 89, 32,233,226,104, 71,186, 58,217,145, 86,182, 34, -117, 99,160, 85, 77,141,214,157, 59,119,162, 0, 68, 1,136, 42, 42, 42,138, 42, 42, 42,138, 42, 41, 41,121,242, 30,128, 40,185, - 92, 30, 37,151,203,163, 12, 6, 67, 84,131, 6, 13,106,108,180, 58,138,208,177,173, 8,197,237,133,208, 14,172,229,154, 61,165, -190,171,229,207,145,237, 73,201,199, 61,200,170,144, 90,164,147, 13, 62,177, 82,115,160,141,141, 77, 4,128, 25,101,166, 60,172, -111,223,190, 26, 66, 8,233,219,183,175, 6, 64, 88,217,251,159,149,153,172,190, 86,174, 39,199,207,207, 79, 93, 30,201, 2,240, -135,159,159,159, 58, 56, 56,152, 4, 7, 7, 19, 31, 31, 31,101,153,182, 85, 13, 90,195,134, 13,227,181, 90,237, 19, 3, 40,147, -201, 72,118,118, 54, 73, 74, 74, 34,177,177,177,228,246,237,219, 36, 53, 53,149,236,219,183,207,226,232,232,120,146, 54,230, 84, -147,106, 82, 77,106,180,222,168,209,122,254,245, 44, 39, 78,156, 32,207,189,245, 67,100,100,100,212,172, 89,179,162,170,113,102, - 19,231,204,153, 83, 30,245, 90, 82,197,205,127, 75,124,124, 60, 9, 11, 11, 35, 1, 1, 1, 36, 32, 32,128,140, 29, 59,150,200, -229,114,162,122,124,159, 92,104, 12,114,251,189, 86,132, 16, 66,148,113,209,228, 66, 99,144,168,209, 29,200,221,187,119, 73,237, -218,181,195,171,248,254,227,215,175, 95, 47,216,181,107, 87, 46, 74,243,177,248, 0,218, 1, 88, 45, 22,139,183,161,180,187,176, - 46, 0, 39,127,127,255, 98,141, 70,163, 26, 54,108,152, 10,128,111, 21,154, 93, 3, 2, 2, 18,183,108,217, 66,242,243,243, 73, -113,113, 49, 89,214,177, 17, 33, 91,191, 33,139, 90,213,101, 55,110,220,168,159, 49, 99,134,218,217,217,249, 4, 0,239, 97,195, -134,153, 9, 33,164, 75,151, 46,121, 21,137, 57, 58, 58,246, 77, 72, 72,152,167,211,233,230,201,100,178,121,197,197,197,243,142, - 29, 57, 50,175, 79,179, 70, 97,242,239,166,132, 28, 25,249, 86,200,219,181,156,134,174,232,221,122,114,214,236,241,195,230,116, -104, 18,167, 91,250,233,165,119,235,123,252,248, 50, 71,219,205,205, 45, 71,175,215, 19, 0, 47,188, 18, 19, 19,137,139,139, 75, -122,117, 26,206,206,206,115, 62, 27, 17,106,121,167,110, 45,146,184,106, 46, 49,157,219, 77, 76,167,182,147,199, 63, 76, 39,131, - 60, 93, 21,237, 4,156, 89,214,174,143,167,167,231,185,155, 55,111, 62, 99,180, 74, 74, 74, 42, 52, 90, 10,133, 34,202, 96, 48, - 68,249,249,249,157,121,213,179,190,157, 13, 26,116, 21,115,111, 71,135,117, 38, 5, 83,122,144,190, 14,252,212, 87,144, 27, 1, - 32, 2,192,232, 26,254, 31, 7,192,210,114, 67,245,195, 15, 63, 16, 66, 8,241,243,243, 83,227,213, 6,163, 56, 4, 6, 6, 38, -143, 31, 63,222,220,184,113,227,252,142, 29, 59,202,110,221,186, 69, 46, 95,190, 76, 78,157, 58, 69, 14, 28, 56, 64,238,223,191, - 79,178,178,178, 72,124,124, 60,233,223,191,191, 12, 64, 87,218, 22, 82, 40,148,191, 51, 21,120,145,127, 60,156,242, 13, 27, 48, - 96, 0,243,212, 6, 58, 0, 16,181,106,213,170, 96,233,210,165,203, 81, 90, 11,130, 9,226,226,221, 30, 98,222,221, 30, 98,222, -221, 32, 46,222, 45,139, 24,109, 90,188,120,241,194,224,224,224, 28, 0, 98, 0,158, 21,125, 17, 33,164,179,139,139, 11,210,211, -211,225,224,224, 0, 7, 7, 7,164,167,167,131, 16, 2, 51, 1, 76, 4,208, 27,141,208,106,181,208,177, 4, 90, 22, 80,168, 84, -240,244,244,132,209,104,108, 80,201,250, 55,127,239,189,247, 26, 4, 5, 5, 21,124,245,213, 87,217, 40,205,149,217, 54,110,220, -184,115,127,252,241, 71,144, 74,165, 42,142,141,141,213, 53,107,214,172, 47, 0,207,132,132,132,247,215,174, 93,139,176,176, 48, - 84,113,211,105,214,191,127,255, 83,247,239,223,111, 48,122,244,104, 68, 68, 68, 96,217,178,101, 40, 44, 44, 36, 0,160,215,235, -137,197, 98, 49,118,232,208,193,184,106,213,170, 54, 93,186,116,185, 89,191,126,125, 46, 0, 36, 39, 39, 63,174, 72,144, 97,152, - 70,117,234,212,129, 94,175, 71, 65, 65, 1,238,223,191, 15, 59, 7, 7,196,100, 23,122,116, 91,177,177,232,235, 35,231,248, 35, -218, 4, 57,127,254, 86, 71,253,247,225, 17,254, 77,188, 61, 60, 12, 70,147,103,124, 78, 94,246,203, 28, 84,129, 64,144, 94, 88, - 88, 8,131,193, 0,173, 86, 11,133, 66,129,162,162, 34, 20, 22, 22, 34, 59, 59, 27, 2,129, 32,177, 58, 13,251,226,226, 43,201, -215, 47, 51,251,126,254, 1, 13,204,197,224, 29, 92, 13,222,209, 13,104,104, 40,192, 47,115, 39,217, 25, 92,220,230,219,219,217, -149, 56, 58, 58,110, 2,224, 87,157, 94, 72, 72, 8,138,138,138, 80, 84, 84, 4, 23, 23, 23, 56, 57, 57,193,201,201, 9, 50,153, - 12,114,185, 28, 10,133, 2,254,254,254,104,222,188, 57,118,236,216,241, 90, 78,238, 63, 13, 72, 50,195, 50,229,220,163,108, 8, -164, 82,212,119,178,173,211,218, 22,206, 85,252, 75, 15, 62,159,191,223,217,217, 57, 28,192,199, 0,164, 0, 62,118,118,118, 14, -231,243,249, 67, 0, 44, 2,176,171,134,171,241,253,252,249,243,103, 38, 36, 36, 72,238,222,189,139,175,190,250, 10, 11, 22, 44, -192,227,199,143,215, 1, 96,203, 62,243,145,139,139,203, 9, 14,135,179, 25, 64, 63, 0,125,189,188,188,122, 86,163, 59,100,198, -140, 25,186,150, 45, 91,198,199,197,197, 13,185,126,253,122,171,233,211,167,203,211,210,210, 16, 31, 31, 15, 47, 47, 47,248,248, -248, 64,165, 82,161,164,164, 4, 67,134, 12,113,176,183,183, 31, 73,155,113, 10,133,242,119, 54, 89,207,121,145,127, 90, 68,171, -194,229, 10,159,168, 37, 18,201,252,168,168,168,246,193,193,193, 60, 0,251, 0, 32,136,139,225, 67, 58,180,216,118,100,211, 15, -193,135, 86,205, 13,238, 19,236,191, 45,136,139,242, 81,108, 39, 90,181,106,229, 20, 21, 21,213, 65, 40, 20,126, 82,201, 74, 16, - 0,112,114,114,130,131,131, 3, 28, 29, 29,225,228,228, 4,150,101,161,210,232,160,182, 0, 74,157, 1,114,185, 28,202,178,101, -149,222, 8,181, 90,253,228,127, 43,160,219,248,241,227, 11,214,174, 93,155,159,147,147,243, 3,128,102, 97, 97, 97,131,215,172, - 89,131,139, 23, 47,234,250, 5, 52,116, 89,220,185,197,194, 38, 57,143,231, 5,240, 49, 1,192,149, 43, 87,174,160, 67,135, 14, - 96, 24, 38,180, 34, 65,177, 88,188, 97,207,158, 61,226,216,216, 88, 52,108,216, 48, 54, 52, 52,244,221, 31,126,248,161,129, 84, - 85,124, 13, 0,204, 69,185,177, 83,167, 78,253,102,241,226,197, 5, 5, 5, 5, 70,141, 70,227, 62,104,208, 32,164,167,167, 35, - 43, 43,235,143, 74, 76,102,124,116,116, 52,145,203,229, 72, 74, 74, 66,116,116,180,248,155,111,190,105, 99,225,112, 6,103,194, -238,131,176,142,173,218,140,110,215, 2,187,110,220, 21, 92,125,148,236,216,170,110, 45,167, 59, 25, 57,245, 76, 12, 18, 95,230, -104, 43,149,202,213, 11, 23, 46, 84,169, 84, 42,100,102,102,226,222,189,123,136,139,139, 67,106,106, 42,150, 45, 91,166, 42, 46, - 46, 94, 83,157,134,183,136,247,197,143,211,199, 49,188, 7,127, 0,119, 47, 3, 26, 37,160, 85, 65,255, 48, 10,191, 62,204,197, -250,131,135,109,210,210,211, 29,247,238,221, 59,222,215,215, 55, 10,128,127, 85,122,132,148, 30, 66, 14,135,243,188, 9, 5,135, -195, 81, 2,200,149, 74,165, 25,118,118,118, 25, 28, 14, 39,151, 16,162,126, 45, 79, 18,102, 24,193,229, 2, 54, 98,112,248, 85, - 78,237,249,110,104,104,232,158,140,140,140, 62, 73, 73, 73,237,215,172, 89,179, 80, 36, 18,197,172, 89,179,102, 97, 82, 82, 82, -251,140,140,140, 62,161,161,161,123, 0,140,169,201,247,251,249,249, 77,157, 55,111, 30,150, 45, 91,134,230,205,155,195,223,223, - 95, 51,127,254,252,213, 0,230, 2,248,196,207,207,239,218,212,169, 83, 63,204,207,207,247,204,204,204,108,190,110,221,186, 73, -171, 87,175,110,157,157,157, 45,170, 70,186, 83,239,222,189,113,250,244,105, 0,200, 1,144, 84, 84, 84,100,206,206,206, 70, 96, - 96, 32,218,180,105, 3,149, 74, 5,149, 74, 5,153, 76,134, 58,117,234,128,101,217,246,180, 41,167, 80, 40,148,255, 87,195, 85, -177,209, 18,137, 68, 78, 33, 33, 33,168, 95,191,190, 19,202, 70,107,185,216,240,102,127, 62,126,132,196, 54,234, 12,152,232, 11, - 8,237,220, 84,226, 98,195,155, 93,246, 47,188, 58,117,234, 8, 67, 66, 66, 32,149, 74,107, 85,242,229, 17,185,185,185, 8, 9, - 9,129,163,163, 35, 28, 28, 28, 16, 18, 18, 2,163,209, 8,185, 82, 9,181, 5,208,152, 88,200,229,114, 20, 23,228, 65, 99, 1, -204,118, 46, 72, 77, 77, 5,151,203, 77,174, 68,211,171, 97,195,134, 5, 49, 49, 49, 5, 0,174, 0,152,188, 96,193, 2,204,154, - 53, 11,223,126,251,237, 30, 73, 78, 74,239, 61,167,143,186,252, 62,255, 35, 55,127, 27,102, 4, 0, 99, 70, 70, 6, 28, 29, 29, - 33,149, 74, 43, 52, 6, 93,186,116,105, 41,149, 74,177,125,251,118,146,153,153,217, 17,165, 67,248,147, 25,166,212,236,137, 57, -144, 3, 88, 29, 21, 21,213,246,155,111,190,121,212,171, 87, 47,126,187,118,237,176,104,209, 34, 0, 56, 81,145,166, 76, 38,251, -115,204,152, 49,134, 75,151, 46,225,225,195,135,210, 35, 71,142, 12, 95,180,104, 81,211,180,180, 52,225,241, 83,103,222,222,153, -161, 24,254, 67,248, 85,209,226,179, 17,127,186,218, 75,155,212,115,117, 70,116, 90,150,192,194,197,173,234,142,104, 91, 62,119, -124, 55, 17, 47,186,179,144,147,211, 77,196,139,106,205,231,142, 83, 42,149,123,143, 29, 59,118,118,250,244,233,170,252,252,124, -216,217,217,161,168,168, 8,223,127,255,189, 42, 58, 58,250,160,193, 96, 56, 94,157,174,133, 37, 45,125,234,250, 2,137, 49, 79, -222, 51,178, 4,183, 12, 2, 12,152,252, 41, 2, 2, 3, 97, 48, 24,208,172, 89, 51,102,193,130, 5, 82, 7, 7,135, 47,171, 53, - 61,156, 23, 78, 55, 51,195, 48,185,132,144, 44,149, 74,149, 41, 22,139,211, 4, 2, 65, 90,113,113,113, 38, 33, 36,239,117,248, - 44,194,193, 23, 29,154,249, 1, 66, 49,210,138, 84,217,183, 85, 40,174,232,131,118,118,118,227,214,175, 95, 47,218,186,117,171, -105,234,212,169,250, 73,147, 38,241,181, 90,173,251,164, 73,147,248, 83,167, 78,213,111,221,186,213,180,126,253,122,145,173,173, -237,208,151, 89, 17,147,201,132,152,152,152, 31, 30, 63,126, 44, 69,105,185,145, 79,231,207,159, 31,150,144,144, 32, 90,187,118, - 45, 14, 28, 56,128, 3, 7, 14, 96,240,224,193,152, 54,109, 26,230,205,155, 87,149,156, 36, 56, 56, 56,196,197,197, 5,151, 47, - 95,206, 6,144, 6,160,165,173,173,173,221,224,193,131,209,167, 79, 31,232,116, 58, 24,141,198, 39, 70,139,203,229,194,209,209, -209,133,182,129, 20, 10,133,242,198, 77,214, 51,102,139, 7, 0,229,161,186, 1, 3, 6, 48, 85,221, 24, 45, 37,249,144,169, 53, - 72,149,107,144, 94,194, 62,243, 55,150,101,171,252,246,236,236,236,227, 55,110,220, 24, 23, 18, 18,194,203,206, 46,237, 17, 11, - 9, 9,129, 70,163, 65,246,221,155, 80,179,128,180, 97, 16,212,106, 53, 74,226,238,192, 54,184, 61, 92,250,143,198,138,181,107, -245, 69, 69, 69, 63, 87,164,105, 99, 99,195,175, 93,187,118, 65,114,114,178, 25, 64,177,131,131, 67,111, 95, 95, 95, 68, 68, 68, - 0,192, 46, 2,252,136,232, 75,192,229, 67, 32,165, 33, 21,219, 58,117,234, 32, 63, 63, 31, 42,149, 42,162, 34,205, 27, 55,110, - 36,152, 76,166,102,131, 6, 13, 98,126,251,237,183,125, 10,133,226, 91, 0,247,244, 44,184,119, 51,242,160,182, 64, 4,224, 45, - 39, 39,167,207,230,205,155,215,115,234,212,169, 56,118,236, 24,194,195,195,141, 40,205, 5,187, 81,129,172, 60, 41, 41,233,151, - 25, 51,102,180,227,112, 56,147,207,157, 59,103,246,247,247, 87, 24,141, 70, 75,163,128, 0,206,183, 11,190, 19,124, 60,121,162, - 99,145, 6, 15,250, 52,242,234,192, 48,192,131,172,252,180,199, 42, 20, 85,181, 79,187,216,112, 79, 12,233, 24,220,101, 92,232, - 64, 91,105,195, 38, 80,223,191,233,249,203,254, 83, 43,196,209, 9, 3, 46,231,231, 15, 62,118,236,216,240,136,136,136,143, 13, - 6, 67,125,161, 80,152, 40,147,201, 86,169, 84,170,106, 77, 22,151,203,237,175,247,170,237, 36, 43, 46,134,168, 44, 18,165, 48, -177, 40,212,155,241,208,209, 31, 35,107,251, 60,233, 6,205,205,205,133,167,167, 39, 99,177, 88, 6, 86,165, 25, 30, 30,142, 1, - 3, 6,148, 27, 79, 48, 12, 3,134, 97, 10, 3, 2, 2,242,132, 66, 97,145, 64, 32, 80,252,248,227,143, 58,157, 78, 7, 30,143, - 39,178, 88, 44,220, 87, 57,219,219, 72,224, 46, 36,204,134, 73,131,186,247,106,222, 36,144, 92,185,125,151, 41,209,232,126,173, - 34, 10,184,206,207,207,143, 87, 92, 92,124, 28,192, 67,147,201,244,251,190,125,251, 68,239,191,255,190,110,255,254,253,163, 0, - 52, 88,190,124,249,112,149, 74, 85,163, 41, 21, 30, 63,126,188,110,241,226,197, 51,231,204,153,131, 29, 59,118, 76,125,252,248, -241,172,178, 72,215,224,121,243,230,225,199, 31,127,196,142, 29, 59,216,135, 15, 31,158, 98, 89,246,241,244,233,211,131, 61, 60, - 60, 10,115,114,114, 30, 87, 33,219,170,111,223,190,250,107,215,174,217, 40,149,202,171, 0, 62,155, 50,101,202,248,182,109,219, - 42, 66, 67, 67,109,139,139,139,101, 18,137,196,102,203,150, 45, 78, 60, 30, 15,106,181, 26, 12,195, 64,169, 84, 26,104, 59, 72, -161, 80,254,174, 84,230, 69,254, 33, 84,122,111,224, 85,180,129, 26,141, 38, 47, 61, 61, 61, 48, 43, 43,203, 12,192, 12, 0, 69, - 6,243,146,197, 91, 14,109, 29,218,206, 79,154, 99, 50,225,200,237, 88, 77,145,193, 92,158,252,110,206,202,202, 82,166,165,165, -217,105,181, 90, 85, 37,223,245,199,134, 13, 27,180,151, 46, 93,178, 75, 74, 74,130,197, 98, 65,203,150, 45, 17, 31, 31,143,146, -135, 49,144, 6,182,132,180,235, 0,196, 70,221, 70,116,248,121,164,168, 12,230, 71,115, 23,203, 85,106,245, 60,163,209,120,164, - 34, 65, 62,159, 95, 12,128, 16, 66, 44, 0,160, 80, 40,238,169, 84,170,206, 30, 30, 30,120,240,224,129, 84,109,193,180,225,179, - 87,172, 33,132, 88, 4,165,163,185, 62, 15, 13, 13, 69,100,100, 36, 0, 68, 86,164,169, 80, 40,166, 78,152, 48,225,210,246,237, -219,121, 73, 73, 73,125,182,110,221,218,231,209,163, 71,132, 41, 78,183, 92,211,240,209, 32,108, 90,235,141,117, 2,194, 7, 12, - 24, 0, 47, 47, 47,108,217,178, 5,171, 86,173, 50,125,244,209, 71, 9,171, 86,173,106,157,159,159,255,123, 37,219, 47,151,201, -100,103, 92, 92, 92, 62,110,218,180,169, 82,173, 86,163,168,168, 8,217,217,217,112,118,113,225,152,193,233,224,230,232,248,251, -241, 92,165,148,119,230, 79,220,204,204,169, 50,154,213,142,207, 29, 51,180, 75,139, 46,159,204,153,109,139,107, 71,192, 76,152, - 7,178,117, 33, 62, 29, 59,220, 78,167,255,189,171,250,110,234,251, 81, 10,197, 78,133, 66,113,160,134, 39, 75,223, 14, 29, 58, -236, 89,188,120,177,248,235,101,139,177, 60,176, 22,204, 69, 69, 40,208, 91, 80,168, 55, 67, 81,242, 16, 15, 30,196,194,197,197, - 21, 41, 41, 41,208,233,116,136,139,139, 35, 92, 46,247,120,117, 17,157,114,158,234, 46,148, 9,133,194, 34, 62,159,159,199,227, -241,138,147,146,146,212, 58,157, 14, 28, 14, 71,106,177, 88,196, 86,172,107,109, 87, 87,215,233, 40, 45, 38,122, 76, 89, 88,184, - 58,132, 15, 71,240,208,173,142,171,203,219,115, 39,189,239,234,235,237, 46, 75, 74, 72, 52,253,124,246,122,161, 78, 95,249, 96, - 13, 0, 39,138,139,139,159, 68, 36,247,239,223,255,233,254,253,251,199, 3,216,134,210,121,183,206,203,100,178,141, 47,113,241, -205, 61,120,240,224,204, 57,115,230, 64, 44, 22, 63, 41,158, 42, 22,139, 69, 0,176,123,247,110, 60,120,240,160, 45,202,242,181, - 88,150,221,147,147,147, 83,157,102,131,160,160,160,164, 67,135, 14,217, 0,240,158, 50,101, 74,251, 53,107,214, 96,236,216,177, - 5,177,177,177,237, 0, 36, 3,104, 48,121,242,228, 91, 59,118,236,112, 98, 89, 22, 37, 37, 37, 48, 24, 12,201,180, 41,167, 80, - 40,212,108,189, 17, 66, 0, 68,163,180,126, 86,127, 0, 39, 81,154,214, 81, 41, 62,101,238,236, 44,128, 65,229,247,199, 74,146, -225,129,210, 17, 89,103, 0,108, 6,224, 81,153,168,139,139,203,151, 97, 97, 97,166,204,204, 76,146,155,155, 75, 14, 28, 56, 64, - 62, 31, 23,102,121,171,161, 55,219,208,219, 67,237,230,230, 22,239,229,234,252,107, 11, 9, 62, 7, 80,219,138, 13, 11,123,244, -232,209,196,176,176,176,113,101,223, 59,110,207,158, 61,170,115,231,206,169,184, 92,238, 9,148,150,118, 40, 55,148, 99, 6, 14, - 28,168,210,235,245,170,128,128,128, 98,148, 38,238, 87,198,240,110,221,186,149,156, 62,125,154, 88, 44,150, 23,106, 20, 21, 20, - 20,144,240,240,112,210,177, 99, 71, 25,128,247,123,246,236, 25,113,253,250,245,136, 78,157, 58, 29,172,110,133, 93, 93, 93,103, -223,189,123, 55, 50, 53, 53, 53,234,228,201,147, 81,191,255,254,123,212,228,201,147,239, 5, 7, 7,107, 19, 18, 18, 88,179,217, - 76,238,222,185, 67, 2, 26, 53, 82, 3,168, 83,153, 78, 15, 49,239,150, 98,203, 66,162, 91, 52,150,232,134,248, 16, 0, 68,185, -226, 75,146, 55,181, 23,137,255,248,109,210, 93,196,189,241, 50,103,138,179,179,243,217,200,200, 72,162, 84, 42,201,253,251,247, -201,152, 1,125,200,141,241,189,200,153, 62,126,100, 71,215,122,100, 69,239, 96,210,167,107,103,178, 97,195, 6,114,232,208, 33, - 50,123,246,108,214,213,213, 85,137, 42,114,180, 60, 61, 61,207,237,219,183, 47, 10, 64, 20,151,203,141, 82, 40, 20, 81, 74,165, -242,120, 70, 70,198,250,128,128,128,153, 77,155, 54, 29, 21, 24, 24,216,163,123,189, 58, 51,123,218, 9,227,123,217,139, 18, 27, -217, 74, 86,224,197,186, 87, 79,112, 0,234, 52,108,208, 64,121,249,242,101, 86,175,215,147,171, 87,175,178,141, 27,249,235,150, -191,215,247, 96,202,150,165, 7,117,167,127, 59,171, 57,186,233,250,254, 15, 6,196,116,147,112,126,107, 47,125, 82,142,227,101, - 25, 1,224, 8,254, 26,117, 24, 6,224, 40,170, 30,133,200, 1,176,109,209,162, 69, 79,143, 52, 4, 0, 78,112,112,112, 20, 33, - 36, 42, 56, 56, 56,170,166, 43, 34,145, 72,166, 31, 59,118,108,190,175,175,239,178,208,208,208, 45, 50,153,236,228,168, 81,163, - 98, 80, 58, 24,132, 65,233,236, 8, 3,107,215,174, 93, 16, 29, 29, 77, 34, 34, 34,200,176, 97,195,148, 2,129, 96, 52,109,198, - 41, 20, 10,229,141, 48,177,146,159, 85,178, 56, 38, 38,166,188,134,214,148,170,196,103,205,154, 21, 21, 25, 25, 25,133,210, 42, -241, 85,194,227,241, 14,127,244,209, 71,196,195,195, 67,229,238,238,126,152,207,229,142,247, 17, 35, 4, 47, 55,212,189,243,206, -157, 59, 7,175, 91,183,174, 63,128,182, 0,248,181,106,213,202,206,205,205, 85, 93,191,126, 93,213,177, 99, 71,149,171,171,107, -126, 80, 80,144,106,249,242,229, 42,147,201,164,154, 62,125,186, 10, 47,214,251,170, 8, 17,128,143,109,108,108, 14, 55,110,220, - 56,102,238,160, 30,166,101,211,198,147, 48, 63, 55, 21,128,117, 0, 62, 2,224, 8,128, 63,124,248,240, 11,113,113,113,103,131, -130,130,126,177, 66,215,187,105,211,166, 23,247,236,217, 19,121,232,208,161,168, 47,191,252, 50,210,197,197, 37, 51, 33, 33,129, -213,233,116,164,164,164,132,200,100, 50,114,242,228, 73,139,179,179,243,218, 74, 55, 92,200,205, 33,225,187, 42, 44,225,144, 49, -103, 52,233,104,195,201,122,153, 51, 69, 42,149, 22, 23, 21, 21,145,220,220, 92,146,148,148, 68, 14, 30, 60, 72,250,118,104, 67, -246, 78, 30, 74,118,141, 27, 76,126,236,219,134,180,181, 19,169, 61,237,108, 35,237,236,236,242,173, 25,117,232,233,233,121, 78, -175,215, 63, 41,223, 80,187,118,237,168,128,128,128, 67, 65, 65, 65, 43,142, 29, 59,246,233,202,149, 43, 7,119,175, 87,103,230, -247,125, 58,104, 53,231,247, 19,229,190,117,100, 86, 75,127, 93,153,153,175,144, 90, 46,206, 59, 47, 71, 68,176,229,230,215,108, - 54,147, 35,135, 15,147,247,222,126, 43, 70,126,102,247,230,171,243,166,238,153,222,210,255, 72, 71, 17, 70, 84,101,216,158, 60, -138,216,194,165,139, 61,103,125, 63, 95,231,156,206, 14,156,117,237,236,158,153, 94,234, 61,127,127,255, 36, 66, 72, 78, 96, 96, - 96, 18,128, 93,129,129,129, 79, 47,127, 80,137,236,147,226,164,243,231,207, 39,101,215, 7, 7,192,183,139, 23, 47,142, 34,132, - 68,249,249,249, 93, 3,128,230, 82,184,118,117,224,108, 30,212,192,163,168,171, 3,103,115,115,105,197, 83, 70,213, 17,160, 81, -103, 55,201,213,193,126, 94,202,110,181, 28,174,236,250,117,235,178,126,253,250,109, 1,176, 22,192, 66, 23, 23,151,171, 35, 70, -140,120,176, 99,199,142, 7,203,151, 47, 55,254, 31,123, 87, 30,214,196,181,190,223,153, 76,246, 4,194, 26,194,174,178,168, 32, -168,184,111,184,224, 46,238,104,221,171,117,185, 86,175,214,214,218,186, 20,193,170, 85, 91,107,181,181, 85,107, 69, 69, 91, 20, -113, 41,238,168, 21,173,187, 40,130,130, 32, 59,178,132, 45, 4, 66,246,100,126,127, 40, 92,106, 89,130,109,127,183,246,230,125, -158, 60,132,228,204,155,115,102,206,153,121,207,119,190,243,125,105,105,105,244,156, 57,115, 20, 28, 14,231, 83,243,125,208, 12, - 51,204, 48,227, 47, 67,109,100,120,199,150, 8,173,209, 31,125,244,209,125,154,166,107, 99,105,205,104,160,204,152,213,171, 87, -223,167,105,186, 54, 58,252,171, 1,204, 26, 10,104, 22,182,115,231, 78,154,195,225,124,255,154,141,169,207, 41, 25, 55,110, 92, - 79,185, 92,222,205,193,193,161,219, 75,203,149,171,157,157, 93,198,225,195,135,171,149, 74,101, 53, 77,211,213,122,189,190,250, -222,189,123,213, 3, 6, 12,168,174, 55,235,111,174,158,191,193, 42, 9,174,223, 93,243, 14,189, 74,130,235,175,124, 53,125,223, -190,125,103, 51, 51, 51,127,182,180,180, 92, 97, 34,167,171,189,189,125,168,141,141,205,121, 59, 59,187, 85, 54, 54, 54,133, 90, -173,150,174,168,168,160,159, 62,125, 74,255,242,203, 47,244,205,155, 55,105, 27, 27,155,252,198,234, 25,196,163,110, 85,108, 89, - 68, 27,247,109,160, 53, 59, 86,210, 0,104,217,182,143,233,210,111,195,233,187,243,134,209, 3,184,140, 27,175,113, 62, 97,101, -101,181,231,248,241,227,198,244,244,116, 58, 54, 54,150, 62,125,250, 52,189,100,201, 18,186,173,147,163,186, 39,155, 44,238,199, -161,206,191, 78,192, 82,181, 90,125, 95, 46,151,223,175,174,174,190,239,227,227,115,191,123,155,137,145, 13, 0, 0, 32, 0, 73, - 68, 65, 84,247,238, 49, 61,123,246,252,242,232,209,163, 75, 55,110,220, 56, 54,200,130,243,180, 38,238, 40, 77,127, 56,130,166, - 23,245,165,159,205, 29, 64, 15,226, 81, 15, 27,229,116,112,200,175,141,214,174, 80, 40,232,248,248,120,250,242,229,203,180,196, -206, 78, 30,200, 99,204,239,195, 65,255, 62,150,176, 50,181,158, 3, 69,100,196,173,111, 63, 51, 40,207, 30,164,127,156, 53, 66, - 63,192,138,220, 89,175, 92, 20, 77,211,133, 19, 39, 78,204,162,105,186,240,216,177, 99,121, 52, 77, 23, 78,152, 48, 33,139,166, -233, 66, 0, 63, 53,196,249, 74,112,210,125, 47, 69,214,162,176,176,176,251, 52, 77,223, 15, 11, 11,187, 15,188, 8,162,218, 95, - 68,238,191,189,251,115,163,250,244,126,250,232,156, 81,134,254, 34,114,127,131,245,180,162,126, 78,216,183,141,214,156, 63, 68, - 31, 95, 50,205,208, 87, 98,121,213,219,219,251,243,165, 75,151,198,220,188,121,243,145,193, 96,120,156,145,145,241,248,235,175, -191,126,220,171, 87,175,235,182,182,182,137,108, 54,251,221,230,174,209,159, 4, 51,167,153,211,204,105,230, 52,227, 85, 3, 83, - 19,223,253,188,121,243,102, 1, 77,211,239,135,132,132, 96,211,166, 77,147, 59,116,232, 48,197,217,217,217, 30, 0, 10, 10, 10, -106,146,146,146,228, 33, 33, 33, 8, 13, 13,197,150, 45, 91,190,196, 11, 95,150,255, 79, 20,157, 56,113,194,101,241,226,197,210, -141, 27, 55, 26,231,204,153,211, 30, 64, 82,105,105,105,219,105,211,166, 45,162, 40, 42,196,221,221,221,191,176,176,176, 68,169, - 84, 30, 2,176, 27,205,172,153, 54, 6, 14, 9, 67,215, 86,142, 56, 79,194, 80,239,227, 17,161,161,161,111, 77,152, 48, 65,187, -109,219, 54,189, 92, 46, 63,101, 34, 93, 94, 73, 73,201,186,218,127,108,108,108, 36, 15, 31, 62,124, 87, 44, 22,147, 25, 25, 25, - 80,171,213, 72, 79, 79, 55,226,197,210, 84,131,168,214,211,219,191, 59,118,177,221,251,211,131, 45,107, 82, 30,128,197, 96, 64, -199,100,163,232,214,121,236,139, 79,145, 43,180,216,241, 58,237,148,201,100, 95, 44, 89,178,100,218,138, 21, 43,184,238,238,238, -196,141, 27, 55,112,228,200, 17,181, 84, 42, 29, 14,224,234,127, 66, 63,181, 12, 70,163, 17,108, 54, 27, 0,240,241,199, 31,131, - 36, 73,166, 84, 42,101, 19, 4,193, 33, 8,130, 79, 16, 4, 67,151,249, 24, 70,121, 5,138, 43,100,200, 43,150, 53,201,103, 48, - 26,143,220,190,125,123, 89,231,206,157,201,187,119,239,162,164,164, 4,233,233,233,180,129,166,127,138, 87, 26, 94, 56, 37,170, - 77,175, 31,223,198,118, 92, 39,107, 14,201,142, 8, 69,160,134,100,236, 50, 98, 34, 94,196,210, 2,128,125, 4, 65,176, 0,148, -249,248,248, 12,124,242,228, 9,207,199,199, 71,153,146,146,114,150, 32, 8,103, 0,251, 27,226,228,241,120,165, 0, 74,143, 29, - 59, 6, 0,243,240,226,228,117, 89,187,118,109, 97,124,124, 60,194,194,194,138, 1,236, 4, 0,161,181,237, 24,127, 17,139, 96, - 31, 8, 67, 47, 53,200, 29, 70,186, 65,171,171, 80,236, 48,168,131,128, 4,243,135, 79,208, 77,210,142,100,235,181,126,225,225, -225,241,213,213,213,234,168,168, 40,205,236,217,179, 25,105,105,105,119, 0, 92, 3,112, 12, 47,125, 44,205, 48,195, 12, 51,204, -248, 75,241,170, 5,171, 89, 31,173, 87, 85,235, 38, 0,223,165,166,166,214, 37,149, 78, 77, 77,189, 15, 96, 23, 94, 68,131, 31, -221, 2,197,187,230,165, 69,107,247,107, 54,230, 85, 78,110, 64, 64, 0,239,201,147, 39, 44, 52,156,196,145,120, 13,206,223,161, -161, 92,135,222,222,222, 95,233,116,186,152, 93,187,118, 29,101, 48, 24,211,254,128,218,119,247,242,242,170, 56,124,248,176, 49, - 54, 54,150, 94,179,102,141,193,209,209,177, 2,191,247,209,250, 13,103, 32,155, 17,189,188,189,179,252,222,140,190,244,179,165, - 99,232,107,211, 7,208,243,157,133,242, 64, 46,227,200, 31,156,149,120,137, 68,162,125, 60, 30, 79,110,105,105,121, 17, 64,239, - 63,114,141,108,109,109, 15, 74, 36,146,139,245, 95, 14, 14, 14, 49,246,246,246,223,216,217,217,173,177,178,178, 90,224,193,101, -111, 91,218,214, 73,149, 56,206,135,142,235, 99, 79, 79,183, 99,191,186,116,248,106, 61, 29, 61, 60, 60,202, 34, 35, 35,141, 63, -255,252, 51,189,114,229, 74, 99,171, 86,173,228,104,194,175,173, 73,139,150, 21,227, 72,244,132,158,198,226, 81,206,244,166,246, - 22,198,129,214,140,198,118, 40, 78,127, 41,128,103, 53,199,233,233,233,185,139,166,233,136,245,235,215, 71,224, 63,185, 64,135, -132,135,135,175,165,105,122,109,120,120,248, 90, 0,195, 0, 32, 80, 68, 70, 30, 26,219,213, 80, 48,210,137,254,172,189,208, 16, - 40, 34, 35, 27,180,100,218, 80, 39, 78,206, 29,101, 44,156,219,135, 14,245, 18, 24,122,218,112, 46,177,217,236,165,120, 97,113, -238, 14,128,109,158, 53,155, 57,205,156,102, 78,179, 69,235,111, 39,188, 76,130,196,198,198,102, 95,155, 54,109,142,186,187,187, - 31, 21, 10,133, 95,226,133,211,124, 75, 47,132,199,134, 13, 27,228, 34,145,168,211,159,120,113,197, 0,156,241,251,196,185,127, - 90,135, 89,231,136,197,105, 43, 38, 63, 92,231,136,197,245, 62,238,222,190,125,251,207,240, 34,154,247, 31,237,132,238, 54, 54, - 54, 95,219,216,216,228,191,244,205,114, 55,133,179, 43,131, 49,109, 32,151,113,163, 55,155, 44, 26,200,165,126,237,198, 96, 76, -125, 67, 7, 96, 83,155, 45, 26,227,116,177,179,179,219,102, 99, 99, 83, 96,103,103,247,117, 11, 69,214,111, 56, 59,241,224, 56, -200,138,113,162,183, 5,161, 24, 36, 98, 28,235,202,111,124, 83, 71, 11,218, 30, 16, 22, 22,246, 54, 77,211,111, 59, 57, 57,133, -212, 19,254,254,161,161,161,193, 52, 77, 7,215, 70,128,239,206,135,120,128, 21,227,112, 31, 75, 66, 54,192,138,113,184, 59, 31, -226,198,234, 57,208,138,113,164,143, 37, 33, 11,180, 36, 15,187,113,208,202,124, 51, 55,115,154, 57,205,156,102,161,245,207, 16, - 90,230, 14, 99,230, 52,115,154, 57,205,156,102, 78, 51,167,153,211, 44,180, 26, 22, 86,245, 95,117, 43,108,148,249,220,152, 97, -134, 25,102,152, 97,134, 25,102,252, 33, 52, 26,176,148,104, 66,149,182,196,177,253,117,148,109,156,153,211,204,105,230, 52,115, -154, 57,205,156,102,206,255, 57,206,230,184,255,191, 55,214,189,209, 48,155, 85,205,156,102, 78, 51,167,153,211,204,105,230, 52, -115,254,207,130, 52,159, 2, 51,204, 48,195, 12, 51,204, 48,195,140, 63,132,128,151,127, 95, 13, 92,218,176,143, 22,213,125,125, -177, 94,175, 23, 3, 0, 69, 81, 82,221,157, 53,142, 77,177, 51,129, 32,253,139,244, 59,160,128,121,122,224, 98, 3,156, 23,245, -122,189,245, 75,206, 10,221,157, 53,195,154,228,236,190,254,124,253,242,250, 59,107,134,188, 90,134, 6, 24,204,238,235, 11, 94, -169,171,147,169,103,133,192,111, 98, 98,253,101,245,124, 83, 56,255,151,193,236,177,190, 88,167,123,209,143,152, 76, 74,170,189, -221,116, 63, 98,245, 88, 95, 80,191,188,238,246, 26,135,166, 56,249, 60, 78,153,167,179,253,151, 77,113,102, 20,148,190,175,168, - 81,217, 54,197,217,210,177,233,234,232, 24,100,120, 57, 54, 25,192,188,252,194,194,139,127,179,190,212, 21,192, 26, 0,150,245, - 62, 75, 4,240,158,185, 87,154, 97,134, 25,111,152,208, 74,192,139, 60,135,123, 94,138,173, 61,141, 10, 45,189, 94, 47,190,127, -124, 45, 20,106, 32,104,230,122,177,199,184,221,191, 75,148,172, 87, 85,176,101,201, 81,254, 12,157,220,218,158,210, 90, 22, 20, - 20, 16, 0, 64, 16,196,247, 0,220, 26,224,180,190,127,124, 45,106, 52, 64,224,148,112,107, 55,192,178,132,197,250,128, 39, 16, - 12, 84, 42,149, 29, 0,128,199,227, 37, 43, 21,138, 43,246, 90,237,214, 87,203, 55,214,178,250,117, 29, 52, 99,189,184,253,184, -221, 75, 12, 70, 35,251,249,221, 93,129,170,210, 52,138,169, 87,239, 92, 5,156, 93,219,128,168,106,132,239, 63,191, 59,105,165, - 45, 19, 24,196,230,114, 59, 89, 89, 91,247, 51,210,180,143,209,104, 36, 12,122,253, 99,121,101,229, 53,163, 94,255, 80,175, 81, -216,222, 63,245,153,177,169,122,190,218,150, 73, 0,117, 28, 8, 17, 8,133, 3, 25, 76,102,111, 0, 48,232,116, 55, 20,213,213, - 87,198, 3,209,166,180,221,212,243,243,186,229,255,215,160,211,233,197,153,231,215, 66,173, 3, 2, 38,126, 38,238, 56,237,192, - 97, 0,208, 72, 31, 58, 84,167,157,234, 1, 0, 2,207,224,219, 28, 73, 64, 49, 0, 80, 57,133,226,167,177,171,161,214, 1, 62, -193,225,226,230, 56,103,135, 30,177, 93, 49,127, 2, 7, 0, 46, 28,251,166,237,229,152,239, 70, 0,192,160, 9, 11,207, 14,157, -184,248, 41, 0,108,217, 19, 99,251,211,103,147,155,228, 52,109,108, 86,178, 42,211, 98,189, 52,242, 66, 43, 87, 1, 37, 73, 75, - 75, 35, 1,192,201,201,201,164,177,233, 2,136, 10,129, 69, 36,131,209,207,211,203, 43, 0, 0,157,241,236, 89,130, 65,175,191, -238, 8,236,252,147,251,210, 18,154,254,109,112, 86,130, 32,204, 29,210, 12, 51,204,120,211,112,250,165,184, 58,253,187,201,108, - 99, 71, 40,212,192,213,116,160,127,207,142,152, 63,109,164,176,254,119,209,187,195,221,210,238,158,108,255,195,129,173,100,199, -142, 29,145,153,153,105, 82, 45,106, 52,192, 47,105, 0,100, 79, 44, 42, 4,130,103,219, 62,255,220,114,200,144, 33,148,147,147, - 19, 8,130, 64, 81, 81, 81,207,184,184,184,174,203,150, 45,251, 23,100, 79, 42,106, 52,168,250, 37,173,121,222,218,186,118,104, -219, 10,107, 22, 79, 22, 1,192,170,153, 59,187,222, 77, 45,182,121,246,236, 89,208, 71, 31,125, 84,198,184,114,229, 59, 59, 32, -162, 24,200, 51,165,158, 7,127,190,205, 21, 21,254,232, 49,125,241,226, 99, 94, 94, 94, 66,119,119,119,194,194,194, 2, 12, 6, - 3, 21, 21, 21,110, 73, 73, 73, 35,238,220,185,163,136,187,250, 61,251,222,157, 49, 25, 82,110, 15,149, 73,109, 87, 22,112, 47, - 88, 88, 36,207, 24, 63,222,101,242,228,201, 92, 79, 79, 79, 0,192,179,103,207,188,163,163,163,167, 28, 59,118, 44, 20,202, 2, -125,141, 6,170,230,218, 94,199, 9,128, 11,244,182, 18,139,167, 51,152,204, 14,122,189,222,249,165,181,225,185, 65,167, 75,150, - 73,165,135, 94, 45,111,198,239,161,214, 1, 79, 10,129,193,253, 2, 48, 99,194, 96, 1, 0,124,244,214,134,158, 57, 89,233, 44, -141, 70,131,182,237,124,250,124,250,217,151,231, 65,146,136,140,137,171, 43,111, 10,103,226,147, 76,172,253,116, 27, 10, 30, 69, -247, 52, 84,166, 15,172,146, 87, 50, 0,192, 82, 36,154, 16, 29,245,227, 21, 39,255,144, 91,233,165, 90,147, 56,155, 26,155,231, -162,190,118,204, 79,186,226,251,237,133,125, 76, 55, 55, 55, 60,122,244,168,101, 99,179, 50,213,194,232,232,248,120,235,135, 31, - 74, 2, 3, 3, 33, 20, 10, 65, 81, 20,244,122,253,224,235,215,175, 15, 94,187,118,237, 66, 84,166, 42, 76, 29,155, 38, 96, 43, - 65, 16, 3,103,207, 95,226, 56,114,108, 8, 38, 12,239,211,100, 97,173, 70,195, 96,177,217, 6,115,111, 53,195, 12, 51,254, 70, -168,181, 94,213,223,121,184,167, 73,161, 69, 81,148,116,200,172,141,226,126, 61,252,112,247,225,211,202,236,220,194,234,218,239, -202,147,163,219,142,237,227,236, 27, 31,127, 21,106,181, 26, 55,110,220,192,195,135, 15,145,149,149,133, 5, 11, 22,168, 95, 46, - 29, 54,196, 89, 17, 56, 37,220, 26,149,105, 66,111,118,106,235,184,148, 20,134, 74,165, 66,124,124, 60, 42, 42, 42,192,102,179, -225,226,226,130,161, 67,135, 82, 41, 41, 41, 54, 65, 67,134,139, 2,135, 79,205,132,200,187,154,162,168,138,198,242,136, 80, 20, - 37, 13,154,185, 94,236,235,221, 10,207,178, 11, 42,215,124,246, 67,181,209, 72, 83, 25, 89, 57,218,171, 87,175, 34, 32, 32, 0, - 23, 47, 94,180, 45, 47, 47,255,100,231,206,157,107,152,155,191,221,174,211,148, 45, 71,227,124, 21,129, 83,194,173,109,165, 71, -221, 47,159, 59,193, 74, 78, 78,102,237,218,181, 11,101,101,101, 96,179,217,176,178,178,130, 68, 34, 65,219,182,109,137, 85,171, - 86, 9,131,131,147,241,239,121, 33,238, 90,143,185,169,141,213,179,174,237,213, 57,124, 59,249, 5,207,152,211,167,201,190,125, -251,254,102,218,222,166, 77, 27, 12, 27, 54,140, 59,125,250,116,207,201, 83,166, 25, 3, 71,205,126, 6,161,123, 77,179,156,138, - 60,158,109,205, 77,167,193, 83,166,156, 10, 15, 15,183,146, 72, 36, 16, 8, 4, 0,128,202,202, 74,151,236,236,236,158,161,161, -161, 19,111, 39, 70, 81,129,193,121, 5, 16,184, 42,155, 58,159,255,171, 96, 50, 41,105,173, 21,201, 66,192,171,200,203, 47, 86, - 0,128, 70,163,129, 70,163,129, 90,173,198,187, 11, 23, 48,230, 77,236,238,229,222,111,201,131,172,231,197,229, 62,113,183,108, -106,143,213, 53,195, 73,213,100,201,100,185,151,230,173,253,240, 67,137,131,195,127, 86, 4, 35, 15, 30,100,148,151,151, 15, 94, -187,118,173, 47,205, 31, 32,243, 9, 14,183,106,138,179,169,177, 41,123,122,186,245,167,139,135,117,218,253, 89, 44, 12, 6, 3, -110,222,188,137,248,248,120,124,249,229,151,244,217,179,103, 43, 45, 5,130,121,104,114,108,166, 90,244,117, 44,242,216,188,249, - 24,193,225,112,112,242,228, 73,164,164,164,128, 36, 73,116,236,216, 17, 51,102,204,192,224,193,131, 37,243,231, 47,160, 3,135, -191,149, 1, 81,187,170, 63,216,151, 72, 0, 75, 86,174,221,236, 56,115,238, 34,108,249,116, 85,179, 66,203, 44,178,204, 48,195, -140,191,177, 53,171,209, 16, 15,136,141,141,165, 95,190,250, 3, 0, 13,144,109,198,237,254,233,232, 61,227,233, 54,227,118,255, - 68, 3, 36, 13,144,150, 64,171,206,157, 59,235,100, 50, 25,125,231,206, 29,250,221,119,223, 85,108,223,190,253,202,233,211,167, -163,245, 90,237, 94, 39, 71,199, 47,232, 70, 28,236,105,128,116, 7, 68,124, 62,191, 36, 55, 55,151, 62,115,230, 12, 29, 22, 22, - 70, 31, 58,116,136, 62,123,246, 44, 29, 23, 23, 71,159, 61,123,150,254,233,167,159,232,196,196, 68,250,233,211,167,180, 64, 32, - 40,113, 7, 68, 77,112, 50,104,128,209,118,220,174,229,199,238,234,194,219,141,219,189,140, 6, 24,214, 64,251,206,157, 59, 27, -162,163,163,233,200,200, 72,250,192,129, 3,116, 98, 98, 34, 93, 90, 90, 74, 83, 28, 65, 73,237,113,141,213,147, 6, 72,103,103, -231, 18,153, 76, 70,187,186,186,210,108, 54,155,118,112,112,160,219,182,109, 75,247,236,217,147, 30, 49, 98, 4, 61,109,218, 52, -250,147, 79, 62,161,101, 50, 25,205,229,114,139,107,143,107,140, 51, 0,224, 9, 4,130,220,251,247,239,211,141, 65,169, 84,210, -165,165,165,244,249,243,231,105,129, 64,144, 27, 0,240,154,226,228, 1, 93,252,253,253, 75, 74, 75, 75,105,173, 86, 75,231,230, -230,210, 73, 73, 73,116, 74, 74, 10,157,155,155, 75, 43,149,202, 58,238,167, 79,159,210, 30, 30, 30, 37, 60,160, 11,109,222, 4, -209,104, 95,122,245,229,230,224, 48, 66, 34,145, 40,143, 29, 59, 70, 63,127,254,156,222,191,127, 63, 77, 2, 27, 94, 45,215, 20, - 39, 27, 24,218,183,111, 95,195,205,155, 55,233, 7, 15, 30,208, 31,127,252, 49, 61,108,216, 48,122,248,240,225,244,218,181,107, -233,252,252,124, 58, 63, 63,159, 30, 49, 98,132,129, 13, 12,109,174,127, 54, 52, 54, 69,128, 91,112,112,176, 82,171,213,210, 25, - 25, 25,116,135, 14, 29,242, 25,192,116, 1,224,219, 31,224, 52,215, 63,157, 1,107, 71, 71,199,194,155, 55,111,210, 49, 49, 49, -180,187,187,123, 9, 3,152,109, 9,180,177, 4,218, 48,128,217,109,218,180, 41,185,121,243, 38, 93, 86, 86, 70,187,185,185, 21, - 58, 3,214,127,160, 47,145, 0,246,173, 92,187,153, 78,205, 87,208, 43,215,110,166, 1,228,210, 52, 77,163, 1, 31, 79, 51,204, - 48,227,159,143, 87,181,200, 63, 5,117, 55,201,224,224, 96, 2,192, 47, 77, 21, 86, 50, 24, 27,183,108,217, 66,169, 84, 42,252, -240,195, 15, 85,147, 38, 78, 60,218,191, 95,191,140,214,238,238, 50,130, 36,155,205, 54, 92,194,225, 44,221,178,101,139,149, 70, -163,193,189,123,247,208,181,107, 87, 72, 36, 18, 8,133, 66, 8,133, 66,136,197, 98,180,107,215, 14, 82,169, 20, 22, 22, 22, 88, -177, 98,133,168,132,195, 89,218, 28,175,209, 72, 83, 0, 96, 48, 26,217, 44, 96,190, 71,183,110,247, 66, 67, 67, 73, 91, 91, 91, -216,216,216, 64, 40, 20, 34, 37, 37, 5, 26,141, 6,124, 30,223,164, 32,173, 36, 73,146, 66,161, 16,151, 47, 95,198,146, 37, 75, -208,187,119,111, 88, 89, 89,193,194,194, 2, 29, 58,116,192,208,161, 67, 49,111,222, 60,100,100,100,128, 48,193,169,228, 49, 69, - 45,154, 55,111,158, 56, 32, 32,160,193,239, 85, 42, 21,100, 50, 25, 74, 74, 74,224,226,226,130,144,144, 16,241, 99,138, 90,212, - 24,159, 45, 32,113,241,246, 62,117,231,206, 29, 59,129, 64,128,200,200, 72,156, 56,113, 2,231,206,157,195,153, 51,103, 16, 27, - 27,139,147, 39, 79,162,164,164, 4, 0,224,237,237,141, 35, 71,142,216, 9,197,226, 88, 91, 64, 98, 30,210,166, 33,167,184,248, - 66,135,162, 34,187,233,211,166, 93,171,174,174,198,244,233,211,177,113,211,166, 85, 76, 96,153, 41,199,183, 3, 68, 54,142,142, - 17,155, 55,111, 38,139,138,138, 48,126,252,248,210,173,155, 54,189,147,112,254,188,231,253,115,231, 60, 55,134,135,191,211,191, -127,255,210,252,252,124, 28, 60,120,144,116,112,115,139,104, 7,136, 90, 90,207, 42, 96,201, 87, 95,125,197, 85,169, 84, 24, 50, -100, 72,134, 49, 57,185,157, 30,248,177, 26, 72,249, 5,208, 54,119,124, 33,176,104,197,138, 21, 18, 14,135,131, 15, 62,248,160, -180, 38, 39,199, 79, 15, 28,168, 4,178, 43,129,108, 61,112,160, 42, 51,211,111,230,204,153,165, 28, 14, 7,219,182,109,147, 20, -254, 39,233,182,169,232, 10,224, 20,128,171, 0, 10,102,207, 95, 50, 59,160,123, 47, 28,220,187, 19,159,133,127, 20, 1, 96, 18, - 65, 16,135, 0, 44, 55,247, 60, 51,204,248,223,132, 41, 90,228,111,138, 70, 83,238, 80,245,149, 36,128, 1, 77,177, 88,219,218, -118,245,243,243, 67,124,124, 60,252,253,253,239, 88, 89, 89,233, 89, 28, 14,152, 76, 38,104, 99,179, 58, 11, 60,129, 32,104,240, -224,193,212,173, 91,183,224,225,225, 1, 30,143, 7, 38,147,249,155, 23,139,197,130,163,163, 35,228,114, 57,130,130,130,152, 59, -118,236, 8,130, 90,253,105,179, 15,196,180, 36, 97,201,173,205,211,190,223, 31,209, 38, 48, 48, 16,149,149,114, 24,141, 70,240, -249,124,104, 52, 26, 80, 20,245, 98, 9, 72, 71,203, 77, 57, 99, 6,131,193,192, 96, 48,224,225,225,129,141, 27, 55, 66,165, 82, -129,197, 98, 1, 0,228,114, 57,100, 50, 25,146,146,146,144,157,157,141,151,179,240, 38, 97, 33, 18,141,156, 60,121,114,131, 9, -127,213,106, 53, 42, 43, 43, 81, 89, 89, 9,153, 76, 6,149, 74,133, 94,189,122,177, 79,199,198,142, 68, 89,217,214, 6,143,225, -114, 39, 30, 60,120, 80,204,102,179,161, 84, 42, 81, 85, 85,133,188,188, 60,228,228,228,168,164, 82,169,222,194,194,130,116,119, -119, 39, 57, 28, 14,103,220,184,113,132, 92, 46, 7, 65, 16, 8, 14, 14,182, 61, 28, 25, 57, 25, 26,205,151,230, 33,109, 26, 46, - 0,234, 46, 26,205,232, 30,221,187, 95,190,115,247,110,192,210,165, 75,145,152,152,184,153, 31, 21,117,181, 6,120,216,212,177, - 25,192,162, 47,234, 9, 24, 58, 39,199, 95, 11,148,212, 43,146,237,158,153,121,110,230,204,153,143, 18, 19, 19,237,182,109,219, - 38,153, 52,126,252, 34, 0, 27, 90, 82, 71, 11,145,168,155,163,163, 35,206,158, 61,139,220,172,172,143,244,128,178, 69, 51, 46, - 6,163,111, 96, 96, 32, 78,158, 60,137,252,156,156,143,244,191,173,227,139,137, 18, 80, 66,101,100,124, 20, 17, 17,177,111,206, -156, 57, 96, 80, 84, 95,232, 91,180,112,248, 59,199,247, 57, 11,150, 34, 98,207,142, 8, 0,115, 1, 24, 1,220, 49,247, 56, 51, -204,248,223,182,106, 53,167, 69,222, 32,177,181,167,197, 22, 45,177, 88,236, 44, 20, 10, 81, 80, 80, 0,159,246,237,165, 28, 14, - 7,108, 38, 19, 92, 54,219,164, 26,212,212,212,248, 59, 57, 57,161,178,178, 18,118,118,118, 96,177, 88,117, 47, 54,155, 93,247, -222,194,194, 2, 36, 73,194,205,205, 13, 53, 53, 53,254,205,242, 22, 39,137,163,118, 44,124,247,230,213,179,109,198,143,159, 0, -107,107, 27,184,186,186, 64, 44, 22,131,199,227,193,213,213, 21,158,158,158,244,214,173, 91,193, 23,119, 52,233, 70, 94, 95, 60, - 81, 20, 5,131,193,128,226,226, 98,164,166,166, 34, 49, 49, 17, 55,111,222,196,131, 7, 15, 80, 85, 85, 5, 19,116, 22,106,148, -202, 78, 20, 69, 53, 40,178,100, 50, 25,100, 50, 89,157,208, 42, 41, 41, 65,118,118, 54,170, 21,138,206, 77,136,222, 9,126,126, -126, 12, 0,224,241,120,232,220,185, 51,118,239,222,173,255,249,196,137,183,124,111,222,180,113, 61,127,222,234,251, 93,187,222, - 10, 9, 9, 49,220,186,117, 11,114,185, 28, 79,158, 60,129,189,189, 61,197,230,114, 39,155,135,115,203,112, 31, 80,216, 85, 85, - 13,239,221,187,119,102,101,101, 37, 62,255,252,115,146,105, 97,177, 39,188,145, 37,190, 58, 48, 24,125, 2, 3, 3,113,234,212, - 41, 20,228,228,124,156,211,128,128,201, 1, 74,114, 51, 50, 62,142,136,136,192,208,161, 67, 65, 80, 84,159,150,214,175,103,207, -158,126, 70,163, 17,143, 30, 61,130, 21,112,187,165,199,123,122,121, 5,212, 90,126, 5,192,181,198,202, 9,128,107, 9, 9, 9, -224,241,120,240,241,245,237,210,194,159,217, 74, 16, 68,225,156, 5, 75, 17,115,238, 87, 0, 64,196,158, 29,197,245, 68,150, 25, -102,152, 97,182,104,189,169, 22,173, 90, 97, 85,255,133,223, 8, 45, 19,197, 7, 0,128,201,100,130,205,225,128,205,102,191, 16, - 72, 28,142,201, 28, 4, 65,128,203,229,214, 9,171,250, 2,171,254,123, 62,159,111,146,128, 1,128,138,244,115,253,230,190, 51, -135,205,225,112,160,209,168, 65,211, 52, 56, 28, 46,172,172,172,224,225,225, 1,185, 92,142,222,125,250,171,243,100,172, 88, 91, -159,113,137,175,115,246,244,122, 61, 20, 10, 5, 42, 42, 42, 80, 94, 94, 14,185, 92, 14,165, 82,105,242, 86,116,163,209,200,200, -203,203,195,143, 63,254,136,178,178, 50, 0, 47, 28,173,107,197, 85,237,223,204,204, 76, 68, 70, 70, 34, 43, 43,171, 69,215,167, - 95,191,126,136,141,141,101, 12, 8, 10,218,123,209,221,189,224,162,187,123,193,128,160,160,189,167, 78,157, 98, 56, 59, 59, 35, - 59, 59, 27,247,238,221, 67, 69, 69, 5,104,154, 54,239,159,127, 13, 60, 3, 42,106,202,203,231,172, 90,181,138, 22, 10,133,248, -252,139, 47, 58,109, 0,166,154, 42, 96, 68, 77, 8, 24,209, 31, 19, 48,160,105, 26, 70,163, 17, 6,195,235,249,138, 19, 4, 65, - 48,153,204,150,134, 86,104, 73,225, 58,199,247, 21,159,108,196,153,147,209,181,159,167,153, 69,150, 25,102,152,241, 15, 64,163, -142,240, 84, 61, 5, 89,247,183, 49, 20, 23, 23, 63, 87, 40, 20,109,220,221,221,145,159,159, 47,118,115,115,203, 97, 51,153, 96, -177,217, 32,200,230, 53, 1,159,207,127, 84, 80, 80,208,199,217,217, 25,122,189,190, 78, 84,189,186,116, 88,107,165,121,240,224, - 1,248,124,254, 35,168,154,140,156, 0,131,166,162, 85,151, 46, 93,234, 44, 67, 86, 86, 86,176,178, 18,129,195,225, 98,245,234, -213,198,109, 91,183,238,116, 27, 20, 94,249,246,178, 85,244,170, 13,123,255,212, 51,107,234,131,137,207,231, 63,114,117,117,237, - 37, 18,137, 16, 19, 19,131,236,236,108, 84, 84, 84,160,166,166, 6,106,181, 26, 53, 53, 53,208,104, 52,224,114,185,240,245,245, -133,165,165, 37,226,226,226, 30, 65,173,110, 88, 92,150,149,197, 60,122,244,168, 87,247,238,221,235, 44, 42, 3, 7, 14, 36, 6, - 14, 28,104, 87,103, 69,171,169, 65,105,105, 41,238,220,185,131,184,184, 56, 16, 4,129,180,180, 52,131, 90,169,252,201, 60, 38, - 94, 15, 42,224, 6, 35, 34, 98,223,191,254,245,175,119,250,244,233, 3, 3, 48, 2, 64,228,127, 81,192, 0, 0,110,222,188,153, -100, 48, 24,250,180,109,219, 22, 50,160, 7,128,147, 45, 18,145,233,233, 9,122,189, 62,168, 83,167, 78,136, 57,122,180, 31,128, -236,134,202, 41,128,126, 1, 1, 1, 80, 42,149,120,242,248,241,253, 22,136,172,189, 43,215,110,158, 61,115,238, 34, 28,220,187, - 19, 17,123,118,228,237,219,189,221, 21, 38,248,143,153, 97,134, 25,255, 83,214,172,102,181,200,223, 20,243, 27, 19, 95, 84, 75, - 88, 42, 43, 42,238, 39, 36, 36,180,233,210,165, 11,246,238,221,219,189,119,175, 94,207, 89,108,182,158,205, 98,129, 52,225, 65, -162, 84, 40, 46, 93,186,116,169,199,184,113,227,168, 91,183,110, 65, 34,145,212, 9,173,218,191, 20, 69,129,166,105,240,249,124, - 28, 63,126, 92,171, 84, 40, 46, 53,107, 45, 50, 24, 13,228, 75,161, 71,211, 52,100, 50, 25, 88, 44, 22,190,252,114, 27,190,222, -186,117,154, 1,136,246, 22,216,127, 8,128,251, 95,123, 64,215,212, 92, 62,115,230, 76,215,208,208, 80,166,139,139, 11,100, 50, - 25, 42, 42, 42, 80, 86, 86, 6,185, 92, 14,185, 92,142,138,138, 10,200,100, 50,112,185, 92, 36, 38, 38,234, 84, 53, 53,151, 27, -227,227,168, 84,199,102,205,154,181, 34, 33, 33,193,145,162, 40,232,116, 58, 24,141, 70, 24,141, 70,104,181, 90,164,167,167, 35, - 57, 57, 25, 41, 41, 41, 40, 47, 47, 7,147,201, 4,131,193,192,131, 7, 15, 42, 4, 58,221, 81,141,121, 76,191, 54,152, 64,204, -245,235,215,223,153, 49, 99, 6,156, 92, 92,250, 35, 63,223, 36, 1,115,162, 9, 1, 83,249,122, 2,230, 63, 2,168,170,234,110, -102,102,102,159, 1, 3, 6,192,209,197,101,179,111,126,254,197,199, 45,240,211, 50,232,245,215,174, 95,191, 30, 52,115,230, 76, -236,221,187,119,179,125,102,230,185,146, 87,150, 57,237, 1,251,214,158,158,155,103,207,158,141, 11, 23, 46,192,160,215, 95,107, -130,178,126,196,247, 86,179,231, 47,113,125,197,241,125, 55, 65, 16,139, 1,124,110,238, 81,102,152, 97,198, 63,217,162,213,162, -165, 67,158,193,176,114,249,242,229, 58,146, 36, 49, 97,194, 4,139,147,167, 78,133, 60,120,248,208, 67, 42,149, 90, 25, 12,134, -102,185,236,213,234,237,203,151, 47,151,105, 52, 26,180,107,215, 14,229,229,229, 48, 24, 12,160, 40, 10, 20, 69,129, 32, 8,144, - 36, 9,161, 80,136,132,132, 4,236,219,183, 79,110,175, 86,111,111,246, 33, 97, 48, 60,138,140,140, 4,131,193,160,185, 92, 46, - 8,130, 0, 69, 81,216,182,109,155,244,107, 32, 6, 0, 24, 36,169, 1, 0,146, 36, 76,245,222,109,118,221,146,205,102,195,248, - 98, 19, 64,179,101,173,213,234,175,182,108,217, 82,245,228,201, 19, 40, 20,138, 58,235, 91,117,117,117,157,115,189, 76, 38, 3, - 65, 16, 80, 40, 20, 56,117,234, 84,149,181, 90,253, 85, 99,124,101, 64, 81,126, 90,218,152,238,221,187,151,101,102,102,162,178, -178, 18,143, 30, 61, 66, 92, 92, 28,142, 28, 57,130, 11, 23, 46, 32, 61, 61, 29,122,189, 30,206,206,206,160,105, 26, 39, 78,156, -168,212, 87, 85,141, 40, 3,138,204, 99,162,113,180,146, 72,130, 28,196,226, 92,123, 59,187,252, 86, 18, 73,208,171,223,139,128, -167, 79,159, 62,133, 94,175,135,135,135,135, 77, 83,126, 90,180, 94,127,253,250,245,235,152, 57,115, 38, 92,219,180,217,228, 14, -216,191, 90,198, 29,176,119,247,244,220, 84, 43, 96,104,189,254,122, 75,235,108, 1,236,248,240,195, 15,149, 44, 22, 11, 81, 81, - 81, 30, 58, 47,175, 20, 10,152, 42, 4,218, 15, 0, 88,205, 29,239, 8,236,252,228,147, 79,138, 8,130,192,161, 67,135,236, 68, -158,158, 73, 20, 48, 75, 4,180, 18, 1,173, 40, 96,150,200,211, 51, 41, 42, 42,202, 78,175,215, 99,217,178,101, 69,142,192,206, - 38, 40,151,208, 52, 61,154,166,233, 64,154,166, 93,247,237,222,142, 51, 39,163,107, 69,214, 92,188,112,122,159, 1, 32,201,220, -227,204, 48,195,140,127, 50, 26, 52, 67, 81,221,215, 23, 3,180,184,127,207,142,184,251, 48,181,210,206,218,242,124,237,119,229, -201,209,109, 7,249, 91,118,252,246,219,111,193,100, 50,145,151,151,135,199,143, 31,195,210,210, 18,211,166, 77, 83, 43,171,170, -198,212,203,117, 56, 24, 64,220, 75,206, 23,249,212, 42,211,132,158, 84, 98,155,115,103, 98, 25, 34,145, 8,213,213,213, 32, 73, - 18, 92, 46, 23,124, 62, 31, 60, 30, 15,247,238,221,195,168,209, 99, 13, 37,252,192,255, 4, 44,253, 79, 62,181, 58,206,218, 88, - 67, 61, 0,126, 2,240,129,216,201,105,249,154, 53,107,120,195,134, 13, 3,139,197,130, 75, 43,239, 34,143,225,159,239, 32, 73, - 66,159, 95, 38, 95,237,217,202, 73,244, 56, 45, 27, 0, 33,213,221, 89,227, 84, 47,215,225,239,234,233,166,185,234,113,252,192, - 86,203,206,157, 95,248,163,203,100, 50, 20, 23, 23, 67, 42,149, 66, 38,147, 65,161, 80, 0, 0, 98, 99, 99,113, 38, 62, 69,174, -116, 9,201,104,172,158,255,105,123,170,133,147,246,118,235,195,145, 7, 24,246,246,246, 40, 46, 46, 70, 73, 73, 9,100, 50, 25, -148, 74, 37, 12, 6, 3,202,203,203,241, 67,196, 1, 67,153, 48, 48,171, 46, 32,100, 83,156,138, 60,158, 77,245,175,206, 1,190, -238,244, 59,239,188, 99, 97,105,105, 9,163,209,136,138,138, 10,228,230,230, 34, 51, 51, 19,241,241,241, 10,169, 76, 3,133,221, -144,252,186,128,165, 13,112,254,137,120,227, 56,235,199,173,114,114,116, 44,200,201,201, 17, 27, 12, 6, 56, 59, 59,235,101,229, -229,155,216,192, 5, 11,160, 16, 0, 93, 10,172,249,106,199,142, 57, 99,199,142, 69,183,110,221,242,138,138,139, 91, 55,212,151, -104,128,209, 14, 16,213,184,184, 36,223,185,115, 71,146,155,155,139,153, 51,103,150,230, 60,123,246,113,173,191, 86, 37,208,207, -221,211,115, 83, 84, 84,148, 93,155, 54,109,224,239,239, 95,196,205,205,237,144, 10, 84, 54,210, 63, 27, 29,155,178,167,167, 91, - 47, 28,239,215,237,221,119,223,133, 94,175, 71,124,124, 60,110,223,190,141,156,156, 28,252,250,235,175, 50, 75,129,224,173,122, -185, 14, 27,236,159, 35,188, 21, 30,135, 14, 69, 18, 44, 22, 11, 17, 17, 17, 72, 72, 72, 0, 0, 4, 4, 4, 96,246,236,217,208, -235,245,152, 62,125, 6,125, 58,149,151,209, 84,255, 4,224, 7,224, 11,188, 16,121,221,104,154,230, 18, 4, 81, 0,192, 21, 45, -243,201, 50,247, 79, 51,167,153,243,127,135,243, 31,137,102,115, 29,174,255, 14,162,223,166,249,152, 87, 16,189, 59,156,234,219, - 47,176,125,120,216, 90,178,123,247,238,112,117,117, 69, 64, 64, 0,114,115,115, 57, 86, 86, 86,205,229, 83,171, 14, 28, 62, 53, -179, 99,199,142, 86, 31,127,252,177,104,232,208,161, 76, 87, 87, 87,208, 52,141,132,132, 4,196,196,196,104,247,238,221, 43,175, -113, 24, 45,187,127,229,199,106, 83,242,169,221, 6,106, 0,172,115, 41, 40,216,179,104,225,194,181,157,187,116,121, 39, 44, 44, -140, 20,242,121,204,141,171,231,114, 1, 96,253, 55, 71, 68, 99, 67,166,225, 43, 47,160,255,212,134,243,200,213,175,103,110,254, -188,156,145,227,131,188, 62, 88, 60,199, 48,121,242,100,129,165,165, 37, 92, 93, 93, 97,109,109,141,140,140, 12,228,231,231,211, - 63,255,252,115,245,205, 7, 79,153, 39, 46,220,205,225,138, 28, 77,201, 75, 88, 21, 56,108, 82,214,200,145, 35,173,103,205,154, -101,209,181,107, 87, 38,135,195, 1,135,195, 65,113,113, 49,210,211,211,181, 63,255,252,115,117,141,120, 68,197,253, 43, 81, 85, - 38,230, 58, 84, 6, 78, 9, 79,191,118, 49,108, 89,242,163, 71, 51,140, 64, 39,173, 86,235,108, 48, 24, 8,146, 36, 11,141, 70, -227, 35,109, 85,213, 62,117, 64,216, 54,115,174, 67,211, 96, 48, 24, 88, 6,131, 1, 50,153, 12, 23, 47, 94,164,158, 61,123,182, -230,225,195,135,107, 10, 10, 10,160,211,233, 48,113,226, 68, 4, 4, 4,224,202,149, 43, 40, 41, 46,254,185, 41,174, 84,160,146, -147,159, 63,123,222,188,121,103, 35, 35, 35,201,135, 15, 31,218, 69, 68, 68,252,208,144,128,153, 49, 99,134,177, 56, 55,119,182, - 26,168,108,162,127, 54, 53, 54, 75,207, 69,125,253,112,220,132, 16,223,176,208, 53,204,222,189,123,195,206,206, 14,253,250,245, -131, 86,171,181,242,241,241,105,110,108, 86, 5, 14,127, 43,163, 83,167, 78,130,109,219,182, 73,230,204,153,131,197,139, 23, 3, - 0,148, 74, 37, 46, 92,184,128,101,203,150, 21,229, 82, 61, 20,205,245,207,151,150,170, 90, 1,118, 21, 64, 32,128, 12,152, 29, -223,205, 48,195,140,127, 38,106,147, 74, 59,226, 69, 98,233,211,120, 49, 57,111, 62,215,225,181,219, 73,168,159,230,227, 5, 28, - 31,235,221,102, 61, 91,176,124,147, 63, 67, 39,183,102, 18, 42,203,180,167, 79,137,230,114, 30,214,229, 83, 19,121, 87,219,102, -254,212,125,227,250,245, 75,191,250,234,171,160,218, 16, 14,124, 62,255,145, 82,161,184,100,175, 86,111,175, 17,121, 95,106,105, -110,190,124,160, 24,192, 66,235,251,247,119, 4,143,157,184,133,107,227,193, 92,181, 97,175,138, 65,146,154,244,130, 18,124,229, - 5, 8, 76,216, 32, 89,163, 1,146,101,142,250, 98,219,144,212, 79, 62,252,240,131,245,235,214,117, 23, 10,133,253,181,122,189, -183,209,104, 4,140,198,180, 26,133,226, 42,173,213,222, 81, 7,132,110,229,138, 28,105,147,243, 18, 90,249, 84,217,100, 69,119, -223,191,111,223,146,163, 71,143,254,174,237,182,106,245,142, 26, 43,159, 56, 83,218, 94,191,140, 10,184, 1,169,244, 70, 83,166, - 75,115,174, 67, 19,103, 31, 70,227,124,107,107,235,131, 65, 65, 65,220,193,131, 7, 99,212,168, 81,232,221,187, 55,140, 70, 35, -104,154, 70, 85, 85, 21,142, 28, 57,130, 45, 91,182,164,181, 6,214, 53,199,167, 6, 46,113,206,156, 25,209,169, 83,167,136,166, - 4,204, 75,145,213,172, 79, 98,211, 99,147,147,166, 23,141,201,158,178,104,163,151, 70, 94,104,101,203,215, 75,146,147, 30,145, -166,143,205,118, 85,134,132, 35, 61, 38,142, 31,191,136, 65, 81,253, 94,238,128,164,159, 60,126,124,191, 54,169, 52, 2,102, 95, -108, 97, 95,170,141, 93,103,118,124, 55,195, 12, 51,254,233, 66,107, 20, 94,248,107,213,165,228,105, 52,215, 97,173,213,135,162, - 40,105,198,137, 5,211,154, 98,103, 2, 65, 47, 45, 89,104, 54,215,225,203,247,217, 64, 21,212,234, 79,127, 19,140,180,222,238, - 66,230, 43,229, 91, 18, 22,177, 2, 72,133, 94, 29, 12,233, 99,224,212,194, 23,124,221,215,127, 84,191, 77,141, 62,100,127,243, -187,172,114, 21,112, 13,213,213,215, 80, 93,221,160,211, 46,147, 98,149, 55, 87,207, 87,219,158, 11,200,255,104,219, 95,229,108, - 86, 60,252,129,243,249,191,134,231,165,165, 39, 0, 8, 93, 98, 99, 29,206,197,198, 78,254,224,253,247, 39, 58, 58, 57,121,218, -217,217, 89, 91, 88, 88,144,183,110,221,202,212,171, 84, 59, 58, 3,251, 95, 90, 83,155,133, 26,184,212, 46, 55,183,195,164,241, -227, 23, 17, 20,213,183,190,128,161,245,250, 95, 61,128,157, 77, 89,178, 94,119,108,186,114, 28,131, 94, 90,178,192, 0,230,153, -210, 55,242, 95,212, 99, 3,244,250, 13, 72, 76,108,160,207,183,184, 47,173, 39, 8,162, 10,102,199,119, 51,204, 48,227,159,139, -218,124,135,167,255,191,127,120,176,153,211,204,249, 15,226,100,224,197, 46, 58,243,249, 52,115,154, 57,205,156,102, 78, 51, 76, - 2,101, 62, 5,102,152, 97, 50, 12,248,207, 50,152, 25,102,152, 97,134, 25,102,212,162,214, 55,171, 62,246, 0, 47, 92,119, 26, - 83,165, 45,217, 77,240, 58,202, 54,206,204,105,230, 52,115,154, 57,205,156,255, 21, 78, 62,126,191,236,109, 62,159,102,206,255, - 47,206,230,184,223,196,221,140,181, 62, 89,117,190, 89,255, 95, 48,155, 85,205,156,102, 78, 51,167,153,211,204,105,230, 52,115, -254,211,225,248, 82,100,213,127, 1,104, 97,192, 82, 51,204, 48,195,140,127, 42,194,194, 64,210, 52, 8,154, 14, 35,105,250, 40, -131,166, 67, 24, 52,141, 63,148, 10, 36, 36,164,225, 96,182,255,158,102,109, 97, 62,227,102,152,241,143, 66, 33, 26, 73, 42,109, -246,209,250,239,194, 77, 34,145,236, 6, 64, 20, 21, 21,205, 7,144,107, 62, 37,127, 63,216,216,216, 4,233,245,122,200,229,242, - 75,127, 22, 39,131,193, 32, 12, 6, 3,253,119,104,159,175, 39,198,211, 36,124,234, 62,160,145,251, 36, 29, 7, 27, 42,235,227, -133,153, 32,254, 19,139,139, 48,226,201,227,103, 56,222,130,159, 35, 71, 12,118,221, 9, 0,103,227,242, 22,225,175,137,171,213, -214,222,222,254,114,207,188, 0, 0, 32, 0, 73, 68, 65, 84,254, 60, 69, 81,148,193, 96, 88, 40,149, 74, 99, 27, 23, 66, 33, 12, - 0, 96,210, 87, 86,202,138,196, 31,191,247, 47,130, 89,163,222, 39, 83, 43, 21,149, 12, 38, 35,139,195,148, 92, 95, 48,135, 60, - 91, 81,221,235,113, 67,199, 71, 71, 71, 55,154,197,187,131, 23, 70,144, 6,223,209, 1,126,153, 25, 95,108,239,254, 85,127, 15, - 59,102,102,222, 3,225,230, 93,149,187,217, 86,238,163,103, 78, 38, 98, 41, 62, 49, 99,223,190,178,234,127,234,216,217, 8,144, - 58, 38,179, 29, 97, 52,122,128, 32,248, 4, 0,218,104, 52, 18, 36,153,201,213,235,159, 46, 7,170, 95,131,211, 70, 11,248, 51, - 57, 28, 87,131, 94,239, 64, 0, 52,131,162,138,117,106,117, 30, 11, 72, 92, 9,200,254,233,156, 44, 14,199,197,160,215, 59, 0, -192,223,177,158,102,252, 22,141, 10, 45,161, 80,120,143, 36, 73,151,250,201,112,107,243, 9,214,126, 86,255, 59,130, 32, 96, 48, - 24,242, 43, 42, 42,186,182,224,247, 45, 1, 76, 6, 80,187, 69,253, 48,128, 35,120,125,135, 99, 75, 22,139,181, 92, 32, 16, 12, - 82, 42,149, 29, 0,128,199,227, 37, 43, 20,138,203, 90,173,246,139,215,228,165, 0, 76, 18, 10,133, 3, 73,146, 28, 72,211, 52, - 65,211,244,149,234,234,234,203, 0,142, 2,120,157, 72, 9, 60,177, 88,188,193,198,198,102,234,202,149, 43,203,108,109,109,219, - 45, 91,182,236,110,121,121,249,143,165,165,165,171,209,130, 28,117,127, 49, 60, 37, 18,201, 97, 38,147,201,200,203,203, 27, 8, - 0,174,174,174, 87, 52, 26,141, 65, 42,149, 78, 3,240,172,133,124, 2, 0, 61,133, 66, 97, 87,161, 80, 24,104, 48, 24,124, 94, -230,103,124, 82, 93, 93, 29,175,213,106,239, 1,184, 5, 64,241, 55, 26, 35, 22, 20, 69, 69,190,236,235,222, 0,170,254, 12,210, -191,139,200, 2, 0,154,132,207,227,228,148,118,117,194,171, 67,251,198, 11, 19,112,107,160,172,201, 66,107, 80,127,199,209, 99, -198, 12, 33, 1, 64,163, 59, 59,250,242,213,194,147,127,114,115,218, 78,152, 48,225, 70,100,100,164,181, 90,173,198,252,249,243, - 15,199,197,197,237,148,203,229, 43,155,188,113, 8,173,151,125,190,237, 2,159, 32, 72, 0, 16, 27,141, 6,241,243,231,207,188, - 31, 39,221, 24,158,156,124,115,163, 50,229,242, 45, 35,193, 92,160, 69,191, 20, 83, 42,225,227,129,224,209, 19,199,143, 90,183, - 46, 12, 83,223,154,218, 42, 57, 89,197,115,182,204, 96,151, 43, 5, 94,182,246,226, 49,235,214, 71, 19,215,175,157, 24, 19, 25, - 17,126,121,206, 28,219, 65,255, 64,177, 69,172,101,179,221,116, 6,195,112, 18, 40,164, 44, 44, 50,192, 98,213, 0, 0,105, 48, - 48, 52,114,185,103, 13, 69, 77,255, 20,184,243,137, 94,255,192, 84,206,245, 20,213, 83,228,229, 21,248,214,137, 19, 16,186,186, - 82, 20,135, 67, 2,128, 94,173,118,173,206,203,115,140, 26, 51,166, 71,216,211,167,191,132, 1,183,205,156,255, 21, 78, 51, 90, - 34,180, 72,146,116,121,254,252,185, 88, 32, 16,188,184, 25,211, 52, 12, 6, 3, 12, 6, 67, 93,242, 98,154,166,235,254,234,245, -122,180,111,223,222,164, 25, 45,128, 65, 0,222, 30, 48, 96, 64,200, 23, 95,124,193,244,247,247,175, 77, 25,210,111,213,170, 85, -223, 36, 36, 36, 28, 3,176, 31, 47,130, 55,154, 58,227, 29, 38, 16, 8, 14,125,254,249,231,150, 67,134, 12,161,156,156,156, 64, - 16, 4,138,138,138,122,198,197,197,117, 93,182,108,217, 66,133, 66, 49, 29,192,249, 22,156, 31, 63, 11, 11,139,232,241,227,199, -187,244,239,223,159,235,235,235, 11,131,193,128, 7, 15, 30,204,185,119,239,222,148, 99,199,142,173,173,170,170, 10,129,233,249, -218, 8,161, 80, 56,203,210,210,114, 67,104,104,168,205,244,233,211,217, 73, 73, 73, 21, 30, 30, 30,196,245,235,215,237,143, 28, - 57,178,112,211,166, 77,147,228,114,249,234,234,234,234, 3, 48, 33,135,162,133,133,197, 61,146, 36, 93, 76, 17,194, 47, 31,240, -166,138,225,206,173, 91,183, 62,114,237,218,181,214,217,217,217,134,113,227,198, 29, 4,128,203,151, 47,251,235,116, 58, 98,232, -208,161,103,243,243,243, 39, 3, 48,245, 38,217,209,198,198,230,228,212,169, 83,109, 60, 61, 61,249,173, 91,183, 38, 4, 2, 1, - 24, 12, 6, 42, 43, 43,157,146,146,146, 6,223,190,125, 91, 25, 23, 23, 87,174, 86,171,199, 0, 72,108,193,117,234, 45, 22,139, -103, 48,153, 76, 63,189, 94,239, 12, 0, 20, 69, 61,215,233,116, 73, 82,169, 52, 18,192,141,215, 29, 32, 14, 14, 14, 95,111,216, -176,193, 78, 42,149,210,155, 54,109,250,186,170,170,106,150, 41,199, 69, 68, 68,144,179,103,207,254, 75,162,160,175, 91, 23,206, - 12, 13, 93,171,251,179,121, 15,255,120, 20,247,238,222, 6, 94,164,205, 33, 26,232,127, 4, 0,214,123,239,189,143,174,221,122, - 96,218,212, 73,205,114,142, 12,114,249,156,201,102,217,170, 84,170, 27,149, 53,234,163, 2, 62,119,242,212, 41,193,105, 0,112, -246,220, 47,147,187,119,183,190, 34,226,115, 38,113,185,220,222, 58,141,182,236,204,165,252, 15, 91, 34,170,156,157,157,207, 91, - 91, 91,243,203,203,203,139, 74, 74, 74,190, 27, 61,122,244,250,253,251,247, 91,103,102,102, 34, 47, 47, 15, 75,151, 46, 21,230, -231,231, 47, 74, 76, 76,188,169,209,104, 26,181,108, 85, 85,149,111, 95,245,241,216, 80,145,200,142, 33,224, 91,194, 66,100, 3, - 15,207, 78,232,217,123, 52, 70,140,122, 7,233,105, 9, 61,247, 71,172, 75,120,254, 60,238, 51,161, 77,155,245, 50, 89,235, 70, -175,173,111, 91,244, 31, 51,254,133,200, 10, 13, 13,195,211,148,148,170,236, 44,242,223,167, 79, 80,252, 17, 65,237, 57,122, 77, - 81,246,245,107, 39, 90,247,237, 55, 14, 0,186, 70, 70,132, 95,254,247, 52,235,160,175, 15, 87, 84,253, 67,158, 43,196, 58, 38, -211, 15,122,125, 91, 91, 71,199, 40,149,209, 72,235, 42, 43, 93,141, 53, 53,142, 0,160,103, 50, 53, 2,161,240,145,147,151, 87, -252,211,251,247, 3, 63,165,168,126,159, 52,157,160,188,150,115,214,176,109,219,196, 1, 11, 23,178,170,179,178,180, 25,187,118, -213, 20,199,199, 27, 40, 14,135,118, 29, 62,156,176, 31, 56,144,187,240,201, 19,214,175,155, 54, 5, 50,195,195, 61, 86,107,181, -135,204,156,255,175,156,255,235,168,117,130,175,191,251,112, 79,147, 66,139, 32, 8, 8, 4, 2, 68, 69, 69,129,201,100,130,162, - 40, 48,153,204, 70,223,187,185,185,153, 82,145, 9, 18,137,228,155,157, 59,119, 58, 12, 27, 54, 12, 92, 46,183,238, 11, 6,131, -129, 33, 67,134, 96,240,224,193,204,130,130,130, 41, 81, 81, 81, 83, 54,110,220, 88, 44,147,201, 22,227,101, 98,232, 38, 48,176, - 93,187,118, 49, 23, 46, 92,224,169, 84, 42,196,199,199,163,162,162, 2,108, 54, 27, 46, 46, 46, 24, 58,116, 40,149,146,146, 98, - 51,100,200,144,152,167, 79,159, 6, 3,184, 98, 66, 93,187,138,197,226,171, 71,143, 30,229,118,234,212,137, 72, 79, 79, 71, 64, - 64, 0, 0,160,178,178, 18,227,198,141,227, 78,159, 62,221,115,202,148, 41,183,164, 82,105,127, 0,247,154,225,235, 34,145, 72, - 14,140, 31, 63,222,105,227,198,141,150, 22, 22, 22,200,206,206, 46,148, 72, 36,222,181,231,123,202,148, 41,236,209,163, 71, 59, -110,217,178,101,123,116,116,244,135, 82,169,116, 22,128,251, 77,170,214,151,130,152,207,231,163,184,184, 24,135, 15, 31,198,162, - 69,139,192, 96, 48, 32,149, 74,113,228,200, 17,252,251,223,255,174, 21, 52, 38,137, 97, 62,159, 63,216,203,203,235,135,203,151, - 47,187, 88, 89, 89,193,201,201,137,252,228,147, 79,252, 60, 60, 60,120,173, 90,181, 98, 20, 22, 22, 34, 38, 38,198, 99,198,140, - 25, 39,115,115,115,231,168,213,234,102,151,212, 28, 28, 28,246,157, 62,125,218, 45, 57, 57, 25,187,118,237, 66,121,121, 57,216, -108, 54,172,172,172, 32,145, 72,224,237,237, 77,124,252,241,199,252,209,163, 71,243, 23, 47, 94,188, 79,163,209,116, 54,225, 26, -117, 18,139,197,187, 7, 14, 28,232, 17, 30, 30,110, 37,145, 72, 80, 59, 49,168,172,172,116,201,206,206,238, 25, 26, 26, 26,114, -239,222,189, 76,169, 84,186, 0,192,195, 22, 14,156,206,190,190,190,193,227,198,141, 99, 20, 22, 22, 34, 50, 50, 50,184,170,170, -170,179, 41,226,146,162,168,191,204, 98,101,164,105, 14,128, 63, 93,104,221,187,123, 27,243,223, 93, 90,237,228,234,202,186,112, -254,135, 9,209,199,219,222,181,226,189, 72, 72, 45, 83, 66, 27, 50,254,105,183,161,195,222, 97,141, 28, 53,174,122,207,183,219, -133,166, 8, 45, 38,155,101,123,248,208,151,185,215,174,223,243,187, 24,119,123,248,132, 49, 99,104, 22,203,202, 3, 0, 62, 92, -246, 30, 51,230,212,169,136, 33,131,123, 20,244,235,219, 53,119,218,244,247,221, 90, 80,221,182,109,219,182,253, 37, 33, 33,193, -129,195,225,160,188,188,220,118,207,158, 61, 95,246,237,219,151,204,200,200, 64, 74, 74, 10,178,178,178, 80, 89, 89,137, 33, 67, -134, 8,239,223,191,255, 29,128, 70,133,150,150, 28,180,193,169,149,110,135, 45, 79,208, 90,107,144,139,105, 93,161,239,197,211, - 23, 59,254, 20,169, 12,112,112,108,239,253,246,236,181, 88,183,254, 24,243,199,195,155, 67, 47,197,253, 4,144,173, 27,207, 8, - 64,163,247,170,213, 43, 33,175, 82, 99,250,212,121,152, 49,117,158, 45, 13,141, 35,109, 80, 9, 52,202, 10, 43, 11,214,147,216, -157,123,191, 28, 15,192,165,158,216,186,244, 79, 17, 91,235, 88,172,214, 48, 26, 61,188,199,141, 59,145,113,238, 92, 27, 90,171, -181, 99,176,217,249, 22, 54, 54,197,122,181,154,214,105,181, 44,165, 82,233,156,145,156,236,216,247,227,143, 47, 93,223,180,169, -255,167, 12, 70,183, 79, 12,134,187,141,114, 82, 84,143,224,111,190,177,247,155, 59,151,243, 48, 60, 92, 81, 26, 31,175,244, 26, - 57,178, 34,224, 95,255, 82, 3, 64, 85, 86, 22,235,233,218,181,124,251,192, 64, 94,175,229,203,173, 13, 26,141,100,221,186,117, -221, 67, 95, 36, 47,111, 17,167,219,228,201,134,208,136,136,110,241,239,191, 63,128,208,233, 24,195,123,245,122,176, 41, 50,242, -249, 31,225,252, 51,235, 89,112,245,170,186,220,195, 3, 1,227,198,149,185,137,197,234, 63,179,237,127,164,158,102,212,161,214, - 87,107,126,253, 25, 42, 98, 99, 99,251, 3,248, 5, 64,120,112,112,112, 24, 0,136, 68,162, 98,153, 76, 38,142,137,137,105, 86, -100, 49,153, 76, 56, 58, 58,194,219,219, 91, 42,149, 74, 29,154,168, 64,158,209,104,116,161,105,186,206,250,210, 24,212,106, 53, -210,210,210,208,177, 99,199,124,188, 72, 68,219,168, 81,135,207,231,103,164,164,164,216, 61,126,252, 24,247,238,221,131,135,135, - 7,172,173,173,193,100, 50,161,211,233, 32,151,203,209,174, 93, 59,112, 56, 28,116,233,210,165, 84,161, 80,120, 52,179, 4,196, - 17, 8, 4,105, 87,175, 94,117, 13, 8, 8,192,157, 59,119,224,234,234, 10,137, 68, 2, 0,200,202,202,194,245,235,215, 49,114, -228, 72, 36, 36, 36, 96,226,196,137,121, 10,133,194, 27,128,186, 49, 66, 27, 27,155,194,203,151, 47,231,251,251,251,171, 20, 10, - 5, 89, 92, 92,204,140,143,143,215, 87, 85, 85, 9, 43, 43, 43,153, 50,153,140, 41,151,203, 41,133, 66,193, 36, 73,146,165, 84, - 42,153,151, 46, 93, 98,104,181,218, 38, 3,100,214, 94,167, 83,167, 78,193,223,223, 31, 49, 49, 49,248,224,131, 15,240,235,175, -191,194,213,213, 21, 71,143, 30,197,242,229,203,145,154,154, 10, 59, 59, 59,248,250,250, 54,119,141,224,233,233,153,254,232,209, - 35, 79, 22,139, 85,155,215,177, 54, 95, 30, 74, 74, 74,240,236,217, 51, 60,127,254, 28, 94, 94, 94,152, 58,117,234,179,231,207, -159,123, 53,215,243,156,157,157, 75,146,147,147,237, 58,118,236,136,226,226, 98, 88, 89, 89, 65, 36, 18,193,202,202,170,238,189, -135,135, 7,222,127,255,125, 72, 36, 18,169, 74,165,114,104, 78, 4,249,251,251,159,191,116,233,146,157,165,165, 37,138,138,138, - 32,151,203, 65, 81, 20,248,124, 62,236,236,236,234,132,124, 90, 90, 26, 70,141, 26, 85,154,145,145, 49,172, 5, 22, 56,210,193, -193, 33, 37, 49, 49,209,155,166,105,228,230,230, 34, 53, 53, 21,239,190,251,110,154, 74,165,106,143,255, 98,206,190, 3,251, 15, -112,102,189, 61, 75,253,103,241,213,243,187, 98,205,154, 61,159, 53,126,108,111,205,147,228, 88,130, 99, 76, 69,103, 63,203, 74, - 0,120,144, 36, 23,169,201,118,240,233, 16, 76, 31, 63,121,131,125, 96,255, 30, 38,140,112, 0,129,212, 39,105,248,180, 49,238, -161, 3, 29,231,190,247,222, 28,191, 1,125,251,147, 85, 10,133,248,187,239,182,117,201,200,120, 34, 6, 0, 15, 15, 31,233,194, -133,203,238, 91, 8, 4,210, 95,174, 95, 53,126,245,213,190,164, 11, 87, 10,247,154, 80,101, 15,111,111,239,155,167, 78,157,178, - 19,139,197, 16,137, 68, 80, 40, 20,208,106,181,120,252,248,177, 42, 42, 42, 74,103,105,105,105, 81, 84, 84, 4,153, 76, 6,130, - 32,112,234,212,169, 92, 0,238,175, 18,213,250,104, 1,192,187, 35,124,152,190,131,188,173, 89, 28, 61,143,199,124,234, 8,194, -192, 33,104,161,195,217,243, 15, 58,158,189,120,103,218,248, 9, 31,216,247,235, 63, 30,161,107, 66,116, 5, 5,185, 1, 90,244, - 75,105,200, 71,171,189, 23, 6,141,155, 56,126,210,186,117, 97, 8, 11, 13, 71,236,169, 19,149, 66, 1,169,182,180, 98,138, 2, -123,246, 81,189,191,104,108, 94,117,117,129,235,186, 45, 81, 83, 71,141,125,223,165,111,191,113,184,126,237, 4, 34, 35,194,239, - 17, 60,250,141, 94, 70, 92, 11,176, 72,138,122,199,169,117,235, 67,210,130, 2,103,190, 80,200, 92, 26, 23, 39, 54, 24, 12,119, - 39, 45, 95, 94,117,252,210,165,186, 9,200, 39, 36,233,196, 96, 48,156,188, 71,141, 74, 76,143,141,125,135,163,215,199,124, 4, -148,188,202, 25, 6, 88, 91,121,120, 44, 88,146,150,198,122, 24, 22, 86,173, 47, 40,168,232,186,108, 89,105, 67,191,159,127,241, -162,128,237,228,100,105, 61,102,140,205,118,119,119, 90, 39,149,238,110,200,199,168, 33,206, 56,161,208,234,167,179,103,131,104, - 38,179,255,138,143, 62,226, 5, 7, 7, 67, 46,151,227,216,177, 99,216,189,107,151,218,209,209,241,145, 83, 82, 82,130,159, 92, -190,198, 84,206,174,203,150,149, 26, 12, 6, 98,210,242,229, 67,146,179,178, 6, 21, 73,165,173, 0,192,209,198, 38,175,171,135, -199,189,125,177,177,169, 95,183,110,109, 52,181,158,223,159, 59,231, 16,157,157, 61,215,198,198,134, 87, 44,149, 82, 28, 54,187, -172,167,175,239,209,111, 87,175,254, 69,159,152,200,226,186,184, 88,138,130,131, 91,220,246,174,203,150,149,150, 87, 85, 81, 75, -214,175,239,147, 83, 92,220,170, 90,173,246,146, 85, 85, 73, 12, 58, 29,105,201,231,151,181,105,215, 78,170,140,143, 47,108, 83, - 83,179,116, 47, 32,253,171,250, 79, 67, 90,228, 13,194,171,113,180,126,151,235,240,151,224,224,224,223,237,174,161,105,218, 36, -107, 22,147,201,252,205, 50, 85, 19, 96, 17, 4,129,251,247,239,195,214,214, 22, 18,137, 4, 28,206,111,147, 15,150,148,148,224, -215, 95,127,197,147, 39, 79,208,169, 83,167,218,101,140,198, 21, 17,135,243,222,150, 45, 91,172, 52, 26, 13,238,221,187,135,174, - 93,187,130,195,225,128,197, 98,253, 70, 4, 74,165, 82,116,232,208, 1, 43, 86,172, 16,109,220,184,241, 61,181, 90,189,174, 9, -107,196,226,121,243,230,137,107, 45, 88,121,121,121,232,210,165, 75,221,247,246,246,246,120,240,224, 1,186,118,237, 10, 23, 23, - 23,132,132,132,136, 35, 35, 35, 23,235,245,250, 47, 26,227,100,179,217,164,191,191,127, 55, 0, 16, 8, 4, 32, 73,242,169,165, -165,165,189,131,131,131,192,210,210,146,213,192,210,147,140, 36,201,102,173, 22, 36, 73,162,168,168, 8,126,126,126,168,172,124, -145,193, 69,161, 80,192,203,203, 11,114,185,188, 78,180, 58, 57, 57, 65,169,108,218,245,171, 99,199,142, 97,237,219,183, 31, 42, - 16, 8, 56, 76, 38, 19, 15, 31, 62, 68, 64, 64, 0,162,162,162,224,230,230, 6, 62,159,143,180,180, 52,248,251,251,227,234,213, -171,176,183,183, 71,135, 14, 29, 56, 98,177,248, 90,121,121,249,149,156,156,156,176, 38,234, 73, 10,133, 66, 92,189,122, 21,251, -246,237, 67, 86, 86, 22, 10, 10, 10, 96, 97, 97,129,206,157, 59,195,215,215, 23,189,123,247, 70, 90, 90, 26,136,230, 59,147,196, -219,219, 59,246,206,157, 59,118, 52, 77, 35, 50, 50, 18,213,213,213,208,104, 52, 32, 73, 18, 92, 46, 23,214,214,214, 24, 52,104, - 16,236,237,237,225,237,237,141, 35, 71,142,216,141, 24, 49,226,140, 84, 42,237, 12,160,168,185,243,106,109,109,189,116,237,218, -181,174, 98,177, 24,217,217,217,168,172,172,132,131,131, 3, 6, 12, 24,224, 28, 23, 23,183, 84,167,211,109,251,111,141,230, 63, - 83,100, 1, 64, 61,199,119,226,194,249, 31, 38,120,183,169,240,239,212,142,239, 26, 19,235,224, 26, 21, 43,237, 0, 0,126, 62, - 14,201, 19,130,249,121, 15,147, 99,243, 46,156, 63,113,239,201, 83,196,152,178,180, 93, 89,163, 62,122, 49,238,246,240,128, 78, - 93,140, 91, 54, 47, 31,181,232,221,185, 28,177,195, 59, 40,206, 61,129,184,203,247,221,150,127, 48,207,254,139,173,223,159,189, - 24,119,155,172,172, 81,175, 49,205,148,229,246,245,254,111,123,219, 85,149, 70, 35, 61,133, 13,158,133, 31, 60, 60,218, 66, 46, -151,131,203,229,114,167, 78,157,106, 88,185,114,101,141,165,165, 37,159, 32, 8, 92,185,114, 69, 10, 96, 88,115,188, 42,177, 53, -109,208,234,244, 52,155, 97,164, 9, 11, 37, 97, 40,103, 39, 61,206,196,208,193, 3,139,251,246,240,219,184,114,221,214, 85,222, -109, 3,236,231,204, 13,103,174, 15,155,182, 11, 4,250, 53,196,147,146,142,203,196,209,227, 60, 0,163,214,125, 26,134,140,140, - 52,235,249,111,203,194, 41, 14,207,169,189,123, 31,139, 93,251,174, 12,247,242,106,221,234,253,197, 33,167,191,252,230,203, 81, -245, 45, 91,251, 35,214,158, 4, 16,100,202,185,253, 59,130,164,168,118, 36, 65,228,201,107,106, 24,180, 86,107,183, 52, 46, 78, -121,225,214,173, 75,137,243,231, 91,116,100,177,218,118,100,177,192,208,106,203, 86, 3,165,159, 26,141, 5,107, 41,202, 50,243, -228, 73, 39,138,205, 78, 80, 25,141,254, 48, 26, 27,138,159,212,113, 70,108, 44,170,115,115,117,229,215,174,169,130,190,249,166, -212,117,216,176,109, 26,173,214,174,246, 86, 65, 18, 4,136, 90,215, 9,163,145,160, 86,172, 32,105,138,130,206,218,250,109, 84, - 84,180,109,142,243,131,194,194, 9,211,230,206, 29,117,242,220, 57,180,110,221,186,238,121,102,101,101,133,229,203,151, 99,217, -178,101,156, 7, 15, 30,116,143,142,142,238,254,197,231,159, 59, 0,152, 96, 74, 61, 47,220,186,101,253,175,117,235, 86,119,234, -218,213,237,224,225,195, 28, 79, 79, 79, 0,192,179,103,207,188, 55,111,218,228,238,231,239, 95,188,241,189,247,246, 39,175, 92, -217, 1,192,181,166, 56,139,226,227, 53,209,217,217,115, 47, 95,185, 98,229,231,231, 7, 0, 72, 77, 77, 21,111,223,190,125, 94, -135,144,144,233,235, 22, 46, 92, 19,172, 82,201, 44, 75, 74, 56,193, 95,127, 77,253, 52,105, 82,179,156,181,245, 4,128, 1,115, -230,188,215,111,224, 64,223, 9,115,231,218,184,185,185, 17, 66,161, 16, 90,173, 22, 5, 5, 5,214,201,201,201,158,177, 85, 85, -242,227,183,110, 69,194, 96, 24,242, 23,118,161, 6,181,200, 27,102,201,250,253,184,120,249,119, 64,108,108, 44,253, 82, 77,214, - 61,192, 13, 6,131, 73, 34,139,162, 40, 16, 4, 97,170,216, 2, 77,211, 40, 45, 45, 69, 82, 82, 18,158, 61,123, 6,133, 66,129, -204,204, 76,236,217,179, 7,155, 55,111,198,221,187,119,161,211,233,160,213, 54,159,131, 86, 32, 16, 12, 30, 60,120, 48,117,235, -214, 45,120,120,120,128,199,227,129,205,102,131,197, 98,213,189,184, 92, 46, 28, 29, 29, 33,151,203, 17, 20, 20,196, 20, 8, 4, -131,155,177, 18,141,156, 60,121, 50,187,246,255,234,234,106, 48, 24,140, 58,209, 82, 93, 93,141,242,242,114,200,100, 50, 20, 22, - 22,162, 87,175, 94,108,145, 72, 52,210,212,171, 81, 83, 83, 83, 45,149, 74,173,250,245,235,103,253,228,201,147,223,101,251,253, -229,151, 95, 84, 42,149,138, 73,146,164, 73,142,246,135, 14, 29, 66, 76, 76, 12, 46, 93,186,132,252,252,124,236,218,181, 11, 7, - 15, 30,196,169, 83,167,144,150,150,134, 29, 59,118,224,187,239,190,195,254,253,251,155,188, 70,237,219,183, 31, 17, 25, 25,217, -163,103,207,158,124, 6,131,129,212,212, 84,188,255,254,251,144,201,100,176,183,183, 7, 0, 20, 23, 23, 99,219,182,109, 80,171, -213, 16, 10,133,112,118,118,230,174, 91,183,174,175,189,189,253,208,166,234,104, 48, 24, 12, 12, 6, 3,238,238,238, 8, 13, 13, -197,119,223,125,135,243,231,207,227,232,209,163, 88,184,112, 33,124,125,125,145,144,144,128,187,119,239,130,166,233, 38, 31, 50, - 92, 46, 55,228,224,193,131, 98, 54,155, 13,163,209,136,170,170, 42,228,230,230,226,246,237,219,170, 19, 39, 78, 84,159, 62,125, -186,230,218,181,107,170, 27, 55,110,208, 0,234, 4,103,112,112,176, 45,155,205,126,203,132, 83,106, 47,145, 72, 86,205,155, 55, -143, 91,191,207, 22, 21, 21, 97,194,132, 9,124, 30,143,183, 18,128,125, 83, 4,145,145,145,127,217,205, 34, 44, 60,204,242, 47, -162,166,163,143,183,189,203, 49,166, 34, 38,246,185,107, 78,190,161,207,242, 15,183,218, 44,255,112,171, 77, 78,190,161, 79, 76, -236,115, 87,142, 49, 21,209,199,219,222, 53, 65, 8,144,131,250, 59,142,117,176,181,218, 61, 97,204, 24,250,187,239,182,117, 89, -244,238, 92,142,123,219,229,224,138,166,194,217,227, 95, 8, 10,116, 35, 58,250,146,220,239,190,219,214,101,194,152, 49,180,131, -173,213,238, 65,253, 29,199,162,153,176, 51, 98, 91,174, 51,159,163,128,167,183, 47, 6,244,239, 4, 38,145,142, 99, 71,247,161, -176,176, 16, 5, 5, 5, 40, 46, 46, 22,140, 30, 61, 26, 69, 69, 69,170, 43, 87,174, 72,149, 74,101,127, 0, 79,155,107,124,126, -254, 99,163,170,218,160, 53, 26,152,250,170, 74, 86,205,194,165,209,131,239, 38,179,102, 23,201,156, 71,179, 57,214,236, 17, 67, -186, 31,222,183, 55, 20,109,218,248,161, 91,247,161,189,172,133, 55,125, 27, 21,175, 25,136,253,249,216,241,147, 83, 39, 79,213, -103,101,102,103,182,117,224,106,104,154,214, 45,253,248,251, 33, 76,129,107, 71, 79,159, 64,251, 39,233, 6,199,208, 21,111,253, -120,250,228,151,249,215,175,157, 64,223,126,227,224,236,228,221,255,237,183,193,126, 83, 45, 90, 4, 77,123, 48,133,194, 12, 93, -101,165, 59,197,225,228, 26, 12, 6,187, 59, 11, 22, 88,105, 89, 44, 71,131, 86, 91, 96,208,106, 11,180,108,182,229, 78, 31, 31, - 23,154,166,109,173, 92, 92,158,211,108,182,155, 94,171, 77, 39, 72,178, 77,131,179,115, 14,199, 69,232,238, 78, 21, 93,184,160, -241, 24, 61,186, 2, 0, 52, 90,173, 93, 86,118,182,168, 88, 42, 21, 21, 21, 23,139,114,242,242, 68, 25,153,153,162,180,244,116, - 81, 74,122,186,229,163,164, 36,225,131, 71,143,132, 4,131,225, 96, 10,103, 86, 65, 65,199, 21, 43, 86,128,199,227, 65,175,215, - 55,116,207,134, 66,161,192,219,111,191,141, 26,160,167, 41,156, 6,131,129,248,215,186,117,171, 63, 90,189,218, 51, 38, 38,134, -211,163, 71, 15,216,216,216,192,198,198, 6, 61,122,244, 64,244,177, 99,236,133,139, 23,187,172,218,187,247,109,146,195,113,109, -142,179,212,203, 11, 54, 54, 54,188, 90,145, 5, 0,237,218,181,195,174, 93,187, 56,231,206,159, 23,125,250,195, 15, 91,195,111, -220,240, 87,231,228, 40,108,219,182,165,217, 28,142,139,169,231, 19, 0,170, 84, 42,191,109,219,183,219,218,217,217, 17,197,197, -197, 72, 79, 79, 71, 78, 78, 14,244,122, 61,186,117,235, 70, 28, 61,118, 76,164, 97, 48,186,255,197, 93,232,119, 90,228, 13,194, -124, 52, 18, 71,139,122,249, 0,186, 10,128,136,141,141,165,107,151, 19, 95, 62, 28,235,196,148, 41, 66,235,117, 32,147,201, 32, -147,201,176,119,239,222, 58, 97, 84, 11,141, 70, 99,138,104,241,119,114,114, 66,101,101, 37,218,182,109,251, 27, 75, 22,139,197, - 2, 69, 81, 96,177, 88,224,112, 56, 80,171,213,112,115,115, 67, 77, 77,141,127, 83,156, 74,165,178,179,141,141, 77,221, 3, 86, -173, 86,215,137,172,218,250,106, 52, 26, 84, 84, 84,160,186,186, 26, 85, 85, 85, 80, 40, 20, 1,166,180,215,104, 52, 34, 41, 41, -233, 89,187,118,237, 58, 51, 24, 12, 8,133, 66,129, 66,161,168,243, 45, 42, 47, 47,199,129, 3, 7, 20, 51,103,206,180, 59,117, -234, 84,179, 9,139, 9,130,192,191,255,253,111,112, 56, 28,212,212,212,224,187,239,190,195,146, 37, 75,192, 98,177, 80, 85, 85, -133, 93,187,118,225,253,247,223, 7, 69, 81,208,104, 52,216,190,125,123,163, 92,143, 31, 63,206,186,117,235, 86, 64,151, 46, 93, -172,143, 31, 63, 94, 50,100,200, 16,251, 97,195,134,129,199,227, 65,169, 84, 66,167,211,161,103,207,158,104,223,190, 61,164, 82, - 41,206,158, 61, 91,234,237,237,109,119,251,246,109, 99, 81, 81, 81, 78, 51,226,154,174,103, 49,132,193, 96, 64,113,113, 49,100, - 50, 25, 74, 74, 74, 80, 80, 80,128,252,252,124, 80, 20,133,102,116, 22,108,109,109, 39,250,249,249, 49, 0,128,199,227,161,115, -231,206, 88,189,122,181, 94,169, 84, 78, 6,112,246,101,177, 17,223,127,255,253,241,235,215,175, 83, 78, 78, 78, 72, 73, 73,129, -189,189, 61,197,229,114,223,210,104, 52, 77, 90,163, 36, 18, 73,196,207, 63,255,108, 83, 43,174,107,207,115, 77,205,139,203, 49, - 97,194, 4,155,131, 7, 15, 70,232,245,250, 70,197,117, 97, 97,225, 95,103, 53, 32, 24,234,191,138,219,138, 7, 86,103, 63,203, -202,168, 88,105,135,229, 31,110,165,218,251,189,152,188,206, 95, 0,234,139,207, 63,232, 48,125,172,229,105, 43,158,156,213, 28, -207,136,193,174, 59,199,140, 25, 66, 78,157, 18,156,198, 98, 89,121,236,222, 19, 46, 22, 59,188, 83,175, 17,150,176,181,179,132, -135, 59,155,136, 62,253, 68,252,241,202, 79,213,135, 14,126,153,241,227, 79,177,195,217,204,139, 67,207,198,229, 45,108,140,251, -233, 51,217,169, 26, 53,215, 71, 94,150, 72,216, 56,244, 65,231, 78,237, 32,182,175,192,247, 17, 81,104,221,166, 27,212,106, 53, - 44, 45, 45,249, 6,131, 65,203, 96, 48, 14,153, 34,178, 0,224,210, 37,153,177, 67, 7,153,134, 81,101,212, 47, 90,242,197,248, - 33, 35,198,248, 14, 26, 52,216,120,225,226, 5,109,159, 0,109,225,136, 97,157,139,207, 93,220,153, 86, 88,144,233,221,193,191, - 47, 30, 39, 95, 25, 78,211, 72, 34,136,134, 69,103,114, 58,206,169,140,143,175, 68, 69,205, 55, 42,141, 9,188,245, 27, 30,141, - 24, 53,106,150, 95, 96,191, 64,227,197,184,203, 26, 54, 74,159, 88,246,237,253,124,209,220, 17,199,127, 56,180,125,232,185,179, - 17, 94,149,242,156,216,253,251,161,198, 27, 10,154, 32,236, 45, 4,130,146,178,170,170, 78, 19,195,195,229,147,150, 47, 63,223, -145,162,124, 13, 90,109,102, 56,160,164,105,154, 48,234,245, 43, 31, 29, 62,204, 8, 35,136,143,195, 1,227, 6, 6,131,153,111, - 52,214, 56,147, 36,127, 45, 64,133,191,178,147,219,160,215, 59, 80, 28, 14, 89,114,229,138,222,255,157,119,212,181,227,145,207, -231,227,228,201,147, 96,179,217,117, 47, 22,139, 85,247,222,193,193, 1,196,203,109,164,191,155,248, 53,192, 89, 59,110,139,138, -138, 32, 18,137, 96,111,111,143,162,162, 34,220,184,113, 3, 79,159, 62, 5,147,201,196,240,225,195, 65, 54,226,219,252, 42,231, -164,229,203,135,248,248,251,187, 45, 88,176,128,124,245,249,168,213,106, 81, 94, 94,142,177, 99,199,146,103,207,158,149,156,203, -205, 29, 3,224, 80, 83,156, 1,163, 70,149, 21, 71, 71, 55,248,219, 93,186,116, 33,126,253,245, 87,206,240, 97,195,150,125,176, - 97,195,206,175, 15, 30,204, 51,232,245,146,150,180,157, 36, 73,146, 32, 8,184,186,186,162,188,188, 28,213,213, 47, 86,176,133, - 66, 33,172,173,173,161,211,233, 96,164,105,230, 95,217,127, 26,211, 34,111, 8,246,212, 19, 92,191,177,108, 81, 47,215, 69,107, -111, 20, 3,234, 63, 88,140, 70,163, 73, 34,139,201,100, 54,235,115,101,138,149,235, 85,152, 34,180,106,235,202,229,114,127, 99, -201,170, 21, 88,181,245, 36, 73, 18, 12, 6,163,217,135,248, 75, 49,196,168,170,170,194,177, 99,199,208,191,127,255,186,101,169, -202,202, 74,200,100, 50, 84, 86, 86, 66,165, 82, 33, 43, 43, 11,151, 46, 93,130,151,151, 23, 96, 98,240,215,140,140,140,123,173, - 91,183,238, 90,251, 16, 31, 56,112,160,203,254,253,251, 11, 70,142, 28,233, 68,211, 52,214,172, 89, 83,218,179,103, 79,187,250, - 15,249,230,192, 96, 48,112,227,198, 13,120,121,121,129,166,105,176, 88, 44,164,166,166, 66, 44, 22,195,104, 52,130,162, 40,148, -148,148,192,194,162,233, 24,137, 73, 73, 73,179,231,204,153, 83, 32, 18,137, 58,150,149,149, 21,114, 56,156,126,241,241,241,174, - 90,173, 22,150,150,150,176,180,180,196,153, 51,103, 96,101,101,133,247,222,123, 47, 87,169, 84,222, 16, 8, 4, 14, 74,165, 50, -177,168,168,104, 77, 75,174,183, 94,175,135, 66,161, 64, 69, 69, 5,202,203,203, 33,151,203,161, 82,169,154,173, 99, 67,232,215, -175, 31, 98, 99, 99, 25,159,125,246,217, 15, 25, 25, 25, 0, 0, 15, 15, 15,188,247,222,123, 12,103,103,103,100,101,101,225,222, -189,123,208,106,181,160,105,186,201,193, 75, 81,212,192,153, 51,103,246,117,115,115, 35,180, 90, 45,140, 70, 35,212,106, 53,106, -223,231,230,230,194,199,199,135,116,119,119,239,149,145,145, 49, 16,141,108,172,168, 63, 97,248,179, 17, 26,250,137, 6,111, 32, -138,115, 79,192,153, 41, 6, 72, 75,208,202, 19, 40, 43,125,189, 40, 46, 82,169,116,195,138, 79,126,125,231,235, 45, 90,135,252, - 66,160,157,223, 56,120,251, 6, 97,246, 12, 61, 62,251,252, 24,220,220,219, 33, 39, 39, 7, 3, 7, 14,100, 21, 20, 20,204,169, -174,174, 94,110, 42,247,197,139,183, 12, 23,206,156, 13,153,244,214,172,174,131, 7,143,212,159, 63,127, 6, 73,137,231,147,231, -188, 53, 81, 74, 27,171, 9, 27, 43, 94, 66,106,202, 93,239,142,157, 7, 64,163, 55,244, 3,194,182, 0, 97,116,227,227, 29,154, -211,167, 29,201,211, 39, 34,102, 76,157,254,118,167,160,160,161,186,243, 23,127,198,189,155, 23, 31,110,221, 50,239,234,103,219, -143, 12, 28, 50,124, 98, 7,123,135, 27,103,252,218,170,231,186,218,138,158,125,191,191, 28,111, 48, 40, 22,151,171, 7, 64, 90, -185,187,187, 28,191,116, 41,187, 51,147,201,176, 4, 12, 52, 77,183, 3, 96, 71, 82,212,170, 83,115,231, 6,248,188,124,144,234, - 1,163, 15, 64, 86, 2, 26, 1,192, 70, 35, 33,115, 40, 46,215,136,151,247, 69,146, 32, 64,211,244,111, 68,214,171, 66,139, 36, -201,102, 13, 0,245, 57,235, 63,139,106, 39,212,187,119,239, 6,135,195, 1,155,205, 6,147,201,108,214,253,162, 62,103,114, 86, -214,160, 3,135, 14,113, 26, 18, 89,101,101,101, 40, 43, 43, 67,117,117, 53,166, 76,153,194, 10,191,123,183, 11, 94,186,126, 52, -198,233,230,232,168, 22,240,120,197,143, 31, 63,118,242,245,245,253, 77,125,229,114, 57,120, 60, 30, 14, 29, 62,204, 10, 30, 53, -234,221,160, 51,103,182,162,153,248, 87, 13,181,157, 32, 8,136,197, 98, 88, 91, 91,131, 32, 8,232,245,122, 20, 21, 21, 33, 57, - 57, 25,119,239,222, 5,131, 32,244,127,101,231,105, 72,139,188,129, 86,173,223, 45, 31,214, 90,180,136,198,172, 47,166, 10, 45, - 6,131,241,218, 86,173,198, 96,202,210, 33,159,207,127, 84, 80, 80,208,199,217,217, 25,122,189,190, 78,104,213,183,196,213, 62, -244,120, 60, 30, 30, 60,120, 0, 62,159,255, 72,165, 82, 53,201, 73,211,116,175,238,221,187, 35, 38, 38, 6, 87,174, 92, 65,102, -102, 38,106,106,106,160, 86,171,161, 84, 42,145,156,156, 12,163,209, 8, 63, 63, 63, 8, 4, 2,240,249,252, 71,181,150,175,198, -160, 80, 40, 10,153, 76,102, 59, 30,143, 87,247,153,163,163, 35,202,202,202,140, 58,157, 14, 7, 14, 28,144, 75, 36, 18, 1,143, -199, 51, 89,184, 18, 4, 1,169, 84, 10, 23, 23,151, 58, 31,173,170,170, 42,136,197,226, 90, 97, 1,181, 90, 13, 11, 11, 11,208, - 52,221,220, 53, 82,165,167,167,127, 80,239,255,110,147, 38, 77,250, 49, 42, 42,170, 77, 92, 92, 28,110,223,190, 13,123,123,123, -108,220,184, 49, 51, 59, 59,123, 42,128,187, 82,233,159,235, 23,105, 74, 31, 42, 43, 43, 59,246,232,209,163, 94,221,187,119,175, -187, 75, 12, 28, 56,144, 24, 56,112,160, 93,125, 83,127, 73, 73, 9,238,220,185,131,184,184, 56, 16, 4,129,180,180, 52,131, 82, -169,252,177, 9,106,150,179,179,243,254,213,171, 87, 11,245,122,125, 93,223,230,241,120,224,114,185, 96,177, 88, 96, 48, 24,200, -206,206,198,216,177, 99, 69,223,124,243, 77,132, 90,173,246, 4,240,187,142,186,108,217,178, 55,210,199, 70,166,132,246, 65,146, - 92,228,231,227,144,188,103,247,103,125,230, 47,120,113,143,216,179,251, 51,189,159,143, 56,249, 65, 82,177,168,171, 24,205, 14, -204,179,113,121,139, 52,186,179,163,207,158,251,101,242,135,203,222, 99,122,120,248, 72,227, 46,223,119, 11,210,127, 74,216,218, - 89,162,172, 84,142,236,220, 98,100,228,104,104, 15, 15, 31,233,189, 59,143, 56,159,111,251,202, 91, 81,163, 58,114,249,106,225, -207,205,208,171,174,221,200, 28,183,117, 7,231,234,172, 57,221,216, 60,158, 19,202, 75, 31,193,205,205, 30, 99,131, 59, 98,223, -193, 27, 16,137,108,224,224,224, 0,146, 36, 5,166,182,189,180,180,148, 56,246,211,181,119,102,190, 61,175,231,176,161,163,244, -231,206,159,166,174, 92, 56,117, 35, 98,207,170,227, 52, 67,193, 39,232, 42, 94,171,214,146,196,103,233, 15,166, 14, 26, 60, 5, - 60,150,133, 23,208,190,193, 14, 91,183,193,128, 70,110, 76, 84, 24,119,230,219,243,123, 15, 27, 54, 70,127,254,252, 9,156, 63, -115,240,214,218,181,173,206,100, 62, 63,204,186,121, 55,159, 59, 46,100, 97, 69,236,217, 39,154,137,163, 91, 63,117, 18,116, 86, - 2,153,111,172,202, 34, 9, 66, 94, 90, 82, 98,201,100, 50,149, 17,211,166,165, 1,128,142,162,202,170, 24, 12,123,130, 32, 82, - 1,164,110, 0,236,192,102, 87, 78,210,235, 13,203,221,220, 88, 84, 97, 33,163,194, 96, 48, 48, 0,246,135,191,207,191, 8, 6, - 69, 21,235,213,106, 87,151, 97,195, 24, 53, 57, 57, 76,161,131,131, 30, 0,116, 58, 93,179, 66, 11,141,108, 90,121,149,211,212, -246,213,212,212,192,216,136, 16,124,149,179, 72, 42,109,245,114, 18, 94, 7,157, 78, 87, 39,178,202,202,202, 32,147,201, 32, 16, - 8, 80,162, 86, 59,152,194, 57,180, 71,143, 3,225, 97, 97,203,163,143, 29, 99,213, 23, 89,181, 47, 38,147,137,205, 91,182,176, -150,124,248,225,194,119, 41,106, 41, 26, 88, 6,109,236,124,214, 78,218, 25, 12, 6, 40,138, 66, 78, 78, 14,114,115,115,145,147, -147,131,156,156, 28,240,120, 60,208,127,241, 38,160, 55,216, 63, 11,245,150, 10,231,191,106,229,106, 50,188, 67, 75,156,225, 77, - 21, 6, 6,131,225, 79, 21, 90, 10,133, 34,238,210,165, 75, 61,198,141, 27, 71,221,186,117, 11, 18,137,164, 78,104,213,254,173, - 93,142,226,243,249, 56,126,252,184, 86,161, 80,196, 53, 51,152, 46,157, 57,115,166,107,104,104, 40,115,246,236,217,120,252,248, - 49, 22, 44, 88, 0,153, 76, 6,185, 92,142,178,178, 50,212,212,212,160, 71,143, 30,224,114,185, 72, 76, 76,212,213,212,212, 92, -106,110,233, 76, 42,149, 86,219,219,219, 59,190,250, 93, 72, 72,136,195,183,223,126, 91,147,146,146,162,235,211,167,143,165,169, -130,163, 22, 63,253,244, 83,157,165,238,233,211,167,248,246,219,111, 65,211, 52,104,154,198,253,251,247,241,197, 23, 95,212,197, - 62,107, 33,238,150,150,150,234,117, 58, 29,188,188,188,224,236,236, 12,149, 74,133,175,190,250, 74, 15,224,238,127,171, 55,171, - 84,170,232, 89,179,102,125,148,144,144,224, 72, 81,212, 11,147,246,203,246,105,181, 90,164,167,167, 35, 57, 57, 25, 41, 41, 41, - 40, 47, 47,175,155, 8, 60,120,240,160, 66,167,211, 29,105,140,215,222,222,126,205,190,125,251, 36,124, 62,255, 55,253,185,214, - 26, 90,107, 37, 45, 41, 41,129,149,149, 21,130,130,130,196,151, 46, 93, 90,163, 86,171, 67,241,207, 0, 17, 50,254,105,183, 37, -139,198, 97, 66, 48, 63, 47, 38,246,249,175, 95,124,254,193, 3,214,187, 21, 0, 0, 32, 0, 73, 68, 65, 84, 75,103,120,113,242, -132, 96,231,188,135,169, 86, 8, 25,127,162, 27,128,124, 52,237,167,101,188,124,181,240,100,247,238,214, 87, 98, 78,157,138, 88, -185, 98,217,253,229, 31,204,179,175, 81, 62,227,122,184,179, 9, 0,200,200,209,208,137,143,141,170, 47,182, 46,187,255,217,150, -111,200,226, 50,217,130, 59,119, 26, 15,111, 80, 95,188,144, 36,184, 30,237,251, 23,120,183,237,219,250,214,141, 67, 16,242,149, -104,215,190, 27,134, 13,237,133, 43,191, 60, 64, 81,137, 10,133,133,133, 80,171,213, 77,134, 75, 72, 73, 60, 62,131, 38,104, 55, -130, 38,114, 9,146,230,206,152, 53,183,223,168, 81, 99,232,216,216, 83,250, 19,199, 15, 93, 63, 18,185, 35,154,100, 49, 41,165, - 70,164, 33, 8, 85, 37,200,164,199,213,138, 23, 19, 26, 38,135,213,184,249,245,101, 96, 87,223, 14,237, 37, 51,102, 45, 16,141, - 28, 49,150, 62,115,230,132,241, 72,212,129, 43, 71,246,250, 31, 50,146,114, 86, 97, 94, 13,167, 82,174,171,164, 9,182, 85,181, -220, 88, 83,156,225,169,114, 26, 21,162, 5,162,223,216, 14, 68, 27,141, 57,180, 70,211, 26, 76,102, 30,173,215, 75,160,211,149, -135,171, 84,207, 63,101,179, 91,253, 31,123,215, 29,223, 84,245,190,159,155,221, 38,221,139, 14, 90, 70,129,210,197,178,128,178, - 87, 89, 45,162, 40,136,162, 56, 25,138,162, 44, 65, 16, 16, 80,134,130,128,130, 44, 21,144,189,161, 32, 80,164,165,140,130,108, -232,166,133,206,164, 77,186,146, 54,251,142,243,251,131,182, 22,236, 72, 10,250, 83,191,121, 62,159,124,114,115,115,239,147,115, -206, 61, 57,247,185,239,121,207,251, 46, 16, 8,158, 1, 69,113,102,138,210,194,100,202, 2, 0,183,220, 92, 31,147,147, 83, 33, -223, 96,104, 3,150,173, 51, 0,178,217,104,204,175,204,203,243,113,235,219, 87,114,111,225, 66,105,179,238,221, 13, 84,149, 15, -113, 67, 66,139,207,231, 3, 60, 30,103, 9,167,165,245,211,235,245,224,234, 9,173,210, 24, 39,195, 48,143,136,172,106,161, 85, -253,127,177,132,115,211,130, 5,151, 3,134, 12, 41,141,143,143,111,214,175, 95, 63,170,162,162, 2, 21, 21, 21,143,136, 45, 95, - 95, 95, 42, 52, 60, 92,186, 59, 46, 46,208,210,246,180, 72, 68,243,120,127,185,208,250,151,163,222, 68,210,130, 70,166,208, 44, - 22, 90, 22, 90,180,104,154,166,225,229,229,133,226,226,226,122,111,252, 60, 30, 15,246,246,246,213,115,196, 13,174,188, 51, 26, -141,171,103,204,152, 49,101,216,176, 97, 30,237,219,183,135, 74,165, 66,179,102,205, 96,103,103, 87,227, 59, 86,205,119,253,250, -117,252,244,211, 79, 26,163,209,184,186, 17,206,111, 87,172, 88,241,193,168, 81,163,220,188,189,189,225,234,234,138,219,183,111, -195,213,213, 21, 26,141, 6,105,105,105,112,116,116,172,241,219, 57,122,244,104,133,209,104,252,182, 17,241, 70, 18, 18, 18,204, -142,142,142,183, 85, 42, 21,191,180,180, 84, 80, 86, 86, 38,208,104, 52, 66,181, 90, 45, 60,121,242,164,135,179,179,179,238,236, -217,179,170,128,128, 0,254,253,251,247,249, 52, 77, 55,170, 94, 41,138,194,212,169, 83, 33, 18,137, 96, 52, 26,177,122,245,106, -204,152, 49,163,198, 39,107,197,138, 21,152, 59,119,110,141,112,222,188,121,179,117, 3, 39, 33, 48,155,205,160,105,218,226, 5, - 10, 79,244, 68,108,153, 96, 47,204,200,200,136,238,214,173,219,233,125,251,246,185, 87,197, 36, 67, 81, 81, 17,138,138,138,160, - 82,169, 80, 89, 89, 9,134, 97,224,231,231,135,162,162, 34, 28, 62,124, 88, 93, 81, 81, 49, 4, 13,172, 56,228,243,249,227,123, -247,238, 45,120,188, 12,213, 79,121,213,226, 93, 34,145, 64, 46,151,163,127,255,254,226,248,248,248,241, 0,254,213, 66,171,118, -120,135,193, 67,222, 17,133,132,245, 48,221, 74,138,201, 11,110, 85,148, 55,110,164,211,113, 0,184,121,183,200,249, 86,154, 11, - 66,194,162,201,224, 33,174, 17, 69,133,155, 58, 0, 48, 55,148,174, 7, 0,156,165,146,209,145,131,186,203, 29,101, 50,222, 55, - 43, 55,255,250,195, 15,223, 62,179,255,248, 31,225, 29,190, 89,249, 48,188, 67,228,160,238, 92,106, 74,234,104, 0, 91, 44, 21, - 47,209,209, 35,110,252,180,245, 39,164, 38,157,245,253,116,106, 71,113,105, 17, 13,123, 7,127, 68,116,110,134, 77, 91,239,224, -214,173, 91,133, 38,147,169,127,131,253,155, 34, 1, 73,201,119,131, 58,132,133,122,191, 62,126,130, 83,116,244, 72,196,196, 28, -193, 47,219,182, 36,188, 52,118,212,143, 5,101, 26,190,151, 80, 42,146, 18, 78,204, 23, 57, 11, 68, 18,123,165,201,244, 48, 2, -129, 80,104,231, 4,140,110,240,198, 51,105,194, 56,231, 1,131, 70,226,248,137, 35,248,101,219,166,115,159,135,189,188,165, 85, -151, 16,170,251, 51, 95, 79,110,213,186, 85, 11,109,101,145,134, 71,137,205, 6, 3,231,248,245,182,236, 85, 89,115,199,103, 1, - 88,137,127,233,170, 67, 49,203,222, 50,154,205,227,252, 35, 34,174,202,175, 94,237,240, 21, 77,187,125, 6,148,126,110, 50,101, -239, 3,242,202, 1,222,196,170, 49,125, 37, 96,167, 23, 8,124,156,121,188,155, 21, 44, 59, 12,124,126, 18,234,126, 16,191,253, -203,240,225,221, 62,202,204, 20,121,246,234,101, 47,143,139,147, 86,101, 34,105, 80,104, 9, 4, 2,144,250,167,186, 30,225,164, -182,111,231, 1, 15,167,252,235, 27,227, 68, 34, 17,116, 58, 29,104,212,107,209,125,132,211,231,212,169,188,204,204,204,118,110, -110,110,143,136,172,210,210,210,154,109,131,193, 0,157, 78, 7,123,123,251, 36,125,221, 51, 34,143,112, 22, 37, 36, 24,150, 77, -157, 58,255,213,177, 99,215,158,249,237, 55, 59,119,119,119,168,213,234, 71,132,150,201,100,194,128,129, 3, 69, 43,110,220,120, - 29, 26,205, 2, 75,218,179, 89,255,254,141,250, 3,243,249,124,112,127,241,212,225,127, 0, 19,234, 18, 94,188,198,166,112, 44, - 93,117, 88,207, 13,242,241,213,125,115, 35, 34, 34, 12,233,233,233, 8, 8, 8,168, 17, 43,181,127,211,201,201, 9, 46, 46, 46, -184,126,253, 58,190,252,242, 75, 61,128,185,141,112, 86,232,116,186, 87, 34, 35, 35,245, 2,129, 0,193,193,193, 53,241,179, 56, -142,131, 88, 44,134, 76, 38,195,141, 27, 55, 48, 98,196, 8,157, 78,167,123, 5,127,142,161,245, 56,167, 90,167,211,189, 54,120, -240, 96, 93,114,114, 50,122,247,238,141, 91,183,110,161,178,178, 18,149,149,149,120,240,224, 1, 66, 67, 67,161,211,233,176,126, -253,122,189, 78,167,123, 13,128,186, 33,206,138,138,138, 17, 51,102,204,224,239,218,181,171,149,159,159, 95, 88,215,174, 93,219, - 15, 28, 56,176,205,139, 47,190,216, 98,248,240,225, 62,237,218,181, 51, 12, 25, 50,196,115,216,176, 97,158, 58,157, 78,120,241, -226, 69, 5, 77,211,195, 26, 41,103,141, 56, 73, 79, 79,175,153, 42, 20, 8, 4, 40, 46, 46,174,137,220, 95, 61, 40,213, 35,132, - 7, 53, 38,182,171, 5, 86,181,224,178,192,207,173, 46,206, 70, 79, 18,139,197,213, 22, 79, 98, 1,231,205,148,148,148,200,190, -125,251,222,124,231,157,119, 42, 10, 11, 11,225,232,232,136,192,192, 64, 4, 5, 5,193,195,195, 3,102,179, 25,135, 14, 29,210, - 30, 62,124,248,142, 90,173,238,143, 63,199,208, 26,244, 88, 59, 62,168,107,144,173,182,102, 85, 11, 45, 59, 59, 59,248,249,249, - 85,183,237, 3,107,218,179,137,248,107, 57,171, 4,204,192, 1, 67, 90, 15,143,122,193,249,208,145, 75,226,181,235, 14,223,137, - 24,132,205,238, 45, 53, 71,221, 91,106,142, 70, 12,194,230,181,235, 14,223, 57,116,228,146,120,120,212, 11,206, 3, 7, 12,105, -157,156,148,218,190,118,222,195,186,202,105,103,103,215,163,119,175,136,178,248, 11,231,184,165, 43,190,231, 13,232,255,210,141, - 45, 63, 30, 58,180,229,199, 67,135, 6,244,127,233,198,210, 21,223,243,226, 47,156,227,122,247,138, 40,179,179,179,235, 97, 73, -221, 39, 77, 24,231, 28, 53,124, 36, 98, 98, 14, 49,251,119,175, 95,177,231, 64, 70,223,119,167, 36, 20,165,167,223, 34,202,252, - 83, 16,242,114,144,146,146,162,174, 18, 89,233,150,112, 78,124,111, 92,109,145,117,222,221,187,247,230,148, 20,176,177,177,199, -232,223,126,187,161, 63,127, 83,169,190,150, 92, 92, 42, 87,149,222,215,104, 74, 76, 28,199,130,101, 89,254, 23, 95,212, 56,236, -214,121,141,122,246,236,135,179,103,118, 98,219,214,141,106,142,131, 97,244,254,253,236,232,209, 11, 73,139,150, 45, 91,236,216, -189,147,138,126,254, 5,103, 2,112, 35, 70,141,116,217,181,103, 23,213,186,109,235,150,129,129, 53, 33,109,254,117,125,233, 83, -160,146, 2, 82, 20,191,255,222,213,161,119,239,219,140, 80, 24,180, 72, 36,106,179, 6, 16,143, 6,216,137, 0,189, 0,224, 45, - 0,252,244, 2, 65, 39,123,134,185, 85,161,211, 53, 7,128,197,132,220,175,139,115, 33, 80,166,201,201, 57,119,253,251,239,141, -205, 94,121,197, 77,220,172,153, 19, 88,150,170, 30,223,235,123, 9, 4,130,199, 45, 48,245,114,250,121,120, 20, 28, 61,122, 20, - 65, 65, 65,240,243,243, 67,109, 31,217,234,128,220,238,238,238, 56,112,224, 0,200,163,193,169,235,229,236,210,170,213,245,229, -203,150,153, 56,142, 67, 89, 89,217,159,172, 89,101,101,101,224, 56, 14, 39,142, 31, 55,105, 30,102, 2,177,168,238,253,249,252, -202, 87,251,244, 89, 26, 21, 21,101,206,204,204,172, 89,121, 93,109,217, 82, 42,149,112,112,112,128,193,104,244, 7, 32,181,132, - 83,121,242,164, 12,141,140,235,117, 88,180,254,138,190,244,111, 23, 89,181, 19, 74, 79,176,200,162,197, 48, 12,252,253,253, 31, - 73,233,194,227,241, 30,121, 89,185,226,112,123,114,114,242,169, 33, 67,134,204,127,246,217,103, 39,205,159, 63,159,223,190,125, -123,168,213,106,184,186,186,194,203,203, 11,105,105,105, 56,122,244, 40, 91, 92, 92,188, 1,192, 34,212, 17,192,174, 14,196,101, -100,100, 68,119,236,216,113,207,236,217,179,157, 7, 15, 30, 44,244,247,247, 7, 33, 4, 55,110,220,192,193,131, 7,205, 91,182, -108,209, 84,137,172, 56, 11,203,122, 90, 46,151,191, 52,108,216,176, 29,227,199,143,119,100, 89, 86,248,224,193, 3, 24,141, 70, -208, 52,141,220,220, 92,115, 76, 76, 76,165, 78,167, 27, 7,224,180, 5,124,215,203,203,203, 67, 99, 99, 99,199, 95,188,120,241, -203,119,222,121,199,125,224,192,129, 34,134, 97,112,225,194, 5, 85,151, 46, 93,188,148, 74,165,249,192,129, 3, 37, 6,131, 97, - 46,203,178, 22,165,224,161, 40, 10, 26,141, 6, 30, 30, 30, 48, 26,141,224, 56, 14, 38,147, 9, 14, 14, 14, 53,105,147, 8, 33, -176,198,185,254,177, 62,192, 55,155,205, 24, 59,118, 44, 56,142,195,234,213,171,193, 48,140,213,100,206,206,206,215,110,222,188, - 25,221,185,115,231, 26,241, 82,221,135, 36, 18, 9, 60, 60, 60,224,238,238,142,152,152, 24, 8,133,194,107,141,249,187, 85,225, - 86,113,113,113,151,216,216,216, 30,119,238,220,121, 3, 64,103,179,217,236,199,178, 44,197,227,241, 20,132,144,219, 26,141,230, - 71, 88,152,130, 71,169, 84,126,249,230,155,111,118,217,185,115,167,131, 64,240,199, 95, 67, 32, 16, 64, 34,145,160, 58, 56, 38, - 33, 4, 38,147, 9,243,230,205,211,104,181,218, 47,255, 43,163, 68, 68,215,238,216,180,126,141,195,111,103, 79,169, 82, 50,112, -208,213, 53,229,241,254,151, 95, 84,184,169,131, 60, 47,207, 33,162,107,119,139, 56,105,147,185,228,181,113,211, 2,170, 82,240, -204,123,240, 32,123,227,142,237,171,178, 0,224,235,111, 87,183, 43, 42, 41,159,152,146,156, 58,122,195,134,221, 61, 24,179,185, -196, 18,206, 63,196,203, 14, 53, 8, 12, 0,174,220,184, 83,212,106,196, 43, 39,231,182,109,237,244,188,178, 68, 95, 80, 89,169, -251, 16, 64,150,165,117,239,213,179, 47,206,158,222,133, 95,182,237,208, 16,142,111,240,240,240, 32, 0,144,146,226, 65, 82, 82, -202,201, 31,126,197, 46, 90, 33,185,181,104,218,135, 3,167,169, 53,165,223,174, 94,223,240, 84, 74,199, 78,207,162, 99,167,103, - 49,229,195,207,156, 67,195,130, 3, 0, 96,255,126,176, 97,109,147,143,205,255,124,225,243,139, 22, 45,132,166,194,136,234,116, - 61,105,119,147,143,103,101,193,244,111,238, 71,243, 25,230,194, 34, 66, 94,212, 37, 36,116,232, 49,115,230,239,231,191,249,166, -149,154,207,239,249, 5,192,241, 40,138, 5, 33,246, 60, 30, 79, 33,163,233, 27, 21, 98,177, 15,197,113,207, 56,178,236, 33,186, -129,252,159,243, 25,230, 10,166, 77,107,167, 43, 45,245,236,245,233,167, 30,130,153, 51,121, 13, 57,195,215,254,255, 90,194,121, -245,246,237,227, 19,223,125,183, 96,193,252,249, 67, 54,108,220,104,223,161, 67, 7, 20, 22, 22, 34, 56, 56, 24,126,126,126,136, -141,141,197,129,189,123,181,229, 21, 21,115, 1,252, 96, 9,231,246, 19, 39,210,218,135,133, 21,111,220,184,209, 55, 42, 42,138, -210,106,181, 80,171,213, 80,171,213, 48, 26,141,168, 10, 8, 77,210, 51, 50, 82,104,154,222, 96,105,221, 89,149,202,110, 81,247, -238,249, 34,142, 91,254,210,168, 81, 51, 22, 45, 94, 44,105,221,186, 53,101, 52, 26,107,172, 90,102,179, 25, 14, 14, 14,102,147, -201,228,142, 58,252,222,234,226,148,108,217,194,168, 84, 42,120,122,122,214,132,107,170, 29,151,176,162,162, 2,132,144,255,108, - 2,244,191, 18,245, 42, 36, 87, 87,215,107, 2,129,160,121,109,235, 86, 93,185,243,106,239,163,105, 58,191,184,184, 56,226, 49, -197, 91,159, 63, 84, 32,128,175, 6, 12, 24,240,210,244,233,211,169,248,248,120, 28, 62,124,152,100,101,101,237,175,178, 98,101, - 53,240,244, 84, 31,167,163, 68, 34,249, 88, 38,147, 13,170, 14,225, 32,149, 74,239,104,181,218, 51, 85,211,133, 21, 77,224,116, -146, 72, 36, 83,101, 50, 89,100, 85,250, 21, 56, 58, 58,222,212,106,181,177, 70,163,113, 13,234, 79, 84,221, 16,167,189,179,179, -243,151, 30, 30, 30,175,205,156, 57,211, 61, 33, 33, 65,113,246,236, 89, 81,121,121,249, 78,147,201,212, 80, 82,233, 63,113,186, -185,185, 93,227,243,249,205,255,162,107,132,142, 29, 59,198,140, 24, 49, 34,106,220,184,113,160,105, 26, 63,252,240, 3, 98, 99, - 99,143,223,187,119, 47,186,145, 39,220,199, 57, 61,154, 55,111, 30, 63,105,210,164, 22, 99,199,142,149,186,186,186, 66, 32, 16, - 64,171,213,226,222,189,123,184,113,227, 6, 57,114,228, 72,229,245,235,215,243,117, 58, 93, 63, 0,197, 86,180,231,147, 60,137, - 63,194, 41, 16, 8,250,250,251,251,239, 94,176, 96,129, 99,100,100,164,189,187,187, 59,248,124, 62,104,154,134, 66,161,192,221, -187,119,113,234,212, 41,237,254,253,251,181, 37, 37, 37, 99, 1,156,251,255, 40,231,211,228, 12,105,135,207, 31, 75, 20, 93,111, -180,247, 70,142,109,180,156, 3,250,250,140, 28,253,210,176,161,132, 16,236, 59,112,242,100, 92, 66,163, 73,165,235, 45,103, 99, -101,181,132, 51,184, 45,111, 65, 82,242,221, 71, 2, 90,134,133,134,167,135,116, 24,181,196, 18,162, 90,145,225, 31,169,123,173, -233,216,218, 54,221, 71,166, 89, 67, 2, 17, 61,114,244,139, 81,159,205,157,131,175,190, 92,138, 35,251, 14, 29, 79,201,122, 36, - 77,208,191,174, 47,213,190,183,124,193,231, 15,224,241,120,254,148, 88,252, 59,173,213,102, 56, 2,194, 10,128,255, 5,160, 93, - 36, 18,181, 1,203,134,129, 16, 65, 5, 69,197,124,195,178,174, 0,228,141,113, 46, 17, 8,158,149,250,248,244, 89,205,113,115, -110,221,189,235, 80,251,129,173,218,242, 92,251,161,210,215,215, 87,169, 80, 40,154, 89,194, 25,253,221,119,102,157, 76, 38,153, -179,124,121,223, 74,131,161,239,162, 69,139, 4, 87,175, 94,197,250,239,191,103, 12,249,249, 59, 84,192,212,122,102, 67,234,229, -108, 49,117,170,221,172,245,235,223, 10,108,219,214,235,141, 55,222, 16, 10,133, 66,104,181, 90,228,229,229,225,244,169, 83,166, -228,148,148,100,141, 70,243,188, 53,117,143,254,238, 59,179, 75, 96, 32,164,158,158,228,183,184, 56,231,137, 31,127, 60,169,101, -171, 86,206, 67,134, 14, 21, 58, 57, 57,161,172,172, 12, 15, 30, 60,192,161, 67,135,148,149,149,149,190, 0, 88, 75, 56,119, 92, -188,216,241,196,185,115, 47, 47, 89,178, 68, 28, 30, 30, 14,103,103,103, 84, 84, 84,224,238,221,187, 56,119,238,156,113,195,134, - 13,106,181, 90, 61,137,101,217,163,127, 97, 95,250, 79, 78, 29,254,213, 30,254,150, 92,136, 8, 0,159, 87,109, 47, 70,227, 57, - 3,255,205,131,207,227, 8,112,115,115,219,100, 48, 24,136, 94,175,159, 8, 32,247, 31, 88, 78, 65, 68, 68,196,122,165, 82,217, -131, 16, 2,103,103,231, 75, 73, 73, 73,239,163,158,149, 55,141,112,242, 1,244,112,112,112,232,238,232,232,216,215,104, 52,134, - 84, 77,191,165,104,181,218,115,102,179,249, 74,149,245,137,253,127,174, 59, 31, 64,164,175,175,239,187, 28,199,181,165, 40,202, -133,101, 89,208, 52, 93,206,113,220, 61,181, 90,189, 5, 64,236, 63,160,156, 79,133, 51,180, 13, 94, 36, 60,132,212, 39, 8, 30, - 17, 90,143, 9, 8,138, 67, 74,114, 38, 14, 89, 81, 78,222,208, 65,254,235, 56, 22, 56, 29,151,247, 1, 26,119,174,253, 67,104, - 89, 32, 94,172, 22,153,109,248,111, 18,138, 60,194, 73, 17, 42, 55,184,227,139,191, 60,137,208,178, 20,161, 65,232, 11,130, 30, - 28,193,149,212,123, 56,251, 95, 27,235, 22, 0,205,120, 60, 94, 55,138,199,107, 67, 0, 45, 69, 81, 12, 8,113, 3, 33,153,224, -243,147,230,155,205,153,168, 59,129,121,189,156, 95, 1,110,223,187,186, 94,226, 9, 4,222, 0,120, 85,214, 23,142,163, 40,150, - 80, 20, 83,123,122,235,177, 7,203, 6, 57,205, 64, 7,161, 68,226,207, 50, 76,179, 66,192,225, 4,203, 62, 99, 32,164,178, 57, -240,249, 77, 32,205,218,186, 87,115,242, 37,146,128, 19,132,140, 84,201,100, 29,149,122,189, 39, 0,226, 32,147,165,104,180,218, -109, 6,131, 97,157,181,117, 55, 3, 29, 68, 18, 73,115,150, 97,154, 1, 0, 79, 32, 80,238, 49, 26,253,243,157,156,222, 48, 24, -141, 45, 28, 28, 28,104,147,201,164, 49, 24, 12,227, 24,134,249,205,154,186,223, 99,152,208,139, 60, 94,111,179, 76,230,110,166, - 40,153,137, 97,204, 38,179, 57,207, 96, 48,220, 1,176, 10, 64,230, 95,220,151,108,104,226, 31,208,198,105,227,180,113,218, 56, -109,156,255,227,156,203, 0,167,175, 0, 55, 91,123,254,165,156, 82, 0, 1, 85, 15,139,255,198,186,255, 39,173, 91, 2, 91, 91, -216, 96,131, 13, 54,216,240, 87, 99,118,253,110, 22, 54, 60, 61,232, 80,135, 79,150, 13,255,191,160, 26, 80,165,214,152, 4,155, -162,108,207,216, 56,109,156, 54, 78, 27,167,141,211,198,105,227,252,159,227,108,140,251,223, 56, 37, 57,161,142,125,155,254,142, - 31,182,153,127,109,156, 54, 78, 27,103,157, 24, 49, 98, 4,207,214,158, 54, 78, 27,167,141,243,191, 14,158,173, 9,234, 69,179, -170,215,211, 62,214,134,255,118, 95,248, 59,224, 87,245,178,230,120,159,127, 90,163, 30, 59,118,140, 3,128, 59, 41,119, 37, 21, - 21, 21,182,177,200, 6, 27,108,176, 9,173,191,249,166,245, 36, 55,183, 39,189, 49, 46,165, 40,200, 41, 10,114, 0, 75,159,226, -177,141,193,215,195,195,227,163,208,208,208, 29,205,154, 53,155, 2,192,203,202,243,219, 73,165,210, 53, 50,153, 44, 94, 38,147, -197, 75,165,210, 53, 0,218, 61,165,235, 70, 1,152, 40,145, 72,226,124,124,124, 10,196, 98,113, 28,128, 73,104,250,202,213,246, -120, 24, 39,109, 49,128,142,214,156,232, 21, 54,114,175,103,216,200,219,158, 97, 35,239,186,135,143,104,231, 25, 54,242,174,103, -216,200,219, 94, 97, 35,247,254, 5,253,245,105, 94,223,167, 85,158, 92,138, 66,174,133,229, 89, 69, 1,121, 20,133,252,127, 72, -249,255,132, 14, 33,225,198,209, 99,198,216,219,134, 99, 27,108,176,225,127, 30,190,190,190, 47,249,248,248,156,241,241,241,137, -245,245,245,125,201,130, 83, 6,213,113,147, 96, 41, 10,108, 35,131,126, 67,199, 53,102,174,172,125,238, 55, 22, 86,173, 54,103, - 51,138, 2, 75,170, 64, 81,224,188,188,188,214,250,248,248, 44,125,252,229,229,229,181,150,162,192,213, 58,150,173, 37,240,172, - 53,171, 54,123,253,245,215,247,149,149,149,197,152, 76,166,152,140,140,140,152,126,253,250,237,121,204, 18, 81, 47,167,157,157, -221,171,221,186,247,184,126,238,194,149,140,244,123,217,242,228,180,251,217,199, 78,254,118, 53,188, 67,199,223,237,236,236, 94, -181,226, 26, 81, 0, 38, 10, 4,130, 56, 7, 7,135,124,129, 64, 16, 7, 96, 50,159,207, 63,186,108,217,178,236,164,164,164,162, -139, 23, 47,150,159, 59,119,174,224,157,119,222,185, 71, 81,212,177, 58, 4,251, 32, 11, 44, 48,243,115,114,114, 78, 42, 20,138, - 83,246,246,246, 95, 90,112,124, 13,167,103,216,200,219, 74,181,153, 40,213,102,226, 25, 54,146,212,218,190,109,101,155, 55,118, -141,254,212, 23, 36, 18, 73, 64, 35,130,254,175, 52,209,255,169, 60, 0,188,171,190,139, 0,240, 93,213,171,122, 57,187,183,157, - 68,242,180,250,231,211,104, 79, 27,167,141,211,198,105,227,252,175,162, 75,213,187, 15, 30,250,107,213,220,187,173, 93,117,248, - 65, 70, 70,134, 3, 0, 4, 5, 5,189, 15,224,128, 53, 66,130,162, 48,139,227, 8, 15, 0,120, 60,234,211,254,253, 7,116,177, -183,183,127, 36, 10,178, 94,175, 23,199,197,157, 29,200,113,132,170, 58,110, 22, 33, 88, 3,160,200,210,223, 48,153,140, 60,161, - 80, 12, 30,143,154, 22, 30,222,161,101,113,113,113, 2,143,199,219, 81, 80, 80, 80,102,181, 25,135,162,176,121,243,230, 32, 31, - 31,159, 63, 69,107, 86, 40, 20,226,145, 35,159,183,138,239, 77, 64, 98,148, 72,186,139, 40,202,135,101, 24, 23, 0, 16, 8, 4, -101, 87,197,226,136,175,150, 44,145, 82, 20,197,149,148,148, 64,175,215,227,147, 79, 62,177, 79, 78, 78,126,161,184,184,120, 93, - 35,180, 65, 29, 59,117,249,228,212,169,147, 33,154,210, 50,195,230,111, 55, 94,215, 11, 68,186, 86,161,193,162,245,155,182,185, - 78,120,107,220,135,169,169, 73, 55, 81,119, 58,146,218,224, 1, 56,244,241,199, 31,135, 69, 71, 71,139, 43, 42, 42,236,244,122, -125,203, 29, 59,118,204,139,136,136,112,232,220,185,179,120,247,238,221,148, 90,173, 6, 33, 68, 26, 28, 28, 76,198,140, 25, 99, -216,179,103,207, 20, 0,107, 27, 16,190,179, 30,182, 37,111,117,251,246,237, 23, 0, 64, 70, 70,134,168, 86, 27, 11, 67, 66, 66, -100, 0,144,150,150,246, 5, 33,220,199, 0, 64, 8, 86, 0,152, 83,135,105, 45, 35,172,215,104,128, 66,219,164, 11,251,236,194, -122,143, 54,128,224, 30, 5,100, 84, 61, 16, 44, 2,106,197,133,122, 20, 41,114,185,188, 73,185, 9,163,162,162, 41,138,162,246, - 95,191,126,253,128, 82,169,108,197,113,236,123, 13,149,179,190,107,229,233,233,121,138,101, 89, 99,105,105,105, 77,160, 76,207, -142, 47,246,112,119,148, 13, 84,149, 85, 36,148, 36, 31, 57,103, 97,223,164,220,221,221,223, 44, 46, 46, 94, 10,224,221,148,148, -148, 46, 0, 16, 18, 18, 34, 2,112,205,201,201,169,167,217,100,162,108,227,159, 13, 54,216, 96,195,223, 34,180,110, 0,136,194, - 31, 41,120, 54, 53, 69,104,137, 1, 32, 33, 33, 1, 0, 36, 77, 40, 8, 85, 91,192, 76,157, 58, 21, 62, 62, 62,143,139, 23,196, -199,199, 61, 73,101, 31,249,141,197,139, 23, 59,148,151,151, 15,250,241,199, 31,251, 16, 66,190,145,203,229,151, 27, 57,191,136, - 16,172,224,241,168, 79, 41,138,130, 68, 98,151, 62,105,210,164, 27, 85,223,181, 60,118,236,152,116,196,136, 17, 58, 0,217, 0, - 32,145,216,249,241,249,188, 32, 66, 72,245, 13,183, 94, 65,248, 50, 16,200,136,197, 3, 38,126,247, 29,243,204,136, 17, 2,153, -167, 39, 5, 0,217,169,169,238, 43,190,254,186,103, 89, 86,150, 88,239,238, 94, 82,162,213,234,211,211,211, 33,145, 72, 40, 62, -159,255, 76, 99, 21,150,201,100, 31, 45,249,106,185, 76, 83, 90,174, 55,104, 42, 76,124,134, 54, 58,218, 75,217,162, 66,101,137, -131,189, 76,247,233,231, 11,197, 31,188, 55,254, 35,173, 86,251,126, 35, 84, 83,166, 77,155, 22,210,173, 91, 55,191,189,123,247, - 82,106,181, 26, 2,129,192,161,115,231,206,136,136,136, 96,207,158, 61, 75,181,106,213, 10,225,225,225,184,112,225, 2, 46, 93, -186, 68,117,233,210, 69,122,240,224,193,215,105,154, 94,219,152,184,230,243,121,159, 4, 7, 7,119,150,201,100,166,160,160, 32, -188,247,222,123, 32,132, 96,208,160, 65,225, 14, 14, 14, 7,180, 90,173, 56, 45, 45,181, 79, 99, 34, 91,153,116,100, 76,181,101, - 11, 64, 7, 16,220, 83, 37, 29,169, 61,253, 24,146,150,150,246,108, 89, 89, 25, 30, 94, 23, 82,147,192,188, 79,159, 62,214,244, -165, 34, 66,176, 98,196,136,232, 79, 1,138, 26, 52,104, 80,249,148, 41, 83,120,169,169,169,175,189,248,226, 11,225, 25, 25,247, - 96,229,195, 64,208,224,193,131, 47,156, 56,113,194, 61, 40, 40, 72, 85, 90, 90, 90,243,133,183,187,203,144,115, 7, 87,127,244, -229,154, 29,193,219, 9, 85,174, 74, 57,124,167,145,190, 73,189,249,230, 91, 69, 14, 14, 14,163,246,239,223,159,166, 80, 40, 4, - 34, 81,141,118,229,123,121,121,121, 6, 5, 5, 77,118,115,115, 83,242,121, 60, 47, 2, 66, 26,235,159,255,223,200, 72, 79, 21, -182, 11, 10,166,109,227,181, 13, 54,216,240, 47,196,241, 42,113,117,252,241, 47, 4, 0, 16, 19, 19, 83, 19,153, 54, 58, 58,186, -222, 39, 96, 66, 72,209,173, 91,183,252,117, 58, 29, 8, 33,150, 12,216,181,151,104, 22, 81, 20,111, 61,143, 71,189, 79, 81, 20, -194,195, 59,220, 95,189,122,117, 93, 57,189, 76,225,225, 29,238,243,249,188,214,132, 16, 80, 20,239, 7, 66,184,162,122, 56,235, -188, 17,137,197,146, 89, 0,224,237,237,147,245,235,175,191,154, 94,126,249,101,124,253,245,215,162,217,179,103,207, 16, 8, 4, - 83,114,115,115, 11, 27, 40, 39, 0,204,241,244,244,146,110,222,188, 57,104,210,164, 73, 55, 20, 10,197, 28, 0,240,241,241, 89, - 10, 32, 20, 64,118,173,125,216,176, 97, 79,193,123,239,189,151,174, 84, 42,231,212,199, 57, 10,104,227, 31, 28, 60, 96, 81, 66, - 2,225, 25,141, 84,241,249,243, 26, 85, 81, 17,157,169, 82, 73,183, 94,187, 22, 61,111,233, 82,161,127, 64, 0,226,143, 30,245, - 40,214,233, 84,106,163,209, 80, 84, 84, 68, 24,134,185,100, 65,221,195,188, 60,189,164, 27, 87,253,112,213, 81,200,231,188,154, -251, 81, 66, 55, 55, 1, 79,234, 36,230, 11,120,198,214, 45,219,137, 1,132, 53,118,141, 68, 34,209,235,131, 7, 15,150,238,217, -179,135, 10, 15, 15,135,139,139, 11,206,159, 63,143,155, 55,111,162,172,172,140, 71,211, 52,186,118,237,138,229,203,151, 35, 32, - 32, 0,229,229,229,200,205,205,245, 16,139,197,158, 52, 77,215,215,158,143,244,167, 89,179,102,193,199,199, 7, 12,195,160,180, -180, 20, 12,195,192,193,193, 1, 0,144,159,159,143,163, 71,143, 88,210,151, 26, 5, 33, 4,207, 61,247, 92, 5, 69, 81, 41,143, - 91,180,172,225,244,243,243,219,173, 82, 21, 15, 27, 48, 96, 0,202,202,202,232,133, 11, 23,162, 99,199,142, 8, 10, 10,106,180, -156,190,190,190, 19, 25,134,153, 15, 0,102,179,121,171,157,157,221,219,191,252,242,139,123,237, 20, 33,213,150,172, 34,101, 73, -217,165,171, 73,105,211, 38,190,220, 47,225,242,221, 60,179,112,100,174,250,246, 17,117, 29,229,156, 35, 18,137,127,108,209,162, -197,170,169, 83,167,250,184,185,185,193,104, 52,206, 43, 44, 44,196,228,201,147, 1, 0,195,135, 15,239, 40, 20, 10,127,125,231, -157,119,208,170, 85,171,130,210,210,210,220,235,215,175,191,167,211,233,238, 54,181, 61, 45,196, 19,113,214, 35,178,254,113,229, -180,113,218, 56,109,156,127, 13,167,165, 90,228, 31, 10, 5, 30, 13,231,176,233, 17,161, 21, 29, 29, 77,197,196,196, 16, 11, 42, - 86,210,188,121,115,127,123,123,123, 0, 40,177,182, 20, 28,199, 77,113,119,119, 87,206,153, 51,167, 87, 80, 80,144,105,202,148, - 41,119,179,179,179,231,214, 62,166,101,203,150, 95,126,255,253,247, 72, 79, 79,207, 94,186,116,233,133,146,146, 18,107,243,152, -205, 38, 4,171,171,172, 99,197, 71,143, 30,237,152,144,144,240,254,183,223,126,235,249,193, 7, 31,136, 62,250,232,163,113, 0, -190,110,140,132,207,231,235,234,154, 46,172, 11, 62, 62, 62, 38, 62,159, 95,111,144,184,104,192,222, 78, 44,238,191, 40, 33,129, -152,178,179,117, 63,173, 92,233,184,241,247,223, 23,208,132, 52,243,242,242, 66,239,158, 61, 43,237,248,252, 98,101, 97, 33,231, -213,166, 13,255,193,175,191,122,232,197, 98,249,158, 61,123,212, 37, 37, 37,135, 27, 53,225, 81,148,134, 35,196,228,208, 60,128, -126,249,133,200,240,171, 87,110,166, 58,122,121,240,186,116, 14,239,152,154,158,125, 29, 28,103,166, 40,170,209, 96,129,206,206, -206, 65, 37, 37, 37,208,104, 52,240,244,244,196,234,213,171,225,237,237, 13,157, 78,135,164,164, 36,210,188,121,115, 42, 33, 33, - 1,205,155, 55,135, 74,165,130,201,100, 66, 69, 69,133,210,104, 52,214,151,155,177,136,199,227,255,204,227, 81,111, 81, 20,133, -214,173, 3,115,214,173, 91,103,226, 56, 14, 33, 33, 33,120,241,197, 23,113,240,224, 65, 36, 37, 37, 85, 91,158, 76, 45, 90,180, -204,225,241,168, 22, 85, 90,169,201, 22,152,234,212, 62,114,185,124, 84, 19,255, 52, 60, 95, 95,223,113,109,219,182,125,255,213, - 87, 95,165,197, 98, 49,180, 90,109,117, 91,208,195,134, 13, 47, 31, 49, 34,218,249,248,241,227,245,150,211,108, 54,207, 47, 40, - 40,240,209,235,245, 24, 58,116,232, 71,223,124,243,141, 76, 44, 22, 3, 0, 88,150,125,196,146,181,228,219,237,167, 62,158,191, - 46,238,212,238,229,190, 75,102,191,221,111,220,148, 47,227, 0,156,172,171, 96, 38,147, 41, 75,173, 86,191, 59,109,218,180, 29, - 27, 54,108,112,157, 59,119, 46, 56,142, 3, 33, 4, 12,195,212, 36, 18,231, 56, 14,135, 14, 29, 66,102,102,230,151,143,137, 44, - 27,108,176,193,134,127, 28,172,208, 34,255, 68,248,224,225,180, 33, 30, 23, 91,127,123,100,120, 62,159,191,241,244,233,211,157, -251,244,233, 35, 24, 56,112, 96,248,201,147, 39,195, 11, 10, 10,238, 86, 89, 15,194, 7, 14, 28, 24,238,229,229,133, 53,107,214, -232,248,124,254,198, 38,254, 76,205, 77,175,176,176,240, 6,128,111, 14, 30, 60,184, 98,226,196,137,240,246,246, 14, 85, 40, 20, -127,107,157,157, 36,146, 46,239,172, 94,205, 8,105,154,247,221, 55,223, 56,173,140,139, 91,177,119,223, 62,193,115,207, 61, 71, - 17, 66,112,231,246,109,251,229,107,215, 74,199,190,240, 66,118, 90, 86, 22,115,228,212, 41,186,168,160,160,180, 64,165,154, 15, -160,180, 49,126,154,166, 19, 51, 50, 50,124,123,247,125,206,239,220,239,119,111,190,252,194,240, 1, 66, 1,143,186,151,157,127, -205,199,219,195, 57, 62,238,140,158,166,233,196,198,120,180, 90,237, 3,134, 97,220, 8, 33,158,241,241,241,240,244,244, 68, 89, - 89, 25,104,154,134,201,100, 50,233,116, 58,187,146,146, 18, 24, 12, 6, 24,141, 70, 56, 57, 57,225,206,157, 59, 69, 12,195,156, -173,143,147,101,217,119, 36, 18,201, 98,161, 80, 40, 22,137, 68,242,107,215,174, 65,163,209,180,116,113,113,249,154, 97, 24,200, -229,114, 36, 36, 36,204,116,114,114,202, 6, 0, 59, 59, 59,136,197, 18,119,163,209,200, 0, 40,104,106,155, 19, 66,154,124,189, -188,189,189, 3,236,237,237, 23,125,250,233,172,144, 78,157, 58, 67,165, 82,129,227, 56,200,100, 50,232,116, 58, 56, 57, 57,161, - 71,143, 30, 15, 22, 45, 90,164, 32, 4, 19, 26, 16,131,252,170,235,131,137, 19, 39,202,156,156,156,144,151,151,135,224,224,224, - 26,161,165, 80,149,220,185,120,245,110,234,180, 73,163,251,238, 60, 26,151,114, 42,254, 90,202, 11, 67,123,118,162, 40,210,178, -161, 50, 42,149, 74,149, 64, 32,152, 50,113,226,196,197, 65, 65, 65,173, 9, 33,104,215,174, 29, 6, 15, 30,140, 95,127,253, 21, -233,233,233,208,106,181,236,229,203,151,119, 41, 20,138, 99,182, 33,220, 6, 27,108,176,225, 47,197,159,124,179, 30,177,104,253, -157, 80, 42,149,170,212,212,212,147,215,175, 95,143, 30, 51,102, 12,226,227,227,223, 4, 48, 13, 0, 36, 18,201,155, 99,198,140, -193,245,235,215,145,154,154,122, 82,169, 84,170,158,198,111,138,197, 98,131,201,244,208, 56,101,103,103,103,103,229,233, 45,171, -166, 12, 1,160,101, 3,251,234, 55,141, 8, 4, 62, 29,134, 14, 21,148,221,188,169,217,124,229,202,226, 29, 59,118, 8,122,245, -234, 69,209,102, 51, 88,142, 67, 96, 96, 32, 53,112,208, 32,217,207, 59,118,184,177, 90,109,194,146, 79, 63, 61,191,233,157,119, - 42, 51,170,252,192, 26,131,209,104, 92,251,254,228,119, 7,197,197,159,247, 11, 13,110,227,118,242,116,220, 13,119,119,103,105, - 80,219,182,178,146,178, 82,118,238,236,153, 2,163,209,248, 93, 99, 60,122,189,254,208,153, 51,103, 94,240,247,247,247,188,123, -247, 46, 76, 38, 19, 88,150,197,192,129, 3, 65, 8,145, 0,224, 4, 2, 1, 82, 83, 83, 97, 54,155,149, 25, 25, 25,242,123,247, -238, 73, 0, 44,107,164,124, 57, 70,163, 17, 41, 41, 15,103,237,154, 55,111, 30, 25, 21, 21, 5,134, 97, 48,116,232, 80, 28, 57, -114, 36, 50, 37, 37,101,101,109,205,247,164,215,188,202, 66, 22,226,235,235,123,176,106,151, 69, 78,240,126,126,126,225,129,129, -129, 27,150, 45, 91, 38,106,222,188, 57, 8, 33,112,117,117,129, 78,167, 67,113,113, 9, 66, 67, 67,225,239,239,143,101,203,150, - 1,192,174,134, 44,110, 28,199, 65,161, 80,224,193,131, 7,200,202,202,130,191,191, 63, 40,138, 66, 69, 69, 5, 24,230, 97, 78, -110,105,133,230,248,247, 63, 31,235,191,111,195,252,176,238, 29,218, 5, 92,185,145,172,124,125, 84,164,180, 93,171,128, 32,213, -221,133, 60, 96, 97,189, 73,151,229,114,249, 61,185, 92, 62, 70,169, 84,138,202,203,203, 35, 34, 35, 35,215, 12, 26, 52, 8, 55, -110,220,192,249,243,231,199, 74, 36, 18,165,217,108,102,188,189,189, 39, 80, 20,229,100, 54,155,119,150,148,148, 40,108,227,161, - 13, 54,216, 96,195, 83, 71,181,143, 22,106,189, 91,103,209, 10, 9, 9,145,101,103,103,191,209,178,101, 75, 49, 0,216,219,219, -135, 6, 6, 6,206,200,202,202,170,176,182, 52, 58,157,110,239,142, 29, 59, 6,175, 90,181, 74, 52,124,248,240, 54, 7, 15, 30, -236, 6, 0,195,135, 15,111,227,232,232,136, 29, 59,118,152,117, 58,221, 83,139,137, 68,211,116,159,174, 93,187,162,180,180, 20, -217,217,217, 86, 77,161, 28, 59,118, 76,138,135,126, 89, 13,238,107, 8,140,201,228,234,226,231,199, 43,136,139, 51,151,106, 52, - 62,125,250,246,165,104,179, 25, 60, 30, 15, 37, 37, 37,200,205,205,133,179,139, 11,149,154,145,225,176,101,214,172, 99, 45, 59, -117, 18,179, 38,147,187, 21,197,212, 22, 43,139,222,250,112,202, 7,135,118,238,220,229, 89,174,209,100,218,219, 75,141, 18,137, -200,123,234,135, 31,178,165,165,165,227, 1, 84, 90,192,179,108,231,206,157, 67,135, 14, 29,122, 59, 32, 32,192, 75,165, 82,121, -151,151,151,179,165,165,165,124, 60,244,181,162, 0, 32, 46, 46, 14, 26,141,134, 97, 89, 54, 1, 15, 99, 97,153, 44, 45,104,139, - 22, 45,156, 35, 34, 34,250,121,122,122, 66,173, 86,195,221,221, 29,157, 59,119,238,199,231,243,127,204,201,201, 81, 63,205, 94, - 31, 27, 27,235, 72, 8,121,150, 16,130,161, 67,135, 90,116, 14,203,178,111, 71, 69, 69,137, 40,138,130, 94,175,131,157,157, 61, -100, 50, 7, 56, 58, 58, 33, 40,168, 61,228,114, 57,134, 12, 25, 98,202,204,204, 92,175, 80, 40,246, 54,194, 5,185, 92, 14,149, - 74,133,220,220, 92, 20, 23, 23, 3, 0,138,139,139,107,156,243,159, 6,212,106,245,200, 30, 61,122, 76,159, 60,121, 50, 24,134, -193,200,145, 35,145,151,151,183,242,193,131, 7,123,124,125,125,199,189,253,246,219,158,238,238,238,152, 62,125,186, 61,128, 47, -108,227,161, 13, 54,216, 96,195, 83,199,227, 62, 90,127,182,104, 53, 52, 39,234,237,237,221,155,162,168,121,122,189, 94, 92, 61, - 37, 67, 81,148,216,211,211,243,136, 94,175, 95,170, 80, 40,172,114,138, 43, 47, 47,215,220,191,127,255, 72, 98, 98,226,232, 81, -163, 70, 33, 54, 54,118, 60, 0,140, 26, 53, 10,137,137,137,184,127,255,254,145,242,242,242,167,146,128,212,207,207,111, 88,223, -190,125, 71,117,237,218, 21, 49, 49, 49, 96, 89,246,146, 53,231,215, 94, 97,136, 58, 86, 29, 86,239,179,136,201,113,202, 59, 0, - 0, 32, 0, 73, 68, 65, 84,140,207, 7, 69, 81, 53,214,140, 98,149, 10,233,105,105, 40, 45, 43,131,209, 96,128, 86,167, 99,131, - 90,181,210,171, 77, 38, 33, 5, 88, 59,247,149,115,253,234,229, 92,157, 86,235,229,238,234,166,151, 74, 37, 40,215,168, 69,215, -174, 94,174, 4,144,105, 33,135,137, 16,210,247,215, 95,127,157,207,231,243,199, 56, 56, 56,224,253,247,223,231,247,235,215, 15, - 34,145, 8, 70,163, 17,229,229,229,216,177, 99,135,138,101,217,214, 85,231, 56, 72,165,210,109,124, 62, 63,191,162,162, 98, 94, -163, 63, 96, 50, 13,143,142,142, 22,152, 76, 38, 44, 89,178, 4, 11, 22, 44,192,208,161, 67, 5, 87,175, 94, 29, 14, 96,231,211, -234,241, 28,199, 33, 50, 50,178,182, 51,124,138, 37,231, 9,133,194,240,182,109,219, 66,165, 82, 65,165, 82,193,211,211, 19,190, -190,190,240,246,246,198,202,149, 43,201,154, 53,107, 78,154,205,230,245,197,197,197, 69,150,148, 33, 43, 43,171,198, 50,104, 48, - 24,160,213,106,145,151,151, 87, 51,117,168,151, 57, 13,157,242,214,136, 78, 90,189, 94,119,229, 78, 70,238,188,143,198, 61,167, -213,235,117, 25, 15,114,211,129,181,156, 5,253,123,194,248,241,227, 39,140, 30, 61, 26,149,149,149, 72, 76, 76, 68,207,158, 61, -177, 98,197, 10,159,132,132,132,105, 93,187,118,133, 80, 40, 68,124,124, 60, 24,134,201,179,141,133, 54,216, 96,195, 63, 25,255, - 82,255,172, 6,209,160, 69,203,223,223,223,133,101,217,153, 81, 81, 81,145, 47,188,240, 2,134, 12, 25,242,200,247, 59,119,238, -116, 60,112,224,192,210,181,107,215, 14, 53,155,205,203,172,153,234,227, 56,238,208,206,157, 59,135, 63,247,220,115,210,254,253, -251, 7, 2,128, 68, 34, 49,237,220,185, 83,199,113,220,161, 38,212,165, 58, 16, 99, 17, 0,248,250,250,118, 20, 8, 4,163,134, - 13, 27,214,241,173,183,222, 66, 82, 82, 18,118,236,216,113, 47, 40, 40,232, 66, 81,145, 85,254,213,217,141,172, 58, 92,218,152, -117,139, 47, 22,151,148, 23, 22,186, 56, 4, 4, 8, 93, 29, 29, 21, 49, 49, 49,254,131, 6, 13,162,242,242,242, 80, 86, 86, 6, -131,193,128,171, 87,175,114, 2, 32, 71,224,234, 74,229, 36, 38, 82,124,177,184, 4,180,117, 43,221,253,125, 92,219,125, 62,123, - 82, 75,131,209, 16,166, 86,171, 25,129, 80, 40,108,238,237,146,151,150,105,213, 76,156, 81, 42,149, 70, 0, 16,112, 28,167,115, -115,115,147,158, 62,125, 26, 98,177, 24, 20, 69,161, 67,135, 14,176,179,179, 19, 17, 66,114, 1,192,209,209, 81,188,113,227, 70, -231,113,227,198,157,111,140,184, 75,151, 46, 66,137, 68,242,124, 80, 80, 16, 18, 19, 19,113,247,238,221,156,196,196,196, 22, 93, -186,116, 65, 64, 64,192,243, 62, 62, 62,251,110,220,184,241, 84,150,247, 63, 92,177,106,189, 51, 60,203,178, 28, 69, 81,224,241, -120,224, 56, 14, 42,149, 10,173, 91,183,198,186,117,235,176,122,245,234, 37, 10,133,226,168, 21, 92,172, 70,163,129, 76, 38,195, -221,187,119,141, 81, 81, 81, 18, 30,143,135,123,247,238,213, 8, 45, 47, 15,183,208,158, 93,195,131,151,124,187,253,148, 76, 34, -145, 12,233, 23, 17,146,156,145,147, 79, 8,213,232,180,113, 72, 72,136,168,117,235,214,227, 71,143, 30,141,172,172, 44, 44, 93, -186,180, 88,161, 80,196,157, 58,117,234,165,201,147, 39,243,123,246,236,137,146,146, 18,252,252,243,207,204,181,107,215,126, 42, - 44, 44,220,110, 27,198,109,176,193, 6, 27,254, 33, 66,203,223,223,127,180, 72, 36,154,254,202, 43,175,240,219,183,111,143,162, -162, 34, 56, 57, 57,209, 20, 69, 9, 1,192,197,197,133,182,183,183,199,164, 73,147,208,169, 83,167,222,179,102,205,234, 41, 16, - 8,214,201,229,242,109,150,252,176, 82,169,212,241,120,188,253,239,191,255,254,178,155, 55,111,180, 6,128,223,127,255,253,190, - 92, 46,159,173, 84, 42,117, 86,214,163, 58, 40, 38, 37,145,216, 93,105,215,174,221,131,136,136, 8,167, 23, 94,120, 1,158,158, -158,184,126,253, 58,150, 47, 95,158, 97, 50,153,230,159, 59,119,142,249,187, 27,153, 49, 26, 11,175, 29, 62,236,216,239,181,215, -156,166, 70, 69,125,243,193,251,239,175,250,252,243,207, 5,237,219,183,167,116, 58, 29,174, 92,185, 66, 14, 28, 56, 64,255,188, -120,241,106,200,100,194,196, 3, 7,196, 38,147, 41,199, 74,203, 93,223, 94,125,122,183,255,102,213, 90, 24,244,149,184,114,233, - 56,202,202, 84,216,184,233, 96,123, 63, 63,210,183,160,160,224,156,165, 92, 20, 69, 5,197,198,198,122, 17, 66, 32, 22,139,177, -104,209, 34,248,250,250,194,201,201, 9, 21, 21, 21,152, 54,109,154,243,199, 31,127,236, 12, 0, 73, 73, 73, 53,225, 25, 26,131, - 92, 46,239, 49,105,210, 36, 71,134, 97,112,242,228, 73, 19, 69, 81,243,206,156, 57,243, 99,135, 14, 29,196,189,123,247,118,220, -190,125,123, 79, 0,241, 79, 75,104, 53,241,188,123,167, 79,159,238, 58,102,204, 24, 34, 20, 10,169,242,242,114,184,184,184, 96, -221,186,117, 90,133, 66,113,220, 74,174, 69,179,103,207,158, 95,181,189,117,222,188,121,239, 46, 91,182,204,179,176,176,176,198, -170,169, 44, 46, 61,219, 35,234, 67,182,164, 92,109,250,233,219, 89, 47,219,219, 73,196,243,150,253, 20, 79,243,113,185,209,126, -197, 48, 98,169, 84, 42, 38,132, 96,255,254,253,200,201,201,121,187,164,164,164,144,101,217,131, 51,103,206,156,209,190,125,251, - 86,105,105,105, 57, 21, 21, 21, 43,148, 74,229, 3,219,112,103,131, 13, 54,216,240,151,161,218, 9,190,122,245,225,113, 60,156, - 78,172, 95,104,177, 44, 59,233,212,169, 83,124,142,227,176,105,211, 38, 92,187,118,141, 72,165,210,121, 82,169,244,123,123,123, -123, 86,175,215, 79,124,239,189,247,198, 45, 88,176,128,215,187,119,111, 36, 38, 38,242, 90,183,110, 61, 30, 64,109,161, 53, 8, - 13,196,218, 80,171,213, 87,139,138, 10, 91,215, 10, 80,217, 90, 34,177,187,218, 72,101, 30,231,124, 60, 40,102,247, 69,139, 22, -105,125,124,124, 76,119,239,222,197,134, 13, 27,184,107,215,174,197,137,197,226,141, 10,133,194,104, 33,231,211, 64, 13,167,152, - 97,174,255, 50, 99, 70,200, 51, 35, 71,114,239, 78,159, 94, 41,178,183,255,232,155,181,107,103,149, 87, 84,248,130,162,136,187, -179,115,206,166, 69,139,150, 14,125,254,249,202,164,115,231,236,110,198,198, 10, 61,105,250,150, 53,229, 44, 40, 40, 56, 23, 31, -127, 30, 91, 55,175,130,217,108,132,162,224,161, 78, 43, 46, 81,163, 17,145,245, 39, 78,134, 97,212, 47,189,244,146, 8,128,253, -235,175,191, 46, 86, 42,149,104,211,166, 13, 0, 64,163,209,224,248,241,227, 8, 14, 14, 6, 0,220,185,115,167,102,187,177,114, -202,100,178,231,123,246,236,137,156,156, 28, 36, 37, 37,253,166, 80, 40, 74, 0,252,150,151,151, 55,188,107,215,174, 56,116,232, -208,136, 6,132,150, 85,215,200, 66,161,245, 39, 78,123,123,251,217, 7, 15, 30,124,251,210,165, 75, 99,102,204,152, 33, 28, 56, -112, 32, 0,160,162,162, 66, 7,128,181,134, 83,175,215,111, 4, 80,179,114, 54, 59, 59,251,151,233,211,167, 39,124,242,201, 39, -158,213,229, 83, 37, 31, 77, 84, 1,137, 97,253,222,254,188, 71,215,176,246, 95,174,217,113, 42, 55,175,104,135, 58,229,136,218, -146,186, 19, 66, 64,211, 52, 56,142,131,155,155,155,182,164,164, 4, 74,165,242,129, 82,169,124, 63, 51, 51,211,170,186, 63,205, - 62,111,227,180,113,218, 56,109,156,255,163,176, 60, 50, 60, 33,132,225, 56, 14,241,241,241, 56,120,240, 32,107, 54,155, 39, 40, - 20,138,218,209,170,215, 94,191,126, 61,246,165,151, 94,218,150,150,150,198, 79, 78, 78, 6, 33,132,181,166, 52, 6,131,129,166, -168, 63,239,123,210, 90,110,221,186, 21,133,133,133,230,188,188,188, 51, 12,195, 28,122,194,213,139, 79,188,234,112, 43, 96,124, -213,100, 58,179,160, 87,175,200,249,177,177,146,119, 63,251,204,248,230, 91,111,205,100, 77, 38,154, 47, 18,113, 98,153,140,199, - 74, 36,194,164,115,231,236,214, 76,158,236,166, 55, 26, 79,238,176,194,193,188,218,162,213,175, 95,111,188,249,238, 39,208,215, -178,104, 37, 94, 77,135,209, 12,171, 44, 90, 70,163, 49, 76,161, 80,192,206,206, 46, 23,128,247, 27,111,188, 1,142,227,160,215, -235, 81, 81, 81, 1,185, 92,174,126,235,173,183,216, 42,241, 36, 24, 53,106,148,147, 37,188,129,129,129,190, 66,161, 16, 39, 79, -158,132, 80, 40, 60, 14, 0, 66,161,240,120,108,108,236,240,177, 99,199,194,207,207, 47, 48, 43, 43,139, 66, 35,254,105, 94, 97, - 35,247, 18,160, 29, 40,180,125,104,130, 67, 91,207,176,145,183, 41, 32,163, 42,106,124, 74,151, 46, 93, 0, 11,253,178,106,163, -106,113,199,106,154,166,247,205,154, 53,235,253,238,221,187, 15, 94,176, 96, 1,133,170, 80, 13, 79,136,244,130,130,130, 62,115, -230,204, 57, 69, 8,121, 68,244, 43,139, 75,207, 62, 23, 61,133,148,151,171,111,170, 82,142,222,177,202, 98,202, 48, 79, 20,206, -194, 6, 27,108,176,193,134,167,102,213,250, 19,234, 21, 90, 20, 69,109,234,219,183,239, 4, 0,124,138,162, 54,200,229,242, 63, - 13,254, 10,133, 34,221,215,215,247,235, 86,173, 90, 77, 4, 64, 40,138,218,100,101,161,138, 8,193,114, 30,143,154,245, 80,220, - 53, 41, 64,101,117, 90,146, 89, 0, 40, 30,143,191,237,198,141, 27,159,229,230,230,170, 44,180, 64, 52,136,167,177,234, 16, 0, -118, 1, 15, 94,201,201, 57, 53, 61, 60,124,208,208,201,147,209,113,232, 80, 39,223, 22, 45, 88,189,217,204,221,185,112,129,186, -180,127,191,232,102,108,172, 80,111, 52,158, 60, 4,228, 90, 91,206,130,130,130,115,103,227,206,157,126,121,212,240,193,129,173, -124, 31,138,134, 7,114, 20,151,170, 79, 91, 35,178, 30, 19,189, 35,215,173, 91,119, 84, 36, 18, 9,106,167,178, 49,155,205,165, - 70,163, 49, 12, 0,202,202,202,124, 55,109,218,180,155,199,227,229, 52,198,151,156,156,124,100,254,252,249,163,178,179,179, 79, -231,229,229,101, 3, 64,110,110,110, 54, 77,211,219, 20, 10,197,168,156,156,156, 3,176, 96, 17, 0, 1,218, 37, 93,216,215, 1, - 0,194,122,141, 70,210,133,125,118, 0, 58,132,245, 26, 13, 0,104,106, 46,195,218,168, 10,131, 48, 47, 49, 49,113,231,224,193, -131,223,195, 19,196,244,122, 92,108,153,205,230, 22,143,239,172,182,108, 89, 67,100, 50,153,104,189, 94,207,176, 44, 43, 48,155, -205,196,100, 50,217,210,215,216,208, 24,108,185, 47,109,248,215,130, 16,210, 21,128,103,245,176, 89,245,238,249,216,182, 9, 85, -233, 2,171,135,202,170,207, 42,138,162,174,214,226,168,217,111,193,185, 0, 80, 12,224, 54, 69, 81,245, 25, 65, 54,213,247,185, - 94,161, 37,151,203, 15,192,130,164,209,150, 30,215, 0,230, 84,229,137, 3,154,158,135,173,134,131,101,217,162,220,220,220, 39, -190,160, 60, 30,239,193,136, 17, 35,172, 58,190,177, 99,246, 0, 57, 31, 26,141,219, 99,190,251,174,243,201, 13, 27,252, 88,134, -113,167, 0,194, 23,139, 75, 76, 38, 83,182, 39, 77,223,178,214,146,245,136, 53,230,126,193,144,172,251, 5,104,219,182, 45,185, -119,239,222,211, 24, 84,111,105,181, 90,255,198,186,128, 78,167,235,109,161, 24,220, 85, 80, 80,176,171, 14,193,190, 91,161, 80, -236,182,226, 78,145, 81, 37,170,120, 28,197,189, 28,214,107,244,126, 0, 92,117, 82,233,167,137,194,194,194, 52, 84,197,121,251, -167, 33, 39, 39,199, 72, 81,212, 47,203,151, 47,127,253,230,205,155,123,228,114,185,209, 54, 20,219, 96,131, 13,255,101,145, 69, - 81, 84, 76,213,231,232, 42,163, 80,204,227,219,213,199, 84, 31, 87,251,152,106,142,199,247, 55,116, 46, 0,204,158, 61,251,179, -165, 75,151, 74, 1, 88,154,140,185,201, 73,165,255, 42, 20,253, 67, 56,106,139,130,205,127, 69, 69,191, 3, 76, 96,152,203, 96, -106,249,228,211, 79,215, 16,113,239,222,189,255,244, 83,107,117, 82,233, 90, 8,255, 95, 29,124,178,179,179,215, 5, 4, 4,108, -148,203,229, 12,108,176,193,130,251,149,173, 9,108,248,151,194,179, 46, 97, 84,143, 40,139,110,232,251, 71, 30,220,235, 56,174, -174,207, 20, 69,197, 44, 93,186, 52,218,138,242,214, 88,180,120,182,107,103,131, 13,255,110,252,127,172,164,181,193, 6, 27,108, -248, 79, 60,121, 60,102,197,170, 22, 95,143,127,158, 61,123,246,103,104,120,198,201, 7, 15,173, 88, 62, 85,159,107,252,181, 40, - 60, 92, 57, 80, 23,172, 89, 77, 48,168, 9,245, 59, 99,227,180,113,218, 56,109,156, 54, 78, 27,167,141,243,127,142,179, 49,238, - 51,117, 8,162,168,250,166,250, 26,154, 70,124,124,187,177,115, 27, 59,150,162,168,250,194,252, 84, 79, 21, 62,254,254,151, 99, -144,141,211,198,105,227,180,113,218, 56,109,156, 54, 78, 27,231,147,128, 16,210,149, 16, 18,133,135,211,223,132, 16, 18, 69, 8, - 25, 58,123,246,236, 57,213,251,102,207,158, 61,135, 16, 50,176,250,184,170, 99,106,206,169,222,247,248,251,227,251, 26, 58,182, -129, 34, 78,120,108,187,230,243, 63,197, 71,203, 6, 27,108,176,193, 6, 27,108,176,161, 78, 84,175, 24,172,101,109, 82, 1,184, -179,116,233,210,178, 90,190, 83, 42, 0,183, 0,116,170, 58, 78, 85, 37,210,106,251, 86,153,170, 62,155,234, 56,198,100,201,177, -245, 96, 83, 61,219, 54,161, 85, 31, 58,121,243, 22, 7, 52,247,138,168,186, 0, 32, 85, 73,128,185,170,120, 69,164, 58,112, 17, -199,129, 16, 2,185,178,252,250, 29, 37, 62,111,234,239, 5,249,194,205,203,206,110, 53, 71, 72,175,170, 93,231,212, 37,198, 79, -146, 52, 40,183,148, 35,184, 25, 66,236,120,152,201, 17,116, 4, 0, 30,133,219, 6, 14, 95,167, 22, 89, 31, 79,170,174,126, 30, -230,137, 9, 98,123,233, 43,206, 46,174,109,203,202,138, 51,204, 6,227,190,100, 21, 54,162, 9, 14,182,129,174,120,150, 35,248, - 12, 0, 79,200,195,202,140, 82,139, 87,114,216, 96,131, 13, 54, 60,169,117,228,137,226,226, 81, 20,197,214,193, 73, 61, 33,167, -109,161,130, 5, 98,171,142,221,191,215,177,239,234, 63,169,220, 86, 9,173, 80, 79, 76, 6,133,133, 0, 8, 8,190, 72, 86,225, - 7,171,206,247,193, 32, 59, 62,127, 11, 0,190,193,204, 78, 39, 28, 18,234,108, 76, 30,250,216,137,248, 43, 1,112, 6,150,125, - 39, 89, 97,185,191, 88,152, 31,134, 10, 56,222, 47, 28, 33, 66,150, 35,219, 64, 16,227, 32,194,197,203, 5, 48, 88, 83,214,128, -230, 94, 17,135,127, 87, 12,142,251, 97, 42,186,119,108, 3,194, 50, 0, 71, 67,218,123, 38,126,251,246, 13,116, 15, 9, 0,225, -104,128, 99,224, 48,236, 27, 12, 11,119, 38,119,148, 77,203,131, 29,228, 11,183, 22, 30, 94,119, 55,111,222,226,237, 27, 24, 74, -113,140, 25,105,191,159, 30,247,241,172,249, 3,194,160, 14,183, 68,108,117,244,193,187, 1, 45,219,207,252,100,225, 42,190,143, -175,191,140,163,141, 76,225,131,148, 46,107, 87,204, 63, 32,226,229,172,188,173,192, 22, 75,251,114,168, 39, 38, 10, 36,226,209, -246,118,178,182, 58, 93,197, 61,214, 76,239,227, 9, 5, 67,191,254,102,117,231,126,145,195, 29,216,138, 66, 30,205, 33,116,239, -158,221, 45,190, 91,183,126,248, 93, 5,251, 60, 0,206,154, 58,115, 4,179,210,183, 79, 24, 46, 20,240,169,144,183, 55,243, 1, -166, 73, 66, 43,196, 11,175, 82, 4,141,134,151, 32, 20,206,167, 40,177,171, 41,191, 17,236,133, 31, 41,130, 32, 80,216, 79, 17, -236, 78, 86, 65,105, 27,242,108,176,225,191, 5, 30,143, 23,199,113, 92,255,167, 44, 12,158, 37,132, 92,182,181,238,255, 54,172, -179,104, 81, 88,146,148,153,231, 10,214,140,176,160,192,197,128,117, 66,203,142,207,223,118, 53,163,200, 27,140, 25,155,191,124, -127,143,137, 6, 24,218, 12,150,161,193, 50, 52, 24,198, 12,150,166, 65,104, 35,230,255, 20, 7,152, 42, 16, 17,222,110, 27,192, -250, 88,250, 27, 66,194,251,229,250,133,211,110,148, 73,141, 93, 63, 44,253, 48, 79, 85,249,225,153,219,242,226, 80, 47,253,156, -100, 37,126,182, 70, 16,196,109,152,138, 29,135,142,231,175,249, 81,155,202, 17, 2, 55, 39,251,246,227,162,147,252,183, 31,137, -203, 91,189,205,144, 10, 0,206, 50,113,251,241,183, 51, 2,158,228, 34,120,217,217,173,222,184,254, 59,111, 31,119,123,138,185, -180, 12, 12,203,194,191, 69, 20,127,206,148,113, 62, 75,190,221,242, 45, 52,198, 55, 27, 58,191,189, 23, 66, 91,182, 10,153,190, -237,248,165, 0,173, 70,105, 58,189,243,179, 76, 24, 65,123,251,133, 8, 23, 47, 93,197,159,251,233,212,105, 38, 54,255, 74,154, - 18,201,141,141, 53, 33, 94, 56,178,116,217, 55, 29, 7, 12,139,118,224, 42, 85,124,131,182, 50,104,243, 79, 91, 22, 6,119,236, - 38,237, 29,222, 92,164,220, 55,137,210, 87,148,194,204,179,147, 12, 8, 27,228,164,127,125, 44,189,121,235,142, 41,201, 74,172, -181,166,206, 44,249,163,239,113, 92,211,163,174, 83, 4,189,111, 94,142,155,200,202,175,130,176, 52,192,154,107,222,193,210, 32, -220,195,247,238,147,126, 2,208, 52,161,197, 35, 24,124,230,194, 85,159,162, 66, 69,215,111,191,249,106, 14,185,122,245, 87,176, -248, 37,165, 20,231,172, 21,152, 0,130, 90,187,243, 79,209, 44,140,121,229,108, 80,245,206, 1, 65,146, 30, 62, 14,212,192, 92, - 53,149,112, 62, 83,127,206, 54, 52,217, 96,195,255,139,197,132, 33,132, 8,158, 50,231,112, 66,200,137, 39,164,153, 9,224,221, -170,237, 45, 0,190,126, 10, 69,107, 14,192,187,106,187, 16, 64,190,173, 7, 60, 17, 30,119,126,111,114, 28, 45, 59, 16, 14,216, -255, 2, 0,216, 91, 91, 10, 2,216,129,226, 3,180, 22, 35,135, 69,194,195,203, 27,160,117,128, 89, 7,208,122,128,214, 2,180, - 30,197,138, 28,192,172, 5,178,126, 5, 67,136,196,234,234, 26,213, 64,250, 62, 12,236, 18, 0, 79,103, 59, 76, 29, 25,234,177, -233,100,250,150, 45,167,211, 6, 37, 43,241,138, 69,101, 37, 4,221, 59,180,197,154, 45,218,212, 99, 55, 84, 67, 0, 96,120, 39, -247,147,221, 67, 91,248,175,222,102, 72, 61,113,167,108, 40, 0, 12, 13,115,250,181, 91,123,159, 0,238, 9,194,211,112,132,244, -246,109,217,150, 98,111,110, 4,167,201,135, 70,163, 71,254,131,237,112,245,123,134,199,114,232,219,216,249,246,124,204,254,104, -238,114,161, 78, 83,100,226,204, 42,214,147, 95,198, 23,136, 57, 10, 5,231,140,149, 92, 57,251,201,132, 55,152,233,159,127, 57, - 27,192,184,134,120, 66,189, 48,101,229,202,213, 29,122, 70, 4,123, 21, 30,152, 74, 85,150, 21,129,225, 75, 37, 35,159,235, 9, -151,118,161, 92, 81,252, 74, 74, 28, 56, 8, 46,238,129, 40,184,180, 19,217,151, 15, 82,189,186,140,146,252,188, 75,244, 58, 96, -174, 83,104,181,245, 64,175, 33,125,186,237, 9, 12,240,245, 33,132, 3,199, 17, 16,142, 69,165,129,198,156,189, 89, 96, 89, 22, - 47, 13,233, 53, 80, 38,166, 8,199,113, 32,132, 67, 94, 97,137,238,236,149,212,129, 89,101,184, 98,137,165,170,211,179,253,123, -221,190,126, 57,152, 78, 63,134,136,113, 75, 83, 41,224, 66,173, 62,215,235,198,169,159,131,129,159,154,174,229, 40,176,217, 39, -151, 33,160,207, 4,254,198, 93, 39, 61,213,170,130,241, 7,182,175,127,249,135,141, 27,119,164, 42, 49,201, 26,145,245,113, 31, -241,133,111,207,106,220,159, 11,148,169,242,106,217, 41, 91,187,242,134,108, 56,145,252, 81,226,162,238,193,115,143,147,242,132, - 76,195, 29,219,184,101,131, 13,127, 47, 8, 33, 79, 93,108,229,228,228,200,159, 68,108,249,249,249,245, 41, 40, 40, 88, 81,237, -173, 66, 81,212,138,150, 45, 91,206,255,227, 65,245,145,103, 61, 53,203,178,227, 10, 10, 10, 18, 26,226,140,138,138,242, 61,126, -252,120,171, 90,156,173, 0,180,170,235, 88, 23, 23, 23,182, 71,143, 30,217,199,143, 31,151,219,122, 72,147, 4,151,213, 66, 43, - 53,119,223,212, 46, 70, 69, 37, 0,164, 90,112,252, 35, 83,126, 6,154, 93,182,117,225, 27,203,194, 90,186,161, 66,107,194,233, -107,217, 96, 89, 26, 44,195, 84, 89,182, 24,176, 12,141, 33,157, 60,208,195, 48, 9,107, 99,210,192,176,220,210,134, 56, 31,135, -153,112,175,118, 30, 52,102, 47,199, 17,177, 68,200, 83, 7,249,187,123, 77,127,169, 19,111,234,200, 48,232,205,204,152,157,241, -153,103, 83,148,216,108, 17, 39,247,231,240, 68,164,174,125, 44,211,104,221, 27,176, 70,117, 31,212,175,183, 19, 49,170, 65, 23, -103,161, 66, 71, 35,171,132, 70,161,161, 28, 18, 74, 97, 17, 39, 71,208,177,185,159,143,244,226,158, 79, 31,184,243, 53, 2, 47, - 62, 35, 18,243, 24,176, 28,225,147,242,100,163, 91,112,164,176,218,111,171,161,114,218, 75, 29,223,232, 51, 56,202, 57,119,231, - 4,202, 62,104, 8,188,186,248,227, 65,194, 86, 40,175,197,160, 68,158, 77, 57, 25,202,209,204,189, 13,134,141,123, 5, 95,191, -210, 21, 21,154, 10,240, 21,153,206, 98,161,196, 5, 48,215,201, 73, 88,140, 91,185,252, 75, 31, 1,159,247,176, 61,171, 95, 44, - 13,189,209, 8,176, 12,236, 4, 28, 40, 82,253, 29, 13,150, 54, 75, 59,142,250,244,125,128,189,210, 88,221, 83,148,216, 21,234, -137,222,224,232, 96, 66,235, 65, 1, 23,146, 85,127,136,159, 16, 47,188,250,204,144,183,122, 19, 10,231,155,114,141,194,221, 17, - 29,209,202, 65, 38,211,164, 34,127,255,135,200,132, 29,105,214,243, 93,188,250,246, 20,233,166, 77,155, 70, 0,100, 50, 30,245, - 81,171,225, 12,110,198,159, 72,179,152, 15, 0,122,154,108,117, 20, 83,111,175,220,157,232, 14,254, 31, 25, 30,170, 45, 89,153, - 37, 92,153, 57,110, 94,218,179,211, 99,250,117,184,217, 47,143,162, 36,185,231,238, 25,213,214,244, 37, 43, 97,227,180,113,254, -229,156, 78, 78, 78,173, 91,182,108, 57,159,166,233, 62, 34,145,168,153,217,108, 6,199,113,133, 98,177,248,124,118,118,246, 34, -141, 70,115,255,159, 86,247,219,183,111, 91, 35,182, 26,229, 20, 10,133, 72, 75, 75,187,103,133,216, 58,243,216,249,191, 92,184, -112, 1,123,247,238, 5, 0,164,167,167,163, 93,187,118,178,186, 78,124,240,224,129,172, 95,191,126,191, 0,240,111,136,243,206, -157, 59,173,143, 29, 59,134,253,251,247, 3, 0,210,210,210, 16, 20, 20, 84,103, 97, 46, 92,184,192,127,237,181,215, 90, 3,144, -255, 13,215,232,191, 32,178,106,191,255, 33,180, 98, 98, 98, 72,116,116, 52,245,248,118, 29,200, 10,112, 21,119,129,129, 5,128, - 44,107, 75,144, 82,132,229,107,182,159, 26,250,219,254,117,125,236, 68, 60, 44,216, 60, 61, 79, 85, 90,241,172,128,122, 56,253, -194, 16,240, 92, 29,196,137, 75,199,119, 10, 40,171, 52,224,232,239, 5, 9,201, 74,235, 76,164,201, 10,196, 2,156,203,195, 79, - 44, 12,122,101,208,248,175, 99,119,239,158, 61,180,227, 39, 35, 59,226,200,165,236, 79, 0,166,209,168,239,132,227, 64, 56,166, -198,249,189,234,209, 1,224, 30, 77,224,203,129, 60,220,199, 89,103,209,234, 11, 8,202,188, 48,204, 81, 42,254,126,226,196,247, -156,104, 85, 6, 74, 77, 34,228,149, 25, 80,168, 23,162, 82,224,133,130,212, 59, 44,143, 66,108,163, 38, 23, 10, 26,194, 24, 92, - 92,197, 14,188,240,200,247,253, 52, 39, 63, 43, 19, 83, 12,223,233,197, 37, 46,197,191,173,202,102,180, 42, 45, 69,161,209,240, -243,206,206, 46,237, 12, 37,217,124,117, 89, 49, 92,188,195, 48,116, 76, 52,190,136, 10, 69,133, 70, 11, 85,105, 34,105,235,227, - 68,229,156,223,129,185,195, 66, 80, 82,164,128,145, 6, 40,173,177,212, 96, 50, 84,214,219,142, 60,108,252,120,198,172, 87, 91, -248,120,202,170, 23, 21, 16,142, 69,167,144, 64, 68,246,233,142,216, 11, 23,113,245, 78, 58,184,170, 69, 5,132,227,144,175, 44, - 43, 50,152,217,173, 86, 53, 40,203,128,208,134, 58,133, 24,154, 48,101, 24,238, 5, 41, 11,124,222,181,181,227, 59,179,163, 91, - 56,202, 36, 20, 12, 52, 11,131,137, 70,197,197,239,225,222,178, 3,164,118,118, 84, 23,232, 5, 55, 80,119,219, 26,104,204,191, -175, 40,247, 65,101, 33, 94,139, 12,251,104,219,210, 15,100,148,221,195,174, 73,179,143, 90,178, 46, 46,236,122,234,181,197,135, -227,246,238, 27,235,251,245,204, 55,250, 13,153,182, 53, 14,192, 73,219,184,101,195,191, 17, 47,191,252,178, 93, 81, 81, 81,188, -191,191,127,104,100,100,164,180,119,239,222,208,106,181, 56,125,250, 52,180, 90,109, 11,127,127,255, 22,167, 79,159, 30,149,155, -155,155,220,188,121,243,126,251,247,239,183,216,135,182, 74, 0,241,107,134, 96,128,161, 40, 10, 85,251,168,170,125, 77,206,115, - 43, 22,139,145,147,147,243,212, 45, 91, 5, 5, 5,247,154, 98,217,170,172,172, 20,249,249,249,193,211,211, 19, 44,203, 66,171, -213,226,240,225,195, 80,171,213,224, 56, 14,246,246,246, 88,178,114, 51, 82,111,196,227,202,149, 43, 80,171,213,162,198, 56,243, -243,243,169, 78,157, 58,193,104, 52,130, 97, 24, 24, 12, 6,156, 57,115,166,230,179, 64, 32,192,172,197,223, 34,253, 90, 60,110, -222,188,137,252,252,252,191, 37,219,136, 21, 90,228,159,136,122, 99,102,253,237,171, 14, 89,150,153,179,105,219,238,196, 57,147, - 94,193,148,177,131,252, 23,173, 59, 56, 40,165, 24,219, 0, 32,196, 3,227, 95,239,223, 54,192, 69, 42,196, 23, 59,175, 1,132, -204,121,210,223, 75, 42, 69,122,104, 51,238,147, 67, 87,114,226, 63,123,165, 11, 2,125,156,218,149,137, 75,197, 89, 89, 22,228, - 20,228, 24,184, 58, 72,218, 15,239,228,126, 18, 28, 7, 23, 71, 73, 48, 88, 6, 46, 14,146,246, 67,195,156,126, 5, 0, 39,169, - 48,184, 46,203, 87,125,136,240, 23, 78,144, 74, 4, 19,100,142, 46, 1,111,142,136,180, 31, 62, 98,148,189,131,144, 65,201,149, -211,208, 8,155,131,118,107, 1, 35, 93,138,252,251,153,236,111,151, 83, 10,138, 43,140,211, 27, 45, 38, 65, 66,193,253, 52,207, -214, 29, 35, 93,139, 99,230, 42, 91,191,181,179, 21, 15, 28,175, 98,199,139, 69, 50,175,110,246,191,103,221,175,228, 72,157, 22, -157, 71,160, 81,171,179,105, 22, 62,122, 86,224,152, 25,247, 51,102, 15,235,128,178, 82, 37, 12,102, 6,106, 61, 99,246,118,177, -147, 24,239,223,133,209,204,192, 68,115, 16,186,248,225,116,226,157, 98,142,166,127,173,143, 51,171, 4, 55,179, 14,223,116,168, -189, 47,208, 3,157, 62,117,178,191, 9, 90,143,156,124, 57,182, 29, 79,236,146, 85,130,155, 79,114,157, 9,199, 60,156,126,174, -101,201,162, 8,122, 55,197, 9, 62,216, 11,221, 68,118,162,239, 86,124,242, 90,232,115, 65,110, 18, 46, 63, 17, 20,103,134,140, - 21, 64, 47,102,225,236, 31, 8,206, 84, 65,116, 6, 67,121, 18,208,208,197,231, 3, 0, 49,107,241,245, 27, 97, 50,202, 53, 16, -108,214, 73, 8, 58, 79, 0, 93,101,237,207, 44,225,238,152,227,230,165,246,152,113,172,239,226,216,254, 41,242,227, 11, 82,252, - 94,254,190, 19,176,181,165,237,118,109,195,191, 17,237,219,183,247, 46, 40, 40, 72,154, 49, 99,134,219,139, 47,190,136, 67,135, - 14, 65,163,209, 96,235,214,173, 88,189,122, 53, 22, 46, 92, 8,154,166,177,105,211, 38,233,129, 3, 7,186,173, 95,191, 62, 63, - 32, 32, 32, 44, 55, 55,183,176, 17,129, 69, 1,144, 0, 16, 86,221,187, 40, 0,220,137, 19, 39, 48,124,248,112,156, 56,113,130, -171,218,199,226,225,195, 79,147,114,127,138,197, 98,136,197, 98,168,213,234,167, 34,182,132, 66, 33, 28, 28, 28, 32, 22,139, 81, - 81, 81, 97,181,216, 98, 24,134,159,159,159, 15,181, 90,141,200, 17, 35,240,237,210,165,232,223,191, 63, 34, 35, 35, 65, 8,193, -153, 51,103, 48,168,103, 56, 94,121,190, 31, 82, 82, 82,192, 48,140, 69,229, 45, 44, 44, 68, 81, 81, 17,134,142, 24,129,205,235, -215,163,123,247,238,104,223,190, 61, 24,134, 65,124,124, 60, 94, 30,210, 19,118, 47, 12, 66,122,122,186,173, 83, 91,110,205,122, - 42, 62, 90, 79,140, 36, 21, 46,115, 71,206,197,140, 29,210, 45,122, 68,175, 80,108,222,243,219,151,240,212,236, 6, 0,119,163, -100,201, 27,253, 3,145,156, 91,134,223,110,202, 99, 82,138,241, 84, 86,107,112, 44, 60,220,157,164, 0, 95, 12,189,153, 99,156, -178, 26,119, 96,230, 8,129,180,207,167,120,125, 68,178,127,247, 80,127,255,234, 85,135, 14,195, 87, 97,252,157,123, 1, 93,219, -123, 7,128,165, 1,150,134,211, 43, 59,129,197,178, 70,203,209,179,149, 56,246,227,169, 83,123, 12,123, 97,140,189, 88,234, 12, - 86,147, 7,186,240, 14, 74, 50, 18,160,149,182, 67, 97, 78, 22,246,158,186,162,206,200, 47,209,240,120, 56, 93,164, 54,206,204, - 42, 67,101, 99,188, 6, 26, 75,231,207,157, 30,181,119,247, 30, 71, 73, 96, 47, 42,243,251,225,106,177,128,145,120,182,122,134, -167,179,243, 32, 95,109,221,227,164, 53, 97, 89, 99, 60, 58,173,230,224,153,211, 39, 95,105,219,186,151,227,131,171,199,161, 55, - 24, 97,164,129,176,110,253,192,178, 68, 76,241, 40,206,137,207,167,148, 37,101,160,104,182,232,252,173, 7,138, 11,183,178,248, - 70, 71, 44,107, 48,186,200,227,234,158,226,127, 52,162, 95,103,128,214,227,249, 62, 29,240,237,142,223, 62, 4,216,183,158,236, - 34, 63,180,104, 17,160, 87,168, 39, 54, 16,130, 94,215, 14,175, 14,142,120,225, 99, 88, 99,209, 10,243,192,176,144,214,190, 63, -127,187,228, 83, 55,247,230,237,248, 20, 71,131,120,119, 4, 52,249,132,202, 79,132,179, 95,119,176,190, 61,177,105,237, 55,149, - 28, 71,118,163,129,208, 22, 44, 7,112,185,231,192,166, 30, 66, 86, 86, 22, 60, 90, 92, 3, 40, 30, 72,203, 7, 48, 51, 15, 79, - 51,154,201,241, 53, 91,143,245,159, 57, 96,105,216,136, 96, 65, 64,226,173, 76,229,152,183,125,165,207, 6,240,131,146, 21, 50, - 94,177, 86,203,217,198, 47, 27,254, 77, 48, 24, 12, 7,151, 47, 95,238, 22, 29, 29, 93,109,145, 65, 98, 98, 34,182,108,217, 2, -153,236,209,113,114,248,240,225, 32,132,184, 45, 88,176,224, 32,128,231,234,227,236,209,163,199,136,155, 55,111,202, 59,119,238, -156, 85, 37,182, 68, 0,120,119,239,222,229,229,229,229, 81,174,174,174,196,215,215,151,150,203,229, 28, 0,246,237,183,223,230, -239,219,183,175,173, 86,171, 61,215, 84,161, 37, 22,139,159,138,207,150, 80, 40, 4, 69, 81, 16,139,197, 16,137, 68, 32,132, 88, - 37,182, 88,150, 21,156, 56,113, 2,215,174, 93,195,194,206,157,241,137,159, 31,220,220,220, 16, 31, 31, 15, 66, 8,100, 50, 25, - 74, 75, 75,177,123,247,110, 12, 24, 48, 0, 12,195,136, 44,225,221,191,127, 63,174, 95,191,142,197, 17, 17,248,196,217, 25, 14, - 14, 14, 56,115,230,225,108,160, 68, 34, 65, 78, 78, 14,206,156, 57,131,126,253,250,217, 58,245, 19,194,226,206,211, 23, 16,148, - 82,240, 54,155,244, 32, 12, 1, 40,248,134,132, 64,148,146,242,168,115,142, 37,224,241, 48,119,237,182,152,168, 85, 31,143,160, - 38,140,236,226,187,232,231,184,201, 0,240,206, 75, 65,126, 82,137, 0,107,142, 36, 19, 30, 15,115,159, 70, 5, 67, 66, 32,162, - 74, 48, 57,178,123,123,200,203, 77,200,148,151,159, 77, 1, 44,202,226,252,219,170,215,177,253,104,124,222,234,237,134, 84, 66, - 8, 92, 28, 36,237,199,223,206, 12,248,249,196,245,220,149,123, 13,169,132, 35,112,145, 10,131,223, 74,233,217,232,170,195, 8, -127,225,132,105,211,167,247, 28,249,214, 12, 59, 38,117, 31, 76,153,167,192,153,245,208,152, 69, 40,231,123, 35, 63, 55, 23, 95, -109,138,201,211,104, 77,175, 36,169,172, 19,152, 25, 37,168, 20, 80,154, 23,191,250,226,179,216,165, 75, 22, 56,232,179,226, 43, -249, 20,163,231,183,236, 43, 88,178,112, 21, 85, 97, 52,141,201, 42, 67, 69, 99, 60, 70, 71, 44, 91,190,114,109,212,123,227, 70, -165, 6,181,235,235,206,202,239,187, 27, 52, 26,229,206,147,215,189,171,158, 20, 41, 0,200,204, 47,129, 74,173,101, 88,134, 62, -231, 40,196,162,100, 75,172,131, 85,104,237, 5,207,232, 94, 97,175,121, 58,138,160,175, 44,135,151,163, 16, 67,186,183,121,141, -254, 61,253,211,251, 74,107,228,218,227, 66,139, 6,161,245,184,188,108, 64, 48, 97,233, 96,176, 52,204,183,127,177,222, 50, 70, -225,147, 41,125, 28,156, 92, 77, 15,120,208,202, 0,123, 15, 80, 78, 45, 0,231, 86,148, 48,100, 12,228, 89, 73,204,135,175,141, - 43,185,159,157,255,163,135,125,195,211,218, 52, 71,192,101,199,163,178, 40, 19,119,229,102,132, 41, 31,206,182, 59, 21,221, 0, -107,139,152, 99,195,127, 20, 57, 57, 57,111,204,153, 51,231, 66,247,238,221,155,121,120,120,160, 67,135, 14, 56,122,244, 40,102, -204,152, 81,115, 76,231,206,157, 65, 8, 65,105,105, 41,150, 47, 95, 94, 40,151,203,223,104,240, 1, 61, 41, 41,117,251,246,237, -125, 66, 67, 67,205, 34,145,168, 28,128,164,188,188,220,174,180,180,148, 50, 24, 12,224, 56,142,115,118,118,102,229,114, 57,253, -202, 43,175, 24, 47, 93,186,212, 70,171,213,230, 60,137, 69,203,223,223,255,110, 73, 73,137,154,162,168, 39, 14,253, 80, 45,178, - 60, 60, 60, 60, 43, 43, 43, 57, 0,101, 77, 9,253,192, 48, 12, 34, 34, 34,112, 42,225, 6, 78,252,118, 9, 26,121, 26, 38,191, -247, 6, 58,116,232,128, 83,167, 78, 53,249,154,117,234,212, 9, 39,207, 92,192,133,107,183,144,147,126, 27, 31, 78,126, 15, 97, - 97, 97, 56,121,210,230,189, 96, 5,142,227, 81,223,172,227,143, 11,173,126, 49, 49, 49,213, 67,255,159,228,107,176, 7, 58, 9, - 93,196,191, 44, 24,214, 38, 68, 24,185, 0,148,208, 30,251,218,157,236, 57,247,171,239, 83,249, 94, 57,227,238, 42, 27, 95, 29, -246,200,159, 70,137, 36,114, 37,117,215,173,148,224,215,158,239,238,143,205, 71,165,159, 3,192,152,222,173,241,123,134, 10, 87, -210,149,187,146, 85, 72,122,210, 90,135,123, 65,202, 22, 99,215,242,143, 70,246,107,209,220, 27, 91, 14, 93, 0, 69,225,160, 69, - 55, 92, 66, 72,247,208, 22, 88,189,253,241, 21,134,222, 1, 43,247, 26, 82, 79, 39, 85, 12, 3,128,200, 96,233,175, 93,219,184, - 6,144,218,142, 91,117,192, 94, 44,152, 56,108,212,235,118, 76,250, 81, 32,251, 12, 40,198, 8,189,153,131,162,184, 2, 58,103, -127,196, 39,222,210,171, 13,166,143,147, 85, 77,179,226,165, 20, 35, 75,116,245, 86,110,165, 86,239, 35,245,108, 99,224,243, 56, -174,210, 72,240,123,114,182, 38,185, 16,105,150,112,100,101,193,244,172, 31,211,123,195,182,189,243,133, 34,241, 24, 62, 5,202, -203, 69,230,185, 97,213, 98, 56, 58, 58,128, 51, 85, 2, 90, 21, 94,252,224, 43,213, 93, 57,221, 26, 0,218,185,195,161,119,107, -225, 54, 1,143,202,143,203, 52,207,107,236, 55, 40, 26,147,198, 13,233, 44,228, 76, 90,124,180,124, 15, 54,126, 58, 18,175, 15, - 12, 17, 30,191,152, 62, 9,192,162,166, 94,107,194, 50, 32,180, 30,207,125,150,144, 74, 1, 23, 8,208,235,218,222, 37,193,192, - 13,139, 57,186, 0, 66, 86, 64,133,116, 12,144,137,184,252,139,224,242, 47, 18,190,127, 79, 80, 1,125, 40,202, 59,130,124,183, - 98,161,118,243,230, 45,167, 57, 30,190,176, 32, 84, 6, 88, 14, 40, 78,191, 0,147,201, 4,154, 5, 12, 6, 3,180, 90, 45,100, -153, 39,107,124,180, 68, 66,106,232,212, 55, 71,116, 34,149,114,221,177, 84, 38,119,203,123,193,207,145, 74,185,238,114, 46,155, - 94,172, 53,218,172, 89, 54,252, 27,145, 37,151,203,135, 14, 31, 62,252,183, 83,167, 78,185,133,135,135, 3, 0,174, 93,187,246, -240,161, 51, 34, 2, 65, 65, 65, 40, 42, 42,194,216,177, 99,139, 21, 10,197, 80, 52,226,243, 91, 81, 81,113,127,255,254,253,205, -180, 90,109,231,121,243,230, 41, 91,180,104,161, 49, 24, 12, 84,121,121, 57,199, 48, 12, 92, 93, 93,197,157, 59,119, 70,143, 30, - 61, 42, 19, 19, 19, 91,230,229,229, 85, 0,200,110, 74,225, 71,142, 28,137,132,132,135,139,246,158, 70, 92, 45,145, 72,132,240, -240,112,191,172,172,172,130,170,123,139,213, 99,124,237,219,203,173, 91,183,112,238, 70, 62, 4, 38, 61,196, 42, 57, 46, 31,218, -143, 17, 19,223, 7,195, 52, 61,183,252,173, 91,183,112,248,204,101,200, 36, 2,164,165, 37, 97,255,254,253,152, 60,121,242, 19, -113, 54, 17, 13,106,145,127, 56, 20,168,199, 79, 75, 0, 0,209,209,209,231,170,173, 21,181, 17, 24, 8,177,164, 18, 11, 34,187, -248,205, 26,211,171, 13,159,214,200,193,177, 28,248, 66,192,203,195, 9,191,252,178,171,245,174, 61,123, 18,215,175, 91,191,150, - 99,152,185,119,149,208, 89, 81,168, 5,171,246, 92, 24,243,203,244,126,130,201,195,130,221, 0, 64, 36,224, 97,205,209, 36, 6, -192,130, 39,169,237,179,126,197,208, 97,164, 0, 0, 32, 0, 73, 68, 65, 84,176,171,164, 49,193,203,221,249,243, 57,239, 70,185, -245,139, 8,194,185, 43,119,177,118,127, 98,130, 88,137,237, 22,119,110,142,198,227,250,169,174, 85,135,224, 26,247,187,100, 89, -226, 45,146,185,194,156, 29, 7,152, 13, 48, 24,205,200, 43, 97,145, 87,106,128, 64, 42,194,181,244,124,189,123, 33, 98,158,160, -218,148, 76,106,231, 59,255,203,149,205, 13,250, 74, 70, 83, 86,204,136,196,151,133, 82,123,137,194, 26, 87,133,203, 5, 48,244, -105, 37,124, 6,224,248, 98, 59,162,251,108,218,155,178,130,228, 83,104,203,147,131, 34, 4,246, 33, 81,112,180,231,139,122,181, - 20,230, 2,128, 76, 38, 21, 47,255, 98,134,243,199,159,126,209,168, 15, 88, 8, 32, 10, 10,244,254, 56,188,133, 43, 18,174,167, - 34,225, 78, 78, 82,194,181,180,176,254, 29,124, 17,212,220,101,170,184,172,124, 89, 10,172,183,144, 62,188, 48, 12, 64, 27,106, - 86, 29,134,120,225,213,174, 99,230,213,183,218,176, 78,180, 2,184,116,150,128,226,243, 1,138,247,112, 5,100,222, 69, 8, 92, - 2,201,174,189,135,117, 91,182,108, 95,156, 82,108,249,226, 12,154, 5,171,209,104, 32,147,201,112, 50,157, 49,190, 62, 68, 36, -225,241,120,200, 75,191,241,135, 51,188, 27, 47, 84,212,127, 73,240,197,133, 93, 79, 57,138, 41,137,111,212, 23, 33,204,157,237, -249, 77,189, 73,216, 96,195, 63, 1,106,181,250,118, 74, 74,202,144,142, 29, 59,110,253,232,163,143, 28,199,141, 27,231,251,222, -123,239,241, 0,160,168,168,136, 91,189,122,181,252,187,239,190, 83, 23, 23, 23,191, 69,211,180, 37,161, 76,136, 66,161,184,244, -227,143, 63,170,206,159, 63, 31,214,173, 91, 55,201, 51,207, 60,195,185,186,186, 10, 36, 18, 9,107, 50,153, 12,233,233,233,108, - 86, 86,150, 79,121,121,249, 61, 0,153,104, 66,198,138, 42,235,213, 34, 62,159, 63,159, 16, 18,254, 52,124,180,164, 82,169, 47, -128,123, 20, 69,181,181,118,218,240, 79, 55,108,129, 0,101,101,101,208, 21, 38,193, 46, 63, 3, 29,101, 60,132,186, 58,192,201, -201,233,137, 68,145, 90,173, 6,180, 5,184,112,225, 22,192, 48,112,118,118,134,179,179,243,223, 46,180,234,211, 34,255, 18, 76, -168, 99, 95,195, 62, 90,161,158,152,108,111,194,234,137, 81,109, 68,173, 2,154,195,152,127, 13,183,242, 42, 49,247,217,110,201, -124,137,163, 97,226, 27, 35, 35, 70,189,220, 18,253,122,116,165, 90,249, 56, 79, 93,182,234,135, 15, 66, 81, 60, 35, 89,137, 53, -150,148, 40, 89,133,251, 28,148, 91,226,110,231, 79,106, 46,213,131,227, 8,226,238, 40,112, 39,187,108, 75,170, 10,247,173,169, - 93,168, 15, 6, 9,192,219, 67, 8,177,115,150,201, 42, 66,131,154,123, 12,122,174, 19,111,104,223, 8,136,248,192,133,223,111, -225,147, 85, 7, 47,115, 28,137,186, 97,225,180,225,195, 21,134,143, 10,168,135, 43, 12,233, 71, 86, 24, 18, 66,200,195, 85,135, - 13, 27, 31,248,124,170, 80,151,115,213, 91,232,222, 14,250,204, 56,100,151,113,200, 81, 86, 64, 35,240,134,177,160, 0, 32, 92, -238,185,134, 29,171, 27,132,135,135,135, 87,235,208,160, 54,223,111,219, 15,179, 78,141,251,241, 91, 81, 89,166,192,146, 13, 71, -219,248,249,185,247, 45, 40, 40, 56,103,197, 96, 19,244, 91,204, 46, 47, 16,128, 47,148,224,248,250,189, 40,118,183,135,135, 84, - 4, 78,175,194,196,143,199, 57, 15,139, 28,231, 12, 0, 57,105, 55,209, 66,170,183,136,215,236,142, 81, 99,250,183,119, 1,173, -199,182,147, 55, 13, 60, 96,232,246,211, 73,153,253,131, 93,236,198,244,106,225,186, 72, 94,254, 18, 74,154, 22, 84,180,218,162, - 85, 99,225,107,194,106,195,253, 0, 27,204, 33,115,207, 37,165,236,229,200,103,164, 34, 1, 69,145,202, 2, 16,123, 15,252,176, -109, 95,165,152,182, 46, 19, 59, 7, 44,234,190,244,254,252,135,253, 4, 91,135, 45,189,246,110,236,231,207,122, 22, 22, 22,194, - 92, 53,119,120,191,148, 59,251, 70,100, 40,155,175,230, 76,167,151,189,248, 50,101,239, 41,158,249,245,246,120, 2,216,162, 73, -219,240,175,134, 94,175,191,174,215,235, 59,204,156, 57,243,213,207, 62,251,172,143, 76, 38,107, 13, 0, 90,173,246, 62, 77,211, - 9, 85,255, 79,107, 86, 7, 18, 0,247, 50, 51, 51,239,103,102,102, 54,219,177, 99,135, 11, 0,187,170,239, 12, 0,202, 1, 20, -225, 9, 86, 28, 86,139, 42,138,162,230, 63,173,118,168, 22, 85, 20, 69,181,109,202,249, 60, 30,143,165, 40, 10, 20, 69, 65, 34, -145,224,252,249,243, 24, 29, 21,137,148,227,229, 8,119,113, 64,183,183, 38, 98, 79,108, 44,248,124, 62, 40,138, 2,159,207,183, -234, 62, 34, 16, 8,112,225,194, 5,188, 62,246,101, 72, 4,128,179,179, 51,102,206,156,137, 35, 71,142, 64, 32,176,101,233,179, - 2,155,106, 9, 46, 11,227,104, 81, 88, 20,187,245, 43, 17, 88, 26,199,182,126,131,152,255, 99,239,188,195,162,184,218, 40,126, -166,108, 99, 89, 58, 75, 47, 34, 17, 16,197,222,149,168,177, 37, 17, 99,139, 45, 49,182,168,196,104,212,152,216,141,198, 24,187, - 17, 99, 47,201,103,239,198,130, 73, 84, 18,123, 65,197, 2, 34, 32, 40, 74,239,157, 93,182, 76,249,254,160, 4,148,178,139,166, -153,249, 61,207, 60,179,101,246,236,204,220,221,185,103,222,123,239,123, 35,138,180,209,153,152,231,147,137,160, 35, 40,228, 50, -191,219, 29,120,238, 74,196,170,177,195, 2,228,111,117,239,133,183,186,117,167,155,182,237,186, 0,168, 98,180,122,162,150, 92, - 27, 44,135,111,182,253, 26, 53,241,224,133, 24, 2,186, 66, 12,235,221,150,103, 57,124, 83,199,193,188,160,105, 97,162, 56,120, -229,250,117, 43,232,138,240,244,238,239,178, 6, 13,223, 0, 88, 29, 98, 99, 31, 97,253,174,159,184, 11, 55,163,247,104, 25,124, -246, 56, 23,197,134,106,150,214,148, 12, 44, 76, 37, 62,111, 55, 53,255,133, 3, 15, 75,185,184, 49,207,177,176,148,139, 26,247, -106, 44,255,133,231,121,222,204, 68,212,152,103,245,117,106,170,181,204,214, 93, 63,238, 88, 51,110,220, 56,211,172,164, 52,164, - 20, 68,160, 72,226, 12,189,220, 21,113,119, 47,169, 85, 26,198,144, 74,188,198,243,153,149,149,149, 17, 22,154,131,131, 91,150, - 65,175,213, 32, 35,169,212,171,166,100, 21,192,220,214,249,122,114,114,178,193,154, 58,134,203, 31,244,225, 4,177,137, 25, 76, - 70, 14, 10,144,196,101,107,208,202,201,172,244,162, 81,148,137,135, 33, 87,208,173,172,143,233,227, 68, 18,238, 45,156, 12,218, - 79, 51,153,248,179,119, 90, 59,227, 73, 66, 42, 46, 63, 72,222,245, 36, 7, 41,108, 84,234,174,184,148,188,192,254, 29,220,176, -246, 68,228, 20, 64,191,223,152, 99,247,181,195, 8,158, 71,151,210,206,240,106,240, 64, 23, 95, 59,140, 48,112,164,225, 11,154, -180, 24, 31,172,249,229,217,252,195,183,178,250,207,252,192,223,188, 83,167,119, 37, 96,180, 40, 84,107,244, 15,243, 80, 96,140, -102,129,154,219, 10, 96,107,249, 27, 97, 73,220, 30,255,133,215, 47,237, 31,239,170, 44,247,234,151,226, 52,215, 1, 92, 31,219, -222,100,129,184,251, 18,159,235,139,219,159, 9, 79,229,246, 94,138,171,200,161, 85,231,255,168,158, 8,154,130,230, 95,161,201, - 2,216,163,215,235,247,228,229,229,189, 74,205, 20,188,152,215,233,165,142,189,114, 51, 33,207,243,116, 89, 52,171,174,206,240, -181,106, 86,110, 38,228,121,254,231,178,104, 86, 93, 81,173, 42,154, 28,199,165,180,105,211,198,186, 95,191,126, 96, 89, 22,143, - 30, 61,194,179,196, 68,244, 12,156, 2, 75, 75, 75, 92,186,127, 31,209,209,209,248,234,171,175,160,215,235,113,252,248,241,164, -186, 52,105,154,214,189,241,198, 27,226, 1, 3, 6,128, 97, 24, 60,126,252, 24,201,201,201,152, 62,125, 58, 44, 44, 44, 16, 22, - 22, 86,161,153,149,149, 5,154,166,117,213, 68,183,254,140,223,210,191,157, 23, 76, 86,237, 70, 11, 96,193,234,145,127,110, 33, -214, 93,134, 78,167, 71,227,200, 76,196, 71,254, 17,145,218, 76,133,222, 63,117, 63, 34,234, 73,216,213,183, 36,200, 8,135,177, -119, 18,143,178,145,106, 38, 43, 44,132,174,208, 28,143,127, 65,124,122, 97,209,163,108,164, 26,125,199,192,177, 4,116, 42, 32, -245, 54,174, 93,186,136, 11, 55,238,225, 86,120, 20,123, 45, 44,230, 32,201,225,155,135,217,120, 84,143,187, 16, 40,250,174,197, -232,240, 88,183,182,222,246,110, 96, 25,240,156, 30, 22,195,246, 99, 76,100, 39,183,182,158,150,110,165,145, 44, 61,172, 62,254, - 29, 88, 35,171, 85,239,118,162,126,155,228,196,153,193,133,121,217, 29,122,116,237,104,106,225,251, 14,178, 98, 99,240,232,222, - 21,117, 88, 68,220,181,219,137,250,109, 47, 83,186,206,206,206,111,246,232,234,131, 97, 19,231, 64,167,202,199,227, 11, 63,162, - 40, 39, 13,151,175, 43, 16, 85, 80,208, 17,128,193, 17,173,235, 9, 76, 83, 36,228,162,115, 3, 81,130, 25, 52, 14, 31, 5,244, -131,148, 40, 1,167, 41, 0,161,202, 66, 92,178, 54,127,240,150, 68, 22, 0,228, 82,130, 54,229,243,205, 13,138, 60,186,219,120, -201, 41, 61,118,159,123, 0,142, 43,157,190,137,227,176,121,247,239,113,129,223,140,108,133, 38,110, 86, 45,238, 38,103, 16, 48, - 34,228, 79,240,240,191,117,240,235,198, 37,191, 45, 0, 56, 29,174, 76,181,110,236,191, 46,199, 31,245,156,110, 39, 34, 5,201, - 0, 2, 65,171,182, 78, 93,247,235,130, 54,231, 34,187,204,248,184,191, 57,248, 87, 50, 66, 55, 38, 50,141,125,179,253,242,103, -103, 56,190,106,123,110,105,100,203,151, 79, 41,224,239, 94,138,211, 8, 89,225, 5, 4, 4, 0, 0, 69, 69, 69, 19,199,140, 25, -179, 85, 36, 18, 41, 1, 16, 28,199,129,227, 56,122,213,170, 85, 34,150,101, 73,146, 36, 89,138,162,152,159,127,254, 89,207,178, -108,102, 73, 73,201,196,186, 52, 25,134,137,155, 52,105,210, 27,117,141, 80, 60,112,224, 64,185,201,138, 19, 74,194, 32,147, 85, -121, 93, 17,229,162,107, 9,210,126,221,121,228,194,133, 0, 8,240, 88, 20,153,137,248,231, 55, 9,207, 65, 74, 19, 74, 55,189, -105,219,174, 11,203, 63, 99,236,158,149,176,236,251,109,155,121, 31, 0, 0, 13,207,142,172,207,209, 21,104,212, 67, 91,182,237, -120,144,227,121,154,225,249, 29, 36,135,163, 37, 12, 30, 26, 50,210,174, 38, 82, 50,242,194,222,241,179,224,129,210, 38,195,138, -230,194,178, 52, 14, 60,207,243, 21,205,133,171,101,200,202,215,212,153, 7,234,106,188,182,151,150,185, 53,225,236,213,187, 19, - 89,150,119,160, 40, 34, 77,173,101,182,190,172,201, 2,128,228,228,228,139, 33,231,146,207,222,111, 97,223,219, 86, 94, 22,229, - 82, 1, 89, 42,156, 77,206, 44,186, 88, 31,205,220, 98,125,255,185, 65, 39, 78, 74, 68, 20, 13,158, 47, 77, 40,202,243, 40,209, -177, 57,215, 19,152,166, 0,208,204, 26, 78, 95, 30,103, 14, 80, 20,241,172, 46,189,208,232,212,181,195,150,135,124,241,224,105, -238,142,167,121,136, 0,128,167,121,136, 56,116, 37,126, 65, 92, 90,225, 23, 17,207,114, 87,195,200,126, 21, 60,129,203,109,135, - 45,124,225,181,151, 61,159, 81,169,184, 7, 96, 32,144,212,107,216,140,245, 51, 8, 2,175,106,250,137, 24,181,142,119,127,254, -197,242,200,150,112,173, 18, 16,248,103, 80, 30,213, 34, 73,114,241, 43,212,252,153, 32,136,119, 1,196, 26,241,177,208,162,162, -162,102,175,248,240,178, 25,134,201, 54,100,195,191,161, 67,252,191,149,109,127,215, 23,247, 20, 52,255,122,205, 70,141, 26,241, - 70, 24, 22,225,124, 10,154,130,166,160,249,159,210,228,121,158,122,153,165, 6, 77,226,101, 22,161,140,254,245, 76,168,233,185, -208,211,237, 53, 36, 54, 54,150, 16,206,130,128,128,128, 64,245, 16, 4,193,254, 9,154, 66,118, 60,129,114,131, 85, 37,186, 69, - 10,231, 68, 64, 64, 64, 64, 64, 64, 64,224,149,152,172,202,235, 82, 19,142,154,195,127,198,140, 38,168, 79, 8, 49, 68,208, 20, - 52, 5, 77, 65, 83,208, 20, 52, 5,205,255,156,102, 93,218,194,104,198, 63,217,128, 9,154,130,166,160, 41,104, 10,154,130,166, -160,249,223,211,252, 55, 83, 99, 31, 45,161,233, 80, 64, 64, 64, 64, 64, 64, 64,224, 79, 66,232, 12, 47, 32, 32, 32, 32, 32, 32, - 32,240,114,212, 57,169,180,128,128,128,128,128,128,128,128, 64,253,168,125, 82,105, 1, 1, 1, 1, 1, 1, 1, 1,129,122, 99, -252,164,210, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,177, 77, 56, 5, 2, 2, 2, 2, 2, 2, 2, 2,127, 13, 85, 71, 29, 6, 7, - 7,243,149,215, 2, 2, 2, 2, 2, 2, 2, 2,127, 37,175,171, 23, 17,154, 14, 5, 4, 4, 4, 4, 4, 4, 4, 94,142, 9,130, -209, 18, 16, 16, 16, 16, 16, 16, 16,248,115,168,177,143, 86,121,194,210,110,101,161,186,110,194,185, 18, 16, 16, 16, 16, 16, 16, -248, 27,120,189,189,136,208, 63, 75, 64, 64, 64, 64, 64, 64, 64,240, 34, 2, 2, 2, 2, 2, 2, 2, 2, 2,255, 36,132,185, 14, - 5, 4, 4, 4, 4, 4, 4, 4,254, 98,195,245,167, 27, 45, 97,102,115, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255, 75, - 38,171,138,217, 18, 70, 29, 10, 8, 8, 8, 8, 8, 8, 8,188, 28,117,142, 58, 20, 16, 16, 16, 16, 16, 16, 16, 16,168, 31, 19, - 0, 4,148, 61, 14, 64,165,168,150, 16,209, 18, 16, 16, 16, 16, 16, 16, 16,120, 57,182, 1,112, 44, 51, 88,167, 1,164, 10, 70, - 75, 64, 64, 64, 64, 64, 64, 64,224,213, 80,185, 95, 86,223, 74,230, 75, 48, 90, 2, 2, 2, 2, 2, 2, 2, 2, 47, 73,141,125, -180, 8,212, 60,114, 32,196,136, 47,168,207,232,131, 16, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255,115,154,117,105,135, -224,223,199, 4, 99,204,215,171, 68, 24,250, 42,104, 10,154,130,166,160, 41,104, 10,154,130,230,127,150, 87, 62,234,176, 21, 96, - 34,156,214,215, 18,251,178, 69, 64, 64, 64, 64, 64, 64,160,118,254,156, 81,135,190,192,199, 31,250, 41,183,232, 35, 50,205, 35, - 0, 85,109,219, 42,149,202,173,114,185,252, 67,149, 74, 85, 76, 16, 4, 87,254, 58,207,243, 0, 80,121,174,163,199,153,153,153, -254,117,125,183, 68, 34, 9,178,183,183,255,184,168,168, 72, 69, 16, 4, 79, 16, 4, 8,130, 0,128, 23,214, 44,203, 38,101,103, -103,183,249, 87, 23, 33,207, 83,182,246,246, 55, 69, 20,229,108,236, 71, 89,142,139,207, 72, 79,239,104,196, 71,150, 17, 4,102, -150,126, 45, 86, 2,152,243,186,253, 35,120,128, 50,100, 59, 63,192, 44, 6, 24,198,146,228, 20, 17,176, 81,195,113, 91, 0,128, - 0,216,250,126,183, 38, 20,111, 16, 60, 90, 16, 4, 44,120, 30,249, 60,129,123,210,246,136,251,155, 78,197, 32,145, 72,212,223, -220,220, 92,145,157,157,125, 17,192, 1, 0,195,109,108,108,186, 22, 20, 20, 20,233,245,250, 19, 0,142,213, 71,216,191, 5,102, - 73,196,162,177, 37, 58,253,138,171,247,240, 99,215, 86,176, 97, 56, 44,151,137,105,127,141,150, 89,121,229, 62,118, 24, 41, 73, -148, 45,229,215, 12,163,231, 72, 59,108, 96,185, 3,192,113, 43, 43,111,169,210,252, 55,145,132,138,207, 75, 47,250,240,253,140, -140,196, 33, 47, 81,238,255, 68,108,109,109, 71,147, 36,249, 45,207,243, 96, 89,118, 94, 78, 78,206,206, 87, 36, 61, 15,128,101, -217,227, 60, 0,223,190,164,222, 51, 0,110,101,143, 19, 0,184, 11,245,122,189,217,252,211, 79, 63, 5,118,239,222, 29,107,215, -174,197,230,205,155,159,102,102,102, 46, 7,176, 11,128,246,111,208, 17,168,137, 38,192,187,171,250,180,103,245,255,251,134,171, -244,114,207, 26,254,204, 63,124,244,209, 71, 58,158,231,249,232,232,104, 94,171,213,242,122,189,158,103, 24,134,103, 24,134,215, -235,245, 21,139,179,179,115,242,115, 31,127, 65,147, 36,201,117,131, 7, 15, 46,228,121,158,191,125,251, 54,175, 86,171,121,141, - 70,195,107,181, 90,190,164,164,132, 87,171,213, 85, 22,123,123,251,244,218, 52,205,205,205,111, 91, 89, 89,165, 91, 89, 89,165, - 91, 91, 91,167, 91, 91, 91,167,219,216,216, 84, 44,182,182,182, 21,139, 82,169, 76, 87, 42,149,233,214,214,214,183,235,218,207, - 50,250, 0,184,104,192,210,167,154,207,246,172,108,180, 28, 29, 29,211,249,122,224,226,226,146,104,192,126,150, 99, 79, 16, 96, -203, 63, 75, 16,224,164, 82,169, 91,229,247,241, 98,164,171,206,144,178,147,147,211, 96, 71, 71,199, 16, 71, 71,199,115, 78, 78, - 78,131, 13,248,137, 85,209, 52, 51, 51,187,109,107,107,155,238,224,224,144, 81,190, 56, 58, 58, 86, 89,156,156,156, 42, 22,123, -123,251,116, 43, 43,171, 26,203,136, 7,168,154,150, 11, 0, 45, 5,222,162, 41, 42,216,222,222,190, 32, 60, 60,156,229,121,158, - 39, 73, 50,185,124, 27, 99,142,253,121,147,165,186,130,121, 89,231,165,161, 69,241,203,243,179,206, 75, 67, 85, 87, 48, 79, 19, -138, 55,234,171,105, 32,213,105,142, 26, 53,106,212,189,244,244,244,228,188,188,188,212, 45, 91,182,196,200,100,178, 43, 91,182, -108,137,201,203,203, 75, 77, 79, 79, 79, 30, 53,106,212, 61, 0,147,140,208, 4, 0,116,108,129, 14,227, 6, 57,170,238, 29, 31, -169,122,171, 45,125,183,179, 31, 2,122,117, 20, 39,111,152,237,171,186,180,189,139,170,123,107, 50,194, 72, 77,130,166,233, 78, -110,110,110, 99,149, 74,229, 71,101,203,200,242,197,193,193, 97,164,131,131,195, 72, 43, 43,171, 33,181,105, 30, 6, 40, 67, 22, - 87,153,172,211,144,134,110,170,103,139, 23,241,225,211,166,240, 99, 61, 93, 11,222,183,179,107,240, 55,148,209,159,170,105,103, -103,151,162,215,235,121,157, 78,199,219,216,216,164,188,194,253, 92,205,243,252,106,158,231, 87, 3, 88,253, 10, 52, 43,174,103, - 70, 24,236,218, 52,101, 52, 73,206,144, 75, 36,231,164, 52,157, 33,165,233, 12,185, 68,114,142, 38,201, 47, 0,200,254, 73,101, -244, 39,104, 42,148, 74,229,147,160,160, 32, 94,165, 82,241, 42,149,138, 15, 10, 10,226,149, 74,229, 19, 0, 10, 35, 52,235,171, -243, 58, 69,176,158, 95, 94, 93, 68,203, 23,104,243, 86,139, 70, 71,167,142, 30, 6,238, 72, 16, 81,199, 29,211, 15, 29,219,180, - 25,187,107,215, 46, 0,192,135,253,251,163,119,187,118, 48, 83,152, 66, 34, 41,221, 29,130, 39, 32, 22,137, 49, 96,250,231,134, -124,253,202, 1, 3, 6,124,112,228,200, 17, 5, 0,108,222,188, 25,131, 6, 13,130,181,181, 53,228,114, 57,196, 98, 49, 68, 34, - 81,149,117, 93, 80, 20,229,146,156,156,108, 39,147,201, 42,162,108, 28,199, 85, 89,120,158, 47,143,190,129, 97, 24,120,121,121, - 25,122,186,102,231,231,231,191, 89, 92, 92, 92,161, 81,221,210,176, 97, 67, 0, 56, 99,136,224,183, 75,190, 1,199, 20,131,166, - 1,134, 1, 52, 58, 18, 28, 95,173,185,193,164, 73,147, 42,246,187, 62,244,237, 27, 64, 16, 4,113, 36, 44, 44,236,104, 70, 70, -134, 7,199,177,227,235, 25,233,250,244,209,163, 71, 10, 0,240,246,246,158, 4,224,168, 49,251, 65,211,180,203,253,251,247,237, -164, 82,105,141,145,203, 74, 17, 76,232,116, 58,180,106,213,138, 49,230, 59,236, 1,183, 28,146, 28,223,178,117,235, 9, 11, 7, - 12,144,221,188,121, 83, 70,146, 36, 24,134,193,170, 85,171, 24,158,231, 45,155, 0,230,145, 64, 65, 45, 50,115, 1,140, 46,171, - 12,118, 0, 88, 85,197, 45,240,104,161,214, 75, 3, 30, 23, 13,104,215,190,193, 44, 68, 62, 8,111,231,169, 56, 14, 51, 90, 19, - 7,252,181, 81, 45,115,115,243,254,107,215,174, 85,238,216,177,163, 32, 58, 58, 90,183,101,203, 22,229,196,137, 19,205,116, 58, - 29, 2, 3, 3, 51,125,124,124,196,107,215,174, 85, 30, 59,118,236,173,226,226,226, 77, 70,149, 23,129,111,134,247,239,141, 18, - 61, 9,189,158, 81, 58, 42,205,246, 76, 29,213, 77,196,243, 90,236, 62, 17, 6, 61,195,253,104,100, 36,171,227,251,239,191,239, -185,127,255,126, 58, 42, 42,138,110,220,184, 49, 56,142, 3,203,178,208,235,245, 0, 0,142,227,208,168, 81,163,151, 62, 47, 99, - 1,111, 91,123,235,115, 29,223,125,199,196, 81, 38,133,117,110, 38,198,137,105,179,157,114,205, 94, 0,157, 94,171,200, 46,207, -131,166,105, 36, 38, 38,194,206,206,206,132,227,184, 84, 0,139,114,115,115,183,225,245,165,157,132,166,143,238,254,113,157, 67, -251, 78,157, 40,123, 71, 59,196, 60, 74, 0, 77,176, 61,239,223, 10,235, 54,246,147, 25, 83,181, 12, 51, 24,192,205,215,237,192, - 29, 58, 77, 26, 72,144,212,102,130,231,240,245,134,147,133,203, 86, 6,201, 3,199,143,162,166, 79,159, 14, 87, 87, 87,143,129, - 3, 7,174, 4,240, 73,157, 58,237, 39, 13, 4, 69,110, 6,207, 99,225,250,147,133, 75, 87, 6,201, 63,169,135,206,191,156, 26, -255, 35, 47,109,180,124, 1,207,166,174,118,103,151,205,252, 68,196,255,242, 63, 82,149,157, 81,227,182, 74,165,114,235,219,111, -191,253,225,206,157,127, 68,163, 59,250,249, 97,224, 91, 93, 96,103, 99, 1,185,169,164,180, 58,226, 8,220,139,142, 55,200, 16, -184,186,186, 6, 30, 61,122, 84, 81,217, 76,136,197,226,138,165,178,201, 42, 95,202, 43,224,218,144,201,100, 8, 9, 9, 1, 77, -211,160, 40, 10, 52, 77, 87, 44,149,159, 83, 20, 5,123,123,163,186, 46, 45,183,176,176,104, 94, 88, 88,104,158,151,151, 7, 55, - 55,183, 2, 0,247, 43,189,223, 60, 51, 51,211,220, 24, 65,142, 41,198,244,113,190, 16,105,111, 64, 43,106, 7, 53,221, 25,215, -110, 61, 68,240,153,139, 72, 78, 73, 67,151, 14, 45,241,209,136,247,113,238,220, 57,176,172,209, 45, 29,233, 60,143,149,253,250, - 5,204, 2, 8,162,103,207,158,121,147, 39, 79, 38,163,162,162, 62, 24, 56,112,128,223,163, 71,177,101, 81, 69, 98, 38,207, 99, - 29,128,116, 3,117, 37, 0,112,233,210, 37, 0,144,214,231,183, 39,149, 74,113,253,250,117,148, 55, 19,147, 36, 9,146, 36, 65, - 81, 20, 78,197,218,162, 88, 75, 66,149, 30,129, 41, 1,110,104,216,176, 33, 72,178,238, 46,137,221, 0,217, 53, 96, 32, 33, 18, - 77,119,116,114,242,232,234,233, 41, 15, 9, 9,161, 0,192,221,221,157, 79, 77, 77,205, 59,113,226, 68, 33, 13,108,118,231,249, - 93,181,153, 44, 87, 87,215,206,201,201,201,223,150,159,115,130, 32, 86, 54,104,208,224,171,138,114,227, 56, 44,250,177, 88, 52, -117,234, 52,113,251,110,243, 1, 0,237,251,237, 71,193,227,101,190, 68,206, 92,139,191,250, 42, 81, 80, 80,112,176, 81,163, 70, - 84,118,118,246, 53, 0,207,244,122,253,236, 61,123,246,216,141, 27, 55, 46, 99,239,222,189,203, 1, 56,173, 88,177,162, 91,113, -113,241, 33, 99,116,187, 52,199,187,173,155,251,117,112,115,117,197,197,107, 55, 33,150,136, 44, 39,141, 14,128, 66, 65, 99,245, -142,211,220,179,164,156,201, 87,238, 99,151, 17, 38,171,221,251,239,191,239,177,127,255,126, 9, 0,220,191,127, 31,105,105,105, - 80, 42,149, 48, 49, 49,129, 72, 36, 2, 69, 81, 16,137, 68,175,196,100, 89,184,218,132, 30, 63,126,194,196,218,218, 18, 27, 62, -159,138,143, 50,210, 97,105,166,128,190,168,216,227, 53,171, 40,188,253,253,253,101, 44,203,162,184,184, 24, 23, 46, 92,176, 48, - 49, 49,177,112,113,113, 89, 8, 35, 70, 79,201,100,178,244,146,146, 18,187,178,199, 25, 37, 37, 37,246, 0, 10,164, 82,105,249, -117,186,168,108,109,104,115,226, 51,188,216, 76,152, 64, 16, 68,229,215,234, 75,219,118,109,155,135, 28, 59,178, 79,145, 95,152, - 6, 75,171, 12,144,200,199,182,109, 27, 97, 98, 98,142,133, 11,231,210,241, 61,223,114,238,243,238,224,144, 7, 15, 99,122,190, -118,102,139, 39,182,245,236,247,161,181,137,220,172,172, 46,209, 99,231,246,169, 32, 73, 18, 95,125,245, 21,154, 54,109, 58,225, -193,131, 7,243, 1,228,212, 46,131,109,205,222, 28,106, 45,145,149, 22, 49,199,234,177,229,192, 23,165, 58,115, 38, 98,120,191, -134, 19,190,124,255,201,175, 77, 61, 81, 88,118, 99,174, 22,145, 72, 32,218,163,194, 48, 4, 7, 7,119, 13, 8, 8,184, 88,211, -243,127, 1,142,248, 35,127, 86, 21,243, 69, 7, 7, 7,243, 1, 1, 1, 68,165,131,171,242,188, 54, 90, 0,182, 86, 22,242,144, -205,139,166, 42,232, 27,167, 41,117, 66, 44, 82, 74,170, 84,228, 85,134,104,202,229,242, 15,119,238,220, 89, 37,164,228,102,111, - 7,177, 88, 4,145,152,128,165,127,105,246,250,188,203,193, 32,136, 26, 77, 86, 21,205,226,226,226,146,187,119,239, 42,118,236, -216, 1, 59, 59, 59,120,120,120, 64, 46,151, 67, 38,147, 85, 49, 87,149, 13, 87, 53, 70,171,138,102,249,251, 52, 77,131, 36, 73, -156, 59,119, 14, 12,195,224,253,247,223,127,193,100,209, 52, 93,147,113,171,105,120,234, 25, 0,247,121,158,127,179,172, 2,190, - 15,160,107,165,247,251, 40,149,202,217, 0,150, 27,170, 73, 81, 60,168,146,107,224, 92,130, 64, 39, 78,133, 86,212, 2,231,175, -132, 97,231,214,181, 0, 0,143,198,109, 49,100, 96, 64, 69, 52,206,192,253,172,192,217,217,249, 64,102,102,214, 59,111,189,245, - 22,114,115,115,245,139, 22, 45, 66,243,230,205,225,237,237,109, 80, 25,213,112,231,156,126,255,254,125, 87,181, 90, 13,158,231, - 13, 49,103, 47,104, 18, 4,129, 61,123,246,160,164,164,228,133,141,173,186, 46,197, 23,131,220, 49,102,202, 46,172,140, 62,132, - 77,155, 54,213,122,236,114,160,121,137, 69,163,117, 18,138,105,190,124,238,167,210,143, 62,250,136, 26, 51,102, 12, 18, 18, 18, - 48,110,220,184,146,115,231,206,105,211, 82, 83, 79, 72, 56,110,131,174,170, 49,174, 81, 83, 42,149,238, 62,115,230, 12, 14, 29, - 42,245, 37, 49, 49, 49,240,242,242, 50,173, 98,146,115, 14,163,240,217, 6,132,158,138, 66,251,126,251, 17,122,106, 4,216,188, -211,162, 54, 94,200, 55,230,124,214,131,234, 52, 15,101,103,103, 87,152,168,189,123,247,154,236,221,187,119, 0,128,147, 0, 14, - 1, 64, 78, 78,206,119, 70,106, 2, 4,198, 12, 29, 52, 0,180,216, 12, 81,177, 73,232,218,177, 21,236,237,236,112,255, 97, 28, -158, 37,231,164, 19, 4, 70,247,233, 36, 89,174, 86,107,231, 95,190,135, 31,234,208, 36, 92, 92, 92,188, 15, 31, 62, 44,174, 20, -129,174,248,143, 83, 20, 85,241,188,220,120,215,231,247, 89,110,178,204, 92, 20,161,223,108,236,108, 26, 26,190, 23, 94,238,239, -194,234,221, 0,252,112,246, 44, 30, 61,136, 44,209,170,152, 30,127, 67, 25,253, 89,154,222,131, 6, 13,186,182,111,223, 62,203, -196,196, 68, 92,186,116, 9, 30, 30, 30, 80,169, 84,134,220,240, 86,209, 44, 41, 41,177, 43,255, 12, 65, 16,118,229,129,119,173, - 86, 91, 94, 24,229,127, 68,203, 74,219, 89,214,162,233, 86,105,187,114,115,229,254, 10,142, 93, 34, 19,139, 15, 31, 63,118, 64, - 17, 25,117, 9, 45, 91,116,128,194,162, 9, 56, 54, 13,217, 57, 69,200,141, 77,193,146, 37, 43,177,112,209, 60,156,252,233,136, -194,199,183,197, 81, 45,195, 52, 2, 80,242,218,148, 59,193, 79, 8, 57,181,119, 51,193,115, 80,167, 71, 73, 69,197, 79,228, 31, -142, 24, 76, 13, 27, 54, 12, 39, 79,158,196,131, 7, 15, 54,215, 98,178, 66, 42, 69,230, 39, 68, 92, 58,180, 25, 60, 15,117, 70, -148, 84,172,126, 34, 31,245,193, 16,234,163,225,189,113,227,247,117,232,221,242, 73,132,147, 29, 6,230,150, 89,108,154, 66,182, - 84,134,171,124, 40,110, 84, 50, 91, 23, 0, 16,149, 12,214, 5,252,209, 7,243,223, 64,223, 50, 99, 53,225,249, 27, 19,186, 62, - 6, 11, 0,188, 0, 5, 33, 17,135,238, 92,248,169,147, 60,225, 1,173,137,184,142, 20, 13,199,111,121,202,112,173, 0,147, 59, -128,250,249,207,168, 84,170,226,184,184, 56,147,209, 3, 7,162,147,159, 31, 28,109,108,208,200,197, 5, 38, 82, 9, 36, 98, 81, -149, 91, 86,131,219, 16, 8,130,247,241,241, 65,191,126,253, 32, 18,137, 32,151,203,161, 80, 40, 32,145, 72,170,141,102, 25,122, -151,203,243, 60, 40,138, 66, 68, 68, 4,158, 61,123, 6, 75, 75, 75, 92,189,122, 21, 61,122,244,120, 33,170, 85,217,156, 25, 19, -162,175,166,226, 47, 55, 98,103,140,209, 98, 89, 2, 69,124, 11,200,158, 78,134,138,104, 5,141,134,129, 70,163,193, 15, 87,116, -184, 25, 87, 12,157, 78, 11,141, 70, 83,219,119,214, 4,233,228,228,244, 97,163, 70,141, 38,141, 24, 49, 66, 47,145, 72, 80, 92, - 92, 12,149, 74,133, 7, 15, 30,232,223,121,231,221,188,126,253, 2, 44, 78,159, 62,205,151, 53, 29,166, 27,161,157,237,236,236, -236, 90,214, 60,155, 93,159, 95, 53, 65, 16, 21, 38,230,121, 70,127, 23, 9,154, 42, 45,147,205,155, 55,131,101, 89,240, 60, 95, - 99, 33,149, 16,196,111,139,150,174,177, 88, 17,244, 35, 44,172,237,113,241,226, 69,246,215, 95,127, 45, 36,128,152, 71, 15, 30, -124,247, 30,240,243, 97, 64,103,204,254,229,230,230,154,120,120,120,192,197,197, 5, 28,199, 65,175,215, 87, 68, 95,178,179,179, -161, 86,171, 97,109,154,135, 55,108, 92,192, 20, 94, 64,106,196,215,112, 84, 68, 97,215, 25,173,190,181, 55,238,253, 3, 46, 28, -255, 43, 91, 94,242,174, 25,206,118, 14,174, 32,121, 61, 82, 50,178, 49,160,111,111, 80, 98, 5,226, 19,179,208,162,137,167,227, - 7,239,117,118,164, 8, 6, 51,151,239,159, 4,112, 63,212, 37, 87, 84, 84,196, 70, 69, 69,225,254,253, 82,191,107,110,110, 14, - 83, 83,211, 42,255,113,146, 36, 95, 42,162, 85,110,178,150,110,238, 97, 74,138,138, 81,192,134, 96,199,158, 48,180,240, 9,192, -150,208, 91, 37,108,122, 78,207,213, 37, 37, 49, 7,254,197,193, 12, 7, 7,135,137, 28,199, 45,228,121, 62,175, 75,151, 46,246, -251,247,239,183, 74, 78, 78, 70, 88, 88, 24,190,250,234,171, 76,150,101, 25,158,231, 9,158,231,191,126, 5, 95,199, 85, 50, 88, -175, 18,145, 92,134, 41,182,230, 68,127,154, 52,247, 96, 10,138,226,179,180,252, 9, 21,195,173, 7,160,175,245,226, 70,146, 31, - 31, 57,184,217,201, 86,201,161,155,242, 45,164,166,235,176,244,243, 81,200,206, 46,196, 15,219,151, 1,144, 64,199, 80,120,179, -219, 96,216,217, 57, 99,194,248, 9, 14,155,183,110,249,148,225,184,213,120, 77, 72,187,182,233, 39, 0, 33, 74,165,242,193,167, - 19, 38, 40, 61, 60, 70, 66, 38,147,225,192,129, 3,216,191, 97, 3, 27, 4, 12,145, 2,231, 3,129,159,106,213, 9,253, 67,103, -106, 96,160,210,215, 55, 16, 82,169, 20,191,255,250, 63,148,164,237, 41,236,219, 9, 58, 85, 9,250, 54,232,199, 91, 63, 61, 69, -228,136, 68,136, 5, 0,145, 12,169, 0,158,111, 6,251,183, 25,172,114, 78,227,143,126, 89, 19,170, 68,180,234,125,237, 20, 73, -194,183, 79, 27,238,110, 15, 13,161,189,114, 10,201, 26,142, 93,241, 72, 71,221,201,231,191,120, 88,141,201, 42,251, 97,115,110, -110,110,120,171, 77, 27, 12,244,247, 7, 77,211,144, 73,196, 48,147,153,128,103, 75, 35, 89,229, 77,135,181,212,137,168, 46,250, -100, 99, 99, 3,177, 88, 92, 97,176,140,136,102, 85,171,201,113, 28,104,154,198,253,251,247,209,165, 75, 23,184,186,186,226,208, -161, 67,232,211,167,207, 11, 77,137,198,154,172,114,163,245, 92, 51, 94, 31, 0,229,145, 44,163,140, 86,137,150, 64,150,182, 5, - 8,194, 15, 12, 3,176, 60,160, 41, 41, 1,207, 3, 60, 15,232,117, 90,148,148,148, 84,124,167, 33, 77,178, 14, 14, 14,110, 38, - 38, 38,139,103,205,154,233,219,162, 69, 75,100,102,102,130,227, 56,152,154,154, 66,165, 82,193,220,220, 28,157, 58,117,138, 95, -188,120,113, 42,207, 99,130,145, 38,235,165, 41, 63,231,103,207,158,173,210,108, 88,190, 20,167, 38, 97,204,103,123, 33,161, 75, -155,150,202,251,240,212,118,221,237,254,102,103, 92,187, 19,195,124, 60,115,157, 70,148, 29,182,220,129,227,118, 38,189,196,113, -241, 60,143,172,172, 44,164,167,167,163,255,128, 1,216,191,111, 31,158, 62,125,138, 38, 77,154,160,123,247,238,176,179,179,195, -211,167, 79,113,243,178, 6,154,220, 28,228,104,195, 32, 55,107,143,227, 23,227, 52, 95,109,214,197,253,141, 23,140,254, 0, 70, -153,155,155, 55, 84,169, 84,169, 12,195, 28, 6,112, 24,192, 16,154,166,135,200,229,114,199,130,130,130, 39, 40, 29, 77,116,162, - 46, 49, 19,153,204, 70, 42, 51, 7,199,104, 64,211, 52, 92, 93, 61,192,179, 90,228, 22,168, 49,122, 88, 63,220,185,255, 16,191, -158,191,193,232,245,220,247,134,156, 86,138,162,120,111,111,111,100,100,100, 64, 36, 18,193,196,196, 4, 10,133, 2,115,230,204, -193,134, 13, 27, 42, 76, 86,125,141,214, 88,192,219,220, 77,113,227,219,141,165, 38, 43, 45, 37, 21,233, 73, 34, 40,109,236,241, -253,134,160,226,220,167,105,237,127, 4, 98,254,237,149, 44,199,113, 95, 39, 39, 39,219,209, 52,237,192, 48, 12, 18, 19, 19,113, -251,246,109, 76,158, 60, 57, 61, 59, 59,187, 27,234,121,140, 50,153, 44,163, 60,146, 85,214,116, 88, 83,115, 98, 94,165, 72, 86, - 94, 45,146, 53, 53, 19,122,122,184,152,157,219,190,118,186, 91,219,246,157, 72, 57,109,158, 91, 20,155,214,229,202,165,139,157, - 38,175,253,225,211,103,185, 69,189, 1, 60,174, 73, 84, 42, 18,189,211,161,115,103, 26,124, 58,104, 73, 23,172, 92, 49, 12,153, - 89, 5,200,205, 41,132, 88,108, 10,173,158, 2,203, 17,232,212,197, 31,255,219,117, 16, 77,199,143,163, 36, 34, 81, 47, 70,171, -125,109,140, 86, 25,203,214,175, 95,239,230,227,227,131,157, 59,119,226,252,238,221,248, 40, 63, 31, 23, 73,146,210,139, 68,182, - 63,235,245,219, 80,135,209,170,172,211,180,105, 83,252,248,227,143,216,179,103, 79,194,135, 61, 50,142, 78,255, 16,118, 58, 29, -222, 14,139,134,117,131,126, 64, 88, 52,172, 91,251,160, 17, 67, 35,150, 32,170,166,131, 10, 14, 14,238, 90,121,253, 47, 35, 21, - 53, 52,177,211, 0,186, 5, 7, 7,243,149,215,117, 94, 56,149, 94,129,203,122, 55,116,247,123,195,141,208, 31, 90,135,196, 98, - 70, 59, 63, 90, 39,121, 84,196, 79,127, 8, 4,213,114, 7,193, 83, 20, 5, 51, 19, 19, 40, 45, 45, 75,195,252, 36, 9,112, 0, -167, 7, 8,182,212, 0,240, 28, 1,158, 53,234,130, 1,137, 68, 82,109,199,119, 99,251,102, 85,214, 44, 44, 44, 68,124,124, 60, - 38, 76,152, 0,185, 92, 94,234,220,211,210,224,238,238, 14,154,166,145,156,156,140,223,127,255, 29, 13, 27, 54,132, 84, 42, 53, -202,109, 85,138, 46, 53, 71,233, 40,195,230,169,169,169,230,142,142,142, 48, 58,162,197,241, 80,105, 8,104,181, 44, 30, 61,122, -132,148,148, 20,196, 63,137, 69,219,226, 2,240,160,192,243,188, 81, 17, 45,103,103,103, 63, 79, 79,207, 45,203,151, 47, 23,187, -184,184,128,231,121, 88, 89, 89, 66,165, 82, 33, 43, 43, 27, 77,154, 52,129,171,171, 43,150, 47, 95, 14, 0,251,255,106,147,245, -220,111,170,194,104, 85, 54, 92,159,189,231,134,156, 28, 5, 40,138,172, 48,206,117,244,209, 18, 3, 64,183,222,131,232,115,191, -254,108,202, 0,139,211, 40,106, 49, 93,119, 57,234, 89,142,147,215,244,126, 98, 98, 34, 68, 34, 17,142, 28, 62,140,156,244,116, -180,104,209, 2,237,218,181, 67,108,108, 44,238,220,185, 3, 27, 27, 27, 40, 93, 58,226,226, 19, 29, 34, 83,212,176,176,176, 64, - 92, 18,249,119,166, 12, 24,223,179,103,207,175,190,251,238, 59, 59, 7, 7, 7, 81,102,102,166,207,198,141, 27, 91,108,220,184, -113,234,167,159,126,106,255,233,167,159, 90, 41,149, 74, 58, 45, 45,205,251,243,207, 63,111, 29, 18, 18,210, 16,192,154,218, 4, - 77, 77,205,172, 41,177, 41, 8,130,134,165,133, 21,104,137, 41, 56,134, 6,203, 1,230, 22, 74, 92,187,115, 4, 87,195, 11, 39, -102,100,227,176, 65,241,177,178,114,183,177,177,121, 33, 82, 61,121,242,100,108,223,190,189,162, 25,177,190, 38,107,233,198, 30, - 10,162,204,100,165, 37,210, 32, 52, 13,113,234,167,235,121,185, 79,211,186,188, 14, 38,171,252, 26,199,243, 60,158, 60,121, 2, -149, 74,133,203,151, 47,227,235,175,191,206,124,222,100,217,217,217,141, 55, 55, 55, 95, 84, 84, 84,180, 50, 45, 45,109, 93,157, - 55,126,165, 38,170,252,113,249,186,218,230, 68, 3,119,213,189,186, 72,150,171,163,236,204,157,203,123,221, 45,248,123, 4,158, - 77, 0, 30, 21, 60, 48, 11,181,123,243,221,182,125,201, 86,155,190,105,208,110,226,156, 51,137, 5, 37, 62, 53, 69,182, 56,150, -109,101,170, 48, 3,144,129,176,219, 23, 42, 76, 86,118, 78, 62, 52, 58, 10, 26, 45,129, 18, 29,137,183,122,190,141, 13, 91,246, - 32, 57, 35, 7, 44,203, 54,123,205, 76,150,181,159,159, 95,224,144, 33, 67,176,120,241, 98,132,124,247,157,246, 19,130, 40,160, - 1,254, 52,203,130,227,121,130, 52,172, 19,123, 21,157,213,171, 87,255, 4,200,224,209, 35, 0, 0, 32, 0, 73, 68, 65, 84, 96, -248,242,201,232,152, 91,132,209, 78,253,120,235, 6,253, 74, 55,124,127, 22, 15, 0,214,153, 33, 85,171,204,128,128, 0,162,188, -101,205,216, 22,182,127, 58,116, 64, 64,192,197,224,224, 96, 84, 94,215,246, 1, 51,123,159,119,191,156, 49,105, 69,219, 62,254, - 68,234,140, 94,200, 41, 40, 97,230, 70,234, 36, 73,234,218, 77, 86,101,190,220,184, 17,119, 98, 74,255,199, 46,118,118,152,249, -193, 7,224, 25,224,234,131, 72, 28, 12, 9,193,176,158, 61, 97, 42,147, 25, 28,217,224, 56,174,218, 40, 86,229,104,150,177, 81, -167,188,188, 60, 28, 62,124, 24,237,218,181,131, 92, 46, 7, 77,211,104,222,188, 57, 30, 62,124, 8, 79, 79, 79, 16, 4,129,227, -199,143, 99,224,192,129,120,252,248, 49, 58,118,236,168,120,246,236,153,209, 70, 43, 50, 50,210,156,231,249, 55,203,163, 31,245, - 69,163,209, 32, 42, 42, 10,253,250,245,131,149,149, 21,156,157,247, 35,228,204, 94,200,253, 62, 2, 65,192, 40,163,197,178,236, -216,190,125,251,138, 9,130,128, 90,173,130, 76,102, 2, 83, 83, 5,204,204,204,225,237,237,131,148,148, 20,244,233,211, 71, 27, - 23, 23,183, 41, 53, 53,245,144,177,251,234,235,235,107,250,244,233,211,143, 26, 52,104, 32, 1, 0, 19, 19,147, 38,158,158,158, - 95, 60,126,252,184,208,216,168, 86,185,193, 34, 8, 2, 20, 69, 85, 24, 45,154, 36,225,232, 96, 87,241,188,172,127, 26, 81,139, - 86, 65,114,182, 70, 10, 0,110,110,110,216,176,245, 36,217,183,111, 95, 76,157, 58, 21,122,189, 30,155, 54,149, 14,178, 27, 49, - 98, 4,116, 58, 29,142, 30, 45, 29, 36, 73,211,116,173, 97,147,219,183,111, 35, 44, 44, 12,122,189, 30,249,249,249,248,229,151, - 95,112,241,210, 37, 28, 56,254, 27,158, 62,137, 69,115, 31,119,140, 27, 55, 22, 34,145, 8,187,118,237, 66,151, 46, 93,254,214, - 11,130, 72, 36,250,112,251,246,237,142, 59,119,238,204, 59,126,252,120,113,135, 14, 29,164, 65, 65, 65,118, 27, 54,108, 80,106, -181, 90, 76,155, 54, 45,227,198,141, 27,154, 1, 3, 6,152,110,219,182,205,241,141, 55,222,232,197, 48, 76,117, 70,203, 20,192, - 48, 0, 35,115, 11,181,116, 94,161, 26, 28,163,197,147,167,241,200, 47,210,130, 99,117, 72, 72, 74, 65, 81, 9,139,236,156, 66, - 52,111,213,123,253,133, 11, 23,230,233,116,186,185, 0,130,235,218,207, 7, 15, 30,224,198,141, 27,120,250,244, 41,158, 60,121, - 82,213, 41,142, 31,143, 61,123,246, 24, 29,209,170,222,100, 81, 32, 52,158, 8, 62, 30,154,151, 17,155,250,218,152,172,178,107, -208, 66, 71, 71,199,133,142,142,142,178,179,103,207, 90, 52,104,208, 0, 12,195,104,159,143,100,117,235,214,109,254,246,237,219, - 29, 61, 61, 61, 39, 3, 88,247, 79,216,119,146,196,248,149,155, 3,109,205, 36, 9, 41,120,180,166, 44,151, 32, 5,168, 10,128, - 11,251, 64,119, 94, 16, 63,121,192, 44,171,217, 59, 23,143,231,192,213, 56, 66, 54,238,113, 34, 54,111,222,128,233,211, 70,227, -127, 63,172, 4,199,209,208,232, 41,184,121,116,128, 70,199,129, 32,105,180,104,213, 6,231, 47, 92,134,136, 4, 14,239,220,252, -154,249, 44,228, 68, 68, 68,108, 58,126,252,248,148,169, 83,167,130,227, 56,201,162,205,155,213,153,153,153,203, 96, 92,254,171, -231,117, 6,110,222,188, 57,102,246,134,204,159,166,127, 8,234,233, 41, 34, 39, 44, 26,214,239,207,226,113,100, 5,129,214, 62, -200,145, 87, 95,197, 95,122,110,253,122, 24,173,114, 39, 89,121, 93, 29,173,188, 26,126, 99, 97,109, 53,150, 52,115,182,157, 57, -245, 19,250,113, 90, 9,142, 54,248,160,232,247,221,223,155,166, 49,210,245,113, 40, 9, 50,230,139, 15,254,254,123,197,227, 85, -251,247, 87,251, 94,234,251,239, 27,124,103, 86, 83, 20,203,216, 72, 22, 0,200,229,114,203, 94,189,122,161, 71,143, 30, 24, 60, -120,112, 69,159,172,150, 45, 91,226,192,129, 3, 24, 52,104, 16,238,222,189, 11, 71, 71, 71, 52,110,220, 24,141, 27, 55,198,207, - 63,255,108,236, 69, 14, 44,203,194,207,207,175,124,212, 97,243,164,164, 36,243,250, 22,164, 70,163, 65,118,118, 54,172,173,173, - 33,145, 72,208,190,125, 59, 76,249,172, 61,108, 29,127,132,159,175, 15,138,139,139, 43,134,191, 27, 80,217,250, 53,106,212, 8, -153,153,153,200,204,204,132, 82,169,132,147,147, 19, 28, 28, 28,176,102,205, 26,126,221,186,117,191,234,116,186, 77, 89, 89, 89, - 70, 71,178, 28, 28, 28,252, 9,130,152,175, 86,171, 37,149,238,112, 37, 74,165,242,132, 90,173, 94,150,154,154,106,112, 71, 80, -130, 32,160,211,233, 64, 16, 4, 78, 63,113, 66,177,150, 64, 65, 82, 24,166,190,231, 94,197,120,137, 68,162, 58,155, 75,121,158, - 47, 30, 62,124,184,157,171,171, 11, 18,227, 30,224,200, 17, 30,223,125,247, 93,249,168, 72,196,148,221, 24,148, 63,239,222,189, - 59, 60, 60, 60,192, 27,145, 43,131,227, 56,220,191,127, 31,251, 79, 92,132,163,187, 47, 18, 30, 69,225,206,207,167,208, 64,105, -141,166,173,218, 64,175,215,191, 84,234,141, 87,129, 94,175,223,225,229,229,197,107,181,218,139, 0, 54,132,135,135,143, 78, 77, - 77,157,118,242,228, 73,167, 33, 67,134,164,156, 58,117, 42, 8,192,206,240,240,240,192, 37, 75,150,244, 96, 24,166,218,209,130, - 20, 69,253,239,243,207, 63,239, 54,100,200, 16, 66, 76,234,181,103,207,236,162, 25, 70, 79,124, 57,119, 7,123,225,202, 69,146, - 97,244,196,224,225,159,115, 63,255, 30, 78, 78,252,108, 21,219,178, 67, 95, 68, 68, 68, 56, 4, 4, 4, 44,209,235,245,181, 26, -173,242, 72, 85, 77, 17, 74,138,162, 48,122,244,104, 28, 56, 96,120, 15,170,113,128,167,185,187,226,198,210,141, 61, 21, 4, 93, - 84,201,100,189,129,224,227,161,121,233,143, 82, 94, 43,147, 5, 0,217,217,217, 91, 1,108,229, 56, 46,221,212,212, 20,133,133, -133,213,253,254,100,225,225,225, 50,137, 68,130,222,189,123, 91,135,132,132,196,144, 36,185, 46, 37, 37,165, 70,199, 81, 93, 51, - 97,117,205,137,120,137, 81,135, 86, 74, 4,180,247,111,101, 22,109,177,216, 76, 70,151,220,109, 16, 35, 51, 39, 0,228,107,236, -159, 92,123, 54,172,128,200,144,182,108,211,189, 53,204,105,211,128, 60,166,176, 90,163, 69, 82,212,157,252,220,188,119, 10, 10, -181,184,114, 53, 2,195,135, 53,130, 70, 71,128,227, 72, 20, 21,107, 0, 74, 4, 18,192,136, 15, 70,129, 39,104,228,164,167,128, -162,168,112, 48, 12, 94, 51,230, 4, 6, 6,190, 51,119,238,220,134, 51,103,206,196,204,153, 51,221,183,111,223,190,117,233,210, -165, 51, 51, 51, 51,155,161,142,228,227,181,232, 52, 56,117, 96,193,140, 19,151,183,228,247,237,164,126,212,218,167, 52,242,213, -218, 7, 57, 34, 17, 98,105, 10,217, 60, 95,181,155, 81, 64, 64, 64,215,202,235,127, 25,207,119,130,175,120,110, 80, 31,173, 70, - 13,157,223,110,213,210,239,179,121,115,231,153, 61,188,118, 1,179,191,217,192,123,181,233, 85,184,245,242, 29,109,145,169,199, - 59, 69, 89,177, 87, 13,245, 23, 0,240,246, 91,131,208,188, 73,187, 23,222,236,210,189, 52, 89,251,149,243,183,145,158,153,108, -112,101, 91,102, 14,170,237,147,101,200,144,254,231, 81,171,213,121, 17, 17, 17,118, 73, 73, 73, 85, 58,190,123,120,120,128, 32, - 8,132,134,134,226,198,141, 27, 24, 62,124, 56,104,154,134, 72, 36,194,197,139, 23,141,138,198, 84,138, 46,149,143, 58,236,227, -226,226, 82,211,104,195, 58,181,212,106, 53,242,243,243,113,230,204, 25, 52,106,212, 8, 75,151, 46,133,147,163, 61,230,205,155, - 1,142,227, 80, 80, 80, 0,150,101, 13,141,104,113,229,209, 34,142,227,144,153,153,137,134, 13, 27, 98,227,198,141, 8, 10, 10, - 90,146,154,154,122,210,216,125,116,117,117,181,100, 89,246,203,190,125,251,246, 26, 48, 96, 0,250,244,169,154,143,117,223,190, -125,102, 71,143, 30, 93,246,253,247,223,191,173,211,233,150,103,100,100,100, 26,162,251,227,143,165,233,151,228, 29, 22, 98,246, -144, 6, 24, 57,105, 23,214,172, 57, 6,169, 84, 90,165,226, 93,188,120,113,173, 38,134,227,121, 47,113,214,181,148, 25,179, 86, -219, 45, 91, 22,130,144,144, 12,144, 36, 9, 71, 71, 71,144, 36,137,248,248,120,144, 36, 9,119,119,119,144, 36,137,228,228,228, -242, 62,129,185,168,102,212, 99,245,119,225, 36, 74, 74, 74,144,152,240, 20, 73,113, 49, 80, 20,164, 65,105, 46, 71,238,131,251, -104, 62,110,124, 69,254,167,191,153, 61, 90,173,118, 79,165,231,171, 79,157, 58,165, 37, 8, 98, 48, 74,251,105,148, 71, 52,150, - 48, 12,179,164, 38,145, 14, 29, 58,180,156, 59,119,174,168, 60,221,134,147,219,183,140, 78,167,227, 0,192,167,249,155, 85,220, -126,108,108, 44,214,172, 89,131,226,226, 98,136,197, 98,177, 33,231,129,227,184,138, 17,134,213,153, 48, 99, 76, 22, 0,216,184, -187,172, 15, 13,187,200,222,139,219,162, 14,143,254,197, 36, 53,129, 4,169,125,125, 77,214,243,145, 45, 23, 23,151,133, 28,199, -241, 60,207, 47,168,244,150,212,205,205,237,242,217,179,103,109, 24,134,193,247,223,127,111,153,150,150,102,249,230,155,111,206, - 6, 80,163,209,170,174,153,176,186,230, 68, 84, 26,117, 40,149, 74,173,181,218, 26,131, 39, 47,140, 58,100, 89,120,155,155, 89, - 34, 23, 73,208,216,234, 91,230,217, 48, 57,231, 82,199,223,117,122,214,170,137, 41,171,111, 72, 22,104,225, 44,183, 4,199,243, - 53, 14,141,214,232,245,191,220, 13,187,211,219,205,181, 17,117, 50,248, 18,250, 15, 28, 2,141,134, 68,137,158, 0, 65,137, 64, - 80, 98, 52,107,222, 10,141,155, 54, 7, 15,224,246,205,107,140, 86,175, 63,247, 58,149,189, 99,231, 41,195, 9, 2,235,192,115, -124, 53,121,180, 26, 14, 28, 56,112, 25,128,207,234,210,177,235, 48,101, 56, 73,150,234, 84,206,163,245,249,148, 64, 60,184, 41, -178,184, 20,182, 66,220,167, 3, 78,103,134, 16,144,203,254, 24,117, 40, 34, 95, 42, 53,199,191,197,112,213,109,180, 92, 93, 93, - 45,205,165,178, 31, 63, 29, 55,214,236,217,189,235, 72,139, 12,197,213, 75, 49,185, 7,143, 30,203, 41,206,206, 24,103,132,201, -170,104,230,179,113,104, 0, 15,223, 23,141,150, 76,161, 4, 0,120,248,182, 3,101,106, 92, 26,161,234,162, 89,245, 49, 89,149, - 47,216,213,229,208,154, 56,113, 34,182,111,223,142,206,157, 59,195,203,203,171,226, 98,111,108,212,172,154,232,146,209,163, 13, - 43, 83, 88, 88, 8,119,119,119,108,219,182, 13,225,225,225, 48, 51, 51,195,240,225,195, 81, 88, 88, 88, 97,176, 12,237, 12,207, -243,124,236,217,179,103,219, 14, 29, 58,148, 23,137, 68, 68, 94, 94, 30, 44, 45, 45,177,113,227,198,226,212,212,212,211,245, 48, - 89, 67,196, 98,241,140, 97,195,134, 81, 62, 62, 62, 72, 79, 79,135,185,185,185,158, 32, 8, 17, 0, 88, 90, 90,234, 77, 76, 76, - 16, 24, 24,136, 22, 45, 90,248,207,156, 57,179, 51, 77,211, 27, 83, 82, 82,118,213,246, 91, 34, 8,162,162, 66, 29,183, 46, 10, - 90,109,105, 5,189,105,211, 38,148,245,117,251,163,137, 32, 46, 14, 48, 96, 36,139, 66,161,128,151,151, 87,181,101,239,239,239, -143,219,183,111,151, 54, 77,210, 52,236,236,236,112,245,234, 85,131, 70, 82,149, 39,130,140,136,136,128,175,135, 45,194, 67,206, -194, 86, 46, 66, 11, 39, 7,184,248,119, 69, 76, 76,204,223, 25,205, 34, 80,218, 15,163,103,217,111,112, 7,128,137,149,158,111, - 4,176,222, 24, 65,134, 97,120,146, 36,137,196,196, 68,157, 92, 46, 39,172,173,173,105,169, 84, 10,141, 70, 83, 97,184, 98, 99, - 99, 17, 28, 28,140,164,164, 36, 88, 91, 91,147, 22, 22, 22,208,233,116,185,134,232,123,123,123,195,193,193,161, 74,199,247,113, -227,198,213,203,100,141, 6,252,182,127,187,188,129,148,164, 44,124,109,223,198,147,168,248, 18, 82, 11,217,127,193,100, 1, 64, - 94, 94,222, 86, 0, 91,203,159,219,218,218,142,161, 40,106,158, 70,163,177,184,120,241,162,165, 82,169, 36,118,237,218,165, 95, -176, 96, 65, 30, 69, 81,185, 4, 65,172,253,251,205, 33, 34,179,242,227,220, 69, 86, 78,220,189, 18,254,218,180,196,217,141,115, - 69,141,148, 68, 83, 63, 12,204,120,120,101, 12, 19,215, 41, 61, 53,141,228,193, 69,214,114, 13,222, 49,123,238,226, 47, 99,162, -238,184,201,204,101,152, 24, 56, 23,167,127, 61, 15,130, 20,225,242,181, 80,104,117, 44,178,114,242, 49,108,196,135,112,113,180, - 69,228,141, 51,153, 12,199,109,124,189, 76, 54,183,161,119,255, 49, 86, 82, 19,121,217, 57, 97,177,231,135, 25, 32,201,117,248, -234,171,175,224,231,231, 55, 41, 34, 34,226,107,212,145, 71,139, 32,184, 13,205,186,142,176, 18, 75, 75,117,120,142,197,182,195, -179,203,242,104, 77,199,198,173, 71,155, 53,245,120,178,168,182, 60, 90,175,145,201,170,188,174,221,104,185,187,187, 75, 77, 69, -152, 32,162,232,153,159,126, 48, 64,153, 17,247, 0, 73, 15,239,148, 54, 47,232,212,186,180, 71, 15, 13, 73,133,222, 19, 85,243, -119,240,181, 53, 93,149,148, 24,116, 71, 95, 69,179,188,194,125, 62,154,101,164,201,122, 65,179,178,217,170,156, 55,203,213,213, - 21,203,150, 45, 51, 36,143,214,243,199, 94, 78, 31,148,118,128,175,220, 25,190,143,129, 38,171, 90, 77,165, 82,137,236,236,210, - 12, 9,221,186,117, 67,183,110,127,140,103,208,233,116, 21, 81, 44, 51, 51,179,234, 34, 90, 47,104,154,152,152,204, 62,118,236, -216,216,107,215,174, 13,253,226,139, 47, 68, 61,122,244, 40, 55,115, 42, 24, 54,183, 91, 21, 77,150,101, 3,207,156, 57, 67,113, - 28,135,109,219,182,225,246,237,219,188, 92, 46,159, 47,151,203, 55,152,152,152,176,106,181,122,226,248,241,227, 63, 92,180,104, - 17,233,239,239,143,235,215,175,147, 13, 27, 54, 28, 5, 84, 73, 98, 89,237,177,135,134,134,130, 36, 73, 48, 57, 9,152, 52,251, - 32, 76, 77,104, 68, 69, 69, 33, 39, 39,231,133, 36,166,134,156,207,202,145,146,242,197,223,223,191,162, 25,178,125,251,246,160, - 40, 10,119,239,222,173,169, 25,182,178, 38,111, 99, 99, 83,241,251, 16,139,197, 56,127,254, 60,190,249,230, 27,184, 89, 91, 34, -247, 97, 56, 28,186,189,133, 94, 99,199, 99,248,240,225,160, 40, 10,214,214,214, 21,145, 95, 3,126, 75, 47, 67,101,205,177,190, -190,190,163, 34, 35, 35, 93,154, 53,107,230, 24, 17, 17,209,221,207,207,207, 61, 60, 60,188,252,185, 20,134,245,205,169,208,188, -117,235,214,145, 13, 27, 54, 4,142, 30, 61, 90,204,113, 28,251,236,217, 51, 61, 0,194,193,193,129,186,117,235, 22,119,242,228, - 73,168,213,106,184,184,184,144,206,206,206,196,185,115,231,184,135, 15, 31,134,242, 60, 63,215,144, 99,103, 89,182, 74, 26,135, -242,199,251,246,237, 51,250,255,222,160,177,247,210, 30,111,250,184,102,165,220, 69,106,114, 28,216,124,165, 46,248,248, 41,141, -145, 38,235,207, 46,163,191, 82,115,241,163, 71,143,156, 53, 26, 13, 36, 18, 9, 54,109,218,164, 91,182,108, 89,100, 86, 86, 86, - 23, 84, 63,162,188,138,102, 61, 71, 29,230,212,162,249,194,168,195,252,108,156, 62,126,226, 86, 91,197,192, 29,152,148,146, 89, -209,177,145, 39, 8,235, 99,246, 77,186,200,219, 53, 75, 38,127, 94, 72, 22,178,170,211,181, 28,187, 86,173,213, 14, 25, 56,104, -196,111, 7, 14,236, 87, 44, 88,184, 16, 87, 67,195,145,157, 87, 4,142,167,192, 17, 4,230,205, 91, 0, 7, 91,107, 20,164, 60, - 82,105,116,186,129,168,154, 67,235, 95, 95,238, 4, 65, 78, 62,119,114,215, 58,146, 0, 87,156, 30, 45,165, 10,227,228, 35,135, - 15,164,135, 12, 25,130, 99,199,142, 33, 34, 34, 98, 75, 45, 38,171, 66,147,231,201,201,225, 23, 15,174, 35, 0, 78,157, 25, 45, -165,139,158,200, 71,125, 48,144, 30, 62,124, 56,126, 10,190,134, 3,167,158,108, 62,112, 10,167,240,122, 99,124,102,120, 51, 26, - 17, 93,154,120, 58,251,183,106, 42,163, 89, 53,146, 30,198, 33,167,184, 4,231, 30, 60,203, 35,121,178,222,185,117, 74, 47,144, - 98, 36, 36, 60,170,230,206, 74, 86, 86,161,151, 24,165, 73,146,100,149,104,214,203, 68,178, 42,239,167,189,189,125,149,233, 92, - 42, 87,220,229,125,128,234,145,218, 97,118, 66, 66,130,121, 66, 66, 2,120,158, 71,104,104,168,121,251,246,237,103,191, 76, 52, -107,198,140, 25, 21, 81,171,231,215,213,189, 86, 23,101,157,210,131,244,122,253,225,153, 51,103, 78,106,223,190,125,239,133, 11, - 23, 18, 48, 98, 2,222,231,162, 57, 12,199,113,184,112,225, 2,142, 29, 59,198,234,116,186, 9,169,169,169,225,149, 54,249, 62, - 44, 44,236,220,160, 65,131,118, 69, 71, 71, 83,145,145,145,224,249,186,199,157,170,213,106,120,121,121,129, 97, 24,172,152,228, -138,194,194,102, 96, 24, 6, 44,203,194,212,212,180, 34,138, 87,217, 60,215,245, 59, 98, 89,246, 5,163, 21, 26, 26, 10,138,162, -208,165, 75, 23,220,185,115,167, 34,162, 85, 87, 4, 74,167,211, 37,216,219,219,219, 47, 94,188,184, 98,191, 50, 51, 51,113,246, -236, 89,116,232,216, 9, 77, 38, 76, 68, 74, 74, 10,214,174, 93, 11, 39, 39, 39, 44, 93,186, 20, 57, 57, 57, 96, 24,230,175, 14, -167,191, 19, 25, 25,233,242,193, 7, 31,100,132,135,135,187, 4, 7, 7, 91, 6, 4, 4,152,142, 24, 49, 34, 35, 60, 60,220,133, - 32,136, 78, 48,178, 19, 52,199,113,115,230,205,155,247,235,210,165, 75,103,127,246,217,103,237, 71,143, 30, 45, 18,137, 68, 92, -114,114, 50,179,127,255,126,194,203,203,139, 20,139,197,196,153, 51,103,184,155, 55,111,222, 96, 24,102, 5,128,203,198, 68,156, - 43,155, 44,138,162, 12, 53, 89, 85,152,102, 39, 29,101, 70,102,118,217,176,105, 25,233,227,225,162,219,189,255,108,226,229,235, -143, 30, 83, 26,102,218,143,181,164, 6,120,157,161, 40,234,144,175,175,239,152,201,147, 39,155,244,233,211, 71,186,104,209,162, -252,194,194,194,154, 76, 86, 53, 55,204,127,201,168,195, 31,230,124, 17, 60,237,243,102, 99, 60, 63,118,104,128,144,226, 12,228, -210, 20,105,110, 73,162,149, 59,133,194,172, 88,229,169,223,118,198, 3,168, 43, 47,219,173,176,251, 17, 61,155, 54,107,121,116, -197,210, 21,118,243,103,205, 20, 29, 13,254, 5, 60,163, 67,232,197,139, 80,136, 89,254, 97, 88, 72,186, 70,167, 29,128,215,112, - 10,158,212,171,235, 15, 0, 56, 97,109,109,125,111,236,232,209, 94,190,190, 35, 32,151,203,113,228,200, 17,236,249,254,123, 54, - 8, 24, 42, 5,238, 4,214,145, 79, 47,227, 70,133,206,221,241, 99,199,122,183,106,245, 49,228,114, 57, 14, 31, 62,140, 93, 65, - 65, 6,235,252,203, 41,207, 12,127, 26,127,100,136,175,163,143, 22, 73, 20,222,120,244,172, 40,244,209,179, 34,112, 60,207,241, -188,134, 36,145, 88,172,211, 45,125,244, 36,185, 94,166,160,188,233,112,201,183,147, 95, 93,155, 71, 37,243, 83,223, 33,221,213, -152,172,164,202,115,164, 85,174,164,107,122,172,215,235,147, 12,148, 95,238,230,230,246,194,107,245, 15,253,242, 70,153, 44, 67, -243,104, 1, 64,118,118,118, 42,128,249,215,175, 95,223,215,187,119,239,241, 0,146,235, 89, 70,219,186,118,237, 58, 1, 0, 69, - 16,196,150,148,148,148,240, 23,254,240,169,169, 49, 78, 78, 78,171, 60, 60, 60, 38,150,222,152, 18,219,234,168,200,159, 52,107, -214, 76, 87, 93, 89,212,244,156,227,184, 58,203, 40, 47, 47, 15,237,218,181,123, 97, 78, 75,158,231,241,236,217,179,242,136, 83, -197,185,175,205,192, 21, 21, 21, 77,156, 50,101,202, 86,145, 72,228, 6,128, 40, 55,185, 44,203, 82,235,215,175,151,177, 44, 75, - 1, 32, 72,146,100, 68, 34, 81,201,177, 99,199, 24,134, 97, 18, 52, 26,205,196,191,248, 2,113,152, 40,157,138,161, 56, 50, 50, -210,167, 44,146,149, 20, 17, 17,113,247,192,129, 3, 74, 0, 7,235,169,123, 89,165, 82, 93, 94,182,108,153,255,166, 77,155,230, - 76,156, 56,177,221,240,225,195,233,110,221,186,225,244,233,211,236,133, 11, 23, 66,213,106,245,114, 99, 12, 86, 89, 89,230,187, -186,186, 86, 24,174, 58,254,203,181,118,228,181,113,151,110,248,240, 19, 39,217,182,229,103,139,178, 82,180,215,244, 69,218,185, - 59,129, 8,252,135, 73, 79, 79,255, 2,192,130,181,107,215,166,180,104,209, 66, 42, 22,139,181,134,154,172,191, 16,134,203, 43, -122,247,187, 94,239,159,232, 58,111,138, 71,175,238, 93,228,174, 13,236,156, 31,198,165, 35,246,250,233,226,123,167,190,125,202, -107,114,251, 3, 48,164,231,250, 77,141, 78,215,104,198,204, 25,147, 36, 34, 81,111,150,101,155,247, 56,119,156,167, 40, 42, 92, -171,215,159, 43,107, 46, 44,121,141,139,124,201,170, 85,171,188,124,125,125,113,228,200, 17,156,219,187, 23,195,178,178,112,158, -162, 40, 82, 44,182, 57,165,211,173,134, 97, 6,105,201,154, 53,107,188,253,252,252,112,232,208, 33,156,217,181, 11, 67,235,167, - 83, 83, 93,215, 22,128,178,236,105, 22,128,104, 0,173, 1,152, 0,208,160,116,106, 39,219,202, 85, 88,217,123,229,239, 95, 34, - 8,226,207,236, 8, 91,119,102,248,231,137,136,125,218,250, 85,239,133, 90,173,206,241,242,242, 50,106,204,181, 94,175,175,181, - 13,151, 97,152, 36, 79, 79, 79,131,163, 22,134,152,162,156,156,156, 54,127, 98, 97,188, 84, 95,172, 42,149, 8,199, 61,117,116, -116,228,202, 43,253,234, 76, 88,117,175,241, 64,188, 49,223,147,150,150, 22, 13,224,243,250,238,103, 74, 74,202, 81, 24, 48,105, -180,161,219, 1, 64,110,110,238, 43,159,204,151,224,249,228, 69,139, 22, 25,101,176,193,243,181,153,207,240,162,162,162,246,134, -124,183, 78,167,195,223,200,161,178,133,140,136,136, 24, 79, 16, 68, 31,148, 54, 9,108,193,171,201,230,125,185,160,160,224,242, -202,149, 43,253,183,109,219, 54,141,231,121, 20, 20, 20, 4, 25,107,176, 42,238,158, 51, 50, 78,191,170, 3,207, 73,215,254,190, -127, 75,210, 91,234, 60,221,180,237, 69,218, 93, 16,168, 8, 70,241, 60,255,191,145, 35, 71,118, 0,176,243,101,197,106, 24,117, -248,178,196,115,185,249, 45,206,207,248,102,236,121, 75,179,190, 96,105, 31,104,201, 83,208,102,159, 6,240, 35, 12,235,230, 80, -113,188, 12,199,173, 97,180,218, 53,149, 42,151,255, 66, 57, 91,251,249,249, 77, 27, 51,102, 12, 22, 44, 88,128, 51,171, 87,235, - 62, 33,136,124, 17,192,255, 90,122,163, 73, 18,192, 44, 67,117, 70,141, 26,133, 5, 11, 22,224,231, 21, 43,234,171, 83, 27, 74, -130, 32,130, 1, 96,246,236,217,115,151, 45, 91,102, 53,103,206,156,230,203,151, 47, 95, 90,246,252, 65,249,251,101,117, 93,192, -156, 57,115,154, 86,122,191, 16,192,173, 63,249,124, 86,155, 25,254,207,166,167,160, 41,104, 10,154,130,166,160, 41,104, 10,154, -130,230,203,192,243,124,223,210, 85,205,235,154, 30, 87, 90,255, 45,208, 16, 16, 16, 16, 16, 16, 16, 16,248, 23, 82, 57,138, 85, -159,247, 95, 33,229,125,180, 42,179, 13, 40, 29,214, 93,147, 43, 53,102,212, 67,125,156,109,136,160, 41,104, 10,154,130,166,160, - 41,104, 10,154,255, 57,205,186,180, 95,248, 60,207,243,125, 9,130, 8,230,121, 62,160,166,117,185,177,122,254,113,165,245, 43, -235,118, 80, 13,229,125,179, 94,232,163,245,103, 35,132, 85, 5, 77, 65, 83,208, 20, 52, 5, 77, 65, 83,208,124, 41,202,155, 0, - 1,240,179,103,207,158,243, 15,108, 58,116, 44, 51, 89,149, 23, 0,181, 52, 29,242,252, 97, 42, 57, 25,230, 18,137, 92, 12, 0, - 90,173, 74,231,236,140, 2,130, 24,242,119, 78,120, 43,240,239,164,124,184,119,250, 43,222, 86, 64, 64, 64, 64,224,191, 65,102, -121,164, 10, 64, 38, 0,162,236,185,182,108,157, 89,102,200,158,127, 92,229,253, 63,145, 84,212, 16,201,162,107, 50, 89, 89, 89, -114, 91,154,206,245,102,217,146,198, 0, 64,211,100, 84, 86,150, 85, 12,207, 31,206,170,143,217,178,181,179, 11, 19, 81,148,179, - 33,219,234, 89, 54, 57, 43, 61,189,106,234,120,130,120, 29, 12,158,161, 38,226,101,204,198,159,110, 84,108,109,109,237,237,237, -237,223, 51, 55, 55,239,152,151,151,119, 51, 51, 51,243,167, 90,230, 61, 92, 70, 16,152, 89,250,187,194, 74, 0,115,106,145, 54, -102,219,231,241,146,203,229,147, 8,130,240, 43,251,131, 69,168, 84,170, 77, 0, 30,253, 7, 47, 72, 38, 0, 6,208, 52, 61,202, -214,214,182, 93, 90, 90,218, 34, 0,245,205,230, 77, 3,152, 97,105,105, 57,204,210,210,210, 51, 39, 39,231,113, 65, 65,193, 33, - 0,107, 0,212, 57, 84,122,209,103,142, 29,187,245,233, 54,255,194,153, 11, 75, 22,125,159,122,253,133,247,103, 56,218,244,238, -213,121,193,133, 83,215, 22,207,221,152,146, 99,228,190,145,101, 11, 80, 58, 58,146,199,139,201, 94, 95, 22, 17,128,126, 0,186, - 1,184, 0,224,148, 33,199, 93, 3, 29, 0,204, 45,219,231, 53, 0,206,255,195,127, 71,166,246,246,246, 43, 0,244,163,105, 58, - 50, 57, 57,121, 2,128,164,191,121,159,104, 0,109, 1,248,161, 52, 13,199, 45, 24,150,194,161, 78,108,108,108, 2,104,154,158, - 84,150,218,101, 83,118,118,118,240, 63,181, 96, 36, 18, 73,144,131,131,195,199,106,181, 90, 69, 16, 4, 95, 57,223, 35,195, 48, - 73, 89, 89, 89,109, 94,183,139, 26, 65, 16,183,254,225,187, 56,161,154,215,106,206,163,149,156, 12,115,154,206,245,206, 72, 11, - 31,150,146,122,127, 40, 0, 56, 57, 54, 63,100,231,208,236, 96,114,178, 68,231,224, 51, 80, 33,146,211,155, 40, 74,212,178, 68, -171,177, 21,209,162, 44, 29,163,191, 75,106,249, 73,105,209, 63, 85,155,108, 81, 68, 81,206, 79, 99,206,219, 49,186, 28,136,100, - 78, 16,153,184,213,184,183, 78, 78, 78,245, 58, 74, 43, 43, 79, 51,157, 84, 54, 77, 36,162,122,113, 60,227,199,115, 0, 73,136, - 34, 24, 86,255,155, 88,163,249, 46, 55,247,113, 97,125,207,160,143, 13, 28,120, 96, 56, 8,244, 2,143,115, 4,112, 32, 58, 27, -105, 70, 72, 24,106, 34, 94,198,108, 84,254,236, 90, 0, 95,188,234, 95,146,179,179,179, 85, 64, 64, 64,208, 55,223,124, 99,162, - 80, 40,136,132,132,132, 62,179,102,205,122,243,246,237,219,159, 39, 39, 39,167, 60,111,250, 8, 2, 51, 57,142, 39, 1,128, 36, -137, 89, 74,165,157,156,162,168, 23,114, 27,177, 44, 43,207,204,204,152,204,113, 60, 81,182,237, 76,158,199, 58, 67, 12,163, 76, - 38, 27,225,215,172,229,231, 43, 86,173, 81,216,219,217,153, 50, 44,167,139,127,246, 84, 62,127,246, 23,237,227, 98, 31,173, 43, - 41, 41,217, 95,159,255, 53, 69, 81,195,164, 82,105, 0, 0,223,178,215, 30,106, 52,154, 96,150,101, 15, 26, 90,161,219,219,219, - 95,162, 40,170,129, 49, 95,204,178,108, 66,122,122,122,151,122, 22,209, 16, 55, 55,183, 31,187,118,237, 42,111,215,174, 29, 36, - 18, 9, 22, 44, 88, 48, 35, 53, 53,181, 46,163, 69, 3,152, 33,151,203,135,153,154,154,122, 22, 21, 21,197,169,213,234,163, 18, -137,164,231,186,117,235, 92, 59,119,238,108,150,158,158, 78, 80, 20,101,255,243,207, 63,127, 20, 20, 20,212,135, 97,152, 30,117, - 85,114,249,113,252,124,105, 63, 95,255,252,184,243,243, 1,188,243,252,251, 76,137,108, 20, 79,185, 6,168,249, 59,137,101,230, -195, 96,147, 37, 18,137,214, 57, 56, 56,140, 41, 41,205, 21,192, 63, 95,225, 0,128, 86,171,205,205,203,203,243,169,207, 95, 30, -192, 56, 75, 75,203, 49, 95,126,249,165,213, 59,239,188,131,189,123,247,126,186,125,251,246,220,130,130,130,255,161, 52, 17,102, -180,145,154, 51,211,210,210,222, 21,137, 68,132,171,171, 43,165, 86,171,141, 49, 90,222, 40,157,132,249, 22,128, 77, 40, 77, 93, -208, 29, 40,253,191, 3, 88, 89,110,220, 72,146,220,228,227,227,243,222,195,135, 15, 55, 3, 88, 82,223,255,186,131,131,195,214, -141, 27, 55, 14,237,223,191, 63,149,153,153,233,220,162, 69,139,125,105,105,105,254,175,224, 50, 50, 86, 42,149, 78,111,222,188, -121,147,232,232,232,152,130,130,130, 53,101,231,179,182,255,148, 11,128,158,150,150,150, 61,230,205,155,167, 8, 8, 8,192,182, -109,219,222,221,190,125,123, 81, 97, 97,225,111, 40,237,211,243, 82, 38,144,166,233, 73, 73, 73, 73,182, 60,207,195,209,209,113, - 18,128,127,164,209, 34, 73,114,221,160, 65,131,198,236,219,183, 79,254,244,233, 83,185,179,179,115, 69,242,108,130, 32,234, 93, -127, 10,188, 52,219, 42, 25,174,186,243,104, 73, 36,114, 49,203,150, 52, 78, 73,189, 63,244,205,174,235, 45, 0,224,210,197, 41, - 67,237, 28,154, 70, 72, 36,242, 24,169,185,236,216,160,126, 61, 91,190, 31,208,149,112,113,180, 67, 82,106,134,253, 15, 7,206, -188, 29,124,230,252, 49,148, 38, 16,171, 22, 70,151, 3, 19, 93, 8,162,175,124, 15,219,110, 41,216,240,115, 18,174,223,139,135, - 42, 63, 11, 13, 28, 76,176,106, 90,111, 56, 88,201,235,119,235,101,231,213,157,161,165, 7, 63, 24, 49,210,226,189, 1,190, 34, -119, 7, 7,240,188, 20, 49,113, 69,157,126, 57,123,190,237,209,195,251, 39,153,138,188,134, 21,103, 60, 50,248,226,214,202, 17, - 38,197, 58, 12,160, 41,226,163,206,109,154,244, 24,241,174, 63,217,196,183, 17, 34, 31, 60,236,125,226,247,208, 85,228,181, 7, -191, 49, 44,191,219, 84,140,227,119, 82,107, 77,232,247,130,225,232,209,163,167,191, 84, 42,173,146, 60, 73,163,209,136,127,251, - 45,164, 67,125,204, 70,249,119,104,181, 26, 82, 36,146,128, 36,137,207,253,252,154,249,102,101,101,157, 39, 8,226,199,148, 20, -227,162, 5, 83, 0, 73, 46, 77,183, 38,165, 82, 71, 86,171,181, 1, 0, 66, 34,201,141, 39,201,102,243,230,206, 85, 80, 20,197, -101,103,103, 67,165, 82, 17,227,199,143,151,197,197,197, 13, 74, 78, 78,254,190,142, 59, 18,108,223,190,221,219,209,209,241,133, -217, 99, 83, 83, 83, 37,253,251,191, 87,159,162,247,110,222,162,213,244, 51,103,126,245, 45,200,201, 45,217,190,118,107,152, 94, - 38,215, 52,244,245, 17,109,218,182,203, 98,194,152, 15,167, 68, 69, 61,184, 11,227,230,171,115, 51, 49, 49, 57,182,122,245,106, -191,238,221,187,139,236,236,236,144,158,158,142,135, 15, 31,250,253,254,251,239, 3,118,237,218, 53, 67,173, 86, 15, 2, 12,154, - 16,213,235,183,221, 63,218,153, 90,219,128,213,235,225,212,188, 85, 69,126,179,216,223,207,130,209,233,192,233,245,240, 13, 24, - 80, 22, 77,230,225,235,235, 91,223,172,187, 78, 77,155, 54,221,179,116,233, 82,177, 70,163, 65,104,104, 40,206,159, 63,207,165, -166,166,214,149, 16,151, 38, 8,226,236,194,133, 11, 93,186,116,233, 98,150,149,149, 5,150,101,109,143, 31, 63, 62,169,101,203, -150,230,174,174,174,146,221,187,119,163,168,168, 8, 12,195, 88,123,122,122, 90,143, 24, 49, 66,187,123,247,238, 25, 0, 86,212, - 20,201, 42,136,227,231,167, 18,158,111,251,180, 30,133, 52,226,215,183,167,191,141, 95,204,223, 32, 42, 34, 91,111,123,122,154, - 21, 36,203,103, 41,204,155, 89, 23, 36,135,204,122,219,211,115,251,175,143, 13,186, 25, 34,203, 42,155, 15, 14, 28, 56, 32,127, -248,240,161,220,215,215, 23, 28,199, 85,100,224, 47, 79, 56,235,229,229, 85,159,243,184, 60, 48, 48,112,214,208,161, 67,209,188, -121,243,138,164,168, 95,125,245, 21,102,205,154,101,117,233,210,165, 25,251,247,239,159,241,211, 79, 63,173, 0, 48,219,200,104, - 76, 57,198,150,241,215, 79,158, 60, 25,114,236,216,177, 15,103,206,156,233, 5, 96, 50,128, 5,217,217,217, 93,203,162, 49,146, - 50,163, 53,118,198,140, 25,159,204,158, 61, 27,239,190,251,238,130,208,208,208,111,235, 25,229,163, 24,134,121,183,127,255,254, -148, 94,175,135,169,169, 41,244,122,253, 27, 47, 27,148, 0,176,113,226,196,137,159, 4, 6, 6,194,202,202, 10,122,189,222,251, -192,129, 3,219, 23, 44, 88,208, 17,192,184, 26,246,117,212, 39,159,124, 50,120,228,200,145,104,211,166, 13,104,186,244, 52,174, - 94,189, 26,139, 23, 47, 86,156, 61,123,118,192,238,221,187, 7,156, 56,113,226, 40,170, 78,219,101, 20, 28,199,129,166,105, 36, - 38, 38,194,206,206, 78,202,113,220, 25,130, 32,182,229,228,228,252,244, 15,170,204, 87, 14, 25, 50,228,131,125,251,246, 41, 0, - 96,213,170, 85,152, 62,125, 58,236,237,237,161, 80, 40, 4,171,243,207,137,104, 77,168, 51,162, 85, 23, 42,149,170,213,156,207, - 62, 2, 73,150,222, 53, 54,106,232,134,101,115, 39, 16, 39,130,207,180,170, 53, 6, 47,115, 66,244,149,239, 33,117,157, 6,141, -158,193,141,123, 79,112,110, 85,159,210,218,242,157,121,208,232,122,148, 87, 54,214, 18, 19,147,149, 90,150,189, 10, 7,135, 80, - 60,123,150, 89,151,201, 82, 58,216, 7,111,217,178,194,196,239, 13, 31,232, 24, 61,146, 51,146, 65, 16, 82,184, 56,155, 97,236, -168,119, 68, 93,187, 58,217,126,253,245,214,211,105, 28, 6,170,178, 30,213,153, 48,212,219, 22, 59, 91,249,121, 13, 29,209,183, -139,180,153, 95, 83,136,165, 38, 21,239,181,110,211, 6,173,219,180, 33,103, 23, 21,246,186,121, 43,172,215,145,179, 55, 52, 42, -253,179, 67, 49, 89, 24, 93,199, 69,166,194,112, 76,157, 58, 21,246,246,246, 85, 54, 72, 79, 79,199,239,191,255, 86,237,103,140, -184,144, 85,124,199,183,223,126,107,150,155,155,251,206,142, 29, 59,222,226, 56,238,219,180,180,180, 43,134,136,140, 4, 26,228, - 75,165, 61,198,172, 89,195,181,124,239, 61,202,210,193,129,228, 88,150, 72,121,252,216,102,237,247,223,119,203,137,141, 53, 41, -182,182,206,201, 85,171, 85, 49, 49, 49,144,201,100, 4, 77,211,109,171,145, 74,231,121,172, 36, 73, 98, 22, 65, 16,144, 74,101, - 49,129,129,129,119,202,222,107,112,234,212, 41,121,191,126,253, 84, 0,158, 2,128, 84, 42,115,166, 40,210,187, 52, 19, 59, 86, - 26, 98, 48, 77, 77, 77, 63, 91,178,116,133,105, 65, 78,158, 90, 87, 92,172, 87,154, 43, 8, 66, 97, 70, 21,228, 23, 22, 38,167, -102,106,230, 45, 90, 76, 77, 28, 59,242,179,226,226,226, 73,134,154,172, 22, 45, 90,220, 60,118,236,152,157,141,141, 13,242,242, -242,144,157,157,141,155, 55,111,130,227, 56, 12, 26, 52, 72,218,169,125,187, 86,115,231,205,191,158,152,156,220,209, 16,179,101, -106,109,139, 85, 93, 90,150, 86,214, 79,179, 43,202,103,219,144,128,138,109, 22, 39,229,151, 71,231, 94,102, 10,169,142, 61,122, -244, 16, 3,192,184,113,227, 10, 10, 11, 11,151, 1,216,135,186, 51,250,207,152, 63,127,190,115,195,134, 13,221,247,237,219,135, -162,162, 34, 0,176,107,216,176, 33,188,189,189,217, 11, 23, 46,192,219,219, 27,102,102,102,184,116,233, 18,174, 95,191,142, 54, -109,218,152,137,197,226,161, 58,157,174, 90,163,213,173, 79,183,249,210,126,190,254, 62,173, 71, 65, 97,238,136,237,251, 15, 34, - 58,108,151,191, 70,247,112,190,152,189, 56, 82,205, 75, 71,103, 38, 40,102, 55,104,211,213,166, 81,211,247,224,222,250,142,109, - 9,123,249,201,252, 94, 13,151,211,178,146, 93,139,214,164,102,215,100,178, 0,172, 26, 52,104,208,144, 3, 7, 14, 88, 2, 64, -120,120, 56,210,211,211,161, 84, 42, 33,147,201, 32, 18,137, 42,230, 39,173, 39,163, 55,109,218, 84, 97,218, 24,134,169,152, 5, - 64, 46,151,227,205, 55,223, 68,203,150, 45,241,211, 79, 63,141,174,193,104,117,105,223,190,253, 94,119,119,119,215,202, 47, 22, - 23, 23, 99,248,240,225, 0,128,174, 93,187,246, 48, 49, 49,225,203, 13, 97,106,106,106,209,173, 91,183,122, 1, 8,173,193, 89, -170,147,147,147,241,229,151, 95, 34, 62, 62,254,211, 45, 91,182, 60, 3, 32,147, 72, 36, 21,247,199, 0,188,155, 54,109,186,110, -250,244,233,136,139,139, 67,100,100,228, 77,212,191, 41,149, 53, 53, 53,141,213,235,245,109, 24,134,129, 90,173,198,192,129, 3, -101, 71,143, 30, 77,167, 40, 42, 42, 43, 43,235, 67,148,246, 73, 49, 20, 25,128, 53,129,129,129,159,204,156, 57, 19,191,253,246, - 27, 78,156, 56,129,145, 35, 71, 98,218,180,105, 80, 40, 20, 99,166, 77,155,118, 29,165, 19,154, 63, 79,143, 77,155, 54,129,101, -217, 23,254, 27, 50,153, 12, 93,186,116, 65,147, 38, 77,112,226,196,137, 30, 47, 97,180,220,187,116,233, 34,225, 56, 14,197,197, -197,184,112,225,130,194,196,196, 68,225,226,226, 50, 30,192, 63,198,104,185,187,187, 7, 30, 56,112, 64, 81,185,245, 71, 42,149, -162,210,239, 64,224,239,143,104,213,122,135, 85,129, 86,171,210,209, 52, 25,229,228,216,252,208,165,139, 83, 42,154, 14, 1, 50, - 74,171, 85,233, 0,128,229,120, 20,168, 24,152, 72, 73, 60, 77, 43,196,131,199, 89,213, 73, 85, 25,162, 41, 50,113,131,180,170, - 8,231,172, 0, 0, 32, 0, 73, 68, 65, 84,221, 83,240, 60, 15,173,142,133, 38, 63, 13,203, 78,171,240, 48,169, 4,218,226, 92, -104,117,165,221,176,108,109,109,233, 51,103,126,153, 30, 18,242,251, 39,255,251,223,255,168, 36, 11,139,200, 66,160, 85,117,154, - 86, 86,158,102,156, 68,114,104,243,150, 5, 38, 60,245, 24, 49, 9,197,104,228,210, 14,182,150,174, 72,203, 42,198,213,200,159, - 17,245, 40, 24, 13, 29,221, 49,237,179,183,101, 75,150,238, 59, 40,102, 60,220,242,242,226, 11,106,218,207,242,187,168,173,191, -198,128,201,121, 12, 54, 59, 14,108, 97,202, 11, 27, 40,148,110,104,221,221, 25, 74,215, 55,164,163,167, 45, 30, 5, 84, 49, 90, -149, 53,211, 9,130,220, 76,146,196, 39, 4, 65,160,121,243, 22, 73,107,214,172,169, 46, 21,184,174,121,243, 22, 73, 20, 69,186, -148, 94,216,201, 77, 60,207,165,215,177,159, 85, 76,141, 68, 34,157, 89, 26,246,119, 76, 60,125,250,180,110,200,144, 33, 88,189, -122,181,100,214,172, 89,243, 40,138, 26, 87, 77,243, 94, 21,205,129,128,155,229, 27,111,244,254,246,234, 85, 94,164,215, 19, 57, - 55,111, 22,228,165,166, 50,105,133,133,146,195, 81, 81,239,126,252,197, 23, 18, 87, 87, 87, 92, 9, 14,182,201, 44, 46,230,243, - 52, 26,117, 94, 94, 30,207, 48,204,205, 26, 52,231, 40,149,118,242,237,219,183,123, 7, 6, 6,222, 73, 77, 77,157, 3, 0,142, -142,142,203, 0, 52, 1,240,180,210,107,216,178,229, 96,242,248,241,227, 99, 50, 50, 50,230,212,182,159,149,104,106,167,180,147, -239,223,186,251,190,181,153, 9,169,116,113, 34, 69,150,150, 52, 35, 49, 17,115,128,186,161,235, 27,166, 0,154,214,240,217,231, - 53, 9, 19, 19,147, 99, 39, 79,158,180, 19,137, 68, 96, 89, 22, 74,165, 18,241,241,241,200,203,203, 67, 97, 97, 33,158, 68, 61, -132,135,171, 43,190,158, 61,203,113,242,172,217,199, 84, 42, 85,155,231, 42,179, 23, 39, 64,214,235, 94,136,236, 85, 55,139,193, -243,205, 94, 6,150,123,101,226, 19, 18, 18,160, 80, 40,224,231,231,167,184,122,245,234,229, 90, 76, 86,229, 73,128,135,118,238, -220,217,108,223,190,125,104,211,166, 13, 44, 44, 44,112,225,194, 5,132,135,135, 67,167,211,145, 69, 69, 69, 80, 40, 20, 88,190, -124, 57,220,220,220, 80, 88, 88,136,167, 79,159,218,136, 68, 34,219,231, 50,218, 87,104, 94, 56,115, 97, 73,126,220,249,249,105, -196,175,111,111,223,127, 16,227, 71, 12,131, 3,255,248,178,197, 27,196,146,222,253, 58,127,197, 83,174, 1,166,102,205,173,188, -252,250, 65, 44, 81, 96,242,204,197,136,137, 56,101,165, 42,188,255, 41,193, 38,186, 46, 90,115,120,106, 53,199, 78, 0, 32, 93, - 93, 93, 63, 62,124,248,176, 89, 69,232,133,162, 42,230, 60,172, 60, 9,124, 45, 19,190,215,121, 62, 9,130, 64,124,124, 60,236, -236,236,160, 80, 40, 42, 38, 16,127,248,240, 33,110,220,184,129,242,217, 40,106,208,252, 48, 36, 36,196,213,212,212,180,202, 6, - 60,207, 35, 43, 43, 11, 12,195, 64, 46,151,131,101, 89,232,116, 58,232,245,122,148,148,148, 40,154, 52,105, 50, 73,175,215,135, - 86,167,201,113,220,231, 67,135, 14,237, 28, 26, 26,234,249,253,247,223, 67,171,213,174, 74, 75, 75,195,224,193,131,193,113, 28, -122,244,232,209,129,231,249,232,121,243,230, 1, 0,166, 79,159,174, 47, 46, 46, 14,172,207,177,151,209,164,117,235,214,158,191, -253,246, 27,252,253,253,161,209,104,176,122,245,106,243, 45, 91,182,152,239,222,189, 91, 57,115,230,204, 31, 51, 51, 51,251,212, -161, 73, 0, 88,229,224,224,240, 73,183,110,221, 76,202,230, 48,197,174, 93,187,240,245,215, 95, 31, 0, 48,239,151, 95,126, 89, -120,226,196,137, 81, 31,127,252, 49,190,254,250,235,105,121,121,121, 59,106,210,124,242,228, 9,148, 74, 37,204,205,205, 75, 47, -150, 58, 29,238,222,189,139,115,231,206,161,113,227,198,134, 28, 83, 77,251,233, 62,104,208,160, 31,247,239,223,111,150,152,152, -136, 75,151, 46,193,195,195, 3, 42,149,202,144,185, 97, 67,254,132, 10,187, 70, 77,181, 90, 93,146,144,144,160, 88,177, 98, 5, - 28, 29, 29,225,238,238, 14,153, 76, 6,130, 32,160,215,235,107,155, 94,173,206,253,236,218, 21,116, 86,178, 85,127, 11, 75,171, - 79,121,158,167,243,243,115,183,234,144,119,228,241, 99,104,255,194, 99,255, 55,211, 10,192, 29, 84,157,243, 48,181,194,104, 5, - 7, 7,243, 1, 1, 1, 68,249,218,217, 25, 5, 89, 89, 86, 49,118, 14,205, 14,218, 57, 52, 45,155,247,139,140,162, 40,171, 24, -123,123, 85, 1, 0,232, 24, 30,215,162,242,112, 63, 54, 13,225,177,105, 48,149, 26, 22,124,209,232,152,210, 30,171, 60,143,146, -162, 63,110, 90,117,170, 92,104,116,165,221, 61,180, 26, 21,242, 51, 35,137, 33, 3,123,201, 62,249,100, 34, 28, 29,157,149, 53, -233,233,164,178,105,147,167,191,107,105,109, 41, 66,240,213, 95,209,161,241, 64,200,164, 34,100,231,151, 0, 4,240,232,241, 57, -128, 51, 67, 68, 76, 2,218, 55,149,163, 79,111, 95,197, 79, 71,162,191, 0,176,192,144,253,101,146,110, 66,236,245, 14, 68,172, - 30,250,172,104,112,121,207, 0, 83, 7,168, 9, 5,178, 83,159, 33,234,242, 81,131,238, 25, 57,142,251,212,214,214, 54,111,222, -188,121,221, 26, 53,106,164,155, 52,105,210,189,103,207,158,125,254,220,221,202,119,155, 54,109, 66,108,108,108,242,183,223,126, -123, 33, 43, 43,107,190,145, 5, 61,155,231, 17, 84,214, 20,151,117,252,248,241,214, 23, 47, 94,156, 22, 20, 20,100, 63,101,202, - 20,201,148, 41, 83,198, 2,248,166,182,230,194, 2,169,180,231,183,151, 46,241, 76, 82,146,102,207,250,245,146,141,215,174,205, -211,113,156,147,173,157, 29,209,169,125,251, 98, 57, 73,102,101,167,167, 51, 74, 79, 79, 42,254,220, 57, 27,222,196, 36,229,151, - 95,126, 41, 40, 42, 42,170,113,234, 28,138,162, 84,213, 53, 23, 86,135,163,163,163,182,186, 62, 92,181, 84,136, 5, 28,207,235, - 44, 27, 54,228,123,247,232,216, 40, 54,250,241, 99,153,165, 37,229,213,200,195,231, 65, 84,252, 77,158,101, 75, 8,130, 40, 48, -168,173,132,162,134, 5, 5, 5, 53, 51, 55, 55, 7,199,113,176,176,176, 64,102,102, 38,180, 90, 45, 10, 10, 10,160, 45,204,135, - 54, 63, 31,225,207,226,209,185, 91, 55, 12,121,187,183,239,238,227, 39,135,177, 44,123,160,214,246,188,230,173, 42, 34, 89,139, - 27,216,252,209, 22,148,152, 87, 97,186, 86,180,242,130, 88,161, 64,175,207,103,191,204, 31,253,206,233,211,167,127, 30, 52,104, -208,187, 95,124,241, 5,153,154,154,250,107,124,124,124,103, 0,145,181,125, 72,161, 80,188,145,149,149,133,162,162, 34, 88, 88, - 88, 32, 40, 40, 8,246,246,246, 80,169, 84,184,117,235, 22,239,226,226, 66, 92,184,112, 1, 46, 46, 46,200,206,206,134, 78,167, -131, 90,173, 78,211,106,181, 53, 54,151,151, 53, 15,190, 51,253,109,252, 18, 29,182,203,223,153,120,114,107,232,140,174,177,209, -225, 81, 9,103,207, 93,253,134, 41,145, 37,230, 37,133,204,106,216,246,142,237,167, 95,126,141, 13,171, 22, 34, 58,244, 82,142, -189, 91,193, 70, 19, 66,179,179,182,253, 45, 46, 46, 46,137,138,138, 50,187,119,239, 30, 8,130,128,133,133, 5,228,114,121,181, -102,171, 30,144,149, 35, 80,197,197,197, 16,139,197,176,177,177,193,142, 29, 59, 42, 42, 94, 15, 15,143,218, 52,182,246,234,213, -107,152,155,155,155, 89,229, 23,219,182,109,139,137, 19, 39, 98,243,230,205,184,118,237, 90,149,249, 52,211,210,210, 82,245,122, -125,109,199,157,151,158,158,254,246,192,129, 3,195, 46, 95,190,108,190, 99,199, 14, 48, 12, 83,237,178,125,251,118,220,184,113, - 99, 1,128,168,122,254,142, 26, 15, 30, 60,248,210,222,189,123, 45, 51, 51, 51, 81,254,219, 40, 46, 46, 6,203,178,240,241,241, - 33, 24,134,169,171,223, 27, 73, 81,212,241,245,235,215,247, 27, 63,126, 60,104,154,134, 86,171,197,250,245,235, 49,107,214,172, -244,178,155, 82, 29,128,121, 59,119,238, 28,245,222,123,239,161, 69,139, 22,190,231,207,215,220,179,163,168,168, 8, 69, 69, 69, - 16,137, 68,112,112,112,192,146, 37, 75,160,213,150, 94, 86,188,189,189, 43,254,198, 0,182,122,123,123,247,139,137,137, 89,141, -210,190,107, 47,224,224,224, 48,144,231,249, 9, 44,203, 22,250,251,251,219,236,223,191,223, 44, 57, 57, 25, 97, 97, 97, 88,176, - 96, 65, 46,199,113, 44,199,113,132, 90,173,126, 98,103,103, 23, 38,149, 74, 77, 84, 42, 85, 78,118,118,246, 82, 0,191,254, 93, - 53, 57, 65, 16,132, 72, 36,194,184,113,227, 64,211, 52, 76, 76, 76, 80, 82, 82, 2,189, 94, 95, 97,230, 97,100,179,116,163, 70, - 10, 27, 26,226,241, 86,102, 77,166, 13,153, 26,160,116,116,114,134,165,185, 20, 15, 31, 70,118,254,253,183,115,235, 37,116,244, - 22, 78,171,223, 18,253, 52,255, 79,159,236,254,121, 47,242, 47, 53, 90, 47,204,121, 72, 87, 95,152, 67, 88,158, 63,156,149,156, - 44,209, 73, 36,242,152,242, 40,151,189,189,170,128, 32,134,176,202,166,253,193,232,244,101, 23, 10,190,108, 49,208,104,233, 89, -196, 70, 71,224,242,217,147,176, 85, 37, 35,235, 73, 75, 64,220, 12, 90,117, 62, 74,180,186, 50, 83,194,226, 94,216,111, 40,200, -207,129, 95,155, 0,128, 36,111,212,164,103, 97, 67, 4,116,106,221,156,138, 77,136, 64, 91,239,247,225,233,226,143,103,169, 5, -200, 43,210, 32,183,160, 4, 45,253,102, 35, 51, 87,141, 2, 85, 9, 34, 99,119,195,217,201,147, 36,232,199, 61, 12, 53, 90,154, -200, 99,208, 68,157,128,216,189, 51, 36, 62,239,129,114,239,130,132,251,231,113,239,151,181, 72,122,112, 5, 60,199,254,159,189, -235, 14,139,226,106,191,103,102, 59,187, 75,239, 69,177,130, 98,239, 13, 69,108,104,236, 29, 75,172,209,168,216, 27,106,172, 81, -209,104, 98,239, 37, 6,123, 55, 98, 23, 21, 11,118, 64, 64,172,244,178, 82,151,182,125,103,103,126,127, 80,130, 72, 89,208,228, -251,126,249,246, 60,207, 60,187, 51, 59,115,246,157,123,239,220,123,230,189,247,190, 23,246,174,109,245,125, 72,118, 92,191,126, -189,109,167, 78,157,216, 61,122,244,104,126,245,234,213,230, 18,137, 36,172, 80, 96, 52,239,209,163, 71,115,107,107,107,108,219, -182, 77, 65, 16,196,142,106,102,118,177, 7, 44, 45, 45,237, 25,128,117,231,207,159,223, 49,117,234, 84,216,216,216, 52, 77, 73, - 73, 41,247,194,116, 14,167,249,248,245,235, 25, 14,139,197,156,220,185,147,187,250,250,245, 95,127, 63,114,132,219,205,211,147, - 96, 24, 6,161,161,161,194,141, 59,119, 10, 71, 15, 28, 24, 23,159,150, 70, 5, 5, 7,107, 36, 73, 73,121,105, 50,217,106,137, - 68,242,233, 63, 81,178,181, 90,237,227,152,216, 24,199,214,237, 90, 88,135, 68,197, 68,122,117,235,216,145, 36, 73,242,109,116, -124,176,181,181,137,240,214,205, 91, 26,173, 86,251, 88, 31, 46, 62,159,223,175, 91,183,110,108,169, 84, 10, 7, 7, 7,164,167, -167, 35, 57, 57,185,192,227,144, 35,133, 38, 39, 7,218,220,108,232,100,249,136,121,254, 12, 45,234,214,225,159,225,243,251,201, -229,242, 10,133, 86,209, 91,102, 89, 11, 93, 23, 29,227, 25, 27,131, 39, 22,131,168,122,183,225, 64, 51, 51,179,197,217,217,217, - 87, 1,172,213,104, 52, 62,139, 23, 47,110,179,125,251,118,171,117,235,214,153, 76,153, 50,229, 76,126,126,126, 11, 20, 44,170, - 90, 94, 3,246,145,162, 40, 75, 0,182,129,129,129,176,177,177, 65, 78, 78, 78,145,167, 69, 45,151,203, 5,153,153,153, 80,169, - 84, 80,171,213, 48, 49, 49,193,139, 23, 47,178, 40,138,186, 92,153,113, 38,245,136,181, 42, 77,212, 79,150,110,162, 20, 13,101, -238,145,150, 69, 75, 87,253, 42, 89, 3,224,215,222,117,235, 30,208,208,247, 99,222, 71, 92, 54,143,125,126, 47, 43,229,189,172, -238,193,171, 49, 21,141,209, 98, 0,208, 4, 65, 48,174,174,174, 72, 79, 79, 7,139,197,130, 80, 40,132, 88, 44,198,146, 37, 75, -176, 99,199,142,234, 8, 45,129, 72, 36, 90, 79,146,228, 72,146, 36,173,117, 58, 29,124,125,125,209,191,127,127,240,120, 60,104, - 52,154, 98,143,102,145,151,170, 18, 79, 71,232,147, 39, 79, 76,158, 60,249,172,218,242,180,178,178,186,163, 82,169, 16, 29, 29, -141,139, 23, 47,118, 5, 16, 84,197,188,142, 14, 13, 13,237,237,238,238,254, 71,171, 86,173,234, 49, 12,131,166, 77,155,194,219, -219, 27,254,254,254, 8, 11, 11, 67, 78, 78, 14,125,235,214,173,223, 1,108,174,106, 27, 94,152,190, 13,134, 14, 29,250,240,248, -241,227,230,153,153,153, 80, 40, 20,144,201,100, 56,115,230, 12, 58,117,234, 4, 43, 43, 43, 28, 59,118,140, 98, 24,166,162,188, - 39, 73,146, 60,184,119,239,222,254,147, 39, 79,198,174, 93,187,112,242,228, 73, 12, 24, 48, 0, 35, 71,142, 68,122,122,186,237, -166, 77,155,198, 21,118, 19,174,244,246,246, 70,126,126, 62,158, 63,127, 30,165,231, 51,143,236,236,108,100,103,103,195,200,200, -168,228, 51, 70, 0,240,223,178,101,203,168, 57,115,230,160,110,221,186, 43, 99, 98, 98,182,160,140, 89,162, 52, 77,255,152,156, -156,108,206,102,179, 45, 41,138, 66, 98, 98, 34, 94,188,120,129, 25, 51,102,100,101,101,101, 77, 5, 16, 15, 96,217,164, 73,147, -214,206,155, 55,175,184, 44,205,155, 55, 47,224,234,213,171,189,255,105,111,142,171,171, 89, 99, 30,139, 63, 91,154,199,178,148, - 74,165,197,117,135, 90,173,134, 74,165,250,204,147,197,229,114, 44,219,180,168,121, 69, 33,207, 91,250,250,125,118,185, 11,164, -187,213, 51,109, 38, 20,153,206,233,212,185,219,152, 94,189, 7,177, 40,173, 22, 55,110, 92,198,161, 67,187,225,233,238,138,186, -245,155, 98,230,172,217,166, 42, 53,229,123,235,214,245,197,102, 79, 30, 92,207,203,205, 94, 82, 17,231,255, 56,174, 20,138,171, - 43,101,118, 29,150,165, 32, 11, 67, 56, 72, 11,119,173,204,205,205,119,234,116, 58, 79, 19, 19, 19,208,217,239,240,250,197, 83, -100, 73, 57, 80, 41,116,160,153, 2,177,165,151,112, 81,169,113,255,198, 37,108,221,242, 43, 50, 51, 51,225,222,165, 43,242,217, - 53, 80,179, 70, 77, 40, 21,242,194,135, 6,208,168,181,176,182,117, 70, 72, 72,152, 54, 87, 38, 43,183, 66,226, 10, 52,110, 53, -109, 93,161,210,116,128,128,199, 67, 78,158, 26,210, 66,145,117,236,236, 8,168,228, 10, 80,106, 13, 40,181, 22,214, 53,135,162, -161,109, 55,208,186,203,141,171,148,124,180, 14,154,216,251,208,196,222,135, 81,135, 89,248,211,111, 84,169,134, 84,191,117,119, -211,211,211,211, 34, 35, 35, 47,135,134,134, 14, 30, 49, 98, 4,238,222,189, 59, 5,192,180,194,238,155, 41, 35, 70,140, 64,104, -104, 40, 34, 35, 35, 47,167,167,167,167,125,139,156,231,241,120, 10,149,170,160,141, 21, 10,133,130, 74,206,117,108, 51,100, 8, -153, 19, 18,146,187,229,209,163,149, 7, 14, 30,228,246,232,222,157,208, 82, 20,104,157, 14,245, 93, 92,136, 94,189,122,137,252, - 79,159,182,100,105,181, 79, 22,250,248, 4,238, 25, 59, 54,239,153, 76,166,239, 64,243, 90,133, 93,134, 0, 80,171,130, 99,122, - 67,165, 82,109,255,241,135, 9, 61,130,238, 63,172, 81,179,134,163,201,141, 91, 65, 97,124, 35, 30, 89,183,118, 61,150, 52, 39, -139,189,102,229, 82, 35,149, 74,165,175,104,117,179,178,178,194,167, 79,159,240,225,195, 7,168, 84, 42,104,181, 90,208,114, 25, -212,210,108,168,115,178, 64, 40, 21,224,235,116, 80,102,164,162, 86,221, 58,192, 95, 51, 18, 43,237,138, 42, 75,104, 21,125, 10, - 76, 76,192, 21,137, 65,114, 56,122, 47,142, 14,160, 85,219,182,109, 79,159, 59,119,142, 59,113,226,196,118,183,111,223,222, 9, - 32, 62, 57, 57,185,251,242,229,203,159,237,220,185,147, 63,117,234,212, 6,155, 55,111, 30, 7, 96, 95,121, 36, 74,165,242,244, -149, 43, 87, 70, 59, 59, 59,219,134,135,135, 67,169, 84,130,166,105,244,233,211, 7, 40, 24, 91, 3, 0,120,251,246,173, 66,169, - 84,166, 69, 68, 68,228,198,199,199,107,160,199, 44,193, 85,219, 37,143,115, 63,221, 31, 98,107,231,248, 68, 96, 84,171, 54,147, - 31, 50,120,238, 48,199, 77, 91,206, 38, 43,175, 71, 71,231,253,212,179,206, 6, 89,222,171, 25,102, 78,249,187,174, 7,196,232, - 51, 16,190,120,118,161,165,165, 37,216,108, 54, 56, 28, 14,184, 92, 46, 8,130,192,172, 89,179,176,127,255,254,202,186, 14, 63, - 19, 89,198,198,198,145,171, 87,175,118,154, 58,117, 42, 87, 32, 16, 64, 42,149,226,216,177, 99,152, 52,105, 18, 14, 29, 58, 84, -230,248, 23, 61,186,148, 74,123, 75,231,140, 29, 59, 22,106,181, 26,222,222,222, 56,112,224,192, 28,157, 78, 23, 84,141, 71,250, - 73, 88, 88,152, 75, 88, 88,152, 9,128, 1, 35, 71,142, 60, 50,116,232, 80, 4, 5, 5,225,242,229,203, 93, 81, 48,233, 67, 1, -192, 15,128, 77,225,103, 69,207,167,200,214,214,118, 55, 77,211, 3,172,173,173,195, 92, 93, 93,155, 28, 63,126,220, 44, 45, 45, -173,104,242, 3, 98, 99, 99,113,248,240, 97,201,193,131, 7,115,117, 58,157, 37, 73,146, 87,178,179,179,151, 84, 32,216, 14,110, -217,178,101, 66, 97,119, 32,206,157, 59,199,252,250,235,175,196,242,229,203, 33,149, 74,225,233,233,137,189,123,247,206,206,207, -207,111,254,235,175,191,254, 48,124,248,112,172, 89,179, 6, 50,153,108, 75,101, 47, 43, 21,136, 47, 2, 64,199, 45, 91,182, 56, -207,153, 51, 7,231,206,157, 67,171, 86,173,140, 98, 98, 98,246, 0,152, 92, 86,254, 49, 12,131,152,152, 24,200,229,114, 60,124, -248, 16, 43, 87,174,148,150, 16, 89,179,167, 77,155,182,118,246,236,217, 88,191,126, 61, 19, 30, 30,158, 54,116,232, 80,219,253, -251,247,179,234,215,175, 63, 91, 46,151,255, 99, 66,171, 65,125,139, 13,109, 90,117, 94,108,239, 88, 31,199,142,159, 64, 86, 86, - 86,113,154, 20,165, 11,195, 48,200,203,203,195,167, 79,159, 96,106, 98,140, 77,155,215,126, 55,125,202,132, 26, 40, 8,131,241, -165,203,178,174,249,230,161, 35, 39,206,247, 30, 61, 1,225, 97, 47,225,127,100, 31, 34,194, 67,139,249, 40,173, 6,239,162, 94, -224, 93,212, 11,216,218, 57,163, 87,143,174,196,168, 81,163,250,140, 29, 61,210, 26,192,223, 22, 58,226,255,177, 55, 11,248, 50, -142,214,254,207,132, 86, 37,238, 58, 43,115,115,243,200, 83,167, 78, 89,186,187,187,179, 40,138,194,245, 27, 55, 48, 99,218,247, - 24, 55,214, 23, 26,152,131, 82,115, 65,115, 5,122, 89,162, 80,200,193,128,129, 76, 38, 67,112,112, 48, 24,154,130,255,254, 95, -193, 48,116,177,208, 2, 24,168, 53, 26, 56,214,108,128,221, 7,214, 81,224,112,158, 65, 91,118,232,154,220, 76,150, 78, 75, 49, - 72, 78, 75, 64,130, 36, 2,166,198, 53,193,230,212, 68,102,182, 28,108,210, 14, 90,229, 91,232, 10,175,149,203,146,160,208,124, - 93,254,233,202,240,158, 50, 85,168,116, 21, 10,197,209,163, 71,143,126,247,219,111,191,241,250,246,237,235,122,246,236,217,142, - 0,208,183,111, 95, 87, 19, 19, 19, 28, 61,122, 84,173, 80, 40,142,126, 67,143, 79,183,182,109,219, 66, 42,149, 34, 54, 54, 54, -172,194,123, 83,171, 45,197, 54, 54,172,180,187,119,181,233, 82,105,141,110,221,186, 17, 90,138, 2, 73, 16,200,202,201, 65,124, - 92, 28,204,204,204,136,200,183,111,197, 59,102,206,188,224,218,164, 9,187,104, 70,162, 62,184,124,249,178, 16, 5,227,178, 42, - 60, 86, 69,200,210, 82, 63, 77,240,241,241,185,112,244,232, 49,211,212,180,212,119,124, 30,143, 18,139, 5, 14, 99,199, 76,103, -103,103,103,143, 6,144,175, 47,153, 84, 42, 69, 76, 76, 12,140,140,140,192,229,112, 64, 43,228,208,201,242,161,204, 74, 7, 75, -163, 6, 79,167,131,133,144,143, 26,182,182,168,105,109,165, 23,231,135, 59, 55,139, 7,190,151,236, 46,220,212,214, 13, 60,145, - 24, 60, 99, 49,166, 7,220, 43,124, 27,229, 2,203,127,214,135,214,202,209,209,241,207,227,199,143,115,211,211,211, 17, 26, 26, - 26, 6, 32, 7,128, 49, 0, 58, 42, 42,234,118, 68, 68, 68,191,194, 89,119,149,205, 22,251,245,252,249,243, 61,221,221,221,169, -218,181,107,139,210,210,210,106, 72,165, 82, 90, 34,145,124,230, 18,186,121,243, 38, 63, 47, 47, 79, 70,211,244,133, 66,145, 85, -105,252,162,185,195, 28, 5,193, 33,152,229,225, 85,171,169,137, 85, 51,100, 81, 33, 77,159,132, 73,102,205, 29,230,184,125,203, -217,100,165, 17,161, 58, 66,232, 18,107,176, 5, 74,125, 7, 49, 51, 64,193, 88,169,224,224, 96,196,199,199, 35, 38, 38,230, 51, - 65, 53,101,202, 20,248,251,251,235,229,209, 18,137, 68,235, 87,173, 90,229, 52,103,206, 28,110, 9, 81, 4, 31, 31, 31,228,228, -228,224,192,129, 3,240,241,241,169,114,195, 95, 10,117,186,117,235,214,215,222,222, 30,153,153,153,176,179,179,131,187,187,123, -255,160,160,160,218, 0, 98,171, 89,238,167,123,121,121,173, 93,189,122, 53,180, 90, 45, 38, 77,154,132,247,239,223,159,126,255, -254,253,214,154, 53,107,206, 90,180,104,145,173,173,173, 45, 70,140, 24, 33,162, 40,106, 72,121, 36, 22, 22, 22,126,251,246,237, - 27,221,183,111, 95, 82,163,209,116,185,115,231, 14,226,226,226,160, 86,171, 65, 81, 20, 62,126,252, 8, 31, 31, 31, 73,225,236, -198,143,122,216, 53,113,217,178,101, 19,102,205,154,133,141, 27, 55, 98,213,170, 85,191,155,154,154, 54,105,209,162, 69,203, 85, -171, 86, 97,225,194,133,112,118,118,134,165,165,101,195,229,203,151,187,205,155, 55, 15,219,183,111,199,202,149, 43,127, 7,112, -184, 58, 9, 65,211, 52,177, 97,195,134,230, 91,182,108,177, 47, 18, 89, 36, 73,226,212,169, 83, 8, 9, 9,233, 31, 29, 29, 93, -214, 53,123,237,236,236,166,216,219,219,243,110,221,186, 37,118,118,118, 6, 69, 81,218, 66,145,181,163,102,205,154, 51, 62,126, -252,136,190,125,251, 34, 58, 58,250, 40,128,113,166,166,166,178,121,243,230, 9,141,140,140, 76,229,114,249, 63,213,120,131, 69, - 18,227,215,175, 89,136,231, 33,111,113,254, 60, 23,207,159, 63,135,173,173, 45,248,124, 62, 24,134,129, 74,165, 66,122,122, 58, -180, 26, 21,154, 54,174,131, 63, 14,110, 64, 90, 90, 58, 64, 18,229, 14,185, 33, 72, 98,204,132,239, 7,227,193,195, 27,216,179, -103, 31,242,243,101,229,188,124, 11, 80,223,213, 13,142, 14, 54, 72, 76, 74, 4, 65,194,234,239,188,215,255,231, 93,135,197, 85, - 16,244, 9,239, 80, 18,102,102,102, 91, 79,158, 60,105,233,233,233,201,146,201,100,160,105, 26,157,221,221, 49,107,206, 28, 92, - 62,126, 28, 46,237,188, 65,168,197,160,132,250,205,122, 80, 42,228,104,212,178, 35,134,143, 24,137,132,248,120,120,245, 27, 10, -165, 82, 94,252,134, 81,228,209, 82,171, 53,176,178,169,129,155, 55,111,178, 48,105,210,107,236, 40,219, 41,161,211,240, 94,189, -251,168,236,148,173, 8, 65,240,115,127,104, 84, 26, 52,109,186, 28, 26,218, 18, 54, 78, 83,160,213, 94, 68,110,250,157,130,110, - 12, 75, 79, 36, 37, 36,128,100,113, 35,171,155,130,180, 44,253,171, 42,221,156,156,156,156,152,152,152,179,193,193,193, 99,134, - 12, 25,130,155, 55,111,254, 0, 0, 67,134, 12, 65,112,112, 48, 98, 98, 98,206,230,228,228,228,124,139,220,182,183,183, 31,208, -181,107, 87,239, 54,109,218, 32, 32, 32, 0, 12,195, 60,208,235,193,230,112, 24,146, 36, 65,211, 52, 8, 0,153,217,217,120,255, -254, 61, 50, 51, 50,160,213,106, 33,203,207,167,221, 92, 93,243, 25,154, 54,174,138, 61, 37,103, 24,162,140, 89,135, 69,199,170, -113,171,241,207,158, 60, 74,200,203,207,183, 54, 55, 51,207,227,241,120, 58,105,118,118,206,235,200,112,181,158,141, 67, 17,162, - 34, 34, 34,154,164,164,164, 32, 33, 33, 1,148, 44, 15, 44,149, 26,164, 74,142,238, 29, 59,192, 8, 12, 4,160,193,161,181,224, -176, 56,200, 43,152,157, 87,105,119,135,174,196, 75, 66,145,200, 34, 8,162,160,187, 80, 36, 2, 79,108,252,153,135, 75,159,242, -196,231,243,143,159, 57,115,198,222,209,209, 17,107,214,172,129,147,147, 83, 67, 7, 7, 7,185,169,169,169,145,173,173, 45, 26, - 53,106,132,142, 29, 59,226,218,181,107,208, 35, 13, 40,134, 97,122, 61,120,240, 96,254,163, 71,143,134,139, 68, 34, 98,230,204, -153,236, 62,125,250,128,207,231, 67, 46,151, 67, 42,149,226,196,137, 19, 25, 52, 77, 23, 77, 74,177, 20, 10,133,135, 9,130,136, -149,201,100,115, 74, 19,254,241, 91, 83,135,180, 44,122, 18,147, 47, 28,236,225, 85,171,105, 55,175, 30,168,227,210, 13,221,188, - 18, 0, 96,131, 5, 59,206,251,151,101,102, 23,204,140,137,195, 55,175,223, 90,233,238,209,109,217,226,252,187,107, 55,238,207, -174,116, 60, 29, 65, 16,160,105,250,179,216, 65,165,127, 31, 55,110, 28, 78,157, 58, 85,105, 58,146, 36, 57,114,234,212,169,220, - 82,158,103, 36, 39, 39,163, 95,191,126, 24, 50,100,200,103, 66,203,202,202, 10,118,118,118,136,139,139, 3,128, 76, 61,203,213, -172,137, 19, 39, 18, 10,133, 2,147, 39, 79,198,129, 3, 7,224,237,237, 77, 4, 5, 5,205, 2, 48,167,170,133,157, 36,201, 77, -139, 22, 45,154,239,227,227,131,172,172, 44, 92,189,122, 21,125,250,244,193,169, 83,167,172,175, 94,189,186,222,211,211, 19, 44, - 22, 11, 1, 1, 1,160, 40,170,194, 88, 95, 92, 46,119, 64,223,190,125,201,196,196, 68,112,185, 92,180,110,221, 26, 73, 73, 73, -144,203,229, 72, 78, 78,198,236,217,179, 63,101,102,102,118,213,247, 57,226,114,185,115,102,205,154,133,147, 39, 79,194,215,215, -247, 8,128,201, 57, 57, 57,195, 31, 61,122,116,114,224,192,129, 72, 78, 78,198,133, 11, 23,176,114,229, 74, 98,220,184,113,216, -181,107, 23,102,207,158,253,123,161,215,169,188,130,159,151,150,150,102, 90,175, 94, 61,164,166,166, 34, 63, 63, 31, 23, 46, 92, -176,185,118,237, 90,109, 71, 71, 71,147,152,152, 24,221,207, 63,255,204,155, 51,103, 14,182,110,221,138,208,208, 80,248,251,251, -163, 91,183,110, 84,116,116,116,153, 94,178,194,144, 13, 23, 24,134,185, 37, 18,137,144,151,151, 87,244,220, 45,240,245,245,245, -241,243, 43,112,178,167,164,164, 96,252,248,241, 99, 3, 3, 3,105, 79, 79, 79, 33,151,203,133, 82,169,148,253,147,173, 54,173, -163, 1,208,168, 93, 67,140, 27,151, 15,226,101, 88, 52, 94,134, 69,128,199, 47, 24, 4,175, 80,200,209,178,105,125,180,107,221, - 22, 41,146,100, 28,245, 63, 8, 11, 43,199, 10,235, 17,134, 97,192,101,235,224,230,106,135,227,254,251, 16,112, 53, 16,254, 71, - 79, 20,143,121, 99,179, 57,104,209,178, 29, 90,183,118, 71,116,204, 71, 28, 60,184, 7,214, 54, 53, 12,157,131,213, 68,113,215, - 97,201,207, 82,202,191,155,187,187, 59, 43, 63, 63, 31, 74,165, 18,159, 62,125, 66, 92, 92, 28,204,204,205, 16,157, 18,139,174, - 66, 13, 62,209,185,136, 10,139,212, 17, 44, 78,104,101,127,216,215,163, 5,224,209, 2, 51, 38,122, 87,240,202,202, 64,100, 98, - 85,208,117, 67, 81, 31,176,125, 59, 85,158,208,162,116,218,219, 55,110,221,105, 59,113,220, 0,206,205, 59, 7,160, 85,211, 80, -104, 77, 33, 83,170, 33,211,112, 64,154,246, 1, 50,130,192, 98,243,209,190,121,125, 92, 56,127, 77,195, 80,218, 64,189, 19,200, -182, 9,168,212,136, 18, 66, 43,173, 84,191,131,133,222, 93,135,197, 13,175, 78,119,234,216,177, 99,131, 58,116,232, 32,244,244, -244,172, 87,216,112,106,142, 29, 59, 38, 47, 12,134, 89, 85,124, 22, 13,222,206,206,174, 37,151,203,245,238,211,167, 79,203, 9, - 19, 38,224,245,235,215, 56,122,244,232,187,250,245,235,223,149, 72,202,159,145,205,226,241, 50,243,211,210,204,196,181,107,179, -205,141,141, 83,174, 93,189,234,220,163,103, 79, 34, 33, 33, 1,153,153,153, 80, 42,149, 8, 13, 11, 99, 56, 44, 86, 18, 97, 98, - 66,190, 13, 9, 33, 89, 60, 94,102,121,222,198, 50, 16, 87,201,172, 67,191,234,122,183,106,216,155,215, 91,233,251, 99, 29,165, - 74,217, 36, 55, 55,151, 98,115, 56, 28, 39, 59,179,248,183, 31,245,175, 19, 85, 42, 85,192,237,219,183, 7,245,232,209,131,255, -238, 85, 40,168,156, 28,168,115,164,224,210, 58, 88,180,108, 14,150, 70, 5,168,181,112,116, 99,160,204, 22, 34,232,233, 91,173, - 74,165,170, 52,168, 97,145,208, 34, 75, 9, 3,158, 88, 12,190,177, 9,248, 98,113,105,193, 80,217,155,156,176, 87,175, 94,221, -219,183,111, 15,134, 97,176,127,255,126,104, 52, 26,158, 70,163,129, 90,173,134, 70,163, 65,110,110, 46,252,253,253,177,123,247, -238, 71, 0,126,215,227,246, 41, 35, 35,163,129, 4, 65,216,176,217,108,185,181,181,181,232,212,169, 83,197,225, 38, 90,180,104, - 1, 99, 99, 99, 46, 10,131, 66,218,216,216,112, 14, 29, 58,100,214,191,127,255,251,101,118,119, 52,109,184,176, 14,101,238, 33, - 48,170, 85,219,196,170, 25,234,184,116, 3, 0,244,236, 55, 17,117,234,215, 68,110,198,171,218, 74, 69,220, 96, 46, 91,106, 30, -185, 61,249,181, 81,223, 38, 19,100,105,247,222,163,236,233,253,101, 54, 20, 36, 73,150,219, 29,171,143,200, 42,208, 44,164,117, -209, 56, 31, 0,200,204,204,132, 68, 34, 65, 84, 84, 20, 26, 52,104,128,172,172, 44, 56, 58, 58, 66,173, 86,163, 77,155, 54, 80, - 40, 20,216,178,101, 11, 30, 62,124,248, 8,192,108, 61,254,195,200,197,197,101,124,203,150, 45,113,245,234, 85, 60,127,254, 60, -249,198,141, 27,142,238,238,238,168, 93,187,246,132,216,216,216,165,133, 93,125,250, 66,228,238,238, 62,211,199,199, 7, 17, 17, - 17,248,241,199, 31, 51, 19, 19, 19, 47,156, 62,125,122,242,202,149, 43, 73, 47, 47, 47, 72, 36, 18,108,218,180, 73,247,240,225, -195,205, 0,214, 84,146,142,111, 18, 19, 19,157,148, 74, 37,178,178,178, 64, 81, 20,228,114, 57,174, 93,187, 6,127,127,255,212, - 66,145,245, 65, 95,227,154, 55,111,222,136, 36, 73,156, 60,121, 18, 0,126, 66, 65,196,254, 11,131, 7, 15, 78,254,249,231,159, - 29,151, 44, 89,130, 31,126,248, 1, 26,141, 6, 27, 55,110,196,146, 37, 75,174, 20,138,172,138, 42,209,223,236,236,236,166,252, -248,227,143, 13,231,205,155,135,224,224, 96,155, 23, 47, 94,180, 14, 13, 13, 69,141, 26, 53,144,153,153,201,182,180,180,196,214, -173, 91, 49,119,238,220,115, 0, 50, 30, 63,126, 60, 50, 38, 38,198, 15,192,166, 74, 68,251, 94, 71, 71,199, 41, 12,195, 48,114, -185, 60,206,215,215,119,211,186,117,235, 48,119,238, 92, 68, 70, 70, 34, 39, 39, 7,198,198,198,196,162, 69,139,198,255,244,211, - 79,152, 52,105, 18, 35,147,201,118,255,211, 13, 53,195,232, 32,151, 70, 64,167, 50, 71,139,166, 13,208,162, 73, 45,220,184,243, - 18, 0,208,125,168, 59,228,178, 60, 28, 57,178, 31, 31, 62,188, 7,155,195,129,153,133,157, 62,158, 64,168,115,223, 32, 91, 35, - 65, 15,207,214,232,227,213, 21,191,255,113, 10,148, 86,131,201, 19, 71, 67,154,157,141, 63,254, 56,136,232,152,143, 96,115, 56, -176,180,250,251, 3,161, 86,164, 69,254,223, 11, 45, 61,186,159, 64,211, 52,146,147,147,241,226,197, 11,196,198,198, 66, 40, 20, - 66, 65,233,232, 61,183, 31,210, 4,193, 77,162, 25,230, 17, 67, 21, 71, 41,254,146, 67,167, 75, 46, 17,177,214,212,220,220,156, -167, 82, 41, 64, 81,218, 18,173, 10, 1, 16, 0,151, 13,216, 59,212, 65, 98, 66, 34,163, 84, 42,239, 85,248, 6,165, 82,110,189, -116,225,140, 79,199, 78,238, 86,125,186,175,198,133,139,203, 33,205,205,133, 82,195,129, 76,169,129, 92, 9,152, 89,184,162, 77, -211,102, 72, 73,201,196,171,231, 65,249,108,149, 92,159,129,162,239,119, 44,155,232, 50,113,198, 66, 24, 57,119,130, 42,234, 2, -232,252,212, 98,143,150, 64,108, 14,139,154,110,200,150,169,112, 38,240, 37, 80,133,165, 94,210,210,210,228, 44, 22,235,152,143, -143,207,198,151, 47, 95, 56, 1,192,203,151, 47,147, 36, 18,201,226,180,180,180,170,250,164,139,162,193, 19, 2,129,209,203,250, -245,235,167,180,110,221,218,116,240,224,193,176,178,178, 66,104,104, 40,252,252,252,222,104, 52,154,133, 65, 65, 65, 21,118,245, -168,213,234,228,151, 23, 47,154,116,253,254,123,179,133,253,251,111,242,241,241,217,186,102,205, 26,142,139,139, 11,161,213,104, - 16, 30, 30,206, 28, 63,118, 76,187,123,201,146, 45, 60,145,136,253,236,210, 37, 14,165, 82, 37,255,167, 11,177,163,163,163,135, -123,151,206,110,155,127,219, 14,165, 34, 31, 79,131,175, 64, 42, 77,199,190,253,231,221, 28, 29, 25,143,228,228,228, 32,125, 5, -240,225,195,135,231,183,107,217,178,101,221, 26, 53, 16, 30, 31, 11, 30,173, 3,151,162,192,210,168, 64, 82, 74,212,104,194,128, - 32,141, 33,249,148,139,117, 39,207, 70,232, 35,140, 27,126, 55, 0,107,146,114, 64, 16, 4,126,237,208, 4, 60, 99, 49,184, 34, - 49,166,255,121,167, 88, 24, 4,172, 89, 2,158, 88,140,122,237,244, 10, 8, 47,191,123,247,238,139,240,240,240, 54, 77,154, 52, -193,252,249,243, 17, 23, 23, 7,154,166,145,154,154,170,148, 72, 36,201,233,233,233,113, 40,136,255,115,160,146, 70,172,164,234, -112, 12, 10, 10, 42,238,110, 8, 12, 12,132,131,131, 3, 76, 77, 77,145,155,155,139,169, 83,167,154,173, 88,177, 2, 0,240,226, -197, 11,148, 20, 40,165, 17,254, 50,106,115,118, 30, 35,101,242, 67, 6,103, 81, 33, 77,187,121, 37,162,103,191, 9,184, 21,240, - 59,238,220,184, 13, 11,118, 92, 44, 68,121,215, 50, 98, 51,114,147,100, 46,123,221, 90, 77,102, 73,100, 55,246,206, 28,240,142, -101,111, 79,159, 89,178, 39, 55,187, 34, 91, 93, 92, 92, 96,107,107, 91, 60, 70,139,205,102, 99,210,164, 73, 96, 24, 70, 95,145, - 85,216,214,208,233, 74,165,210, 86, 32, 16,224,211,167, 79,248,248,241, 35,162,163,163,139, 67, 7,208, 52,173, 93,176, 96, 1, -103,230,204,153,216,179,103, 15,238,221,187,247, 8,192,106, 0,250,190,172,141, 30, 49, 98,132,177, 90,173,198,137, 19, 39, 40, - 0,253,206,156, 57,243,162, 77,155, 54,236,222,189,123, 27,239,218,181,107,116, 97, 30,233, 45,180, 76, 76, 76,184, 26,141, 6, -187,118,237, 66, 98, 98,162, 7,128,168,103,207,158,237, 29, 49, 98,196,238, 38, 77,154,212,143,136,136,120,159,159,159, 63, 29, -192,171,202,200, 82, 83, 83, 39,182,110,221,250, 12, 77,211,206, 61,122,244, 16,253,246,219,111, 38,111,223,190,133,147,147, 19, -104,154, 14, 71, 21,151,176,122,255,254,125,148, 68, 34,113,235,218,181, 43,174, 93,187,182, 65,167,211,173, 7,176,113,218,180, -105,142,241,241,241,104,217,178, 37, 44, 44, 44,240,246,237,219, 60,137, 68,178, 27, 5, 75, 18, 85,230,194,141, 1,176,120,239, -222,189,205,246,238,221,235,109, 97, 97,209, 62, 52, 52, 20, 15, 30, 60,192,230,205,155,177, 98,197, 10,116,238,220, 25,243,231, -207,207, 0,224, 13,128,138,137,137,209, 43,110, 94,145,103, 11, 0, 90,181,106,149,226,231,231,135,201,147, 39, 51,135, 14, 29, -218,118,236,216,177, 57,163, 71,143, 46,110, 3,199,143, 31,207, 28, 61,122,116, 60, 10,150, 97,250, 39,161,213,104,212, 48,177, -168,131,252,236, 4,164, 39, 6, 67,104,108, 7,175,110,205, 33, 87,168,113,249,210, 57,188, 10, 15, 3, 73,146,176,181,171, 1, - 51,115, 43,188,123,247, 30,168,120,182,177, 86,163,209,192,216,188, 22,242,115, 18,161, 78,123, 9, 35,177, 13, 38,124, 63, 24, -114,133, 6,231, 47,156, 67, 68,196, 43,176, 88, 44,216,217,215,128,169, 89, 1, 39,193, 84, 60,131,217, 0, 0,101,196,211,170, - 84,104,177, 88,172,187,215,175, 95, 31,214,174, 93, 59,246,135, 15, 31,240,225, 67,193,203,141, 84, 42,165, 8,232,206,166,133, - 95, 26, 85,193,229, 61, 80, 56, 59,163,228,218,133, 98, 99,227,228,183,111,162,108,165, 89,169, 8, 11,121,136, 15,239,194, 17, - 27, 29, 5,141, 70, 9, 22, 73,130,100,145,168, 85,167, 49, 30, 62, 10, 86, 43, 41, 42,184, 60,206, 2, 59,162,243, 68, 54, 46, - 35,215,174, 89, 26, 48,119,225, 42,163,225,195,246,224,213,219,215,200,167,236,192, 48,128,157,165, 8, 45,234, 46, 66,114, 74, - 58, 78,254,190, 75, 78,107, 52, 99, 74,197,208,250,130, 19, 0,108, 51,208,104,247,254,223, 39, 29,240, 63,190,106,225,204,169, -182, 3,135,140, 1, 47,235, 53,180, 41, 47, 81,167, 77, 31, 16,124, 51, 92,189,121, 7, 65, 47, 94,167,210, 58,102,149,109, 38, - 14,189,171,132,179, 36,178,179,179, 31,127,250, 36,113, 42, 17, 5,222,137,207, 23, 84, 54, 59,174, 52,231,103, 17,231, 89, 44, -178,213,218,181,107,181,182,182,182,154,136, 61,213,231,155, 0, 0, 32, 0, 73, 68, 65, 84,136, 8,236,217,179,135,126,249,242, -229, 77,146, 36,119, 72, 36, 18,101,101,156,214, 90,109,216,113, 95,223, 70,109,135, 12, 97, 70,205,156, 41, 7,159, 63,107,211, -175,191,250,166, 75,165, 14, 12, 77,195,218,194, 34,105,211,146, 37,126,195, 70,140,144, 70, 62,124,104, 20,124,241,162, 17,143, -162, 94,234, 97,231,183, 64,185,156,201,201,201, 65,247,238, 61,192,145, 3,191, 65,163, 81, 65,146, 28, 15, 0,200,200,204, 65, - 37, 34,171, 52, 39, 35,151,203,135,252,180, 98,197,147,159,230,206,177,235,210,189, 7, 18,194, 66,161,201, 74, 7,161,165,192, - 33,216,144,165, 9,145,150,154,143,197, 71, 79,167,229,203,229, 67,202,104, 36,202,180,179,200, 99,197, 55, 49, 6, 87, 36, 6, - 79,108,252,153, 23, 75, 96, 98, 2,158, 72, 12, 54,143, 87,214, 0,238, 47, 56,243,243,243,135, 14, 27, 54,236,213,179,103,207, -204, 39, 79,158,140,142, 29, 59,134, 40, 20, 10, 79, 0,121,213, 77, 79,154,166,147,187,116,233, 66, 18, 4, 33, 30, 51,102, 12, - 63, 61, 61,189, 56,178,122,126,126, 62,174, 93,187,134, 6, 13, 10,102,245, 71, 70, 70,162,113,227,198,229,114,254,176, 56, 34, - 25,192,154,185,195, 28, 55, 61, 9,147,204, 2,176,161, 78,253, 26,184,115,227, 54, 30,220, 9,246,109,223,132,222,254,221,152, - 54, 63, 11, 61, 71, 44,116,107, 53,153, 37, 54,177,199, 31,231,207,177,162, 94, 30, 92, 39,151,135,215,195,158, 11, 11,202,179, -147, 32, 8, 48, 12,243, 69, 40, 7, 22,139,133, 99,199,142, 85,245,222, 79, 31, 56,112, 96,218,143, 63,254,200,149, 72, 36,120, -243,230, 13,100, 50, 25, 4, 2, 1,110,220,184, 65, 1,216,117,236,216,177, 27,199,142, 29,235,141,130,217, 68,129, 85, 41,159, - 34,145,200,199,203,203, 11,111,222,188,193,243,231,207,207, 1,120, 21, 18, 18,114,238,195,135, 15, 35, 59,119,238,140,223,127, -255,221, 71,161, 80, 28,168, 10, 39, 77,211, 37, 99, 38, 21,173,248, 16,150,159,159,223, 62, 56, 56,184,170,249, 46,201,204,204, -236, 84, 40,172, 19,109,109,109, 77,194,194,194, 80,179,102, 77,104, 52,154,118, 85, 45, 75, 57, 57, 57,191,237,216,177,227,208, -196,137, 19,241,243,207, 63,143, 57,125,250,244,152,239,190,251, 14,125,251,246,197,225,195,135,241,234,213,171, 13,208,111, 89, -177,178,238,253, 21,128, 87,182,182,182, 51,106,212,168,129,205,155, 55, 35, 60, 60,220,111,205,154, 53, 75, 94,189,122,133, 6, - 13, 26,240,163,162,162,168,234,212, 33, 0, 96, 98, 98, 98,162,213,106,113,241,226,197,167, 0,230,142, 25, 51,198,102,235,214, -173,222, 98,177, 24, 89, 89, 89,138,136,136,136,209, 0, 46,253,211,117, 29, 67, 16,203, 38,255, 48,107,239, 15,147, 71, 11, 90, -183,106, 1,121,110, 18, 20,249,169,144,231,125,194,142, 3, 55, 65, 16, 36,172,173,237, 97, 99,231,132,248,248, 4, 60,186,114, - 85, 45,147, 43,182,242,180,244,134,138, 57,103, 22,112,182, 44,224,148,203,210,160,200, 79, 43,230,180,177,113, 40,228,140,199, -195,224,171, 74,133, 76,246,155,154, 33,126,249,155,239,253,255, 51,170,182,214, 97, 73, 72,165,210,217, 83,167, 78,245, 92,188, -120,177, 37, 69, 81, 44, 11, 11, 11,196,199,199, 83,103,207,158,205,202,207,207,159, 93, 29,107,216, 28,206, 43, 23,215, 6,158, - 3, 7, 14,164, 6, 12,232,207, 29, 59,177, 55,219,218,198, 6, 57,217,153,120,247, 38, 20,111, 95,191,132, 75,131,230, 88,185, -102, 11, 96,102, 86,233, 66,146,133,203,234,244, 91,253,211,130, 83,157, 60,122,153, 52,104,220,156,219,162,158, 41, 52, 90, 10, - 73, 73, 73,184,116, 49, 76, 19,241,226, 65, 46, 77,169, 71,202, 51,244, 91,130, 39, 8,160,144,137,125, 77,108, 52,199,214,111, -218, 49,127,215,190, 35, 11, 23,207,154, 44,234,236,222, 19,225,183,127,199,185,128, 83, 50,165, 74,189,137,203,194,175, 17,153, -144,191,171, 98, 26, 40,149, 74, 77,233,246, 84,169, 84,106,190, 54,167, 15, 31, 62,140,212,212, 84,117, 92, 92,220,117,138,162, - 78, 87,176,216,243, 23,216, 1,168, 7,171, 84,183,127,114,119,239,253,211,141, 27,130,241,139, 22,169,199,140, 29,187, 0, 42, -149, 6, 60, 30,195, 22,137, 72,240,249,156,200,135, 15,141,182, 77,155,102, 65,168,213,183,142, 84, 16, 54,160, 12,124,243, 89, -135, 69, 30,173,174, 93, 59, 99,252,228,185, 80,148,240,104, 61,126,254, 14, 42, 13,244,246,104, 21, 34, 33, 46, 49,177,253,172, -101, 63,157, 31,233,213,221,173,137,115, 45,190,117,237, 90, 16,219,217, 33, 51, 61, 29, 15,159,191,213,174, 57,117, 62,162, 80, -100,233, 21, 87,134,166,233,130, 65,238, 0,186,207, 94, 12,130,197, 2, 10,195, 56, 20,205, 28,170,221,166, 35, 8, 54, 27, 58, -134,134, 74,165,210,103,208, 95,210,199,143, 31,135,142, 25, 51, 38, 48, 32, 32,128,244,242,242,106,113,225,194, 5,250,107,202, -142, 66,161,104, 15, 0, 2,129, 32,214,204,204,204,113,226,196,137,208,106,181,144,203,229,200,201,201, 65, 82, 82, 82,246,196, -137, 19, 53, 0, 96,100,100,196, 27, 54,108,152, 73,101,156, 91,206, 38, 43,231, 14,115,220,110,193,142,243,206,205,120, 85,219, -130, 29, 23,219,190, 9,189,125,203,217,100,165,137,131,108,109, 70, 92,208, 59,137,236,198,222, 63,206,159, 99,141, 27, 60, 84, -231, 36,126,239, 43,176, 97,206, 86,198, 75, 16,196, 23,193, 73,245, 20, 89,159, 33, 47, 47,111,201,242,229,203,251, 74,165, 82, -167,222,189,123,115,221,220,220,240,228,201, 19, 4, 4, 4, 80,143, 31, 63, 78,148,201,100, 75, 1, 40, 1,220,172, 78,154,186, -186,186,214,102,179,217, 69, 93,105, 59, 11, 15,239,188,112,225,194,200,201,147, 39,163, 86,173, 90,141,162,162,162,248,168,194, -115,196, 48, 76,113, 47,195,183, 4, 65, 16,209,219,182,109,115,180,179,179, 35,174, 93,187, 70,177, 88,172,234,120,110, 14, 31, - 60,120,176,157, 86,171,253, 97,202,148, 41,240,240,240, 0, 69, 81, 56,122,244, 40, 14, 30, 60,168,175,200,170, 16,239,222,189, -123,153,152,152,216,101,193,130, 5,216,188,121,243,146, 5, 11, 22, 32, 49, 49, 17,239,222,189, 11,253, 26,222,220,220, 92, 69, - 66, 66,130,176, 67,135, 14,173, 35, 34, 34, 34, 60, 61, 61, 27, 79,158, 60, 25, 27, 54,108, 96,238,221,187, 55, 12,192,181,255, - 68,235,253,246, 67,150, 63, 71,199,190,177,102,237,111, 43,234,213,173,253,227,164, 9, 35, 88,174, 46,141, 33,203, 73,130,165, -149, 45,156,106,212, 65,122, 90, 6,174, 95,191,166,203,200,200, 62,172, 35,137,213, 31, 62,100,165,124, 13,167,163, 83, 29,164, -165,165,225,234,213,171,186,108,105,238,126,104,201, 53, 81,241,217,169, 48, 64, 31, 79,214, 20, 84, 16, 37,190, 34, 88,153,155, -155,159, 48, 49, 49, 73, 53, 49, 49, 73, 53, 55, 55, 63, 1,232, 53,251,160, 71,137,218,129,245,217, 54,108,152, 0, 2, 65,123, -176,217,243,204,204,205,175,153,154,154,102,118,237,218, 85,189,119,239, 94,101, 84, 84, 36,157,156,156,200,152,154,154,230, 20, -159, 95, 22,103, 41,152,155,215, 53, 22,217, 55, 94, 97,234,212,226,161,216,190, 81,158,216,190, 81,158,169, 83,243, 71, 34,251, - 70,171,204,205,235, 26,235,101,103, 57,168, 99, 3,107, 23, 43,236,106, 96, 77, 40, 92,172,176,171,142, 13,172,245,190,247,138, -187,253,116, 4, 1, 29, 10,166, 97,163, 26,156, 69, 28, 52,139,197, 58,226,228,228,100,143,170, 5,172,251,130,115, 44, 80,107, - 44,159,255,195, 25, 95,223,241,177,247,238,141,201,141,137, 25,149, 19, 29, 61, 34,244,212,169,145, 59, 71,142, 28, 59,138,207, -159, 50, 12,168,171, 47,167,189,189,189,223,203,151, 47, 3,244,221, 74, 8, 47,189,211,179,110, 29,199, 27, 94, 61,218, 49, 62, - 83,135, 48, 62, 83,135, 48, 94, 61,218, 49,117,235, 56,222,248,138, 60, 34, 88, 44,150,183, 80, 40, 60, 33, 18, 10,195, 69, 66, - 97,184, 80, 40, 60,193, 98,177,188, 81,241, 24,170,207, 56, 45, 45, 45, 95,216,218,218,166, 86,101,179,178,178, 10,169,130,157, -163,106,215,174,157, 72,146,228,150, 42, 62,211, 21,113,186, 24, 25, 25, 69,139, 68,162,164,146,155,145,145, 81,201,192, 80,150, - 66,161,240,178, 72, 36,218,170, 15,231, 47,203, 26,175,120,116,115,198,171, 95,150, 53, 94, 81,250,183,153,131,204, 39, 62, 9, - 92,157, 57,115,144,249, 68,125,236,180,177,177,185,103, 99, 99, 35,177,177,177,145,216,218,218, 86,184, 89, 89, 89,189,208,131, - 83, 96,108,108,188,213,216,216, 56, 85, 36, 18,233,196, 98,113,170, 72, 36,218,130, 18,161, 45,170,155,158, 36, 73,110,104,212, -168,145,146,197, 98, 29, 42,245,211,230,122,245,234, 41,217,108,246,166, 42,114,154,116,238,220, 89, 23, 22, 22,198,120,120,120, - 48, 0,204,191, 97,190,219,153,155,155, 95, 51, 49, 49, 73, 48, 54, 54,222, 1, 64, 84, 77, 78, 2,128,183,163,163, 99,104,183, -110,221,228,142,142,142,193, 0, 6,126, 67, 59,251, 14, 26, 52,136, 78, 72, 72, 96, 24,134, 97, 18, 18, 18,152, 65,131, 6,209, - 40, 8, 20,249, 53,117,242,178,105,211,166, 49,143, 31, 63,102, 30, 63,126,204, 4, 7, 7, 51,125,251,246,165, 1,124,255,149, -245, 60,190,213,189,187,213,177,170,219,176,190,249,233,209, 67,221,233,155,151,182, 48, 43,151,254,200,244,244,104,204, 52,168, -103,126,222,197,197,210,229, 91,112,174, 88, 58,149,233,209,165, 17,237, 86,215,252,148, 91, 29,171,186,255,240,189,255, 27,189, - 90,248,187, 7,156,253,229, 90,252, 92, 44,149, 13, 7, 7, 7,100,102,182, 19,176,217,238,124, 62,223,147,100,177,238,102,165, -167,207, 41,124,221,210,253, 83,174,218, 10, 27,244,186,224, 85,176, 36, 65,117, 56, 63, 27,200, 94, 77,206,170,112,232,197, 89, -222,162,210,180, 74,149, 98, 73, 81, 47,118,160,194, 52,248,140,211,209,209,241, 7,154,166,107,235,107, 16, 73,146,177,201,201, -201, 7,170,147,158,245,235,215,103, 10,187,183,137,111,153,239,127, 71, 89,250, 95,226,252,227,183,166, 14, 13,154, 54, 92, 24, -254, 50,106,115, 97,183, 98, 49, 86,205, 52, 55,118,239,214,117,249,195, 59,247,126, 94,181, 67,154,247, 31,190,119, 18,122,142, -105,251, 6,156, 69, 65, 66,171,196,201,225,112,246,182,109,219,246,135, 39, 79,158, 28,210,233,116, 83,254, 71,203,103, 95, 22, -139,181,192,213,213,181,197,187,119,239, 66,117, 58,221,102,148, 17, 40,178, 26,118, 46,173, 93,187,246,116, 46,151,203,207,207, -207,151,166,164,164, 44, 7,112,250,191, 45, 61,221,234, 91,180,102,152,226,160,219,235,222,124,204,122,246,205, 56, 25, 90, 71, - 51,172,181,239, 98, 50, 67,254, 3,249,254,111, 19, 89,251,255,137, 63,238, 97,224, 52,112, 26, 56, 13,156, 6,206,111,206,105, -100, 72, 79, 3,231,191,144,243, 95, 9,182, 33, 9, 12, 48,192, 0, 3,254,223, 65, 97, 72, 2, 3, 12,248,175, 67, 73,175, 86, -177, 55,139,168, 64,149, 86,197, 37, 88, 29,101,123,219,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,231,255, 28,231,191, 85, -100,237,175, 96,255,111,131,193,173,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,127, 65,104,149,185,111,232, 58, 52, -224,111,199,246,193,112, 4,128, 89, 23,144,252,119,156,111,128, 1, 6, 24, 96,128, 1,255, 97,236, 71, 57, 93,135,255, 13, 66, -203, 1, 64,123, 20, 44,124,251, 22,192, 3, 0,210,175,224,179, 2, 48,130, 32,136,225, 0,192, 48,204, 25, 20,204, 26,201,208, -231, 98,129, 64,144,170, 84, 42,109, 10,191,167, 41,149,202,146,107, 25, 16,248,114, 54, 27, 83, 98, 43, 19,181,107,215, 78, 85, -169, 84, 54,122,252,125, 14,195, 48,175, 72,146, 12, 23,139,197,119,222,189,123, 23, 80,149, 27,247,244,244, 28,207, 98,177,214, - 1,128, 78,167, 91,118,247,238,221, 35,127, 99,190,181,171,225, 96,247,187, 70,171,161, 82,211,179,150,227,203, 64,126, 0,128, - 93,253,224, 71, 80, 88, 88,248,125,211,140,128,138,227,232, 84,245,252, 10,208,154,195,225,248,216,218,218,246, 73, 74, 74,122, - 1, 96, 17, 80,121, 84,227, 26, 53,106,124,207,102,179,199,232,116,186,186, 44, 22, 43,154,162,168, 99,137,137,137,254,134, 58, -196, 0, 3, 12, 48,192, 0, 61,196,214, 23,168,146,208,106, 96, 9, 59, 6,240, 6,129,158, 96,112,139, 0, 78,190,205,196, 39, -125,175,255,174, 1,180, 90,170,224, 63,185, 36,116,215, 62,146,251,251,244,233,227, 52,115,230, 76,116,236,216, 17, 79,158, 60, -233,112,248,240,225,137,167, 79,159,126, 69,211,244, 93, 0, 79, 0,189, 66, 41,136, 80, 16,167,101,116,159, 62,125,122,172, 91, -183,142,213,184,113, 99, 40, 20, 10,220,187,119,207,125,211,166, 77, 91, 31, 61,122,116, 27,192,241, 66, 65, 80,238, 2,120, 74, -165,210,166,104, 49, 78,130, 32,108,134, 13, 27,246,172,164,184, 42, 92, 95,141, 96, 24,230, 49, 65, 16,193, 58,157,238,201,217, -179,103, 19, 27, 0,237,166,214,230,158,157, 19,171,113, 42,205,169, 82,169,108, 46,254,178, 30,108, 62, 31,170,188, 92,116,152, -240,151,232,189,181, 98, 33, 8,154, 2, 11,140,212,115,237,214, 87, 0,194, 83, 82, 82, 94,121,120,120,196, 86, 53,135, 89, 44, -214,186,235,215,175,219, 51, 12, 3, 47, 47,175,117, 0,254, 46,161,197,111,223,186,249,221,203,231, 78, 8,242,179, 82,209,123, -224,200, 99,239, 19,211,198, 3, 56,247,153,104,234, 3, 91,130,192,194,105,235,143,179, 0, 96,247,210,209,139,182,244,194,246, -185, 55,241, 9,128,103,161,248, 1,128, 95, 0,220,221,213, 7,182, 0, 22, 79, 91,127,156, 0,128, 61, 75, 71, 47,220,213, 7, -219,102, 92,171,114,216,138,233,227,199,143,223,190,110,221, 58,150,189,189, 61,146,147,147,123, 55,106,212,200, 53, 55, 55,183, - 17, 42, 24, 68, 92,171, 86,173, 83,157,187,245,175, 51,100,184,183,208,218,202, 28, 41,146, 12,147, 83, 39, 14, 77,101, 61,190, -215, 39, 46, 46,110,164,161, 14, 49,192, 0, 3, 12, 48,160, 28, 84, 63, 50,124, 75,123, 24,201, 52, 24,196,102, 17,223,119,106, -221,168,251,168,239, 58,147,141,220,234,227,117,100, 84,175, 75,119,158,110, 34,131, 35, 3, 41, 29,227, 47,226,226, 98,136,164, -226,153, 48, 90, 10,236,155, 23,143, 23,180,132, 19, 71,179,158, 61,123, 86,191, 85,171, 86,197, 75,195,116,239,222, 29,221,187, -119, 39,118,239,222,221,252,230,205,155,205, 15, 30, 60,168, 9, 12, 12,252, 29, 21,199, 71,241,169, 87,175,222,166,237,219,183, -243, 61, 60, 60,192,231,243,139,127, 16,139,197,232,223,191, 63,250,247,239,207, 74, 73, 73,241,186,124,249,178,215, 47,191,252, -162,142,143,143, 95,128,191,162, 52, 87,136,229,203,151,183, 46,227,240,117,130, 32, 62, 82, 20, 21,218,188,121,243, 68, 87,160, -254,212,239, 58,222,154,222,201, 69, 52,103,201,225, 50,121,216, 60, 30,254, 24, 95,208, 86,151, 20, 90,177,119,174, 65,108, 98, -156, 41, 52, 54,126, 5, 32, 28,192, 43,134, 97,194,163,163,163,163, 26, 2,205,219,155,147,191, 31,146,210,205,170, 32,182,144, -152,152, 8, 83, 83, 83, 35, 15, 15, 15, 9, 65, 16,171,238,221,187,247,173, 7,228,181, 91,181,112, 58, 87, 26,247, 10,159,222, - 60,198,188,225,238,194, 57, 59,254,252, 89,169,214,158,171,232, 34,130, 32,201, 95,130,105, 95, 20, 44,198,187, 60, 51, 51,211, - 3, 0, 44, 45, 45,121, 0,238,110,121,138,239,230,118, 34,190, 38,182, 27,151,197, 98,237, 58,124,248,240,228,239,191,255,190, - 96,233,136,135, 15, 33, 22,139,177,102,205,154, 90,243,231,207,247,163, 40,106,118,121,158,172,206,221,250,215,217,182,249,231, - 70,121, 89, 57,170,125,187, 78, 63,119,104,210,128,156,230, 51,223,120,155, 70,101,167,211,233,190, 55,120,182, 12, 48,192, 0, - 3, 12,168,138, 55,171, 82,161,229,106,133, 35, 45,155,184,140, 24,213,215,157,223,180, 73, 99,112,249,127,133,110,105,213,186, - 53, 90,181,110, 77,250,230,231,245,124,246,252,101,207,179, 55,159,168,228,218,248,211,239, 50, 48, 94, 95,171,138, 22,165, 93, - 55,208,182,155, 44, 59, 77, 0, 0, 34, 51, 27,229,210,139,159,238,116,234,212, 9, 78, 78, 78,220,192,192,192, 73,149, 8,173, -165,111,223,190,229,179, 88, 21,199, 67,117,112,112,192,176, 97,195,208,160, 65, 3, 94,215,174, 93,151,150, 39,180, 4, 2, 65, - 26, 65, 16, 54, 0, 96, 97, 97,161, 91,181,106, 85, 40, 83, 0, 0, 96, 24,134,121, 76,146,228, 19,154,166,159,254,249,231,159, - 73,141, 0,155,222,173, 26, 60,152, 62,118,152,144, 57,187,181, 92,145,160,204,205, 45,243,184, 80, 44, 74, 55, 18,137, 94,241, -133,130,112, 20,172,229, 21,238,228,228, 20,213, 8,112,106,219,160,246,205,221,115, 71, 27, 31,154,242,115,165,105,217,178,101, - 75,215,102,205,154, 9,116, 58, 29,100, 50, 25,246,236,217, 99,106,100,100,100,218,167, 79,159,149, 37, 11,128, 27,208,116,168, - 3,107,202,234, 20,221,140,106, 20, 36,179,206, 29, 90,199, 13,235,223,199,164,117,251,206,120,127,247, 40,178,178,242,144,147, -157, 15,154,166,191,136,235, 51,227, 26, 82,119,245,195,166,221, 75, 70, 47, 38, 72,146,104, 62,120, 17, 6,216,229,204,218,187, -119,111, 36, 0, 14,143,199, 43, 89, 14, 29,140, 28,155,108,170,223,171, 51,246, 44, 27, 11,134,166, 25, 0,155,170,224,205,178, - 49, 54, 54,190,116,243,230,205,118,109,218,180,193,147, 39, 79, 16, 19, 19,131,233,211,167,171,103,204,152,193, 29, 55,110, 28, - 49,111,222,188,153,191,252,242,203, 89, 0,143,190,120, 16,216,236, 49, 3,135,140,228,229,103,231, 42,213, 42,141,218,194,202, -140, 86,201,148,242, 12,105,174,114,228,232, 31,212,145, 33, 79,199, 0,248, 66,104,125,101,122, 26, 96,128, 1, 6, 24,160, 7, - 24,134,105, 3,192, 26, 64, 58, 65, 16,207, 75,238, 23,158, 82,180, 90, 75,233,253, 12, 20,244, 74, 89,150,160,203, 64,193,112, - 31,107, 0, 58, 0,207, 8,130,144,126,165,137, 21,207, 50, 12, 8, 8, 96, 74,126,150, 16, 90, 12,195, 48,140, 54,243, 35,163, -122,119,141,145, 63, 63,240,197,166,136, 60,199, 72,158,157,102,158, 30, 95,193,184, 90, 85,188, 10,251,119, 13,160, 29,221, 12, -204,180, 54, 96,102,119, 53, 83, 62,123,246, 44,144,166,233, 0,223,206, 96,152,215,199, 25,230,245,113,102,110, 7, 48,103,207, -158,189,238,231,231, 23,224,239,239, 31, 0,160,178,113, 74,169,121,207,131,153,167, 54, 96,202,195,219,183,111,153,189,123,247, - 50, 75,150, 44, 97, 14, 29, 58,196,160,146, 8,234, 94, 94, 94,247, 34, 34, 34,152,113,227,198,133,162,130,192,128,110,128,104, - 76, 45,187, 55,170, 83, 91, 53,234,239,155, 50,210, 46,130, 50,239,223,222,222,254, 51,123, 54,184,216, 49, 59,219,186, 48, 71, -122,182,250,196, 48,204,117,134, 97, 54, 48, 12, 51,146, 97,152, 6, 0,208, 18, 48, 25,104,111,249, 65,121,122,155, 66, 61,165, -125,165,235,222,181,108,217,210,117,193,130, 5, 89,106,181,154,137,141,141,101,246,237,219,199,220,186,117,139,185,120,241, 34, -227,238,238,158, 82,194, 94,219,137, 13,156, 83,213, 7, 87,171,170, 83,138, 56, 44,214,206,231,183,206, 50, 31, 30,156, 97,158, -157,244, 99,142,253, 52,138,153, 57,176,157,198,196,136,175, 4,208,173,188,235,102,116, 66,253, 6,181,172,223,197,199,199, 51, - 26,141,134,153, 48, 97, 2,227,229,229,197,244,234,213,139,233,209,163, 7,211,189,123,119,166, 91,183,110,204,157, 59,119,152, -148,148, 20,166, 71,231, 86,178,126,110,104, 93, 5,211,154, 56, 59, 59,127,138,141,141,101, 52, 26, 13, 19, 24, 24,200, 28, 61, -122,148, 9, 12, 12,100,124,125,125, 25, 0, 71,166, 77,155,166,144, 74,165,140,151,151, 87, 18,202,136, 26,239,236,236, 28, 21, -241, 46, 49,113,203,250, 3,119,254,216,121,226,206,249,179,183,238, 92,186,241,236,202,197, 27,207, 79, 63, 13,139,190,232,236, -236, 28, 85, 70,254,127, 85,122, 26, 96,128, 1, 6, 24, 80,185, 22, 41, 20, 90,125, 11,157, 29,125, 25,134,233, 81,106,191,111, -161,112,250, 98,223,215,215,119, 73,201,253,162,115,124,125,125,151, 0, 96, 58,116,232,112,130, 97,152,250,223,192,252, 41,101, -108,149,123,180,138, 64, 37, 61, 3,215,165, 15, 56, 58, 45,180, 25,111, 65,103,199, 3, 34, 59, 40, 8, 49, 50, 37,241,120,243, -224, 92,197, 11, 73, 20,226,234, 91,112, 0, 4, 70, 69, 69,225,205,155, 55, 72, 76, 76,132, 80, 40,252,226,188,135, 15, 31,194, -200,200, 8,246,246,246,250, 41, 93,245,231,237,220,171, 86,206, 16,119,240, 64,198,168, 31, 17, 24, 24,136,180,180, 52,112,185, - 92,240,120, 60, 80, 20, 85, 41, 31, 73, 22,172,248, 91,228,197, 42,235, 28, 15,128,205,183, 16, 95,222,189,114,118,109,242,113, - 0, 71,145,240, 1, 41, 74,157,126,158, 60,177, 8, 66,145, 80, 98,100, 36, 44,238, 46, 4, 16, 78, 16,196,251,150, 0, 71, 36, - 22, 92,254,125,237, 60, 59, 86, 72,160, 64,241,225, 85,153, 28, 61,122,244,152, 10, 96, 37,195, 48,217,205,154, 53,179, 93,183, -110,157,121,114,114, 50, 94,191,126,141,211,167, 79,167, 83, 5, 55, 74, 48, 12,179, 26, 0,218, 3, 2, 51,107,179, 27, 59, 87, -204, 54,198,221, 83,188,234,148, 34, 83,183,254, 87,134,142,155, 54, 99,251,236,254,144,229, 41,112,252, 86, 8,174,191,252, 56, - 0,192, 67, 84, 48,238,109,215, 35,124, 0,210,187, 15, 25, 50, 36,244,254,253,251, 86, 7, 15, 30, 4, 69, 81,101,110, 7, 15, - 30,196,237, 7, 47,103, 1,120,161,167, 89, 14,181,107,215,190,253,244,233, 83,107,161, 80,136, 91,183,110, 33, 59, 59,187,216, -147, 53,126,252,120, 34, 59, 59,219,123,207,158, 61, 67,227,226,226, 54, 63,120,240, 32, 19, 5,107, 65,126, 86, 16, 88, 44,214, - 71,138,210, 52,180,119,171,207, 30,222,191,115,231,252,204, 87, 16, 91, 54,195,227,176,143,151,179,165,153, 10, 22,139,245,177, -228,249,223, 34, 61, 13, 48,192, 0, 3, 12,168, 26, 8,130, 8, 96, 24,166, 31, 65, 16, 1,165,143,149,254, 94,116,158,159,159, - 95,241,126,209, 53, 27, 54,108, 88, 95, 98, 95,254,141,204,171,112, 48,124,215, 66, 5,217,181,172,147, 84,175,207, 67,245,230, - 18,184,206,157,192,107, 48, 0, 44,103,119, 36,188,186,139,176,107, 91,144, 20,249, 16, 12,173,131,189,107, 91,125, 13, 81, 54, -108,216, 16, 74,101,193,208, 44,149, 74, 5,174,200, 92, 57,111,202,104, 1, 0,208,108,129,170,132,130,213,139,208,184,147, 39, -218,166, 50,120,102, 91,224,168,104,155, 90,112,221,218, 9, 19,192,229,114,193,229,114, 65, 20, 14,253,209, 71,104, 17,133, 39, -211, 5,221, 87,101, 25, 65,200,249,156,227, 39, 87,250,180,229,199,133,243, 84, 17,143,145,162,162,153,203,169,186, 43,250,216, - 43, 20, 9,147,141,132,194,112, 35,177,168, 88,104, 17, 4,241, 17, 0, 24, 14,199,255,232,106,159,102,162,212,104,145,242,121, - 32, 36, 74, 90, 83, 14,205,234,107,215,174,217,176,217,108, 59,157, 78,135,132,132, 4, 68, 70, 70, 98,219,182,109,169,121,121, -121, 93, 67, 66, 66,222,149,212,142, 58, 35,222,105,255, 53,179,235,176, 95, 5, 9, 84, 31, 35,170, 92,122,172,154, 12,242, 26, -208,181,249,149,169, 99,151, 97,208,119,189, 48,174,107, 35, 38, 54, 37, 75, 9,224, 86,161,235,181, 50, 36,135,132,132,244,236, -210,165,203,177, 22, 45, 90,184, 49, 12,131,166, 77,155,194,219,219, 27,254,254,254, 8, 11, 11, 67,110,110,174,230,230,205,155, - 91, 1, 28,214,211, 44,161,185,185,249,245, 59,119,238, 88, 11,133, 66,220,188,121, 19, 10,133, 2,246,246,246,152, 49, 99, 6, -111,195,134, 13,127,228,230,230, 14,247,243,243, 19,196,198,198,238,188,113,227, 70, 45, 20,172, 59,247, 69, 33, 80,171,213,251, -143,251, 31,217, 62,195,103,166,227,157, 39,175, 3, 85,249,121,166,206,206,137,185,214,230, 98,227,173, 27, 87,215, 84,171,213, - 83,203, 78,207,123,213, 74, 79, 3, 12, 48,192, 0, 3,190, 64,133, 90,164,164,120, 42, 45,182,170, 34,210, 0, 40,124,125,125, -151, 18, 4, 17,224,235,235,187,212,207,207, 79, 1, 32,229,239, 16, 89,197, 66,171, 95,191,126, 65, 1, 1, 1,232,215,175, 95, - 80,185, 20,180, 14,154,216,251,208,196,222,135, 81,135, 89,248,211,111, 84,169,155,167,171,109, 93,255, 53,183,238,168, 84, 42, -246,145, 35, 71,138,199,109, 1,128, 78,167,251,230,185, 88, 21,161, 85, 40,244,190, 48,162, 54, 95, 28,180,127,238,240,246,150, - 58, 57, 71,253,240, 50,146, 85, 52,181,249,131, 70,254, 60,155,249,165, 60,206,139,115,166, 34,241,193,109, 8,197,226,196,201, -247,195,139,189, 88,133, 34, 43, 6, 0,106,241,141, 3,247,206, 30,228,110,199, 5, 87,125,229, 12, 82, 84,180,106,111,156,246, -112, 57,133, 13, 12,195, 32, 38, 38, 6,114,185, 28,193,193,193, 56,119,238, 92,122, 25, 34, 11,181,249,226,123,135, 22,141,105, -103,146,247,137,171,126,126, 27, 41, 42, 90,175,174, 46,171,166,131, 58,113, 73,226, 38, 65,178,140,186,183,119,197,156, 31, 6, - 99,203,161, 63, 41,181, 77,231,126,219, 47, 93, 29,145,175,210, 44,213, 83,100, 21, 59, 27, 67, 66, 66, 26,133,132,132,240, 1, -120,122,123,123, 95, 29, 58,116, 40,130,130,130,112,249,242,101, 23, 0,146,194,243,214,160, 96,161,236, 95, 0, 68,151,231,120, -228,114,185, 39,111,223,190,221,216,193,193, 1,183,111,223,134, 66,161,192,180,105,211,212, 62, 62, 62,220,241,227,199, 19, 57, - 57, 57,197,158,172,224,224,224,204,242, 68, 22, 0, 36, 39, 39, 95, 59,119,250,104,199, 46, 93,186, 12,174,227,210,192, 36, 58, - 47, 55, 77, 40, 20, 24, 61, 8,186,203,125,254,244,209,206,228,228,228,103,101,167,103,160,222,233,105,128, 1, 6, 24, 96, 64, -249,208, 75,139,148,242, 76, 85, 5, 37,174,227,248,249,249, 69,250,249,249,125,230,241,250, 74,148,158,117,120,165,168, 77,171, - 86, 28, 45, 93, 78,194,151, 55, 64,211, 85,185,217, 47,142,153,155,155, 83, 70, 70, 70,159, 9, 45, 90, 79,206,172, 11, 39, 16, - 61,125,116,177, 39,171,200,179,133,222,227,191, 74,104,209, 52, 29, 12,224, 51, 35,132, 54,174,163,182,246,119,235,212,168,142, - 35,169, 61,189, 13, 73,114, 74,185,242,173, 70,249, 38,143, 25, 16, 85,198, 32,235, 98, 78, 74, 11,129,200, 40,222, 72, 44, 42, - 45,178,226, 0, 64,100,235, 50,116,115,159, 6, 93,155, 55,168, 71, 82,167,126, 67,178, 92,155,239, 27,165,209, 68,203,152,243, -229,164,225,202, 94,189,122,173,180,180,180, 20,108,223,190,221,212,217,217, 25, 20, 69,169, 75,139, 44,161,141,235,168,109,131, -154,116,114,181, 51, 39,181,103,119, 32, 81,161,147,111,139,214,254,161,143,200,178, 50, 21,223,216,187,126,186,145,144,207,129, - 82,169,196,134,221,103,113,243, 81, 68,191,140,136,139, 55, 0,220,248,138, 2, 57,185, 95,191,126, 91,214,172, 89, 3,173, 86, -139, 73,147, 38,225,227,199,143, 55,223,190,125,187,173,102,205,154, 11, 22, 45, 90,228, 96,103,103,135, 17, 35, 70,112,181, 90, -237,248,114, 56, 54, 30, 63,126,188, 95,243,230,205, 17, 20, 20,132,236,236,108,216,219,219,195,199,199,135,231,231,231,247, 71, -110,110,238,240,245,235,215, 11, 98, 98, 98, 42,244,100,125, 86,174,117,186,181,251,182, 76, 95,208,166,189, 59,249,225,195, 59, - 42,161,173, 7,121,247,246,229,251,150,150,150,127, 36, 36, 36,252,149,158,131,155, 86, 57, 61, 13, 48,192, 0, 3, 12,248, 54, - 32, 8,226, 74,225,184,171,207,188, 92,165, 69, 88,145,199,170,228,126,233,243, 11,127,255, 22, 47,203,251,203, 16, 94,159,135, -119,232,215,175,159,222,211,234,105, 89,186, 94,226,169, 52,190,107, 0,173,163, 24,236,165, 30, 36,184, 34,115,101,255, 53,183, -238,148,119,174, 72, 36,210,219,163, 69,171,148,149,101, 74,149,132, 86,225, 24,173,235, 12,195,124, 38,180, 76,109, 93, 61, 22, - 47,154,189,213,125,104,111, 50,245,135, 14,200,206, 87,169, 22,189,166,232, 36,121,197, 34,171,160, 21,215,198, 10, 69,226,112, -129, 72, 88, 82,100, 37, 0,128,192,166, 94,219,133,115,102,236,238, 54,170, 63,145, 62,205, 29,210,108,133,106, 65, 36, 69, 36, - 43,152,225, 81,192,221,178,232,238,220,185,179, 15,192, 62, 15, 15,143, 84,145, 72,132,252,252,252, 47,242,160,200,222, 78, 67, -123,147,169,147,219, 33, 75,166, 81, 45,138,164,144,162,160, 79, 86, 38,178,172,205,140,111,236, 93, 55, 93,152,146, 20, 7, 46, -151, 11,177, 88,140, 91, 15,195,145, 17,121,233,107, 4, 22, 72,146, 92,229,235,235,187,114,198,140, 25,200,204,204,196,229,203, -151,241,221,119,223,225,196,137, 19,206, 87,175, 94,221,226,233,233, 9, 22,139,133,128,128, 0,104,181,218,247,229,208, 12,158, - 50,101,202,130,161, 67,135,226,217,179,103,144, 72, 36,159,121,178,178,179,179,189,119,239,222, 61, 52, 54, 54,182, 82, 79, 86, - 41,180,173, 93,175, 37,119,201,242, 95,161,146,167,177,211,147,159, 4, 5,222, 34, 31,103,101,101, 9, 1,228, 84, 55, 61, 13, - 48,192, 0, 3, 12,208,219,171, 85,158, 22, 73, 47, 20, 81,233,101,237,151, 16, 88,101,237, 19,165,188, 96,234, 82,191,135,253, -157,247,164,151, 71,139,109,219, 4, 84,106, 68, 9,161,149,246,217,239, 2, 99, 11,189,186, 14,181, 20,216,123, 15, 23,199,209, - 18,100,102,102, 10,172,172,172,148, 37, 5,130, 80, 40,132,131,131, 3,164, 82, 41,246,239,223, 15, 84, 62, 40,154, 50, 25, 58, - 22,109, 71, 77,194,115, 39, 30, 24,173,166,216,179,181,119,194,132,207,196, 22,151,203, 45, 26, 27, 86, 89,163,251,180,208,211, -244, 24, 0,211,210,165,206,207, 2,145,104,130,192,170,134,213,156,233,147, 57,177,105, 42,220,113, 95,146,125,118,227, 98,113, - 34, 35,158,145,128,156, 71,149,240, 69, 15,220,115,180,180, 39, 43,169,133, 75,157,101, 2,161,224, 7,158, 69, 45, 59,223,121, -211, 57,177,169, 42,226, 78,219, 69,185,231,126, 89, 36,140,129,241,130, 36,100,223,213, 35,123, 86,126,247,221,119, 43, 25,134, - 97,104,154, 94, 14, 0, 37,237,157,231,243, 3, 39,250,147, 18,129,238,203,164,231, 54, 46, 54, 78, 68,197,246, 90, 53, 29,212, -201,214,220,228,198,222,245, 51,132,146,228,120,240,249,124, 24, 27, 27, 35, 49, 53, 7, 28, 54, 75,241,149,229,141,223,185,115, -231,197,211,167, 79, 71,120,120, 56,166, 77,155, 38, 73, 72, 72, 56,127,234,212,169,105, 43, 86,172, 96,123,121,121, 65, 34,145, - 96,211,166, 77,218,135, 15, 31,174, 7,176,169,204,242,200,102, 79,254,249,231,159,153,148,148, 20, 34, 38, 38, 6,246,246,246, -152, 57,115, 38,111,253,250,245,197, 99,178,170,226,201, 42, 66,114,114,114,208,205,219,143, 49,224,218, 86, 80, 90, 85, 80,118, -102,194,253, 55,209,210, 32, 11, 30,111,190, 99,203,166,213, 74, 79, 3, 12, 48,192, 0, 3,190,137, 23,235,121, 69,251,255, 5, - 40,171,235, 80, 47,161,245,126,199,178,137, 46, 19,103, 44,132,145,115, 39,168,162, 46,128,206, 79, 45,246,104, 9,196,230,176, -168,233,134,108,153, 10,103, 2, 95, 2,192,251,170, 88,149,151,151,135, 86,173, 90, 97,215,120,215,110,202,188, 76,129, 17, 0, - 21,223, 68,121,145,215,249,206,213,171, 87,229, 52, 77,159, 4,112,181, 18,154, 85,141, 27, 55,222,249,235,175,191,242,220, 70, - 77, 68,254,147, 7,165, 61, 40, 48, 50, 50, 2,159,207,199,171, 87,175,112,231,206, 29, 53,128, 85,149,100,232, 83,138,162,194, - 78,157, 58,149, 84,191,142, 99,239, 86, 45,154,205, 90,186,196,215,248,245,131,155, 88,190,126, 39, 93,191,181, 87,206,134, 19, - 23,243,114,196, 53,187, 43, 36,111, 67,245,184,213,176, 82, 34, 43,165, 97,237, 26,221, 90, 52,105,188,112,249,242,101, 38,145, - 15,110, 97,197, 47,123, 25,151,230, 61,114,126, 57,119, 41, 55, 67, 88,171,151, 50,237,205, 51,125,210, 48, 40, 40,104, 31,128, -125, 69,251,165,237,245, 93,179,141,118,109,211, 91,186,225,196, 57, 89,174,113,205, 30, 21,217,107,237, 54,184,163,147,181,249, -141, 29,107,127, 20,126, 74, 78, 0,159,207,135, 88, 44, 70,130, 36, 27, 43,183,158,150,105,104,186,247,215, 10, 45, 99, 99, 99, -190, 70,163,193,174, 93,187,144,144,144,208, 1, 64,194,139, 23, 47,246,142, 28, 57,114,123,211,166, 77, 27, 70, 70, 70,190,207, -207,207,159, 1,224, 77,121, 36,102,102,102, 29,172,173,173,137,199,143, 31,227,199, 31,127, 84,207,156, 57,147, 59,110,220, 56, - 66, 42,149, 86,215,147, 5, 0,112,116,116,244,232,217,189, 61, 58,245,156, 22,164, 86,102,223,143,125,243, 71, 16,201, 60, 18, - 84, 55, 61, 13, 48,192, 0, 3, 12,248,159, 65,245, 2,131,123, 0,108, 87, 75, 76,109,236,200,253,228,191,113, 38,147, 23, 29, -204, 40,158,237, 99,114, 47,252,192, 92,217, 52,142,185,186, 99, 14, 51,173,111, 99,166,161, 13,241,201,213, 18, 83, 61,190, 20, -110,159,173,238,253, 93, 3,104,123,214, 3,211,179, 30,152,190,174,208, 2, 88,218,178,101,203,139, 62,109,255,138,163,229,211, - 22, 12,128, 31, 1,136,203, 49,171,172, 21,195,237, 1,236,111,213,170, 21,117,247,238, 93,230,237,240, 30, 76, 72, 67, 43,102, -198,140, 25,204,138, 21, 43,152,209,163, 71, 51,214,214,214, 84, 97, 66,216, 87,198, 57, 96,192, 0, 39, 0,168, 81,163,134, 89, -107,183,250,159, 94, 5, 94,102,238,251,111,103, 14,249, 12, 97,218, 53,117,203,176,107,216, 37,204,200,190, 65,139, 74,146,175, -152,211,206,206,110, 9,195, 48,189, 25,134,177, 7, 0, 23, 23, 75,113,203,134,245, 83,194,110, 95,102, 30, 28,221,201, 28,242, - 25,194,180,111,214, 40,211,201,205,243,141,192,166, 97, 91,125, 56,203, 66,153,246, 54,105,152, 97, 91,191, 99,104, 5,246, 22, -115,214,105, 59,226, 82, 82, 74, 42,243,244,233, 83,230,234,213,171,204,131, 7, 15, 24,255, 83,151,152,154,109,134,231, 91, 53, - 29,212,169, 10, 69,167, 60, 59, 77,251,246,237,203,188,127,255,158,233,211,167, 15, 3,192,180,154,156, 23, 99, 99, 99,153,136, -136, 8,102,233,210,165, 12,128, 35,211,167, 79, 87,228,228,228, 48, 61,122,244, 72, 40, 20, 88,236,234,216, 89,183,182,227,134, -193,253, 59,175,242,249,113,168,199,215,166,231, 55,132,129,211,192,105,224, 52,112,254, 47,112,254,127,134,125,161, 87,171,232, -179,165, 94, 30,173, 32,128, 66, 38,246, 53,177,209, 28, 91,191,105,199,252, 93,251,142, 44, 92, 60,107,178,168,179,123, 79,132, -223,254, 29,231, 2, 78,201,148, 42,245, 38, 46, 11,191, 70,100, 66,254,174, 18, 43, 10,227,104,125,134,144,144, 16,161, 69,189, -191, 98, 48,125, 40,136,205,186,183,138, 55, 40, 1, 48,229,229,203,151,191,122,122,122,174,251,161, 83,219, 33, 62, 29,187, 65, -171,213,194,223,223, 31,241,241,241,231, 1, 44,211,215,227, 22, 30, 30,158,209,168,158,243,108, 14,139,189,112,198,232,193,214, -233, 31, 95, 35, 41, 42, 4, 0,160, 82, 41,180,159,222,223,111, 94, 21,227,140,140,140,158, 90, 91, 91,191,181,182,182,150,186, -214,169, 49,133, 15,206,242,105,222, 3,109, 50, 99,223, 32, 49,178,160,103, 84,165,148,107,146,222,223,109, 88,157,220,117,118, -118,230,139, 56,152, 90,166,189,106,165, 54,245,195,155, 22,250,240,200, 85,234,245,171,183,248,247, 90,187,112, 2,223,196,196, - 4, 47, 35, 62, 96,249,111, 39,100, 10,181,182,119, 70,248,197,111,210, 61,198, 48, 12,180, 90,173,222, 19, 29,202,193,226,230, -205,155, 55, 88,183,110,157,203,248,241,227,241,181,158,172,146,136,142, 77,246,117,172, 81,183,209,135,183, 47, 61, 45,140,184, -199,190, 38, 61, 13, 48,192, 0, 3, 12,248,159, 65,223, 66,103,206,148, 18,159, 33,149, 10,173, 34, 68,164, 65, 14, 96, 77, 29, - 86,254,222, 37,235,182,172, 36,137,173, 19,104,134,249,157, 34,177, 58, 38, 19,233, 95,105,156,156,195, 6,213,107,208,104, 54, - 0,112,216,213,107, 32, 11,241, 30,192,208, 3,143,158,181, 57,240,232,217, 79,133,199,214, 2,168, 82, 95,174, 49, 27, 17,238, -141,234, 58,118,110,217, 88,192,210, 41,144, 20,245, 17, 89, 50, 37,110, 69,198,103,147, 12,249,123, 85,141,138,137,137,185, 7, - 0,182,166,194,168,206,141,234,213,236,210,170,177,144, 67,168,145,244,250, 37,114, 20,106,220,140,140,207, 1, 65, 84,123, 64, -245,183,178, 55, 53,252,210,243, 63, 65,244, 32, 8,226,246, 82,159, 81,252,149,191,157,252,166, 34, 11,128, 60, 57, 57, 57, 83, - 46,151, 91,166,164,164,168, 81,253, 32,113, 31,114,115,115,155,206,153, 51,103,205,130, 5,216, 12, 53,220, 0, 0, 32, 0, 73, - 68, 65, 84, 11, 22,110,220,184,145, 91,157, 49, 89,229, 65,154, 28,127,161, 75,227,111,151,255, 6, 24, 96,128, 1, 6,252, 79, - 96, 74,169, 79,232, 45,180,138, 5, 67, 26,210, 1,204,168, 91,151,153, 23, 29, 13,245,183,178,172, 44, 79,215, 87,226, 57,128, -254,213,190,154, 36,242,158,188,143,207,127,250, 62, 62, 31, 52,195,208, 12,163, 34, 73, 36,202, 52,154,245,239, 99,146,171, 63, -235,142, 32,116,207, 63, 36, 40, 94,124, 76, 84, 50, 52,205,208, 12,163, 38, 8,124,210,106,233,245,145, 49,241,151,254, 27,236, -205, 8,191,248, 40,128, 34, 58, 63,122, 26, 49, 79, 38,211,236,204,136,186, 24,252, 13,243, 69, 27, 30, 30, 62,166, 67,135, 14, - 19,117, 58,221, 94, 0,218,175,224, 82, 83, 20,181,120,195,134, 13,231,195,195,195, 79, 7, 7, 7, 75,190,133,200,250, 91,243, -223, 0, 3, 12, 48,192,128,127, 43,170,183,168,116,121,248,150, 34,235,191, 17, 17, 31,226, 90,253, 29,188,145, 31,226,154,252, -127,176, 55, 53,234,194,139, 84,192,251,111, 74,222,155, 58,157,238,230,183, 20,213,215,175, 95,175,141, 50,150,213,249,111,203, -127, 3, 12, 48,192, 0, 3,254,181,152, 82,158,248, 98, 27,210,198,128,127, 1,152,111, 37,178, 12, 48,192, 0, 3, 12, 48,160, - 26, 40,215,163, 69,160,252,153, 3,183,171,240, 7,213,153,125,112,219,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,231,255, - 28,231,191, 17,246, 40, 24, 16,127,165,240,179, 66,241,245, 45, 97,152,250,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129, -243,223,142, 50, 7,194, 3, 5,131,135, 13, 48,192, 0, 3, 12, 48,224,255, 19,248,133, 91,117,127, 55,192,128,191, 91,108, 21, - 11,174,234,140,209,170, 95,248,249,225,111, 52,214,199,222,222,126, 74,179,102,205,220,184, 92, 46,153,151,151,183,250,238,221, -187,171, 74,159,212,185, 17,251, 5,139,132,211, 95, 71, 8,128, 96, 1, 36, 9, 29,131,164, 7,175, 20,173, 13,249,254, 95, 13, -103, 35, 19,235, 63, 9,146,197,211, 81, 26,232,180, 26, 20, 12,183, 42, 0, 77, 83,241, 58,141,202,171,188,139,237,154, 15,174, - 73,233,232,141, 0,179, 11, 32,167, 3,244,110, 2,236,105, 12,168, 61, 4, 88, 63,130,197,252, 2, 29,177,136,205, 97, 45,145, -132,156, 77,252, 55, 36,216,153, 51,103, 88, 95,115,253,240,225,195,203, 92, 64,212,193,193, 33, 64, 40, 20,214, 43,239, 58,153, - 76, 38,145, 72, 36,158,255,242,242,216, 5,192, 14, 0,141, 75, 29,127, 3, 96, 54,128,192,175,253, 3, 15,128,109, 11, 76,229, - 2,139, 0, 64, 3,252,146, 10,236, 11,250, 47, 26, 99,104,109,109,125,159,205,102,187,200,100, 50, 89, 94, 94, 94, 93, 99, 99, -227,104,145, 72, 36,162, 40,234,125,122,122,122,151,138,174,101, 10, 38,165, 84,138, 38,128,241, 59, 96,164,142, 36,103,114,128, - 93, 42,154,222, 91, 88,131,235,179,192,237,116,252,181, 60,215, 66, 0,187,171,248,187, 1, 6,252, 29,248,170, 89,135,174, 5, -245, 3, 60, 0,116,105,211,166,141,173, 76, 38,195,155, 55,111, 82, 1,220, 7, 16, 84,184,189,251, 22,150,146, 36,185,121,203, -150, 45,243,103,206,156, 89,188, 24,244,171, 87,175,208,188,249,151, 49, 66, 89, 36,156,238, 94,190,109,243, 60,252, 29,218,244, - 24, 86, 40,180, 72, 64, 38,129,103,207,182,213, 53,193,216,220,220,124, 53, 65, 16,195, 73,146,172,180,210,160,105, 90,199, 48, -204, 25,169, 84,186, 18, 64, 94, 85,254, 72, 36,228,107, 41,157,174,204,255, 96,179, 88, 58,153, 92, 85,110,216, 11, 11, 11,139, - 96,146, 36,235,148, 92, 48, 27,248,124, 1,237,242,126,163, 40, 42, 41, 35, 35, 67, 31, 17, 42, 32,217,220,217, 4,193,237, 9, -146,118, 5, 8, 16, 32,223,209, 58,245, 45,154,210,108, 3,160,252, 26,145,101, 95,163,238,131,185,203, 54, 56, 69, 68,189,193, - 82,159,209,216,184,227, 8,150,204,158,136,109,251, 79, 96,246,148, 81,104,212,168,113,133,181, 46, 13,238,250,101,179,134,247, -240,219,117,218,125,201,140,225,124,191, 93,103, 58, 47,245, 25,201, 91,191,243,116,231,165, 62, 35,248,126, 59, 79,187, 47,153, - 53,220,104,253,238,179, 52,128,177,213, 49,114,148,139,131,140,160,168, 50,223,140, 25, 54, 91,117,226,125,138,232, 63,241, 68, -143, 31, 63,190,153, 66,161,120, 57,186,103,203, 13, 45, 92, 29,147,203, 58, 39,243, 83,178, 99,244,219, 16, 95, 14,215,168,213, - 64,223, 35,175, 42,116, 15,240,249,117,222,188,121,227, 66,211, 52,116, 58, 29, 40,138, 42,254, 84,171,213,232,210,165,203,183, -154, 56,211, 31,192,234,130,135, 21,126, 0, 78,127, 5,151,152,205,102,207,229,241,120, 30, 20, 69,185, 1, 0,135,195,137, 82, -169, 84, 65, 20, 69,109, 1,144, 95, 69,190,173,201,201,201,141,196, 98, 49, 52, 26, 77,241, 2,244, 44, 22,171, 97,205,154, 53, -119, 41,149, 74,151,175,189,121, 91, 96,106, 71,119,247,109,227,230,207,103, 41,238,223,199,182,195,135,183, 34, 55, 23, 0,118, - 85,118, 45,143,199,187, 65,146,164,115, 85,254,143,166,233,120,181, 90,237, 85,149,107,216,108,182, 75, 74, 74,138,141,131,131, - 3,242,242,242, 32, 18,137, 68, 69,251, 95,131, 32,128,232, 13,116,161, 88,172, 57,150, 86, 86,157, 95,222,188, 41,106,210,164, - 9,201, 98,177,150, 64,255, 32,213,124, 0,155, 24,134, 49, 42,108, 47,182,181,111,223,190, 3, 65, 16, 20, 0,134,166,105,242, -233,211,167,163,104,154,102, 23,214,121,155, 0, 28, 6,160, 50,232, 0, 3,254, 1,111,214,254,170, 10,173,171, 0, 60,218,180, -105, 99,228,237,237, 13, 15, 15, 15,184,184,184, 64, 32, 16, 20, 84,226,153,153,182,161,161,161, 35,238,223,191, 63,226,242,229, -203,120,253,250,181, 2,192, 67, 0,101, 62,212,221,251,185,207, 20,136,249,219, 1, 32, 61, 41, 83,146, 20,147,182, 93, 34,145, -108, 2, 80, 50, 68,120,221,177, 99,199,206,155, 53,107, 22, 2, 2, 2,112,226,196, 9,168, 84, 42,228,229, 85,160, 95,228,105, -144,222,217, 0,136, 98,129,132, 32, 64,104, 3,136,108,171,157, 82,230,230,230,171,103,207,158, 61,167, 81,163, 70,197, 81,204, -181, 90, 45, 40,138,130, 86,171,133, 84, 42,197,188,121,243, 10, 26, 90,134, 1, 77,211,184,118,237,218,204, 41, 83,166, 64, 42, -149,206, 45,139,179,125,171, 26, 47, 72,130,116, 42,242,213, 48, 58, 93,210,147,208,164,214,148, 78,199, 82, 42, 53,101,174, 84, - 46, 16,112, 43, 20,121, 28, 14,199,233,245,159,127,218,144, 60, 30, 24,157, 14,160,105, 48, 52, 93,152,156,133, 27, 83,112,140, -209,209, 96,180, 58,208, 20, 13, 74,161, 66,219,233,211,245, 73,138,142, 28,158,209,137, 49, 63,204,183,107,215,190, 61,167, 86, - 13, 7, 80, 58, 26, 31, 99,147,236, 94,190,120,210,233,204, 31,187,166,169, 21,121,163, 0, 84, 43,206, 22, 79,104,114,115,231, -158, 3, 78,207, 67, 35, 16,120,247, 62,110,223, 9, 2, 0,220,184, 27, 92, 36,184, 43,205, 42, 80,249, 77,103, 79, 26,196,223, -176,243, 36,103,246,164,193,172,141, 59, 79,113,102, 77, 28,200,218,176,253, 4,119,214,196,129,172, 13, 59, 78,112,103, 77, 26, -196,242,219,118,168, 25, 0,115, 0,210,242,200,202,203, 35,130,162,248,199,162, 83, 89, 0,144,190,119, 47,180,105,105,112, 88, -185, 18, 0, 48,166,174,173,222, 93, 19, 86, 86, 86, 47, 56, 28,142, 83,101,231,105,181,218, 74, 69,240,248,241,227,155, 43, 20, -138, 23, 20, 69, 49,108, 54,219,119,244,224, 94, 23,123,119,110,158, 89,242,156, 87,175,194, 44,215,175,255,115,208,233,151,121, -204,136, 86,198, 47, 3, 54,143,111,221,111,193,145,176, 10, 26,100, 82,165, 82,225,253,251,247, 40,185,200,123, 9,232,170,249, - 72,145, 0,182, 89, 90, 90,182,203,204,204, 28, 3, 96,105,110,110,110, 51, 22,139, 5, 11, 11,139,165,106,181,250,163,169,169, -233,193,156,156,156,224, 66,175,145,190, 75, 6,116, 49, 49, 49,241,191,112,225,130,121,203,150, 45,201,140,140, 12,212,174, 93, - 27, 89, 89, 89,109,239,223,191,223,106,210,164, 73,147,242,242,242,190, 47,124, 25,212, 23, 13,132, 66, 33, 51,110,220, 56, 66, -167,251,235,118, 15, 29, 58, 4,175, 38, 84, 61,107, 51,161, 92,169,102,114, 2,223,155,254,200,229,114, 31,198,199,199,231, 84, - 53, 49,184,192,162,113,243,231,179,196,113,113, 16,135,133, 97, 76,110, 46,123, 99,129,119,171, 82,161, 69,146,164,179,255,137, -223, 93,120, 60, 30, 40,138, 42, 22,131, 69,117,148, 86,171,133, 70,163,129, 86,171,133, 78,167,131, 86,163,133,223,218, 95,170, - 93, 23, 10,133, 66,161,189,189,125,170, 80, 40, 20,126,165,184,172,153, 69,146, 63,180,104,213,106,202,202, 65,131, 4,207,158, - 61, 19,144, 36, 9,138,162,176,105,211, 38,138, 97, 24,179, 70,128,201,107, 32,183,170,220,124, 62,159,253,199, 31,127,140,226, -241,120, 0, 0,181, 90,141, 38, 77,154, 16,134, 54,223,128,255,160,216,250,194,203, 85,145,208,234,147,155,155, 11,157, 78, 7, - 99, 99, 99,176, 88,159,183,251,150,150,150,232,217,179, 39,186,116,233, 2,111,111,111,188,126,253,218,200,219,219,187,103,121, -100,163,231,247, 67, 13, 23,219,194,198,132,182,127,116, 37,116,195,161,159,207, 90,127,250,244,105,126,137,211, 38, 77,157, 58, -149,200,204,204,196,240,225,195,239,171, 84,170, 1,168,224,225,211,209, 72,242,244, 30, 3,154, 33,140,182, 60, 61, 64,168,149, - 10,134, 36, 73, 69, 81,215, 97,117, 82,137, 32,136,225, 14, 14, 14, 56,121,242, 36,212,234, 47,195,133,153,152,152, 32, 50, 50, -242, 47,175, 26,139,133,246,237,219,179, 8,130, 24, 14, 96,110,217,156,164,211,163,231,113, 54, 69,251,253,122, 54,230,182,111, - 69,166,166,164,202, 24, 0,196,178,101,203,138,133, 27, 0,172, 94,189, 90, 31, 59, 65,114, 56, 72, 15, 10,250,171, 34,102,147, - 32,185, 4, 8, 14, 64,178, 11,122, 81,193, 0,140, 14,160, 41,128,214, 2, 2,251, 26,250, 36, 67, 91,199,154, 46, 1,235,127, -219,109,166,210, 50, 56,121, 41, 16,177,177, 49, 96,145, 36,234,214,115, 65,175,174,157, 57,173,218,116,168,241,203,170,249,151, - 83, 18, 62,244, 1,240,172,202, 9, 77, 51,130,122, 53,173,112,240,208, 75, 88,155,139, 49,124,208,119, 48, 18,240,177,113,199, -239, 88,187,196, 7, 46,117,157,177,111,235,186,114, 47, 55, 53, 53, 93,227,230, 82,207,121,247, 31, 87,224,214,176, 33,107,183, -255, 21,184, 53, 42,252,108,236,198,218,237,127, 5,141, 26, 55, 98,237,246,191,130,102,141, 27,212,122, 33,121,186, 38, 43, 43, -203,167,252,244, 44,149, 71,189, 10,242,136,147, 79, 23, 87,218,113,211,166, 1, 64,177,208,170, 10, 56, 28,142, 83, 74, 74,138, - 77,101,231, 85,230, 53, 40,244,100,189,160, 40, 10,105,105,105, 68,118,118, 54, 99,102,102, 54,232,250,190,165, 23,188,220,155, -103, 1, 64, 88, 88,152,133,159,223,250, 65,167, 94,228, 66,241,100, 39,113,236,207, 32,122,204, 0,143, 23,151, 54,140,111,133, -194, 37, 33, 74, 67,165, 82,197,182,104,209,130, 41,252,238,200,231,243,185,165,202,155, 67,253,250,245,191,240, 90,235,209,165, -184,237,241,227,199, 62,141, 26, 53, 66,195,134, 13,131,219,181,107,103, 34, 18,137,112,253,250,117,184,185,185, 53, 54, 49, 49, -121,122,230,204, 25,206,226,197,139,155, 31, 62,124, 24, 0,102,234,145,156, 61, 60, 61, 61, 79, 6, 4, 4, 8,184, 92, 46, 20, - 10, 5, 34, 35, 35, 97,106,106, 10, 30,143,135,129, 3, 7,178, 58,117,234,100,217,181,107,215,115,239,222,189, 27,133, 42,204, -128, 82, 42,149,204,210,165, 75, 33, 20, 10, 33, 20, 10, 33, 18,137, 32, 18,137, 32, 22,128,216, 59,187,166,209,172,253,217, 70, -115, 87,238,221,224,191,123,213,221, 26, 53,232, 21,137,137,137,217, 85, 45, 11,138,251,247, 33, 14, 11, 3, 74, 60,187,250,194, - 84,100, 1, 95, 95,223,202, 60, 82,224,114,185,232,216,177, 99,165,124, 22, 22, 22,231,217,108,246,103,111,166, 20, 69, 9,124, -125,125,117,239,222,189, 19,145, 36, 41,162,105, 26,190,190,190, 58,138,162, 4, 54, 54, 54,193, 52, 77,167,102,100,100, 12,169, -136,183, 43, 32, 8, 6, 6, 19, 28,206, 92,123, 7,135,218, 30,117,235, 10,111,223,190,205, 2, 0,103,103,103, 70, 34,145,100, - 95,186,116, 41,143, 13,236,113,102,152, 63,170, 32,178, 84, 0, 22,146, 36,185,141,207,231,179,107,213,170, 21,191,124,249,242, -199,133, 30, 82, 48, 12, 67,214,170, 85,171,173,145,145,145,179, 74,165,162, 80,208,117,104,240,102,253, 11,192, 48, 76,171, 2, -221, 94, 12, 53, 0, 94,145, 3,191,160,181,131, 85,169,227, 0,144, 81,248,162,104, 91,206,126, 38,128,215, 0, 26, 0,176, 41, -252,237, 57, 65, 16, 89,213, 48,179,124,143, 86, 64, 64, 64,241, 43,108,191,126,253,138, 27, 22, 99, 99, 99, 60,127,254, 28, 4, - 65,192,216,216, 24, 38, 38, 38, 48, 53, 53, 69,110,110, 46, 94,191,126,141, 55,111,222, 32, 46, 46, 14, 4, 65,160,110,221,186, - 40, 42,236, 37, 80, 92,193, 29,255, 53, 0, 2, 49, 31, 4, 1,180,236,214, 12,205,186, 52, 65,155,103,209,179, 95,220, 38,246, - 75, 36,146,247, 0,216, 77,154, 52,153,212,190,125,123,252,246,219,111, 80,169, 84,191,149, 35,178,138, 57, 31,188,166, 90, 3, -128,189,189,253,130,163,215, 63, 10,199,246,174, 39,151, 72, 36,155,171,145, 56,159, 85,196, 25, 25, 25,122,175,197, 71,211, 52, -164, 82,105,133,156,165, 61, 4, 91,182,237, 52,203,203, 73,197,207, 27,143, 66,171,213, 98,254,252,249,160,105,186,120,203,206, -206,214,203, 78, 70,167,251,210,119, 64, 22,244,158, 18,108,160,230,200, 2, 93,145,112,114, 39,136,255, 99,239,186,195,162,184, -214,247, 59,179,125,233,189, 41,160,162, 40, 8,130, 13,197,134,189, 68, 76,172, 49,118,163,137, 55,137, 37,150, 68,108,209,152, - 40, 36,214,152,104,212, 24,163, 49, 54,236, 98,139,221,196,174, 32, 82, 20, 20, 17,144,186,244,178,109,118,103,206,239, 15,138, -128,108, 65,115,127, 55,247,102,223,231,217,103,119,118,102,223, 61,101,230,156,247,124,231, 59,223, 33, 0,197, 2,120, 53, 95, -245, 59, 33, 9, 79, 40, 61,176,226,155, 77, 54,209,143, 94,224,248,197,104, 48,165,153,200,126,112,180,210,228,216,109, 28, 14, -170,120,232, 18,208, 18,159, 46,249,214,118,233,167,147, 14,168, 21,101, 62,168, 59,141,120,193,240, 67,195,226,171,149, 43,177, -125,211,122,124,187,126, 19, 74, 75,138, 33, 16, 56, 84, 53,244, 44, 88,150,213,159,119, 66, 6,135,205,153, 74,125,243,227, 17, - 4,181,117,197,225,179,119,208,163,189, 39,142,254,126, 15,189, 58, 54,199,241, 11,209,232,219,165, 37, 78, 95,141,195,167, 51, -198, 81,227,206,237, 28,220,152, 58,218,184,241, 7,155,178,210, 92, 68,173,218,141,188,205,155,145, 54,115, 38,130,170,174,185, - 67, 81, 16, 54,109, 10, 8, 13,215, 81,125, 36, 38, 38, 66,165, 82, 53, 52, 50,135,175,175,175,193,122, 87, 40, 20,247,181, 90, - 45,201,205,205,165,114,115,115, 97,110,110, 78,197,199,199,177,126,126,254, 35,200,163, 67, 63, 1, 64,120,248,234, 17, 7,239, -151, 66,126, 99, 19, 20, 55,191,135,176,121, 44,189,253,203, 25,204,135,203,183,221,175,245,140,214, 73,103, 78, 78,206,144,156, -156, 28, 0, 64,139, 22, 45, 30, 37, 37, 37,181,169,158,106,174,154, 66, 20,106,181, 90,239,234,233, 68,173, 86, 11,149, 74,133, -254,253,251,243,244,229,221,214,214,182,171,175,175, 47,162,163,163,177,105,211, 38,187, 62,125,250,224,201,147, 39,160, 40, 10, -171, 87,175,166,218,182,109, 43,200,207,207,199,160, 65,131,112,228,200,145,110,165,165,165,134,202,211,210,220,220,124,231,201, -147, 39, 37, 52, 77,163,172,172, 12, 28,199,161,123,247,238,160,105, 26,113,113,113, 88,178,100, 9,142, 28, 57,130, 99,199,142, - 73, 59,118,236,184, 83, 46,151,251,162,238,180,190,174, 58, 34, 74,165,146,136,197, 98,136,197, 98, 72, 36, 18, 72, 36, 18,136, - 68, 34,148, 43,129, 15, 55,164,169,120, 18, 7,206,175,125,143,150, 83,103,175,166,215, 46,123,255, 18,128,227,198,222,243, 64, -165, 79,214,119,191,252,178,105, 66, 73, 9, 13, 0, 59, 40,138, 99, 8,249,214,152,231, 29, 0,202,149, 37,240,244,106,138,195, - 7,142, 97,212,216,225, 13,138, 44,129, 64, 8,161, 64, 0, 43, 59,115,131,156, 66,161,208,249,209,163, 71,246, 2,129, 0,132, - 16,176, 44, 11,134, 97,114,151, 46, 93,234, 56,116,232, 80,203, 51,103,206,208, 67,135, 14,229,108,109,109, 43,238,220,185,147, -167,213,106,237,123,246,236,169,147,211, 12, 8, 80, 90,183,250, 78,196,211, 6, 68, 44,254, 68, 60,105,210, 36,222,212,169, 83, -145,158,158,142,105,211,166, 41,207,159, 63,175,206,201,206, 62, 46,226,184, 31, 24, 32,214,216, 54,185, 30,182, 4, 4, 4,116, - 56,122,244,232,251, 97, 97, 97,247, 22, 44, 88,240, 85,237,147,107,214,172, 89,121,250,244,105,207, 17, 35, 70,252,250,224,193, -131, 45,141,105,151,222,180,239, 48,113,190, 25,116,105,145,106,227, 40, 69, 81, 81,181,218,236,208,234,227,176,176,176,197,225, -225,225,241, 20, 69, 69,213,254,190,250,186,170,193, 98, 84, 67,199, 85,191,181, 91,180,104,145,127, 68, 68,196,234,224,224,224, -253, 55,110,220,120, 6,160,177, 66, 75,191,143, 86,117,134,106,103,178, 94,167,134,210,210, 82,148,150,150, 34, 35, 35, 3, 91, -183,110,173,122,160, 5,224,243,249,224,243,249, 53,254, 12,186,112, 49,234,207,239, 1,124,223,161, 67, 7,193,195,155,145,103, - 62,223, 62,187, 95,167,254, 29,120,247, 47, 62, 28,141,202,253, 8,135, 76,158, 60,217, 1, 0,118,239,222,157, 15,224,204,127, - 72, 53, 71, 38, 39, 39,127,234,234,234, 90,227,163, 82,123,250, 80,171,213, 66, 34,145,160,218,151, 69,169, 84, 98,235,214,173, - 90, 66, 72,164, 30, 78, 36,197, 95, 66,114,252,229,202,223,113, 28, 56,246,229,239, 87,172, 88, 1, 66, 72, 77,103,255, 81,149, -229,196,160,200,107,168,204, 73,189,247,122,223, 19,150, 53, 48, 61, 33,156, 61,122,210, 76, 87,142,226,227,196,165, 24, 8, 4, - 2,112,181,172,153, 2, 94,229,104, 57,254, 73, 22,220,156,253,240,246,184, 25, 46, 71,127,253, 97,182,150, 81,126,211,216,178, -246, 9, 8,198,156, 79, 63,197, 79,219,183, 99,201,242,149, 53, 10, 64,203,178,208, 26, 76, 39, 77,247,239,238, 15,109,121, 22, -120, 60, 30,250, 6,181, 4,143,199,195,128,224,214,224,241,120, 24,212,221, 7,124, 62, 31,131,123,180, 69,171, 86,173,192,231, -243,105, 3,245,142,164,248,139, 72,142,191, 82, 75,244, 18, 16, 0, 76,118,246, 43,215,107,178,179, 65, 60,236, 27,123,111, 97, -218,180,105,197, 25, 25, 25, 76,253,115,238,238,238,194,107,215,174,217,232,152,182,171,129, 84, 42,237,200,231,243,239, 23, 22, - 22,114,102,102,102, 52,199,177,156,159,159, 63,239,236,182,197, 71,171,175, 89,180,104,241,209,119, 59, 90,141,216, 19, 25, 69, -132,205,122, 80,148, 64,172,253, 96,249, 54,161, 64, 40,237, 8, 40,140, 25, 60,208, 42,149, 10,143, 31, 63,134,161,244, 16, 66, -244, 78,211, 20, 21, 21, 77,246,245,245,189,246,253,247,223,219, 81, 20,133, 63,254,248, 3, 60, 30,175,230,149,146,146, 2,154, -166,241,249,231,159, 51,165,165,165,211, 13,165,141,207,231,127,122,248,240, 97,107,145, 72,132,178,178,178,154,231,134,199,227, -225,209,163, 71, 88,187,118, 45, 38, 79,158,140,244,244,116,184,185,185, 97,254,252,249, 22, 17, 17, 17,159, 50, 12,179,210,136, - 42,138, 85,171,213,157,204,204,204, 32,145, 72, 80, 45,184, 0,224,247,120, 65,156, 66,161,104,103,111, 47,119,113,188, 26,117, -162, 91,159,183, 3,237, 29, 93,131,179,179,179, 27,181,117,214, 83, 96,123, 42,203, 46, 29,114,244,168,211,245,163, 71,185, 91, - 39, 79,190, 16,151,149,109, 51,250, 30,210,208, 72, 75,121,129,142, 29, 59,226,254,253,251,232,216,177, 99,109,209, 4,145, 72, - 4,161, 80, 8,161, 80, 8, 7, 91,163, 92, 40, 8, 77,211,184,126,253, 58, 88,150,133, 90,173,134, 90,173, 70,219,182,109, 11, - 47, 95,190,108, 1, 0, 41, 41, 41,100,226,196,137,197,183,111,223, 70,251,246,250,247, 83, 87, 82,212,197, 21,171,215, 89,127, -179,113, 39,172,237,156,113,245,234, 85,246,236,217,179,101, 20,144,148, 28, 31,191,254,109,224,116, 36,192, 52,166,204,156,157, -157,175,241,120,188,102,181,191, 43, 40, 40,176, 29, 57,114, 36,138,138,138,222, 26, 57,114,100,143,170, 54, 33,243,208,161, 67, - 19, 1, 64, 36, 18,129,166,105, 22, 38,252, 87,193,144, 22,169, 45,148,234, 11,174,240,240,240,208,250,223,213, 22, 85, 13,125, -174,253,219,136,136,136,213,181,184, 21,175,145,124,195, 62, 90, 81, 81, 81,164, 1, 5,105, 52, 12, 9,173,106, 68, 71, 71,107, -220,220,220,126, 74,142,121,222,175,101,128, 23,164,230,226,129, 0,190, 23,139,197,243, 38, 77,154,132, 91,183,110, 33, 46, 46, -238,103,188,225, 42, 28,127,127,255,115, 98,177,216, 83,199, 52, 73, 90, 92, 92,220, 32, 29, 29,195,242,147, 39, 79, 66,159, 51, -252,165, 75,151,106,119, 74,181,157,225, 27,190, 49, 56, 2, 13,163, 65,133, 92,241,178, 19,175, 18, 90, 21, 21, 21, 24, 59,118, -108, 29,139, 86, 94, 94,158,193,252, 81, 20,133,181,199,143,227,124,100, 36,222, 10, 12,196,145, 59,119, 16, 49,105, 60,124, 60, -155,128,176, 20, 8, 5,164,239,251, 1, 5,165,229,216,123,241, 58, 10,203,228,152,208,179, 39,188,173, 28,244,243, 10,132, 3, -130,186, 6, 11, 47,220, 72,128, 64,192, 7, 13, 14, 68, 35,135,155,111,111,240,104, 26,214,206,205, 33, 20, 8, 32, 16,240,145, -146,145, 15, 95,255,206,162, 40,145,100,192,235, 8, 45,119,207,230, 96, 89, 22,147, 39, 79,198,254,253,251, 97,239,226, 9,107, -119,127,124,189,126, 59,222,234,223,211, 96,254,171, 71,240,124, 62, 31, 60, 30,239,149,247,234,207,198, 88, 39, 9, 71,192,212, -175, 35,142, 0,132,160,233,170, 85,104,186,106, 21,238, 84,253,103,219,138, 10, 40, 20, 10,160,139, 95,163, 68,150, 90,173, 70, - 70, 70, 6,147,147,147,227,220,192,249, 92,181, 90,109, 80,216,236,218,181, 43,118,202,148, 41,157,236,236,236,238,197, 62,120, -160, 9, 8, 12, 20,156,217,186,248, 88,245,180, 33, 0, 4, 6, 6, 22, 46, 94,188,248,216,196, 49,161,195,183,132,189,199,126, -188,242, 87,190, 88, 42,237, 20,186, 96, 87,236,190, 49, 99, 12,207,205,168, 84,169, 1, 1, 1,196,152,124,201,229,242, 28, 61, -167,135, 1,248,178, 67,135, 14, 86,125,250,244,193,181,107,215, 48,106,212, 40, 21,195, 48,201, 0, 48,116,232,208,214,123,247, -238, 21, 37, 36, 36,192,209,209, 81,144,150,150,182, 19, 6, 28,228, 69, 34, 81,239,206,157, 59,211, 42,149,234, 21,145, 21, 17, - 17,129,113,227,198,161,117,235,214,224, 56, 14,229,229,229,232,211,167,143, 96,211,166, 77,189,141, 20, 90,115,124,124,124,214, -162,114,213, 97,237,182, 48,177,106, 10, 10, 5, 5, 5, 57, 49,183, 47,198,247,236, 63,178, 83,179, 86,254,174,113,177,247,245, - 18, 58, 57, 57, 45,162,105,250, 93,142,227,120,165,165,165, 25, 49,106,117,171,182,158,158,206,221,135, 15, 71,137, 64,192,251, -238,226, 69, 58,183,172,204, 2,128, 81, 83,144, 74, 77, 5, 60,189, 42, 93,253, 70,141, 29,142,251,247,239, 99,244,123, 35, 32, - 20, 10,193,231, 11, 42,159, 77, 97,165, 69,203,198,193,202,168,123, 83,163,209,212,180,225,213,126, 94, 12,195,160,218, 53,203, -204,204,172,230,156, 74,165, 2, 69, 81,250,238, 13,186, 79,175,238,184, 17,157,164,157,254,249,119, 42, 65,193,253, 8, 23,142, -219,245, 2,200,125,131,230,220,251,224,202,101, 78, 82, 43,107,176, 26, 13,252,134,143,174,121, 78,110,239,216, 34, 5,199, 73, -139,211, 82, 49, 43,242,228, 95,189,103,174, 9,255, 1, 24,210, 34,181,133,210,155,130,162,168,168,176,176,176,197, 0, 72, 88, - 88,216,226,234,227,240,240,112, 5,128,204,215, 20, 91,175, 88,185,248,127,133,200,170,158, 94,208,135, 62,125,250,204,178,180, -180,220, 84,125,156,113, 43, 19, 25,183, 50,225,219,198,175,123,135,192, 78, 37,227,198,141,131,189,189, 61, 22, 44, 88, 64, 0, -252,220,216,255, 79, 73,138,183, 0, 64, 92, 93, 93, 23, 84, 53,200,129,119,238,220,113,188,123,247, 46, 58,119,238,252,210,116, -207, 48,232,209,163,135, 62,170,178, 42,167,246,185,127,157,149,140, 3,195, 48,144,203, 21, 80,171, 25,104, 53, 28,180, 90, 45, - 58,250, 89,226,215,237, 97,149,223,105,171,173,103,149, 86,179,166, 46,150,176,180, 16,104,104,154, 82,220,139,205,105,176,197, - 84,171,213,136, 77, 75,195,131,231,207, 1, 0,111,135,235,119,124,253,245,226, 53,180,109,219,214, 80,106, 91, 54,117,115, 65, -214,249,216,202,198, 91,145,129,187,127, 30,132,165,165, 5, 0,192, 47,100, 2,132,194, 74,161, 85,161, 96,224,208,198, 29, 20, - 33, 58,195, 2,152,217,186,156,227, 11, 37,158,132,229, 64, 8, 7,194,177, 32,132, 3, 79, 32, 52,155,245,209,251,224, 56, 22, - 65, 65, 65,160,120, 60,176, 26, 21,198, 12, 27,128,162,146, 50,216,219, 24,215, 73, 8,133, 66,132,132,132, 72,117,157,127,242, -228,137,162,182, 48,211, 95, 71, 26, 84, 84, 40,160, 82,169,192,168,181, 96, 52, 90,176, 45,132,248,106,233,120,104, 25, 45,228, -239, 5,131,209,104,193,125, 58, 2,140, 90,131,116, 51,154, 14,240,117,208,208,160, 20, 49,137, 50, 43, 67, 66,171, 90, 28,232, - 66, 67, 62,129, 58,196,214,131, 41, 83,166,116, 12, 8, 12,188,255,110,255,192,117, 15,227,226,179, 30,198,197,191,114,157,103, -235,192,212,143, 35,246,207, 23, 8,165, 29, 67, 23,232, 95,117, 88, 27,181,167, 17,223, 16,139,203,202,202, 2, 44, 44, 44,144, -148,148, 4, 30,143, 7,138,162,158, 0, 8, 0, 0, 87, 87,215,167,124, 62,223,139,199,227, 97,243,230,205, 20,159,207,111, 23, - 28, 28,188, 88,169, 84, 30,212, 51,160,243,181,180,180,172, 99,205, 18, 10,133, 8, 11, 11,195,196,137, 19,107, 68,150, 80, 40, -196,174, 93,187,208,169, 83, 39,168,213,106, 95, 35,211,123, 23, 64, 79, 35, 44,126, 84,149, 56, 55, 40, 70,181, 90,237,148,130, -119,223,109,133,171, 87,209,221,203,171,109,199,142, 29,193, 48, 47, 13, 58, 94, 94, 94,238,101,101,101, 57, 10,133,226, 55, 84, -134, 33,136,209, 43,138,148, 28,210, 82, 42,221, 79,239,223,191,143,160,160,160, 26, 11, 86,109,107,150, 80, 40,132, 84,100,209, - 40,161,197,113,149,237, 82, 89, 89, 25,125,245,234, 85, 7, 31, 31, 31, 10, 0,124,124,124,168,152,152, 24, 59, 51, 51,179,252, -150, 45, 91, 26, 26, 0, 11, 1,160,247,192,145,252,243,103, 79,155,107,129,149, 57, 60,222, 74,190,193, 54,146,104, 88,142,211, -233,116, 47,181,178,198,174, 41, 99, 1, 0, 95,244, 31, 92, 51,216, 58,251,229, 98, 8, 4, 2,244, 91,176,248,149,103,137,227, - 56, 30, 76,248,159, 18, 89, 13, 89,180,222,172,111,126,105,209, 10, 15, 15,143, 15, 15, 15,127,197, 58,214, 72, 24,182,104,213, - 54,221, 53, 22,213, 15,171, 46,172, 95,191, 30,237,218,181,211,219, 17,109,218,180, 9,123,246,236, 89, 15, 32,165,209, 38,199, -126, 29,252,176,225,104,188, 87,107, 63, 10, 0, 86,126, 58,140,174,168,168,192,245,235,215, 97,109,109,141, 39, 79,140, 14,251, -101,105,109,109,253, 37, 77,211, 99,120,245, 87, 0, 52, 44, 48, 89,142,227, 34, 75, 74, 74,116,134,119, 32, 4, 96, 52, 90, 84, -200,149, 80,171,213,248,244,243, 31, 12, 38, 34, 28,160, 24,117, 25, 63,164, 87,176, 84,151, 69, 39,168, 93,111,124, 50,201,226, -149,206,155, 71, 3, 52, 13,180, 15,170,180,184,196,220,137, 7,199, 1, 44, 7, 56, 56,217,226,231,125,235,244,138,124, 45,203, - 85,141,142, 89,148,171, 88,248,118, 13,197,139,196,171, 53, 22, 36,145,176,114,202, 88, 40, 16,128, 35, 84,101,212, 7, 93,173, -174, 72,234, 89,148,157,226,189, 61,234, 33, 62, 12,109,135, 67, 23, 98, 49,186,127, 0, 46,223, 78, 64,159, 46,109, 17,159,252, - 28,126,222,205,176,121,103, 36, 8, 65,217,143, 27,190,206,121,217,161,105,211,140,177,104,221,186,117, 75, 81,223,138, 85,251, -157, 24,238, 15, 65,200, 75,139,150, 66,169,194,130, 69, 70,133,222,169,172,163,158, 93,165,198, 92,172,207, 98,101,140, 16,171, -111,217,130,129,240, 44, 45, 0,116, 2, 22,254, 39, 27, 78,150,101,113,234,212,169,154,250,104,168, 30,107,215,157, 17, 34, 7, -105,105,105,136,143,143, 71,215,174, 93, 81, 82, 82, 2, 1, 77, 99,254,195,135,104, 59,105, 18,212, 66, 33, 56,142,131, 72, 36, -194,140, 25, 51,140, 46,207, 70,182,206, 85,142,215,172, 33,242,117,193,193,193,173,146, 42, 42, 16,255,232, 17,250,175, 88, 1, - 0, 56,125,250,116,157,123, 98,222,188,121,162,132,132,132,105,247,238,221,155,150,149,149,181, 30,192,124,157,237, 44, 81,213, -248,104,189, 59,126, 20, 90,249,180,192,158, 95,246,213,156,159,247,217, 28, 8, 4, 66, 8,132, 2,216, 88,219, 24,149, 27,141, - 70, 83, 35, 90,229,114, 57,125,250,244,233,166, 3, 6, 12, 16,206,153, 51,135, 2,128, 61,123,246,208,223,127,255,189,249,249, -243,231,133, 77,154, 52,201, 54, 96, 33, 40,205, 44, 80,137, 1,192,195,195, 3, 63,108, 59, 65, 15, 29, 58, 20,115,230,204,129, - 70,163,193,150, 45,149,207,213,184,113,227,192, 48, 12, 14, 31, 62, 92,253, 28,235,181, 70,105, 25,230,149,251,134,162, 40, 8, - 4, 2, 8, 69, 66,128,227, 64, 81,148,249,154, 53,107, 86,198,199,199,119,246,241,241,129, 74,165,154,132,202,197, 31,166, 56, - 90,255,101, 98, 75,159, 22,105,200,215,170,202, 42,165, 11,178,218,126, 91,186,132, 90,109,159, 45,188,222, 2, 10,227,124,180, - 26, 2,143,199, 51,104,173,170, 94,170,171, 15,243,230,205,131,165,165,165,174, 14,136, 60,124,248, 48, 33, 59, 59,123, 59,128, - 31, 94,171,114, 46, 70,199,127, 57,119, 68, 25,170,230, 86,109,108,108,242,251,246,237, 91, 14,128, 57,120,176,238, 0, 89,165, - 82,233,236,192,173,173,173,191,220,177, 99,199,236,225,195,135,211,245, 67, 12,212,158,222,171,126,105, 52, 26, 28, 60,120,112, -246,194,133, 11, 81, 82, 82, 50, 87, 95, 39, 46,175, 80, 64, 81,229, 8,253, 52,238,144,177,141,186,206, 83, 22, 54,174,104,218, - 34, 64,103,103, 66, 11, 43,125,136,156, 61, 94,118, 96,150,150, 18,176,122, 56, 41,138, 78,121,158,158,213,196,221,197, 14, 79, - 51,100,112,110,214, 14, 69,153, 47,203,129,207,231, 65, 80, 53,117,104, 99,101, 14, 89, 94, 30,104,154,167, 87, 24,127,189, 55, - 26,183,227,158,227,240,133, 24, 48,202, 10,108,216,125, 22,140,170, 28,140,178, 2,140,178,242,125,245,194, 15, 64, 81,200,209, -168, 42, 90, 55,166,222,249,124, 62,186,116,233,162, 83,232,100,102,102, 26,105,209, 34, 53, 22, 45,133,178,145,117,100,220,200, - 73,175,197,170,250,252,235, 10,131,234,144, 15, 82,169,180,211,174, 93,186,195, 56, 52, 4, 23, 23,151, 51, 22, 22, 22,205,141, -189,190, 17,193, 75, 87,219,216,216,124,233,227,227,227,187, 97,195, 6, 1,143,199, 67,191,126,253, 90,187,184,184,164, 1,128, -159,159,159, 91,117, 27,243,241,199, 31,147, 91,183,110,197, 85,142, 49,116, 67, 36, 18, 61,178,182,182,238,212,167, 79, 31,148, -148,148, 32, 35, 35, 3,230,230,230,104,187,110, 29, 30,126,252, 49, 2,183,110, 5,221,183, 47, 40,138,130, 72, 36,194,195,135, - 15, 33,149, 74, 31, 41,149, 58, 67,190,117, 1,240, 45,128,238,120, 57, 93, 72, 0, 92, 71,101,216,133,219, 13,180,119, 52, 0, -176, 28,103,168,178,198, 47, 88,176, 0,197, 2, 1, 48,116, 40,132, 41, 41, 96, 24, 6, 93,187,118,173,177,178,119,237,218, 21, -124, 62, 31, 1, 1, 1,112,115,115,195,230,205,155,199,235, 19, 90,202,114, 6,105, 41, 47, 16, 28, 28, 92, 99,185, 26, 58,116, -104,141, 69, 75, 32, 16,212, 88,182, 40,214,176,112,165, 40,138,212, 30, 36,179, 44, 75,241,249,124,254,220,185,115,169, 81,163, - 70, 17,181, 90,205,137, 68, 34,250,240,225,195,212,229,203,151,249, 21, 21, 21,134,172, 13, 21,239,189,247,158,147,187,123, 83, -100, 60,141,199,161, 67, 4,235,215,175,199,181,107,149, 81, 54,146,146, 42, 23,174, 86, 31,247,233,211, 7,205,155, 55, 7, 49, -112,227,251,143, 24,131, 47, 6, 12,169,108, 79,154, 59, 66, 32, 20, 64, 36, 20, 98,193,163, 23, 53,117,109,181,107,191, 40, 34, - 34, 98,180,143,143, 79,229,212, 62,192, 55,197,209,250,239,130, 1, 67,143,172,158, 72, 82,215, 58,150, 1,160,170,142,101,181, - 4,149,140,162,168,187,132,144,206,245,174,173, 62,175,174,247, 94,125,254,193,107, 36,191,122,175,195, 87,196,151,190, 17,113, -242,205,155, 55,189, 59,118,236,136,244,244,244, 87, 86,194, 85,119, 92,230,230,230,144, 74,165,184,113,227, 6, 0, 36,235, 34, -187,124,249,242,247,168,140,186,140,170,105,131,224, 62,239,246,190, 17, 52,184, 51,246,134,239, 43,201,206,206, 14,192,203, 24, - 58,148,155,155,219, 68,129,136, 63,214,203,223, 35, 4, 28,247,237,197,147,215, 87,232,203,161, 87,107,191,114, 0,138,234, 85, -135,175,185,250, 16, 52, 77,143, 25, 62,124, 56,157,144,144,128,177, 99,199, 98,207,158, 61, 58,175,157, 56,113, 34,246,239,223, -143,225,195,135,211,139, 22, 45,210, 25,222,161,174,181, 68,253,151,221,148, 73, 79, 30,224,215,253, 59,116,250, 32, 57, 57, 85, -250, 99,229,229,229,215,124,215,185,163,254,153, 17, 78,171, 62, 31,125,239, 78,112,183, 94,253,132, 25,185,197,224,180, 42, 40, -203, 94,254, 94, 94,156, 11,162, 85, 66,104,102, 7, 23, 7,107,220,191,249,187,154, 81, 43,207,235,227,156, 61,220, 15, 31, 15, -243, 5, 8,135, 17,243,127, 70,212, 15,179,106, 70,208, 61, 70,205,193,197,131,223, 25,237,227, 87, 31, 2,129, 0, 15, 31, 62, - 84,232,178,102,241,120, 60, 99, 98,114, 85, 89, 29, 53,144,203, 21,144, 43,148,127,101,219,225,232,236,236,252,163,173,173,173, - 68,135,144,114,116,116,116,252,209,222,222, 94, 98,236,212,161, 46,145, 85, 21, 87,235,222,148, 41, 83, 26, 37,182,196, 98,113, -243,228,228,228,154, 96,165,250,222,213,106, 53,250,244,233, 99,108,240,210,147, 0,158,185,186,186, 94,111,219,182,173,245,211, -167, 79,177,111,223, 62,161, 64, 32,240,168,110, 63,202,202,202,192,227,241,144,151,151,167, 1,240, 62, 12, 76,157,169, 84,170, -171, 87,175, 94,109, 63,108,216, 48,222,163, 71,143,192,227,241, 42,211, 21, 28,140,192,173, 91, 17, 55,119, 46, 66,158, 63,135, -146, 97, 32,145, 72,112,238,220, 57, 70, 46,151, 95,213,197, 39,149, 74,183,167,166,166,250, 73, 36, 18, 48, 12, 3,142,227, 64, -211, 52,197,231,243,123,216,216,216,108, 2,208,185, 94,101, 57, 5,118,238,211,134,213,106,217,236,244,167, 50, 67, 5, 80, 80, - 80,128,147, 39, 79,162,107,215,174, 8, 9, 9, 65,102,102, 38, 82, 82, 82,240,214, 91,111,213, 92,243,224,193, 3, 68, 71, 71, -163,101,203,150,134, 45,122,180, 6, 45,219, 52,135, 80, 40,172,180,230, 8,132, 85, 3, 31, 65,141, 37, 75, 40, 16, 66,192, 23, - 64, 34,149, 24,109,209,162, 40, 10, 52, 77,131,162, 40, 72,165,210,234, 65, 54,215,180,105,211,236,194,194, 66, 87, 0, 60,169, - 84, 10,150,101,245, 14, 90, 56, 66,188,133,249, 55,178,230, 47, 92,235, 20, 30,126, 1, 23, 46,228,129,166,105,184,186,186,130, -166,105,164,166,166,130,166,105,120,122,122,130,166,105,100,102,102, 86,139,196, 34,232, 22,195, 53,207, 13, 69, 81, 53, 34, 75, - 40, 18,214, 88,182, 0,160,184,184, 88, 57,124,248,240,223, 84, 42,213, 84,188,222,174, 39, 38,252,141, 65, 81,212,221,255,196, -111, 27,129,161, 85,194,234, 21,167,120,125, 55,227, 91,221,186,117,219, 58,110,220,184,126, 27, 55,110,132,133,133, 5,178,179, -179,107, 58, 68,145, 72, 4,119,119,119, 20, 22, 22, 98,219,182,109,120,241,226,197, 37, 0, 51,140, 77, 81,118,118,246,173, 39, - 49,201, 5,125, 70,119,179,247,235,214,198, 38, 35,249, 69,215,236,236,236, 27, 85, 34,235,231,113,243,222,154,218,103,100, 16, -132, 34, 1, 50,158,228,224,226,201,235,255, 47,149,201,227,241,120, 20, 69, 97,236,216,177, 70, 93,255,222,123,239,225,234,213, -171,208, 55,205,200, 85, 91,180,228, 74, 84, 40,254,186,129,213, 39,179, 38,226,147, 89, 19,107,196,132, 49, 83, 47, 0,224,230, -118, 64,143, 95,191, 93,233, 0, 0, 32, 0, 73, 68, 65, 84,208, 98, 54, 70, 29,216,246, 97,135,160, 96,207, 78,126,205,113,251, - 94, 12,246,110,125,105,100,216,249,253, 74,124,179,243, 18,220,157,109,193,168, 42,112,230,208, 79, 57,140, 74,190,241, 53,141, -114,149,226,150,162, 64, 8,215,168,188, 87,139, 39,129, 64, 0,127,127,127,157, 22,173,194,194, 66,133, 33,107, 86, 77, 29,169, - 53, 40,175, 80, 64, 33,255,203,132, 86, 96,143, 30, 61,206, 71, 70, 70,218, 59, 57, 57, 33, 43, 43,171,190,208, 10,236,222,189, -251,249,200,200, 72,123,103,103,103,100,100,100, 24, 29, 86,164, 1,145, 5,153, 76, 70, 21, 21, 21,113,182,182,182,141, 18, 91, - 52, 77, 67,165, 82, 33, 49, 49,209,216,191, 53,122, 53,151,181,181,245,174,253,251,247, 91,231,231,231,131,199,227, 33, 49, 49, -177,206,170,195,234,215,207, 63,255, 44, 28, 49, 98,196,142,226,226, 98,189,203,218,180, 90,237,250,137, 19, 39, 78,203,204,204, -180,117,114,114, 66,118,118, 54, 68, 34, 17, 8, 33,160,250,244, 65,207,103,207,192,176, 44,164, 82, 41,146,146,146,176,125,251, -246,138,170, 80, 49, 13, 26,200, 40,138,242, 22, 10,133,152, 48, 97, 66,157, 19,187,119,239,198,219,157,120,157, 28,173,249,229, - 90, 72, 84,185,210, 33,103,120, 60, 30, 21,216,165,111,235, 46,189,134,250, 63,142,187,253, 84,150,251,194, 80,163,164, 81,171, -213,240,241,241,193,221,187,119,113,225,194, 5,244,237,219, 23, 33, 33, 33,136,141,141,197,239,191,255,142,232,232,104, 80, 20, - 5,123,123,251,106,247, 11,189, 62, 24,106,185, 22,121, 89, 5,175, 88,175,234, 31, 11,133, 66,168, 20,198, 45,238,123,244,232, - 17,238,222,189, 91, 19, 90,134,199,227,105, 39, 77,154, 4, 66, 8, 73, 77, 77,133,165,165, 37,153, 50,101, 10,203,231,243,181, -153,153,198,249, 7, 91, 88, 88,192,219,219,187,206,192,167,250,213,179,103, 79,220,187,119, 15, 52, 77,131,207,231,195,201,201, - 9,215,175, 95, 55,120,227, 87,139,170,106,145,197, 23, 10,234,136, 62,142,227,202, 98, 99, 99, 63, 4, 16, 91,101,201, 2, 76, -113,180, 76,248,255,195, 41,188,186,177,180, 65,139,214, 51, 0,253,247,237,219, 55,254,216,177, 99,235, 55,109,218,228, 24, 26, - 26,138,162,162, 34,120,122,122,194,213,213, 21, 81, 81, 81, 56,125,250,116, 62,203,178,243, 1, 52,100,250,233, 15, 61, 49,107, - 50,159,102, 71,170,202,203, 63,238, 24,226,139, 75, 7,255, 8,119,113,113,153,193,227,241, 62,157,178,248,157,169,189,135,119, - 70, 82,116, 42,110,253,254, 16,185,233,249, 6, 57,235, 59,195,219,216,216, 76, 51, 51, 51, 19,161,129,165,196, 13,172, 58,172, -225,100, 89,150, 85,171,213, 56,112,224,128, 81, 98,107,223,190,125, 80, 42,149, 96, 95,157, 95,173,225, 36, 28,161,248, 2, 49, -220,220,125,192, 48, 21,224,184,215, 94, 80, 89,195, 89, 61, 2,125, 42, 18,193, 41, 63, 31,183,111,223, 54, 78,114, 15, 29,106, -168,142,148,106,101,217,132,239, 86, 45,136,154, 25,246,173, 77,223,110,237,241,197,186,221, 96,152,157,160,121, 52,164, 98, 33, - 58, 6,117, 7, 15, 42,252, 24,241, 89,177,188,180,104, 2, 94,221,138,167, 14, 39,209, 55,195, 66, 0,150,227,112,225,218, 29, -163,243, 94,107,154, 3,124, 62, 31, 79,158, 60, 81, 52,180,218,144,199,171,156,230,172, 30,169,235,227, 36, 28, 71, 9,132, 18, -184,123,182,133, 90, 85,254,151,212,145,147,147,211,103, 71,143, 30,181,175, 14,149, 16, 27, 27, 11,138,162, 18, 95, 90, 28, 43, -207, 43, 20, 10,196,197,197, 33, 54, 54, 22,168, 92,225,102,244,115, 84,109,201,146,201,100, 84,118,118, 54,204,204,204,232,216, -216, 88, 85, 64, 64,192, 61, 3,207,119, 13,167, 82,169,124,174,203,127, 82,169, 84, 54,145, 72, 36,130,122, 29,158, 91,171, 86, -173,146, 26,152, 66,124, 37,157, 37, 37, 37,183, 23, 46, 92,216,113,240,224,193,248,236,179,207, 10,109,109,109, 45,127,252,241, - 71, 62,143,199,163,102,206,156,201,230,229,229,149,255,244,211, 79,214,199,142, 29, 67,113,113,241, 13, 35,242, 94,166, 84, 42, - 63,236,214,173,219,238,179,103,207,154,121,123,123,163,180,180, 20,132, 16,236,218,181, 11, 51,103,206,132, 68, 34, 65, 82, 82, - 18,222,126,251,109,185, 92, 46,255, 16,175,250, 78, 86,115, 82, 20, 69, 17,142,227,176,108,217,178,154,224,164,213,193, 74, 45, -165, 20,182,207,107, 97, 62,231,167, 18,243,241, 95,252, 52, 9, 0, 88,173,150,125, 28,119,251,233,174, 31,190,184, 44, 20, 10, -175, 25,168,163, 37,115,230,204,249,113,232,208,161, 82, 11, 11, 11, 20, 22, 22,226,250,245,235,184,121,243, 38,110,221,186, 5, -181, 90, 13,123,123,123,216,218,218, 34, 59, 59, 27,143, 30, 61, 82, 0, 88,162,143, 83,100, 38,128, 87,235,234,149,191,149, 22, - 44, 65,173,213,134,181,173, 91, 66,129,192,168,231,168, 87,175, 94,232,210,165, 75,181, 88, 97,211,210,210,178, 85, 42, 21, 85, - 75,244,103, 86, 11,114, 15, 15, 15,237,158, 61,123,136, 33, 78,142,227, 94, 17,211, 61,123,246,172, 25, 20,118,233,210, 5, 60, - 30, 15, 49, 49, 49,186, 92, 83,234,112,222,218,190, 25,103,191, 90, 2,145, 80,136,249,137, 25, 53,162,107,119,223, 14, 16,136, -132,240, 29, 54,170,246,111,183,160,114,186, 16,245, 68,150,190,254,232,141,159,119, 19,231, 63, 30,217,120,141, 45,120,170,177, - 87,169, 84,158,249,224,131, 15, 34, 2, 3, 3, 63,216,176, 97, 3, 37, 20, 10,177, 98,197, 10,146,149,149,245, 75,213,136,161, -232,117, 82, 69, 8,249,229,202,145, 27, 31, 77, 14, 27, 78,205,219, 56,165,199,189,139,113,143,218,117,243, 70,187,110,222,184, -119, 41, 1, 63, 44,222,183,135,213,176,203,114,114,114,210, 13, 80,169,250,119,111, 83,223, 25,222,254,234,229,139,246,141, 93, -117,200,113, 92,228,190,125,251,102,143, 28, 57,146,190,115,231,206, 43, 62, 89,213,219,238,112, 28,135,243,231,207,131, 97, 24, -252,242,203, 47, 28,199,113,186,227,104,129, 28,255,110, 99,196,228, 95,126, 61, 46, 18, 9, 41,220,188,118, 24, 37, 69,250, 87, -117, 9,133, 2,252,188,235, 8, 35, 20, 10, 30, 55,116,158, 97,152,140,139, 23, 47, 58, 15, 98, 89, 1, 77,211, 13, 9,168, 6, - 17, 25, 25,169,225, 56, 46,205,192,101, 55,114, 95,164, 15,251,250,179,247,247, 13,125,247, 3,231,110,221,122, 8, 28,156,156, - 65, 81, 20,242,114,243,144, 20,119, 71,115,230,240,142,220, 10,185,113, 91,240,188,191,246, 74,141, 79, 22, 0,132,206,220, 84, -227,159, 5, 0,195,166, 44, 68,159,174,126,160,140, 49, 61,189, 20, 89,156, 86,171,133,185,185, 57,180, 90,109,131, 33, 30,172, -173,173,165, 74,165, 82, 81, 21,136, 81,239,136,153, 0,127,121, 29,177, 44,235, 91, 84, 84,132,138,138, 10,220,188,121,147,172, - 90,181, 74, 38,147,201,106,156, 54, 53, 26,141,111, 97, 97, 33,202,203,203,113,227,198, 13, 18, 17, 17, 33, 43, 40, 40, 88,220, -152,103, 72, 42,149,118,226,243,249,247,138,138,138, 56, 51, 51, 51, 90,163,209,104, 2, 2, 2,196, 82,169,212,232, 13,213,179, -179,179, 7,235, 58,231,229,229,149,156,156,156,220,138,101,217,218,123, 32, 10,149, 74,165,119,183,110,221,140,105, 63,230,236, -220,185, 19, 71,142, 28, 9, 42, 45, 45,157,152,150,150,182, 27, 64, 16,159,207, 71, 76, 76, 76,162, 82,169, 28, 55,114,228,200, - 93, 69, 69, 69,183, 81,185, 5,143, 49, 56,155,148,148, 52,193,215,215,119,231,151, 95,126,105, 17, 18, 18,194,119,115,115, 67, -231,206,157,145,148,148,132, 83,167, 78,105,182,108,217, 82, 33,151,203,223, 7,112, 94,127,181,131,210,106,181, 16,137, 68, 53, - 47,177, 88, 12,161, 80,136, 50, 5,193,244,117, 41, 10, 45,164,138,245, 43, 62, 60, 69, 0, 42, 39, 35, 37, 63, 47, 39,227, 54, - 69, 81,215,178,179,179, 75,116,148,153, 72,169, 84,182, 39,132,240, 40,138,218,200, 48,204,148, 89,179,102,185,174, 94,189, 26, -109,218,180, 65,126,126, 62,204,205,205,225,237,237, 13,153, 76,134, 59,119,238,176,114,185,124, 43,128,149,168,242, 31,209,133, -226,252, 82, 52,117,241,168, 99,249, 36,132,128,176,128, 70,197,130,101, 8,212,148, 6, 2,129, 6, 66,161,208,152, 41, 21,194, -113, 28,138, 92, 93,193,197,197,225,214,173, 91, 32,132,232,180,170,249,248,248, 24,101, 33,101, 89,246, 21,161,117,251,246,109, -240,120, 60,244,232,209, 3,209,209,209, 53, 22, 45,163,252, 18, 9, 7,145, 88, 84,103,186,144,162, 40, 8, 69, 34, 8, 68,194, -134, 86,227,152,172, 88, 38,252,109, 96,236, 60,118, 49,128, 25, 15, 30, 60,216,221,187,119,239, 40, 66,136, 0,149,243,145,127, -188,201,159,231,228,228,220,191,113,234,254, 34,231,166,182, 17, 67, 38,246, 64,155,246,158, 96,181, 44,174,159,142,193, 47,171, -143,237,207,204,200,156, 2, 35,246, 62,227, 56,238,114,247, 78,109,104,212,138,213,237,230,230,198,189,206,170,195,146,146,146, -229,243,231,207,199,103,159,125,246, 58,171, 14, 27,196,195, 71,178, 25, 20, 72,211, 97, 67,122, 14, 2, 69, 19,181, 90,165,167, -225, 67, 77,228, 82,161, 80,240,248,110,108,118, 64, 67,215,201,100,178, 65, 83,167, 78, 61,207,231,243,155, 55,166,204, 57,142, - 75,203,205,205,237,103,248, 74,237,117,149,162,212,251,228,254,109,115,207, 30,217, 57,136,227,216,150, 20, 0, 30, 95,248, 84, -195, 48,231, 84,138,210, 13, 48,114, 83,233, 53, 51,130, 49,231,187,223,177,249,179, 97,152, 21,113, 16, 59,150, 77,199,162,117, -251,240,237,103,115,176,106,211,111,248, 98,206, 4,140, 30, 63,149, 35, 20,253,167,177,249,224,241,120,103,183,109,219, 54,121, -250,244,233, 53,139, 22, 8, 33,117, 26, 97,141, 70,163,224, 56, 14, 91,183,110,229, 0,156,213,199, 87,183,142, 40,162,207, 95, -202,216, 58, 42, 45, 45,125, 63, 56, 56,120, 23, 0, 49, 33,228, 73, 81, 81,209,191,128,151, 91, 67,149,151,151,191,223,173, 91, -183, 93,132, 16, 49, 69, 81,175,156, 55, 6, 85,161, 30, 58,217,218,218,222,171,178,100,137, 95,199, 33, 94, 95, 81,235,153, 86, - 52,102, 10,145, 3, 48,171, 86,196,247,213, 65, 65, 65,181, 55,149, 78, 44, 42, 42,234,244, 26,233, 58,175, 80, 40,252,150, 45, - 91, 54, 87, 34,145,244,145,203,229,173, 1,192,220,220, 60, 73,165, 82, 93, 86, 40, 20, 27, 96, 56, 54,149,154,227,184, 36,173, - 86,235,239,232,232, 88,185,162,182, 74,108, 1,192,137,123,236, 61,128,237, 92,105, 20,223,107,116,194, 78,159, 62,221,204,214, -214,118, 32, 69, 81,163, 9, 33, 62,101,101,101,170,101,203,150,221,136,140,140, 44,105,222,188,249,144,161, 67,135, 82,118,118, -118,184,123,247, 46, 41, 40, 40, 56, 12, 96, 49,140, 88,105,205,113, 92,218,154, 53,107,208,216,231, 93,223,121,134, 97,114, 78, -159, 62,237, 48, 56, 47,143,207,113, 28,134, 13, 27, 86, 71,192,213,199,227,199,143,161, 82,169, 12, 6,115, 44, 46, 46, 70, 80, - 80, 80,157, 1,106,245, 43, 45, 45, 13,118,118,118,117,254,199,208, 24, 75, 85, 82,132,190,115, 23, 2, 85, 43, 74,171, 81,105, -201, 34, 32,106,147,174, 50,225,239,139,127,247,230,155, 70,153, 22, 93, 93, 93,199, 74,204,197,159,120,182,118, 13,200, 74,201, - 75, 40, 43,145,239,201,206,206,222,166,163, 33, 55,138,179,145, 1, 75, 77,230,223,127, 19,231,203, 56, 90, 44, 8, 97, 65, 56, - 2, 66, 56,112, 28, 91,185,225, 53,225, 64, 88,150,162, 40,252,169, 86,232,141, 12, 94, 63,157,182, 14, 14, 14, 43, 9, 33,131, -121, 60, 30, 93,187,161,174,253,185,202,146,117, 86, 38,147,125,209,128,229,245,191,174, 60, 35, 35, 35, 27, 20,255,198,174, 58, - 28, 51,102, 12,219,200,103,243,178,185,185,185,107, 67,231, 42, 42, 42,210,179,179,179, 7,254, 77,202,179,246,138,193,198,112, - 54,122,213,161, 33, 78, 79, 79, 79, 49,195, 48, 29, 0,120, 83, 20,101, 3,160,144, 97,152,115,249,249,249,185, 0, 58, 1, 88, - 86,245,155,175, 0,220,251, 15, 63,239, 82, 7, 7,135,157, 52, 77, 55, 53,230,199, 90,173, 86, 93, 88, 88, 56,185,222,128,224, -229, 20, 60,192,147, 8,133,119, 64,211, 77, 26,122, 30,117,125, 6, 33,153, 21, 10, 69, 16,245,178,205,175,225,180,183,183,191, -199,231,243,155, 26,145,182, 23, 5, 5, 5,157, 76,109,242,127, 53,231,127, 51,234, 59,193,235,140, 20,255,239, 16, 90, 38, 78, - 19,167,137,211,196,105,226, 52,113,154, 56, 77,156,255,235, 66,171,193, 99,211, 18, 88, 19, 76, 48,193, 4, 19, 76, 48,193,132, - 55,195,169,122, 98,235, 84,245, 7, 74,143, 42,109,140, 73,240,117,148,237, 5, 19,167,137,211,196,105,226, 52,113,154, 56, 77, -156,255, 56, 78, 19,254, 66,152,204,170, 38, 78, 19,167,137,211,196,105,226, 52,113,154, 56,255,215,161,115,234,144, 54,149,141, - 9, 38,152, 96,130, 9, 38,152, 96,194,191, 7, 70, 11, 45,115,103, 31, 95, 7,207,128, 93,182, 77,219,197,218, 54,109, 23,235, -224, 25,176,203,220,217,199,247, 31, 90,110, 82, 0,227,249,124,254,121, 23, 23,151, 82,232,216,122,231,127, 0, 86, 0, 70,163, - 50,190,207, 8, 0,102,127, 37,121, 8,192, 31, 11,124, 50, 9, 72,159, 4,164,143, 5, 62, 9,249, 31,244, 27, 92, 49,219, 53, -248,218,153,241,103, 86,204,118, 13,110,240,252,124, 87,251, 91,191,143,249,110,245, 39,110,118,127,209, 95, 90, 58, 57, 57,109, -119,118,118,126,238,228,228,148,230,228,228,180, 19,128,181,169,185, 51,193, 4, 19, 76,248,183,161,218, 71,171,250, 85,227,163, -197, 7,128,168,168,168, 16, 0, 87, 0,244, 14, 13, 13,189, 90,255,215,182, 30,254,211, 91,182,104,249,217,215, 43, 22, 83, 46, - 78, 14,102, 90,150, 99, 82,159,103,180, 93,254,117,196,161, 44, 17,127,125, 81,122,220,142,215, 72, 20,197,227,241,198,138,197, -226, 80, 0,213,130, 45, 81,165, 82, 69,177, 44,123, 0,198, 45,211,134,179,179,243, 53, 30,143,215,172, 49,127,204,178,108,122, -110,110,110,143,215, 44,204, 49, 30, 30, 30, 59, 67, 66, 66,204,130,130,130, 32, 18,137,176,108,217,178,249,217,217,217, 27,140, - 37,176,181,245,178,100,196,146, 79,249, 34,209, 0,162, 81,251, 19, 16,128, 22,199,113, 90,213, 69,161, 74,181,190,168, 40,165, -204, 72,170,197, 0,166, 84,149,213, 14, 0,107,222,228, 46,153,220, 30, 26, 13, 91,121, 79, 8,249, 96,143, 63,179,190,178,100, -201, 18,126,104,104, 40,118,236,216,209, 99,251,246,237, 31,150,149,149, 93, 4,112, 2,192,211, 55,189, 43,157,129, 25,221,122, -244,248,110,242,252,249, 60,197,181,107,248,110,231,206,141,168,140,183,180,185,177,247,146, 80,136,209, 14, 14,130, 80, 66,208, -129, 2, 40, 10,136,145, 21,112,167, 25,134, 61, 0, 35, 98,177,233,193,120,212, 93,142,191,183,177, 4, 37, 79,201, 82,241, 48, -223,158, 37, 79, 47, 47, 5, 48,164,254,121,173, 82, 50,153,240,220, 67, 21, 36, 58, 3,192,186, 55, 44, 86, 51, 71, 71,199,216, -227,199,143, 55, 13, 10, 10,226, 3,192,189,123,247, 38,133,134,134,246,149,201,100,254, 0, 74,255, 67,141,144,132, 79,211,159, -136, 4,130, 1, 44,203,182, 3, 0, 30,143,247, 80,173,209,156,215,114,220,102, 24, 25,147,205, 4, 19, 76,248,223,133, 33, 45, -242, 55,135,206,200,240,213,153, 35,181,223,107,195,220,169, 77,219,174,253, 70, 61, 46, 41,147, 43,159, 63,207, 44,154,247,201, -170,243, 31,206, 89,123,108,221, 79, 81,167,175,222, 78,188,229, 27, 52, 48,193,220,169, 77, 91, 29,212,186,230,112, 61,164, 82, -233,253, 45, 91,182, 48, 73, 73, 73,164,184,184,152, 60,126,252,152, 28, 62,124,152,124,244,209, 71, 74,169, 84,122, 31,128,135, - 49,156,206,206,206,185,143, 47,253, 78, 94,196, 70,147,180,123,183,137, 70,163, 33, 12,195, 16,134, 97, 72,194,217, 40, 18,123, -226, 8,137, 57,124,128,168,213,106,162, 86,171,137, 74,165, 34, 45, 90,180,200, 50, 50,157,245,225,230,231,231,167,142,138,138, - 34,135, 14, 29, 34,243,231,207, 39,129,129,129, 44,128,153,198,230,221,220,201,187,143,101,147, 0,217,244,176,205,204,169, 27, -231, 72,252,179, 24, 18,255, 44,153, 68, 94, 72, 36, 83, 22,108, 98, 44,155, 4,202,204,157,188,251, 24,202,187,173,173,109, 87, -138,162, 72, 53, 0,144,102,205,154,149,215,126,121,120,120,212,121,185,187,187,151, 55,111,222,252,169,189,189,125,135,134, 56, -199,181, 3, 33, 9,123, 9, 73,216, 75,150,244, 2,137,143,143,191, 69, 8,185, 82,253, 82, 40, 20, 87,142, 30, 61,122,229,157, -119,222,185, 2,224,109, 61,229,100, 84,121, 78, 2,210,203,142, 31, 39,100,195, 6, 66, 66, 66, 72, 34, 64, 38, 1,233,141,228, -108,225,226, 34,136, 89,187,230, 67,245,241,227,191,144, 51,103, 78,145,211,167,163,200,177,163, 59,201,198, 13,159, 48,206,206, -130, 56, 0,173, 26,193,201, 7,176, 10,192,122, 84, 90, 46,147,100, 50, 25,201,201,201, 33, 0,146,170,190, 91,239,232,232,184, - 14, 13, 91,223,250,215,182,100,205, 29,236,114,230,221, 33, 61, 72, 89, 73, 22,121,119, 72, 15, 50,119,176, 75, 29,203,214, 96, - 47, 47,203, 89,195,218,201,226,239,237, 97,103, 13,107, 39, 27,236,229,101,249,154,229, 73,161,114,159,208, 45,151, 46, 93,210, -146, 90,208,104, 52,100,247,238,221,172,173,173,237, 47,141,224,108,237,232,232,152,102,103,103,151, 84,251, 75,199,128, 17,221, -124,122, 78, 90,110,223,246,157,144, 70,164, 51, 72, 34, 20,190, 56,127,240, 71,182, 32,253, 33, 81, 43,114, 73,201,147,104,242, - 34,241, 22,217,189,109,189, 70,196,231,191, 0, 16,244, 38,247, 82, 35, 97,226, 52,113,154, 56,255,134,156,250,180,200,127, 51, -248,245, 51, 88, 31, 98,177, 40,108,249,146,133, 84,113, 65,177, 66, 89, 90,166,214, 40,149, 74, 90, 72,148, 15, 19,158,229,209, -124, 94,241,220, 57,179, 45,195, 22, 45, 9,171, 0, 38, 24,249,159, 30,129,129,129,119,142, 28, 57,226,100,103,103,135,146,146, - 18, 20, 20, 20,224,206,157, 59, 32,132, 96,228,200,145,226, 46,157, 59,119, 88,186,108,217,205, 23,153,153,193,208,221,241,190, - 20, 47,118, 14, 88,211,163,114, 47,218, 47,158, 23, 84,246, 58, 20,133,237, 99, 66,107,174, 89,249,162,114,183, 12,137, 68, 82, -179, 33,241,107, 32,184, 95,191,126, 66, 0,152, 54,109, 90,105, 89, 89, 89,120,149,133,195,168,157, 86,205,157,188,251, 56,184, -186, 69,253,184,117,141,180, 93, 75,111, 48, 26, 45,210,114,178,192, 23,216,160,105, 83, 33,166, 78, 24, 32,232,213,205,206, 97, -213, 87,219, 79,229,112, 24, 33,207, 79, 62,167,139,203,198,198,102,247,129, 3, 7,112,240,224, 65, 0, 64, 82, 82, 18,188,189, -189,205, 13,165, 33, 46, 46,206,235,237,183,223,222, 95, 80, 80,208,202,208,181,245, 3,227,139,197, 98,244,232,209, 3,109,219, -182,197,241,227,199,123, 87, 89,182,222, 8,138,107,215, 96,241,224, 1,112,245,181, 6, 47, 45, 58,118,244,188,117,250,212, 30, -135, 83,167, 19,177,110,221, 78, 60,125, 90,105,104,243,242,242,194,248,113, 99, 4, 15, 31,222,240, 27, 61,122,252,141, 63,254, -120,218,163, 74, 40, 25,194,151, 63,253,244,211,226,230,205,155, 99,244,232,209, 99,252,252,252, 92,172,172,172,176,109,219, 54, -184,186,186,122,169,213,234, 39,199,143, 31,119,203,201,201,193,236,217,179,145,155,155, 59, 95, 23, 81,239, 65,189,151,138,135, -249,246,108,211,113, 50, 44,172, 92,241,211,190, 3,120,124,127,119, 79, 21,147,184, 84,200, 94,157,168, 32,226, 41,178,116,139, -176,102,157, 66,236, 91,249,189, 13,207,142,209, 14, 74,246,143,103, 75, 7,180,136,224, 75,148,187, 87,172,203, 46,120,133,116, -116, 36,207,191,244,145, 93,220,121, 20, 0, 43,184,106,129, 85, 99,173, 37,120,187, 87,175, 94, 53, 21,247,252,249,115,168, 84, - 42,248,250,250,210,106,181,186,143,145,229,218,122,224,192,129,127,158, 62,125,218,190,117,235,214,178,194,194,194,154, 19, 46, -246, 54,131,174, 30,217, 56,123,213,119,191,249,252, 74,168, 98, 89,226,177,135, 6,184,130,186,119,237,120,225,204,145, 61, 22, - 84,121, 6, 68, 54,249, 0, 87,128,148,253, 63,131, 50,179,195,216,143,230,241,251,244,235,219,100,192,144, 81, 23, 30, 39, 63, -237, 7,224,174,105, 92,111,130, 9,255,104,171, 22,249, 95,203, 83,141,208, 10, 13, 13,165, 26,202, 32, 71,184, 0,103, 39,123, -233,198,181,187,238,242, 24,181,218,220,198, 90, 45,176,182,226, 40, 75,107, 30,163,214,148,123,122,121,138, 56,194, 5,232,224, -175,191,196,147,146, 74,165, 71, 78,156, 56,225, 36, 16, 8,192,113, 28, 28, 29, 29,145,154,154,138,226,226, 98,148,149,149,225, -105, 98, 34,154,123,184, 99, 69,216, 66,215,217, 11,195,142,200,229,242, 78,168, 59,141,248,202,178, 81, 86, 83,119,223,232,234, - 45, 88, 94, 25,242, 87,125,215,192, 57, 99,151,162,166,166,167,167,195,194,194, 2,254,254,254, 22,215,175, 95,255, 67,143,200, -170,195,105,107,235,101,201,137, 69, 7,183,252,184, 76,202,104,226,144,144, 82,136, 54,205,123,194,217,222, 3, 89,133,106,220, -186,115, 2,113,177,123,209,178,137, 7,102,126,212, 87, 18,177,230,208, 1,161,182,185, 71,113,113,106,105, 67,156,165,165,165, - 22, 45, 90,180,128,135, 71,229,190,103, 44,203, 34, 33, 33, 1, 44,203,214, 28,215,126,223,117,248, 18,180,165,105,152, 60,105, - 18, 10, 10, 10, 44, 26,226, 20,240,160,157,247,225,120,190, 84, 0,136,204,237,212,229,229,229, 53,219,112, 48, 12,131,152,152, - 24, 4, 7, 7,135, 68, 70, 70, 26, 82, 69, 70,149, 39, 3,124,251,221, 47,191,108,154, 80, 82, 66, 3,192, 14,138,226, 24, 66, -190, 53,246, 94,114,114, 18, 28, 62,123,230, 87, 7, 30,253, 8,118,214,223,224,206,157, 52, 48, 76,101,122, 11, 10,242, 48,235, -147, 82, 8, 5,150, 56,126,252, 55,123, 95,223, 30,135,115,114, 24,127,212,157, 70,108, 40,157,146, 51,103,206, 96,214,172, 89, - 72, 72, 72,112,171,222,163, 77, 42,149, 98,237,218,181, 60, 95, 95, 95, 55,115,115,115,156, 61,123, 22,185,185,185,148,190,116, - 94, 57,119,229,235,146,167,151,151,230, 80,103, 7,255,180,239, 0, 62, 24, 55, 22, 46, 36,229, 15,235,150,212,215, 3,135,117, -255,130,240,220, 67,205, 45, 3,108,189,253,135, 65, 40,178,192,204,207, 87, 34, 41,238,164,173,188, 44,246, 19,138,205,112, 95, -177, 46,114,206, 43,233, 60, 52,134,157,182,247,122,199,243, 30,119, 61, 31,196,124,120, 59, 59,122,123,236, 75,161,229,197,167, -104,214, 26,168,220,214,228,201,147, 39,120,250,244, 41,248,124, 62, 20, 10, 5,180, 90,109,131,233,116,115,115,155,161,213,106, -191,168,170,231, 93, 18,137,228,253, 61,123,246,216,215, 22,218,142, 1, 35,186,217, 91,154,247,203,205, 43, 40,186,113, 55,254, -241,188, 25,163,123, 95,187, 21,151,193, 8,222, 73, 47,137, 61, 94,162,163, 60, 37, 82,145,232,240,217,163,191, 89,104,158, 93, -130,185,111,111, 8, 44,188,193,106, 50, 33, 47,170, 64,217,211,108,168,126,252, 1,237, 63,153,139,147,199, 14, 89,248,181,235, - 20,169,210,104,188, 1,168, 95,227,217,108, 12, 76,156, 38, 78, 19,231,223,147, 83,167, 22, 33,132,116, 4,224, 92,117, 88, 80, -165, 11, 28, 0,228,163,114, 71, 1,231,170,182, 67, 84,235,103,245,143,107, 95, 91,255,184,246,231,130,170,207, 78, 85,239,119, - 41,138, 42, 52,144,116, 87, 84,110, 77,120,170,234, 29,168,154, 74, 52,232,120, 76, 81,116, 41,203,114, 98,161,163,147,114,218, -187,253,218,253,126,225, 94,140,153,131, 21,127, 80,239, 14, 33,119, 30, 62,187, 73,209,148,134,162,104,163,252, 62,120, 60,222, -216,141, 27, 55,182,179,178,178, 2,199,113,176,182,182,134, 76, 38,131, 90,173, 70, 73, 73, 9, 84,101,165, 96,202, 74,241, 32, -227, 57,186,135,244,198,168,193, 3,125,127, 59,118, 98, 44,203,178,251,245,241,186, 5,116,168,177,100,173,108,102,255,210, 52, -145, 81, 92, 35,186,190,233,224, 13,161,133, 5, 6,204, 11,123,147,123, 32,250,212,169, 83,103, 70,142, 28, 57,100,193,130, 5, -116,118,118,246,217,212,212,212,238, 0, 18, 12,138, 10,177,228,211,143, 63, 13,181,181,181, 32,136, 60,127, 2,189, 58,140,131, -153,136,135,130, 82, 6, 20, 5, 36,198, 31, 1, 69,217, 33, 54, 41, 27, 61,219, 91, 97,224, 32, 95,139, 99,135, 18, 23,224,165, -127,208, 43, 85, 83, 84, 84,132,188,188, 60,104, 52, 26,104, 52, 26,140, 30, 51, 6,191,238,222,141,138,138, 10, 40, 20, 10,168, -213,106,176, 44, 11,154,166,113, 62, 42, 18, 25,207, 18,209, 45, 56, 24,208,177,245,210,238, 24, 8, 0,220,122,252,248, 49, 18, - 19, 19,241,226,197, 11, 72, 36, 18,184,184,184, 96,229,202,149, 80,169, 42,247, 19, 27, 51,102, 76, 8,128,135,111,250, 64, 61, - 5,182,167,178,236,210, 33, 71,143, 58, 93, 63,122,148,187,117,242,228, 11,113, 89,217, 54, 99,126, 43, 20, 98,244,154,111, 63, -106, 99,110,110,142, 23,233, 27,225,227, 35,196,252,185,246, 8,255, 38, 31, 0, 48,123, 86, 83,116,238,228,128,210,226, 67,112, -112, 90,140, 77,155,230,180,156, 50,101,253, 36,185,156,221,101,128,122,233,137, 19, 39, 70,121,123,123, 55,137,142,142,166, 68, - 34, 17,164, 82, 41,164, 82, 41, 36, 18, 9,242,242,242,144,154,154, 74,214,172, 89,147, 9, 96,169, 62,162, 21,155,178,111, 2, - 24, 50,119, 48,206, 60,190,191,187,103, 19,222,179, 7,163,102,246,120, 30,123, 43,186,236,247,243,215,191,210, 42, 37, 25,197, - 47, 46, 44,108,209, 57,218,225,147,207,190,196, 15,107,150,227,241,237,107,133,206, 30,165,155,165,148,170,193,116,134,132,172, -224,187, 58,219,105,103, 76, 25,101,115,210,249,198,140,211,124, 74,150,147,127,127, 45, 82,163, 21,226, 86, 29, 38,182,246,162, -213,151, 46, 93,146,246,234,213, 11, 74,165,178,198, 50,185,103,207, 30, 78,171,213, 94,110,240,222,100,152, 47, 50, 51, 51, 93, - 21, 10, 5, 6, 15, 30, 60,123,237,218,181,230,213,251,201,177, 44, 91,199,146,245,245,134, 95,207,125,250,197,230,203,231,246, -127,227,246,117,216,251,189, 39,204, 92,117, 25, 58,246,145,228,211,244, 39, 39,143,238,116,145,216,106, 32,181, 27, 8,101,174, - 2,143,183,127, 0,121,169, 18,157,191,254, 18,128, 8,106, 13,141,109,195, 70, 67, 96,239,134,229,211,223,119, 91,178,237,167, -143, 56,142,219,104, 26,215,155, 96,130, 9,245,224, 76, 81, 84, 20, 0,132,133,133, 45, 14, 15, 15,143,167, 40, 42,138, 16, 18, - 90,101, 64,137, 34,132,132, 86, 95, 83, 37,206, 94, 57,174,190,182,254,113,253,207,139, 22, 45,242,139,136,136, 88, 29, 28, 28, -188,255,198,141, 27,207, 0, 24, 18, 90, 67,171,132,213, 43, 91,239,208,213, 10,178,246,123, 29,139, 22,199, 93,123,242,236,185, -124, 96,255, 46, 77,163,174, 62,188, 59,117,234,208,126, 99,135,245, 26,148,154, 94,144,216,210,211,197, 33, 62,254,161, 21,199, -113,215,140, 41, 37,177, 88, 28,218,183,111, 95,126, 81, 81, 17,204,204,204, 32,147,201,144,153,153, 9,134, 97,160, 44, 41,134, -170,164, 24,202,226, 34, 48, 37, 69,120,122,239, 14, 2, 90,122,137,171,156,229,245,162,218,234, 82,223, 82, 85,219,178, 37,178, -180,132,216,210, 18, 84,227,167, 13,223,177,177,177,185, 85,221,169, 50, 12,243,201,194,133, 11,243, 57,142,195,170, 85,171,172, - 44, 44, 44, 34, 1,136, 13,145, 88, 58,242, 66,131,219,251,211,143, 82, 99,209, 35,112, 50, 90,183,120, 11,169,185, 10,228,151, - 49,200, 43,102,208,185,215,247,104, 22,248, 37,220,219,135, 35, 49,173, 16,110, 77,188,105,240,197,122, 55,127,206,200,200,168, -115,188,127,223, 62,200,229,114,180,108,217, 18,227,198,141,195,194,133, 11, 49,110,220, 56,184,185,185, 97,194,187,111, 99,249, -242,229,200,201,201, 49,148, 84, 85,235,214,173, 85,158,158,158, 42, 79, 79, 79, 21,195, 48, 40, 47, 47, 71,113,113,113,253,242, -158,211,216,130,116,114,114, 90,228,226,226, 18,235,228,228, 20, 47, 22,139, 79,199, 80,212, 35,165,167,167,115,247,225,195,169, -182,239,190,203, 75,147, 74,169,171,128,133, 49, 92, 14,118,130,161,125,250, 14, 17, 21, 23,237,172, 49, 82,189, 63,213, 17,127, - 94,245,195,245, 63, 58, 97,214, 39, 45, 65,209, 18, 80,180, 8,242,138, 75,232, 18, 20, 44,180,177,161, 12,221, 75,227, 1,196, -116,239,222,221,109,230,204,153,148, 88, 44,198,236,217,179,153,233,211,167, 39,143, 27, 55, 46,249,226,197,139,172,167,167, 39, -220,221,221, 41,119,119,119, 87, 0, 49, 85,191,209, 11,171,150,212,215, 42, 38,241, 15, 27,111,243,103, 44, 28,186,149,107,196, -163, 87,172,203, 46,248,122,203,179,117,169,143,229, 94,143,111, 95, 43, 72,142, 59,201,165,222,189,146,159,149, 92,230,245,245, -150,103,235, 22,111,206,106,240,161,190,122, 21,220,145,168,171,140,188, 66,206, 31, 62,172,143,124,198,180,177,173,237, 44,252, -246,160,201,192,192,102, 30, 77, 39, 44, 95,189,137,153,254,209,167,204,142,159,119,146,178,178, 50,148,150,150, 98,211,166, 77, -218,147, 39, 79,102,178, 44,251,169,174, 49, 16, 0,104, 52, 26,204,152, 49,195,220,202,202, 10, 25, 25, 25, 53, 22, 81, 0,200, -150, 21, 60,188,126, 55,238,209,188,127,141, 9,169, 80,169, 84,231,174,220, 75,108,235,237,217,148,162,136,206,133, 40, 34,129, - 96, 64,167, 46, 93,120,132, 20,131,226,123,224,233,238, 53, 40,205, 41, 68,105, 94, 33,120, 2,115,104, 33,134,134, 19,193, 38, - 32, 8, 73,119,163,209,196,209,153, 47, 22, 8, 6,153,250, 19, 19, 76,248,103, 66,159, 22,169, 45,150, 34, 34, 34, 86,235, 59, - 95,235, 93, 93,239,184, 70, 72,213, 23, 97,181, 63, 3, 64, 68, 68,196,106, 66, 72,232,141, 27, 55,246, 1, 80, 24,153,133, 15, -107,189, 27, 31, 71,139,167, 84,135, 47, 88,184, 20,182,214, 82,235,160, 14,222, 46,199,207, 94,189,119,237,198,189,196,102,238, - 14,142, 68,163,182,253,118,253, 15, 77, 41,185, 34,194,200, 68,248, 58, 56, 56,128, 97, 24, 60,121,242, 4, 47, 94,188, 0,195, - 48,208, 86, 84, 64, 85, 92, 12,101, 81, 17,216,138, 50, 8, 89, 22, 10, 89, 30,236,205, 36,192,203, 21,137, 6, 44,111, 84,131, - 66,171,250, 93, 98,101, 5,177,165, 21,104,129,192,224, 78,241,181,208, 49, 40, 40,232, 96, 92, 92, 92,151,254,253,251,127,133, -202, 37,242,105,153,153,153,253,150, 45, 91,166,114,118,118,198,140, 25, 51,218, 0,152,108, 80,100,138,212,190,158, 46,109,208, -218,107, 50,154,185,247, 69,113,133, 6,178, 82, 13,242,138, 25,108,251, 62, 24,135,119, 4,225,207,195, 61, 17,119,110, 0,138, - 53, 46,176,112,123, 7,132, 85,251,233,227, 60,127,254, 60, 86,174, 92,137,175,190,250, 10,171, 86,173,194, 87, 95,125,133,204, -204, 76,248,251,251, 35, 61, 61, 29,103,206,156, 65,118,118, 54, 28, 28, 28,112,231,206, 29,108,216,176, 1,127,254,249,167,193, - 76, 87, 11, 87, 35,174,105,212, 92,186, 86,171,157,146, 61,124,120,187, 92, 59,187,182, 29, 58,116, 24, 50,123,246,108,175,238, -221,187,215,156,247,242,242,242,144, 74,165, 57,168, 92, 65,217, 94, 31, 23, 7,116,112,116,244,135, 90,245,168,170,142, 5,160, - 40, 9,250, 14, 72, 68,247,158,247,192,104,132,160, 41, 49,104, 90, 2,173,182, 0,182,182,110, 32,132,242, 55,144,196,101, 50, -153,204,251,194,133, 11,116,106,106, 42, 36, 18, 9, 0, 60, 95,177, 98,197, 15,235,214,173, 75,176,183,183,103,163,162,162,112, -236,216, 49,132,134,134,242,166, 79,159,238,237,238,238,190,213, 80,190, 87,108,202,190,185,119,253,153,247, 4, 26,219,246, 18, -105,179,230,168,176,120,231,227, 16, 7,115, 0, 56,155,146, 82,230,228, 81, 26, 81, 81, 22,155,110,211,180,252,155,179, 41,134, - 86,156,174,224,238, 39, 63,186,181,247,232,217,146,188,220, 34, 65,135,118,126,138,240,149,159, 9,155, 53,111,245,237,242,133, -255,114,201, 44,149, 20, 15,152,125,230,209,145,179,119,202, 39, 78,253, 64, 59,237,195,153,202, 51,103,207, 31,229, 56,174, 29, -116,172, 56,228, 56, 14,217,217,217,136,143,143, 71, 74, 74, 10,100, 50, 25,242,243,243, 81, 86, 86, 86, 51,221,104, 86, 86,122, -234,135, 95, 78, 62, 48,151, 74,205,186,180,243,246,184, 29,157,144,103, 46,149,154,121, 55,247,104, 13,172,104,176, 29, 97, 89, -182,157,196, 76, 10,128, 66,113,220, 53,148, 23,149,163,188,184, 28,101,133,229, 80, 49, 60, 40, 85, 52, 20,106, 26,158, 33, 3, - 81, 94,161, 68,121, 65, 9, 56,150, 13, 52,117, 55, 38,152, 96,130,158,190, 62, 42, 44, 44,108,177,145,215, 26, 61,189, 89, 95, -120,133,133,133, 45,166, 40, 42,106,209,162, 69,126,208,189,160,170, 54,182, 55,240, 2, 96, 68,120,135,130,130,228,114, 75,202, -119,228,220,207,191, 56,179,239,231,239,157, 84, 42,121,186,189,173, 5,107, 97, 38,114,152, 54, 99, 21,202,202,139, 70, 84, 24, - 31,142, 0, 69, 69, 69,120,246,236, 25,164, 82, 41,132, 2, 1, 88,133, 2,172,162, 2,138,162, 2,208,140, 10, 66,150,133,157, -153, 20,158,110, 46,104,230,236, 98, 20,231,147, 75,191,215, 56,190,215,158, 46, 92, 19,228, 11,145,185, 5, 68,150, 22,248, 56, -234, 10, 0, 64, 40, 20, 2,203,190, 50,202,104,210,164, 73,147, 19,123,247,238, 21,202,100, 50,196,196,196, 60, 0, 80, 2,192, - 18, 0,151,152,152,120, 33, 46, 46, 46,212,219,219, 27, 0, 90, 26, 34, 43,205,167, 89,141,150, 32, 35,231, 57, 82, 95, 68,195, -206,186, 5, 4,102,173,145, 87,204, 64, 44,109, 1,141,234,229,236,163,178, 52, 13, 10,134,103, 84,222,213,106, 53,180, 90, 45, -180, 90, 45,212,106, 53, 62,252,240, 67, 92,191,113, 3,251,143, 93,196,179,167, 73,104,211,220, 5,147, 38, 77, 68, 80, 80, 16, -110,220,184,161,151,107,114,123,104,154, 88,128,191,126, 8, 13,145,133,189,170,235,194,115,183, 13,137, 45,138,162, 8,116, 76, - 69,214,195,186,224,224,224, 86, 73, 21, 21,136,127,244, 8,253, 87,172, 0, 0,156, 62,125,186, 78, 94,230,205,155, 39, 74, 72, - 72,152,118,239,222,189,105, 89, 89, 89,235, 1, 52,236,108, 78,128, 83,167,110,226, 95,255, 74,128, 76, 38, 3, 0, 28,216,247, - 82,151,166, 62, 99, 48,120,104,229,140,150,141,141, 13,214,175,247, 55,170, 60, 89,150,197,246,237,219,107,166, 11, 1,128,207, -231,119,159, 55,111,222,200,134,174,111,213,170,149,208, 16,231,220,209, 77, 36,127, 62, 32,159, 88,183,106,230,103,229, 16,128, - 2, 77,180,127,116,102,246,172,185,163,155,108,220,112, 40, 83, 41,165, 84,187, 40, 54,195,157, 47, 81,238, 54, 38,141, 41,103, -191, 87, 23,120, 78,217,157, 35, 43, 93, 50,243,131,241,246, 86, 54, 78, 21, 59,126, 8,183,165,121, 52, 57,113,143, 41,246,243, -178,183,121,167,235,119,229,255,154,187, 44, 90,173,205,152,137,140, 19, 73,208, 19,226,130,101, 89,100,101,101, 65, 38,147, 33, - 61, 61, 29,249,249,149,211,175,249,249,249,224, 56,238, 77, 26, 68, 40,210,211,145,118,116, 7,154, 77,156,136,206, 95,173, 4, -203,241,161,144,179, 88,223,173, 31,138, 74, 20, 80,113, 20,220, 58,118,195, 7,167,255, 0, 77, 88, 96,219,102, 83, 79, 98,130, - 9,255, 80, 24, 19,222,161, 90, 16,133,135,135,135,254,213,255, 95, 91,108,133,135,135,199,135,135,135, 55,230,191,234, 79, 25, -214, 28, 87,251,104, 93,169,229,128,246, 74,167, 89,150,159,152,146,144,192,207,170, 80, 84,152, 57, 59, 57,170,204, 36, 98,174, -164,180,140, 23,253,240, 1, 83,145,243,244,113, 35,242,145, 24, 23, 23,231,159,149,149,133,244,180, 52,104, 21, 21,160, 85,106, - 16,165, 28,253,123,116,131, 4,128,132,166, 32,228, 24,240,121, 34,148,149,151, 2, 64,162,193,206, 81,163,121,197,178, 69, 81, - 20, 68,150,150, 16,153,155, 67,100, 97, 89,199,194,101,140,197, 70, 44, 22,239,141,140,140,116,109,210,164, 9, 86,174, 92,137, -166, 77,155,250,184,185,185,201,173,173,173,165,206,206,206,104,219,182, 45,186,117,235,134, 51,103,206, 0, 70,196,148,210,104, - 37,177,143,159,163,123,126,225, 13,252,113,229, 71,168, 21, 42,116, 8,249, 17, 12,191, 25, 28,253,190, 4,247,100, 15,228, 57, -199, 43,173, 7, 46,195,240, 34,253, 57, 40,158, 40,222, 88,203, 83,245,231, 7, 15, 30, 96,223,241,171,112,245,244, 69,122,242, - 35, 60,186,124, 1,215, 29,237,225,233,219,182,102, 26, 72,103, 26, 89,240,191,222, 92, 25, 38,106,233, 39,227,197,133,133,133, - 98, 59, 59, 59, 85,117,217,185,186,186,190,137,216, 26,191,127, 26, 81,117, 0, 0, 32, 0, 73, 68, 65, 84, 96,193, 2, 20, 11, - 4,192,208,161, 16,166,164,128, 97, 24,116,237,218, 21,157, 59,119, 6, 0,116,237,218, 21,124, 62, 31, 1, 1, 1,112,115,115, -195,230,205,155,199,235, 18, 90, 52,133, 24,173,182,192,199,203,203,171, 70,104,237,254, 85,134,232,123, 3, 64, 65,132, 77, 63, - 60,169,185,214,195,195, 3, 57,217, 41,160, 40, 18,103, 32,141, 95,185,184,184, 44,115,117,117,245, 90,183,110, 29, 79, 34,145, -224,163,143, 62,106, 81, 94, 94,222,172,202,148,140, 69,139, 22, 1, 0,150, 47, 95,142, 21, 43, 86, 64,165, 82,201,117,145,237, - 94,223,206, 45,175,144,155, 70,202,205, 70,244,113,104,214,174,239,160,254,104,225,221, 23,125, 7,165, 3,192,106, 59,254,243, -119,191, 93, 98,115,212,198,146,218,249,251,217,243,203,123,132,244, 93,178,176,252,242,215,223,108, 47, 54,232,243, 88,146,182, -171,236,177,104,236,134,239,183,254,186,225,139, 69,115, 36,233, 50,117, 81,102, 17, 41,183, 16,243, 45, 90, 58, 83, 22,179, 62, -255,234, 89, 86, 86,202,124,100,156, 53,184,210,146,227, 56,164,164,164,212,248,244, 41,149, 74, 84, 84, 84, 32, 35, 35,163,230, -158, 81,152, 91, 13,158, 57,117, 88, 96,133, 66, 33,191,253, 48, 57,125,233,236, 9,193, 21, 10,133, 60, 57, 53, 61, 9,216,212, -160, 26,163,105,250,161,188, 76,222, 95, 94,172,132, 44,230, 49,154,246,243,132, 70, 75, 65,173,101, 33, 43, 40,131, 74, 11,176, -180, 0,126,239, 78, 2, 75,241,145,159,149, 9,154,199,123,128,186, 78,251, 38,152, 96,194, 63, 7,122,181, 72,181, 69, 43, 56, - 56,120,127,109,171, 83,245,103, 0, 42,232,119,229,145,213, 22, 83,213,211,137,186,254,167, 30,175,177,120,197, 71,203, 96,120, -135,234,255,116,183, 46,117, 91,179,124, 66, 83, 78,171,109,147,151,159,171,229,243,197, 2,119,107, 69,118, 97,186,241,255,174, - 82,169,162, 46, 92,184, 48,124,192,128, 1,226,228,135, 15,160, 46, 41,129,186,164, 24, 2, 78, 11, 59,105, 39,208,140, 10,148, - 90,141, 38, 62, 28,148,101, 82, 92,189, 30,167, 81,169, 84, 81,198, 10, 45,154,199,171,235,151,101, 97, 1,177,165, 21,196, 22, - 22,245,167, 22, 13,137, 2,179,129, 3, 7,246,235,218,181, 43, 8, 33,216,190,125, 59, 24,134, 17, 49, 12, 3,181, 90, 13,134, - 97, 80, 90, 90,138, 95,127,253, 21, 91,182,108,185, 14,224, 23,131,157,153, 86,125,225,220,249, 75, 65,239, 79, 8, 21,156,142, - 90, 15,173,154,133,130,106,138,138, 10, 13,202,213,102, 96,237, 39, 2,185,167,192,227, 75, 16, 28,208, 2,199, 15, 29, 97,160, - 85, 93, 52, 82,133,215,177, 10,101,164, 63,199,139,167, 73,176, 40,205,129,163,149, 25,228, 41, 73,232, 48,105,242,107, 89, 39, -220,221,221,193,113, 28,250,244,233, 83,227, 92,253,186, 98,171,160,160, 0, 39, 79,158, 68,215,174, 93, 17, 18, 18,130,204,204, - 76,164,164,164,224,173,183,222,170,185,230,193,131, 7,136,142,142, 70,203,150,250,141,132,249,133,154,211, 47, 50, 98,198,188, -243,206, 59,194, 91,183,110,129, 16, 2,111,111, 43, 88, 89,154,131,162,197,240,245,117, 2, 80, 57, 6,232,221,187, 55, 74, 75, - 83,180, 69, 69,228,180,129,236,238, 5,112, 76,173, 86, 63,233,213,171,151,219,211,167, 79, 49,119,238, 92,254,129, 3, 7,170, - 77,201, 8, 11,171,187,152, 66,161,208, 61,117,223,166,157,207,103, 45,180,182, 33, 18,105,179,230, 86, 14, 1,104,225,221, 23, - 0, 48, 32,244,125,180,104,229,129,210,252,216,230, 74,197,243, 17, 66,126,145,109,236,166,204, 4,233, 80,255,169,202,188, 43, -201,168,156, 58, 53, 88,237,138,228, 3,185,233,130,137, 7,143,157, 56, 51,227,173,208,183, 5, 26, 86,171,245,247, 20,216, 68, - 30, 61,149,151,153,150,254, 29,210,207,198,189,180,255,233,181,226,177,165,165,165, 48, 55, 55, 71, 92, 92,156,106,232,208,161, - 98,154,166,241,228,201,147, 26,161,229,228, 96,215,182,123,103,127,159,175, 55,252,122,206, 92, 44, 22, 15,234,221,201, 55, 33, - 57,237, 5, 33,212,115,157,214, 86,141,230,252,195,152, 7,125, 28,221, 90,241, 82,174,220,130,125,207,183,160, 82,209, 80,168, - 57,168,180,128,150, 39,132,107,251, 46,176,105,233, 11, 2,224,238,173,235, 26,149, 70,115,206,212,215,152, 96,194, 63,218,170, - 69,244,137,164,170,207,133, 0,158,135,135,135,231,215,178, 54,201, 0, 60, 0, 16, 88,117,157,172,222,239,100, 20, 69,221, 37, -132,116,174,197, 35,171, 37,184,106,127, 86,215,187,230, 65, 35, 68, 86,237,247,186, 66, 75,215,146, 74, 0,112,112,112,112,234, -208,161, 83,203,159,126, 62, 8, 66, 8, 30, 71,175, 69, 81,222, 35, 44, 91,125,179,101,147, 38, 77, 66, 50, 51, 51,175, 26,147, - 2,150,101, 15,236,220,185,115,126,151,142, 29, 58, 52,111,218, 20, 15,158,167, 66, 72, 88, 8, 89, 22, 52,163, 2,159, 85,163, -169, 63, 11,154,178, 64, 86, 86, 9, 34,246, 30,140,171,138, 18,175, 23, 62,111,189,141,149, 47, 74, 64, 81, 20,214, 5,251, 67, -100,105, 1,161,185, 5, 62, 62,113,169, 70, 92, 69,173, 92, 4,145,133, 5, 90,118, 49, 42, 32,188,252,242,229,203,247, 30, 62, -124,216,217,223,223, 31,243,231,207,199,243,231,207,193,113, 28,114,115,115,149,217,217,217,153, 50,153,236, 57,128,163, 0,126, -130, 17,145,199,133, 42,229,198,168,195,187,103, 6,247, 8,113,120,103,196, 22, 28, 59, 52, 15,197, 37,165,144,107,165,168, 80, -106, 81,161,226,193,206,190, 29,186, 4, 4, 32, 43, 51, 15,241,183,206,149,243, 85,242,181,141,185, 65, 41,138, 66,116,116, 52, -188,220, 44,145,244,199, 85, 56,152, 9, 16,232,230, 2,183,238, 61,106,226, 75,233,131,128, 7,237,248,241,227,107, 34,195, 15, - 28, 56, 48,117,226,196,137,174,243,230,205,195,207, 63,255,140,235,215,175,191,226,160, 29, 18, 18,130,107,215,174,125, 9, 96, -185, 33,163,158, 90,173,134,143,143, 15,238,222,189,139, 11, 23, 46,160,111,223,190, 8, 9, 9, 65,108,108, 44,126,255,253,119, - 68, 71, 71,131,162, 40,216,219,219, 67, 83, 41,158, 53,186,200, 24, 6,145,223,124,187,115,241,134, 13, 91,252, 38, 76,152,128, -195,135,247,227,253,169,109, 64,209, 98, 80,148, 24,111, 15,107,131,149, 95,221, 69,151, 46,189,225,224, 32,192,134,245,199,159, - 41, 20,236,175, 70, 20,227,215,191,255,254,187,155, 82,169, 68,113,113, 49,177,176,176,160, 10, 10, 42, 87,180, 54,100,209,146, -203,229, 18, 93, 68, 15,239, 39,174, 45, 46, 35, 69,164, 60,122, 68,161, 54,186, 93,223, 65, 25, 24, 16, 58, 21,231,163,126,193, -165,115, 23, 96,199,127,158, 10,243,178, 51,249,169,249,165,217, 21,222, 91,125, 59, 78,231,189,168, 56,183,117,214,219, 73, 60, - 87, 87, 46,114,209,143,165,197,250,132, 22, 0,170, 48, 97,207,137,163, 4,111,119, 11,238,210,202,223,195, 85, 84,148,159, 71, - 14, 29, 63, 19,199,164, 30, 62, 89, 75, 96, 17, 3, 66,125,101, 88, 88,216, 23, 85,159,119, 45, 93,186,116,122, 68, 68,132, 99, - 78, 78, 78,141,143, 86, 94,126,225,165,110, 67,103,177, 5,197, 37,234,157, 27, 62, 31, 45,149,136, 69, 75, 35,118, 94,209,240, -112, 75, 23,175,150,227, 54,191, 59,119,217,156,228,199,209, 77,154, 73, 69, 56,254,249,114, 60,248,253, 50, 52,180, 16,255,186, -112, 27, 42,134, 69,113,126, 1, 46, 78,251, 4, 22,206,182,216,114,229,112, 46,199,113, 63,154,186, 26, 19, 76,248,231, 66,151, - 22,161, 40,170,161, 24,123,185, 13,124,119, 87,223,239,116,240,252, 21,208, 25, 21,222,168, 37,120,249,249,249,121,215,174,221, -198,149,168,175,113, 53,234,107,196, 71, 63, 64, 86,166, 26,153,185, 74, 88, 89, 89,221,212,243,211,250,145, 99,137, 92, 46, 31, -185,116,217, 23, 57, 18,169, 25,122,245,235, 7, 23, 71, 39,152, 9, 5,224,105, 57,240, 40, 1,202,101, 54, 72,138,149, 99,225, -206, 61,121,229,114,249,200, 6, 58,137,254,186, 68, 6, 69, 81, 16, 91, 89, 66,100, 97, 9,177,165, 85,157,105, 68,137,149, 21, - 36,150, 86,224,139, 68, 13, 57,195,191,194, 89, 94, 94, 62,106,244,232,209, 69, 37, 37, 37,152, 62,125, 58,174, 94,189, 26,125, -238,220, 57,171,216,216, 88,169, 76, 38,107, 5, 96, 32,128,109,122, 68, 86, 29,206,162,162,148, 50,162, 85,141, 13,255,226, 83, -133, 82,107,143, 49,147, 15,192,156,206,128,150,229, 64, 0,184,217,137,208,189,255, 87,200, 83,119,195,129,173,171,228, 28,163, -156, 80, 47,134, 86, 29, 78, 66, 8,113,118,118,126,165, 12, 46, 92,184,128, 49,163, 71, 97,208,136,225,112,108,238, 5,167,254, -111, 97,208,244,127, 97,235,214,173,160,105, 26, 14, 14, 14,245, 59,222, 26,206,221, 49, 16,236,123, 8,106,223, 67, 80,187,162, -193, 7, 48,105,207,158, 61,223, 4, 6, 6, 94,190,126,253,250, 90, 0, 99,107,255, 87, 45,172,168,103,205,106,168,142,150,204, -153, 51, 71,145,156,156, 12,115,115,115,104,181, 90, 92,191,126, 29, 91,182,108,193,186,117,235, 16, 29, 29, 13,123,123,123,180, -108,217, 18, 42,149, 10,119,239,222, 85, 0, 88,162,135,147,147,201,180,163, 54,109,138, 40, 8, 13,237,137,157, 59,127,128,139, - 75, 55, 8,248, 46,224, 11, 28, 97,110,225,131, 29, 63,125,131, 33, 67, 58,224,196,241,131,133,249, 5,218, 81, 0,180, 70,220, - 75,202,219,183,111, 99,235,214,173, 24, 61,122,116,230,152, 49, 99,216,146,146,146, 26,139, 22, 33, 4,132, 16,172,168,242, 49, - 83,169, 84, 98, 93,156, 31, 44,140,203,252,124, 85,252,202,220,156,204,174, 87, 47,223, 28,127,233,220, 5, 60, 75,190,132, 75, -231, 46,224,143, 75, 55,194,114,115, 50,187,118, 8,106, 45, 28, 57,125,230,103,187,143, 28,230, 89, 88,185, 98,247,145,195,188, -113,179, 62, 93,213,105, 80,223, 37,134,238,249,170,122, 36,229,121,185,139, 86,175,253,190, 92,203, 40,233, 53,223,109,206, 82, -200,178,151,212,186, 47,137,161,251, 83,161, 80,108, 83, 42,149,110, 74,165,210, 77,165, 82, 45,121,254,252,121,175,249,243,231, -203, 88,150,173,177,150,202, 18, 78,220,124,244,231,174,213, 78, 14,182,210,110,157,253,218,172,223,118,232, 74,122, 70,238,111, -181, 98,104, 53,148, 78,101,185, 66, 57,106,248,200,137, 21,197, 69, 42, 4,127, 26, 6, 78, 98, 1, 21, 11,104, 8, 15, 90,138, -143,135, 95,175,135,212,206, 18,123, 83,239,203, 75, 52,204, 40,212,141,161,165, 47,239,111, 2, 19,167,137,211,196,249,247,228, -252,111,134, 43,234,238,117,232, 90,199,162,101,104, 73,101,147, 38, 77,122,189,243,118,127,244, 14, 93, 10, 66, 8, 30,221,255, - 22, 69,178,199,104,226, 34, 70, 74,122,105, 48,128,171,141, 72, 76,250,243,140,140,174,115,150, 44, 61, 50,102, 96, 63, 95,255, -230,205,197,205,154,121,194,220,201, 9,249,249, 50,252,121, 43, 65,179,106, 95,100, 92,149,200, 50,106, 98,146,227,184, 74, 39, -119, 0,253,230, 44, 4,197,227, 1, 85, 97, 28,170, 59,198,230,157,187,129,226,243,193, 18, 14, 42,149,202,152,213,114, 47,158, - 62,125, 58,106,194,132, 9, 23,163,162,162,232, 65,131, 6,181, 63,122,244,232,155,236,153,135,138,188,228,203, 0, 66, 87, 45, -154,113,160,107,223,225, 86,222,126,157,132,157,154,241,192,104, 40,100,101,166, 33,234,200, 29, 38,225,246,185, 82,162, 85,142, -149,231, 39, 95,214,199,197, 48, 76,122,171, 86,173,156,183,110,221, 90,227, 12,207,178, 44,242,243,243,113,243,230, 77,180,235, -220, 5,190, 83,167, 65, 38,147, 97,211,166, 77,240,240,240,192,176, 97,195, 80, 88, 88, 8,173, 86,107,236,132, 47, 11,224, 92, -213, 11,245, 68, 22, 85,181, 5,144,222,105, 67, 47, 47, 47,145, 82,169,108, 79, 8,225, 81, 20,181, 81,173, 86, 79, 89,180,104, -145,235,234,213,171,209,166, 77, 27,228,231,231,195,220,220, 28,222,222,222,144,201,100,184,115,231, 14, 43,151,203,183,162,114, - 35,107,153,129,244, 61,185,115, 39,181,235,236,217, 31, 31,249, 38, 98,134,183, 82,213, 91,100,103,215, 3,132,104, 33,147, 61, - 71, 89,233,117,230,171,149,191, 60,205,205,211,140, 4,144,108,100,158,151,207,156, 57, 19, 0, 36, 0,150,166,164,164,196,248, -250,250,122,235,178,104, 25,131, 13,135, 50,149, 0,246,141, 26,228, 54,183, 52, 63,214,219,142,255, 60,181,171, 63,183,105,195, -161, 76,165,149, 91,197,215,249,207,175, 38,101, 87,156,219,186,251,200, 97,222,228, 17,163,216,166, 22,201, 97, 18, 39,114,200, - 8,106, 18, 24, 24,232, 78, 81,133, 45,242, 10, 30,223,123,127,250,140,119,173,133,138,211,129, 77, 11, 90,210, 30, 29, 36,209, -209,209,169,104,228,202,208, 42, 36,101,102,102,246, 90,180,104,209, 57, 66, 72, 29,223,132,188,252,194, 75,193,161, 51, 73,113, -113, 73,140, 44,241,132, 49,177,212,238,220,185, 31,221,207,191, 93,135,195,223,172,142,112,238, 61,103, 62, 63,233,242, 21,128, -213, 32,237,234, 21,176, 98, 53,183,254,198,249,220, 18,134, 25, 1, 83, 84,120, 19, 76,248,199, 91,179,244,105,145,191, 57,134, - 66,135, 51,188,209,153,241,106,209,228, 92, 27,239,102, 3, 61,154, 58, 2, 0, 82, 82,179,144,146,154,249,123,202,179,204, 65, - 6, 20,175,174,229,149, 53,155, 74, 83, 85, 33, 28,136,113,155, 74,215,225,180,183,183,191,199,231,243,155, 54,166, 52, 88,150, -205,202,207,207,239, 96,100, 58,199, 53,111,222, 60, 34, 45, 45,237, 8,199,113,115, 27,169,246, 27,228,172,222, 84,154,230,139, -250, 19,173,186, 29, 0, 80,124,145, 49,155, 74,215,230,108,103, 97, 97,177, 77, 32, 16,120, 84,215, 99,181, 15, 22,203,178, 60, -134, 97, 36, 44,203,242, 0, 80, 52, 77,107, 5, 2,129,146,162, 40,173, 86,171, 77, 87,169, 84, 51,240, 50,224,168,190,188, 27, -236,232,171,132, 22, 26,176,104, 93, 0,128,228,228,228,214,182,182,182, 99, 41,138, 26, 77, 8,241, 41, 43, 43, 83, 45, 91,182, - 44, 58, 50, 50,178,180,121,243,230,131,135, 14, 29, 74,197,198,198, 34, 46, 46,142, 20, 20, 20, 28,170,178, 98,165, 52,242, 94, -162,197, 98,222,123,118,118,244, 80, 66, 16, 8, 2,138,162,241,176,164,132, 59, 45,151,179,191, 85, 9,198,198,222,159,213, 24, -223,172, 89,179, 95, 82, 83, 83, 5,186, 44,169,186,242, 94, 31,223, 46,241, 91, 26,220,179,231,168,155,127,252,113,244,243, 85, -241, 43,107,159,155, 53,220,246,253,113,159,204,249,118,223,230,239, 62,255,254, 88,209, 78, 99,210,217,190,125,123, 47,138,162, -198, 2,240, 39,132,180, 34,132,146, 80, 20, 41,162, 40, 42, 30, 64,172, 90,173,142, 74, 72, 72,120,241, 6,121,127,157, 17,174, - 46,206,154, 77,165,193,178, 1, 44, 64,140,220, 84,250,255, 59,157, 38, 78, 19,167,137,243, 63,199,249,223,140, 15, 27,248,206, -184,200,240,213, 72,121,150, 57, 40,229, 89, 38, 90,181,106, 69,158, 60,121,210, 40,145,166,171,147,102, 89,118,191, 92, 46,223, -255, 38, 36, 5, 5, 5,157,254,205,133,183, 47, 53, 53,117,223, 95, 73, 88, 37,164, 86, 86,189, 94, 23, 15,203,203,203,187, 24, -123, 49,195, 48,255,142,178,161,170,172, 89, 95,234,186, 96,224,192,129,105, 12,195, 92, 0,144, 65, 81,148, 13,128, 66,134, 97, -206,105,181,218,220, 39, 79,158,116, 90,191,126,125,117,228,251,175, 0,220,123,205,116,112, 42, 21,187, 55, 43,139,221,251,111, -200,227, 94,181, 90, 61,207,222,222,190,165, 82,169, 20, 41,149, 74, 97,237,197, 7, 82,169, 84,166,207, 33,190, 54,108, 44,169, - 93, 66,126,145,189,141, 37, 85, 95, 72,193,174, 9, 14, 43, 42,226,218,216, 53,193, 97, 99, 19, 22, 19, 19,147, 18, 24, 24,184, -135,166,233,230,132, 16,103,128, 88, 19, 2, 25, 33, 36,159,207,231,103, 38, 36, 36,100,254,141, 26, 33,165,150,227,214,106,213, -234,151,126,135,166,213,133, 38,152, 96,194,255, 14,116,250,104,241, 27,203,244,228,201, 19,202, 84,158, 38,212, 22, 91,250, 78, -166,165,165,169, 0,220,168,122,213,199, 61, 0,195,254,238, 25,204,206,206,238,160,235,156,177, 34, 11,168,244,217, 2,226, 26, -140,206,190,226,251,162, 50,124,127,228,179,198,166,237,193,131, 7,233, 48,114,138,221, 4, 19, 76, 48,193,132,127, 27,222,220, -162,101,130, 9, 38,152, 96,130, 9, 38,152, 96, 66,131,216, 94, 75,112,213,177,110, 81,208,189,114,160, 49,115,175,175,179,250, -224,130,137,211,196,105,226, 52,113,154, 56, 77,156, 38,206,127, 28,231,255, 42, 94, 17, 89,255, 31, 48, 45,125, 53,113,154, 56, - 77,156, 38, 78, 19,167,137,211,196,249, 79, 16, 89,245, 95, 0, 76, 83,135, 38,152, 96,194, 63, 24,145,145,145, 70,109, 42,250, -222,231, 59, 66, 45, 44,108,151,149,151,150, 68,236, 95,251,254,209,234,239,199,140, 25,195,154, 74,209, 4, 19, 76,192,235, 56, -195,183,104,209,180, 45,205,114,221, 9,161,121,132, 38, 26,170, 84,113, 32,165,168,168, 78,216, 1,119,119,119, 27, 1,141, 97, - 20, 33,230, 20,197,177, 28,143,190,254,236,217,139,132, 70, 36, 76,100,107,107, 59, 83, 40, 20,246, 87,171,213, 77,105,154,126, -161, 82,169, 46,200,229,242, 31,240,106,224,194,255, 24, 90,183,110, 61,238,202,149, 43, 54, 61,122,244, 80, 73,165, 82,173, 66, -161,224,159, 61,123, 86, 60,100,200,144,226,167, 79,159,190,214,138, 68, 55, 55,183,190, 59,118,236,104, 49,104,208, 32,180,106, -213,170, 98,236,216,177,194,224,224, 96,225,244,233,211,159,101,101,101, 93,106, 36, 93, 91,138,162,126,165, 40,138,199,113,220, - 36,188, 12,221,240, 87,131,166,105,122, 6, 69, 81, 35, 8, 33, 94, 20, 69,165, 16, 66,142,114, 28,167, 47,112,171, 62,140, 2, -240, 22, 77,211, 29, 0,128,227,184,104, 0,167, 1,227, 87,222,253,127,114,154,153,153,181, 7, 0,185, 92, 30,243, 87,113, 82, - 20,213, 30, 0, 8, 33,175,203, 57, 85, 42,149,126, 0, 0, 10,133,226, 39, 24,177, 29, 84,125,144,173, 62,164,195,151,143, 0, - 0,209,203,125, 0, 0,141, 57,166,254,245,136,106,204,127, 53,196,215, 24,142, 6,240,214,132, 9, 19, 86,255,246,219,111,203, - 1, 28,255,119,220,248, 46, 46,238, 63,172,251,110,187,219,167, 51,167, 69,160,114, 71, 8,253, 15, 36, 48, 64,196,227,189,173, -102,217, 63, 18,128,255, 99,239,186,227,162,184,186,246, 51, 51, 59,219,119, 97,119,169, 75, 17, 5, 5, 17, 80,192,130, 61,162, - 38, 26,187, 70, 44, 81,177,196, 22,163, 38, 70,141, 26, 53, 26,107,140,137, 61,182,216,123,141,130,189,247,138,198,138,157,222, -251,194, 46,219,103,190, 63, 96,121, 81, 41,139,154,188,201,251,113,126,191,113,156, 97,230,217,123,239,220,242,220,115,207, 61, -103, 47, 0,142, 66,161,232,207,227,241, 90,235,245,122, 37,135,195, 73,209,235,245, 23,243,242,242,118,162,130, 8, 8, 86,151, -235, 99,200, 13, 26, 56, 19,204,127,226,188,177, 36,116, 92, 17, 82,137,122,200,249, 7,116,163, 36,128,241,197,121,221,128,242, -221,121, 84,212,249,124,237,226,226,210, 83,165, 82,105, 40,138, 98, 81,180,235,185,232,159,162,191, 19, 12,195,164,103,103,103, - 15,170, 12, 75, 92, 3,117,121, 98, 98,171,217,136, 66,147,142, 29,173, 78, 64,180,196, 29,205, 89, 96, 16, 11,212, 34, 41,210, -129, 97,152, 20, 0,103, 73, 19, 34, 10,146,241,252, 31, 58,184,123, 20,151,107,205,226,107, 26,128, 19,128,123, 0,190, 6, 80, - 80,205,127,254, 54,121,211, 24,254, 8,128,148, 18,162, 85,202,221,125,155, 46, 93,186, 92,240,244,116,243,235,221,163,215,252, - 81, 35, 71, 19, 20, 69,226,193,195,135,156,207, 7, 13,249, 68, 46,151,187, 74,116,186,122, 32, 8, 70, 35, 16, 60, 80,169,242, -146,246,238,220, 46,245,173, 91,215,108, 54, 51, 88,179,118,245,167,251,254, 56, 48,205, 74,178,229,227,236,236,188,117,202,148, - 41,206,221,186,117,163,156,157,157, 17, 27, 27, 43,219,181,107, 87,221, 21, 43, 86,244,201,201,201, 25, 4,224,233, 59,100,182, -149,179,130,252, 68, 42, 36,218, 33,223,140,124, 35,206,164, 22,226, 36,128, 75,239, 90,122, 26,141,102,172, 70,163, 9,105,220, -184, 49,187, 97,195, 6, 98,240,224,193, 44, 65, 16, 68, 97, 97,225,102, 0,239, 68,180,196, 98,241,170, 14, 29, 58,120,123,123, -123,191,124,241,226, 69,167, 61,123,246, 28, 13, 15, 15,247, 18,139,197,207, 0,248, 84, 17,110, 83, 86, 86, 86, 96, 97, 97, 33, -220,220,220, 54, 0,104,248, 23, 84, 34,130,162,168,131,174,174,174,236,162, 69,139, 14, 5, 6, 6, 58,101,103,103,155, 38, 77, -154,212,254,250,245,235,159,154,205,230,110, 85, 32, 91,114,130, 32,214, 58, 57, 57,217, 47, 92,184,240,121,163, 70,141,238,241, -249,124,222,179,103,207, 68, 19, 38, 76,248,230,233,211,167,125, 88,150, 29, 9, 84,105,128,144, 19, 4,177,214,197,197,197,126, -254,252,249,177,193,193,193, 15,184, 92, 46,247,217,179,103,226,239,190,251,238,235,232,232,232,119,194, 36, 73,114, 77, 72, 72, -136,252,135, 31,126,120, 92,183,110,221,171, 20, 69,241, 18, 19, 19,201, 89,179,102,125,117,234,212,169, 48,134, 97, 70,189, 75, - 58, 29, 29, 29,229,179,102,205,122,220,172, 89,179,235, 92, 46,151,251,228,201, 19,114,202,148, 41, 95, 61,127,254,220,234,116, - 42, 20,138, 80,130, 32,214,165,166,166,114, 0, 64,169, 84, 54,177,177,177, 89, 81, 58,166,165,197, 21,133,209,104,204,215,106, -181, 3,178,179,179,203,116,132, 59,120,234,242,174, 0,176,194, 96,185, 46, 58, 87,118, 13,172,137,176, 38,211, 65,206, 69,126, -241,126, 81, 15,237, 1, 0,253,139, 67,133,255,162, 6, 56, 28, 14, 19,228,252, 53,123, 55,181, 74, 46, 99,186,183,109,219,118, -214,217,179,103, 87,183,105,211,230,187,109,219,182, 57, 38, 36, 36,252,116,233,210, 37,247,126,253,250, 13, 62,115,230,204,130, -204,204,204,125, 31,170,242,243,184,124, 62, 65, 18, 16, 10, 68, 54,214, 60, 79,147,100,151,171,221,187, 15, 95,255,228, 73,240, -138,232,104, 79,181, 82, 25, 50,110,220, 56,167, 94,189,122,145,238,238,238,120,254,252,185,221,182,109,219,234,173, 95,191,190, -103,110,110,238,120, 0,113,239, 67,178,212,185,168,175,211, 35,152,101, 33, 43,105,176, 4,114,249, 6,220, 97, 31,227,254, 63, -128,108,205,220,180,105,211, 15,207,159, 63,199,130, 5, 11, 0, 96,101, 21,223,159,208,189,123,247,206, 7, 14, 28, 16,238,221, -187, 87,216,184,113, 99, 56, 59, 59,163,120, 50, 85,226,152,218,211,211,211,186, 50, 99,240,203,210,163, 67, 27, 62,200, 62,134, - 85,189, 82, 23, 8,221, 96,106,222,221,187,103,151,193,193,176,117, 16, 65, 32,225, 32, 55, 75, 21,240,228, 78, 66,135,115,123, -158,255,244, 60, 42, 99,161, 58, 30, 51, 81,190, 79,190,255,138,216,217,217,109,120,245,234, 85,168, 88, 44,126,237,254,203,151, - 47,131,188,189,189,243, 0,124, 91, 85,226,230,224,224,176,131, 97, 24, 93, 86, 86,214, 48, 0,144, 74,165,219,197, 98,177, 60, - 37, 37,101,218, 95, 53,145,177,200,155, 92,228, 95,174,209, 42,177,215, 42, 43,214, 33, 65,154,153, 22,163, 70,142, 38,250,246, -239,151,250,252,229, 43,134, 67,243,250, 31, 63,113, 66,228,231,231, 71,234, 86,174,132, 41, 35, 3,198,111,190,105,126,250,244, -105, 99, 88,255,129,133, 52, 69,108,242,242,172, 37,218,189,115,151,243,129,253,251, 90, 0,168,140,104,241,156,157,157,183,158, - 63,127,222,213,211,211, 19,185,185,185,136,141,141,133, 90,173, 70,159, 62,125,232, 22, 45, 90,184,246,238,221,123,107, 94, 94, - 94,203, 42,104,182,156,234,184,113, 34, 71, 14,233,229,243,233, 39, 45,196,174,238,181,193,166,106,145,240, 34,186,113,228,249, -235,227, 54,237, 63,250,244,121, 30,219, 5,101,199, 70,170, 80, 50, 51, 51, 39,247,236,217,115,127,104,104,168, 3,159,207,135, -139,139, 11,209,173, 91,183,244,228,228,228,217,239,204, 90,138, 67,216,144, 36,105, 46,125, 46, 35, 60,144, 53,226, 38,151,203, - 33,151,203, 1,192,245,125,103,158, 50,153,108,165, 84, 42,237,173, 82,169, 10, 73,146,100, 9,130, 96,245,122,189, 80, 46,151, -255,249, 56,250,169,139, 78,167,171,179,120,233,250,101,109, 91, 5,218,156, 58,117, 10,189,122,245, 98, 79,158, 60, 57,210,218, - 56,117, 4, 65,172,237,217,179,167,102,198,140, 25,218,231, 47, 99, 93, 31, 63,125, 73,136, 5, 60,198,222,222,158,190,121,243, - 38,103,201,146, 37,130, 89,179,102,173,101, 89,182,119, 21,202,115,109,191,126,253, 12, 19, 39, 78, 76,121,242,252,149,227,253, -199,207, 89,137,128, 54,217,219,219, 81,215,175, 95,103,222, 5,147, 36,201, 53,147, 39, 79, 86,141, 28, 57, 50, 39, 43, 59,207, - 57, 71, 85,192,242,105,202,232,236,236,204, 57,116,232,144,110,199,142, 29,228,240,225,195,215, 48, 12, 19, 86,133,242, 93,211, -173, 91,183,252, 41, 83,166,228, 62,123, 25,227,124,255,209, 83,136,248,180,209,201,201,145,186,117,235,150, 97,241,226,197,228, -220,185,115,173, 74,167, 88, 44,222,178,103,207, 30,206,161, 67, 69,125,223,181,107,215, 72, 47, 47, 47, 81,233,103, 10,181, 58, -144, 4,144,153,153, 41,106,214,172,217, 22, 0,111, 57,247, 13,158, 29,141,193, 83,129,177, 99,199,166, 84,181,178, 4, 43,199, - 85,250,140,121,181, 47,187, 68, 51,180, 7,135,195, 97,134, 15, 31,158,250,230,223,181, 90, 45, 1,160, 27,126,178,158,108,117, -234,212,233,251, 35, 71,142,212,222,182,109,219,175, 59,118,236,208, 3,128, 64, 32,176,223,181,107,215,130, 62,125,250,160, 79, -159, 62, 51,246,237,219,247,193,136,150,153, 53, 27, 0,128, 47,224,243,163,163,163, 9, 95, 95,223, 10, 61,238, 27, 24,230,246, -250, 39, 79, 26,125,233,235,219, 56,155, 97,234,112, 63,253,180, 96,194,132, 9,153, 42,149, 10,177,177,177, 48, 24, 12, 24, 60, -120, 48,213,166, 77, 27,151, 62,125,250, 44,207,207,207,255, 12,128,193,138, 58,185,216,213,213,117, 68, 94, 94, 94,129, 69,171, -211,114,144,153,211, 58,200,196,111, 80,199,200,227, 82, 38,110,215,111, 24,226,228, 74, 66,237,235,137,203, 0,192,213, 32,163, -138,147,129, 50,197,198, 13,158,102, 26,115, 29,220,132,109, 51,226, 10,127, 84,199, 87, 72,150, 62, 19,139,197, 61,212,106,245, -190,226,193,217,167, 75,151, 46,184,126,253, 58, 0,180, 40, 38, 90,109, 73,146,252,156, 97,152,223, 1, 84, 20,202,109, 92,247, -238,221, 63, 62,112,224,128, 20, 0,246,237,219, 7,163,209, 8, 47, 47, 47,112,185, 92,240,120, 60,208, 52, 93, 18, 29,196, 74, - 81, 58, 56,216,195,222,150,134, 92, 33,254,244,187,223,186,115,106,248,217, 32,221,252, 16,217,108, 46, 76,172, 14, 92, 59, 49, -234,118,144, 33,248,147,182,100,196,154, 7,211, 34, 86, 61,110,164, 33,209, 21,113,208,253, 83, 70,118,146, 36,249,247,238,221, -131,139,139,203,107,247, 41,138, 2,128,214,239, 0, 57,227,229,203,151,205,162,162,162, 16, 26, 26, 58,163,126,253,250, 29, 47, - 92,184,224,156,149,149,133,208,208,208,229,137,137,137,135,254,234, 60,149,230, 34,255, 43,170, 46,242, 13, 38,217,166,104, 22, - 76, 82, 20, 69,226,213,203, 88, 99,104,104,187,240,248,248,120, 73, 72, 72, 8, 73,211, 52,212,103,207, 66,123,235, 22, 36, 18, - 9,122,246,236, 73, 95,188,120,209,198, 70, 98,243, 69,204,171,152,124,138, 34,193,178,100,165, 54, 15,114,185,252,171,105,211, -166, 57,123,123,123,195,100, 50,149,120, 52, 55,153, 76, 72, 72, 72,128, 68, 34,193,160, 65,131, 28, 69, 34,209, 87, 86,230,163, -166,143,151,227,157,243, 71,215, 54,156, 48,170,147,216, 71,116, 10,226,132,241,144,236,251, 18,245,146,143, 99, 74,143, 16,241, -201, 85, 51,130,107,187, 40,238,148, 82,177, 90, 45, 58,157,238,242,131, 7, 15,190,184,112,225, 2, 3, 0,231,206,157, 99, 31, - 63,126, 60,242,125,102,161, 12,195, 32, 55, 55, 23, 12,195, 80,197,215,150,243,127,181, 62,216,216,216,172,233,216,177, 99,191, -184,184, 56,225,177, 99,199,236,226,227,227,237, 99, 98, 98, 28,124,124,124, 56, 11, 22, 44, 56,162,213, 25, 40,163,153,213,155, -204,198,252,148,135, 15, 95,230,164,165,221,217,184,113, 99, 33, 65, 16, 61,173,252,141,207,148, 74,165,221,212,169, 83, 65,208, -162, 38,117,235,213,247,166,104,161, 45, 73,243,108, 11, 11,181,230, 87,175, 94, 37, 76,157, 58,181, 86, 96, 96,160, 11,138,150, -215,172,194,116,113,113,177,159, 56,113, 34, 56,124,105, 80,131,192,224,218, 60,190, 88, 74,209, 66,105, 72, 72, 72,155,151, 47, - 95, 38, 79,153, 50, 69,217,184,113,227, 42, 97, 54,110,220, 88, 62,124,248,112,147, 64, 40,109,230,233,233, 85,175,129,127,189, -206, 62, 62, 62, 61, 56, 28,142, 41, 35, 35, 35,110,208,160, 65,202,174, 93,187, 58, 85, 5,211,209,209, 81, 62,101,202, 20,147, -187,135, 87,135, 14, 31,127,210,148, 43,148,218,114,120, 98,153, 70,163, 53, 63,121,242, 36,110,250,244,233,202,160,160, 32, 71, -107, 48, 53, 26, 13,109,111,111,143,128,128, 0,248,121,121, 33, 47, 47, 15, 7, 14, 28,192,166, 77,155,240,251,239,191, 99,231, -206,157,104,212,242, 19, 72,165, 82, 36, 39, 39, 67,165, 82,209,127,119,133, 50,175,246,101, 87,232, 71,116, 27, 61,122,116,242, -240,225,195, 83,133, 66, 33,243,230,161, 80, 40,204, 3, 6, 12, 72, 27,244,221,210,110,150,165,197, 74, 52, 89,247,142, 30, 61, -250, 98,219,182,109,240,243,243, 67,135, 14, 29,120, 0,240,213, 87, 95,241,250,244,233,131, 61,123,246, 96,223,190,125,143,188, -189,189,175, 0,232,110, 77, 58, 7, 13, 26,212, 50, 44, 44,236, 82, 88, 88,216,221,190,125,251,174, 27, 57,114,228,107, 35, 87, - 74,114,226,109,189, 94,143,192,224,198,162, 57, 27,110, 12,168, 12,239, 49,176,109, 93,116,244,166,133, 15, 31,198,205,240,243, -147,121,196,196, 40, 54, 47, 94,108,111, 9,210,109, 52, 26,145,144,144, 0,185, 92,142, 1, 3, 6,216,243,249,252, 65, 86, 36, -115, 73,247,238,221,135,196,199,199, 75,214,175, 95,175,188,123,247,174, 75, 74, 74,138,242,204,233, 19, 14,147,190,253, 74,106, - 43,225,241,146, 51, 88, 2, 0, 98,146, 33,142,126,133,150, 44, 11, 89,233,229,196,119, 18, 37,132, 66, 55,172,168,221, 82,246, -116,226,158,160,190, 83, 34,131,237,229, 74,254,212, 10,222,104,176,104,209,162,189, 17, 17, 17,253, 91,182,108,185, 31,128,176, -140,103, 4,141, 26, 53, 58,176,103,207,158, 33,173, 90,181,186, 12, 32,160,220, 89,164,155, 91,207, 63,254,248,195,206,114,109, -111,111, 15,129, 64,240, 22,201,226,114,185, 32, 73,178,202,217,155,183,171, 63, 71, 81, 79,135, 7, 57, 71,177,103,209, 61, 44, -250,244, 9, 51,191,121,140,110,229,160,104,156,220,115, 15,233,184,135, 78, 95,214, 70,255,233,129,237, 69,102,204,253, 39, 13, -224, 25, 25, 25,159,183,110,221,122,111,167, 78,157,116, 81, 81, 81,200,200,200,128,171,107,201, 92, 59,245, 29, 32, 21, 34,145, - 8,238,238,238,240,246,246,238,127,241,226, 69,103,163,209,136,152,152, 24,164,167,167,223,249, 59,242, 84,154,139,252,203,228, - 77, 67,248, 35,111, 17,173,226,216, 66,231, 1,128, 37, 8,245,189, 7, 15,104,138,199, 27,184,125,199, 14, 62,151,203, 69, 92, - 92, 28, 30, 61,122, 4,205,153, 51, 40,188,122, 21,105,105,105, 40, 40, 40,128,147,147, 19,214,110,216, 32,214,155,217,161, 79, -158, 62,165, 88,146, 45,109,111, 80,230, 22, 79, 62,159,223,190, 87,175, 94,229, 18,178,228,228,100,116,234,212,137,166, 40,170, -172, 93, 13,111, 98, 18, 46, 14, 68,196,153,253,115,148, 74,222, 35,224,249, 4, 32,255, 14,192,234, 0,147, 30, 72,186, 15, 28, -153, 13,143,130,104,226,196,156,112,103, 87, 17, 39,162, 12,166, 92,217, 86, 84, 47, 95, 95,223,223, 7, 14, 28, 72, 2, 64,219, -182,109, 9, 95, 95,223,117, 0,188, 42,120,231,116, 37,131,228,245,156,156, 28,244,233,211,199,174,118,237,218,167,251,244,233, - 99,103,185,255,174,152, 22,109,178,159,159, 95,150, 64, 32,216, 9, 88,213,193,150, 96,202,100,178,149,157, 58,117,234,189, 99, -199, 14, 46, 0,156, 63,127, 30, 17, 17, 17,120,248,240, 33,158, 61,123,198, 4, 7, 7, 59, 44,253,125,239,154,149,171,183, 44, -233,209, 34,208,165, 77,147,224,122,146,130,156, 2, 39, 39,167, 22, 44,203,122, 89,153,206, 78,179,103,207,126,244,248, 69,156, - 45,201,161, 57, 92,154,195,183,177, 17, 59,201,165, 98, 55,133, 72,224,202, 39, 9,137, 70,163, 73,221,185,115, 39, 3,160,147, -181,152,115,230,204,121,245,248,121,156,140, 32, 57, 28,154, 67,115, 37, 18,145,236,211, 14,161,141, 1,128, 11,150,171, 82,169, -210, 54,109,218,100,168, 10,230, 15, 63,252,240, 32, 59,183, 64,206,161,105,154,195,161, 74,202, 82, 44, 20, 58,136,248,124,158, - 78,167, 75, 90,182,108, 89, 97, 85, 48,103,207,158,253,232,201,139,120, 5, 73, 16, 20, 65,144, 28, 27,169,216,206,206, 86,228, -224, 32, 17,218,139, 56, 20, 79,165, 82, 37,109,221,186,213, 42, 76,131,193,192, 77, 75, 75,195,227,199,143,225,222,184, 49, 78, -157, 58,133, 26, 53,106,160, 79,159, 62,232,215,175, 31,132, 66, 33,218, 54,171,143,169, 83,167,226,197,139, 23, 48, 24, 12,252, -178, 48, 45,118, 82,111,138,139,139, 75, 84,101,149,231,141,119, 95, 75,103,144, 51,216, 21,250, 17,221, 74, 19,172,242,240, 21, - 10,133,185, 44,109,215,155,152,157, 58,117,250,254,204,153, 51,181,183,110,221,218,109,208,160, 65,151,183,110,221,138,166, 77, -155,226,241,227,199,168, 85,171, 22, 54,111,222,140,126,253,250, 93, 94,190,124,121,183,168,168,168, 64, 79, 79,207,105,149, 97, -246,237,219,119, 76, 80, 80,208,217,212,212,212,102,217,217,217, 1, 7, 14, 28, 24,218,179,103,207, 87,253,251,247,111, 87, 66, - 24,141,198, 29, 71, 14,239, 71,231,110,189, 80,215, 63, 96,205,224,105,219,234, 87,210, 54,217,135,192,186, 77, 41, 41, 25, 59, -180, 90, 77, 31,154, 22,137,110,220, 80,236, 91,189,218,190,116,100,129,164,164, 36,116,237,218,149,230,114,185,173, 42, 73,231, -162, 30, 61,122,244, 57,112,224,128,220,162,213,185,122,245, 42,238,223,191,143,216,216, 88,228,230,230,162,221,200, 2,140, 94, - 80,132, 61,122, 1,139, 79,190, 98,197,239,216,135,148,136,176, 6,156,237,108, 56, 87,134, 46,171,251,213,136, 53,126, 28,137, -130,198,246,239,158, 33, 51, 70,183,175, 28, 76,162, 89,179,102,219,194,194,194, 8,189, 94, 15,189, 94,175, 7, 80,166, 87, 95, - 87, 87, 87, 65,131, 6, 13, 48,114,228, 72,210,198,198,102,121,121,233, 84,171,213,186,163, 71,143, 98,208,160, 65, 24, 63,126, - 60,234,212,169, 3,185, 92, 14,154,166,177,101,219,110,251,126, 67, 71,249, 52,108,217, 58,208,175, 97,211, 6,249, 58,170, 49, - 45,148, 15, 47, 71, 27, 82,102,222, 11, 28,163,240, 32,230, 26, 86,116, 75,100,110,110,214, 20, 76,250,252,231,232, 39, 23,210, - 30, 78, 11, 91,247,128,189,214, 60,115,219,215,241, 72, 51, 62, 70,171, 62, 30,240, 12,146,127, 35,118,135,239,187,150,167,149, - 82, 37,204,250,245,235,183,188,121,243, 38,191,117,235,214,136,139,139, 3, 77,151,204,167,204,239,147,206,217,179,103,243,181, - 90, 45,254,252,243, 79,132,135,135, 39, 25, 12,134,111,222, 39,157, 85,209,104, 89,184,200,191, 76,214,189,113,164,148,167,209, -154, 13, 0, 70, 6, 17, 3,195,135,106, 34, 35, 35, 69, 60, 30, 15,113,113,113, 72, 73, 73,193,150, 77,155,204,109, 29, 29,243, - 59,184,186,170,182,108,218,196,234,245,122,176, 44, 11, 95, 95, 95,244,238,221, 91,248, 89,159,254,233,132,170,112,183, 21,203, - 60, 74,203,250,250,208,161, 67,223,250,251,164, 73,147, 96, 99, 99, 3,130, 32,156,173,200, 92,216,184,217, 61,220,228,158,178, - 52, 54,117, 75, 54, 40, 1,192,145, 2, 28, 27, 64, 96, 11,240,165, 0, 79, 4, 93,212,217,108,146,237, 16,219,171,213, 48, 87, - 0, 85, 89,234,129,139,139,203,140,179,103,207, 58, 68, 69, 69,177, 42,149, 10, 41, 41, 41,236,252,249,243, 29, 92, 92, 92,102, -188,235, 23, 73, 78, 78,158,211,185,115,231,180,240,240,112,219,227,199,143,187,135,135,135,219,118,238,220, 57, 45, 57, 57,121, -206,251,124,105, 46,151, 75, 61,124,248, 80, 49,119,238,220,126, 0,110,251,251,251,103,185,186,186,222, 70,145,209,100,133, 34, -149, 74, 75, 72,150, 69,187,198,225,112, 64,211, 52, 92, 92, 92,244,217,217,217,230, 86, 13,189,132,190,182,164,209,133,207, 21, - 42,132, 2, 55,169,141,109, 72, 86, 86,214, 61,130, 32, 94, 90,185,196, 23,212,164, 73, 19,218,204,210,204, 15, 12,241,165, 0, - 0, 32, 0, 73, 68, 65, 84,232,129,109, 93,190, 26, 18,234,248,219,220,225, 53,150,205, 25,225,186,104,214, 23,190,115, 38, 15, - 8, 37, 25, 70, 91,171, 86, 45,103,139, 65,187, 21,234,243,224, 70,141, 26,113, 24,208,120,252, 52, 54, 45, 46, 49, 41,255,227, - 54,205, 74, 52,151,126, 65,193, 29, 28, 28, 28, 90,251,250,250, 54, 34, 8,194,170, 45,201, 66,161, 48,168,110,221,186, 28,146, -162, 9, 59,185,212, 93, 42, 17, 58,149, 44,161,200,100,205, 21, 14, 14, 97, 36,203,230, 41,149, 74, 71,161, 80, 24, 84,133,188, -115, 24,112,225,228,168,176,117,176,151, 73, 58,132,182,168,211,172,121, 51,159,250, 33, 77,155,249, 55,108,244, 25, 97, 50,169, -188,188,188, 28, 45, 70,242,149,104, 90, 5, 59,118,236,192,220,185,115,209,192,195, 3,174,174,174,112,116,116,196,213,171, 87, -113,243,230, 77,200,229,114,164,167,167, 99,241,226,197, 56,120,240, 32, 12, 6,131,180,170,245,201, 26,178, 85,145,152, 76, 38, -242, 77,130, 85, 30,190, 80, 40,100, 44, 70,242,229,201,209,163, 71,183, 89, 52, 89, 95,127,253,117,203,165, 75,151, 94,142,142, -142,134, 68, 34,193,205,155, 55, 49,116,232,208,203,203,151, 47,111, 57,106,212, 40,108,218,180, 9,175, 94,189,218, 80, 17, 94, -223,190,125,103,125,241,197, 23,203, 46, 92,184, 64, 58, 57, 57, 65, 46,151,163, 71,143, 30,216,176, 97, 3,199,100, 50,109, 12, - 11, 11,187, 27, 22, 22,118,215,156,112,242,251,189,191,207,191,250,224,222, 93,140, 25, 55,145,167, 55, 25,167, 88,145,125,182, - 80, 34,201, 55,181,110,157,189,199,104,212,244,229,114, 69,182,119,239, 42, 34, 54,110, 44, 33, 91, 83,167, 78,133,173,173, 45, - 80,100,192,140, 10,180, 58, 35, 14, 30, 60, 88,210, 31,218,217,217,129,199,227,129,203,229,130,166,105, 80, 20,133,211,107,196, - 88, 61,181,136, 95,172,158, 74,224,228, 74, 66,253, 62,223, 78,228,138, 0,185, 19,239,238,151,155,253, 3, 3,218,217,225,234, -174, 84,204,239, 28,149,120,115, 79,198, 4,109, 58,126, 41,231,181,134,147, 38, 77,242, 75, 79, 79,199,173, 91,183,112,235,214, -173,242, 52, 64,218,195,135, 15,255, 84, 80, 80, 0, 79, 79, 79,116,239,222,189, 53,128,198,229,180, 27, 52,106,212, 8, 93,187, -118, 69,104,104, 40, 26, 52,104, 0,189,193, 68,135, 13, 28, 81,247,225,171, 12,215,249,139,231,139,206,158, 59, 64, 94,190,124, -129,218,182,255,164,109,179,208, 79,150,113,165,202,235, 16,218, 41,173,201,167,198,156,133, 32,229,167, 88,119,102, 28,185,226, -124,184,100, 75,196, 10, 47,169, 84, 74,220,185,117,215,184,101,213,158,248, 0,113,247,244,235,187,178,160, 33, 82,209,110,136, - 39,201, 0,189,255, 41, 35,187, 64, 32, 88,122,225,194, 5,103,131,193,128, 7, 15, 30, 96,252,248,241,218,247,132, 44, 81,128, -184,187,187,227,252,249,243, 24, 48, 96,128, 54, 45, 45,237,218,223,149,167,210, 92,228,127, 69, 56,165, 24,100,137, 36, 36, 36, -228,202,229,114,215,186,117,235,146,122,189,190,104, 73, 98,223, 62,243,239, 27, 55, 30,209,106,181,227, 0,112, 87,254,246,219, - 26, 87, 55,183,208,129,131, 6, 17, 70,163, 17,157, 59,119,230, 69, 70, 70,218,189, 76, 79,207,183, 98,192,121,237,247, 6, 15, - 30,140,165, 75,151, 2, 0,198,142, 29, 91,162, 90, 39,172, 48, 88,146,216,162, 83,135, 46,141,108, 18,196, 43,108, 12,205,141, - 5, 53, 95, 72,175,139, 11,132,141, 64,242, 56, 16, 80, 96, 12, 70,211,179,244,158,183, 95, 60,171,231, 39,204,206,170,213,222, -255, 35,252,126,106,107, 39,141, 89,187,199,234, 14, 71, 36,106, 34,145, 72,112,251,246,237,236, 70,141, 26,229,178, 44,107, 59, -103,206, 28,123,145, 72,212,228, 61,202, 62,230,233,211,167,173, 91,180,104,241, 21, 73,146,237, 25,134, 57,157,150,150,182, 18, - 64,140,149,239,143, 6,240, 3,128,146,153,165, 94,175, 7, 73,146, 96, 89, 22,125,251,246,197,212,169, 83,253,238,223,191,143, -179,103,207, 42,218,183,111,127, 29, 64, 46,128, 97, 0,202,212,154,169, 84,170,194,155, 55,111, 10,207,158, 61, 11,134, 97,160, - 80, 40, 96, 99, 99, 3, 62,159,143, 30, 61,122, 72,166, 76,153,210,238,196,137, 19,233,170,154, 53, 40, 65, 74,146,154, 47,145, - 72,225,236,218,106, 84,255,207,163, 89,150, 61, 88,133,206,129, 39,228,152,180,132, 89, 71, 46,154,185,156, 20,113,185,132,128, -203, 1,159,209,224,251,159,230, 17, 92,214,204, 65, 21,215,231,185, 92, 46, 87,202,135,158,226, 81, 70, 17, 1,246, 67, 52, 14, -138,162,120, 2,110,249,246, 24, 52, 73,146, 36, 73,114, 1, 88, 29,180,143,207,231,115,165,124,182, 92, 76, 33, 69, 80, 4, 65, -240, 80,206, 78,180, 32,103,176, 22, 45, 18,111,220, 75, 93,105, 82,220,170, 85, 43, 28, 57,123, 27,251, 34, 78, 35, 51,238, 30, -166,127,247, 53, 26, 55,110,140,200,200,200, 10,211,100,177,209, 42, 79,187,236,226,226, 18,149,156,156,220,176,188,119, 43, 90, - 50, 44, 71, 75,245, 54,254, 76, 91, 4,207,142, 70, 37, 54, 90,221, 91,181,106, 53,102,199,142, 29,250,142, 29, 59,242,250,246, -237,139,128,128,128,150, 67,134, 12, 1, 0,180,111,223, 30, 75,151, 46,109, 57,100,200, 16,236,222,189, 27, 7, 14, 28,208,181, -105,211,230,187,243,231,207, 39,161,104, 71,231, 91,194, 48, 76,215,181,107,215,190,169, 41,132,201,100,130,209,104, 84,154, 76, - 38,101,113, 95,132,101,203,150,103,158, 60, 17,137,239,166,205,134,163,131,115,144,149,117,136, 24, 60,113, 98,230,230,197,139, -177,120,247,110, 76,172, 85, 75,180,245,209, 35,156,212,106,177,231,236,217,204,226,223,169,212, 54, 83,173, 86, 23, 30, 61,122, -212,102,207,158, 61,144,201,100,168, 83,167, 14, 20, 10, 5,104,154, 6, 73, 9, 65,113,229,168,235,223, 4,192, 77, 0, 64, 45, - 23,168,125, 61,113,153, 32,144,203,146, 85,183, 41,226,215, 64, 77,123, 55,193,133, 49,155, 2,100, 54,142, 92, 28, 95, 25,143, - 19, 43, 18, 14,106, 51,241, 43, 76,120,130,242,109,190, 26,121,122,122, 34, 61, 61, 29, 71,143, 30, 85, 3,229, 18, 50, 48, 12, -243,211,111,191,253, 54,105,218,180,105,124, 95, 95, 95, 0, 8, 2,112,171,172,103,197, 98, 49, 92, 93, 93, 75,136,101,223,240, - 81, 94, 35, 39,140, 18,246,252, 36, 20, 28,142, 61,114,213, 70,100,229, 27, 33,183,151,224,187, 9, 97,130,211,141, 92, 27,175, - 93,190,253,112, 97, 33, 26, 3,111,247, 7, 4,129, 91, 55,238, 93,174, 47,240, 5, 8, 18, 72, 32,207,129, 0,129, 2,194, 8, -130,162, 88,179,217,140,248,248,120,176, 44,139, 1, 61,135, 38,140,152,127,192,177,229, 0, 21,220,235,186,128, 96,241,209, 63, -133, 8,216,217,217, 5,101,101,101, 33, 38, 38, 6,225,225,225, 73,153,153,153,167,212,106,245,208,228,228,100, 0,200,126, 7, -200, 18, 50, 31, 20, 20,132, 38, 77,154,160, 79,159, 62, 2,141, 70, 19,230,229,229,229,154,145,145,209,252,175,204,207,155, 92, -228,127,138,104,149,217,208,140,198,186,186, 53,107,160, 62,125, 26,188,147, 39,177,199,197,165, 64,171,213,126, 11, 32,161,184, -225,127,189,105,243,230, 43,221,174, 93,179,209, 71, 71,195,235,254,125,208, 50, 89, 80, 85, 19,176,113,227, 70,168, 84, 42,228, -229,229, 1, 0, 86,172, 88, 1,149, 74, 5,147,149, 1,103, 57, 92,180,116,118,172,133, 84, 60, 3,195, 33, 37,177,117, 53, 77, - 37, 90,105,178,107,188,147, 58,143,116, 69,116, 92,136,184, 48, 75,223,148,160,244,208,102,106,224,218,162, 14, 56,224,180,172, - 74, 26, 45,235,254, 28, 14, 39,251,233,211,167, 93,125,124,124, 34, 0,216,191,139, 61,192, 27,242, 60, 45, 45,109,220,187,188, - 72, 81,212, 15,175, 94,189,114,220,176, 97,195, 87,115,230,204, 97, 75, 19, 45,203,255, 57, 28, 14, 88,150,133,173,173, 45,104, -154,118,186,122,245,170, 83, 72, 72,200, 42,134, 97,130,202,201, 39, 27, 16, 16,128, 87,175, 94,129,195,225,192,214,214, 22,140, -201,128,217, 19, 70,193, 76,241, 57,147, 39, 79, 14,234,213,171,215,131, 13, 27, 54, 24,109,154,181,104,158,149,149,245,112,204, -128,129, 15, 14, 29, 58,164, 47,118,241, 80,249, 20,159,101,239, 62,123,246,140,114,115,113,162, 88,147,134, 17,115, 1,193,189, -101, 44, 79,226, 12, 1,135, 98,185, 4, 9,190, 64,104, 27,147,152,152,197, 48,204, 99,107, 48, 25,134,185,243,234,213, 43,161, -147,163, 29, 71, 83,168, 47, 16,210, 44, 47,246,206,237,151, 53,131, 27,121, 1,128,246,206,205,243,252,186,245,132,177,105, 25, -226, 90,181,106, 89,133, 89, 88, 88,120, 55, 41, 41,137,114,114,114,226,196, 37, 36, 30,150, 73,196, 14, 54, 50, 89, 83, 0, 48, -228,231,221, 36,117,186, 12,138,230, 56,101,100,101,101, 23, 22, 22,190,178, 54,239, 47, 94,188,224, 40,149,142,212,241,147,103, - 34,156, 68,124, 71, 41,143, 99,195, 39, 8, 66, 68, 17, 42,174,137,201, 20,136, 68,142, 49,137,137,217, 44,203,150,171, 33, 92, -152, 59,176,103,209,247,154,189,187, 20, 54,238,221,187,135, 99,151, 31, 67,204,234, 65,104,243,112,114,211,122, 12,152, 60,237, -189,237,254, 42, 35, 91,239,164,205, 90, 91, 47,234, 13,124,164, 84, 98, 8, 63, 96,192,128,217,219,182,109, 43, 49, 64,121,252, -248, 49,218,182,109,107, 89,230, 64,135, 14, 29, 16, 18, 18,130,199,143, 31,195,219,219, 27,103,207,158,229, 83, 20,197, 31, 56, -112,224,252,237,219,183, 31,173, 84,239,191,110, 29,134, 14, 29, 90,150, 97,245, 11, 0, 90, 66,238, 91, 48,117,225, 22,251,236, -172, 76,164,103,164,222,181,182, 28, 8,130,192,224,137, 19, 51,215,234,245,216,113,227, 6, 6,137,197,162,205,207,159,163,115, - 72, 8,234,183,109,155,105, 77, 95,103,209,234,104,181, 90,208, 52, 13, 27, 27, 27,216,217,217,129,203,229,130,162, 93,192,225, - 5,130,228,114, 17,220, 42, 16,139,191, 21,107,194, 63,197,114,130, 64, 46,159,135, 59, 92, 81,185,182, 58,132,184, 6,122,176, - 44, 84,154, 4,156,179, 16, 18, 91, 15,216,210, 82,250,228, 23,171,124,101, 54,142, 92, 28, 91, 30,135,147,171, 18,247,107, 83, - 49,189,184, 44,152, 10, 38, 18,245,101, 50, 25, 18, 18, 18, 16, 31, 31,255, 8, 21, 27,248,107, 30, 63,126,252,146,207,231,251, - 57, 56, 56, 0,128,103,121, 19,115,134, 97, 74,236,176,182,238,216,107, 31,212,218, 75,240,113, 75, 63,108,137,152,135, 47,195, -150,131,166, 8,152,205, 6,252,186,180, 11,204,186, 2,132,117, 27, 65,124,212,222, 59,240,116,132,254, 11, 99, 97,206,250,183, - 38, 2, 28,204,253,185,223, 85, 25, 95, 66,214, 7, 67,200,236,237, 29,197, 92, 46, 23,118, 54, 74,253,180,145,223,164,176, 44, - 91,210,110,104,138,107, 36,243, 21,133, 89,169, 5, 66, 25, 93, 8,176,100,205,119,243,102,243,225, 37, 49, 49,113, 92,235,214, -173,231,231,231,231,231,168,213,234, 1, 0,224,233,233,233, 65,146, 36, 31, 64, 69,171, 35, 30, 40,219, 45, 4,247,254,253,251, -144, 74,165, 72, 74, 74, 42,173,124, 1,195, 48,255,152, 77, 0,255, 80, 9, 6,112, 7,128, 18, 64,103,148,114,239, 64, 22,171, -234, 62,138,140,140,100, 35, 35, 35, 63, 42, 25,188, 88,150, 49,101,103,131,213, 21,149, 45, 77,211, 44,128,210, 59,154, 68, 50, -153,140,160,221,220, 64,240,139, 76, 63,216, 15,184,245,213,104,180,206,181, 12, 99, 6, 5,194, 0,182,212,164, 69, 45, 32, 48, -207,190, 29,198,241,102, 32,149, 39, 43, 61,210, 1, 38, 22,102, 48, 84, 21,147,195,170,213,106,152, 76, 38,121,237,218,181,143, -152, 76, 38,121,241,224,198,254,183,190,168,217,108,126, 73, 81, 20,190,250,234, 43, 88,180, 63,122,189, 30,169,169,169,208,233, -116,208,235,245,120,245,234, 21,242,242,242,160,215,235,241,240,225, 67,120,122,122,130,162, 40,101, 5,157, 57,203,178, 44,220, -221,221, 81,179,102, 77, 80, 4,139,223, 23,205,194,247,227, 71,161,159, 39,131,141, 43,127, 69,155, 54,109,234,213,170, 85,171, - 25,135,195, 49, 59, 59, 59,115, 15, 28, 56,112,216,108, 54,247,128,245, 61,207,209,169, 83,167,214,244,247,247,119,148,217, 72, -141,124, 30, 5,158, 81,205,242,117, 89, 44, 71,147, 9,119,119, 15, 19,132, 34,239, 65,131, 6,153,203,211, 66,148,133,249,237, -183,223, 42,125,125,125,109,229, 50,169,154, 71, 83,233, 92,176,153,121,247,110, 93, 7, 0,158,131,163, 22, 2,145, 95,120,120, -184,169, 42,152, 51,102,204,240,116,112,112,144,145, 96,243,205, 6,195,127,214,219,117,250, 44,130,166, 11,193,229, 53, 26, 59, -118, 44, 81, 21,204, 73,147, 38,213,242,243,243,147,201,108,196, 5, 28,154, 74,225, 50, 76,138, 0, 76, 42,173, 55,228, 8, 28, -236, 53, 16, 73,130, 7, 13, 26, 84, 46,166, 69,155, 53,101,202,148,132, 55,136, 55,178,179,179,161, 77,125, 0,110, 82, 52, 2, - 37, 52, 26, 59,200,193,231,243, 75,182,190,151, 87, 93,203,179,209, 42,139,108, 89,251,110,163, 31, 43, 88, 2, 92, 91, 47,234, - 77,191, 89,201,201,201, 80, 42,149, 21,182,167,237,219,183, 79, 11, 13, 13, 77,239,208,161,131,254,200,145, 35, 32, 8, 2,103, -207,158, 69, 82, 82, 18, 58,116,232, 0,150,101, 45,187,218,112,247,238, 93,180,111,223, 94,223,186,117,235,164, 98,255, 90,149, -202,208,161, 67, 97, 52, 26, 81, 80, 80,128,236,236,108, 68, 70, 70, 34, 48, 48,144, 21,137, 68,189, 40,247, 79,230,133,125, 49, -173,121, 64,131, 32,172, 90,190, 88,207,227,208, 11,171,210, 94, 9,130, 64,248,183,223,102,230, 5, 7,103,111, 85,171, 53,131, -109,108, 68,181, 19, 18, 20,183, 79,156,176, 55, 24, 12, 86, 97, 88,180, 58,110,110,110, 37, 36,139,203,229,130,195,115, 0, 37, -174, 15,158, 93, 7,136,156,123,225,220, 29,190,206, 86,140,131, 82, 9,142,139,101,229,187,118, 16,185, 99, 94,243,190,202, 3, - 45,250, 41,207,136,106, 96, 67,241,120, 64,178, 28,226,192,144, 95,125,106, 59,212, 20,226,218,222, 84,156, 92,149,248,135, 54, - 21,179, 0, 60,175,172,157, 27, 12, 6,173,217,108, 6, 73,146,224,112, 56,165,109, 2,175,252,241,199, 31,184,125,251, 54, 80, -202,109, 79,126,126,190,153,162, 40, 8, 4, 2, 0,144, 84,208,223,129,166,105,208, 52,141,243,215, 47,218,245,251,172, 11,113, -245,207, 83,104, 17,216, 31, 89, 5, 6,164,229, 25,144,171, 1,252, 27, 79, 71, 64,251,131,184,247, 42, 31, 65, 13, 2, 40,138, - 39, 14, 47, 11, 79, 27,131, 4,117, 60,122,103, 61, 98,234,232, 19,133,199,174, 29,122,252,232,226,190,123, 15,119,253, 22,241, -188,121,227,214,234, 98,101, 2, 10, 10, 10, 88,130, 32,216,111,134, 79,123,185,117,104,142,121,249,128,123, 12, 71, 39,120,241, - 55,118,245, 30, 14, 14, 14, 87,237,236,236,206, 22,147, 35, 15,169, 84,122, 69,169, 84, 70,163,104,163,199,161,148,148, 20, 95, -181, 90,221, 2, 69,155,179,226,178,178,178,218, 22,107,158,226, 42,208,132,109, 80,169, 84, 95,155,205,230,110,197,199,167,102, -179, 57,232,217,179,103,126, 65, 65, 65,143,188,188,188,238,122,121,121, 29,243,242,242, 58,236,229,229,117, 56, 52, 52,116,169, -197,221,195, 95,188,108,248, 22, 23,249,151, 17, 45, 20,147,172,117,197,103,148, 16, 45, 0,231,223, 52, 64, 51,241,249, 15, 77, - 99,198, 64,118,248, 48,232,103,207, 48, 36, 60,220, 70, 36, 18, 45, 71,145,143,166, 22, 18,137,100,213,172, 89,179,164,246, 11, - 22,192,229,226, 69,196, 70, 70,194, 72,211,183,222, 37,117,133,133,133,224,112, 56, 37,154, 24,177, 88, 12,179,217,140,178, 84, -190,111, 53, 64, 19,174, 37,165, 69,131,135,154, 96,192, 22, 28, 87,181,190,209,255,229,116,199, 72,149,167,247,115, 53,215,251, - 71,135,166,142,203, 61, 90,222, 80, 19,156, 2,158, 76,128,248,248, 4,152,193, 84,105,189, 89,171,213,230,169,213,106, 4, 5, - 5,217,221,190,125,187,118, 96, 96,160,162,248,254,205,247,252, 48,205, 92, 92, 92,246,186,186,186,198,184,184,184,236, 5,208, -172, 10,239,110,184,116,233, 18, 40,138,194,172, 89,179,144,159,159, 15,131,193,128,172,172, 44,196,199,199, 67,175,215, 35, 49, - 49, 17, 79,158, 60,129, 94,175, 71,108,108, 44,116,186,202, 39, 36, 12,195,192,198,198, 6,218,194, 2,172,158,247, 61,102, 76, -153,128,188, 23, 81, 72, 76, 78,131,204, 86,140,113,227,198, 81,114,185,156, 97, 24,166,166,217,108,110,207, 48,204, 26,107,190, - 83,169,250,118,217,221,221, 61, 96,209,162, 69,126,223,207, 91,195,181,225, 20,176,124,169,128,225, 73,249, 44,175, 94, 83, 12, -157,190,156,187,108,201, 47, 79,175, 93,187,150, 4,235,156,119,146, 0, 46, 7, 7, 7,251, 36, 37, 37, 5,250,250,250,214,181, -247,168,197,231, 43, 93,115,185,202, 26, 42, 86,167,189, 65,184,214,104,181,102,205,154, 7, 87,174, 92, 73,174, 10,166, 88, 44, -174,183,101,203,150, 0, 39, 39,167, 0, 90, 40, 20,104,242,242,246,152, 52,234,189,148, 76, 46, 32,109,100,159, 30, 60,120, 48, -106,255,254,253,169, 85,193,244,246,246,246,157, 55,111,158,127,253,250,245,253,157, 61,107,243,133,174,238, 89, 2, 55,143, 44, - 97,253, 64, 62,220,106,118, 92,181,106,213,221,107,215,174, 89,133, 73, 81,148,137, 36, 73,208, 52, 13,145, 72,132,227,199,143, - 99,204, 23,253,225,238,106,135,186,190,190,104,247,229,215,216,191,127,127,137, 13, 15, 69, 81,229,142,232,155, 23,140,139, 8, - 86, 18, 81, 88, 91, 47, 10,107,235, 69, 5, 43,137,168,114,201, 86,241,223,203,122,198,170,222,168,156,229, 70, 43,200,214,209, -243,231,207,255, 52,120,240, 96, 94,167, 78,157,112,227,198, 13, 12, 29, 58,244,242,129, 3, 7, 0, 0, 55,110,220,192, 55,223, -124,115,249,204,153, 51, 24, 53,106, 20,218,182,109,203,187,116,233,210, 42, 88,225,251,199,100, 50, 97,227,198,141, 48,153, 76, -144, 72, 36, 80, 40, 20,232,210,165, 11, 30, 60,120, 48,106,211,166, 77,209, 20, 77,127,222,185,219,103, 56,114,248, 0,158, 60, -124, 48,106,243,252,129, 85,118, 10, 76,146, 36, 58,133,135,103,102,250,251,103,111, 86,169, 52,195,228,114,145,111,106,170,226, -220,222,189,246, 86, 16, 53,194,108, 54,151,144, 43, 11,233,176, 28, 28,158, 3, 56,226, 0,112,164,141,113,239, 57,215,200, 13, -193, 29, 94, 99, 60,174,200,127, 22,205, 35,135,246,250,222, 19,189,190,247, 68,247,201,181,134,136,106,224,119,113, 13,140,238, - 52,190,102,168, 87, 99, 91,168,210, 13,136,252, 53, 54, 78,155,133, 5, 0,158, 88,211,206, 25,134,121,148,148,148, 4, 30,143, -135, 26, 53,106,248, 0,176,216, 5,110, 24, 62,124,248,216, 31,127,252,113, 2,128, 31,139,239, 73, 66, 67, 67,253, 11, 10, 10, -240,236,217, 51, 0,184, 93,129, 54,184,100,151, 97,182, 42,150, 95,203,165, 62, 2,235,141,132, 92,222, 0, 73,217,122, 36,103, -235,241,251,234, 30,136,186, 52, 23,183, 79, 14, 66, 92,106, 42,132,206, 61, 97, 54,233, 2,172,152,212,187,252,249,231,159,196, -165, 75,151, 8,134, 97, 96, 52, 26,217,124,149,138,189,115,249, 50, 10, 47, 92, 32,108,108,108,136,150, 77, 90, 23,108,158,123, -228,230,193,149,151,111, 27, 52, 85,158,168,191,143,204,120,249,242,101,179,189,123,247,134, 2,152, 81,191,126,253,107,241,241, -241,205, 47, 94,188, 88,215,205,205,109,249,187,130, 90,220, 66,196,198,198,190,118, 20,187,133,208, 23,147,134, 78,197,100,174, - 59,128,111,240, 30,187,236,171, 32,231,255,197,198,240, 71,240,198,110,195, 55,137, 86,105, 71, 97,240,146,203,165, 70,163, 33, -241,212,169, 83, 6,146, 36, 33, 18,137, 48,120,232, 80,114,245,111,191,181,234,223,172,217,217, 17, 31,127,124,236,236,153, 51, -193, 33, 33, 33, 96, 89, 22, 36, 73, 98,247,238,221,133, 90,109, 97,150,187,187,187,204,154, 78,163,116, 3, 82,169, 84, 37, 68, - 43, 47, 47, 15, 78, 78, 78, 86, 47, 29,170, 85, 56,125,230,120, 84, 14,107,254, 50,190,211,243, 37,134,133,169, 61, 66,114, 25, - 51, 39,207,108, 68, 94, 33,139,124, 45, 56, 55, 72, 69,200, 96,239,158,134, 87,237, 67,158, 92,136,190,154,165, 53,107,171,180, - 91, 34, 61, 61,253,251,176,176,176, 44,165, 82, 73,216,216,216,192,213,213,149,236,222,189,123,102, 66, 66,194,143,239,250, 69, -236,236,236,250,133,134,134, 70, 36, 37, 37,245,190,112,225, 66,205,139, 23, 47,246, 14, 13, 13,141,176,179,179,235,103, 37,196, -158,105,211,166,169,121, 60, 30,154, 54,109,138,252,252,124, 20,239,242,169,240,176,102,137,148,203,229, 98,237,162, 31, 48, 99, -202, 4,100, 71,223,192,189,203,167,112, 62,149,192,244,121,191,128,203,229,190,147,175,175, 58, 14,162,250,245, 93,164,143,191, - 25,218, 55,121,234,148, 41,210,187,119,239,210, 99,199,127,195,198,166,100,131,215,105, 49,133,143,190, 39,255, 84, 59,160,243, -167,237, 48,107,198,196,250,197, 78, 59, 43,148,122, 14,162,250, 1, 46,210, 71, 19, 71,244,127, 57,126,252,120,225,194,133, 11, -181,205,154, 53, 43, 76, 75, 75, 19,138,229, 10, 95,142,173, 44, 32, 54, 37, 85,210,172, 89,179, 87, 95,126,249,101,110, 85, 49, -167, 79,159, 46, 58,113,226, 4, 39, 44, 44,204,148,147,147, 35,161,133,194, 32,130, 47,104,146,145,147, 99,219, 59, 44,236,121, -239,222,189, 53,197, 14, 75,173,198,156, 57,115,166,232,201,147, 39,156,102,205,154, 25, 83, 83, 83,165, 98, 59,251, 64, 74,166, -104, 28,147,146,102,211, 36, 36,228,197,216,177, 99,213, 21,165,179, 52, 73,145, 74,165, 73, 45, 90,180,192,175,191,254,138,101, -203,150,161, 99,199,142,120,240,240, 1, 58,143,157, 0,191,209,223,224,240,213,235, 72, 74, 74,194,156, 57,115, 16, 24, 24, 8, - 46,151,251,164,204,246, 56, 42,154,184,155, 10,226,110, 42, 8, 98, 84, 52, 97,185, 46, 87,179,245, 99, 30, 74, 63, 95,214,115, -183,103,150,173,233, 10, 86, 18, 81, 21,217, 97, 85, 70,182,122,247,238, 61,198,226,194, 97,216,176, 97,151,151, 47, 95,222,114, -216,176,162,137,118,211,166, 77, 49,119,238,220,150,211,167, 79,191, 60,111,222, 60,180,107,215, 14, 94, 94, 94,149,110,124, 49, -155,205, 48,153, 76,232,223,191, 63, 76, 38, 19, 50, 50, 50,240,244,233, 83,172, 91,183, 14, 44,203, 10, 0, 64,233,226,214,136, -199,227,225,207, 59,183, 52, 51,134,133,108,175,130, 38,139, 40, 61,137, 41, 40, 40, 64,239,209,163, 51, 19,235,212,201, 94,147, -153,169,249, 66, 46, 23,213,138,139, 83, 72,245,122, 87, 84, 96,151, 72, 16, 4, 24,134, 41, 33, 86, 22,194,245,230, 81, 60, 80, - 90, 37, 6, 13,115,244,226,182,100, 0, 64,235,129, 46,232, 62,185,214, 16,165,183,104, 69,171, 1, 69, 74,239,253,115, 95,178, -249,201,230,133, 48,226, 81, 21, 52,214, 55,110,220,184, 1,153, 76,134,176,176, 48, 62, 73,146, 11, 44,243, 85, 20,249,206, 90, - 98,193,226,243,249,139, 7, 13, 26, 68,230,230,230,226,222,189,123, 0,112,166,188,126,137,101,217,146,188, 23,100, 19, 48, 51, - 60, 92,185,115, 28, 39, 47,238, 67, 76, 82, 6,226,210,181, 0,199, 22, 90,117, 34, 12,133, 73,208,231,222,129, 74, 39,178, 42, -193, 92, 46, 55,163,126,253,250,108,227,198,141, 89,150,101,241,226,197, 11, 83,108, 92,156,233,214,210,165,236,253,145, 35, 9, -233,211,167, 92,161, 80, 72,120,122,122, 66, 32, 16, 48, 2,129, 32,235,111, 28,188,255, 18,119, 11,127,129, 91,136, 15,169,213, - 98,241,239,148, 20,188,190,219,176,196,129,105, 89, 14, 75,193,218, 8,251,238, 91,181,218, 54,172,255, 64,117, 96, 96,160,220, -213,213, 21, 4, 65,160, 71,207,158, 68,232,133, 11, 82,218,197, 5,118, 13, 27,150, 44, 71,156, 62,117, 10,199,143, 31, 87, 31, -249,227,160,235,208, 47,190,232, 10, 96, 75, 5,137,225,240,249,252,146,223, 77, 73, 73, 1,159,207, 47,177,137, 80,169, 84,112, -112,112, 64, 74, 74, 10,172, 92,153,219, 58,117,202,245, 41,233, 33,223,123,134, 72,105,226,152, 58, 21,102,150, 5, 77,152,129, - 66, 22, 70, 51,160, 51,178,104, 84,139, 82,156, 44, 52,201, 35,111, 28,120, 5, 96,107, 85, 74, 79,167,211,157,187,123,247,238, - 72,134, 97,246, 1, 32, 47, 92,184,192, 60,122,244,104, 12,172, 55, 92,127, 91,109, 47, 18, 77, 62,123,246,172, 98,242,228,201, - 57,145,145,145,121, 93,186,116,177, 93,183,110,157,162,109,219,182,147,179,178,178,118, 89,163, 8,140,143,143,223,146,144,144, - 48,166,113,227,198,200,206,206,134,193, 96, 64, 84, 84, 20,188,189,189,113,251,246,109,248,248,248,224,214,173, 91,168, 91,183, - 46,204,102, 51,180, 90, 45, 24,134, 49, 87,214,153,103,103,102, 0, 89,241, 72,190,113, 12, 79,239, 71,225,108, 50,129,149,187, - 34, 80,163,166,231, 59,249,169,241,113, 20,249, 43, 29,236, 78, 46,156, 61,211, 49,246,220,110, 28,216,184,146, 57,127,236,152, - 31, 79,138,145, 31,245,255,250, 51,189, 17, 30, 0,120,205, 67, 26,163,147,252,137, 89, 84, 19,169,103, 31, 85,236, 96,209,199, - 81,228,239,100,111,119,226,231, 5, 63, 74, 95, 28,223,140, 61,107,127,101,247,111,219, 25,168, 5, 66,252,253,253, 59,145, 36, - 41, 3,160, 45,182,243,178, 42,180, 77, 89,152,167, 35, 34,130,181, 64,200,161, 67,135, 58,137, 68, 34,103, 0, 70,141, 70,243, -242,125, 48,207, 68, 70, 6, 91,210, 73, 16,132, 35, 0, 3,203,178, 47, 80,197, 16, 60,125,250,244,153,251,205, 55,223, 76, 49, -155,205, 14,165,102,231,212,226,197,139, 57, 12,195, 80, 44,203, 26, 72,146, 52,156, 56,113,194,108, 50,153,146,181, 90,237,232, -247,233, 69, 62,251,236, 51, 92,191,126,125, 54,138, 54, 97, 88,171,173,126,205, 78,171, 56,100,207, 59,227, 95,184,112, 97,206, -231,159,127, 62,117,215,174, 93, 79,151, 47, 95,222,109,212,168, 81,216,189,123, 55,234,212,169,131, 63,255,252, 19,223,127,255, - 61, 0,180,156, 62,125,250,225, 13, 27, 54,120,197,198,198, 46,182, 66,163, 1,147,201,132,157, 59,119,162, 71,143, 30,112,112, -112,128,139,139, 11, 8,130, 56,247,197, 23, 95,252, 6, 0, 20, 65,113, 1, 64,167,213,233,124,125, 27, 91,173,193,229,114,185, - 37,125, 93,106,106,106,201, 78,193, 79, 62,255, 60,243,247,133, 11,177,189,176, 16, 95,200,229,162, 68, 55, 55,229,225, 23, 47, - 70, 60, 44,234,156,217,138,180, 58,149,145, 44,107, 77, 26, 10, 83, 48,237,143,249, 49,206, 0, 58,182, 30,232,130,214, 3, 93, -208,184,187, 35, 65, 82, 4,238,159,204,194,131,211,217,251,141, 42,156, 67,213,194,229, 60, 90,176, 96,193,225,143, 62,250,168, - 91,189,122,245, 48,124,248,240, 47, 55,110,220,200, 53, 26,141,227,241, 31, 55, 15,182, 36, 73,254,184,118,237,218, 17, 10,133, - 2,151, 46, 93,194,197,139, 23,207, 1,136, 47,175, 95, 2, 80,226, 51,171,134,187,143,246, 73,108,129, 40, 61,233, 10, 46, 95, -250, 3,117, 2,191,134,208,185, 43, 20,190,243, 96,136, 94, 6,125,214, 73, 40,220,187, 32, 49,246, 5, 40, 14,255, 65,101, 70, - 40, 44,203, 62, 76, 76, 76,244,242,242,242, 34, 98, 98, 98, 76, 0, 88,179,217,204, 26, 90,181, 50,250, 45, 92, 72, 63,248,242, - 75,162,249,147, 39, 20, 75, 16, 76, 84, 84, 20, 0, 60,254,111,140,226, 22,119, 11, 15, 30, 60, 40,207,221, 66,149,164,126,253, -250, 45, 47, 94,188,200,215,106,181, 56,127,254, 60,154, 52, 41,217,219,245, 95,245,126, 95,154,139,252,203,100, 68, 25,247,214, -189,166,209,122,173, 98, 51, 4, 93,215,199,199,204, 37,177,169, 71,215,174,154,187,119,239,150,204,250,180, 55,111, 66,125,252, - 56,204,102, 51, 88,150,197,197, 11, 23, 48,104,224,192, 2,154, 34,126,175, 85,171, 38, 75,176,175,249,110,105, 95,198,236, 33, - 44, 44, 44,172,164,243, 73, 72, 72,128, 88, 44, 6,143,199, 3,195, 48, 48,153, 76,160, 40, 10,182,182,182, 48,153, 76,101,169, - 96,222,196, 52,154,179,213,189, 55,116, 30,144,226, 82, 96, 96, 71,202,106,193,131, 43, 44,105,156,206, 54, 4,186, 5,210,176, -231,164,179,103, 22,127,156,204,232,178,122,227,237, 29, 93,149,109,249,247,105,208,160,193,111,131, 6, 13, 34, 1,160,125,251, -246,100,131, 6, 13, 86,160,226, 80, 57, 21, 98, 10, 4, 2, 62, 0, 68, 68, 68,100, 63,125,250,180, 99, 68, 68, 68,118,233,251, - 86, 98,174, 91,180,104, 17, 68, 34, 17, 76, 38, 19,244,122,125,137,125, 86,233,179,193, 96,128,189,189, 61,142, 28, 57, 2,179, -217,124,164,178,116,186,123,212, 4,225, 80, 27, 91, 34,206,226, 98, 38,247, 93, 72, 86, 9,102,109,103,113, 93,103,123,187, 83, - 63,207,159,227,144,243, 60, 10,137,137,137,236,137,227, 71,174,105,129,164,188,124,204,200, 85,163,110,161, 30,130, 38, 94,136, - 63,181,246, 59,118,122,107, 24, 81,246,174,193, 18, 76, 63,103,113, 93, 87, 7,187, 19,191,252, 60, 95,154,251, 60, 10, 41,169, -169, 56,122, 36,226,174, 22,176, 44, 55, 14, 97, 24, 38,128, 97,152, 0, 0, 67, 42, 32, 47, 85,194,212,104, 52,245, 53, 26, 77, -253, 15,137,201,178,108,125,150,101,173,198, 44,109, 19,181,100,201,146,232,148,148,148, 65,233,233,233, 29, 44, 71, 78, 78, 78, -251,130,130,130, 54, 26,141,166, 85,225,146,154,182, 26,141,198,177,160,160, 64,169,213,106, 27, 1,136,170, 66,157, 47,145,210, - 94,167, 83, 82, 82,102,165,164,164, 16,149,165,147, 26, 29, 77,236,248,101,226, 31,107,215,174, 85,190, 39,254,107,233,204,204, -204,220,183,107,215,174, 32, 79, 79, 79,175, 33, 67,134, 96,205,154, 53, 88,190,124,185, 14, 0, 54,108,216,160, 43,165,201,114, -143,141,141,109, 92,206,178, 97,251, 82,218,146,173,159,124,242, 9,123,241,226, 69,244,232,209,163,196,145,232,250,245,235, 97, - 50,153, 84,237,218,181, 99, 0,160, 80,171, 81,177, 12, 11,189,161,220,245,247,183,202,147,199,227,125, 90,218, 95,160,197, 25, - 51,143,199, 3,203,178,168,219,178,101,102,110, 96, 96,246,198,188, 60,205,172,250,245,109, 70,248,250, 14,169, 7, 12, 44, 11, -147, 32,136,215,180, 58,111, 30, 85,208,100,149, 78,103,122, 97, 50,134,255, 49, 63,230,184, 69,179, 37,144,112,160,205, 55,225, -224,194,152, 12,109, 6,214,151, 71,126, 42,202,123,118,118,246,216,133, 11, 23,234,228,114, 57, 62,251,236, 51,204,155, 55,239, -139,150, 45, 91,230, 57, 58, 58, 94,175, 83,167,206,253,190,125,251,166, 68, 69, 69,141, 13, 13, 13,197,179,103,207,240,203, 47, -191,228,230,228,228, 12,168, 8,147, 32,136, 18, 77, 94,247,206,237,179, 87,175,248,149,105,247,209, 24,136,132, 54, 48,210,238, -200, 46, 48, 34, 71,205, 66,207, 15, 1,143,203, 71,135,102,254,184,126, 98,179,198,172, 87,111,169,172,206, 23, 20, 20,236, 31, - 60,120,176,138,203,229, 66,175,215,179, 52, 77,131, 95,100,119,204,208, 29, 59, 26,154, 63,122,100, 50,179, 44, 67, 16, 4,190, -253,246, 91,117, 78, 78,206,174,119,105, 71, 85,144,210,152, 31,202,221, 66,251, 55,198,159, 15,225, 22,226,175,200,251,191, 89, -214,149,113,252, 71,163,101,217, 82,105, 57, 19, 4, 99, 54,155, 25,212,242,172, 37,141,141,137, 95,217,167, 79,216,176, 78,157, - 58,139, 58,119,238, 44,240,143, 46,154,141, 70, 68, 68,224,192,129, 3,154,147, 39, 79,170,248, 52,181,193,189,134,187,147,217, -204,128, 32,152, 10,217,176, 84, 42, 29, 63,109,218, 52, 97, 94, 94, 30,150, 47, 95,206, 4, 5, 5,145, 98,177, 24, 6,131, 1, - 27, 54,108, 48,250,251,251,211, 36, 73, 34, 47, 47, 15, 36, 73, 62,177, 50,131,247,242,226,147, 58,252, 22,218,235, 64,227,175, -134,218,249,133, 54,151,183,113,119,133,177, 33,139,228,132, 24, 60, 61,115, 50,231,225,137,165, 89,208,166,245, 66,229,225,129, -202, 26, 8,126, 56,121,242,164,227,216,177, 99, 89,173, 86, 75,196,199,199,179,243,231,207,119, 28, 62,124,248, 15,201,201,201, -253,222,241,163, 16,185,185,185, 32, 8,130, 41,238, 72, 44,179,254,170,172,203, 61,216,178,101,203,161,158, 61,123,118,111,215, -174, 29,162,163,163, 75,150, 8, 75, 19, 45,203,238,195, 5, 11, 22,228, 2,152, 90, 25, 40, 77,211, 88,190,101, 31,114,115, 50, -225,228,228, 2,129, 80,136,119,221, 97,201, 35,201, 89, 63,205,153,233,152,249,248, 58,241,224,218, 89,102,239,189,180,116,147, -153, 45,219,227,127,126, 50, 91,204,254, 43,158,205,144,212,172,159,230,255,104,107, 89,214,220,117, 39, 69, 69,152,217,177,239, -213, 68,254, 45,152,127,179,184,184,184, 32, 37, 37,133,112,113,113, 97,139,109,180,216, 10,136,214,235, 21,188,104,185,140,168, -104,217,240, 93,241, 95,189,122, 53,191, 97,195,134, 19,159, 61,123,182,215,207,207,111, 20,128, 26, 58,157, 46,119,250,244,233, - 63,111,216,176, 97,152, 53,154, 44, 0,216,189,123,247,210,161, 67,135, 30,239,218,181,235,119, 12,195, 52, 40, 53,176,191,114, -116,116, 44, 89,194,205, 72, 75,157, 50,114, 88,255, 41, 5, 5, 57, 86,251,185,147, 72, 36, 35,166, 79,159, 46, 80,171,213, 88, -181,106, 21,227,239,239, 79, 90, 38, 69,219,182,109, 51,249,248,248,112,194,198,140,201, 92,146,154,138,185,151, 46,169,167, 4, - 4, 4,109,124,250,180, 17, 24,102,107,121, 90,157,178, 52, 89, 22,179,139,119,148,228, 98,178,181, 30, 64,199,230,125,156,113, -104, 81, 12,114, 98,245, 63,195,132, 23,176, 34, 44, 80, 25,146,184,127,255,254, 14,105,105,105,135,102,206,156,105,219,168, 81, - 35, 4, 4, 4,208, 18,137, 36,196,226, 46, 38, 47, 47, 15,167, 79,159,198,154, 53,107,244, 15, 31, 62,236, 89,209,114,149,217, -108, 78,247,241,241,177,148, 3, 75, 16, 68,150, 74, 71,216,238,169, 23, 34, 25, 50,114, 47,113,249,214, 85, 36, 27, 24,232,140, - 12,106,121, 6,163, 77,199, 37, 56,124,236,190, 57, 57,246,209, 35, 99, 97,206,239, 86,164,247,197,243,231,207, 15,206,153, 51, -167,207,119,223,125, 39,204,204,204, 52,235,116, 58,102,223,190,125,212,144, 33, 67,204, 44,135,195,112, 57, 28,140, 31, 63,190, - 48, 55, 55,247, 15,224,111, 13, 48,253,151,184, 91,248, 11,220, 66,124, 48,109, 86,233,243,255,138,148,217, 66, 25,138,188,178, -102,237,234, 79,119,239,220,229, 76, 81,164,243,139,151, 47,111,117,235,213, 59,233,212,169, 83, 10,174,173,109, 19, 0,140,126, -212,168,107, 6, 93, 97,118,228,161, 67, 30,181,106,213, 12, 44, 14, 42,205, 50, 20,121,165,162, 31, 44, 40, 40, 80, 95,186,116, - 73, 51,117,234, 84, 34, 33, 33, 97,135,147,147, 83,223, 99,199,142, 73,122,245,234, 85, 24, 29, 29,189,223,217,217,185,123,104, -104,168,116,226,196,137,186,130,130,130,170, 4, 30,125,196,102,228,212,187, 57,115,241,231, 55, 23,173,254, 24, 28,170, 5,116, - 52,192, 24,175,192,144,127, 10,192, 14, 84,193,223, 81,105, 17,139,197,129, 34,145, 8,119,239,222,205, 9, 9, 9,209,107,181, - 90,238,188,121,243,236,196, 98,113,224,187, 22, 60,203,178,108, 78, 78, 14, 24,134,225, 0, 32,138,207, 96,170,190, 23,191, 95, -183,110,221, 14,237,217,179,231,147,206,157, 59,195,203,203, 11, 70,163, 17, 62, 62, 62,208,235,245,240,246,246,134, 78,167,195, -236,217,179,145,151,151, 55, 1, 21,196, 60, 35, 8, 2, 38,147,169,196,216,214,213,205,163,200, 79,207,123,184,177, 16,211,164, -215,147,200,141, 72,207,202,100,246,252,153,150,166, 49,152, 59, 60,207,208, 60,124,243, 57,141, 25,234,208, 33,227,146, 0, 64, -199, 84, 28,113, 94,204,131,215,211, 35,235,145,150,158,137,221,119, 82,114,213, 6,166,227,211, 50, 48,171,148,206,127, 9,102, -240,236,104,244, 30,103,253,179,239, 35,214, 18,170,242,228,110, 42,136,219,162,141, 44,214,110, 44,211, 71,214,123,226, 31,122, -246,236,217, 33, 0,120,244,232, 81, 66,255,254,253,167,196,196,196,204, 1,112, 52, 54, 54,118,109, 85,128, 54,110,220,248, 12, -192,208,138,158,217,181,120,232, 65, 0, 7,171,130,155,159,159,175,141,138,138,210, 78,156, 56,145, 72, 72, 72, 56,230,236,236, -252,201,241,227,199, 69,189,122,245,210, 61,120,240,224,140,139,139, 75,235,246,237,219, 75,142,222,184,145,164,121,241, 34, 50, - 50, 38,198,205,200, 48,145, 21,181,207, 15, 76,178, 94, 35, 91, 7,231,198,252,116,232,167,152,246,140, 14,251,245, 57,184, 6, - 32,241, 61, 48, 47, 94,185,114,197,111,224,192,129,123,186,116,233,210,220,207,207, 15, 53,106,212,192,211,167, 79,145,145,145, -129,123,247,238, 33, 34, 34, 34, 66,171,213, 86, 26, 80, 59, 59, 59,251,237,240, 68, 2,133,203,230, 85,179, 34,110, 93,110,226, -211,170,243, 96, 97,128, 11,112,159,172, 26, 0, 0, 32, 0, 73, 68, 65, 84, 3,189,129, 69, 66,220, 11,204,158,241,187, 38, 37, -238,217, 35,131,201,208, 19, 86,110,212, 41, 44, 44, 92,183,108,217, 50, 58, 50, 50,178,243,202,149, 43,165, 30, 30, 30, 20,151, -203, 37, 1,176,183,111,223,102,199,141, 27,167,206,204,204, 60,162, 82,169,214,253,205, 99,244,197,151, 47, 95, 6, 83, 20,245, - 65,221, 45,188,135, 91,136,106,249,144,226,233,233,230, 87,219,195,101,148, 87, 13,183, 49,158, 30,238,225,101, 25,185,123,201, -229, 82,207,154,174, 35,188,106,184,141,169,237,225, 50,202,211,211,205,207, 10,213,162,151,141,141,205, 49,165, 82, 25, 4, 0, -182,182,182,221,101, 50,217, 67, 91, 91,219,238,197,179,192,238, 18,137,228,177,191,191,255,240,191, 81, 93, 89, 33,166,143,143, - 79,255,130,130,130, 47,125,124,124,250, 91,174, 95,188,120, 81,114,253, 46,152,238,238,238,237,110,223,190,221,111,241,226,197, -159,213,169, 83,167,251,252,249,243, 63,251,227,143, 63,250,185,185,185, 53,122, 7, 76, 62,128,237, 52, 77,167,241,120,188,116, -154,166,211, 44, 7,135,195, 73,163, 40, 42, 13,192,218,114,180,101,237, 75,205,114, 46, 59, 57, 57,197, 58, 57, 57,197, 58, 59, - 59,199, 58, 59, 59,199, 42,149,202,183, 14,123,123,251,203,214,150,167,175,179,164,101, 72, 13,233,149,250, 74,201,229,122, 78, - 98,223, 15,241,141,124,157, 37, 45,155,212,176,189, 82, 95, 41,189,244,255, 13, 51,200, 25, 44,187,198,151,101,215,248,178, 65, -206, 96, 43,187,254,144,106,127,165, 82,201, 42,149,202, 89,127,213, 82, 66, 57,248,127,123,123,255,128,152, 94, 82,169,116, 87, -141, 26, 53, 44,125, 93, 87, 27, 27,155,115, 18,137,164,107,113, 95,215, 85, 44, 22, 95,240,247,247, 31, 92, 25,166, 66,161,184, -237,232,232,152, 90,124,164, 56, 57, 57,165, 56, 57, 57,165, 56, 58, 58, 38, 59, 58, 58, 38, 59, 56, 56, 36, 89, 14,153, 76,118, -253, 29,243,238, 8,160, 41,128, 70, 0,108, 62, 96,121,122, 2, 24, 89,220, 7, 45, 4, 48, 28, 64,131, 15,240,141, 8, 90,168, - 24,205,151,185, 95,161, 37, 14,249,180,196, 33,159,111,235,118,165,130, 16, 60,214, 96,214, 85, 40, 20,243,108,108,108,254,144, - 74,165,151,164, 82,233, 33,123,123,251,249, 0,234,254,151,234,146, 4,192, 6, 20,249,103, 58,138,162,165,240, 67, 40,218, 84, -224,241, 15,172,243,255,159,101,196,127,235,135,219, 87, 99, 86, 99, 86, 99, 86, 99, 86, 99, 86, 99,254, 11, 49,201,234,242,172, - 38, 90, 85, 36, 90,111, 30, 0, 42,240, 12, 95, 45,213, 82, 45,213, 82, 45,213,242,255, 88,152,234, 34,168,150, 42, 74,153, 75, -203, 68, 5,172,180, 42,190,166,222,133,217,158,174,198,172,198,172,198,172,198,172,198,172,198,172,198,252,127,135, 89, 45, 31, - 80,170,213,170,213,152,213,152,213,152,213,152,213,152,213,152,213,152,255,235, 82,189,116, 88, 45,213, 82, 45,213, 82, 45,213, - 82, 45,213,242, 23,201,186, 82,132,235,181, 37,196,106,162, 85,117, 33, 1,124, 9,160, 55,128,218, 40,138,102,191, 15,192,111, -120,183, 53,125, 27, 0, 83, 0,180, 64,209,238,156, 87, 0, 46,161,104,119, 78, 65,117,113,151, 45,246,246,246,211,104,154,150, - 1, 69,161, 77, 44,231,210,255, 55,155,205,185, 42,149,106,254, 95,148, 4, 10, 86,122, 80,182,164,181,116,218, 74,159,141, 70, -227, 95,153,206,106,249,103,138,143, 66,161,216,158,157,157, 61, 0,165,130, 44, 87, 75,181,252, 47,136,131,131,195, 40,131,193, - 48,157,203,229,206,203,200,200, 88,253,255, 40,235,111,145,172,215,136, 86,100,100,228, 5, 0,232,210,165,203, 71, 0, 32,147, -201,174,146, 36,233, 89,149, 95, 96, 24,230, 85,110,110,110,185, 14,212,100, 50,217, 85,138,162,222,194, 52, 26,141, 82, 14,135, -147, 95,214, 59, 38,147, 41, 81,165, 82, 53,250,135, 20, 34, 1, 32, 82, 46,151,107,231,204,153,243, 91,155, 54,109,220,147,147, -147, 77,147, 39, 79,110,253,231,159,127,118, 6,240,105, 21,201, 86, 51,130, 32, 54, 7, 5, 5, 29, 12, 15, 15,223, 19, 18, 18, -194,203,202,202,146,238,219,183,207,117,203,150, 45, 81, 12,195, 12, 64, 5,129, 86,255, 63, 11, 77,211,178,196,196, 68, 41, 80, - 20,154,164,152, 88,193,104, 52,194,104, 52, 66,173, 86, 35, 48, 48,240,131,255,174,179,179,115, 48, 65, 16, 43, 37, 18, 73,163, -130,130,130, 91, 0,198,164,164,164,252, 89,149,180,154, 76, 38,176, 44, 91,146, 78, 63, 63,191,234, 15, 90, 53,249,130,199,227, -117,244,246,246,110,162,211,233,114, 94,189,122,117,211,108, 54,207,196,135,139,209,102, 11, 96, 38,159,207, 15,169, 93,187,182, -251,179,103,207, 18, 12, 6,195, 13, 20, 5, 67,206,251, 16, 36,235,163,143, 62,186,188,106,213, 42,187,209,163, 71, 95,190,116, -233, 82,203,106,178, 85, 45,255, 45,113,119,119,151,169,213,234,223, 1, 4,211, 52,237, 44, 16, 8, 32, 20, 10, 83,249,124,254, - 93,161, 80, 56,236,202,149, 43,185, 85,197, 52,155,205, 51, 99, 99, 99,157,155, 54,109,186,200,209,209,113,118,102,102,166,214, - 96, 48,156,201,201,201,153, 0, 64, 85,209,187,111,114,145,127, 25,201, 42,125,134,133,116,113,138, 51,198, 2,104,243, 26, 3, -227,112,220,226,226,226, 28, 5, 2, 1, 24,134, 41, 25,204,222, 60, 44,247,245,122, 61, 2, 2, 2, 12,149, 12, 56,238, 9, 9, - 9,142, 60, 30,175,228,158, 94,175,135,171,171, 43,147,152,152,232, 88, 28,246,160, 68,116, 58, 29,220,220,220,254, 73, 49,143, -190, 84, 40, 20,121,241,241, 9,129, 90,157,225,199,225, 99,167, 78, 27,208,251, 99,249,213,171, 87,153, 79, 63,253, 84,119,225, -194,133, 47, 81, 20, 56,213,170,206,156, 32,136, 45,147, 39, 79,158, 45, 16,217,216,157,189,250, 72,183,101,223,145,164, 32,159, - 90,196,132, 9, 19,168,113,227,198, 93, 12, 14, 14,222,206, 48, 76, 67, 84, 65,179, 37,151,203,143,243,249,252,154,197,229, 23, -159,147,147,243,201, 63,176, 66,114,240,182,243,216,178,238, 85, 42, 89, 89, 89, 40, 44, 44,124,235,240,243,243,179, 54, 86,102, -149,210, 77,211,244,161, 5, 11, 22,184,166,166,164,224,215, 37, 75,154,162, 72,147,217,212,154,151,211,211,211,223, 74,167,175, -175, 47,170,165, 74, 50,101,246,236,217, 11, 62,255,252,115,152,205,102, 20, 22, 22,186, 60,127,254,220,127,250,244,233, 61, 95, -188,120,209, 4,192,203,247,157,140,123,123,123, 71,127,253,245,215,138, 38, 77,154,160, 56, 74,133,203,165, 75,151,154,110,216, -176, 97, 80,124,124,188, 47,128,140,247,249, 1,133, 66,177,125,253,250,245,118, 34,145, 8,135, 15, 31,182,107,215,174,221,165, - 59,119,238,180,122, 15,178, 69,218,217,217,141, 3,208,150, 97, 24, 30,128, 27, 57, 57, 57,115, 81,117,175,238, 74,137, 68,178, -159, 36,201, 90,192,127,188,209,147, 36,105, 79, 16, 68,166,229, 30, 65, 16,142, 12,195, 92,203,206,206,110, 94, 93, 29,255,221, - 98,103,103,247, 69, 90, 90,218, 42, 62,159,207,149,203,229, 16,137, 68,224,112, 56,224,112, 56, 53,248,124,126, 13, 62,159,223, - 41, 52, 52,116,204,185,115,231, 42,244,176,223, 44,200,105, 8, 72,226, 71,138, 32, 41, 0, 32,105,177,141,173,173, 45,126,252, -241, 71,113,247,238,221,197, 0,112,249,242,229,240,193,131, 7,183, 75, 76, 76, 12, 40,143,108,149,197, 69,254, 69,178,174,162, - 1, 15,197,236,241,194,107, 45,151, 36,193,227,241,112,253,250,117, 88,227,172,220, 18, 34,161,194,222,160,216,195,248,159,127, -254, 71, 1, 96, 25,104,120, 60, 30,174, 92,121,221,169,124,179,102,205, 74, 26,251,223, 37,189,253,138,156, 60,238,253,170, 40, - 93, 97, 43,139,188,107,239,253,202, 23,173,127,137, 67,239,113,179,250,106,180,134,198, 0,212,185, 57, 57, 57,183, 14, 28, 72, - 14,242,241,225,110,223,190,189,137,171,171,107,239, 42, 16,173, 41, 13, 27, 54,220, 79, 9,109,237,195, 7, 15, 9, 31,198, 33, - 13,131, 70, 78,156,151,144,146,169, 30, 49, 98,196,129,195,135, 15,135,255,244,211, 79,143, 39, 77,154, 52, 5,192,247,214,166, - 95, 32, 16,212,124,242,228,137,183,217,108,134,159,159,223, 63, 49,140, 65, 16,138,156,239,125, 14, 96,103,241,189,254, 40,242, -220, 31, 12,224,110, 85,192, 44, 26,172,178,142, 15, 45,174,174,174,190, 3, 7, 14,180,207,206,204,196,175, 75,150, 88,110, 55, - 66, 37,203,136,150,246,163,215,235,241,217,103,159, 13, 52,155,205, 28, 11, 9,212,233,116,250,188,188, 60, 45,254, 99, 88,154, - 1,224, 99, 43,146,227, 41, 22,139,127, 6, 16, 92, 88, 88,232, 10, 0, 98,177, 56,137, 97,152,131,106,181,250,123,252, 39,128, -111,149, 39,184, 0,252, 81,126, 40, 40,118,193,130, 5,207,166, 78,157,250,242,191,128, 89,211,201,201,105,126, 88, 88, 24,142, - 28, 57,130,163, 71,143, 26,133, 66, 33,103,240,224,193,196,152, 49, 99,228, 95,127,253,117, 39, 0,203,222,243, 51,119,154, 61, -123,182,162, 94,189,122,216,183,111, 31,238,221,187, 87,232,237,237, 45,108,211,166, 13, 56, 28,142, 98,218,180,105,159, 2,216, -252, 62, 63,144,157,157, 61,119,226,196,137, 91,118,238,220, 41,125,245,234, 21, 86,174, 92,105,223,183,111,223, 11,241,241,241, - 31, 85,129,108,241, 1,140, 3, 16, 74, 81, 84,171,193,131, 7,155,198,142, 29, 75,147, 36,105, 92,178,100,137,195,134, 13, 27, -250,210, 52, 29,156,149,149,101,205, 36,141, 4,240,227,176, 97,195,134,158, 59,119, 78,126,243,230, 77,158,157,157, 29,204,102, -115,137,166,152, 97, 24, 71, 75,157, 53,153, 76,240,245,245,117, 43,245,190,240,223, 74, 52, 72,146, 52, 48, 12, 67, 3, 16, 0, -208, 85,118,253,191, 68,178, 20, 10,197,232,236,236,236,223,156,157,157,225,228,228,244,214, 88,171,211,233, 32, 16, 8,184,206, -206,206,235,187,119,239, 78, 31, 58,116,168,220, 37, 64,130, 34,102, 30,222, 53,199, 85, 33,151, 2, 0,150,174, 57,161, 1,128, - 63,254,248, 3,201,201,201,144,203,229, 8, 8, 8,160,230,204,153,163,156, 48, 97,194,175, 57, 57, 57,195,202,195,122,147,139, -252,203, 52, 90,235,202,186,174,208, 70,139,101,217,146, 56,121, 86, 86,218, 55,111,157,126, 3,143,208,235,245,120, 83,163,101, -105,188, 52, 77,191,169,126, 4, 65, 16,108, 69,152,101,200, 96,177, 88, 28,168, 86,171, 87, 84, 97,118, 91,130,185,247, 43, 95, -108,225, 79,238,111,137, 68,218,105, 98,209,121, 11,128,171, 49,195, 86,174,250,232, 35,215,113, 51,150,207, 42,204, 74,206,156, - 54,176,107, 77,111,103, 59,161, 56, 55, 61, 79, 81,183,110,135, 55, 52, 50,149,165,179,117,120,120,248,214,147,215, 99, 9,129, -128,203,229, 80, 20,221,178,190,143,157,187, 45,101, 43, 5,108, 19, 94, 62,187, 58,100,200,144,250,147, 38, 77,106, 85, 5, 76, - 20, 15,184,216,182,109, 27, 8,130, 32,171,146,247, 15, 40,167, 43, 34, 89, 44,203,130, 32,136, 29,165, 6,149, 29,197,247,238, -148, 34, 91,156,138,202,211,162, 77,181,144,170,193,131, 7, 15, 52,153, 76,156, 82,157,196,155, 4,166, 44, 18, 99, 85,222,149, - 74,229, 73, 0, 31, 19, 4, 1,189, 86,171,255,249,151, 95, 74,255,249,246, 27, 36,235,116,121,109,201,104, 52,194,108, 54,115, -238,220,185, 67,151,170,235, 52, 0, 49, 0,123,150,101, 65,146,228,125, 43,202,211, 87, 36, 18, 93,141,136,136,176,105,212,168, - 17,193,227,241, 96, 50,153,240,224,193, 3,247,159,126,250,105,228,233,211,167, 63, 85,171,213,126,120, 59,120,186, 53,223,200, -255,210,165, 75,106, 47, 47,175, 50,137,163, 74,165,226,248,248,248,124, 84, 14, 41,250,171, 49, 19,211,210,210,122,124,252,241, -199,163, 82, 83, 83,163, 77, 38,211,119, 0, 2,236,237,237,239,244,234,213, 11, 66,161, 48,180,176,176,112,217,251,212,121, 71, - 71,199,238,205,155, 55,199,202,149, 43,241,211, 79, 63,181, 7,112, 6, 64, 59,149, 74,117,186, 91,183,110,144,201,100, 61,114, -115,115, 55,191, 71, 59,242,105,221,186,245,250, 31,127,252, 81,122,228,200, 17,120,123,123, 35, 63, 63, 31,223,126,251,173,227, - 15, 63,252,112, 62, 55, 55,183, 77,169,118, 81, 30,166, 31,159,207,223,188,115,231, 78,137,151,151,151, 23,151,203, 37,189,188, -188,144,157,157, 13,173, 86,203,159, 55,111, 94,125,161, 80,248,231,178,101,203, 54, 3,232, 85, 73, 58, 73, 0,115,215,174, 93, - 59,106,196,136, 17,178,129, 3, 7,154,245,122, 61,246,236,217, 3,138,162, 64,211, 52, 68, 34, 81, 73,240,106, 46,151,139,186, -117,223,114,146,126,184,130,252,230,161,200, 14, 85,134,170, 45,187,158,174, 0,175,100,233,131,166,105, 8, 4, 2, 8, 4, 2, -240,249,124, 60,121,242,100,134, 64, 32, 88, 66, 16,132,201, 26, 76,226, 63,236, 34, 16,192,205,202,174,241,182,105,200,223,217, -127, 90,196,141, 32,136,165, 0, 66,139,134, 93,242,130,189,189,253,248,180,180,180, 56,107, 49,149, 74,165, 93, 86, 86,214, 50, -165, 82, 9, 39, 39,167,146,241,219,213,213, 21, 70,163, 17,105,105,105, 96, 89, 22,185,185,185, 16,137, 68,112,113,113, 89, 54, - 98,196,136,125,235,214,173,203, 42, 19,147,193, 79,221,250, 78,159, 73, 81, 20, 9, 0, 20, 71, 34,249,122, 42, 80,179,102, 77, -180,108,217, 18, 90,173, 22,121,121,121,240,247,247,231, 16, 4, 17, 78, 16,132, 13,203,178,171, 1,156,253, 31, 84, 20,150,107, - 12, 63,251,205,117, 81, 75,180,120, 46,151,107, 21,209, 42,126,190, 50, 13, 10,105, 52, 26,193,229,114, 95,211, 72, 16, 4, 1, -179,217,252,218,125, 11,209,122, 23,162, 62,102,204, 24,102,253,250,245,163,114,114,114,214,224, 29,151, 18,194,195,195,223,178, -247,152, 48, 97, 66, 98,122,122, 58,251, 89,135, 64,113,244,177,228,148,218,114,137,208, 65, 42,173, 37,144, 43,100, 89, 89, 89, -215,138, 59, 19,107,165, 78,195,134, 13,133, 91, 14, 92, 74, 28,254,205,130, 57,141,188,236,108, 26,184,217,203,157,109,133, 60, - 9, 73,168, 5, 38, 99,162, 66,161,240,174,106,186, 45,253,130, 72, 36, 2, 73,146,255, 36,141, 22,199, 66,178,178,179,179,113, -228,200, 17,116,238,220,249,142,133,132,168, 84, 42,164,164,164, 64,169, 84,222, 41,214,124, 84,186,140,200, 48, 12, 12, 6, 3, - 12, 6, 67, 9,129, 41, 85,135, 74, 8,140,229, 89,138,162,238,191, 99,218,231,200,229,242,214,161,161,161,188, 93,123,246,240, - 88,150, 85,163, 40,134, 90, 1,203,150, 19, 32,251, 13, 49,153, 76, 37, 90, 54,154,166, 17, 31, 31, 95, 50,112, 89, 98, 75, 10, - 4, 2,235, 84, 25,124,254,196,221,187,119,219, 52,105,210,132,200,202,202, 2,195, 48, 37,157,228,111,191,253, 38,232,221,187, -183,107, 84, 84,212, 52,157, 78, 55,251, 29,242, 74,148, 71,136, 0,192,198,198,198, 4,235, 60,102, 87,138,105, 50,153,136, 22, - 45, 90, 76,202,204,204,172, 95, 88, 88, 56,207,154, 98, 4,112, 56, 49, 49,177,244,192,254,103,116,116,116, 97,159, 62,125,132, -181,106,213, 10,121,244,232,209,123, 85, 82, 31, 31,159,102, 52, 77,227,198,141, 27, 58, 0,150,153,245,133,123,247,238,233,122, -245,234,197,119,119,119,111,150,155,107,181,201,138,143,175,175,239, 41, 71, 71, 71,161,165, 15,117,112,112,160,215,173, 91, 39, - 77, 74, 74,130,193, 96,192,148, 41, 83,208,165, 75, 23,216,219,219, 99,194,132, 9, 78,139, 22, 45,218, 94, 80, 80,208,176, 34, -165, 53,143,199,219,250,252,249,115,111,165, 82, 41,188,126,253, 58, 26, 52,104,128,204,204, 76,164,166,166,162,160,160, 0,169, -169,169, 24, 54,108,152,227,175,191,254,234, 98,133, 38,171,132,100,173, 91,183, 46,119,255,254,253,212,239,191,255, 46,165,105, -186,132,104,113, 56,156, 18,162,101,137,173,248, 14, 43, 13,185,197,164, 77,150,151,151,247, 62,118,110,124, 0,188,210, 36,139, -207,231,131,207,231, 67, 32, 16,188, 87, 92,214,127,137,184, 18, 4,241,136,203,229,242, 69, 34, 17,151, 36, 73,240,249,252, 14, - 10,133,226, 97, 64, 64, 64,192,169, 83,167, 98,173, 1,209,106,181, 91,249,124, 62,237,232,232, 8, 0,240,246,246, 70,131, 6, - 13,160, 86,171,153,188,188, 60,200,100, 50, 50, 46, 46, 14,133,133,133, 72, 73, 73,129,135,135, 7, 77,146,228, 86, 20,217, 33, -191, 37, 87,239,164,174, 1,176,198,114,109,111,111,159, 86, 90,211, 41, 16, 8,224,234,234,138,164,164, 36, 72,165, 82,234,135, - 31,126,232,181,103,207,158,158, 87,175, 94, 13, 7,176,173, 20,212,236,127,177,141,150,133,100,149, 62,255,135,104,117,233,210, -101, 86,100,100,228, 71,101,205,194,105,154,254, 96,182, 46, 22, 66,101, 99, 99,243,166,214, 10, 12,195,148,167,209,170,242,239, - 8, 4, 2,225,232,209,163,243, 87,175, 94, 93,101,178, 21,182, 50,186, 68,139,245,214, 52,210,207,239,234,180,105,211,186,159, - 59,119, 46,169,145, 87, 45,142, 56, 57,174, 64, 96, 35,147,193,173, 70,231,193, 61,122,221, 67,209,238, 67,107,229,121,126,126, -190,176,182,155, 72, 79,146, 90,162, 6,159, 35, 85,138,185,124,103,185,220,149,171,215,165,219,200,229, 60,157, 78,151,139, 10, -130, 64, 3,128,147,147,211, 9,161, 80,232, 97,185,150,203,229,182, 44,203, 66, 36, 18, 65,169, 84, 74, 40,138,122, 90,170,113, -197,165,165,165,117,168, 44, 97, 50,153,236, 4,159,207,247, 32, 73, 18, 4, 65,128,162, 40,144, 36, 9,146, 36, 75,254, 79, 81, - 20, 8,130,128, 70,163,137,139,141,141,237, 96, 69,126, 77, 0,130, 9,130,184,115,228,200, 17,132,132,132,224,216,177, 99,232, -216,177, 35,242,242,242,240,224,193, 3,180,110,221, 26, 40, 90, 82,180, 74, 74, 27,191, 91, 38, 5, 79,158, 60, 41, 33, 46,165, - 15,169, 84,250, 62, 42,246,203, 97, 97, 97, 88,191,126, 61, 91, 60,153, 16, 19, 4,209,192,214,214,246,201,227,199,143,173,178, -131, 97, 89, 22, 6,195,127, 30,181, 12, 94,197,246, 16, 85, 10, 14, 76, 81, 84,135,134, 13, 27, 18,121,121,121, 22, 2, 9, 14, -135, 3,138,162, 64, 81, 20, 86,173, 90, 37,108,210,164,201,116, 62,159, 63,137,203,229,170,140, 70,227, 46,173, 86, 59, 15, 64, -238, 63,169, 71,106,213,170,213, 55, 9, 9, 9, 93, 60, 60, 60, 34,222, 3,134, 53, 26,141,122, 0, 66,138,162,232, 15,208, 71, - 81,197,117, 75, 91,138,236,155,138,175,249, 40, 90, 38,182, 74,236,237,237,183, 31, 61,122,212,205,195,195, 3, 70,163, 17, 38, -147, 9, 5, 5, 5,184,112,225, 2,116, 58, 29, 76, 38, 19,188,189,189, 49,115,230, 76,237,248,241,227, 5,107,215,174, 77, 47, - 40, 40, 24, 80, 9,236,248,125,251,246,137,149, 74,165,176,176,176, 16, 47, 95,190, 68,195,134, 13,145,159,159, 15,181, 90, 13, -141, 70, 3,131,193, 0,149, 74, 37, 51,155,205,250, 74,176,102,148, 38, 89, 35, 71,142,188,207,227,241, 26,142, 29, 59, 22,137, -137,137, 37,109,126,248,240,225,112,114,114, 42,105, 75,197,125,114,149, 58,102, 14,135, 3, 62,159, 15, 46,151,155, 91,163, 70, - 13, 16, 4, 33,136,139,139,123,151,165, 56, 27, 0, 42,154,166,121,165, 9, 22,159,207,199,141, 27, 55,166,241,120,188,242,180, - 89,229,181, 75,182, 42,215,255,109, 33, 8, 98, 41,151,203,229, 43, 20, 10,110,169, 9, 39, 87, 34,145,192,209,209,113, 37,128, - 78, 86,230, 59, 72,161, 80,148,244,239,129,129,129, 72, 72, 72, 56,152,151,151, 55, 40, 61, 61, 29, 36, 73,110, 37, 73,178,167, -101,146,154,147,147, 3,119,119,247,160,242,240,154, 7, 59,143, 2,193,190,166,209,122, 99,130, 6, 27, 27, 27,196,196,196, 64, -173, 86,179,207,158, 61, 35, 70,143, 30, 77,232,245,250, 77, 81, 81, 81,215, 80,180,219,190, 92, 46,242, 47,145,170,219,104, 89, - 52, 90,214, 14, 0, 4, 65, 84, 58,155, 48, 26,141, 18,127,127,255,178, 12,190,136,178,136, 86,241,114,210, 59, 85,116,154,166, -165,239, 74,182,222,148,136,253, 59,157,126,154, 57,101,166,194,165, 86,237, 73,147,102,112,186,118,237,122,125,203,150, 45,102, - 69,189, 78,237,206,158,216,230,180,236,219,201,199,142, 30, 61, 10, 20, 25, 70, 91, 43,151, 35, 35, 35,157, 39,140, 27,131,153, - 19,199, 31,183,241,182,231, 73, 8,133, 88,160, 83,103, 72,192, 22,242,235,248,118, 57, 16, 17,145, 2, 32,170, 34, 16,145, 72, -228,241,232,209, 35,239,210, 27, 9,244,122, 61, 68, 34, 17,206,158, 61,235, 32, 20, 10, 29, 0,160,176,176, 16, 1, 1, 1,214, -106, 76, 60,158, 62,125,234, 45,149, 74,161,209,104,160,211,233, 96, 52, 26,193, 48, 12, 8,130, 0, 77,211,224,241,120, 16,139, -197, 85,221,217,119, 23,192,231,157, 59,119,222,113,236,216, 49,248,251,251, 35, 39, 39, 7,209,209,209, 22,146, 85, 37, 27, 45, -139,150,168,180, 61, 22,135,195,193,118, 47, 47, 12, 79, 78, 46, 33, 48, 75,109,109, 49,147,121,183,104, 26, 1, 1, 1,236,229, -203,151,113,252,248,113,116,235,214,141, 56,116,232,144,193,108, 54,115,147,147,147,239, 39, 39, 39, 91,133,193, 48, 76, 73, 90, - 45,253,118,105,130, 85, 85,162,101, 50,153,164, 60, 30, 15, 90,173, 22, 22,205, 67,233,195,211,211, 19,217,217,217, 28,149, 74, -197, 73, 78, 78, 22,205,157, 59,119,236,249,243,231,149,249,249,249,253,255,155,189,208,234,213,171, 61,134, 15, 31, 30,207,225, -112,216,142, 29, 59, 14,140,139,139,235,161, 84, 42,207,156, 59,119,238, 23, 0, 62, 85,197,179,183,183,191,205,225,112,220, 84, - 42, 21,119,239,222,189,198,252,252,124,174,131,131, 67,154,165,239,176,148,181,209,104,180,106,231,178,189,189,253,237,204,204, - 76,238,138, 21, 43,140, 89, 89, 89, 92, 39, 39,167, 52, 11, 78,110,110, 46,119,239,222,189, 70,149, 74,197,181,181,181,189,157, -151,151, 87, 41, 94,102,102,230,128,240,240,240, 75,103,206,156,177,167, 40, 10,113,113,113,200,202,202,130, 76, 38,195,214,173, - 91,225,225,225,129,125,251,246,101,103,103,103,127,241,243,207, 63, 79, 47, 38, 89,149,217,104,181, 14, 9, 9,241,200,205,205, -133, 76, 38,131, 90,173,198,237,219,183,225,231,231,135,228,228,100,144, 36, 9,153, 76,134,223,126,251, 77, 67, 16, 68,118, 69, - 64, 66,161,176,199,136, 17, 35,100, 0, 48, 98,196, 8,217,136, 17, 35,202, 28,224,154, 53,107,134,149, 43, 87,190, 73,180,170, - 50, 49, 40,209, 58,149, 34, 71,218,166, 77,155,226,252,249,243,147,171, 72,142,244, 22,210,246,166, 54,139,207,231, 87,121, 51, - 13,195, 48, 92, 20,153, 52, 16,214, 92,255, 3,228, 35,161, 80,200,125,243,166, 70,163,225, 42,149,202, 86, 85, 32,190,118, 66, - 97,145,194,201,195,195, 3,121,121,121,102,189, 94,223,247,255,218,187,206,240, 38,174,180,123,102, 70,189, 88,238, 21, 3, 6, - 2,152, 14,166, 99, 58, 14, 16, 32, 75, 18,218, 38,212,133,152, 16,216, 44, 36, 11, 36, 31,201,134, 56,148, 64, 96, 33,129, 16, -240, 66, 48, 16, 72, 66, 11, 29, 66, 89,140, 9, 53, 54, 4, 55,108, 76,115, 47,178, 44,217,146,101,149, 25,205,247,195,146, 34, - 27, 23,201,150, 41, 89,157,231,153,199, 26,207,232,232,206,157, 91,206,125,239,123,223,187,103,207, 30, 35, 0,132,133,133, 77, - 97, 24,166,130,166,105,138,207,231, 67,163,209,192,207,207,207,187, 14,219,232,210,163, 63,172, 8,168,238,163, 21, 24, 24,136, -176,176, 48,232,116, 58,228,229,229, 33, 54, 54,214,200, 48,204,222,111,191,253,214,228,235,235,251,183, 9, 19, 38, 80,241,241, -241, 11, 0, 44,170, 77,139,188, 96,214,172,232, 90,133,150, 89, 65, 94, 4, 48,180,250, 67, 86, 23, 63,117, 9,173,250,166, 14, -249,124,190, 50, 51, 51, 83, 98,219,169,208, 52,141,160,160, 32, 19,203,178, 68, 77, 66,171, 49,166, 96, 46,151,235,246,209, 71, - 31, 41,191,253,246,219,169, 15, 31, 62, 92,110,207,119,246, 47,232,128, 93,213, 68,214,214, 53, 81,155, 55,173, 89,225,149,113, -122, 39,182,127,189,142, 97, 24,196,119,237,218,117,144, 90,173,230,184, 75,140,144, 43,113,202, 44,178,236, 21,133, 36,128,239, -110,220,184, 17, 63,102,204,152, 95,191,251,241,144, 87,238,253,251, 87, 5,165,242, 60, 89,219,118, 28, 94,179,150,175,151, 85, - 84,240,166, 76,153,226, 11, 96, 66,125,141,152, 82,169, 68,126,126,126,117, 1,134,187,119,239, 62,113,175, 93,137, 35, 73, 48, - 12,131,131, 7, 15, 66, 44, 22, 67, 34,145, 84, 57, 44, 34,171,129, 11, 21,210, 0, 96,244,232,209, 80, 40, 20,144, 74,165,118, -167,171,186,120, 97, 89, 22,122,189, 30,122,189, 30, 6,131,129, 1,192,229,112, 56,152,157,157,109,181,242, 56, 34, 96,170,163, -107,215,174,236,149, 43, 87,240,235,175,191, 66,163,209, 96,211,166, 77, 8, 12, 12, 28, 14,224, 19, 71,185,108,156,244,153,210, -210, 82,110,105,105,169,213, 58,200,229,114,173,214, 3, 59, 45,121, 60, 14,135, 99, 29,141, 90, 14, 91,171, 22, 69, 81,240,247, -247, 71, 64, 64, 0,182,110,221,202,107,213,170,213,184,103,217, 2,173, 93,187,182,237,198,141, 27,119,236,218,181,235,212,212, -169, 83,127, 74, 76, 76,156,229,238,238,126,231,194,133, 11, 43, 4, 2,129,169,129,245, 59, 56, 55, 55,215,207,246, 95, 38,147, - 73, 76,211,180, 85,216,150,151,151,219, 61,192,224,114,185,193,201,201,201, 98, 0, 88,177, 98, 5, 23,128,216,226, 12,110,225, - 44, 47, 47,231,118,234,212, 41,216,222,178, 30, 23, 23, 55, 40, 34, 34,226,202,217,179,103, 61, 91,182,108,137,156,156, 28,228, -228,228,160,109,219,182, 88,181,106,149,166,180,180, 52, 28, 64,154, 90,173, 62, 98, 39,103,144,167,167, 39, 55, 51, 51, 19, 52, - 77,163, 71,143, 30,216,178,101, 11,166, 76,153,130, 46, 93,186,160,180,180, 20,201,201,201,136,137,137,241,228,241,120,117,182, - 29, 90,173,246, 72,116,116,116,243,234, 22,173,105,211,166, 73, 10, 10, 10,172,101, 50, 42, 42,170,202, 20,162, 35,109,178,121, -106,171,214,163, 33,160,105, 90, 38, 20, 10, 75, 5, 2, 1,223,226,159, 21, 27, 27,235,176, 53,171,218, 0,208,145,243,103, 6, -139,104,173,161,111, 69, 64, 64,128,221, 60, 2,129,128,176,180,141, 52, 77, 67,165, 82, 49,129,129,129,214,233,253,132,132, 4, - 38, 36, 36,132,161, 40,138,226,243,249, 32, 8, 2, 98,177,184,214, 6,159,101,216,168, 87,167,124, 82,101,213,225,194,143, 0, -131,193,128,132,132, 4, 24, 12, 6,196,198,198, 26,191,252,242,203, 92,165, 82,185, 16, 0,231,204,153, 51, 51,150, 44, 89, 66, -249,249,249, 69, 20, 22, 22,162, 62, 45,242, 2,137,173, 39,172, 92,150, 94,232,226,184,113,227, 8,243,210, 74,194, 34,156, 28, - 17, 90,230,202, 87,111,207, 75, 16, 4,242,242,242,172,231,126,126,126, 14,255,150,189,240,246,246,214,244,239,223,223, 77, 46, -151, 31, 89,187,118,109,131, 44, 89, 91,215, 68,109, 94,253,249,167, 94,138,148,107,200,206,205,131,162,208, 24,127,249,206,195, -195, 0, 14, 3, 0,182,117,188, 72,188,147,250,141,189,156, 29,124, 68,221,185, 60,206,225,151,199,140,107, 62, 57,114, 17,249, -238,187,239, 14,156, 49, 99,134,106,234,212,169,239, 73,165,210,246, 6,131,161,228,208,137, 19,143, 38, 79,158,220,138, 97,152, - 25,168, 39,230,136, 86,171,125, 60,116,232, 80,219,252,148,157, 59,119,206,255,209,163, 71,152, 63,127,126, 81, 78, 78,142,210, -246, 94,123,210,104, 48, 24, 30,119,239,222,189,214,233, 66,203,148, 34, 0,148,149,149, 61,118, 32, 75,223,132,217,241,189,184, -184, 24,119,239,222, 5,135,195, 65,191,126,253,112,249,242,101, 12, 28, 56, 48,193, 17,171, 86, 69, 69, 5, 90,182,108,137,138, -138, 10,104, 52,154,114, 0,130,221,173, 90, 1, 0, 22, 20, 23,227,183, 47,191,196,181,213,171, 97, 91,158,237, 69,183,110,221, -216,107,215,174,225,206,157, 59,208,233,116,152, 51,103, 14, 0, 16,230,178,235, 72,200,140, 54, 20, 69,141, 30, 51,102, 76, 16, - 0,104, 52, 26,226,198,141, 27, 16, 10,133,214,186,112,236,216, 49,228,228,228,128, 32, 8,120,122,122, 6,151,148,148,180, 2, -240,176, 14,179, 63,241,240,225, 67,124,241,197, 23, 48,153, 76, 88,178,100, 9,218,181,107,103, 21, 88,143, 31, 63,198,138, 21, - 43,192, 48, 12, 62,253,244, 83,180,109,219, 22, 70,163, 81,136, 6,134,208,112, 6,222,127,255,253,140,195,135, 15,159,202,202, -202,122,101,205,154, 53, 67, 8,130, 48, 45, 94,188,248, 11,153, 76,198, 52,134,183, 68, 85,134,187,247, 30, 91,133, 80,245,195, -215,199,203, 97,190,244,251, 89,214,239, 51,140, 45, 31, 3,111, 47, 79, 71,147, 88,110, 52, 26, 53,175,191,254,186,199,193,131, - 7,137,182,109,219,226,193,131, 7, 22,203, 80, 57, 28, 15,233,144,163, 80, 40,218, 81, 20,197,187,119,239, 30, 66, 66, 66,208, -183,111, 95,172, 92,185, 18,114,185, 28, 52, 77,195,207,207,207,100, 52, 26, 19, 12, 6,195,165,122,184,162,230,206,157,203, 3, -240,142,217,178,213,117,225,194,133,166,117,235,214, 33, 33, 33,193,106,193,178,117,134,119,116,234,208,214,234,100,123,196,198, -198, 46,225,243,249, 44,128,235,112, 60,208,179,190,186, 69,171, 33,214,172,166, 66, 83,174,100, 12, 12, 12,140,117,115,115, 27, - 87, 82, 82, 82,197,170, 21, 30, 30,110,240,247,247,143,179,151, 71, 42,149,150, 80, 20,229, 13, 0, 57, 57, 57,144, 72, 36,188, -251,247,239,175, 70,101,240,108,180,106,213,106,181, 66,161,224,181, 50,183,167, 1, 1, 1,208,235,245,181,186,177, 92,189, 85, -176, 19,192, 78,203,185,151,151, 87,158, 74,165, 18,173, 91,183, 78,189,122,245,106, 45,195, 48, 58, 0, 23,148, 74,165, 53,142, - 86,126,126,190,138,203,229,122,121,120,120, 52,179, 8,173,154,180,200, 11,134,218, 45, 90,102, 37,201, 86, 23, 68, 4, 65, 60, -225,160, 94,143,208,170, 87,100, 49, 12, 83,197,202, 96,113,120,175,233,183,204,157,122,131,166, 14,205, 34, 75,120,232,208,161, -221,107,215,174,189,110,239,247,108,125,180,182,173,255,124,141, 69,100,253,254,235, 89, 28, 73, 85,201,151,172,222,176,177,161, -111,160,163,143,184,155,191,191,247,197, 47, 87, 69,201, 50, 78,199,224,167,109,255,102,127,191,121,179,207,205,155, 55,167,207, -159, 63,191,133,185, 96, 41, 0,220, 6, 48, 25,118,172,210,201,201,201, 25, 85,173, 19, 78,227,241,120,254, 98,177, 24, 57, 57, - 57,234,244,244,116,135,167,100,228,114,249,168, 38, 40,128, 28,139,200,146,203,229, 72, 78, 78,198,176, 97,195, 0, 0,151, 47, - 95, 70,120,120, 56,226,227,227,209,179,103,207, 4, 0,189, 81, 79,160, 86,163,209,168,236,216,177,163,213,186,165, 82,169, 76, - 0, 16,153,151,135,232,192, 64,112, 56, 28, 92, 91,189, 26,203,140, 70,172,116, 80,192,119,239,222,157,189,113,227, 6, 30, 61, -122, 4,154,166, 49,126,252,120, 52,176,210,119,233,208,161,195,185, 11, 23, 46,248, 74,165, 82,104, 52, 26,168,213,106,204,156, - 57, 19, 83,166, 76,129, 78,167,195,254,253,251,113,244,232, 81,184,185,185, 65,163,209, 64,163,209,120,142, 29, 59,246, 74, 90, - 90,218, 96, 0,247,106, 17, 90,236,168, 81,163, 16, 23, 23, 7,138,162,208,167, 79, 31, 20, 23,255,177, 24,200,223,223,191,166, -107,212,179, 20, 90, 28, 14,135,141,141,141, 93, 51,100,200, 16,100,101,101,189,210,179,103,207, 77,179,102,205,202,105, 44,175, -167,187, 27,186,119,106, 3,157, 78, 7,157, 78,135,160,160, 32,148,149,149, 33, 35, 35, 3, 58,157, 14,254,126, 30, 14,243,133, -117,105,107,229,243,243,243,131, 70,163,193,195,135, 15,161,215,235,225,227,227,144,208,106, 62,106,212,168,255,238,221,187,215, - 59, 38, 38, 70, 63,116,232, 80,254,166, 77,155, 8,153, 76, 6,155,142,197, 81,196, 94,190,124,185,101, 68, 68, 68,104, 74, 74, - 10, 98, 99, 99,161,215,235, 17, 22, 22,134,244,244,116,244,239,223, 31,106,181,250,250,205,155, 55,143,218, 99, 24, 6,240,241, -220,185,115, 97, 17, 91,113,113,113,200,203,203,131,155,155,219, 19, 66,203,226,251,104, 94, 53, 30,100, 79, 98, 45,130,200,198, -242,180,204,195,195,195, 0, 96, 99, 3,173, 79, 0,128,172,172, 44, 65,215,174, 93,117, 66,161,144,111, 22,109, 27, 26,195,231, - 76, 56, 97, 37, 99,173, 8, 8, 8, 88,232,227,227, 19,209,186,117,107, 20, 20, 20,240,248,124, 62,194,195,195, 13,189,123,247, - 54, 4, 4, 4, 44,176,151, 71, 32, 16,164,240,120,188,193,149,131, 9, 6,153,153,153, 96, 89,118, 73,151, 46, 93,254, 81, 86, - 86,134,226,226, 98,190, 76, 38,179, 14,170, 67, 67, 67,161,211,233, 82, 28,176,188, 69,133,132,132,124,204,227,241, 86,202,229, -242,154,194, 66,240, 61, 60, 60,100, 60, 30, 15, 6,131,161,138,216,172,174, 69, 94,116,145, 85, 69,104,217,168,200, 42, 66,199, - 17,139,150, 61, 86, 3,139,131,189,237,185, 69,212, 85,255,173,134,198,208,114,119,119,215, 89, 68,214,202,149, 43,175, 55,132, -227,192,222, 61,129,238,166,242,230,185,215, 79, 34,237, 78, 60, 14, 39, 43,229, 75, 86,111,120,239,213, 9,111, 22, 84, 23,102, -246,160,157,175,184,139,191,159,247,197,245,107, 87,203, 20, 41,215,144,151,159,143,147,215,111,198, 27,128,100, 0, 75,156,105, - 90, 6, 42,167, 14, 41,138,122,158, 10,172,213, 25, 62, 47, 47,207, 34,178,194, 0, 96,224,192,129, 9,102,145, 5,123, 45, 90, - 74,165,178,250,150, 53, 17, 0,124, 44,207,207,225,112, 16,254,241,199, 14,139, 44, 0,108,124,124, 60, 20, 10,133,101,164,216, - 80,145,133,128,128,128,127, 94,184,112,193,247,187,239,190, 43,221,181,107, 87,177,201,100,226,118,239,222, 61,184, 87,175, 94, -196,238,221,187, 1, 0,147, 39, 79,198,146, 37, 75,144,148,148, 4,137, 68,130,129, 3, 7, 50,203,151, 47,247, 91,184,112,225, -130,130,130,130,247,106,236, 29, 77, 38,158, 80, 40, 60, 15, 96,120, 74, 74, 10, 0, 92, 65,229, 22, 78, 22, 43, 66,173,215,236, -233,124,203,202,202,184,110,110,110, 53,134,134,224, 85,142,134, 28,181, 64, 88, 57,127,253,245,215, 47,214,175, 95,127,248,131, - 15, 62,184,215, 72,206, 26, 45, 90,227,198,141,131, 86,103, 64,118,129, 10, 12, 67, 67,107, 40,116,152,207,214,162, 53,110,220, - 56,148, 87,232,145,153,167, 0, 77, 51, 40,211,218,221,151,139, 95,126,249,229, 51, 63,252,240, 67,192,213,171, 87,193, 48,140, - 41, 61, 61,253,225,235,175,191, 46, 91,188,120,177,119, 35, 22, 25,125,253,230,155,111, 78,252,245,215, 95, 21,161,161,161, 94, -215,175, 95, 71, 97, 97, 33,104,154,198,240,225,195,193,231,243, 51, 87,175, 94,205, 3,240,181,189,239,198, 44,182, 12, 55,111, -222,124,251,218,181,107, 94, 94, 94, 94,124, 83,135, 14,200, 59,123, 22, 7, 15, 30,124,226, 11,219,182,109, 3,236,140,194,111, -177, 56,221,184,113,195, 41, 2,171, 74, 79,205,231, 55,120,250,241, 69,197,141, 27, 55,114,222,125,247,221, 78, 50,153,108,227, -160, 65,131,134,121,123,123,147,158,158,158,177,205,154, 53,251, 71,247,238,221,237,158, 93,224,114,185,179, 36, 18, 73, 6, 77, -211,148, 90,173,134, 70,163,169,108,164,105,154, 79,146, 36, 90,181,106,101,237, 75,250,244,233,131,128,128, 0, 38, 53, 53,117, -150,189,252, 69, 69, 69, 85, 86, 33,214,128,185,225,225,225, 28,157, 78,135, 71,143, 30, 93,182,189, 80,147, 22,121, 65, 16, 89, -167,248,178, 60,148,237,195, 53,107,214, 44,203,104, 52,178,201, 0,123,251,246,109, 54, 50, 50,178,206,163,162,162,130,245,243, -243,203,171,161,243,131, 45,167, 78,167,171,242, 61,157, 78,199,250,251,251, 51, 90,173,246, 9, 78,173, 86,203, 6, 7, 7,231, -212,197, 89, 3,102,222,186,117,235,219,101,203,150,245,117, 32,131,172,156,236,214, 14,108, 76, 76,204, 95, 89,150, 29, 50,168, - 83,203, 59,147,186,251,179,225,237,252,114,143, 30,216, 59,133,101,217, 33,213, 15, 75,128,211,186, 56, 59,248, 75, 58,142,232, -220,162,228,247,211,251,216, 11,235,254,206,174, 31,223,142,237, 25,236,166,236,224, 35,114,116,143,152,122,119, 75,239,220,185, -115,154,201,100, 98,245,122, 61,219,185,115,231,116,103,112, 54, 0,117,113,246, 64,165, 47,219,155, 53,252,175, 71, 35,210,249, - 59,203,178,172, 66,161, 96,213,106, 53,171,211,233, 88,134, 97, 88, 91, 0,248,221, 14, 78,214, 96, 48,176, 37, 37, 37, 44,236, -247,185,171,145, 51, 48, 48,240,225,253,251,247,217,151, 94,122, 41,203,108,142, 95,168,209,104,216,234,208,104, 52,236,176, 97, -195,216,244,244,116, 54, 36, 36,164, 34, 61, 61,157, 13, 12, 12,188, 91, 79, 58, 91, 55,111,222,252,188,143,143, 79, 44,128,118, - 14, 92,171, 51, 63,247,239,223,223,134,101,217, 57, 44,203, 70,214,114,204,119,133,129,130, 0, 0, 32, 0, 73, 68, 65, 84, 97, - 89,182,195,179,230, 52,231,111, 1,203,178,108,121,121, 57,171, 80, 40,216,220,220, 92,182,188,188,156, 85,171,213,236,173, 91, -183,216,171, 87,175,178,119,238,220, 97,189,188,188, 10,236,225,180,240,233,245,122,182,180,180,148, 45, 44, 44,100,181, 90, 45, -171,209,104,216,196,196, 68,246,183,223,126, 99, 83, 82, 82,106,226,123,130,211,219,219,123, 91,126,126,190,250,202,149, 43,229, - 91,183,110, 45, 15, 8, 8, 72, 1,208, 18, 64,123, 79, 79,207,252,191,255,253,239,172, 84, 42,125,220,192,122,212,137,203,229, -222, 90,179,102,205,141,227,199,143, 23, 28, 61,122, 84,191, 99,199,142,236,249,243,231, 95,226,112, 56,183, 0,116,106, 96, 61, -242,243,240,240,184,114,253,250,117,186,164,164,132, 85, 42,149,108,105,105, 41,171,209,104, 88,173, 86,203,234,245,122,214,104, - 52,178,151, 46, 93, 98,253,253,253,109,167, 37,151,214, 49,176, 94,196,178,236, 63, 89,150,229, 56,187,173,179,225, 30,228, 44, - 78,103,180,117, 36, 73, 26,204,109, 71,191,202,211,186,207,159, 85, 58, 71,140, 24,241,233,148, 41, 83,216,209,163, 71,179, 97, - 97, 97, 79, 28, 61,123,246,100,231,205,155,199, 30, 63,126,156,253,242,203, 47, 63,117, 66, 58, 57,168, 92,244,178,106,196,136, - 17,198,184,184, 56,118,242,228,201, 44,128, 81,117,105,145, 63,131,224,178,132,119, 32,108,255, 2,128,193, 96,200, 74, 75, 75, - 11, 12,165,105, 10, 0,190,249,230,155, 39, 44, 83,182,136,139,139,163, 9,130,200,168,235,215, 13, 6, 67,214,133, 11, 23,252, - 55,111,222,204,181, 49, 1,131,166,105, 83,110,110, 46,185,105,211,166, 42,247, 95,188,120,145,166,105, 58,211,193,135,140,233, -209,163, 71,140, 51,114,235, 82,210,163,127,156, 57,249,179, 79,191,190,131,148, 50, 47,175, 26, 71, 97,251, 23,116, 0,241, 78, -221, 86, 45,130, 67,174, 92,179, 42,202,195, 50, 5,249, 99, 66,190,178, 66,199, 12, 75,149,107,127,119,246, 27, 86,171,213,143, - 44, 43, 1, 53, 26, 77,230,115, 88, 8,111,161, 50,198, 21, 93,237,127,189,209, 72,167, 83,147,201, 4,119,119,119,171, 53,180, - 1, 22, 81,214, 98, 97,181,188,186,198,164,135,101,217, 95, 19, 19, 19, 67,102,206,156,233,182,107,215,174,251, 12,195,112,103, -207,158,109, 8, 8, 8,224, 93,190,124,217, 8,128, 24, 50,100, 8, 39, 63, 63,159,205,201,201, 81,252,229, 47,127, 41,123,251, -237,183,189,111,223,190,205, 55,153, 76,245, 5, 45,124,144,149,149, 53,162, 1,215,234,196,164, 73,147,238,163,241,219,216, 52, - 57,167, 5, 10,101, 41,238, 63,202, 49, 71, 48, 55,129,121, 92, 96,245,171, 50, 26,105, 40, 74,139, 29,182,104,101, 60,204, 49, -111, 49,198,128, 97,114,205,124,149, 14,241,108, 73,121,253,189, 9,135, 51,112,249,242,229, 99, 72,146, 36,175, 93,187,166, 91, -187,118,109, 86, 81, 81,209,120, 0,153, 0, 80, 82, 82, 50, 52, 38, 38,230,123, 59, 66, 57,212,134,100,163,209,216,127,233,210, -165,239, 1, 24, 8,160,133,153,251,178,217,146,213,208, 8,230,133, 74,165,114,228,152, 49, 99,206, 82, 20,213,202,166, 30,249, - 0,144, 91,234, 5,203,178,126, 5, 5, 5,175,216, 67, 72, 16,196,134,166,106, 72,154,146,187,145,237,208, 11,177,146,241,252, -249,243,159,141, 31, 63,158,211,178,101,203,255,107,217,178, 37, 89, 82, 82, 2,181, 90, 13,146, 36, 17, 16, 16,128,206,157, 59, - 35, 32, 32,192,148,146,146,178,234,195, 15, 63,172, 55, 38, 95,199,142, 29,219, 24,141,198,151, 72,146,108, 3,160, 13,203,178, -109, 8,130,104, 3,192, 11, 0,100, 50,153, 44, 36, 36,132,211,175, 95, 63,244,237,219, 23, 23, 47, 94,196,129, 3, 7,118, 2, - 56, 99,107,205,170,174, 69,158, 7, 36,247, 0,219,233, 22,136,164,158, 24, 66,152,112,145, 37, 49,180,115,188, 53,206, 94,117, -145, 85,251,166,210, 53,152,254, 70, 13, 31, 62,220, 90,225,236,232, 84, 30,213, 87,249,138,138,138, 70,205,154, 53,171, 10, 39, -195, 48,186,226,226,226,119, 7, 12, 24,176,133,162, 40, 65,181, 2,251,184,176,176,240,169,238,213, 87, 61,142,214,168, 49,175, -201, 27,203, 41,229,145, 47,165,157,248, 15, 10, 10,229,248, 49, 33,191,164, 76,207, 12, 77,151,151, 39, 54, 69,250, 31, 63,126, - 60,250, 5, 80,252, 53,137,214,198,110,158, 93,100, 71, 64,210,250,246,168, 35,204,225, 68,156, 82,201,243,243,243,215,125,252, -241,199, 35, 87,173, 90,229,123,234,212, 41,153,101,128,242,198, 27,111, 20, 38, 38, 38, 14, 2, 32,168,168,168, 56,183,106,213, - 42,223,168,168, 40,111, 0,222, 0, 48,118,236,216,130,130,130,130,205,112,161, 78, 24,141,198,236,206, 29, 67,173, 3, 63,219, -144, 14,182,159,105,154,206,118,132,175, 38, 30,219,115,134, 97,234,228,163, 40,234,131,190,125,251, 82, 31,124,240, 65,193,169, - 83,167, 44, 27,233,218, 42,180,180,122,130,146,218, 3, 29,128,181,230,195,153,208, 40, 20,138,254, 14,126,135,113,149,198, 26, - 7,148,142,156, 63, 19, 28, 57,114,228,147,201,147, 39,199,120,121,121,237,105,211,166, 77,168,191,191,191, 76, 36, 18, 65,167, -211,149,233,245,250,187,105,105,105, 83, 63,249,228,147, 7,118, 89, 56, 98, 98, 40, 0, 60,147,201, 36, 36, 73, 82, 2, 64, 70, - 16,132,167, 69,104, 17, 4, 1,131,193,128, 71,143, 30, 97,217,178,101,204,249,243,231,191, 4,240,169, 3, 3,215,222, 0,124, -109,218,113, 95, 0,122, 84, 6,176, 45, 34, 8,226,102, 83,231, 23, 97,194,197, 78,183, 64, 36,247, 64, 77,253, 68,221,155, 74, -215, 86,225,138,138,138,250, 59,187, 18,215,198, 89, 84, 84,212,242,121,169, 33, 51,116,107,247, 97,219,218, 42,251, 28, 90, 68, - 88, 77,231,245, 65,165,165,231,127,125, 38,105,157,142,102, 77, 6,218,244,183,244,162,242,100, 87, 59,228,116,188,236,172,186, -228,196, 52, 37,166,166,166, 14,152, 63,127,254, 39, 98,177,184, 15, 0,148,151,151, 95,203,205,205,253, 28,230, 85,133,245, 93, -119,161,118,200,229,242, 94,207, 35,159, 94,175,255,199,128, 1, 3,190, 98, 24,102, 61, 77,211,151,255, 7, 94, 69,133,171, 52, -190,184,248,233,167,159, 30, 0,232, 15, 0, 19, 39, 78,164, 0,224,192,129, 3, 14,139,231,153, 51,103, 50, 44,203, 26,204,229, - 65,131,202,213,133, 37,150, 54, 85,163,209,148,228,230,230,166, 48, 12,147, 2,224,123, 56,190,226,214,151, 32,136,227, 44,203, -142, 51, 11,183,227, 44,203,142,179,253, 95, 83, 91,181,234,185,165,126,103,120, 23, 42,113, 32, 25, 68,245,169,192,250,206,235, - 67, 90,129, 38, 22, 64, 79, 87,238,254, 79,226,126,110,110,238,140, 70, 92,119,225,197, 67,166, 94,175, 31,255, 63,244,188, 42, -215, 43,255,147,244,127, 13, 16, 88, 22,164,164,164, 52,153,139,192,179, 70,167, 91, 85, 7,224,213,207,109, 16, 89,147,240,114, - 9, 45, 23, 92,112,193, 5, 23, 26, 3,165, 43, 11, 92,248, 51,195,226,155,101, 57,175,197, 71,171,186,127,150,245,156, 64,237, - 43, 7, 28,217,149,188, 33,171, 36,206,185, 56, 93,156, 46, 78, 23,167,139,243,153,115,122, 0, 8, 1,176,166,158,251,170,175, - 46, 44, 0, 32, 7, 96,116,229,167,139,179, 17,250,193, 46,176, 44, 59,182,174,169, 67,130, 32, 78, 52,149,208,178, 58,195,247, -192,242,206,183,176,220,114,110,175,208,106,106, 68,184, 56, 93,156, 46, 78, 23,167,139,211,197,233,226,116,113, 54, 82,104, 13, -251,240,195, 15, 63, 66,101,104, 12,246,195, 15, 63,252,136,101,217,177,149,151,216,177, 77,249,219, 73, 61, 49, 36,185, 7, 88, -203,145,212, 19, 67,106,185, 53,210,230,176,194, 53,117,232,130, 11, 46,184,224,130, 11, 46, 60,239,184,178,122,245,234,242,213, -171, 87, 91, 28,223,139, 0, 16,102, 11, 87, 81, 83,254,176,121,154,208,158,133, 82,117,111,193,243, 12, 16, 68,114,120,211,184, - 60,193, 48,176,166,206, 0, 0,146, 74, 98,244, 21,255,165,105,195, 30, 0,185, 13, 37,238, 0,116,108,235, 33, 58,170, 99, 24, - 94, 86,153,126, 98,106,229, 54, 7, 14, 99, 34, 16, 46,224,243,127, 17,120,120,136,106,186,174, 83, 42,181, 58,189,126,228, 1, -224, 87, 87, 29,112,193, 5, 23, 92,112,225, 5,129,196,211,211,243, 60, 73,146, 45, 45,255,176,141, 59, 88, 61, 6, 33,195, 48, -121, 10,133, 98, 36, 42,167,138,159, 38,167,237,247,245,104, 96, 95,238,108, 56, 58,117,200, 1,170, 68, 97,125, 42, 59,102, 83, - 92,193,219,110,238, 30, 43,255, 58,235, 31,222,237,218,135, 18,205,155, 55, 3, 88, 32, 51, 43,219, 63,227, 94,250,136,159,118, -125,253,126,169, 74,177,204,168,211,253,199, 81,238,142,128,164,133, 84,112,249, 63, 31,190,229,193, 1,141, 55, 87,236, 61, 77, -168, 13,205, 83, 42,151,155, 58, 36,178, 60,188,189,207,172, 62,119, 78,228,217,173, 91,149,107, 44,203, 86,238,175,247,251,239, -162,255, 27, 57,242,204, 68,133, 98,148, 75,108,253, 41, 17, 32,147,201, 22,114,185,220,161, 6,131,161, 37,159,207,207, 98, 24, - 38,182,164,164,100, 35,128, 28, 87,246,252,185, 17, 26, 32, 25, 20,218,166,229,222,220,252,130,132,210, 10,253,236,180, 92,181, -194,149, 43, 14,163,174,253, 53,159,217,222,155, 0, 32,149, 74,127, 35, 73, 50,216, 86, 4, 88,246,236,181,156, 87,255,107, 50, -153, 30, 40, 20,138, 1,117,208,182,241,242,242,218, 2,160,119,125, 1,147,205,177,217,110, 42, 20,138,119, 81,251,106, 61, 55, - 79, 79,207,207, 8,130,152, 68,146, 36, 85,223, 51,153, 76, 38,134,101,217,253, 37, 37, 37,159, 2, 40,171,237, 62, 79, 79,207, -115,169,169,169,189,253,252,252,234,181,210,208, 52,141,204,204, 76,223, 62,125,250, 92, 82, 40, 20, 29,154,146,243,105,107,145, -134,162,142, 85,135,181, 22,116, 0, 85,246, 23,106,210,136,172, 60,161,244,104,255,193,163,134,205,123,239, 3,201,173,196,187, -248,229,226, 85,148,106,116,160, 72, 18, 30,110, 98,180,111,255, 18,177, 33,250,160,207,206,173, 27,214, 95,139, 59, 59,182, 66, -163,250,139, 67, 50, 93,204, 89,182,228,245, 62, 18,111, 47, 6, 48, 49,248,231,152,238,146,255, 59,158,176, 12,229,244, 71, 14, -139,172,243,231,197,133, 5, 5,136, 10, 10, 2,135,166, 33, 36, 73, 8, 9, 2, 66,146,132, 68, 40,196,232, 29, 59,240,249,169, - 83,226, 79, 94,121,197, 37,182,254,100,144, 74,165,179,130,130,130,214,110,223,190,221,187,117,235,214,144, 72, 36, 80, 40, 20, - 62,105,105,105, 61, 22, 45, 90, 52, 35, 47, 47,239,227,210,210,210,109,174,156,250,243,194,100,194,180,239, 86,190,219, 44,239, -241,189,102,115, 87,237,107, 79,120, 51, 67,239, 22,107,243, 93, 57, 99, 55,122, 0, 72, 64,205,251,151,214,117,173, 86, 8,133, -194,130,138,138, 10,191,186,238,225,243,249,133,122,189,222,191, 62, 46,146, 36,131,115,114,114,252,196, 98, 49, 24,134, 49,239, - 6, 96,178, 14,164,109,119, 63, 49, 7,170, 69,135, 14, 29, 12,117,113,186,185,185,125, 83, 88, 88, 24, 97,217, 39,208, 70, 80, -213,136,156,156,156,136, 78,157, 58,125, 83, 86, 86, 54,178, 22,241,242,217,123,239,189,183,176, 75,151, 46, 22, 43,144,121, 23, -132,202,191,114,185, 28,243,231,207,183,254,134,201,100,194,217,179,103,223,155, 53,107, 22, 74, 74, 74, 22,213,241,236, 45,253, -252,252, 8,243,134,226,181, 98,249,242,229, 88,190,124, 57,190,254,250,107,130,203,229,122,212,147,159, 78,225,124, 90, 90,164, - 33, 22,172,122, 34,195,159, 64, 85,223,172, 19, 79, 8,173,167, 1,138, 43,248, 91,239, 1, 17, 67,231, 47, 92, 34,217,247,243, - 5,164,165,252,142,212,203, 63, 84,185,167,215,200, 89,200,151,151, 97,214,188,127, 74, 9,138, 51, 52,238,220,145,191, 25,117, -218,239,236,180,102,249,183, 20,240,255,222,175, 79,103,110,142, 40, 13, 1,158, 34, 12,236,217,150,219,252,204,157,191,107, 64, -127,149, 82,185, 74,198, 33,145,181,253,173,183, 48,200,104,132, 31, 69,129, 34, 8, 80, 0, 72,130, 64,133, 78,135,155,211,166, -161,207,238,221,248,244,216, 49,241,103,175,190,234,144,216,146, 72, 36,183, 8,130,240, 84,171,213, 99, 81,185,177,244,139,128, - 78, 82,169,244, 4,203,178, 37, 26,141,166,199,115,148,174, 64, 84,206,209, 87, 31, 29,243, 80,185,162,202,161,157,133, 5, 2, -193,219, 19, 39, 78,220,176,121,243,102,113, 65, 65, 1,114,115,115,193, 48, 12,132, 66, 33,218,181,107, 71,156, 59,119,206,123, -201,146, 37,235, 78,156, 56, 33, 40, 43, 43,251,202,145,129, 13,151,203,141,246,242,242,122,197,223,223, 95, 82, 88, 88, 88,174, - 84, 42,207,234,116,186,183,209,240,109, 83, 72, 46,151, 59, 53, 36, 36,228,181,160,160, 32,255,156,156, 28,121,118,118,246, 81, -157, 78,183, 19, 13,220,168,217, 38, 79,187,193, 28,173, 30, 64, 94, 72, 72, 72,210,163, 71,143, 10,157,200,153, 27, 18, 18,146, -220, 0, 78, 9,128,159, 0, 4,213,115, 95, 46,128,201,112,208,154,109,205, 88,214,116,114,197,198,237,179,163,102, 14, 36,190, - 91, 20,209,238,157,175,207, 93, 37,121,236,224,148,188,138, 44,151,134,178, 79,100,153,183,180,170, 46,168,234,186, 86, 39,116, - 58,157,175,193, 96, 0,183,150,205,226, 53, 26, 13,220,220,220,124,237, 77,164, 72, 36,194, 15, 63,252, 0, 46,151, 11, 46,151, -139,146,146, 18, 4, 7, 7, 91,207,121, 60,158,245,115,139, 22, 45,234,229, 99, 24,166, 15, 69, 81, 80,171,213, 96, 24,198,122, - 40,149, 74,176, 44, 11,129, 64, 0,134,169,220,206,201,230,122,159,218,248, 8,130,152, 20, 20, 20,132,125,251,246, 65,175,215, - 63,113, 93, 38,147, 33, 49,241,143, 77, 70, 40,138, 66,223,190,125, 73,130, 32, 38, 1, 88, 84, 7, 47, 11, 0,145,145,145,160, - 40, 10, 20, 69,129, 36, 73,235,103,203,193, 48, 12,150, 47, 95,142,106, 91,147, 61, 53,206,231, 13,245, 68,134,207, 67, 45, 62, - 90,100, 19,167,203,118,137,103,144, 88, 34,251,226,221,127,252, 83,122,226,210, 29,100,102,101, 62, 33,178, 0,224,183, 95,118, - 34, 47, 55, 7, 9,169,217,152,250,183, 5, 82,153,204,227,139,106, 13,106,173,203, 70,221,221,120, 95,126, 56,121,160, 80,109, -204, 69,153, 39, 64,181,225,131, 43,214, 96,201,184,110, 2,153, 27,111,173, 61,233, 20,240,249,191,172, 62,119,206, 42,178,194, -117, 58, 8, 24, 6, 52,195, 88, 69,150,158,166,161,213,235, 17,168, 86, 35, 99,214, 44,176, 70, 35, 62, 62,124, 88, 44,224,243, -127,177, 39,157, 0,192,227,241, 2,143, 30, 61,218,162,107,215,174, 23, 97,127, 48,211,115, 77,252,142,234, 66,207,238,221,187, -199,238,222,189,187, 5,143,199, 11,116, 6,167, 80, 40,156, 32,145, 72,138,132, 66,225,132, 6,166,147, 4,176, 98,246,236,217, -241, 47,189,244,210, 5,179,176,178,138,154,151, 94,122,233,220,236,217,179,111, 1, 88, 94, 75, 89,175,137,179, 89, 80, 80,208, -202,205,155, 55,139,211,211,211,145,147,147, 3,163,209,136, 55,223,124, 19, 12,195, 64,171,213, 66,175,215, 99,205,154, 53, 18, -111,111,239,101,168,220, 40,216,158,103,231,185,187,187,167,239,218,181,107,226,195,135, 15,165, 23, 46, 92, 32, 18, 19, 19, 37, -235,214,173, 27,239,237,237,157, 6, 64,208,128,252, 36, 3, 3, 3,191, 59,114,228,200,187,137,137,137,193,135, 14, 29,226, 94, -187,118, 45,112,235,214,173,115, 2, 3, 3,119, 3,160, 26,248,142,122,136,197,226, 17,139, 23, 47, 54, 93,185,114, 37,231,202, -149, 43, 57, 27, 54,108,192,160, 65,131,194,163,162,162,194, 26,200,217,211,205,205,109,248,226,197,139, 77,113,113,113,185,215, -175, 95,207, 94,183,110, 29, 57,124,248,240,129, 43, 87,174,236,230, 32,231, 79, 87,174, 92, 25,146,149,149,213, 58, 59, 59,187, - 85,118,118,118, 72,118,118,118, 72, 78, 78, 78,203,188,188,188, 22,249,249,249,205, 11, 11, 11,155,199,198,198, 14, 4,176,215, - 30,206, 80,127,201,187,139,222,140, 40, 95,246,183, 49,236, 71,211, 95,102,151,188, 57,132,125,101,112,215,159, 41, 14,135,184, -158,156,137, 96,119, 96,231,252,222, 45,155,251, 72, 18, 59,123, 73,219, 63,103,117,243,121,227,228, 88,132,148, 66,161,192,137, - 19, 39, 96,182, 94,245,176, 21, 89,165,165,165,200,203,203,179, 92,227,216,147, 78,153, 76,118,126,251,246,237,108, 69, 69, 5, - 84, 42, 21, 10, 11, 11,145,149,149,133,140,140, 12, 20, 23, 23,227,238,221,187, 16,139,197,231,237, 73, 39, 65, 16, 96, 24,198, - 42,164,206,158, 61,139,217,179,103, 67,161, 80, 88,255,199,225,112,172,159, 45,223,169,143,211, 98,121, 98, 24, 6,215,175, 95, -199,220,185,115,177, 97,195, 6,236,221,187, 23,199,143, 31,135, 66,161,176,138, 45,154,166,235,229,148,203,229, 48,153,236, 27, - 51,177, 44, 11,149, 74,101,247,123,183, 21, 64, 28, 14,231, 9, 81,100, 57, 28, 41, 75,141,228,124,110, 97, 71,100,248,218, 71, -216,150, 15,102, 83,221,208,166, 74, 36,201,225, 77,157, 52,243, 61,239,236,194, 82,228, 20,168, 64,145,127,244,123, 97, 17, 51, -193,161, 72,220, 56, 83,105,184, 34, 41, 10, 42,141, 14, 74,181, 1, 19,103, 46,244,250,207,134,127, 77,165, 13, 21,117,198,120, -233, 2,180,235, 44,149,190,222,169, 83, 11, 50, 69,144,138,176, 87, 46,131, 49, 1,108,220,171,232, 81,226, 71,117,248,133,255, -186,166,204,176, 50, 17, 72,175,211,154,225,225, 33,242,236,214, 13, 81, 65, 65, 24,108, 52,130,199,178,120,185,160, 0,191, 47, - 92, 8,221,193,131, 32, 1,240, 38, 76,192,176,141, 27,113, 41, 40, 8, 1, 90, 45,148,239,191, 15,223,211,167,193,147,201, 68, - 40,178,111,241, 3, 65, 16, 24, 58,116, 40,206,157, 59,231, 61,122,244,232, 51,119,238,220,121,131,166,233, 75, 13,201, 91,119, -119,247,223, 56, 28, 78,112,125,247,209, 52,157,173, 82,169, 28,222,102,132,195,225, 12,238,219,183,239,225, 67,135, 14,121, 26, - 12, 6,167,140, 66,248,124,254,232,241,227,199,111,255,246,219,111,101,115,230,204,217,126,252,248,241,114,189, 94,127,218,145, - 34, 5, 96,197,182,109,219,222,137,140,140,244,152, 51,103, 14,155,145,145, 97,107,189,242, 29, 52,104,208, 75,219,183,111, 15, -232,221,187,247,123,115,231,206,229, 1,248,184, 62, 43,143, 84, 42,157,183,125,251,118, 31,185, 92, 14,181, 90,109,109,100,179, -179,179, 33, 18,137, 64,146, 36, 72,146, 4,151,203,197, 23, 95,124,225, 61,111,222,188,133, 10,133, 98,161, 29, 86,178,232, 45, - 91,182,248,142, 28, 57,146,124,248,240, 33, 72,146,132, 80, 40,196, 91,111,189, 69,106,181, 90,207,168,168,168, 24,141, 70, 51, -197,145, 60,228,114,185, 83,163,163,163,219,135,135,135,115, 82, 83, 83,209,191,127,127,220,184,113, 3, 19, 38, 76,224,150,149, -149,181, 90,178,100,201,108,157, 78,231,104, 28,151, 64,177, 88,220,229,191,255,253,111, 86,243,230,205,173, 13, 75,171, 86,173, -152,177, 99,199, 42, 82, 83, 83, 67,175, 92,185, 82, 60, 96,192, 0, 71, 54, 44,111, 38, 22,139, 59,156, 60,121, 50, 47, 42, 42, -106,196,182,109,219,198, 3, 64,159, 62,125,142,126,254,249,231, 23, 20, 10, 69,231, 75,151, 46, 41, 6, 15, 30,156,109, 39, 95, - 80, 96, 96, 32, 51,127,254,124,105, 93, 55,237,216,177, 67,137,202, 13,151, 91, 3,168,115,191,182,208,144,128,101,107, 23, 78, - 18,129, 49,128, 53,106, 1, 67, 57, 96, 80,195,164, 47, 7,193, 19, 1, 70, 45,124, 5, 10,252, 52, 47, 84,182,116,223,253, 20, -230, 46, 49, 54, 85, 94,118, 26, 46,212,216,212, 0, 8, 35, 8, 34,225,196,137, 19,232,219,183, 47, 78,156, 56,129,177, 99,199, - 38,216,138,129,196,196, 68, 12, 30, 60, 24,102,139,150, 93,190, 90, 42,149,234,195,229,203,151,199, 77,157, 58, 85, 92,165, 49, - 32, 73,120,120,120, 96,204,152, 49, 21, 26,141,230, 67,123, 19,202, 48, 12, 56, 28, 14,178,179,179,177, 99,199, 14,172, 90,181, - 10,237,218,181,131,209,104,124, 66,108,153,219, 61,187, 26, 63,154,166,113,243,230, 77,236,217,189, 27, 31, 47, 91, 6, 55, 55, - 55, 0,128,193, 96,128,162,164, 4, 66,161,208, 42,198,234, 17, 78,251,239,221,187,183, 48, 56, 56,184,202,148,161,229,175,185, -205,130,201,100, 2, 77,211,168,168,168,192,134, 13, 27,104,150,101,247,215,215,255, 88, 68,209,194,133, 11,161,211,253, 97, 80, -239,102,246, 73, 14, 9, 9, 65,247,238,221,173,231, 36, 73,178,246,114,254,103, 64, 23,104,109,238, 14, 93,190, 14, 0, 16, 28, - 28,140,208,208, 80, 4, 6, 6,214,202,217,212, 90,164, 33,112, 32, 50,124,237, 66,235,105,236,148,205,229, 9,135,181,105,219, -158,200,204, 83,128,195,225, 64,226,238,131, 1,175, 45, 2, 69,145,144,122,248,128, 96,180,127, 40, 98,146, 2,135,226, 64, 81, -166, 69, 72,235,182,164, 64, 40, 26,166,169, 71,104,201,220,185, 91, 22, 79, 25, 32, 44,166,179, 33,106, 33, 4, 99,233, 78,131, -248, 32,189,203,240,193,232,118,162,200,163,119,182, 64,101, 28,110, 79,122, 41,154,134, 31, 69,193,192,178,248,125,225, 66,132, - 69, 71, 35,193, 34, 12,163,163,145, 16, 25, 9, 47, 46, 23, 2,146, 4,107, 52, 62, 49,167,111,143,208, 2,128,172,172, 44, 28, - 60,120,208,107,210,164, 73,135, 19, 19, 19,167, 58, 40, 54, 44, 92, 62,215,175, 95,247,107,221,186,117,173,247, 60,120,240, 0, -189,122,245,114,120,122,138,207,231,143, 30, 62,124,248,190,131, 7, 15,186, 39, 39, 39,195,207,207,175,209, 66, 75, 32, 16, 12, -142,136,136,216,183,107,215, 46, 89, 81, 81, 17,162,163,163,101,175,190,250,234,222,248,248,248,215,116, 58,157, 61, 98,179,138, -200,138,142,142, 86,238,216,177,227, 63,168, 58, 69,152,183, 99,199,142,239,122,247,238,253,110,100,100,164, 7,128,119,204,190, - 3,117,138, 45,129, 64, 48,180, 77,155, 54, 85, 70,181, 2, 65,165,177, 73, 34,145,192,221,221, 29, 60, 30, 15, 58,157, 14, 97, - 97, 97, 4,159,207, 31,104,207, 51,187,185,185, 69,188,254,250,235,228,229,203,151,145,159,159, 15, 15, 15, 15, 72,165, 82, 48, - 12,131, 57,115,230, 80, 27, 54,108, 24,170,209, 56, 54,195,213,188,121,243,241, 35, 70,140,224, 36, 37, 37,225,225,195,135,208, -233,116, 72, 75, 75,131, 76, 38,195,244,233,211,121,107,215,174,125, 53, 39, 39,199, 81,161,213, 37, 50, 50,178,192, 86,100, 89, - 32,145, 72,136,246,237,219, 43,188,189,189,123, 2,112, 68,104,117, 89,176, 96, 65,225,234,213,171, 7,159, 59,119,206, 26,244, -242,220,185,115, 75, 0,224,171,175,190,138,243,245,245,237, 9,192, 94,161, 5,150,101, 77,127,253,235, 95, 31,243,249,124,112, -185, 92,240,249,252, 42, 7,143,199, 3, 73,146,110,150,234, 92, 31, 95,202,195,252, 53,115,150,172, 91, 39, 17, 82,220,127,188, -214, 21, 45, 60,120,128,200, 11,188,193, 75, 65,120, 84, 26, 45, 89,197, 3,224,151,165, 88,255,186,130,140,252,190,226,103, 3, -227,233,123,191,164,164,236, 25,247, 1,189, 1,252, 27,149,155,235, 46, 3,112,253, 57,233,155,110, 1, 8, 27, 59,118,172, 85, -108,157, 58,117, 10,163, 71,143,134, 82,169, 68, 82, 82,146,173,200,114,100,131,229, 91, 70,163,241,246, 15, 63,252, 48, 96,210, -164, 73,132, 77,253, 66,114,114, 50,238,222,189,155, 96, 47, 31, 73,146, 48,153, 76,224,114,185, 88,183,110, 29, 12, 6, 3,190, -255,254,123, 28, 56,112, 0, 36, 73,130, 32, 8, 16, 4, 1,153, 76,134,175,191,254,218,161,118,143, 97, 24,196,196,196, 96,233, -146, 37, 86,145,101,158,201, 64,128,191, 63,188,125,124,112,255,254,253,122,133, 86, 73, 73,201,167,199,142, 29, 67, 93,206,240, -199,142, 29,179,126,174,230, 12, 95,127, 63, 71, 81,208,233,116,120,249,229, 63,182,138, 93,176, 96,129,245,179, 66,161, 0, 69, - 81,150,188, 32,236,229,212,178,192,107,194, 63,254, 55,230,131, 15,170, 88,232,106,227,124, 26, 90,196, 89,214,173, 26,196, 86, -152,217, 58, 27, 8, 96, 44, 42,125,180,242,128,167,232,163,197,178,166, 14,193,205,130,112, 59, 35, 17, 28,138, 2,223,221, 7, -238, 94,254, 48,209,122,168, 10, 31,226,226,161,111, 0, 0,219, 98,246,131, 36, 73,112, 56, 20,116,122, 6,237, 90, 4,193,100, - 50,117,168,139,187, 35, 48, 96,168,191, 79,223,230, 45, 61,136, 36,207,135,104,239,231, 93,109, 34, 68,128,118,185, 82,162,191, - 84,212,167, 68, 85, 58, 32, 5,184, 82,175, 24, 32, 73,144, 4, 1, 49,143, 7,221,193,131,149, 94,155,209,149,125, 86, 66,100, - 36,200,159,127,134,155, 64, 0,138, 32,192, 49,155,160, 27,130,210,210, 82, 16, 4,129, 61,123,246,120, 78,159, 62,125,111, 82, - 82, 82,100, 69, 69,197, 65, 71, 56,148, 74,229,216,240,240,240, 11, 49, 49, 49,190, 1, 1, 1, 79, 92,207,207,207,199,204,153, - 51,139,148, 74,165, 67, 65,221,132, 66,225,132,241,227,199,111,223,185,115,167,236,222,189,123, 80,171,213,240,245,245,109,108, - 81,232,217,175, 95,191,195, 7, 15, 30,116,207,207,207,135, 74,165,130, 78,167,195,158, 61,123, 60,198,140, 25,115, 48, 53, 53, -117, 52,128,248,122, 56, 62,177, 21, 89,115,231,206,189, 3,192, 15,192,150,234, 26,212,124,173,171,141,216, 82, 1, 88, 91,199, - 72,180,165, 68, 34, 65, 97, 97, 33,102,206,156,137,244,244, 63, 12,160, 65, 65, 65,214,145,222,253,251,247,225,235,235, 11,130, - 32,252,236,121,104, 95, 95, 95,169, 94,175,199,236,217,179,145,149,149, 85,133, 51, 59, 59, 27, 4, 65,136, 29,205, 72,127,127, -127,127,173, 86,139, 65,131, 6,161,162,162,114, 95,223,201,147, 39,131,203,229,162,176,176, 16, 92, 46,215,167, 1,239,199,103, -236,216,177,181,134, 86,145,201,100, 6, 79, 79,207,142, 14,114,122,191,250,234,171, 57,209,209,209, 79, 44,108,185,113,227,198, - 95,188,188,188,206,121,121,121,181,119,144,211,100, 43,170,120, 60, 94, 21,161,197,229,114, 65,146,164,221, 62,106,233,133,154, -205, 28, 34,175,251,234,249, 35,103,182,240,115, 7,171, 46, 0,111,248,167,184, 93, 36,194,186, 13, 39, 1, 0,255,124,171, 23, -186, 69,172,128,126,231, 72, 44,236, 79,241,167,101,235, 22, 3,248,228, 25,183,249, 95, 2,176,172,130,251, 22, 64,247,231,168, - 63,178,138,173, 83,167, 78,161,115,231,206, 40, 41, 41, 65,106,106,106, 67, 69,150,165,189, 91,250,217,103,159,253,242,198, 27, -111, 72, 44,131, 86,145, 72,132,247,223,127, 95,171, 86,171,151, 58, 84,136, 76, 38,112, 56, 28,235, 32, 89, 40, 20, 34, 44, 44, -204, 42,178, 8,130, 64,121,121, 57, 56, 28,142,101, 69, 34, 97,103, 26, 17, 24, 16, 0, 55, 55, 55,180,109,215, 14,247,204,237, -136,229,179, 64, 32, 0, 65, 16,160,233,122, 13,121,101,102,167,246, 69,206,238,146, 45,162,168, 78,211,113, 80, 16, 76, 38,147, - 69,100,178,206,224,244,241,241,129, 90,173,182,151,243,185, 68, 45, 22, 45,139,208, 26,139, 74, 95,173, 39,194, 59, 12, 1,112, - 17, 77,184,164,146, 0, 75,152, 88, 22, 28,138, 52,207,221, 82,160, 40, 18,138,162, 60,108,252,244, 29,179,200, 58,128, 19,113, -169, 8,110,211,249,143,121, 92,130, 0,216,186, 11,183,175, 59, 47,122,222, 27,253, 68, 5, 68, 30, 60,130,196, 16, 10,171,233, - 71, 79, 30,136, 16, 18,243,135, 6,139,111, 30,171,136, 78, 81, 25,234,237, 40,132, 36, 89,233,252, 78, 16, 53, 58,247,144,230, -107, 20, 65,128,101, 89,176, 38,199,252,142, 45, 66, 94, 36, 18,193, 96, 48,128,162, 40,108,218,180,201, 35, 34, 34, 98,139,163, - 66, 11, 64,114, 65, 65,193,152, 57,115,230,156,218,191,127,191,143,143,143, 79,149,209,195,156, 57,115,228, 5, 5, 5, 99,224, -160,211, 61,151,203,221,242,237,183,223,202, 30, 61,122,132,242,242,114,136, 68, 34,107,227,211,208,242,217,167, 79,159, 51,167, - 79,159,246, 84,169, 84, 48, 24, 12, 16,137, 68, 96, 89, 22, 20, 69,225,199, 31,127,244, 30, 55,110,220,201,204,204,204,225,117, -165, 85, 36, 18,189,102, 22, 78,136,140,140,244,136,140,140, 28, 2,212, 26,169,215,138,200,200, 72,143, 69,139, 22,189,170,213, -106,215,214,241,204, 89, 10,133, 34, 64, 36, 18,225,208,161, 67,144, 74,165, 16,139,197, 8, 10, 10,130, 66,161,128, 88, 44, 6, -203,178, 48, 26,141,150,198,162,216,158, 7, 47, 42, 42, 82,211, 52,237,126,234,212, 41, 20, 23,255,241,149, 22, 45, 90, 64,169, - 84,194,100, 50,149, 59,154,153,185,185,185, 5, 4, 65, 52,191,125,251, 54, 30, 61,122,132,209,163, 71,227,231,159,127, 70,175, - 94,149,179,195,122,189,190, 33, 65,252, 24,138,162,216, 58,202, 45, 1,192,211,153,156,230,206,203, 33, 78,147,201,100,178,136, - 44,219,191,182,226,171,158,223,172, 82,157, 59,250, 75,119,172,158, 55, 98,230,200,206, 62,208, 22, 61,132,208,205, 7,132, 71, - 8,214,109, 56,137,164, 7,149,239,107,221,222,223,176, 47,106, 12, 32,242, 66,168,187, 28, 1,110,156,215,239, 22, 62,115,161, -229,110, 59, 78,120, 94, 59,166,209,163, 71, 67,161, 80, 64, 42,149, 58,195, 63,231,170, 86,171, 77, 59,114,228, 72,207,177, 99, -199,130,207,231, 35, 45, 45, 13,241,241,241,169, 0,174, 58, 42,180,184, 92, 46, 62,251,236, 51,188,243,206, 59,240,247,247,199, -210,165, 75,193,225,112,172, 7, 65, 16, 86, 11,151, 35,240,243,175,123,225,163,197, 33,190, 62, 99,184,187,187,251,103, 36, 73, - 78,162,236,200, 56,134, 97, 24,147,201,180, 95,165, 82,213, 25,222,193,226,184,110,207,187,176,205,131,122,250,180, 70,115, 62, - 13, 45,210, 16, 84, 95,109, 88,139, 69,203,178,234,240,137,173,128, 44, 79,121,209,108,178,187,216, 84, 9, 37, 72,234,110,118, - 78, 46,188, 61,165,102,145,101, 62, 72, 18,221, 58, 87, 14,102, 79,196,165, 34,184,117,103,112, 40, 10, 28,138,130, 84, 36, 64, - 65,126, 30, 56, 28,242,110,109,188, 93, 40,188,241, 70,251,230, 33,158,222, 92,200,125,245, 8,244,175,197, 48,208,211, 13,193, -129,124,140,242, 22,182,236, 66,225,141,186,173,111,172, 85,104, 25,104, 26,188, 9, 19,172,211,133, 9,145,145, 8,139,142, 6, - 51,126, 60, 52, 6, 67, 21, 83,113, 67,133,150, 72, 36, 66, 89, 89, 25,166, 78,157,170, 48, 26,141,239, 54, 48,139,227,139,139, -139, 39, 78,155, 54,173,216, 34, 96, 12, 6, 3,166, 77,155, 86, 92, 92, 92, 60,209, 14, 43,209, 19, 48, 26,141,239,246,234,213, - 75, 33,151,203,173,233,108, 72,131, 99,129,151,151,215,137, 29, 59,118,120,233,116, 58,208, 52,109,229, 20,137, 68,160, 40, 10, -190,190,190,216,183,111,159,175,151,151, 87,157,123, 86,105,181,218, 35,209,209,209, 74, 0,136,142,142, 86, 18, 4, 17, 75, 16, -196, 86,130, 32,190,173,118,108, 37, 8, 34,214,246, 94,173, 86,123,184, 46,110,189, 94, 31,155,154,154,202,138,197, 98, 80, 20, - 5,131,193, 0,161, 80,104, 53,137,151,150,150, 66,171,173,156,230,142,143,143,135,209,104,188,108,207,179,151,149,149,157,143, -137,137, 49,181,104,209, 2,157, 59,119, 70, 88, 88, 24,250,245,235,135,150, 45, 91,226,243,207, 63,103, 52, 26,141,195,117, 47, - 55, 55,247,196, 79, 63,253,100,108,222,188, 57,122,246,236, 9,129, 64,128,110,221,186, 33, 40, 40, 8,171, 86,173,210,171, 84, -170, 83, 13,120, 77,153,137,137,137, 84, 29, 34, 87, 6, 59, 86,239, 86, 67,214,205,155, 55,169,126,253,250, 29,173,126,161, 79, -159, 62, 71,165, 82,169,187,197,196,238,200,136,220, 86, 92, 9, 4, 2,235, 97,249, 63,135,195,177,103,244, 67,118,244,151,238, -248,226,157, 97, 51, 71,118,246,196,209,243,215,193, 51, 40, 1,125, 29, 51,130,140, 17, 4, 79, 2,127,119,110,240,115,208, 7, - 44, 4,112, 7,149,113,152,150,226,249,130,213,241,189,184,184, 24,169,169,169,136,143,143, 71,191,126,253,112,249,242,101,224, - 15, 7,121,135,161, 82,169,150, 70, 69, 69,105, 44, 43,249,150, 45, 91,166, 45, 43, 43, 91,234,104, 27,204,178, 44,184, 92, 46, - 66, 67, 67,177,104,209, 34,156, 60,121, 18,105,105,105, 48, 26,141, 86, 33,100,241,201,116,196,162,197,227,241,224,239,239, 15, -163,209,104,181,102, 1,192,189,244,116,112, 56, 28,152, 76, 38,232,245,250,122, 45, 90,238,238,238,159,109,223,190,253, 61,185, - 92, 30, 88, 84, 84,228,103,123, 20, 20, 20,248,229,229,229,249,229,228,228,248,101,101,101,249, 61,126,252,216,239,225,195,135, -129,107,214,172,121,207,221,221,253, 51,123,210, 73, 81, 20,186,117,235,134, 5, 11, 22, 88,143,205,155, 55, 91,143,139, 23, 47, - 58,236,188, 78, 81, 20, 66,151,175,195,152, 34,214,122,156,244, 37,172, 71,210, 63,231,214,197,217,228, 90,164, 65,250,197,188, -218,208,118, 99,233, 26, 96, 89,117,104,105,203,172,110, 27,213,157,225,155, 12,180,190,226,194,131,140,244, 97,161, 93,122,147, -249,114,117,149,229,159, 97, 67, 39,130, 32, 8, 52,107,221, 25, 20,135, 3,138, 34,193,161, 40,120,200,132, 72,189,125,219,164, -211,106, 47,212,196, 57, 4,224,240, 69,252,205,111,141,234, 38,204,229, 23,194, 55, 80, 2, 30,183, 82, 59,178, 15, 38, 86,235, - 33, 56, 64, 23, 55,204,202,241, 22, 93, 40,168,216,236,169, 49, 28,141,173,101, 4,104, 50,153, 32, 21, 8, 80,161,211, 65, 75, -211, 24,186,113,163,117,186,144, 36, 8,220, 2,208,117,227, 70, 92, 57,120, 16, 50, 62, 31, 16, 8,236, 94, 21, 82,147,208,146, -203,229,152, 49, 99, 70,113, 94, 94,222,244,134,248,104, 89,160,211,233, 46,229,231,231, 79,159, 56,113,226,158, 67,135, 14,121, - 77,156, 56, 81,145,159,159, 63,221, 78,191,167, 39, 80, 81, 81,113, 48, 43, 43,171,124,198,140, 25,187,247,238,221,235,237,227, -227, 99, 29,137, 52,168,176, 18,132,124,196,136, 17, 2,123,238,171,231,150, 40,179,115,251, 59,102,203, 86,215,185,115,231, 94, - 65,165,255,149, 45,150,111,219,182,109,178,205, 20,227, 86, 0, 27,235, 34, 46, 45, 45,253,118,209,162, 69,127,187,116,233,146, -143, 80, 40, 4, 65, 16,224,241,120,104,219,182,173,117, 21, 13,151,203, 5,203,178,248,224,131, 15,228,133,133,133, 95,217,249, -110,230, 70, 69, 69, 13,174,168,168,240,156, 49, 99, 6, 37, 20, 10, 81, 80, 80,128, 13, 27, 54, 48, 59,119,238, 84,106, 52,154, -153, 13, 16,194, 49,255,250,215,191,134,170,213,234,214,115,230,204,225,169, 84, 42,104,181, 90, 44, 94,188, 88,255,221,119,223, -101,107,181, 90,135, 3,254,246,239,223, 63,227,241,227,199, 3,203,203,203, 75,196, 98,113,117,107, 31, 33,145, 72,122, 3,216, -237, 8,103, 88, 88,216,253,204,204,204,126, 43, 86,172,136, 53, 26,141,220, 27, 55,110, 88,157,225, 55,109,218,116, 81, 40, 20, -142,128,131,155,175, 18, 4, 97, 18, 8, 4, 85, 44, 88,213, 63,115, 56,156,122,219,180, 14, 1,226, 21, 95,188, 61,120,230,203, - 29,221,113,228,252,111,136, 58,252,224,110,187,153,190,161, 47,121, 22,193, 84,148,138,127,190,213, 11,235,246,254, 6,160,114, -234,208, 84,152, 4,182,228, 62, 88,183,230,120,168,144,231, 62, 7,125,192, 69, 84,134,204,120,222, 80, 69,100, 37, 37, 37, 97, -216,176, 97, 0,128,203,151, 47, 35, 60, 60, 28,151, 47, 95,198,192,129, 3, 29,142,165,101,198,127, 75, 75, 75, 31, 95,188,120, -177, 83,243,230,205,113,245,234,213,135, 0,254,235,104, 34, 45, 66,139,195,225,224,205, 55,223, 68, 68, 68, 4, 90,180,104, 81, -101,181,161,229,179, 35, 98,131,166,105,116,233,210, 5, 58,189, 30, 60, 30,207, 58, 53,201,225,112,224,235,231,135,140,140, 12, -187, 44, 90, 36, 73, 78,122,237,181,215,200,228,228,100, 76,153, 50, 5,123,246,236,169,245,222,105,211,166,225,135, 31,126,192, -107,175,189, 70,126,244,209, 71,117,134,119,176, 56,161,219,243, 76,150,126,186,190,118,223, 89,156, 77,173, 69, 26, 3,155,208, - 14, 53, 78,154,212,240,191,232, 42, 66,203, 38, 72, 88,211, 8, 45,218,176,231,231,239,191, 89,212,111,203, 64,223, 64, 63,119, - 40, 84, 90,171,216, 74,184,120, 0, 0,240,198,220,149,224, 80,149, 83,138, 50,169, 16, 34, 30,133,131,187,190,146, 27, 12, 21, - 53,150,174, 50, 46,249,206, 71, 3,218,186,243, 37, 70,148, 6,176,232,236,251,199, 78, 57, 68,235, 3, 79, 10,174, 30,158,240, - 73, 42,193, 91, 47, 73,101, 95, 37, 43,223,129,209,180,249,137, 14, 81,169,212, 42,111,223, 22,141,222,190, 29, 55,166, 79, 71, - 51,134, 65,108, 80, 16,188,184, 92,184, 11, 4, 32, 9, 2,218,227,199,113,229,208, 33,248, 11, 4,128,155, 27,232,207, 63,135, - 46, 53, 21,198,178, 50,109, 3, 70,102,152, 60,121,178, 92, 46,151, 79,212,235,245,151, 26,155,207, 90,173,246,116, 86, 86, 40, -104, 68,151, 0, 0, 9, 69, 73, 68, 65, 84,214, 59,253,251,247,223, 98, 52, 26,223,213,106,181,141, 90, 25,165,215,235, 79,231, -231,231, 79,152, 60,121,242,129,195,135, 15,251,120,120,120, 52,152,171,184,184,184,151,147,138,147, 9,192,199,102,231,246,119, - 34, 35, 35, 61,110,222,188,249,183, 29, 59,118,108,177, 25, 77,248,205,158, 61,251,237,106, 34,171,222, 85,135, 0, 50, 11, 11, - 11, 63,127,255,253,247, 87,174, 95,191, 94,106,113,124,255,253,247,223, 65,211, 52,184, 92, 46, 24,134,193,236,217,179,213,197, -197,197,235, 80,123, 68,231, 39,138, 86,105,105,105,219, 21, 43, 86,236,216,184,113, 99, 4, 69, 81, 18,134, 97, 52,229,229,229, -177, 21, 21, 21, 51,209,176, 56, 90,166,162,162,162, 25,159,124,242,201,140, 13, 27, 54,188, 70,146,164, 31, 77,211,242,178,178, -178, 99, 90,173,246, 59, 52, 96, 42,233,234,213,171, 69,111,189,245,214,131,162,162,162, 14,193,193,193, 42,169, 84,170,215,235, -245,148, 72, 36,146, 73, 36,146, 48, 0, 87, 9,130, 72,113,132, 51, 33, 33, 33,127,206,156, 57,143,116, 58, 93,232,214,173, 91, -227,100, 50,217,121,130, 32, 8, 30,143,231, 41, 18,137,134, 1,136, 37, 8,226,158, 35,156, 36, 73,154,108,173, 87,213,253,179, -248,124,190, 93, 62, 90,173,125,197,179, 34,218,114,112,228,194,111,136, 58,146, 25,195,176,236,161, 67, 9, 37,199,151,134, 3, -134,253,111,161,219,196,221,149,211,133, 0, 76,133, 73, 48,236,159, 6, 66,236,131,184, 28, 46, 84, 90,195, 9,184, 80, 19,172, -225, 29,228,114, 57,146,147,147, 45, 34, 43, 12, 0, 6, 14, 28,152, 96, 17, 91,241,241,241,232,217,179,103, 2, 0,174,163,229, -181,180,180,244,253,169, 83,167,158, 54, 15,142,223,111,192,192,207, 42,180, 44,130,170, 69,139, 22,214,115,219,195,198, 71,203, - 46, 48, 12, 3, 30,143, 7, 14,135,131,192,160, 32,235,111,177, 44,139,140,140, 12, 40, 20, 10,187,132, 22, 69, 81, 20, 65, 16, -152, 50,197,190, 5,201,127,253,235, 95, 17, 27, 27, 11,202, 78, 85, 72, 81, 20, 66, 66, 66,234,189,199,162, 75,237,229, 12, 14, - 14,110, 48,103, 83,107,145,134, 10,172,154, 62,215, 36,170,106,171, 16, 79, 11,185,106,181,234,227, 93,219, 55,173,159, 61,239, - 3,105,210,253, 2,168,212, 58, 80, 20,105,219,120,130,195,161, 32,147, 8,209, 60,192, 29,123,255,243,239,178,178, 82,229, 39, -168,101,223,195, 22,110,188,185, 35,122,191, 36,224, 5,106, 16,218,117, 50, 40,225, 31, 34,128,205,175,101,118, 48,252, 23,188, -146,169, 17,254,156,169,153,123,171, 68,255,164,208,210,235, 71, 46, 27, 53,234, 76,212,201,147,226, 62, 49, 49,184, 63,123, 54, -130,180, 90, 8,204, 83,137, 36, 65, 64,202,227, 65,202,227, 85,138,172, 13, 27,160,165,105,108,156, 62,189, 92,167,215,143,114, -164,146, 23, 23, 23, 99,252,248,241, 69,185,185,185, 99,208,128,169,189,218,160,209,104, 14, 2, 56,232, 44, 62,157, 78,119, 41, - 59, 59,251,149,241,227,199,159, 60,125,250,180,239,115, 18,100,206, 34,182, 12, 55,111,222,124, 59, 46, 46,238, 62,170,110, 44, -170,140,139,139,187, 63,103,206, 28, 98,199,142, 29,223, 1,248, 23,236, 12,224,169,209,104, 54,157, 61,123, 22,131, 7, 15,254, -215,234,213,171,189,123,245,234, 5, 63, 63, 63,148,149,149, 33, 62, 62, 30, 11, 23, 46, 84,148,150,150,174, 86, 42,149,235, 29, - 76,179, 65,167,211, 77,179, 93, 74,237,140,124,208,233,116, 59,243,242,242,118, 58,139,112,254,252,249,191,103,100,100, 20,251, -250,250,246,229,241,120, 93, 81,233, 7,148, 15,224, 59, 71, 5,145, 5,243,230,205,187,157,145,145, 33,111,214,172, 89, 63, 51, -167, 7, 42,183, 49,218,222, 0,206,220,223,126,251, 45,184,119,239,222, 36,151,203,101, 41,138, 2,151,203,101, 57, 28, 14,107, -246,171, 97, 1,224,216,177, 99, 2, 0,117,110,155,115,191, 80,187, 98,218,191,127,253, 40, 37,191,226, 80,106, 65,249, 34, 0, -236,254, 36,241, 47,221,124,169,145, 35,219,103, 67, 23, 61, 16,132,172, 50, 80, 37,171,206, 3, 33,241, 71,182,169, 25,150, 31, -189,155, 79,131, 88,235,210, 84, 53,143,171, 97, 14,239,144,151,151,103, 43,178, 44, 86,171,176,129, 3, 7, 38,152, 69,150,229, - 90, 67,252,203,206,153, 76,166, 70,245, 97, 44,203, 34, 42, 42, 10,219,182,109, 67,125, 17,205,205,171,251,136,250,248, 44, 22, - 45,134, 97, 96, 48, 24,144,148,148,100,141,217,101,153, 46,180,132,118,160,105,186,206,213,234, 12,195, 48,122,189, 30, 63,254, -248,163, 93, 98,107,223,190,125,168,168,168, 0, 83,143,130,179, 13,197,208,189,123,119, 40, 20, 10,235, 98,159,176,176, 63, 66, -229, 25, 12, 6,135,132,171,133, 51, 52, 52, 20,114,185, 28, 22,127,225,230,211,255, 48,246,208, 26,205,159,181,220,215,106,209, -122,234, 61,166, 64, 44, 59,221,107, 64, 68,248,244,183, 23, 74,212, 58, 6,143, 30, 61, 70, 81, 97, 30, 72,130, 68, 96,179, 96, -180,108, 25, 2, 17,159,196,158,232,245,154,132, 43,231,127, 85,151,149,140,174,141,107,172, 59,239,202,134, 9,225,253,218,180, -113, 35, 64, 27, 1,198, 8,208, 70,192,100,254,107,249,159,169,106,153, 75, 78, 86,178, 31,221, 82, 92, 59,161, 50,212,184,103, -213, 68, 32,220,195,203,235,204,242, 99,199,196, 38,131, 1,197,239,191, 15, 49, 77, 67,104, 30,149, 84, 62,136, 0,244,231,159, - 87,138,172,105,211,202, 85, 74,165, 67, 91,240,248,248,248,252, 70, 16,132, 79, 81, 81,209, 11, 21, 25,222,215,215,247, 4,203, -178,114,185, 92,222,235, 57, 74,151, 31, 0, 37, 0, 67, 13, 3, 9, 95, 56,238,255, 99, 65,136,175,175,239, 71, 36, 73,246,103, - 89,214,155, 36,201, 18,147,201,116,181,176,176,112, 13,128, 12, 87,127,250,204, 96,137, 12,223,170,158,251, 10, 1,252, 3,149, - 78,193,143,236, 37,239,230,238,238,174,227, 27, 15,255,165,179, 96,232,164, 48,119,180, 14,112, 3,151, 39, 68,110, 41,141,115, - 41,165,216,126, 49, 63, 75,107,100,198,165, 23,149, 39,186, 94, 69,157,112,250, 22, 60,206,132,151,151,215,245, 51,103,206,244, -106,221,186, 53,105,235,240,110,137,149,103,153,222,226,112, 42,181,220,165, 75,151,232, 41, 83,166, 92, 45, 40, 40, 24, 92, 27, -167,155,155,219, 47,119,238,220,121, 89,165, 82, 61, 33,168,108, 35,197, 91,206, 53, 26, 13,230,205,155,119,182,182, 45,120,220, -221,221, 55,172, 95,191,254,189, 55,222,120,131,180,132,163,176, 61, 44,219, 5, 89, 14,131,193,128,221,187,119,155,190,250,234, -171,175, 85, 42, 85,173, 83,135,129,129,129, 89,185,185,185,193,150, 80, 11,246, 4, 21, 13, 9, 9,201,123,252,248,113,208,211, -228,124,129, 5, 87, 21,235,214, 51, 49, 77,112, 69,162,249,110, 82,207, 79,223,152,186,192, 59,164, 77, 59,194, 63,176, 25, 8, -144, 40,200,207,193,227, 7,233,236,225,239,191, 41,214,148, 42, 62,211,106, 53,223,212,197,211, 17,104,211, 74,198,219,207,103, -208, 30, 22, 1, 84,109,127,170, 39, 70, 28, 0, 12, 92,242,238,163, 50,227,228,148, 58,166,125, 44, 98,235,227,195,135,197,252, -246,237,159, 8, 20,103, 50,153,160, 75, 77,197,198,233,211, 29, 22, 89, 46,184,224,130, 83,208, 26,245,199,200, 50,162, 50, 62, -151,163, 22, 19, 34,212, 79, 50,153, 5, 38,145, 48,117, 33, 9,130, 79,179, 72, 3,139, 95,196,156,242, 45, 9,121,208,186,178, -223, 46, 60,183,155, 74, 3,144,120,121,121,157,167, 40,170,165,197, 34, 99,107,173,175, 97, 67,233, 71, 5, 5, 5, 35, 0,212, -181, 66,184,141,155,155,219, 55, 12,195,244,177,103, 83,105,138,162,110,148,149,149,205, 71, 29,155, 74, 55,197,170, 67,111,111, -239,140,199,143, 31,183,177,172,162,182,237, 43,107, 90, 89,126,239,222, 61, 12, 25, 50,228,113,126,126,126,200,211,228,124, 94, - 81,203,170,195,231,199,162,101,131, 32,158, 64, 58,131, 47, 18, 14, 55, 25,233, 80, 16, 0,135,203,189,171,175,208, 94,208,105, -213,187, 80,203,116,225,211,196, 68, 32, 92,192,231,255,194,147,201, 68, 53,137, 54, 99, 89,153, 86,167,215,143,116,137, 44, 23, - 92,112,193, 5, 23, 94, 32,180,247,242,242, 58,195,229,114, 5,182, 98,178,250,103, 11,104,154,174, 40, 42, 42, 26, 13, 32,237, - 41,115,254,111,194, 65, 39,181, 8,123, 57,205,199,144,231,157,179, 9,159,157,117, 34,231, 16, 51,231,242, 23, 36,157, 67,158, - 87, 78,203,243, 58,192, 27,225, 72, 57,114, 86,126,218,164,147,117,118, 58,155,138,211, 89,245,168,134,116,178, 77,240,222,151, -191, 32,233, 28,242,188,113, 86, 47, 63,118,242, 58,196,105,103,153,114, 52,157,172,179,211,217, 84,156,141,173, 71,117,164,147, -109,108, 89,170,229,221, 47,199, 11,136,228, 30, 96,147,123,128, 77,234, 89, 99,220,198,200,218,190,231,144, 35, 97, 83,173, 4, -176,132,221, 55,243, 19,207, 43,167,109, 62, 56,115,171,128, 38,216,118,224,162,179, 57,171,229,167,179,176,220,188,194, 36, 22, -118, 4, 28,117,228,217,157,241,222,171, 61,171, 83,120, 27, 32,178, 28,226,116, 86,185,111,106, 78,103,213,165,234,156,206, 40, -247, 53,189,247, 38,124, 71,206, 74,167, 83,234, 82, 83,148,249, 26,202, 79,163,121,171,115, 58,163, 46, 85,231,116, 70,185,127, - 26,156,206,168, 75, 53,113, 58,163,220,215,246,238, 95, 84, 67,147,101,186,208, 28,226,129,176, 67,108, 69, 3, 0,217,144, 76, -107, 66, 75,217, 80,103,115, 58, 59,205, 77, 33, 54, 29,176,192, 60,115, 78, 39,191,163,229,102, 78,103,142,110,134, 58,235, 29, - 53, 69,121,183,229,116, 22,127,117, 30,103,188,167,154, 56, 27,155,222, 90,210,233,244,103,111,108,185,127, 90,156, 78,126, 71, - 78,169, 75,213, 56,135, 58,121, 48, 48,212,230,124,185, 51, 57,157, 85,151,106, 72,103,163,223, 83, 77,156,141, 77,111, 45,233, -116,250,179, 59,163, 15,105, 42,222,103,105,209, 98,201, 90,203, 68,116,181,227,169, 8,141,103, 54, 37,231, 32,247,159,138,211, -193,233,153,136, 38,120,247,207, 52,157,206,228,172,158, 70,103, 78,247, 52,101, 58,157,201,233, 64, 90,255,116,156, 47,218,123, -127, 30,243,179, 54,190,198, 76, 75,213,102, 29,109,138,116, 58,147,211, 78,238, 63, 5,103, 35,222,253,159, 14,156,231, 37, 33, -150,140,119,242,200, 4, 78,182,192, 52,217,115, 59, 57,157, 67,155,194, 66,216, 4,112,122, 58,205, 35,229, 79,155,224,217, 95, -148, 60,117,213, 37, 87, 93,122,238,234, 82,181, 50, 57,212,137,150, 34,167, 90,158,171,115, 58,227, 55,108, 57,156, 85, 70,155, -250,217,157, 89,151,154,226,221,191,104,248,127,145,193,179,185, 29, 76,112,153, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +int datatoc_blender_icons_png_size = 227018; +char datatoc_blender_icons_png[] = { +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,213, 0, 0, 13,213, 1, 61,214, 88,241, 0, 0, 0, 7,116, 73, 77, + 69, 7,220, 4, 24, 17, 13, 59,208, 68,241,106, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183, +215,239,114,233, 61, 16,146, 64, 32,148,132, 80, 20,144, 94, 5,162,168, 8, 2, 34, 69, 44,136, 40,160, 40,168,136, 72, 87,233, + 42, 32, 42, 77, 65,176, 1, 1, 41,145, 18, 72, 2,132, 38, 61, 65, 18, 72, 35,237, 82,175,183,221,223, 31,201,157,151,203,181, + 64,162, 63,116,223,247,237,119,119,123,187,111,103,103,103,102,223,188,105, 0, 11, 22, 44, 88,176, 96,193,130, 5, 11, 22, 44, + 88,176, 96,193,130, 5, 11, 22,255,106, 36, 38, 38, 50, 13, 56,124,160,187,156,181, 91,159,255,119,206, 38,188,119,166, 17, 57, +251,212,114,126,244,144,132,179,207,255, 43,167,249,126, 27,192, 59,176, 33,233,168,177,226,211, 42,156, 76, 99,135,179,169, 56, + 27, 43, 31,217, 9, 39,211, 4,207,253,163,135, 36,156,125,254,223, 56,109,211,143,155,188, 13,226,116, 51, 77, 53, 52,156, 76, + 99,135,179,169, 56, 31, 52, 31, 57, 9, 39,243,160,105,201,193,179,255, 8,255, 33, 80, 77, 40,178,220, 70, 66, 66, 2, 97,197, + 79,252,191,114, 90,199,131,153,191, 49,195,218,136, 56,222,216,156, 54,241,217, 88,248, 40, 33, 33,129, 72, 76, 76, 60, 1,160, + 79, 99,222,123, 99, 60,119,155,123,109, 20,222,251, 16, 89, 13,226,108,172,116,223,212,156,141,149,151,108, 57, 27, 35,221,219, +123,238, 77,248,140, 26, 43,156,141,146,151,154, 34,205,219, 73, 63, 15,204,107,203,217, 24,121,201,150,179, 49,210,253,223,193, +217, 24,121,201, 30,103, 99,164,123, 71,207,254,191,102, 80,145,255,176, 32,176,205,224,125,255,159, 5, 81, 83,137,205, 6, 56, + 48,255, 56,103, 35, 63,163,143,106, 57, 27,179,118,211,183,177,158, 81, 83,164,119,107,206,198,226,183,229,105,140,231,100,143, +243, 65,195,235, 32,156,141,126,239, 15,154,238,255, 46,206, 70,126, 70,141,146,151,108, 56,251, 54,114,101,160,175,213,239,143, + 26,147,179,177,242,146,157,112, 62,240,115,178,199,249,160,225,117, 16,206, 70,191,247,198,120,135, 52, 21,239,191, 26, 77,213, +124,214,216,156, 13,228,254, 87,113, 54,176,121,102, 96, 19, 60,251,127, 52,156,141,201,105, 27,198,198,108,238,105,202,112, 54, + 38,103, 3,194,250,175,227,124,216,158,251,255, 99,124, 58,226,123,144,102, 41, 71,238,104, 83,132,179, 49, 57,221,228,254, 87, +112, 62,192,179,255,215,129,250,127, 9,136, 57,226, 27,185,102,130, 70,118, 96,154, 82,184, 54,102, 56,251, 54,133, 67,216, 4, +104,244,112,214,214,148,231, 55,193,189, 63, 44,113,202,230, 37, 54, 47,253,223,229, 37,155, 52,217,183, 17,157,162, 70,117,158, +109, 57, 27,227, 26,214, 28,141,149, 70,155,250,222, 27, 51, 47, 53,197,179,103,241, 0, 46, 4,203,201,114,178,156, 44, 39,203, +201,114,178,156,255, 89,206,127, 37, 72, 54, 10, 88,176, 96,193,130, 5, 11, 22, 44, 88,176, 96,193,130, 5, 11, 22, 44, 88, 60, + 84,112,216,190, 27, 18, 18,146, 40, 22,139, 91, 58,250, 95,169, 84,222,187,119,239, 94, 63, 54, 10,255, 57,176,207,136,197, 67, + 4, 18,127, 57,232, 52, 0,166,118, 99,193,130, 5,139,127, 53, 28,118,134, 23, 8, 4,145, 55,110,220,136,166,105, 26, 38,147, + 9, 70,163,209,242,169,211,233,208,187,119,239, 6,119,164, 15, 12, 12, 76,230,112, 56, 45, 26,114,142,201,100,202, 41, 42, 42, +234,233,228,144, 84, 0,145, 4,241,151,102, 52,127,119,244, 9,160,192, 96, 48,116,114,198, 73, 16, 68,164, 45,159, 3, 46,243, +119,167,156,158,158,158,231, 40,138, 10,179,199,229,232, 59, 77,211, 89, 37, 37, 37, 61,254,206,103,244, 95, 70, 96, 96, 96, 50, + 69, 81, 13, 78,159,133,133,133, 14,211,103,112,112,240, 69,146, 36, 67, 26, 64,201,161,105, 58,227,222,189,123, 61,157, 8,145, + 84, 0,145, 78,107, 80, 54,233,137, 32,136, 60,147,201,212,197, 85, 62,114,198,101, 39,141,186,226,180,136, 44,138,162,150, 5, + 4, 4, 76, 85,169, 84, 26, 0, 12,135,195, 97,172,194, 6, 0, 48, 26,141, 37, 21, 21, 21, 29,216,148,200,130, 5,139,255,132, +208,162,105,154,212,106,181,200,204,204, 4,195,216, 45,239, 77,247,113,189,232,243,191, 31, 9,240, 8, 8,132, 81,175,135,196, +207,223,194, 93,116,253, 42,140, 6, 61,140, 58, 29,154,119,237,102, 14, 3,218,182,109,203,113,193, 25,182,124,249,242, 0, 15, + 15, 15,104, 52, 26,104, 52, 26,104,181, 90,104, 52, 26,232,116, 58,232,116, 58,232,245,122,232,245,122, 24,141, 70,104,181, 90, + 36, 37, 37,153, 12, 6,131, 83,206,197,139, 23, 7,200,100, 50, 11,159,121, 51,115,154,121, 13, 6, 3, 52, 26, 13,142, 30, 61, +234,148,147,162,168,176,130,130,130, 0, 30,143, 7,134, 97, 64,211, 52, 24,134,169,179,217, 34, 42, 42, 74,239, 44,144, 77,244, +140,254,203,136, 94,188, 99,127,128,167, 72, 0, 35, 77, 35, 33, 46,202,242, 71,214,215,187,193, 24, 77,160,141, 70,180,122,125, +188,101,127, 76, 76,140,211,244,201, 48, 76,248,226, 29,251,189,220,229,148,203,229,234, 54,109,218, 20,160,198,109,118, 36,180, +194,212,106,117, 64, 45,127, 61, 65, 68,146,100,157,237,208,161, 67, 72, 72, 72,112,117,239, 97, 51,103,206, 12, 48, 24, 12,208, +233,116,208,106,181, 48, 24, 12, 48, 26,141,150,205,100, 50, 89, 54,157, 78,135, 51,103,206,184,235,100, 45, 31, 52,104,208,228, +253,251,247, 75,126,253,245, 87, 73,139, 22, 45,192,227,241,192,225,112,192,225,112, 64,146, 36, 40,138,194,163,143, 62, 74,176, + 73,144, 5, 11, 22,255, 25,161,165,213,106,179,227,227,227,153,218,239,161, 2,129,128,103, 83,203, 13,105,213,170, 85,134,237, +121,174,154,171, 60, 2, 2, 49,183,153, 15, 0,224,195,187,114,203, 11,226,147, 30, 29, 45,199,124,156, 95, 9, 0, 16,137, 68, + 32,172,171,209, 14, 32,145, 72, 48,104,208, 32,240,249,124,116,233,210, 5, 92, 46,215,238,198,227,241,192,229,114, 93, 70, 10, + 65, 16,144, 74,165, 88,176, 96,129, 89, 36, 65, 34, 20, 96,122,143, 46, 16,130,193, 87, 87,111, 65, 71, 51,160, 40,202,178,185, +195,201,227,241,112,229,202, 21, 80, 20, 5, 14,135, 99,249, 52,127,223,187,119, 47,158,125,246, 89, 80, 20, 5,145, 72, 4,184, +152, 57,216,250, 25,233,116,186, 96, 62,159,175, 7, 96, 22,103, 60,130, 32,130,238,231, 25,253,151,225, 41, 18, 96,194,250, 95, + 0, 0,185,171, 94,183, 60,187, 51,175,125,104, 57, 38,252,229,209, 32, 8, 2, 92, 46, 23, 36, 73, 54, 26,103, 89, 89,153,122, +204,152, 49,167, 60, 60, 60, 14, 85, 85, 85,193,133,128, 67,110,110, 46, 40,138,114,152,222, 73,146,196,202,149, 43,241,231,159, +127,186,117,239, 26,141, 6,155, 54,109,130,201,100,170,195,107,254,110,187,207, 77,145,181,104,240,224,193,227,247,239,223,239, + 77, 16, 4, 62,255,252,115,240,120, 60, 12, 27, 54, 12,190,190,190, 56,124,248, 48,120, 60, 30,222,121,231, 29, 54,241,177, 96, +193,194, 89,153,199, 5,208, 17,128,127,173,137, 80, 13,192,203,234,144,146,218, 79,127,243,111,130, 32,210,237,240,116,173, 61, +166,132, 32,136,116,171,223, 58, 0,124, 59,251,229, 0, 68,181,155, 22, 53,238,127,123,171,235,152,207,131,163,235, 82, 64,205, +250, 67, 0,142, 3,232,155,144,144,112, 2, 0, 10, 11, 11,135, 22, 22, 22, 2, 0, 34, 35, 35,111,100,100,100,180, 49,107,158, +218,230, 41,158,209,104,140, 54, 55, 85,153,221,162,129, 3, 7, 58,173,225, 27,245,250,122, 2,196,158,150,178,215, 92,225, 72, +192,232,245,122,140, 30, 61, 26, 0, 28,190,116,172, 55, 55,180, 27,116, 58, 29, 40,138, 66,235,102,254,152, 55, 36, 30,143, 48, + 6, 40, 21, 4,140,149, 74,140,144, 26,112,163,109, 39,108,204, 41,193,221, 42, 5, 40,138,114,139,147,166,105,135, 34,139,195, +225, 96,253,250,245, 24, 51,102, 12, 56, 28,142, 91,124,214,207, 40, 34, 34, 98,127, 70, 70,134, 47, 65, 16,218,218,103, 36, 48, + 26,141, 50,163,209,232,107, 50,153,124, 27,242,140,254,203, 48,210,180,221,116,232, 40,205,186,243,156,220,225, 44, 43, 43, 83, + 39, 36, 36,156, 22, 8, 4, 91, 3, 3, 3, 11,242,242,242, 92, 10, 45, 91,241, 99, 91,169, 88,177, 98, 5,214,174, 93,139,126, +253,250,185, 21, 78,173, 86, 11,130, 32,176,113,227,198,122,255, 45, 92,184,176,222,245, 92,112, 18, 0,200,144,144,144,215, 14, + 30, 60, 40, 51, 31,235,231,231, 7, 46,151,139, 14, 29, 58,192,195,195, 3,167, 78,157,130,201,100,114, 59, 95,178, 96,193,226, +223, 11,123, 90,196, 10,189,231,206,157,219,101,217,178,101, 75,186,119,239,190, 51, 53, 53,117, 7, 65, 16,137, 86,101, 98, 66, +109,249,154,104,254,205, 48, 76, 87,107,209, 83, 43,214,252, 9,130, 72, 52, 31,111,253,219,252,201, 48,204, 64, 0,124,243,239, +185,115,231,182, 95,182,108,217,146, 57,115,230,188,183,116,233, 82,222,220,185,115, 99,151, 45, 91,182,196,124, 29,123,225,176, +231,104, 57, 93,123,202,220, 68,117,243,230, 77, 71, 77, 84,214, 47, 0,167,165,165,196,207,223,226,100,125, 28,238,107,217,191, + 32,175,194,242, 2, 91,215,185, 37, 36, 18, 9,134,124,252,169, 91, 78,145, 78,167, 67,113,113,177,197,101,112,181,185,203, 41, + 22, 9,145, 52,179, 3,114,229,124,124,148, 86,134,253,151,254, 4,151,203,197,227,109, 59, 96, 40,207, 3, 31,132,243, 49,243, +214, 29, 24, 24,247,250,244, 50, 12, 99, 87, 96,153,191,155,155, 80,220, 21, 90, 54,207, 40, 87,163,209,200, 51, 51, 51,213,116, +205,139, 93,196, 48,140, 55, 65, 16,213,181, 46, 87,176,187,207,232,191,140,132,184, 40,139,235,116,198, 99,128,101,255,179,202, + 43,150,103,242,214,250, 79, 0, 0,253, 58, 61,234, 50, 63,184,195, 41,151,203,213, 61, 7,244, 61, 97, 82,235,182,140, 31, 63, + 62,251,216,177, 99, 34,119,194,106, 79,104,153, 93, 91,179,200,162, 40, 10, 58,157,206,173,123,215,233,116, 14,243, 7,143,199, +187, 31, 71, 11, 74,165, 82,183,103,207, 30,172, 91,183, 14,190,190,190, 24, 60,120, 48,130,131,131,177,123,247,110, 48, 12,131, +215, 95,127, 29, 34,145,200,236, 94,179, 9,144, 5,139,255, 54,156,105, 17,193,178,101,203,150,216, 10, 25,235,223,214, 2,202, + 70, 76, 89,139,181,246, 46,222,255,137,182,226,201,124, 93,130, 32, 18,151, 46, 93,154,224, 34, 28, 37,142,132,150,211, 41,241, +181, 90,109,118, 92, 92,156, 91,106, 66,165, 82, 21,186, 18, 27,246,106,245,214, 46,129, 84, 42,133, 68, 38, 5,233,102,185,107, + 48, 24, 44, 66,229,200,145, 35, 16,137, 68, 24, 54,108,216, 3, 57, 90,122,189, 30,124, 30, 23,164, 95, 32, 38,172, 58, 6,121, +181,218,242,130, 57,158,149,141, 11, 69,197,152,217,125, 0, 36,162, 98, 40,116, 58,183,156, 55,154,166,235,137, 44,138,162, 48, +122,244,104,139,155, 96,221,111, 5, 78,154, 14,125,125,125,207, 81, 20, 21,102,245,140,132,145,145,145,192, 95,253,122, 8,154, +166, 21, 94, 94, 94, 63, 3, 8, 97, 24, 38, 12,128,135, 59,207,136,133,253,244,105,187,159,182,113,170,238,135, 83, 46,151,171, + 19, 18, 18, 78,155,212,186, 45,249,249,249,167, 1, 8, 31,121,228,145, 6, 11, 45,179,192,226,114,185, 88,185,114, 37,214,174, + 93,107,249,223, 93,161,101, 52, 26,235, 8,168, 91,183,110,213,185,150,173,176,115,209,108,202,160,102,116, 33, 29, 25, 25,105, + 57, 39, 40, 40, 8, 94, 94, 94,160,105, 26, 52, 77, 67, 40, 20, 66, 36, 18,129,199,227,177,137,142, 5, 11, 22,206,180,136,122, +206,156, 57,239, 17, 4,145, 88,235, 44, 93,117, 34,168,236,105,143,174, 54, 98,173,196,193,113, 9,246,196,150,245,119, 51,230, +206,157,219,222, 54, 28,246,154, 43, 45,165,170,205,180,251,117, 96,221, 68,213, 88, 47, 49,103, 47, 50,169,151, 12, 34,137, 4, + 28, 14, 9,130, 32, 24, 87, 92,122,189,222, 82,240, 79,157, 58,213,105,191, 21,119,251, 83,233,245,122,144, 20, 7,247,130, 34, + 96, 34, 79, 90,206, 53,111, 36,197,197,221,160, 54,224,220,188, 8,174,155, 47, 92, 91, 71,235,245,215, 95,199,166, 77,155, 64, +146,164, 37, 78, 40,138, 66,171, 86,173,144,157,157,237,148,139,162,168,176,187,119,239, 6, 88,199,163, 89,196, 50, 12, 3,147, +201,132,168,168, 40, 77,102,102,230,155,108,214,125, 48,145,229,104,191,201, 68,187,237,194,216, 59, 78, 46,151,171, 71,141, 26, +117,162,178,178,114, 75,187,118,237,110,161,238, 20, 8, 46,249, 40,138,170, 35,176,204, 34,107,205,154, 53,117, 68,145,193, 96, +112,171, 34, 96, 48, 24,234, 9,158,207, 62,251,172,206, 39, 0,244,232,209,195, 45,103, 24, 0, 67,146, 36,195,227,241, 48,104, +208, 32,196,198,198,226,215, 95,127, 5, 77,211,152, 54,109, 26, 68, 34, 17, 86,175, 94, 13,163,209,136,229,203,151,179,142, 22, + 11, 22, 44,156,105, 17,237,210,165, 75,175, 46, 93,186,212,226, 44,217, 58, 90, 14,222,187,195,107, 69,149,191, 89,164, 1,208, +218, 19, 68,246, 92, 50, 91, 1,102,189,111,217,178,101, 75,108,195, 97,219, 92, 89, 71,104,253, 93, 40,188,118, 5,159, 62, 22, + 15,160,110,115,225,250, 71,219, 64, 34,149, 64,226, 33,197,168,189, 39, 1,160,182,208,159,227,150,163,101, 22, 90,114,185,220, +169,200,106,136,163, 69,242, 41,252, 24, 86, 14,134,207, 5,165, 51,212, 17, 90, 28,138,139, 92,223, 8,144, 92, 30, 40,147,209, + 45, 78,134, 97,234, 53, 21, 78,156, 56, 17, 4, 65, 88, 70,136,197,197,197, 89,115, 17,174, 94,142,179,125,106,250,224,217, 54, +199, 46, 47,213,176, 57,246,126,210,231,185,175,113,227,167,215, 0, 0, 61,149, 74,203,179, 88, 28,247,215,216,129, 85, 87, 78, + 88,220,199,143,241,246,125,113,202,229,114,245, 35, 49,237, 79,243,124, 60,183,228,228,228,156, 6, 64, 62,247,220,115, 94,113, +113,113,110,229, 73,243,224, 10, 91,145,101,237,100,153, 63, 93,140,176,181, 18,142, 38,183, 4,148,185, 25,209,141, 52,207,152, +211,182, 76, 38,131, 84, 42,181,140,184, 21, 10,133, 16,139,197,150,254,157,110, 10, 55, 22, 44, 88,252,119,225,109, 22, 58,181, + 98,169,142,211, 84,219,183, 42,193,250,183, 61,199,171,214,129, 74,118, 81,190,238,175, 21,104,118, 97,118,214,108,206, 73,116, + 36,210, 40,179,130,180,254, 12, 10, 10,250, 77, 42,149, 70,184,123,247, 13, 25,197,102, 50,232,235, 57, 91, 4, 65, 64,234, 33, +133, 72, 42,129,200, 67,234,208,245,114, 38,180,204, 78,145,249,165,179,117,235, 86, 72,165, 82, 76,154, 52,169,193,125,180, 44, + 66,139, 71,226,176,224, 40, 56,124,170,142,200,162, 40, 10, 28, 46, 23,133,210, 96,144, 92, 46, 40,163,123, 46, 89,101,101, 37, + 40,138,194,188,121,243, 44, 53,120,107,145,213,144,123,118, 6,146, 32,204,238,150,160,101,203,150,111, 19, 4, 17, 14,160,133, + 82,169, 20,220,187,119,175, 63,155, 95,157, 40, 3,147,161,158, 11,229,200,125,189, 95, 78,179,147,197,243,241,220,210,166, 77, + 27,139,147, 37, 22,139,205,163, 77, 93, 63, 99,146,180, 43,178,108, 71, 8, 82, 20, 85,147,150, 93,140,142,180,118,180,150, 46, + 93,106,225,181,118,178,204,104, 72, 62, 50,135,245,196,137, 19,184,112,225, 2,166, 78,157, 10,145, 72,132,181,107,215,194,104, + 52, 98,225,194,133, 16,137, 68,224,243,249,108,226, 99,193,130,117,179,234,104, 17, 27,148,216,244,131, 34,108, 68, 77,137, 61, +129,101,221, 76,104,254, 78, 16,132,193, 14,175,206,166, 73,209,118,191,249, 83,190,116,233,210, 99,102, 39,203,106,127,157,112, +184,116,180, 4, 2, 65, 68,102,102,166,101, 34, 76,103,159, 58,157, 14,253,250,245,115,219, 25, 51,143, 58,164, 40, 78, 29, 97, + 33,246,144, 66, 44,243,128, 72, 42,181, 21, 28,132,171, 66,220, 92, 35,182, 22, 90,243,231,207, 7, 69, 81,216,180,105, 19, 0, +224,237,183,223,118,187,143,150,153, 19, 38, 2,121,204,109,196,175,122, 22,186,239, 12, 40, 74,249, 3, 20, 69, 33,160,219, 80, +208,143, 60, 11,149, 72, 10,202,100,116,123,212, 97, 89, 89, 25,178,179,179,193,225,112, 48,107,214,172, 58,115, 29,217,142,100, + 59,114,228,136,203,123,183,231,100,205,207, 41,179,240,136, 68, 34,242,143, 63,254,136,160,105, 58, 82,173, 86,183,236,209,163, + 7,205,102,101, 23,162,136, 54,186, 37,170,220, 77,159,182,156,230, 62, 89,149,149,149, 91,114,114,114,206, 0, 32,199,143, 31, +239, 37, 22,139,241,205, 55,223,168, 0,240,119,239,222, 45,114, 37,138,204,233,198,149,200,226,114,185, 53,105,217,157,123,103, +234, 78, 89,226,170, 99,188, 59,105,222, 28, 86,130, 32, 96, 50,153, 32, 18,137,234, 56, 89, 66,161, 16, 2,129,128, 77,120, 44, + 88,176,112, 85,150,164,187, 93,142, 51, 76, 87, 43, 81,149,126, 63,188, 13,185,158, 43, 80,142,132,134, 86,171,197,245,235,215, +221,229,113,123, 98,204,102, 93, 30,197,199,249,149, 32, 8, 2, 95,245,104, 7,137, 76, 10,177, 68,130,145,191,158,176, 20,220, + 87,150,188, 13,129, 68,138,144, 94,131,221, 42,200,205, 77,135,214, 66,171,162,162, 2, 92, 46, 23,139, 22, 45, 2, 73,146, 88, +190,124, 57, 66, 67, 67,113,239,222, 61,236,222,189,219, 45, 71,139, 99,226, 32,248,133, 24,136, 39,122, 66,246, 66,111,120, 15, +154,143,124, 29,133, 84,141, 24,189, 53,215,192, 63,188, 6, 58,218,228,246, 8, 44,163,209,136, 19, 39, 78,216,118,120,183,244, +169, 50, 26,141, 48, 24, 12,208,235,245, 88,190,124,185, 59, 35, 60,235, 61, 55,115, 28,214, 78,130,202,201,200,200,240,103, 24, +198, 7,128, 39,128, 82, 54,187, 58, 71,112,183,215,225,223,229, 85, 0,192,222,165, 47, 90,246,207,187,242, 87,250, 92,249, 93, +205, 2, 0,109, 90, 12,110, 16,167, 92, 46, 87, 63,222,175, 71,178,134,230,110,238,208,161, 67, 29, 39, 75, 40, 20, 18,181,191, +221,178,203, 72,146, 4,135,195,169,215, 92,232, 72,108,185,211, 71,203,104, 52, 90, 38, 18,117,214,159,241,126, 28,173, 23, 95, +124, 17,193,193,193, 22, 39,235,227,143, 63,134, 72, 36,194,220,185,115, 97, 48, 24,176,102,205, 26, 54,241,177, 96,193,226,111, + 23,101,127, 7,236,150,164, 26,141,230, 78,108,108, 44, 28,252, 23, 42, 20, 10,185, 54, 55, 21,210,170, 85,171, 12, 59, 77,136, + 3, 1, 36,217, 43,212, 9,130,128,135,204, 3, 66,169, 4, 98, 27, 23, 75,232, 33,131, 64, 42, 5,201,179, 91,152,215,227, 52, +247, 45,177, 22, 90,230,173,178,178, 18, 92, 46, 23,235,214,173,131, 76, 38,131, 86,171,117,201,105,126,233,112, 56, 28,168,114, +171,113, 99, 73, 18,248,194, 84,180, 28, 60, 6,193, 92, 17,120,167,126,134,218,100,112, 53, 97,105, 61,206,232,232,104,124,248, +225,135,245,166,117,112,132,208,208, 80,151,247,110,235,100,173,108,215, 28, 60, 62, 15,111, 93,203,133, 86,171, 37,198,140, 25, + 67, 3, 80, 3, 40, 81,171,213, 57,238,196,103, 35,224,161,231,116, 54, 42,214, 12,154, 49,217, 19, 48,118, 57,205, 78,150,134, +230,110,206,206,206, 54, 59, 89,158, 98,177, 24, 27, 54,108, 80, 1, 32, 23, 46, 92, 40, 14, 15, 15,231,184,147,150, 56, 28, 14, + 86,173, 90,101,183, 79,150, 61,209,213,144,124,100,125,110,159, 62,125,236, 78, 88,234, 64,188,213,227, 52,135,213,215,215,215, +226,100,153, 76, 38,203,104, 67,243,236,243, 78, 42, 21,108,250,100, 57, 89,206,255, 14,231,191, 18,118, 75,224,123,247,238, 61, +238,232,132,168,168,168,204,204,204,204, 86,230,165, 56,106, 11, 78,158, 70,163,137,238,209,163,135, 75,107,135,166,105, 8, 4, + 2, 48, 12,131,254, 31, 46, 3, 65, 2, 36,234,190,196, 2, 30, 27, 0, 14,135, 2, 93,179,212,135,203, 81,135,106,181,186,206, +203,193,222,166, 80, 40,160,213,106,221,158,205, 91,163,209,212,153,130,129, 96,104,220,253,125, 87,189,209,135,230,205,221,126, + 59, 66,161,176, 78,211,143, 11,199,138,112,199,209,178,110,122,228,241,121,160,120, 92,179,163, 85,125,235,214,173, 81,108, 50, +119, 31,230, 1, 11, 0,208,186,199, 48,208,180, 9,140,201, 84,103,153,164,152,136,199, 65, 51, 38,232, 13, 42,104,181, 90, 87, +211,158, 16,165,165,165,234, 81,163, 70,157, 0,240,237,136, 17, 35, 50, 80, 51,187, 48, 35,149, 74, 5, 92, 46,151, 6, 80, 6, +128, 41, 47, 47,247,204,207,207,167, 53, 26, 77,115, 87,225,220,191,127, 63,174, 95,191,142, 94,189,122,213, 89, 14,202,236,138, + 90,207,238,238, 78,250, 52, 55,151,219,155, 17,222,145,144,115, 23, 28, 14, 7,158,158,158,224,241,120, 88,180,104, 17,120, 60, + 30,196, 98, 49, 0, 96,205,154, 53,150,201, 87, 89,176, 96,193,226, 63, 35,180, 92,149,155, 78,154, 21,157, 54, 33, 26,141,198, +188,240,240,240, 6, 93,204,100, 50, 21,185, 16,110,121,187,119,239,230, 89,187, 16,174, 62, 25,134, 41,114,241,178,205,219,187, +119, 47,207,158,187,225,104,129,105, 87,156, 38,147, 41,175, 69,139, 22, 14, 29, 19,123, 48, 24, 12,249,174, 68,235,178, 18,117, + 29,145,240,214,181, 92,135,107, 39,178,112,153,214,156,164,207,247,239, 55,125,222,106,221,186,117,190,151,151,215,129,192,192, + 64,121, 74, 74,138,111,215,174, 93,125,173,143,233,218,181,107,176,205,105, 58, 56, 94,231, 16, 4, 65,228,141, 24, 49,194,110, +154, 55,139, 38, 59,233, 51,207, 85,154, 63,123,246, 44,207,250,124, 71,252, 86,249, 40,207, 13,225,122, 55, 62, 62,158,180,230, +113,148,246, 13, 6, 67, 9,155, 10, 89,176, 96,241,159, 23, 90,106,181, 58, 55, 54, 54,214,232,224,191, 28,103,231,202,229,242, + 46,141,125, 3, 6,131,161,199,195,192, 89, 90, 90,218,168,247,110, 52, 26,243,106, 39, 40,117,122, 12,155,196,255,185,103, 4, + 0,197,197,197,143, 0,128, 82,169,132,171,101,117, 26, 32, 8, 27, 61,125, 26,141,198, 30, 77, 17,167,101,101,101,221,217,148, +197,130, 5, 11, 86,104, 53, 0,236, 98,196,255, 31,104, 10,209,202,130, 5, 11, 22, 44, 88,176,104, 92,144,108, 20,176, 96,193, +130, 5, 11, 22, 44, 88, 52, 13, 8,212,140, 28,176,135,134,140, 38, 24,120, 31,215, 78, 98, 57, 89, 78,150,147,229,100, 57, 89, + 78,150,243, 63,199,233,138,155, 29,205,216,196, 2,140,229,100, 57, 89, 78,150,147,229,100, 57, 89,206,255, 30,231,191, 18,108, +211, 33, 11, 22, 44, 88,176, 96,193,130, 69, 19,129, 98,163,224, 31, 3, 7, 13,152, 81,223, 21, 24,134,241, 6,224,104,193, 56, + 29, 65, 16,229,247,193, 73, 0,224,213,110,230,137,142, 12, 0,244, 0,244, 4, 65, 48,174, 57, 62, 34, 11, 10,188,219, 51, 38, +110, 87,134, 32,184, 52,141, 75,205,155, 55,187, 72, 16, 67,117, 0, 32, 9,140,105, 43,149,136, 6,106,245,186, 8, 1,151,127, +189, 66,169, 56,162, 45,206,188,195, 38, 15, 22, 44,254, 17, 60, 1, 96, 1,106,186,149, 44, 5,176,139,141, 18, 22, 44,154, 72, +104, 73,165,210,115, 36, 73,134,185,154,159,199,140,218,181,204,242,202,203,203,187, 52,224,218,163,164, 82,105, 63, 46,151,251, + 24, 0, 24, 12,134, 20,133, 66,113, 12,192,110, 0,198,251,188, 39, 25,128,209, 0,198,213,254,254,190,182,176,168,186, 79,190, + 88, 79, 79,207,159,184, 92, 46, 83, 90, 90,218, 13, 0,124,125,125, 79, 27, 12, 6,162,170,170,106, 36,128,203, 13,228, 35,185, + 92,238,202,110,221,186,245, 62,121,242,228,183, 0,214, 53,210,179, 20,144, 36,105, 87,160,208, 52,221,226, 62, 68, 22, 15,128, +231,186,117,235,124,183,111,223, 30,159,151,151,215, 1, 0,194,194,194,174,140, 31, 63,254,226,244,233,211,229, 12,195, 84, 18, + 4,161,119,198, 83, 80,224,221,190,184, 48,107,106, 81,241,245,209, 0, 16, 20,220, 97, 23,135, 67,242, 24,230,124,154,216,111, +156, 95,171,150, 45, 94,221,249,205, 58, 94,139,136,102, 56,154,122,161,227,244, 55,223,107,159, 15,172, 96,197,214,223, 7, 15, + 15,143,115, 36, 73,134, 57,203,227,246,242,188,201,100,202, 43, 43, 43,235,226,136,147,162,168, 48,103,229,133,189,125, 52, 77, +103,149,150,150,218,157,106, 66, 38,147,165, 81, 20, 21,225, 46,151,249,211,104, 52,230, 57, 26,165, 43,147,201,206,113, 56,156, + 48,103,247,105,239, 63,154,166,179, 74, 74, 74, 28,133,179,222,189, 55, 70, 56,239,135,211, 89, 56,205,229, 17,128, 53,190,190, +190,143,202,229,242,231, 1,188, 87, 85, 85, 21,199,225,112,224,227,227,243,158, 78,167,251,211,211,211,243,235,202,202,202, 84, + 0,111, 2, 96,215, 75,101,193,162,177, 32,147,201,138, 20, 10, 5, 99, 6, 77,211,140,193, 96, 96,180, 90, 45,163, 86,171, 25, +165, 82,201, 40, 20, 10,166,170,170,138,169,172,172,100,228,114, 57,227,239,239,111, 59,121,163,163, 54,220, 14, 50,153, 44,115, +217,178,101,218,236,236,108, 70,175,215, 51,122,189,158,185,115,231, 14,243,233,167,159,106,101, 50, 89, 38,128, 14, 14,206, 29, +232,160,176, 24, 4, 96, 71,124,124,188,110,255,254,253,140, 70,163, 97,148, 74, 37,179,107,215, 46,166, 93,187,118, 58, 0, 59, +106,143, 33,221,228, 4,128,158, 65, 65, 65,121,183,111,223, 54, 29, 57,114, 68,239,233,233,153,228,233,233,153,116,231,206, 29, +211,237,219,183,105, 63, 63,191, 60, 0, 61, 27, 16, 78, 0,120,246,173,183,222, 42,186,115,231, 14,211,167, 79,159, 75, 86,251, + 9,184, 94,231,110,160, 61, 39,139, 97,152, 32,134, 97,130, 81, 51,201,101,189,141, 97,152,224,218, 99,188,221,228,148,100,101, +101, 53, 11, 12, 12, 92, 70, 16,132,206,150,143, 32, 8, 93, 96, 96,224,178,172,172,172,102, 12,195, 72,156,113,230,229,172,127, +233,192,254, 1, 21,202,242,155,140,178,252, 38,243,237,230,190, 85,175, 76,127,126, 71,112, 84,167, 77, 94, 97,237,215, 93,191, +121,107, 35,195, 48, 27,143,165,103,110,156,255,229,111, 27,159,158,190,122,131,111,120,252, 43, 13,136,207, 7, 1,203, 9,192, +203,203,171, 80,169, 84, 50, 12,195, 48, 38,147,137,209,235,245,140, 86,171,101, 84, 42, 21,163, 80, 40,152,234,234,106, 75, 62, +175,172,172,180,124, 15, 8, 8,112,152,223,189,189,189,139,212,106,117,157,178, 67,167,211, 89,202, 15,149, 74,197,168, 84, 42, + 70,169, 84, 90, 54,133, 66,193,132,132,132,228, 58, 9,231, 61,115, 56,105,154,102,140, 70, 35,163,215,235, 45,188, 26,141,166, +206,166,213,106, 25,173, 86,203,132,135,135,187, 29, 78,119, 56, 53, 26, 13, 19, 22, 22, 86,224,136,211,199,199,167, 72,163,209, +212,225,180,190,127, 91, 94,243,239,160,160,160,194,134,112,186, 19, 78,103,241, 89,139,117, 25, 25, 25,140, 90,173,102, 66, 67, + 67,229, 35, 71,142, 52,152, 76, 38,102,255,254,253, 76,124,124, 60,221,183,111, 95,125,105,105, 41, 51,105,210, 36,198, 73,165, +144,205, 71, 44, 39,139,251,113,180, 8,130,128, 68, 34,193, 15, 63,252,224,112, 57, 14,235,239,205,155, 55,119,247,154, 93, 34, + 34, 34, 78,156, 58,117, 74, 20, 28,252,215,132,216, 58,157, 14,222,222,222,152, 54,109, 26,255,137, 39,158,104, 53,120,240,224, +211,119,239,222,237, 3,224,156, 11,190,103,252,253,253, 63,159, 55,111, 94,224,115,207, 61, 7, 95,223, 58,147,110, 99,212,168, + 81, 24, 57,114, 36, 47, 35, 35, 99,204,214,173, 91,199,172, 95,191,190, 80,161, 80, 76, 7,240,179, 51, 82,145, 72, 52, 34, 36, + 36,100,195,169, 83,167, 2, 2, 2, 2, 16, 25, 25, 73,190,243,206, 59,173,162,163,163, 69, 97, 97, 97,228,189,123,247,240,235, +175,191,134,142, 29, 59,246,199,162,162,162, 87,245,122,253, 30, 55,238,157,239,235,235,251,222,171,175,190,234, 87, 85, 85,101, + 60,127,254,124,166,121, 63,159,207, 95,216,189,123,247,174,199,143, 31,255, 14,192,215,247,227,100, 49, 12, 83,133,191,154,248, +204, 48,152,255,119,199,217, 98, 24,134,127,233,210, 37,159,238,221,187,255,172,213,106, 59, 77,157, 58, 53,103,201,146, 37, 34, +153, 76, 38, 3, 64, 84, 85, 85,149, 47, 88,176, 64,183,122,245,234,119,219,182,109, 59, 32, 45, 45,237, 25,134, 97, 12,181,130, +172, 62, 31, 65, 88,194,147,155, 95,130, 19,169, 52,255,195,185,111,135,125,178, 56,226,110,250,181, 92,154, 18,201,176, 47,249, + 42,138,228, 10,252,150,118, 13, 65,190, 30, 4, 79,192,109,239, 25,218,174, 79,101,254,181,100, 56,153, 33,157, 69,227,128, 32, + 8,136,197, 98,236,219,183,175,222,210, 85,246,150,181,162, 40, 10, 94, 94, 94, 46, 87, 55, 16, 10,133, 56,114,228,136,221,181, + 23,237, 45,233,227,233,233, 9,103,149, 13,130, 32, 32, 20, 10,145,146,146, 2,146, 36,237, 46, 13,100,187, 79, 34,145,128,116, +178,214,149,153, 51, 57, 57,217, 37,151,249, 83, 42,149, 2, 53, 77,255,142, 51,165, 64,128, 83,167, 78, 57,188,103,219,239,210, +218,245, 94, 93,113,166,164,164,212, 89,250,203,118, 73, 48,235,223, 18,137, 4,132, 11, 82,111,111,239,110, 97, 97, 97, 56,123, +246, 44,118,239,222,237,211,190,125,123,220,186,117, 11, 4, 65, 96,201,146, 37, 68,187,118,237,184,133,133,133,232,213,171, 23, +126,249,229,151, 30, 85, 85, 85,108,134, 97,241,143,128, 97, 24, 46,128,142, 0,252, 81,211,237,166, 26,128, 23,106, 86,210,224, + 3,144, 3, 16,213,110, 90, 0, 10, 0,126,181,167,151,214,150, 45,214, 2,161,196,122,241,105,134, 97,186,214,114,155, 87,168, +240,183, 58,214,124, 13,219,223,182,159,118,185, 41, 0, 72, 76, 76, 52,191,204,250, 38, 36, 36,156,176,190, 57,119, 68,150,121, +157, 50, 59,121,218,118,136,166, 64, 34,145,252,116,250,244,105,145,191,255, 95,247,160,213,106, 81, 93, 93, 13,133, 66,129,234, +234,106,120,120,120, 96,247,238,221,162, 1, 3, 6,252, 84, 93, 93, 29, 93, 27,105,142, 56, 87,221,187,119, 47,208,104, 52,130, +207,183,223, 69,137, 36, 73,196,196,196,224,189,247,222,195,144, 33, 67,130,250,245,235,183,202, 70,104,213, 27, 74, 42, 22,139, + 55,156, 63,127, 62, 64, 44, 22, 35, 51, 51, 19,121,121,121,120,235,173,183,154,209, 52,141,220,220, 92,220,186,117, 11,249,249, +249,216,186,117,107,192, 83, 79, 61,181,193,142,208,178, 55, 60,117,234,204,153, 51,219,120,123,123,147,159,126,250,105,133, 82, +169,252,162,118,255,135,107,215,174,125,161,119,239,222, 1, 83,166, 76, 97, 82, 82, 82,182,215, 62, 56,135,241,105,221, 39,171, +182,153, 15,181,137,239,134,205, 57, 49, 86,255,131, 97,152, 32, 0, 90,130, 32, 42,236,112, 18, 0, 60, 7, 15, 30, 60, 75,171, +213,118, 58,117,234,212,159,143, 61,246, 88, 56,128,123,230,196,231,233,233, 41, 89,181,106, 85, 96, 66, 66, 66, 70,255,254,253, + 59, 13, 30, 60,120, 86, 73, 73,201, 18,134, 97, 74,172,250,108, 89, 56,105, 26,151,130,130, 59,236, 74, 78,155, 62,250,120,138, +142,247,246,155,243,115,154, 55,107, 81,121, 41,179,204,116, 45,171, 4,213,106, 35,158,238, 95,179,128,121,183, 14,205,241,249, + 15,167, 48,109,198,251,220,159,119,109, 27,249, 39, 3,137,162,224,218,126, 39,241,249,160, 96, 57, 97,105, 98, 2,151,203,197, +208,161, 67, 65, 16, 68,189,181, 60,185, 92, 46,210,210,210,208,191,127,127,112,185, 92,188,248,226,139,110,113, 82, 20,133,193, +131, 7, 91,214, 81,180,230,179, 21, 13, 14, 52, 65,146, 77, 97, 11,138,162, 64,146,164,195,133,180,109, 57, 93,149, 75,230,112, + 58,227,178,254,207, 85, 56,107,151, 60,114, 91,100,185,203,105, 14, 39, 69, 81,232,209,163, 7, 46, 94,188,232, 84,116, 57,208, +151,117,238,189,188,188,124, 66,116,116,116,242,186,117,235,124, 0, 64, 46,151, 91, 22,188,231,112, 56,184,121,243, 38,116, 58, + 29, 62,250,232, 35,125, 85, 85,213, 20, 54, 31,177,156, 77,201,233, 76,139, 0,232, 61,119,238,220, 46,203,150, 45, 91,210,189, +123,247,157,169,169,169, 59, 8,130, 72,100, 24, 38,193,252, 57,119,238,220,246,203,150, 45, 91, 50,103,206,156,247,150, 46, 93, +122,149, 32,136, 68, 0,176,253, 93, 91,150, 36,216,136, 56,127, 51, 79,109,158,171,115,172,189,223,182,159,246,184,235, 56, 90, + 9, 9, 9, 68,237, 77, 18,214,133,154,187, 66,203,157,181,251, 40,138,122,125,201,146, 37,129,206, 68,150, 66,161, 64, 65, 65, + 1,194,195,195,241,226,139, 47, 6,174, 91,183,238,117,163,209,248,153, 19, 90, 30,135,195,193,217,179,103, 81, 92, 92,140,216, +216, 88, 68, 68, 68,212, 57,224,246,237,219, 56,112,224, 0, 42, 42, 42,208,185,115,103,160,166,115,183, 93,196,197,197,125, 20, + 19, 19, 51,152, 36, 73,163, 72, 36,194,165, 75,151,208,169, 83, 39,252,240,195, 15,104,222,188, 57,196, 98, 49, 50, 50, 50, 16, + 27, 27,139, 19, 39, 78,192,223,223, 31,241,241,241,198,170,170,170,147,101,101,101,199,238,222,189,251,145,163,112,134,134,134, +206,127,229,149, 87,248, 5, 5, 5,244,150, 45, 91, 78, 1, 56, 5,224,245,247,223,127,127,242,144, 33, 67, 2, 46, 92,184, 80, +153,158,158,126,198,129,200,114,199,201, 50,218,190,148, 76, 38,147, 86,173, 86,235,180, 90,173,129, 36,201, 59, 4, 65,232, 76, + 38, 83,180, 35, 19, 98,226,196,137, 81,165,165,165,211,102,204,152,145, 93, 43,178,110,162,166, 3, 60, 0,192,104, 52,106, 21, + 10, 69, 85,247,238,221,195,199,142, 29,251,231,142, 29, 59,166, 77,156, 56,113,247,150, 45, 91, 20, 0,212,182,132,205,155, 55, +187,200,225,144, 60,101,181, 79,214,143,187,191,158,121, 96,239,235,205,114,115,243, 91,249,250,249, 43,121, 82,255,130,221,223, +111, 62, 7, 64, 87, 80, 82,133,203,183, 11,193,229,114,112, 61,183, 18,189, 31, 31,197,253, 51,115,113, 79, 0,251,217,186, 92, +211, 87, 22,205,139, 80, 31, 63,126,220,169,163,149,150,150, 6, 46,151, 11,145, 72,132,213,171, 87, 59, 37, 53, 11, 3,179, 91, +228, 74,204,152, 23, 71,119,230, 62,209, 52,109, 89,232,221,118,251,226,139, 47, 48, 99,198,140, 58,215,168, 21, 27,132, 43, 78, + 71,225, 11,111,209, 2,197, 69, 69,117,246,185,179, 40,189,201,100, 2,151,203,197,166, 77,155,144,144,144,128,196,196, 68,167, +159, 67,135, 14, 5, 73,146,140, 59,241,217,163, 71, 15,232,245,122, 75,152,111,222,188,105,151,119,253,250,245,174,130,249, 4, +128, 5,157, 58,117,146,245,235,215, 15,201,201,201, 24, 57,114,164, 86,175,215,103, 2,192,240,225,195, 91,175, 91,183,142,127, +254,252,121,248,250,250,114,115,114,114,190, 5,219, 65,158, 69, 19,195,158, 22, 49,191,243,150, 45, 91,182,196, 86,196, 88,195, +252, 63, 65, 16,137, 75,151, 46, 77,176, 22, 69,214,191,205,174,147,141,136,107,111,237, 72, 89,139, 40, 71, 2,202,230,125,107, +125,124,137, 93,161, 85,123, 99,125,173, 93, 32,115,225,235, 74,100, 57,169, 57,214,129,167,167,231,176,167,159,126,218, 34,114, + 52, 26,141, 69, 96,153, 69,150,249,119, 70, 70, 6,186,116,233,194,243,244,244, 28, 38,151,203, 63,115, 67,196, 33, 36, 36, 4, +165,165,165,184,114,229, 10,194,195,195, 97, 48, 24,112,232,208, 33, 84, 86, 86,130,203,229,130,199,227, 65,175,119,218,119, 27, + 49, 49, 49, 67,183,111,223,222,101,219,182,109,229,230, 26,221,247,223,127, 15,134, 97,224,239,239, 15,149, 74,133,162,162, 34, + 28, 59,118, 12, 70,163, 17, 82,169, 20,145,145,145,252, 17, 35, 70,244, 92,176, 96, 1,215,137,208,234, 49,114,228, 72, 79,153, + 76,134, 55,223,124,147,209,235,245, 75,107,247,205,159, 62,125,186,239,157, 59,119,116, 47,189,244,210, 89,189, 94,255,169,217, + 76,180, 22, 56, 14, 30,172, 67, 39,203, 96, 48,152,227, 52, 91,161, 80,192,207,207, 47,220,218,217,114, 36, 6, 83, 82, 82,122, + 0,224, 44, 92,184, 80, 8,160,200, 58, 12, 58,157, 14, 10,133, 2, 74,165,210, 80, 89, 89, 89, 60,123,246,108,227,142, 29, 59, + 56,181,231, 92,183, 39,180, 8, 98,168, 78, 38, 19,243, 25,134,243,254,198,141, 27,165, 67,134, 12, 33,165, 82, 41,170,171,171, +101,191, 29, 60, 40, 29,208,175,103,228,146,101,159, 28,150,133,197, 22,165, 92,202, 66,126, 97, 37,116, 6, 3, 34,131, 61,107, +252, 48, 22, 77,142,218,129, 44, 22, 71,203, 90, 84, 36, 39, 39,227,241,199, 31,183,228,117, 30,143, 87,199,249,114,197, 73, 81, + 20, 30,127,252,241,122, 14,207,241,227,199,237,186, 79,174, 96, 45,138,108,197,145, 61, 1, 70,146,164,203, 5,214,205,110,158, + 61,177,101,237,234,219,136, 55, 87,205, 28,160, 40, 10,211,167, 79, 7,151,203,197, 59,239,188, 3,138,162, 16, 31, 31, 15,138, +162,208,189,123,119,112,185, 92,244,239,223,191,193,247,126,250,244,105,116,234,212,201, 18,166,248,248,120,116,237,218, 21, 20, + 69,161, 87,175, 94,224,114,185, 24, 60,120,176, 59,156,239, 85, 87, 87,199, 73, 50, 7, 8,223, 0, 0, 32, 0, 73, 68, 65, 84, +165, 82,100,100,100,128,195,225,128, 32,136, 91, 0,226, 0, 32, 56, 56,248, 79,149, 74, 21,165,209,104,240,202, 43,175, 16, 58, +157, 46,246,157,119,222,121, 95,163,209,176, 66,139, 69,147,193, 86,139, 88, 65, 61,103,206,156,247, 8,130, 72, 52, 59, 84,182, +206,147,189,223,118,202, 38,179, 3,149, 94,155, 87,187,218,136,184, 18,130, 32,210, 25,134, 25,238,232, 92, 0, 58, 27, 97, 85, +167,233,208,186,217,208,165,163,101, 46,124,221, 21, 90,174,160,209,104, 58, 6, 4, 4, 56, 20, 89,214,159, 58,157, 14, 17, 17, + 17,208,104, 52, 29, 27,250,210, 8, 14, 14,134, 94,175,199,215, 95,127, 13, 30,143, 7, 30,239, 47,125,161,211, 57, 55,139,174, + 93,187,150,125,250,244,233, 78,157, 59,119,246,254,229,151, 95, 74,250,244,233,227, 63,100,200, 16,136, 68, 34,168,213,106, 24, + 12, 6,116,235,214, 13, 49, 49, 49,200,203,203,195,111,191,253, 86, 26, 29, 29,237,119,230,204, 25,186,176,176,240,174, 19,234, + 65, 3, 6, 12, 0, 65, 16, 56,120,240, 96, 41,128,116,129, 64,112, 96,241,226,197,222, 58,157,142, 30, 63,126,124, 78, 89, 89, +217, 12, 0,122, 62,159,191,182, 79,159, 62,221,147,146,146,190,163,105,122,117, 67, 19,170,109,220, 42,149, 74, 8,133, 66,119, +166,146,224,150,149,149,117, 0, 0,137, 68,226, 3,224, 79, 75, 10, 87,171,235,136, 97,157, 78,167,241,241,241,145, 0, 64,237, + 57, 92, 7,156,254, 70, 35,126,188,123, 55,203,195,186,255,156,151,151, 23,198,141, 29, 75, 62,214,163, 7, 63,174, 99,199,193, + 31,172,216,246, 67,136,175, 76, 23, 25,226, 11,131,201,128,164,195,135,104,134, 54, 28,102,139,157,191, 71,104,153,197,134,173, +163,197,229,114,113,226,196,137,122,251,120, 60, 30,190,250,234, 43,183,132,129, 89, 84, 57,106, 58,179,105,234, 34, 92, 9, 24, + 46,151, 11, 14,135,131, 77,155, 54,129,166,105,204,156, 57,179, 78,115,162, 53,191, 91,118,158,149, 8,140,153, 79, 3,208, 33, +111,165,192,114,190,109,120,107,207,113,203, 37, 91,183,110,157, 91,142,214,240,225,195, 93, 10, 87,235, 22, 6,235,112, 93,188, +120,209, 46,239,198,141, 27, 93,198,167,201,100,194,254,253,251, 45, 34,213,140, 15, 62,248,224, 21, 62,159, 31,120,242,228, 73, + 20, 22, 22, 66,169, 84, 66,161, 80,160, 91,183,110,145, 36, 73, 94, 42, 44, 44,188,115,253,250,245,167,217,220,195,226,111,116, +180,180, 75,151, 46,189,186,116,233, 82,187,142,149,173,179,228,204,121, 50, 11,172, 90, 65,228,111, 22,111,168,233, 86,147,238, +234, 92, 0,124,219,166, 67,167, 70,144,141,138, 92, 96,175,240,117,167,249,208, 77, 59,157, 34, 8, 2, 26,141,198,174,192,178, + 22, 7,122,189, 30,101,101,101, 48,153, 76,247, 61,215,151,189,154,172, 43,161,117,229,202,149, 73,147, 39, 79, 46,240,244,244, +140, 43, 41, 41, 41,166,105,186,127, 90, 90,154, 63, 69, 81,144,201,100,144,201,100, 56,112,224, 0,196, 98, 49,166, 79,159, 94, +108, 50,153,146, 61, 60, 60,124,213,106,245, 31,133,133,133, 31, 56, 84, 48, 92,238,224, 94,189,122,225,252,249,243, 40, 47, 47, + 63, 2, 32,254,249,231,159,127,188, 89,179,102,196,226,197,139, 53,183,111,223, 94, 13,160, 88, 34,145,108,223,190,125,123,191, +206,157, 59,123,140, 31, 63, 30, 39, 78,156,216, 8, 64,227,238, 61, 43,149,202, 58, 2,171,170,170, 10,213,213,213,144, 72, 36, + 70, 55,227,140,139,191, 70, 24,130, 97, 24,203,179,169,117,179,204,207,135,161, 40,202, 60,170,209,145,200,130, 68, 34, 89,184, +109,219, 54,145,237, 32, 5,147,201,132,162,162, 34,200,100, 50,204,251,224, 3,222,199,111, 77,233,196,145, 6,166,145, 36, 1, +157,158,169, 96,104,221, 33,101,209,115, 39,129,143,216,146,231,111,128, 89, 24, 60,249,228,147,245,154, 11,121, 60, 30,142, 28, + 57,130,167,158,122,202, 82,113,233,220,185,179,203,202,149, 89, 24, 60,241,196, 19, 22,103,232,208,161, 67,118,155,253,204,142, +148, 59,130,208,124,236, 27,111,188, 1,138,162,240,249,231,159, 99,214,172, 89, 32, 73, 18, 43, 87,174, 4, 73,146,248,240,195, + 15,221, 22,153,214, 2,230,206, 39, 53,159, 97,179,170, 32, 95, 31, 8, 0,240,144,201,204, 55,212,160,178,135,162, 40,139,147, +213,177, 99, 71,112,185, 92,116,239,222, 29, 20, 69, 89,156,172, 97,195,134, 89,199, 35,227, 14, 39, 69, 81,200,204,204,180,132, +185,123,247,238,117,156, 44,138,162, 48,124,248,112,119,130,185,196,203,203,107, 65, 76, 76, 76,219, 85,171, 86,113, 57, 28, 14, + 6, 12, 24,208, 58, 40, 40,232,174,209,104,244, 93,184,112,161,216,206, 57, 34, 0,113,109,219,182,149,176,185,134, 69, 19, 58, + 90, 11,236,252,229,109,221,231,170, 1, 21,201, 68,235,227,205, 28,182,226,168,214, 33, 75,118,197,101,239, 92, 87,160,204, 10, +210,153,165,238,142,208,170,181,157,157, 94, 76, 44, 22, 95, 46, 46, 46,238, 46, 18,137,234,136, 44,123,130,139,195,225,160,176, +176, 16, 98,177,248,178, 86,171,109,180,135,232,170,233, 16,128,230,214,173, 91,111, 89,253, 30, 56,108,216,176, 45, 71,142, 28, + 9, 78, 74, 74,194,153, 51,103,224,239,239,143,117,235,214,221, 43, 42, 42,154, 4,224, 72,105,105,169,203,235, 70, 69, 69,117, +144, 74,165, 72, 73, 73, 1,128, 19, 0,166, 76,155, 54,141, 48, 24, 12, 88,191,126,189, 18,192, 65, 47, 47,175,253,187,119,239, +238, 20, 23, 23,199, 79, 74, 74,170, 58,115,230,204,239,110,138, 44, 19, 77,211,245, 4,150,117,156,122,120,120,184,227,104, 25, + 60, 61, 61,175, 84, 85, 85,141, 82,171,213, 85, 2,129,192,163,170,170, 74,107, 45,176,204,252, 20, 69,113, 51, 51, 51, 11, 0, + 68,122,122,122, 94,129,131,102, 78,138,162, 6, 12, 24, 48,128,178,125, 6, 69, 69, 69, 40, 44, 44,132, 94,175, 71,231,206,157, + 9, 14, 97,224,148,231, 94,182,153,214,129, 21, 89,127,147,163,197,152,243,186,121,148,160,189,145,134,135, 14, 29,178,252, 38, + 73, 18,155, 55,111,118, 75, 20, 29, 57,114,196,105,135,117,155,166, 67,151,214,184,249,248, 47,191,252, 18, 12,195, 88,156, 44, +146, 36, 49,103,206, 28, 8, 4, 2, 44, 94,188, 24,115,230,204, 1, 69, 81, 46,155, 14,173, 5, 76,139,119, 84,214,149,163,154, + 76, 81,219, 31,138, 32, 8,107,177, 69,184, 43,222,156,185,121,238,180, 4, 88,115,154,207, 19, 10,133, 14, 59,194,219,112, 58, +187,192, 62, 0, 89,193,193,193, 41,221,187,119,247, 60,119,238, 28, 86,174, 92,201,211,106,181,205,147,146,146, 44,215,181, 23, + 95, 74,165, 82,196,230, 28, 22, 77,225,102, 57,249,187,196,166,127, 21, 97,221,140,231,228,211,246,120, 88,237,179,230, 45, 33, + 8,194, 96,231,122, 37,118,196,149,237, 53,172,143, 41,113,232,104,185, 42, 44, 92, 9, 46,119, 28, 45,149, 74,245,251,193,131, + 7,187,142, 29, 59,150,114,214,108,168, 84, 42, 17, 24, 24,136,171, 87,175, 26, 85, 42,213,239,110, 56,101,141, 41,180,108,145, + 84, 92, 92,204, 49, 24, 12,104,213,170, 21, 66, 67, 67,161,209,104, 80, 81, 81,193, 1,112,196, 77, 14,158, 68, 34,225, 0, 64, + 69, 69, 5, 80, 51,212,180,117,116,116, 52,206,159, 63,143,178,178,178,159, 1, 12, 89,176, 96, 65,231,110,221,186,241,126,248, +225, 7,213,212,169, 83,127, 54, 24, 12,110, 41, 13,154,166,117, 70,163, 49,130, 36, 73,125, 69, 69, 69,190,117,124, 6, 6, 6, +250, 72, 36, 18,162,168,168,200,224,142,208,138,139,139, 59,155,147,147,131,133, 11, 23,150, 44, 89,178, 36,186,186,186,186,188, +178,178,210,104, 45,182, 52, 26, 13,233,231,231, 39, 88,191,126,189, 8, 0,226,226,226,206, 58, 18, 90, 74,165,178,153, 88,252, + 87,197, 88,171,213,162,176,176, 16,133,133,133, 40, 42, 42, 66,117,117, 53, 34, 35, 35,161, 82,169,194,217, 98,230, 31, 19, 90, +117,154,207,172,243,183,245,139,188, 33,121,221, 90,192, 60,249,228,147,150,190, 93,102,135,204,188,253,248,227,143,182, 29,204, +221, 18, 90, 95,126,249, 37,222,120,227, 13, 8,133, 66,172, 90,181,170, 78,211,161,173, 56,160,105,154,112,231,222, 35,222, 85, +163,112,173, 15,184, 92, 46,124,167, 22,213,105,162,179, 35, 56,220, 10,231,146, 37, 75, 26,165,233,208,154, 51, 60,188, 38,171, +108,218,180, 9,163, 70,141,194,201,147, 39,239,187,233,176,125,251,246,223, 39, 38, 38,122, 94,187,118, 13, 85, 85, 85, 40, 41, + 41,129, 86,171, 69, 94, 94,158,195, 86,129,218,178, 92,200,230, 28, 22,127,115, 57,149,254,119,242, 54,230,245, 40, 23, 47,112, +183,133,150, 59,142,150, 86,171, 93,245,230,155,111, 78, 27, 56,112,160,143,135,135, 7, 10, 10, 10,234,137, 44,133, 66, 1,169, + 84, 10,181, 90,141,189,123,247, 86,105,181,218, 85,174,196,129,193, 96, 64, 64, 64, 0, 74, 75, 75, 65, 59,232, 63, 77,146, 36, + 68, 34, 17, 20, 10, 5,224,162,147,185,189, 23,134, 94,175,135,193, 96,128,193, 96,128, 94,175,119, 89, 75,182, 53,243, 36, 18, +137, 89,120, 0,128, 50, 36, 36,164,149, 80, 40, 68,118,118, 54, 80, 51,178,111,224,227,143, 63,206,149,203,229,204, 75, 47,189, +116,138, 97,152, 87,224,124,118,124, 93,114,114,114, 4, 0,136, 68,162, 12, 0,200,203,203, 51, 84, 84, 84,212,113, 10,197, 98, + 49,243,212, 83, 79, 5, 51, 12,131,228,228,228, 8, 30,143,199,192,241,168, 70,205,158, 61,123,174,121,122,122,238, 88,182,108, +217,216,132,132,132,171, 29, 58,116,136, 80, 42,149,197,106,181, 90,173,209,104, 24, 14,135,195,243,246,246, 22, 30, 62,124,248, +207,180,180,180,129, 50,153,108,199,158, 61,123,174, 57,114,222, 36, 18, 73,158, 74,165,106, 97,126,166,214, 34,171,176,176, 16, + 12,195, 32, 43, 43, 11, 98,177, 56,199, 85,179, 46,139,166,131,185, 82,101,235,188,216,238,115, 87,100, 89, 11,131,195,135, 15, + 59,157, 67,203, 93, 78,107, 81, 52,107,214, 44,172, 93,187,182,158,163,181,120,241, 98, 0,192, 7, 31,124,224,118, 31, 45,179, +123, 85,184,214, 7, 65,111,148,213, 9, 59, 0, 16,230,240, 53, 44,207,131,162, 40, 44, 92,184,176, 94, 39,117,235,166, 61, 55, +155,248,234,132,179,184,184, 24, 20, 69,193,199,199, 7,227,198,141,195,224,193,131, 45, 77,144, 13,229,189,113,227, 70,202,187, +239,190, 27,219,190,125,123, 44, 90,180,168,204,203,203,203,227,229,151, 95,166, 42, 42, 42, 8,103,142, 22, 43,180, 88,176,104, + 4,161,101,206, 96,238,142, 58,116, 80, 88, 14, 68,221,185, 54, 42, 85, 42,213,184, 65,131, 6,253,178,107,215, 46, 81, 84, 84, + 20,110,220,184,129,178,178, 50,232,116, 58,240,120, 60, 4, 7, 7,163,162,162, 2,155, 55,111, 86,171, 84,170,113, 0, 42, 93, +112,190,223,165, 75,151, 13,159,125,246,153, 48, 62, 62, 30,101,101,101, 80, 40, 20, 22, 33, 68, 16, 4,100, 50, 25, 68, 34, 17, +206,158, 61,139, 67,135, 14,169, 1,188,239,130,211,158,154,131, 94,175,183, 8, 46, 55,132,150, 53,167,196,236,234,168, 84, 42, + 0, 48, 52,107,214, 44, 8, 0,178,178,178, 0,224, 78,100,100,228,130,168,168, 40, 98,251,246,237, 12,195, 48,135, 28,136, 44, + 11, 39, 65, 16,101, 12,195,148, 3, 8,210,233,116, 60, 0,168,172,172,212,251,249,249, 5, 8, 4, 2, 90, 36, 18,209, 66,161, +144, 46, 40, 40, 48, 26,141, 70, 30, 0,244,234,213, 75, 7,160,208,102,141, 66,107, 78,154, 97,152,170,141, 27, 55, 46, 24, 63, +126,124,247, 30, 61,122,180,127,237,181,215,174,188,244,210, 75,100,104,104,168,119,117,117,181,230,214,173, 91,229, 43, 86,172, +168, 62,125,250,244, 64, 46,151,123,119,227,198,141, 11, 0, 84, 17, 4, 65,219,227, 52, 26,141,191, 39, 37, 37, 77, 74, 72, 72, +160,242,243,243, 81, 84, 84,100, 17, 89, 69, 69, 69,136,137,137, 65, 90, 90,154, 73,175,215, 39, 53, 32, 62, 27, 11, 44,103, 77, + 37,132, 49,231,117, 71, 2,203, 92,153,114,151,211, 90, 20,141, 26, 53,170,142,139,197,227,241,240,211, 79, 63,217, 45, 55,236, +228,171, 58,247,110, 61,199,215,187,239,190, 91, 71,180,205,155, 55,207, 97,113,230, 42, 62,205, 60,149,155, 66,235,142, 58,116, +144,207,157,133,211, 92,118,114,185, 92,204,155, 55,207,109, 71, 11,245,251,104,213,227, 52,223,123,159, 62,125,160, 82,169, 44, + 66,214,145,163,229, 42, 62, 77, 38,211, 27,107,215,174,101,100, 50,217,163, 85, 85, 85,207,231,228,228,108, 85,169, 84,143, 84, + 86, 86, 58,117,180,180, 90,173,128,205, 71, 44, 39,154,102,126,174,255,142,208,170,125, 73,162, 89,179,102,117,214,206, 34, 73, +178,206,214,144,126, 6,181, 56,156,153,153,249,204, 99,143, 61,246,221, 27,111,188,225, 17, 31, 31,207,109,209,162, 5,148, 74, + 37,178,179,179,113,245,234, 85,227,158, 61,123,170, 84, 42,213,243, 0,220, 25,117,182,237,218,181,107,135,134, 12, 25,242, 97, +183,110,221, 94,157, 63,127, 62,167,117,235,214,168,172,172,132,183,183, 55, 2, 2, 2,112,243,230, 77,236,221,187,215, 84, 90, + 90,186, 1,192,199,176,211,134,234,170,194,175,215,235, 49,102,204, 24,208, 52,141,213,171, 87,195,157, 5,149,173,160,215,235, +245, 12, 0,162,182, 63,151,170,118,118,105,220,186,117, 11, 0,238, 70, 68, 68,120, 0, 64, 82, 82, 18,129,154,249,181,220,169, +225, 51, 12,195, 88,156,173,152,152,152,108,219,194,209,236,100,153, 93, 48, 87,225, 38, 8, 66,195, 48, 76,177, 74,165, 26, 50, +107,214,172, 15,191,252,242,203,177, 95,126,249,101,189,227,100, 50,217,142,149, 43, 87,126, 60,122,244,232, 98,130, 32, 28,246, + 35, 83, 42,149, 31, 76,152, 48, 97,244,229,203,151, 61,132, 66, 33,148, 74, 37,228,114, 57,244,122, 61, 34, 35, 35, 81, 92, 92, +140,109,219,182, 85,171,213,234,143,216,236,248,207,192, 90, 24, 56,114,181,220, 16, 89, 14, 93,157,125,251,246,217,157,163,170, +161,156,182, 98,195,221,185,173,156, 85,138,204,211,210,216,155, 50,162,129,229, 90, 61, 94,138,162,240,233,167,159, 90, 38,109, +181,231,100, 53,196,209, 50,115,250,248,248,212,216,228, 98, 49,104,154,198,240,225,195, 31,132,151, 6, 48,221,106,198,247, 37, +179,103,207, 94, 16, 19, 19,211, 26,128,192, 58, 14, 26,232,226,179, 96,193,194,149,208, 50,153, 76,121,109,218,180,169, 83,192, +185, 90,204,212, 96, 48,228,185,121,221, 67, 74,165, 50,114,229,202,149,111, 74, 36,146,129, 42,149, 42,182,182,224,184,172, 84, + 42,147,180, 90,237, 26, 52,108, 17,232, 18, 0,175,159, 62,125,122,245,144, 33, 67, 22,247,239,223,255,217,183,222,122,139, 96, + 24, 6,235,215,175,103,110,223,190,253, 99,173,139,117,251,126, 34,201,199,199,231,218,230,205,155, 3,127,249,229, 23, 24, 12, + 6,172, 89,179, 6, 30, 30, 30,215,202,202,202,220,165, 40, 62,122,244,232,150, 30, 61,122,188,144,150,150,182, 13,192, 31, 39, + 78,156,216,218,179,103,207, 9,105,105,105,223, 3,184,122,236,216,177,173,221,186,117,155,144,158,158,190, 27,192,197, 6, 20, +190, 22,103,203,104,180,223,210,232,192,201,114,198, 89,197, 48,140,126,242,228,201,111,141, 30, 61,250,235,244,244,244, 71, 42, + 42, 42, 98, 1,192,203,203,235,114,215,174, 93,207,238,218,181,235,102,173,147,229,170,179,126,137, 82,169,124, 42, 54, 54,246, +231, 69,139, 22, 73,218,183,111, 79,181,106,213, 10,119,238,220,193,149, 43, 87,140,223,126,251,173, 66,173, 86, 63, 9,160,156, +205,142,255,156,208, 98, 24, 6, 94, 94, 94,117, 42, 81,230, 33,255, 13,109, 46,180,126, 49,155,151,234,177,229,117,196,233,108, +218, 4, 51,164, 82,169,101,114, 83,119,186, 44,208,180,243,249,216, 24,134,177,112,154, 55, 55, 68,150,203, 17,130,181, 75,224, +184,205,233,206,244, 14, 18,137, 4, 6,131,193,194,235,198,200,207,134,170,197,125, 0,246, 25, 12,134, 91, 0, 90,178,226,138, + 5,139, 38, 20, 90,229,229,229, 93,154,248,218, 85, 90,173,246, 99,173, 86,251,177,121,135, 70,163,121, 80,206,219, 0, 70, 31, + 61,122,244,179,163, 71,143,154,219, 17, 22,194,245,122,137, 78,113,227,198,141, 4, 46,151,251,213,142, 29, 59,186, 49, 12, 3, + 79, 79,207,211,119,238,220,121,185, 33, 28, 38,147,105,114, 90, 90,218, 52,212,246,101,210,235,245,147, 83, 82, 82,222, 68,205, +122, 76, 48,153, 76,147,207,156, 57, 99,249,221,192, 23, 37,195, 48,140,150, 97,152, 16, 7,135,104, 27,232,192,153,157, 45,221, +174, 93,187, 20, 0, 46,225,175,121,178, 12,181,155,198,166,185,208, 25,142, 41,149,202, 86,243,230,205, 91,194,225,112, 6, 40, +149,202, 80,137, 68,146,107, 52, 26,127, 87,169, 84,239,163,102,141, 42, 22,255, 16,116, 58, 93,126,155, 54,109, 40,123, 21, 40, +103, 47,114,103, 21, 43,147,201,148, 23, 29, 29,237,178,114,102,135, 51,223,137,104,184, 27, 25, 25, 73,186,203,101,134, 94,175, + 47,118, 22,206,200,200, 72, 52,148,211,213,189, 71, 68, 68,216,189,119, 23,130,208,225,189, 27,141,198,251,226,116, 22,159,206, +160, 86,171,203,253,253,253, 21, 26,141,134,171,213,106,185, 70,163,177,142,253, 40, 18,137, 74,212,106, 53,155,121, 88,176,120, + 16,161,245,144,227, 28,106,150,151,104, 44,104, 47, 95,190,252,130,197,158, 42, 46,190, 95, 30, 91, 37,169,112,241,187, 33,194, +168,209, 29,161, 90, 33,165,106, 36,186, 82,133, 66,241,146,249,135,185, 15, 8,139,127, 30,114,185,252,209,198,230, 44, 43, 43, +107,244,138, 90,105,105,105,247, 38,184,247, 46,255, 85, 78,103, 40, 40, 40,120,212,133, 16, 99, 51, 14, 11, 22,110,130,100,163, +128, 5, 11, 22, 44, 88,176, 96,193,162,105, 64,160,102,228,128, 61, 52,100, 52,193,192,251,184,118, 18,203,201,114,178,156, 44, + 39,203,201,114,178,156,255, 57, 78, 87,220,236,104,198, 38, 22, 96, 44,231,255, 63, 39, 7, 0, 33, 18,137, 8,161, 80, 72,136, +197, 98,130,141, 79,150,147,229,100, 57, 89, 78,150,147, 69,125,252,227,125,180,252,253,253,147, 41,138,138, 86, 42,149,202,234, +234,234, 40, 15, 15,143,219, 18,137, 68, 98, 52, 26, 51, 75, 74, 74,122, 63, 32,253,100,129, 64, 48, 51, 46, 46,174,221,205,155, + 55, 51,170,170,170, 86, 0,248, 6,246, 71, 12,113,109,246, 19, 0,226,155, 55,111,190, 85, 40, 20,138, 51, 50, 50,230, 0,248, +222,141,120, 36,224, 98, 68,146, 53,188, 37, 60, 46,106,250,147,245, 5,112, 28,192,190,114,165,222,240, 32, 55,125,191,156, 82, +169,212,167,101,203,150,235, 35, 34, 35, 35, 25, 64,203, 48, 53,243, 15, 25, 13,122,222,213, 43, 87,146,239,220,185,179,161,127, +255,254, 95,135,133,133, 5,114,185, 92,131,121,212,151, 74,165,226,109,219,182,173, 21,155,157, 88,176, 96,193,130, 5, 11, 55, +133,150,164, 57,218,240, 37,196, 54,147, 1,106,163,150,153,170,204,197, 13,105, 51,244, 96,128, 23, 24, 32,130,228,144,254, 38, + 19, 93, 72,107, 8, 35,215, 32,138, 38, 25, 74, 88, 85, 85, 21,218,224, 0, 80, 84,116, 65, 65, 65, 64, 72, 72,136,121,241, 99, +137,249,247, 3,128, 0,240,197, 43,175,188, 50,245,213, 87, 95,133,183,183, 55, 12, 6, 67,235,157, 59,119,110,154, 55,111, 94, +119, 0, 47,218, 17, 67, 12,234, 78, 18,218, 58, 54, 54,118,127,106,106,170,111, 69, 69, 5, 58,119,238,188,162,184,184,216,145, +208, 50, 54, 52,128,222, 18, 94, 27, 0, 47, 6,121, 9, 38,125, 51,171,191,119,139, 1,175,225,202,143, 11,166, 77,255,230,114, + 57,128,205, 0,190, 41, 87,234,111,254, 93,156, 30, 30, 30, 1,109,162,163,119,253,248,243,207,189, 79, 31, 59, 6, 31, 1, 31, + 18, 17, 31, 96,128,192, 86,109,240,218,236,217,198, 71, 30,121,164,223,119,223,125, 23,151,158,158,142,208,208, 80,136, 68, 34, +136,197, 98,200,229,114,108,219,182,237,190,211, 17, 77,211,247, 0, 28, 37,141,216,167, 40,192, 45, 54, 91,178, 96,193,130, 5, +139,127,189,208, 98,104,172, 88,125, 96,114,231, 43,101,191,225,139,103, 10,151,138,194, 96,236, 49, 34,250,233,132,137,157,224, +233, 47,134, 80, 74,161, 66, 94,213,225,230,133, 92, 28,223,253, 39,188, 13,173,145,246,251,249,235, 42,149,170,237,253, 4, 68, + 44, 22,139,131,131,131,139,196,214, 11,227,221, 31,132, 0, 86,188,250,234,171, 83,223,121,231, 29,252,254,251,239,216,179,103, + 15,198,143, 31,143, 25, 51,102, 64, 42,149, 78,154, 49, 99, 70, 26,128,175,157,112,180,142,141,141, 61,149,154,154,234,171, 86, +171,113,229,202, 21,148,149,149,253,209, 88,145,238, 45,225, 45, 91,255,114,220,187,221,158,158, 14,255,246,131, 64,144, 53,143, +161,215,236,189,184,248,166,218, 59, 47,229,187,183,246,252,248,253, 91,203,247,220, 90, 94,174,212,207,249, 59, 56,163,162,162, +214,237,250,233,167,222, 97, 97, 97,216,159,125, 27, 45, 35,130,209,172, 77, 39, 84,102,223, 70,201,221, 44,232,244,122,244,237, +219, 55,238,212,169, 83, 40, 40, 40,128,159,159, 31, 52, 26, 13,210,211,211, 33, 20, 58, 94,141,163, 1,233,104,200,177, 93,183, +150,223, 58, 95,178, 76,153,131, 15, 1,152,216,236,249,175, 65,235,102,205,154,253, 44, 18,137,100, 25, 25, 25, 31, 0,216,210, +132,215, 26,215,173, 91,183, 53,151, 46, 93,186,160,213,106,223, 4,144,193, 70, 63, 11, 22, 44,254, 73, 56, 27,117, 24,236,239, +239, 7,191, 72, 46,188,125, 36, 67,151,255,244,252,211,175, 45, 29, 0, 94, 84, 62,202,164,103,112,151,249, 29, 26,223,155,104, + 51,132,135,183,191,233, 7,223,238,114,192, 71, 85,128,112, 8, 28, 17,250,248,248,252, 28, 16, 16,144,106,189, 25,141, 70,225, +156, 57,115, 76, 25, 25, 25,146,130,130,130,128,140,140, 12,201,156, 57,115, 76, 70,163, 81,232, 31,232,115,193,163, 57, 47, 47, +162,183,168, 68,210, 28,175,187,112,176, 62, 11, 10, 10, 82,141, 29, 59, 86,221,161, 67,135,169, 12,195, 96,235,214,173,120,249, +229,151,119,254,246,219,111, 17, 99,198,140,217,122,244,232, 81, 76,153, 50, 5, 94, 94, 94, 51,220, 21, 89, 23, 46, 92,192,132, + 9, 19, 74,140, 70,227,140, 70,140,247,137,163, 86,156, 65,200, 35,207,130,195, 19, 89,214, 82, 35, 72, 18, 92,145, 12, 97,143, + 61,143, 87, 22,127, 7, 0, 19,255, 46,206,200,168,168,150,231,146,147,241,237,194, 69,104, 29, 16,128,208,102,161,240,105,211, + 1, 30,254,126,160, 40, 10, 12, 3,134,207,231,211,229,229,229,144,203,229,144,203,229,200,206,206,198,241,227,199,113,239,222, + 61, 52, 70, 58,154,253,109,127, 50,225,181,182,239,137,155,225,160,179,116,196,226,225, 18, 89,177,177,177,167,110,220,184, 17, +147,148,148, 20, 18, 26, 26,250, 73, 83, 94,172, 75,151, 46,203, 79,158, 60,233,115,240,224,193, 65, 65, 65, 65,201, 0, 90,223, + 79,152,155, 55,111,126,189,117,235,214,121, 0,198, 53,114, 16, 39,118,239,222,189,140,207,231, 31,186,207,176,177, 96,241, 48, +161, 3,128, 88, 86,104,185,129,197, 59,199, 82, 62,109,181,184, 82,126, 0,187, 62,249, 3,159, 12,189, 73, 47,238,158, 77,127, +254,194, 13, 28,222,245, 7,138,241, 7,134,189,214, 18, 99, 63,232, 56, 80,108,194, 34,153, 76,118,193, 30, 15,143,199, 11,204, +200,200,240,205,202,202,242,189,125,251,182,111,102,102,166,239,181,107,215,138, 42, 42, 42, 20,195,135, 15,167, 1, 96,248,240, +225,244,221,156,187,170, 65, 79,247,161,195, 7,160,227,172,159,218,133,206, 73,236,228,231, 29, 44,152,235,232, 30, 56, 28,206, +158, 47,191,252,242,173,220,220, 92,209,247,223,127,143,244,244,116, 68, 69, 69, 97,209,162,133,229, 35,122,180,237,245, 72,148, +239, 42, 79, 17,247,179, 45, 91,182, 64, 44, 22,163, 99,199,142,142, 92,183, 22, 29, 58,116, 72, 49,139,172,139, 23, 47,226,249, +231,159,215,203,229,242,171, 0,150, 1,216, 67,145, 68,178,191,167,164, 66, 34,160,238, 18, 4, 14,160,166,207, 87,120,195,163, +158, 64,229,221, 75, 48,233,213,160, 4, 18,112,120, 66,144, 20, 31,101,183,210,144,241,235, 66, 84,100,221,207,194,225, 15,192, + 73,146, 26, 79, 46, 23,113,126,190,136,141,136,132,143, 80, 6, 85,218, 49,160, 66, 1, 30, 79, 0,128,129, 64, 32, 64,117,117, + 53, 46, 92,184,128,235,215,175,227,220,185,115, 56,123,246, 44,138,138,138,112,191,233,104, 73,143,108,173,163,116,196,150, 81, +255, 14,145,149,154,154,234,171,209,104,112,227,198, 13,148,148,148, 92,108,202, 11,102,100,100,148,167,166,166, 34, 44, 44, 12, +223,127,255,189,127, 68, 68,196,201, 6, 10,154,214,177,177,177,167,174, 95,191, 30,147,148,148, 20, 26, 16, 16,176,162, 49,195, +247,200, 35,143, 44, 62,121,242,164,247,225,195,135, 7,251,251,251,223,175, 16,100,193,226,255, 25, 2, 0, 47, 16, 4,113,182, + 67,135, 14,151,219,183,111,255, 7, 65, 16,105, 0, 70,225,223, 59,119,167, 83, 88,110, 58, 49, 49,241, 4, 0, 36, 36, 36,244, +177, 61, 72, 17,112, 30,249,217, 69,216, 60,177,152, 86,151,160, 98,209,123,159,237, 57,127,250,226, 83,111,206,120,211,123,245, +198,229,216,158,118, 0, 99, 86, 24,209,107,116, 59,156,217,159,243,214,196,126,115,241,214,140,217, 64,253, 33,154, 12, 73,146, + 72, 73, 73,129,201,100,130, 78,167,131, 78,167, 67,187,118,237,202,142, 29, 59, 38, 5,128,204, 63, 51, 24,174,175, 78, 48,240, + 29, 25,111,202,128, 24, 40,228,122,124,247,110, 38, 74,179,181, 63,214,114, 36,213,145, 7, 36,249,245,134, 13, 27,158,152, 50, +101, 10,190,248,226, 11,236,220,185, 19, 79, 62,249, 36,158,123,238, 57,148,148,148,120,135,226, 30, 6,180,243, 11,233, 59,125, + 67,159, 49, 99,198, 64,161, 80, 32, 61, 61,253,186, 77,184,146, 80,211, 25,254,245,227,199,143,251,168,213,106, 84, 87, 87,163, +111,223,190,144,203,229, 60, 0,253,237,196,157, 39,128,230,106,181, 26, 45, 90,180,104, 93, 82, 82,210,195, 14,103, 61,120, 75, +120, 22,113,171, 87,150, 67,175, 44, 7,135, 39,132,208, 59, 12, 87,191,155, 1,134,174,105, 49,243, 12,239,104,239,244, 38,227, + 20, 11, 4, 72, 76, 77,193,241,196,125,104, 27, 25,137,158,177,177, 56,117,249, 10,120, 36,129,145,147, 38, 3, 52, 19,144,146, +146, 66,148,148,148,224,242,229,203, 88,184,112, 33,114,114,114,112,224,192, 1,152, 76, 38,183,194,105,147,142, 84,139,222,251, + 44,123,236,179,207,223, 60,120,228,183, 59,137,191,255, 52,104,123,218,209,248, 49, 43,140, 68,175,209,237,112,246, 64,206,204, +108,162,252, 91,101, 46,110, 56,227,124, 64,176,156, 77,199,217,190,125,251,246,167, 83, 83, 83,197,106,181, 26,187,119,239,198, +252,249,243, 13,122,189,158, 2,176,199,206,185,233, 0,190, 64,253,165,183,236,133, 83, 6, 96, 26,128,174,245,210,152, 66, 81, +242,204, 51,207, 24, 22, 44, 88,192,125,252,241,199,177,111,223, 62,191,145, 35, 71, 94,204,200,200,136,199, 95,205,136, 73,174, +132,225,125,116, 25,112, 43, 62,107,133, 96,112,104,104, 40,182,111,223,238, 63, 97,194,132,228,162,162,162,222,176,223,196,201, +166, 37,150,243, 97,226,108, 1,224, 85,169, 84, 58,165,111,223,190,222, 79, 62,249, 36,124,125,125, 97, 52, 26,145,155,155,219, + 45, 49, 49,177, 91,106,106,106,129, 78,167, 91, 11, 96, 19,128, 10,123,164,206,180,200, 67, 45,180, 18, 19, 19, 25,212,140, 80, +179, 11,149, 73,142,248,224,161,232,246,187,148,172, 40,171,210, 47, 24,185,244,104, 69,142,254,169,175,190,250, 10,207, 61, 49, + 1,251,126, 23,227,244,206,189, 24, 56,190, 16, 3, 39, 71,226,207,147,142,187, 69, 24, 12, 53,131,223,140, 70, 35, 12, 6, 3, +244,122, 61,244,122, 61,196, 98, 49,174,221,188, 2,163,119, 9,231,249, 53,173, 56,161,109, 36, 72,221, 89,136, 3,171,115,116, +138, 98,195, 92, 93, 57,126,170,103,223, 0, 95,175, 90,181,106,210,148, 41, 83,176, 96,193, 2,252,244,211, 79,204,138, 21, 43, +136,121,243,230,161,188,188, 28,253,250,245,195, 43,147,159,199,181,184, 16,188, 59,127,177,108,212,168, 81,248,248,227,143,161, + 84, 42, 87, 57, 8,158,151, 78,167,179, 44,118,155,151,231,122,233,198,156,156, 28, 48,206,151, 82,131,183,132, 39,244,146,240, +150,112, 72,226, 57, 14, 1,127,131,137,193,241, 5,189,192,137, 25,137,249,107,119,194, 68, 51, 24,247,212, 32, 68, 42,170, 32, + 18, 75,106, 20, 41,109,186, 47,206,232,161,111,130,228, 10, 97,210,107,176,101,203,102,236, 57, 84, 1,157,252, 14, 94,123, 60, + 10,129, 78, 56,141, 70, 35,211,188,121, 27,180,108,175, 3, 35,224,225,216, 93, 45, 98,251, 36,224,198,181,219,200,175,212, 35, + 46,182,125,139,201,147, 95,132, 64, 32,192,237,219,183,177,100,201, 18, 40,149, 74,119,215,133,179,151,142,164,171, 95, 91, 43, +124,245,197,215,222,187,144,126, 49,119,235, 23,187,126,153,246,238,148,175, 79,239, 60, 24, 59,112,124, 33, 6, 76,138, 36, 55, + 92, 42,127, 22,192, 2,182,130,248, 80, 98,195,153, 51,103,196, 42,149, 10,213,213,213,120,249,229,151, 49,109,218, 52,174,189, + 74, 75,113,113, 49, 82, 82, 82,158,156, 62,125,250,152,194,194,194,222,112,190,238,165,119,167, 78,157, 82,143, 29, 59,214,218, +195,195,195,178,147,166,105,232,245,122, 75,153,162,213,106,161,213,106, 33,147,201,144,154,154, 42,244,241,241,217, 5,231, 77, + 24,127, 71,151, 1, 84, 85, 85, 61, 59,106,212,168,228,109,219,182,249, 71, 70, 70,226,251,239,191,247,127,241,197, 23, 79,222, +189,123,183, 23,216,254,100, 44, 30, 94,204,121,230,153,103, 22, 7, 6, 6,146, 29, 58,116, 64,112,112, 48,180, 90, 45, 42, 43, + 43,193, 48, 12,252,252,252, 48,105,210, 36, 60,245,212, 83, 33,201,201,201,203,143, 29, 59,182,160,188,188,124, 51,128, 53, 0, + 50,173, 68,150, 83, 45,242,208, 59, 90, 9, 9, 9, 39,234,168, 24, 2,233,103,254, 56, 21, 43,140, 1, 8, 18,200, 37,143,129, + 0,129, 10,131,158,103,168, 34,215, 30, 62,124,216, 91,169, 84, 66,161, 80, 96,104,223, 17,152,187,225, 23,244,124,190, 10,205, +218,132, 96,245,135, 7, 12,174,132, 22, 77,211, 48, 26,141,168,174,174, 38, 79,156, 56,225, 23, 30,209,140,120,254,173, 33,152, +254,125, 59,200, 2,120, 56,248,121, 14,202, 83, 67,148, 76,105,197, 29, 93,121,217, 86, 59,133,239,228,247,223,127,127,210, 27, +111,188,129,229,203,151, 99,217,226,143, 79,135, 4, 5, 62, 18, 31, 31, 79,124,244,209, 71,152, 61,123, 54,194,195,195,193, 17, +120,160,101,223,231, 49,107,214, 44,172, 93,187, 22, 95,173, 94,170,111,231, 35, 77,187, 86, 86,111,181, 27, 3,128, 69, 3, 6, + 12,120,226,240,225,195, 62, 66,161, 16, 87,175, 94,197,248,241,207, 67,204, 5,184, 28, 18, 96,104, 48, 52, 13,130, 96,224, 47, + 19,192, 91,196,129,191, 7, 23, 49,126,116,251,114, 70,218,250,106,153, 34,195,158, 32,242,245,224, 95,221,241,193,136,176,216, + 73, 95,240, 40,129, 20,218,202, 66,252,182,102, 26, 22, 45,254, 26,167, 82, 79,163,162,162, 2,131, 7, 14,192,154, 81,126,127, + 89,127, 78,196,155, 35,206, 27,187,222,195, 43, 83,167, 99,227,250,117, 32,185, 66,252,118,226, 28, 14, 31, 61,137,148,148, 20, +188, 52,113, 44, 62,143, 46,116,200,105, 50, 25,224, 31, 16,142,199,250, 68, 65,234, 33, 5, 73, 0, 45, 34,252,225,231,155,135, +160, 32, 2,105,167,143, 34, 57, 57, 25, 30, 30, 30,136,136,136,192,218,181,107,145,157,157,141,151, 95,126, 25,124, 62,223, 33, +175,163,116,164, 32, 12, 32, 76,252, 86, 30, 30, 30, 59,116, 58,221, 42,189, 94,191,247,249, 81,147,119,188,188,228,231,118, 61, +159,175,226, 52,107, 19, 2,130, 65, 31, 86,104, 61,180,144, 24, 12, 6,152,215,115,206,205,205,117,122,112, 92, 92, 28,182,108, +217,210,110,226,196,137,201,133,133,133,143,193,254,162,242,178, 78,157, 58,165, 38, 39, 39,183,214,104, 52,200,202,202,114, 43, + 32,181, 11, 35, 43,157, 28, 98,238, 50,224, 99,221,101,160,172,172,204,220,101,192, 30,202, 80,179,142,234, 93, 59,255,133, 3, +120,179,182,134, 15, 59,194,242,234,248,241,227,123,110,223,190,157, 23, 21, 21,133,125,251,246,249,141, 26, 53, 42, 37, 35, 35, +163, 43,128,108, 54,233,176,120, 8, 49,113,225,194,133,164,201,100, 66,105,105, 41,180, 90,109,189, 60,200, 48, 12,196, 98, 49, +134, 14, 29,138, 33, 67,134, 8,206,159, 63, 63, 53, 41, 41,233,213,172,172,172,249,181,121,201,174, 22,249, 87, 9,173,122, 47, + 94, 10,139, 62, 29,147,234, 37,144,146,177,160, 9, 47, 63,191, 0, 9,151,203, 37,188,196,129, 94,171, 86,206, 46,187,121,243, +230,189, 93,187,118, 5,119,239,222, 29, 96,128, 78,205, 6, 67, 94,120, 26, 94, 92, 53, 74,229,165,142,230,145, 98,126, 61,176, + 91, 82, 94, 94, 73,183,137,108,167, 86,169, 84,228,129, 3, 7,194,122,245,238,201,219,155,250, 29,241,236,178, 96,200, 2,120, +248,109,237, 93, 92,252,222, 64, 79,155, 56,162,242,207, 75,107,170,237,213,112,121, 60,222,140, 55,222,120, 3, 59,119,238,196, +156, 57,115,182, 60,213,173,229,160,103,134,245, 37, 83, 82, 82, 48, 98,196, 8,228,231,231,227,151, 95,126,193,252,249,243, 49, + 97,194, 4,124,241,197, 23,184,240,227, 39,184,190,164, 43,111,238,206,219,215,232,155,196,240, 27,165,213, 7,109,104,179,111, +220,184,241, 88,255,254,253, 79,238,221,187,215, 47, 38, 38, 6,219,182,109,199,204,215, 95,197,143, 11, 70, 33, 58, 80, 12,232, + 21,160,117, 42, 16, 60, 17, 96, 80,131, 41,191, 11,189, 94, 45,125,119,199,237,235, 38, 59,156, 94, 18,222,146,239,223,127, 34, +172,211,212,109, 60,243,190, 91,183,239, 96,237,241,114,156, 74, 61, 13,115, 19, 69, 72,128,183,109, 84, 57,124,104,246, 56, 9, +146, 66,199,151,190,198,220,170, 4, 28,218,188, 4, 67, 95, 94, 8,121,105, 49, 82, 83, 83, 17, 26, 26,138,207, 55,110,198,140, +233, 83, 97,162, 25, 71,207,156,215,166, 77, 36, 56,156, 2,240, 5, 52, 8, 0,122,125, 57,252,252, 40, 52,107,230, 7,128,176, +184, 87, 4, 65, 96,216,176, 97,122,134, 97,138, 52, 26, 77,233,174, 93,187, 8,103,233,232,147,209,169,161,124, 49,249, 40, 1, +210, 51, 32, 32,144, 16, 8, 5, 8,244,142,192, 7,111,190, 6,197, 11,234, 71,183,109,219,182,235,219,111,191, 45, 72, 77, 77, +221, 78, 8,124,110,203, 11, 21,209, 94, 92, 53,192,144,205, 1,154, 45,194, 30, 78,140,126,228,145, 71, 46,254,246,219,111, 66, + 62,159,143,189,123,247, 98,254,252,249,134,178,178,178,147,182,162, 39, 48, 48,176,253,214,173, 91, 35, 34, 35, 35,177,110,221, +186,118, 35, 71,142,156, 6, 96,137, 29,206,105,199,142, 29,107,173,209,104,112,241,226, 69, 76,152, 48, 33,187,168,168,232,170, +173,192,139,136,136,232,181, 98,197, 10,110,231,206,157, 81, 85, 85,133, 65,131, 6,169, 0,188,234, 36,172, 13,233, 50, 0,160, +102,173, 63, 7, 93, 6,224,235,235,251, 77, 78, 78, 78, 63,145, 72,228, 52,130,244,122, 61,242,242,242,224,229,229,133,196,196, + 68,159,150, 45, 91,126, 0, 96, 50,155,116, 88, 60,140,208,233,116,216,185,115, 39, 58,117,234,132,182,109,219, 66,161, 80, 88, + 68,151, 78,167,131,209,248,215, 44, 72, 36, 73,162,107,215,174,136,142,142, 38,102,206,156, 57,206, 90,104,253, 27, 97,126,233, + 46,176,109, 23,213,100, 35, 23,192, 56, 90, 36,120, 95, 40, 20,142, 14,111, 30,139, 54,109,218, 8,159,126,250,105,190, 78,167, +147,158, 56,154,252,103,207,158, 61, 81, 86, 86, 22, 60,103,206,156,178,176,102, 97,116,242,164,114, 95,130, 41, 7, 71,199, 79, + 1,234, 47, 58,170,229, 84, 55,223,251,231,242, 96, 0, 56,158, 22, 81,253,204,160,177,165, 28, 14,135, 58,125,227, 24,209,123, + 6, 5,255, 22, 34,164,237, 46, 4, 63,187, 51, 34, 3, 43, 33,147,201, 28,206, 79,213,177, 99,199,118, 36, 73, 98,231,206,157, + 0,240,193,141,236,194, 75,146, 35, 39, 62,219,179,120, 11,247,221,247, 63,196,220,185,115,241,210, 75, 47, 65,175,215, 99,249, +242,229, 72, 77, 77,197,175,191, 28,135, 49,105, 46, 86, 60, 93, 70,190,252,157,230, 87,189,201,219,255,118,121,121,181, 13,117, +198,173, 91,183,122, 13, 29, 58,244,228,238,221,187,253, 90,183,110,141, 21,107,191,196,248, 55,167,224,236,210, 65,128,200, 7, +188,222,239,130,240, 10,175,145, 67,101, 89,192,225,119, 29,114,114, 72,226,185,216,137, 95, 88, 4, 81, 70, 70, 6,166,207,122, + 7,191, 29, 60, 12,115, 19,197,204, 55,167, 99,235,218,143,161, 60,179, 1, 66,159,102,144, 4, 68,161,234,238, 37, 0,144,219, + 28, 42, 43,123, 0, 0, 32, 0, 73, 68, 65, 84,187,119, 91, 78, 0, 80,203,239, 66,113,239, 38, 34,135,188,137, 15,198,141,199, +208,151,129,181,139,222,193, 11, 19,198,224,243,141,155, 17, 25, 25,137,207,215,111,194,228,201,147,100, 85, 57,185,173, 97,211, + 76,113, 46,253,194,141, 85,171, 23,138, 85, 42,165, 39,143,207, 15, 2,195, 32, 56, 56, 24, 85, 85,213, 48, 24, 12, 80, 42, 85, + 32, 73, 18, 36, 73,130,195,225, 96,196,136, 17,188,228,228,228,102,127,252,241,135,127,173, 5, 28,109,109, 1,155,161,201,198, +216,103,158,121,102,112, 96, 96, 32,233,235,235,139, 62,125,250,192,100, 50, 65,171,213,130,166,105,240,249, 38,139,165,124,242, +228,201, 57,122, 83,184,113,203,132, 36, 13,135, 40,215, 82, 90, 97, 82,227,173,105,205,226,111, 70, 70,102,102,102,252,192,129, + 3, 79,254,248,227,143,126,195,134, 13, 67,203,150, 45,185, 79, 63,253,180,191, 74,165, 26, 96,125, 96, 81, 81,145,247,132, 9, + 19,206,229,230,230, 70,212,238,234,234,128,179,171,135,135, 7,178,178,178,204, 34,171,139,109, 37,140,207,231, 31,186,116,233, + 18,151,207,231, 35, 61, 61, 29, 19, 39, 78, 44,205,206,206,118,213, 44,119, 95, 93, 6,104,154,214,218,251,143, 36, 73,193,249, +243,231,225,106, 46, 64,146, 36,193,227,213,201,198, 21,108,178, 97,241,144,194,160,211,233,208,165, 75, 23,100,103,103,227,252, +249,243, 22,193, 85, 90, 90,138,130,130,130, 58, 7,159, 61,123, 22, 23, 46, 92, 64,239,222,245,230, 36, 95,240,111,236,163,101, +113, 34, 18, 19, 19,251,216,216,118,124,137, 68,114,246,185,231,158,107,246,244,211, 79,123,113, 56, 28,104, 52, 26, 24,141, 70, +164,165,165,161,109,219,182,170,118,237,218, 85, 12, 31, 62,156, 40, 45, 45,237,127,245,234,213,172,210,210,210,120,153, 76,150, +245,216, 99,143,105, 52, 26, 77, 61,165,229, 21, 69,233,150, 95,236,198, 3,128,228,237, 5,200,217,239,163, 48,168, 77,226,200, +145,149,100,159, 9, 33,168, 42,214, 99,245,179, 55,240,235,166,163, 88,241,217, 10, 83,239,222,189,243, 22, 47, 94, 92, 80, 80, + 80,240,152, 45,151,167,167,231,181,228,228,228,182, 71,143, 30,197,236,217,179,191, 51,153, 76,203,132, 92,206,193, 73, 47,189, + 18,166,215,235,113,254,252,121,248,248,248, 32, 39, 39, 23,188,128, 56,196,246,123, 1,111,143,235,138, 56,239,114,232, 54, 15, +198,141, 2, 53,198,239,210, 46,186, 89,172,156,231, 32,110, 90,135,134,134, 38,111,223,190,221, 63, 48, 48, 16,227,158, 25,134, +180,247, 98,193, 27,186, 2,151, 74,196,248,236,251,115, 0,128,183,199,117,113,200,233, 45,225,145, 1, 50,190,225, 70,126, 53, + 9, 0,119,238,220,193,132, 23,198,227,224,161, 26,145,117,241,226, 69,140, 27, 55, 14,237, 99,162, 33, 22,242,161,173, 44, 2, +109, 50,224,110, 94, 33,242,203, 52,101, 70,154,190,202, 48,200,134, 85, 19,133, 45,231,221,187,119,177, 98,249, 98,220,186,126, + 9,122, 69, 25,120, 18,111,164,157,191,130, 62,125,250,130,161,141, 40, 47,202, 69, 78,169, 10,155,183,108, 69, 84, 84, 20, 84, + 42, 21, 70,141, 26, 85,230,164,153, 34,227,198,141, 27,209,107,215,174,197,252,249,243,241,203, 47,191,192,100, 50, 65, 32, 16, +128,162, 40,240,249,124, 68, 69, 69,225,250,245,154,241, 4, 52, 77,227,252,249,243, 72, 74, 74, 98,108, 45, 96,107, 62,147,201, +132,146,146, 18,232,116, 58,168, 84, 42,168,213,106, 48, 12, 3, 14,135, 3,134, 97, 44,181, 29, 14,135,131,172,172, 44, 92,190, +124,153,217,183,111,223, 39, 12,195,204, 97,203,176,135, 26,173, 67, 66, 66,146,183,109,219,230, 31, 28, 28,140,126,253,250,229, + 22, 22, 22, 54,183,115,220, 30,134, 97,158,204,202,202, 66, 84, 84,212, 94, 0, 35,238,231,152,240,240,240,146,244,244,116,191, +107,215,174, 97,220,184,113, 37,181,125,190, 92,245,125,138,136,137,137, 73, 63,124,248,176, 15, 73,146,184,122,245, 42,198,141, + 27,167, 47, 43, 43, 59, 5,199, 77,142,119, 80,211,191,228,174,157,255,194, 1,204, 3,224,227,224, 92, 73,116,116,116,207,115, +231,206,241, 8,130,192,157, 59,119,204,121,178, 75, 45, 47, 11, 22, 15, 27,158, 10, 9, 9,249,118,218,180,105,158,221,186,117, + 67, 94, 94, 30,242,243,243, 81, 94, 94,142,248,248,120,180,111,223, 30,183,111,223,198,161, 67,135,112,225,194, 5, 8, 4, 2, +132,133,133, 65,186, 99, 39,190, 34,112, 13, 64,123, 39, 90,228,223, 35,180,108, 33, 16, 8, 62,152, 56,113,226,140,215, 94,123, +205, 71, 32, 16,224,236,217,179,224,241,120,160,105, 26, 3, 6, 12, 64,118,118, 54, 70,140, 24, 81, 86, 88, 88,248, 52,128,147, +238, 92, 76, 22, 44, 40, 28,254,126,112, 96,239,241, 53, 53,189,228,237, 5, 56,183,183, 24,179,118,117, 4,201, 33,240,205,244, + 27, 48,101, 54,167, 91, 71,197, 48, 0,140,205,154, 53, 43,220,186,117,171, 93,161, 5, 96,242,148, 41, 83,190,153, 60,121, 50, + 78,156, 56,129, 93,187,118, 97,216,176, 97, 24, 62,124, 56,190,253,246, 91,120,201, 79,227,147, 95,175, 97,236,135, 7,112, 53, +171,198, 24,106, 31,233,139, 29, 31, 15,131,230,243,120, 48,165, 25, 72,216, 73,221, 56,246,167,194,209, 84, 15,100, 11,111,209, + 79,126,254, 94, 79,105, 24, 30, 94,237, 46,198,139, 67,226,192, 31,181,189, 65,156,173,130,165,133,215,179, 10, 2, 41,129, 20, +111,188,250, 34, 62, 90,242, 41, 76, 38, 19,170,171,171, 17, 22, 22,102, 91,163,173,135,218, 38,138, 52,235, 38, 10,107,206, 39, +135, 63,142,157,187,127,134,187,205, 20,124, 62, 31, 90,173, 22, 45, 91,182,220, 12,251,205, 20, 25,151, 46, 93,138, 94,188,120, + 49, 54,108,216,128,125,251,246,193,104, 52, 66, 32, 16, 64, 34,145, 64, 36, 18,193,207,207, 15,151, 47, 95,174,115, 82, 85, 85, + 21,102,206,156,153,137,250,195,213, 51, 46, 93,186, 20,237,204, 82, 54,247,219,179, 36, 74,130, 64,101,101,165, 35, 62, 22, 15, +161,216,226,241,120,171,253,253,253, 59,230,231,231,207, 66,253,165,172,188,159,125,246,217,171, 63,252,240, 67,240,157, 59,119, +220, 18, 90,143, 61,246,152, 93, 71, 11,192,196,160,160,160,143,171,171,171, 43, 85, 42,213, 40,184,223,193,188,117,171, 86,173, + 78,238,221,187,215, 79, 44, 22,227,250,245,235, 24, 63,126,124,137, 92, 46,239,141,198,237,164,222,186, 77,155, 54,167,206,158, + 61,235,203,229,114,145,158,158,142, 9, 19, 38,148,178,157,225, 89,252, 11,224, 1, 96,118,100,100,228,219, 83,167, 78, 21,180, +107,215, 14,121,121,121, 40, 41, 41, 65,121,121, 57, 78,159, 62, 13, 0, 8, 13, 13, 69,104,104, 40,110,222,188,137,148,148,148, + 42,133, 66, 49, 25,192, 47,255,230,136,113,216, 71, 75, 44, 22, 63,247,194, 11, 47,248,152, 76, 38,244,238,221,187, 76,167,211, +153,102,207,158,237, 31, 20, 20, 4, 15, 15, 15, 12, 26, 52,168,188,170,170,170, 59,224,254,146, 41, 2,147,236,110,241,239,193, +210,100, 20,136,123,143, 15, 65,239,241, 33,232, 58, 34, 0, 36,135,192,229,195,114,240, 75, 91,170, 94,152, 50,165,178, 89,179, +102, 6,146, 36,209,188,121,115,227,246,237,219, 29,117, 86,250,246,235,175,191,126,212, 96, 48,188,244,242,203, 47,163, 79,159, + 62, 48, 26,141,216,190,125, 59,100,185, 7,176,240,249, 46,142, 3, 98, 50,128,224, 73, 16,232,105, 10,115, 36,178,218, 6, 74, +191, 89,246,106,191,167, 6,117,240,197,222, 99, 23, 49,172, 13, 23,208, 85,223, 15,231,174, 43, 91,223,152, 26, 59,233, 75, 94, +105, 81, 30, 26,169,137,194,194,169, 85, 85,163,145,155, 41, 12, 58,157, 14, 18,137, 4, 92, 46, 23, 2,129, 0, 70,163, 17, 4, + 65, 32, 62, 62, 30,205,155, 55, 71, 78, 78,142, 59, 22,112, 99, 91,202, 44, 30, 94,100,232,245,250, 33,249,249,249,214,142,143, +165,179,248,179,207, 62,219,101,251,246,237,193,133,133,133,248,227,143, 63,128,154,169, 30,236, 33,189,168,168,232, 73,177, 88, +140,173, 91,183, 70, 76,152, 48,225,156, 85, 31, 45,115,231,244, 45,133,133,133, 91,238, 39,140,182, 93, 6,182,110,221,234, 63, +106,212,168,221, 42,149,170, 67, 99, 69,132, 72, 36, 90,115,230,204, 25, 95, 46,151,139,180,180, 52,140, 27, 55,174,196,201,244, + 14, 44, 88, 60, 76,168, 6, 48, 47, 43, 43,235,243,183,223,126,251,131,118,237,218,189, 58,101,202, 20,170,109,219,182,200,207, +207, 71,118,118, 54, 90,182,108,137,220,220, 92,124,247,221,119,186,146,146,146,213,168, 25,108, 82,249,159,141, 49, 47, 47,175, +187, 59,119,238,100,130,130,130, 44,253,132,124,124,124,138,230,207,159,207,200,229,114,198,215,215,183,192, 13,154, 58,171,123, +135,132,132,156,184,120,241, 98, 86, 79, 95, 40,199,125, 17,193,124, 85,221,147,249,170,186, 39,179, 38,191, 27, 19,209,195,219, +248,218,180,215,242, 62,255,252,243, 91, 27, 54,108,200,252, 31,123,215, 29, 30, 69,181,183,223,153,237, 37,189,147, 4, 18, 32, +244,208,139, 32, 29,129, 32,132,122, 85,138,128,162,126, 72, 64, 44, 8, 4,244,114, 17,145, 4, 68,165,233, 5, 47,150, 0,210, +171, 20,169, 66,128, 80, 36, 32, 37,161, 5, 18, 72,207,166,111,175,115,190, 63,178,179,110,194, 38,187, 27,192, 58,239,243,204, + 51, 59,237,221,211,230,156,247,252,206,239,156, 89,187,118,237,157,252,252,252, 59,225,225,225,103,234,224,164, 2,228,130,189, +221,219, 69,145,231, 7, 63, 71,122,182,141, 32, 97,222,162,156,107,241,145, 68,187, 44,130, 88,138,210,201,229,219, 69,100,220, +191, 15,144,113,255, 62, 64, 46,223, 46, 34,150,194,235, 68,179, 64, 76,212,203,155,145,103, 26,251,220,114, 20,206, 86, 33,178, + 37,251, 23, 12, 35,134, 29,147,201,182,184,182,164,117,176,236,102,125, 57,125,229, 66, 73,179, 6, 30,247,206, 38, 12, 50,156, +223,183,142, 60,211,181, 19,201,201,201, 33,121,121,121,228,240,225,195,196,207,207,207, 0,224, 56,170,214, 22,114,180,125,129, +223, 22, 68,125,132,243,226,143, 95,147,151,134,245, 37,189,163, 27,144,168, 16, 57, 35, 21,241,212, 0,246,219, 61,127,188,121, +243,230, 6,165, 82, 73, 84, 42, 21,185,126,253, 58,105,209,162, 69, 9,126,155, 17, 53,208,129, 9,184,124,252,248,241,196, 17, +146,147,147,201,181,107,215,200,212,169, 83, 73,231,206,157, 73,207,158, 61,201,184,113,227,200,255, 17, 16, 0, 55, 28,112,142, + 10, 13, 13, 45, 95,178,100, 9, 57,121,242, 36,217,176, 97, 3, 89,178,100, 9,121,255,253,247,201,230,205,155,201,141, 27, 55, +200,158, 61,123,156,241, 57, 10,231,147, 0,199,249,199,112, 30, 78, 75, 75,179,149, 41,139,197, 66,114,115,115,201,145, 35, 71, + 72, 72, 72,200, 13, 84,173,147,229,136,211,171,117,235,214, 55,111,221,186, 69, 30, 62,124, 72,140, 70,163,141,227,230,205,155, + 4,192,169, 39, 16,206, 22, 97, 97, 97, 69, 39, 79,158, 36,183,110,221, 34, 33, 33, 33,217, 79, 50,238,145,145,145, 69, 10,133, +130,156, 56,113,130, 4, 6, 6, 22,161,110,139, 45, 87,150, 56,206,191, 50,103, 36,128,141,157, 59,119,182,172, 90,181,138,188, +249,230,155, 36, 34, 34,194,130,170, 69,190,195,240, 15, 66,173, 22,173,242,242,242,136, 55,223,124,243,242,179,207, 62,219,181, +160,160,128,237,141, 25,104,154, 38, 10,133,130, 49, 26,141,185,238,254,153,209,104, 44,184,126,253,122,192,138, 35,151,139,102, + 47,154, 25,148,140, 60,217,179, 47,133, 96,239,178, 76,188,216,127, 74, 89,108,204, 40, 83,100,100,164,205,130,117,235,214, 45, +232,245,122,109, 29,148,228,153, 38, 62,221,118,204,110,141,125,103,239, 98,209,181,226,239,229, 34,222,174, 93,151,203,246,207, +237, 9, 24,183, 79, 64,251, 23, 54, 96,243,162,161, 0, 0,166,232, 6,140,219, 39,130,146, 5,224,116,174, 0, 21, 90,227, 1, + 71,164, 77, 2,101,175, 14,108,198,199,222, 19,151,176,104,239,195,239, 45,132,212,155,179, 76,109,212, 1,136,158,178,250,124, + 2,112,126,172,222,104, 9, 24,208,191, 31,246,253,184,159,110,213,170, 21, 54,109,218, 36,156, 56,113, 98,180, 59, 67, 20, 53, + 57, 45, 12, 9,160,128, 98, 2,108, 17, 11,120,243,181, 6,139,142,109, 52,172,195, 20, 66, 7,195, 20,181,249,130,236,201,203, +203, 59,113,225,194,133, 11,111,191,253,118, 11,137, 68, 66, 9, 4, 2, 88, 44, 22, 48, 12, 3,139,197,130,242,242,114,220,186, +117, 11,141, 27, 55,182,153,128, 15,120,122, 84, 2,170,255,212,198, 55,127,254,124,155, 73,185, 99,199,142,200,201,201, 65, 86, + 86, 22, 46, 95,190,108, 51, 41,187,200,199,225,175, 15,241,249,243,231, 33, 22,255,246,149,165,171, 87,175,226,173,183,222, 74, +179,250, 84, 85,214,242, 92,101,122,122,122,207,161, 67,135,158, 94,181,106, 85,107,251, 33,231,147, 39, 79, 2,128,254, 73, 88, +223,114,115,115,251,196,196,196,172,244,247,247,239, 80, 80, 80,176,224, 73, 70, 60, 43, 43,235,189,118,237,218, 45, 81, 42,149, +149,110, 14,109,114,224,240, 87, 67, 22,128,137,169,169,169,203, 82, 83, 83, 63, 64,213, 84,250,197, 0,210,185,164,169, 5, 97, + 97, 97,119,231,206,157,171,187,120,241,162, 37, 46, 46,174, 68, 46,151, 79,171,135,226,149, 6, 4, 4,108, 13, 10, 10, 74,241, +247,247,191,228, 17, 44, 82,200, 27,210, 70,207, 64,113,129,143,143,207,245,160,160,160,115,246,223, 65,244,243,243,251, 25, 64, +120, 93,156, 45,131,229,211, 95,232,232,159,219, 42, 68,182, 18, 85,159, 20,162, 90, 4,203, 14,239,158,224, 73, 52, 31,251, 17, +205, 34, 47,162, 93,217,150,104, 87,182, 37,154,197,254, 68,187,162, 13,185,147,208,157,116,139,244,206,111, 26, 44, 15,248,189, + 56, 89, 88, 87,113,111, 17, 25, 25,169,184,116,233, 18,201,202,202, 34, 7, 15, 30, 36, 50,153,236,122,125,123, 16,246, 43,195, + 87, 75,108,169,244, 72,101,101, 37,209,233,116,228,196,137, 19, 36, 56, 56,216, 81, 15,186,174, 94, 73, 16,128,213,109,218,180, + 49,173, 88,177,130,236,221,187,151,172, 89,179,134,140, 26, 53,138,204,153, 51,135,140, 29, 59,150, 4, 6, 6,234,173,230, 95, +111, 23, 56,235,203,199,245, 28,255, 94,156, 17,214, 94,173,189,229,118,126, 13, 75, 86, 93,156, 94,214,251,107,179,252,114,121, +196,113,114,156,127, 77,206,127, 46, 2, 3, 3, 63, 93,176, 96,129,250,167,159,126, 50,206,156, 57, 83,213,160, 65,131,211, 79, + 40, 35,130, 0,116, 7,208,165,150, 74,182, 94,153,219,222,219,219,187, 69,144,236,231,185,207,249,145,203,115,155,144,138, 21, + 29,136,230,171, 30,228,110, 66, 87,242,229,203,205, 73,135, 80,207,135,205, 3,101,109,255, 96,206,250, 12, 81,184, 85,176, 93, + 28,166,112,133,211, 93, 19,240,211, 48, 41,115, 21, 26,199,201,113,114,156, 28, 39, 39,180,254,190,104,214,172, 89, 70,187,118, +237,238,199,197,197,165,253, 69, 50,151,106, 25, 36, 31,219, 34, 72,190,187, 85,144,244, 94,155, 96, 89, 78,139, 32,217,177, 22, +129,178,247, 59, 53,128,244, 79,194,217, 66, 36, 18, 29, 9, 13, 13, 85, 0,120,229, 41,164,231,132,144,144,144,135, 86,107, 89, +139, 39,192, 25, 13, 96, 43,128, 45, 0, 90, 63,129,112,186,202,199, 85,104, 28, 39,199,201,113,114,156,156,208,250,123, 98,218, +180,105,124,174,192,112,156, 28, 39,199,201,113,114,156, 28, 39,199,201, 9, 45,247, 65,213,145, 88,199,158,114,130, 31,227, 56, + 57, 78,142,147,227,228, 56, 57, 78,142,243, 31,199,233,140,251, 24, 56,112,202,156,227,228, 56, 57, 78,142,147,227,172,149,147, +178,110,180,117, 99,143,255,204,113,167,254,196,113,255,167,112,254, 45,193,255,131,254,151,205, 8, 6,117,125, 61,153,195, 31, + 9,251, 23,132,112,249,196,225, 79, 10, 15, 62,159,255,174, 72, 36,234,107, 54,155, 91, 3,128, 64, 32, 72,215,235,245,167,204, +102,243, 23, 0, 84, 92, 18,253, 97,117, 7,207,174,177,181, 88, 55,252, 9,235, 18,123, 81,192, 60,102,187,244, 52,226,254, 79, +230,252,219, 11,173, 14,114,185,252, 63, 34,145,168, 9, 69, 81, 22,181, 90,125, 77,175,215,175, 3,112,238, 49,255,243,155,224, +224,224, 87, 74, 74, 74, 24,246, 35,197, 20, 69,129,166,105, 8, 4, 2,109, 69, 69,133, 87,125, 72, 3,219,142,122,159, 79, 81, + 51, 45,196,178,174,232,250,190, 79,156,157,231, 80,247, 11, 35, 20, 10,199,248,249,249,249, 40, 20, 10, 66,211, 85,171, 71,240, +120, 60,118,133,121,115, 69, 69,197,247,174,146,249,250,250, 94,244,243,243,243, 97,159,167, 40, 10, 37, 37, 37,229, 69, 69, 69, +221, 0, 64, 34,145,156,149,203,229,254,124, 62, 31, 60, 30, 15, 60, 30, 15, 26,141,166,164,164,164,164,231,239, 25,105, 95, 95, +223, 20,154,166,155,184,243, 12,195, 48,247,203,202,202,158,229,138, 76,117,108,223,190,157, 23, 19,246, 90, 20,159,104,219,211, + 52,241,102, 24,170,194, 76, 73,175, 30,206,253, 38,195,149,231, 95,124,241, 69,139, 11,183,245,241,242,242,218,176,123,247,110, +223, 78,157, 58,209,197,197,197,104,220,184, 49, 74, 75, 75,187, 37, 39, 39,119,126,237,181,215, 94, 83, 42,149,147, 0, 36,115, + 57, 82, 55, 68, 34,209,138,224,224,224,215, 85, 42,149,134,162, 40, 66, 81, 20, 40,170,170,159, 85,115,111,177, 88,114, 74, 74, + 74,186, 56,105,108, 5, 34,145,232,243,144,144,144,201, 26,141, 70, 99,229,115,200, 11, 0, 38,147, 41,167,184,184,184,139, 75, +117,125, 96,224, 58,169, 84,250,178, 70,163, 81, 83, 20,197,216, 95, 35,132,216, 55,230,247,138,139,139,123, 59, 19, 6, 34,145, +104,101,112,112,240,171,214,184,219,194,249,184,113, 15, 14, 14,158,172, 86,171, 93,226,172, 35,238,143,112, 62,141,112,254, 73, + 57,255,254, 66,171, 99,199,142, 91, 46, 92,184,208, 92, 32, 16, 0, 0,116, 58, 93,187,213,171, 87, 79,154, 59,119,110, 34,128, +121,245,252,191,164,222,189,123,143, 75, 78, 78,166,247,238,221, 75,119,237,218, 21, 20, 69,193, 98,177,192, 98,177,160,109,219, +182,210,250, 70,196, 91, 46,139,191,124,244,107, 73,135,129,111,204, 44, 2, 62,113,118,190, 46,129, 9,224, 67, 0, 77,220, 12, +130,194,154, 46,151,127,175, 70,252, 41, 9, 3, 74, 40, 20,254,171,119,239,222,222,199,142, 29,163,178,179,179, 41,169, 84,106, + 91,172,212,100, 50,161, 77,155, 54,110, 89, 66,125,124,124,188,226,227,227,163,158,127,254,121,236,220,185, 19,147, 38, 77, 66, +175, 94,189,238, 20, 21, 21, 1, 0,228,114,185,127, 90, 90, 90,115, 63, 63, 63,104, 52, 26, 84, 84, 84, 96,208,160, 65, 40, 41, + 41,121,236, 2,238, 21,142, 38, 22, 1, 22, 7,134, 75, 7, 40, 30,104, 23,169, 31, 98, 77,109,247, 10, 4,130,240, 7, 15, 30, + 4,137, 68, 34, 16, 66,192, 48,140,195, 61,251,219,104, 52,162, 77,155, 54,198,218,248,158,233, 24,190,152,162, 41,219,135,133, +137,217, 82,122,225,106,222,135,143, 27, 39, 63, 63,191,203, 98,177, 56,216,169, 90,182,107,200,116, 58, 93, 97,105,105,105, 39, + 39,143, 68, 2, 24,206,227,241,154,241,249,252,150, 0, 34,205,102,115, 48, 0, 8,133,194, 66, 30,143,151,101, 50,153,110, 25, + 12,134,187, 0,126, 68, 29, 31, 64,142, 9,123, 45,138, 50,107, 94, 80,234,153,161,178,166,137, 45, 52,247,226,111,203,196,154, +131, 49, 97,175,237,112, 85,108, 57,193,192,254,253,251,111,217,191,127,191, 68, 40, 20, 66,171,213,226,198,141, 27,240,246,246, +134, 72, 36,194,200,145, 35,121, 61,123,246,244,239,215,175,223,206,219,183,111,143,135,123, 62, 31, 45, 0,108, 67,213, 7,165, +223, 68,245, 47, 20,212, 7, 97, 0, 70,160,234,155,143,141,141, 70, 99, 49,128, 84,107,152,238, 0,136, 8, 12, 12,252,129, 97, + 24,125, 73, 73,201,107,112,240,161,234,238,157, 27, 94,162,105, 58,156,181, 9, 48,196,146,115, 62, 53,231,137, 52, 80, 52, 77, +175,140,141,141,125,117,199,142, 29,178,212,212, 84, 89,235,214,173,109, 29, 34,182,204,219,163,113,227,198,206,172, 26,124,154, +166, 87,188,240,194, 11,227, 55,110,220, 40,123,240,224,129, 44, 52, 52,212,198,105, 47,182, 88, 56,251,132,152, 93,217,255,102, +240,224,193, 19, 55,108,216, 32,216,183,111,159, 52, 32, 32, 0,254,254,254, 14,191, 25,219,179,103, 79,198,121,212,233,149, 35, + 71,142,156,184,117,235, 86,217,133, 11, 23,100,109,219,182, 5,143,199,123,236,184,143, 26, 53,106,252,150, 45, 91,100,215,174, + 93,147, 53,107,214, 12,172, 81,161, 38, 31, 77,211,104,216,176,161, 75,156, 35, 70,140, 24,191,109,219, 54,217,229,203,151,101, + 45, 91,182,180,165, 39, 91, 39,213, 39,156,127,114,206,127,132, 69, 75,100, 52, 26,113,234,212, 41,208, 52, 13, 63, 63, 63,188, +242,202, 43, 56,122,244,104,252,137, 19, 39,246,215,195,178,245,141, 85,100, 9, 0, 96,215,203,163,112, 95, 0,188, 85,100,128, + 80, 40,196,189,123,247,192,227,241,220, 54, 45,138,197,226,201,132,144,127,107,114,127, 17,107,181, 38,232,242, 46,201,164, 82, +169,173, 1,208,228, 89,207,231, 95,146, 73,165,210,123, 60, 30,239, 99,149, 74,149, 84, 27, 95,179,102,205, 54,221,184,113,163, +149,179,143, 61,215,132, 70,163, 65,163, 70,141, 34, 74, 75, 75,155,253, 30,141,184, 51, 78,179,217, 12,137, 68, 2,214, 26,101, + 48, 24,160, 82,169,156,113, 82, 66,161,112, 12, 43,178, 0, 96,243,230,205, 8, 9, 9, 65, 80, 80,144,237,163,210, 44,167,171, +224,241,120,136,137,137,193,194,133, 11,145,152,152,136,217,179,103, 87,171,104, 5, 2, 1,252,252,252,240,211, 79, 63,193,203, +203, 11, 17, 17, 17, 96, 5,126,173, 2, 42,130,166, 76, 38,134,214,230,193,177,229,163, 1,164, 82, 30,150, 70,245,242,121,115, +216,187,145,252, 6,205,101, 88, 60,248,210, 60,245, 67,253,154,186,132,137, 80, 40,196,245,235,215, 31,169, 16, 28,222,207, 35, + 48,136, 43,253, 26,247,145, 42, 28,137, 56,138,166,252,206, 93,122,104,179,208, 14, 25,208,138,255, 76, 39,254, 87,214,166, 18, + 52, 13, 48, 76, 85,211, 73, 81, 32,102, 19, 83,118,233, 90,222, 2, 23,210, 51, 52, 43, 43, 43,200, 89, 26,177, 48,155,205, 8, + 13, 13,229, 57,185,109,104,116,116,244,174,184,184, 56, 97,179,102,205, 40,161, 80, 8, 62,159, 15, 62,159,207, 10,244, 8, 66, + 72, 4,195, 48,253, 10, 11, 11,201,234,213,171,151,157, 60,121,114, 52,128,131, 14, 43, 22,162,109,175,212, 51, 67, 79, 95, 65, +183, 23, 6,206,197, 79,219,227,187,245,238,200,192, 83,166,205, 0, 80, 47,161,197,138, 13,139,153,161,238,100, 86,248,237,220, +185,131,162,105, 90,175, 84, 42,193, 48, 12,122,246,236, 9,154,166,113,253,250,117,124,240,193, 7,216,181,107, 23,246,236,217, + 35,237,220,185,243,183, 26,141,166, 53,170,190,197,230, 84,100, 69, 71, 71, 95,185,112,225,130,196,104, 52,162,123,247,238,231, +111,223,190,221, 25,245, 91,193,221, 23,192,103,243,230,205,155, 24, 23, 23,199,243,241,241,129, 72, 36,130, 82,169, 68, 70, 70, +198,228,239,191,255,158,172, 93,187,246, 75, 0,158, 89, 89, 89, 61, 46, 94,188,136,254,253,251,191, 13,224,221, 71, 21, 1, 47, +252,236,197,204, 32,246,120, 68, 76, 59, 97,143, 46,116, 97,149, 21,167,230,221, 4,140,133,201,185,248,107,174, 43, 66,108,217, +168, 81,163, 38,236,216,177,195, 3, 0,254,251,223,255, 98,204,152, 49,240,243,243,131, 76, 38,131, 80, 40,132, 64, 32,168,182, +119,210,216,242, 0, 44, 27, 59,118,236, 11, 27, 55,110,244, 4,128,141, 27, 55, 98,212,168, 81,240,247,247,135,167,167, 39, 68, + 34,145,237,123,175,110,118, 48,190,233,213,173,219,148, 13, 27, 54, 0, 0, 62,120,231, 29, 60,255,204, 51,240,144, 73, 33,147, +138,192,166,133,136, 39,192,144,183,102, 58,213,151, 0,150,143, 25, 51,230,165,173, 91,183,122, 2, 64,106,106, 42,138,138,138, + 16, 28, 28, 12,169, 84, 10,145, 72,100,139, 51, 69, 81,144, 74,165, 46,197,125,204,152, 49, 47,108,217,178,197, 19, 0,146,146, +146, 16, 19, 19, 99,139,187, 88, 44,134, 80, 40,172,182,213, 20,157,142, 56, 71,143, 30,253,194,182,109,219, 60, 1,224,251,239, +191,199,192,129, 3,225,235,235,107, 75, 79,150,203,157, 60,250,147,115,254, 51,132,214,149, 43, 87,254, 37,151,203, 19, 0, 4, +138, 68, 34,159,241,227,199, 55,156, 50,101, 10,198,142, 29,139, 19, 39, 78, 76,117, 83,104, 81,193,193,193,175, 36, 39, 39,219, + 90,104, 3,121, 68, 48,185,221,128, 91,241,239, 75, 83,167,134, 36,102,168,112,254,226, 45, 72, 64, 83, 23,151, 47, 15,212,221, +189, 11,139,193,128, 69,247,148, 85,231,205,132, 58,245,222, 91, 33, 29, 86,124,249,111, 0, 73,117, 52,182, 98,189, 94,143, 59, +119,238,184, 21,136,236,236,108, 71, 31,127,174,119, 35, 30, 17, 17, 81,215, 11,232,148,243,240,225,195,152, 53,107, 22,110,221, +186, 5,246, 83, 37, 46,112, 82,126,126,126, 62,172,200, 98, 69,144, 84, 42,133, 64, 32,160,248,124, 62,197, 14,237, 89, 95, 46, +151,132, 49, 77,211,216,180,105, 19,150, 46, 93,138, 57,115,230, 96,221,186,117,104,223,190,253,111,133,144,207, 71,101,101, 37, +124,125,125,225,235,235, 91, 77, 32,214,134,202, 7, 12, 1, 28,139, 44,105, 35,132, 72,165,252,131, 99, 63,137,234,208,246, 57, +127,168, 74,140,216, 52,247, 14,138, 51,245, 59,156,165, 39, 33, 4,237,219,183, 7, 69, 81, 54,161,193,110, 2,129, 0,124, 62, + 31, 60, 62, 15, 58,170, 18, 77,122, 9,241,206,206, 86,210, 6,205,101, 82, 71, 34,174,102, 54,127,254,197, 42, 25, 24, 82,229, + 4, 66, 24,128, 1, 8, 8, 24,194,160, 48, 55, 3,255, 89,248,169,203,173,143, 64, 32,192,221,187,119,109,225,102, 45,195,172, + 48,178,183, 26, 68, 70, 70, 58, 45, 75, 66,161,240,163, 61,123,246,136, 54,109,218,132,173, 91,183,130,162, 40,136,197, 98,200, +229,114,248,248,248,192,223,223,223,182,133,135,135, 83,223,126,251,173,176,125,251,246, 31, 85, 86, 86, 30,116,156,231,196, 91, +214, 52,177,197, 11, 3,231, 2, 0, 94,152, 75, 80,118,231,147, 14,116,249, 2,239,250, 91, 94,170,196,198,226,197,139,241,241, + 51,207, 64, 36, 18,145,138,138,114, 9,219,185,224,209, 60,164,165,221,192,138, 21, 43, 48, 97,194, 4,220,187,151, 65, 34, 34, + 34,245,179,102,205,242, 72, 76, 76,124,199,104, 52, 46,114, 38,178,218,181,107,119, 38, 37, 37, 69,162,209,104,192, 48, 12, 14, + 30, 60, 40, 27, 56,112,224,233,204,204,204,222,238,138,173,200,200,200,125, 41, 41, 41, 61, 3, 3, 3, 81, 81, 81,129,202,202, + 74,152, 76, 38,240,120, 60, 68, 68, 68, 96,217,178,101,212,200,145, 35,103, 76,158, 60, 89, 39,149, 74, 89,203, 70,164, 35,174, +154,239,247,234, 53, 95,249, 16, 82, 85,126, 8, 67,170,237, 75,139,178,240,206,123,174,125,189,170, 97,195,134,111,238,220,185, +211,195,222,178,100, 47, 2,236, 69, 22,187, 57, 17, 6,116,163, 70,141,166,252,240,195, 15, 54,206,128,128,128,106,239, 15, 77, +211, 56,125,250, 52, 18, 62,154, 7,223,192, 80,172, 90,243, 95,151,134, 11, 99, 98, 98, 94, 78, 74,250,173,234,110,215,180, 41, +134,245,124, 6, 65, 1, 94, 8,240,245,172, 74, 39,134,194,213, 91,153, 78,219, 35, 0,116,195,134, 13, 95,219,190,125,187,135, +125,135,144,141, 43,219,121,102,173,248, 6,131, 1, 93,186,116,113, 41,238,246,156,172,181,141, 21,109,108,122,178,255,195,190, +175, 78,194, 57,133, 21,194, 86,193, 89,141, 67, 32, 16, 96,251, 79, 27,106,181,102,215,151,211,221,124,175,201,153,149,149,133, + 37, 75,150,128,237,180,217,187, 10,133,133,133, 97,213,170, 85, 78,235,165, 26,239, 64, 87, 0,129,118,167, 12, 0, 68,118,123, + 5, 69, 81,191, 56,184,143, 61, 47,176,142, 88, 5, 90,219, 14, 37, 0, 31, 7,124,181,241, 20, 91,219,188,192, 26,247, 87,251, +159, 90,133,214,254,253,251,217,183,184, 95,108,108,236, 41,235,239,114,177, 88,156, 45,147,201, 66, 0, 40, 15, 30, 60,136,255, +251,191,255,131,213,180, 58,194,219,219,251,134, 3,171,206, 21,189, 94, 63, 23, 64,161,245, 20,107,174,167, 75, 75, 75,153,163, + 71,143,210, 27, 71, 15,134,129, 0, 29,255,157,128,152,216, 88, 28, 14, 19,129, 7,160,219,205, 98,200,100, 50,126,101,101,165, +201,222,111,203,129,239,214,177, 26, 5,138, 39,225,243,209,253,204, 1,204, 58,115, 0,221,228, 34,148,236,216, 6,229,217,100, +208, 52,133, 62,242, 0,204,158,112, 20,207,122,137, 33,210,171, 65,211,180,163,146,109,227,188,115,231,206,139, 94, 94, 94, 9, + 53, 18,216, 21,220, 71,213,119,156, 80, 75, 56, 93,106,196,217,237,242,101,135, 35,144,181,114, 90,135,224, 32,151,203,113,252, +248,113,219, 61,207, 61,247, 28,116, 58, 29,252,252,252, 92,226, 84, 40, 20, 36, 47, 47,143,218,184,113, 35, 4, 2, 1,252,253, +253, 33,147,201,168, 13, 27, 54,204, 19, 10,133,225, 58,157,142, 49, 24, 12, 16,137, 68,171,216,252,225,243,249,234,202,202, 74, +255,218, 56,121, 60, 30,226,226,226,240,254,251,239, 99,221,186,117,152, 58,117,234, 35, 22, 47,157, 78,135,128,128, 0,155,216, +114,240, 2,186, 52,244, 35, 11, 67, 91,159, 96,209,145, 41,171, 90, 5,135,181,148, 35,101, 75, 1, 14,172,204,202, 81, 23, 90, +190, 48,148, 97,167, 51, 78, 66, 8, 50, 50, 50,106, 21,195, 37,101,197,120,255,227, 55,209,241, 53, 57,106, 17,113,191,113, 50, + 4, 55, 46, 31, 70,218,181, 99, 96, 44, 12, 44, 12, 1, 33, 22, 48,102, 32,245,232,249,230,249,247,243,194, 8, 72,149,235, 45, + 0,113,133,202,220,215, 95,212, 18,192,222, 83, 37,134, 21,206,226,206,231,243,161,211,233,176,103,207, 30,220,188,121, 19, 7, + 15, 30,132, 86,171, 69, 64, 64, 0,124,124,124,240,204, 51,207, 96,242,228,201,136,140,140,116,154,239,132,144,164,236,236,236, +142,189,122,245,162,202,203,203, 81, 94, 94, 14,173, 86, 11,139,197, 2,179,217, 12, 62,159, 15,137, 68, 2,169, 84,138,224,224, + 96,232,116, 58,162,215,235,147,106,227,100, 24,170, 66,115, 47,254,246, 79,219,227,187,189, 48,151, 96,199, 82, 10, 81,141,196, +154,227,151, 60,167,236, 61, 51,123, 16, 0,194, 16,155,105,129,152, 44, 76,241,251,243, 62,155, 81, 87, 56,217, 60, 73, 73, 73, +193,140, 25, 51, 96,177, 88, 40, 1,159, 15, 66, 8, 40,154,198,237,219,183,177,122,213,106,140, 27, 55, 14,205,162,162, 96, 48, + 26,161, 82,169,208,191,127,127,193,170, 85,171,250,217, 9,173, 99,117,136, 44,127,173, 86, 11,165,178,202,248, 37, 18,137,176, + 99,199,142,128,225,195,135, 39,231,229,229,213,245, 61,210, 71, 56, 61, 61, 61, 35,120, 60, 30,174, 95,191,142,181,107,215,226, +248,241,227, 40, 44, 44, 44, 11, 13, 13,245,238,215,175, 31,253,206, 59,239,160, 99,199,142,248,238,187,239, 36,206, 56, 9, 33, +200,186,115, 26, 89,119,207,128, 97,170,132,101,213,230,248,119, 29, 61,160,106,225, 84,171,213,186, 43, 87,174,120,172, 95,191, + 30, 65, 65, 65,104,220,184, 49,100, 50, 25, 36, 18, 73,181, 70,214,190,225,117,246,110,106,181, 90, 93, 86, 86,150,199,150, 45, + 91,224,239,239,143,200,200, 72,200,100, 50,136, 68, 34,240,249,124, 80, 20,133,141, 27, 55, 98,243,194, 9,200,186,117, 13,163, +134, 13,114, 26, 78,153, 76,246,114, 82, 82, 82, 53, 19, 72,176,175, 47,248, 2, 26, 60, 1, 5,223,231, 70, 3, 0,202, 78,236, +174,178, 85, 57,143, 59,165, 84, 42,117, 23, 46, 92,240,184,116,233, 18, 24,134, 65,100,100, 36, 52, 26, 13,188,188,188,108,241, + 63,122,244, 40, 70,142, 28,137, 77,155, 54,161, 71,143, 30, 78,227,174, 82,169,116,215,174, 93,243,248,225,135, 31,224,231,231, +135,134, 13, 27,218,226,206,110, 2,129, 0, 60, 30, 15, 77,154, 52, 65, 69, 69, 5, 60, 60, 60,156,230, 81,106,106,170,199, 15, + 63,252, 0, 95, 95, 95,132,135,135,219, 44,110,172, 56, 90,250,213,194,106, 4, 18,170,193, 99,115,186,155,239, 53, 57, 71,141, + 26,133,168,168, 40,120,121,121, 65, 46,151,219,184,235,226,172, 69,139,216,244, 54, 69, 81,251,237,222,137, 88,138,162,246,219, +239,107,187,207,250,179,207,188,121,243,186, 36, 38, 38, 46,233,209,163,199,150,148,148,148,205,181,241,213,198, 51,111,222,188, +232,196,196,196, 37,246,247, 59,248,159,218, 45, 90,177,177,177,148, 53,146, 20,128,198,157, 59,119,254,229,196,137, 19,126,158, +158,158,182,155, 31, 62,124,136,242,242,114,120,122,122,122,125,254,249,231, 94,253,250,245, 67,112,112,176,173, 7,112,231,206, +157, 54, 45, 90,180,168, 4, 80,211,110,203,208, 52,141,103,159,125, 22, 55,172,163, 29, 49,177,177, 8, 15, 15,183, 57,121, 72, + 36, 18,204,152, 49,131,154, 53,107, 22,159,181,102, 16, 66,160,213,106,209,160, 65, 3,105, 93, 86, 8, 0,136,214, 22, 99,119, +191, 62,160, 41, 64,115,249, 34,132, 34, 10, 52,143, 66, 39, 82,130, 67,253,251,128, 2, 96,248,245, 28, 92,176,194, 92, 6, 48, +232,105,152, 15,157, 53,226, 14,226, 69,213,151,147,181,104,164,164,164,192, 98,177,184,202, 73,104,154,134, 92, 46, 71, 72, 72, + 8,164, 82, 41,100, 50, 25,181,101,203,150, 15, 27, 55,110,220, 96,214,172, 89,116,101,101, 37,253,236,179,207, 98,204,152, 49, +124,118,136, 51, 58, 58,218,105, 92, 78,157, 58,133,181,107,215, 98,234,212,169, 14, 45, 90, 20, 69, 33, 48, 48, 16, 94, 94, 94, +245, 78, 95,113, 35, 68, 6,132, 75, 78, 77,255,174,173,143, 87,144, 16, 63,173,121,136,195,171,179,119,235,138,241, 57,204,184, + 5,160,204, 85,139,150, 35, 1, 12, 30, 3,139, 95, 9, 94, 93,221, 28, 97, 45,189,145,178,165, 0, 7,191,120,104, 81, 41, 76, +179, 29,136, 56, 48, 0,140,102, 19, 52, 42,173,109, 72,215, 98,177,224,218,201, 95,155,223,255,245, 78,244,254, 45,155, 4, 0, +160, 59,185,187,218,160,231,152,175,182,181,232,235, 43,184,112,170,204,116,161,174, 50,207,231,243,241,202, 43,175, 32, 49, 49, + 17, 47,191,252, 50, 14, 30, 60,136, 5, 11, 22,224,245,215, 95,127,196,170,229,172,231,104, 50,153,190,158, 52,105,210,212, 29, + 59,118,180,156, 59,119, 46,205, 90,180,100, 50, 25, 40,138,130, 78,167,131, 94,175,135, 86,171,197,173, 91,183,152, 55,222,120, +227,182,193, 96,248,186,214,225, 74, 74,122, 85, 38,214, 28,108, 26, 78, 71,169, 51, 63,245,236,245, 76,164,150,146,118,174, 24, +221, 98, 32, 25,250, 74,164, 47, 8, 1, 97, 0,134, 0,122,189, 26, 51,102,188,205,115,165,172,103,221, 57,141, 43,151, 47, 66, + 42, 21, 67,165, 84,193,194, 88, 64, 24, 2,177, 80,128, 15, 63,152,143,113,227,198, 35,170,105, 83, 88, 44, 22, 8, 5, 66,124, +255,253,247,232,210,165, 11, 12, 6, 67,107, 23, 44, 89,254, 58,157, 14, 87,174, 92, 65,255,254,253,145,157,157,141,244,244,116, + 52,111,222, 28, 27, 54,108, 8, 28, 63,126,124,114, 81, 81,145,203, 31,127,191,118,237,218,188, 14, 29, 58,172, 84,169, 84,165, + 42,149,106, 37,128,205, 0,202, 51, 50, 50, 90,103,100,100,172, 62,124,248,112,239,255,252,231, 63,188, 26, 62, 58,188, 90, 34, + 15,147,201, 12,173, 86, 95,167,192, 98,143, 9, 97, 92,122,103, 40,138, 34, 45, 91,182,196,240,225,195, 33, 16, 8, 32,147,201, +224,225,225, 81,109,216,172,166,224,170, 43,139, 0, 48, 20, 69, 33, 52, 52, 20, 67,135, 14,133, 80, 40,172,198,201,150,195,161, + 67,135, 98,230,162,127,227,235,153, 3,176,118, 82,115, 12, 92, 92,232,204, 53, 67,245,243,207, 63, 75,223,159, 58, 21, 29,154, + 53, 67,128,151, 23, 26, 5, 7, 66, 42, 22, 65,104, 31, 38,202, 37, 35, 59, 1,192,240,120, 60,180,109,219, 22,133,133,133,200, +204,204, 68,102,102, 38,104,154, 70,175, 94,189,108, 86,152,187,119,239, 98,209,162, 69,208,235,245, 46,199,189, 89,179,102, 24, + 48, 96, 0, 68, 34, 17,100, 50, 89,181, 33, 67, 54, 77,149, 74, 37,162,162,162,176,119,239, 94,180,104,209,194, 41,103,171, 86, +173,208,183,111,223,106,233, 41,149, 74,109,162, 8, 0,178, 47,168,108,255, 17, 22, 22,230, 22,231,145,139, 15,177,254,232,207, +208, 27, 24, 84,106, 76,213,189, 48, 2,188,112,230,135,185, 46,197,157,229,252,223,255,254,135,242,242,114, 91,221,201,118,202, + 89, 35, 74,195,134, 13,241,223,255, 58,182,100,214,208, 34,142,234,129, 88, 23,219, 91,246, 62,182,112,137, 19, 19, 19,151,212, +124,222, 25,159,253,245, 26,207, 27,106,136,179, 66,183,134, 14,197, 98,241,252,159,127,254,217,175,162,162, 2,119,239,222, 5, + 77,211,182, 49,117, 62,159, 15,163,209,136,123,157,170, 47, 17, 0, 0, 32, 0, 73, 68, 65, 84,247,238,193,207,207, 15, 69, 69, + 69, 16,139,197,224,241,120, 48, 24, 12, 0,208,169,182, 6,156, 16,130,153,138, 42, 23,161,159, 66,133,200, 2, 48, 76, 81,245, + 98,176, 14,241, 59,119,238,132,135,135, 7, 60, 61, 61,109,123,103,195, 72,215, 50, 51, 80, 40,160, 64,159, 59, 13,138, 6,104, + 10,160,120, 0, 77, 19,208, 20, 5,250, 92, 50, 40, 10,144,251,251,186,219,118, 59,115,140,175,211, 1,222,157, 70,188,230,239, +147, 39, 79,194, 85,206,168,168, 40,120,120,120,216,182,195,135, 15, 87,179,104, 89, 44, 22,248,251,251,187,194, 73,172,254, 56, + 8, 10, 10,130, 64, 32,160, 54,108,216, 48,175, 73,147, 38, 13,222,123,239, 61,154,199,227,225,242,229,203, 72, 75, 75, 67,100, +100,164,203, 62, 91,229,229,229,249,243,230,205,179,204,155, 87, 53,135, 34, 58, 58, 26,229,229,229, 69,182, 97,192,202,202,146, +193,131, 7, 87,243,219, 40, 46, 46, 46,169,197,179, 66, 32, 15, 71, 44, 33,168,212,100,227,103, 54,204,222, 17,240, 22,120, 10, +142,188,254,101, 43, 31,175, 32, 33, 14,173,122,128, 35, 95,230,236,212, 21,224, 67,171, 79, 16,227,106,166, 59, 26, 54,206, 45, +200,198, 27, 31,142,198,164, 53,209, 96, 69, 28,239, 78,123,144,146,242, 82, 67, 89,105,146, 35, 17,199, 48, 12,204, 70, 51, 52, + 58, 29, 84, 74,141,205, 58, 84,148, 87,232, 51,119,214,187,130,229, 51, 94, 5, 0,204, 90,177, 6,202,117,191, 85,100,187,103, +141, 11, 26,253,217,214,120, 0, 35,235, 10,167, 74,165,130, 78,167, 67,211,166, 77,145,146,146, 2,165, 82,137, 33, 67,134,128, +162, 40,219, 12, 81, 55, 96,200,205,205,237, 25, 27, 27,251,203, 23, 95,124,209,180,117,235,214,148, 90,173,134, 70,163,129,253, +254,218,181,107,100,243,230,205,247, 53, 26,205,179, 86,211,185, 67, 28,206,253, 38, 35, 38,236,181, 29,199, 47,243, 98,131,162, +110,123,229,150, 53, 53,151,228,138,213,149,218, 91, 58, 11, 73, 3,177, 0, 22, 48, 32,102, 6, 22,235,176,151, 11, 53, 39, 76, + 38, 51, 44, 22, 6, 15, 31, 62, 68,122, 90, 26,218,181,109, 9,157,222, 12, 33, 95,128,153, 55,110,160,213,120,192, 32, 20,128, + 97, 24, 80, 20,141,169, 83,167, 26,173, 67, 6,181, 66, 42,149,174, 62,115,230,140,191, 78,167, 67,106,106, 42, 38, 78,156,104, + 40, 46, 46, 22, 1,192,203, 47,191,108,216,184,113,163, 40, 42, 42, 10, 27, 54,108, 8, 28, 51,102,204,118,181, 90,221,214,197, + 52,221,148,159,159,191,169,230, 73,127,127,255, 85, 15, 31, 62,236,103,239,243, 99, 54,155,109,193,113, 24,117, 6, 48,153, 76, +208,106,245,168,168, 80,194, 96, 52, 89,235, 76, 6, 22,139,217,186,103, 96,182,214,163, 34, 33,223,179, 83,219, 16, 21, 33, 4, + 52, 69,149,167, 94, 47,104, 88,151,104,119, 52,196,229,162, 53,171, 38, 44,236, 44, 51,127,127,127, 8, 4, 2,108,218,180, 9, + 87,207, 30,134,136, 71, 96, 49,155, 96, 54, 25, 97, 49, 25, 32,224,241,112,252,114, 38, 6,181,242,116, 73, 16, 6, 4, 4, 96, + 88,143, 30,136,237,209,163,106,122, 27,159, 15, 15,177, 24, 50,161,164,202,146, 5,128, 88,104, 87, 23, 17, 96,216,112, 6, 7, + 7,227,210,165, 75,152, 57,115, 38,150, 46, 93, 10,169, 84,106,155,253,124,243,230, 77,108,219,182, 13,131, 6, 13,114, 59,238, +172, 5, 47, 62, 62, 30,121,121,121, 88,177, 98, 5, 58,119,238, 12,129, 64,128,242,242,114, 60,251,236,179, 40, 44, 44,116,137, +211,126,120, 79, 36, 18, 85,179, 62,177, 2,208,221, 60,178,231,124,117, 84, 3,236, 59,187, 25, 20, 40,156,255,225,221,106,162, +240,191, 91, 79,187,205,185, 96,193,130,106,225,116,197,154,229,178, 31, 82,117,171,147,211,251, 40,138, 74,101,141,173,241,241, +241,243, 41,138,218, 31, 31, 31, 63, 63, 33, 33,225,134, 43,124,142,174, 83, 20,117,192, 42,194,134,217,157, 75,117, 75,104,201, +100,178,110, 30, 30, 30,184,123,247, 46,134, 12, 25, 98, 40, 41, 41,185, 45, 16, 8,154, 23, 23, 23,139,139,138,138,160,209,104, + 84, 31,127,252,113, 38, 0,105,247,238,221,163,142, 31, 63,142,236,236,108,108,220,184, 17, 0,118,215,230,167,195, 48,140,173, + 80,212,236,182,241,120, 60,156, 59,119, 14,231,206, 85,119,253, 90,191,126,189,211, 6, 99,204,158, 31,113,249,242,101,216, 47, + 15,192,254,182, 63, 39,145, 72,128,186,103,120, 84,131, 51,199,120,103, 14,240,174, 54,226,181, 85,128,174, 22,196,220,220,220, + 90,159, 63,119,238, 92, 53,139,150, 51, 78, 30,143, 7,139,197, 2,169, 84, 74, 9,133, 66, 74, 40, 20,134,179, 34,139,199,227, +217, 94, 24,177, 88, 12,177, 88, 92,173,151, 90, 27,242,242,242,250,231,229,229,213,122, 93,161, 80,244, 84, 40, 20, 46,197, 85, + 22,134,143,158, 29,219, 96, 30, 0,156,221,154,255,157,230, 33, 94, 7, 0,194,167,118,189,250,121,139,168,192, 72, 41,206,109, + 47,192,145, 47,115,246,232, 10,176,208, 58,164,203,184,154,230, 7,142,238,197,155, 83,167, 65,204,147,217,249,100,209, 40,231, +101, 99,250,198, 22, 96, 69, 92,234, 70, 3,246,111,253, 8, 41, 71,159, 55,213,101, 41, 51,154, 76,208,106, 12, 80,170,180,248, + 40,225,187,170,147, 31,225, 2,128, 11, 61,223,156,137,184,152, 65, 3,220, 29,166,102,211, 59, 40, 40, 8,167, 78,157, 2, 69, + 81,216,190,125, 59,188,189,189, 17, 19, 19, 3, 47, 47, 47,196,199,199,227,197, 23, 95,116,183, 50,171, 40, 41, 41,233,249,206, + 59,239,252,242,233,167,159, 54,106,216,176, 33, 12, 6, 3,140, 70, 35, 12, 6, 3, 50, 50, 50,176,121,243,230,108,141, 70,211, + 19, 64,133, 51,178,195,185,223,100,236, 74,158,149, 55,112,236, 24,237,205,194,159, 80, 80, 80, 2,179, 57, 23,140,197, 12,163, +217, 82,101,225, 51,155, 97, 54, 91, 32, 20,242,188, 62,253,228,221,163, 12, 8,104,154, 50, 0,120,190, 54,177, 17,209, 48, 8, + 94,158, 94,104,221,170, 9, 78, 28, 90, 15,131,209, 12,163, 65, 13,227,244, 24,164,103, 29,135,229,254, 49, 88, 24, 11,206,164, +164,233, 77, 22, 34,144, 74,229, 84,195, 6,158,188, 59,247,117, 14,195,233,227,227, 19,173, 80, 40,112,231,206, 29, 76,158, 60, +185,160,164,164, 36, 29,192,115, 0, 80, 82, 82,114,102,226,196,137,173,147,146,146, 66, 26, 55,110, 12, 15, 15, 15, 47,181, 90, +237, 44,234, 30, 0,226, 0, 12, 70,117, 7,252, 82, 0, 31,211, 52, 45, 78, 77, 77,125,100,166, 93,114,114, 50, 0, 92,112,220, + 3,178, 90,180,116, 58, 40, 74,202,240,250,155, 31,254,214, 51, 2,169, 38, 46, 8, 8,166,189, 5, 9, 0, 20, 23,102,224,213, +215,103,138,235, 84, 28, 12,227,176, 33,116,195, 71,167, 90, 71,141, 45,163, 30, 30, 30, 85,195,111,123, 55,227,192,103,111, 2, + 22, 35,136, 73, 11, 24, 53,128, 81, 5,198,160, 1, 37,148, 2, 38,173, 75, 66,203,195,195, 3, 30, 82, 41,130,124,124, 64, 8, + 1,159,199,131, 64,192, 7, 99, 2, 40, 11,101, 43, 35,140,197,165,178,110,235, 84, 74,165, 82,100,101,101, 33, 46, 46, 14, 70, +163, 17,163, 70,141,130,193, 96,128, 78,167,131, 86,171, 69,147, 38, 77,160,209,104, 92,226, 99,103, 43,122,120,120, 64, 40, 20, +226,221,119,223, 69,151, 46, 93,176,104,209, 34,204,153, 51, 7, 77,154, 52,193,180,105,211,176,121,243,102, 68, 71, 71, 59,227, + 37,246,121,196,166, 39, 43,182,236,135,248, 0,184,157, 71, 53, 57, 41,138,174, 38,216,216,237,237, 73,207,185,205,153,152,152, + 8,133, 66,241,136, 37,139,253, 29, 22, 22,134,175,190,250,170,190, 35, 67,172,245, 40,216,193,181, 97, 53, 45, 81,132,144,174, + 86,223, 41,125, 66, 66,194,141,132,132,132, 88,138,162,246, 39, 36, 36,196,214,102,209,114,196,227,224,186,194,213, 48,243,107, +140,141,246,179,191,200, 38,180,159,159, 31,175, 81,163, 70,180,151,151, 23,202,203,203, 17, 24, 24, 72, 20, 10,197, 88,153, 76, +182,112,203,150, 45, 81, 42,149, 10, 55,111,222,196,170, 85,171, 46, 0, 88, 89,151,208, 58, 24,104, 53, 29, 91, 45, 89,246,199, +195,135, 15, 71,227,198,141,171, 89,179,164, 82,105,157,133,135,189,102,107, 20,121, 60,180,104,209, 66,122,255,254,125,173, 80, + 40, 68,120,120,184,180,160,160, 64, 43, 20, 10,221,158,233,226,204, 49,222,153, 3,188, 35,225,211,181,107,215,106, 22, 44,251, +189,253,239,125,251,246, 57, 29, 58,100, 57, 91,183,110,109, 75, 47, 79, 79, 79,246, 89, 0,192,144, 33, 67,192, 48, 12, 2, 2, + 2, 92,226,100, 69,173,213, 1, 30, 58,157,142, 81, 42,149,116,106,106, 42, 68, 34, 17, 60, 61, 61,109,190, 58, 18,137,196,102, +205,252,189, 32, 16,209, 83,198,124, 80,101, 96,244,111, 40,126,117,239,178, 76, 80,192,229,161,111, 71,246,111,218,213, 27,149, + 69, 70,236,255, 60,235,129,174, 4, 9, 0,110,185, 99,201,210,209,149, 94,235,206,188,131, 14, 47,139,208, 64,215, 11,159, 46, +168, 42,202, 19,103,140,198,176,215,249, 96, 69, 28,125,167, 29,182,127, 55, 31,205,154, 53, 3, 33,132,170,189, 66, 96, 96, 48, +153,160,213,106,161, 82, 85,173,155,153,113,189,250, 8,163, 81, 95, 89,255,180,176, 86,176,165,165,165, 56,124,248, 48,126,250, +233, 39,116,233,210,197,161,168,118, 67,112, 41, 74, 75, 75,123,205,158, 61,251,252,226,197,139, 67,253,252,252, 96, 52, 26,241, +240,225, 67,124,251,237,183,121, 26,141,166,151, 59, 21, 12, 8, 96, 50,153,161,211,232, 81, 81,169,196,194, 79,190,175,181,232, + 1, 64,105,209, 45, 12, 31,241,162,168, 46,177,209, 48,204, 7,201,201,201, 24, 52,176, 23,134,141,156, 92,171,216,120,115, 70, + 53,177, 33,172,163, 35,240, 94,175, 94,189, 62, 81, 42,149,229, 26,141,230, 69, 0,203,237,251, 83, 37, 37, 37,189, 71,140, 24, +241,133,159,159, 95,231,162,162,162,249, 46,196, 58, 62, 43, 43,107,126, 68, 68, 68,181,147,122,189, 30, 17, 17, 17, 45,138,138, +138, 38,244,233,211,231,223, 0,252,236, 46,123, 2, 56, 2,224,171,218,202, 18, 59,116,168, 82,105,225,229,211, 0,185,153,167, +156, 6, 68,200,211,129, 48, 76,157,117, 8,219, 1,174,109,115, 50, 51,238,145,160,178,247,178, 13,246,243,255,154,132,231,227, + 18, 33, 19, 0, 75, 94,237,137, 38, 62, 0,164,126, 16,246,153, 11,202,199,154, 70,113, 63,186, 68, 62,103,237, 90, 92,182,214, +199,225,129,129,152, 61,118, 44,136, 9, 72, 73, 75,195,214,159,127,198,216,254,253, 33,147, 72, 92,238,176, 48, 12, 3,161, 80, +136,140,140, 12,164,164,164,160, 85,171, 86,184,123,247,110,181,101, 40, 8, 33,174,198,223, 22,119,177, 88, 12,129, 64,128,130, +130, 2,196,198,198, 66, 40,172, 26,198, 62,117,234, 20,102,207,158,141, 41, 83,166,160, 95,191,126, 72, 79, 79,119,137,147, 16, +242,200,108,197,154,195,185,238,230, 81, 77,206,154,237,126,125,242,157,229, 92,188,120,177,195, 9, 21,174,112, 58,210, 34, 14, +242, 46,213, 94, 12,177,150, 39,123, 97, 84,243, 24,128, 47,123, 46, 62, 62,126,190,171,207,217, 31,179, 22, 49,119,134, 48,109, + 66, 43, 54, 54,182, 90,204, 75, 75, 75,207,159, 63,127,190,141, 92, 46,199,173, 91,183, 68, 94, 94, 94,109,216, 10,157,166,105, +108,223,190,221,115,232,208,161, 71,151, 47, 95, 30,206, 48, 12, 10, 11, 11,241,254,251,239,171,204,102,243, 56, 0,230,218, 26, +112,103,150,169, 31,127,124,244,101,219,187,119,175, 75, 67, 32,172,144,226,243,249,240,245,245,213,106,181, 90,200,100, 50,248, +250,250,106, 53, 26, 13,228,114, 57, 59, 86, 76,227,183,153, 10,206,172, 79,206, 28,227,107, 58,192, 59, 69, 90, 90,154, 75,247, + 89,135, 90, 93, 42,229, 89, 89, 89,181, 86, 36,167, 78,157, 2, 99,173,104, 93,229,180,246,242, 8, 43,252,100, 50, 25,252,252, +252, 32, 22,139, 33,149, 74,171,137, 44,177, 88,236,244,197,113,182, 32,169, 68, 34,185, 40,151,203,125,216,235, 2,129, 0, 74, +165,178,188,180,180,180,219, 35, 22, 34, 13,115, 48,121, 99,222,148, 62, 19, 67,209,103, 98, 40, 0,188,122,105, 95,209, 43,189, + 95,174,114,254,220,185,248, 30, 81,230, 89, 18, 97, 66,154, 59, 34, 11, 0,136, 72, 47, 27,243, 65,135, 42,235,194,198,243,152, +187,248, 29,180,107,213, 1, 62,207,230,162,105,215, 80, 84, 22, 25,241,235, 22, 11, 86,254,231,125,180,110,221,218,169,192,100, + 64, 96, 54,154,161,213,234,160, 82,106,241,164, 97, 48, 24, 32, 22,139,177,121,243,102,244,236,217, 19,221,187,119,127, 68,100, +213,211, 60,159, 83, 90, 90,218,111,229,202,149, 23, 62,255,252,115, 95,149, 74,133,239,190,251,174, 66,165, 82,245, 3,144,227, + 86,154, 50, 4, 38,163, 17, 26,157, 30,106, 85, 85, 26,220,187,177,179,158, 61,217, 42,177,209,179, 91,115, 76,159,254, 38, 50, +239,103, 64, 85,126,247,177,197, 6,128,205, 5, 5, 5,155,235,184,126,207,108, 54,199,178,235,190,185,128,103, 34, 34, 34, 80, + 80, 80, 80,237,228,131, 7, 15, 96,177, 88,244,168, 90, 39,235, 53,123, 67, 50,106,153, 65,107,215,131,174,178,142,106,245, 80, +169,170,172, 32, 58,117,241, 19, 41, 71,172,216,168,205, 39,171, 62,101,136,162, 40,155,211,247,140, 25, 51,112,237,234, 85, 60, + 23, 90,137, 38, 33,158, 32,149,185, 16, 14,248, 15,126, 85, 72,177,252,139,131,110,115,111,179,115,129, 88,190,109,155,195,107, +247, 70,142,116, 43,238,183,111,223,134, 84, 42,133,197, 98,121,164,189,113, 55,254,246, 2,230,139, 47,190,192,236,217,179,241, +253,247,223,227,218,181,107,232,208,161, 3, 6, 14, 28,136,162,162, 34, 92,189,122, 21,122,189,222,229,112,218,251,205,221,190, +159,134, 99, 41,135,240, 32, 39, 19,121, 5,217,245,206,119,123,206,154, 66,107,215,177, 43,248,215,160, 78,245,226, 92,184,112, + 33,138,138,138,170, 89,178,236,235,165,218, 44, 90, 53,181, 72, 13, 20,215,240,133, 98,143, 13, 53, 68, 79,205,227,154,247, 3, + 64, 17, 0,158,147,231,106, 30, 23, 39, 36, 36,156,100, 45, 97, 86, 94,158, 51,255,172, 90,135, 14, 1, 36,142, 28, 57,114,196, +170, 85,171, 2, 37, 18,137,109, 6, 82,124,124, 60,102,207,158,141,166, 77,155, 34, 32, 32, 32,204,199,199, 7, 37, 37, 37, 88, +186,116, 41,178,178,178,254, 15, 14, 22,218,171, 41,180,122,223, 87, 66, 36,250,173,195,202, 90,182, 0, 96,202,148, 41,143, 88, +180,216, 12,170, 11, 38,147, 9,254,254,254,208,104, 52,224,241,120, 24, 53,106, 20,239,250,245,235,150,152,152, 24,140, 30, 61, +154,119,245,234, 85,203,176, 97,195,192,227,241, 48, 96,192,128,202, 93,187,118,205, 2,240,153, 11, 98,235,137, 57,198,179,133, +204,213,181,143, 92, 17,151,117,113, 82, 20, 5,141, 70, 3,190,117, 86,150,171,156,236,208,161,253, 11, 72,211, 52,124,124,124, +108,149, 7,107,209, 98,133,150, 51, 94,103, 11,146,202,100, 50,175, 91,183,110, 69,177, 19, 47,138,139,139, 49, 96,192,128, 59, +165,165,165,143,112,105,243, 49,127,207,146,204, 16, 0, 67, 88,177,213,117,100, 16, 69,243, 40, 92, 59, 82,130,171,135, 74, 47, +155, 42,209, 27,192, 90, 0,255, 5,176, 20,192, 92, 0,211,236,142, 31, 58,172, 32,117, 66,125,242,198, 60, 25,203,155,188,241, + 28,190,220,181, 23,239,110,173,114,220,223,245,201,125, 76,125,105, 33,218, 69,183,115,109, 45, 32, 6, 48,154, 45, 80,105,117, + 80,105, 53,120, 82, 96,223,135,117,235,214, 33, 61, 61, 29, 58,157, 14,171, 87,175,182, 77, 42,176, 23, 89,143, 33,184, 50,164, + 82, 41, 51,100,200, 16,156, 63,127, 30, 98,177,216,132,122,172,127,197, 16, 6, 70,179, 25, 58,173, 22, 42,231, 67,110, 78, 27, + 48,163,201, 4,134,177,160,107,135,112, 92,191,118, 13,114, 94, 49,254,132,176,169,234,244,244,116, 24, 12, 6, 44, 90,180,200, +242,203, 47,191,156, 68,213, 2,168,172, 5,111, 66,223,190,125, 63,150,203,229, 62, 7, 14, 28,120, 27,192,247,117,197,221,100, +182,138,246,199, 76,199,218, 70, 4, 28,249,100,213,103,201, 29,251,134,149, 97, 24,252,223, 27,111, 96, 96,104, 37, 70,119, 14, +132, 58,255, 14,100,222,129,160,124, 34,177,252,139,131,184,113,223,229, 69,137, 9, 0, 12,233, 59, 18,237, 91, 61,186, 60, 88, +175,231,170,250,100,103,142, 95, 68, 97,113,158,219,113, 87,171,213,181, 90,174,220,176,104,217,222, 57, 54,253, 58,118,236,136, +230,205,155,227,228,201,147,232,212,169, 19,238,222,189,139,187,119,239, 34, 43, 43, 11,215,174, 93, 67, 89, 89,153,219,121,180, +231,200, 86,148, 41, 75, 33, 18,138, 80, 90, 94,140, 7,185,153, 8,246, 15,121,236,124,103,209,114,216, 66, 0, 64,104,160,183, + 91, 66,203,158,115,217,178,101,143,136,247,122, 46,223,100,207,127,177,174, 99,119,159,255, 61, 81,155,208,202, 84, 40, 20,221, +199,142, 29, 27, 15,160,171,245, 92, 5,128,109, 71,143, 30, 29, 25, 20, 20,212,191, 71,143, 30,124,145, 72,132,148,148, 20,236, +218,181,235,123, 0, 91,235,250, 35,145, 72,164,141,140,140,148,178, 5,145,125, 17,189,188,188,120, 75,151, 46,165,214,175, 95, + 95,171,149,203, 89, 6, 85, 84, 84, 64,173, 86,195,219,219, 27, 70,163, 17, 67,134, 12,177,164,167,167, 67, 40, 20, 98,196,136, + 17,150,180,180, 52, 91, 70,255,239,127,255, 11,215,106,181,207,254,244,211, 79,131, 1,244,113, 35,173, 88,199,120, 15,184,232, + 0, 95, 91, 47,207, 21,184, 58, 28, 87, 27,231,204,153, 51,235,197, 41, 20, 10,205,236,202,239, 52, 77,195,104, 52,162, 83,167, + 78, 40, 42, 42,178,189, 52,114,185,220, 38,178, 92, 17, 90,206, 22, 36,229,243,249, 48, 24, 12,232,211,167, 15, 40,138,194,154, + 53,107,234, 10,107,145, 54, 15,111,236, 89,146,249, 63, 86,108, 73, 60,248,208, 41,205, 56,241,101, 25, 12, 37,240, 26, 51,102, +204,248,157, 59,119, 98,233,210,165,211,226,227,227,149, 47,188,240,194,180,237,219,183,219,142, 1,196, 59, 34,150, 18,239, 74, +205,249,230,178,100,220,129,157,136, 3, 43,226, 42,110,120, 34, 89,119, 6, 87, 83,175, 3, 0,214,174, 93, 11,212, 53, 20,203, + 48,148,135,135, 63, 66, 67, 91, 32, 48, 72, 7,198, 69,231, 17, 87, 49,103,206,156,106, 98,202,209,202,203,246, 67,140,245, 17, + 54,246,251,122,113, 0,182, 33, 47,181, 90,247,216, 66,139, 21, 27, 62, 94, 66,132,133, 53, 64, 69,129,253,176, 62, 5,118,170, + 82, 85,152, 73,189, 29,110, 89, 4, 5, 5,117, 47, 42, 42,218, 91,227,116, 41,128,143,235,232, 88,218, 50, 58, 59, 59, 27, 49, + 49, 49, 56,116,232, 16,111,247,238,221,207,237,219,183, 47,237,206,157, 59,217,157, 58,117,106, 56,117,234, 84,113,159, 62,125, + 80, 92, 92,140,206,157, 59,127,148,155,155, 91,135,208,178,166,163, 78, 15,181,250,201, 91, 71, 29, 89,179, 30,167, 97,100,211, +125,193,130,127, 99, 96,131,114,140,234,224,141,164,253,103, 49,161,163, 20, 48,136,221,230, 99,195,226, 23,218, 24,145,209,221, + 31,185, 46,246,170, 90,203, 53, 50,186, 59,232,236,187,110,199,221, 62,204, 53,203, 76,125,202,144,125,122,190,254,250,235,152, + 59,119, 46, 6, 15, 30,140,187,119,239, 34, 57, 57, 25,119,239,222,197,204,153, 51, 17, 29, 29,141, 14, 29, 58,184,197,185,239, +216, 14, 84,170, 42, 64, 83, 52, 74, 43, 74,160,211,107, 49,103,218,130,199,206,119, 91,227,127, 44,161,106,116,224,232,229,122, +115,126,240,193, 7, 40, 40, 40,168,102,201,122, 28,191,172,191, 58,234, 90, 45, 45, 19,192,255, 57, 24,174,240, 92,180,104,209, +160,128,128, 0, 80, 20,133, 47,190,248, 2,126,126,126, 61, 1,220, 48, 24, 12,197,106,181,122,182,157, 8, 25, 8,235, 90, 27, +133,133,133, 14,231,237,171,213,106,227,160, 65,131, 4, 13, 26, 52,168, 54,219, 80, 46,151,215,102,221,177,113,178,215,204,102, + 51,230,204,153,131, 37, 75,150,160, 81,163, 70, 24, 54,108, 24, 98, 99, 99, 65, 81, 20,134, 12, 25,130, 97,195,126, 27,202,245, +241,241, 17, 30, 58,116,168, 47, 77,211,105,118, 13, 72, 53, 78, 71, 96, 29,227, 77, 38,147,171, 14,240,213, 56,217,194, 54,115, +230, 76, 44, 89,178, 4,243,231,215,237,234, 81, 75, 35,254,212, 57, 75, 75, 75,171, 85,246, 50,153,108,205,232,209,163,249,217, +217,217,213,196,149,253,230,160, 34,170,198,233,108, 65, 82, 30,143,135,224,224, 96, 44, 94,188, 24,254,254,254, 8, 9, 9,113, +180,144,159, 61,103,158,189,216,122,246,165, 16,236, 93,150,137,231,187,141,197,237, 83, 43,245,110, 52, 16,213,194,105,177, 88, +178,222,121,125,110,208,138,245, 75,121,172,216, 98, 69,220,233,175, 85, 88,149,248, 45,250,244,238, 99, 51,179, 39, 39, 39,155, + 29, 88,121,108,156, 22,194,164,126,154,248,239, 94,223,109,220, 39, 16,139,128,115,201, 59, 81, 89, 86,125, 56, 73,111,252,109, + 42,181,168,211,115, 48, 92, 62,238, 82, 89, 98,197,244,194,133, 11,177,112,225,194, 58, 35,185,110,221, 58,167,156,174,138, 46, +119,210,211,106,210,162,100,114, 95, 72,228,161,104, 19,237, 11,134,152,221,173,163,108,156, 53,197, 70, 64,128, 63, 42, 10,170, +203, 58,202,150, 70,117,106, 96,103,113,255,229,226,197,139, 35,252,253,253,145,147,147, 19, 40, 16, 8, 70, 84, 51, 87,105,181, +136,140,140,108,161, 80, 40,158,117,198, 57,115,230, 76,253,135, 31,126, 40, 30, 55,110, 28, 70,143, 30,141,113,227,198,137,133, + 66, 97, 51, 66, 8,140, 70, 35,114,114,114,112,252,248,113, 40, 20,138,155,117,133,147, 33,132,146,202,124, 32,145, 55, 64,155, +182, 62, 96, 24,115,125,235,124,135,117, 72, 77,107,150,155, 34,203, 97,249, 4,128, 95,142,239,197,130,119,219,226,251, 3, 23, +176,234, 34,208,222,167, 8,109, 2, 21, 96, 20, 55,241,254,132, 46, 88,254,195,165,170,119,233,148,211, 60, 34,117,149, 65,157, +214,248, 88,113,183,183, 92,217,255,143, 11, 62, 90,143,112,178,157, 68,165, 82,137,242,242,114, 36, 37, 37,225,213, 87, 95, 69, + 81, 81, 17,178,178,178,112,231,206, 29,108,217,178, 5, 50,153,172, 94,121, 52,235,141, 15,240,225,242,247, 64, 64,208, 50,170, + 13,226,227, 22,162,107,251, 30,143,157,239, 53,225,130, 53,171, 86,206, 21, 43, 86,212,183, 44,253,227,132,150, 67, 4, 4, 4, +140,235,219,183, 47,116, 58, 29, 2, 3, 3,145,149,149, 5,154,166,155, 2, 85, 67,120, 97, 97, 97,219, 20, 10, 69, 83, 87,249, +120, 60, 30,204,102,179,205,247,135,221, 0, 96,248,240,225,248,241,199, 31,157,246, 40, 66, 66, 66,208,176, 97, 67,188,243,206, + 59,143,204,114,176,159,233, 32,149, 74,113,224,192,129,130,210,210,210, 82, 66,136,194,157,120,179,142,241,103,206,156,113,217, + 1,222, 30, 70,163, 49,251,206,157, 59, 13,214,173, 91,199,171,163,241,179,161,150, 70,252,169,115, 58,234,153, 18, 66,106, 21, + 89,174, 44, 35,224,108, 65, 82, 62,159,143,219,183,111, 99,193,130, 5,160, 40, 10, 59,119,186,228,195,147,167,205,195, 27,187, + 23,103, 46,221,147,144, 57,218, 84, 1,201, 73,245,202, 59, 0, 86,239,216,177,163, 3, 69, 81,236, 80,225,127,119,236,216,225, +105,127, 92,171,169,172,168, 40,230,197, 23, 95, 60, 74, 81, 84, 83,221,201, 10, 79, 0, 34, 86,196,229, 94,211,169, 94,158,240, +178,129,207,231, 91,126, 51, 88, 49, 89,133,133,133,207,215,198,119,253, 86,201,122,154,166,125,135, 63,223,171, 29, 40, 10, 70, +195,163, 35,213, 30,101, 42,155,200, 26,253,217, 86,236,158, 53,214, 21,209,147,113,250,244,105,191,117,235,214,241, 93,201,247, +211,167, 79,155, 9, 33,110, 15,251,177, 13,142,209,104,132, 86, 91, 63, 43, 10, 33, 36, 37,225,147, 15, 7,109,216,116, 80, 64, + 81, 6,156, 59,181, 19, 21,229,142,221, 25, 68, 2, 62,214, 39,237, 50, 11, 5, 60,135, 78, 39, 79, 80,108, 56,195,151,163, 70, +141, 26,183,122,245,234, 54,142, 46,186, 48, 9, 38, 75,167,211, 33, 55, 55, 23, 26,141,102,199,188,121,243,140, 7, 15, 30,124, +109,204,152, 49,232,208,161, 3, 26, 52,104,128,252,252,124,100,100,100, 32, 41, 41,137,156, 61,123,118, 7,128,233, 78,210,113, +111,226, 39, 31, 78, 78,250,225,160,136,166,140, 56,151,188, 19, 21, 53, 68,251,163,214,105, 1,190,249,126,151, 81, 40, 20,220, +114,102, 45,178,183,102, 61,201,134,113,196,196, 56,140, 94,185, 10, 77,187,198, 32,113,233, 64,124,243,201,139,248,124,136, 16, +198,237, 19,208,254,133, 13,216,188,104, 40, 0, 32,244, 27, 23,173, 37,124, 33, 30, 58,176, 88,149, 87, 72,172,226,198, 61,171, + 41, 27,247,186, 44, 87,238, 90,180,104,154, 70,227,198,141,209,180,105, 83,244,236,217, 19,157, 58,117, 66,255,254,253,113,245, +234, 85, 92,189,122, 21, 51,103,206,172, 75,100, 57,205,163,126,207, 14,194,133,222,183, 30, 59,111,106,230,251,147,128, 43,101, + 41, 46, 46, 14, 0,254, 81,214, 45,183,133, 86,101,101,229, 85,134, 97,218,121,123,123,179, 22, 41,219,181, 7, 15, 30,128, 97, + 24,141,187, 25, 99, 48, 24,216,197, 49,171,173,203,196, 58,199,215,245,226, 19, 66, 44,165,165,165,232,219,183, 47,122,247,238, +109, 27, 62,177,223,236,132, 9,118,239,222, 13, 66, 72, 55,119,227,109,231, 24,175,130,155, 14,240,108, 35,222,167, 79,159,163, +124, 62,223,165,175,104, 58,107,196,159, 22,167,163,252, 97, 24,166, 86,145,229, 74, 69,228,108, 65, 82, 62,159, 15,185, 92,142, + 61,123,246, 32, 32, 32,192,157,224,229,233, 10, 48, 11,192,151,168,154,132,113, 23, 0, 59,141, 47,206,254,221,174,113, 92, 27, +212, 10,133,130,237, 26,134,238, 94,156,185,116,239,210,204,129,140, 30, 59,117, 10,252, 0, 40, 47,194,137,211,114, 77, 92, 77, + 87, 44,171,235,122, 95,127,209, 41, 0,129,163, 63,219,250,240, 84,137, 49, 98,244,103, 91, 31,236,158, 53,182, 81, 93,207, 20, + 20, 20, 12, 30, 59,118,236, 33, 87,243,221,108, 54,103, 22, 20, 20, 60,239,110,153, 37,132,224,214,173, 91,204,235,175,191, 94, +172, 80, 40, 94,172, 79, 5, 19,191, 96,213,231, 75, 62,154,225, 63,100, 80,247,174,160, 1, 67,237,206,191,132, 2, 8, 95,192, +203,158, 61,127,197, 27, 47,190,248,226,239, 42, 54,106, 86,115, 5, 5, 5, 61,255,245,175,127, 77,199,111,174, 19,213,132, 20, +106,153, 93,109,197,202,134, 13, 27,182,229,241,120, 98, 0, 11, 0, 60, 56,123,246,236,151,103,207,158, 29, 12,224, 25, 30,143, +215,192, 98,177,228, 90, 59, 61, 91, 1,252,234,188, 28, 21, 77, 5, 97,194,135, 12,124, 38, 6, 20, 69, 12, 6,189,147, 14, 18, + 8, 8, 33, 66,161,224,214, 47, 87,243,219,215,213,145,178,251, 2,199, 19,159, 65, 60,125,250,116, 76,159, 62,221, 86,158,214, +172,233,141, 29,215,207,224,133,246, 57,208,127,221, 11,148, 87, 35,151, 59,124, 0,240,193,191, 95,127, 98, 97,179,143,187,189, + 69,203,209,123,224,142,143, 22,143,199, 67,113,113, 49,110,223,190,141,194,194, 66,104, 52, 26,164,167,167,195,104, 52,162,172, +172, 12,109,219,182,173,119, 56,159, 84, 30,253,145,156,255,196,225, 67,183,133,150,209,104,252, 79,227,198,141, 5, 18,137,164, +141,197, 98, 1, 33, 4, 22,139,133, 88, 69,141,219,179,240, 4, 2,129,174,121,243,230,148,163,217, 9,236,111,185, 92,174,173, +195, 90,146, 16, 25, 25, 57,143,162, 40, 94,109,189, 16,246, 55,195, 48, 22, 62,159,159, 80,207,180,122, 92,199,120,251, 70,252, + 73,225,105,112,214,204, 31,117,171, 86,173,108, 95,180,175,185, 38,138,245, 99,171,106, 39,226,188,206, 5, 73,213,106,117,126, + 76, 76,140,197,254,186,253,130,166,206, 52,172,117,123,210, 96, 69, 92, 99, 59, 17,103,121,226,255, 66,145, 7, 67,199,189, 22, +113,170,196, 24, 1, 0,172,216, 2, 33, 15,234,120, 74, 91, 80, 80,208,247,105, 87, 14,247,239,223, 55, 60,243,204, 51,155,148, + 74,101, 28,128,122,123,243,207,255,207,154,249, 79, 34, 60, 79, 75,108,212, 86,108, 1, 44,169,103, 80, 31,148,148,148, 12,168, +113,238, 87, 86, 80,177,235,218,185, 29,255,155,197,207, 63,233, 60, 54,155,205, 57, 77,155, 54,117,203,114, 99, 50,153,114,156, + 93,175,185, 70,152, 61,110,192, 27,243,207, 3, 85,147,191, 75, 92,226,212,233,116,165, 61,122,244, 16,184, 25,183, 34, 87,227, +222,160, 65, 3,132,134,134,218,246, 44,106,158,119, 22, 78,179,217,156, 19, 30, 30,142,128,128,128, 90, 87,124,175,233,147,229, + 10,231,147,206,163,186, 56, 67, 67, 55, 60,113,206,250,134,147,131,107, 24,200,113,114,156, 28,231, 95,150,147,199,165, 39,199, +201,113,114,156,191, 35,231,223, 18,156,151, 26, 7, 14, 28,106,131,133, 75, 2, 14, 28, 56,112,120, 60, 80,117,168,210, 99,110, +240,212, 71,217, 30,227, 56, 57, 78,142,147,227,228, 56, 57, 78,142,243, 31,199,233,140,251, 24, 56, 60, 85, 1,198,113,114,156, + 28, 39,199,201,113,114,156, 28,231, 63,143,243,111, 9,110,232,144, 3, 7, 14, 28, 56,112,224,192,129, 19, 90, 28, 56,112,224, +192,129, 3, 7, 14,156,208,226,192,129, 3, 7, 14, 28, 56,112,224,192, 9, 45, 14, 28, 56,112,224,192,129, 3, 7, 78,104,113, +224,192,129, 3, 7, 14, 28, 56,112,224,192,129, 3, 7, 14, 28, 56,112,224, 80, 5, 10, 0,246,239,223,111,251, 32, 96,108,108, + 44,197, 37, 11, 7, 14, 28, 56,112,224,192,225,247,196,223, 90,139,216, 71,142, 3, 7, 14, 28, 56,112,224,192,129,211, 34, 79, + 6, 52, 39,182, 56,112,224,192,129, 3, 7, 14,156,216,226, 34,198,129, 3, 7, 14, 28, 56,112,224, 68,214, 95, 10,213, 44, 90, +156,224,226,192,129, 3, 7, 14, 28, 56,252,145, 98,235, 47,170, 69,136,117,179, 63,230,192,129, 3, 7, 14, 28, 56,112,224,240, +152, 2,171,174, 61, 7, 14, 28, 56,112,224,192,129, 3,135, 39, 36,184,216,223,191,155,208,226,190,108,206,113,114,156, 28, 39, +199,201,113,114,156, 28,231, 63, 22,124, 46, 9, 56,112,224,192,129, 3, 7, 14, 28, 30, 27,246, 86, 44,138, 19, 90, 28, 56,112, +224,192,129, 3, 7, 14, 79, 78,100, 81,142,142,185,111, 29,114,224,192,129, 3, 7, 14, 28, 56, 60, 37,112, 22, 45, 14, 28, 56, +112,224,192,129, 3,135,199, 3, 5,110,232,144, 3, 7, 14, 28, 56,112,224,192,225,169,138, 45,135, 39,107,155, 57,112,204, 13, +242,250,204, 62, 56,198,113,114,156, 28, 39,199,201,113,114,156, 28,231, 63,142,211, 25,247, 49,252,245,208, 23,192, 73, 0,253, +172,251, 90,133,215,147, 6, 55,245,149,227,228, 56, 57, 78,142,147,227,228, 56, 57,206,191, 59,106, 93,168,148,115,134,231,224, + 12,124,212, 61,196,236,236, 58, 7, 14, 28, 56,112,224,240, 79, 19, 91,196,190,145,116,132,102, 0,230, 3,240,182, 59,119, 17, + 64, 66,141,251,126, 0, 32,179, 59, 86, 3, 88, 4,224,174,211,208, 16, 34,180,242,139,173, 27, 3, 64, 7, 64, 15, 64, 73, 81, +148,137,203,179, 63, 28, 61, 0,196, 90,127,239, 7,112,206,205,235,127, 43, 52,104,208, 64,234,235,235, 59,248,242,229,203,162, +244,244,116,156, 62,125,154,172, 95,191,222, 88, 86, 86,118, 36, 63, 63, 95,203, 21,151,191, 5, 98, 0,196, 91,127, 39, 2, 56, +252,152,124,148, 76, 38,155, 41,151,203,135,138,197,226, 80,179,217, 76,105, 52,154, 60,181, 90,125,212,108, 54,127,102,173,247, +220,197, 72, 63, 63,191,215, 90,182,108,217, 44, 43, 43, 43, 55, 47, 47,239, 7, 0,219, 1,188, 24, 26, 26, 58, 33, 50, 50, 50, +236,214,173, 91,119, 75, 75, 75,191, 1,176,247, 15, 12, 39, 7, 14,255, 36, 80,117, 89, 35, 28, 97, 1, 33,100, 66, 53, 6,234, + 81,142, 1, 3, 6,140, 56,114,228,136,140, 97, 24,176,155, 84, 42, 53, 3,120,197,137,200,242, 79, 73, 73,137,136,139,139, 27, +157,151,151,215, 69,169, 84,118, 3, 0,153, 76,118, 33, 40, 40,232,151,149, 43, 87,110, 33,132,228, 80, 20,165,116, 51,162,124, +129, 64,240,170,175,175,239, 80,179,217,220,137, 16, 2,129, 64,112,185,172,172,236,176,201,100,250, 6, 64,125,196,155,136,207, +231, 79, 23,139,197, 49,102,179,185, 29, 0,240,249,252,107,122,189,254,176,217,108,254, 18,128,161, 30,156, 18,145, 72, 52,221, +203,203,107,144,193, 96,104, 7, 0, 34,145,232, 90,101,101,229, 81,131,193,240,165, 85,112,254,209,224, 3,136, 37,132, 8, 0, +128,199,227,141,236,214,173, 91, 4, 69, 81, 12, 69, 81,132, 16, 66, 93,184,112,161,163,197, 98,161,173,229, 35, 22,192, 47, 0, +204,127,197, 55, 36, 32, 32, 96, 9,195, 48,161,117,102,154, 68,210,229,242,229,203, 45,183,109,219,102,249,250,235,175,203,167, + 76,153,226, 17, 23, 23,199, 95,179,102,205,151,249,249,249,111,215,188,223,223,223,255,115,154,166, 3, 92,249,127,134, 97,138, + 75, 74, 74,222,251,163,226, 63,121,178,174,154,185, 59, 41, 73, 18, 5, 32,167,158,229,251,233,113,234, 38, 19, 0, 72,146, 36, + 69, 77,214, 77,206, 96,127, 63, 46,175, 29,226,191, 58,166,236, 67, 8, 48,125,144, 39,253,184, 66, 43, 44, 44, 44,105,242,228, +201,227,218,181,107,199, 39,132,192,100, 50, 65,175,215,183, 60,119,238, 92,191,157, 59,119,118, 81, 42,149, 47,186, 73,249,198, +220,185,115, 23,127,252,241,199, 1, 2,129,128, 50,153, 76, 81,219,182,109,235, 52,117,234,212,119,214,173, 91,215,240,165,151, + 94,242,100,207, 47, 88,176,160,107, 98, 98, 98, 19, 0,159,253, 1,225,228,192,225,159,134,190,168,238,163,245, 17,128,133,117, + 9, 45,185,181,241, 44,180, 90,178, 96,183,183,225,196,137, 19,251,248,124, 62,107,209,234,166, 86,171,131,107, 88,193, 28,137, +172,200,137, 19, 39,246,216,177, 99,199,146,151, 94,122,169, 64, 38,147, 53, 31, 51,102,140,146,162, 40,222,182,109,219, 58, 54, +109,218, 84, 58,124,248,240,137, 3, 6, 12,152, 69, 8, 57, 77, 81,148,194,197, 72,182,241,243,243,219,181,108,217,178,136,152, +152, 24, 97, 64, 64, 0, 8, 33,200,203,203, 11, 59,112,224,192,144,143, 62,250,104, 86,105,105,233, 40, 0,105,110, 36, 92, 87, +169, 84,186,227,163,143, 62,106, 48,100,200, 16,126, 72, 72, 8,116, 58, 29,210,211,211, 7, 30, 62,124,184,207,186,117,235,222, +214,106,181, 47, 88, 5,134,171,232,230,237,237,189,243,187,185,115,131,187,191,250, 42,223,207,207, 15,132, 16, 40, 20,138,129, +103, 54,108,232, 55,109,217,178,183, 43, 42, 42,254,229, 40,189,255, 72,136, 68, 34,122,227,198,141, 29, 68, 34, 17, 0,192, 96, + 48, 32, 58, 58,154,250,187,188, 33, 20, 69,133,231,229,229,121, 11,133, 66,135,215, 45, 22, 11,250,244,233,211, 88, 40, 20,226, +179,207, 62, 51, 21, 23, 23,119, 92,189,122,245,229,205,155, 55, 7,124,249,229,151, 47, 0,120, 68,104,209, 52, 29,144,147,147, +227,144,211, 98,177,192,104, 52,194,108, 54,195, 96, 48,160,117,235,214,127,104,252,147,146, 36,225, 0,222,155, 60, 89,247,174, +245,212,103, 0,102, 1,184,143,122,126,179,235, 41,112,218,151,183,207,237,126, 63,118, 88,237, 16, 1, 0, 7,175,234, 0,192, +239,113,211, 85, 46,151,183, 26, 63,126, 60, 95,161, 80, 64, 32, 16,192,104, 52,162,160,160, 0,209,209,209,188, 77,155, 54,181, +112,151, 47, 42, 42,106, 74, 98, 98, 98,224,193,131, 7,141, 27, 55,110, 52, 12, 26, 52, 72, 48,101,202, 20,175, 62,125,250,180, + 14, 15, 15,167,191,253,246, 91,253,209,163, 71, 77, 19, 39, 78, 20, 37, 36, 36, 4, 30, 56,112, 96,120, 90, 90,218,103,191,119, + 56, 57,112,248, 7,226, 36,126, 91,226,129,221,215, 41,180, 96, 39,174, 70, 2,128, 64, 32,232, 24, 28, 28,156,100, 54,155, 67, +172, 86,157,130,194,194,194,207, 76, 38,211, 21,235,189,123, 25,134, 25,225,204,146, 53,113,226,196, 30,135, 14, 29, 90,126,238, +220,185,138,146,146,146,144,125,251,246,233,102,205,154,149, 5, 0,247,239,223,111, 50,124,248,240,176, 25, 51,102,228, 12, 30, + 60,120,101,255,254,253,223, 34,132, 28,165, 40, 74,237, 76,100, 69, 71, 71,167, 36, 39, 39,123,250,248,248, 84,187, 16, 25, 25, +137,183,222,122, 75, 56, 98,196,136,166,207, 61,247,220,217,140,140,140,222, 0,174,187, 34,136,154, 53,107,118,236,196,137, 19, + 30,190,190,190, 40, 47, 47, 71, 65, 65, 1, 52, 26, 13,188,188,188,240,210, 75, 47, 9,251,246,234,217,112,198,204,183,143,229, +228,230, 14,116, 81,108,117,235,217,166,205,177,205, 9, 9, 30,166,135, 15, 33,149, 74,161, 82,169, 0, 0,158,158,158,232,210, +184, 49,255,210,134, 13, 97, 19,230,204, 57,246,203,237,219, 3,255, 32,177, 37,182,238,245, 0,246,243,120,188,145, 34,145,136, + 30, 57,114, 36,142, 29, 59, 70,233,116, 58,190,213,186, 99, 30, 57,114, 36,164, 82, 41, 12, 6,135,200,170, 5, 0, 0, 32, 0, + 73, 68, 65, 84, 3,131,170,161, 67,243, 95,249, 45, 17,137, 68,200,200,200,168,118, 78,169, 84, 66,161, 80,160,164,164, 4,122, +189, 30,229,229,229, 96, 24,134,146, 74,165, 10,134, 97, 64,211,116, 77, 1, 80, 13, 66,161, 16,183,111,223,174,118,206,108, 54, + 67,173, 86, 67,175,215,195,104, 52, 66,169, 84, 74, 61, 61, 61,155, 5, 4, 4,228, 0,216, 91, 90, 90,250, 89, 97, 97,225,131, +223, 57,250,197,172, 32, 74, 74,146,220, 3, 32,250, 51,114,218, 89,178,194,172,199,191, 62,161,176,178,120,184,255,138,174,145, +213, 58,150,249, 4,248, 24, 0, 56,125,250, 52, 10, 11, 11, 81, 92, 92, 12,133, 66,129,240,240,112, 16, 66,220, 30,142,203,200, +200,248,170,109,219,182,212,141, 27, 55, 14, 3, 88,179,109,219,182, 87, 74, 75, 75,227,103,207,158,237,247,233,167,159,150,206, +153, 51, 39, 17,192,247,219,182,109,123,179, 85,171, 86, 67,111,222,188,185,238,143, 8, 39, 7, 14, 79, 26,132,144,174, 0, 2, +217,186,197, 90,239,250,219, 29, 95,165, 40,202, 96,119,159,193, 90, 55,212,220,179, 96,143, 21, 20, 69,253, 98,247,156,130,162, +168, 95,234, 27,204, 26,251,170, 78, 55, 0,236,223,191,159,176,155,163, 39,131,130,130,102, 14, 24, 48, 96,121,106,106,106,235, +252,252,124,223,252,252,124,223,212,212,212,214, 3, 6, 12, 88, 30, 20, 20, 52,211, 46, 33,106, 62,122,204,238,154, 48, 37, 37, + 37, 98,215,174, 93,137,199,142, 29,171,232,216,177,163,225,196,137, 19,230,193,131, 7, 23, 89, 27,104,243,224,193,131,139,126, +254,249,103, 75,247,238,221,165,135, 14, 29,202, 62,123,246,236,231, 59,118,236, 8, 38,132,240, 28,113, 90, 33,240,241,241,217, +115,234,212,169, 71, 68,150, 61, 26, 54,108,136,253,251,247,123,249,248,248,236, 5, 32,172, 45,156, 86, 72, 36, 18,201,206,159, +127,254,217,195,211,211, 19, 69, 69, 69, 16, 8, 4, 8, 10, 10, 66, 69, 69, 5, 10,242,243,241,224,206, 29,208, 6, 3,190,248, +228, 99, 79,169, 84,186,195, 65,101,255, 8,167,183,183,247,206,205, 75,150,120,148, 28, 59,134, 95, 23, 47,134,209,104,180, 13, +185, 26,141, 70,156,141,139,131,226,248,113,124,187, 96,129,135,183,183,247, 78, 0, 18, 39,156, 79, 2,246,156,113, 0, 74,173, + 91, 28,128,115,209,209,209,169,233,233,233,232,221,187, 55,182,111,223,222,126,246,236,217,113,179,103,207,142,219,190,125,123, +251,222,189,123, 35, 61, 61, 29,209,209,209,169,168,238,159,245,180,195,249,212, 56, 45, 22, 75,181,141, 97,126,107, 99, 66, 67, + 67,139,118,237,218,133,151, 94,122,137, 22,137, 68,249, 99,199,142, 21,159, 57,115,134, 88, 69,166,203,225,212,233,116,208,106, +181, 80,171,213,184,127,255,190,116,217,178,101,189, 22, 46, 92, 24,117,236,216,177,176,249,243,231, 79, 11, 12, 12,188, 28, 28, + 28, 28,241, 59,199,221, 88,227,247, 23, 0,114,221,180, 16, 61,109, 78, 98,125, 30,147,117,147, 59,216, 85,176,238,242,214,149, +158, 5,214,176,170, 1, 60,120,156,178, 52, 96,192,128,182, 81, 81, 81,193,219,110,248,162, 76,216, 18,140,208, 7,140,208, 7, + 22,255,174,200, 16, 61,143, 70,141, 26, 5,123,120,120,244,112, 51,156, 27,111,220,184,241,140,181,167, 92, 2, 96,249,156, 57, +115, 62,162, 40,234,244,156, 57,115, 62, 6,176,220,122,126,241,205,155, 55,187, 3,216,252, 7,133,243, 47,241,190,115,156,127, + 46, 78, 39, 90, 36,144,162,168,253, 20, 69,237,159, 55,111, 94,127, 0,254, 53,142,159,181,191, 15,128,200,209,158,221,236,206, + 7, 18, 66,134,217, 61, 23, 88,207,224, 83, 14,182,223,132, 22, 0,196,198,198, 82,177,177,177,236,133,139, 20, 69,237, 3,112, + 81, 32, 16,116,236,208,161,195,200,159,126,250,201, 51, 48,240,183,255, 15, 12, 12,196,142, 29, 59, 60,219,180,105, 51, 82, 32, + 16,116, 4,112,209,203,203,107, 95, 29, 86, 24,159,184,184,184,209,147, 38, 77,170,236,216,177, 35, 0,148,167,165,165,201,186, +119,239,174, 54,155,205,148,217,108,166,186,119,239,174, 78, 75, 75,147,153, 76, 38,101,215,174, 93,229,207, 61,247, 92,214,123, +239,189, 55,209,129,224,176,199,248,165, 75,151,134,251,250,250,214,165,132,161, 84, 42, 17, 28, 28,140,184,184,184, 16,129, 64, +240, 90, 93,169,197,231,243,167, 47, 93,186, 52,200,199,199, 7,101,101,101, 8, 15, 15,135,193, 96,192,237,219,183,161, 83,171, + 96, 82, 86,194, 84, 89, 14,197,189,187,240, 17,240, 49,113, 68,108, 48,159,207,159,238,196, 90, 50,253,155, 57,115,130, 13, 89, + 89,184,191,125, 59, 44,230, 71,141, 63,102,163, 17,215,254,247, 63,232,114,114,144,248,250,235,193, 34,145,104,250,239,108,201, +250,148, 16, 34, 37,132, 72, 41,138, 90,217,163, 71,143, 77, 82,169, 52, 46, 33, 33, 33,230,200,145, 35, 67,146,147,147,251,153, +205,102,129,217,108, 22,156, 62,125,186,183, 78,167,227,139,197, 98,240,249,124,130,191, 41, 4, 2, 1,132, 66, 33,164, 82, 41, +122,245,234,117,111,253,250,245,166,240,240,112,193,206,157, 59,125, 67, 67, 67,229,107,214,172, 41, 87, 42,149, 75, 93,229, 51, + 26,141,208,235,245,208,106,181,208,233,116, 56,113,226, 68,227, 25, 51,102,240,117, 58,157,101,248,240,225,165, 38,147, 73, 63, +103,206, 28, 47, 63, 63,191, 89,191,103, 60, 39, 79,214, 49, 86,203,211, 77,171,104,201,196, 99,250, 60, 61, 13, 78, 0, 6,171, + 79, 22,139, 0, 43,183,225, 9, 37,133, 25,128,202, 42,180,244, 53,222,143,118,118, 22, 95,167, 40, 47, 47, 95,247,205, 55,223, +132,211, 98, 31,156, 49, 12,197, 22,230, 35, 28,241, 94,131,162,136,247, 17, 20, 30,133,113,227,198, 5, 17, 66,214, 60,129, 48, +175, 6,208, 7,192,202,250, 60,252, 59,132, 51, 66, 46,151,111,247,244,244, 60, 35,151,203,183,195, 58, 60,251, 56, 24, 20,133, +129, 35, 90,209, 57,131,154,130,140,104, 69,231, 12,138,226,150, 26,248,187,160,134, 22,177,135,130, 16, 18, 75, 8,137, 77, 76, + 76, 92, 98,215,190,179,199, 82, 23, 45, 99,177,132,144,216,106, 10,169, 74, 96, 61,182,209,205,193, 86,165, 41,236,149,164, 93, +228,108,179, 11,131,131,131,147,146,146,146, 60,107, 50,230,231,231,163,178,178, 18, 31,126,248,161,231,164, 73,147,222,206,201, +201,153,236, 36, 16,162,130,130,130, 78, 19, 38, 76,144, 24,141,198, 50,134, 97,232,202,202, 74,190,183,183,183,133,189,193,219, +219,219, 82, 81, 81, 33, 80,171,213, 60,139,197,162,159, 52,105,146,232,245,215, 95,239, 2,128, 87, 27,105, 96, 96,224,160,161, + 67,135,214, 58,116, 96, 50,153,160, 86,171,161, 86,171, 97, 52, 26,209,171, 87, 47,241,250,245,235, 7, 23, 21, 21,253,183, 86, +197, 33, 22, 15, 26, 52,104,144,160,180,180, 20,222,222,222,120,240,224, 1, 50, 51, 51,161, 87,169, 96, 84, 85,194,168, 82,194, +172,172, 4,169,172, 64,201,221, 91,232,222,170,165,240, 7,177, 56, 70,173, 86,127, 94, 27,167,151,151,215,160,238,175,188,194, +151,203,229,232, 55,161,106,158,193,161, 86,173, 64, 44, 22, 48, 22, 11, 44,102, 51, 98,110,223,134,201,100, 2, 77,211,232, 90, + 90,202,247,218,176, 97,144, 66,161, 88,254, 71, 20,118,177, 88,204,223,184,113,227,120,145, 72, 4, 66, 8,101, 48, 24,112,228, +200,145,127,220, 75, 47, 18,137, 32,145, 72, 96, 52, 26, 17, 25, 25,169,157, 48, 97, 66,202, 39,159,124,210,136,166,105,185, 80, + 40,252,169,164,164,100, 73,126,126,254,125, 87,249, 76, 38, 19, 12, 6, 3, 12, 6, 3,180, 90, 45,238,221,187, 23,210,184,113, + 99, 42, 46, 46,206,162,209,104,154,172, 90,181, 42,227,200,145, 35,178,165, 75,151,142, 1,240,214,239, 29,223,201,147,117,173, + 0,180, 74, 74,146, 8,173,150, 95,195,159,140,147,160,202,241, 29, 73,146,164,116, 0,138, 39, 40,178, 68, 0,188, 27,249,243, +213, 2, 30, 84, 0, 60,173,162, 96, 12, 69, 81,221, 91,183,110,237,155,158,158, 94, 70, 8, 57, 15, 96, 11,128,252,186,200, 24, +134,161, 24,134,193,212,110,229,136,235,193,131,201, 84,129,138,138, 10, 60,120,240, 0,105,105,105,184,112, 33,173,190,239,230, +107, 30, 30, 30,131, 37, 18, 73,164,217,108,166, 85, 42,213, 3,141, 70,115,140, 97,152,117,168,135,143,218,211, 10, 39, 11,185, + 92,190,108,254,252,249, 61,189,189,189,113,229,202,149, 38, 91,183,110, 93,166, 86,171, 31,203,185, 94, 34,160,191,253,124,197, +154,176,176, 32, 31, 92, 77,254, 49,108,201,218,109,223, 2, 76, 56, 39, 83,254,250,168,161, 69,236,197,208, 47,132,144, 97, 20, + 69,237,175, 41,148,220, 50, 59, 61,230,243, 78, 44, 90, 53, 63, 44, 93, 93,104,213,162, 32, 97, 54,155, 67,236, 45, 89,132, 16, +228,231,231, 35, 55, 55, 23, 10,133, 2,190,190,190, 48, 26,141, 33,174,212, 15, 74,165,178,155,191,191,191, 70, 32, 16,232,181, + 90, 45,100, 50, 25, 35, 16, 8,136,245,127, 40,235,172, 69,139, 94,175,167,248,124,190,201,211,211,211, 67,175,215,183, 68, 29, +190,100,132,144,110,254,254,254, 14,175,233,245,122,168, 84, 42,168,213,106,168, 84, 42,232,245,122, 4, 7, 7,195,108, 54,119, +170,179, 75,107, 54,183, 11, 12, 12, 68, 94, 94, 30,164, 82, 41,114,114,114, 96, 80, 41, 97, 84, 42, 97, 86, 87,194, 82, 81, 1, +166,178, 18,140,186, 18, 38,131, 6, 97,205, 91,129,157,145, 88,107, 55,220, 96,104,231,239,239, 15,181,250, 55,119, 51, 98, 21, + 88,102,179, 25,102,171,115, 52, 59,156, 24, 16, 16, 0,118, 70,226,239, 4, 61,128,217, 52, 77,175, 20,139,197,252,105,211,166, + 33, 63, 63,191, 90,153,152, 54,109,154,205, 39,171, 79,159, 62,167, 37, 18,137, 89,161, 80, 64,175,215, 11,254,174, 47, 61, 69, + 81,160, 40,170, 42,143,204,102, 4, 4, 4,168,139,139,139, 47,148,151,151,143,175, 15,159,201,100, 98,103,116, 65,171,213,130, + 16,130, 43, 87,174, 64, 34,145, 8, 44, 22,203, 13,179,217, 44, 19, 8, 4,160,173,206, 95,191, 23,172, 51, 2, 63, 3, 16,110, +181, 16,189,134, 42,135,243, 92, 7, 21,137, 75, 73,231, 34,167,251,194, 77, 55,153,181, 52,229,162,126,195,145,142,208,175,165, +143,232,243,132,238, 65, 62, 29,134,203,213, 50, 17, 79,205, 60,232, 16,249,221,167,105, 91, 39, 77,124,205,115,209,162, 69, 17, + 1, 1, 1,146,140,140, 12,221,199, 31,127,220,120,227,198,141, 20,170,134,233,106,197,195,135, 15,119,207,159, 63,223,111,232, +208,161, 77,196, 98, 49, 85, 81, 81, 1,133, 66,129,194,194, 66,100,102,102,146,171, 87,175,222,211,235,245,219,221, 9,100,131, + 6, 13,214,143, 31, 63,126, 82,231,206,157, 5,172,133, 84,173, 86,119, 60,117,234,212,136, 67,135, 14,245, 86,171,213,110,151, +203,236,236,236,237, 31,124,240,129,252,249,231,159,111, 41, 22,139,233, 39, 17, 78,123,208, 52, 29,236,225,225,129, 99,199,142, +193,199,199, 7, 52, 77, 7, 63,110,121,213, 25,153,176,208, 16,127,232,206,126,142,150,129, 17,208, 25,153, 48, 78,162,252,125, + 44, 90,181,180,245, 93, 89,139,148, 19,177,164,141,143,143,159, 79, 81,212,254,248,248,248,249,142, 44, 90,214,159, 22,251,251, +236,238,215, 63,105,177,229,214, 66,147, 12,195, 32, 55, 55, 23,121,121,121,200,205,205, 69, 73, 73, 9,104,154, 6, 33,196,149, +217,103,132,162, 40,230,232,209,163,190, 41, 41, 41,234,174, 93,187,150,179,254, 47,102,179,153, 50,153, 76,148,213, 47,134,122, +240,224,129,240,204,153, 51, 62, 55,111,222, 12,182,246, 86, 25, 39,166,192, 71,206,177, 2,203,126,211,233,116,144, 72, 36,174, +169, 14,107, 67,120, 37, 53,181, 74,100,169,148,214, 33,195, 10, 88, 42, 43, 64,212, 74,136, 44, 38,136, 64, 64,233, 52, 46,167, +159, 61, 88,145,101,180, 10, 45,131,193, 0,147,201, 4,134, 97, 96, 54,255, 33,126,229, 95,181,111,223,190,211,238,221,187,167, +228,230, 62,218, 22,142, 26, 53, 10,111,189,245, 22,102,204,152,113,115,216,176, 97, 87,127,252,241, 71, 76,159, 62, 29, 12,195, +116, 0, 80, 1,224,208,223,237,165,215,235,245, 54, 11,148, 78,167,131,209,104, 4,220,248,172, 66,205,178,201,230,173,217,108, +102,185,169,221,187,119,225,244,233,211,116, 90,218,141,240,105,211,226, 88,135,251,223, 59,170, 57,168,154,185, 39,178, 86, 20, + 6, 84,249, 63,213,182,164, 66, 83,212, 61,100, 71,234,226,124, 28,180, 95,219,254,165,119,223,125,119, 16,170,102, 56,223,127, + 76,139,214,243, 34,154,250,122,102, 59, 63,201,172,246,254,106, 17,159, 82,221,254,122,190, 42,179,145,151, 58,184,161,204, 16, +222,216, 39,116,201,146, 79, 26,220,188,121, 75,255,225,135, 31,166,143, 29, 59, 54,104,214,172, 89,173,119,238,220,217, 91,167, +211,125, 3,160,188, 54,163,203,136, 17, 35,206, 7, 5, 5, 53, 94,187,118,109, 81,118,118,182,175,201,100,146, 27,141, 70, 70, +173, 86,103,106,181,218, 99, 70,163,241, 24,128, 84,119, 2,235,233,233,217,254,149, 87, 94, 17,148,151,151,131,207,231,195,104, + 52,162,168,168, 8, 61,123,246,228,237,219,183,175, 77,125, 18,160,172,172,236,243,111,190,249,230,228,230,205,155, 7,123,121, +121,117, 22,139,197, 33, 0, 44, 74,165,178, 80,173, 86,255, 90,159,112, 86,171,231, 44,150,194,212,212,212,166, 94, 94, 94,120, +248,240, 33, 44, 22, 75,225,227,150, 1,137,144,206,190,150,188,175, 97,171,128,198, 56,147,114, 30, 18, 33,157,205, 45,245,245, +183, 7,235, 67, 5,123, 1,229, 64, 32,165, 36, 36, 36, 72, 19, 19, 19,145,144,144,112,195,145, 69,139, 21, 92, 9, 9, 9, 55, +216,251,236,238, 79,126,140, 48,214,110,209,170, 77, 65, 2, 85,179, 11, 21, 10,133,175,143,143,143, 77, 96,229,229,229, 33, 47, + 47, 15, 34,145, 8, 15, 30, 60,128, 72, 36,202,119,165, 19, 34,149, 74, 47,117,236,216,177,197,253,251,247,133, 31,127,252,113, +195,212,212, 84,175,158, 61,123,182,149, 74,165, 22, 66, 8,116, 58, 29,157,158,158,238,177,124,249,242,176,110,221,186, 25,186, +117,235,118,121,219,182,109, 90,212,177,254, 21, 69, 81, 23,243,243,243,155, 68, 70, 70,178,162,173,154,184,178, 23, 92, 64,213, +144, 39,159,207,191, 92, 87, 64,249,124,254,181,219,183,111, 15,148, 73,196, 48, 40, 43, 97, 84, 85,194,172, 84,194,162,172,128, +165,162, 2, 80, 87, 66,100, 54, 67, 96, 49, 65, 42,145, 32, 55, 39, 7,124, 62,255, 90, 93,156, 34,145,232, 90, 97, 97,225, 64, + 31, 31, 31, 91, 35,106, 50,155,171, 54,139, 5, 6,179,217,102,209, 18, 8, 4,200,206,206,134, 72, 36,186,246,123,151,100,154, +166, 45,236, 18, 14,181,196, 3,193,193,193, 76,247,238,221, 49,125,250,116, 88, 44, 22,107, 54, 80,253, 0,156, 65,149,127,203, + 95, 18,142,196, 45,235,180,174,213,106,161, 82,169, 80, 86, 86,198,151, 74,165, 45,194,194,194,206, 27, 12,134,237,102,179,249, +219,204,204,204,202,218, 56,173,194,204, 38,186, 24,134, 1, 33, 4, 22,139, 5, 38,147, 9, 66,161,144, 57,117, 42, 25,203,191, + 88,134,164,111, 55,146, 17, 35, 70, 80,251,246,237, 3,195, 48, 57,191,115,244, 13, 86,209, 82, 87,165, 81,115, 73,133,247, 81, +247,146, 10,181,113,218,247,254,236,207, 81, 14,238,121, 4,239,190,251,238, 97, 84, 13, 25, 22, 91,197,220,227,112,126, 86,190, +229, 19, 9,204, 22,181,254,212,102,213,166, 59,149,234, 69,155, 86, 92, 50,136,120,149, 93,250, 6,183,107,210,184, 5,207,199, +199,151,254,239,186,149, 37, 63,108,220,145,241,240,225,195,202, 47,191,252,178, 71,139, 22, 45,188,127,253,245,215,176,218,132, +150, 76, 38,107,246,218,107,175,189, 82, 86, 86, 38, 76, 74, 74,218,150,159,159,127, 9, 85, 75,203,216,207,160, 30, 6,224,123, +171, 16, 13,182,214,115,103, 0,124, 92, 87,127,141,162, 40,252,252,243,207,143,204, 14,100, 30, 79,157,251, 68, 69, 69,189,116, +255,254,253,211,133,133,133,255,170,121, 81, 40, 20, 46,106,222,188,121,204,141, 27, 55, 62, 2,112,208, 29, 98,141, 70, 51,103, +199,142, 29,159,242,120,188, 80,139,197,146,247,255,236, 93,119, 88, 20,215, 23, 61, 51,219,151,222, 97, 5, 65, 65, 84, 20, 53, + 63, 75, 52,177,160,177,196, 88, 18, 19,193, 30,141, 49, 26,147, 88, 99,139, 93,212, 24, 53,177, 17,187,198, 32,177, 18, 75, 68, + 77,212,216, 21, 27, 6, 27, 54,164, 73, 7, 5, 22,182,239,206,204,239, 15,118,201,178,236,194, 46, 26,141,102,206,247,237,183, +187, 51,111,206,123,111,234,153,251,238,189, 79,161, 80, 76,123,102,139,150,150, 30,181,100,253,238,205, 10, 53,229, 47, 22,112, + 50,148, 90,250, 51, 86,135,188,190,214, 44, 61, 10,140,172, 81, 5, 0, 8,147,255,137,250,135,145,154, 97, 24, 67,217, 2, 35, + 43,150,218,196, 10,102,110, 93,193, 51, 36, 75,103, 44,221,227, 44, 89,180,190, 1,240, 38,128, 43,121,121,121,171, 63,254,248, +227,239,119,236,216,225, 40,149, 74,145,151,151,135,252,252,124,112,185, 92, 56, 57, 57, 97,221,186,117,138,188,188,188,213,198, +219,160,106, 6,121, 0, 80,122,120,120, 92,139,137,137,241,217,180,105, 19,119,248,240,225,233,189,123,247,110,188,110,221,186, + 20, 62,159,207, 80, 20, 69,168, 84, 42, 98,204,152, 49, 65, 43, 87,174, 76,227,112, 56,118, 3, 6, 12, 32,236,237,237,175,160, +154,180, 1, 5, 5, 5,199, 15, 28, 56,240,225,228,201,147,133,106,181,218,172, 37,203,176,204,197,197, 5, 23, 46, 92, 80, 23, + 21, 21, 29,171,193,138,113,252,247, 35,135, 59, 13, 29, 56,144,175, 45,149, 66, 91, 42,133, 78, 42, 5, 85, 90, 12,162, 76, 10, + 30,165,131,152, 79,195,199, 79, 4,157,194, 1,135,175, 38,106, 85, 42, 85,181,137, 13,165, 82,233,241,243,209,209,157,223, 12, + 8,224, 94, 24, 63, 30, 26,173, 22,239,221,191, 95, 33,174, 52, 26, 13, 14, 54,111, 14,138, 32,240,198,232,209,120,168,211,233, +164, 82,233,241,127,227,197,112,227,198,141,252, 33, 67,134, 36,208, 52,221, 18, 47,104,210,204, 23, 1,173, 86, 91,197, 26, 69, + 81, 84,185,213,177,220,114, 32, 56,124,248,112,167,164,164, 36,254,173, 91,183,112,238,220,185, 55,118,236,216,241,141,191,191, +127,243,140,140,140,220,154,196,155,185,164,191,208,251, 31,238,217,185, 23,159,127,254, 57,145,155,155,139, 93,187,118,161,166, +228,169,255, 4,134, 15, 87,210,209,209,162,186, 48,241,123, 50,147, 82,225, 47, 88,153, 82,193, 18,167,114,120,185,149, 76, 20, + 93,158,108, 84, 57,188,124, 56, 80, 20, 93,163,165, 12,195,149,195,165,122,135,248,156,231,192, 41,131,142, 18,171,207,236, 44, +235,125, 36,163, 52, 62, 71,177, 16,192, 31, 80, 82,204,195,235,204,141, 86,173, 92, 61, 0, 64,165,164,124,130,131,131,195,184, + 92,174, 0, 0, 28, 28, 28, 90,185,187,187,175,123,242,228, 73, 7,115,199,180, 79,159, 62,237,188,188,188,254,119,244,232,209, +196,156,156,156,219, 0, 46,155, 22, 10, 10, 10,154,125,247,238,221, 54, 60, 30,143,168,225, 28, 1, 0,132,133,133, 53, 18, 10, +133,238, 71, 30, 56, 67,202,111, 0,134, 83, 2,112, 69,160, 92, 90, 32,157,223, 4,126,126,151,220,139,138,138,222, 40, 41, 41, + 73,180,241,208,119,249,240,195, 15,127,138,142,142,246, 11, 11, 11, 99,174, 95,191, 78,154,142, 34, 4, 5, 5,245,136,143,143, +111,249,217,103,159,109,216,189,123,247, 23,168, 28,105, 91, 19,210,245,249, 6,159, 27,142, 39,227, 4, 64, 5,232,109,102,172, + 66,249, 15,192,150,148, 11,207,144,158,225,153,154,104,209,128, 97, 97,249,155,250,156, 88,111,106,181,218,191,110,220,184,113, +112,192,128, 1,101, 79,158, 60,129,187,187, 59,234,213,171, 7,130, 32,176,110,221, 58, 69,106,106,234,175,250, 92, 90,111,102, +103,103,191,175, 23, 91,230, 80,186,102,205,154,221,219,183,111,119, 73, 72, 72,224,232,116, 58,167,198,141, 27,203, 47, 94,188, +232,192,227,241, 24, 62,159, 79, 39, 36, 36,216, 5, 5, 5, 41, 9,130, 16,254,249,231,159, 79, 46, 93,186,228, 63,117,234,212, +173,168, 28, 38,110,138,157,139, 22, 45,202, 74, 73, 73,129, 74,165,130, 84, 42, 69, 73, 73, 73,197,167,184,184, 24, 37, 37, 37, +224,241,120,200,205,205,197,190,125,251,114,244, 89,226,171,179,108,172,253,113,221,250,130,156,140,116, 56,217,137,161,147, 22, +131, 42,121, 2,148,150, 64,160,213,192,158, 71,161,110, 3, 49, 68,118, 78,200,147,150, 33,250,226,213, 92,125,150,120,203,230, + 2,181,122,237,184,149, 43,243,116,124, 62, 2, 34, 34,160,209, 15, 21, 26, 11, 45,138, 32,224,223,181, 43, 72,103,103,124,251, +235,175,121,250, 44,241, 47, 20, 52, 77,115,212,106,117,117,253, 0, 77,211,153, 73, 73, 73,187, 1,156, 38, 8,130, 33, 8,130, + 65,121,178,182,178, 87,249, 66,214,106,181,152, 59,119, 46,248,124, 62,230,206,157,139,121,243,230,225,251,239,191,199,250,245, +235,241,203, 47,191,224,240,225,195,245,207,159, 63,207, 63,123,246, 44,179,100,201,146,194,160,160, 32,206,232,209,163, 93,196, + 98,241,164,234, 56,167, 77,155, 6, 71, 71, 71, 76,155, 54, 13,203,150, 45,195,150, 45, 91,112,240,224, 65, 92,184,112, 1, 28, + 14,135,206,204,124, 12,165, 82,201,172, 89,179, 38,235,224,193,131,138,213,171, 87,131,203,229, 18, 47,233, 38, 49, 73, 47,168, +140, 45, 65,166, 41, 21,158, 0, 88,133,154,125,163, 44,113, 66, 20, 29, 93, 87, 47,142,146,141, 4,209, 33, 0,147, 81,125,120, +181,129,227, 11, 0, 62,207,129,115,150,120,200,156, 36,151,205,247, 30,197,231, 40,102, 1,248,221,208, 39, 39, 39, 39,241,254, +253, 7,184, 0,240,107,236, 62,222,253,251,247,157, 15, 28, 56, 32,242,242,242,194, 47,191,252, 34, 18,139,197, 94, 22, 56,169, +131, 7, 15,170, 4, 2,129,251,168, 81,163,122,182,105,211,102,162,254, 69,180, 43,128,166, 40,143, 94,236,254,232,209,163, 59, + 30, 30, 30, 15,142, 29, 59, 38,179,230, 0,149,150,150,110,253,249,231,159,235, 61,165,220,112, 68,246, 33,162,233,229, 56,236, +242, 19,210, 3,230,193,174, 78,107, 12, 30, 60,184, 14, 69, 81,155,109, 60,238,131,251,245,235,247,115,116,116,180,223,168, 81, +163,114,175, 95,191,158, 7, 32, 26, 64,140,241,231,238,221,187,133, 31,127,252,113,206,230,205,155, 37, 3, 6, 12, 88, 15,160, + 63,251,232,103,193,162,242,187, 16,106,138, 58, 52,243,192,173,248,157,159,159,191,166,168,168,232,194,195,135, 15, 39,168,213, +106, 9, 65, 16, 12,159,207,207,205,203,203, 91,109,148,176,212,156, 95, 73, 55,232,115,109, 16, 4,161,101, 24, 38,179, 75,151, + 46,147,186,118,237, 26, 21, 23, 23,167,236,220,185, 51, 98, 99, 99, 61,186,116,233, 34,167,105,154, 57,114,228,136,199,187,239, +190, 43, 63,125,250,180,108,204,152, 49,141, 27, 54,108, 56,122,218,180,105, 5, 4, 65,208,230, 56, 13,207,178,226,226,226,126, + 61,123,246,188,240,235,175,191, 58,185,184,184, 64,167,211, 65, 46,151, 67, 46,151,131, 97, 24, 56, 59, 59,163,160,160, 0, 11, + 23, 46,148,150,148,148,124, 96, 70,184,153,114, 42,149, 74,101,255, 47, 38, 78, 62,190,122,193, 92, 71,255,250,245,241,228,158, + 18, 58,165, 28, 60,134, 68,221, 70,206,224, 11,196,120,120,191, 20, 83,118,239, 47, 85, 40,149,225,102,222,150,171,112,150,148, +148,244, 31, 62,111,222,137, 13, 83,167, 58,252,207,219, 27, 28, 14, 7, 42,149, 10, 20, 69,129,199,227, 33,116,248,112,240, 61, + 61, 49,123,247,110,153, 84, 42,237,143,170, 83,241,152,114, 62, 15, 24,115,126,113,227,198,141,143, 67, 66, 66, 48,118,236, 88, +244,235,215,175, 82,193, 3, 7, 14, 96,253,250,245, 80,169, 84, 31, 3,184, 14, 96, 29,202,135, 58, 96, 34,178,254,233,118, 62, +119, 78,138,162,138,238,223,191,239,180,124,249,114, 66,163,209, 96,193,130, 5, 48, 8, 78,195,121,253,229,151, 95,214,113,116, +116,196,252,249,243,213,133,133,133,239, 44, 91,182,236,100, 76, 76,140,199,214,173, 91, 7, 3,152,102,202, 73,211,116,254,205, +155, 55, 29, 55,108,216, 64,234,116, 58,172, 88,177,162,202,240,228,200,145, 35,161,209,104,193,225,112,213, 74,165,170,169, 88, + 44, 78,118,119,119, 23, 51,149,157,187, 94,228,254,244, 69,121, 10, 3, 99,199,119,181,177,127, 22, 44,167, 84,176,133,179, 64, + 20, 29,221, 89, 57,124,248,105,189, 32, 74,210,151,137, 53,152,244,109,224, 52, 8,194,218,112, 30,215,127,106,132, 82,169, 68, + 65, 65, 1, 10, 11, 11,225,226,226, 2, 14,135, 67, 88,106,167, 74,165,186, 53,101,202,148, 27,155, 55,111,238, 22, 31, 31,223, +247,236,217,179, 93, 78,156, 56,161, 76, 79, 79,215,105,181, 90, 70, 34,145,112, 59,116,232, 32,234,213,171,151,189, 80, 40, 36, +103,205,154, 85,184,120,241, 98, 15, 84,246, 97, 51,237, 59,135, 32, 8,124,221,169, 20,211,186,112,160, 86,107, 80, 92, 92,140, +172,172, 76,220,185,115, 7,241,241,247,192, 48, 12,105,195,113,119, 7, 48,107,215,174, 93,190, 2,129,128,216,189,123,119,157, +221,187,119,215,104, 73,221,177, 99, 71,157, 61,123,246, 68,234, 71, 47, 50, 95,197,235,157,229,252,215,114,190,202, 48,205, 12, +143, 26,133,150,254, 62,255, 38,244,147,146,106,181,218, 43,102, 82, 56,124, 3, 96,174,145, 21,172, 38,115,158,148, 97,152,115, +221,186,117,251,178,107,215,174, 43,123,244,232,145,147,147,147, 19,184, 98,197, 10, 63,157, 78,167,185,115,231, 14,153,156,156, +156,126,237,218,181, 6, 13, 27, 54, 28,125,247,238,221, 51, 4, 65,104,172,232,224,157,228,228,228,246, 93,186,116,217, 55,122, +244,104,255,118,237,218, 9, 92, 92, 92,192,229,114,145,146,146,130,196,196, 68,245,158, 61,123, 50,139,139,139,109,153,130,231, + 74, 90, 86, 86,247, 1, 95, 77,248,117,116,191,190, 30,109, 27, 55, 18, 72, 36, 18, 64,161,192,189,140, 92, 92,186,151,168,217, +114,238, 82,129, 74,165,234, 15,235,167,224,185,114,237,225,195,110,239, 76,157,250,107,228,208,161,222,200,201,225, 74, 36, 18, + 8, 4, 2,164,166,166, 34,153,166,117, 75, 55,110,204,211,139,172, 23,157, 21, 94, 8, 96, 57, 77,211, 92, 0, 16,139,197, 24, + 55,110, 28,140,167,220, 89,191,126, 61, 20, 10, 5, 0,112, 9,130, 88, 14,224,167, 87,221,138,101,192,211,167, 79,103,191,247, +222,123, 75,184, 92,174,197,172,183,174,174,174, 40, 45, 45,133, 78,167,163,178,178,178,238,185,186,186,130,199,227,129, 97, 24, +179,215,209,147, 39, 79,102,247,239,223,127, 17, 73,146,150, 44, 31,112,114,114, 74, 63,121,242,100,240,103,159,125, 70,110,219, +182, 45,101,212,168, 81,194,147, 39, 79, 82, 12,195,236,123,209,251,160, 99,199,157,192,134,225,225, 0,194,129, 42, 14,239, 89, +250,101, 54,165, 84,232,216,113, 39, 54,224,111, 78,227, 97, 60,131, 32,210, 91,161,154,136,162,163, 87,162,220,207,162, 90,238, +142, 59, 59, 98,195,112, 60, 87, 78,107, 96,172,125,101, 50, 25, 40,138,170,206,154,247, 87,108,108,236,202,107,215,174,121,126, +249,229,151,129, 67,135, 14,117,234,210,165,139,131,113, 1,133, 66, 65, 31, 58,116, 72,182,126,253,250,146,115,231,206,165,141, + 28, 57,178, 93,117,237,204,200,200, 56,252,237,183,223, 58,247,234,213,171, 33,128, 10,255,172,130,130, 2,164,167,167,227,214, +173, 91,233, 26,141,230, 55, 27,186,244, 4, 64,228,160, 65,131,150,111,223,190,189,206,168, 81,163,114,247,236,217,115, 11,229, + 9,139, 77,225,210,175, 95,191,230,219,183,111,151,140, 26, 53, 42, 23,229,126,100,153, 96,193,130,133, 1,157, 81,213, 79,171, +218,145,137,159,213,106, 53,163, 84, 42, 25,185, 92,206,148,149,149, 49, 48, 63, 11,252,193,236,236,108, 38, 51, 51,147,201,200, +200, 96,210,210,210, 24, 0,191,152, 40, 94,115, 55, 44,251, 29, 59,118, 52,240,245,245, 93, 96,103,103,247, 7,135,195,145,114, + 56, 28,169, 80, 40,252,221,221,221,125,222,210,165, 75,125, 25,134,225, 87,163,162, 45,129,203,227,241, 62,243,242,242, 58,232, +230,230,150,233,234,234,154,233,229,229,117,144,199,227,125, 14,128, 87,131, 50,183, 4, 17,151,203,157, 98,111,111,127, 92, 40, + 20,230, 11,133,194,124,123,123,251,227, 92, 46,119, 10,170, 79,164, 90, 45,167, 64, 32,152,226,233,233,121,220,201,201, 41,223, +201,201, 41,223,211,211,243,184, 64, 32,120, 22,206,103,121, 43, 49, 8, 45, 57,163, 7, 65, 16,218, 55,222,120, 99, 67,203,150, + 45,215,181,108,217,114, 93,139, 22, 45, 54,233,173,146,140,222,218, 34,135,229,228,141,255,100, 59, 95, 26,103,104,104,104,204, +246,237,219,233,217,179,103, 75, 27, 54,108,248,116,246,236,217,210,237,219,183,211,161,161,161, 49,181,229,244,246,246, 14, 8, + 13, 13,125,186,121,243,102,221,253,251,247,153,205,155, 55,235, 66, 67, 67,159,154,100,134,127, 17,125, 39, 0, 4,233,173, 63, +191, 1,216,139,114,231,119, 95, 0,196,112,229,112, 70, 31,125,248, 7,128, 30, 22,142,189,181,156,126,202,225,195, 25,189, 79, +213, 49, 0, 73, 70,255,195, 80,217,255,235, 69,112,154, 69,211,166, 77, 31, 50, 70, 80,171,213, 76, 65, 65, 1,115,255,254,125, +230,220,185,115,140,159,159,223, 67, 43, 56,221, 1,140, 1,112,200,199,199,231,238, 91,111,189,149,209,190,125,251,140,128,128, +128, 20, 30,143, 23,143,242, 12,239,161,250,207,114, 0, 13,107,224,124,203,197,197,229, 91, 63, 63,191,223,130,131,131, 47,212, +171, 87, 47,222,205,205, 45, 78, 36, 18,125,135,191, 51, 99,219,122,206,119,249,240,195, 15,211,203,202,202,168, 86,173, 90,221, + 53,183, 81, 72, 72,200,249,178,178, 50,106,224,192,129,153, 0,250,252, 23,174,119,150,243,165,112,254,167, 16,172, 23, 76, 7, +141, 62,223,152, 41,247,141, 73,153,159,245,219,214,120, 32, 24,134,225, 48, 12, 99,207, 48,140, 51,195, 48,110, 12,195,184, 48, + 12,227,192, 48,140,176, 6,243, 55,123, 98,255,115,156, 95,232, 5,148, 92,255,219, 20, 53,173,127,173,247,167,175,175,175,107, +155, 54,109,190,218,191,127,255,148, 71,143, 30, 77,217,191,127,255,148, 54,109,218,124,229,235,235,235,250, 44,237,244,246,246, + 14,104,210,164, 73, 84, 72, 72, 72,102,147, 38, 77,162, 76, 68,214,139,236,187, 64, 47, 98, 66,244,159, 64,253, 50, 2,229,185, +176,214,234,133, 77,144,133, 55, 53, 91, 56, 13,124,191, 1,120, 87,255,249, 77,191,204,239, 37,112, 86, 65,253,250,245,143, 54, +111,222,252, 97,139, 22, 45,146, 91,180,104,241,176,105,211,166, 15, 27, 55,110,252, 48, 40, 40,232, 97,221,186,117, 31,122,120, +120, 28,173,197, 49,114, 3, 32, 65,213,105,192, 94,246, 57,223, 57, 52, 52,244,146, 72, 36, 50,155, 27,140,203,229, 70,182,104, +209,226, 38,202, 35, 37,217,251, 39,203,201, 10,173,127, 17,216,147,240,213,227, 20,162,250,105, 70,106, 90,207,238,207, 87,155, +211,236, 92, 93,122, 33, 19,168, 23, 56,130,231,192,105,204,103, 56,167,130,140, 68,211,203,224,100,207, 37,150,147,229,100,133, +214,115, 7,151,221, 5, 44, 76,160,122,198,245, 44, 94,109,216,146, 19,235, 89, 56,205,241, 61,122,201,156, 44, 88,176, 96,241, +188,238,157,157, 1,156, 49,188, 21, 90, 82,165,182, 68, 19,212, 70,217,158, 96, 57, 89, 78,150,147,229,100, 57, 89, 78,150,243, + 63,199,105,192, 74, 11,203,239,153,252,223,244,138, 10,175, 23,146,166,135, 53,171,178,156, 44, 39,203,201,114,178,156, 44, 39, +203, 89, 91,140,126, 69, 69, 86,152,225, 15, 59,116,200,130, 5, 11, 22, 44, 88,176, 96,241,252, 80,115, 30,173,189,123,247,114, + 12,191, 7, 13, 26, 52,146,162,168,175, 12,255, 57, 28,206,143,187,118,237,250,169,186, 26, 34, 34, 34,168,234, 56,205,161,166, +122,204,113, 54,109,232, 52,214,221,217,110, 66,113,137,124, 85, 74, 54,117, 78,169, 84, 54, 49,172, 19,137, 68, 73, 63,253,244, +211,131,231,221,206,145, 35, 71, 54, 52,173,167,158, 31,175,179,155,163,104,220,211,226,178, 21,183, 31,150,109, 98,207,177,151, + 2, 15, 0,125, 28, 69,252,247,155,186,240,223,186,245, 68,121, 81,166,161, 14,161, 60, 26,182,232,117,236,176,143,143, 79, 99, + 39, 39,167, 97, 0,154,202,229,114, 47, 59, 59,187,124, 0,119,164, 82,105, 76,110,110,238, 61,107,121,194,234, 33, 29,128,191, +254,111,198,153, 52, 4, 88,179,174, 38,244, 8,130,146, 1,132, 4, 1,205,177,228,191,157,209,223,109, 0, 37,205, 84, 93,222, +163, 1,212, 12, 3, 62, 1,168,142, 61,130,232, 53, 58, 84, 78, 0,186,163, 60,133,195, 13,148,167,159,144,179,151, 44, 11, 22, +175, 21, 76,135, 10, 43,254,115, 45,136,137, 78,124, 46, 17,197,128,113, 1, 24,119,149, 74,197, 19, 8, 4, 80,171,213,176,179, + 19,175, 29, 51,106,228, 2,144, 40,214,234, 48,238,167,159,126,170,245, 76,215,182,212, 3,224,148,233,246,174, 78,226, 69,167, + 15, 77,119,237,212,123,233,119,234,212,194,105,165,165,165,164, 80, 40,132, 74,165,130,179,179,115,251,177,163, 71,183, 34,121, +140,154,207,183,191,184,114,229,202,220,218,182,115,210,164, 73, 62, 26,141,242,109,154,166, 5,106,181, 90,104, 90,143,179,157, +253,210,211,135,166,219,133,245,249,110, 1,192, 10,173,151, 0, 65,128,171,253,153, 85,131, 58,135,188,213, 52, 24,244,157,179, + 80,170, 53,239,159,206, 44,123,127, 94,124,246,228,204, 50, 77, 75, 60,135,132,149,255, 34,112, 2, 3, 3,191,244,244,244, 28, +184,113,227, 70,126, 96, 96, 32, 68, 34, 17, 20, 10,133,228,209,163, 71,146,177, 99,199,134,137,197,226,221, 41, 41, 41,107, 97, +221, 68,112,254,167,127,158, 3, 0,104, 63,108,161, 63,202, 39,139,150,155,174,235, 60, 98,161, 63,128,169,168, 60, 49,114, 14, +202, 83, 40,152,187,235, 8,226,182,127,143,247, 63,158,194, 5, 48,182,162,241, 36,240,251, 47,171,209,115,208,132, 74,203, 9, + 6,220, 67,219,191, 71,159,143,167, 88,156, 71,241,221, 96, 66, 75,211,140, 69, 75, 60, 73, 18,186, 63, 30, 50,230, 38, 24,206, + 67,121, 14,176, 42,148, 40,159,208,217,108,249,222,141, 57,121, 26, 45,101, 54,225, 44,159,199,201, 63,124,143,170,178,237,240, +255, 65,171,165,202,239,173,124, 46,168,131, 41,206,167,103,205,154,197,237,211,167, 15,182,108,217,210, 97,211,166, 77,163, 75, + 75, 75,255,212,239,183,100,246,242,101,193,226,181, 22, 92,230,133, 22,151,131, 13,191,253,250, 83,131,188,252, 66, 12,255,236, +107,236,220,185, 19, 69, 69, 69,112,117,117,133,128,207,231,173, 90, 62,199,199,201,201,222,103,248,232,105, 27, 0, 52,174,109, +107,108,172, 39,216,116,123, 66, 63,149, 14,151, 67,242, 4, 2, 1,185,123,247,110, 20, 23, 23,195,197,197, 5, 2, 1,143, 92, +249,221, 55, 98, 39, 39, 7,241,167, 95,204,232,128,242,252, 63,181,130, 90, 93,214, 97,255,206,159,156, 10, 10, 10, 48,226,243, +105, 48,173,135,207,231, 83,134, 7, 11,123,142,189, 20,204,218, 56,238,227,144,102,142,128,230,246, 5,240, 56, 28,216, 57,187, +162, 59,151, 3, 14,129, 38,195,255, 72,155, 9, 96,222,235,210,217,192,192,192, 47, 35, 34, 34, 6, 46, 90,180,136, 79,146,229, + 41,231,100, 50, 25, 20, 10, 5,124,125,125,113,250,244,105,254,236,217,179, 7, 30, 56,112, 0, 41, 41, 41,107,108,229,191,125, +251,118, 61,127,127,127, 37, 0,244,109,238,104,186, 46,192,176, 14, 0, 28, 29, 29,107,228,115,119,177, 87,221,190,125,169,169, + 97,187, 47,187,250, 82, 22,150, 43, 1,216, 85,199, 69,211, 12,247, 88,212, 88,139,235, 63, 91,180, 67,119, 99,239,185,198,129, +129,129, 10,227,229, 14, 14, 14,150, 54,241, 46, 43, 43,243, 55, 93,104, 40,175,209, 82, 94,150,234,235, 49,110,189, 89, 1,166, +165,192,221,177, 99, 7, 0,224,135, 41, 67, 56,155, 47, 23,114,185,220,242, 91,237,242,229,203, 17, 25, 25, 41,248,227,143, 63, +122,109,223,190,189,215,193,131, 7, 87, 89, 18,170, 44, 88,176,120, 37, 69,150,241,183,101,161, 69, 18,132,163,147,163, 3,194, + 7,143,193,209,163,191,163, 83,167, 78, 21,235,234,215,175,143,136,254, 31, 96,215,207, 43, 1,192,241, 89, 90,244,172,245, 20, +149,200,230,245, 28, 24,181, 48, 35,183, 44, 62, 46, 46, 14, 29, 59,118,172,180,253,224, 1,225,248,101,235,114, 84,147,101,222, + 42, 16, 12,201,119,116,178,199,160,225,159,195, 92, 61,163, 71,244,139,123, 55, 98,117,183,188, 39,178,149,236,121,246,226,209, +192,199,189, 71,243,144,198, 40,218,183, 22,137,197, 74, 28,205, 86,226,211,238,109, 17,234, 38, 70, 71, 29, 5, 31,123,222, 59, +185, 50,237,107,109,100,132,121, 0, 0, 32, 0, 73, 68, 65, 84, 33,180,124,124,124, 26,123,122,122, 86, 18, 89,165,165,165, 40, + 43, 43,131, 84, 42, 69,105,105, 41, 72,146,196,180,105,211,248,103,206,156, 25,232,227,227,115,194,138, 97,196, 12,189, 37, 11, +224,240,202,230,206,157,171,242,242,242, 82,217,217,217, 49, 92,190,176,180,243,136,133,142, 0, 64,114,249,165,171, 86,173, 82, +251,250,250, 42,185, 92,174, 96,194,132, 9,164, 53,109, 86,169, 84,140, 49,167, 90,173,170, 88,190,116,233, 82,181,183,183,183, +202,206,206,142,209,104,172, 55, 58,222, 76,125, 10, 33,159, 3, 33,159, 3,145,128, 7,199,122,109, 32, 44,186, 5,157, 78,135, +101,203,150,105,124,124,124,212,118,118,118,140, 64, 32,224,143, 31, 63,190,198,118,142, 28, 57,146,113,113,113,209,216,217,217, +241, 35, 35, 35,171, 68, 10,157,188,145, 5,177,128, 7, 59, 33, 23,193,245,253, 32,100, 20, 86,183,149,195,169,236,141, 32, 20, + 10,209,161, 67, 7, 52,109,218, 20, 7, 15, 30,236,204, 10, 45, 22, 44, 94, 11, 88,140, 48,228, 2, 64, 92, 92, 92, 24,202, 39, + 68, 68,159, 62,125,136,242, 45, 24, 76,253,178, 63, 62, 29, 49, 8, 20, 69, 87,204,243, 69,144, 4,190,248,164, 23,104,218,154, + 17,137,154, 67, 60,107, 81, 79, 5, 39, 67,144, 28, 0,104, 16, 32, 97, 70,127, 58, 20, 20, 77,255, 61, 80,194, 1,198,140,232, + 89,190,236, 57,180,147, 3, 10, 95,143,253, 8,230,234,105,220,160, 14,169,211, 40, 65, 84,158,236,241,159,152,108,147,229, 52, +131,166,117, 37, 65, 90,133, 2, 74,165, 22,209,247,158, 42,142,103,201,188, 72,151,180,130,213,225,237, 68,156,130,108, 4, 56, + 10,130,115,101,218,215,162,239, 78, 78, 78,195, 54,110,220, 88, 69,100,229,229,229,145,101,101,101,208,104, 52,116,105,105, 41, + 40,138,194,140, 25, 51,120,179,103,207, 30,150,155,155, 27,105,208, 60,230, 56,245,126, 87, 83,111,223,190, 29, 48,107,214, 44, +205, 59,239,188,147, 81,191,126,125, 25,135,195,129, 68, 34, 89,221,189,123,119,183, 69,139, 22,105,122,245,234,149,198,225,112, + 16, 28, 28, 44,187,117,235, 86, 0, 0,177,181,125, 55,230,252,233,228,143, 12, 0, 16, 4,129,238,221,187,167, 7, 7, 7,203, + 56, 28, 14, 30, 28, 90,202, 88,187, 63,121, 92, 18, 13,125,157,245, 55, 17, 2, 16, 59, 84,120,226,117,239,222, 61,179,113,227, +198,101, 36, 73,226,230,205,155,126,168, 58,173, 85, 21, 78,177, 88,172, 29, 60,120,112,198,189,123,247,204,149, 7,151, 67,162, + 93, 99,189, 1,203,183, 37,144,121,222, 98, 59,121, 28,232,102,127, 57,132,235, 34, 2,132,142, 30, 42,169, 84, 10, 39, 39,167, +114, 11,153, 70,131,191,254,250, 11,111,189,245, 86,216,222,189,123,207,176,215, 59,203,201,114,254, 13,115, 90,228, 21,180,102, + 25, 79,116, 95,201, 71,235,180,105,167, 40, 74,135,250,254,222, 88, 58,103, 36, 40,138, 6, 69, 81,208,233,191, 41,138,130, 86, +163,121, 46, 45,123,150,122, 92,157,196,139,126,223, 61,206,245,157,126,203,187, 46,153, 53,226, 56, 69, 1, 52,173,133, 86, 11, + 80,180, 22, 52, 69, 65,171,125, 62,174, 57, 90,154, 70,128,159, 15,150,204, 26, 1,211,122, 98,118,237,237,123,242,183,105,118, +157,250,124,247,245,131,116,249, 50, 86,216,191, 88,136,248, 66, 46,195, 21, 65,173,214,161, 84, 77,171, 1,200,148, 90, 90,195, +216,123,136, 0,128, 75, 18,175, 83,116,109,211,192,192,192, 74, 34,235,251,239,191,247, 88,183,110,157, 47, 0,244,239,223, 63, +171,107,215,174,133,247,239,223,135, 68, 34, 33, 10, 11, 11,123, 3,152,160,223,118, 42,128,117, 22,120,101,254,254,254, 74, 79, + 79, 79,149, 65, 16,145, 36, 9, 46,151, 11,127,127,127,165,151,151,151, 42, 56, 56, 88,198,231,243, 65,146, 36, 12, 66,207,170, +215, 60,130, 0,135,195,129,129,211,212,218, 99,224,180, 5, 60, 46, 89,245,246,102,196, 73,146,164,217,250, 44,158, 67, 34, 17, + 3,192, 98,121, 14,105,116,123,228, 86,239, 33, 16,253, 23,120, 0, 78, 51, 12,131,235,215,175, 35, 37, 37, 5,124, 62, 31, 62, + 62, 62,136,140,140,132, 74, 85,174,119, 35, 34, 34,194, 0,220,100,175, 96, 22, 44, 42,112,250, 21, 20, 88,166, 86,173,234,125, +180,226,226,226,194,250,244,233,115,198, 32,128,202,197,142, 25,241,163,213, 65,171,213, 0, 12,243, 92,132,150,165,122, 40,138, +174,182, 30,131,143, 22, 77, 51, 92,179, 34,139,166,161,211,106,159,203,222,163, 41, 45,104, 90, 11,115,245, 16, 4, 73,233,111, +248,124,246, 58,121,241,240,241, 15, 32,181,254,245,113, 78,167,132,175,187, 80,128, 66, 5, 2, 27,133,112,254,146,107,113,225, + 70, 18, 60, 28,156, 94,155,227, 34,151,203,189, 68, 34, 17,100, 50, 89,133, 37,107,221,186,117,190,106,181,154, 4, 0, 46,151, +231, 87, 64,251,138, 40, 26,112,118,202, 65, 81, 81,137, 59,195, 48,132, 94,240, 44, 7,240, 19,170,201,238,207,231,243, 43, 4, +138,177, 0, 18, 10,133,181, 18, 48, 6, 24,196, 25,159,207, 55,187,220,116,120,173, 38,240,141,133, 22,152,114,171,150,137,216, +226,112, 56, 48,248, 70,213, 4,129, 64, 80,209,119,115,224,114,140,234,227,216,238,138,169,209,104, 80, 86, 86,134,226,226, 98, +136, 68,229, 6, 51,134, 97, 64, 16,196, 4, 0, 19,217,171,152, 5, 11,243, 90,228, 21, 22, 91,230,133, 22,202, 77,118, 4, 0, +232,180, 26,179,226,103,239,161, 11,200,200,149,193,199,227, 10, 24, 27,179,158, 14, 28, 56,240,103,137, 68,210,206,240, 95, 40, +118,112, 31, 61,110, 62,116, 58, 13, 28,197, 36, 62, 27,214,179,146,200, 42,183,104,169, 45,206, 9, 82, 84, 34,155,215, 51, 98, +205, 66,103, 39,247,120, 83,241,179, 36, 58, 33,188, 72,170,242, 35,201,171, 40, 34, 36, 84,196,152,249, 35,141,110,238, 55,118, +175,159, 59,217,106,123, 32, 65,242,194,199,174, 30,205,112, 29,154,216,145,165,103,167,143,104,187,223, 88,204,185,185,185,197, +245, 8, 95,213, 45,239, 41,235,163,245, 50,224,232,236, 66,250,181,238,140,214, 19,162,112,242,155,233, 12, 80, 4,119,137, 47, +217,229,203,197,112,104,221, 23,151, 62, 27, 70, 3, 79, 95,139,190,218,217,217,229,203,229,114,137, 66,161,128, 84, 42,133, 84, + 42,173, 44, 8,120, 60, 98,244,231, 95,121,240,248, 2,104, 53,106, 28,141, 89, 92, 35,167, 33,133, 67,223,230,142,224,240, 4, +165,119, 2, 3, 87,115,185, 92,144, 36,137, 67,107,167, 79,216,183, 98,156, 35, 0,220,136, 91, 43, 29, 52,237,199, 53, 36, 73, + 66,165, 82, 9,109,105,247,227,199,143,253, 84, 42,149, 82, 47,208, 12,194, 15,169,169,169,117, 85, 42,149,194,120,185, 53, 16, +219, 57, 2, 46,245, 1, 59,175, 42,214,179,180,180,180, 58, 90,173, 86,206,229,114,161, 86,171,173, 82, 69, 36, 73,242,111,222, +188,233, 71,211,180,217,242, 77,131,234, 0, 62,205, 1,129,179,213,125,102,172,120, 17,213,139,173, 23,150, 65,154, 5,139, 87, +197,178,245, 10, 94, 19,132,133,223, 21, 66,171,115, 92, 92, 28, 99,252,134,168,211,106,245, 34,235,111,209, 67, 81, 52,178, 11, +148,184,127,255, 1, 86,173, 90,133, 11,151,166, 56, 47, 90,180, 72, 56,123,246,108,213,192,129, 3, 87,208, 52,221,130, 36,201, + 27,248,123,168,162,178, 85,136,166,235, 38, 36, 36, 4, 26,254,107,181, 90, 56, 58, 58,194,209,209, 17,141,131,253,170,136, 44, +138,162,160,169,102,232,208,224,163, 69, 48, 52,163,213, 82,160,104,186, 66,252, 20, 73, 85,126,191,157,184,222,192,168,120, 35, +195,143, 14,109,154, 88, 22,131, 99, 35, 43,250,177,123,253,220,201,139,182,108, 17, 22, 81,158,227, 7,133,127, 26, 26, 49,104, + 24, 6,127,244, 94,152, 74,173, 62,200, 33, 25, 90, 91, 81, 31, 72, 48, 48,245,209, 98,241,130,144, 92, 44,211,242,132, 98, 56, +248,212,195,131, 50,138,207,225,112,174, 60, 42,150,243, 73, 14, 23, 36,151,143, 59, 69, 74,237,107,212,221, 59,201,201,201,146, +186,117,235, 66, 42,149, 66,167,211,209,253,251,247,207,226,114,121,126, 92, 30,143,232, 51,232, 43, 58, 55, 55, 91, 75,146, 28, + 48, 12,133,247, 34,198, 18, 66,145,152,175, 81,171,117, 40, 31, 58, 52,103,205, 50, 78,225,224,216,189,123,119, 55, 67, 36,224, +190, 21,227, 28,141,214, 57,181,106,213,202,205, 56,234,208, 74,107, 17, 49,112,224, 64,177,191,191, 63, 1, 0, 87, 99,102, 25, +172,103, 68,223,190,125, 69,254,254,229,126,248,127,174, 29,103, 53,167,135, 29, 3,148,164, 2, 37,105, 85, 44, 89,125,251,246, + 21, 6, 6, 6,218,116, 45,234, 29,224, 45,230,238,178,231,234,128,220,235, 86,113, 13,255, 31,180,190, 14,224,174,120,143,132, +192,193, 93,213,110,250, 31,151, 89,177,197,130,133, 85, 48,209, 34,175, 20,194,244, 2,177,179,254,187, 66,112,113, 1, 64,111, +162, 35,140,116, 22,180, 58, 77, 21,145, 69, 81, 20,120,132, 10,171, 86,173,194,196,137, 19, 1,128, 63,121,242,228,253,139, 22, + 45,250,144,166,233, 22, 12,195,116, 36, 8,162,186,183,198,211, 18,137, 36,143, 97, 24, 30, 73,146, 29,215,174, 93,235,214,171, + 87, 47, 56, 58, 58,130,161,153, 42, 34,139,162,104,104, 52,106,139,211,220,186, 58,137, 23,253,190,119,188,235, 59, 31, 44,239, + 74,209,244,113,131,200,162, 41, 10,160,203, 55,122,146,159,133, 99, 71, 15, 98,195,250, 13, 69, 32,152,187, 96, 64,235,197, 32, + 44,136,193, 22,231,175, 38,117,236,208,166, 9, 22,109,217, 34,188,157,144,179,255,171, 73, 51, 67, 35, 6, 13,195,222, 93, 49, + 32,117,197,215,141, 69, 22,165,165, 81, 82, 84,216,247, 20,235,163,245,178,224,118,236,248,113, 98,216,176, 97,116,105,105, 41, +248, 2, 1,173,213,106, 57,111,191,253, 54, 53,113,226, 68, 50, 55, 55, 23,210,210, 50, 46, 0, 55,188, 6,102, 45,169, 84, 26, + 51,118,236,216,176,179,103,207,242, 73,146,132, 84, 42, 69,151, 46, 93, 10, 11,104, 95,209,232,207,191,242,200,206,206,210, 57, +137,185, 42, 62,159,135,252,252,124, 58,172,215, 16,197,160,145, 19,235, 76,156,181,100, 99,206,197,245,235,172,169,195, 56, 18, +208,116,221,230,205,155,213,190,190,190, 74,161, 80, 40, 24, 49, 98,132, 85,227,135,106,181,154, 89,186,116,169,202, 52,186, 80, +173, 86, 51,171, 86,173, 82,251,249,249,169,196, 98, 49,163,213,214,236,247, 73,146,132,238,179, 69, 59,116, 58,157,174,146, 21, +203, 32,178,180, 52, 81, 22, 21, 21,165,241,243,243, 83,219,217,217, 49, 66,161,144,111, 77, 59,191,250,234, 43,198,213,213, 85, + 99,111,111,207,159, 54,109,218, 51, 69, 29,106, 41,112, 23,173,173, 72,239, 32,116,116,116, 68,105,105,105, 69, 91, 37, 18, 9, + 43,182, 88,176, 48,131, 42, 90,228,213,180,194, 89,151, 71,139, 6,202,242,242, 11,189, 60,188,235, 65,167,211,233, 63, 90,232, +180, 90,140, 31, 51, 8, 43,214, 71, 1,128, 65,108,117,159, 60,121,242,126, 0, 53,222,204,118,239,222,189,112,242,228,201, 78, +121,121,121,127,252,252,243,207,110, 67,134, 12,193,212,169, 83,177,124,249,114,240, 4, 34,184,121,214,173,168,199, 80,111, 97, +193, 83, 48, 96,202, 44,216,233, 52,229, 55, 41,112,221, 61, 3,160,165,180,160,181, 90,104,181, 90, 16,156,242,174, 29, 59,122, + 16, 67, 62,249, 10, 60,161,147,235,143,171,150, 41, 66, 91, 75, 62,156, 61,106,148,202, 10, 35, 32,121, 59, 33,103,255, 87, 19, +167,117, 55,136,172, 95, 99,214,223,253, 97,198, 7, 59,133, 2,110, 69, 61, 90,154, 6, 73,114, 88, 31,173,151, 36,178,132, 66, + 97,236,145, 35, 71, 30,182,108,217,146,144,201,100,208,106,181, 40, 44, 44,196,254,253,251,239, 48, 12, 3, 87, 87, 87, 28, 57, +114,132, 30, 50,100, 72,172, 74,165, 10,127,213,197, 86,110,110,238, 61,177, 88,188,123,230,204,153,131,102,204,152,193,163,105, + 26,247,239,223, 7, 8,130,225,241, 5, 32, 73, 18, 60, 30, 23, 37, 37, 82,218,206,193, 37, 71,195,112,236,120,124, 1, 72, 14, +191,186, 48,225, 12,125, 50, 82,144, 92,126,169, 33, 18,144,207,231,227,210,222,239,165,157, 71, 44,116, 2, 0,190, 80, 92,212, +163, 71,143,244, 38, 77,154,200,174, 93,187, 22,128,170, 81,135,166,215,167,174,223,136,105, 28, 59,177, 72,214,189,123,247, 12, + 3,103,218,241, 31,165,195,190,152, 69, 16, 28,129,172, 79,159, 62,233,161,161,161, 50, 14,135,131,164,131,203,164,253, 70, 76, + 19, 17,213, 36, 89,253,227, 33,243,217,141,189,231, 26, 47, 94,188, 88,219,171, 87,175,199, 6,127,177,180,180,180, 58,189,123, +247, 22,174, 92,185, 82,219,187,119,239,204,102,205,154,149,145, 36,137,132,132, 4,191,234, 44, 85, 6,136,197, 98,237,167,159, +126,154,113,235,214,173,218, 70, 29, 86,139,186,117,235,130,166,105,116,233,210, 5, 74,165,146,181,108,177, 96,241,122,194, 52, +143,150,229,204,240, 90,157,246,171, 49, 19, 22,252, 8, 16, 14, 70,119,129,191, 13, 75, 12,136, 41, 83,190,182, 7, 32, 54,136, +173, 73,147, 38,213, 56,205,137,145,200,106, 61,100,200, 16,124,243,205, 55,248,225,135, 31,168,229,203,151,115,238, 61, 72,213, +140,248, 98, 94,177, 73, 61, 96,192,148,209, 90,250, 43,115,124, 69, 37,178,121, 29,123,127,183, 32, 43, 79,126,126,196,216,217, + 21,119, 47, 10,128,148,144, 80, 0,176, 97,253,122, 25, 79,232,100, 31, 49,104, 24, 0,116,255,113,213,178,253,139,176,165,102, +177,197, 16, 33, 95, 77,154,230,106, 16, 89,107, 87, 46,190,229, 76,228, 69,141,251,250,142,214,184, 30, 0,112,115,196,254,142, +189,191,123, 55,255,169,108, 53,123,158,189, 56, 8, 4,130,133, 39, 79,158,180,111,222,188, 57,241,228,201, 19, 80, 84,249, 17, +209,104, 52, 40, 41, 41, 65,105,105, 41, 84, 42, 21, 90,181,106, 69,174, 89,179,198,126,220,184,113, 11,213,106,245, 23,175,122, +191, 83, 82, 82,214,254,246,219,111, 56,115,230,204,192, 25, 51,102,240,124,124,124, 8,103,231, 60, 66,171, 81, 3, 96,152,130, +130, 2,218,206,193, 37,199,195,219, 47, 35, 59, 55, 63, 68,171, 81,131,166, 52, 22,189,205,245,233, 29,166,220,190,125,187,222, +247,223,127,175, 54,142, 4, 28, 52,237,199, 53,173, 90,181,114,139,138,138, 82,247,233,211, 39,221,224,188,110,141, 51,252,177, + 71,152,112,251,246,205,166,166,156,157, 71,127,191,213,192,105, 28,141,216,247,235,141, 91,131,131,131,221, 66, 67, 67,211,171, +227, 13, 12, 12, 84, 72, 36, 18,117,227,198,141,203,120, 60, 94,185, 37, 75,171,149, 7, 6, 6,210,222,222,222,234, 38, 77,154, +148,217,234,180, 47, 22,139, 25,131, 85,204, 28,108,137, 58,228,113,160, 27, 50,100, 72, 69,102,248, 41,193,193, 57,195,134, 13, +147, 76,158, 60, 25, 91,183,110,197,133, 11, 23,170,136,253,176,176, 48,156, 61,123,118, 1, 94,163,196,186, 44, 88,252,199, 80, +125, 30, 45, 83,108,219, 22,243, 39,140,124,154,204, 97,209,162, 69, 66,189, 37,171,251,196,137, 19,161, 80, 40, 92,205, 20,235, + 6,125,174, 13,115, 34,107,217,178,101, 59, 25,134,241, 3,208,129,162,232,203,155,183,108,235, 98,169,190,136,136,136, 42,156, + 12, 65,114, 72,146, 40, 19,240,152,191,214,111,218,250, 75,165,242,229,206,239,141, 64,224,198,143,171,150, 41, 0,116, 55, 21, + 91,248,123,154,145, 10, 78, 3, 62, 31,251,121,133,200,250,113,213,178,227,161,173,253, 63,156, 61,106,161, 89,113,182,112,222, + 24,123,146, 36,222, 54,241,209,170,194,249, 28,192,114,254,141, 46, 67,134, 12,105,209,182,109, 91,210, 88,100,169,213,234,138, +196,157, 6,103,241,172,172, 44,132,133,133,145, 45, 90,180,104,118,229,202,149, 46,248,123, 58,167, 87,181,239, 84, 74, 74,202, + 26, 31, 31,159, 19,115,231,206, 29, 86, 88, 88,216,187,168,168,216, 61,110,219, 66,244,140, 24, 75,132,245, 26, 44, 83, 51, 92, + 81,102, 78, 94,227,211, 71,118,184, 29,221,189, 22, 26,181,122, 12,128,187,248, 59,189,131, 41,167,220,144,198,161,113,227,198, + 50, 99,161,226,239,239,175,172, 83,167,142, 42, 52, 52,180, 98,185,133,104,190, 42,125,183,149, 83,239,255, 37,171,105,127, 26, + 68,155,105,218, 8, 59, 59, 59, 24,196,151, 45,237, 52,142,182, 52,123,163,172, 57,234,176,130, 83,159,222,161,146, 78,139,137, +137,233, 22, 19, 19,211, 26,192, 95, 40,159,235, 80, 11,148, 15, 37, 26, 57,205,207,215,127,216,235,157,229,252,175,114,190,202, + 8,195,223,190, 89, 64,185,175,214, 25,139, 66,171, 38, 24, 28,223, 1,144,147, 38, 77, 42, 82, 40, 20,174,195,134, 13,171,118, +155,220,220,220,173,209,209,209,149, 68,214, 71, 31,125,244, 73,108,108,236,137,252,252,252, 90,245,202,213, 73,188,232,204,161, +233,174, 97,125,190,155, 8, 96,185, 5, 67, 30, 29,218, 90,242,225,143,171,150,237, 55, 17, 91,219, 1,124,100, 73,149,246,120, +239, 3,236,216,246,163,193,183, 75,124,235, 90,214,209,129,215, 35,205, 70, 43,186, 56, 8, 35,245,237,152,204,250,104,189, 24, +240,249,252,206, 51,102,204,224,203,100,178, 42, 34,203, 84,104, 73,165, 82,220,184,113, 3, 35, 70,140, 16, 38, 38, 38,118,214, +104, 52,167, 94,135,125,144,155,155,123, 79,159,140,116,130, 33,133,131, 80, 36,230, 15, 30, 57,209,175, 34,234,112,247, 90,168, +148, 10, 0,224, 90,147,222,129,203,229,242, 19, 19, 19, 3, 12, 86, 43,141, 70, 35, 52, 44,191,118,237, 90,128, 33,183,150, 82, +169,180, 58,234,240,159,226,188,121,243,166,159, 33, 58,210, 16, 93,200,229,114,249, 9, 9, 9,126, 6, 78,149, 74,101, 85,212, +161, 64, 32,224, 39, 38, 38,250, 81, 20,245,220,162, 14,141,133, 49,202,231, 89,172, 52,215,162,222,183,140, 32, 8,130, 97,135, + 13, 89,176,120,229, 97, 26, 41, 89,253,164,210, 53,193,224,248,110,195, 38,220,186,117,235,246, 24, 52,104, 80, 37,145, 21, 30, + 30, 78,237,219,183,239,180, 68, 34,201, 35, 73,242,158,173,237,168,240,209, 66,149, 55, 72,144, 36,121,163, 67,155, 38, 32, 73, +242,198,236, 81,163, 84,139,176,165,146,216, 58,184,127,207,187,153, 69,119,204, 75, 51, 0,238, 94,190, 24,242,201, 87, 24,242, +201, 87,174, 0,218, 3,150,163, 21,171,107, 7,139,127, 6, 4, 65, 8,234,212,169,115, 75,169, 84,130, 32, 8,168, 84,170, 10, +129, 85, 90, 90,138,146,146,146,138,255, 26,141, 6, 5, 5, 5,240,247,247, 7, 65, 16,175,181, 31,157, 70,163,209,205, 88,240, +125, 52,135,203,215,209,180,134,208,104, 52, 35,109,185,206,103,204,152, 65,194,140,239,213,184,113,227,204, 46,127, 89,156, 51, +103,206, 52, 27, 37, 56,110,220,184,106,163, 7, 45,225,235,175,191,126,110, 81,135,214,223,190, 88,176, 96,241,154,193,108,232, + 94,173,132, 22, 73,146, 55,204, 68, 23, 18, 0, 24,146, 36,111,152,201,114,160,203,200,200, 88,224,226,226, 50, 70, 38,147,253, +254,209, 71, 31, 77, 10, 15, 15,167,128,114, 7,249,218,246,168,168, 68, 54,175,115,223,165,147,139,203, 84, 81,166,235, 76, 45, + 79, 6,177,181,118,245,178,117,251, 99,119,133,231,102,103,174,179,212, 55, 75,130,202, 82,180, 98,137, 84,177,160,115,223,165, + 19,139,164, 10,214, 71,235, 5,129,162,168, 99, 98,177,152, 48, 76,166,108,108,189,146, 74,165,144,203,229,208, 79, 73, 3, 0, + 40, 43, 43,131,179,179, 51, 40,138, 98, 94,179, 93,161, 2, 48, 85,111,173, 2,128,169,169,167,215, 24,159,219, 55,141,215, 85, + 99,205,202,177,102,130,104,115,219, 85,183,238, 31,224,204,171,102,130,232,234,144,103, 35, 95, 30, 0,240,121,156,124, 75,147, + 71,243,121,156,252,106,252,246,109,124,111, 32, 24, 0, 11,216, 43,155, 5,139, 87,247,253,255,101, 85,220,141,229,100, 57, 89, +206, 23,194, 41,212,127,172, 93,199,238, 79,150,147,229,100, 57,255,109,156,230, 48,250, 21, 17, 90,140,153, 15,128, 90, 90,180, + 88,176, 96,241,175,131,170,150,235, 88,176, 96,193,130,197,179,163,202,100,210,198, 43, 44,169, 82, 91,162, 9,106,163,108, 79, +176,156, 44, 39,203,201,114,178,156, 44, 39,203,249,159,227,172,137,219,120,251,209, 0, 54,189, 34, 98,235,165, 4,180,176,102, + 85,150,147,229,100, 57, 89, 78,150,147,229,100, 57,107, 11,118,232,144, 5, 11, 22, 44, 88,176, 96,193,226, 63, 14,219, 18,150, +178, 48, 3,255, 15,102,131,198, 76,253,238, 92,134,199, 7,231,191,110, 93, 12, 15, 15,231,216, 82, 62, 53,213,133,188, 14,201, + 15, 78,246,252,190,101, 50,237, 15,244,245,121, 81, 53,157,136, 30,129, 45, 63,182, 19,217,125,161, 86,171,235, 59, 56, 58,230, + 63,125, 82,176,225,105,198,205,181, 70,101,156, 46, 95,190, 44,105,219,182,109, 54,128, 82,163, 55, 5, 22, 44, 88, 60, 79,184, + 52,169, 11,130, 24, 9, 48,127,135, 93,210,204, 29,148,220,221, 86,169,156,115,200, 39, 32,137,166, 70, 75, 20, 96,176, 25,197, + 73,143,107,120,224,184, 36, 39, 39, 7, 52,104,208, 32, 29, 64,177,105,237,102,214,177,215, 57,139, 87, 25, 97,168,156,176,180, +226, 90,120,118,161, 21,252, 81,125,232,200,225, 96, 48, 20, 4, 18,145, 26,219,191, 86, 60, 65, 31,250,130,230,190, 9,160, 37, +192,180,180, 23,139,254,167, 80,107,242,105,134,249, 24,143,246,252,101, 51, 95,253,240,177,176, 60,157,197, 2,164,198,174,183, +137,143,102,102, 93, 61,187, 79,232, 98, 71,160, 65,171,143,166,161,114, 6,231,218, 66, 0,160, 35, 73,146, 77,237,236,236, 36, +114,185,188,128,166,233,199, 40, 31,159, 46,170, 37, 39, 9,224, 83, 7,123,251,158, 1,142,130,150, 25,133, 37, 89,165, 90,234, + 28,202, 19,186, 22, 61,175, 51,170, 92,100,249,108,154, 56,184,237,136,101,227,187,193,165,243,210,105,114,160, 58,161, 69,248, + 53,122,251,224,192, 65, 17,157,191, 28, 61,194,193,215,211, 1, 57,133, 50,247,245, 91, 99,190,143,137,217,209,103,212,192,238, + 61, 1, 96,225,194,133,253,234,214,173, 91,143,195,225,164,206,153, 51,103,251,188,121,243, 24,194,242, 76,229, 18,253, 57,108, +184,225,219, 3, 8, 5, 16, 8, 32, 5,192,109, 84,206, 50, 94, 27,188, 18,156,190,190,190,117,104,154, 30,229,237,237,221, 59, + 47, 47,239, 48, 73,146, 91,178,178,178,178, 95,230, 93,135, 97,152,141, 4, 65,140,102, 24,102,147, 13,223, 99,108,169, 67, 36, + 18,229, 41,149, 74, 47,253,239,124,165, 82,233,253, 79,245,231, 69,214,245,130,222,191, 63, 59,118,254,118, 79,227, 69, 61, 58, + 52, 53,115, 71, 33,154, 30, 59,127,167, 83,229,114,161,148,133,123, 32,193, 48, 12, 22, 44, 88, 64, 68, 70, 70,126, 18, 20, 20, + 20, 76,146,228,253,185,115,231, 86, 74,125, 99,186,206,232, 58,103,197, 22,139, 87, 21,182, 77, 42, 93, 35,154,132,219, 67,201, +132, 3,196,136,176, 54,255,235, 48,230,227,190, 4,195, 17, 97,240,103,211,117, 54,115, 5,140, 16,130,163, 88,212,188,105,163, + 73, 17,125,187,145,173, 67,235, 65,226,233, 12,144, 60,108, 60,146,230, 30,181,108,206, 58, 0,109,107,209,202,121,143,226,119, +122,229, 20, 83, 32, 8,128, 32, 0,146, 0,202,148, 52,122,244, 27, 62, 15,192,122, 27,239, 74,164,139, 29,129, 73, 59,149, 0, +192,121, 14, 7,165,158,167,167,231, 39, 19, 38, 76,176, 15, 13, 13,117, 17,137, 68, 2,165, 82,233,157,156,156,236, 57,103,206, +156, 80,133, 66,113, 8,192, 85, 27, 57,253, 27,248,213,217, 19, 53,233,211, 55, 91, 4, 6,128,167, 46, 3,173,146,213,125,144, +252,240,173,207,215,237,253,236,206, 83,229, 32,212, 98,202,132,194,194, 66, 2, 0, 60, 60, 60,152,202, 34,171,221,136,149,147, +123, 96,210,138, 99,144, 43,213,191, 84,199,225, 86,239,141, 97, 31,126,248, 65,231,197,179,198, 57,100, 61,209, 32, 49, 85, 1, + 55, 7, 62,230, 77, 29, 43, 80,169,180,111,173,219, 30, 51,250,199,239,166,111,166, 40,234, 29, 0,173, 41,138,186, 6, 96,251, +130, 5, 11, 44,221,124, 35, 1,204,212,159,208, 59, 56, 28,206,241, 46, 93,186,212, 31, 53,106, 20,209,170, 85, 43, 36, 36, 36, + 4,238,220,185,179,219,225,195,135, 83, 41,138,186, 9,224, 62,244,211,158, 88, 1, 30,128, 70, 28, 14,167,249,191,153, 83, 34, +145,136,213,106,245,112, 63, 63,191,209,111,191,253,118,243,190,125,251, 18,141, 26, 53,194,189,123,247, 90, 29, 61,122,116,222, +185,115,231,110,102,102,102,110, 18, 8, 4,209, 57, 57, 57,138, 23,254, 28, 39,136,209, 0,234,232,117,242, 2, 43,190,179, 81, +158, 75, 42,199,218, 58,148, 74,165,151, 97, 10, 27,130, 32,188,254,201,254,216, 88, 87, 18, 65, 16,110,250,178,168,238,155, 36, + 73,232,116, 58, 25, 69, 81, 65, 53,112, 54,210,191, 72, 89,173,117, 1, 84,151, 8, 90, 12, 0, 61,218, 55,125, 10, 2,119, 42, + 44, 90, 85, 95, 50,239, 84, 8, 48, 6, 77,143, 93,184,227, 86,201, 10,102,250, 22,187, 96, 1, 49,111,222, 60,204,159, 63,191, + 47,128,142, 52, 77,159, 11, 9, 9, 89, 83,137,146,166, 43,214,205,155, 55,111,117, 53,215, 57, 11, 22,175, 10, 58,195,150, 73, +165, 45,190,255, 4,245,239, 4, 10, 35, 2,220,189,194,199,143, 26, 32, 14, 13,105, 0, 37, 28,144, 86, 72,225, 72,220, 81, 0, +216,109,155,213,105, 64,107, 46, 87, 25,189,108,254,212,198, 29,223, 12,197,173, 44, 45,174,101, 81,144,167,106,193, 33,181,160, +104, 6, 96,160,172,109,175, 51,139,116, 56,127, 95, 13,146, 0, 56, 36, 64,146, 4, 56,100, 45,201,104,245,131,133,219,174,135, + 22,230,209, 0,173,126,240,140, 7,164,105,195,134, 13,135, 69, 70, 70,186,228,230,230,218, 39, 36, 36, 64, 40, 20,194,213,213, +149, 35,145, 72,234,172, 88,177, 66, 49,126,252,248,222, 26,141, 38, 13, 64,161,149,156, 33,189, 90, 55,191,184,105,217, 66,103, +237,229,163, 40,222,245, 43, 56, 36, 3,190,189, 3,234,139,197, 56,250, 97, 3,183,240,184,212,125, 87,242,100, 33, 0,178,106, + 34,187,123,247, 46, 71,165, 82, 13,114,114,114,106,199,227,241,188, 69,174,245,232,108,110,235, 39, 5, 68, 96, 74,190,151,188, +211,228,110,222, 61,127,152,216, 5,147, 86, 28,195,170,157,151,126,110,137,220,185,213,229,205,182,179,115, 24, 51,254,139, 81, + 14,153,133, 26, 44,218, 87,136,109,103,165, 24,222,209, 17,147,222,115,198,144,193, 3,237,247,254, 26, 59, 6,192,102,163, 77, +238,133,132,132, 16,119,239,222, 53,119,243,117, 5, 48, 93,173, 86,147,124, 62,159, 16,137, 68,195, 22, 47, 94,172, 25, 60,120, +112,166,161, 64,199,142, 29,209,177, 99, 71,162,180,180, 52,240,212,169, 83,129, 49, 49, 49,186,248,248,248, 36, 0, 7, 45, 91, + 44,196, 25, 74,165,162,174, 72, 44,150,175, 95,183,238,135, 78,157, 58,209, 66,225,223,233,167,106,195, 9, 0,206,206,206,155, +189,188,188,136,111,190,249, 38,251,121,113,214,171, 87,239,216,155,111,190,217,165, 71,143, 30,220,246,237,219,163, 78,157, 58, + 21,235, 60, 60, 60,208,177, 99, 71,226,241,227,199, 45,206,157, 59,183,238,216,177, 99,107,254,250,235,175, 83,105,105,105, 61, + 94,176, 69,107,147, 94, 76,228,216, 88,254,149, 7, 65, 16, 14, 27, 55,110,244, 50,204,201,168,213,106, 65, 81, 84,197,183,225, + 67,211, 52, 40,138,194,226,197,139, 41,153, 76,102,205, 62,146, 25,189, 53, 27, 62,180,185,111,129, 64,224, 97, 72,216, 91,195, +157,253,142, 68, 88,220,196,222,222, 62, 0, 64, 47,120, 6, 79,175, 92,160,252,253, 89, 38,147,165,231,168, 92,238, 0,232, 84, + 13,155, 75,100,100,228,240,249,243,231,127, 96,100,165,109, 30, 17, 17, 97, 58,237, 85,115,253,183,140, 32,136,211, 36, 73, 30, + 2,176, 13,207,209,234,206,226,245, 2,195, 48,109, 0,120, 26, 45, 82,163,124, 84, 8,250,231, 36, 1,192,221,100,185,113, 57, +195,119,129,126,185,167,126, 59,198,136,183,128, 32,136,171,181,108,226, 25, 88,240,211,226, 2, 64, 92, 92, 28,211,167, 79, 31, +194,240,109, 94, 20,133, 31,249,116,240,251, 61,123,119,125, 27,164,200, 21, 15,242,129,248, 12, 6, 92, 82, 11, 18, 12, 46, 95, + 56,197,128, 75, 71,155,108,101,217,122, 82,175,255,215,205, 67, 67,150,110, 89, 54,129,147,148,207,197,182,115,114,104,148,101, + 40,200,205, 64,126,118, 58,114, 50, 83,144,149,145,114, 19, 32,230, 89,205, 89,229,192, 0, 20,173,127, 7,164,129,106, 34, 47, +107,230,212,200,238, 6, 54, 10, 13, 45, 18, 80,128, 70,118,215,138,234, 45,113, 54, 11, 14, 14, 30, 60,107,214, 44,183,219,183, +111,139,229,114,185,234,232,209,163,247,210,210,210,156, 36, 18,201,211,177, 99,199, 6,215,169, 83,199,233,163,143, 62, 18,236, +218,181,171, 31, 42,135,181, 90,226, 12,125,191,221,255,226,183,174, 89,105,255,100,111, 20,212,201, 55,112, 36, 71,134, 11,121, +114, 38,208, 89, 72,124,213,194, 19, 14, 66, 46, 22,182,175,227,208,107,127,242, 82, 45, 77, 15,169,142,243,226,197,139, 18, 59, + 59,187, 21, 67,135, 14,149,140, 27, 55, 78, 72,113, 93,184,177,241, 79,156,167,175,139,175, 35, 87,105, 56,131,187,212,195,228, +161,205, 49,121,213, 73,131,200, 26, 93,191,126, 49,125,253,186,101, 78,173, 70, 83,223,207,203, 9,137,105, 10,108, 59, 43,197, +159,179,234,160,235,226,108,124,212,146,139, 16,127, 7,232, 52,218, 70, 17, 17, 17,209,250,183,246,171, 0,250, 69, 68, 68, 52, +230,112, 56, 39, 1, 28,168,233, 24,137, 68,230,103, 79,113,117,117, 69, 88, 88, 24, 66, 66, 66,184,157, 58,117,106,110, 34, 96, + 42,113,106, 52,106, 9, 77, 51,112,116,116, 20,187,187,187,187, 58, 58, 58, 62, 49,247,160,178,133, 19, 0,220,220,220,250,135, +133,133,113,119,238,220, 89,152,154,154,122,121,240,224,193, 41, 78, 78, 78,149,172,191,246,246,246, 8, 14, 14,198,156, 57,115, +184, 61,123,246,172,145,211,219,219,187,123, 76, 76, 12, 8,130,168,120,104, 87, 49, 22, 7, 4,192,199,199, 7,189,122,245,226, +246,239,223,191,123, 90, 90, 90,173,174, 35, 27,112,194,140, 69,107,129,201,113,178, 56,252,102,174,188, 21,199, 61,223, 96, 93, +210,243,225, 25,174,205,106,135, 59, 69, 34, 81,133, 21,202, 76, 93, 85, 56, 73,146,196,236,217,179, 65, 16, 4,120, 60, 30,248, +124,190,217,239,206,157, 59,219,218,206,199, 4, 65,144,124, 62,127, 58,151,203, 29,165, 82,169,252, 68, 34, 81, 54, 69, 81, 63, +171, 84,170,197, 0,180, 12,195,184, 88, 16, 89,102, 57,237,237,237, 3, 30, 60,120,208,208, 82, 67, 84, 42, 21,154, 55,111, 14, +168,144, 84, 29,103,114,114,114, 64, 80, 80, 80, 35, 0,134, 41,218,206, 50, 12,211,201,232,191, 49,206, 50, 12,243,158,254,247, +253, 71,143, 30, 5, 52,104,208,160,232, 69,157,159, 44,231,191,143,179, 6, 45,226, 73, 16, 68,156,209,181,218,199,240,127,198, +140, 25, 51,151, 44, 89,114,155, 32,136, 56,227,229,198,229,140,191,245,247,155, 56,134, 97,250,124,243,205, 55,161,223,125,247, +221,183,134,178,255,132, 72,180,197,162,229, 84,160,180,199,185, 12, 39,112, 57, 20,184, 36, 1, 46, 7, 0, 67, 32, 61, 45, 25, +165,210,226,243, 72,221,151,106,157, 37, 43,188,253, 27,111, 52, 91,182, 99,213, 52,242,167,115,114, 20,203,148,184,251,215,105, + 92, 61,125, 32,151,210, 81, 7, 64, 48,215, 0, 50, 1, 41,244, 61, 32,182,118,115, 92, 16, 12,183, 92,104,233,197, 85, 37,177, +245,210,208,162,113,227,198, 3,231,204,153,227,113,253,250,117, 81, 73, 73, 73,233,142, 29, 59,178, 85, 42, 85, 26,128, 63,210, +211,211, 27,175, 94,189, 90,176,108,217,178,102,205,154, 53,147,236,217,179, 71,109,102, 58,163, 42,156, 83, 71, 12,137, 31, 53, +126,162, 40,105,207, 90, 8,146, 18, 48,251, 70, 33,245,103,142,124, 22,128, 85,120, 92,214,190, 64,169, 59,190, 50,172, 46, 89, +207,145,143, 6, 46,130,206,119,159, 42,171,181,100,217,217,217,173,136,137,137, 9,104,211,166, 13, 9, 0,231,238,235,132,211, +215,197,215,249, 99, 73,123,162,125, 83,119,228, 23,171, 48, 97,109, 34,142,198,231,255,110, 16, 89, 53, 53,210,209,209,177, 32, + 51, 95,234,237,238, 32,194,199, 29, 28,208,117,113, 54,194, 91, 11, 33,228, 19,184,151,154,139, 6, 65,245,136,196,243, 7, 91, +235, 69, 86,155,156,156, 28, 0,104, 13, 32,245,241,227,199,146,182,109,219,150, 24,209, 21, 1, 88, 42, 16, 8,102, 19, 4,193, +180,105,211, 38,177, 89,179,102,101,174,174,174, 80, 40, 20, 80,169, 84,224,243,249, 80, 40, 20, 72, 79, 79,199,229,203,151,225, +234,234,106,211,129, 42, 43, 43,131,163,163, 35,104,154,126,102, 78,138,162,136, 13, 27, 54,216,223,190,125,219, 62, 54, 54,214, +123,210,164, 73, 79,154, 52,105,114,109,224,192,129, 15,189,188,188, 84, 55,110,220,192,197,139, 23, 81, 84, 84,132,118,237,218, + 89,197,169, 86,171,193,229,114,161, 80, 40, 32, 20, 10,193,229,114,161,211,233, 64,211,116,133,248, 42, 43, 43,195,211,167, 79, +193,231,243,161, 86,171, 95,198, 27,104, 21, 11, 85,117,195,111,181,177,104, 25, 11, 53, 43, 69, 86, 77,150, 40,139,195,157,197, +197,197, 98, 23, 23,151,233, 0,114,106,170,139, 32, 8,112, 56, 28,240,249,124, 16, 4,129, 78,157, 58,225,211, 79, 63, 69,203, +150, 45,145,156,156,140, 93,187,118,225,234,213,171,224,241,120, 21,229,173, 30,159,232,220,153, 35, 18,137, 46,190,255,254,251, +161,179,102,205, 18,213,171, 87, 15, 73, 73, 73,254,223,125,247,221,244, 19, 39, 78,124, 32,147,201, 90, 27,238,118,213, 91,233, +245, 67,130,229,195,133,189, 84, 42, 21,146,146,146,108,217,166, 10, 26, 52,104,144, 78,146,228, 67,154,166,207, 1,104,206, 48, + 76, 39,130, 32,142,162,220, 47,209, 24, 50,134, 97,222, 35, 8, 66, 10,224, 38, 73,146,247,105,154, 78,103,237, 54, 44,172,184, +175,244, 49,253, 79, 16, 68,220,146, 37, 75,250,152, 19, 87,102,174,205, 74,203,191,251,238,187,111,141,254, 63,139, 69, 53, 12, +149,157,225, 59,235,173, 92,127, 11,173,184,184,184,234, 21, 8,141,143,226,246,237,188,212, 85,131,128,208, 86, 29,141,172, 67, + 12, 18, 46, 95, 4,192,252,108, 85, 83, 36,125,196, 36,135,251,243,134,111,199,145, 27, 79,203,241, 56, 59, 31, 23,143,252,140, +130,156,180,109, 0, 51, 9,169,177,210,103, 62, 18,245, 62,106,230,229,238,225,162,212, 48,160, 25, 0, 85,196,214, 75, 65,203, + 70,141, 26,245,143,143,143,247, 80, 42,149,162,243,231,207,203, 99, 98, 98,114, 53, 26,205,105, 0, 23,244,101,174, 23, 20, 20, + 68,232,133, 9,135,203,229, 10, 52, 26, 77,117,190, 11, 45,167,142, 26,126,126,233,134,173,162,135,183, 18,177, 58,246, 8,138, +229,114,234,116,190,162, 31, 0,131,162, 63,121,189, 80,145,197,128,169,203, 35, 9, 72,236,121, 62,119,159, 42, 69,128,249, 33, + 89,149, 74, 53,120,232,208,161, 18,131,200, 2,128,194, 82, 45, 87,174,210,114,218, 55,117, 71,171, 46, 17, 72, 56,181, 23,123, +206,102, 33,200,211,238,108,125,251, 98,171,246,104, 65,126,206,134,149, 81, 27, 87, 46, 93, 48, 85, 48,185,151, 51,194, 91,243, + 32,226, 19,112,178,227, 97,241,154,205,218,235,151,207,222,144, 72, 36,113, 0,250,229,228,228, 64, 34,145,148, 1,184,207,225, +112, 82, 41,138, 50,231,212, 61, 23,128,119,116,116, 52,169,213,106,203,146,147,147,225,227,227, 3,111,111,111, 56, 59, 59,227, +238,221,187,248,243,207, 63,113,239,222, 61,208, 52,141, 55,222,120,195,166,131,245,228,201, 19,220,184,113, 3,189,122,245,158, + 84, 80,144,239,228,234,230, 46, 59,127,238,236,247,181,225,164,105,154, 0,128,208,208, 80,132,134,134,138,178,178,178,252,226, +226,226,188, 22, 45, 90,148, 17, 16, 16,176, 67,161, 80, 84,178, 28, 88, 43,180, 12,226,194, 32, 2, 69, 34, 17,248,124, 62,164, + 82, 41,242,242,242, 80, 90, 90, 30,180,233,226,226,242, 82,132,150, 5, 11,213,115, 43,255, 15,139,195, 42,195,157, 46, 46, 46, + 67, 1, 76,183,178, 47,208,233,116,224,243,249,104,219,182, 45,162,162,162,112,245,234, 85, 28, 56,112, 0,254,254,254, 24, 49, + 98, 4, 72,146,196,237,219,183,109,109, 34, 29, 31, 31, 63,189, 95,191,126,161,209,209,209,162,244,244,116,220,187,119, 15, 46, + 46, 46,136,138,138, 18,142, 30, 61,186,193,169, 83,167,230,162, 60,248,165,122, 24, 69, 23,202,196,146, 1,205,155, 55,175, 82, +196,199,199,199,249,143, 63,254,240,170, 16, 96,166, 17,137, 85, 81, 60,119,238,220,149, 33, 33, 33,171,244,195,133, 29, 1,216, + 51, 12,211, 57, 54, 54,150, 0,128,240,240,112,134, 32, 8,195, 3,233,230,222,189,123,187,220,189,123,151,153, 63,127, 62,235, +163,197,194,146, 22, 25,109,184, 38, 45, 9, 40, 91,132,154,177, 60,104, 55, 9, 0, 0, 32, 0, 73, 68, 65, 84,197,203,128,111, +190,249, 38,116,201,146, 37, 87,158, 81,100, 25,191, 49, 49, 6,177, 85,241, 48,181, 56,100, 88, 97,251, 34, 37, 62, 94,238,110, + 51, 70,180, 7, 77, 3, 58, 10,208, 81, 12,100,114, 5,146,110, 93,149, 67, 68,196, 90,213, 28,161, 96,217,162, 89, 19, 3, 19, + 51, 73,100, 23,105,112,230,224, 70,166, 32, 39,173, 63, 82,247,142,124, 62, 34,107, 64,115, 31,111,175, 51, 59, 55, 46, 36,175, +166,168, 65,209,229, 58,139,166,153,138,223, 47, 1, 62,158,158,158, 67, 46, 93,186,228, 41, 20, 10, 69, 15, 30, 60,160,247,238, +221, 91,164,209,104, 78, 24,137, 44, 0,104,223,186,117,107,157,131,131, 3,100, 50,153, 70,163,209, 40,171, 17, 89,126,157, 91, +182, 56,187,116,195, 86,145, 82,173, 70,137, 66, 5,142,187,151,169,200, 2,128,183,187, 52,244,245, 37, 68,142, 96, 0,164, 73, + 53,217,150, 68, 22, 0, 8,133,194,110,227,198,141,171, 52, 47,158,135, 35, 79,103, 39,228, 81, 23,238, 20,210, 9,167,246,226, +220,237, 66, 90,196,231, 80,158, 76, 74,160,181, 59,160, 56,243,206,134, 3,191,197, 29,255,122,206,178, 50,185,172, 20, 65,117, +196, 40, 43, 45,193,226, 37, 75,181,241,241,231, 78, 79,159,244,249, 91,123,247,238,253, 14,229,206,224, 0,112,127,239,222,189, +195,231,204,153,179, 29,127,167,121, 48, 69,246,144, 33, 67, 50,155, 54,109, 90, 18, 18, 18, 82,242,228,201, 19,220,185,115, 7, + 69, 69, 69, 88,189,122, 53,146,146,146, 96,176, 8, 90,229,171, 82, 85, 32,161,168,232,169, 3,195, 48, 40,122,250,196,126,214, +172, 89,206,181,225,164, 40,170,210,181,229,235,235,139,177, 99,199,242,229,114,185, 75, 70, 70,134,147,241, 58,107, 57,213,106, + 53, 12,150, 33,134, 97,160, 86,171, 81, 82, 82, 2,181, 90,141,135, 15, 31, 86,136, 44,125,253, 47,205,162,101,248, 45, 18,137, +242, 12,231,178, 97, 8, 78, 36, 18,229, 91, 42,255, 44, 48,170,139,209,255,182, 85, 28,214,216, 31, 43,143, 59,248,124, 62, 62, +253,244, 83, 92,185,114, 5,201,201,201,224,112, 56,144,201,100,144,203,229,232,222,189, 59, 4, 2,129,173, 22, 45,134,207,231, + 15,157, 57,115,166, 40, 53, 53, 21,133,133,133, 6,103,122, 80, 20,133, 73,147, 38,137,133, 66,225, 80, 91, 77,247, 57, 57, 57, +239, 62,124,248,176,145,233, 39, 55, 55,183,196,216,167,176,182,136,141,141, 37,194,195,195,153,240,240,112,198, 32,184, 88,176, + 48, 7, 11, 90,100,147, 37,139,214,243,176,138, 25, 44, 91,208, 7,136,212, 2, 6,145, 21,102, 36,188, 8,131,133,203,186,161, +195,160, 1,255,243,118,119, 59, 21,189, 54,210, 33,238, 22,129,204,199,105, 40,200, 73, 71,235,183, 58, 35,233, 86, 34,104, 45, +181, 15, 15, 99,107,246,228,172, 23,222, 48, 36,164,201, 23, 97,111, 53,195,178,184, 50, 60, 72,248, 3,197, 5, 57, 63, 34,109, +239,190,231,114,132, 2,194, 91,120,123,185,157,218,190, 54,210,229,232, 29, 18,143, 31,167,225,224,246,149,140, 86,163, 42, 70, +229, 72, 46,155,223,154,197,180, 90, 80, 86,156, 7,117, 41, 5, 17, 41, 23,217, 56, 72,145, 11,224,220,202,149, 43,187,182,107, +215, 78, 48,100,200,144,220,162,162,162,131, 0, 46, 25,149,105,218,176, 97,195, 94, 81, 81, 81,222,143, 31, 63,198,137, 19, 39, +114, 81, 30,250,111, 9,153,103, 19,111,173,251,115,251,230,169,226,192,198, 88, 61,243,107, 93,236,213, 59,239, 3, 56,106, 84, + 38,164, 91,243,134,113,139,166,124, 73,210,215,127,199,141,244, 60,164,148,168,254,180, 68, 88, 88, 88, 72,200,229,242, 0, 23, + 23, 23,227, 19, 18, 18,123,153,106,218,128,134,217,221,167,159,175,163,212, 80, 16,242, 72,102,194, 7, 1,217, 87, 14,198,186, + 23, 42, 11, 9, 67, 52, 98, 77,248,108, 96,183, 15,214,198,236,255, 56, 46,238,240, 23, 26,149,178, 89,227,198,141,152,107,241, +167,110, 76,159,244,121,207, 90, 30,113,135, 43, 87,174,144, 28, 14,167,146, 64, 55,182, 16,217,106, 41,178, 5,214,114,154, 10, + 45, 3,116, 58, 29, 81, 91, 78,149, 74, 85, 33,180, 76, 31,238,230, 4,227, 63,209,127, 91, 44, 84,198, 67,134, 6,127, 58,165, + 82,233,165,247,217,242,126,158, 22,173,103,137, 68,172,110,248,210,150,246,145, 36, 9,154,166,193,231,243,241,198, 27,111, 32, + 46, 46, 14,110,110,110,112,114,114,130,147,147, 19,196, 98, 49,220,221,221, 43,132, 22, 73, 90, 29,165,195,168, 84, 42,127,127, +127,127, 60,124,248, 16, 34,145,168,226, 35, 20, 10, 17, 26, 26, 10,153, 76,230,139,151,105,187,103,193,226,159,189,175,196, 25, +139, 37,130, 32,226,102,204,152, 49,179,182,124, 51,102,204,152,105,206,194,245,140,130,171,146,117,139,107,172, 32,205, 42, 73, +189,200,218,246,227, 2,167,253,127, 1,153,153,169, 56,190,103, 77,169, 86,163, 46,162,105,109, 64,202,189, 68,128,196,207, 86, + 53,129,100,222,252,160, 87, 23,226,248,109, 53,164,197, 5,184,127,237,143, 52, 40, 4,223, 60, 55,145,229,237,113, 42,122,237, + 2,151, 67,183, 8, 60,126,156,134,163, 59, 87, 75,181, 26, 77, 55,164,198, 94,123, 22,234,161,124,254, 7,252,186, 25,125, 70, +117,204, 6, 69, 80, 24,154,116,247,189,252, 92,124,144,115,190,250,200, 48, 99, 20, 20, 20, 28, 92,185,114, 37,177,124,249,242, + 48,165, 82,249, 43, 0, 99, 19,101,179,160,160,160, 65,155, 54,109,114,123,252,248, 49,239,252,249,243,178, 83,167, 78, 49, 0, + 14,213, 96,113,153,214,125,228, 88, 78,203,122,190,227,174,167,101,189, 15,224,119,163,213,161,125, 90, 53,189,176,117,201, 92, + 71,237,133, 88,148,229, 60,198, 55, 23, 50,165, 0,172,222,223, 90,173, 22, 37, 37, 37,208,150, 61,209,181,150,200, 74,230, 71, +120,169,242,138,148, 92, 30, 45,215,133, 56,229,171, 78, 61, 73,225,216,217,217,217,180, 47,215, 46,153, 26, 3, 32, 38, 34, 34, + 34,250,102,252,225,214, 18,137,228,112, 72, 72, 8, 1, 0, 22, 34, 12, 45, 33, 18,192,164,183,223,126,155,104,219,182,237,229, + 85,171, 86, 29,171, 78,172,212,198,162, 85, 19,172,229,164,105,154,180,176,127,137,218,114, 26, 91,180,106, 18, 90, 47,211,162, +101, 78,180, 24,139, 68, 99, 33,244,111,136, 58,172, 78, 76,217,210, 62,131,159, 28,159,207, 71, 98, 98, 34,234,214,173, 11,141, + 70, 3, 71, 71, 71, 56, 58, 58,194,193,193, 1,165,165,165,224,241,120,176,177,207,180, 72, 36,202,184,115,231, 78, 35, 79, 79, + 79, 80, 20, 85, 73,108, 61,120,240, 0,246,246,246, 89,182, 90,180, 36, 18,201, 31,250,168,195, 74,240,241,241,113,126, 30,251, +213,216,146, 21, 30, 30,206, 14, 17,178,168,214,154,101,193,170, 85, 96, 98,137, 82, 27,253, 47, 64,121, 14,183, 62,250,223, 48, +243, 91,109,102,217,147, 37, 75,150,156, 50,242,239, 42,120,198, 46, 24, 82, 60, 84,138,112,225,214,100,201,242,114,115, 61,181, +101,245,124,167, 61, 9, 64,214,227, 84,156,217, 23, 85,162,163, 52,239,128,102,114,226, 79,236,139, 5, 1, 57, 82, 98,207, 88, +119,139, 64,203,150, 77, 2,112,224,182, 22, 5,153, 15,192, 48,244, 54,228,199,200,159,249,232, 4,125,244,134,151,155,199,169, +109, 81,243,157,247, 39, 18,200,124,156,138,227,123,162,164, 58,173,188, 43, 82,247, 37,212,150,246, 83,192,149, 99, 47, 90,215, +191,115,203, 1, 1, 65,126,160, 25, 45,104, 62,131,143,166,121,112,239, 95,151, 31, 56, 39, 42,217, 67,151,209, 95,100, 93,178, +206,129,174,172,172,236, 0,128,107,168,156, 94,161, 69,112,112,240,128,117,235,214,121,102,102,102,138,174, 95,191,174,216,184, +113, 99, 62, 77,211,251, 1, 88, 51,148,250,245,245,180,172, 45,168,156, 47,167,197,212,145, 67,226,135,124, 50, 74,148,122, 34, + 6,174,169, 73,152,114, 33,155,186, 95,164, 30,172,183,174,153,133,135,135, 7, 83, 88, 88,152, 94, 92, 92,220,200,222,222, 30, + 79,158, 60,193,211,167, 79, 81, 82, 82, 2,149,244,169,206,157, 42,150, 17,186,167,224,241,120,200,127,172, 5, 69, 81,185,214, + 90,179, 0,184, 70, 70, 70,126, 70,211,180, 33, 35, 98,165,232, 66,163,114,134,243,161, 81, 68, 68, 68,180, 81,212,161,177, 51, +188, 33,189, 3,161, 79,239,208,238,247,223,127,191,219,179,103,207, 76,115, 98, 69, 40, 20,218,236, 40,109, 41,138,177, 54,156, +150, 44, 90,166,203,109,225, 52, 12, 95, 26,156,224, 77,151, 27,192,225,112, 64,211, 52,172, 8,170,248, 71, 69,139,113,116, 96, +109, 68,142,201,177,169, 54,113,104, 45, 35, 17,159,171, 69,203,112, 44,248,124, 62,126,251,237, 55,124,242,201, 39,160, 40, 10, +118,118,118,112,112,112,128,189,189, 61,246,237,219, 7, 67,250, 7, 91,244,171, 86,171,253,101,201,146, 37, 51, 55,108,216, 32, +102, 24, 6, 2,129,160, 66,104,205,159, 63, 95,161,209,104,126,177, 74,104, 25, 50,190,211,204, 29,123,123, 93,181, 81,135,230, +182,177,224,175,229, 18, 25, 25, 57,156,166,233, 15, 96,146,194,193,164, 92,165,212, 15,108,122, 7, 22, 86,220, 79,174,254,139, +155,103, 16, 88,132,145, 37,171, 66,112,145,213,137, 23, 79, 87,151, 83,155, 87,207,119,218,113,149, 64,106, 74, 10, 78,255,186, +166, 92,100, 61,218,243, 23,210, 99,243,144, 26,219, 1, 41,177,239, 90,253,246, 68, 16, 45,235,120,185,224,169,140,134,180, 48, + 3, 96,112,253,121,136, 44, 79, 87,207, 83, 63, 69,205,119,222,251, 23,137,212,212, 84, 28,223,179,166, 68,167, 83,190,243, 44, + 34,107, 40,159,255, 65,112, 67,191,228,217,159,125, 48,160,109, 3, 31,184,103,220,197,161, 17, 3,176,112,215,135,112,244,228, +224,205, 94,142,248,116,177,207, 0, 73,168,240,161,164, 3, 62,176,129,218, 88,100,181,172, 95,191,254,128, 75,151, 46,121, 52, +111,222, 92,116,239,222, 61,229,198,141, 27,243, 21, 10,197, 49, 0,137, 54,112, 26,139,172,150, 51, 70,143,136, 95,186, 57, 90, + 68,242, 5, 88,246,203, 33,140, 63,155, 73, 29, 78,151, 70,160,242,176,162, 89,168, 84,170, 19, 81, 81, 81, 42,146, 36,241,244, +233, 83, 20, 22, 22, 34, 63, 63,191,226,187,184,184, 24, 28, 14, 7, 39, 79,158, 84, 75,165,210, 75,214, 54,240,226,197,139,245, +179,178,178, 66,114,114,114, 90,235, 63,247, 80, 30, 93,232, 96,180,172,117, 78, 78, 78, 24,128,171,134,229,153,153,153,245, 46, + 95,190, 44,169,137,223,209,209, 17,124, 62,191,146, 69, 75, 40, 20,194,219,219, 27, 58,157, 14,187,119,239, 6,128,167,213,113, +240,249,130, 28,146, 36, 64, 51,180, 74, 36, 18,209, 18,137,196,172,192,178,133, 83,143,204,247,222,123, 79,153,144,144, 96,214, +162, 85, 27, 78,134, 97,228, 61,122,244, 64,118,118, 54, 68, 34, 81,197,195,218, 32,168, 72,146,132, 80, 40, 68,110,110, 46,198, +140, 25, 3,134, 97,228, 47,250,206, 99,236,211,164, 23, 67, 4, 0, 66, 47,132,170,248,105, 89,235, 3,101, 24, 26,100, 24, 6, + 6,193,101,178,190,162, 46,107,178,183,155,248,116,141, 46, 46, 46, 94, 90,222, 28,102,163,201,247, 38, 27, 30, 10, 21, 66, 43, + 41, 41, 9,209,209,209, 40, 46, 46,134, 64, 32, 64, 81, 81, 17,182,110,221,138, 59,119,238, 64, 32, 16,192,176, 47,172,213,111, +109,219,182, 93,122,238,220,185, 59,131, 7, 15, 86, 36, 38, 38, 66,161, 80, 32, 49, 49, 17,239,190,251,174,242,194,133, 11,201, + 10,133, 34, 18,214, 12, 29, 26, 50,190,235,167,215, 81,169, 84,184,126,253,186,217,143,165,109, 76,145,156,156, 28, 64, 81, 84, + 35,134, 97, 58, 50, 12,227, 4,125, 10, 7,253,127,227,207,123,250,117, 78, 12,195,116,164, 40, 42, 56, 57, 57, 57,128,149, 19, + 44, 94, 81,156, 49, 18, 91,140,145,200, 58, 83,189, 69,139, 38,163,182,172, 89,224,244,203, 21, 18,143,211,147,113,237,200,186, + 18,138,214,190, 99,227,116, 56,221, 96,148,107, 67, 36,182,111, 70, 19,229,225,204,210,194,199, 0,195,169,141,208,170,196, 9, +154,140,218,186,102,190,243,206,107, 4,178, 31, 63,194,133,131,107, 75,116, 58, 85, 87,164,196, 94,175, 13,231, 80, 62,127, 14, +143, 67,204,238,209,254,127,252, 14,255,107, 8,251,252, 52,228,102,102, 99,119, 82,193,211,228, 34,213,168, 11,132, 6,233,143, + 84, 91,122,125,230,230,230,234,195, 67,159,207,221,221, 46, 29,146, 30, 32,120, 50, 13,163, 97,150,228, 92,168,152,150,162,114, + 59,171,194,199,209,209,113,240,181,107,215,156, 68, 34,145,248,218,181,107,244,198,141, 27,159, 40, 20,138, 35, 0,226,173,234, +123, 85,248,181,105, 24,116,230,219,181,155, 69,101, 50, 57,100,106, 13,132,222, 18,106,127,252,173,254,176,156, 0,179, 18,167, + 80, 40,220,185,115,231,206, 94,157, 58,117, 10,104,214,172, 25,249,244,233, 83,148,149,149, 85, 56, 87,123,122,122, 34, 41, 41, +137, 78, 77, 77,205, 22, 10,133,187,172,109,231,219,111,191,157, 74,146,228, 61,253, 48,218, 61,152, 68, 23, 26, 21,109,148,147, +147,211, 70, 34,145,156, 1, 96,103, 20,117,104,204,105, 72,239, 48, 19, 0, 73, 16,196,213,196,196,196,178,158, 61,123, 66, 44, + 22, 67, 38,147,193,223,223, 31, 58,157, 14, 71,142, 28, 65, 66, 66,130,140,166,233, 51,102,196,107,165,118, 42,149, 10,127, 0, +164, 66, 46,127, 99,248,240,225, 97,147, 39, 79,174, 20,146,238,229,229, 5, 55, 55, 55,155, 56, 1,224,233,211,167, 77,126,255, +253,247,137,137,137,137, 95,247,234,213,203,121,230,204,153,194,250,245,235,131,162, 40,178,182,156, 69, 69, 69,206,215,175, 95, +255,190, 67,135, 14, 95,246,236,217,147,251,237,183,223,194,217,217, 25, 20, 69, 65, 44, 22, 67, 42,149, 34, 50, 50, 18,231,207, +159,215, 49, 12,179,182,164,164,100,138,141,231, 18,158,245,218,180,100, 1,178,148,146,193, 66,249,127,188,157, 38, 62, 93,208, +167,112,152,110, 33,131, 61,172, 61,231, 13, 66,139,195,225, 32, 45, 45, 13, 27, 55,110,172,146, 71,203,144,254,193, 2,183,185, +190, 51,167, 79,159,166, 8,130,120,235,218,181,107,211, 63,254,248,227, 81, 50,153,204,207,222,222, 62, 91,171,213,254,172, 80, + 40, 22,163,220, 31,149,111,203, 61, 68, 38,147,165,155,139, 58, 52, 45, 3,184, 84,203,105,146,222,161, 82, 10, 7,147,109, 42, +165,126, 48,147,222,225, 31, 63,238, 44,231,191,146,243, 85, 23, 91,150, 19,150, 86, 65,203,209, 60,158, 66,219,252, 92, 50,241, + 44, 34,171,170,181, 68, 41, 79,158,187, 51,227,127,106,149, 18,178,146,188,251, 72,219,157,255, 76,221,210,183,243,108, 50,129, +180,212, 71,184, 18,183,182,188,157, 41,177,181,110, 39, 1,124,179,254,104, 44,159,112,118,195,141,137,159, 32,187, 88,134,163, + 41, 69,123, 24,185,234,139, 95,128, 34,156, 7, 72,157,234,220,214, 89,185,235, 58,126,228, 60,192,195,151,135, 21, 83,127,134, +104,134, 59,255,205,174,157,108,153, 3, 49, 87, 36, 18,157, 91,189,122,117,183,142, 29, 59, 10, 35, 34, 34,204, 57,200,219,138, +204,171, 15, 30,173, 63,188,225,135,169,238,205,219,225,199, 57,211,168,157,241,183, 76,163, 16,171, 69, 72, 72, 8,117,241,226, +197,201, 99,198,140, 89,209,173, 91,183, 58,239,191,255,190,192,223,223, 31, 66,161, 16,143, 30, 61,194,185,115,231,212, 41, 41, + 41,217,114,185,124,114,139, 22, 45,108,201,113, 86, 52,119,238,220,165,250, 58, 8,253,112, 97,107,232,163, 11, 13,133,244, 73, + 75, 91, 3,176,155, 63,127,254,199, 0, 96, 33,236,123, 46,128, 13, 0,184, 12,195,228,198,196,196,188,117,240,224,193,183, 38, + 77,154,196,239,213,171, 23, 46, 93,186,132,227,199,143,107, 52, 26, 77,188, 94,184, 90, 59, 85, 14, 13,224,186, 78,167,187,181, +108,217,178,183, 56, 28,206, 92,195,138, 59,119,238, 96,219,182,109,181,225,212, 1,248, 62, 47, 47,111,125, 76, 76,204,220, 19, + 39, 78,140, 28, 62,124,184,147, 86,171, 69, 82, 82, 18,126,250,233,167, 90,113,150,148,148, 76,244,240,240,152,125,228,200,145, +159,143, 29, 59,214,111,216,176, 97,228,248,241,227, 17, 21, 21,133, 95,127,253,149,166, 40,234, 32,143,199, 27, 94, 88, 88, 40, +123, 25,119, 29,253, 48, 92,182,141,115, 29,214,200,251, 44, 67,131, 86, 34,231, 89, 9, 12,253,232,220,185,115,133,149,209, 96, +133, 51, 46, 67, 16,132,205, 67,135, 0, 92, 24,134,161, 1,172, 69,249,252,162,198, 89,225, 57,248, 59,115,188,181,140, 77,115, + 84, 46,119,160, 66, 82,245,147, 74,187, 0, 12,154,214,192, 86, 60,119,238,220,149,243,230,205, 91,105,154,194,193,184,144,105, +234,135, 5, 11, 22,128, 77,239,192,226,117,133,121,161,117,125,147, 86, 27,216,127,230,234,111,167,205,211,105,213, 37, 12, 52, +225,120,180, 47,241, 89, 43, 99,104,102,198,201, 29,243,163,192,160,136,161,116,211,159,185,245,255, 80, 59, 9,103, 55,148, 70, +142,197,175,183,179,153, 92,153,246,195, 95, 52,154, 74,214,160,114,159, 44,122,224, 41,101,209,110,215, 58,188,253, 19,223,113, + 39, 14, 63,253,216,230,122,242,243,243,127, 91,185,114, 37,249,195, 15, 63,132,201,229,114, 83, 7,249,218, 98, 90,223,113, 51, + 56,111, 6, 7,140,187,242, 48,253, 3, 88, 49, 92,104,138,183,223,126, 59,231,238,221,187, 67,142, 29, 59, 54,248,236,217,179, +221,100, 50, 89, 0, 65, 16,176,179,179, 75, 87,169, 84, 39,132, 66,225, 78, 27, 69, 22, 0, 96,222,188,121,204,130, 5, 11,136, +187,119,239, 50, 28, 14,231, 79, 0,169, 28, 14, 39,205,216, 9,222,120,185, 97,155,249,243,231, 91,243, 64, 60, 91, 86, 86,150, + 16, 25, 25,217, 41, 50, 50,242, 13,189, 85,232, 44,254,246,249,178, 21, 90, 0,103,249,124, 65, 54, 65, 16,126,124,129, 80,118, +241,226,197, 19,207,200, 41,215,104, 52,211, 31, 63,126,188, 98,197,138, 21,139,237,237,237,219,220,185,115,231,207,103,225,212, +139,168,254,110,110,110,117,162,163,163,247,110,221,186,181, 29,151,203,189, 68, 16, 68, 68, 73, 73,201, 75,157, 84, 90, 63, 65, +244, 2, 27,230, 58,180,138,247,121, 39, 41,253, 39,132, 27, 69, 81,101,179,103,207,206, 55, 21, 94,166,214, 43,195,127,125, 42, + 23,107,246,169, 45, 81,148, 53, 8, 23,162, 12, 0,202,231, 46, 44,159, 86,199,218, 73,165, 1, 40,106,186,206, 73,146, 60, 8, +224, 62, 73,146, 15, 77, 3, 93,140,215, 45, 88,176,160,166,235,156, 5,139, 87, 26, 86,220,217,230,147,192,252,218,122,210,190, + 64,115,229,243,105,231, 16, 62,127, 1, 9, 76, 5, 64, 48,192,138, 95, 52,154, 89,213,109,232,243, 54, 22, 51, 4, 38,233,119, +230,183,185, 23,176,168, 22,125,247,133, 21,243, 15,218,200,217, 24,213, 79, 40, 91,133, 51, 60, 60,156, 99,225, 97, 94,105, 82, +105, 75,136,141,173,200,226,111,169,157,198,231,155,227,229,203,151,235,180,109,219, 54, 7,149,157,254,205, 45,103,108,236, 59, + 7, 0,245,156,247,231, 43,193, 25, 20, 20, 36,120,244,232,145,250,223,117,109,178,156,255, 74, 78,151, 38,117, 65,224, 51, 24, +231, 14,170,214,162,101, 36,208, 24,230, 39, 20, 39, 61,182,208, 78,195,117,238,146,156,156, 28,208,160, 65,131,116, 0,197, 38, +237, 48,183,142, 97,143,209,127,158,211, 28, 70,163,242, 84,116, 44,204, 28, 8,150,147,229,100, 57, 89, 78,150,147,229,100, 57, + 89,206,218, 10,173, 87, 26, 36, 88,176, 96,193,130, 5, 11, 22, 44, 88,252, 35, 32,170, 81,165,182,152, 4,107,163,108, 79,176, +156, 44, 39,203,201,114,178,156, 44, 39,203,249,159,227,172,137,219,120,251, 87,117,232,240,133,181,155, 53,171,178,156, 44, 39, +203,201,114,178,156, 44, 39,203,249, 44,130,229,149, 6, 23, 44, 88,176, 96,193,130, 5,139, 87, 6,221, 26, 66,194,165, 64,254, +254,200,170, 32,170, 26,209, 51, 8,190, 0,240,188,248,254,163,144, 0,232,109,244,255, 48,244,145,241,172,208,122,117, 17, 12, + 96, 38, 0,227,185,200,174, 0, 88, 98, 82,110, 7, 0,227, 9, 9,101, 40,159, 39,240,161, 45,149,145, 36,185,164, 83,167, 78, + 95,156, 63,127,254, 7,157, 78, 23, 89,139,246, 6, 72, 36,146,165, 4, 65,180, 2,192, 35, 8,226, 81, 94, 94,222, 18,157, 78, +247, 44, 81, 43,129, 62, 62, 62,223, 1,248, 31, 73,146, 60,130, 32,146,243,242,242, 22,233,116,186,211,207,192,233,232,237,237, +221,158, 97, 24, 31, 0, 28, 30,143,247, 36, 43, 43,235, 50,106,153, 91, 41,124,126, 18, 95, 42,211,241, 0,192,201,158,171,141, +157,223, 68, 99,237, 50,246, 20,103,193,226,191, 13,166, 60, 50,185, 18,222, 13,194, 98, 70,135, 41, 20, 64,244,168,143, 53,127, +164, 98,138,165,237, 9, 51, 81,205,166,156,239, 6, 97, 49,197,148,115,244, 8,194,247,127, 60, 66,181,145,246,214,112, 26,176, + 9, 32, 71, 91, 49, 75, 1, 97, 93,244,245,191, 29,189, 81,121,168,176, 98,232,176, 90,161, 53,176, 33, 36, 20, 23,220,216, 36, + 24,194,120, 29, 1,188,161,127,200, 63, 68,121,174,162,210,103,108,220,171,194,249,111,195, 92,134, 97,134, 84, 58, 89,205,228, + 33,122,231,157,119,222, 63,118,236,152,157, 97,190, 59,154,166, 33, 22,139,117, 0, 70,216, 80,151,215,192,129, 3,103,108,217, +178, 5, 3, 6, 12,152, 29, 23, 23,183, 18, 64,153,181, 27,187,186,186,134,187,184,184, 68,109,222,188,217,179, 93,187,183, 8, +129, 64,128, 71,143,146,253,198,140, 25,211,236,238,221,187, 7,243,243,243, 71,217,218,121, 55, 55,183,161, 46, 46, 46, 43, 54, +110,220,232,209,161, 67, 7, 16, 4,129,132,132, 4,191,137, 19, 39,190,145,145,145,177, 43, 47, 47,239, 75, 91, 57,221,221,221, + 27, 58, 59, 59,119,249,241,199, 31,197,237,219,183,135, 72, 36, 66, 98, 98,162,195,231,159,127,238,147,149,149,149,148,151,151, +119,198, 86,145,117, 51,225, 80, 63,157, 70,181, 12, 0,184,124,225,180,118, 43,226, 15,221, 60,117,168,111, 77,203,194,231, 39, + 29, 96,197, 22, 11, 22, 44,140, 49,180, 14,124, 24, 6, 83,143,253, 52,135, 4,128, 30, 35, 23,142, 31, 90, 7, 63,252,146,109, +121, 14, 91, 27,249,166, 12,247, 69, 84,116, 22,242,158,165,157,155, 0,114, 34,151, 59,254,205,182,109, 61,190,186,112, 33, 89, + 3,252,252, 31, 57, 68,102,135, 57, 45, 10,173,254, 77, 16,169, 43,183,152, 16, 61, 27, 96,215,241, 84,206,185,119,222,121,167, +193,167,159,126, 74,180,108,217, 18, 9, 9, 9, 13,119,237,218,213,251,240,225,195,201, 20, 69, 37, 0,184, 13,235,179, 90,243, + 0,132,114, 56,156, 86,255,114,206,127, 51,236,245,226, 42, 15,127, 39, 58,173,146,240,244,228,201,147,191,113,185, 92,131, 69, +235, 77,153, 76,230,109, 98, 5,179, 6,245,180, 90, 45,238,221,187, 7,146, 36,121, 0,234,163,234,148, 26,150,224,103,103,103, +183, 46,254, 74,130, 59,193, 21,163, 72, 9, 64,169,129,192,193, 27, 91,182,197,184, 77,158,240,101,255,211,167, 79,159, 43, 45, + 45,221,110, 67,123,234,219,219,219,175,188,113,227,134,187,157,157, 29,104,154, 70,105,105, 41,124,124,124,176,121,243,102,151, +201,147, 39, 15,145, 74,165,167,149, 74,229,175,182,136,115,103,103,231, 46,183,110,221, 18, 27, 38,148, 86,171,213,240,243,243, +195,142, 29, 59,132,227,199,143,111, 82, 92, 92,156,169, 86,171, 83,172, 37,148,202,116, 60,157, 70,181, 44,122,237,252,186, 0, + 48,252,203,249,203, 4,165, 78, 71,172, 89, 38,149,233, 14, 3, 96,133, 22,139, 23,141, 86, 30, 30, 30,177,133,133,133,103, 0, +140,194,243,177, 52, 52, 20,137, 68, 45,104,154,246, 33, 73, 18, 28, 14, 39, 87, 38,147,221, 0,240,160,182,132,238, 65,157,251, + 66,104,247, 9, 24,250, 13, 18, 0, 65,146,137,148, 70,190,237,201,131,211,135,158,137, 83, 32, 30, 9, 48,111,144, 0, 77,144, +228, 13, 90, 39,223, 92,120,239,244,209,127,203,193,185, 84,130, 70, 65, 62,214, 79,140,249, 60,248, 6, 5, 66, 66,210, 32,119, +164, 89, 63,172, 56, 14,232, 53, 97,194, 4,159, 47,191,248,130,248,100,196,136,224, 51,231,207, 19, 97,182,204, 86,240,106,194, +162,227,187, 89,161, 21,222, 4,174, 12, 48,125, 87,212, 76,146,203,225, 16,131, 39, 44, 25,178,117,237,247,100,247,190, 17, 21, +195, 39, 29, 59,118, 68,199,142, 29,137,101,203,150, 5,255,249,231,159,193, 59,118,236,208,197,199,199,223, 0,176,219, 82,101, +239, 6, 65, 65, 3, 34, 62,143, 43, 27, 60,103,251,198,182,109,219,254,159,189,243, 14,139,226,106,219,248, 61,219,251, 46, 11, + 11, 75, 71, 84, 58, 54,136, 98, 87, 44,216, 80, 44,137, 93, 99,124,237, 45,209, 68, 99, 98, 52, 38,182,216, 98, 84,140, 26,107, +236,250, 26,123, 47,177, 87, 80, 64,197, 74,103, 89,154,244,178,253,124,127, 0,126, 72, 40, 11,152,215,148,249, 93,215, 92, 11, +103,103,238, 61,211,206,220,243,156, 6, 30,143,135,250,104, 2, 64,247,198,140, 24,182,101,195,136, 97,211,230,199,183,110,221, +150,188, 11,205,191, 17,119,129, 55,147, 90,203,157,156,156,218, 25, 12, 6, 62, 0,176, 88,172,226,196,196,196,105, 40,153, 27, + 16, 0,142,154, 76,166,126,181,208,102, 0, 88,208,175, 95,191,121, 83,167, 78,133,179,179, 51,166, 79,159, 14,189, 94, 31,118, +250,244,233,249, 0,150,161,134,155,199,198,198,102,254,134, 13, 27, 44, 89, 92, 17,252,230,196, 34, 37,219, 0, 0, 16,243,128, + 99,147, 8,166, 79,159, 46,189,127,255,254,162,218, 24, 45, 27, 27,155,239,126,249,229, 23, 75,161, 80, 8, 66,200,155,185, 24, +243,243,243,145,159,159,143, 41, 83,166, 72,159, 60,121,242, 67,109,140,150, 82,169,108,183,126,253,122, 1,159,207, 71,126,126, + 62, 71,167,211, 81,121,121,121, 40, 44, 44, 36, 90,173, 86, 55,109,218, 52,222,163, 71,143, 58,167,164,164,196,128,230,175, 2, + 19,192, 0, 54,155, 61,176,113,227,198, 31,188,120,241,226,129,193, 96, 56, 12,224,240, 59,120,153,234,106,111,111,191, 88,165, + 82,173, 7,176,235,223,114, 64,149, 74,229,225,155, 55,111, 58,109,216,176,225,227, 85,171, 86,157, 2,240,223,122,200,113, 56, + 28,206,160, 78,157, 58, 57,141, 30, 61,154,171, 84, 42,161,209,104, 16, 27, 27, 43, 61,112,224,128,203,195,135, 15,147, 74,103, +196, 48,251,133,194,202,189,173, 24, 44,233,190, 54,109,219,181, 31, 60,104,128, 68,105, 37, 67,145,214,136, 23,241, 41,206,103, + 78, 29,235, 20,205, 17,220,212,233,114,134,102, 62,191,153, 95, 91,205,192,192,174,237,187,117,237, 42,145, 89,200,144, 83,160, +195,171,184,100,151,203,231,143,119, 96,177, 4, 87, 77,148,126,100, 90,212,249,194,247,121,110,166, 3,172, 2,190, 85,179,230, +109,253,238, 7,141, 93,244, 1, 33, 4, 12,130,181, 21,163, 89,211, 1,214,218,146,105,191,106,165, 7, 66, 8, 69, 97,101,249, +104, 86,143, 70, 88, 76, 8, 62, 7, 3, 84,143, 26,170, 41,203, 8, 2,120, 22,150,150, 1, 19,199,143,167,242,114,115,241,240, +225,195,194,138, 38,235, 71, 7,112,174, 50,208,224,104, 98,221,205,246, 95, 52,154, 85,105,213,161,217,227,104, 9,133,194, 74, +211,101, 50, 25, 2, 3, 3,177,116,233, 82, 22, 0,255, 10, 95,191, 61,201, 42,192, 59,177,113, 46,100, 34, 30,195,217,217, 89, + 34,149, 74,235,173, 9, 0, 32, 38,215,182,206,164,215,189, 95,191,250,248,194,158,213,190, 5,121,217,236,138,171,136,197, 98, +120,120,120, 96,222,188,121,230,105,214,159,255,169,166,173,173,173,103,135, 14, 29,252, 47, 93,185, 98,161, 82,169,120, 42,149, +138,119,238,210, 37,139, 54,109,218,248,219,218,218,122,190, 57, 84,132,212, 38,159,223,135,134,134,206, 63,122,244, 40,163, 67, +135, 14,144,203,229, 8, 12, 12,196,169, 83,167, 88,171, 86,173, 90, 2, 96, 94, 77,249,100, 48, 24,237, 59,116,232, 64,129, 16, +168,115, 12,184,179,212, 19, 15, 87,122, 33,175,152,224,117, 78, 46,138,138,138, 33, 20, 10,249, 40,169,238, 53,119,223,219,182, +105,211,134, 2,240,198, 92,229,229,149, 44,249,249, 5,208,106,117,224,241,120, 18, 0,124,115, 53, 9, 33,182,237,218,181, 3, + 0,232,116,186, 55,111,120,217,217,217, 84, 78, 78, 14,180, 90, 45,216,108, 54, 7, 53,183,107,124,163, 41, 21,177,244, 44, 14, +111,246,232, 41,223, 38,142,158,242,109, 34,139,195,155,173,149,228, 26,205, 73,147,138, 88,250,247,124,125, 90, 51, 24,140,109, +141, 26, 53,122,194, 96, 48,118, 2,176,173,167,102, 75, 0, 75, 4, 2,193, 5, 47, 47,175, 68,161, 80,120,169,212,168,183,169, +163, 38, 87, 40, 20, 94, 90,178,100,201,193, 7, 15, 30, 12,190,120,241,162,107,100,100,228,160,229,203,151,239, 19,139,197,215, +240,118,187,196, 90,223,155,174,174,174, 91,239,220,185,211,178,109,219,182, 91, 0,240,222,209,253,206, 4,208, 2,102,205,200, +241, 94,206,187,189,159,159,159, 19,159,207, 71,183,110,221, 0,160,115,125, 52, 57, 28,206,160,121,243,230, 53,250,230,155,111, +184, 41, 41, 41,184,116,233, 18,238,222,189, 11,131,193,128, 73,147, 38,241, 70,143, 30,221, 80, 34,145, 12,170, 85, 62, 89,210, +125, 51, 62,253,172,231, 23,211,199, 73, 34, 18,116,216,126, 33, 1, 71,110,165, 32,173,144,139,190,131, 70,203,122,132, 12,233, +193,229,201,246,213, 86,243,203, 57,115,122,142,255,100,184,228,113,138, 9,199,110,171,113,251,105, 14, 12,108, 11,244, 30,244, + 31,121,243,118, 61,251,176,192,222,241,190,207,209, 47, 64,235, 25, 51,102, 88,207, 94,185,251,134,125,203, 1,107,211,179,208, +161,188,241,113, 7, 44, 44, 69,162, 1, 79, 59,117, 26, 39, 40,153, 47,182, 90,205,183,244,252, 67,214,165,101,161, 99,249,246, + 89, 29, 45,225, 86, 90,173,200, 60,183,237, 27, 6,161, 48,125,132,253, 91,229, 64,165,249,252, 29, 24, 60,227,179,207,216, 50, +185, 28,161,161,161,208, 20, 20,188,213,102,182,171, 19,122, 94, 16,178,146, 26,122, 57, 62, 9,116,161,174,253, 3,223, 87,198, + 87, 25,209, 58,113,226, 4, 9, 14, 14,166, 0,224,208, 19,100, 13,242,198, 15, 67,166, 46,153, 71, 49, 40,210,192,183,237, 99, +135, 70, 62, 5, 86, 86, 86, 40, 44, 44,132, 70,163, 1,135,195, 65,113,113, 49, 18, 18, 18,112,251,246,109,200,229,242, 90,229, + 36, 55, 55, 23, 98,177, 24, 98,177,248,157,104,206,253,184, 27,239, 85, 98, 58,239,236,237,223, 59,253, 52,249,191,173, 27,181, +232, 28,217,117,200,244, 40,169,181,125,113,100,100, 36,110,222,188,137,172,172, 44, 4, 4, 4,252, 83, 78,230,221,210, 54, 89, +119, 1,200, 27, 55,110,236,120,246,194, 85,121,126,177, 73, 26,151,170,103,155, 76, 38, 8,133,118,134,253,135,142,229, 12, 30, +212,151, 82,171,213,105, 0,238,150,154,219,154,230, 84,228, 3,240,252,240,195, 15,191,156, 60,121, 50, 94,190,124,137,113,227, +198, 21,221,189,123, 55,179,109,219,182, 86,191,252,242,139, 96,230,204,153,184,114,229,202,130, 19, 39, 78,252, 6, 32, 22, 64, +165,115,181, 17, 66, 56, 28, 14, 7,134, 82,219,160, 51,154,222,248,251,220,220, 92,144,162, 44,112, 56, 28, 38, 0,107,152,217, +142,206,100, 50,113,216,108,246, 27,147,149,144,154,139,132,180, 66,228,230,107, 81, 84,100,128,182,136,128, 41,180, 98, 1,113, + 74, 0,113,230, 70, 71,248,124, 62, 12, 6, 3,242,242, 74,178, 81, 22, 41,211,106,181,200,201,201, 1,147,201, 20, 3,144, 2, +120,109,142, 96,105, 35,247, 35,165,213,128,184,183,187,159,226,197,201,185,111,165, 73, 69, 44,253,161,153,222, 76, 43,199,230, +215, 91, 12,222,225,245, 38,237,253,182,207,226, 89, 91, 91, 95, 62,120,240,160,183,155,155, 27, 98, 99, 99,189, 62,250,232,163, +128,148,148,148, 22,168,253,156,140, 66, 6,131,241,195,232,209,163, 39, 15, 27, 54,140,114,119,119, 7,139,197,130,193, 96,112, +124,249,242,101,224,129, 3, 7,230,108,221,186,245, 23,163,209, 56, 11,230,183,251, 99,112,185,220,253,155, 54,109,234, 24, 16, + 16,128,157, 59,119,226,238,221,187,166,150, 45, 91, 50, 70,141, 26, 5, 23, 23,151,128, 81,163, 70, 29,209,104, 52,189,235, 24, +217,114,105,211,166,141, 19,147,201, 68,219,182,109, 57, 55,111,222,244, 3,112,179,158,199, 84,236,232,232,120,165,115,231,206, + 45, 46, 92,184, 16,174, 86,171, 59,215, 98,127, 1, 32,196,222,222,126,185, 76, 38,147,215,162,140, 45, 76, 78, 78,254, 28,192, + 33, 51, 55,105,237,239,239,143,248,248,120,120,122,122,130,195,225,180,209,233,116, 19, 0,244, 4,240, 53,128, 39,181,200,175, +123,215,174, 93,157, 58,119,238, 76, 29, 58,116,232, 77,251, 80, 6,131, 1,131,193, 0, 14,135,131,214,173, 91, 51,194,194,194, + 28,238,221,187,231, 14, 51,170, 17,173, 26,117,238,219,182,125,167,246, 29, 3,154, 49, 86, 29,122, 1,163,201, 8, 38,101, 0, +139, 50,193,164,231,129,199, 97,194,221,247, 3,230,211, 71, 17, 1, 90,141,174,111,230,243, 11,199,205,209,236, 25,212,189,131, +183,167, 59,227,167, 35,175,144,157,252,196,152, 28,125, 53,131,193,100,192,219,191,139,194,221,167, 5,179, 69, 64,103,182, 42, +246, 81, 96,113,113,199,110, 89, 47,175, 94,120, 31, 55,228, 66,128,233,232,160, 24, 16,220,189, 51, 39, 69,165, 42, 56,112,232, +120, 84,161, 30,183, 1,224, 10, 64,245, 6,154, 53,109,213,170,211, 47,203,150, 89,217,217,217,177, 71, 14, 27,102,216, 28, 30, + 30,142, 42,170,126, 23, 2, 76,133,173,109,183,137, 19, 39, 50, 83, 84, 42,114,224,240,201,200, 50, 61,148,188,165, 52,109,230, +232, 21,140,130,167,181,170,166,236, 11,112,149,182,182,222, 19, 38, 76,128, 90,165,194,206, 93,187,242,139,129, 91,101, 81,172, + 99, 76,172,247,105,100, 59,102,246,127,250, 81, 78,118, 10, 76, 92,176,185, 77,160, 46,173, 17, 82,254,255,252,151,247, 34,127, + 99,147, 53,190, 82,163, 85,145,255, 62,193,124, 9, 7,174, 7, 14,236,101,164,231,233, 10, 94,190,124, 9,133, 66, 1, 59, 59, + 59,200,100, 50, 60,126,252, 24,151, 46, 93,194,179,103,207, 96, 50,153,208,188,121,243, 90,229, 38, 35, 35, 3, 17, 17, 17,144, +203,229,239, 76,179,145,147, 53,166, 58, 89,115, 82, 51,115, 57, 23,238, 62, 11,216, 60,119,144, 15,195,107,208,214,242,147,196, +106,181, 90,252, 67,120,211,187,208,201,201,169,221,246,237,219, 57, 26, 3, 36,238, 19,110,173, 40, 40, 54,138, 0, 64,196,103, + 22,132, 45,247,152,245,253,247,223, 23,124,242,201, 39, 94,137,137,137, 75,205,136,245, 47,238,218,181,235, 23,132, 16,246,140, + 25, 51, 0, 0,163, 71,143,206,189,125,251,182, 59,128,180, 75,151, 46,217,143, 29, 59,246,249,229,203,151,133,159,125,246, 25, +211, 96, 48, 60,102,177, 88,228,196,137, 19,223, 1,248,246, 15, 79, 68, 6,227,126,120,120,120, 3,123, 23, 15,184, 88, 49,208, + 97,222,179,146, 2, 78,104, 66, 82,220, 43, 68, 71,222,133,173,173,173,204,206,206,238, 73, 82, 82,146, 46, 57, 57,121, 78, 65, + 65,193,134, 26,242,248, 48, 44, 44,204,206,197,197, 5,249,249,249, 72, 74, 47,196,244,195, 66,228, 22,149, 4, 49,216, 40, 66, + 11, 39, 15,137,128,161,189,155,150,150,166,211,106,181,223,228,228,228,108,175, 78,147,205,102,103, 70, 70, 70,138,157,157,157, + 81, 92, 92, 76, 94,191,126, 77, 21, 20, 20, 32, 47, 47,143, 58,121,242,100,255,148,148,148,150,174,174,174,148,163,163,227,119, + 41, 41, 41, 69,201,201,201,227,204,169,154, 44, 53, 76, 70, 22,139,181,106,252,248,241,131,127,251,237,183,251,135,190,245, 14, + 41, 87, 93, 34,243,245,245, 61,219,172,153,143,253,174,149, 77,215, 2, 88,241, 23,184,182,198,124,245,213, 87,222,150,150,150, +152, 56,113, 34, 22, 46, 92,136,249,243,231,187, 77,156, 56,113, 60,128, 31,107,161, 35,176,181,181,189,247,211, 79, 63,121,181, +107,215, 14,167, 78,157,194,222,189,123, 17, 19, 19, 99,112,117,117,101, 5, 4, 4, 96,193,130, 5,232,209,163,199,184,105,211, +166,117, 82,169, 84,126,102,154,143, 79, 22, 44, 88, 16,210,190,125,123,124,252,241,199,154,223,127,255,125, 48,128,115,231,207, +159,239,114,229,202,149, 67,187,119,239, 22, 44, 89,178,164,219,204,153, 51, 39, 2, 88, 87,135,253,239,223,177, 99,201, 28,202, +237,219,183,199,242,229,203,123,212,211,104,113,173,172,172, 78,238,220,185,179,133,135,135, 7, 70,142, 28,233, 55,120,240,224, +147, 89, 89, 89,221, 1,152, 85, 32, 57, 56, 56,252,112,244,232,209,198, 85,213, 44, 84,134, 70,163,177, 28, 48, 96,192,178,184, +184,184, 90, 25,173, 61,123,246,224,243,207, 63, 71,243,230,205,155,181,110,221,122,227,132, 9, 19,240,225,135, 31,118,125,252, +248,177, 18, 37,189,150,107,132,207,231, 55, 27, 58,116, 40,247,206,157, 59, 0, 0, 95, 95, 95,180,104,209, 2,155,104,178,222, + 0, 0, 32, 0, 73, 68, 65, 84,241,241,241,184,127,255, 62, 52, 26, 13,148, 74, 37, 6, 14, 28,200,143,139,139,107,150,145,145, + 81,163,209, 98,240,132, 99, 66,130,123, 75,142,221, 78,129,209,100,192, 7,141,165, 8,240,178,193,211,164, 92,132, 61, 73,130, + 81,203,129,212,210, 10,109, 58, 5, 89,170,147, 99,198,100, 2, 53,183,215,226, 9,199, 12, 12,233, 35, 62,118, 75,133,108, 85, + 52,121,113,247,183, 75,250,226,130,113, 0,112,255,226,190,141,182, 86,130,238,238,254, 31, 48, 59,119,239, 39, 63,188, 87, 61, + 38,235,127, 51,183,223, 31,184,226,132, 77, 46,236,140,209,179,135,119, 32,108,185,227, 93,137, 94,191,190,236,187, 30, 64,208, +156,175,190,106,253,159,241,227,249, 38,147, 9,187,127,253, 53, 55, 34, 60,252,233,120,192, 52,161, 10,189,245,128,203,224,144, + 16,158, 68, 42,197,167,211,167, 67,162,215, 95,126,115, 72,128,174,159,126,241, 69,187, 41, 83,166, 8, 54,126, 55,249,126,143, +177,139,252, 77,132, 80,101,213,148,123,170, 15,197,181, 28, 27, 18, 2,137, 84,138, 25, 51,102,128,210,233,206,190, 49, 80, 44, + 92,254,164,127,135,128,225,125,219,131, 2,133,189, 39,174,227, 69,124,122,228,229, 20,188,250,187,186,170, 10, 84,217, 70,171, +218,170,195, 60, 29, 82,187,246, 25,148,226,238,238,158,231,230,230,150,151,153,153,137,168,168, 40,100,101,101, 97,221,186,117, +136,142,142,134,201,100,170,179,129, 49,153, 76,120,215,154, 0,160,180,146, 98,100,239, 86, 44, 77,113, 1, 63, 61, 61,253,173, +234,163,127,144,209,122,131,193, 96,224,187,186,186,130, 1, 80, 57,133,122,177,122, 79, 71, 74,189,167, 35,149, 83,168, 23,107, +181, 90,134, 88, 44,134, 70,163,225,155, 33,197,238,213,171,215, 23,191,253,246, 27,123,241,226,197,104,210,164, 9,116, 58, 29, +110,223,190,157, 4, 32,173,116, 29,213,213,171, 87, 85,101, 70,120,233,210,165, 56,124,248, 48,213,173, 91,183, 57,149, 93, 79, + 41, 41, 41, 63, 76,152, 48,225,117, 97,222,107,108, 26, 82,132, 67, 35,211,177, 45, 36, 6,195,172, 14,226,117,106, 2, 54,111, +222,140,243,231, 47, 80,231,206,157,231,252,254,251,239,162, 62,125,250,172,117,112,112, 56, 81, 93, 38, 85, 42,213,226, 41, 83, +166,100,231,229,229, 33, 47, 47, 15, 69, 69,197,120, 93, 0, 68,174,246, 70,228,106,111, 20,155, 4, 8, 93,191,129, 17, 25, 25, +169,136,137,137,177,239,219,183,239,106, 59, 59,187,173,213,105, 38, 39, 39,223,153, 58,117,106,113,110,110, 46,180, 90,173,206, +104, 52,106,139,138,138,244,251,246,237,251,204,202,202,170,205,169, 83,167,216,231,207, 95, 96,253,254,251, 21,206,165, 75,151, +100,129,129,129,251,149, 74,229, 14,115, 34,101, 76, 38,115,205,174, 93,187,198,132,134,134, 42, 3, 2, 2,124, 42, 84, 69,217, +117,239,222,189,193,175,191,254,234,176,124,249,242, 57, 40,233,128,242, 94, 81, 40, 20,211, 66, 66, 66, 16, 26, 26,138,227,199, +143,207, 92,187,118, 45,122,245,234, 5,123,123,251,169, 48,191,218, 11, 0, 86,252,248,227,143, 94, 94, 94, 94, 24, 61,122,180, +118,220,184,113,179,182,111,223,238,122,237,218, 53,206,142, 29, 59, 26, 76,156, 56,113,198,240,225,195,139, 27, 54,108,136,117, +235,214, 53,102, 48, 24,107,204,186,191,149,202,207,134, 13, 27,134,149, 43, 87,226,247,223,127, 31,132,146, 7,170, 22,192,233, + 27, 55,110,244, 93,178,100, 9, 6, 13, 26, 4, 71, 71,199, 25,117,137, 60,121,123,123,127,211,179,103, 79, 92,187,118, 13,126, +126,126,104,211,166,205, 76, 0,138, 58, 30, 78,134, 88, 44,222,191,125,251,246, 14, 13, 26, 52,192,162, 69,139,208,168, 81, 35, +108,221,186,181,131, 72, 36,218, 15, 51,155,111,200,100, 50,177, 80, 40,196,156, 57,115,200,160, 65,131, 94,215,180,204,156, 57, +147,240,120, 60,200,229,114,115, 59,190, 8,248,124,126,219, 38, 77,154,224,246,237,219, 56,127,254, 60,230,205,155,135,207, 62, +251, 12,233,233,233, 24, 58,116,168, 16,192,135,181,216,111, 27,107,107,107,228,230,150,204, 11,223,164, 73, 19, 60,120,240, 0, +233,233,233,112,116,116,132, 90,173,134,149,149, 21, 60, 60, 60, 96, 50,153,108,204,147, 36, 77, 20,150, 50,164,101,105,192,130, + 1,254,238, 10, 92,142,202, 68, 66,186, 22, 54, 86, 22, 80,167,165,195,193,138, 15, 39, 39,103, 16, 98,106, 98,150, 3,102, 50, +252,121,124, 1, 94,231,233,144,252,228,247, 76,157, 81, 51, 33, 59,246, 70, 98,118,236,141, 68,157,166,120,194,253,235,231, 51, + 27, 40, 5,112,114,114, 2, 69, 76,173,222,199,253,248,145, 51,156, 68, 2,214,232,243,219,190,161, 78,252, 50,151,210,100, 38, +180,236,169, 44,137, 44, 91, 3,174, 31, 13, 29,218,118,214,172, 89,252,212,212, 84,211,240, 33, 67, 94, 47,254,246,219, 11,103, +106,120, 49,200, 7,220,186,119,239, 14, 6,128, 51,231,206, 21,168,129, 36, 0, 80, 2, 78,253, 6, 12,232,248,213,151, 95, 10, + 50, 50, 51, 77,183, 95,230, 31,139, 78, 35, 3, 45,141,112, 53,167,125,150, 17,104, 90,166,123,246,236, 89, 82, 4,220, 7,128, +206, 78,152, 26,212,206, 55, 96, 84, 72, 71,164,164,101, 97,198,226,109,216,120,224,202, 89,153,158,116,249, 7, 61,138,199,215, +201,104,149, 86,253,252, 33,173,176,240,143,181, 7,245, 53, 48,127,134,102,101,252, 19,141, 86, 25,122,125, 73, 45,137, 86,111, +130, 86,111, 42,123,171, 69, 81, 81,145,217, 18,103,207,158,221, 57,125,250,116,172, 94,189, 26,207,159, 63, 7,135,195, 65,147, + 38, 77,236, 0,136,203,202,124,127,127,127, 27, 6,131,129,167, 79,159, 98,213,170, 85,248,228,147, 79,200,205,155, 55,183,162, +242,241, 82, 30,188,126,253,122,253,132,113,159,100,103,165, 38, 64, 95,148,133,180,228, 87,208, 20,100, 99,209,210, 31, 80,168, +103, 65,157,163,131, 58, 71, 7, 6,207, 18, 27,127,217,206,244,246,246,238,201,100, 50,131,171,201,231,237,212,212,212, 95, 38, + 77,154,148,173, 86,171,223,236,159, 86, 79,160,213,191,125,189, 10,133, 66,172, 89,179, 70,230,238,238, 30,194, 98,177, 2,171, +209, 76, 73, 76, 76,140,158, 52,105,146, 54, 53, 53, 21, 57, 57, 57, 56,118,236, 88,223, 6, 13, 26,200,151,173, 88, 77, 21,232, + 88, 80,103,235,160,206,214,129, 43,182,193,254, 67,191, 49, 61, 60, 60,134,179, 88,172, 54, 53,153,172,221,187,119,143, 26, 50, +100,136,100,197,138, 21,175,143, 30, 61, 26, 10,160,252, 9,121,186,102,205,154, 3,251,247,239,207,251,226,139, 47, 44,151, 47, + 95, 62,243, 61,155,173,192, 33, 67,134,120,154, 76, 38, 28, 60,120, 48, 18,192,143,191,253,246,219, 61,141, 70,131,161, 67,135, +186,150, 86, 35,153, 67,203,225,195,135, 79,238,208,161, 3, 62,253,244, 83,221,133, 11, 23,252, 1,172, 70, 73, 85, 46, 1, 16, + 15, 96,237,149, 43, 87,154, 79,155, 54, 77,211,170, 85, 43,124,252,241,199,159, 0,232, 80,131,110,219, 97,195,134,121,153, 76, + 38,236,219,183, 47, 2,192,169, 10,223, 95, 58,116,232,208,109,173, 86,139, 17, 35, 70, 52, 4, 80,155,130,156,195,227,241, 14, +126,255,253,247, 22,201,201,201, 24, 53,106,148,230,233,211,167,248,246,219,111, 5, 50,153,236, 84,185,123,192,108,120, 60,222, +230,159,127,254, 57,164,105,211,166,152, 52,105,146,118,195,134, 13,211, 39, 79,158,172,245,247,247, 71,104,104,104, 8,151,203, +173,213, 20, 29, 42,149, 42,251,201,147, 39, 86, 53, 45, 73, 73, 73,230,118,207, 23,138,197,226, 91,190,190,190,185, 77,154, 52, +249,192, 96, 48,224,241,227,199,175,118,238,220,105,106,210,164, 9,214,175, 95,143,229,203,151, 35, 56, 56, 24, 76, 38,211,108, +163,197,100, 50,161,211,233, 32, 20, 10,193, 98,177,240,234,213,171,178,161,101,192,225,112, 0, 0, 34,145, 8, 2,129, 0, 12, + 6,195,172,222,104, 20, 5,146, 91,168, 7,155,205, 0,139, 97, 66,116,124, 14,116,122, 19,248, 28, 38,216, 44, 10, 32, 38, 88, +136,216,224,115,153, 96, 80,148,201, 76, 77,228, 20,232,192,229, 48,192,230,112, 41,134,193, 40,120,243,112,100, 25, 5, 2, 1, +151, 82, 72,121,224,115,254, 66,211, 2, 83, 37, 13,203,199, 0,108,145,179,243,224,149,171, 86,113,115,243,243, 49,104,208,160, +215,113,247,238,237, 42, 2,238,117,170,161,147, 18,131,197,114,239,220,169, 19,194,194,195,145,151,149,245, 2, 40,105, 28,207, +181,183, 31,178,102,205, 26,110, 81,113, 49, 6, 13, 28,152,253,252,250,245,221,137,249, 56,177, 47,190,196,136,213,120,222, 57, + 28,219, 50,221,156,172,172, 44,160,100, 8, 9,165,181,120,217,148,225, 61,144, 87, 88,140,217, 63,236, 50,133, 71,167, 76,189, +150,132, 62,191,169,144,243, 15,123, 12,143,175,176, 0, 48, 99,192,210,178,232, 82, 77,102, 69,163,209,188,115, 3, 84, 95,205, +202, 76, 98,125, 53,255,138,176, 88,172,226,103,207,158,113,165, 86,246, 38, 43, 9, 59,171,193, 39,215,101, 0, 96, 41,102,229, +232,140,122,147, 74,165, 2,143,199, 43, 54,179,186, 97,220,230,205,155, 23, 1,240, 97,177, 88, 39,182,111,223, 78,237,218,181, + 75, 62,108,216,176,151, 79,158, 60, 73,246,245,245,117,217,190,125,187, 20, 0,214,174, 93, 75,246,239,223,223, 3, 37, 67,102, + 84, 57,142, 75,106,106,234,183,153,153,153, 55,167, 76,153,178,142,203,229,202, 69, 34,145,213,181,107,215,168, 98, 29, 65,203, +175,226,223,244, 68,148, 10, 24,184, 58, 87,138,241,227,199, 51,159, 60,121,178, 52, 57, 57,249, 68, 53,154,115,178,179,179,175, + 61,127,254,124,181,204,177,133,181,200,229, 43, 89,192,220,167, 0, 0, 23, 5, 27,140,210,114, 49, 59, 59, 27,233,233,233,152, + 60,121,178,252,229,203,151,115,146,147,147, 47, 87, 19,213,186,146,145,145,145,244,232,209,163,206,108, 54,155, 43, 18,137, 90, +222,186,117,139, 42,214,154,208,108, 78, 60, 94,231,151,228,211, 82,204,194,253,239,149,152, 58,117, 42,235,197,139, 23, 63,164, +164,164,180,175,180, 48, 99, 48,150,151, 55, 89,179,103,207,126, 8,160, 33,128,183,170, 70,141, 70, 35, 53, 98,196,136, 40, 0, + 77,190,248,226, 11, 75, 66,200,204, 57,115,230,188, 6,176,233,127,125, 45, 73,165,210,101, 19, 38, 76,192,254,253,251,145,149, +149,181, 6, 0,114,115,115,127,220,179,103,207,190,113,227,198,225,215, 95,127, 93,150,158,158,126, 6, 53,119,213,238, 53,116, +232, 80,156, 62,125, 26, 23, 47, 94,252, 6,192,227, 42,214,123,126,237,218,181, 57, 71,143, 30,253,105,216,176, 97,216,182,109, + 91, 79, 0,213, 53,144,237,222,163, 71, 15,156, 58,117, 10,153,153,153,161,149,173,144,157,157,189,225,216,177, 99,173,123,244, +232,129,165, 75,151,118, 7,112,201,140, 93,247,146,201,100,219,127,250,233,167,150, 77,155, 54,197,240,225,195,139,117, 58, 93, +207, 47,190,248,226,248,222,189,123, 37, 59,119,238,252, 96,252,248,241,119, 74,199,124,187,109, 86, 40,139,193, 88,178,106,213, +170,177,157, 59,119,198,204,153, 51, 13,103,207,158,237, 7,224,220,153, 51,103, 94,206,158, 61,251,228,170, 85,171,152, 43, 87, +174, 28, 59, 99,198,140,116,147,201,244,190,204,245,247,107,215,174,109, 29, 20, 20,132, 87,175, 94,225,246,237,219,208,233,116, +191,222,186,117,235,170,155,155,219,247, 90,173,246,184, 72, 36, 26, 45,145, 72,124, 91,180,104,209,229,254,253,251, 66,152,215, + 78, 47, 53, 54, 54,214, 66, 38,147,193, 96, 48, 32, 50, 50, 18,206,206,206,208,233,116,136,137,137, 65,211,166, 77,193,225,112, +144,154,154,138,114,209,242, 26, 76, 17, 35,242,101,156,170,161,165, 68, 4, 24,249,120,240, 52, 9,214, 10, 57,140, 20, 3,106, +117, 10, 90,120, 58,130,162, 40,100,103,170, 65, 81, 84,148, 57,154, 70, 98, 10, 75, 80,165, 57, 88, 73,120,104,218, 58,200,234, +214,153,244, 93,210,134,237,198,179,152, 20,147,203, 19,111, 26,251,241,199, 10,147,137, 32, 59, 51, 21, 44, 6,227,238,251, 56, + 65, 7, 19,144,216,169, 17,255, 65,208,216, 69, 45, 40, 2, 82,164,195,206,109,169,200, 18, 2, 45,214,126,253,181,133,149, 66, +129,225,195,135,155, 50,147,147, 47, 20,154, 57,176,114, 67, 55, 55,165, 88, 34,193,141, 27, 55,192, 44,105, 99,139,173,128,215, +242,217,179,173,108,108,109,241,201,216,177,166,212,132,132, 75, 69,128,170, 54,121,109,216,168, 17,187, 76,151, 81,170,155,194, +196,244, 47,250,117,224,137, 4, 60, 44,217,248, 27, 18, 51, 10,246,221, 74,193,198,127,104,188, 99,115,181, 17,173,170, 26,159, +149, 52,170, 22, 86,107, 86,248,124,254,155,104, 74, 45,222,244,222,185,102, 77,252, 25,154,239,145,185, 0,142, 2,152,155,152, +152, 24, 61,118,236, 88,157, 65,167,201,187,185,168,225,151,225, 75, 27, 76,186,245,173,221,164, 35,211,101, 95, 22,230,188,206, + 91,187,118,173, 62, 49, 49, 49,186,252, 54, 53,104, 39, 0, 56,181, 99,199,142, 13, 7, 15, 30, 68,147, 38, 77,240,248,241, 99, +155,130,130, 2,191,168,168, 40, 75, 47, 47, 47,236,218,181, 11,251,247,239, 95, 13,224,124,117, 38,171, 12,131,193,112, 65,173, + 86,123,196,199,199, 55,182,176,176,208, 91, 88, 88,160, 98, 79,196,220, 34, 19, 50,179,115, 96,105,105, 5,169, 84,234,106,134, + 57, 63,165, 86,171,221, 77,114,207,142,238, 25,107,114,194,150, 56, 33,108,137, 19, 78,205,177,135,157, 5, 23, 89, 89, 89, 72, + 79, 79, 71,122,122, 58, 40,138,130, 94,175,247, 54, 67, 51, 38, 37, 37,101, 75, 66, 66,194, 81,165, 82, 9,137, 68, 2, 2, 64, +157,173,199,195,149, 94,120,184,210, 11,234,108, 61,114,243,242,208,160, 65, 3, 72, 36,146,170,170, 40, 24, 14, 14, 14,189,135, + 12, 25, 34, 1,128, 82, 3,213,149, 16, 50,169,146,101,162,193, 96,104, 87,182,238,231,159,127,110, 9,160,199,255,248,122, 98, + 2,152, 50,110,220,184, 15,248,124, 62,214,175, 95, 31, 3, 96,119, 89, 89,191, 97,195,134,167, 0, 48,125,250,116, 95, 0, 51, + 81,197, 72,208,111, 66, 67, 28,142,191,183,183, 55,110,221,186, 5, 0,191,213,240,219,135,110,222,188, 9, 55, 55, 55,240,249, +252,150, 53,172,235,234,228,228,132,167, 79,159, 2,192,131, 42,214,121,240,244,233,211,146,234, 30,138,114, 53, 99,223, 67,130, +130,130, 34, 47, 95,190,220,178,109,219,182, 24, 59,118,172,246,206,157, 59,189, 1, 92,125,240,224, 65,224,136, 17, 35, 10,220, +221,221,113,229,202, 21,175, 17, 35, 70,220,100, 48, 24,139,204,208,252,228,187,239,190,155,219,191,127,127,124,247,221,119,228, +192,129, 3,195, 1,156, 43,253,238,236,190,125,251, 70, 45, 94,188,152, 12, 28, 56, 16, 11, 23, 46,156, 11, 96, 82,117, 98, 5, + 5, 5, 57, 70,163, 17, 5, 5, 5,102,133,228,205, 93, 95,161, 80,244, 10, 10, 10,194,188,121,243,224,224,224,128,227,199,143, + 19, 0, 39, 0, 92,211,106,181, 29, 1,172, 42, 40, 40, 56,114,235,214, 45,116,239,222,157,131,183,167, 24,169,238,247, 35,247, +236,217,163,145,201,100,112,113,113, 65,195,134, 13,161, 86,171, 17, 23, 23,135,166, 77,155,194,223,223, 31, 6,131, 1, 91,182, +108, 41,206,203,203, 51,107, 76, 62,131,182, 96,231,249,147,135,115,172, 36, 60, 56,218,200,208,192,193, 18,249,217, 25, 72, 87, +171,224,239,237,140, 78,254, 13,144,145,163,197,217, 19,135,179,242,242, 10,119,154, 21,194,215, 20,110,191,112,230,120,142, 92, +194,129,135,167, 47, 70,140,157,222,162,133, 95,192,249, 86,173,218,157, 93,177,108, 73,179,174,109,188,169,164,140, 98,156, 62, +241, 91, 86, 78,110,238,246,247, 81,208, 47, 4,152,197, 50,247,171,161, 71,195,182,248,244, 28,183, 37, 58, 9,107, 0, 64,207, +100,122,245,238,213, 11, 73, 73, 73, 56,124,240, 96, 74, 33, 16, 97,174,158, 64, 32, 96, 0, 64, 78, 78, 14,120,165,237,238, 12, +128,103,159, 62,125,144,158,145,129, 61,187,119,167,159, 6,194,107,147,207,190, 0, 87, 40, 40, 9, 8,230,228,228,128, 2,114, + 1,128, 98,161,119,171, 38,110, 72,127,157,139,203,119,163,243, 27, 20, 97,114,117, 58,127,227,134,240,117,107,163, 5, 32, 99, +230,204,153,224,241,120,176,179,179,123, 99,142,202,204, 10,151,203,133,157,157, 29, 12, 6, 3,246,237,219, 7, 0, 25,213,190, +225, 1,154,126,147,150,154, 52,122, 82,200,102,179,223,137,102,233,155,163,102,208,236,109,166, 51, 55, 43,239, 20, 83, 23,205, +191, 1,173, 74,199,196,106, 5, 32, 43, 46, 46, 46,105,240,160,126, 57,241, 47, 31,169, 11,178, 85, 41,185,153,137, 41,137, 49, + 81,234,175,230,204,204, 73, 74, 74, 74, 68,201, 88, 90,173, 84, 42, 85,217, 54,230, 48,115,240,224,193, 63,143, 27, 55,142, 60, +124,248, 16, 0, 16, 22, 22,134,143, 63,254,152,140, 26, 53,106, 13,128, 47,235,144,239,130,162,162,162,183,162, 33, 58,163,233, + 77,149, 95,110,110, 46, 84, 42, 21,180, 90,173,217,142,248,249,217,149,207, 94,199,221,215,251,186,136,224,235, 34,130,151,147, + 16,148, 33,255,141,201, 74, 79, 79, 47,123,115, 46,174, 69, 62,115, 53, 26,205, 91,249, 44, 95, 53,153,155,155, 11,181, 90, 13, +163,209, 88,213,131,204,148,156,156,124,118,255,254,253,121, 0,176, 98,197,138,215, 20, 69, 93,164, 40,234,231, 74,150,141, 44, + 22,235, 70,217,186, 43, 87,174,124,141, 63, 86,137,253,153,244,111,218,180,105,214,220,185,115,215,207,152, 49, 3, 27, 55,110, + 68, 74, 74,202,151,248,255,177,120, 76, 25, 25, 25,179, 67, 67, 67, 49,102,204, 24,204,159, 63,127,165,159,159, 95, 46,128, 17, + 85, 9, 90, 91, 91, 59,178, 88, 44,132,135,135,231, 2,120, 85,195,239,171,195,195,195, 83, 41,138,130,157,157, 93,163,234, 86, +180,180,180,108, 44,145, 72,144,156,156, 12,148,190, 49, 87, 66,156, 74,165, 34, 92, 46, 23,246,246,246,110, 53,237,188, 92, 46, +159,189,101,203, 22,214,163, 71,143,208,181,107,215,164, 43, 87,174,116, 7, 80,214, 37, 61, 60, 44, 44,172, 67, 96, 96,224,179, +243,231,207,227,135, 31,126,160,154, 55,111, 62,169, 38, 77, 23, 23,151,137,159,124,242, 9,214,173, 91,135, 77,155, 54, 77, 2, +112,176,194, 42,123, 67, 67, 67,167,111,218,180, 9, 99,199,142,133,171,171,235,136,234,244,226,227,227,231,116,238,220, 57,236, +249,243,231,102,205,120, 96,230,250,129, 1, 1, 1,141,139,138,138,176,125,251,246, 87,141, 27, 55,190,119,240,224,193,153,248, +227, 3,251,200,225,195,135, 49,114,228, 72, 52,111,222,124, 59,128, 97,230,220,150, 79,158, 60, 73,188,116,233,146,137,195,225, +192,197,197, 5,193,193,193, 24, 62,124, 56,154, 53,107, 6,157, 78,135,195,135, 15,155,162,162,162,146,180, 90,173, 89, 99, 41, +101, 62,255,253,120,108,236,179, 27,225,119,174,234, 89, 76, 6,156,237, 44, 49,160, 91, 11,252,231,195,118,240,247,114, 64,124, + 90, 17, 46, 93, 58,175,143,141,125,117,203,156, 30,135,101,154,209,143, 35,110, 62, 10,191,110, 96,179, 40,120,121,186, 99,222, + 87,179,229,139, 23,204,177,112,111,228,140,136,152, 28,156, 63,119, 90,175, 74, 74,188,252,190,122, 28, 94, 1, 56, 98, 30, 37, + 98, 50, 24, 48, 50,120, 5,204,210,142, 52, 77,124,124, 60,148,182,182, 56,121,242, 36, 24,181,232, 17,122, 5,224,136,197, 37, +181,224,249,249,249, 40,211,107,236,233,233,233,236,226,130, 83, 39, 79,130,105, 50, 61,233, 84,203, 1, 70,159,150, 84, 67,191, +209,165,128,226,201, 78,144, 52,118,178,241,148,203, 68,184, 19,241, 2, 26, 61,185,187, 59, 11,239,117, 60,178, 63,145,241,168, + 99,213,225,138,141, 27, 55,182,218,178,101, 75,247,153, 51,103,138, 71,143, 30, 13, 62,159,143,194,194, 66, 56, 58, 58,194,104, + 52,226,204,153, 51,184,127,255,126,190,201,100, 58,143, 63, 14, 27,208, 13,229,122,105,156,125, 5, 65,137,223, 42,108,117,244, +163,143,222,137, 38, 0,136, 95,152,164,153, 13,180,187,214, 30,188, 62,112,207,217,112,234,211, 97,157, 24,254,158, 78, 0, 0, +165, 82, 9,169, 84, 90,107,205,119,192,159,174, 89,190, 90, 87,173, 86, 63, 85,171,213,105,227,198,141,243, 42,107,248,206,227, +241,138, 75, 35, 89, 89,149,109, 99, 70, 62,117, 0, 38,111,217,178,229, 88, 78, 78,206,217, 47,190,248, 2,139, 23, 47,198,241, +227,199, 59, 0,184, 81,199,125, 55,102,101,101,101,223,189,123, 87,233,230,237,135,134, 54,108,116,252,230, 57, 8, 33,176, 18, + 18,228,101,191,198,131, 7,225,200,203,203,187, 83,155,124,234,116,186,236,180,180, 52,133,141,141, 13, 94,191,126,141,140,140, +140, 55, 38, 43, 43, 43, 11,175, 95,191, 38, 20,245,135, 49, 91,170,211, 44, 72, 75, 75, 43,140,142,142,230, 42,157,220,208,200, +134,131,128,175,158, 2,132,192,217,146,129,188,220,108,220,186,117, 11, 57, 57, 57,191, 87,165,105, 50,153,102,141, 24, 49,130, + 9, 96,212, 23, 95,124, 97, 9,160,249,236,217,179,207,163, 66,207, 66, 22,139,245,227,174, 93,187,154,148, 85, 49,206,153, 51, +103, 53,128, 45,255,171,107,201,202,202,106,214,201,147, 39, 37, 58,157, 14,107,215,174,197,234,213,171,183,226,143, 3, 85,158, + 92,191,126,125, 40,131,193,152, 50,117,234, 84, 76,152, 48, 65,248,193, 7, 31,204, 76, 73, 73,217, 93,153,102,114,114,242, 60, +127,127,255,249,105,105,105, 75,204, 50,203,207,159,143,247,247,247,159,151,150,150,182,188,186,115, 36, 18,137, 68, 70,163, 17, +177,177,177, 89, 64,149,237, 59,138, 99, 99, 99,147,141, 70,163,163, 80, 40,180,172,233,250,204,202,202, 90,242,193, 7, 31,124, +155,154,154,122, 14,192,162, 74, 12,249,195,148,148, 20,223, 25, 51,102, 76, 91,182,108,217, 64,181, 90,189,175, 38,205,248,248, +248, 37,129,129,129,223, 60,123,246,108, 7,170,174, 2, 94,191,112,225, 66,221,174, 93,187, 38,197,198,198, 46,173, 65,243, 68, + 70, 70,198,137, 90,156,223,170,214,127,163,201,100, 50,103, 47, 91,182,140,177,113,227, 70, 16, 66, 86, 26,141,198,170,242, 25, +113,228,200,145,157,237,218,181, 27,125,240,224, 65,190,175,175,239, 4,141, 70,179,183,166,235,179,176,176,240,240,193,131, 7, + 7, 70, 68, 68, 56,142, 30, 61,154,239,225,225, 1,157, 78,135,148,148, 20,108,220,184,177, 56, 42, 42, 42, 41, 59, 59,251,112, +109,202, 16,131, 54,119,216,205, 75, 71,247,198, 61,143,106,211,185,103,136, 92,171,115, 4, 47,147,137,236, 76, 53,206,156, 56, +156, 21, 27,251,234, 86, 97, 97,246,176,218,104,234, 52, 57, 67,111, 93, 62,182, 47, 41, 54,186,117,199,192,222,242, 98,173, 11, +120, 28, 6, 50, 83,147,113,230,228,209,215,177,177, 49,215,138,245,154,143,223, 87, 57,207,116,197, 34,166,250,254,184,137,125, + 91, 64, 32,119,124,192, 6,214,182, 3, 4, 10,165,146, 83,122,239, 64, 92,210,230,209, 44,205, 84,128,235, 86, 90, 75, 85, 88, + 88, 8, 54,160, 29, 3,176,173,173,173, 5, 0,240,236,217, 51, 8, 75,106, 53,106,149,207,124, 64, 36, 44,167,203, 0, 10, 51, + 89,112,104, 44, 21, 81, 0,144,164,206,132, 86, 95,237,115,227,239,206,230,114,134,107,115, 93, 4, 56, 0,186,137,197,226,197, +243,231,207, 95,121,231,206,157,149,193,193,193, 43,121, 60,222,226,210,131,205,169,230, 68,252,207, 52, 91,218,195, 50,176, 17, +117, 53,168, 49,101,154,216, 65,110,252, 56, 64,164,237,210,165, 75,104, 61,243, 89,159,155,229,207,212, 60,170,215,235, 9, 74, +170,237,142,162,234, 42,193,185,229,190, 87, 39, 36, 36,144,210,191,107,147, 79,197,144, 33, 67, 76,121,121,121,100,240,224,193, + 4, 53, 79,225, 83,173, 38,143,199, 11,236,216,177,163, 62, 53,253, 53,121, 26,147, 76,110,135, 61, 38,103, 47,221, 36,251, 14, +159, 36,235, 66, 55,145,102,205,154,105, 1,184,212, 70,147,197, 98,117, 9, 12, 12,204, 76, 77, 77, 37,209,209,209,228,234,213, +171,228,208,161, 67,100,211,166, 77,228,231,159,127, 38, 78, 78, 78,169, 0,148,181,209, 20, 8, 4, 33,189,122,245,210,103,231, + 22,146,216,228, 76, 18, 25, 29, 75,110,220,141, 36,103, 46,221, 32,187,247, 30, 36, 62, 62, 62,197,102,104, 50,153, 76,230,186, +125,251,246,229, 18, 66, 72, 72, 72, 72, 18,222, 30, 72,181,225,172, 89,179,210, 8, 33,100,249,242,229,153,168,188, 33,252,159, +125, 45,245,116,112,112,120,202,225,112, 78, 2, 24, 85,195,118, 67, 89, 44,214,113, 91, 91,219,123, 0, 6,188,135,251, 40,216, +198,198,230, 54,128,154,102, 56, 40, 91,175,255, 63,228,126,255, 51, 52,187,176, 88,172,171, 64,245,147, 8,151, 43,175,191,103, + 50,153,167, 0,116,173,101, 62,221, 21, 10,197, 96,185, 92,254,169, 92, 46,255,212,198,198,102, 48,151,203,117,175,207,190, 91, +185,119,235,235,236,215,239,136, 83,243, 62,241,206, 45,130,227, 93,253, 67,142, 88,185,119,235, 91, 95, 77, 23,255,144,163,206, + 45,130, 19,156, 91,244,141,107,216, 50,228,136,194,179, 91,175,247,121,142, 70, 57,192,190,123, 67, 24,200,213,111, 8,185,250, + 13,233,214, 16,166, 54, 22,240,105, 5, 72,122,116,235,182,138, 24,141,171, 6,246,239,191,202, 13,176, 34, 0,179,226, 82,153, +166, 31, 32,125,179,109, 72,200,170, 70,128,162, 59, 32,236,212,161,195, 74, 98, 52,174, 26, 49,116,232, 42,103,192,182, 50,189, +170, 52, 9,192,116, 0,236,203,235, 42,128,198, 31,186,194,119,110, 95, 87, 66,174,126, 67, 22,126,228, 65,252,149, 24, 85,131, +102, 85,145,162,191,117, 68,171,182,136, 74, 11,215,165,165,159,162,119,112, 17,190,115,205,214,118,240,232,214,152,138,238,237, +201,122,141,146, 46,201,162,127, 96, 33,185, 67,171,213,146,226,226, 98, 82, 88, 88, 72,242,243,243, 43, 26,168, 55,134, 76,165, + 82,145,164,164, 36,146,144,144, 64,226,226,226, 8,254,191,237,141,217,249,148, 74,165, 91, 62,250,232, 35, 35,155,205, 94,247, + 46,246,221,210,210,114,105, 64, 64,128,238,167,159,126, 34, 71,142, 28, 33,191,252,242, 11,153, 58,117, 42,105,210,164,137,198, +194,194, 98, 88, 93, 52,109,109,109,231,121,122,122,102,110,221,186,149,236,222,189,155,172, 89,179,134,124,253,245,215, 70, 71, + 71, 71,181, 68, 34,233, 81, 23, 77, 27, 27,155,205,237,219,183,215,109,222,188,153,156, 63,127,158,236,217,179,135,204,154, 53, +139,120,121,121,105, 68, 34,209, 32, 51, 53,153, 44, 22,107,213,196,137, 19,213,246,246,246, 39, 43,124, 39,244,241,241,185, 55, + 98,196, 8, 21,128, 57,255,160,235,147,214,164, 53,105,205, 63,193,104, 13,183,135, 3, 1,152, 66, 14,103,104,167, 14, 29, 86, +114,128,161,181, 53, 69,124, 38,243,195,118, 1, 1, 43, 57,192,176,178,117,249, 76,230,135,157, 58,116, 88,201,102, 50, 71, 86, +165, 87,157, 38, 1,152, 28, 22,107, 78,187, 54,109, 86,177,128,175,202,210,186, 52,164,158,204,234,233, 68, 58,184, 80, 47, 70, +218, 64,248, 15, 54, 90,239, 28,214,159,112, 17,254, 93, 52,255, 42, 55,181, 91,169, 97, 58, 90,139,136,214, 81,148,204,162,238, + 86,199,124, 10,222,241,190, 55, 85, 40, 20,167,221,220,220,210, 27, 52,104,160,146,203,229,123, 1, 56,214, 83,211,215,214,214, +246, 87,165, 82,249,220,206,206, 46, 66,161, 80,252,136,146, 81,231,235,172,201,102,179, 3,148, 74,229,239,174,174,174,217, 46, + 46, 46,169, 10,133, 98, 95, 37,145, 44,115, 52,237, 80,121,161,194, 41,253,142,126,232,208,154,180, 38,173,249,150,129, 9,106, +132,101,221, 27,194,208,189, 33,140, 65,174,248,177,188, 65, 9, 6, 4,117, 53, 69, 31, 3,188,138,235,215,164, 87,147, 38, 1, +152,109, 1,113,197,109,122, 59,194,199, 76,205,191,123, 68,171,172,156,175,221,240, 14, 85, 96,248, 19, 50,249,119,209,252,171, +240, 2,213, 52, 70, 46,199,210,119,248,155, 69,239,120, 31, 34, 51, 50, 50,122,101,100,188,211,190, 9,143,212,106,245,168,119, + 41,168,215,235,239,164,166,166,118,126, 7, 82, 85,117,189,214,193,204,110,217, 52, 52, 52,255, 30, 40,192,136, 87,248,178,155, + 59,214,178,140, 96,156,137, 65,114,133, 46,121, 69, 84, 93, 52, 75, 48,238,168,164,140,167,234,154,207,255, 39,255, 15, 26, 73, +120, 76,253,123, 78, 91, 10, 74,218,104,213,219,104,209,208,208,208,208,208,208,252, 15,184,240,156,126, 17,251, 27,112, 18,111, + 71,223, 78,150, 51,162, 85,134, 62,107,211,147,162, 46,225,211, 11,180, 38,173, 73,107,210,154,180, 38,173, 73,107,254,235, 52, +203,168,106,238,212,167, 21,254,175, 83, 47,190,127, 11,116, 61, 59,173, 73,107,210,154,180, 38,173, 73,107,210,154,255,116,234, + 60,142, 22, 13, 13, 13, 13, 13, 13, 13, 13, 77,245, 84, 25,117,163,141, 22, 13, 13, 13, 13, 13, 13, 13, 77,253,176, 67,201, 20, + 85, 39,241,255, 83, 85,109, 6,106,158,130,231, 45,150, 45, 91,198,112,115,115, 19,115,185,220, 38,175, 94,189, 98, 76,158, 60, +185,222, 29, 9, 86,254,184,142,225,226,226, 34, 6,208, 36, 51, 43,143,241,201,127,190,160,232,243, 69, 67, 67, 67, 67, 67, 67, +243, 55,162, 79,169,177, 42,251,124, 19,225,170,149,209, 90,180,104, 17, 18, 18, 18, 68, 0,134,248,250,250,114, 55,108,216, 64, + 14, 28, 56, 80, 47, 99,244,213,156, 89,136,143,143, 23, 1, 24, 98,163,176,224,110,219,178,130, 28, 60,126,253,157,155, 45,133, + 66, 97,245,191,220,142,134,134,134,134,134,134,230, 95,197,248,114,159,227,235,100,180, 88, 44, 22,147,203,229, 54, 98, 48, 24, +189,248,124,126, 75, 0, 40,157,146,165,206,176, 88, 44, 38,151,199,107,196,100, 50,123,241,120, 37,154, 31,245,109, 95, 95,205, +174, 34,145, 40, 81, 40, 20,222, 7, 32,144, 72, 36,225, 58,157,238,177, 68, 34,185, 89, 27, 29,137, 68,114,179,116,187,112, 0, + 2,161, 80,120, 95, 36, 18, 37,178, 88,172,174,244,245, 68, 67, 67, 67, 67, 67, 67, 83,202,230, 74,150, 63,114,226,196,137, 42, + 13, 14,151,203,101,248,250,250,182,119,113,113,185,225,237,237,173,117,116,116, 60, 36, 20, 10, 69,245,204, 24,195,205,195,171, +189,189,157,242, 70,139, 70,118, 90, 27, 27,155, 67,108, 54,187, 62,154, 76,137, 68,178, 38, 40, 40, 40,231,198,141, 27, 68, 42, +149,166, 2,176,176,182,182, 86, 17, 66,136,173,173,173,169, 54, 98,182,182,182, 38, 66, 8,177,182,182, 86, 1,176,144, 74,165, +169, 55,110,220, 32, 65, 65, 65, 57, 18,137,100, 13,106, 30,209,150,134,134,134,134,134,134,166, 22, 84,231, 69,254,194,148, 69, +177,236,234,188,115, 92, 46,215, 79,161, 80, 68,125,246,217,103,198,205,155, 55, 19, 23, 23,151,187, 54, 54, 54,109, 20, 10,197, + 91, 13,234,199,140, 25, 83,155,106, 63, 63,137, 84, 22,181, 99, 70, 79, 99,209,182, 16,226, 96,103,115,215,194,194,162,141, 84, + 42,125, 75,115,196, 39, 19,204,209,180,151,201,100, 17,203,150, 45, 43,206,206,206, 38,132, 16, 34,147,201, 82, 1,200,149, 74, +165, 42, 38, 38,134, 40, 20, 10, 2,243,163,120, 12,133, 66, 65, 98, 98, 98,136, 82,169, 84, 1,144,203,100,178, 84, 66, 8,201, +206,206, 38,203,150, 45, 43,150,201,100, 17, 0,236,233,219,130,134,134,134,134,134,230, 95,109,180, 42, 26, 46,243,170, 14, 91, +182,108,201, 83, 42,149,109, 36, 18, 73,127,177, 88, 28,218,175, 95, 63,223,129, 3, 7, 50, 52, 26,141,209,215,215,215,222,213, +213,117,154, 92, 46, 31,197,231,243,155,113,185,220,145, 82,169,212,110,239,222,189,110,213,105, 54,109,254, 1,207,194, 66,222, +134,203,229,245, 23,139, 37,161, 19, 63,236,226, 59,106,230, 32, 6, 71, 27,103,236,210,204,217,190, 73, 35,187,105,182,114,209, + 40, 22,147,209,140,162,168,145,124, 62,223,110,247,182, 77,110, 53,236, 88, 35,123,123,251,240,189,123,247, 54, 25, 50,100, 8, + 47, 58, 58, 26, 0, 96, 52, 26,185, 0,244, 76, 38, 19, 60, 30, 15, 58,157, 46, 11,128,185, 39,144,232,116,186, 44, 30,143, 7, + 38,147, 9, 0,250, 82, 61, 68, 71, 71, 99,200,144, 33,188,189,123,247, 54,177,183,183, 15, 7,208,136,190, 53,104,104,104,104, +104,104,254,181,148,153,171,147,168, 80,117,200, 42,115,143,193,193,193,111, 69,141,184, 92,238,134,103,207,158,181,179,180,180, +108,196,102,179,141, 67,135, 14,229,141, 24, 49, 2,233,233,233,166,252,252,124,166,159,159,159,242,222,189,123,189, 12, 6, 67, + 7, 11, 11,139,194,236,236,108,133, 70,163,121, 1, 96, 90, 53, 25,217,240,252,105, 84, 59, 43,185,101, 35, 46,155,105,156, 58, +118, 4,239,171, 57, 61, 65,105,194, 76,198,180, 76,230,247,254, 22,202, 31,111, 22,244,122,166, 51,118, 40,144,241, 11,213, 57, +154, 26, 53, 21, 10,133, 63,135,195,185,127,250,244,105, 8,133, 66,228,228,228,128,203,229, 2, 0,242,243,243,101, 0, 88, 20, + 69,129,203,229, 34, 55, 55, 87, 94,155,163,150,155,155, 43,231,114,185,160, 40, 10, 0, 88,165,122,224,114,185,200,201,201,129, +155,155, 27,117,250,244,105,155, 94,189,122,189,212,233,116, 31,100,100,100,132,209,215, 26, 13, 13, 13, 13, 13, 77,237,169,204, +139,252,141,168,113, 28,173,206,165,161,186,242, 19,231,238,180,182,182,182, 21,139,197,222,227,199,143,103, 40, 20, 10,220,191, +127,223, 84, 80, 80,192, 96,179,217, 96,179,217,204, 46, 93,186,136, 13, 6,131,240,212,169, 83,212,203,151, 47,211,245,122,253, +247,153,153,153,247,170,201,200,206,198, 22, 60, 91,129, 5,215,251,248, 23, 29, 25,214,110,153,192,217,133, 38,146,159,198, 96, +153, 8, 20, 34, 19,115, 85, 7, 74,172,150,185, 10,167,238, 75,167,174,189,204, 78,215,235,245,223,231,229,229, 85,167,153, 12, + 0,165,121,130, 84, 42,133,209, 88,126,126, 75, 16, 6,131, 1, 30,143, 87,167, 35,199,227,241,192, 96, 48,128,114,145, 48,153, + 76, 6, 38,147, 9, 6,131, 1, 54,155,253, 86, 62,104,104,104,104,104,104,104,234, 68,101, 94,228,239, 66,249,113,180,204,155, +155, 82,169, 84, 82, 82,169,212,174,121,243,230,223, 6, 5, 5,197, 12, 24, 48,160,240,167,159,126, 34,171, 87,175, 38,171, 86, +173, 34, 91,183,110, 53, 94,190,124, 89,255,159,255,252,167,216,221,221,253, 69,104,104,168, 55, 0,244,238,221,187,202,234, 72, + 11,185, 37, 37,230,178,236,124,188,155,126, 59,188,115,147,152,111,250,123, 20,234,118,248, 17,211,124, 39, 98, 92,231, 74,140, + 7,187, 26,201,179, 21,250, 37,227,186, 22, 55,112,105,240,226,231,173,251,189, 1,160, 91, 80,239,106,171, 56, 21, 10, 69, 75, + 71, 71,199,212,115,231,206,153,178,178,178, 72,102,102,102, 89, 27,173,108, 0, 50, 23, 23, 23,149,193, 96, 32,114,185,252,117, +109,142,154, 92, 46,127,109, 48, 24,136,139,139,139,170,196, 95,201,178, 9, 33, 36, 51, 51,147,100,101,101,145,115,231,206,153, + 28, 29, 29, 83, 21, 10, 69, 75,250,254,160,161,161,161,161,161,249,215, 50,190,194,103,205,180,107,215,142,146, 74,165,140,166, + 77,155,138,237,237,237, 91,219,219,219,223,249,241,199, 31,201,234,213,171, 13, 27, 55,110, 36,191,254,250,171,225,227,143, 63, +206, 21,137, 68, 39,185, 92,174, 28, 0, 92, 93, 93,171, 13,249,181,108,221,134, 18,240,121, 12, 79, 79, 31,177,194,202,170,181, +181,149,229, 29,221,234, 38,132, 44,116, 48,144, 45, 45, 8, 57,216,211,176, 98,112,171, 92, 54,155,115, 18,128, 28, 0, 28,237, +237,204, 13, 35,218,219,216,216, 68, 44, 92,184,176, 64,167,211,145,210, 94,134,169, 0, 44, 92, 92, 92, 84,132, 16,226,232,232, +152, 8, 64, 97,166,158,194,209,209, 49,145, 16, 82,102,180, 44,108,109,109, 83, 9, 33, 68,167,211,145,133, 11, 23, 22,216,216, +216,208,141,225,105,104,104,104,104,104,104,170,156,235,176,202, 72,209,141, 27, 55, 72,110,110,174, 41, 57, 57,217,152,159,159, + 47,245,243,243,147, 51,153, 76, 40,149, 74, 38,147,201, 52, 21, 20, 20, 48, 21, 10,133,138,205,102,239,214,106,181, 89,253,251, +247,167, 98, 99, 99,171,109,104,126,239,246, 45, 82, 84,172, 49, 37, 37, 37, 26, 11,243,115,165,163,154, 89,202, 89, 6, 29, 76, +126,237,152,185, 2,119,147,169, 40,139,233,101,199, 83,113, 56,236,221, 0,178, 6, 4,247,161,146, 84, 41,230, 54, 94, 87,165, +165,165,249,109,216,176, 97, 75,199,142, 29,179, 10, 11, 11,203,218, 86, 85, 28,130,193,194, 76,189,138,235, 49, 41,138, 66, 97, + 97, 33, 58,118,236,152,181, 97,195,134, 45,105,105,105,126, 0, 84,244,245, 69, 67, 67, 67, 67, 67,243,175,166,202,113,180,106, + 28,234,160,176,176, 80,206,225,112,186,181,106,213,170, 65, 65, 65,129,105,209,162, 69,137, 63,253,244,211,174, 23, 47, 94,232, + 45, 44, 44, 26, 9, 4,130, 79, 81, 76,136,102, 0, 0, 32, 0, 73, 68, 65, 84,135, 12, 25,162, 56,114,228, 8,233,208,161, 67, +197,232, 83,165,179,123, 23, 21,229,203,121, 28,118,183, 79, 3, 36, 13, 18,117,114,147,247,167,119, 19, 59,205,191,185,235,183, + 71, 44,125, 83,203,162, 70,150, 92,234,211, 33, 67, 6, 43,126, 59,113,146,180,105,211,218, 44,205, 82,140,105,105,105,159,222, +191,127,127,112,195,134, 13,147,244,122,125, 18,128,204,162,162,162, 84,123,123,251, 52,157, 78,151, 4, 64, 87,201,118,149,105, +234,116, 58, 93,146,189,189,125, 90, 81, 81, 81, 42,128, 76,189, 94,159,212,176, 97,195,164,251,247,239, 15, 78, 75, 75,251, 20, +128,177,154,188,208,179,186,211,154,180, 38,173, 73,107,210,154,180,230,191,135, 63, 68,179, 0, 51, 38,149,230,241,120, 29,157, +157,157,219, 63,122,244,200,120,235,214,173, 28, 6,131,241,115,239,222,189, 15, 29, 62,124, 56,192,210,210,210,198,201,201, 73, +121,241,226,197, 64, 0, 7,174, 93,187,102, 86,244, 73,192,227,116,108,225, 40,107,191,249, 33, 49,110,187,255, 60,199,200,228, +253,220,101,208,160, 67,211,119,237, 9,176, 87, 72,108, 90,216, 73,149,167, 78,157, 9, 4,112,224,214,173,219,181, 30, 79,195, + 96, 48, 92, 76, 75, 75,115, 42,251, 63, 61, 61,221, 79,161, 80,120,163, 36,250,148, 99,166, 76,188,201,100,234,109, 50,153,236, + 51, 50, 50,158, 0, 64, 70, 70,198, 7,244,117, 68, 67, 67, 67, 67, 67, 67, 83,137,201,218, 92,217,255,213, 70,180,184, 92,174, + 3,147,201,244, 73, 74, 74,138, 63,117,234,212,163,150, 45, 91,246,138,143,143, 95, 70, 8,137, 19, 10,133,227, 19, 19, 19,159, + 39, 38, 38,106,139,138,138, 38,214, 34, 51, 14, 96,112,124,238,171,138,226,127,184,248,248, 81,211, 54, 61,122,169,213,170,101, + 70, 66,226,184, 66,233,248,103, 9,233,207,111,167,105,180,197,197,181,210,172,145,140,140,140, 39, 25, 25, 25, 57,181,220, 38, +167,204,100,209,208,208,208,208,208,208,208,212,150,154, 34, 90, 58,163,209,184, 66,163,209,200,127,251,237,183,228,160,160, 32, + 13, 0,108,216,176,193, 52,118,236,216,235,175, 94,189,234,250,228,201,147, 94,182,182,182,151, 0, 80, 49, 49, 49,230, 68,159, +116, 38,147,113,133, 86,171,145, 95,188, 28,150,220,177,125, 83, 13, 0,108, 92,191,214, 52,116,252,140,235,175,162, 31,117,125, + 22, 21,222,203,214,214,246,146,209,192,162, 82,212,113,132, 62, 77, 52, 52, 52, 52, 52, 52, 52,127, 97, 54,227,237, 42,195,205, +102, 25, 45,173, 86,155,174,213,106, 1, 32, 43, 40, 40,232,173,239,182,110,221, 74, 0, 20, 0, 56,152,153,153, 89,155,204,164, + 23, 21, 21, 1, 64, 86,199,246, 77,223,250, 98,223,230,159,222,104,230,231,229,210,167,141,134,134,134,134,134,134,230,239,100, +182,254, 0,131, 62, 46, 52, 52, 52, 52, 52, 52, 52, 52,245, 98,124, 85,255, 83,168,186,231,192,133, 90,252, 64, 93,122, 31, 92, +160, 53,105, 77, 90,147,214,164, 53,105, 77, 90,243, 95,167, 89,147,246, 5,252,253,168,178, 49,252,159, 13,221,245,149,214,164, + 53,105, 77, 90,147,214,164, 53,105,205,127, 58,118,120,123,120, 7,187,178, 47, 88,244,177,161,161,249,123, 67, 14,130,137, 44, + 79, 87, 16, 98, 15, 38, 55, 5, 41,145,175,168,111, 97,170,183,102,170,143, 11, 4,122, 37, 12,252,116,164, 70,196,212, 87,147, +134,134,230,159,135,109,219,201, 3, 40, 6,243,103,138,152, 80,148, 26,205,227, 20,197, 9,211, 82,226,255,141,222, 34, 5, 85, + 68,176,104,163, 69, 67,243,119, 39,221,203, 3, 44, 44, 5, 3,118, 32,186,151,176,246, 89, 10, 60,142,170,183, 38,199,180, 8, + 70,134, 35,136,238, 25,108, 60,151, 1, 79, 31,211, 7,251,159,199,180,169,147,200,147,168, 59, 72, 72, 80,161, 81, 99, 59,120, +120,181,197, 79,107, 67, 41,250,200,208,152,247, 86, 70,109,238,214,119,132,165, 64, 40, 1, 0,152, 12,122,108,157,217,226,188, +193, 96,216, 9,224, 8,128,162,127,251, 33,250,159, 55,134,103,179,217,169, 0, 76,124, 62,255, 48,202,133,214,104,104,254, 4, +236, 74,175, 51, 83,233,117, 87, 27,196, 44, 22,107,190, 80, 40,188,204,227,241,210,120, 60, 94,154, 72, 36,186,204, 98,177,230, + 3, 16,255,101,202,184, 95,155, 8,193, 48,246,210,234, 77, 14,103, 34,179,109, 10, 53, 70, 15, 48, 12,189,201, 86,119,113,189, + 52, 89, 84, 80,177,206,228,188,251,110,161,178, 64,107,240, 6, 65,189, 52,203, 97,193,225,112,206,192,252, 57, 71,105,254,100, +226, 99,162,112,234,196, 42, 44,250,110, 52,182,111,158,136,167, 79,110,215, 75,207, 27,248,224, 3, 22,235,115, 47,160, 11, 74, +218, 1,211,252,147,161,200,248, 11,199,119,167, 31,223,187, 62,125,255,170,137,228,232,210, 96,172, 93,187,182,219,232,209,163, +119, 59, 59, 59,167, 3,248,136, 54, 90,255, 99,244,122,189, 77, 70, 70, 6,181,115,231,206,126, 50,153,236, 37,139,197,154, 11, +128,243,111, 57,224, 98,177,248,166, 84, 42, 77,149,201,100,169, 82,169, 52,188,166,244,127, 40, 30,214,214,214,241,150,150,150, +207,202, 39, 90, 55, 27,208,214,173,221,168, 5, 86, 62, 33,157,234,169,207, 97,177, 88,115,101, 50,217,203,157, 59,119,246, 75, + 78, 78,166,244,122,189, 77, 45,182,239, 40,151,203,159,220,185,115,231,155,140,140,140, 78,137,183,183, 90,171,239,108,178,142, +255,125, 85,231,251,167,214,125, 99, 97, 33,123, 12,160,227, 95,226, 72, 22,155,148, 96, 48, 3, 31,165, 20, 10, 83,114,245,202, +176,184, 66, 9,192,236, 12,109, 61, 94, 98,114, 76, 74,128,116,121,152, 84, 36,186,249,218, 90,121,237,149, 70, 10, 6, 35, 16, +197,148,109,189, 11, 28, 6, 99,146,201,100,234,206,225,112, 62,165,159, 80,127, 13,120, 60, 14, 64, 8,196, 34, 62, 0, 2, 70, + 61,173, 17,151,193,104,119,179, 95,191, 69,115,154, 53,155,230, 5,244,173,194,108, 81, 0,166,123,121,121,157, 6, 48,244, 29, +238,206, 15,158,158,158,201, 0,102,188,171,114,201,223,223,191,109, 96, 96,224,130, 22, 45, 90,116,122, 87,154,255, 36,212, 55, + 55,252,150,114,125,157,141,234, 70,168, 77,118,204,213,233,118, 74,185, 41, 38, 38, 6,125,250,244,193,250,245,235,133,190,190, +190,187, 0,216,255, 11,110, 37,191,178, 23,124, 84,104,163,101,182,209,250,208, 21,237,134, 53,196,149,193,174,200, 27,210, 16, +249, 35, 27,226,250, 32, 87,116,169, 75,110,172,172,172,208,177, 99, 71,102,114,114,178, 96,214,172, 89, 11,248,124,126, 44,128, + 30,117,209, 18, 8, 4,247,133, 66, 97, 34,139,197,122, 43, 47, 66,161,240,190, 72, 36, 74,100,177, 88, 93,203,167, 75, 36,146, +155, 82,169, 52, 85, 34,145,132, 87, 97,132,238, 75,165,210, 84,177, 88,124,191,124, 58,139,197,234, 42, 22,139,147, 36, 18, 73, +197,244, 46, 18,137, 36,177, 98,122, 85,176,217,108,199,196,196, 68,155,164,164, 36, 27, 46,151,171, 44,159,158,144,144, 96,147, +152,152,248, 86,122,109, 96,177, 88, 93, 68, 34, 81,162, 80, 40,188, 95, 89,122,197,125,170,138,114,199,174,139, 57,233,181, 45, +120,130,130,130,174,167,164,164, 56, 91, 88, 88,188, 53,113,183,165,204,162,199,175, 91, 67,103,134,244, 14,154,100,237,221,191, +105, 29,245,123,240,249,252,216, 89,179,102, 45, 72, 78, 78, 22,180,105,211,134,201, 96,212,234,125,162, 91, 72, 72,200,209,212, +212, 84,135,230,205,155, 51, 13, 6, 3, 30, 29,155, 15, 97,196,167,224,199,110,132,147, 32,157,245,242,252, 50,199,160,206, 31, + 28,197,123,110, 12, 74, 14,122,115, 64,153, 58,154, 8,177,126,146, 92,108,221,167,223, 71,172, 7,137, 69,214,122,163,209, 18, + 96,118, 38,219, 93,120,117,210,100,233, 59,152, 8, 81, 94,140, 99, 91, 7, 14,158,198,188, 20,199,178,214, 27,141, 86, 96,160, + 83, 93, 52,203, 95,254, 76, 38,115,230,170, 85,171, 24, 0,166, 2,224,254,155, 12, 77, 43,123, 56,116,105,204,188,235,103,135, +118,239, 80,214,183,244,126,247,168,175,208,150,237,167, 49,118,194,102,184,123,181,174,151,142,214,100,122,186, 47, 38,230,236, +200,198,141,131,231, 52,107, 54,166, 18,179, 69, 1,152,179,108,217,178, 81,143, 30, 61,178,110,216,176,225,132,119,244,210,191, +102,217,178,101,179, 31, 61,122,100,239,234,234,186,176,150,154, 85,150, 75,114,185,188,199,150, 45, 91,102,246,233,211,103,146, +191,191,127,211,119,161,249, 15,102,253,195,135, 15,157, 87,173, 90,245,229,216,177, 99,115, 1,160,107,215,174, 28, 0,109,234, + 93,222, 17,194, 37,132, 4, 18, 66,250, 16, 66,186, 18, 66, 90,149,254,221,178,116,233, 67, 8,233, 86,225,179,101,233,182,101, +223, 7, 84,161,209,167,226,118,229,182,169,248,255, 91,127, 87, 98,180,250,160,164,173, 86,159,183,118,224,196,137, 19,164,252, +103, 69,134,184,226,219,105,109, 29, 10,159, 28,223, 67,242, 19, 99, 72, 86,244, 3,242, 96,243, 18, 50,173,165,117,225,240,134, +248,161,246,199,139,144, 27, 55,110,144, 71,143, 30,145,252,252,124,242,252,249,115, 18, 16, 16, 80, 36, 20, 10, 47, 2,112,173, +141,152, 68, 34, 73,189,120,241, 34, 9, 10, 10,202, 17,139,197, 43,203,110, 46,169, 84,154,122,227,198, 13, 18, 20, 20,148, 35, +145, 72,214, 0, 96, 2,192,160, 65,131,210, 8, 33,196,218,218, 90, 85,153, 94, 72, 72, 72, 22, 33,132,200,100,178,178,170, 38, +166, 68, 34, 89, 51,101,202,148,252,123,247,238, 17,185, 92, 94,150,206,144, 74,165, 43,167, 78,157,154, 31, 22, 22, 86, 62,189, + 90, 44, 45, 45, 19,141, 70, 35, 57,126,252, 56,177,177,177, 81,149,187,153, 19,141, 70, 35, 57,122,244,104,149,121,171, 46, 80, + 32, 22,139, 87,140, 28, 57, 50, 47, 46, 46,142, 88, 89, 89,165,150, 75, 95, 57,122,244,232,188,132,132, 4,162, 80, 40,204,202, +163,149,149, 85,234,205,155, 55,201,192,129, 3,115,203, 31, 83, 43, 43,171,212, 91,183,110,149,165,175, 48,167, 32,179,183,183, +159, 96, 99, 99,163,178,177,177, 81, 89, 88, 88, 44,182,179,179, 83,167,167,167, 19, 66, 8,105,212,168, 81, 90,249, 72,150,141, +111,191,207, 54, 30,188,117,231,106, 84,102,122,179,238,147, 86,200,154,133,200,106,113, 12, 92,133, 66,225,197, 78,157, 58, 21, + 37, 38, 38,146,130,130, 2, 18, 17, 17, 65,110,220,184, 65, 94,188,120, 65, 0,152, 51,195,128, 68, 44, 22, 39,107, 52, 26,147, + 70,163, 49,165,167,167, 27,211,210,210,140,209, 43,237, 8,217,198,126,179,100, 31,237, 75,212, 87,151,154,164, 98, 97, 18, 0, +201,123, 51, 90,161, 62,142,100,147,231,190,199,243,157,163,175, 46,235,169, 39,113,151,200,158, 49,214,250, 43,159, 57,188, 36, + 63,123,253,151,108,242,118,170,147,230,207,222,123, 34,190,118,126,186,110,225,116,125,124,124, 60,249,124,116, 79,195,185,105, + 14,175,200, 70,175,131,117,209, 44,199,176, 1, 3, 6,228, 39, 36, 36, 16, 31, 31,159, 2, 38,147, 57,246,223,100,178,186,121, +112,147, 35,118,127,110,234,235, 43,204,124, 71,102,203,215,198,198, 38, 99,199,142, 29, 68, 34,145,164,213,213,108,125,216,191, + 51, 41,202,185, 72,250, 7,183,170,246, 30, 25, 60,120, 48, 9, 12, 12, 36,211,166, 77,171,233, 94,162,188,128,126, 59,155, 53, + 59,106,250,240, 67,227,206,102,205,142,122, 1,253, 74, 13, 22, 5,224,203,229,203,151,135,233,245,250,176,237,219,183,135,245, +235,215, 47, 12,192,231,245, 60, 22, 63,253,240,195, 15, 68,175,215,147,237,219,183,147,126,253,250, 17, 0,107,235, 83, 46,149, + 69,178,252,252,252, 62, 59,114,228,200,157,167, 79,159,166, 7, 7, 7,175,104,214,172,153,172,174,154,127, 69,196, 98,177, 91, +211,166, 77,119,249,248,248, 36, 52,111,222, 92,235,237,237, 93,236,225,225, 17,231,235,235,187,131,199,227,185,214, 81,182,117, +187,118,237,140, 87,174, 92, 33, 3, 6, 12, 32,229, 76, 72,181, 84,231, 69, 8, 33,173,190,252,242,203,185, 0,200,151, 95,126, + 57,151, 16,210,167,212, 79,244, 41,255,119,197,207, 50,243, 84,246,127,101, 26,101, 75,101,154,149,253, 70,133,223, 65, 21,145, +172,241,127,216,185, 19, 39, 78,116, 58,113,226,196,149,138, 59,247, 81, 67,180,157,214,214,161,168, 40, 61,133, 68, 45,249,148, + 92, 14,116, 36, 55, 58,219,146,103, 51, 7,144,148,221,107,200,228, 22,242,194, 15, 27, 34,176,182, 70, 43, 44, 44,140,132,133, +133,145,240,240,112, 18, 27, 27, 75,114,114,114,200,254,253,251,141, 86, 86, 86, 69, 60, 30,111, 25, 0,129, 57, 98, 82,169, 52, +149, 16, 66, 52, 26, 13, 89,188,120,113,113,105,164, 74, 41,147,201, 82, 9, 33, 36, 59, 59,155, 44, 91,182,172, 88, 38,147, 69, + 0,176, 87, 40, 20,137, 49, 49, 49, 68,169, 84, 86,106,102,228,114,121,234,211,167, 79,203,140,147,131, 92, 46,143, 58,118,236, +152,142, 16, 66,146,146,146,136,165,165,101, 42, 0,165,149,149,213,131, 19, 39, 78,232, 8, 33, 68,165, 82,149,165,155,101,180, +138,138,138,200,185,115,231,222,202, 67, 89,250,233,211,167,223, 50, 96,102,160,148,201,100, 97,251,247,239,215, 26,141, 70, 18, + 21, 21, 85,102, 18,149, 22, 22, 22,225, 7, 15, 30,212, 26,141, 70, 18, 29, 29,109,182, 25,108,208,160, 65, 26, 33,132, 24, 12, + 6,178,113,227, 70, 77,217, 49, 45, 75,215,106,181,100,195,134, 13, 26,169, 84, 26, 6,160,218,232,155, 66,161, 80,105,181, 90, +146,157,157, 77, 2, 2, 2,242,111,220,184, 65,114,115,115, 9, 33,132, 52,104,208, 32, 13, 0, 60, 59,141,253,254,206,243,252, +220, 79,102,135, 30,112,109, 53,124,201,217,187,201, 73, 91,142,220, 15, 83,248,134,244, 52, 39,168,201,227,241,150,217,217,217, + 21, 95,187,118,205,168,211,233, 72, 66, 66, 2, 9, 15, 15,127,115,141, 69, 70, 70,154,101,180, 88, 44,214,252, 59,119,238,232, +140, 70,163, 41, 35, 35,195,152,150,150,102, 76, 75, 75, 51, 84, 52, 90,100, 27,155,100,156, 30, 71, 78,110,158,161,229,112, 56, +243,223, 79, 52, 11, 76,178,201, 51,132,108,242, 12,219, 49, 82,145,145, 23,190,151,144,243, 51,200,171,239, 27,146,249, 61, 37, +121,166, 77,158, 97,100,147,215,135,228,219, 78,172, 90,105,110,246,238, 75, 54,121,134,253,240,145, 75,230,131,176,123,228,202, +149, 43,100,195,154,229,100, 90, 55,135, 2,211, 38,207, 48,242,179,247,192,218,104,150,135,199,227, 61,191,126,253, 58,185,122, +245, 42, 89,184,112, 33, 17, 10,133, 9,239, 34,170, 71,126,246,112, 33,191,120,116, 34, 91,221,237,200,239,157,254,114, 29,124, + 90,217,195,161,187, 7, 55, 41,227,193, 17, 66, 94,191, 32,234,149, 62,164,167, 39,187,190,102,203,215,198,198, 38, 61, 46, 46, +142,168,213,106,178,122,245,106, 34,149, 74,235,100,182, 62,236,223,153, 20,101, 95,168,214,104,133,132,132,144, 31,127,252,145, +232,245,122,210,186,117,107,115, 94, 90,254, 96,182, 60,129, 16, 0,115, 87,172, 88,241,198,100,133,134,134,134, 69, 70, 70,134, + 57, 59, 59,159,170,199,177, 88,187, 98,197,138, 55, 38, 43, 52, 52,148, 68, 70, 70, 18, 23, 23,151,196,250,148, 75,221,187,119, +255, 62, 54, 54, 54,119,222,188,121, 7, 58,118,236,184,228,193,131, 7, 73, 39, 79,158, 12,243,243,243,235, 89, 87,205,119, 16, +213, 97,149, 70,118,184,132, 16, 54, 33,164,204,188,178, 0,176,203, 2, 10,230, 48,114,228, 72, 97,219,182,109,195, 70,140, 24, + 81,184, 99,199, 14, 18, 23, 23, 71, 34, 34, 34,200,138, 21, 43,200,130, 5, 11,200,182,109,219,200,192,129, 3, 11, 2, 2, 2, +238,124,248,225,135,252, 90,100,211,199,213,213, 53,231,232,209,163,100,207,158, 61,132,195,225,156, 52,119,195,234,188, 72, 85, +102,170, 42,131, 85,241,187,106,140, 88,181,134,205,140,223,251,163,169,170, 24, 9, 41,247,247,239,193,193,193,157,254,240,240, + 33,248,110,252,172,239,249,177, 59, 86, 35,117,255,122, 48,179, 83,193,206,203,132,230,250, 73,232,175, 31,195,168, 54,109, 4, + 2,138, 90, 84,219, 11,134,203,229,130,203,229,130,195,225,160,176,176, 16, 42,149, 10,237,219,183,103,132,135,135,243, 39, 76, +152, 48, 67, 32, 16, 36, 0,232, 95,227,221, 76,149, 68,164,111,222,188,137,113,227,198,241,118,237,218,213,220,218,218,250,161, +209,104,228, 2, 64,116,116, 52,134, 12, 25,194,219,187,119,111, 19,123,123,251,112,157, 78, 39,228,241,120, 96, 50,153, 85,234, +113,185, 92,232,245,122,158,187,187,123,196,195,135, 15,125,131,131,131,217,241,241,241,136,137,137,129, 94,175,231,122,120,120, + 68,134,135,135, 55,239,211,167, 15, 59, 49, 49, 17,241,241,241,111,242, 97, 78,126,181, 90, 45,120, 60, 30,202, 87,105, 81, 20, + 5,141, 70, 3, 46,151,107,182, 22,139,197,234,226,229,229, 21,249,240,225, 67,191,144,144, 16,206,189,123,247,144,148,148, 4, +163,209,200,245,246,246,142,124,248,240, 97,139,126,253,250,113, 34, 34, 34,144,154,154, 10,115,171,208,202,214,123,248,240, 33, + 70,140, 24,193, 61,115,230, 76, 11, 59, 59,187, 8,131,193,192, 5,128,200,200, 72, 12, 25, 50,132,123,246,236, 89, 63, 39, 39, +167,136, 26,170, 18,153, 0,160,215,235, 49, 97,194, 4,145, 84, 42, 69, 98, 98, 34, 76, 38, 19,140, 70, 35, 0, 32, 51, 43, 51, +242, 97,100, 84,244,168, 97, 31,117, 42,210,105, 52,183,238,222,127,210,168,129,139, 35, 69,145, 6, 53,100,181,191, 72, 36, 74, + 88,185,114,229,103,113,113,113, 60, 47, 47, 47,198,171, 87,175,144,151,151, 7, 14,135,243,230, 26, 51,119,191,185, 92,110,103, + 31, 31, 31, 86,113,113, 49, 76, 38, 19, 0, 16, 6,163,242, 22, 43,252,236,235,240, 86, 26,216, 2,129,160,243,123,121,122,231, +250, 88,193,132,238,241,233, 90, 30,207,194, 81, 34,182,243, 0, 18,174,162,161, 53, 15, 76, 6,147,127, 47,166, 80, 4,144,238, +112,206,176,170,157,166,169,123, 76,154,150,167,183,108, 34,182,119,116, 70,102,102, 38,156, 26,121,161,152,107,205,189,249,162, + 64, 12,170,150,154,255, 79, 7,119,119,119, 91, 55, 55, 55,100,100,100,192,207,207, 15,114,185, 92, 14,160,123,157, 31, 58,219, + 93,120,200, 69, 59,128,177, 18, 70,106, 33,244,172,165,120,145,238, 71, 54,249,177,255, 74, 38, 75, 42,230,222,222,187,111,191, +131,149,179, 55,112,242, 19, 40, 45,120,216, 58,201,207,210, 90,198, 59, 90, 71,179,229,171, 84, 42, 47,221,185,115, 71,193,231, +243, 17, 30, 30, 14, 31, 31, 31,172, 94,189,218, 90, 46,151, 95,173, 91,100,139,128, 80, 85,155,172,142, 29, 59, 98,234,212,169, +216,181,107, 23, 44, 45, 45, 49, 98,196,136,154,204, 22,137, 6,142,255, 16, 17,177,125,215,203,151, 39, 70, 54,110, 28, 60,194, +195, 99,241,196,161, 67,199, 78,159, 62, 29,203,151, 47,199,209,163, 71,209,174, 93, 59,140, 31, 63, 94,159,144,144,176,179,174, + 85, 85, 43, 87,174,156, 54, 99,198,140,138,154,186,248,248,248, 31,234, 85, 46,101,102, 70, 70, 68, 68, 68, 15, 27, 54,172, 83, +113,113,177,230,238,221,187, 79, 92, 93, 93, 29, 1, 52,168,171,102, 61, 12, 22, 69, 8,225, 3, 16,150, 46, 34, 0,194,189,123, +247,202, 66, 66, 66,164,165,105,130,210,165,198,234,125, 31, 31, 31,199,231,207,159, 39,207,156, 57,211,111,215,174, 93, 2,161, + 80,136,236,236,108,252,242,203, 47,152, 59,119, 46, 40,138, 2, 33, 4,219,182,109, 19,142, 25, 51,166,213,203,151, 47,147, 93, + 92, 92,204,105,210,194, 19,139,197, 7, 23, 47, 94, 44, 53,153, 76,152, 51,103, 78,134, 78,167,155, 90,250,221, 60, 11, 11,139, +219, 40, 49,220,213, 81,169, 23, 41,247,172, 60, 81,225,216, 4, 87, 76,171,248, 29, 33, 36,184, 58,141, 90,158,139,202,126,239, +100,117,102,171,252, 19,168,115,165, 46, 18,104,102,235,234,137,156,243, 7, 33, 96, 81, 16, 48, 75, 23, 22, 5,198,171, 72, 56, +241,217,208, 19,226, 91, 87,163, 85,182,176,217,108, 20, 22, 22,194,104, 52, 98,238,220,185,188,115,231,206, 89, 49, 24,140,255, +214,164, 83,222, 48, 61,123,246, 12,222,222,222,212,241,227,199,149, 83,167, 78, 21,148,253, 78, 78, 78, 14,220,220,220,168,211, +167, 79,219,124,253,245,215,226,234,204, 12, 69, 81,224,112, 56,152, 49, 99,134,224,238,221,187,150,246,246,246,120,245,234, 21, + 94,191,126, 13,177, 88,140, 25, 51,102, 8,238,220,185, 99,109,111,111,143,184,184, 56,228,228,228, 64, 44, 22,215,218,104,113, + 56,156,183,182,161, 40, 10, 58,157,174, 86,198, 64, 38,147,237, 9, 11, 11,179,150,201,100,136,136,136,128,193, 96,128, 76, 38, +195,180,105,211, 4, 97, 97, 97,214, 22, 22, 22,136,142,142, 6, 33, 4, 82,169,180, 86,121, 4, 0,147,201,132,232,232,104, 52, +104,208, 0, 87,175, 94,181,153, 56,113, 34,191, 44,253,197,139, 23,112,116,116,196,213,171, 87,109, 68, 34,209,158,170,180, 76, + 38, 19, 82, 82, 82,240,232,209, 35,188,122,245, 10,233,233,233,200,200,200, 64, 94, 94, 30, 12, 6, 3, 0, 64,152,151,123,114, +239,129,227, 15, 5, 2,129,208,199,195,221, 57, 50,234,113,154, 64, 32, 16,186, 56, 59,123, 0,223, 50,170, 49,132,255,141,143, +143,183, 26, 51,102, 12, 71,173, 86, 35, 43, 43, 11, 44, 22,235, 15,215, 22,151,107, 94, 83, 32,131,193,224,205,231,243, 41,157, + 78,247, 38, 2,198,229,114,241,217,158, 66,248,204,199, 91,203,208, 53,105, 32, 70, 61,180, 90,173,247,255, 60,154, 5, 80,160, +180,238,160, 40,191,219,175, 10, 44, 59, 4, 15,227, 32,230, 12, 96,210, 3, 12, 22, 58, 55,115,100, 29,141, 44, 80,130,160, 25, + 52,240, 34,164,230,158, 95, 4,160, 0,157, 27, 64,125,112,238,185,193,170,221,128, 73,156,228,228,100,112, 56, 28,240,120, 60, +248,117, 25,196,218,251, 80,111, 11, 10,205,161,131,167, 57,154,111,133, 29, 5,130,111, 22, 44, 88, 32, 42,175, 57,118,236, 88, +145, 76, 38, 91, 80,103,147, 85, 32,108, 3, 3,153,241, 40,185,176,193,226,147,106,239,151,105, 69,158, 32,100, 38,160,111,241, + 14,204, 86,103, 30,143, 23, 3,160,125,189, 76,150,132,123,107,223,190,253, 14,150, 78, 37, 38, 11,134, 98,128, 45,128,173,181, + 5,182,126, 22,104,105,109, 33,168,173,217,242, 85, 42,149, 23,111,223,190,173,224,243,249, 8, 11, 11, 3,135,195, 1,159,207, + 71,211,166, 77,177,105,211, 38,107, 75, 75,203, 90,155, 45, 2, 82,105,204,183,127,255,254,164, 99,199,142,152, 50,101, 10,118, +238,220, 9,173, 86,139,197,139, 23, 35, 62, 62,222, 44,217,104,224,248,178,136,136, 29, 75, 31, 61,122,246,165,175,175, 87,127, +145,200,114,202,136, 17,178,175,191,254,250,196,177, 99,199,182,247,233,211, 39,227,238,221,187, 63, 2, 56, 88,203,195, 75, 1, + 8, 93,181,106,213,148, 50,227,246,245,215, 95,111, 59,118,236,216,210, 62,125,250,164,220,189,123,119, 38,128,208,250,148, 75, + 38,147,233,228,127,255,251,223,135, 2,129, 64,232,233,233,233, 28, 21, 21,149, 38, 16, 8,132,206,206,206, 30,157, 58,117, 98, +212, 69,179, 46,216,216,216,116,189,125,251,182, 15, 74, 58,141,241,202,140, 86, 84, 84,148, 69,110,110,174,133, 88, 44,182,176, +179,179,147,148,153,173, 1, 3, 6, 88,176, 88,172,106,175,219,252,252,252, 99,243,230,205,147, 13, 24, 48,160,236,127, 92,191, +126, 29, 59,119,238,132, 72, 36,122,107,221,126,253,250, 97,220,184,113,114,173, 86,251, 95, 51,178, 59,122,194,132, 9,158, 74, +165, 18,223,124,243,141, 38, 57, 57,185, 43,128,120, 0,178,110,221,186,125, 31, 21, 21, 21,208,170, 85,171, 3, 0,252,171,187, +247, 42,243, 34,229,141,142, 57,105,117, 93,223, 92,179, 85, 33,169,202, 49,180,222, 50, 90,193,193,193, 87, 80, 69, 79, 42,221, +235, 84,240, 96,132,128, 73, 65,200, 44,103,182, 96, 2, 43, 39, 13, 84, 29,122,169, 84,246, 48,228,114,185, 96, 50,153,208,106, +181, 48,119,162,234, 50, 83, 32,149, 74, 33, 22,139, 81, 84, 84, 4,131,193, 0, 62,159, 95,102, 70, 32,149, 74,193,102,179,193, +102,179,193,231,243,255, 16, 77,170, 24,205,225,112, 56, 16,137, 68, 72, 73, 73, 65,124,124, 60, 76, 38, 19,196, 98, 49, 68, 34, + 17,184, 92, 46, 84, 42, 21, 84, 42, 21, 8, 33, 16,137, 68, 16,137, 68,168, 77,131,107,163,209, 88,233,195, 95,175,215,215, 42, +162,101, 48, 24,240,228,201, 19, 36, 36, 36,128,207,231,191,217, 87, 30,143,135, 23, 47, 94, 64,173, 86, 67, 40, 20, 66, 42,149, + 66, 38,147,153,173, 91,182, 47, 18,137, 4, 2,129, 0, 89, 89, 89, 40, 44, 44,124,115, 76,165, 82, 41, 68, 34, 17,114,114,114, +144,150,150, 86,237,190, 27,141, 70,168, 84, 42,164,167,167, 35, 49, 49, 17, 25, 25, 25,111, 10,160,210,168, 81,253, 2, 59,185, +185,200,204,204,124, 19,137,172,106, 49, 7,147,201,132,188,188, 60,220,190,125,155, 50,153, 76,200,206,206, 54,165,171,213,198, +201, 42, 46,142,126,251, 51,217,127,230, 65,241,222, 83, 97, 69,135, 47, 62, 42, 10, 61, 28, 89,196, 15, 88,104,192,251, 96,131, +175, 12,122,118, 80, 70,190,158,151,174,227,200,148,190,221,128,152,211, 0,131, 5,240,229,104,221,164, 33,226,179,140,162,167, +169, 90, 62, 40,244, 64,168,135,220, 44, 77, 35,187,123,122,158,158, 23,167,179,150,122, 55,243, 71,106,106, 42,120, 60, 30,120, + 60, 30, 62,104,215, 13, 49,153, 70,225,227,228, 34, 33, 8,130,204,210,252,127, 26,137,197,226, 54,237,219,183,167,202,107,246, +238,221, 27, 20, 69, 53, 5,224, 85,171, 66,110,109, 35, 46,116,194,214, 96,145, 25,143, 83, 10,237,143, 70, 21,123,244,237, 63, +200,242,167, 11,105,222, 79,212, 26, 87, 16,253, 44, 16,157,127, 61,204, 86, 39,137, 68,114, 98,221,186,117,174,124, 62,255, 52, +128, 14,117, 17, 17, 11,152, 27,191,153, 50,204, 65, 94,102,178,244,133, 0, 75, 0,176, 5, 0, 75, 0, 91, 27, 5, 22,141,235, +110, 41,228,179, 15,215,194,176,238, 13, 13, 13,181,174,104,178,202, 22, 63, 63, 63,204,159, 63,223,218,210,210,114,143, 57,122, + 43, 87, 44, 39,217, 57, 57, 0, 1,114,115,243,177,114,197,242,172,178,239, 6, 12, 24, 64, 58,116,232,128, 41, 83,166, 96,233, +210,165, 56,117,234, 20, 90,183,110,141,241,227,199,163, 85,171, 86, 53, 73, 7,201,100,178, 93,221,186,117,187,173,146, 72,198, +165,248,251,115, 47,202,100, 57, 93,115,114,100, 46, 81, 81, 58, 79, 32, 18,192,134,164,164,164,158,181, 48, 89, 67,165, 82,105, + 88,215,174, 93,117, 18,137, 36, 97,245,234,213,147,167, 78,157,138,229,203,151, 99,222,188,121,191, 0,248, 15,128,175,146,146, +146,236,171, 51, 89,127, 86,185,244,103,149,117, 70,163, 49,241,224,193,131,173,116, 58,157, 99,105,245, 32, 47, 59, 59, 91,250, +250,245,107,137, 78,167, 19,153, 76, 38,145,133,133,133, 24,128,112,212,168, 81,172,199,143, 31,123, 27, 12,134,228,234, 52,213, +106,245,240, 57,115,230,100,100,100,100, 0, 0,154, 54,109,138,236,236,108,124,254,249,231,248,244,211,146, 14,193, 45, 90,180, + 0, 33, 4,169,169,169, 88,185,114,101,170, 90,173,254,216,140,236, 54,118,119,119, 71, 84, 84, 20,158, 60,121,114, 1,128, 9, + 37,237, 88,115, 30, 60,120,240, 48, 61, 61, 29,123,246,236,225, 56, 56, 56, 28, 67, 21, 67,188, 84,231, 69,234, 2, 69, 81, 39, +235,178, 93, 89,228,170,178,136, 88, 21, 84, 31,209, 10, 14, 14,166,202,127,190, 21, 49,162, 16,145,112,255, 42, 44,125,253,223, +138,102, 9,153, 20, 4, 82, 25, 98, 18,227,193, 1,245,232, 93, 25,173,172,172, 44, 76,158, 60,185,104,248,240,225,153, 38,147, +105,144,185,166, 64, 38,147, 65, 38,147,225,241,227,199,100,224,192,129,169,171, 87,175, 46, 42,111,180,158, 61,123, 70,130,130, +130,210, 22, 44, 88,144, 95,157,209, 42,139,104, 45, 91,182,172,168,115,231,206,233,143, 30, 61, 34,101,102, 74, 44, 22, 99,229, +255,177,119,221,225, 81, 84,237,247,204,204,246,150, 94, 73,163, 39, 1, 66, 9, 45, 1, 1,129, 0,161, 55, 5, 65, 68, 65,233, +136, 40, 42, 42, 74, 21,144, 94, 69, 80, 20,165, 9, 8, 74, 71, 33, 72, 81, 90, 66, 11, 37, 13,210,203,102,211,179,125,119,102, +238,239,143, 36, 16, 32,101, 19,244,251,233,247,237,121,158,121, 54,123,119,230,228,189,101,238,156,121,239,189,239, 93,181,202, +208,179,103, 79,245,181,107,215, 72, 69, 90, 93, 60, 90, 52, 77, 63, 18, 90,149,175,161,105, 26, 60,207,215, 73,104,233,116,186, +177, 3, 7, 14, 84,223,191,127,159, 84,228,211,209,209, 17,107,214,172, 49,244,233,211, 71,125,231,206, 29, 82,145,230,224,224, + 96,179, 24,172,248,255, 42,149, 10, 14, 14, 14,184,123,247, 46,233,219,183,175,122,195,134, 13,198,202,233,247,238,221, 35, 67, +134, 12, 81,151,150,150,142,173, 73,188, 84, 12,231,177, 44, 11,163,209,136,188,188, 60,164,167,167, 63,114,167, 27, 20, 14,145, + 99, 70, 13,110,107, 48, 24,244,119,227, 19,210, 90,135,180,244, 48, 24, 12,250,212,180,180,120, 96, 1, 95, 3,247,200, 86,173, + 90,229, 79,155, 54,205, 80, 88, 88,248,220, 66, 75, 44, 22,223, 23, 8, 4,164, 91,183,110,196,108, 54,147,244,244,116,107, 94, + 97, 33, 27,188,116, 41,185, 51,123, 54, 37,139,142,150, 40,149, 74,170,156,147,126,240,224, 1, 47,147,201,238,255,199,133, 22, +205,123,129, 34, 47, 92, 72,208, 58,245, 25, 60, 90, 76,229, 92, 5, 44, 90, 64,226, 12, 72,156, 33, 80,184,162,127,183,118,204, +142,203, 37, 94, 32,124, 23,136, 36,190,181,114, 10,137, 39,192,119,251, 45,222,232,252,194, 75, 51,197, 5, 5, 5, 96, 24,230, +145, 40,146, 43, 20,232, 61,236, 53,250,219,171, 38, 47,128,116, 5,197,248,214,225, 94,255,224,211, 79, 63, 21, 21, 22, 22,130, +166,233,199,156,114, 57,166, 76,153, 34,113,112,112,152,103,115,231,183,191,133, 8, 66, 73, 24, 64,222,137,203, 49, 54, 56,124, +219, 16,244,222,242,237,178, 86,237, 58, 97,242,139, 30,178,229,199,114, 91,221, 76, 55, 52, 6,184,217, 96,205, 29,234, 33,182, +186,169, 84,170, 99,209,209,209,242, 1, 3, 6, 96,213,170, 85, 10,153, 76,118,162, 62, 29,191, 78,203,205, 88,180,225, 7,245, +173,181,253, 0,139,174, 76, 96, 85, 58,114,181, 60, 62,219, 30, 85,108,181,146, 49,182,114, 26, 12,134,241,111,190,249,102,254, +193,131, 7,159, 17, 89, 82,169, 20,201,201,201,248,252,243,207, 11, 10, 10, 10,106,125, 40,174, 89,189, 42, 38,246,230, 89,124, +251,245, 34, 0, 4, 27,215, 76,197,165, 11,123,157, 94,236,209,157, 52,108,216,144,116,234,212, 9,211,166, 77,195,146, 37, 75, + 16, 23, 23, 7, 55, 55, 55, 76,157, 58, 21, 61,122,244,192,234,213,171,107,234,164,250,206,152, 49,227,243,140,140,140,160,223, +126,251, 77,160,209,104, 60, 86,127,243, 77,241,129,226,226,130,101,177,177,113, 31,135,132, 52,159,219,166,205,235, 53,132,126, +168, 82,100, 77,159, 62,125, 79, 70, 70, 70,232,233,211,167,133, 26,141,198,119,250,244,233, 88,185,114, 37,230,205,155,183, 21, +192,100,216,182,224,197,230,126,137, 97,152,200,145, 35, 71,182, 53, 24, 12,250,184,184,184,180,144,144, 16, 15,131,193,160, 79, + 75, 75,139, 63,119,238, 28, 95, 31,206,250, 32, 63, 63, 63,105,247,238,221,241, 51,103,206, 12,205,200,200,104, 1,192,181,180, +180, 84, 81, 90, 90, 42, 49,155,205, 50,103,103,103,231,118,237,218,185, 77,154, 52, 73,121,227,198,141, 22, 25, 25, 25,218,114, + 47, 82,181,176, 88, 44,113,133,133,133,131,250,245,235, 87, 84, 88, 88,136, 54,109,218, 96,240,224,193,240,242,242, 66,131, 6, + 13, 48,116,232, 80, 4, 6, 6, 34, 63, 63, 31, 99,198,140, 41,208,104, 52,253, 0, 60,176,193,220,164,156,156, 28,116,233,210, + 5,139, 22, 45, 26,244,242,203, 47,223,233,214,173, 91, 73, 72, 72,136,222,215,215, 55,120,253,250,245,240,241,241,193,254,253, +251,189, 37, 18,201,238, 42, 68, 86,181, 90, 4,128,166, 92,240,152,159,250,212,212,242,155,173,215, 86,249,183, 13,231, 61, 45, +182, 42, 31,207, 12, 29, 86, 93, 33,192,103,223,239,223, 97, 20,251, 55,131, 99, 80, 91,200,165, 82,200,196, 98,200,156, 93, 97, +226,121,124,147,156,163,215, 17, 50,175,174,141,231,233, 7, 33, 69, 81,216,180,105, 19, 27, 30, 30,110,140,138,138,218,104, 48, + 24,252, 81, 22, 85,214,102, 81,176, 97,195, 6,253,172, 89,179,110,230,230,230,182,149, 74,165,230,138,244,141, 27, 55,234, 95, +123,237,181,216,140,140,140, 80,185, 92,174,175,110,126, 86,101,161, 37,145, 72, 76,185,185,185,157, 38, 78,156,120,255,203, 47, +191,212,201,229,114, 40, 20, 10, 72, 36, 18,115,110,110,110,219,105,211,166,221, 92,185,114,165, 94, 38,147, 65,161, 80,212,105, + 88,142, 16,242,140,160,170,156,110, 43, 88,150,141,202,205,205,109, 59,107,214,172, 27,235,215,175,215, 85, 8,160,202, 54,174, + 94,189, 90,175, 84, 42,235,228,209,170, 56, 79,161, 80, 96,221,186,117,250,153, 51,103,222,204,205,205,109, 43,145, 72,204,149, +210,117, 51,102,204,184,145,155,155,219,150,101,217,168, 26,222,198,184,146,146, 18, 8, 4, 2,196,198,198,154, 68, 34, 17,104, +154, 70, 98, 98,226,163,206,199,197,197,165,101,219,214, 33,193, 63,236,217,127, 78, 38,146, 72,194, 59,117,104,241, 32, 37, 53, +131, 16, 42,165, 22, 83,127, 54, 24, 12,254, 81, 81, 81, 27,195,195,195,141,155, 54,109, 98,171,243,108,217, 2,147,201,116,238, +250,245,235, 86,169, 84, 74,101,103,103,179, 12,195,128,227, 56, 98,234,212,201,212,122,253,122,114,119,238, 92,202, 65,161, 16, +136, 68, 34,200,229,114,234,228,201,147,102,189, 94,127,238, 63, 47,180, 32, 7, 5, 89, 66,174, 73, 37,165, 89, 10,241, 63,151, +137, 44,169, 19, 32,117, 6,164,206,240,241,241,197,213,100,189, 10, 52,196,224,108,136, 33, 70,136, 2, 20,228,177,106,168,132, + 98, 25,149,147,147,243, 72, 16, 85, 28,141,154,181,192,245, 84,173, 18, 20,145,128, 65, 93, 66,144, 12,114,117,117, 21,100,103, +103, 63,195,217,178,101, 75,198,106,181,218, 30,218, 37,139,243, 6,248,233,241, 57, 70,239, 67, 55,117, 65,179,151,125, 43,147, +113, 69, 64,244, 6,180,106,210, 0,179, 95,106, 39,254,228,176,166,213,181, 20,125, 19, 48,100, 50,120,173,123, 29,236,124, 65, +165, 82,157,184,118,237,154, 92,165, 82,225,193,131, 7,232,212,169, 19,182,109,219, 38,151,203,229,199, 1,212,105, 62,222, 21, + 53, 82,181,165, 92,248, 7,251,211,114,110,101,179, 79,136, 44,141,142,224,205, 47, 14, 23, 21,150, 24, 71, 94, 78,175,254,254, +169, 2, 55,138,138,138,250,206,155, 55, 47, 95,163,209, 60, 33,178, 82, 83, 83, 43, 30,138, 47, 2,168,245,229,247,247,179,167, + 66,151, 46,153,133,107,209,119,208,127,208, 59,184,126, 43, 9, 31,127, 56, 12, 78, 14, 50, 68, 69, 69, 97,248,240,225, 88,180, +104, 17, 18, 19, 19,241,227,143, 63, 82,219,182,109,163, 46, 95,190, 76,125,241,197, 23, 84, 45, 83, 26, 94, 93,182,108, 25,174, + 93,187,134, 1, 3, 6,224,252,249,243, 40, 40, 40,192,222, 19, 39, 18,118, 39, 36,124, 92, 49,103,171,154,208, 15, 85,194,193, +193,225,189,101,203,150, 33, 58, 58,250, 17,103,126,126, 62,150, 45, 91,150, 1, 96,106, 93, 68, 86, 93,250,165, 54,109,218, 4, +239,217,179,231,156, 84, 42,149,116,234,212,169, 69,114,114,114, 6,128,148,122,112,150, 60,207, 72, 85, 94, 94,222,159,219,182, +109,187,220,171, 87, 47,249,248,241,227,221,127,249,229, 23, 87,189, 94,223, 64, 34,145,120,152,205,102,241,189,123,247,152, 3, + 7, 14,120,221,189,123, 55,217,104, 52, 94,181,165, 60,114,115,115,175,198,197,197,245,107,211,166,205,189,141, 27, 55,102,120, +123,123,243,147, 38, 77,194,155,111,190, 9,119,119,119,110,221,186,117,105,221,186,117,139, 77, 74, 74,138,208,235,245,183,109, +180,245,187,165, 75,151,254,177,103,207, 30, 12, 30, 60, 24, 95,124,241, 5,246,238,221,139,179,103,207,202, 46, 92,184, 32,222, +182,109, 27, 68, 34, 17,194,194,194,208,183,111,223,222,229,195,157,182, 62,151,174, 81, 20,117,140,162,168,211, 79,125, 94,171, +233,183, 58, 92, 91,221,223, 53,158,247,148,153,219,158, 58,108,199,171, 77,176, 96, 74,136, 74,255,231,184, 48,146, 51,233, 5, +162, 30,221,130, 92,236,225, 66, 38, 54,165,116,227,235, 25,222,193, 96, 48, 60, 58, 14, 30, 60, 72,188,188,188,116, 42,149,170, +206,225, 29,188,188,188,212, 37, 37, 37,164, 99,199,142, 5,238,238,238,143, 66, 17,120,123,123,171,117, 58, 29, 9, 11, 11, 43, +240,240,240,120, 20,222,193,215,215, 55,157, 16, 66, 2, 2, 2,178,170,227, 99,163, 6,249,106, 0, 0, 32, 0, 73, 68, 65, 84, + 89,150,120,121,121, 85,172,208, 19,186,184,184,108,233,220,185,115,129, 90,173, 38,222,222,222,143, 66, 39,184,187,187,175,234, +212,169,211,211,233,181,217,155,158,145,145, 65, 50, 50, 50,136,159,159, 95, 86,229,244,212,212, 84,146,154,154, 74,124,125,125, +235, 28,222,193,221,221,125,101, 21,182,212,203, 70,127,127,127,181,193, 96, 32, 93,186,116,121,162, 76,253,253,253,213, 70,163, +177, 34,221,166,240, 14, 50,153,108,178, 84, 42,205,146, 74,165, 89, 18,137,228,243,134, 13, 27,230,238,219,183,143,172, 91,183, +174, 98, 73, 58,220, 91, 14, 9,111,214,229,245,143,221, 91, 14,125,239,121,194, 59,168, 84,170, 51, 94, 94, 94,186,131, 7, 15, + 62,209,190, 12, 6,131,205,225, 29,100, 50, 89,134, 86,171,229,213,106,181,245,143, 63,254,208, 71, 71, 71,235, 99, 99, 99,245, +201,201,201,134,252,220, 92,139, 90,173, 54, 20, 23, 23,155,110,222,188,105,146,203,255,127,194, 59,144,109,129,205,200,150,224, +195, 73,139, 26,221,157,213, 93,110,188,189,164, 45, 33, 63, 13, 39,228,248,155,132, 68,125, 64,174,110,157, 68,186, 52,146,112, +127,204,241,139, 39, 95, 5, 29,178, 37, 36, 3,217,214,186, 25,217, 18,124, 60, 97, 97,163,187,227,187, 53, 48,126,243,229, 58, +114,229,202, 21, 18, 27, 27, 75, 30, 60,120, 64,142,255,188,143,116,105, 34, 47,227,220, 18,124,184,142, 97, 30,186, 74, 36, 18, +237,154, 53,107,200,229,203,151, 31,113, 30, 62,124,152,200,229,114, 61, 96,219,170,101, 2, 80,100, 75,203, 97,236,151, 65, 23, + 62,233,163, 44,205, 63,250, 1, 33,183,119, 16,178,173, 21, 33,223,117, 38,100,223, 64, 66,142,188, 78, 46,175,123,137,116,109, + 36,178,146,175,130,206,147,173, 45,109,158,108, 47, 20, 10, 75, 14, 30, 60, 72,178,178,178,200,249,243,231, 73,116,116, 52,185, +127,255, 62, 73, 75, 75, 35,199,142, 29, 35, 66,161,208,136,122,108, 91,214,217, 19, 1, 17,205, 69,217, 55,151,119, 37,228,151, + 49, 68,179,251, 85, 50, 40, 68, 85, 16,230,247, 92,241,232,218,185,186,186,230, 29, 59,118,140, 36, 39, 39,147,115,231,206, 17, + 15, 15,143, 60, 0, 54,207,151, 29,212,191, 27, 33,230,155,164,103,247, 16,210,166, 77, 8,233,209,181, 57,201, 76,218, 64, 58, +181,111, 72,182,108,217, 66,212,106, 53,105,216,176, 33,169,171, 97, 17, 17, 17, 87, 8, 33, 49, 3, 6, 12,136, 1,112, 50, 34, + 34, 34,230,225,195,135, 49,157, 58,117,186,140,154, 67, 63, 84,139,222,189,123, 91, 8, 33,100,192,128, 1, 4, 64, 86, 68, 68, + 4,121,248,240, 33,233,212,169,147,185, 62,133,103, 75,191, 20, 26, 26, 26,222,171, 87,175,143, 67, 67, 67,223,179, 37,188, 67, + 45,156,127, 85, 16,106, 6,101,193, 63, 91, 2,232, 80,126,180, 40, 79, 99,158,131,243,117,161, 80,248,141,139,139,203, 89,103, +103,231, 40,134, 97,182, 1, 24,135,250,197, 55,163,203, 61,140,191,186,187,187, 39,182,105,211,198,208,175, 95, 63,210,191,127, +127, 50,125,250,116,194,243, 60,217,183,111, 31, 89,180,104, 17,105,234,234,202,174, 3,242,190, 2,222,128, 29,101, 1, 75,223, +104, 66,157, 27,219, 24,165, 99, 26, 67, 59,161, 41,101, 75,192,210,136,234,132, 22,207,243, 36, 62, 62,158,244,236,217, 83,167, + 80, 40, 50, 97,123,192,210, 39, 56,221,220,220,162, 61, 60, 60,158, 9,162, 89, 41,253,137,128,165, 30, 30, 30,127,122,123,123, +171,221,221,221,175, 87,197,233,230,230, 22,237,237,237,173,118,115,115,123, 34,184, 39,195, 48, 3,220,220,220, 50,159, 78, 23, + 8, 4,189, 60, 60, 60,210,159, 78,175, 38,239,240,242,242, 74,207,202,202, 34, 26,141,134,248,251,251,103, 61, 45,192,114,114, +114,158, 16, 96,182,112,214,102, 75, 13, 54, 86,201,105, 67,153,214,167,222, 43, 16,232,227,227,147,187,122,245,106,162, 84, 42, +159, 88,242, 28,212,125,194,167, 87, 18,180, 37,111,126,184,101, 95, 21, 1, 75,109, 13, 14,218, 79,161, 80,100,246,236,217, 83, + 23, 31, 31, 79,120,158, 39, 60,207, 87, 39,180,170,226,140,236,208,161, 67,126, 94, 94, 30, 87, 90, 90,202,166,167,167,155, 30, + 62,124,104, 88,178,100,137, 69,163,209, 24,181, 90,173,249,214,173, 91, 38,111,111,111, 13,128,200,186,214, 81, 61, 17,241,244, +240, 25,217,218,162, 43,249,170,197,177,251,243, 3,238,189,222, 89, 97,138, 89, 61,128,144,168, 15,200,229, 45,111,146,240, 70, +226, 50, 65,180, 53,248, 4,249, 54,176, 59,217,208, 68,108, 19,231, 55, 77,187,145,173,193, 39,238,126, 22,112,111,120,123,119, +243,158, 29, 91, 73, 98, 98, 34, 57,124, 96, 55, 9,107, 92, 46,178,190,106,241, 43,217,210,162,167, 45,156, 85,137,173,237,219, +183,147,196,196, 68,114,232,208, 33, 91, 69, 86, 68, 85, 66,235,163, 8,101,209,155,157,165,166, 49,237,196,230,161,173, 68,150, +190,205, 68,108,151, 0, 1,215,214,155,230, 91,184,131,244, 13,146,153,200, 87, 65,231,201, 87, 45,250,217,106,167, 88, 44, 78, + 67,165,152, 58, 79, 31, 18,137, 68, 83,131,208,138,168, 85,108, 5, 74,178,207, 44,234, 69, 6,183, 81,229,219, 40,178,106,107, + 75,237,220,220,220,242,190,251,238, 59,226,233,233,169,177, 81,100, 61,226, 28, 50,168, 47, 73, 77, 58, 78, 14,237, 91, 70,122, +118,111, 65,118,110,159, 69,174,156,159, 79, 6,246,239, 73, 34, 34, 34, 72, 94, 94, 30,233,213,171, 23,169,171,157,142,142,142, + 59,181, 90,109,204,169, 83,167, 98, 34, 34, 34, 98,118,238,220, 25,115,241,226,197, 24,185, 92,190,179,194, 57,241,180,216,106, +241,108,255, 31,241,148, 71, 43,166,180,180,148,156, 58,117,138, 68, 68, 68,144,157, 59,119,146,139, 23, 47, 18,185, 92, 30, 83, +223,251,200,214,126,169, 79,159, 62,159, 38, 39, 39,151,124,246,217,103,251,170, 8, 88,106, 43,103,226, 95,100,231, 95,210,135, +252, 63,112,170,100, 50, 89,204,205,155, 55, 73, 97, 97, 33, 9,241,244, 36, 75, 25,134,100,136, 68, 36, 75, 36, 34, 91,128,130, +255, 2,153, 52,169,186,161,195,191, 27, 85, 10, 45,163,209, 72,230,204,153, 99,150, 74,165,122,145, 72, 84,215, 45,120,254,213, +141,208,205,205,237, 79, 79, 79, 79,181,167,167,231, 19, 98,175,114,186,155,155,219,245,255,242, 27, 48, 80, 36, 18,165, 10,133, +194, 39,183,224,105, 57, 36,188,105,215,241,243, 60, 91, 13,233,255,156,118,138, 68, 34,209, 71, 82,169, 84, 63,103,206, 28,179, + 86,171,173,139,208, 2,128, 62,114,185, 60,243,251,239,191, 55, 36, 36, 36, 88, 11, 10, 10,216, 43, 87,174, 88,163,163,163,205, + 11, 22, 44, 40,149,203,229,153,168, 62, 44,193,127,164, 60,201,134, 38,226, 10,177,117,123, 94,192,253,193, 33,114,203,182,119, +251,146,240,134, 79,137,172,234, 35,185, 87,205, 89, 46,182,110,124,226,127,191,103,160,146, 93, 54,111, 54, 9,107, 44,123, 82, +100,213,129,243,105,177, 37,151,203, 75,231,207,159, 95, 23, 79,214,147,130,240,155, 32,127,178, 53,120,103,153,136,170,229,216, + 18,244, 53,217, 20,228,255, 79,185,143, 58,123, 34,160,119,160,228, 78, 29, 60, 89,182,216,217,206,217,217,249, 94, 29, 60, 89, +143, 56, 55,109,218, 72, 94, 29,221,135, 36,221, 59, 72,180,249,199,201,245, 75,107,200,136, 33,161, 36, 44,172, 19,217,186,117, + 43,137,139,139, 35, 29, 59,118, 36,245,176,179,239,148, 41, 83, 98, 30, 62,124, 24,243,224,193,131,152,139, 23, 47,198, 12, 27, + 54, 44, 6, 64,223,202, 35, 65, 21, 98,203, 50, 98,132,169, 29, 77,207,174,133,243,149, 41, 83,166,144,135, 15, 31,146, 7, 15, + 30,144,139, 23, 47,146, 97,195,134, 17,212,109,251,158,122,245, 75,161,161,161,225, 61,123,246,156,215,190,125,251,254,127, 21, +231,255,160,208, 82, 12, 31, 62,156,231, 56,142,244,239,223,159, 91, 15, 20,109,163, 40,245, 54,138, 82,111, 5, 52,255,237, 30, +173,191,123,195,207, 8, 0,167, 43, 39, 72,165, 82,181,209,104,116, 87, 42,149, 63,107,181,218,153, 40, 91, 22,249, 92,156,127, +135,157,118,206,255, 10, 78,111,165, 82,185, 81,171,213, 14,147, 74,165, 26,163,209,232, 89, 7, 78, 39,137, 68, 50, 91, 42,149, +246,212,235,245,129, 0,160, 80, 40,226, 77, 38,211, 89,131,193,176, 22, 64,209,255,119,222,201,134, 38, 98,136,197, 29, 64, 48, + 55, 38, 77,215,120,217,169,130,128,119,123, 57,167,117,105,170, 72,134,144,255, 2,148,233, 42,245, 70,170,169,206,156, 50,170, + 19, 56,225,220,171, 41,250,134, 95,252, 86, 26,240, 94, 79,101, 90,151, 38,202, 52, 16,124, 1,137,254, 82, 93, 57,159, 22, 91, + 10,133,226,123,157, 78,247, 22,128,179,117,205, 59,217,223, 66, 4,157,213, 7, 86, 38, 4,164,134, 45,124, 8,209,131,102, 98, +145, 3, 53,181,224,158,197,126, 31, 85,205,249,229,151,155,201,233,223,142,195,164, 47, 64,118,110, 9, 94, 29, 55, 1,237,218, +133,194,205,205, 13, 75,151, 46, 69,179,102,205,176,104,209, 34,170, 30,118,246, 85, 42,149,175, 6, 7, 7, 55,185,123,247,238, + 3,189, 94,191, 11,192,175, 79, 63,127,130,129,158,114,129,160,173,129,101,207,223, 3,162,107,225,124, 69,169, 84,190, 23, 28, + 28,220,234,238,221,187,119,244,122,253,106, 0,123,237,125,221,191,131,147,166,233,181, 1, 1, 1, 35,146,147,147,231, 2,216, +131,255, 33,252,199,133,150,157,211,206,249, 47,228,172,184, 79,200, 63,205,206,199, 98,139,159, 9, 10,141, 65,168, 12,136,248, +117,181,136,172,218, 57,101, 84, 39,176,130,119, 64,193, 15, 4, 57, 32,244,218, 90, 68,214,127, 86,100, 2, 20, 22,212,208,127, + 45, 0,161,170,175, 47,123,155,175, 2,159,126,250, 41, 57,121,242, 36,228,114, 57, 12, 6, 3,250,245,235,135,197,139, 23, 83, +246, 62,196,206,249, 31,228,252,175,132,192, 94, 4,118,216, 81, 43,200, 63,213, 48,234,237, 7,102,178,191,197, 53,228, 49,115, + 64,163, 49,192,166, 66,199,230, 80,111,167,154,159,147,243, 10,242,168, 89, 96, 16, 8, 49,155, 4,173, 57,135,154, 90,127,206, +191,225, 13,145, 96,193, 63,183, 94,254,141,120, 90, 84, 69, 71, 71,219, 11,197, 14, 59,108,199, 36, 60,185,210,240,209,119,187, +208,178,195,142,127, 57,168,151,239, 89, 0,100,148, 31,255, 88, 78, 59,236,176,195,142,255, 65,193, 5, 10,213, 79,104,171,139, + 75,176, 62, 19,237, 78,219, 57,235,197,201, 0,112, 4,224,132,178, 24, 36, 21, 75,122,107, 11,179,209, 31,128,213, 94,158,118, + 78, 59,167,157,211,206,105,231,252,127,230,172,141,251,223, 56, 36, 89,213, 42,195,109,255,137,127, 28, 97,231,252, 75,209,239, +191, 38,239, 4,109, 65,176,174,252,104,107,175,119, 59,167,157,211,206,105,231,252,159,231,252,175,132,125,232,240,223, 5,233, +191,214,114, 66,188, 1, 84, 4,185,140,133,145, 10,134, 20,179, 0, 0,165,184, 78, 8, 18, 0,132,148,255,158, 78, 81,117, 94, +141,106,135, 29,118,216, 97,135, 29,255, 95, 8, 5,112, 29,128, 55,128,129, 0,142,161, 60,170,194,255,171,208,146,185, 54,247, +134,128,110, 67,241, 36, 24, 0, 8, 77,221, 7,203,223, 50,228, 39, 60,247, 67, 86,217, 32,208,133, 64,188,159,130,249,101,109, + 86,252,115, 7, 67, 11, 9,116, 24,225,233,166,122, 53, 39,191,248,251, 59,113,218, 95,234,114,173,163, 99,128,163,212,197,249, + 37,147,197, 26, 34, 22,137,210, 44, 69, 37,219, 10, 11, 31,148,214,195, 12,151,154,126, 92,176,128, 80, 71,179,175, 83, 34,185, +133,118,117, 16, 81, 90,104,137, 54, 91,201, 55, 42, 74, 38, 7, 14,188, 76,234, 90, 55, 20,141, 23, 21, 42, 85,123,137, 84,222, + 73,174,114,110,206, 19,160, 64,157,153, 98,182,178, 23, 57,179, 62,134,240,248,189, 14,117,245, 26,128,101, 0,128, 94,189, 78, + 35, 4, 14, 88, 91, 97, 56,166,246,186,141,215,162,162, 80, 17, 92,246, 35, 0,203,235, 96,174, 19,128, 0, 0,197, 33, 33, 33, +250,216,216, 88,205, 95,213, 70,159,167,222,107,130, 68, 34,149, 89,173, 22, 11,199,113,207,189, 49,181, 68,238, 48,255,153,237, +149, 40, 26, 70,109,225,194,231,225, 21,185, 6, 14, 42,239, 60, 30,193,146, 31,191,192,222,159,218, 97,135, 29,118, 84, 43,180, + 6,162,108,200,176,246,201,240, 1, 45, 95,184, 38,149,202, 26, 1, 0, 79, 8,120, 2,232, 74,138, 98,114, 30, 68,247, 3, 0, +183,134,161,167,132, 82,135,246, 60, 41,251,157,227, 1,214, 98, 76, 46, 73,189,210,209, 22,139, 20,238,129,195,123, 69,244, 30, + 49,104,208,192,160,214, 33,173,155, 2,192,237,216,219, 73, 71,143, 30,139,139, 58, 77, 29,212,105,226, 15, 61,151, 3, 5,210, +197, 29, 58,180,123, 33, 58,250,250, 34, 0,211,159,183, 4, 93, 93,149, 51,127,253,105, 78,247,222, 35, 86, 41,128,186, 61,112, +165, 46,206, 47, 13, 29, 28,217,238,253,183,167,208,111,206, 89,218,232,218, 31,191,175, 80,122,183, 42, 34,188,245, 87,157,122, +244,133,154, 54, 78,126, 90, 63, 86, 39,176,118, 21,156,164,215,125, 23,238,108, 40, 72, 26, 77,120,110, 52, 69, 81, 96,196,242, + 3,238, 77, 94,216,231,244,226,187,133, 0,108, 94, 49,230,224,221, 50,194,195,219,247,224,232, 9,179,165,114, 71, 79, 1, 24, + 17, 0, 10, 89, 41,247, 16,181,119,153,243, 59, 11,183,135,254,113, 43,149, 61,243,211,102, 35, 37, 18,142,208,103,223,173,125, + 60, 61, 53,213, 9, 1, 1,101,127,127,253,245,167,104,212,248, 54,202,230,154, 1,107, 80,252, 67, 22, 66,128, 50,161,149,146, + 2,103, 91,109,237, 55, 96, 84,159,180,212,132, 69, 89,153,105,191,208, 2, 1, 95, 88,172,123,215,213,213, 67,155,159,159,219, + 19,229, 19,185,221,220,220, 20,121,121,121, 22, 0,150,255,100,189,191,244,198,226,175, 15,124,247,233, 91, 85,253, 54,237,157, +197,107, 3,124,157, 20,111, 79,159, 88,229,134,220, 61, 34, 39,190,127,238,228,246,149,181, 10, 98,133,106,254,200,183,230, 45, +120,177, 87,223, 39,210,175, 92,186,136,221,155, 62,133,174,180,126, 98, 75,228, 26, 56,232,149,133,191, 28,153,212,191, 33,180, +102,130,189, 81,169,176,154,205,248,105,233,168,235,150,252,248,163,246, 62,213, 14, 59,236,176,227, 9, 28, 43, 23, 87,199,158, +254,161, 90,161, 37,149,202, 26, 93,254,253,168,203,161,139,233, 0,128,136, 80, 47,124,188,100, 99,223,157, 27,162,227, 0, 32, +188,215,160,192, 69, 31,189,141, 63,239,228,130, 16,130,118,205, 92,209,127,232,203,182, 9, 15,207, 22, 29, 95,122,105,228,216, + 57,115,222, 27,146,152,152,152,178,103,207,158, 11, 0,208,173,123,247,102, 75,151, 46, 29,181,202,217, 69,242,227,129,159, 50, +141,234,123,215,234,147, 91,105,131, 38, 62, 65,205, 27,191,250,227,183, 27,233, 23,251,141, 28,147, 2,221, 50, 99,214,131, 76, + 91,174,117,115,115,155, 37, 20, 10, 29,129,178,221,216, 31,189,201, 91,136, 23, 0,176, 28,175,114,110, 16, 84,202,136,164,156, + 68, 34,186, 91,170,213,126, 95,146,121,239,155,154, 56, 77, 86,107,171,119,166,190, 65,223,120,144,143, 70,173,186, 49,235,150, +125, 2,158,179, 58,207,254,104,201, 75,209, 87,126,132, 78,141,115, 54,102, 77,248,116,130,143, 79, 24,179,120,153,178, 15, 69, +225,245,128,240, 9,195, 22,237, 56, 32,236,208,204, 1, 38, 43,143, 19, 49,249,225, 91,214, 46, 94,249,199,150,129, 71, 0,108, + 5,112, 6, 64,173,162,206,197,213,101,215,172,121,107,149, 58,243, 99, 47, 73,185,200,194,215,223,239,199,205,116, 30,193, 65, +193, 2,175, 89, 43,148, 91,151, 76,218,161, 47,219,103,171, 42,185,219, 4, 64, 87,224,190, 11, 38, 47,236,141, 31,150,127, 14, + 15, 15, 29, 84,170, 52, 80,240, 4,208,188,252,196, 4,113, 30,210, 1,124,148,155, 11,197,162, 41,232,119, 3,248,176, 45,144, + 11,224, 15,170,166, 93,227, 9,187,236,157,185, 43, 67,220, 27,135,116,138,141,203,196,229, 99,155,161,201, 73,117, 42, 44,204, +251,222,175, 89, 91,162,112,116, 15, 45,202,121, 8, 7, 39, 60,164, 8, 55,180,184,184, 48, 7,128, 77, 94, 36, 47, 47,175,249, + 62,254,157,187, 87,212,187, 75, 64,187,194,138,223,104, 70,176, 43,239,225,181,183,107,186, 62, 32,120,240,196,101,155,187,245, +188,127,243,212,254,180, 7, 49, 23, 89,171,197,212, 60,168, 77,135, 55, 94, 31, 51,234,126,166, 91, 91, 77,145, 9, 55,111,223, +105,183,124,249, 23,203,239,196,222,190,173, 82, 57, 57, 55, 14,108,219, 57,184,205,128, 49, 5,102,151, 38,182, 8, 45,150,229, +224,234,213, 4, 66,169, 10,190,158,142, 40, 42, 53, 65,103, 98,225,230,213, 24, 44,251,124,206,178, 54,173,188,113, 45,195,140, + 7,241,233,240,242,116, 65,122,154,198,222,149,218, 97,135, 29,118, 84,141,108, 60, 57,249,125, 91,173, 66, 11, 0,148, 50, 1, +226, 30,230, 0, 0,156,100,192,204,201,227,145,159,167, 9, 52,179, 60, 38,140, 31,135,235,247,179, 17,151,172, 1, 33, 4,129, +190, 54,111,194, 13, 6,124,135, 9, 19, 39,244, 56,245,235,175, 87, 63,157,247,233, 15, 20,133, 75, 0,176,117,219,215,225,159, +205,255,236,173,113,227,199,245, 57,112,224,192, 29, 0,245, 18, 90, 2, 74,181,113,229,242,207,197, 25,121, 70,227,172, 57,115, +249,247,222,157,181, 14,192, 72,155,148,140, 80,232,152,145,145,161,164,233, 39,247,210,252,226,243,185,231,251,140, 88,149,144, +146, 86,116,227,212,225,195, 29, 91,182,108,137,140,204,156,174, 43,214,127,213,246,196, 41,217, 27,165, 37,134, 17,250,188,123, + 85,110,218, 44, 17, 10,239, 44, 92,177,165, 29,239,212,140,254,248,173, 1,104,213,180, 1, 50,115,139,208,189,223, 16, 65,204, +181,107,125, 1,155,133,214,211,193, 3, 95, 50,243,185,109,151,126,127,165,247,176, 46, 13, 58,208, 52, 3,173,193, 10, 77,177, + 9, 28, 15,116,107,225,136,200,157,235, 5, 5, 58,235,240, 37, 63,165, 15,191,180, 97,144,218, 88,156, 53, 3,192,193, 90,252, +129, 46,190, 30, 14,136, 75, 47,173, 82,100,233,140,101, 15,112, 17,195,129, 2,113,173,129,168, 43,128,239,128, 96,224,183, 25, + 99,225,233,185,199,211,211,243, 37, 15, 79,175,152,192,177,111, 80, 62,141, 90,168,180, 6, 11,238,222,185, 93,218,178,125, 44, + 41, 45,200,157,109,212, 21, 30,184, 7,196, 6, 3,251,202, 57,222, 64, 13, 66, 43, 33,225, 94,209, 27,175,244, 20,220, 72, 42, +197, 3,133, 2,173,186, 12, 67,177, 38, 67, 24,249,198,194,206,134,210, 98,169,171,103, 0,238,253,185, 31,154,180,196,118, 70, +179,233,144,139,127,120,207, 35,223,125,104,174,205,187,229,229,229, 53,127,242,228,201, 11, 52,217,247, 23,247, 25,177,170, 77, + 74, 90,209,141,177, 11,207,118,156, 54,188, 25, 78,220, 42,193,231, 19,123,190, 10,160, 70,161,197, 8, 8, 39, 85,122, 53, 26, +241,202,140,185, 13,220,165,115,229, 50, 26, 78, 10, 49,126,189,146,139, 31,127, 77,135,149, 37, 8,107,211, 60,112,230,251,107, +119,120,187,138,145,157,103, 70,166,198, 8,117,158, 17,218,124,189,201,166, 6, 65, 81,200,213,228,227,216,145, 99,160,132, 82, + 80, 52, 5,171,197, 2, 1, 77,131,162,159, 63, 30,241,119,223,158,197,165,173,131, 17, 62,249, 8, 90,134, 52,180,119,165,118, +216, 97,135, 29, 85,163,218, 85,135, 2, 0, 56,122,244, 40, 25, 52,104,208, 51,189, 50,199, 17,196, 37,151, 77,193, 97, 24, 6, + 3, 95,104,134,117, 43, 22,194, 96,102,113,243, 97, 49, 14,253,153, 14,179,174, 8,132, 16,228,181,242,168,234, 31, 63, 49,164, +180,106,153, 44,148,145, 8, 71,255,113, 69,209,208,197,217,217, 57,225,206, 15,186,207,222, 85,183, 16, 16, 75,204,146, 47,154, + 61, 20,185, 8,186,236,223,191,175,229,224, 65,131,196, 74,165,234, 3, 34,104,235, 43,212,145,247,138,139,111, 21, 87,199,249, + 52,100, 30,193, 67,134, 12,140,236,229,229,229,201,143, 93,122,229,254,198, 25,161,254,205,155, 53,239, 26,103, 53, 12, 49,228, + 38, 28,174,230,178, 71,156, 60,207,131,166,105,168,213,106,112, 28, 7,147,201, 4,171,213,138,244,244, 20, 53, 79,136, 47, 7, +158,246,246,246,133, 64, 32, 70,163,134, 1,216,178,110,153,124,231,143,135, 59,125,248,233,226, 95,244,121, 8,195,227,224,150, +143, 56,141, 5,133, 7,142,159,252,213,157, 32,170,193,199,111, 13, 96,114, 11,181,136,186,150,136,235,119,211,235, 90,145, 79, +135,112,104,152,153,154, 88,178,106,213, 42,102,209,137,196,244, 94,253, 71,114, 1, 77,219, 52, 52,113, 4, 0, 5,137, 72, 0, +145,128, 70,128,187, 20, 63,207, 13,193,149,161,183, 60,251,134,186,175, 37,132, 28,172,169, 60, 77, 38, 43,247, 66,176,130,105, +219,196, 17,183,146, 10,113,245,196, 37,204,154,183, 22,209, 15, 77, 40,213,234, 65,113, 38, 48,196,132,188,212, 7, 96, 57,142, +212, 86,239,101, 8, 45, 4, 0,137, 68,242,209,161, 35, 39, 27,152,120, 41,114,138, 76, 80, 23,154,208, 44,108,132, 34, 53, 83, +131,239, 22,142,250, 8,192,129, 96,160,212, 6, 78, 9,128,158, 41, 15,227,173,102, 51,199, 27, 45, 28,221,202,223, 17,223,252, +118, 13, 33, 61, 95, 49,138, 25, 70,166,114,116, 3, 8,208,170,251, 43,184,250,203, 38, 40,105,166,189,204, 65,210, 22,192,213, +154,218, 82,133,200,154, 63,127, 62,166, 79, 30, 5,158, 16, 33, 7,158, 6,128, 47, 15, 37, 34,160,145, 71, 77,117,244,120,187, + 24,142,166, 44, 22,130, 82,173, 21,154, 34, 51, 84, 82, 1,226,211,116, 72, 76,213, 98, 84, 63, 31,140,232,237, 13,142, 39, 24, +247,193,117,140,236,235,141,177,131,124, 1,138, 66, 94,161, 25, 38, 51, 87,109,222,105,154,110,204, 48, 76, 40,199,113,215,203, +190, 51,224, 0,148, 20,230,193,100, 50,129, 97, 24, 56,187,184, 3,160,158, 56,151,231,249,135,182,222, 71, 21,240,112, 87, 34, +124,242, 17,120,184, 43,109, 57,253,239, 88,146,109,231,180,115,218, 57,255, 71, 56,171,211, 34,255, 18, 84, 27,202,129,174,233, +170,164,244, 2,196, 61,204, 65,251, 96, 31, 52,109,232,141,171,241,133,216, 21,149,142,237,167, 82, 17,117, 83, 3, 94,160, 66, + 78, 9,144,144,162, 70, 66,106, 94,173,241,179, 25,137,112,244, 59,239, 20,207,105,221,178, 36,236,247, 19, 51,225,227,158,208, +242,195, 15,139,102, 50, 18,225,104,103, 63,213,158,185,115,102,191,170,146,203,197,102,147, 25, 77, 26, 7, 72,223,158, 49,243, + 13,202, 89, 98,243,158, 72, 42,159, 22,206, 18,153,236,155, 37, 11, 62,144,172, 61,148,144,166, 51, 67,119,240,146,250,193,123, +115, 63, 43, 16, 8,165, 91, 84, 62, 45,108,158,251, 99,181, 90, 97, 50,153, 96, 54,155, 97,177, 88,144,153,126,111,200,153, 67, +239,247,107,236,231,210, 79, 34,149,130, 0, 40, 49,176,120,152,173, 71,207,222,125,152,246,161,161,173,148,222, 45, 38, 86,197, + 85, 92,156, 90,204, 19, 70,117,244,231,221,204,190,223,110,224,135,163,215,240,203,217, 27,184,122,238, 4, 75,120,235,163,253, +191,148,222,205, 2,149,222,173, 83,149, 13,218,168, 31, 29, 62, 33, 53,134,103,102, 24,154,244,236, 29,113,122,242,244,183,127, +215,151,230,231,126,179,113, 97,166, 38, 43,229,158, 68, 68,177,114, 9, 3,173,145,197,142, 51, 89,120,105,217, 77,220, 77,211, +130, 16, 82,235, 6,222, 60,240,238,232,137,239,115, 86,139, 5, 65,254, 74,236,222,182, 28, 67,122,182, 69,175,214,206,232,216, + 84, 1,185,192,132, 59,247,227,176,119,247, 14,150,231,233,247,106,185, 17, 35,203,143, 24, 0,208,106,181,239,127,248,193,123, + 26, 51,203,195, 98,229, 97, 41,255, 60,179,247, 11, 13,103,212,191, 95,126, 93, 76,165,235,170,187,153, 55,188, 57,237,195,158, +223,236, 58,221,231,224,249,108, 90,157,111, 65,212,201, 3,240,246,107, 2, 17, 67,203, 64, 1,160, 40,128,162, 64, 8,129,123, + 64, 11, 24,121, 30, 63,125,245,137, 15,106,152,175, 86, 33,178, 38, 77,154,132,123,247,238, 61, 81,239, 73,137,201, 72, 74, 76, +198,233, 83,151, 1, 0, 46, 1,237, 10, 93, 2,218, 21,186, 53,238,184,181, 42, 46, 51,103,229, 13, 44,135,156, 34, 35,228, 82, + 26,254, 62,114, 12,239,229,141,141, 31,183,193,216, 1, 62,200, 80,235, 49,105,241, 77,120,122, 10,241,243,249,108,108,216,147, +132,230, 1, 10, 12,235,213, 0,175, 15,246,173,218, 91, 43, 16,244, 23, 10,133, 99,134, 13, 27,190, 80, 34, 85, 44,155,177,120, +215, 2,153, 68, 80,225,141, 5,195, 48,176, 90,173,160,105, 10,163,103,109, 92, 32,145,171,150, 13, 27, 54,124,161, 80, 40, 28, + 35, 16, 8,250,215,181,231,232, 63,176, 3,104, 99, 46,250, 15,236, 96,127, 95,181,195, 14, 59,236,168,217,163, 85,113,120, 63, +209,111, 87,119,133,209,104, 72, 30, 57,122, 28,188, 61,188,148, 67, 95,124, 93, 20,147, 84, 4, 77,118, 42, 18,227, 99,161, 55, + 90, 33,114,110, 12, 72,189,208,176, 81, 0,110,197,253, 98,217,176,242,152,150,103, 77,201,213,241, 13, 25,226,237,155,120,159, +162, 87,174,240,191, 28, 31, 87,216,126,247,188,239, 48,118,172,210,109,229, 10,255,203, 41, 15, 20,180, 92, 74,186,188, 49,126, + 12, 69, 83, 4, 31,126, 56, 7, 67, 7, 69, 98,194, 27,175, 81,223,127,191, 35,172,200,198, 92,242, 16,110,250,232,147,133, 98, +117, 17,107,190, 26,175, 53,201, 21, 50,217, 31, 9, 90, 93,171, 70,254,178, 1, 35, 94,207, 58,182,255,155,181, 0,198,219,194, + 85, 33,176,172, 86, 43, 44, 22, 11, 0,112,101,222,131,178,207,252, 82, 51,114,139, 76, 80, 23,153,192,114, 60, 70,140, 30, 47, +187, 22,125,115, 60,128,106,230,107,241,188,149,181,226,224,111,215,145,121,237, 0, 79,209, 76,113,165,201,240, 80,122, 55, 11, +244,242,242, 63, 63,104,196,107,238, 98,105,217, 48,108,169,206,132,239,191, 90, 81,163,157, 52, 69, 17,158, 99,139, 88,171, 85, +215,164,113,147,204,224,150,109,165, 23,127, 63, 53,228,143,211, 7,181,108,147,215,156,146, 82,178,193, 8, 37, 96, 68, 82,152, + 44,182, 45, 60, 84, 39, 94,222, 12,128,154, 56,109,206,186,217,239,127,204,188,187,225, 2,204, 70, 61, 76, 6, 29, 74,138, 11, + 33, 19, 88,113,231,207,195, 44,225,172,179,117,217, 55, 54, 87,207, 68,101, 1,200,170,156, 82, 80, 80, 16,245,231,133,243, 71, +174,252,121, 97,130, 87,147,246,180,217,202, 35, 49,246, 10,159,153, 16,125,196,100, 42,137, 2, 0, 10,200, 7,112,170, 38,199, +165,202,193,201,113,194,244,247, 39, 58,201, 20,116,108, 70, 17, 82,179, 75,192,201,124,224,229,219,244,241,248, 42, 95,150,223, + 78, 65,238,232,219,118, 20, 46,222, 78,227, 78,237,219,220, 7,192, 97, 0,250,154, 68, 86, 76, 76, 12, 68, 34,209, 19,245,222, +180, 89, 35, 84, 12, 29, 22, 21,204,116,218,177,242,117, 0, 64,175, 23,186, 79, 2, 48,249,153, 23,149,156, 18,184,154, 89,116, +110,225,130,160,198, 74,100,230,155, 65, 40, 1,246,159,201, 67, 66,134, 14,191, 93,213,192,219, 69, 12,222, 76,131,145, 0, 7, + 47,102,226,226,157, 60,140,235,239,135,251, 15, 11,170, 17,214, 76,232,187,239,205, 89,180,126,253,134,179, 35,167,173,124,169, + 91,104, 19,148,148,106,145, 89, 96,133, 86, 87, 10,157, 86, 7,153, 92, 14,137, 88, 12, 70, 32, 64,255, 55, 62,127,233,248,119, +159,252,254,238,123,115, 22,173, 89,189,234, 51,150,101, 79,216,251, 67, 59,236,176,195,142,191,213,163, 53,169,114, 90,181, 66, + 43,245,238,197,142, 0, 16,216,161,111,190, 82, 42,112, 17,208, 20,212, 25, 73,248,126,213, 44,240, 60,193,128,183, 86, 66,213, +200, 11, 50, 17, 3,147, 54, 95, 91,144,116,174,166,185, 58,160, 40,107,159,205, 91, 51, 27, 77,155,218,196, 97,247,110,173, 16, + 0,118,239,214, 10,167, 78,241,115,248,114,107,114,163,206, 47,180, 7,225, 56, 12, 26, 58, 18,163, 95, 25,141,148, 28, 61,126, + 58,159, 6,157,193,108,211,106, 57,153, 91,112, 91, 55, 87,247,200,119, 94,143, 84, 8, 24,138,106, 30,224,200,164,107,172, 44, +195, 8,185, 35,215,138,179, 70,140,120,197, 45,234,248,190, 94,156, 91,112, 91, 67,222,253,155,181,241,153, 76,166, 39,134, 14, + 93,220, 26, 31,239, 51,114, 85, 70,118, 78,233,177,156, 66, 99,103,157,149,133,186,200,132,220, 34, 19,138,116, 22,120,169,156, +193, 90,205,173,171,227, 35,132,252, 48,108,228,184,215, 0,208, 20,205,126,167,205,190, 31, 95,246,203, 99,145, 21, 57,116,172, +251,249,152, 36, 36, 70,159, 40, 36, 60, 91, 22,197,157,226, 51,106, 46, 87, 16,134, 2, 47, 18, 80, 86,134,166,121,139, 69,107, +245,240,112,143, 58, 23,117,114,176,145,125, 0, 70, 36,121,116,174,225,201,225,168,218,196,214, 38, 0, 88,191, 97,221,234, 46, +125,198,138,206, 93, 79,134,193, 10,132,135, 6,226,231, 31,191, 54, 17, 98,125, 95,151,125, 99, 83, 29, 26,161,147,159,159,223, + 44,161, 88,220, 75, 38, 87,249,185,123,251,211, 22,150,131,197,202, 65,225,234, 67, 75,148, 46,125,120, 90,116,145,181,152,163, + 44, 58,205,122, 0,213,234,235,223, 46,223,237,245,213,250,213, 47,121,187, 42,224,231, 38,194,145,115,133,156, 85,192,211, 30, + 1, 65, 20, 0,248,123, 56,224,238,245,223,113,235,214,109,180, 14,143,132,171,202, 23, 74, 17, 71,242, 18,255, 40,240,244,242, +105,167,206,201, 20, 61, 45,180,188,188,188,230,143, 27, 55,110,129,183,183, 55,214,173, 91,247, 40,189,114,189,135, 0,157, 43, + 15, 29,126,121, 40,177,198, 12,191, 49,168, 33, 94,104,235, 1,158, 7,222, 94,123, 11,177, 73, 37,216,246, 81, 40, 70,244,244, +193,214, 95,146,209,166,185, 2, 90, 3, 15,139,153,131, 72, 76,163, 69, 99, 37, 36, 34, 6,103,175,231,161, 84,167,171,145,155, + 98, 36,232,211, 51, 28,121, 69,122,184, 59,138,209,216,207, 29, 74,121, 99,148, 26, 88,164,230, 20,163, 88,103, 69, 94,161, 14, + 93,195, 59,225,215,157,226, 58,245, 22, 21, 43, 14, 1, 32, 61,187, 4,188,212, 3,185,121,122,120,120, 59, 3,101, 75,152,237, +171, 14,237,176,195, 14, 59,170,246,106, 1,149, 98,104, 61, 33,180,142, 30, 61, 74, 0,160,170,241,209, 76,117, 1, 92,149, 2, +184, 55,104,132, 87,103,173,198, 15,107,223, 5,199, 89, 65, 8,192,114,182, 69, 38, 32, 68,248,219,244,169,141,130, 27, 54, 98, +220, 95, 29, 43, 55,236,218,173,151,189, 58, 86,110, 8,105,237, 90, 60,125,106,163,228, 82,163,127, 87,150,227,240,199,157, 92, +196, 38, 23, 35, 54,165, 4, 74,153,237, 97,190, 24,177,104,234,138,229,203, 68, 2,134,162,238,164,106,181, 25,249,172,150, 17, + 10, 45,114,153,152,152,137,192,148,146, 71,242,123, 15,123,195,112,100,231,250,137, 0,102, 84,235, 21, 43, 95,105, 88,225,201, +170,248, 36,132, 16, 10,224,121,138,227, 50,242,140,208, 90,172, 80, 23, 62, 22, 90, 20, 91,253,200,169,210,187, 89,160,131, 74, +121,146, 97, 24, 9, 33,128,213,194,142,130,119,179,126,218,236,196,248,202, 34,235,242,157, 44, 36,221, 56,173,230, 44,250,113, +250,220,184, 51,182,230,157,162, 64, 24, 6, 60, 67, 83, 60, 69,129, 23,210,196, 12, 66,248,167, 45,210,215, 65,104, 85,136, 45, +177,144,153,247,235,222,181, 30, 19, 6,182,192,143,231,203, 52,159,177, 84, 83,162,203,172,147,200,130,171,171,235,248, 15, 62, +248, 96,254,144,145, 99, 81,108,164,160, 46, 44,243, 6,154,173, 60, 68, 10, 55,244,153,254,173, 95,182,166,196, 47,241,234,145, +174,121, 55,118, 23, 91,141,197,235,170,181, 43, 41,235,170, 65,175, 67,137,161, 44, 63,115,198, 7, 49,159,110,254, 13, 44, 17, +192,197,221, 7,238, 14, 34,188, 62,170, 63,206, 7, 52,196,189,251,247, 49,111,225, 49,120, 58, 57,196, 94,250,253,112,211,208, +176,110,107,142, 31,218,243,140,136,203,201,201, 89,184,115,231, 78,180,109,219,118, 65,251,246,237,145,147,147, 83, 33,144, 31, +213,123, 82, 98,153,195,182, 66,104, 93,191,126, 11,161,161,109,170,205,115,235,166, 14, 56,112, 54, 11,223, 30, 77,129, 76,194, +160,145,143, 20, 83, 87,220, 64,207,118,110,152,249,114, 99, 40,101, 1, 40, 42,181,194,108,229, 97, 48,177,200, 47,177, 32, 51, +223,136,116,181, 1, 22,107,205,115,225, 9, 8, 98,227, 51, 96, 50, 25,225,236,236, 12,165,220, 8,169,147, 63, 0, 6,133,234, +226,178,213,135,122, 35,228, 50, 73,189, 68,214,230, 55,155,225,118,182, 21,223,125,123,253,209,100,248, 94,253, 66, 49,125,211, +233,249,155,103, 68,216,227,105,217, 97,135, 29,127, 11,106,210, 34,255, 34,175,214,179, 30,173,154, 50, 68, 8,144,144,154,135, +134,190,238,240,109,216, 20,241,247,110, 85,234,236, 1,150,179,109, 56,234,240,225,236,140,213,171, 29,248,119,223, 45, 14, 95, +177,194,255,210,212, 41,126,142, 33,173, 93,139, 63,248, 32, 45,124,205, 26,199, 75,191, 93, 22,114,164, 60, 94, 87, 69,108, 46, + 66,234, 18, 99,147,238,212,182,101, 99,102,225,238,132,180, 51,183, 75,115, 69, 34,145,213,203, 89, 74,169,148, 98,134,161,133, + 98,147,149, 54, 5,182, 10,101,142,208, 84,104, 77, 44, 21, 66,235,233,161,195,124, 77,210,144, 95,127,154, 19,242,226,176,149, + 46,153, 26, 3,138,205,204,163,161, 67,134,166,112,251, 94, 42,192,136, 98,171,226,116, 80,185,156,218,179,235, 7,255, 53, 43, + 62,135,133,229, 48,253,221, 79,241,198,248,113,167,224,221,172,159,127,163,160,152, 11, 71,190,147,247,155,178, 5,169,113,209, + 57,172,169,100,111, 93, 68,214, 35,177, 5, 16,142,240,116, 65, 97,137,210,196, 66,138, 42,116,159,201,194,215,171,229,104, 13, + 44,142, 92,201,193,209, 67,123,225,168, 82,212,139,195,209,209,177, 69,247,238, 61, 64, 9,196, 48, 91, 77, 48,179, 60,204,149, +230,104, 89,172, 60,172, 68, 8,185,119, 27, 20,220,253,185, 5,140,197,213,114,189,246, 90,223,130,150,173,219,239,255,228,221, +183, 94,126,249,213, 9,232, 28,246, 2,226,110,253, 9, 79,191, 96, 40,157,220,200,165,228, 66, 54, 60,216, 95, 48,126,104, 71, + 42,202,183, 9, 26,181,232,130,132,187,215, 90,139, 68,162,219,105,137,247,171, 29,146,204,201,201,169,136, 57,181,160,125,251, +246, 72, 75, 75, 67, 65,165,122,111,218,172, 17, 0, 32,254,126,217, 34,134, 10,145,197,243, 85,183,211, 73,203,110,160,196,192, +193,205, 89, 12,134,162, 1, 66,208,208, 91,134,232,132, 2,140, 91, 88,136,176,150, 46,240,247,150, 3,132, 64,107,180,194,108, +230, 97,225, 1,179,145, 5, 67, 87,187,100,144,227, 56,142,163,137,149,185, 30, 27, 15,177, 72, 8,199, 34, 29,100, 50, 25, 68, +162, 60, 80, 52, 13,150,229, 97,177, 90, 97,208, 27,176, 63,250, 50, 8,103, 97, 56,142,227, 80, 62, 12,106,171,200,218,118, 34, +229,137,201,240,126,222, 14, 72,207, 46,177,139, 45, 59,236,176,227,111,193,191,120, 34,124,101,113, 85,189, 71,171, 38, 4,248, +122,226, 74,108, 50, 90, 7, 55,134,163,131, 10,247,147, 50,192,208, 66,208, 20, 96,101,109, 23, 67,196, 98,253,113,205, 26, 71, +164, 38, 43,232, 47,183, 36, 55,154, 62,181, 81,242,154, 53,142,151,136,197,250, 35,128,113,132, 0,101, 98,171, 76,112,113,117, +208, 5,132,183,250,121,186,200,153,232, 7,186,124,154,102, 76,174,142, 82,222,213, 81, 66,187,170,196, 66,145,144,225, 89, 66, + 91,124, 61, 26, 25, 9,207,219,178,175,222, 19, 67,135, 28,199,129,162,104,174, 92,136, 41,210,243, 13, 40, 54, 50, 80, 23,153, + 80, 88,106, 65,115, 31, 5, 78, 71, 29,208,115, 86,195,238, 42,189,109, 66,145, 99,211, 70,190,248,120,241, 26, 24, 76, 28, 18, + 50,181, 16, 73, 36, 94,158, 94,173,110,142,155, 54, 87,242,246,182, 36, 76,236,229,138,119, 47, 36,101,234,213,210,185,117,169, + 89,142,227, 96, 48,154, 69,234,188, 66,231,146, 82,157,131, 76, 42, 49,184,187, 56,230, 85,117,174,177,142, 30,173, 10,200,165, + 2, 12, 14,243,130,209, 50, 6, 6, 19,139, 63,207, 28,172, 15, 77, 99,207, 6,190,208,154, 43,137,171,114,177, 85, 89,116, 9, +149,238, 0,168,198,181,101,251,238,237,152, 81,119,111,199, 44,186,118,233,220,158, 21,223,156, 9,217,185,233, 51,108,252, 37, + 9, 12,195, 80,196,202, 10,215,255,146, 12, 95, 39,134,104,173, 66,202,200, 81,208, 21,104, 16,212,169,127,171, 61,155, 63,153, +139,178,144, 17, 38, 91,196, 86,161, 58,250, 81,189,159, 60,241,104,221, 2, 10,111,238, 40, 74, 58,187,177, 76,226, 51,130, 3, + 85,171,118,139,217,195, 81, 76, 56,214,194, 87,142,104,229, 40,163, 64,120,224,218, 29, 53,174,199,211,112,117, 16, 65, 41, 19, +194,202,242,208,155, 89, 24,140, 28,205,179, 22, 83, 53,245,125,125,253,186,181,159,141, 25, 51,102,234,222,125, 11, 14,183,141, +190,165, 46,106, 0, 0, 32, 0, 73, 68, 65, 84,124,103, 72, 73, 81, 62,132, 98, 25, 68, 2, 17,104,134, 6,203,113, 48, 27,117, + 40, 44, 42, 64,242, 31,223, 31, 30,253,242,240,208,245,235,214,126, 86,177, 74,209, 22,145, 53,125,238, 14, 44, 95, 56, 30,101, + 1,247,203, 48,119,254,247, 24, 63,253, 21,187,216,178,195, 14, 59,236,168,222,155,245, 12,108, 18, 90, 74,185, 20,132,145,226, + 66, 76, 18,130, 90,182,193,142,195, 87,209,172,117, 24,178, 75, 89, 16,208,181,174, 54,172,192,156,143, 12,215, 1, 92, 31, 50, + 68,238, 59,124,184, 79, 31, 66,132,191,109,217, 90,146, 1, 0,141, 67,202,104,120,158,128, 16,128,240,101,130,203,118,151,142, + 32, 53, 57,187,164, 97, 35, 47, 5,238,102, 88, 76, 10,137,136,118, 86,136, 25,119, 71,177, 72, 36, 16,128, 35,148, 41, 59, 59, +201, 68, 1, 41,182,208, 61, 61,116, 40, 87,122, 31,239, 61,108,165, 38, 37,173, 56,186,121,129,190,109,177, 69, 12, 66,128,230, + 62, 10,196, 94, 62,198,169, 51, 19, 19, 12,234,184,175,170,246,146,129,177,176, 60,110, 62, 40, 70,145,206,138, 34,173, 5, 93, +123, 14, 22,117,141, 24,130, 11,177,121,224, 89, 43, 86,124,125,172,148, 35,214,209,192, 61,107, 29, 50, 77, 95,185,126,199, 87, + 83,168,147, 8, 5,130,162,224,102, 1, 15,197, 34, 33, 91, 82, 82, 34,126,242, 44, 6, 10,153, 24, 5, 90, 43, 0, 88,235,218, +122,138,117, 86, 28,190,156,131, 35, 7,247, 64, 38,147,129,212,163, 5,138, 68, 34, 39,161, 72, 10,139,174,108,184,176,226,176, + 60,117,208, 2, 9, 64, 11,156,108,164,189,103, 54, 27,254, 76,142,187,220,130,235,217,140, 25, 31,209, 8,175, 77,154, 13,159, +166,173, 49,120,240,112,180,105,164,162, 14, 94, 74,131,213,202,150,122, 53,105,165, 34,101,171,108, 19, 0,180, 5,112,217, 22, +207,150,170, 82,189,183,232,218,164,237, 99,161, 5, 20,164,222,168,113, 21, 43,103,206,207,212,155,105,154, 16,190,202, 87, 6, + 33, 0, 98, 6,212,217, 4, 57, 0, 4, 52, 32, 96,104,128,162, 24,142,227,170,172, 39,150,101,127,229,121, 94,189,107,215, 46, + 53,199,113,215, 99,142,173,190,217,244,197, 41, 11,192, 22,192,106, 45,155,206, 40,150,200,193, 83, 52,146,206,127,187,128,179, + 24,126,217,181,107, 87, 69,120,135,219, 53,137, 44,103, 23, 57,194, 39, 31, 65,167,176, 32, 44, 95, 56, 30,191,222,122, 82,175, + 47, 95, 56, 30,171,191,253, 19,185, 26, 45, 60,220,149,232, 49,121,251,252,115, 91, 39,218,197,150, 29,118,216, 97,199,147,123, + 28, 14,172, 44,190,108, 18, 90, 28, 79,224,230,234, 2, 43, 17, 32, 89, 93, 12, 29,229, 1,163,158,128,227, 40,112,132,212, 20, +106, 60, 2, 85, 44,207, 63,124, 56, 59, 3,192,246,167,124, 82,143, 60, 89,143, 62,171, 30,146,169,146,147, 34,220,233,195, 39, +126,127,121, 72,183, 94,206,247,179,115, 50, 68, 66, 90, 32, 16, 49, 66,145,128,166, 68, 2,218,236, 32, 19, 48, 7,182,238, 21, + 19, 10,191,215,198,105, 52, 26, 17, 17,241,228,198,228,113,119, 46,121, 20,228, 38,152, 9,197,243,238,226, 82,184, 57,186,227, + 97, 74, 26,206,156, 56,168, 87,103, 38,198,113, 38,227, 80, 60, 41, 57, 31,115, 18,194, 23, 20,155, 96,180,112, 40,212, 90, 80, +164,179,128,117, 15,199,207,127,102, 65, 42, 98,160,190,121,192,160,201,201,152,101,202, 77, 76,174,165, 42, 62,196, 19,177,180, + 72,198,155, 19,198, 11,215,174, 90, 97, 10, 13,109, 79, 10, 10, 10,160,213,106, 31,151, 9, 69, 65,234,224, 1,149, 76,128,196, +107,199,145,120,102,141, 1,192, 39,182,148,103,101, 56,200, 5, 24,210,217, 11, 38,203, 24,228, 21,155,112,237,247,159,107,107, + 50,207,112,202,229,114, 89,133,247,170,114, 88, 7,115, 37,175, 22, 87, 94,223,180, 64, 34,171,130,179, 15,128,223,158, 78, 44, + 41, 46, 62,118,253,210,233,169,198, 73,175, 65, 93,100,130, 33, 63, 9,223,255,252,213, 25, 75,105, 66,207,190,107, 87,209,179, +135, 54,197,153,235, 5,170,219, 2, 6,224,129,200, 49,115, 94, 58,185,103,213,206,218,242, 94, 33,182,122,116,235,184,128,102, +168, 35,132,122, 44,150,178,178,178,108,202,123,177, 58,177,220,131, 84,167, 49,112, 80, 20,205, 16,254,137, 61, 16,159,176,147, +231,249,219, 21,162, 73, 64, 81, 67, 85,114, 57,242, 52,197,168, 8,178,107, 52,148,194,197,173, 1,104,138,130,181,210,185, 53, +213,145,179,139, 28, 81,167, 30,207,199, 82, 56,200, 80, 88,160,199,222,249, 67, 23, 2,192,240,143, 15,204,255, 21, 64,174, 70, + 91,105,206, 86,179,167, 35,237,214,218,150,234, 1, 59,167,157,211,206,249,191,195,249,111,198, 51,123, 28,214,193,163, 69,208, +196, 91,129,102, 62, 10, 24, 45, 30, 48,154, 57,232,140, 28, 74,244, 22,148,232,173, 72,206,209, 35,246,240,243, 91, 88,230,197, + 42, 11,125, 78,202,226,109,130,227,137,205,222, 19,177,197,188,120,245,138,165,163,246,134,182, 51,191, 61,208,219,239, 86,178, + 57,139,162,104, 3,205, 8,172, 46, 42,129,240,254,253, 91,154, 75,231,143,119,151,178,220,107,250, 26,120, 88,150, 45,246,241, +241,169,120,160, 61, 74,111,209, 84, 54,244,143, 99, 31, 54,238, 49,100,133,251,218,207,231,232,105, 70,196, 83, 2, 81, 44,103, + 53,236, 49,168,227,182,160, 6,191, 30, 45,146,222,187,114,227,110,152,147,139, 31, 18, 51,117,208, 25, 89, 88, 88, 30,206, 74, + 17, 50,110,159,178, 36,223,143,222,167,205,186,181,163, 30,197,182, 59,254, 94,172,111,100,100,191,145, 97, 97,225,204,103,159, +125,138,160,160, 32, 24, 12, 6,208, 52, 13,191,134, 77,145, 28,127, 3,151,143, 45,230,244,249, 41, 95, 1, 88, 4,160,206,251, +168,228,149,152,113, 34, 58, 23,199, 14,253, 8, 70, 40,174, 79,245,210, 50,153, 76, 90,149,184,170, 44,186, 30,157, 44, 20, 75, + 81,230,125,226,159,104,136, 85,227,100, 82,252,221,123,175,191,250, 74, 11,149,163, 19, 6, 12, 31,157,123,233,194,153, 65,135, +190,223,186, 46, 63, 37,125,212,167,203, 54, 56,244,233,224, 77,185, 40,197, 40,210,241,216,157,122,175, 9,108,244,193,230,228, +228, 44, 76, 79,142, 30,247,199,177, 15, 7,247, 24,178,194, 61,250,167,121,143, 38,209,211,140, 96, 87,109,215, 23,164,199,156, +169,171,200,170,144, 90,132, 16,155, 6,206, 9, 0,161, 72, 12, 15, 15,111, 80, 20, 96,101,121,152,173, 44, 4,117,172,167,156, +236,226,103,130,147,238,157, 63,116, 97,133,183,234,208,210,151, 48,252,227, 3,243, 43,159,115,239, 78,186,189,107,181,195, 14, + 59,236,120,140, 73, 79,125,218,230,209, 50, 26,141,201, 47, 68, 12, 6,207, 19,112, 4,224,185,114,207, 19,255,216,251,196, 89, +141,201,207,107, 29,207,115, 87, 55,109,219, 62, 32,180, 83, 15,166,165,191, 18, 37,249, 57,184,252,199, 89, 22, 60,185,100,203, +245,249,249, 9, 90,153,103,179,145,163, 94, 26,190,127,252,132, 41, 69,221,123,246, 84,120,120,120,153, 50, 50, 51,244,223,238, +220,101, 61,117,252,151,238, 60,216, 87,242,243, 19,181, 53,241, 20, 23, 23,175,175, 42, 93, 34, 86,118, 5,208,152, 17, 80,102, +131, 38,161, 78, 51,194,243, 50,211, 71, 44, 93,188, 32,101,236, 91,179,197, 77,124,154, 34,183,152, 65,114, 70, 14,238,159,255, +197,148, 25,127,237, 80, 73,198,245,137, 54, 82,101, 87,145,150, 1, 96,237,229,203,151, 90, 69, 70, 70,246,235,213,171, 23,153, + 52,105, 18, 8, 1,206,108,155, 74, 10,146, 47, 31, 40,247, 98, 61,168,103,189,164,158,191,116,195,229,229,238, 29, 4,174,170, +137,216,254,227,113, 43, 8,159, 90, 71, 26, 79, 95,255,134,130,178,225,194,178,144, 14, 79, 31,102,235,227,249, 99, 34,165,167, + 64,143, 88,207,106,242,251,140,214, 72,140,191,219, 58, 49,254,238, 4, 0,185,251,119,125,125, 4, 0, 76, 6,195,148,168, 51, +135, 83,239,222,137,126,109,200,171,239, 53,109,213,182,163,224,192,142,181,176, 24,117, 7, 1,216,220, 94, 37, 98, 38,165,162, +222,107, 27, 42,124,166,222, 83, 46, 31,167,104, 70, 96,171,104,170,228,137,164, 9,207,219, 52,161,142,240, 28, 50, 31,220,134, +139,151, 63, 84, 42, 71,240,196, 2,152, 77,208,164,199,129,227,108,223,235,176,176,160, 20, 46,158,238,104,217,174, 25, 10, 11, +244,216, 60, 35, 98, 97,229, 33, 65, 75,126,252,130, 10,177,213,178, 93, 51,220,187,147, 14,205,131,187,246,110,213, 14, 59,236, +176,163,146,168,170, 10,181, 10,173,244,123,101,241,180,254,110,148,230,228,142,219,177,227,135, 37, 63,236,220,219,213,104, 54, +251, 16,136,210, 57,214,124, 78,203,225, 51, 91, 57, 12,234,196,104, 87,215,230, 33,223,126,189,233,147,111,183,127,217, 3, 60, + 23, 76, 1, 41,132,194,239, 82, 43, 55,190, 54,145, 85,227, 67, 51,175,116,107,159,145,171, 12,249,249,218, 31,234,122,173, 33, + 63, 46,135,102, 44,126, 91,215, 45, 94, 73,211, 76, 95,142,227,133, 60,103, 77,228, 44,198, 47, 12,154,184,195,176,121,150, 27, + 10,106,248,237, 14,128, 59, 81, 81, 81,221,162,162,162, 58, 1, 88,143,178, 61, 20,163,159,167, 94, 76,249,165,189,223,159,243, +254,153,247, 64, 5,240, 60, 1,203,241,169, 34,131,190,119, 29,105,252,154, 52,105, 42,183, 88,185,103, 38,192, 87,158, 8,255, + 72,104, 57,250,202, 1,248,217, 40,180,128,178,213,116, 95, 63,147,200,178,203,179,179,210,127,220,242,197,172,201, 0, 26, 1, +184, 8, 96,211,127,170,222, 45,198,146,188,191,251,190, 97, 45,166,133, 25,183, 14, 35,235,142,200,155, 18,148,133,114, 32,156, + 25, 60,107,206,102,173,150,133, 54,217,153, 31,127,244,220,214,137, 11,159, 74, 91, 80,197,121, 11, 14, 45,125, 9,181,157,103, +135, 29,118,216,241, 63,234,205,218, 86,213,119,193, 63,197,194,194,194, 7,165, 40,172,121,147, 94, 91, 61, 91, 0,158, 89,185, +167,127, 78,222,216,132,146,159,144, 80,242, 83,125,175,215,229, 62,212, 0, 15,199, 63,167, 25,182, 76,100,191, 80,126,252, 37, +200,203,187,167, 67, 30, 58, 63,111,181,236,222,181,243,254,222,189, 63, 10, 9,205, 8,121,194,136, 88, 66, 9, 89,158, 18, 90, +173, 60, 76, 22,171,213,194,178, 86,112,172, 5, 60,103, 37,188,197,138,178,232,240,127, 5, 82, 1,124,244,255, 85,239,255, 9, +176, 86,203, 66, 88, 45, 0,116,245,230,176, 85, 48,217,133,149, 29,118,216, 97, 71,157, 4,215, 63, 71,104,217,241, 95,141, 7, + 73,137,241, 97,246, 98,176,195, 14, 59,236,176,227,191, 92,100, 85,254, 4, 80, 54,247, 60,162,154, 11,234,178,154, 32,162, 30, + 6,157,182,115, 62, 55,167, 16,128, 24,128, 18, 64,109, 67, 91,253, 80, 75,192,202,127, 72,222, 63, 4,112,195, 94,239,118, 78, + 59,167,157,211,206,249, 95,203, 89, 27,183,125, 53,227,223, 44,192,236,156,118, 78, 59,167,157,211,206,105,231,180,115,254,239, +113,254,155, 49,169,138, 3,128,125,232,208, 14, 59,236,176,195,142,255, 65,184,186, 54, 87, 2,143,230,245,214, 10,185, 91, 11, + 79, 0,208,231,221, 83,219, 75,207,142, 42, 80,121,159,195, 39,230,104,209,245, 36, 20,210, 2,241,251,114,149,235, 61,133,163, +107,230,255,120,225, 82,129, 13, 21, 51,251,116,111,244,115, 80, 99,217,208,186, 92, 40,119, 15,252,206,171,105,231, 52,133, 71, +224, 76,120,135,202,158,199, 8,133, 71, 99,119,165, 95,135, 63, 84, 62,173,250,255, 13,121,148,180,108,217, 50,188,101,203,150, +225, 0, 36,127, 5,161,220, 35,112,140,111,179,176,243, 30, 77,218,157, 85,120, 54,127,233,175, 54, 88,233,221,204, 85,233,215, +254, 39,101,131, 54,133, 74,239, 54, 37, 74,223,246,231, 84,110, 45,154,212,118,157,223,144,165,193, 11,247,196,238,241, 27,178, + 52,184,170,223,157, 35, 55,168,230,239, 77,248,220,117,240, 23, 74,123,191, 82, 63,248,117, 29,227,228,221,227, 61,215,186, 94, +231, 19, 24,118,167, 97,171,110,185, 13,154,119,142,181,245, 26,223,160,240,235, 1, 45,187,170,125, 3,195,163,237, 37,111, 27, +164,238,141,195,165,206,254,199, 36,206,254,199, 37, 46,141,123, 62, 47,159,183,183,183, 44, 56, 56, 56, 50, 44, 44,108,114,239, +222,189,223,105,215,174,221,164,128,128,128,190,255,159, 47,250,114,143,192,143, 76, 66, 42,207, 36,164,242,228, 30,129,181, 46, +150, 81,120, 4, 45,161,104, 46,139,162,185, 44,133, 71,208,146,127, 74, 93, 73, 60, 3, 3,228, 30,129,107, 84, 94, 45,175,202, + 60,154, 15,174,235,245,206,206,206,125,221,221,221,135, 85, 28,206,206,206,125,237,119, 64,189, 81,217,139,245,220, 30, 45, 70, + 40,145, 95, 28, 59, 97,122,200,242, 5,115,165,235,182,255,140,117,159,207,185,107,210, 21,181,252, 39,230,220,173,113,167,104, +134,102,124, 43,167,113, 60,151,145,247,240,106,135,191,130, 63,168,161,108,226, 39, 31,140,123,119,204,168,136,128,136, 65,179, +168,184,135,134, 95,108,151,104,104,187,239,167, 67,126,231,127, 63,187, 97,251,246,109,139, 52,108,208, 26,161, 68,176,169, 36, +253, 78, 81, 93,108,112,112,111,210, 88,160,112, 59,255,194,208,233, 94, 49,167,119,237,224,204,124, 31,125, 94,165,221,191,235, + 15,247,166, 77,155,118,100, 24,198,117,230,204,153, 34, 0, 88,187,118,109, 51,142,227,242,147,146,146,174,161, 30,193, 79,203, + 4,102,208,184,245, 43, 23,254,208,191,255, 0,100,229,233,176, 98,205,230, 23, 79, 30,221,247,178, 78,157,112,224,175,168, 19, + 39,167, 70, 14, 16,169,110,207,250, 96,145, 71,228,139, 29, 25,173,145,197,201,243, 55,186,237,218,188,232, 42,208,162, 83,105, +222,189,106, 99,138,241,250,226,121,158, 74, 18,201,235,139, 1, 96,204, 51, 15,123,165, 53,194, 93,198, 69,122, 75, 4, 55,242, +129, 90, 55,125,116,106,216,245,148, 80, 34, 9,160,105, 26, 52, 5,208, 52, 5,134,162,202,246, 9,181, 24, 82, 51,239, 95,232, +247, 79,184, 79, 84,254,157,114,192, 8, 92,105,234,177,125, 20, 93,254, 73, 72, 73, 78,194, 69,215,191,224,223, 56,134, 52,115, +106,213,181,153,238,219,115, 15, 11, 20,130,238,239, 28,163, 8,253,101,218,133, 53, 55,109, 18, 0, 82,169,243,145, 35, 71,220, + 35, 35, 35, 29, 61, 90, 13, 61,103,203, 53, 98, 70,219,242,232,209,195,162,200,200,126,117,104,159,129,125, 64,211, 59, 41, 64, +200,243,100, 45,195,147,125,218,252,248, 36,160,110,187, 79,201, 60,130, 38,210, 32, 54,247, 51, 60,168,104, 67,110,220,246,250, + 22,174, 64,226,208, 91, 40, 18,189,211, 56,176,117,104,102, 74, 98,180, 78, 91,186,134, 53, 21,159,171, 51,145,149,125,255,244, +133,152,254, 2,161,144,138,236,221,153, 49, 1,103,159,167,210, 61, 61, 61,135,109,220,184,177, 73,120,120, 56, 0,128,101, 89, +135,253,251,247,123, 45, 94,188, 88, 17, 31, 31,127,176,158,180, 62,238,238,238,254, 98,177,216, 7, 0,204,102,115,166, 70,163, + 73, 3, 80,235,139,191,194,179,137, 27, 8, 22, 93, 56,127, 94, 0, 0,221,186,117, 95,226,255,194, 12,103, 70,164, 52, 84, 89, + 28,230, 82, 69, 81,210,217,217,151,175, 92,162, 0, 32,172,115,248, 92,185, 91,139, 77,255,159,158, 45,169, 71, 80,103, 26,120, + 55,172, 91,196,136,209,175,140,163, 91, 53,247, 71,223, 62,189, 62, 52, 0, 71,234,212,102, 4, 2,217,213,171, 87,155,210, 52, +205,176, 44,107, 12, 11, 11, 75,123, 30,187, 26, 4,134,255, 73,129,246,179,176,230,175, 53, 15,162,151, 0,207,108, 28,195, 56, +250,133,126, 2, 70,240, 22,207,243,233,165,105,209, 93,254, 11, 61, 90,207,150,115, 93,153,104,129,248,157, 49,111, 76, 11,153, +253,222,199,210, 89,235,162,112,108,243,220,188,127,170,200, 2, 0,134,102,124, 79,253,122,202, 67, 46,102, 0, 0, 90, 35,139, +254,145,145,181, 63, 17, 26,118,250,157,166,168,160,138,173,196, 57,214, 34, 21, 8,197, 70,170, 76, 32,129, 2,224,214,160, 97, +148, 39,123, 81, 62,102, 84, 68,192,206,189,191,101,164,101,228,215,185, 83,163, 24, 17,194,186,247, 69, 68,159,126,142, 87,175, +252,185,104,219, 87, 91, 62, 98, 45,214, 45,188,149, 95, 99, 44, 72,204,170,181, 51,247,106,222, 94,172,116, 59, 57, 98,242, 98, + 87, 35,237,130,207, 62, 95,239,118,254,196,238,115,153,233,109,249,212,212,116, 35,161,168,187,133, 5,217,239,232,114,146,226, +108, 45, 50,165, 82,217, 68,169, 84,182,109,211,166,141,116,206,156, 57,194, 23, 95,124,241,177,100,159, 52, 73,244,251,239,191, +123,175, 90,181,106,192,173, 91,183,140, 90,173,246,166, 86,171,125,128, 58, 76,180,247,242,114,159, 49,114,248, 96,244, 26, 49, + 29, 28, 79, 97,210,180,217, 56,117,226,224, 20, 0,127,137,208,178,202, 29, 22,191, 53,121,142,123, 88,199,118,204,162,221,113, +144,137, 5,232,215, 33,136,122, 99,230, 60,167,237, 27, 22,125,131, 60,244,168,202,147,197,235,139,231,133,184,153, 95, 25, 18, +222, 24,135,247,152, 95, 65,239, 15, 64,203, 29,151,164, 31,254,248, 62, 0, 52,137,156,169,146,112,154,141, 13,156, 24, 15, 9, +167,217,216, 36,114,230,233, 7, 39, 55,150,214,100,139, 80, 34, 9,216,179,123,119,115,103,149, 8, 2,154, 2,195, 80, 16, 48, + 52,140,102, 14, 47,143,122,229, 47,107,230, 50,143,230, 3,232,178,205,178,193, 3,223, 25,114, 19,142,215,165, 78, 40, 70,228, +122,244,240, 33,129,135,163, 4, 12, 67,129,161, 1,134,166,144,162, 54, 96,226,196, 55, 28,159, 87,176,247,239,234,209,241,253, +209, 65,253,194, 66, 92,218,252,120,137,114, 12,235, 63,218, 53,207, 40,127,125,239, 47,103, 95, 33,221,102, 95, 33,132, 95,153, +113,113,253,175, 53,145,152, 76, 38,117,191,200,254, 14,148, 64, 33, 63,253,243,142,238, 2,154,130,149, 35, 96, 57, 2,174,124, +111, 84,170,252, 13,134,166, 41, 16,158,224,173,183, 38,162, 95,100,127, 61,207,242, 25,182,119,114,244,206,147,167,255,112, 55, + 89,121,172,218,184,125,145,174, 88,179,232,225,125,215, 20,109,113,222,108, 67,110,130,205,251, 96,208, 32, 29,210, 31,196, 78, +222,125,244, 50, 66, 90,182, 0,199,151,217, 25,228,171,192,238, 99,151, 17, 28, 20, 92,102, 55, 79, 16,232,167, 68,199, 14, 29, +129,103,182, 38,179, 85,100,169, 62,235, 49,112,220,194, 65, 47, 79,128,135,187, 59,104, 98, 29,116,250,216,238, 65,223,125,185, +242,125,214, 88,178,170, 78,100,132,123,244, 92, 32, 60,255,220, 94,167, 6, 13, 26,184,119,236,248, 56, 28, 35,203,178,104,212, +168, 17, 50, 51, 51,131,234,243,158,230,237,237, 61,112,254,252,249, 30, 3, 6, 12, 16,122,121,121, 1, 0,114,114,114,124, 78, +158, 60, 25, 58,127,254,252,220,236,236,236, 99,168, 33,162, 15,103,165, 69,180, 0,140, 84, 42, 47,203, 35, 40,122,206,140,215, +218,120,122, 55,168,114, 35,119,141, 38, 71,252,193,244,179,148, 64, 32, 42, 63, 31, 52, 33, 60, 85,131,151, 40, 66, 40, 20, 86, + 57, 66, 97, 97, 28,194,136,208,241, 77,154,161,203, 26, 43,107,213, 20,166, 93,111, 81, 7, 79, 92, 43,161, 88,180,101,228,232, + 9, 93, 94, 26, 49, 20,222,238,142, 56,125,241, 22,166,204,120,215,202, 90,172,107,234,213,121, 48,140, 32, 55, 55, 55,197,217, +217,217,235,249,159,183, 84,227,223, 78,157,240, 56,125, 38,106,238,234,117, 27,166, 90,204,172,149, 39,228,209, 62,198, 50,153, + 68,216,103,208, 40, 7,143,166, 97,210, 13,243,223, 20,254, 23,122,180,182,253, 37, 66, 75, 44, 83,141,250,244,131,153,210,197, +187, 46,227,216,230, 41,121,250,146, 60,247, 71,111, 10, 14, 78,215,117, 37, 69,161,245,177, 80,233, 30, 24, 78, 49,130,201, 20, +195, 40, 40,154, 18,243, 28,159,206,154,205, 75, 12,249, 9,217,207,155,123,158, 39,248,233,207,220,186, 9, 32,130,102, 59,127, + 60,228,225,233, 36,129,209,194, 97,244,152,113,248,225,135, 31, 84,238,142, 98, 24,205, 44, 86,174, 94, 93,170, 77, 57,230,145, +146, 94,152, 25, 49,248,221, 95, 31, 36,231,198,166,101, 27,247,213,213, 54,147,133, 67,137,158,133,222, 68,163,121,171,142, 88, +185, 38, 88,154,150,250,240,221, 29,223,125,243,246,221,187,204, 15, 60, 67, 47, 52,102,223,171,114,175, 19,185, 87, 72, 63, 7, +103,215, 61,195, 39,127,238,148,144, 43, 0,129, 5, 73, 14, 82,140,122,253,109,135, 38, 94, 50, 40,164,140,211,195,212, 76,239, + 57,239,191,127,241, 1, 71, 58,149,104, 30, 60,172,205,158,134, 13, 27,142, 24, 52,104,144,252,189,247,222, 19,250,249,249,225, +187,221,251, 3,186,245,123,121,112, 86,182,218,143, 16, 2, 79, 15,143,244,183,222,120,249,200,241,227,199, 83,211,211,211,133, + 43, 86,172,232,124,232,208,161,150, 57, 57, 57, 54,191,153,114,132,192,104,226,192,149, 63, 32, 53,197,166, 58,235, 83, 31, 31, + 31, 73,102,102,166,169,146,151,129,122,236, 40,164,250,245,238,209, 89,176,245, 68, 50,180, 70, 14, 10,169, 16,201,106, 61, 58, +180,107, 77,125,205,177,109,171, 34,156, 56,106,224, 60, 79, 37,137, 28, 18,222, 24, 30,206,114,124,187,233,115, 28,190,244, 48, + 82,173,165,176,145, 48,147,189, 37,130, 62, 10, 62,123,227,139, 29,154,122,245,106, 31,128,107, 29,154,122,157,143,137,139,151, +189,188,122,102,166, 86,120,186,240,228,219,165, 85,119, 60, 52, 92, 84, 34,108, 63,149, 10,185, 84, 0,133, 84, 0,133,164,236, +147,166,169,231,123,171,245,110,225,199,240,220, 68,134, 17, 76,124,101,212,203, 13,198,190,242, 50, 1, 67, 99,255, 79, 71,134, +238,218,181, 51,219,106, 49,127,195,209,204,246,234,218,207, 19, 5, 74, 3, 30,142, 98,188,255, 77, 44, 28,100, 66,168,228, 66, + 56,200,133,232,213,198, 29, 12, 93,111, 19,157,167, 12,109, 50, 96,202,240,134, 61,131,252,149,205,111, 38, 21,223,157,184, 36, +122,221,239, 69, 61,223,217,180,182,165,171,182,200, 44,248,108,206, 91,130,140,172,172,158,251,143,156,235,197,153, 39,196,177, + 22,221,199,154, 91,251,171,244, 10,103,196, 93, 10,245, 9,123, 73,106,209, 90,111,223,140,203,104, 90,104,146,224, 78, 74, 9, + 20, 82, 1,148, 21,101, 43, 21, 64, 33, 21, 66, 41, 21, 32, 43, 35, 25, 5, 58,230, 98,166, 43,221, 19,231, 46,177,117, 49,220, +104,225,112,227,161, 22, 13,131,218,193,219,187, 1,204, 3, 94,109,120, 37,234,167, 95,174,158,251,121,153, 62,231,254,199,182, +242,236, 62,122, 25,115,103, 79,142,161,128,235,229, 15,233,208,207,150,111,110,191,104,238,244, 39,210,230, 44,220,208,190,254, +158, 44,213,188, 94,195,167, 45,236,214,103, 56, 74, 11,212,248,243,215,125,232, 55,104, 36, 94,157, 48, 11, 78, 78,110, 43,215, + 44,249,224, 38,107, 42,137,122,166,207,245, 10,126,161,117, 72,139, 93, 62, 13, 26,248,241,124,217, 46, 31,132, 0,218,210, 98, +124,240,206, 91,224, 9, 65,219,208, 78,189,164,221,250, 16, 82,190, 27, 72, 94,126,158, 46,238,254,221, 8, 99,110,220, 21,155, +203,210,104,180,106, 52, 26,220,184,113, 3,241,241,241,184,115,231, 14,242,243,243,225,232,232,168,213,233,234, 20,251,205,161, + 77,155, 54, 99,163,162,162,164,206,206,143, 55,105, 48,155,205, 80,169, 84, 24, 59,118,172,176,111,223,190, 62, 3, 7, 14, 28, + 31, 27, 27,187, 27, 64, 73,149,246, 20, 36,102,169, 60,131,190,234,241, 98,143,169, 0, 32,115,240,126,184,241,187, 35,119,106, +124,161,117,108, 16,208,165, 75,215,166, 32, 4, 20,200,122,125,126,124, 78, 13, 94, 34,197,229,203,151,155, 48, 12, 35,120,252, + 12,226,241,229,183, 63, 6,255,118,225,246,136,229, 43, 87, 73, 29, 20, 18,104,138,205,120,243,213,225, 54, 63,131,101,158, 65, + 3,186,116,233,254,203,162,133,159, 10,148, 10, 5,126,189,242, 0, 51,223,121,223,152,157, 18,187,138,240,194,205,122, 77,124, +238,115, 62, 42, 9,254, 2, 52,247, 85, 66, 53,164,159,116,202,107, 67,164,102, 43,135, 34,157, 21, 38, 11, 7,142, 39, 40,214, + 89,113, 55,173, 20,110, 14,117,223,202,141, 16,210, 17,128, 59, 0, 13, 69, 81,215, 42,127,175,120,161,171,208,198, 79,125,207, + 43,127, 62,184, 2, 48,163,108,165,254,163,230, 83,254,189,186,244,138,235,239, 2,104, 81,206,201, 1,184, 74, 81, 84, 97, 53, + 98,235, 25, 47,151,224,232,209,163,100,208,160, 65,143,122,252,167,191, 63, 13,137, 72,216, 64,225,232, 14, 66,238,129,162, 30, +159,230,225,229,147,191,106,205, 58,151, 25,211, 38,167,150, 20, 21, 4,148, 39,159,182,229, 97, 33,160,152, 53, 61,186,134,245, +157, 58,109, 26,130,154,248,138, 56,142, 35,177,241, 15,173, 59,182,127,251,250,249, 75,226,117, 37, 25,177,243, 42,185, 32,235, +180,236,147,227,185,140,167, 61, 88, 28,207, 61,253,118,251,236, 38,213, 20,224,164, 20,227,171, 19,201, 32, 4,160, 64,224,168, + 16, 98,239,239, 25,120, 24,115,176,100, 80,219, 18,221,216,229, 11,122,245, 28,240,118,212,221, 36,227,190,220, 92,227, 41, 0, + 57, 53,113, 86,221,161,243, 48, 89, 56, 88, 89, 22, 7,142, 28, 65,100,175,206,232,210,165, 51,186,119,235, 34,136,142,185, 53, + 97,218,212,183,252,240,120,117,199, 35, 78,169,103,179,142, 74, 71,183,125, 35,166,174, 80,221,206, 96, 33, 96,128,198, 94, 50, +184,168, 68, 48,179, 20, 82, 52,150,242, 59,199, 9, 51,231, 44,116,153,251,238,212,227, 37, 26,113, 8,112,207, 82, 83,222,245, +122,189,120,220,184,113, 66,171,213,106, 25,251,230,172,190, 57, 57,154,161, 95,174,255, 66,226,225,225, 9,189,145, 69,204,157, +196, 22,139, 22, 45,108,124,228,228,239, 63, 47,120,127,202, 47,145,145,145,142, 63,254,248, 35, 95, 91,121, 62,241,134,168,206, +219,244,237,174, 3, 63,172, 93,181, 20,113,169,133,216,190,117, 51, 8,199,126, 85, 75, 81, 85,230, 36,227,198,141,147,253,252, +243,207,190, 25, 25, 25, 37,122,189, 94,243,132, 63,130,166, 4,234, 2, 61,220, 84, 98,136, 4, 52, 60,157,165,240,112,148, 64, +200, 0, 52, 69,113, 85,113,110,223,119,108, 9,175, 47,198,225, 61,230, 87,190,221,244, 57, 38,204,248, 4,177,121,226,147,180, +220,113,201,244, 87, 70,204,117,151,113,145, 13,156,104,143, 94,237, 27, 66, 33, 21,225,163,183,199,161, 83, 76,138, 71,102, 17, +255,137,198,192,180, 91,120,242,209,102,221,167,159,116,142,148,121,176, 84,114, 33, 78,238, 90,153,171, 43,214, 20, 87, 12,201, +153, 77,198, 84, 27,155,241,233, 42,222,108,231,182,107,221,234,243,169,147, 38,210, 93,195, 59, 17,154, 22, 34,175,212, 76, 17, + 2,188, 51,115, 10,166, 79,121,203, 43, 61, 43,247,179,205,155,191,154, 23,245, 27, 89,172,211,220, 95, 80, 19, 39, 77,149,121, +129,148, 82, 1,148,178, 50,225,162,148, 10, 96, 52,115,160, 40, 48, 78,254,161,197, 84,153, 39, 55,171, 32,181,218, 55,240, 39, + 56, 93,252, 91,157,249,237,161, 42,184,112, 95,225,165,228,172, 59, 75, 98,110,169,175, 2, 40,240,235,238, 52,222,194, 18,104, +141, 44,146,213,122,176, 22, 66, 77,232, 31,128, 70, 47, 81, 65, 75,191,189,254,195,137, 91,112,168,212,233, 63,193,153,121,249, +128,209, 53,100,248,232,181, 27,182, 94, 91,245,249, 39, 76, 94,177, 25, 60, 33,144,138, 25,200,196,130,242,131,129, 65, 87,140, +205, 91,190,206, 97, 65,141,192,185,115,108, 93,218, 39,120,242,234,240, 1,221,247, 82,128,152,162, 69, 25, 13, 2, 26, 6,244, + 30,252,186,180,247,144,113,224, 88,243,220,152, 11,228,172, 62, 55,238,140, 45,156, 33, 45, 91,128, 2,174,235,114,227,167, 0, +128,194, 35,240,171,224,160,224,246, 79,167, 53,107, 22,212,222,150,122,127,228, 41,149,170,102, 56,187,184,127, 18,212,170,157, +135,186,208, 68,169, 92,125,145,156,112, 3,123,182,124,182,147, 55,154, 23,158, 57,182,239,243,117,219, 15,141,234, 29, 57, 28, +223,126,249,197, 71,249,217,143,132,214,233, 74,222,170, 87,119,124,179,205, 79, 40,150,192,202,242,176,114,164,236,147,229, 80, + 80, 80, 8, 43,203, 67, 42, 87,129,229, 41, 88, 57, 30, 86,150,135,201,204, 42,166,140, 27, 56,205, 8, 92,169,202, 78,159,224, + 30,167, 68, 18, 73, 0, 65,217,222,181,132, 16, 36,231, 24,104,111,111,239,221, 0, 32,145, 72, 32,145, 72,192,243, 60, 98,226, + 52, 51,220,130, 2,167,162, 92,224,113, 22,115,106, 81,202, 31,253,170,203,187,151,151,215,224,167, 69,150,209,104,132, 86,171, +197,133, 75,215, 28,191,249,225, 64,100,114,106, 70, 19,158, 56,154, 84, 30, 77,250,149,230, 62, 24, 92, 93,121,150,170,227,166, + 57,132,189, 69,191, 55,125,124,179, 13, 59,142, 94, 77, 60,181,164,198,121, 90,141,122,127,104,126,111,242,200, 14,203,215,111, + 79, 40,252,227,171,217,181,213,145, 64, 32, 16,106, 52,154, 71,247,247,198,175,247,116,184, 30,151, 57,108,221,218,117,210,152, + 7,165,184,157,156,133,241, 17,254,101,111, 56, 54,212,187,194,179,137, 91,227,166, 77,119,111, 94,191, 92,144,144,101,196,166, +131, 87, 17,245,203, 87, 23,114,114,175, 68, 66,157,109,168, 79, 31,242, 23, 8,173,106, 57,207,222,202,131,214,200,194,100,102, + 97,229, 9, 74,244, 86,228, 22,153, 81,162,183, 64,107, 96, 49,190,143,127,149,215,213,162, 71,220, 41,138, 58, 74, 8, 25, 68, + 8,137, 0, 32,174,248, 94,246,204,166,142,150, 11,178, 39,190,207,157, 59,247,227,101,203,150,221,169, 56,183, 34,189,226,220, +154,210, 43, 93,239,250,209, 71, 31,133, 44, 95,190,124,105,120,120,248,222, 63,255,252,243, 33,128, 66, 91,135, 15, 5,149, 51, +115,244,232,209,218, 10,186,137,197,106,145, 56,200,132,104,220,200, 31,111,124,252,173,219,247,203, 39,230, 74,197, 2,230,196, +137, 19, 46,249,102, 37,104,154,177,249, 21, 69,233,222,188,139, 72, 36, 62,182,122,245,106,188, 50,184,155, 44, 45,207,170,189, +149,102, 80,235,204, 96, 61,220, 3,197, 75,150, 46, 87, 46, 95,177,114,250,209,195,124,145, 86,125,119,101,213, 67,124, 29,162, + 25,170,210, 28, 44,138, 2,225,185,140,194,148,107, 29, 0,224,121,230, 98,105,141, 86, 48,229,115,107, 40, 10,208, 27, 89, 48, + 12,149, 91, 20,183,239,238,216,197, 75,122,237,220,251, 91, 22,161,157, 74,117,186,100, 57,202,246, 28,172, 51,140,102, 14, 38, + 43,135, 59, 55, 99,208, 61,172, 37,186,116, 8,134,222,200, 65,111, 98,209,168,105, 16, 0,184, 85, 89,113, 12,253,144,112, 86, + 35, 33,156,106, 80, 71,119,120, 56,137,225,237, 44,129, 68, 44,128,149, 5, 12,102, 30, 70, 51,135,148, 92, 3, 74, 13, 50,180, +238,241,114, 99, 87,239,104, 83, 78,138,236,231,130,180,232, 17, 53,138, 83,142,195,142,221, 7,154,101,101,169,135, 30,255,121, +151, 68, 83, 98,197,173, 20, 29,114,139, 76, 0,227,142,249, 75, 55, 73, 62,156, 61,105,216,142, 61, 63,165,246,238,214, 57,181, +174,121,214,107,226,118,238,219,127,224,171, 65,131,134,201,238, 92, 57,142,132, 27,103, 62,215,229,214,105,126, 22,221,182,109, + 91,118,210,164, 73,165, 75,151, 46,245, 59,124,248,112, 35,141, 70,115, 3,128,213,201,201, 41, 56,176, 89,192,205, 95, 79,158, +240, 25, 56,236,101, 97, 70,158, 1,142,114, 17, 2, 60,228,184,116,225,148, 85, 44, 22, 86, 57,223,164,124,120,112, 12,122,127, +128,195,151, 30, 70,222,201,255, 63,246,206, 59, 60,170,162,109,227,247,217,222,210,123, 2, 9, 53, 33,180, 4, 66,239, 69, 4, +164, 11,104, 40, 26,148,174,136,138, 40, 32, 40, 32, 32,136,130,116, 20, 1,105,210,123, 15, 45, 52,145,146, 64, 32, 4, 18,210, +123,207,246,190,123,230,251, 99, 19,164,164,108, 0,191,215, 50,191,235,218, 43, 57,155,205,189,115,218,156,123,158,121,102, 70, + 28, 53,126,108, 68,122,228,165,135,197,171,183, 69,126, 87,203,193,124, 91,204, 22,174,190,213,186,161,207,204,143,222,193,226, + 85,219,113, 49,250, 97,129,134,227,187, 40,215, 96, 57, 83,121, 40, 29,224,113, 25, 56, 74,248,208, 40, 11, 21, 73, 49,167, 26, +189,162, 48,117, 68,228,161,237,156, 18,149, 25,153, 69,122, 38,167, 68, 5, 43, 75,224, 34, 21,192,194, 18,200, 75,138,152, 29, +219,183,225,230,205,107, 28,112, 57,227, 0,204,171,242,128, 50,182,174, 66, 7, 49,223, 22, 17,146,216,126,154,173, 44,130, 3, + 27, 98,195,234,229, 78, 30, 94,222,232,220,213,254,220,104, 71,247, 58, 45,118,253,186, 26, 81,191,199,116,191,184, 98, 77, 27, + 7, 63,207, 85, 12, 99,253, 1, 4,122,131,201, 10,133,188, 20, 66, 99, 38,218,214, 42,132,155,212,138, 52,165, 47,238,229, 37, + 58, 84, 87,225, 23,223, 59,120,155, 33, 67,230,236, 59,122,126,113,159,215,187,227, 94,154, 18, 18, 33, 15, 98, 33, 23, 98, 33, + 23,124,198,138,229,235,127, 50,151, 42, 84, 3,138,227, 14, 23,189,192,245,121,182,172,245,107, 51,119, 86,181,231,246, 85,115, +182,142,255, 98,105,159,190,111,142, 97,238,221,188,240,165, 22, 56,103, 95, 67,143,216,245, 30,203,218,255,140, 19, 59,122,172, +156, 58, 99,225,212,222, 3,222, 2,151,203,131,217,108,198,254,221,219,241,235,154,185, 15,140,234,226, 49, 0, 88, 99, 1,119, +194,158,237,235,223,250,226,235,229, 76,243, 22,109,219, 93,200,125,126,121, 79,150,203,252,252,238,216,137,225,222,222,222,142, +127, 70,180, 8, 26, 5, 55, 69,191, 65,195,112,250,240, 65,220,143,139, 5, 75,108,134,137,101, 9,228,165,197,121, 22,179,113, + 75,165, 61, 30, 98,113,157,205,191,110, 11,226,112,152,199, 11,200,127,250,193,123,198, 73,159,124,217,185, 95,239,110,113, 66, + 46,148,105, 25,185, 46,215, 98,226, 67, 88,190,131,255,216,233,203, 5,122,131, 21, 10,173, 25, 39, 54, 85,238,117,196,174, 1, + 29,234,182,234, 55,118,210, 87, 27, 68, 34, 46,199,212,172,145,127, 74,183,246,205, 50, 3,252, 60, 84,223, 44, 89,211,246,202, +245,152,126,111,143, 26, 43,142,104,220,138,241,115,151, 56,190, 55,234,205, 80,171,197,244,174,182, 36,179,210,249, 5,249, 82, + 87,121, 64,189, 64,237,159, 17,163, 70, 7, 24,130,250, 79, 57, 15, 6, 41,186,252,132,161, 0,224,235, 23,160,231,139,156, 84, + 53,136,192, 16, 0, 88,245,203,206,214,119, 18,114,198,255,248,227, 10,105,116,178, 10,183,147, 21, 16, 9, 56, 48,153, 89, 48, +118, 6,181, 89,194,157, 56,123,214, 76,167, 82,141, 21, 81,177,133,136,187,117,129, 24,213,250, 81, 82,139,211, 80,120, 57,190, + 11,160, 33,128, 36,134, 33, 63,107,242,125, 14, 3, 23, 45, 53,189,238, 89,214,214, 94,118,242,108, 80,223,202, 19,245,227, 11, +101, 29, 24,134, 52, 99, 8, 92, 1,146, 93, 82,246, 76,181,215,169,105,242, 19,176,244,219,175,177,114,227, 65,228, 20,235,225, +108,205,196,225, 77, 11,241,217,226,223,160, 51, 84,158,213, 80,157, 31,169,200, 24, 61,107,184,202,127, 47,255,220,226,197,139, + 7, 60,115,110, 6, 84,114,206,158,251, 92,249,255, 47, 89,178,228,219, 39,254,174,181,215,100, 61, 54, 90,229, 59, 85,141,217, +106,228,233, 91,231,247,195,135, 14,184,150,170, 77, 16, 11,184, 8,168, 23,136,121,171, 15,123,190,209,218, 3, 69, 38,103,236, +220,240, 67,137, 94,171,218,109, 87,101,225, 21,220, 78,226, 32, 59,113, 96,255, 65, 52, 8,240, 18,236,184, 92,146, 26,147,162, +123, 28,234, 85, 22,166, 11,235, 57,105,121, 67,223,124, 83,122,238,252,133, 79,212, 64,133, 70,139,203,112,107,255,178,109,191, +151,163,132, 15,134, 1, 84, 58, 11,198,191, 59,236,229, 31, 99,132,229,142, 29, 19, 1,166,204,100, 41,139,243,240,229,140, 15, +244, 50,115,226,253,140,180,140,236, 94, 3, 63, 59,167, 84, 51,250,240,119, 62,184,121, 63, 97,113,169, 86,251, 98,139,252, 24, +140, 86, 24, 76, 44,146,147,147,240,105,196,235,224,115, 57,224,114, 89, 91,178,180,165,242,139, 81,157,147, 80, 2, 31,193,240, +237,203,166,252,226,231,237,229,238, 32,147, 16, 7,169,136,105,214, 56, 72,208,190,125, 71, 97,189,224, 80,193,229,120, 29, 50, + 10,117, 72,201, 81, 64,228,221,146, 55,162,231, 27,216,190, 98,122,247,146,140, 91, 28, 60,159,164,248, 20,103,162,254, 24,184, +113,253,143,162,124,185, 9, 15, 50,212,200, 43,213, 35,183,212,128,188, 18, 61, 28, 36,124,116, 29, 52, 65,116,252,240,207, 3, + 95,235,210,110,213,139,236,119, 74, 74,234,241,180,236,220,183, 66,195,218, 98,251,214, 95,187,184,184,212,115,146,203, 83,149, +246,158,157,133, 11, 23, 10,151, 44, 89,194, 91,189,122,181,178,125,251,246, 62,179,102,205,234, 83, 80, 80,112,163,110,221,186, +193,167, 15,108, 57,223,178,235,224, 54, 96, 77,158, 93,186,245, 16,136, 88, 30, 34,143, 29, 51,237,217,189,163, 88,167, 83, 77, +170,210,112, 72,157, 23,230,171, 25,120,214,170, 19,144,162, 6, 0, 0, 32, 0, 73, 68, 65, 84, 21,231, 32,180,190,206,227,200, + 19, 74, 79, 77,221, 86, 10, 28,104,208,247,163,179, 23,110, 61, 76,104, 29,157,230,117, 62,250, 81, 65,137,214,212, 40,249,212, +103, 85, 86,188, 92,134, 1,159,203,129,163,132, 7, 78, 89,173,234,224, 23,250, 8, 12,227, 89, 30, 57,101,192,148,253, 4, 24, + 6, 57,165, 25,183,237,200,217, 96, 8, 75,128,135, 89, 26,168,245,182,208,124,109, 15, 41, 10,243,179,176,110,213, 22,196,220, +186,137,222,111, 12,194,218, 95,118, 96,252,187,111,233,171,107,253,112, 56,101, 17,173, 39,162, 89, 14, 18, 30, 0, 6,114,141, + 25,251,175,100,162, 97,125,142,221, 15, 6, 0,112,116,144, 66,161,210,129, 35,112, 68, 82,244, 9,233,201, 11,215,103,205, 89, +240,227,231,165,185,177, 25,143,238, 94, 70,176,135, 2,245,107,153, 16,151,231,132, 91,197,245, 16, 28,216, 0, 28,193, 77,187, +180,139,226, 66,150, 30,230,236, 31,208,186,101,211, 14,117,188, 92,160, 51, 90,203,162, 90, 92,252,186,121, 27,210, 82,179,198, + 22,223, 63, 28,243, 42, 28,173,166, 32,165, 80,228, 21,248,225,221,235,231, 82,222, 28,245, 33,124,107, 5,180,144,103,220,182, +243,225,101,159,169,178,218,105,180, 4, 82,151, 89,159,206,254,110,106,239,254,195,241,199,229,115,184, 29,151,132,118,237,218, +224,141, 33, 35,160, 82,150, 52,222,187,109,197,235, 22,173,234, 52, 79,100,153,218,182, 99, 79,134,181, 90,145,248,224, 94, 82, + 69, 90,186,220,135,183,175,229, 62,116,122,170,123,202,163,113, 11, 7,103,183,219, 6,147, 21,217,217, 89,184,250,123, 84,152, + 46,247, 97,141, 38, 16, 22, 9,184,136,140, 41,128,169,108, 13,211,174,221, 94, 55, 10, 56,134, 46,139,126,220,220, 62, 55, 39, +151, 35,115,242, 96,221,106, 53, 17,248,138, 76,134, 59,201, 10,129,201,204,162,129,159,172, 74, 77, 79,191,192,111,167, 79,255, +180, 9, 87, 32,129, 74, 99, 48,230,230,100,251,108,216,121, 65, 29,255,224,110,173,218, 94,206, 78,223,173,248, 89,160,212, 51, + 40, 80, 24, 80,162, 82, 50,163, 38,126,225,183,113,205,226,209, 85, 25,173, 10,210, 69,234, 31,143,188,220,216,213, 81,192,168, +245, 22,182, 88,105,178,142, 26,242,114,131, 46,203, 76,214,132, 31,151,175,144,198, 36,171,112, 39, 89, 1,177,128, 11,161,128, + 3,163,153,133,157,183, 19,199,199,203,103, 82,199,214, 33, 56,125,187, 8, 92, 46, 7, 58, 85,169,150,135,226,132,214,221,123, + 75, 91,181,109,143, 30,221,187,225, 81,194,195,128, 99, 71,246,191,118,237,234,197, 60,139,169,209, 20, 77, 97,194,193, 26, 5, + 22,180, 90,174, 89,232,243,158,111,173,186,157,134,142,120,207,185, 78, 64, 45,198,203,195, 29, 22,194,195,132,119,135,217,125, +231,219,140, 57,176,100,193, 44, 24, 12, 70,120,186, 8, 65, 8,176,121,213, 60, 24,141, 70,248,185,139,160,208, 84,190,154, 92, +117,126,164,178, 40, 84,141,114, 79,158, 48, 99, 85,189,207, 48,204,177,153, 51,103,126, 9,128,204,156, 57,243,203,242,237,197, +139, 23,235, 0,228, 84,211,117,184,225, 41,163, 85,190,115,149,223,221,130, 96, 15,119,223,107,145,167, 79, 57, 31,186,195,226, +143,131,183,208,191,157, 47, 4, 60, 14,164,206,126,184,147,170,192,241, 3,235,229,135,119,253,156,109, 48, 24,190,175,190,175, + 57,176,181,131, 84,118,122,235,246,221,172,135,187, 59,103, 93,100, 97,114,177,202,242,184, 75, 43,225,250, 17,246,214,233, 13, +190, 4,204, 41,177, 88, 28,104, 52, 26, 93,171, 59,177,155, 35,211,203,146,120,153, 87, 81,183,130,225,114,173,219,119,108,135, +135,147, 16, 6, 51,139,153,159,127,172,139,232,237, 32, 31,245,246,136,158, 61,250, 77, 61,207,151, 5,157,235, 24, 22, 68, 90, +182,108, 41,231,114,185,118,165, 82,120,121,121,205,227,112, 56, 35,133, 66,161,163,209,104, 84, 25, 89,189, 84,163, 55, 66,111, + 2,180, 90, 61,248, 2,155, 89,228,115, 25,232,244, 70,104,117,198,170,111,140,188,123, 87, 0, 52, 82, 62, 17, 83, 58, 23,223, + 64,248,219,222,195, 31, 15,127, 59,124, 78,173, 22, 67, 28, 82,115, 21, 16, 48, 38,180,105,226,139, 11,167, 14,146,172,180,132, + 79,171, 51, 89, 0, 80, 80, 88,226,239,233,233,141,152, 20, 53,178,139,117,200, 43, 51, 89,185,165, 6,168,116, 42,132,214,241, +131, 92,161,240,127,225,227, 11, 28, 60,125,250,244, 91,253, 6,135, 99,234,231,243, 59,111, 90,255, 67,172, 76,200,127, 95,147, +159, 24,101,143,209,186,119,239, 94,201,140, 25, 51, 26,254,242,203, 47,156,209,163, 71,235, 66, 66, 66,196,239,188,243, 78,231, +109,219,182,137,165, 82,177,238,206,229, 35,115,198,125, 52,115,240,134,149, 11, 91,148,150,150, 50, 22,179,249,164,169,180,116, +166,186, 26, 51,151,121,228,203, 7,115,147, 77, 99, 94,239,226,121,196, 77,202,105, 38, 34,198, 17,104, 50,111, 55,226,231,153, +146, 79,173, 86, 73,222, 90,246, 81,142,156,157,173,231,120, 45,170,206,100, 1, 0,135,203,192,104,177,194, 81,194, 7,135,195, + 41, 55,241,190,191,238, 62, 41,245,116, 22,130,207,229,128,199,101,160,212,154, 81,164, 52,225,195,247,236,157, 33,132,176, 22, + 43,129,206,104,129,182,172,117,168, 82, 22, 97,214,231,211,240,198,192, 55, 49,110,210, 52,148,234,128, 91, 41, 42,152,204,230, +106,111, 10, 14,195,129,214, 96,193,251,189,235,160, 68,109,130, 70,103,129,209,194, 66, 42,228,129,207,227, 64, 38,230,193, 73, +202, 7, 8, 17,148, 87, 38,124, 62, 95,111, 54,155,183, 87,209,162, 71, 61,127,111,232,204, 28,180, 13,255, 1,189, 58, 52, 66, +220,149,253,188,139,127,220,173,255,201,231,179,241,241,248,129,216,247,160, 33,220,188,234,192, 65, 38,129,153,112, 0, 16, 59, + 19,246,230,177, 28,211,155, 35,127,250,101,243,195,111,190,158, 41,150,107, 24,136, 4, 92,156, 63,119, 22,215,174,223, 90, 89, +116,255,240,118,188, 66,248,132,227,237,228,228, 4,177,144, 11,163,201, 96,180, 63,117,129,128, 0, 97, 50,175, 70, 63,149,181, +248,195,172, 44, 42,120,175,122,163,197, 19, 59,205,156,242,249, 55,223,246,238, 63, 28,145,199,246, 97,239,190,221,214, 14,125, +199,114,119,252,186, 30,157,123, 13, 66,231,222,225, 56,121,112,219, 52, 13,203, 52,157, 48,117,206,130,174, 61,251, 33,242,248, + 62,228,231,101, 45,179,183,188, 92, 62, 51,181,231,235, 3,161, 55, 90,209,229,181, 1, 56,117,244,224, 71, 40, 27,100, 97,255, + 67,236,153,250, 25, 28,203,180, 79,167,242, 11,228, 70,126,161,210,136,172, 66, 45, 82,243,181, 56,188,107, 19,177,191,190, 48, +182,233, 26, 90,155, 63, 97,233,249, 76,255,218,190, 6,190, 65, 39, 73, 72, 74,110, 60,238,189, 8,126,253,192,198,156, 2,133, + 1,133, 10, 3,138, 20, 6,168,245, 22, 4,214, 14,226,152, 45, 76,135,154,158,103, 15,103, 33,127,237,209, 20, 56,201,248,232, +216,248,197, 7,218,178, 44,251,167,201,250,209,102,178, 98, 83, 20, 16, 9,184, 16, 9, 56, 16, 9,184,176, 88,137, 93, 13, 23, +137, 87,163,126, 31, 78,249,192,207,104, 1,138, 21, 70,240,184, 12,188, 60, 92,101,109, 90,140,196,230, 31, 62, 2, 0,140,159, +177, 14,227,222,127, 7, 77,154,133, 64, 94, 90,234, 51,114,120,191, 31, 1, 28,180,183,172, 39, 34,163, 2, 34, 47,197,204,248, +112,250, 92,135,183, 7,246,224,222, 78, 86, 32,183,196,128,164, 4, 85,141, 34,111, 0, 96,177,178, 32, 32,216,178,251, 24, 36, + 66, 30, 10, 21, 38, 16, 66,176,112,245, 30, 56, 74,248,200, 45,181,117,247, 87, 69,149,126,164,138,136, 84, 13,162,141, 3, 96, +203,229,242,180, 55,162,181,120,241,226,184,197,139, 23, 87, 24, 33,123,194,100,189,216,162,210, 2,129,172,177,147,187,199, 31, +145,167, 78, 56, 30,188, 99,197,133, 59,197, 24,222,165, 54,212, 37, 25,248,254,243,183, 75, 24, 16, 35,135,203,149, 27,116,218, + 3, 58,157,102, 17, 0, 83,149, 23,141, 79,163, 48,153,216,225,236,218, 13, 91, 45, 30, 94, 94,216,126,185, 36,171, 84, 99, 49, +255,217,109,101,102,110,157,222, 80,223,194,154,251,234,243, 31,221,172,174, 37,206, 18, 8, 22,175, 63, 12,128,128,101, 89, 16, +150, 5, 95,236, 32,243,104,208, 62,191,172,162, 19,243, 56,140,254,201, 26,128,176,150,172,162,148,170,195,160, 12, 0,103, 41, + 31,187, 47,102, 3, 64, 62, 87, 21, 29, 63,234,109, 91,119,161,222, 40, 86, 54,107,216,144,180,105,211, 70, 46,145,216, 53,253, + 21,215,219,219,251,198,156, 57,115, 26,143, 27, 55, 78, 36, 20, 10, 97,177, 88,220,126,222,176,129,221,176,104, 60,134,126,180, + 22, 2,161, 8, 58,189, 9,124, 62, 15,165, 10, 53,228, 74, 45, 84, 90,115,205,175,160,228,100, 99, 33,176,244,208, 65,225,155, +125, 28, 66,219, 10, 57, 2,180, 10,246,197,133,211,135,200, 31,167, 54,143,215, 21, 36,108,181,243, 66,132, 90,111, 70, 78,177, + 30,217,197,122,228,149,234,145, 87, 98, 64, 94,169, 30, 12,195, 64,111,180,188,212,131, 75, 83,240,112,239,246,173, 27, 7, 25, + 76, 24,209,181,247,155,152, 54,119,109,157,237, 63, 45, 57,155, 66, 56,157,236, 76,180,181,198,197,197,165,189,247,222,123, 45, +118,238,220,201,109,222,188,185, 46, 62, 62, 94, 90,102, 34, 77, 14, 14, 82,201,166, 53,139, 79,183,109,219,118,119,118,194,131, +115,101,253,233,213, 86,236,117,186,141, 17, 73, 76, 49, 19, 2,100, 29,251, 52,240,145, 34, 64,166,234,211,216,225,206,247,197, + 61, 63,254,182,240,252,202,130, 92,131,229, 76,161,142,219, 50, 91,205,183, 43, 7,207,108,208,167, 15, 29, 62, 2, 92,134, 3, +147, 94,155, 94,126,113,121, 57, 11, 49,111,199, 3, 56,136,249,112,148,240,224, 32,225,163,115, 83, 55,212,160, 62, 35,102, 43, + 11,173,193, 10,157,193, 2,189,209, 2, 15,127, 87,252,178,125, 47, 50, 10,116, 56,124,179, 8, 15,211, 85, 8,170, 45, 3, 33, +213, 87,147,172,213,172, 25, 56,108,180, 35,151,195,128,203, 97, 56, 77, 27, 55, 66,137,218, 4, 1,143, 3,129, 88, 2,153,136, + 7, 39, 9, 31, 2, 1, 31, 5, 5, 5, 48, 24, 12, 8, 8, 8, 16, 87,109, 5, 9, 28, 29, 36, 8,170,239, 7,147,217,130, 19, +151,238, 99,209,167, 67,241,122,215,214, 96,248, 14,120, 96, 8,131,163,155, 35, 88, 14, 7, 38, 11, 11,163,201, 10,128,163,175, + 76,207,223,223,191,167, 76, 38,147,105,181, 90, 85, 70, 70, 70, 84,222,195,131, 25, 86,238,224, 9,167, 34,207,111, 31,240,198, +235,136,137,141,195,190,131, 71, 46, 23,185, 43,166,151,255, 79,179,102,205,218,123,120,120, 56, 20, 23, 23, 43,239,221,187,119, +227, 69,219, 5,132,195,249,164, 67,231,238, 80,203, 11,144,159,153,106,119, 43,186, 73, 29, 71,124,181,120,109,171,224, 70,193, +173,172,196,102,188,154, 6, 56,226,179,185,171, 90, 53, 12,106,212,170,124, 64, 72,147,128,170,167,101,227, 73, 29,123,191, 59, +110,218,226, 65,195,199,224,124,228, 17, 44, 95,244,249,118,153,179,103, 19, 55, 87,231,150,205,219,247,198,229,179, 71, 32,118, +244,129,171,187, 79,231,209,239, 79,233, 53,124,244, 68, 92,187,124, 22, 43,151,124,185,205,106, 80,253,102, 79, 89,101, 94,245, + 61, 91,132,181, 29,229,232,230, 13,185, 66, 5, 71, 87, 47, 52, 9,109, 51,234,254, 29,195, 12, 77, 65, 74,225, 11,155, 14, 66, + 96, 48, 17,148,170, 77,200, 44,212, 33, 45,207,102,180, 88,182, 6, 57, 65, 86,150,113, 16,243,120,110,230, 71, 1,119,207,158, + 39,117,252,189,153,165, 11, 62,231,154, 32, 70,161,220,102,178, 10,149, 70, 20, 42,140, 80,235,205,112,147,241,192, 90,217, 26, +183,186, 75,213, 38, 56, 74,249,112,150, 10,236,142, 50, 86,196,250, 95,119, 7,223, 73,200, 25,178,124,249, 10,233,237,148, 39, + 76, 22,223, 22,205, 18, 9,184,176,178, 44, 96,199, 29,207,231,241,167, 14,238,215, 11,153, 69, 58,219,168,101, 14,131,160,144, +182,240,144,176,120, 45,124, 38, 0, 96, 96, 63, 91,106, 91, 74,174, 6, 71,255, 40, 4,158, 78,236,174,186, 46,214,233,184, 27, +118, 28,255,100,239,158, 93,206,122, 43, 15, 63,159, 76,131,214, 96,129, 88,192,133, 72,192,133, 68,192,125, 42, 31,187,122,163, +101,203,185,203, 40, 50, 67,171,215, 67,169, 51,131, 0,184,241, 72, 13,157,209, 2,133,198,140,246,141, 93, 95, 46, 16,194, 48, +199, 9, 33,253,159, 53, 68,207,154,165, 39, 34, 82, 21,105,220,124, 82,163,252,243,149, 25,185, 39,115,182, 0,212,104, 4, 23, +239, 89,231,248,228,182, 64,230,218,196,217,209,249,143, 83, 39,143, 57, 28,188,195, 34, 42,214,102,178,204,186, 34, 44,155, 49, + 50, 75, 41, 47,234, 1, 32,217,222, 47,147,122, 52, 9, 21, 11, 69,231,191, 91,241,179,201,203,187, 22,123,224, 15,121,129, 66, +107,125,202, 77, 88, 13, 6, 14, 97,137, 64,159,255,200,174, 62, 4, 14,135, 49,205,253,232, 77,176,132, 96,222,138,189,248,118, +122, 56, 28, 36,163,165, 12,195, 72, 53,122, 11, 62,157,191, 17,203,190, 26,235, 40, 21,241,192, 48,182,156,168,119, 71,188,105, +223, 5,168,183, 32,233,250, 78,181, 42,229, 88,252,147,221,133,237, 58,191,113,171, 93,187,118,114, 87, 87, 87, 72, 36,146, 63, + 35, 21,149,224,237,237,253,213,220,185,115,131, 39, 77,154,244,120,178, 79, 30,143,135, 15, 63,248,128, 99,181, 18,156, 60,185, + 25,158,117,195,112,228,204, 31,232,219,179, 13,212, 90, 61, 74,228, 42,176,224,190,240,133,168,146, 23,157,207, 75,187,219,182, + 83,143,129,136, 58,125,136,252,113,114,211,248,154,204,209,227,234,230,154, 25,125, 55,169, 9,195,184,217, 34, 90,101, 38,203, +104,102, 81,199, 91,138,204,180, 36,184, 56, 59,103,218,171, 39,241, 12, 30,204,112,200, 36, 6,100,179, 38, 63,113, 47, 0,162, +201,141, 31,185,247,183, 13,177,113,247,110, 47, 26, 48,106, 42,175,247,240, 15,184, 63, 45,158,242, 37, 0,123, 39,222, 51, 61, +124,248,240,254,216,177, 99, 59, 94,187,118,205, 10, 64,203, 48,140,153,203,229, 74,141, 70,163,160, 71,143, 30,138, 7, 15, 30, + 68,161,226,164,197,167,232,252,222, 94, 15, 70,164,122, 67,200,154, 70,214,113, 84,189,222,163, 75, 7,116,104,230,143,204, 46, + 29, 0, 96,106,186,218, 33, 88,223,112,227,110,179, 69,114,226,167, 95,143,126, 59, 62,188,215,167,219,121,243,150,231, 30,155, + 87,101, 34,106,102,252,197, 62, 21,217,120, 30,151, 3, 71, 9, 31, 14, 18, 30, 28, 37,124, 56,138,249, 48, 91, 72, 77, 90,142, +196,108, 97,109, 17, 45,163, 5,106,157, 5,231,111,231, 35, 79, 97,132, 92,101,130,206,100, 5, 1,177,181, 70,237,168,205, 11, + 31, 93,117, 41,127,146,186, 4,132, 41, 54,172,254,193,105,255,149,172,199, 35,250,156,165, 66, 56, 74,109,163,177, 47, 93,186, + 4,119,247,234, 91,251, 44,203, 98,223,169, 27, 88,190,229, 60, 78,109,254, 2, 98, 1, 23,161,131,231, 99,204,144,118, 96, 9, +139,164,135,113,249, 65, 77, 91,120,115, 56, 18,112, 24, 6, 6, 51, 11,128, 84,122, 60,141, 70,163,123, 70, 70,134, 50, 48, 48, +208,199,207,207,111, 56,151,203, 37, 80,221, 54, 28,218, 85,162, 61,119,236, 55,169, 70,103,176, 74, 45,138,205,129,185,186,254, + 8, 12, 4,195, 48,196,201,201, 73,112,254,252,121,117, 72, 72,136,231, 11,222, 74, 28,137, 87,163,149,227, 38,127, 50,188, 97, +131, 6,216,251,219,102, 16,194,236,183,247,159,119, 28,189,134, 5,179,158, 30, 97,248,217,220, 85,173,150,205,159,250,212,123, +147,103, 45,175,114,212,161, 68,228, 48,125,232,200, 9,184,117,227,119,124, 63,255,179, 93, 6,117,201, 24,179,197,252, 86, 73, +110,202,174,250, 77,219,129,152, 84,136,220,243, 3,194,223, 25, 47,234, 61, 96, 56,174, 93, 62,139,111,191,156,188, 67, 43, 47, +120, 15,118, 38, 57,179,132, 63,169, 71,159, 33,124,157,193,132, 85, 75,191,198,196,233,139,208,190,231, 64,254,189,219,127, 76, + 2,240,141,221,233, 16, 38, 43,122,132,120,216,204,179,153,197,145, 20, 46,175,162, 43,144,199,101, 56, 45, 27,184, 64,103,180, + 64, 89, 77,163,146, 39,224,231,201, 21,202,186,107,190,253,132,171,209, 91, 80,168, 48,162, 64, 97, 64,145,252, 79,131, 85,164, + 48,160, 80, 97, 4,159,199, 32, 33, 57, 29, 28, 62,175,198,249,121,165,106, 51,218, 54,114,181,221,163, 47,216, 59, 98,230, 57, +181, 59,117,241,206,208,229,203,127, 20,223, 73, 85, 33, 54, 69, 89, 22,201,226, 66,196,231, 64, 88,246,187,149,181,229, 70, 86, +133,147,103,131,250, 17,239,142,126,205,201, 65,130,156,196, 2,240,184,182, 41, 98,156,189,252,225, 44,210, 99,202,228, 9,240, +112,119, 65, 70,145, 1, 43, 15, 38, 32,246,254, 35,176,186,154,237,246,170,159,119,245, 29,247,225,103, 46, 28,190, 16,219, 78, +167,218,202,201,181,226,193, 31, 71,245, 57, 73,119, 53,106,101, 49, 1,177,218,153,131,204, 16,139,213,118,185,125, 59,111, 38, +118,109, 89,135,211,209, 5,143,175,192, 43,251,151,225,147, 89, 11, 81,164, 52,162,162,235,178, 42, 63, 2,160,240,137, 72,212, +115,219, 79,152,163,138,182,153,178,109, 99, 37, 26,198,103,204,149,241,153,247,141,207,232, 85, 52,247,223,134,106,187, 14,159, + 51, 69, 46,158,205,165, 98,217,239, 39, 79, 30,149, 29,138, 37,143, 77,150, 73, 91, 68, 22, 77, 29,152,165,148, 23,246,174,145, +201,242, 12,106, 46,146,138, 46,206, 89,184,210,224, 93,171,174,229,196,109,101,177, 74,111,181, 60,159,131, 32,179,202,156, 61, +245, 60,161,104, 57, 95,103,252,186,168, 40, 94, 83, 93,228,137, 37, 4,199,174,231,129, 16, 91, 19,105,207,165,108,148,181,204, + 97,101,109,221, 42,103,110, 23,128, 87,150,135, 98,111,248,123,253,207,235,148,253, 67, 20,154, 81,223,206,123,220, 93,216,190, +133, 45,146,229,228,228, 4, 23, 23, 23, 56, 56, 56,160,186,174, 67,134, 97,222, 29, 55,110,220,115,173,255,130,130, 2,244,122, +173, 7, 86,175,251, 5, 45, 94,139,192,153,171,167, 97, 50,179, 8,109,218, 0,117,253, 92,145,153,175,122,161, 27, 93,230, 29, +252, 97,219, 30, 67,190,236,220,115, 32,206,159, 58, 64,254, 56,245,235,132,154, 78,132,216,191, 87,199,163, 11, 22,204,171, 63, +103,209, 26,145,163,152,135,120,181, 17, 28,134, 65, 29,111, 41,220,101, 28, 68, 29,218,166, 15, 31,216,209,238,201,241,252,253, +107,109, 95,182,122,131,108,217,146,249, 61,110, 69, 51,231,213, 57, 9, 37, 0,160,205,127,184,244, 1,112,191,246,239,145, 39, + 90,116,123, 19,222,126, 13, 94, 79,201,127, 96,183,217, 0,160, 77, 78, 78, 78,153, 51,103, 78,240,146, 37, 75, 8,151,203,101, + 1,136, 86,172, 88,161, 77, 76, 76,188, 13,219,208, 92, 84,247,176,121,237,245,102,159, 58, 8,173,237,221,164,156,102, 13,124, +164,232,208,204,214, 43, 26,222,191, 51,252, 3, 2,144,156,167,109, 89,162,101,249,106, 35,183,193,218,159, 99,111,214,243,224, +142,183,232,140,247, 1, 28,174,233,249, 97,240,103,130,124,121, 52,203, 81,194, 7,107,187, 86,106,100,180, 12, 38, 43,116, 6, + 43,116, 70, 11, 52, 70, 43,180, 70, 43, 88, 98,187, 39, 24,134,129,201,194,194,174,102,243, 51,215,190,147,155, 7, 26,212, 99, +224, 36,181,149,205,169,108,186, 7, 6,128,187,187, 59,188,188,188,236,138,138, 26, 77,182, 91,220,104,102, 31,119,235, 27, 77, + 22, 16, 66,144,144,240,240,139,180,148,148,193,129, 65,129, 93,155,134,182,112,147,138, 56, 0, 80,169,209,210,106,181, 86, 71, + 71, 71, 47, 55, 55, 55, 78,118,118,246, 99,243, 28,216,178,135,229,224,129,253, 24, 58,244, 77,117,252,141, 59,143,135,184,235, +116, 58,166, 83,167, 78, 78,254,254,254, 28,131,193,160,172,233,105,146,121, 54, 26,226,234,238,182,232,221,247, 38, 54,234,209, +171, 47, 46,156,139,196,225, 3, 59,183,106, 11, 19, 34,237, 21, 9, 14,110,252,220,168,195,134, 65,141,158, 27,117, 88,183,126, + 80,149, 70,171,105,104,155,118,132,225,225,244,177, 61, 68,207, 49, 77, 6,192, 90,245,170, 61,187,215,127,245,205,200, 73,179, + 26,246, 27, 52, 18,239,190, 51, 6, 60, 30, 23, 81,103,142, 98,217,252,105,199,213,138,130, 8,123,210, 4,108,161,183, 38,130, + 90, 18,255,143, 3, 26, 54, 71,244, 31,151,145,148,112, 47,238,206,205,107,205, 2, 67,218,195,211,175,206,199,233, 30,220, 37, +136,143, 55, 85, 39, 99,212,235,211,199, 68,188,131, 39, 71, 29,118, 8, 11,118,103,158,189, 1, 0,104, 85, 5,166, 77, 63,124, +154, 88, 62,234,144, 53, 25,211, 43,211, 85,148, 22,238,139,186,122,125,250,224,254,125, 57, 69, 74,163, 45,130,165, 48,150,189, + 12, 40, 42,255, 93,105, 64,144,159, 3, 30,198, 69,179,122, 69,209,254, 26,222,151,250, 49,111,245,185, 95,126,237,178, 44, 1, + 3,232,107,220, 45,197,119,154,176,244,251,229,226, 59, 41,106,196,166, 42,109, 93,133,124,174,205, 96,241, 57,143, 77,151,109, + 52,123, 53,209, 33,134,251,237,251, 17, 35, 80,164, 52,129,101, 1, 30,151, 83,246, 18, 32, 67,197, 32, 83,165, 69, 81,105, 33, + 82,210,210, 33,207, 75, 2,135,195,129,135, 95, 35,187,103,146,182, 18,161,175,214, 72, 66,134,247,239,202, 59,240,123, 46,164, + 34, 30, 12,170,124,156,220,253, 67,161, 65,173, 92,164,211,170, 15,216, 51,159,227,159, 41, 8, 76,161, 82,173,247, 22,241,185, +216,187,101, 13,222, 26, 51,249,169,218,247,139,217, 11, 0, 14,131,146, 82, 21, 24,134, 41,172, 89,189,196,220,172,106,251, 5, + 35, 99, 47,173, 81,129,217,122,190,161, 80,121,107,148,156,140, 60,117, 84,118, 37, 77,132, 27, 15,115,203, 76, 86, 33,187,240, +163,254, 89, 42, 69, 73, 31, 0, 9, 53,107, 23,114,250,132,191, 63, 61,174, 65,163,166,134, 11,247,212,169,114,141,185,210, 60, +135, 14,195,231,196,221, 58,190,186,159,194,156,252,129,204,183,169,149,181, 88,150,234, 10, 19,230, 87,210,117, 40,156,191,114, +239,227,110,195, 25, 75,182,217,126,183, 90, 97, 37, 44, 8, 11, 76,249,106, 61, 44,172, 21,172,213, 10,214, 74, 96,182, 18,105, +117,197,245,242,171,123,160,244,193,158,198,163,190,121,190,187,208,197,197, 5,238,238,238,112,119,119,135,147,147, 83,181, 70, +139,207,231, 59,240,120, 79, 31,234,244,244,116,164,165,165,193,201,201, 9,132, 53,195,104, 6,154,183,239,141,187, 73,247,112, +246,202,109, 16,214, 10,153, 67,205, 87,121,145,121, 7,127,208,166,251,224, 53, 61, 7,141,197,153, 3, 63,147,155,151,142, 78, +212, 21, 36,108,180, 59, 66,111,181, 50,102,179, 25,253,123,119, 79,143,137,123,116,106,246,244, 73,125, 59, 14,152, 40,234, 16, + 92, 11,122,163, 21, 89,105, 73,136, 58,244,171,190, 81,125,223,211,175,117,105,151,110, 54,155, 97,181, 90,171,125,144,235,141, +166, 34, 46, 95, 34, 27, 49, 98, 20,255,230,141, 27,251,101,158, 65,123,173, 12,231, 14, 67,216, 80,134,144,161,161,161, 77, 96, + 50,179,208,106,149,165, 53,221,103,149, 74,149,178,121,243,230,250, 17, 17, 17,210,166, 77,155,242,147,146,146,176,108,217,178, + 98,149, 74,149, 98,175, 70,228,165,135, 43,120, 76,105, 98,121, 68, 43,163,115, 7,140, 24,208, 25,187,142, 95, 65,212,229,107, + 72, 87, 59,220, 86, 91,120,135, 50,211,115, 12,205,220,148,251, 7,117,168,203,221,187,165,116,127, 92,247,153,111, 19, 34,138, + 44,186, 56, 79, 99,255,205, 13,168,116,102, 56, 73,109,243, 61,149, 71,182,184, 12, 99,183, 35, 98,128,148,203,215,162,155,183, + 14,106,138,152, 20, 5, 10,228, 6,232, 12, 22,176, 44, 1, 11, 2,119, 71, 33,196, 2, 14, 50,210, 82,192, 18, 83,106, 13, 31, + 21,133,221,186,118,227, 1, 12, 24,134,240,248, 60, 30, 8,108,243, 43, 74, 36, 18,181,151,151,151, 93, 17, 45,147,197,130,161, +125,219,161,125,155, 80, 12,158,104,155, 51,243,220,214,153,112,117,224, 99,215,246,141,200,188,180, 98,123,253, 14,147, 34,239, +221,141, 27, 22, 23,243,251,168, 55, 90, 73, 90,250,240,114, 4,149,133, 73, 53, 26,205,126, 0, 66,129, 64,208,183,107,215,174, +110,251,247,239,151,123,120,120,176, 66,129,160,112,208,192, 1, 44, 95, 32, 40, 41,255,236,213,171, 87,249, 19, 39, 78,116, 44, + 45, 45,205,200,207,207,191, 6,192, 92,117, 67, 48,184, 23, 56,216, 9,134, 17, 59, 72,164,233,245,234, 53,240,107,211,190,157, +243,144,161,111, 65, 36, 20,225, 76,228, 41,172,250,113,201, 30,117,110,252,251, 53, 57,146,175,106,212, 97, 86, 70,106,138, 86, +103, 8,105,222,186, 59,115, 57,242,208, 84, 19, 60,126,228,138, 76, 63,244, 26, 58,185, 97, 74,142, 26,171, 22,127, 1, 87,103, + 25, 82,147, 30,232, 18,227,239,174, 55,235,149, 95,216,109,178, 0, 72,139,173,195, 58,188,211,215,213, 96,178,226,210,249,227, +122,214,194,246,189,118,241, 68, 82,237, 70,109,196,205,219,188,230, 90,116,120,227, 80, 45,176,171, 58,157,236, 7,207, 71,112, +137, 81,158,122,238,252, 89,103,239, 58,205,184, 12, 24,152, 12,122, 20, 38,223,180,104,243, 31, 40,149,217,247,236, 26,133, 91, +156,137,175,102,205,253,238,131, 54,173, 91,203, 8,196, 79, 69,176,202, 13, 86,145,210, 8, 15, 71, 33,116,202, 66, 36,222, 60, +165,215, 22,114,171,156,239,204, 98,212, 72,139, 10,242,133,127,166, 51, 36,180,175,234,243, 69, 5,249, 66,139, 81, 35,173,254, + 81,199,133,147, 76,136,187,169,217,143, 19,223, 69,124, 91,110,150,144,207,125,156,167, 85, 94, 23, 84, 67,119,129,216, 5,217, +197,122, 48, 32, 96,173, 22, 88,204, 70,168,148, 74,100,231,228, 33, 63, 47, 31, 42,149, 28, 82, 7, 87, 52,111,217, 22,142, 50, + 49,238, 68,237, 1, 33,196,174,121, 13,205, 12, 63,184, 77,251, 46,162,123,105,182, 92, 44, 49,159,224,232,206, 37,197,106,101, + 65, 23,117,110, 98, 98, 77,235, 98,139,213,122, 54,246,126, 98,179,218,190,245,152,219, 73, 10,108,255,101, 53,140,101,145, 77, +179,217,138,123, 25, 26,228,150,104,145,145, 28, 79, 88,171,245, 44,254, 35,240, 42, 15, 0,130, 23,218,188, 9,122,143, 30,130, +117,235,214, 35, 57, 37,141, 93, 52,181, 95,134, 90, 37,127,163, 6, 38,171, 23,202,230,218,208,230, 63, 92,170,115,109,147,117, + 36,166,132,163, 51,146, 42, 19,124,196,158,117,208,229,253,101,167,117,170, 18,161,213,160,229, 29,221,254,254,206,138, 52,109, + 14, 26,198, 69,159,133,195, 65,194, 3,195, 48, 40,239, 46, 92,187, 96, 2,164, 34, 91,223,178,206, 96,193,232, 79,151, 99,251, +242,105, 32, 0, 70,190,117, 69, 91, 89, 57, 97, 91,187,112,138, 47,110,212, 78, 79, 43,200,238, 53,240,179,115,122,147,200, 48, +224,205,136, 91,173, 91,183,150, 75, 36, 18, 72, 36, 18, 56, 57, 57,193,213,213, 21, 46, 46, 46,213,238,187,217,108, 86, 27,141, + 70,119,161, 80, 8,150,101,145,154,154,138,212,212, 84, 40, 20, 10, 20, 22, 22, 66,163, 86, 90,110,156,219,203,107,222,161, 31, +252, 26,132,160, 78, 80, 11,240,185, 12,120, 60, 14,162,142,252, 82, 89, 57, 43, 54, 89,221, 6,173,125,109,240, 56,156, 57,176, +129,220,188,116,116,146,174, 32,225, 23,123,207, 81, 89,119,207,157,161, 67,135,134, 76,156, 56, 81, 48,119,250,196,211,199, 35, +163, 18,246, 30,219, 48,176,180, 84,238, 79, 8,129,139,179,115,102,248,192,142, 71,123,116,106,147,126,238,220, 57,118,231,206, +157, 6,134, 97,238, 86,165,105,171,164, 10,182,158, 59,123,126, 94,151,110,221,177,113,203,206,110,113,247,227,187, 37, 37, 37, +194,191, 78, 3,212,171, 31, 4, 45,227,138,243, 23, 47, 67, 45, 47,216,106, 79, 57,159,137,106, 49,165,165,165,191,135,135,135, +247,190,114,229, 10, 39, 60, 60, 92, 91, 84, 84,116,245,137, 40, 22,169, 78,243,218, 79,111, 22, 2,216, 90,167,219,152, 61,217, + 38,249,199, 0,150, 4,212, 9, 64,212,229,107,184,118,229,250,250, 34,105,192,252,247, 71,191, 55,161,238, 32,238,184, 65, 29, +234,114,189, 92,165,248,109,195, 50,238,145,107,105,203,211,138,173, 27,151, 92,156,183,192,158,115,244,248,193,161, 50,161, 83, + 19, 55,152,173, 4, 44,177, 85,184,142, 98,126,101, 21,239,115,154, 60,163,232,253, 73, 19, 39, 38, 53, 15,109,249,201,232,247, + 38, 9, 90, 54,240,199,141, 71,114,128, 97,224,230, 35, 67,110,110, 46, 46,237,219, 96, 41,205,126,176,158,203,101,191,169,193, +241, 68,105,250,237,192, 39, 54, 39, 20, 21, 21, 33, 42, 42, 10,229, 6,203,211,211,179, 50,163,245,148,102,113,126,206,213, 5, +223,255,220,105,252,187,111, 98, 64,247,102,184,120, 51, 9,198,178,249,154,202,135,146,167, 92,251, 73,248,113,120, 3,227, 7, + 67, 27, 41,117,102, 97,218, 87,169,138, 75,176,173,193,202, 86, 82, 78, 99, 73, 73,201,145,135, 15, 31,118,110,209,162, 69,221, + 19, 39, 78,148,196, 93, 63, 61,245,201, 66,124,246,217,103, 14,235,214,173,147, 18, 66,174, 26,141,198,100,187,246,157,131,223, +162,111,221,114, 55,153, 89, 92,190,126,167,201,107,157, 90,130, 37,192,205,155, 55,177,113,211, 70,253,221,216,219, 63,104,242, +125,190,169,194,188, 84,120, 60,173, 47, 55,234,240,177,102,110,118,218, 15,103,142,239,219,222,166,219, 64,140,154,242,205, 55, + 81,199,119,206,107,213,101, 0,167, 73,155,222,136,190,118, 30,103, 79,156,250,206,164, 46,153,135,234,115, 71, 42, 44,167, 72, + 34,253,168,105,171,110,200, 72, 79, 67,106,226,189,173,250,146, 71, 57,233, 73,220,173, 57, 89,233,147,234, 55,235,132, 43,167, +119, 77,173,194,104, 85,121,205,251,123, 74, 54,156, 56,118,100, 68, 86,214, 79, 62, 26,157, 94, 68, 8,209,139,132,188, 60, 7, +142,106,183,210,238,114,198,155, 10,115,234, 14,125,107,244,164,227,171, 86,253,200,247,118,145, 34,175, 84, 15,165,206, 4,149, +214, 4, 14,195, 32,208, 79, 6,173,170, 4, 23,247,125,111, 54,170, 75,195,129, 36, 83,101,154, 50,175,224,133,165,143,206, 79, +249,108,242, 5, 8,157,253,253,234,245,156, 85,101,180, 78,149,125,123,224,103,147,143, 6, 19, 66, 94,147,121, 5,171, 52, 5, + 15,231, 84,182,239, 12, 99,187,191, 71,245,240,135,201, 98,155,127,204,194, 2, 86,150, 45,139,242, 1,228,113,127, 62, 83,205, +190, 51,236,238,227, 87,145,147, 47,135,206,104,134,193,104,129,201,108, 5,135,203,133,139,171, 11,130,234,133,193,217,197, 9, +249,121, 57,184,118,238, 8, 18, 98, 47, 94,101, 8,230,235, 10, 19,207,217,115,142, 4, 18,151, 96, 95, 63, 31, 78,174,210, 8, +137,144,139,219, 23, 79,152,204, 70,195, 15,118,154,172,231, 52,229,197, 37,203, 63,153,254,249,200, 95, 55,111,241, 9,169,239, +132,172, 34, 29,178, 10,245, 80,233,205,101, 70,140,133, 65, 93,132,216,243, 91,242,172,122,213,114,252, 71,168,212,104, 89, 76, +122,213,254, 83, 55,220,103,206,251,158,251, 40, 41,217,188,240,227,254, 89, 58,181,178, 95,141, 35, 89, 79,240,235,135,245,119, +253, 21, 59,241, 92,119, 33, 97,193, 18,130,163,215,243, 30,119, 23,178,101,153,151, 49, 73, 85, 47, 35,248,228,218,133,221,251, + 77, 61, 19,251, 80,181, 67,167,203,119,126,240,232,135, 82, 0,224,114,185,143, 95,229,185, 89,122,189,222, 88, 77, 23,202,182, + 95,126,249,101,198,164, 73,147, 68,153,153,153, 72, 74, 74,130, 92, 46,135, 88, 44,198,169, 83,167,204, 96, 45, 63,196, 94, 57, +152,250, 48, 58,242,235,224,214,189,107,135,116,232, 7,169, 84, 6, 30,177, 63, 25, 83,234,213,104, 68,235,110,131,214,188, 54, +100, 60,206, 30,252,133,220,188,120,100,178,174, 48, 97, 67, 77,143,165, 92, 46,143, 3,144,248,195, 15, 63,180,220,184,113, 99, +253,233,211,167, 39,111, 91, 51,111, 21, 0, 20, 23, 23, 3, 0, 98, 98, 98,200,228,201,147, 13,122,189, 62,165,180,180, 52, 26, +213, 12,128, 0, 0, 93,161,244,219,141,107,151, 52,207,204,206,125,179, 65,243,182,240,172,223, 22, 62,129,237, 80,170, 50,225, +198,163, 28, 36,199,159, 67,252,229,125, 39,180, 14,150,121,168,225,252,198, 45, 90,180,240,231,112, 56,245,212,106,181, 79,211, +166, 77, 91,200,100,178,152, 22, 45, 90,132,241,120,188,172, 91,183,110,165,213, 68, 43,253,226, 22, 67,157,110, 99, 86,166,171, + 28,123, 36,231,105,195,210, 85,142, 49, 90,145,243,180,194,243, 43, 13,191,114,107, 45, 39,166,162,184,189, 91,148,251,127,219, +176,140, 59,122,194,103,214,123, 10,215,143,121, 18,225,153,154,133,171, 57,185, 31, 68, 12,254,115,122,135,178, 72, 86,217,239, +118,133,233, 21,138, 88, 5,128, 25,177,247,249,107,238,125, 60,113, 65,104,155, 78,239,116,125, 35,156, 99, 17, 56,224,244,193, +159, 72, 74,236,249,189, 60, 98,157,173,179, 99, 53,128,106,187,131,140, 70,123, 76,214,243,101,204,148,117,223,187,115,211,152, +253, 7, 15, 44, 30, 50,104,176,251,218,175,222,198,247, 63, 31,130, 76, 34, 2, 97, 89,188,221,195,127,248,215,227, 26, 15,244, +247, 22,215,218,127, 33,235,210,148, 31,239,205,208,106, 77, 9,118, 68, 98, 72, 81, 81,209,101, 7, 7,135,194,206,157, 59,183, + 23,137, 68, 76, 81, 81, 17,207,203,203,203,226,236,236,108,204,202,202,210, 26, 12,134,253, 0,106, 52,237,184,201,204, 34, 53, + 95,143,195, 7,246,227,206,245,115,136,143,127,168,138,191, 31,191,154,225,145, 31, 53,249,137, 37, 64,141, 27,248, 96, 43, 28, +117, 72,106, 60,234,208,106, 80,253,182,109,253,194,158, 90,189, 97, 76,139,142,253, 81,183, 73, 39,142,201,108,197,221,155, 23, +112, 97,223,143,223,155,212, 37, 51, 95,230, 28,251,213,174, 31, 68,184, 66,252, 30,117, 28,132,101,215, 3, 0, 97,217,245, 49, + 87, 78, 76,106,215,111, 28,220,188,234,182,144,103,196, 48,120,129,217,195, 5, 60,142,230,228,254, 95, 15,166,166,166,226,193, +131, 7,120,244,232, 17, 74, 74, 74,240,219,111,169, 53, 58, 63,218,210,180, 51, 9,247, 57,125,134,189, 61,234,232,240, 17,239, +138,235, 7,133,112,130,107,187,194,221,129,135,135,143,210,144,112, 43,150,125,120,227,132,222,164, 44, 24,162, 43, 77,171,212, +248, 73, 61,154,120, 3,214,153,229,107, 23,118,232,208, 41,248,243, 69,139,219,187,123,122, 85, 88,143, 23, 23, 22, 8,191,152, +114, 36,248,218, 31,191,219,181,214, 33,107,181, 22, 79, 24, 19,206,114,109, 11,133,226,113,156,186,236,232,217, 26, 83,182,247, + 9,107,169, 54,130,255,222,155, 93, 96, 97, 89,104,116, 38, 40, 53, 6, 40, 84,122,228, 22, 20,227, 78,108, 44, 46, 30, 61,130, +164,135,119, 82,204, 70, 99, 36,135,195,236,211,229, 39, 92,172, 89, 79, 19,175,190,187,155, 27, 82, 74,212, 16, 11,121, 72, 75, +184,101,208, 40, 21, 59, 94,244, 58,210, 21, 39,230, 22,112,153,222,225,225, 35, 78,245,236, 51,200,185, 77,199, 94, 82, 15, 39, + 23, 8,120, 4,137,169, 57,136,190,122, 74,147,124,231,146,210,108, 84,247,125, 21,171,190,252,205,169,126,212,161,201,160, 25, + 56,114,112,183, 3, 92, 46, 79,200,178, 22,131,201,104, 24,246, 50, 38,235,175,130, 16,107,214,152,145,111, 62,213, 54,176,176, + 68, 50,242,173,211,186, 39,219, 10,102, 43,145,142,124,235,170,214, 86,129, 84,158,216,231,235,235,214,191,124,237,194,244,244, +226,155, 37, 37,134, 11, 0,178,244,122,253, 11,151, 49, 63, 63,127,193,162, 69,139, 6,104,181,218,198,221,187,119, 23, 57, 57, + 57,161,184,184, 24,145,145,145,230, 99,199,142,221, 47, 40, 40,248, 26, 40,176,232, 16,182, 53, 86,127, 48,226,225,173,200,175, + 27,183,238, 83, 59,164, 99, 63,251, 43, 51,145,100,124,207, 65, 99,153,179,135,126, 33, 55,162, 14,125,160, 43, 76,252,249, 37, + 14,171, 73,175,215, 95,215,235,245,247,102,207,158,221,198,219,219,219,251,235,175,191, 22, 43,149, 74,254,218,181,107,245, 69, + 69, 69,121, 74,165,242, 26,170,200,167,121,158, 24,179, 34, 27, 67, 79,238,255,165, 7,217,255,203,235, 46, 30,181,122, 59,123, +214,110, 40, 47,204, 78, 81, 20,230, 68, 2, 56, 91, 54, 81,100,141,104,217,178,101, 3,134, 97,194, 1, 52,151,201,100,129, 14, + 14, 14, 34, 66, 72, 99,134, 97,226, 88,150,141,109,218,180,233,177,251,247,239,215,104, 50,217,244,139, 91, 12,254,193,157,118, +150,104, 89,129,145, 35,216,153,126,113,139, 1, 0, 10,206,124,174, 5,112,248,126,247, 25, 67,143, 92, 75, 91, 21, 87,234, 60, +181, 48,106,241,145,154,150, 89,145,117, 39,240, 85, 93,255,250,220,251, 89, 0,198,196,222,194,178,187, 49,215,230, 50, 4,124, + 43, 44, 11,117, 5,143,110,189, 10,125, 62,159,175,175, 85,171, 86,133,163, 11, 69, 34,145,222,108, 39,159,116, 0, 0, 32, 0, + 73, 68, 65, 84, 96,168, 42,128,114,209,162,206,197, 70,160,219,150, 3,123,182,140, 57,116,228,240,226,174,175, 13,113, 23,215, +174,141,122, 94, 12,182,204,108, 53,245, 92, 76,225,141, 65,159, 95, 90,151,156,163,143, 69, 13,243, 97,212,106,117, 2,128, 82, +181, 90, 61,152, 16,146,201, 48,140,127,105,105,233,109,179,217,124,183,198,134,128,197,168, 14, 29,218,254,198, 48, 12,143, 88, +216,165,215,248,220,157,250,220,248, 44,188,228,178, 36, 33,245,156,240,233,215, 43, 91, 53, 12,108,212,170,124,173,195,102,117, + 29, 49,113,198,178, 86,117,235, 7,181,250,115,253,195,106,211, 4,136, 89, 91,250,254,129, 77, 75, 47,197,252,113,225, 75, 15, +223,186,117,243,178,146,227, 51, 31,221, 94, 96,213, 43, 15,188,236,121, 78,125, 20,247,227,198, 31,102, 76,207,205, 78,217,168, + 45, 76,188, 7, 0,218,194,196,123,241,209,248,170, 40, 47,107,122,113, 65,242, 15, 47,122, 44, 52, 26, 77,206,142, 29, 59, 92, + 58,117,234,196,241,246,246, 70, 97, 97, 33, 46, 92,184,192,178, 44,155, 93, 99,173,146,148, 11,154, 18,198,109,235,207,107,150, + 10,100,142,253, 44, 22,139, 31, 33, 0,143,199,203, 53,106,149,167, 84, 28,217,231, 40, 77,211, 87,253,204, 96, 25, 0,156,242, +181, 11, 89,150,101,150,174,218,146,198, 23, 59, 86, 56, 25,162, 89,175,146,178, 44,107,247, 90,135,242,140,232,134,175,234,254, +102, 8,153,223,162,117,251, 47,205,102,147,190,236,254,208, 3,208, 19,130, 98, 14,135,185,200,101,205,167,149, 47,209,152, 98, + 24, 56, 17,134, 7, 71, 9, 15, 12, 24,168, 21, 37,164, 38, 57, 89, 21, 26,226,130,132, 56,109, 65,183, 58, 39,141,123, 34,206, +159, 57,241,150,213,106,173, 87, 22, 51, 72, 53,232, 52,123,213,185,174, 91,129, 91, 22,252,251, 57, 94,110,182,152,191,248,139, +236,234, 70,249, 59,105, 6,215,151, 12,174, 93,203, 59, 34, 53,173,224, 70,114,166,118, 43,158, 94, 86,231,101,202,201,245,246, +246,254,138, 97,152,119,132, 66,161,131,209,104,212, 16, 66,182,229,231,231, 47,192,115,139,255,134,241, 37, 94,186, 8,161, 88, + 58,199,164,215,252,174, 45, 72, 24, 85,221,190, 75, 61, 27,245, 22,203,100, 51,244, 58,205, 54,109,126,194,150, 87,124, 60,157, + 69, 34, 81,152,131,131, 3,191,168,168,232, 58, 0,197,223,233,188,183,104,209, 34,128,195,225,212, 99, 89,214, 27,128, 51,108, +163, 66,138,120, 60, 94,118, 89, 68,139,212, 84,179,243,123,123, 61, 94,123,189,217,167,145,151, 30,174, 40,235, 86,124, 76,173, +225,203,197,239,244,235,241,217,214, 3,135, 43, 26,117,248,143,187,230,255,255, 52,187,241, 28,124,139,198,112,132,206, 11, 95, + 11,214,107,139,114,178, 39, 95,190, 91,120, 29,128,234,101,202, 41, 16, 8, 70,155, 76, 38,137, 64, 32,208,153, 76,166, 29,127, +151,125,151,120, 5,143,229,128,216,189, 50, 5, 11,230,214, 51,131, 86,254, 45,215, 18, 55, 36, 36,164,139, 64, 32, 8,176, 90, +173, 82,163,209,168,213,233,116,169,105,105,105,191,163,242,133,207,255,210,114,202,188,130,126, 20, 8, 68, 31, 3,128,201,100, + 88,169, 41, 72,252,180,170,127,172,226,243,255,232,115,228, 81,175,117, 34,143,203,247, 68,217,196,220,172,197, 82,152,159,114, + 51,232,127, 88, 78,202, 11,158, 92,170, 73, 53,169, 38,213,124, 22, 14, 61,158, 84,243,127,169, 41,246,109,226, 47,246,109, 98, +247,164,203,149,124,158, 30, 79, 74, 57, 19, 42,120, 1,176, 99,194, 82, 10,133, 66,249, 11, 96,233, 33,160,252, 47,209,231,198, +103,254,149,159,167,252,231,168, 52, 39,154,169,194,149,214, 36, 36,248, 34,206,246, 44,213,164,154, 84,147,106, 82, 77,170, 73, + 53,255,115,154,213,105,255, 19,187, 36, 39, 60,179,125, 28,192,255, 75,194, 63, 13,171, 82, 77,170, 73, 53,169, 38,213,164,154, + 84,243,191,198, 99,227,197,161,199,130, 66,161, 80, 40, 20, 10,229,175,129,230,104, 81, 40, 20, 10,133, 66,161,188, 28, 21,117, + 29, 82,163, 69,161, 80, 40, 20, 10,133,242, 10,168, 52, 25,158,118, 29, 82, 40, 20, 10,133, 66,161,188, 28,229, 17, 45, 95, 60, + 51,189, 3, 53, 90, 20, 10,133, 66,161, 80, 40,175,134, 92, 84, 20,221, 58,118,236, 24,169,232,119, 10,133, 66,161, 80, 40,148, +255, 15,254,225, 94,228,201, 72,214,132,178,109, 0, 79, 68,180,168,193,162, 80, 40, 20, 10,133,242,119, 49, 91,255, 48,202, 35, + 89,229,175,220,231,140,214,128, 1, 3, 24,106,182, 40, 20, 10,133, 66,161,252,175,248, 55,122, 17,206,179, 59, 72, 79, 51,133, + 66,161, 80, 40,148,255,165,217,250, 55,237, 15,157,222,129, 66,161, 80, 40, 20, 10,229,229,240, 5,208,255,137,237,255,183, 37, +120, 40, 20, 10,133, 66,161, 80,254,237, 76,168,108,155, 70,180, 40, 20, 10,133, 66,161, 80, 94,189,217,162, 80, 40, 20, 10,133, + 66,161,252,147,161, 43,155, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243,223, 78,249, 60, 90, 64,101,243,104, 81, 40, 20, 10, +133, 66,161, 80, 94,136,254,176,205,159, 53,161,236,103,127,106,180, 40, 20, 10,133, 66,161, 80, 94, 45,207, 45,191, 67,141, 22, +133, 66,161, 80, 40, 20,202,171, 53, 88, 27,168,209,162, 80, 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, 40, 20, 10,229, + 47,130, 65,229, 35, 7,206,214, 64,231, 69, 70, 31,156,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 58,237,179, +248,231, 81, 62, 51,252,113,252,153, 8,191,225,255,227,139,233,208, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,153, +240,204,207,199,208,174, 67, 10,133, 66,161, 80, 40,148, 87,107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,175,136, 74,187, 9, +105, 68,139, 66,161, 80, 40, 20, 10,229,229,168,116, 81,105,106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69,141, 22,133, 66, +161, 80, 40, 20,202, 43, 52, 89, 19, 42,252,235,177, 99,199, 8, 61, 70, 20, 10,133, 66,161, 80,254, 87,252,107,189, 72,249,142, + 81,179, 69,161, 80, 40, 20, 10,133,122,145, 26,227,139, 63, 71, 27, 78, 40,219, 6, 64, 71, 29, 82, 40, 20, 10,133, 66,161,188, + 44,253,241,244,200,195, 9,229,219,212,104, 81, 40, 20, 10,133, 66,161,188, 60, 19,170,252, 43,237, 54,164, 80, 40, 20, 10,133, +242,191,228,223,232, 69, 24,122, 90, 41, 20, 10,133, 66,161, 80, 94,138,138,162, 89, 27,232, 97,161, 80, 40, 20, 10,133, 66,249, +107, 13, 23,133, 66,161, 80, 40, 20, 10,229,175, 48, 89,127,245,132,165,116,101,115,170, 73, 53,169, 38,213,164,154, 84,147,106, +254, 87, 76,214,147, 83, 60, 0,160,163, 14, 41, 20, 10,133, 66,161, 80, 94, 22,186,168, 52,133, 66,161, 80, 40, 20,202, 95, 4, + 93, 84,154, 66,161, 80, 40, 20, 10,229,255,217,112, 81,163, 69,161, 80, 40, 20, 10,133,242, 10, 77,214, 83,102,139,230,104, 81, + 40, 20, 10,133, 66,161,188, 28,149,230,104, 49,168,124,228,192,217, 26,124,193,139,140, 62, 56, 75, 53,169, 38,213,164,154, 84, +147,106, 82,205,255,156,102,117,218,103,241,207,103, 2,254,159, 38, 44,165, 67, 95,169, 38,213,164,154, 84,147,106, 82, 77,170, +249, 95,131, 78,239, 64,161, 80, 40, 20, 10,133,242,170,141,213,179, 80,163, 69,161, 80, 40, 20, 10,133,242,114,208,121,180, 40, + 20, 10,133, 66,161, 80,254, 34,124, 97,139,106,149,255, 12,163, 70,139, 66,161, 80, 40, 20, 10,229,213,208, 31,182,168, 86,249, + 79,106,180, 40, 20, 10,133, 66,161, 80, 94, 33, 21,206,163,197, 0,192,177, 99,199, 72,217,118,247, 1, 3, 6, 92,164,199,138, + 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 56,162, 53, 96,192, 0, 6, 64, 20, 61,213, 20, 10,133, 66,161, 80,254, 23,252, + 27,189, 8,231, 25, 39,217,157,158,102, 10,133, 66,161, 80, 40,255, 11,254,141, 94,132,247,140,139,164, 80, 40, 20, 10,133, 66, +249,159,240, 15,246, 34,190,176, 37,194, 31, 47,251, 9,148, 77,249, 64,231,209,162, 80, 40, 20, 10,133, 66,121, 57,202, 71, 27, + 62,183,244, 14,141, 98, 81, 40, 20, 10,133, 66,161,188, 28, 21,205, 12,191,129, 30, 22, 10,133, 66,161, 80, 40,148,191, 16, 26, +209,162, 80, 40, 20, 10,133, 66,121,121,158,140,106,253,191, 69,179,232,202,230, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252, + 47,153,172,167,182,233,204,240, 20, 10,133, 66,161, 80, 40,127, 17,116,212, 33,133, 66,161, 80, 40, 20,202,203, 81, 62,226,240, +201,109,106,180, 40, 20, 10,133, 66,161, 80, 94,161,217,122, 14,218,117, 72,161, 80, 40, 20, 10,133,242,114, 76,168,236, 15,212, +104, 81, 40, 20, 10,133, 66,161,252, 69,134,139, 65,229, 35, 7,206,214, 64,248, 69, 70, 31,156,165,154, 84,147,106, 82, 77,170, + 73, 53,169,230,127, 78,179, 58,237,179,248,231,241, 63,155,176,148, 14,125,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, + 22,218,117, 72,161, 80, 40, 20, 10,133,242, 55, 48, 90,158, 60, 30,239, 75,137, 68,178, 78, 34,145,252,204,227,241,126, 0,224, + 90,211, 47,148,201,100, 83,125,124,124, 30,248,248,248,100, 5, 4, 4,156,112,116,148,126,210, 64,132,174, 0,248,175,104,127, +130, 1,124, 34,145, 72,226,197, 98,113, 26,128,237, 0, 62, 1,224,241, 50,194, 11,252, 48,236,222,199,131, 15, 45,240,195,176, +103,254,212,223,219,219,251, 50,128,222,175,234,164,140,144,162,215,112, 25, 50,134,203,144, 49, 66,250,226,173, 6, 71, 71,199, +119,124,125,125,175,185,187,187,103,251,250,250, 94, 21,139,197,195,107, 40,225,229,237,237,253,189,191,191,127,130,159,159,223, + 10,216, 86, 39,255,219,210, 69,132, 46,237, 69, 40,236, 32,132,170,147, 16,235, 58, 8,241,250,235,128,244, 5,229, 58, 3,216, +231,228,228,116,155,199,227, 29, 3, 48,180,236,250, 26,202,227,241,142, 57, 57, 57,221, 6,176,175,236,115, 47,114,157,126, 15, + 32, 27,192,183,101,219, 31,249,251,251,171, 66, 67, 67,211, 66, 67, 67,127, 13, 12, 12,124,215, 94, 49,169, 84,250,186,191,191, +255,254,128,128,128,180, 14, 29, 58,148,212,170, 85,235, 97,237,218,181,183,136, 68,162,238,180,138,163, 80, 40,148,191, 63, 3, + 1, 44, 6,176, 58, 54, 54, 54,154, 16, 18, 77, 8,137,142,141,141,141, 6,176, 14,192, 18, 84, 30, 66,124,234,125,119,119,247, +249, 11, 23, 46,212,231,230,230,146,194,194, 66,146,144,144, 64,126,156, 51,131,237,227,198, 35, 13, 60, 93,181,190,190,190, 73, +117,106,215,222,213,204,129, 51, 3, 64, 67,123, 52,159,192, 85, 34,145, 92,159, 51,103,142,250,242,229,203,106,163,209,168,102, + 89, 86,157,147,147,163, 62,123,246,172,186, 83,167, 78,106, 0,159, 2,224,214, 64,243, 49,223,248,225, 34,217,244, 21,249,198, + 15, 23,159,124,191,113,227,198,247, 89,150, 37,195,134, 13, 51, 0,168, 85, 19,205,103,169, 5,136,155, 57,193,101,184, 3,242, + 45, 91, 22, 16,178,118, 58, 25, 46, 67,198,139,104,122,121,121, 29,158, 58,117,170, 50, 59, 59,155, 24, 12, 6,146,145,145, 65, + 38, 78,156,168,240,242,242,218, 97,231,190,187,135,132,132,228, 95,187,118,141,149,203,229, 36, 42, 42,138,109,222,188,121,190, +157,102,171,215, 51,101,217,224,231,231,119,162, 38, 47, 47, 47,175,141, 53, 61, 71,237, 68,200, 48, 69, 95, 32,228,102, 36, 57, + 50,172, 3,249,177,117,109, 50,212, 77, 40,239, 44,196, 71,221, 42,158,202,164, 50,205,183,186,117,235,166,185,123,247,174,181, +184,184,152,220,191,127,159, 29, 63,126,188, 30, 64,220,248,241,227,245,247,239,223,103,139,139,139,201,221,187,119,173,221,186, +117,211, 0, 24, 87,131,114,114, 0,108,158, 55,111, 30, 33,132,144,133, 11, 23,146,208,208, 80,210,179,103, 79,162, 86,171, 9, + 33, 36,141, 16,242,171,197, 98, 25, 99,143,166,179,179,243, 59, 83,167, 78, 85,107,181, 90, 82, 14,203,178, 68, 46,151,147,213, +171, 87,107,124,124,124, 78, 84,210,200,160, 93, 30, 84,147,106, 82,205,191,155,230, 63, 25, 95,216,242,180,202, 95,118, 7, 38, + 70,206,152, 49,163,220, 84,157,236,220,185,243,141, 49, 99,198, 68,143, 25, 51, 38,186,115,231,206, 81, 0, 78,223,186,117, 43, +250,139, 47,190,136, 6, 48,178,154, 19,225,218,177, 99, 71,121, 94, 94, 30, 9, 10, 10, 34,117,235,214, 37,121,121,121,132, 16, + 66,110,190,213,138,156,107, 2,146,121,233, 36,137, 60,184,143,140,247,229,145, 46,190,206,102, 95, 31,159, 98, 15, 15,143, 69, +120,122, 77,198,138, 78,238,155, 77,154, 52, 81,197,197,197,169, 19, 19, 19,213,243,231,207, 87,247,236,217, 83, 29, 18, 18,162, + 30, 58,116,168,122,213,170, 85,106,147,201,164,222,184,113,163,218,201,201, 41,174, 2,179,245,194, 70,139,199,227,173,140,141, +141, 37, 73, 73, 73,164, 44, 74, 81,153,166,179,139,139, 75, 95, 87, 87,215, 79, 93, 92, 92,250, 2,112, 6,128, 32,192,161,133, + 51, 2, 62,106,209,160,241,177,145,189, 26,174,238,213,166,213,112, 71,142,220,188,102, 58, 33,195, 2, 94,200,104, 57, 59, 59, +191,243,201, 39,159,168, 12, 6, 3,209,106,181, 68,173, 86, 19,173, 86, 75, 84, 42, 21, 25, 57,114,164, 82, 44, 22,191, 89,157, +166,135,135,199,130, 75,151, 46, 89,242,242,242,200,165, 75,151,200,137, 19, 39,200,218,181,107, 89, 47, 47,175,229, 53,189, 1, +125,124,124,206, 68, 70, 70, 70,199,196,196, 68, 95,191,126, 61,218,108, 54, 71,155, 76,166,104,147,201, 20,125,236,216,177,232, + 3, 7, 14, 68,239,222,189, 59,218,104, 52, 70, 27,141,198,104,131,193, 16, 93,191,126,253, 83, 53, 61, 71,109, 69,200, 52, 94, + 62, 66,200,242, 15,137,226,187,201, 68, 62,173, 31, 41,152,216,149,172,107, 83,155,116,149,224, 40,158, 95,219,179, 66, 77, 62, +159,127, 49, 45, 45,141,157, 53,107,150,177,105,211,166,138,247,223,127, 95,111, 48, 24, 8, 33,132, 24, 12, 6,242,254,251,239, +235,155, 54,109,170,152, 53,107,150, 49, 53, 53,149,229,241,120,103,107, 80,206, 37,229, 38,235,226,197,139,228, 73,212,106, 53, +233,217,179,103, 90,104,104,232,175,245,234,213, 27, 85,157,166,131,131,195,224,153, 51,103,170, 73, 5,152,205,102,162, 82,169, + 72,106,106, 42, 91,183,110,221, 28, 0,238,180, 50,167,154, 84,147,106, 82,163,245,151, 49,161,154,237,138, 15,226, 23, 95,124, + 17, 77, 8,137,158, 61,123,118,116, 89,100, 75, 0,192,161,236,197, 3, 48, 98,230,204,153,209,132,144,232, 25, 51,102,148,127, +166,178, 19, 49,112,239,222,189,166, 21, 43, 86, 16,111,111,111,226,227,227, 67, 86,174, 92, 73, 88,150, 37,121,199,118,144,115, + 77, 64,226,191,140, 32,132, 16,146,176,104, 10, 57,215, 4, 36,121,253, 55,100,244,232,209, 90,169, 84, 58,178,138,147,235,214, +170, 85, 43,149, 78,167, 83,111,217,178, 69, 45,149, 74,111, 2,104, 10, 91, 87, 36, 83, 86,214,119,155, 54,109,170,188,119,239, +158,122,231,206,157,106, 0,243,237,188, 96, 26, 2,232, 33,147,201,134,206,172,197, 79, 36,155,190, 34, 51,189,113, 23, 64,115, + 0,158,101,159,241,155, 49, 99, 6, 33,132, 16,127,127,255, 75,149,104, 58,135,132,132,204, 72, 76, 76,156,107, 54,155,231,198, +196,196,204,109,212,168,209,172, 65,245,125, 59, 28, 26,249,122,152,226,155,201, 97,100,217,180,144, 31,222,104,219,107, 87,120, +247,145,239,213,243,184,252,190,151, 88,251,182, 51, 87,245, 76,215,161, 93, 23,118,173, 90,181,174,103,100,100, 60, 54, 87, 42, +149,138,100,103,103,147,148,148, 20,114,249,242,101,226,235,235,123,174, 58, 77, 31, 31,159,251, 25, 25, 25,100,253,143, 63,146, + 97,205, 27,147,174, 46,142,164,155,171, 35,105,237, 32,214, 52, 1, 90,215,212,104,221,190,125, 59, 26, 64, 52,128,232,226,226, +226,232,226,226,226,232,210,210,210,199,239, 1,136, 86, 40, 20,209, 10,133, 34,218,104, 52, 70, 55,104,208,160,198, 70,171,147, + 24,157,218,137, 81,210, 65, 4,221,192, 90, 30, 57,147,235,123, 88,255, 24,217,129,148,126,216,147,172, 8,171, 69, 58, 11,241, +145,157,154, 3,133, 66, 97, 20,128,233,101,166, 60,162,111,223,190, 90, 66, 8,233,219,183,175, 22, 64, 68,217,251,159,148,153, +172,190,118,150,147, 19, 24, 24,168, 41,143,100, 1,248, 61, 48, 48, 80, 19, 26, 26, 74, 66, 67, 67,137,191,191,191,170, 76,219, +174, 10,173, 97,195,134, 9, 58,157,238,177, 1,148,203,229, 36, 39, 39,135, 36, 39, 39,147,184,184, 56,114,243,230, 77,146,150, +150, 70,246,236,217, 99,117,113,113, 57, 78, 43,115,170, 73, 53,169, 38, 53, 90,127,169,209,122,246,245, 52,199,142, 29, 35,207, +188,245,221,173, 91,183,162,103,206,156, 25, 93,141, 51,155, 48,123,246,236,242,168,215,226, 42, 30,254, 27, 19, 18, 18, 72, 68, + 68, 4, 9, 14, 14, 38,193,193,193,100,204,152, 49, 68,161, 80, 16,245,163,123,228, 92, 19,144,155,111,183, 38,132, 16,162,138, +143, 33,231,154,128, 68,143,238, 72,238,220,185, 67,106,215,174, 29, 89,197,247, 31,189,122,245,106,225,142, 29, 59,242, 96,203, +199,226, 3,104, 15, 96,165, 68, 34,217, 12, 91,119, 97, 93, 0,174, 65, 65, 65, 37, 90,173, 86, 61,108,216, 48, 53,128,128, 42, + 52,187, 5, 7, 7, 39,109,220,184,145, 20, 20, 20,144,146,146, 18,178,180, 83, 35, 66, 54,125, 69, 22,182,174,203,174, 95,191, +222, 48,125,250,116,141,155,155,219, 49, 0,126,195,134, 13,179, 16, 66, 72,215,174, 93,243, 43, 18,115,113,113,233,155,152,152, + 56, 87,175,215,207,149,203,229,115, 75, 74, 74,230, 30, 57,116,104,110,159,230,141, 34, 20,223, 76, 14, 59, 52,242,245,176, 55, +106,185, 14, 93,222,187,205,164,236, 89,227,134,205,238,216, 52, 94,191,228,227, 11,111,213,247,254,254, 69,206,182,167,167,103, +174,193, 96, 32, 0,158,123, 37, 37, 37, 17,119,119,247,140,234, 52,220,220,220,102,127, 50, 34,220,250,102,221, 90, 36,105,197, + 28, 98, 62,179,147,152, 79,108, 33,143,190,155, 70, 6,249,120, 40,219, 11, 56, 51,237, 45,143,143,143,207,153,235,215,175, 63, +101,180, 74, 75, 75, 43, 52, 90, 74,165, 50,218,104, 52, 70, 7, 6, 6,158,122,217,171,190,189, 16, 13,186, 73,184, 55, 99, 34, +186,144,194,201, 61, 73, 95,103,126,218, 75,200,141, 0, 16, 5, 96,116, 13,255,143, 3, 96, 73,185,161,250,238,187,239, 8, 33, +132, 4, 6, 6,106,240,114,131, 81,156, 27, 55,110,156, 50,110,220, 56, 75,147, 38, 77, 10, 58,117,234, 36,191,113,227, 6,185, +120,241, 34, 57,113,226, 4,217,183,111, 31,185,119,239, 30,201,206,206, 38, 9, 9, 9,164,127,255,254,114, 0,221,104, 93, 72, +161, 80,254,206, 84,224, 69,254,241,112,202,119,108,192,128, 1,204, 19, 59,232, 12, 64,220,186,117,235,194, 37, 75,150, 44,131, +109, 46, 8, 38,132,139,183,122, 74,120,119,122, 74,120,119, 66,184,120,171, 44, 98,180, 97,209,162, 69, 11, 66, 67, 67,115, 1, + 72, 0,248, 84,244, 69,132,144, 46,238,238,238,200,200,200,128,179,179, 51,156,157,157,145,145,145, 1, 66, 8, 44, 4, 48, 19, +192, 96, 50, 65,167,211, 65,207, 18,232, 88, 64,169, 86,195,199,199, 7, 38,147,169, 65, 37,229,111,241,246,219,111, 55, 8, 9, + 9, 41,252,226,139, 47,114, 96,203,149,217, 60,118,236,216, 51,191,255,254,123,136, 90,173, 46,137,139,139,211, 55,111,222,188, + 47, 0,159,196,196,196,119, 86,175, 94,141,136,136, 8, 84,241,208,105,222,191,127,255, 19,247,238,221,107, 48,122,244,104, 68, + 69, 69, 97,233,210,165, 40, 42, 42, 34, 0, 96, 48, 24,136,213,106, 53,117,236,216,209,180, 98,197,138,182, 93,187,118,189, 94, +191,126,125, 46, 0,164,164,164, 60,170, 72,144, 97,152, 70,117,234,212,129,193, 96, 64, 97, 97, 33,238,221,187, 7, 71,103,103, +196,230, 20,121,119, 95,190,190,248,203, 67,103,248, 35,218,134,184,125,250,122, 39,195,183,145, 81, 65, 77,253,188,189,141, 38, +179, 79, 66,110,126,206,139,156, 84,129, 64,144, 81, 84, 84, 4,163,209, 8,157, 78, 7,165, 82,137,226,226, 98, 20, 21, 21, 33, + 39, 39, 7, 2,129, 32,169, 58, 13,167,146,146, 75, 41, 87, 47, 50,123,126,250, 14, 13, 44, 37,224,237, 95, 9,222,225,117,104, +104, 44,196,207,115, 38, 58, 26,221, 61,231, 57, 57, 58,150,186,184,184,108, 0, 16, 88,157, 94, 88, 88, 24,138,139,139, 81, 92, + 92, 12,119,119,119,184,186,186,194,213,213, 21,114,185, 28, 10,133, 2, 74,165, 18, 65, 65, 65,104,209,162, 5,182,109,219,246, + 74, 46,238, 63,140, 72,182,192, 58,249,204,195, 28, 8,100, 50,212,119,117,168,211,198, 1,110, 85,252, 75, 79, 62,159,191,215, +205,205, 45, 18,192,135, 0,100, 0, 62,116,115,115,139,228,243,249, 67, 0, 44, 4,176,163,134,197,248,118,222,188,121, 51, 18, + 19, 19,165,119,238,220,193, 23, 95,124,129,249,243,231,227,209,163, 71,107, 0,176,101,159,249,192,221,221,253, 24,135,195,249, + 5, 64, 63, 0,125,125,125,125, 95,171, 70,119,200,244,233,211,245,173, 90,181, 74,136,143,143, 31,114,245,234,213,214,211,166, + 77, 83,164,167,167, 35, 33, 33, 1,190,190,190,240,247,247,135, 90,173, 70,105,105, 41,134, 12, 25,226,236,228,228, 52,146, 86, +227, 20, 10,229,239,108,178,158,241, 34,255,180,136, 86,133,219, 21,182,168,165, 82,233,188,232,232,232, 14,161,161,161, 60, 0, +123, 0, 32,132,139,225, 67, 58,182,220,124,104,195,119,161, 7, 86,204, 9,237, 19, 26,180, 57,132,139,242, 81,108,199, 90,183, +110,237, 26, 29, 29,221, 81, 36, 18,125, 84, 73, 33, 8, 0,184,186,186,194,217,217, 25, 46, 46, 46,112,117,117, 5,203,178, 80, +107,245,208, 88, 1,149,222, 8,133, 66, 1, 85,217,182,218, 96,130, 70,163,121,252,191, 21,208,125,220,184,113,133,171, 87,175, + 46,200,205,205,253, 14, 64,243,136,136,136,193,171, 86,173,194,249,243,231,245,253,130, 27,186, 47,234,210,114, 65,211,220, 71, +115,131,249, 24, 15,224,210,165, 75,151,208,177, 99, 71, 48, 12, 19, 94,145,160, 68, 34, 89,183,107,215, 46, 73, 92, 92, 28, 26, + 54,108, 24, 23, 30, 30,254,214,119,223,125,215, 64,166, 46,185, 2, 0,150,226,188,184, 41, 83,166,124,181,104,209,162,194,194, +194, 66,147, 86,171,245, 26, 52,104, 16, 50, 50, 50,144,157,157,253,123, 37, 38, 51, 33, 38, 38,134, 40, 20, 10, 36, 39, 39, 35, + 38, 38, 70,242,213, 87, 95,181,181,114, 56,131,179,224,248, 94, 68,167,214,109, 71,183,111,137, 29,215,238, 8, 46, 63, 76,113, +105, 93,183,150,235,237,204,220,122,102, 6, 73, 47,114,182, 85, 42,213,202, 5, 11, 22,168,213,106, 53,178,178,178,112,247,238, + 93,196,199,199, 35, 45, 45, 13, 75,151, 46, 85,151,148,148,172,170, 78,195, 79,204,251,236,251,105, 99, 25,222,253,223,129, 59, + 23, 1,173, 10,208,169, 97,120, 16,141, 95, 31,228, 97,237,254,131,194,244,140, 12,151,221,187,119,143, 11, 8, 8,136, 6, 16, + 84,149, 30, 33,182, 83,200,225,112,158, 53,161,224,112, 56, 42, 0,121, 50,153, 44,211,209,209, 49,147,195,225,228, 17, 66, 52, +175,164, 37, 97,129, 9, 92, 46, 32,148,128,195,175,114,105,207,183,194,195,195,119,101,102,102,246, 73, 78, 78,238,176,106,213, +170, 5, 98,177, 56,118,213,170, 85, 11,146,147,147, 59,100,102,102,246, 9, 15, 15,223, 5,224,221,154,124,127, 96, 96,224,148, +185,115,231, 98,233,210,165,104,209,162, 5,130,130,130,180,243,230,205, 91, 9, 96, 14,128,143, 2, 3, 3,175, 76,153, 50,229, +253,130,130, 2,159,172,172,172, 22,107,214,172,153,184,114,229,202, 54, 57, 57, 57,226,106,164, 59,247,238,221, 27, 39, 79,158, + 4,128, 92, 0,201,197,197,197,150,156,156, 28, 52,110,220, 24,109,219,182,133, 90,173,134, 90,173,134, 92, 46, 71,157, 58,117, +192,178,108, 7, 90,149, 83, 40, 20,202,255,171,225,170,216,104,137,197, 98,215,176,176, 48,212,175, 95,223, 21,101,163,181,220, +133,188, 89,159,142, 27, 33,117,136, 62, 5, 38,230, 28,194,187, 52,147,186, 11,121,179,202,254,133, 87,167, 78, 29, 81, 88, 88, + 24,100, 50, 89,173, 74,190, 60, 42, 47, 47, 15, 97, 97, 97,112,113,113,129,179,179, 51,194,194,194, 96, 50,153,160, 80,169,160, +177, 2, 90, 51, 11,133, 66,129,146,194,124,104,173,128,197,209, 29,105,105,105,224,114,185, 41,149,104,250, 54,108,216,176, 48, + 54, 54,182, 16,192, 37, 0,147,230,207,159,143,153, 51,103,226,235,175,191,222, 37,205, 77,237,189,235,228, 97,247,223,230,125, +224, 25, 36,100, 70, 0, 48,101,102,102,194,197,197, 5, 50,153,172, 66, 99,208,181,107,215, 86, 50,153, 12, 91,182,108, 33, 89, + 89, 89,157, 96, 27,194,159,194, 48, 54,179, 39,225, 64, 1, 96,101,116,116,116,187,175,190,250,234, 97,175, 94,189,248,237,219, +183,199,194,133, 11, 1,224, 88, 69,154,114,185,252,143,119,223,125,215,120,225,194, 5, 60,120,240, 64,118,232,208,161,225, 11, + 23, 46,108,150,158,158, 46, 58,122,226,212, 27,219, 51,149,195,191,139,188, 44, 94,116, 58,234, 15, 15, 39, 89,211,122, 30,110, +136, 73,207, 22, 88,185,184, 81,221, 25,109,199,231,142,235, 46,230,197,116, 17,113,114,187,139,121,209,109,248,220,177, 42,149, +106,247,145, 35, 71, 78, 79,155, 54, 77, 93, 80, 80, 0, 71, 71, 71, 20, 23, 23,227,219,111,191, 85,199,196,196,236, 55, 26,141, + 71,171,211,181,178,164,149,127,221, 0, 32, 41,246,241,123, 38,150,224,134, 81,128, 1,147, 62, 70,112,227,198, 48, 26,141,104, +222,188, 57, 51,127,254,124,153,179,179,243,231,213,154, 30,206,115,151,155,133, 97,152, 60, 66, 72,182, 90,173,206,146, 72, 36, +233, 2,129, 32,189,164,164, 36,139, 16,146,255, 42,124, 22,225,224,179,142,205, 3, 1,145, 4,233,197,234,156,155,106,148, 84, +244, 65, 71, 71,199,177,107,215,174, 21,111,218,180,201, 60,101,202, 20,195,196,137, 19,249, 58,157,206,107,226,196,137,252, 41, + 83,166, 24, 54,109,218,100, 94,187,118,173,216,193,193, 97,232,139, 20,196,108, 54, 35, 54, 54,246,187, 71,143, 30,201, 96,155, +110,228,227,121,243,230, 69, 36, 38, 38,138, 87,175, 94,141,125,251,246, 97,223,190,125, 24, 60,120, 48,166, 78,157,138,185,115, +231, 86, 37, 39, 13, 13, 13, 13,115,119,119,199,197,139, 23,115, 0,164, 3,104,229,224,224,224, 56,120,240, 96,244,233,211, 7, +122,189, 30, 38,147,233,177,209,226,114,185,112,113,113,113,167,117, 32,133, 66,161,252,229, 38,235, 41,179,197, 3,128,242, 80, +221,128, 1, 3,152,170, 30,140,214,210, 2,200, 53, 90,164, 41,180,200, 40,101,159,250, 27,203,178, 85,126,123, 78, 78,206,209, +107,215,174,141, 13, 11, 11,227,229,228,216,122,196,194,194,194,160,213,106,145,115,231, 58, 52, 44, 32,107, 24, 2,141, 70,131, +210,248,219,112, 8,237, 0,247,254,163,177,124,245,106, 67,113,113,241, 79, 21,105, 10,133, 66,126,237,218,181, 11, 83, 82, 82, + 44, 0, 74,156,157,157,123, 7, 4, 4, 32, 42, 42, 10, 0,118, 16,224,123,196, 92, 0, 46, 30, 0,177,133, 84, 28,234,212,169, +131,130,130, 2,168,213,234,168,138, 52,175, 93,187,150,104, 54,155,155, 15, 26, 52,136,217,186,117,235, 30,165, 82,249, 53,128, +187, 6, 22,220, 59,153,249,208, 88, 33, 6,240,186,171,171,235, 39,115,231,206,125,109,202,148, 41, 56,114,228, 8, 34, 35, 35, + 77,176,229,130, 93,171, 64, 86,145,156,156,252,243,244,233,211,219,115, 56,156, 73,103,206,156,177, 4, 5, 5, 41, 77, 38,147, +181, 81,112, 48,231,235,249,223, 8, 62,156, 52,193,165, 88,139,251,125, 26,249,118,100, 24,224,126,118, 65,250, 35, 53,138,171, + 58,166, 93,133,220, 99, 67, 58,133,118, 29, 27, 62,208, 65,214,176, 41, 52,247,174,251,252,188,247,196,114, 73, 76,226,128,139, + 5, 5,131,143, 28, 57, 50, 60, 42, 42,234, 67,163,209, 88, 95, 36, 18, 37,201,229,242, 21,106,181,186, 90,147,197,229,114,251, + 27,124,107,187,202, 75, 74, 32, 46,139, 68, 41,205, 44,138, 12, 22, 60,112, 9,194,200,218,254,143,187, 65,243,242,242,224,227, +227,195, 88,173,214,129, 85,105, 70, 70, 70, 98,192,128, 1,229,198, 19, 12,195,128, 97,152,162,224,224,224,124,145, 72, 84, 44, + 16, 8,148,223,127,255,189, 94,175,215,131,199,227,137,173, 86, 43,247,101,174,246,182, 82,120,137, 8,179,110,226,160, 30,189, + 90, 52,109, 76, 46,221,188,195,148,106,245,191, 86, 17, 5, 92, 19, 24, 24,200, 43, 41, 41, 57, 10,224,129,217,108,254,109,207, +158, 61,226,119,222,121, 71,191,119,239,222, 81, 0, 26, 44, 91,182,108,184, 90,173,174,209,146, 10,143, 30, 61, 90,179,104,209, +162, 25,179,103,207,198,182,109,219,166, 60,122,244,104,102, 89,164,107,240,220,185,115,241,253,247,223, 99,219,182,109,236,131, + 7, 15, 78,176, 44,251,104,218,180,105,161,222,222,222, 69,185,185,185,143,170,144,109,221,183,111, 95,195,149, 43, 87,132, 42, +149,234, 50,128, 79, 38, 79,158, 60,174, 93,187,118,202,240,240,112,135,146,146, 18,185, 84, 42, 21,110,220,184,209,149,199,227, + 65,163,209,128, 97, 24,168, 84, 42, 35,173, 7, 41, 20,202,223,149,202,188,200, 63,132, 74,159, 13,188,138,118, 80,171,213,230, +103,100,100, 52,206,206,206,182, 0,176, 0, 64,177,209,178,120,209,198, 3,155,134,182, 15,148,229,154,205, 56,116, 51, 78, 91, +108,180,148, 39,191, 91,178,179,179, 85,233,233,233,142, 58,157, 78, 93,201,119,253,190,110,221, 58,221,133, 11, 23, 28,147,147, +147, 97,181, 90,209,170, 85, 43, 36, 36, 36,160,244, 65, 44,100,141, 91, 65,214,109, 0,226,162,111, 34, 38,242, 44, 82,213, 70, +203,195, 57,139, 20,106,141,102,174,201,100, 58, 84,145, 32,159,207, 47, 1, 64, 8, 33, 86, 0, 80, 42,149,119,213,106,117, 23, +111,111,111,220,191,127, 95,166,177, 98,234,240, 89,203, 87, 17, 66,172, 2,219,104,174, 79,195,195,195,113,235,214, 45, 0,184, + 85,145,166, 82,169,156, 50,126,252,248, 11, 91,182,108,225, 37, 39, 39,247,217,180,105, 83,159,135, 15, 31, 18,166, 36,195,122, + 69,203, 71,131,136,169,109,214,215, 9,142, 28, 48, 96, 0,124,125,125,177,113,227, 70,172, 88,177,194,252,193, 7, 31, 36,174, + 88,177,162, 77, 65, 65,193,111,149,236,191, 66, 46,151,159,114,119,119,255,176, 89,179,102, 42,141, 70,131,226,226, 98,228,228, +228,192,205,221,157, 99, 1,167,163,167,139,203,111, 71,243, 84, 50,222,169, 63,112, 61, 43,183,202,104, 86,123, 62,247,221,161, + 93, 91,118,253,104,246, 44, 7, 92, 57, 4,102,252, 92,144, 77, 11,240,241,152,225,142,122,195,111,221, 52,119,210,222,137, 86, + 42,183, 43,149,202,125, 53,188, 88,250,118,236,216,113,215,162, 69,139, 36, 95, 46, 93,132,101,141,107,193, 82, 92,140, 66,131, + 21, 69, 6, 11,148,165, 15,112,255,126, 28,220,221, 61,144,154,154, 10,189, 94,143,248,248,120,194,229,114,143, 86, 23,209, 41, +231,137,238, 66,185, 72, 36, 42,230,243,249,249, 60, 30,175, 36, 57, 57, 89,163,215,235,193,225,112,100, 86,171, 85, 98, 71, 89, +107,123,120,120, 76,131,109, 50,209, 35,170,162,162,149, 97,124,184,128,135,238,117, 60,220,223,152, 51,241, 29,143, 0, 63, 47, +121,114, 98,146,249,167,211, 87,139,244,134,202, 7,107, 0, 56, 86, 82, 82,242, 56, 34,185,119,239,222,143,247,238,221, 59, 14, +192,102,216,214,221, 58, 43,151,203,215,191,192,205, 55,103,255,254,253, 51,102,207,158, 13,137, 68,242,120,242, 84,137, 68, 34, + 6,128,157, 59,119,226,254,253,251,237, 80,150,175,197,178,236,174,220,220,220,234, 52, 27,132,132,132, 36, 31, 56,112, 64, 8, +192,111,242,228,201, 29, 86,173, 90,133, 49, 99,198, 20,198,197,197,181, 7,144, 2,160,193,164, 73,147,110,108,219,182,205,149, +101, 89,148,150,150,194,104, 52,166,208,170,156, 66,161, 80,179,245,151, 16, 6, 32, 6,182,249,179,250, 3, 56, 14, 91, 90, 71, +165,248,151,185,179,211, 0, 6,149, 63, 31, 43, 73,134, 7,108, 35,178, 78, 1,248, 5,128,119,101,162,238,238,238,159, 71, 68, + 68,152,179,178,178, 72, 94, 94, 30,217,183,111, 31,249,116,108,132,245,245,134,126,108, 67, 63,111,141,167,167,103,130,175,135, +219,175, 45,165,248, 20, 64,109, 59,118, 44,226,225,195,135, 19, 34, 34, 34,198,150,125,239,216, 93,187,118,169,207,156, 57,163, +230,114,185,199, 96,155,218,161,220, 80,190, 59,112,224, 64,181,193, 96, 80, 7, 7, 7,151,192,150,184, 95, 25,195,187,119,239, + 94,122,242,228, 73, 98,181, 90,159,155,163,168,176,176,144, 68, 70, 70,146, 78,157, 58,201, 1,188,243,218,107,175, 69, 93,189, +122, 53,170,115,231,206,251,171, 43,176,135,135,199,172, 59,119,238,220, 74, 75, 75,139, 62,126,252,120,244,111,191,253, 22, 61, +105,210,164,187,161,161,161,186,196,196, 68,214, 98,177,144, 59,183,111,147,224, 70,141, 52, 0,234, 84,166,211, 83,194,187,161, +220,184,128,232, 23,142, 33,250, 33,254, 4, 0, 81, 45,255,156,228, 79,233, 69, 18, 62,124,131,244, 16,115,175,189,200,149,226, +230,230,118,250,214,173, 91, 68,165, 82,145,123,247,238,145,119, 7,244, 33,215,198,245, 34,167,250, 4,146,109,221,234,145,229, +189, 67, 73,159,110, 93,200,186,117,235,200,129, 3, 7,200,172, 89,179, 88, 15, 15, 15, 21,170,200,209,242,241,241, 57,179,103, +207,158,104, 0,209, 92, 46, 55, 90,169, 84, 70,171, 84,170,163,153,153,153,107,131,131,131,103, 52,107,214,108, 84,227,198,141, +123,246,168, 87,103,198,107,142,162,132, 94, 78,226,164, 70, 14,210,229,120,126,222,171,199, 56, 3,117, 26, 54,104,160,186,120, +241, 34,107, 48, 24,200,229,203,151,217, 38,141,130,244,203,222,238,187, 63,117,227,146,253,250,147, 91, 79,107, 15,111,184,186, +247,189, 1,177,221,165,156,173, 29,100,143,167,227,120, 81, 70, 0, 56,132, 63, 71, 29, 70, 0, 56,140,170, 71, 33,114, 0,108, + 94,184,112,225,147, 35, 13, 1,128, 19, 26, 26, 26, 77, 8,137, 14, 13, 13,141,174,105, 65,164, 82,233,180, 35, 71,142,204, 11, + 8, 8, 88, 26, 30, 30,190, 81, 46,151, 31, 31, 53,106, 84, 44,108,131, 65, 24,216, 86, 71, 24, 88,187,118,237,194,152,152, 24, + 18, 21, 21, 69,134, 13, 27,166, 18, 8, 4,163,105, 53, 78,161, 80, 40,127, 9, 19, 42,249, 89, 37,139, 98, 99, 99,203,231,208, +154, 92,149,248,204,153, 51,163,111,221,186, 21, 13,219, 44,241, 85,194,227,241, 14,126,240,193, 7,196,219,219, 91,237,229,229, +117,144,207,229,142,243,151, 32, 12, 47, 54,212,189,203,246,237,219, 7,175, 89,179,166, 63,128,118, 0,248,181,106,213,202,201, +203,203, 83, 95,189,122, 85,221,169, 83, 39,181,135,135, 71, 65, 72, 72,136,122,217,178,101,106,179,217,172,158, 54,109,154, 26, +207,207,247, 85, 17, 98, 0, 31, 10,133,194,131, 77,154, 52,137,157, 51,168,167,121,233,212,113, 36, 34,208, 83, 13, 96, 13,128, + 15, 0,184, 0,224, 15, 31, 62,252, 92,124,124,252,233,144,144,144,255, 99,239,186,195,162, 58,214,247,123,206,158,237,187,176, +212,101,233, 42, 69, 69, 65,197, 26, 11,246,142,189,196, 30,141,229, 26,189, 26, 19, 53,182, 32, 24, 53,106, 98,140, 73, 76,212, + 24, 81,209,136, 5, 75,176,163, 70, 52, 86, 44, 8,138,130, 32, 77,202,210,150,133,101,217, 62,191, 63, 20, 46, 49,148,197, 36, +191,155,228,238,251, 60,251,176,236,206,121,119,102,206,204, 57,239,249,230,155,239,219, 97, 6,175, 75,235,214,173, 47, 29, 60, +120, 48, 46, 42, 42,234,238,146, 37, 75,226,236,237,237,179,147,147,147, 77,149,149,149,164,164,164,132, 40, 20, 10,114,234,212, + 41,163,157,157,221,215,117, 54,156,199,202, 37,231,247,215, 26,194, 33,107,229,100,210,141, 75,191,120,147,145, 34, 18,137,138, +139,138,138, 72, 94, 94, 30, 73, 77, 77, 37, 71,143, 30, 37,131,186,118, 34,145,255, 26, 77,246,191, 59,130,124, 54,168, 19,233, +108,197, 87,201,172,196,113, 86, 86, 86,114,115,118, 29,202,100,178, 11, 26,141,166, 58,124,131,155,155,219,221, 22, 45, 90, 68, + 5, 4, 4,124,113,242,228,201,133, 91,182,108, 25,209,187,169,231, 71,235, 7,118, 85, 87,196, 28, 38,101,135,190, 33,203,218, +251, 86,190, 18,243,181,194,213,222, 46,226,202,207, 63,155,170,196,175,193, 96, 32,199,143, 29, 35,227, 7,247,143, 47, 61,251, +227,247, 87, 87,207, 63,248, 65,123,223,227,221,248,152, 80,159, 96,171,126, 20, 17,195, 62,200,154,222, 54,196,195, 46,183,135, +132,254,166,139,213,175,210, 75,141,247,245,245, 77, 37,132,228,182,108,217, 50, 21,192,254,150, 45, 91,214,252,127,122, 29,180, +213,193, 73, 67,137,255,220,133, 0, 0, 32, 0, 73, 68, 65, 84, 67, 67,201,171,249, 65, 3, 8, 89,183,110,221, 93, 66,200, 93, + 31, 31,159,107, 0,208, 86, 4,135,158, 18,250,251,225, 94, 78, 69, 61, 37,244,247,109, 69,181,167,140,242,228,160,121, 15, 71, +225,213, 17, 62,206,101,189, 92, 37,177,251,195,127,216, 52,100,200,144, 93, 0,190, 6,240,137,189,189,253,213, 9, 19, 38, 60, +218,183,111,223,163,205,155, 55,235,146,147,147,201,140, 25, 51, 84, 60, 30,239, 19,203,117,208, 2, 11, 44,176,224, 79, 67, 85, +100,120,231,198, 8,173, 97, 31,125,244,209, 93, 66, 72, 85, 44,173, 41,181,148, 25,190,114,229,202,187,132,144,170,232,240,175, + 7, 48,171, 45,160, 89,232,182,109,219, 8,143,199,251,254, 13, 27, 83,147, 83, 54,114,228,200, 46, 74,165,178,163,147,147, 83, +199, 87,150, 43,119, 7, 7,135,212, 3, 7, 14,148,171,213,234,114, 66, 72,185,193, 96, 40,143,139,139, 43,239,213,171, 87,121, +141,167,254,134,234,249, 43,172,144,225,218,157, 85,239,146, 21, 50, 92,123,237,171,201,187,119,239, 62,147,150,150,246,147,181, +181,245, 82, 51, 57,221, 29, 29, 29, 67,236,236,236,206, 57, 56, 56,172,176,179,179,203,213,233,116,164,164,164,132, 60,125,250, +148,252,252,243,207,228,198,141, 27,196,206,206, 46,187,174,122,246, 21, 48, 55, 75, 54,205, 35,166,221,235,136,246,171,229, 4, + 0, 81,108, 89, 70, 10,191, 13, 35,119,102, 13, 36,189,248,172,235,111,208,159,176,177,177,217,121,236,216, 49, 83, 74, 74, 10, +137,142,142, 38,167, 78,157, 34, 11, 22, 44, 32,205, 93,156, 53, 93,184,116,126, 15, 30,115,238, 77, 2,150,106, 52,154,187, 74, +165,242,110,121,121,249, 93, 63, 63,191,187,157, 58,117,138,234,210,165,203, 23,135, 15, 31, 94,184,126,253,250, 17,125,173,120, + 79, 43, 98, 14, 19,178,100, 48, 33,243,186,147,103, 51,123,145, 62, 2,230, 65,157,156, 78, 78,217, 85,209,218, 85, 42, 21,137, +141,141, 37,151, 46, 93, 34, 50, 7, 7,101,144,128, 53,187, 27, 15, 61,187, 89,195,198,220,122,246,150,208,225, 55,191,253,212, +168, 62,179,143,252, 56,109,176,161,151, 13,189,173, 70,185, 72, 66, 72,238,152, 49, 99,158, 19, 66,114,143, 30, 61,154, 69, 8, +201, 29, 61,122,244,115, 66, 72, 46,128,131,181,113,190, 22,156,116,247, 43,145, 53, 47, 52, 52,244, 46, 33,228,110,104,104,232, + 93,224,101, 16,213,158, 18,122,207,173, 29,159,153, 52,167,246,144,195, 51,134, 26,123, 74,232, 61,181,214,211,134,249,233,222, +238, 45, 68,123,110, 63, 57,182, 96,146,177,187,204,250,138,175,175,239,103, 11, 23, 46,140,186,113,227,198, 67,163,209,248, 40, + 53, 53,245,209,215, 95,127,253,232,173,183,222,186,102,111,111, 31,207,229,114,223,107,232, 28,253, 65,176,112, 90, 56, 45,156, + 22, 78, 11, 94, 55, 48,213,243,221, 79, 27, 55,110, 20, 17, 66, 62, 24, 59,118, 44, 54,108,216, 48,190,117,235,214, 19, 92, 93, + 93, 29, 1, 32, 39, 39,167, 34, 33, 33, 65, 57,118,236, 88,132,132,132, 96,211,166, 77, 95,224,165, 47,203,255, 39,242,142, 31, + 63,238, 54,127,254,124,249,250,245,235, 77, 51,102,204,104, 9, 32,161,176,176,176,249,164, 73,147,230, 49, 12, 51,214,211,211, + 51, 32, 55, 55,183, 64,173, 86,239, 7,176, 3, 13,172,153,214, 5, 30, 13, 99,135, 38,206, 56, 71,195, 88,227,227,193, 33, 33, + 33,111,143, 30, 61, 90,183,101,203, 22,131, 82,169, 60,105, 38, 93, 86, 65, 65,193,154,170,127,236,236,236,100, 15, 30, 60,120, + 79, 42,149,210,169,169,169,208,104, 52, 72, 73, 73, 49,225,229,210, 84,173, 40, 55,144,173,223, 29,189,208,226,131,201,193,214, + 21, 73,247,193, 97,177,160,103,115,145,119,243, 28,118,199, 38, 41, 85, 58,124,245, 38,237, 84, 40, 20,159, 47, 88,176, 96,210, +210,165, 75,249,158,158,158,212,245,235,215,113,232,208, 33,141, 92, 46, 31, 4,224,202,127, 66, 63, 53, 14, 38,147, 9, 92, 46, + 23, 0,176,108,217, 50,208, 52,205,150,203,229, 92,138,162,120, 20, 69, 9, 41,138, 98,233,211, 30,193,164, 44, 65,126,137, 2, + 89,249,138,122,249,140, 38,211,161, 91,183,110, 45,106,215,174, 29,125,231,206, 29, 20, 20, 20, 32, 37, 37,133, 24, 9, 57, 24, +171, 54,190,116, 74,212,152, 95, 63,161,157,253,200,182,182, 60,154, 27, 30,130, 32, 45,205,218,110,194, 24,188,140,165, 5, 0, +187, 41,138,226, 0, 40,242,243,243,235,253,248,241, 99,129,159,159,159, 58, 41, 41,233, 12, 69, 81,174, 0,246,212,198, 41, 16, + 8, 10, 1, 20, 30, 61,122, 20, 0,102,225,101,231,181, 95,189,122,117,110,108,108, 44, 66, 67, 67,243, 1,108, 3, 0,177,173, +253,240, 0, 9,135,226,238, 13,197, 91, 26,208, 95,153, 72,173, 86, 87,177,212,169, 79,107, 17, 13,246, 15, 31,163,163,172, 5, +205, 53,232,252,195,194,194, 98,203,203,203, 53,145,145,145,218,233,211,167,179,146,147,147,111, 3,184, 10,224, 40, 94,249, 88, + 90, 96,129, 5, 22, 88,240,167,226,117, 11, 86,131, 62, 90,175,171,214, 13, 0,190,123,242,228, 73,117, 82,233, 39, 79,158,220, + 5,176, 29, 47,163,193, 15,107,132,226, 93,245,202,162,181,227, 13, 27,243, 58, 39, 63, 48, 48, 80,240,248,241, 99, 14,106, 79, +226, 72,189, 1,231,111, 80, 91,174, 67, 95, 95,223, 47,245,122,125,212,246,237,219, 15,179, 88,172, 73,191, 67,237,123,250,248, +248,148, 28, 56,112,192, 20, 29, 29, 77, 86,173, 90,101,116,118,118, 46,193,111,125,180,126,197, 25,196,101, 29, 89,220,210, 85, + 25, 55,165, 59,121,182,112, 56,185, 58,185, 23,153,237, 42, 86, 6,241, 89,135,126,231, 83,137,143, 68, 34,217, 45, 16, 8,148, +214,214,214, 23, 0,116,253, 61,231,200,222,222,126,159, 76, 38,187, 80,243,229,228,228, 20,229,232,232,248,141,131,131,195, 42, + 27, 27,155, 57, 94,124,238,150,133,205, 93, 42,227, 71,250,145,152,110,142,100,178, 3,247,245,165,195,215,235,233,236,229,229, + 85, 20, 17, 17, 97,250,233,167,159,200,242,229,203, 77, 77,154, 52, 81,162, 30,191,182,122, 45, 90, 54,172, 67, 71, 70,119, 49, +229, 15,117, 37, 27, 90, 90,153,122,219,178,234,218,161, 56,249,149, 0,158,214, 16,167,183,183,247,118, 66, 72,248,218,181,107, +195,241,159, 92,160,253,195,194,194, 86, 19, 66, 86,135,133,133,173, 6, 48, 16, 0,130, 36,116,196,254, 17, 29,140, 57, 67, 92, +200,167, 45,197,198, 32, 9, 29, 81,171, 37,211,142, 57,126, 98,230, 80, 83,238,204,110, 36,196, 71,100,236, 98,199,187,200,229, +114, 23,226,165,197,185, 19, 0,174,229,169,217,194,105,225,180,112, 90, 44, 90,127, 57,225,101, 22,100,118,118,118,187,155, 53, +107,118,216,211,211,243,176, 88, 44,254, 2, 47,157,230, 27,123, 34,188,214,173, 91,167,148, 72, 36,109,255,192,147, 43, 5,224, +138,223, 38,206,253,195, 6,204, 26,103,204, 79, 94, 58,254,193, 26,103,204,175,241,113,167,150, 45, 91,126,138,151,209,188,127, +239, 32,244,180,179,179,251,218,206,206, 46,251,149,111,150,167, 57,156, 29, 88,172, 73,189,249,172,235, 93,185,116, 94,111, 62, +243, 75, 71, 22,107,226,223,116, 2,214,183,217,162, 46, 78, 55, 7, 7,135, 45,118,118,118, 57, 14, 14, 14, 95, 55, 82,100,253, +138,179,173, 0,206,125,108, 88,199,187, 90, 81,170, 62, 18,214,209, 14,194,186, 55,117, 52,162,237,129,161,161,161,239, 16, 66, +222,113,113,113, 25, 91, 67,248, 7,132,132,132, 4, 19, 66,130,171, 34,192,119, 18, 66,218,203,134,117,160,155, 53,165,232,101, +195, 58,208, 73, 8,105, 93,245,236,109,195, 58,212,205,154, 82, 4, 89,211, 7, 60,120,104, 98,185,152, 91, 56, 45,156, 22, 78, +139,208,250,103, 8, 45,203,128,177,112, 90, 56, 45,156, 22, 78, 11,167,133,211,194,105, 17, 90,181, 11,171,154,175,234, 21, 54, +198,210, 55, 22, 88, 96,129, 5, 22, 88, 96,129, 5,191, 11,117, 6, 44,165,234, 81,165,141,113,108,127, 19,101, 27, 99,225,180, +112, 90, 56, 45,156, 22, 78, 11,167,133,243,127,142,179, 33,238,255,239,141,117,127,107, 88,204,170, 22, 78, 11,167,133,211,194, +105,225,180,112, 90, 56,255,103, 65, 91,186,192, 2, 11, 44,176,192, 2, 11, 44,176,224,119, 33,240,213,223,215, 3,151,214,238, +163,197,116, 90,155,111, 48, 24,164, 0,192, 48,140, 92,127,123,149,115,125,236,108,160,175,225,101,250, 29, 48,192, 44, 3,112, +161, 22,206, 11, 6,131,193,246, 21,103,137,254,246,170,129,245,114,118, 90,123,174,102,121,195,237, 85,253, 95, 47, 67, 0, 22, +187,211,218,156,215,234,234, 98,110,175, 80,248, 85, 76,172, 63,173,158,127, 23,206,255,101,176, 59,175,205,215,235, 95,142, 35, + 54,155,145,235,110,213, 63,142, 56,157,215,230,212, 44,175,191,181,202,169, 62, 78,161,128, 87,228,237,234,248, 69,125,156,169, + 57,133, 31,168, 42, 42,237,235,227,108,236,220,116,119,118,238,107,124, 53, 55, 89,192,172,236,220,220, 11,127,177,177,212, 1, +192, 42, 0,214, 53, 62,139, 7,240,190,101, 84, 90, 96,129, 5,127, 51,161,117, 15, 47,243, 28,238,124, 37,182,118,214, 41,180, + 12, 6,131,244,238,177,213, 80,105,128,190, 83,215, 74,189, 70,238,248, 77,162,100, 67,101, 9, 87,145, 24, 25,192,210, 43,109, + 29, 25,157,117, 78, 78, 14, 5, 0, 20, 69,125, 15,192,163, 22, 78,219,187,199, 86,163, 66, 11, 4, 77, 8,179,245, 0,172, 11, + 56,156, 15, 5, 34, 81,111,181, 90,221, 26, 0, 4, 2, 65,162, 90,165,186,236,168,211,109,126,189,124, 93, 45,171, 89,215, 62, + 83,214, 74, 91,142,220,177,192,104, 50,113, 95,220,217, 30, 84, 89,152,204,176, 13,154,109, 43,128, 51,171,107, 17, 85,117,240, +253,231,119,199, 45,183,103, 3,125,184,124,126, 91, 27, 91,219, 30, 38, 66,252, 76, 38, 19,101, 52, 24, 30, 41, 75, 75,175,154, + 12,134, 7, 6,173,202,254,238,201, 79, 77,245,213,243,245,182,140, 3,152, 99,192, 88,145, 88,220,155,197,102,119, 5, 0,163, + 94,127, 93, 85, 94,126,121, 20,112,196,156,182,155,219, 63,111, 90,254,127, 13,122,189, 65,154,118,110, 53, 52,122, 32,112,204, +167,210, 54,147,246, 30, 0, 0,173,252,129, 83,121,242,201,206, 0, 32,242, 14,190,197,147, 5,230, 3, 0,147,145, 43,125, 26, +189, 18, 26, 61,224, 23, 28, 38,109,136,115,122,200, 33,251,165,179, 71,243, 0,224,252,209,111,154, 95,138,250,110, 48, 0,244, + 25, 61,247,204,128, 49,243,159, 2,192,166,157, 81,246, 7, 63, 29, 95, 47,167,121,115,179,148, 83,154, 28,237,163, 85,230,218, +184,139, 24, 89,114,114, 50, 13, 0, 46, 46, 46,102,205, 77, 55, 64,146, 11,204,163, 89,172, 30,222, 62, 62,129, 0, 72,234,179, +103,247,140, 6,195, 53,103, 96,219, 31, 60,150, 22, 16,242,235,224,172, 20, 69, 89, 6,164, 5, 22, 88,240,119,195,169, 87,226, +234,212,111, 30,102,235, 58, 66,165, 1,174,164, 0, 61,187,180,193,236, 73, 67,196, 53,191, 59,178, 35,204, 35,249,206,137,150, + 63,236,221, 76,183,105,211, 6,105,105,105,102,213,162, 66, 11,252,156, 12, 64,241,216,170, 68, 36,122,182,229,179,207,172,251, +247,239,207,184,184,184,128,162, 40,228,229,229,117,137,137,137,233,176,104,209,162,127, 65,241,184,164, 66,139,178,159,147, 27, +230,173,170,107,235,230, 77,176,106,254,120, 9, 0,172,152,186,173,195,157, 39,249,118,207,158, 61,235,251,209, 71, 31, 21,177, + 46, 95,254,206, 1, 8,207, 7,178,204,169,231,190,159,110,241, 37,185, 63,122, 77,158, 63,255,168,143,143,143,216,211,211,147, +178,178,178, 2,139,197, 66, 73, 73,137, 71, 66, 66,194,224,219,183,111,171, 98,174,124,207,141,187, 61, 60, 85,206,239, 92,105, + 86,219,213, 57,252,243, 86, 86,137, 83, 70,141,114, 27, 63,126, 60,223,219,219, 27, 0,240,236,217, 51,223, 35, 71,142, 76, 56, +122,244,104, 8,212, 57,134, 10, 45, 42, 27,106,123, 53, 39, 0, 62,208,213, 70, 42,157,204, 98,179, 91, 27, 12, 6,215, 87,214, +134, 23, 70,189, 62, 81, 33,151,239,127,189,188, 5,191,133, 70, 15, 60,206, 5,250,245, 8,196,148,209,253, 68, 0,240,209,219, +235,186,100, 60, 79,225,104,181, 90, 52,111,225,215,237,147, 79,191, 56, 7,154, 70, 68, 84, 76,117,121,115, 56,227, 31,167, 97, +245, 39, 91,144,243,240, 72, 23, 99,105, 74,239, 50,101, 41, 11, 0,172, 37,146,209, 71, 34,127,188,236, 18, 48,246,102, 74,161, +206, 44,206,250,230,230,217,200,175,157,179, 19, 46,183,250,246,252,110,182,135,135, 7, 30, 62,124,216,184,185, 89,250,196,202, +228,236,252,104,243,146, 37,178,160,160, 32,136,197, 98, 48, 12, 3,131,193,208,239,218,181,107,253, 86,175, 94, 61, 23,165, 79, + 84,230,206, 77, 51,176,153,162,168,222,211,103, 47,112, 30, 50, 98, 44, 70, 15,234, 86,111, 97,157, 86,203,226,112,185, 70,203, +104,181,192, 2, 11,254, 66,168,178, 94,213,220,121,184,179, 94,161,197, 48,140,188,255,180,245,210, 30,157,253,113,231,193,211, +210,244,204,220,242,170,239,138, 19,143, 52, 31,209,205,181, 85,108,236, 21,104, 52, 26, 92,191,126, 29, 15, 30, 60,192,243,231, +207, 49,103,206, 28,205,171,165,195,218, 56, 75,130, 38,132,217,162, 52, 89,236,203,125,210, 52, 38, 41,137, 85, 89, 89,137,216, +216, 88,148,148,148,128,203,229,194,205,205, 13, 3, 6, 12, 96,146,146,146,236,250,246, 31, 36, 9, 26, 52, 49, 13, 18,223,114, +134, 97, 74,234,202, 35,194, 48,140,188,239,212,181,210, 86,190, 77,240, 44, 61,167,116,213,167, 63,148,155, 76,132, 73,125,158, +161,187,114,229, 10, 2, 3, 3,113,225,194, 5,251,226,226,226,143,183,109,219,182,138,189,241,219,173,122,109,209, 98,212,205, + 87, 18, 52, 33,204,214, 94,126,216,243,210,217,227,156,196,196, 68,206,246,237,219, 81, 84, 84, 4, 46,151, 11, 27, 27, 27,200, +100, 50, 52,111,222,156, 90,177, 98,133, 56, 56, 56, 17,255,158, 53,214, 83,231, 53,243, 73, 93,245,172,110,123,121,134,208, 65, +121,222, 59,234,212, 41,186,123,247,238,191,122,108,111,214,172, 25, 6, 14, 28,200,159, 60,121,178,247,248, 9,147, 76, 65, 67, +167, 63,131,216,179,162, 65, 78, 85,150,192,190,226,134, 75,191, 9, 19, 78,134,133,133,217,200,100, 50,136, 68, 34, 0, 64,105, +105,169, 91,122,122,122,151,144,144,144, 49,183,226, 35,153,160,224,172, 28,136,220,213,245,245,231,255, 42,216,108, 70, 94,101, + 69,178, 18, 9, 74,178,178,243, 85, 0,160,213,106,161,213,106,161,209,104,240,222,220, 57,172, 89, 99, 58,249,120,246, 88,112, +255,249,139,252, 98,191,152,155,118, 85,199,234, 27,224,100, 42,158, 43, 20,153, 23,103,173, 94,178, 68,230,228,244,159, 21,193, +136,125,251, 88,197,197,197,253, 86,175, 94,221,138, 8,123, 41,252,130,195,108,234,227,172,111,110, 42,158,158,106,250,201,252, +129,109,119,124, 26, 13,163,209,136, 27, 55,110, 32, 54, 54, 22, 95,124,241, 5, 57,115,230, 76,169,181, 72, 52, 11,245,206,205, + 39, 86,221,157,243,188, 54,110, 60, 74,241,120, 60,156, 56,113, 2, 73, 73, 73,160,105, 26,109,218,180,193,148, 41, 83,208,175, + 95, 63,217,236,217,115, 72,208,160,183, 83, 33,105, 81,246, 59,199, 18, 13, 96,193,242,213, 27,157,167,206,156,135, 77,159,172, +104, 80,104, 89, 68,150, 5, 22, 88,240, 23,182,102,213, 25,226, 1,209,209,209,228,213,171, 39, 0, 16,128,110, 54,114,199,193, +195,113,166, 83,205, 70,238, 56, 72, 0,154, 0,180, 53,208,164, 93,187,118,122,133, 66, 65,110,223,190, 77,222,123,239, 61,213, +214,173, 91, 47,159, 58,117,234,136, 65,167,219,229,226,236,252, 57,169,195,193,158, 0,180, 39, 32, 17, 10,133, 5,153,153,153, +228,244,233,211, 36, 52, 52,148,236,223,191,159,156, 57,115,134,196,196,196,144, 51,103,206,144,131, 7, 15,146,248,248,120,242, +244,233, 83, 34, 18,137, 10, 60, 1, 73, 61,156, 44, 2,176,154,143,220,190,248,232, 29,125, 88,139,145, 59, 22, 17,128,101, 11, +180,108,215,174,157,241,200,145, 35, 36, 34, 34,130,236,221,187,151,196,199,199,147,194,194, 66,194,240, 68, 5, 85,199,213, 85, + 79, 2,208,174,174,174, 5, 10,133,130,184,187,187, 19, 46,151, 75,156,156,156, 72,243,230,205, 73,151, 46, 93,200,224,193,131, +201,164, 73,147,200,199, 31,127, 76, 20, 10, 5,225,243,249,249, 85,199,213,197, 25, 8, 8, 68, 34, 81,230,221,187,119, 73, 93, + 80,171,213,164,176,176,144,156, 59,119,142,136, 68,162,204, 64, 64, 80, 31,167, 0,104, 31, 16, 16, 80, 80, 88, 88, 72,116, 58, + 29,201,204,204, 36, 9, 9, 9, 36, 41, 41,137,100,102,102, 18,181, 90, 93,205,253,244,233, 83,226,229,229, 85, 32, 0,218, 19, +203, 38,136, 58,199,210,235, 47, 15, 39,167,193, 50,153, 76,125,244,232, 81,242,226,197, 11,178,103,207, 30, 66, 3,235, 94, 47, + 87, 31, 39, 23, 24,208,189,123,119,227,141, 27, 55,200,253,251,247,201,178,101,203,200,192,129, 3,201,160, 65,131,200,234,213, +171, 73,118,118, 54,201,206,206, 38,131, 7, 15, 54,114,129, 1, 13,141,207,218,230,166, 4,240, 8, 14, 14, 86,235,116, 58,146, +154,154, 74, 90,183,110,157,205, 2, 38,139,128, 86, 61, 1, 94, 67,227,211, 21,176,117,118,118,206,189,113,227, 6,137,138,138, + 34,158,158,158, 5, 44, 96,186, 53,208,204, 26,104,198, 2,166, 55,107,214,172,224,198,141, 27,164,168,168,136,120,120,120,228, +186, 2,182,191, 99, 44,209, 0,118, 47, 95,189,145, 60,201, 86,145,229,171, 55, 18, 0,153,132, 16,130, 90,124, 60, 45,176,192, +130,127, 62, 94,215, 34,255, 20, 84, 95, 36,131,131,131, 41, 0, 63,215, 87, 88,205, 98,173,223,180,105, 19, 83, 89, 89,137, 31, +126,248,161,108,220,152, 49,135,123,246,232,145,218,212,211, 83, 65,209,116,131,217,134, 11,120,188,133,155, 54,109,178,209,106, +181,136,139,139, 67,135, 14, 29, 32,147,201, 32, 22,139, 33, 22,139, 33,149, 74,209,162, 69, 11,200,229,114, 88, 89, 89, 97,233, +210,165,146, 2, 30,111, 97, 67,188, 38, 19, 97, 0,192,104, 50,113, 57,192,108,175,142, 29,227, 66, 66, 66,104,123,123,123,216, +217,217, 65, 44, 22, 35, 41, 41, 9, 90,173, 22, 66,129,208,172, 32,173, 52, 77,211, 98,177, 24,151, 46, 93,194,130, 5, 11,208, +181,107, 87,216,216,216,192,202,202, 10,173, 91,183,198,128, 1, 3, 48,107,214, 44,164,166,166,130, 50,195,169,228, 17,195,204, +155, 53,107,150, 52, 48, 48,176,214,239, 43, 43, 43,161, 80, 40, 80, 80, 80, 0, 55, 55, 55,140, 29, 59, 86,250,136, 97,230,213, +197,103, 15,200,220,124,125, 79,222,190,125,219, 65, 36, 18, 33, 34, 34, 2,199,143, 31,199,217,179,103,113,250,244,105, 68, 71, + 71,227,196,137, 19, 40, 40, 40, 0, 0,248,250,250,226,208,161, 67, 14, 98,169, 52,218, 30,144, 89,166,180,121,200,200,207, 63, +223, 58, 47,207, 97,242,164, 73, 87,203,203,203, 49,121,242,100,172,223,176, 97, 5, 27, 88,100,206,241, 45, 0,137,157,179,115, +248,198,141, 27,233,188,188, 60,140, 26, 53,170,112,243,134, 13,239,222, 59,119,206,251,238,217,179,222,235,195,194,222,237,217, +179,103, 97,118,118, 54,246,237,219, 71, 59,121,120,132,183, 0, 36,141,173,103, 25,176,224,203, 47,191,228, 87, 86, 86,162,127, +255,254,169,166,196,196, 22, 6,224,199,114, 32,233,103, 64,215,208,241,185,192,188,165, 75,151,202,120, 60, 30, 62,252,240,195, +194,138,140, 12,127, 3,176,183, 20, 72, 47, 5,210, 13,192,222,178,180, 52,255,169, 83,167, 22,242,120, 60,108,217,178, 69,150, +251,159,164,219,230,162, 3,128,147, 0,174, 0,200,153, 62,123,193,244,192, 78,111, 97,223,174,109,248, 52,236,163,112, 0,227, + 40,138,218, 15, 96,177,101,228, 89, 96,193,255, 38,204,209, 34,127, 81,212,153,114,135,169,169, 36, 1,244,170,143,197,214,222, +190,131,191,191, 63, 98, 99, 99, 17, 16, 16,112,219,198,198,198,192,225,241,192,102,179, 65, 76, 13,234, 44, 8, 68,162,190,253, +250,245, 99,110,222,188, 9, 47, 47, 47, 8, 4, 2,176,217,236, 95,189, 56, 28, 14,156,157,157,161, 84, 42,209,183,111, 95,246, + 87, 95,125,213, 23, 26,205, 39, 13,222, 16,147, 19,196, 5, 55, 55, 78,250,126, 79,120,179,160,160, 32,148,150, 42, 97, 50,153, + 32, 20, 10,161,213,106,193, 48,204,203, 37, 32, 61, 81,154,211, 99, 70,163,209,200, 98,177,224,229,229,133,245,235,215,163,178, +178, 18, 28, 14, 7, 0,160, 84, 42,161, 80, 40,144,144,144,128,244,244,116,188,122, 10,175, 23, 86, 18,201,144,241,227,199,215, +154,240, 87,163,209,160,180,180, 20,165,165,165, 80, 40, 20,168,172,172,196, 91,111,189,197, 61, 21, 29, 61, 4, 69, 69,155,107, + 61,134,207, 31,179,111,223, 62, 41,151,203,133, 90,173, 70, 89, 89, 25,178,178,178,144,145,145, 81, 41,151,203, 13, 86, 86, 86, +180,167,167, 39,205,227,241,120, 35, 71,142,164,148, 74, 37, 40,138, 66,112,112,176,253,129,136,136,241,208,106,191,176, 76,105, +243,112, 30,208,180,215,106,135,117,238,212,233,210,237, 59,119, 2, 23, 46, 92,136,248,248,248,141,194,200,200, 43, 21,192,131, +250,142, 77, 5,230,125, 94, 67,192,144,140,140, 0, 29, 80, 80,163, 72,186,103, 90,218,217,169, 83,167, 62,140,143,143,119,216, +178,101,139,108,220,168, 81,243, 0,172,107, 76, 29,173, 36,146,142,206,206,206, 56,115,230, 12, 50,159, 63,255,200, 0,168, 27, +245,196,197, 98,117, 15, 10, 10,194,137, 19, 39,144,157,145,241,145,225,215,117,124,249,160, 4, 20, 48,169,169, 31,133,135,135, +239,158, 49, 99, 6, 88, 12,211, 29,134, 70, 45, 28,254,198,241,125,198,156,133, 8,223,249, 85, 56,128,153, 0, 76, 0,110, 91, + 70,156, 5, 22,252,111, 91,181, 26,210, 34,127, 35,177,181,179,209, 22, 45,169, 84,234, 42, 22,139,145,147,147, 3,191,150, 45, +229, 60, 30, 15, 92, 54, 27,124, 46,215,172, 26, 84, 84, 84, 4,184,184,184,160,180,180, 20, 14, 14, 14,224,112, 56,213, 47, 46, +151, 91,253,222,202,202, 10, 52, 77,195,195,195, 3, 21, 21, 21, 1, 13,242,230, 39, 72, 35,191,154,251,222,141, 43,103,154,141, + 26, 53, 26,182,182,118,112,119,119,131, 84, 42,133, 64, 32,128,187,187, 59,188,189,189,201,230,205,155, 33,148,182, 49,235, 66, + 94, 83, 60, 49, 12, 3,163,209,136,252,252,124, 60,121,242, 4,241,241,241,184,113,227, 6,238,223,191,143,178,178, 50,152,161, +179, 80,161, 86,183,101, 24,166, 86,145,165, 80, 40,160, 80, 40,170,133, 86, 65, 65, 1,210,211,211, 81,174, 82,181,171, 71,244, +142,246,247,247,103, 1,128, 64, 32, 64,187,118,237,176, 99,199, 14,195, 79,199,143,191,221,234,198, 13, 59,247,115,231,108,190, +223,190,253,237,177, 99,199, 26,111,222,188, 9,165, 82,137,199,143, 31,195,209,209,145,225,242,249,227, 45,211,185,113,184, 11, +168, 28,202,202, 6,117,237,218, 53,173,180,180, 20,159,125,246, 25,205,182,178,218, 25, 86,199, 18, 95, 53, 88,172,110, 65, 65, + 65, 56,121,242, 36,114, 50, 50,150,101,212, 34, 96, 50,128,130,204,212,212,101,225,225,225, 24, 48, 96, 0, 40,134,233,214,216, +250,117,233,210,197,223,100, 50,225,225,195,135,176, 1,110, 53,246,120,111, 31,159,192, 42,203,175, 8,184, 90, 87, 57, 17,112, +245,222,189,123, 16, 8, 4,240,107,213,170,125, 35,127,102, 51, 69, 81,185, 51,230, 44, 68,212,217, 95, 0, 0,225, 59,191,202, +175, 33,178, 44,176,192, 2,139, 69,235,239,106,209,170, 18, 86, 53, 95,248,149,208, 50, 83,124, 0, 0,216,108, 54,184, 60, 30, +184, 92,238, 75,129,196,227,153,205, 65, 81, 20,248,124,126,181,176,170, 41,176,106,190, 23, 10,133,102, 9, 24, 0, 40, 73, 57, +219, 99,230,187, 51,184, 60, 30, 15, 90,173, 6,132, 16,240,120,124,216,216,216,192,203,203, 11, 74,165, 18, 93,187,245,212,100, + 41, 56,209,246,126, 35,227,223,164,247, 12, 6, 3, 84, 42, 21, 74, 74, 74, 80, 92, 92, 12,165, 82, 9,181, 90,109,246, 86,116, +147,201,196,202,202,202,194,143, 63,254,136,162,162, 34, 0, 47, 29,173,171,196, 85,213,223,180,180, 52, 68, 68, 68,224,249,243, +231,141, 58, 63, 61,122,244, 64,116,116, 52,171, 87,223,190,187, 46,120,122,230, 92,240,244,204,233,213,183,239,174,147, 39, 79, +178, 92, 93, 93,145,158,158,142,184,184, 56,148,148,148,128, 16, 98,217, 63,255, 6,120, 6,148, 84, 20, 23,207, 88,177, 98, 5, + 17,139,197,248,236,243,207,219,174, 3, 38,154, 43, 96, 36,245, 8, 24,201,239, 19, 48, 32,132,192,100, 50,193,104,124, 51, 95, +113,138,162, 40, 54,155,221,216,208, 10,141, 41, 92,237,248,190,244,227,245, 56,125,226, 72,213,231,201, 22,145,101,129, 5, 22, +252, 3, 80,167, 35, 60, 83, 67, 65, 86,255,173, 11,249,249,249, 47, 84, 42, 85, 51, 79, 79, 79,100,103,103, 75, 61, 60, 60, 50, +184,108, 54, 56, 92, 46, 40,186, 97, 77, 32, 20, 10, 31,230,228,228,116,115,117,117,133,193, 96,168, 22, 85,175, 47, 29, 86, 89, +105,238,223,191, 15,161, 80,248, 16,149,245, 70, 78,128, 81, 91,210,164,125,251,246,213,150, 33, 27, 27, 27,216,216, 72,192,227, +241,177,114,229, 74,211,150,205,155,183,121,244, 9, 43,125,103,209, 10,178, 98,221,174, 63,180,103,205,189, 49, 9,133,194,135, +238,238,238,111, 73, 36, 18, 68, 69, 69, 33, 61, 61, 29, 37, 37, 37,168,168,168,128, 70,163, 65, 69, 69, 5,180, 90, 45,248,124, + 62, 90,181,106, 5,107,107,107,196,196,196, 60,132, 70, 83,187,184, 44, 42,138,122,248,240,225, 91,157, 58,117,170,182,168,244, +238,221,155,234,221,187,183, 67,181, 21,173,162, 2,133,133,133,184,125,251, 54, 98, 98, 98, 64, 81, 20,146,147,147,141, 26,181, +250,160,101, 78,188, 25, 42,129,235,172,240,240,221,255,250,215,191,222,237,214,173, 27,140,192, 96, 0, 17,255, 69, 1, 3, 0, +184,113,227, 70,130,209,104,236,214,188,121,115, 40,128,206, 0, 78, 52, 74, 68,166,164,220, 51, 24, 12,125,219,182,109,139,168, +195,135,123, 0, 72,175,173,156, 10,232, 17, 24, 24, 8,181, 90,141,199,143, 30,221,109,132,200,218,181,124,245,198,233, 83,103, +206,195,190, 93,219, 16,190,243,171,172,221, 59,182,186,195, 12,255, 49, 11, 44,176,224,127,202,154,213,160, 22,249,139, 98,118, + 93,226,139,105, 12, 75,105, 73,201,221,123,247,238, 53,107,223,190, 61,118,237,218,213,169,235, 91,111,189,224,112,185, 6, 46, +135, 3,218,140, 27,137, 90,165,186,120,241,226,197,206, 35, 71,142,100,110,222,188, 9,153, 76, 86, 45,180,170,254, 50, 12, 3, + 66, 8,132, 66, 33,142, 29, 59,166, 83,171, 84, 23, 27,180, 22, 25, 77, 70,250,149,208, 35,132, 64,161, 80,128,195,225,224,139, + 47,182,224,235,205,155, 39, 25,129, 35,190, 34,199, 37, 0,248,255,181, 27,116, 69,197,165,211,167, 79,119, 8, 9, 9, 97,187, +185,185, 65,161, 80,160,164,164, 4, 69, 69, 69, 80, 42,149, 80, 42,149, 40, 41, 41,129, 66,161, 0,159,207, 71,124,124,188,190, +178,162,226, 82, 93,124,188,202,202,163,211,166, 77, 91,122,239,222, 61,103,134, 97,160,215,235, 97, 50,153, 96, 50,153,160,211, +233,144,146,146,130,196,196, 68, 36, 37, 37,161,184,184, 24,108, 54, 27, 44, 22, 11,247,239,223, 47, 17,233,245,135,181,150, 57, +253,198, 96, 3, 81,215,174, 93,123,119,202,148, 41,112,113,115,235,137,236,108,179, 4,204,241,122, 4, 76,233,155, 9,152,255, + 8,160,178,178, 59,105,105,105,221,122,245,234, 5,103, 55,183,141,173,178,179, 47, 60,106,132,159,150,209, 96,184,122,237,218, +181,190, 83,167, 78,197,174, 93,187, 54, 58,166,165,157, 45,120,109,153,211, 17,112,108,234,237,189,113,250,244,233, 56,127,254, + 60,140, 6,195,213,122, 40,107, 70,124,111, 50,125,246, 2,247,215, 28,223,119, 80, 20, 53, 31,192,103,150, 17,101,129, 5, 22, +252,147, 45, 90,141, 90, 58, 20, 24,141,203, 23, 47, 94,172,167,105, 26,163, 71,143,182, 58,113,242,228,216,251, 15, 30,120,201, +229,114, 27,163,209,216, 32,151,163, 70,179,117,241,226,197, 10,173, 86,139, 22, 45, 90,160,184,184, 24, 70,163, 17, 12,195,128, + 97, 24, 80, 20, 5,154,166, 33, 22,139,113,239,222, 61,236,222,189, 91,233,168,209,108,109,240, 38, 97, 52, 62,140,136,136, 0, +139,197, 34,124, 62, 31, 20, 69,129, 97, 24,108,217,178, 69,254, 53, 16, 5, 0, 44,154,214, 2, 0, 77, 83,230,122,239, 54,184, +110,201,229,114, 97,122,185, 9,160,193,178,182, 26,205,151,155, 54,109, 42,123,252,248, 49, 84, 42, 85,181,245,173,188,188,188, +218,185, 94,161, 80,128,162, 40,168, 84, 42,156, 60,121,178,204, 86,163,249,178, 46,190, 34, 32, 47, 59, 57,121,120,167, 78,157, +138,210,210,210, 80, 90, 90,138,135, 15, 31, 34, 38, 38, 6,135, 14, 29,194,249,243,231,145,146,146, 2,131,193, 0, 87, 87, 87, + 16, 66,112,252,248,241, 82, 67, 89,217,224, 34, 32,207, 50, 39,234, 70, 19,153,172,175,147, 84,154,233,232,224,144,221, 68, 38, +235,251,250,247, 18,224,233,211,167, 79, 97, 48, 24,224,229,229,101, 87,159,159, 22, 49, 24,174, 93,187,118, 13, 83,167, 78,133, +123,179,102, 27, 60, 1,199,215,203,120, 2,142,158,222,222, 27,170, 4, 12, 49, 24,174, 53,182,206, 86,192, 87, 75,150, 44, 81, +115, 56, 28, 68, 70, 70,122,233,125,124,146, 24, 96,162, 24,104,217, 11,224, 52,116,188, 51,176,237,227,143, 63,206,163, 40, 10, +251,247,239,119,144,120,123, 39, 48,192, 52, 9,208, 68, 2, 52, 97,128,105, 18,111,239,132,200,200, 72, 7,131,193,128, 69,139, + 22,229, 57, 3,219,234,161, 92, 64, 8, 25, 70, 8, 9, 34,132,184,239,222,177, 21,167, 79, 28,169, 18, 89, 51,241,210,233,125, + 10,128, 4,203,136,179,192, 2, 11,254,201,168,213, 12,197,116, 90,155, 15, 16,105,207, 46,109,112,231,193,147, 82, 7, 91,235, +115, 85,223, 21, 39, 30,105,222, 39,192,186,205,183,223,126, 11, 54,155,141,172,172, 44, 60,122,244, 8,214,214,214,152, 52,105, +146, 70, 93, 86, 54,188, 70,174,195,126, 0, 98, 94,113,190,204,167, 86,154, 44,246,102,226,155,157, 61, 29,205,146, 72, 36, 40, + 47, 47, 7, 77,211,224,243,249, 16, 10,133, 16, 8, 4,136,139,139,195,208, 97, 35,140, 5,194,160,255, 4, 44,253, 79, 62,181, +106,206,170, 88, 67,157, 1,225, 61,224, 67,169,139,203,226, 85,171, 86, 9, 6, 14, 28, 8, 14,135, 3,183, 38,190,121, 94,131, + 62,251,138,166, 41, 67,118,145,114,165,119, 19, 23,201,163,228,116, 0,148, 92,127,123,149, 75,141, 92,135,191,169,167,135,246, +138,215,177,189,155,173,219,181,123,233,143,174, 80, 40,144,159,159, 15,185, 92, 14,133, 66, 1,149, 74, 5, 0,136,142,142,198, +233,216, 36,165,218,109,108,106, 93,245,252, 79,219,159, 88,185,232,110, 53, 61, 16,177,151,229,232,232,136,252,252,124, 20, 20, + 20, 64,161, 80, 64,173, 86,195,104, 52,162,184,184, 24, 63,132,239, 53, 22,137,131,158, 87, 7,132,172,143, 83,149, 37,176, 43, +255,197, 53,176,149, 39,121,247,221,119,173,172,173,173, 97, 50,153, 80, 82, 82,130,204,204, 76,164,165,165, 33, 54, 54, 86, 37, + 87,104,161,114,232,159, 93, 29,176,180, 22,206, 63, 16,127, 59,206,154,113,171, 92,156,157,115, 50, 50, 50,164, 70,163, 17,174, +174,174, 6, 69,113,241, 6, 46,112,222, 10,200, 5, 64, 10,129, 85, 95,126,245,213,140, 17, 35, 70,160, 99,199,142, 89,121,249, +249, 77,107, 27, 75, 4, 96,181, 0, 36, 21,110,110,137,183,111,223,150,101,102,102, 98,234,212,169,133, 25,207,158, 45,171,242, +215, 42, 5,122,120,122,123,111,136,140,140,116,104,214,172, 25, 2, 2, 2,242,248,153,153,173,159, 0,165,117,140,207, 58,231, +166,226,233,169,166,115, 71,249,119,124,239,189,247, 96, 48, 24, 16, 27, 27,139, 91,183,110, 33, 35, 35, 3,191,252,242,139,194, + 90, 36,122,187, 70,174,195, 90,199,231, 96, 95,149,215,254,253, 17, 20,135,195, 65,120,120, 56,238,221,187, 7, 0, 8, 12, 12, +196,244,233,211, 97, 48, 24, 48,121,242, 20,114,234,137, 32,181,190,241, 9,192, 31,192,231,120, 41,242, 58, 18, 66,248, 20, 69, +229, 0,112, 71,227,124,178, 44,227,211,194,105,225,252,223,225,252, 71,162,193, 92,135,107,191,131,228,215,105, 62,102,229, 28, +217, 17,198,116,239, 17,212, 50, 44,116, 53,221,169, 83, 39,184,187,187, 35, 48, 48, 16,153,153,153, 60, 27, 27,155,134,242,169, +149, 7, 13,154,152,214,166, 77, 27,155,101,203,150, 73, 6, 12, 24,192,118,119,119, 7, 33, 4,247,238,221, 67, 84, 84,148,110, +215,174, 93,202, 10,167, 97,138,187,151,127, 44, 55, 39,159,218, 45,160, 2,192, 26,183,156,156,157,243,230,206, 93,221,174,125, +251,119, 67, 67, 67,105,177, 80,192, 94,191,114, 38, 31, 0,214,126,115, 72, 50, 98,236, 36,124,233, 3,244,156, 88,123, 30,185, +154,245,204,204,158,149, 49,100, 84, 95,159, 15,231,207, 48,142, 31, 63, 94,100,109,109, 13,119,119,119,216,218,218, 34, 53, 53, + 21,217,217,217,228,167,159,126, 42,191,113,255, 41,251,248,249, 59, 25,124,137,179, 57,121, 9,203,130, 6,142,123, 62,100,200, + 16,219,105,211,166, 89,117,232,208,129,205,227,241,192,227,241,144,159,159,143,148,148, 20,221, 79, 63,253, 84, 94, 33, 29, 92, +114,247,114,100,153,153,185, 14,213, 65, 19,194, 82,174, 94, 8, 93,148,248,240,225, 20, 19,208, 86,167,211,185, 26,141, 70,138, +166,233, 92,147,201,244, 80, 87, 86,182, 91, 19, 24,186,197,146,235,208, 60, 24,141, 70,142,209,104,132, 66,161,192,133, 11, 23, +152,103,207,158,173,122,240,224,193,170,156,156, 28,232,245,122,140, 25, 51, 6,129,129,129,184,124,249, 50, 10,242,243,127,170, +143,235, 9, 80,202,203,206,158, 62,107,214,172, 51, 17, 17, 17,244,131, 7, 15, 28,194,195,195,127,168, 77,192, 76,153, 50,197, +148,159,153, 57, 93, 3,148,214, 51, 62,235,155,155,133,103, 35,191,126, 48,114,244,216, 86,161, 33,171,216, 93,187,118,133,131, +131, 3,122,244,232, 1,157, 78,103,227,231,231,215,208,220, 44, 11, 26,244,118,106,219,182,109, 69, 91,182,108,145,205,152, 49, + 3,243,231,207, 7, 0,168,213,106,156, 63,127, 30,139, 22, 45,202,203,100, 58,171, 26, 26,159,175, 44, 85, 85, 2,236, 10,128, + 32, 0,169,176, 56,190, 91, 96,129, 5,255, 76, 84, 37,149,118,198,203,196,210,167,240,242,225,188,225, 92,135, 87,111, 37,160, +102,154,143,151,112,126,100,240,152,246,108,206,226, 13, 1, 44,189,210,150, 77, 85, 90, 39, 63,125, 74, 53,148,243,176, 58,159, +154,196,183,220, 62,237, 96,167,245,107,215, 46,252,242,203, 47,251, 86,133,112, 16, 10,133, 15,213, 42,213, 69, 71,141,102,107, +133,196,247, 98, 99,115,243,101, 3,249, 0,230,218,222,189,251, 85,240,136, 49,155,248,118, 94,236, 21,235,118, 85,178,104, 90, +155,146, 83,128, 47,125, 0,145, 25, 27, 36, 43,180, 64,162,194,217,144,111, 63,246,201,199, 75,150,124,184,118,205,154, 78, 98, +177,184,167,206, 96,240, 53,153, 76,128,201,148, 92,161, 82, 93, 33, 58,221,109, 77, 96,200,102,190,196,153,152,157,151,208,198, +175,204,238,249,145, 78,123,118,239, 94,112,248,240,225,223,180,221, 94,163,249,170,194,198, 47,198,156,182,215, 44, 83, 9, 92, +135, 92,126,189, 62,211,165, 37,215,161,153, 79, 31, 38,211,108, 91, 91,219,125,125,251,246,229,247,235,215, 15, 67,135, 14, 69, +215,174, 93, 97, 50,153, 64, 8, 65, 89, 89, 25, 14, 29, 58,132, 77,155, 54, 37, 55, 5,214, 52,196,167, 1, 46,242, 78,159, 30, +220,182,109,219,240,250, 4,204, 43,145,213,160, 79, 98,253,115,147,151,108,144, 12, 79,159, 48,111,189,143, 86,153,107, 99, 47, + 52,200, 18, 19, 30,210,230,207,205, 22,101,198,123,135, 58,143, 25, 53,106, 30,139, 97,122,188,218, 1, 73, 30, 63,122,116,183, + 42,169, 52, 2,167, 95,104,228, 88,170,138, 93,103,113,124,183,192, 2, 11,254,233, 66,107, 40, 94,250,107, 85,167,228,169, 51, +215, 97,149,213,135, 97, 24,121,234,241, 57,147,234, 99,103, 3,125, 95, 89,178,208, 96,174,195, 87,239,211,129, 50,104, 52,159, +252, 42, 24,105,141,221,133,236,215,202, 55, 38, 44, 98, 9,240, 4, 6, 77, 48,228,143,128,147,115, 95,242,117, 90,251, 81,205, + 54,213,121,147,253,213,239,114,138, 43,129,171, 40, 47,191,138,242,242, 90,157,118,217, 12,167,184,161,122,190,222,246, 76, 64, +249,123,219,254, 58,103,131,226,225,119,244,231,255, 26, 94, 20, 22, 30, 7, 32,118,139,142,118, 58, 27, 29, 61,254,195, 15, 62, + 24,227,236,226,226,237,224,224, 96,107,101,101, 69,223,188,121, 61,198,135, 44, 0, 0, 32, 0, 73, 68, 65, 84, 51,205, 80, 89, +249, 85, 59, 96,207, 43,107,106,131,208, 0, 23, 91,100,102,182, 30, 55,106,212, 60,138, 97,186,215, 20, 48,196, 96,248,197, 11, +216, 86,159, 37,235, 77,231,166, 59,207,185,239, 43, 75, 22, 88,192, 44,115,198, 70,246,203,122,172,131,193,176, 14,241,241,181, +140,249, 70,143,165,181, 20, 69,149,193,226,248,110,129, 5, 22,252,115, 81,149,239,240,212,255,247, 15,247,179,112, 90, 56,255, + 65,156, 44,188,220, 69,103,233, 79, 11,167,133,211,194,105,225,180,192, 44, 48,150, 46,176,192, 2,179, 97,196,127,150,193, 44, +176,192, 2, 11, 44,176,160, 10, 85,190, 89, 53,177, 19,120,233,186, 83,151, 42,109,204,110,130, 55, 81,182, 49, 22, 78, 11,167, +133,211,194,105,225,252,175,112, 10,241,219,101,111, 75,127, 90, 56,255,191, 56, 27,226,254, 59,238,102,172,242,201,170,246,205, +250,255,130,197,172,106,225,180,112, 90, 56, 45,156, 22, 78, 11,167,133,243,159, 14,231, 87, 34,171,230, 11, 64, 35, 3,150, 90, + 96,129, 5, 22,252, 83, 17, 26, 10,154, 16, 80,132,132,210,132, 28,102, 17, 50,150, 69, 8,126, 87, 42,144,177, 99,107, 15,102, +251,239, 73,182, 86,150, 30,183,192,130,127, 20,114, 81, 71, 82,105,139,143,214,127, 23, 30, 50,153,108, 7, 0, 42, 47, 47,111, + 54,128, 76, 75,151,252,245, 96,103,103,215,215, 96, 48, 64,169, 84, 94,252,163, 56, 89, 44, 22,101, 52, 26,201, 95,161,125,173, +188, 49,138,208,240,171,254,128, 32,243,113, 10,246,213, 86,214,207, 7, 83, 65,253, 39, 22, 23,101,194,227, 71,207,112,172, 17, + 63, 71, 15,238,231,190, 13, 0,206,196,100,205,195,159, 19, 87,171,185,163,163,227, 57,134, 97, 24,163,209, 56, 87, 46,151, 71, +215, 45,132,198,178, 0,128, 77, 46, 47, 87,228, 73,151,189,255, 47,138, 93,161,217,173,208,168, 85,165, 44, 54,235, 57,143, 45, +187, 54,103, 6,125,166,164,252,173, 71,181, 29,127,228,200,145, 58,179,120,183,246,193, 96,218,216,106, 88,160,127, 90,234,231, + 91, 59,125,217,211,203,129,157,150,117, 95,188,113,123,233, 14,174,141,231,176,169,227,169,104, 70, 72, 77,217,189,187,168,252, +159, 58,119,214, 3,180,158,205,110, 65,153, 76, 94,160, 40, 33, 5,128,152, 76, 38,138,166,211,248, 6,195,211,197, 64,249, 27, +112,218,233,128, 0, 54,143,231,110, 52, 24,156, 40,128,176, 24, 38, 95,175,209,100,113,128,248,229,128,226,159,206,201,225,241, +220,140, 6,131, 19, 0,252, 21,235,105,193,175, 81,167,208, 18,139,197,113, 52, 77,187,213, 76,134, 91,149, 79,176,234,179,154, +223, 81, 20, 5,163,209,152, 93, 82, 82,210,161, 17,191,111, 13, 96, 60,128,170, 45,234, 7, 0, 28,194,155, 59, 28, 91,115, 56, +156,197, 34,145,168,143, 90,173,110, 13, 0, 2,129, 32, 81,165, 82, 93,210,233,116,159,191, 33, 47, 3, 96,156, 88, 44,238, 77, +211,116,111, 66, 8, 69, 8,185, 92, 94, 94,126, 9,192, 97, 0,111, 18, 41, 65, 32,149, 74,215,217,217,217, 77, 92,190,124,121, +145,189,189,125,139, 69,139, 22,221, 41, 46, 46,254,177,176,176,112, 37, 26,145,163,238, 79,134,183, 76, 38, 59,192,102,179, 89, + 89, 89, 89,189, 1,192,221,221,253,178, 86,171, 53,202,229,242, 73, 0,158, 53,146, 79, 4,160,139, 88, 44,238, 32, 22,139,131, +140, 70,163,223,171,252,140,143,203,203,203, 99,117, 58, 93, 28,128,155, 0, 84,127,161, 57, 98,197, 48, 76,196,171,177,238, 11, +160,236,143, 32,253,171,136, 44, 0, 32, 52,252, 30, 37, 38,181,168, 22, 94,173, 91,214, 93,152,130, 71, 45,101,205, 22, 90,125, +122, 58, 15, 27, 62,188, 63, 13, 0, 90,253,153, 97,151,174,228,158,248,131,155,211,124,244,232,209,215, 35, 34, 34,108, 53, 26, + 13,102,207,158,125, 32, 38, 38,102,155, 82,169, 92, 94,239,133, 67,108,187,232,179, 45,231,133, 20, 69, 3,128,212,100, 50, 74, + 95,188,120,230,251, 40,225,250,160,196,196, 27,235,213, 73,151,110,154, 40,246, 28, 29,122, 36,153, 83, 9, 63, 47, 4, 15, 27, + 51,106,232,154, 53,161,152,248,246,196, 38,137,137,149, 2, 87,235, 84,110,177, 90,228, 99,239, 40, 29,190,102,237, 17,234,218, +213,227,195, 35,194,195, 46,205,152, 97,223,231, 31, 40,182,168,213, 92,174,135,222,104, 28, 68, 3,185,140,149, 85, 42, 56,156, + 10, 0,160,141, 70,150, 86,169,244,174, 96,152,201,159, 0,183, 63, 54, 24,238,155,203,185,150, 97,186, 72,124,124,130,222, 62, +126, 28, 98,119,119,134,225,241,104, 0, 48,104, 52,238,229, 89, 89,206,145,195,135,119, 14,125,250,244,231, 80,224,150,133,243, +191,194,105, 65, 99,132, 22, 77,211,110, 47, 94,188,144,138, 68,162,151, 23, 99, 66, 96, 52, 26, 97, 52, 26,171,147, 23, 19, 66, +170,255, 26, 12, 6,180,108,217,210,172, 39, 90, 0,125, 0,188,211,171, 87,175,177,159,127,254, 57, 59, 32, 32,160, 42,101, 72, +143, 21, 43, 86,124,115,239,222,189,163, 0,246,224,101,240, 70,115,159,120, 7,138, 68,162,253,159,125,246,153,117,255,254,253, + 25, 23, 23, 23, 80, 20,133,188,188,188, 46, 49, 49, 49, 29, 22, 45, 90, 52, 87,165, 82, 77, 6,112,174, 17,253,227,111,101,101, +117,100,212,168, 81,110, 61,123,246,228,183,106,213, 10, 70,163, 17,247,239,223,159, 17, 23, 23, 55,225,232,209,163,171,203,202, +202,198,194,252,124,109,148, 88, 44,158,102,109,109,189, 46, 36, 36,196,110,242,228,201,220,132,132,132, 18, 47, 47, 47,234,218, +181,107,142,135, 14, 29,154,187, 97,195,134,113, 74,165,114,101,121,121,249, 94,152,145, 67,209,202,202, 42,142,166,105, 55,115, +132,240,171, 27,188,185, 98,184, 93,211,166, 77, 15, 93,189,122,181,105,122,122,186,113,228,200,145,251, 0,224,210,165, 75, 1, +122,189,158, 26, 48, 96,192,153,236,236,236,241, 0,204,189, 72,182,177,179,179, 59, 49,113,226, 68, 59,111,111,111, 97,211,166, + 77, 41,145, 72, 4, 22,139,133,210,210, 82,151,132,132,132,126,183,110,221, 82,199,196,196, 20,107, 52,154,225, 0,226, 27,113, +158,186, 74,165,210, 41,108, 54,219,223, 96, 48,184, 2, 0,195, 48, 47,244,122,125,130, 92, 46,143, 0,112,253, 77, 39,136,147, +147,211,215,235,214,173,115,144,203,229,100,195,134, 13, 95,151,149,149, 77, 51,231,184,240,240,112,122,250,244,233,127, 74, 20, +244, 53,107,194,216, 33, 33,171,245,127, 52,239,129, 31, 15, 35,238,206, 45,224,101,218, 28,170,150,241, 71, 1,224,188,255,254, + 7,232,208,177, 51, 38, 77, 28,215, 32,231,144,190,110,159,177,185, 28,251,202,202,202,235,165, 21,154,195, 34, 33,127,252,196, + 9,193,201, 0,112,230,236,207,227, 59,117,178,189, 44, 17,242,198,241,249,252,174,122,173,174,232,244,197,236, 37,141, 17, 85, +174,174,174,231,108,109,109,133,197,197,197,121, 5, 5, 5,223, 13, 27, 54,108,237,158, 61,123,108,211,210,210,144,149,149,133, +133, 11, 23,138,179,179,179,231,197,199,199,223,208,106,181,117, 90,182,202,202,138,183,174, 88, 54, 34, 68, 34,113, 96,137,132, +214,176,146,216,193,203,187, 45,186,116, 29,134,193, 67,223, 69, 74,242,189, 46,123,194,215,220,123,241, 34,230, 83,177, 93,179, +181, 10, 69,211, 58,207,109,171,230,232, 57,124,212, 75,145, 21, 18, 18,138,167, 73, 73,101,233,207,233,127,159, 58,206, 8, 7, +247,109,201, 51,104,243,210,175, 93, 61,222,180,123,143,145, 0,208, 33, 34, 60,236,210,191, 39,217,246,253,250, 64, 73,217, 63, +228,190, 66,173, 97,179,253, 97, 48, 52,183,119,118,142,172, 52,153,136,190,180,212,221, 84, 81,225, 12, 0, 6, 54, 91, 43, 18, +139, 31,186,248,248,196, 62,189,123, 55,232, 19,134,233,241,113,253, 9,202,171, 56,167, 13,220,178, 69, 26, 56,119, 46,167,252, +249,115, 93,234,246,237, 21,249,177,177, 70,134,199, 35,238,131, 6, 81,142,189,123,243,231, 62,126,204,249,101,195,134, 32,118, + 88,152,215, 74,157,110,191,133,243,255,149,243,127, 29, 85, 78,240, 53,119, 31,238,172, 87,104, 81, 20, 5,145, 72,132,200,200, + 72,176,217,108, 48, 12, 3, 54,155, 93,231,123, 15, 15, 15,115, 42, 50, 90, 38,147,125,179,109,219, 54,167,129, 3, 7,130,207, +231, 87,127,193, 98,177,208,191,127,127,244,235,215,143,157,147,147, 51, 33, 50, 50,114,194,250,245,235,243, 21, 10,197,124,188, + 74, 12, 93, 15,122,183,104,209, 34,234,252,249,243,130,202,202, 74,196,198,198,162,164,164, 4, 92, 46, 23,110,110,110, 24, 48, + 96, 0,147,148,148,100,215,191,127,255,168,167, 79,159, 6, 3,184,108, 70, 93, 59, 72,165,210, 43,135, 15, 31,230,183,109,219, +150, 74, 73, 73, 65, 96, 96, 32, 0,160,180,180, 20, 35, 71,142,228, 79,158, 60,217,123,194,132, 9, 55,229,114,121, 79, 0,113, + 13,240,181,151,201,100,123, 71,141, 26,229,178,126,253,122,107, 43, 43, 43,164,167,167,231,202,100, 50,223,170,254,158, 48, 97, + 2,119,216,176, 97,206,155, 54,109,218,122,228,200,145, 37,114,185,124, 26,128,187,245,170,214, 87,130, 88, 40, 20, 34, 63, 63, + 31, 7, 14, 28,192,188,121,243,192, 98,177, 32,151,203,113,232,208, 33,252,251,223,255,174, 18, 52,102,137, 97,161, 80,216,207, +199,199,231,135, 75,151, 46,185,217,216,216,192,197,197,133,254,248,227,143,253,189,188,188, 4, 77,154, 52, 97,229,230,230, 34, + 42, 42,202,107,202,148, 41, 39, 50, 51, 51,103,104, 52,154, 6,151,212,156,156,156,118,159, 58,117,202, 35, 49, 49, 17,219,183, +111, 71,113,113, 49,184, 92, 46,108,108,108, 32,147,201,224,235,235, 75, 45, 91,182, 76, 56,108,216, 48,225,252,249,243,119,107, +181,218,118,102,156,163,182, 82,169,116, 71,239,222,189,189,194,194,194,108,100, 50, 25,170, 30, 12, 74, 75, 75,221,210,211,211, +187,132,132,132,140,141,139,139, 75,147,203,229,115, 0, 60,104,228,196,105,215,170, 85,171,224,145, 35, 71,178,114,115,115, 17, + 17, 17, 17, 92, 86, 86,214,206, 28,113,201, 48,204,159,102,177, 50, 17,194, 3,240,135, 11,173,184, 59,183, 48,251,189,133,229, + 46,238,238,156,243,231,126, 24,125,228, 88,243, 59, 54,130,151, 9,169, 21,106,232,198,142,122,218,113,192,192,119, 57, 67,134, +142, 44,223,249,237, 86,177, 57, 66,139,205,229,216, 31,216,255, 69,230,213,107,113,254, 23, 98,110, 13, 26, 61,124, 56,225,112, +108,188, 0, 96,201,162,247,217, 81, 39, 79,134,247,239,215, 57,167, 71,247, 14,153,147, 38,127,224,209,136,234, 54,111,222,188, +249,207,247,238,221,115,226,241,120, 40, 46, 46,182,223,185,115,231, 23,221,187,119,167, 83, 83, 83,145,148,148,132,231,207,159, +163,180,180, 20,253,251,247, 23,223,189,123,247, 59, 0,117, 10, 45, 29,221,103,157, 75, 19,253, 87,246, 2, 81, 83,157, 81, 41, + 37,250,220, 86, 23, 78, 93,104,115, 48, 66, 29,232,228,220,210,247,157,233,171,177,102,237, 81,246,143, 7, 54,134, 92,140, 57, + 8,208, 77,235,206, 8, 64,208,117,197,202,229, 80,150,105, 48,121,226, 44, 76,153, 56,203,158, 64,235, 76,140,149, 34,173,186, +196,198,138,243, 56,122,219,174, 47, 70, 1,112,171, 33,182, 46,254, 83,196,214, 26, 14,167, 41, 76, 38, 47,223,145, 35,143,167, +158, 61,219,140,232,116, 14, 44, 46, 55,219,202,206, 46,223,160,209, 16,189, 78,199, 81,171,213,174,169,137,137,206,221,151, 45, +187,120,109,195,134,158,159,176, 88, 29, 63, 54, 26,239,212,201,201, 48,157,131,191,249,198,209,127,230, 76,222,131,176, 48, 85, + 97,108,172,218,103,200,144,146,192,127,253, 75, 3, 0,101,207,159,115,158,174, 94, 45,116, 12, 10, 18,188,181,120,177,173, 81, +171,149,173, 89,179,166, 83,200,203,228,229,141,226,244, 24, 63,222, 24, 18, 30,222, 49,246,131, 15,122, 81,122, 61,107,208, 91, +111,221,223, 16, 17,241,226,247,112,254,145,245,204,185,114, 69, 83,236,229,133,192,145, 35,139, 60,164, 82,205, 31,217,246,223, + 83, 79, 11,170, 81,229,171, 53,187,230, 19, 42,162,163,163,123, 2,248, 25, 64, 88,112,112,112, 40, 0, 72, 36,146,124,133, 66, + 33,141,138,138,106, 80,100,177,217,108, 56, 59, 59,195,215,215, 87, 46,151,203,157,234,169, 64,150,201,100,114, 35,132, 84, 91, + 95,234,130, 70,163, 65,114,114, 50,218,180,105,147,141,151,137,104,235, 52,234, 8,133,194,212,164,164, 36,135, 71,143, 30, 33, + 46, 46, 14, 94, 94, 94,176,181,181, 5,155,205,134, 94,175,135, 82,169, 68,139, 22, 45,192,227,241,208,190,125,251, 66,149, 74, +229,213,192, 18, 16, 79, 36, 18, 37, 95,185,114,197, 61, 48, 48, 16,183,111,223,134,187,187, 59,100, 50, 25, 0,224,249,243,231, +184,118,237, 26,134, 12, 25,130,123,247,238, 97,204,152, 49, 89, 42,149,202, 23,128,166, 46, 66, 59, 59,187,220, 75,151, 46,101, + 7, 4, 4, 84,170, 84, 42, 58, 63, 63,159, 29, 27, 27,107, 40, 43, 43, 19,151,150,150,178, 21, 10, 5, 91,169, 84, 50, 42,149, +138, 77,211, 52, 71,173, 86,179, 47, 94,188,200,210,233,116,245, 6,200,172, 58, 79, 39, 79,158, 68, 64, 64, 0,162,162,162,240, +225,135, 31,226,151, 95,126,129,187,187, 59, 14, 31, 62,140,197,139, 23,227,201,147, 39,112,112,112, 64,171, 86,173, 26, 58, 71, +240,246,246, 78,121,248,240,161, 55,135,195,169,202,235, 88,149, 47, 15, 5, 5, 5,120,246,236, 25, 94,188,120, 1, 31, 31, 31, + 76,156, 56,241,217,139, 23, 47,124, 26, 26,121,174,174,174, 5,137,137,137, 14,109,218,180, 65,126,126, 62,108,108,108, 32,145, + 72, 96, 99, 99, 83,253,222,203,203, 11, 31,124,240, 1,100, 50,153,188,178,178,210,169, 33, 17, 20, 16, 16,112,238,226,197,139, + 14,214,214,214,200,203,203,131, 82,169, 4,195, 48, 16, 10,133,112,112,112,168, 22,242,201,201,201, 24, 58,116,104, 97,106,106, +234,192, 70, 88,224,104, 39, 39,167,164,248,248,120, 95, 66, 8, 50, 51, 51,241,228,201, 19,188,247,222,123,201,149,149,149, 45, +241, 95,204,217,183,119,207, 94,222,180,119,166,105,254, 40,190, 26,126, 87,156,105,211,103,115, 70,141,232,170,125,156, 24, 77, +241, 76, 79,208,206,223,186, 20, 0,238, 39, 40, 37, 26,186, 5,252, 90, 7,147, 99, 39,174,115,247,238,217,201,134, 9, 78,160, +240,228,113, 50, 62,169,139,123, 64,111,231,153,239,191, 63,195,191, 87,247,158,116,153, 74, 37,253,238,187, 45,237, 83, 83, 31, + 75, 1,192,203,203, 79, 62,119,238,162,187, 86, 34,145,252,231,107, 87, 76, 95,126,185, 59,225,252,229,220, 93,102, 84,217,203, +215,215,247,198,201,147, 39, 29,164, 82, 41, 36, 18, 9, 84, 42, 21,116, 58, 29, 30, 61,122, 84, 25, 25, 25,169,183,182,182,182, +202,203,203,131, 66,161, 0, 69, 81, 56,121,242,100, 38, 0,207,215,137,170,124,180, 0,224,189,193,126,236, 86,125,124,109, 57, + 60,131, 64,192,126,234, 12,202,200,163,136,216,233,204,185,251,109,206, 92,184, 61,105,212,232, 15, 29,123,244, 28,133,144, 85, + 99,245, 57, 57,153,129, 58,244, 72,170,205, 71,171,165, 15,250,140, 28, 51,106,220,154, 53,161, 8, 13, 9, 67,244,201,227,165, + 98, 17,173,177,182, 97, 75,130,186,116,171,252, 96,222,136,172,242,242, 28,247, 53,155, 34, 39, 14, 29,241,129, 91,247, 30, 35, +113,237,234,113, 68,132,135,197, 81, 2,242,183, 94, 70, 92, 13,112,104,134,121,215,165,105,211,253,242,156, 28, 87,161, 88,204, + 94, 24, 19, 35, 53, 26,141,119,198, 45, 94, 92,118,236,226,197,234, 7,144,143,105,218,133,197, 98,185,248, 14, 29, 26,159, 18, + 29,253, 46,207, 96,136,250, 8, 40,120,157, 51, 20,176,181,241,242,154,179, 32, 57,153,243, 32, 52,180,220,144,147, 83,210, 97, +209,162,194,218,126, 63,251,194, 5, 17,215,197,197,218,118,248,112,187,173,158,158, 68, 47,151,239,168,205,199,168, 54,206, 24, +177,216,230,224,153, 51,125, 9,155,221,115,233, 71, 31, 9,130,131,131,161, 84, 42,113,244,232, 81,236,216,190, 93,227,236,236, +252,208, 37, 33,225,158,191, 82,185,202, 92,206, 14,139, 22, 21, 26,141, 70,106,220,226,197,253, 19,159, 63,239,147, 39,151, 55, + 1, 0,103, 59,187,172, 14, 94, 94,113,187,163,163,159,124,221,180,169,201,220,122,126,127,246,172,211,145,244,244,153,118,118, +118,130,124,185,156,225,113,185, 69, 93, 90,181, 58,252,237,202,149, 63, 27,226,227, 57,124, 55, 55,107, 73,112,112,163,219,222, + 97,209,162,194,226,178, 50,102,193,218,181,221, 50,242,243,155,148,107, 52, 62,138,178, 50,153, 81,175,167,173,133,194,162,102, + 45, 90,200,213,177,177,185,205, 42, 42, 22,238, 2,228,127,214,248,169, 77,139,252,141,240,122, 28,173,223,228, 58,252, 57, 56, + 56,248, 55,187,107, 8, 33,102, 89,179,216,108,246,175,150,169,234, 1,135,162, 40,220,189,123, 23,246,246,246,144,201,100,224, +241,126,157,124,176,160,160, 0,191,252,242, 11, 30, 63,126,140,182,109,219, 86, 45, 99,212,173,136,120,188,247, 55,109,218,100, +163,213,106, 17, 23, 23,135, 14, 29, 58,128,199,227,129,195,225,252, 74, 4,202,229,114,180,110,221, 26, 75,151, 46,149,172, 95, +191,254,125,141, 70,179,166, 30,107,196,252, 89,179,102, 73,171, 44, 88, 89, 89, 89,104,223,190,125,245,247,142,142,142,184,127, +255, 62, 58,116,232, 0, 55, 55, 55,140, 29, 59, 86, 26, 17, 17, 49,223, 96, 48,124, 94, 23, 39,151,203,165, 3, 2, 2, 58, 2, +128, 72, 36, 2, 77,211, 79,173,173,173, 29,157,156,156, 68,214,214,214,156, 90,150,158, 20, 52, 77, 55,104,181,160,105, 26,121, +121,121,240,247,247, 71,105,233,203, 12, 46, 42,149, 10, 62, 62, 62, 80, 42,149,213,162,213,197,197, 5,106,117,253,174, 95,109, +218,180, 9,109,217,178,229, 0,145, 72,196, 99,179,217,120,240,224, 1, 2, 3, 3, 17, 25, 25, 9, 15, 15, 15, 8,133, 66, 36, + 39, 39, 35, 32, 32, 0, 87,174, 92,129,163,163, 35, 90,183,110,205,147, 74,165, 87,139,139,139, 47,103,100,100,132,214, 83, 79, + 90, 44, 22,227,202,149, 43,216,189,123, 55,158, 63,127,142,156,156, 28, 88, 89, 89,161, 93,187,118,104,213,170, 21,186,118,237, +138,228,228,100, 80, 13, 15, 38,153,175,175,111,244,237,219,183, 29, 8, 33,136,136,136, 64,121,121, 57,180, 90, 45,104,154, 6, +159,207,135,173,173, 45,250,244,233, 3, 71, 71, 71,248,250,250,226,208,161, 67, 14,131, 7, 15, 62, 45,151,203,219, 1,200,107, +168, 95,109,109,109, 23,174, 94,189,218, 93, 42,149, 34, 61, 61, 29,165,165,165,112,114,114, 66,175, 94,189, 92, 99, 98, 98, 22, +234,245,250, 45,255,173,217,252, 71,138, 44, 0,168,225,248, 78,157, 63,247,195,104,223,102, 37, 1,109, 91, 8,221,163,162,157, +220, 35,163,229,173, 1,192,223,207, 41,113,116,176, 48,235, 65, 98,116,214,249,115,199,227, 30, 63, 69,148, 57, 75,219,165, 21, +154,195, 23, 98,110, 13, 10,108,219,222,180,105,227,226,161,243,222,155,201,147, 58,189,139,252,204,227,136,185,116,215, 99,241, +135,179, 28, 63,223,252,253,153, 11, 49,183,232,210, 10,205, 42,243, 76, 89, 30, 95,239,249,182,171, 67, 89,225, 17,164, 36,113, + 33,176,242,135,151, 87,115, 40,149, 74,240,249,124,254,196,137, 19,141,203,151, 47,175,176,182,182, 22, 82, 20,133,203,151, 47, +203, 1, 12,108,136,183, 82,106, 75,140, 58,189,129,112, 89, 38, 66, 89,169, 41, 99, 49, 55,225, 81, 26, 6,244,235,157,223,189, +179,255,250,229,107, 54,175,240,109, 30,232, 56, 99,102, 24,123,109,232,164,237,160,208,163, 54,158,164, 20, 92,162, 14, 31, 19, + 0, 24,186,230,147, 80,164,166, 38,219,206,126, 71, 17,198,240, 4, 46, 45, 61,187, 89,109,223,125,121,144,143, 79,211, 38, 31, +204, 31,123,234,139,111,190, 24, 90,211,178,181, 39,124,245, 9, 0,125,205,233,219,191, 34,104,134,105, 65, 83, 84,150,178,162, +130, 69,116, 58,135,133, 49, 49,234,243, 55,111, 94,140,159, 61,219,170, 13,135,211,188, 13,135, 3,150, 78, 87,180, 18, 40,252, +196,100,202, 89,205, 48,214,105, 39, 78,184, 48, 92,238,189, 74,147, 41, 0, 38, 83,109,241,147,218, 76,137,142, 70,121,102,166, +190,248,234,213,202,190,223,124, 83,232, 62,112,224, 22,173, 78,231, 80,117,169,160, 41, 10, 84,149,235,132,201, 68, 49, 75,151, +210,132, 97,160,183,181,125, 7, 37, 37,205, 27,226,252, 48, 55,119,244,164,153, 51,135,158, 56,123, 22, 77,155, 54,173,190,159, +217,216,216, 96,241,226,197, 88,180,104, 17,239,254,253,251,157,142, 28, 57,210,233,243,207, 62,115, 2, 48,218,156,122,158,191, +121,211,246, 95,107,214,172,108,219,161,131,199,190, 3, 7,120,222,222,222, 0,128,103,207,158,249,110,220,176,193,211, 63, 32, + 32,127,253,251,239,239, 73, 92,190,188, 53,128,171,245,113,230,197,198,106,143,164,167,207,188,116,249,178,141,191,191, 63, 0, +224,201,147, 39,210,173, 91,183,206,106, 61,118,236,228, 53,115,231,174, 10,174,172, 84, 88, 23, 20,240,130,191,254,154, 57, 56, +110, 92,131,156, 85,245, 4,128, 94, 51,102,188,223,163,119,239, 86,163,103,206,180,243,240,240,160,196, 98, 49,116, 58, 29,114, +114,114,108, 19, 19, 19,189,163,203,202,148,199,110,222,140,128,209,216,255, 79, 28, 66,181,106,145,191,153, 37,235,183,243,226, +213,223, 94,209,209,209,228,149,154,172,190,129, 27,141, 70,179, 68, 22,195, 48,160, 40,202, 92,177, 5, 66, 8, 10, 11, 11,145, +144,144,128,103,207,158, 65,165, 82, 33, 45, 45, 13, 59,119,238,196,198,141, 27,113,231,206, 29,232,245,122,232,116, 13,231,160, + 21,137, 68,253,250,245,235,199,220,188,121, 19, 94, 94, 94, 16, 8, 4,224,114,185,224,112, 56,213, 47, 62,159, 15,103,103,103, + 40,149, 74,244,237,219,151, 45, 18,137,250, 53, 96, 37, 26, 50,126,252,120,110,213,255,229,229,229, 96,177, 88,213,162,165,188, +188, 28,197,197,197, 80, 40, 20,200,205,205,197, 91,111,189,197,149, 72, 36, 67,204, 61, 27, 21, 21, 21,229,114,185,220,166, 71, +143, 30,182,143, 31, 63,254, 77,182,223,159,127,254,185,178,178,178,146, 77,211,180, 89,142,246,251,247,239, 71, 84, 84, 20, 46, + 94,188,136,236,236,108,108,223,190, 29,251,246,237,195,201,147, 39,145,156,156,140,175,190,250, 10,223,125,247, 29,246,236,217, + 83,239, 57,106,217,178,229,224,136,136,136,206, 93,186,116, 17,178, 88, 44, 60,121,242, 4, 31,124,240, 1, 20, 10, 5, 28, 29, + 29, 1, 0,249,249,249,216,178,101, 11, 52, 26, 13,196, 98, 49, 92, 93, 93,249,107,214,172,233,238,232,232, 56,160,190, 58, 26, +141, 70, 35,139,197,130,167,167, 39, 66, 66, 66,240,221,119,223,225,220,185,115, 56,124,248, 48,230,206,157,139, 86,173, 90,225, +222,189,123,184,115,231, 14, 8, 33,245,222,100,248,124,254,216,125,251,246, 73,185, 92, 46, 76, 38, 19,202,202,202,144,153,153, +137, 91,183,110, 85, 30, 63,126,188,252,212,169, 83, 21, 87,175, 94,173,188,126,253, 58, 1, 80, 45, 56,131,131,131,237,185, 92, +238,219,102,116,169,163, 76, 38, 91, 49,107,214, 44,126,205, 49,155,151,151,135,209,163, 71, 11, 5, 2,193,114, 0,142,245, 17, + 68, 68, 68,252,105, 23,139,208,176, 80,235, 63,137,154, 28, 57,214,252, 14,207,244, 4, 81,209, 47,220, 51,178,141,221, 22, 47, +217,108,183,120,201,102,187,140,108, 99,183,168,232, 23,238, 60,211, 19, 28, 57,214,252,142, 25, 66,128,238,211,211,121,132,147, +189,205,142,209,195,135,147,239,190,219,210,126,222,123, 51,121,158,205, 23,131, 47,153, 8, 87,175,127,161,111,144, 7,213,166, + 21,205,255,238,187, 45,237, 71, 15, 31, 78,156,236,109,118,244,233,233, 60, 2, 13,132,157,145,218,243, 93,133, 60, 21,188,125, + 91,161, 87,207,182, 96, 83, 41, 56,122,120, 55,114,115,115,145,147,147,131,252,252,124,209,176, 97,195,144,151,151, 87,121,249, +242,101,185, 90,173,238, 9,224,105, 67,141,207,206,126,100,170, 44, 55,234, 76, 70,182,161,172,148, 83, 49,119,225,145,126,119, + 18, 57,211,243, 20,174,195,184, 60, 91,238,224,254,157, 14,236,222, 21,130,102,205,252,209,177,211,128,183,108,197, 55, 90,213, + 41, 94, 83, 17,253,211,209, 99, 39, 38,142,159,104,120,158,150,158,214,220,137,175, 37,132,232, 23, 46,251,190, 63, 91,228,222, +198,219, 47,200,241,113,138,209, 57,100,233,219, 63,158, 58,241, 69,246,181,171,199,209,189,199, 72,184,186,248,246,124,231, 29, +112,255,174, 22, 45,138, 16, 47,182, 88,156,170, 47, 45,245,100,120,188, 76,163,209,232,112,123,206, 28, 27, 29,135,227,108,212, +233,114,140, 58, 93,142,142,203,181,222,230,231,231, 70, 8,177,183,113,115,123, 65,184, 92, 15,131, 78,151, 66,209,116,179, 90, +159,206,121, 60, 55,177,167, 39,147,119,254,188,214,107,216,176, 18, 0,208,234,116, 14,207,211,211, 37,249,114,185, 36, 47, 63, + 95,146,145,149, 37, 73, 77, 75,147, 36,167,164, 72,146, 82, 82,172, 31, 38, 36,136,239, 63,124, 40,166, 88, 44, 39,115, 56,159, +231,228,180, 89,186,116, 41, 4, 2, 1, 12, 6, 67,109,215,108,168, 84, 42,188,243,206, 59,168, 0,186,152,195,105, 52, 26,169, +127,173, 89,179,242,163,149, 43,189,163,162,162,120,157, 59,119,134,157,157, 29,236,236,236,208,185,115,103, 28, 57,122,148, 59, +119,254,124,183, 21,187,118,189, 67,243,120,238, 13,113, 22,250,248,192,206,206, 78, 80, 37,178, 0,160, 69,139, 22,216,190,125, + 59,239,236,185,115,146, 79,126,248, 97,115,216,245,235, 1,154,140, 12,149,125,243,230,132,203,227,185,153,219,159, 0, 80, 86, + 89,233,191,101,235, 86,123, 7, 7, 7, 42, 63, 63, 31, 41, 41, 41,200,200,200,128,193, 96, 64,199,142, 29,169,195, 71,143, 74, +180, 44, 86,167, 63,121, 8,253, 70,139,252,141, 48, 27,117,196,209, 98, 94,221,128,174, 0,160,162,163,163, 73,213,114,226,171, +155, 99,181,152, 50, 71,104,189, 9, 20, 10, 5, 20, 10, 5,118,237,218, 85, 45,140,170,160,213,106,205, 17, 45, 1, 46, 46, 46, + 40, 45, 45, 69,243,230,205,127,101,201,226,112, 56, 96, 24, 6, 28, 14, 7, 60, 30, 15, 26,141, 6, 30, 30, 30,168,168,168, 8, +168,143, 83,173, 86,183,179,179,179,171,190,193,106, 52,154,106,145, 85, 85, 95,173, 86,139,146,146, 18,148,151,151,163,172,172, + 12, 42,149, 42,208,156,246,154, 76, 38, 36, 36, 36, 60,107,209,162, 69, 59, 22,139, 5,177, 88, 44, 82,169, 84,213,190, 69,197, +197,197,216,187,119,175,106,234,212,169, 14, 39, 79,158,108, 48, 97, 49, 69, 81,248,247,191,255, 13, 30,143,135,138,138, 10,124, +247,221,119, 88,176, 96, 1, 56, 28, 14,202,202,202,176,125,251,118,124,240,193, 7, 96, 24, 6, 90,173, 22, 91,183,110,173,147, +235,209,163, 71,207,111,222,188, 25,216,190,125,123,219, 99,199,142, 21,244,239,223,223,113,224,192,129, 16, 8, 4, 80,171,213, +208,235,245,232,210,165, 11, 90,182,108, 9,185, 92,142, 51,103,206, 20,250,250,250, 58,220,186,117,203,148,151,151,151,209,128, +184, 38, 53, 44,134, 48, 26,141,200,207,207,135, 66,161, 64, 65, 65, 1,114,114,114,144,157,157, 13,134, 97,208,128,206,130,189, +189,253, 24,127,127,127, 22, 0, 8, 4, 2,180,107,215, 14, 43, 87,174, 52,168,213,234,241, 0,206,188, 42, 54,248,251,239,191, + 63,118,237,218, 53,198,197,197, 5, 73, 73, 73,112,116,116,100,248,124,254,219, 90,173,182, 94,107,148, 76, 38, 11,255,233,167, +159,236,170,196,117, 85, 63, 87, 84,188, 60, 29,163, 71,143,182,219,183,111, 95,184,193, 96,168, 83, 92,231,230,230,254,121, 86, + 3,138,165,249,179,184,109, 4,224,180,243,183, 46,141,140,150,183, 94,188,100, 51,211,210,255,229,195,235,236, 57, 96, 62,255, +236,195,214,147, 71, 88,159,178, 17, 40, 57, 13,241, 12,238,231,190,109,248,240,254,244,196, 9,193,201, 28,142,141,215,142,157, + 97, 82,169,211,187, 53, 26, 97, 13,123, 7,107,120,121,114,169, 35,167, 30, 75,151, 45,255, 68,179,127,223, 23,169, 63, 30,140, + 30,196,101, 95, 24,112, 38, 38,107,110, 93,220, 79,159, 41, 78, 86,104,248,126,202,162,120,202,206,169, 27,218,181,109, 1,169, + 99, 9,190, 15,143, 68,211,102, 29,161,209,104, 96,109,109, 45, 52, 26,141, 58, 22,139,181,223, 28,145, 5, 0, 23, 47, 42, 76, +173, 91, 43,180,172, 50,147, 97,222,130,207, 71,245, 31, 60,188, 85,159, 62,253, 76,231, 47,156,215,117, 11,212,229, 14, 30,216, + 46,255,236,133,109,201,185, 57,105,190,173, 3,186,227, 81,226,229, 65,132, 32,129,162,106, 23,157,137, 41, 56, 91,105,122,116, + 57, 50,114,182, 73,109,186, 39, 88,187,238,225,224,161, 67,167,249, 7,245, 8, 50, 93,136,185,164,229,162,240,177,117,247,174, + 47,230,205, 28,124,236,135,253, 91, 7,156, 61, 19,238, 83,170,204,136,222,179, 7, 26,252, 77, 65, 40,202,209, 74, 36, 42, 40, + 42, 43,107, 59, 38, 44, 76, 57,110,241,226,115,109, 24,166,149, 81,167, 75, 11, 3,212,132, 16,202,100, 48, 44,127,120,224, 0, + 43,148,162,150,133, 1,166,117, 44, 22, 59,219,100,170,112,165,105,225,106,128, 9,123,109, 39,183,209, 96,112, 98,120, 60,186, +224,242,101, 67,192,187,239,106,170,230,163, 80, 40,196,137, 19, 39,192,229,114,171, 95, 28, 14,167,250,189,147,147, 19,168, 87, +219, 72,127,243,224, 87, 11,103,213,188,205,203,203,131, 68, 34,129,163,163, 35,242,242,242,112,253,250,117, 60,125,250, 20,108, + 54, 27,131, 6, 13, 2, 93,135,111,243,235,156,227, 22, 47,238,239, 23, 16,224, 49,103,206, 28,250,245,251,163, 78,167, 67,113, +113, 49, 70,140, 24, 65,159, 57,115, 70,118, 54, 51,115, 56,128,253,245,113, 6, 14, 29, 90,148,127,228, 72,173,191,221,190,125, +123,234,151, 95,126,225, 13, 26, 56,112,209,135,235,214,109,251,122,223,190, 44,163,193, 32,107, 76,219,105,154,166, 41,138,130, +187,187, 59,138,139,139, 81, 94,254,114, 5, 91, 44, 22,195,214,214, 22,122,189, 30, 38, 66,216,127,230,248,169, 75,139,252, 77, +176,179,134,224,250,149,101,139,121,181, 46, 90,117,161,232, 85,243,198, 98, 50,153,204, 18, 89,108, 54,187, 65,159, 43,115,172, + 92,175,195, 28,161, 85, 85, 87, 62,159,255, 43, 75, 86,149,192,170,170, 39, 77,211, 96,177, 88, 13,222,196, 95,137, 33, 86, 89, + 89, 25,142, 30, 61,138,158, 61,123, 86, 47, 75,149,150,150, 66,161, 80,160,180,180, 20,149,149,149,120,254,252, 57, 46, 94,188, + 8, 31, 31, 31,192,204,224,175,169,169,169,113, 77,155, 54,237, 80,117, 19,239,221,187,183,219,158, 61,123,114,134, 12, 25,226, + 66, 8,193,170, 85,171, 10,187,116,233,226, 80,243, 38,223, 16, 88, 44, 22,174, 95,191, 14, 31, 31, 31, 16, 66,192,225,112,240, +228,201, 19, 72,165, 82,152, 76, 38, 48, 12,131,130,130, 2, 88, 89,213, 31, 35, 49, 33, 33, 97,250,140, 25, 51,114, 36, 18, 73, +155,162,162,162, 92, 30,143,215, 35, 54, 54,214, 93,167,211,193,218,218, 26,214,214,214, 56,125,250, 52,108,108,108,240,254,251, +239,103,170,213,234,235, 34,145,200, 73,173, 86,199,231,229,229,173,106,204,249, 54, 24, 12, 80,169, 84, 40, 41, 41, 65,113,113, + 49,148, 74, 37, 42, 43, 43, 27,172, 99,109,232,209,163, 7,162,163,163, 89,159,126,250,233, 15,169,169,169, 0, 0, 47, 47, 47, +188,255,254,251, 44, 87, 87, 87, 60,127,254, 28,113,113,113,208,233,116, 32,132,212, 59,121, 25,134,233, 61,117,234,212,238, 30, + 30, 30,148, 78,167,131,201,100,130, 70,163, 65,213,251,204,204, 76,248,249,249,209,158,158,158,111,165,166,166,246, 70, 29, 27, + 43,106, 62, 48,252,209, 8, 9,249, 88,139,191, 33,242, 51,143,195,149, 45, 5,104,107, 16,245,113, 20, 21,190, 89, 20, 23,185, + 92,190,110,233,199,191,188,251,245, 38,157, 83,118, 46,208,194,127, 36,124, 91,245,197,244, 41, 6,124,250,217, 81,120,120,182, + 64, 70, 70, 6,122,247,238,205,201,201,201,153, 81, 94, 94,190,216, 92,238, 11, 23,110, 26,207,159, 62, 51,118,220,219,211, 58, +244,235, 55,196,112,238,220,105, 36,196,159, 75,156,241,246, 24, 57, 49,149, 83,118, 54,130,123, 79,146,238,248,182,105,215, 11, + 90,131,177, 7, 16,186, 9, 8, 37,117,207,119,104, 79,157,114,166, 79, 29, 15,159, 50,113,242, 59,109,251,246, 29,160, 63,119, +225, 39,196,221,184,240, 96,243,166, 89, 87, 62,221,122,168,119,255, 65, 99, 90, 59, 58, 93, 63,237,223, 92, 51,211,221, 94,242, +236,251, 61,197,248, 27,131,225,240,249, 6, 0,180,141,167,167,219,177,139, 23,211,219,177,217, 44,107,192, 72, 8,105, 1,192, +129,102,152, 21, 39,103,206, 12,244,123,117, 35, 53, 0, 38, 63,128, 46, 5,180, 34,128,139, 58, 66,230, 48,124,190, 9,175,174, +139, 52, 69,129, 16,242, 43,145,245,186,208,162,105,186, 65, 3, 64, 77,206,154,247,162,170, 7,234, 29, 59,118,128,199,227,129, +203,229,130,205,102, 55,232,126, 81,147, 51,241,249,243, 62,123,247,239,231,213, 38,178,138,138,138, 80, 84, 84,132,242,242,114, + 76,152, 48,129, 19,118,231, 78,123,188,114,253,168,139,211,195,217, 89, 35, 18, 8,242, 31, 61,122,228,210,170, 85,171, 95,213, + 87,169, 84, 66, 32, 16, 96,255,129, 3,156,224,161, 67,223,235,123,250,244,102, 52, 16,255,170,182,182, 83, 20, 5,169, 84, 10, + 91, 91, 91, 80, 20, 5,131,193,128,188,188, 60, 36, 38, 38,226,206,157, 59, 96, 81,148,225,207, 28, 60,181,105,145,191,161, 85, +235, 55,203,135, 85, 22, 45,170, 46,235,139,185, 66,139,197, 98,189,177, 85,171, 46,152,179,116, 40, 20, 10, 31,230,228,228,116, +115,117,117,133,193, 96,168, 22, 90, 53, 45,113, 85, 55, 61,129, 64,128,251,247,239, 67, 40, 20, 62,172,172,172,172,151,147, 16, +242, 86,167, 78,157, 16, 21, 21,133,203,151, 47, 35, 45, 45, 13, 21, 21, 21,208,104, 52, 80,171,213, 72, 76, 76,132,201,100,130, +191,191, 63, 68, 34, 17,132, 66,225,195, 42,203, 87, 93, 80,169, 84,185,108, 54,187,133, 64, 32,168,254,204,217,217, 25, 69, 69, + 69, 38,189, 94,143,189,123,247, 42,101, 50,153, 72, 32, 16,152, 45, 92, 41,138,130, 92, 46,135,155,155, 91,181,143, 86, 89, 89, + 25,164, 82,105,149,176,128, 70,163,129,149,149, 21, 8, 33, 13,157,163,202,148,148,148, 15,107,252,223,113,220,184,113, 63, 70, + 70, 70, 54,139,137,137,193,173, 91,183,224,232,232,136,245,235,215,167,165,167,167, 79, 4,112, 71, 46,255, 99,253, 34,205, 25, + 67, 69, 69, 69, 71, 31, 62,124,248, 86,167, 78,157,170,175, 18,189,123,247,166,122,247,238,237, 80,211,212, 95, 80, 80,128,219, +183,111, 35, 38, 38, 6, 20, 69, 33, 57, 57,217,168, 86,171,127,172,135,154,227,234,234,186,103,229,202,149, 98,131,193, 80, 61, +182, 5, 2, 1,248,124, 62, 56, 28, 14, 88, 44, 22,210,211,211, 49, 98,196, 8,201, 55,223,124, 19,174,209,104,188, 1,252,102, +160, 46, 90,180,232,111,233, 99,163, 80, 67,119, 63, 65, 41,241,247,115, 74,220,185,227,211,110,179,231,188,188, 70,236,220,241, +169,193,223, 79,154,120, 63, 33, 95,210, 65,138, 6, 39,230,153,152,172,121, 90,253,153, 97,103,206,254, 60,126,201,162,247,217, + 94, 94,126,242,152, 75,119, 61,250, 26, 62,161,236, 29,172, 81, 84,168, 68,122,102, 62, 82, 51,180,196,203,203, 79, 30,119,251, + 33,239,179, 45, 95,250,170, 42, 42, 15, 93,186,146,251, 83, 3,244,149, 87,175,167,141,220,252, 21,239,202,180, 25, 29,185, 2, +129, 11,138, 11, 31,194,195,195, 17, 35,130,219, 96,247,190,235,144, 72,236,224,228,228, 4,154,166, 69,230,182,189,176,176,144, + 58,122,240,234,187, 83,223,153,213,101,224,128,161,134,179,231, 78, 49,151,207,159,188, 30,190,115,197, 49,194, 82, 9, 41, 82, + 38,104,210, 84, 22,255, 44,229,254,196, 62,253, 38, 64,192,177,242, 1, 90,214, 58, 96,171, 55, 24, 16,100, 70, 69,134,242,167, +190, 51,187,235,192,129,195, 13,231,206, 29,199,185,211,251,110,174, 94,221,228,116,218,139, 3,156, 27,119,178,249, 35,199,206, + 45,137, 62,243, 88, 59,102, 88,211,167, 46,162,118,106, 32,237,111,171,178,104,138, 82, 22, 22, 20, 88,179,217,108,117,248,164, + 73,201, 0,160,103,152,162, 50, 22,203,145,162,168, 39, 0,158,172, 3, 28,192,229,150,142, 51, 24,140,139, 61, 60, 56, 76,110, + 46,171,196,104, 52,178, 0,238,146,223,230, 95, 4,139, 97,242, 13, 26,141,187,219,192,129,172,138,140, 12,182,216,201,201, 0, + 0,122,189,190, 65,161,133, 58, 54,173,188,206,105,110,251, 42, 42, 42, 96,170, 67, 8,190,206,153, 39,151, 55,121,245, 16, 94, + 13,189, 94, 95, 45,178,138,138,138,160, 80, 40, 32, 18,137, 80,160,209, 56,153,195, 57,160,115,231,189, 97,161, 14, 57, 34,244, + 0, 0, 32, 0, 73, 68, 65, 84,161,139,143, 28, 61,202,169, 41,178,170, 94,108, 54, 27, 27, 55,109,226, 44, 88,178,100,238,123, + 12,179, 16,181, 44,131,214,213,159, 85, 15,237, 44, 22, 11, 12,195, 32, 35, 35, 3,153,153,153,200,200,200, 64, 70, 70, 6, 4, + 2, 1,200,159,188, 9,232,111,236,159,133, 26, 75,133,179, 95,183,114,213, 27,222,161, 49,206,240,230, 10, 3,163,209,248,135, + 10, 45,149, 74, 21,115,241,226,197,206, 35, 71,142,100,110,222,188, 9,153, 76, 86, 45,180,170,254, 86, 45, 71, 9,133, 66, 28, + 59,118, 76,167, 82,169, 98, 26,152, 76, 23, 79,159, 62,221, 33, 36, 36,132, 61,125,250,116, 60,122,244, 8,115,230,204,129, 66, +161,128, 82,169, 68, 81, 81, 17, 42, 42, 42,208,185,115,103,240,249,124,196,199,199,235, 43, 42, 42, 46, 54,180,116, 38,151,203, +203, 29, 29, 29,157, 95,255,110,236,216,177, 78,223,126,251,109, 69, 82, 82,146,190, 91,183,110,214,230, 10,142, 42, 28, 60,120, +176,218, 82,247,244,233, 83,124,251,237,183, 32,132,128, 16,130,187,119,239,226,243,207, 63,175,142,125,214, 72,220, 41, 44, 44, + 52,232,245,122,248,248,248,192,213,213, 21,149,149,149,248,242,203, 47, 13, 0,238,252,183, 70,115,101,101,229,145,105,211,166, +125,116,239,222, 61,103,134, 97, 94,154,180, 95,181, 79,167,211, 33, 37, 37, 5,137,137,137, 72, 74,250, 63,246,174, 59,190,169, +234,125, 63, 55,187, 77,186, 23, 29,180,140, 2,165,139,101, 1,101,239,213, 34,138,130, 3,196,197, 82, 20, 5, 68, 16, 4, 4, +148, 33, 32,160, 32, 75, 5,100,111, 40,200,110, 41,163, 32,155,238,210, 66,103,210, 38, 93, 73,155,125,199,249,253, 65, 91, 11, +118, 36, 5,253,169,223, 60,159, 79, 62,185,185,185,247,201, 57,231,158,156,251,220,247,188,231,125, 83, 80, 82, 82, 82,253, 32, +112,251,246,237, 82,154,166,247,214,197,235,233,233, 57,247,231,159,127,246,150, 74,165,143,245,231, 42,107,104,149,149, 84,165, + 82,193,197,197, 5,253,251,247,247, 58,119,238,220, 92,163,209, 56, 15,255, 13, 80,175,190,156,214,249,227, 15, 95,194,200, 40, +105,238,193,232,252,203, 43,190,157, 94,233, 12,239,149, 56, 50,202, 47,247, 78,170, 11, 94,125,249,112,103, 0,121,168,223, 79, +139, 59,127, 65,113,164, 75, 23,215,152,131, 71,143,254, 50,123,230,167, 55,103, 76, 31,239,169,211,103,216, 5, 54, 19, 83, 0, +144,153,109, 34,119,147, 56,195,138,149,159,222, 92,178,252, 7, 94, 97,113,217,196,223,127,175, 59,188, 65, 77,241,194,227,193, + 46, 48,184,183,188, 77, 80,143, 22, 87,175,236,128,131, 84,143,182,193,157, 49,120,208, 11,136,137,189,141, 2,149, 1, 10,133, + 2, 70,163,177,222,112, 9, 41,119, 15,141, 37, 20, 9,160, 8,149, 67,241,136,221,216,113,239,247,140,140,124,145, 68, 71, 31, +101, 14, 31,218,113,105,239,175,107,247,243, 68, 66,129,222,228,108,162, 40,131, 26,188,132,164, 10,237,163, 7, 26,161, 68, 84, +183,249,181, 50,176,107,104, 88,176,247,216,113, 19,157,135, 13, 29, 65, 78,156, 56,204,237,221,179, 45,102,239,150,118, 59, 56, +158, 70,164,200,213, 73,212, 26, 90, 77, 40,177, 75,133,134,211, 21,102,182, 50,248, 70,190,106, 6,246,255,107, 59, 16,225,184, +108, 98, 50,181,128, 80,152, 75, 24,198, 27, 52, 93,242,149,193,144,191, 72, 44,110, 62, 95, 32,120, 14, 20,197,153, 41, 74, 11, +147, 41, 19, 0,220,114,114,124, 76, 78, 78, 5,124,131,161, 21, 88,182,214, 0,200,102,163, 49,175, 34, 55,215,199,173,119,111, +201,253, 5, 11,164, 77,186,118, 53, 80,149, 62,196,245, 9, 45, 62,159, 15,240,120,156, 37,156,150,214, 79,175,215,131,171, 35, +180, 74, 67,156, 12,195, 60, 38,178,170,132, 86,213,255,197, 18,206, 77,243,231, 95, 13, 24, 60,184, 36, 54, 54,182, 73,159, 62, +125,168,242,242,114,148,151,151, 63, 38,182,124,125,125,169,208,240,112,233,238,152,152, 64, 75,219,211, 34, 17,205,227,253,229, + 66,235, 95,142, 58, 19, 73, 11, 26,152, 66,179, 88,104, 89,104,209,162,105,154,134,151,151, 23,138,138,138,234,188,241,243,120, + 60,216,219,219, 87,205, 17,215,187,242,206,104, 52,174,158, 49, 99,198,148,161, 67,135,122,180,109,219, 22, 42,149, 10, 77,154, + 52,129,157,157, 93,181,239, 88, 21,223,205,155, 55,241,243,207, 63,107,140, 70,227,234, 6, 56,191, 91,190,124,249,135, 35, 71, +142,116,243,246,246,134,171,171, 43,238,222,189, 11, 87, 87, 87,104, 52, 26,164,166,166,194,209,209,177,218,111,231,232,209,163, +229, 70,163,241,187, 6,196, 27,137,139,139, 51, 59, 58, 58,222, 85,169, 84,252,146,146, 18, 65,105,105,169, 64,163,209, 8,213, +106,181,240,228,201,147, 30,206,206,206,186,243,231,207,171, 2, 2, 2,248, 15, 30, 60,224,211, 52,221,160,122,165, 40, 10, 83, +167, 78,133, 72, 36,130,209,104,196,234,213,171, 49, 99,198,140,106,159,172,229,203,151, 99,206,156, 57,213,194,121,243,230,205, +214, 13,156,132,192,108, 54,131,166,105,139, 23, 40, 60,213, 19,177,101,130,189, 32, 61, 61, 61,170, 75,151, 46,167,247,237,219, +231, 94, 25,147, 12,133,133,133, 40, 44, 44,132, 74,165, 66, 69, 69, 5, 24,134,129,159,159, 31, 10, 11, 11,113,248,240, 97,117, +121,121,249, 96,212,179,226,144,207,231,143,235,217,179,167,224,201, 50, 84, 61,229, 85,137,119,137, 68, 2,185, 92,142,190,125, +251,138, 99, 99, 99,199, 1,248, 87, 11,173,154,225, 29, 6, 13,126, 79, 20, 18,214,205,116, 39, 49, 58, 55,184, 69, 97,238,152, + 17, 78,199, 1,224,118, 66,161,243,157, 84, 23,132,132, 69,145, 65,131, 93, 35, 10, 11, 54,181, 3, 96,174, 47, 93, 15, 0, 56, + 75, 37,163, 6, 14,232, 42,119,148,201,120, 43, 86,110,254,237,199, 31,191,123,110,255,241, 63,194, 59,172, 88,249, 40,188,195, +192, 1, 93,185,148,228,148, 81, 0,182, 88, 42, 94,162,162,134,223,250,121,235,207, 72, 73, 60,239,251,249,212,246,226,146, 66, + 26,246, 14,254,136,232,216, 4,155,182,222,195,157, 59,119, 10, 76, 38, 83,223,122,251, 55, 69, 2, 18,147, 18,130,218,133,133, +122,143, 29, 55,193, 41, 42,106, 4,162,163,143,224,215,109, 91,226, 94,121,125,228, 79,249,165, 26,190,151, 80, 42,146, 18, 78, +204, 23, 57, 11, 68, 18,123,165,201,244, 40, 2,129, 80,104,231, 4,140,170,247,198, 51,105,194, 24,231,126, 3, 70,224,248,137, + 35,248,117,219,166, 11, 95,134,189,186,165, 69,167, 16,170,235,115,223, 78,110,209,178, 69, 51,109, 69,161,134, 71,137,205, 6, + 3,231,248,237,182,172, 85,153,115,198,101, 2, 88,137,127,233,170, 67, 49,203,222, 49,154,205, 99,252, 35, 34,174,203,175, 95, +111,247, 13, 77,187,125, 1,148,124,105, 50,101,237, 3,114,203, 0,222,196,202, 49,125, 37, 96,167, 23, 8,124,156,121,188,219, +229, 44, 59, 20,124,126, 34,106,127, 16,191,251,235,176, 97, 93, 62,206,200, 16,121,246,232, 97, 47,143,137,145, 86,102, 34,169, + 87,104, 9, 4, 2,144,186,167,186, 30,227,164,182,111,231, 1,143,166,252,235, 26,227, 68, 34, 17,116, 58, 29,104,212,105,209, +125,140,211,231,212,169,220,140,140,140, 54,110,110,110,143,137,172,146,146,146,234,109,131,193, 0,157, 78, 7,123,123,251, 68, +125,237, 51, 34,143,113, 22,198,197, 25,150, 78,157, 58,239,141,215, 95, 95,123,246,220, 57, 59,119,119,119,168,213,234,199,132, +150,201,100, 66,191,254,253, 69,203,111,221, 26, 11,141,102,190, 37,237,217,164,111,223, 6,253,129,249,124, 62,184,191,120,234, +240, 63,128, 9,181, 9, 47, 94, 67, 83, 56,150,174, 58,172,227, 6,249,228,234,190, 57, 17, 17, 17,134,180,180, 52, 4, 4, 4, + 84,139,149,154,191,233,228,228, 4, 23, 23, 23,220,188,121, 19, 95,127,253,181, 30,192,156, 6, 56,203,117, 58,221,107, 3, 7, + 14,212, 11, 4, 2, 4, 7, 7, 87,199,207,226, 56, 14, 98,177, 24, 50,153, 12,183,110,221,194,240,225,195,117, 58,157,238, 53, +252, 57,134,214,147,156,106,157, 78,247,230,160, 65,131,116, 73, 73, 73,232,217,179, 39,238,220,185,131,138,138, 10, 84, 84, 84, +224,225,195,135, 8, 13, 13,133, 78,167,195,250,245,235,245, 58,157,238, 77, 0,234,250, 56,203,203,203,135,207,152, 49,131,191, +107,215,174, 22,126,126,126, 97,157, 59,119,110,219,191,127,255, 86, 47,191,252,114,179, 97,195,134,249,180,105,211,198, 48,120, +240, 96,207,161, 67,135,122,234,116, 58,225,229,203,151, 21, 52, 77, 15,109,160,156,213,226, 36, 45, 45,173,122,170, 80, 32, 16, +160,168,168,168, 58,114,127,213,160, 84,135, 16, 30,208,144,216,174, 18, 88, 85,130,203, 2, 63,183,218, 56, 27, 60, 73, 44, 22, + 87, 89, 60,137, 5,156,183,147,147,147, 7,246,238,221,251,246,123,239,189, 87, 94, 80, 80, 0, 71, 71, 71, 4, 6, 6, 34, 40, + 40, 8, 30, 30, 30, 48,155,205, 56,116,232,144,246,240,225,195,247,212,106,117, 95,252, 57,134,214,128, 39,218,241, 97,109,131, +108,149, 53,171, 74,104,217,217,217,193,207,207,175,170,109, 31, 90,211,158,141,196, 95,203, 89, 41, 96,250,247, 27,220,114, 88, +228, 75,206,135,142, 92, 17,175, 93,119,248, 94,196, 0,108,118,111,174, 57,234,222, 92,115, 52, 98, 0, 54,175, 93,119,248,222, +161, 35, 87,196,195, 34, 95,114,238,223,111,112,203,164,196,148,182, 53,243, 30,214, 86, 78, 59, 59,187,110, 61,123, 68,148,198, + 94,186,192, 45, 89,254, 3,175, 95,223, 87,110,109,249,233,208,161, 45, 63, 29, 58,212,175,239, 43,183,150, 44,255,129, 23,123, +233, 2,215,179, 71, 68,169,157,157, 93, 55, 75,234, 62,105,194, 24,231,200, 97, 35, 16, 29,125,136,217,191,123,253,242, 61, 7, +210,123,191, 63, 37,174, 48, 45,237, 14, 81,230,157,130,144,151,141,228,228,100,117,165,200, 74,179,132,115,226,248, 49, 53, 69, +214, 69,119,239,158,155,147,147,193,158, 57,115,140, 62,119,238,150,254,226,109,165,250, 70, 82, 81,137, 92, 85,242, 64,163, 41, + 54,113, 28, 11,150,101,249, 95,125, 85,237,176, 91,235, 53,234,222,189, 15,206,159,221,137,109, 91, 55,170, 57, 14,134, 81,251, +247,179,163, 70, 45, 32,205,154, 55,111,182, 99,247, 78, 42,234,197,151,156, 9,192, 13, 31, 57,194,101,215,158, 93, 84,203,214, + 45,155, 7, 6, 86,135,180,249,215,245,165,207,129, 10, 10, 72, 86,252,254,123,103,135,158, 61,239, 50, 66, 97,208, 66,145,168, +213, 26, 64, 60, 10, 96, 39, 2,244,124,128, 55, 31,240,211, 11, 4, 29,236, 25,230, 78,185, 78,215, 20, 0, 22, 17,242,160, 54, +206, 5, 64,169, 38, 59,251,194,205, 31,126, 48, 54,121,237, 53, 55,113,147, 38, 78, 96, 89,170,106,124,175,235, 37, 16, 8,158, +180,192,212,201,233,231,225,145,127,244,232, 81, 4, 5, 5,193,207,207, 15, 53,125,100,171, 2,114,187,187,187,227,192,129, 3, + 32,143, 7,167,174,147,179, 83,139, 22, 55,151, 45, 93,106,226, 56, 14,165,165,165,127,178,102,149,150,150,130,227, 56,156, 56, +126,220,164,121,148, 9,196,162,186,247,229,243, 43,222,232,213,107, 73,100,100,164, 57, 35, 35,163,122,229,117,149,101, 75,169, + 84,194,193,193, 1, 6,163,209, 31,128,212, 18, 78,229,201,147, 50, 52, 48,174,215, 98,209,250, 43,250,210,191, 93,100,213, 76, + 40, 61,193, 34,139, 22,195, 48,240,247,247,127, 44,165, 11,143,199,123,236,101,229,138,195,237, 73, 73, 73,167, 6, 15, 30, 60, +239,249,231,159,159, 52,111,222, 60,126,219,182,109,161, 86,171,225,234,234, 10, 47, 47, 47,164,166,166,226,232,209,163,108, 81, + 81,209, 6, 0, 11, 81, 75, 0,187, 90, 16,147,158,158, 30,213,190,125,251, 61,179,102,205,114, 30, 52,104,144,208,223,223, 31, +132, 16,220,186,117, 11, 7, 15, 30, 52,111,217,178, 69, 83, 41,178, 98, 44, 44,235,105,185, 92,254,202,208,161, 67,119,140, 27, + 55,206,145,101, 89,225,195,135, 15, 97, 52, 26, 65,211, 52,114,114,114,204,209,209,209, 21, 58,157,110, 12,128,211, 22,240,221, + 44, 43, 43, 11, 61,115,230,204,184,203,151, 47,127,253,222,123,239,185,247,239,223, 95,196, 48, 12, 46, 93,186,164,234,212,169, +147,151, 82,169, 52, 31, 56,112,160,216, 96, 48,204, 97, 89,214,162, 20, 60, 20, 69, 65,163,209,192,195,195, 3, 70,163, 17, 28, +199,193,100, 50,193,193,193,161, 58,109, 18, 33, 4,214, 56,215, 63,209, 7,248,102,179, 25,175,191,254, 58, 56,142,195,234,213, +171,193, 48,140,213,100,206,206,206, 55,110,223,190, 29,213,177, 99,199,106,241, 82,213,135, 36, 18, 9, 60, 60, 60,224,238,238, +142,232,232,104, 8,133,194, 27, 13,249,187, 85,226, 78, 81, 81, 81,167, 51,103,206,116,187,119,239,222, 91, 0, 58,154,205,102, + 63,150,101, 41, 30,143,167, 32,132,220,213,104, 52, 63,193,194, 20, 60, 74,165,242,235,183,223,126,187,211,206,157, 59, 29, 4, +130, 63,254, 26, 2,129, 0, 18,137, 4, 85,193, 49, 9, 33, 48,153, 76,152, 59,119,174, 70,171,213,126,253, 95, 25, 37, 34, 58, +119,197,166,245,107, 28,206,157, 63,165, 74, 78,199, 65, 87,215,228, 39,251, 95, 94, 97,193,166,118,242,220, 92,135,136,206, 93, + 45,226,164, 77,230,226, 55,199, 76, 11,168, 76,193, 51,247,225,195,172,141, 59,182,175,202, 4,128,111,191, 91,221,166,176,184, +108, 98,114, 82,202,168, 13, 27,118,119, 99,204,230, 98, 75, 56,255, 16, 47, 59,212, 32, 48, 0,184,118,235, 94, 97,139,225,175, +157,156,211,186,165,211,139,202, 98,125,126, 69,133,238, 35, 0,153,150,214,189, 71,247,222, 56,127,122, 23,126,221,182, 67, 67, + 56,190,193,195,195,131, 0, 64,114,178, 7, 73, 78, 46, 35,127,248, 21,187,104,133,228,206,194,105, 31,245,159,166,214,148,124, +183,122,125,253, 83, 41,237, 59, 60,143,246, 29,158,199,148,143,190,112, 14, 13, 11, 14, 0,128,253,251,193,134,181, 78, 58, 54, +239,203, 5, 47, 46, 92,184, 0,154,114, 35,170,210,245,164, 38, 36, 29,207,204,132,233,223,220,143,230, 49,204,165,133,132,188, +172,139,139,107,215,237,179,207,126,191,184, 98, 69, 11, 53,159,223,253, 43,128,227, 81, 20, 11, 66,236,121, 60,158, 66, 70,211, +183,202,197, 98, 31,138,227,158,115,100,217, 67,116, 61,249, 63,231, 49,204, 53, 76,155,214, 70, 87, 82,226,217,227,243,207, 61, + 4,159,125,198,171,207, 25,190,230,255,215, 18,206,235,119,239, 30,159,248,254,251,249,243,231,205, 27,188, 97,227, 70,251,118, +237,218,161,160,160, 0,193,193,193,240,243,243,195,153, 51,103,112, 96,239, 94,109, 89,121,249, 28, 0, 63, 90,194,185,253,196, +137,212,182, 97, 97, 69, 27, 55,110,244,141,140,140,164,180, 90, 45,212,106, 53,212,106, 53,140, 70, 35, 42, 3, 66,147,180,244, +244,100,154,166, 55, 88, 90,119, 86,165,178, 91,216,181,107,158,136,227,150,189, 50,114,228,140,133,139, 22, 73, 90,182,108, 73, + 25,141,198,106,171,150,217,108,134,131,131,131,217,100, 50,185,163, 22,191,183,218, 56, 37, 91,182, 48, 42,149, 10,158,158,158, +213,225,154,106,198, 37, 44, 47, 47, 7, 33,228, 63,155, 0,253,175, 68,157, 10,201,213,213,245,134, 64, 32,104, 90,211,186, 85, + 91,238,188,154,251,104,154,206, 43, 42, 42,138,120, 66,241,214,229, 15, 21, 8,224,155,126,253,250,189, 50,125,250,116, 42, 54, + 54, 22,135, 15, 31, 38,153,153,153,251, 43,173, 88,153,245, 60, 61,213,197,233, 40,145, 72, 62,145,201,100, 3,170, 66, 56, 72, +165,210,123, 90,173,246,108,229,116, 97,121, 35, 56,157, 36, 18,201, 84,153, 76, 54,176, 50,253, 10, 28, 29, 29,111,107,181,218, + 51, 70,163,113, 13,234, 78, 84, 93, 31,167,189,179,179,243,215, 30, 30, 30,111,126,246,217,103,238,113,113,113,138,243,231,207, +139,202,202,202,118,154, 76,166,250,146, 74,255,137,211,205,205,237, 6,159,207,111,250, 23, 93, 35,180,111,223, 62,122,248,240, +225,145, 99,198,140, 1, 77,211,248,241,199, 31,113,230,204,153,227,247,239,223,143,106,224, 9,247, 73, 78,143,166, 77,155,198, + 78,154, 52,169,217,235,175,191, 46,117,117,117,133, 64, 32,128, 86,171,197,253,251,247,113,235,214, 45,114,228,200,145,138,155, + 55,111,230,233,116,186, 62, 0,138,172,104,207,167,121, 18,127,140, 83, 32, 16,244,246,247,247,223, 61,127,254,124,199,129, 3, + 7,218,187,187,187,131,207,231,131,166,105, 40, 20, 10, 36, 36, 36,224,212,169, 83,218,253,251,247,107,139,139,139, 95, 7,112, +225,255,163,156,207,146, 51,164, 13,190,124, 34, 81,116,157,209,222, 27, 56,182,193,114,246,235,237, 51, 98,212, 43, 67,135, 16, + 66,176,239,192,201,147, 49,113, 13, 38,149,174,179,156, 13,149,213, 18,206,224,214,188,249,137, 73, 9,143, 5,180, 12, 11, 13, + 79, 11,105, 55,114,177, 37, 68, 53, 34,195, 63, 86,247, 26,211,177, 53,109,186,143, 77,179,134, 4, 34,106,196,168,151, 35,191, +152, 51, 27,223,124,189, 4, 71,246, 29, 58,158,156,249, 88,154,160,127, 93, 95,170,121,111,249,138,207,239,199,227,241,252, 41, +177,248,119, 90,171, 77,119, 4,132,229, 0,255, 43, 64,187, 80, 36,106, 5,150, 13, 3, 33,130,114,138,138, 94,193,178,174, 0, +228, 13,113, 46, 22, 8,158,151,250,248,244, 90,205,113,179,239, 36, 36, 56,212,124, 96,171,178, 60,215,124,168,244,245,245, 85, + 42, 20,138, 38,150,112, 70,125,255,189, 89, 39,147, 73,102, 47, 91,214,187,194, 96,232,189,112,225, 66,193,245,235,215,177,254, +135, 31, 24, 67, 94,222, 14, 21, 48,181,142,217,144, 58, 57,155, 77,157,106, 55,115,253,250,119, 2, 91,183,246,122,235,173,183, +132, 66,161, 16, 90,173, 22,185,185,185, 56,125,234,148, 41, 41, 57, 57, 73,163,209,188,104, 77,221,163,190,255,222,236, 18, 24, + 8,169,167, 39, 57, 23, 19,227, 60,241,147, 79, 38, 53,111,209,194,121,240,144, 33, 66, 39, 39, 39,148,150,150,226,225,195,135, + 56,116,232,144,178,162,162,194, 23, 0,107, 9,231,142,203,151,219,159,184,112,225,213,197,139, 23,139,195,195,195,225,236,236, +140,242,242,114, 36, 36, 36,224,194,133, 11,198, 13, 27, 54,168,213,106,245, 36,150,101,143,254,133,125,233, 63, 57,117,248, 87, +123,248, 91,114, 33, 34, 0,124, 89,185,189, 8, 13,231, 12,252, 55, 15, 62, 79, 34,192,205,205,109,147,193, 96, 32,122,189,126, + 34,128,156,127, 96, 57, 5, 17, 17, 17,235,149, 74,101, 55, 66, 8,156,157,157,175, 36, 38, 38,126,128, 58, 86,222, 52,192,201, + 7,208,205,193,193,161,171,163,163, 99,111,163,209, 24, 82, 57,253,150,172,213,106, 47,152,205,230,107,149,214, 39,246,255,185, +238,124, 0, 3,125,125,125,223,231, 56,174, 53, 69, 81, 46, 44,203,130,166,233, 50,142,227,238,171,213,234, 45, 0,206,252, 3, +202,249, 76, 56, 67, 91,225,101,194, 67, 72, 93,130,224, 49,161,245,132,128,160, 56, 36, 39,101,224,144, 21,229,228, 13, 25,224, +191,142, 99,129,211, 49,185, 31,162, 97,231,218, 63,132,150, 5,226,197,106,145,217,138,255, 54,161,200, 99,156, 20,161,114,130, +219,191,252,235,211, 8, 45, 75, 17, 26,132,222, 32,232,198, 17, 92, 75,185,143,243,255,181,177,110, 62,208,132,199,227,117,161, +120,188, 86, 4,208, 82, 20,197,128, 16, 55, 16,146, 1, 62, 63,113,158,217,156,129,218, 19,152,215,201,249, 13,224,246,131,171, +235, 21,158, 64,224, 13,128, 87,105,125,225, 56,138, 98, 9, 69, 49, 53,167,183,158,120,176,172,151,211, 12,180, 19, 74, 36,254, + 44,195, 52, 41, 0, 28, 78,176,236,115, 6, 66, 42,154, 2, 95,222, 6, 82,173,173,123, 21, 39, 95, 34, 9, 56, 65,200, 8,149, + 76,214, 94,169,215,123, 2, 32, 14, 50, 89,178, 70,171,221,102, 48, 24,214, 89, 91,119, 51,208, 78, 36,145, 52,101, 25,166, 9, + 0,240, 4, 2,229, 30,163,209, 63,207,201,233, 45,131,209,216,204,193,193,129, 54,153, 76, 26,131,193, 48,134, 97,152,115,214, +212,253, 62,195,132, 94,230,241,122,154,101, 50,119, 51, 69,201, 76, 12, 99, 54,153,205,185, 6,131,225, 30,128, 85, 0, 50,254, +226,190,100, 67, 35,255,128, 54, 78, 27,167,141,211,198,105,227,252, 31,231, 92, 10, 56,125, 3,184,217,218,243, 47,229,148, 2, + 8,168,124, 88,252, 55,214,253, 63,105,221, 18,216,218,194, 6, 27,108,176,193,134,191, 26,179,234,118,179,176,225,217, 65,135, + 90,124,178,108,248,255, 5, 85,143, 42,181,198, 36,216, 24,101,123,214,198,105,227,180,113,218, 56,109,156, 54, 78, 27,231,255, + 28,103, 67,220,255,198, 41,201, 9,181,236,219,244,119,252,176,205,252,107,227,180,113,218, 56,107,197,240,225,195,121,182,246, +180,113,218, 56,109,156,255,117,240,108, 77, 80, 39,154, 84,190,158,245,177, 54,252,183,251,194,223, 1,191,202,151, 53,199,251, +252,211, 26,245,216,177, 99, 28, 0,220, 75, 78,144,148,151,151,219,198, 34, 27,108,176,193, 38,180,254,230,155,214,211,220,220, +158,246,198,184,132,162, 32,167, 40,200, 1, 44,121,134,199, 54, 4, 95, 15, 15,143,143, 67, 67, 67,119, 52,105,210,100, 10, 0, + 47, 43,207,111, 35,149, 74,215,200,100,178, 88,153, 76, 22, 43,149, 74,215, 0,104,243,140,174, 27, 5, 96,162, 68, 34,137,241, +241,241,201, 23,139,197, 49, 0, 38,161,241, 43, 87,219,226, 81,156,180, 69, 0,218, 91,115,162, 87,216,136,189,158, 97, 35,238, +122,134,141, 72,112, 15, 31,222,198, 51,108, 68,130,103,216,136,187, 94, 97, 35,246,254, 5,253,245, 89, 94,223,103, 85,158, 28, +138, 66,142,133,229, 89, 69, 1,185, 20,133,188,127, 72,249,255,132,118, 33,225,198, 81,163, 71,219,219,134, 99, 27,108,176,225, +127, 30,190,190,190,175,248,248,248,156,245,241,241, 57,227,235,235,251,138, 5,167, 12,168,229, 38,193, 82, 20,216, 6, 6,253, +250,142,107,200, 92, 89,243,220, 21, 22, 86,173, 38,103, 19,138, 2, 75, 42, 65, 81,224,188,188,188,214,250,248,248, 44,121,242, +229,229,229,181,150,162,192,213, 56,150,173, 33,240,172, 53,171, 54, 25, 59,118,236,190,210,210,210,104,147,201, 20,157,158,158, + 30,221,167, 79,159, 61, 79, 88, 34,234,228,180,179,179,123,163, 75,215,110, 55, 47, 92,186,150,158,118, 63, 75,158,148,250, 32, +235,216,201,115,215,195,219,181,255,221,206,206,238, 13, 43,174, 17, 5, 96,162, 64, 32,136,113,112,112,200, 19, 8, 4, 49, 0, + 38,243,249,252,163, 75,151, 46,205, 74, 76, 76, 44,188,124,249,114,217,133, 11, 23,242,223,123,239,189,251, 20, 69, 29,171, 69, +176, 15,176,192, 2, 51, 47, 59, 59,251,164, 66,161, 56,101,111,111,255,181, 5,199, 87,115,122,134,141,184,171, 84,155,137, 82, +109, 38,158, 97, 35, 72,141,237,187, 86,182,121, 67,215,232, 79,125, 65, 34,145, 4, 52, 32,232,255, 74, 19,253,159,202, 3,192, +187,242,187, 8, 0,223, 87,190,170,150,179,123,219, 73, 36,207,170,127, 62,139,246,180,113,218, 56,109,156, 54,206,255, 42, 58, + 85,190,251,224,145,191, 86,245,189,219,218, 85,135, 31,166,167,167, 59, 0, 64, 80, 80,208, 7, 0, 14, 88, 35, 36, 40, 10, 51, + 57,142,240, 0,128,199,163, 62,239,219,183, 95, 39,123,123,251,199,162, 32,235,245,122,113, 76,204,249,254, 28, 71,168,202,227, +102, 18,130, 53, 0, 10, 45,253, 13,147,201,200, 19, 10,197,224,241,168,105,225,225,237,154, 23, 21, 21,197,241,120,188, 29,249, +249,249,165, 86,155,113, 40, 10,155, 55,111, 14,242,241,241,249, 83,180,102,133, 66, 33, 30, 49,226, 69,171,248,222, 6, 36, 70, +137,164,171,136,162,124, 88,134,113, 1, 0,129, 64, 80,122, 93, 44,142,248,102,241, 98, 41, 69, 81, 92,113,113, 49,244,122, 61, + 62,253,244, 83,251,164,164,164,151,138,138,138,214, 53, 64, 27,212,190, 67,167, 79, 79,157, 58, 25,162, 41, 41, 53,108,254,110, +227, 77,189, 64,164,107, 17, 26, 44, 90,191,105,155,235,132,119,198,124,148,146,146,120, 27,181,167, 35,169, 9, 30,128, 67,159, +124,242, 73, 88, 84, 84,148,184,188,188,220, 78,175,215, 55,223,177, 99,199,220,136,136, 8,135,142, 29, 59,138,119,239,222, 77, +169,213,106, 16, 66,164,193,193,193,100,244,232,209,134, 61,123,246, 76, 1,176,182, 30,225, 59,243, 81, 91,242, 86,183,109,219, +118, 62, 0,164,167,167,139,106,180,177, 48, 36, 36, 68, 6, 0,169,169,169, 95, 17,194,125, 2, 0,132, 96, 57,128,217,181,152, +214,210,195,122,140, 2, 40,180, 78,188,180,207, 46,172,231, 40, 3, 8,238, 83, 64,122,229, 3,193, 66,160, 70, 92,168,199,145, + 44,151,203, 27,149,155, 48, 50, 50,138,162, 40,106,255,205,155, 55, 15, 40,149,202, 22, 28,199,142,175,175,156,117, 93, 43, 79, + 79,207, 83, 44,203, 26, 75, 74, 74,170, 3,101,122,182,127,185,155,187,163,172,191,170,180, 60,174, 56,233,200, 5, 11,251, 38, +229,238,238,254,118, 81, 81,209, 18, 0,239, 39, 39, 39,119, 2,128,144,144, 16, 17,128, 27, 78, 78, 78,221,205, 38, 19,101, 27, +255,108,176,193, 6, 27,254, 22,161,117, 11, 64, 36,254, 72,193,179,169, 49, 66, 75, 12, 0,113,113,113, 0, 32,105, 68, 65,168, +154, 2,102,234,212,169,240,241,241,121, 82,188, 32, 54, 54,230,105, 42,251,216,111, 44, 90,180,200,161,172,172,108,192, 79, 63, +253,212,139, 16,178, 66, 46,151, 95,109,224,252, 66, 66,176,156,199,163, 62,167, 40, 10, 18,137, 93,218,164, 73,147,110, 85,126, +215,252,216,177, 99,210,225,195,135,235, 0,100, 1,128, 68, 98,231,199,231,243,130, 8, 33, 85, 55,220, 58, 5,225,171, 64, 32, + 35, 22,247,155,248,253,247,204,115,195,135, 11,100,158,158, 20, 0,100,165,164,184, 47,255,246,219,238,165,153,153, 98,189,187, +123,113,177, 86,171, 79, 75, 75,131, 68, 34,161,248,124,254,115, 13, 85, 88, 38,147,125,188,248,155,101, 50, 77, 73,153,222,160, + 41, 55,241, 25,218,232,104, 47,101, 11, 11,148,197, 14,246, 50,221,231, 95, 46, 16,127, 56,126,220,199, 90,173,246,131, 6,168, +166, 76,155, 54, 45,164, 75,151, 46,126,123,247,238,165,212,106, 53, 4, 2,129, 67,199,142, 29, 17, 17, 17,193,158, 63,127,158, +106,209,162, 5,194,195,195,113,233,210, 37, 92,185,114,133,234,212,169,147,244,224,193,131, 99,105,154, 94,219,144,184,230,243, +121,159, 6, 7, 7,119,148,201,100,166,160,160, 32,140, 31, 63, 30,132, 16, 12, 24, 48, 32,220,193,193,225,128, 86,171, 21,167, +166,166,244,106, 72,100, 43, 19,143,140,174,178,108, 1,104, 7,130,251,170,196, 35, 53,167, 31, 67, 82, 83, 83,159, 47, 45, 45, +197,163,235, 66,170, 19,152,247,234,213,203,154,190, 84, 72, 8,150, 15, 31, 30,245, 57, 64, 81, 3, 6, 12, 40,155, 50,101, 10, + 47, 37, 37,229,205,151, 95,126, 41, 60, 61,253, 62,172,124, 24, 8, 26, 52,104,208,165, 19, 39, 78,184, 7, 5, 5,169, 74, 74, + 74,170,191,240,118,119, 25,124,225,224,234,143,191, 94,179, 35,120, 59,161,202, 84,201,135,239, 53,208, 55,169,183,223,126,167, +208,193,193, 97,228,254,253,251, 83, 21, 10,133, 64, 36,170,214,174,124, 47, 47, 47,207,160,160,160,201,110,110,110, 74, 62,143, +231, 69, 64, 72, 67,253,243,255, 27,233,105, 41,194, 54, 65,193,180,109,188,182,193, 6, 27,254,133, 56, 94, 41,174,142, 63,249, +133, 0, 0,162,163,163,171, 35,211, 70, 69, 69,213,249, 4, 76, 8, 41,188,115,231,142,191, 78,167, 3, 33,196,146, 1,187,230, + 18,205, 66,138,226,173,231,241,168, 15, 40,138, 66,120,120,187, 7,171, 87,175,174, 45,167,151, 41, 60,188,221, 3, 62,159,215, +146, 16, 2,138,226,253, 72, 8, 87, 88, 7,103,173, 55, 34,177, 88, 50, 19, 0,188,189,125, 50,127,251,237, 55,211,171,175,190, +138,111,191,253, 86, 52,107,214,172, 25, 2,129, 96, 74, 78, 78, 78, 65, 61,229, 4,128,217,158,158, 94,210,205,155, 55, 7, 77, +154, 52,233,150, 66,161,152, 13, 0, 62, 62, 62, 75, 0,132, 2,200,170,177, 15, 27, 54,236,201, 31, 63,126,124,154, 82,169,156, + 93, 23,231, 72,160,149,127,112,112,191,133,113,113,132,103, 52, 82, 69, 23, 47,106, 84,133,133,116,134, 74, 37,221,122,227, 70, +212,220, 37, 75,132,254, 1, 1,136, 61,122,212,163, 72,167, 83,169,141, 70, 67, 97, 97, 33, 97, 24,230,138, 5,117, 15,243,242, +244,146,110, 92,245,227,117, 71, 33,159,243,106,234, 71, 9,221,220, 4, 60,169,147,152, 47,224, 25, 91, 54,111, 35, 6, 16,214, +208, 53, 18,137, 68, 99, 7, 13, 26, 36,221,179,103, 15, 21, 30, 30, 14, 23, 23, 23, 92,188,120, 17,183,111,223, 70,105,105, 41, +143,166,105,116,238,220, 25,203,150, 45, 67, 64, 64, 0,202,202,202,144,147,147,227, 33, 22,139, 61,105,154,174,171, 61, 31,235, + 79, 51,103,206,132,143,143, 15, 24,134, 65, 73, 73, 9, 24,134,129,131,131, 3, 0, 32, 47, 47, 15, 71,143, 30,177,164, 47, 53, + 8, 66, 8, 94,120,225,133,114,138,162,146,159,180,104, 89,195,233,231,231,183, 91,165, 42, 26,218,175, 95, 63,148,150,150,210, + 11, 22, 44, 64,251,246,237, 17, 20, 20,212, 96, 57,125,125,125, 39, 50, 12, 51, 15, 0,204,102,243, 86, 59, 59,187,119,127,253, +245, 87,247,154, 41, 66,170, 44, 89,133,202,226,210, 43,215, 19, 83,167, 77,124,181, 79,220,213,132, 92,179,112, 68,142,250,238, + 17,117, 45,229,156, 45, 18,137,127,106,214,172,217,170,169, 83,167,250,184,185,185,193,104, 52,206, 45, 40, 40,192,228,201,147, + 1, 0,195,134, 13,107, 47, 20, 10,127,123,239,189,247,208,162, 69,139,252,146,146,146,156,155, 55,111,142,215,233,116, 9,141, +109, 79, 11,241, 84,156,117,136,172,127, 92, 57,109,156, 54, 78, 27,231, 95,195,105,169, 22,249,135, 66,129,199,195, 57,108,122, + 76,104, 69, 69, 69, 81,209,209,209,196,130,138, 21, 55,109,218,212,223,222,222, 30, 0,138,173, 45, 5,199,113, 83,220,221,221, +149,179,103,207,238, 17, 20, 20,100,154, 50,101, 74, 66, 86, 86,214,156,154,199, 52,111,222,252,235, 31,126,248, 1,105,105,105, + 89, 75,150, 44,185, 84, 92, 92,108,109, 30,179, 89,132, 96,117,165,117,172,232,232,209,163,237,227,226,226, 62,248,238,187,239, + 60, 63,252,240, 67,209,199, 31,127, 60, 6,192,183, 13,145,240,249,124, 93,109,211,133,181,193,199,199,199,196,231,243,235, 12, + 18, 23, 5,216,219,137,197,125, 23,198,197, 17, 83, 86,150,238,231,149, 43, 29, 55,254,254,251,124,154,144, 38, 94, 94, 94,232, +217,189,123,133, 29,159, 95,164, 44, 40,224,188, 90,181,226, 63,252,237, 55, 15,189, 88, 44,223,179,103,143,186,184,184,248,112, +131, 38, 60,138,210,112,132,152, 28,154, 6,208,175,190, 52, 48,252,250,181,219, 41,142, 94, 30,188, 78, 29,195,219,167,164,101, +221, 4,199,153, 41,138,106, 48, 88,160,179,179,115, 80,113,113, 49, 52, 26, 13, 60, 61, 61,177,122,245,106,120,123,123, 67,167, +211, 33, 49, 49,145, 52,109,218,148,138,139,139, 67,211,166, 77,161, 82,169, 96, 50,153, 80, 94, 94,174, 52, 26,141,117,229,102, + 44,228,241,248,191,240,120,212, 59, 20, 69,161,101,203,192,236,117,235,214,153, 56,142, 67, 72, 72, 8, 94,126,249,101, 28, 60, +120, 16,137,137,137, 85,150, 39, 83,179,102,205,179,121, 60,170, 89,165, 86,106,180, 5,166, 42,181,143, 92, 46, 31,217,200, 63, + 13,207,215,215,119, 76,235,214,173, 63,120,227,141, 55,104,177, 88, 12,173, 86, 91,213, 22,244,208,161,195,202,134, 15,143,114, + 62,126,252,120,157,229, 52,155,205,243,242,243,243,125,244,122, 61,134, 12, 25,242,241,138, 21, 43,100, 98,177, 24, 0,192,178, +236, 99,150,172,197,223,109, 63,245,201,188,117, 49,167,118, 47,243, 93, 60,235,221, 62, 99,166,124, 29, 3,224,100,109, 5, 51, +153, 76,153,106,181,250,253,105,211,166,237,216,176, 97,131,235,156, 57,115,192,113, 28, 8, 33, 96, 24,166, 58,145, 56,199,113, + 56,116,232, 16, 50, 50, 50,190,126, 66,100,217, 96,131, 13, 54,252,227, 96,133, 22,249, 39,194, 7,143,166, 13,241,164,216,250, +219, 35,195,243,249,252,141,167, 79,159,238,216,171, 87, 47, 65,255,254,253,195, 79,158, 60, 25,158,159,159,159, 80,105, 61, 8, +239,223,191,127,184,151,151, 23,214,172, 89,163,227,243,249, 27, 27,249, 51,213, 55,189,130,130,130, 91, 0, 86, 28, 60,120,112, +249,196,137, 19,225,237,237, 29,170, 80, 40,254,214, 58, 59, 73, 36,157,222, 91,189,154, 17,210, 52,239,251, 21, 43,156, 86,198, +196, 44,223,187,111,159,224,133, 23, 94,160, 8, 33,184,119,247,174,253,178,181,107,165,175,191,244, 82, 86,106,102, 38,115,228, +212, 41,186, 48, 63,191, 36, 95,165,154, 7,160,164, 33,126,154,166,227,211,211,211,125,123,246,126,193,239,194,239, 9,183, 95, +125,105, 88, 63,161,128, 71,221,207,202,187,225,227,237,225, 28, 27,115, 86, 79,211,116,124, 67, 60, 90,173,246, 33,195, 48,110, +132, 16,207,216,216, 88,120,122,122,162,180,180, 20, 52, 77,195,100, 50,153,116, 58,157, 93,113,113, 49, 12, 6, 3,140, 70, 35, +156,156,156,112,239,222,189, 66,134, 97,206,215,197,201,178,236,123, 18,137,100,145, 80, 40, 20,139, 68, 34,249,141, 27, 55,160, +209,104,154,187,184,184,124,203, 48, 12,228,114, 57,226,226,226, 62,115,114,114,202, 2, 0, 59, 59, 59,136,197, 18,119,163,209, +200, 0,200,111,108,155, 19, 66, 26,125,189,188,189,189, 3,236,237,237, 23,126,254,249,204,144, 14, 29, 58, 66,165, 82,129,227, + 56,200,100, 50,232,116, 58, 56, 57, 57,161, 91,183,110, 15, 23, 46, 92,168, 32, 4, 19,234, 17,131,252,202,235,131,137, 19, 39, +202,156,156,156,144,155,155,139,224,224,224,106,161,165, 80, 21,223,187,124, 61, 33,101,218,164, 81,189,119, 30,141, 73, 62, 21, +123, 35,249,165, 33,221, 59, 80, 20,105, 94, 95, 25,149, 74,165, 74, 32, 16, 76,153, 56,113,226,162,160,160,160,150,132, 16,180, +105,211, 6,131, 6, 13,194,111,191,253,134,180,180, 52,104,181, 90,246,234,213,171,187, 20, 10,197, 49,219, 16,110,131, 13, 54, +216,240,151,226, 79,190, 89,143, 89,180,254, 78, 40,149, 74, 85, 74, 74,202,201,155, 55,111, 70,141, 30, 61, 26,177,177,177,111, + 3,152, 6, 0, 18,137,228,237,209,163, 71,227,230,205,155, 72, 73, 73, 57,169, 84, 42, 85,207,226, 55,197, 98,177,193,100,122, +100,156,178,179,179,179,179,242,244,230,149, 83,134, 0,208,188,158,125,117,155, 70, 4, 2,159,118, 67,134, 8, 74,111,223,214, +108,190,118,109,209,142, 29, 59, 4, 61,122,244,160,104,179, 25, 44,199, 33, 48, 48,144,234, 63, 96,128,236,151, 29, 59,220, 88, +173, 54,110,241,231,159, 95,220,244,222,123, 21,233,149,126, 96, 13,193,104, 52,174,253, 96,242,251, 3, 98, 98, 47,250,133, 6, +183,114, 59,121, 58,230,150,187,187,179, 52,168,117,107, 89,113,105, 9, 59,103,214,103, 2,163,209,248,125, 67, 60,122,189,254, +208,217,179,103, 95,242,247,247,247, 76, 72, 72,128,201,100, 2,203,178,232,223,191, 63, 8, 33, 18, 0,156, 64, 32, 64, 74, 74, + 10,204,102,179, 50, 61, 61, 93,126,255,254,125, 9,128,165, 13,148, 47,219,104, 52, 34, 57,249,209,172, 93,211,166, 77, 7, 70, + 70, 70,130, 97, 24, 12, 25, 50, 4, 71,142, 28, 25,152,156,156,188,178,166,230,123,218,107, 94,105, 33, 11,241,245,245, 61, 88, +185,203, 34, 39,120, 63, 63,191,240,192,192,192, 13, 75,151, 46, 21, 53,109,218, 20,132, 16,184,186,186, 64,167,211,161,168,168, + 24,161,161,161,240,247,247,199,210,165, 75, 1, 96, 87,125, 22, 55,142,227,160, 80, 40,240,240,225, 67,100,102,102,194,223,223, + 31, 20, 69,161,188,188, 28, 12,243, 40, 39,183,180, 92,115,252,135, 95,142,245,221,183, 97, 94, 88,215,118,109, 2,174,221, 74, + 82,142, 29, 57, 80,218,166, 69, 64,144, 42, 97, 1, 15, 88, 80,103,210,101,185, 92,126, 95, 46,151,143, 86, 42,149,162,178,178, +178,136,129, 3, 7,174, 25, 48, 96, 0,110,221,186,133,139, 23, 47,190, 46,145, 72,148,102,179,153,241,246,246,158, 64, 81,148, +147,217,108,222, 89, 92, 92,172,176,141,135, 54,216, 96,131, 13,207, 28, 85, 62, 90,168,241,110,157, 69, 43, 36, 36, 68,150,149, +149,245, 86,243,230,205,197, 0, 96,111,111, 31, 26, 24, 24, 56, 35, 51, 51,179,220,218,210,232,116,186,189, 59,118,236, 24,180, +106,213, 42,209,176, 97,195, 90, 29, 60,120,176, 11, 0, 12, 27, 54,172,149,163,163, 35,118,236,216, 97,214,233,116,207, 44, 38, + 18, 77,211,189, 58,119,238,140,146,146, 18,100,101,101, 89, 53,133,114,236,216, 49, 41, 30,249,101,213,187,175, 62, 48, 38,147, +171,139,159, 31, 47, 63, 38,198, 92,162,209,248,244,234,221,155,162,205,102,240,120, 60, 20, 23, 23, 35, 39, 39, 7,206, 46, 46, + 84, 74,122,186,195,150,153, 51, 79,183,209,185, 0, 0, 32, 0, 73, 68, 65, 84,143, 53,239,208, 65,204,154, 76,238, 86, 20, 83, + 91,164, 44,124,231,163, 41, 31, 30,218,185,115,151,103,153, 70,147, 97,111, 47, 53, 74, 36, 34,239,169, 31,125,196,150,148,148, +140, 3, 80, 97, 1,207,210,157, 59,119, 14, 25, 50,100,200,221,128,128, 0, 47,149, 74,229, 93, 86, 86,198,150,148,148,240,241, +200,215,138, 2,128,152,152, 24,104, 52, 26,134,101,217, 56, 60,138,133,101,178,180,160,205,154, 53,115,142,136,136,232,227,233, +233, 9,181, 90, 13,119,119,119,116,236,216,177, 15,159,207,255, 41, 59, 59, 91,253, 44,123,253,153, 51,103, 28, 9, 33,207, 19, + 66, 48,100,200, 16,139,206, 97, 89,246,221,200,200, 72, 17, 69, 81,208,235,117,176,179,179,135, 76,230, 0, 71, 71, 39, 4, 5, +181,133, 92, 46,199,224,193,131, 77, 25, 25, 25,235, 21, 10,197,222, 6,184, 32,151,203,161, 82,169,144,147,147,131,162,162, 34, + 0, 64, 81, 81, 81,181,115,254,179,128, 90,173, 30,209,173, 91,183,233,147, 39, 79, 6,195, 48, 24, 49, 98, 4,114,115,115, 87, + 62,124,248,112,143,175,175,239,152,119,223,125,215,211,221,221, 29,211,167, 79,183, 7,240,149,109, 60,180,193, 6, 27,108,120, +230,120,210, 71,235,207, 22,173,250,230, 68,189,189,189,123, 82, 20, 53, 87,175,215,139,171,166,100, 40,138, 18,123,122,122, 30, +209,235,245, 75, 20, 10,133, 85, 78,113,101,101,101,154, 7, 15, 30, 28,137,143,143, 31, 53,114,228, 72,156, 57,115,102, 28, 0, +140, 28, 57, 18,241,241,241,120,240,224,193,145,178,178,178,103,146,128,212,207,207,111,104,239,222,189, 71,118,238,220, 25,209, +209,209, 96, 89,246,138, 53,231,215, 92, 97,136, 90, 86, 29, 86,237,179,136,140,207, 7, 69, 81,213,214,140, 34,149, 10,105,169, +169, 40, 41, 45,133,209, 96,128, 86,167, 99,131, 90,180,208,171, 77, 38, 33, 5, 88, 59,247,149,125,243,250,213, 28,157, 86,235, +229,238,234,166,151, 74, 37, 40,211,168, 69, 55,174, 95,173, 0,144, 97, 33,135,137, 16,210,251,183,223,126,155,199,231,243, 71, + 59, 56, 56,224,131, 15, 62,224,247,233,211, 7, 34,145, 8, 70,163, 17,101,101,101,216,177, 99,135,138,101,217,150,149,231, 56, + 72,165,210,109,124, 62, 63,175,188,188,124,110,131, 63, 96, 50, 13,139,138,138, 18,152, 76, 38, 44, 94,188, 24,243,231,207,199, +144, 33, 67, 4,215,175, 95, 31, 6, 96,231,179,234,241, 28,199, 97,224,192,129, 53,157,225,147, 45, 57, 79, 40, 20,134,183,110, +221, 26, 42,149, 10, 42,149, 10,158,158,158,240,245,245,133,183,183, 55, 86,174, 92, 73,214,172, 89,115,210,108, 54,175, 47, 42, + 42, 42,180,164, 12,153,153,153,213,150, 65,131,193, 0,173, 86,139,220,220,220,234,169, 67,189,204,105,200,148,119,134,119,208, +234,245,186,107,247,210,115,230,126, 60,230, 5,173, 94,175, 75,127,152,147, 6,172,229, 44,232,223, 19,198,141, 27, 55, 97,212, +168, 81,168,168,168, 64,124,124, 60,186,119,239,142,229,203,151,251,196,197,197, 77,235,220,185, 51,132, 66, 33, 98, 99, 99,193, + 48, 76,174,109, 44,180,193, 6, 27,254,201,248,151,250,103,213,139,122, 45, 90,254,254,254, 46, 44,203,126, 22, 25, 25, 57,240, +165,151, 94,194,224,193,131, 31,251,126,231,206,157,142, 7, 14, 28, 88,178,118,237,218, 33,102,179,121,169, 53, 83,125, 28,199, + 29,218,185,115,231,176, 23, 94,120, 65,218,183,111,223, 64, 0,144, 72, 36,166,157, 59,119,234, 56,142, 59,212,136,186, 84, 5, + 98, 44, 4, 0, 95, 95,223,246, 2,129, 96,228,208,161, 67,219,191,243,206, 59, 72, 76, 76,196,142, 29, 59,238, 7, 5, 5, 93, + 42, 44,180,202,191, 58,171,129, 85,135, 75, 26,178,110,241,197,226,226,178,130, 2, 23,135,128, 0,161,171,163,163, 34, 58, 58, +218,127,192,128, 1, 84,110,110, 46, 74, 75, 75, 97, 48, 24,112,253,250,117, 78, 0,100, 11, 92, 93,169,236,248,120,138, 47, 22, + 23,131,182,110,165,187,191,143,107,155, 47,103, 77,106,110, 48, 26,194,212,106, 53, 35, 16, 10,133, 77,189, 93,114, 83, 51,172, +154,137, 51, 74,165,210, 8, 0, 2,142,227,116,110,110,110,210,211,167, 79, 67, 44, 22,131,162, 40,180,107,215, 14,118,118,118, + 34, 66, 72, 14, 0, 56, 58, 58,138, 55,110,220,232, 60,102,204,152,139, 13, 17,119,234,212, 73, 40,145, 72, 94, 12, 10, 10, 66, +124,124, 60, 18, 18, 18,178,227,227,227,155,117,234,212, 9, 1, 1, 1, 47,250,248,248,236,187,117,235,214, 51, 89,222,255,104, +197,170,245,206,240, 44,203,114, 20, 69,129,199,227,129,227, 56,168, 84, 42,180,108,217, 18,235,214,173,195,234,213,171, 23, 43, + 20,138,163, 86,112,177, 26,141, 6, 50,153, 12, 9, 9, 9,198,200,200, 72, 9,143,199,195,253,251,247,171,133,150,151,135, 91, +104,247,206,225,193,139,191,219,126, 74, 38,145, 72, 6,247,137, 8, 73, 74,207,206, 35,132,106,112,218, 56, 36, 36, 68,212,178, +101,203,113,163, 70,141, 66,102,102, 38,150, 44, 89, 82,164, 80, 40, 98, 78,157, 58,245,202,228,201,147,249,221,187,119, 71,113, +113, 49,126,249,229, 23,230,198,141, 27, 63, 23, 20, 20,108,183, 13,227, 54,216, 96,131, 13,255, 16,161,229,239,239, 63, 74, 36, + 18, 77,127,237,181,215,248,109,219,182, 69, 97, 97, 33,156,156,156,104,138,162,132, 0,224,226,226, 66,219,219,219, 99,210,164, + 73,232,208,161, 67,207,153, 51,103,118, 23, 8, 4,235,228,114,249, 54, 75,126, 88,169, 84,234,120, 60,222,254, 15, 62,248, 96, +233,237,219,183, 90, 2,192,239,191,255,254, 64, 46,151,207, 82, 42,149, 58, 43,235, 81, 21, 20,147,146, 72,236,174,181,105,211, +230, 97, 68, 68,132,211, 75, 47,189, 4, 79, 79, 79,220,188,121, 19,203,150, 45, 75, 55,153, 76,243, 46, 92,184,192,252,221,141, +204, 24,141, 5, 55, 14, 31,118,236,243,230,155, 78, 83, 35, 35, 87,124,248,193, 7,171,190,252,242, 75, 65,219,182,109, 41,157, + 78,135,107,215,174,145, 3, 7, 14,208,191, 44, 90,180, 26, 50,153, 48,254,192, 1,177,201,100,202,182,210,114,215,187, 71,175, +158,109, 87,172, 90, 11,131,190, 2,215,174, 28, 71,105,169, 10, 27, 55, 29,108,235,231, 71,122,231,231,231, 95,176,148,139,162, +168,160, 51,103,206,120, 17, 66, 32, 22,139,177,112,225, 66,248,250,250,194,201,201, 9,229,229,229,152, 54,109,154,243, 39,159, +124,226, 12, 0,137,137,137,213,225, 25, 26,130, 92, 46,239, 54,105,210, 36, 71,134, 97,112,242,228, 73, 19, 69, 81,115,207,158, + 61,251, 83,187,118,237,196, 61,123,246,116,220,190,125,123,119, 0,177,207, 74,104, 53,242,188,251,167, 79,159,238, 60,122,244, +104, 34, 20, 10,169,178,178, 50,184,184,184, 96,221,186,117, 90,133, 66,113,220, 74,174,133,179,102,205,154, 87,185,189,117,238, +220,185,239, 47, 93,186,212,179,160,160,160,218,170,169, 44, 42, 57,223, 45,242, 35,182,184, 76,109,250,249,187,153,175,218,219, + 73,196,115,151,254, 28, 75,243,113,181,193,126,197, 48, 98,169, 84, 42, 38,132, 96,255,254,253,200,206,206,126,183,184,184,184, +128,101,217,131,159,125,246,217,140,182,109,219,182, 72, 77, 77,205, 46, 47, 47, 95,174, 84, 42, 31,218,134, 59, 27,108,176,193, +134,191, 12, 85, 78,240, 85,171, 15,143,227,209,116, 98,221, 66,139,101,217, 73,167, 78,157,226,115, 28,135, 77,155, 54,225,198, +141, 27, 68, 42,149,206,149, 74,165, 63,216,219,219,179,122,189,126,226,248,241,227,199,204,159, 63,159,215,179,103, 79,196,199, +199,243, 90,182,108, 57, 14, 64, 77,161, 53, 0,245,196,218, 80,171,213,215, 11, 11, 11, 90,214, 8, 80,217, 82, 34,177,187,222, + 64,101,158,228,124, 50, 40,102,215,133, 11, 23,106,125,124,124, 76, 9, 9, 9,216,176, 97, 3,119,227,198,141, 24,177, 88,188, + 81,161, 80, 24, 45,228,124, 22,168,230, 20, 51,204,205, 95,103,204, 8,121,110,196, 8,238,253,233,211, 43, 68,246,246, 31,175, + 88,187,118,102, 89,121,185, 47, 40,138,184, 59, 59,103,111, 90,184,112,201,144, 23, 95,172, 72,188,112,193,238,246,153, 51, 66, + 79,154,190, 99, 77, 57,243,243,243, 47,196,198, 94,196,214,205,171, 96, 54, 27,161,200,127,164,211,138,138,213,104, 64,100,253, +137,147, 97, 24,245, 43,175,188, 34, 2, 96, 63,118,236, 88,177, 82,169, 68,171, 86,173, 0, 0, 26,141, 6,199,143, 31, 71,112, +112, 48, 0,224,222,189,123,213,219, 13,149, 83, 38,147,189,216,189,123,119,100,103,103, 35, 49, 49,241,156, 66,161, 40, 6,112, + 46, 55, 55,119, 88,231,206,157,113,232,208,161,225,245, 8, 45,171,174,145,133, 66,235, 79,156,246,246,246,179, 14, 30, 60,248, +238,149, 43, 87, 70,207,152, 49, 67,216,191,127,127, 0, 64,121,121,185, 14, 0,107, 13,167, 94,175,223, 8,160,122,229,108, 86, + 86,214,175,211,167, 79,143,251,244,211, 79, 61,171,202,167, 74, 58, 26,175, 2,226,195,250,188,251,101,183,206, 97,109,191, 94, +179,227, 84, 78,110,225, 14,117,242, 17,181, 37,117, 39,132,128,166,105,112, 28, 7, 55, 55, 55,109,113,113, 49,148, 74,229, 67, +165, 82,249, 65, 70, 70,134, 85,117,127,150,125,222,198,105,227,180,113,218, 56,255, 71, 97,121,100,120, 66, 8,195,113, 28, 98, + 99, 99,113,240,224, 65,214,108, 54, 79, 80, 40, 20, 53,163, 85,175,189,121,243,230,153, 87, 94,121,101, 91,106,106, 42, 63, 41, + 41, 9,132, 16,214,154,210, 24, 12, 6,154,162,254,188,239,105,107,185,117,235, 86, 20, 20, 20,152,115,115,115,207, 50, 12,115, +232, 41, 87, 47, 62,245,170,195,173,128,241, 13,147,233,236,252, 30, 61, 6,206, 59,115, 70,242,254, 23, 95, 24,223,126,231,157, +207, 88,147,137,230,139, 68,156, 88, 38,227,177, 18,137, 48,241,194, 5,187, 53,147, 39,187,233,141,198,147, 59,172,112, 48,175, +178,104,245,233,211, 19,111,191,255, 41,244, 53, 44, 90,241,215,211, 96, 52,195, 42,139,150,209,104, 12, 83, 40, 20,176,179,179, +203, 1,224,253,214, 91,111,129,227, 56,232,245,122,148,151,151, 67, 46,151,171,223,121,231, 29,182, 82, 60, 9, 70,142, 28,233, +100, 9,111, 96, 96,160,175, 80, 40,196,201,147, 39, 33, 20, 10,143, 3,128, 80, 40, 60,126,230,204,153, 97,175,191,254, 58,252, +252,252, 2, 51, 51, 51, 41, 52,224,159,230, 21, 54, 98, 47, 1,218,128, 66,235, 71, 38, 56,180,246, 12, 27,113,151, 2,210, 43, +163,198, 39,119,234,212, 9,176,208, 47,171, 38, 42, 23,119,172,166,105,122,223,204,153, 51, 63,232,218,181,235,160,249,243,231, + 83,168, 12,213,240,148, 72,203,207,207,239, 53,123,246,236, 83,132,144,199, 68,191,178,168,228,252, 11, 81, 83, 72, 89,153,250, +182, 42,249,232, 61,171, 44,166, 12,243, 84,225, 44,108,176,193, 6, 27,108,120,102, 86,173, 63,161, 78,161, 69, 81,212,166,222, +189,123, 79, 0,192,167, 40,106,131, 92, 46,255,211,224,175, 80, 40,210,124,125,125,191,109,209,162,197, 68, 0,132,162,168, 77, + 86, 22,170,144, 16, 44,227,241,168,153,143,196, 93,163, 2, 84, 86,165, 37,153, 9,128,226,241,248,219,110,221,186,245, 69, 78, + 78,142,202, 66, 11, 68,189,120, 22,171, 14, 1, 96, 23,240,240,181,236,236, 83,211,195,195, 7, 12,153, 60, 25,237,135, 12,113, +242,109,214,140,213,155,205,220,189, 75,151,168, 43,251,247,139,110,159, 57, 35,212, 27,141, 39, 15, 1, 57,214,150, 51, 63, 63, +255,194,249,152, 11,167, 95, 29, 57,108, 80, 96, 11,223, 71,162,225,161, 28, 69, 37,234,211,214,136,172, 39, 68,239,136,117,235, +214, 29, 21,137, 68,130,154,169,108,204,102,115,137,209,104, 12, 3,128,210,210, 82,223, 77,155, 54,237,230,241,120,217, 13,241, + 37, 37, 37, 29,153, 55,111,222,200,172,172,172,211,185,185,185, 89, 0,144,147,147,147, 69,211,244, 54,133, 66, 49, 50, 59, 59, +251, 0, 44, 88, 4, 64,128, 54,137,151,246,181, 3,128,176, 30,163,144,120,105,159, 29,128,118, 97, 61, 70, 1, 0, 26,155,203, +176, 38, 42,195, 32,204,141,143,143,223, 57,104,208,160,241,120,138,152, 94, 79,138, 45,179,217,220,236,201,157, 85,150, 45,107, +136, 76, 38, 19,173,215,235, 25,150,101, 5,102,179,153,152, 76, 38, 91,250, 26, 27, 26,130, 45,247,165, 13,255, 90, 16, 66, 58, + 3,240,172, 26, 54, 43,223, 61,159,216, 54,161, 50, 93, 96,213, 80, 89,249, 89, 69, 81,212,245, 26, 28,213,251, 45, 56, 23, 0, +138, 0,220,165, 40,170, 46, 35,200,166,186, 62,215, 41,180,228,114,249, 1, 88,144, 52,218,210,227,234,193,236,202, 60,113, 64, +227,243,176, 85,115,176, 44, 91,152,147,147,243,212, 23,148,199,227, 61, 28, 62,124,184, 85,199, 55,116,204, 30, 32,251, 35,163, +113,123,244,247,223,119, 60,185, 97,131, 31,203, 48,238, 20, 64,248, 98,113,177,201,100,202,242,164,233, 59,214, 90,178, 30,179, +198, 60,200, 31,156,249, 32, 31,173, 91,183, 38,247,239,223,127, 22,131,234, 29,173, 86,235,223, 80, 23,208,233,116, 61, 45, 20, +131,187,242,243,243,119,213, 34,216,119, 43, 20,138,221, 86,220, 41,210, 43, 69, 21,143,163,184, 87,195,122,140,218, 15,128,171, + 74, 42,253, 44, 81, 80, 80,144,138,202, 56,111,255, 52,100,103,103, 27, 41,138,250,117,217,178,101, 99,111,223,190,189, 71, 46, +151, 27,109, 67,177, 13, 54,216,240, 95, 22, 89, 20, 69, 69, 87,126,142,170, 52, 10, 69, 63,185, 93,117, 76,213,113, 53,143,169, +226,120,114,127,125,231, 2,192,172, 89,179,190, 88,178,100,137, 20,128,165,201,152, 27,157, 84,250,175, 66,225, 63,132,163,166, + 40,216,252, 87, 84,244,123,192, 4,134,185, 10,166,134, 79, 62,253,108, 13, 17,247,239,223,255, 79, 63,181, 86, 37,149,174,129, +240,255,213,193, 39, 43, 43,107, 93, 64, 64,192, 70,185, 92,206,192, 6, 27, 44,184, 95,217,154,192,134,127, 41, 60,107, 19, 70, +117,136,178,168,250,190,127,236,193,189,150,227,106,251, 76, 81, 84,244,146, 37, 75,162,172, 40,111,181, 69,139,103,187,118, 54, +216,240,239,198,255,199, 74, 90, 27,108,176,193,134,255,196,147,199, 19, 86,172, 42,241,245,228,231, 89,179,102,125,129,250,103, +156,124,240,200,138,229, 83,249,185,218, 95,139,194,163,149, 3,181,193,154,213, 4, 3, 26, 81,191,179, 54, 78, 27,167,141,211, +198,105,227,180,113,218, 56,255,231, 56, 27,226, 62, 91,139, 32,138,172,107,170,175,190,105,196, 39,183, 27, 58,183,161, 99, 41, +138,170, 43,204, 79,213, 84,225,147,239,127, 57, 6,216, 56,109,156, 54, 78, 27,167,141,211,198,105,227,180,113, 62, 13, 8, 33, +157, 9, 33,145,120, 52,253, 77, 8, 33,145,132,144, 33,179,102,205,154, 93,181,111,214,172, 89,179, 9, 33,253,171,142,171, 60, +166,250,156,170,125, 79,190, 63,185,175,190, 99,235, 41,226,132, 39,182,171, 63,255, 83,124,180,108,176,193, 6, 27,108,176,193, + 6, 27,106, 69,213,138,193, 26,214, 38, 21,128,123, 75,150, 44, 41,173,225, 59,165, 2,112, 7, 64,135,202,227, 84,149, 34,173, +166,111,149,169,242,179,169,150, 99, 76,150, 28, 91, 7, 54,213,177,109, 19, 90,117,161,131, 55,111, 81, 64, 83,175,136,202, 11, + 0, 82,153, 4,152,171,140, 87, 68,170, 2, 23,113, 28, 8, 33,144, 43,203,110,222, 83,226,203,198,254, 94,144, 47,220,188,236, +236, 86,115,132,244,168,220,117, 65, 93,108,252, 52, 81,131, 50, 75, 57,130,155, 32,196,142,135,207, 56,130,246, 0,192,163,112, +215,192,225,219,148, 66,235,227, 73,213,214,207,195, 60, 49, 65,108, 47,125,205,217,197,181,117,105,105, 81,186,217, 96,220,151, +164,194, 70, 52,194,193, 54,208, 21,207,115, 4, 95, 0,224, 9,121, 88,153, 94, 98,241, 74, 14, 27,108,176,193,134,167,181,142, + 60, 85, 92, 60,138,162,216, 90, 56,169,167,228,180, 45, 84,176, 64,108,213,178,251,247, 90,246, 93,255, 39,149,219, 42,161, 21, +234,137,201,160,176, 0, 0, 1,193, 87, 73, 42,252,104,213,249, 62, 24, 96,199,231,111, 1,192, 55,152,217,233,132, 67, 92,173, +141,201, 67, 47, 59, 17,127, 37, 0,206,192,178,239, 37, 41, 44,247, 23, 11,243,195, 16, 1,199,251,149, 35, 68,200,114,100, 27, + 8,162, 29, 68,184,124, 53, 31, 6,107,202, 26,208,212, 43,226,240,239,138, 65, 49, 63, 78, 69,215,246,173, 64, 88, 6,224,104, + 72,123,126,134,115,223,189,133,174, 33, 1, 32, 28, 13,112, 12, 28,134,174,192,208,112,103,114, 79,217,184, 60,216, 65,190,112, +107,230,225,149,176,121,243, 22,111,223,192, 80,138, 99,204, 72,253,253,244,152, 79,102,206,235, 23, 6,117,184, 37, 98,171,189, + 15,222, 15,104,222,246,179, 79, 23,172,226,251,248,250,203, 56,218,200, 20, 60, 76,238,180,118,249,188, 3, 34, 94,246,202,187, + 10,108,177,180, 47,135,122, 98,162, 64, 34, 30,101,111, 39,107,173,211,149,223,103,205,244, 62,158, 80, 48,228,219, 21,171, 59, +246, 25, 56,204,129, 45, 47,224,209, 28, 66,247,238,217,221,236,251,117,235,135, 37, 40,216, 23, 1,112,214,212,153, 35,152,153, +182,125,194, 48,161,128, 79,133,188,187,153, 15, 48,141, 18, 90, 33, 94,120,131, 34,104, 48,188, 4,161,112, 49, 89,137, 93,141, +249,141, 96, 47,252, 68, 17, 4,129,194,126,138, 96,119,146, 10, 74,219,144,103,131, 13,255, 45,240,120,188, 24,142,227,250, 62, + 99, 97,240, 60, 33,228,170,173,117,255,183, 97,157, 69,139,194,226,196,140, 92, 87,176,102,132, 5, 5, 46, 2,172, 19, 90,118, +124,254,182,235,233,133,222, 96,204,216,252,245, 7,123, 76, 52,192,208,102,176, 12, 13,150,161,193, 48,102,176, 52, 13, 66, 27, + 49,239,231, 24,192, 84,142,136,240, 54,219, 0,214,199,210,223, 16, 18,222,175, 55, 47,157,118,163, 76,106,236,250,113,201, 71, +185,170,138,143,206,222,149, 23,133,122,233,103, 39, 41,241,139, 53,130, 32,102,195, 84,236, 56,116, 60,111,205, 79,218, 20,142, + 16,184, 57,217,183, 29, 19,149,232,191,253, 72, 76,238,234,109,134, 20, 0,112,150,137,219,142,187,155, 30,240, 52, 23,193,203, +206,110,245,198,245,223,123,251,184,219, 83,204,149,165, 96, 88, 22,254,205, 34,249,179,167,140,241, 89,252,221,150,239,160, 49, +190, 93,223,249,109,189, 16,218,188, 69,200,244,109,199,175, 4,104, 53, 74,211,233,157, 95,100,192, 8,218,219, 47, 68,184,104, +201, 42,254,156,207,167, 78, 51,177,121,215, 82,149, 72,106,104,172, 9,241,194,145, 37, 75, 87,180,239, 55, 52,202,129,171, 80, +241, 13,218,138,160,205, 63,111, 89, 16,220,190,139,180,103,120, 83,145,114,223, 36, 74, 95, 94, 2, 51,207, 78,210, 47,108,128, +147,126,236,235,244,230,173, 59,166, 36, 41,177,214,154, 58,179,228,143,190,199,113,141,143,186, 78, 17,244,188,125, 53,102, 34, + 43,191, 14,194,210, 0,107,174,126, 7, 75,131,112,143,222,187, 78,250, 25, 64,227,132, 22,143, 96,208,217, 75,215,125, 10, 11, + 20,157,191, 91,241,205,108,114,253,250,111, 96,241,107,114, 9, 46, 88, 43, 48, 1, 4,181,116,231,159,162, 89, 24,115,203,216, +160,170,157,253,130, 36,221,124, 28,168,254, 57,106, 42,238, 98,134,254,130,109,104,178,193,134,255, 23,139, 9, 67, 8, 17, 60, + 99,206, 97,132,144, 19, 79, 73,243, 25,128,247, 43,183,183, 0,248,246, 25, 20,173, 41, 0,239,202,237, 2, 0,121,182, 30,240, + 84,120,210,249,189,209,113,180,236, 64, 56, 96,255, 75, 0, 96,111,109, 41, 8, 96, 7,138, 15,208, 90,140, 24, 58, 16, 30, 94, +222, 0,173, 3,204, 58,128,214, 3,180, 22,160,245, 40, 82,100, 3,102, 45,144,249, 27, 24, 66, 36, 86, 87,215,168, 6,210,246, +161,127,167, 0,120, 58,219, 97,234,136, 80,143, 77, 39,211,182,108, 57,157, 58, 32, 73,137,215, 44, 42, 43, 33,232,218,174, 53, +214,108,209,166, 28,187,165, 26, 12, 0,195, 58,184,159,236, 26,218,204,127,245, 54, 67,202,137,123,165, 67, 0, 96, 72,152,211, +111, 93,218,250, 4,112, 79, 17,158,134, 35,164,167,111,243,214, 20,123,123, 35, 56, 77, 30, 52, 26, 61,242, 30,110,135,171,223, +115, 60,150, 67,239,134,206,183,231, 99,214,199,115,150, 9,117,154, 66, 19,103, 86,177,158,252, 82,190, 64,204, 81,200,191, 96, +172,224,202,216, 79, 39,188,197, 76,255,242,235, 89, 0,198,212,199, 19,234,133, 41, 43, 87,174,110,215, 61, 34,216,171,224,192, + 84,170,162,180, 16, 12, 95, 42, 25,241, 66,119,184,180, 9,229, 10, 99, 87, 82,226,192, 1,112,113, 15, 68,254,149,157,200,186, +122,144,234,209,105,164,228,151, 93,162,177,128,185, 86,161,213,218, 3, 61, 6,247,234,178, 39, 48,192,215,135, 16, 14, 28, 71, + 64, 56, 22, 21, 6, 26,179,247,102,130,101, 89,188, 50,184, 71,127,153,152, 34, 28,199,129, 16, 14,185, 5,197,186,243,215, 82, +250,103,150,226,154, 37,150,170, 14,207,247,237,113,247,230,213, 96, 58,237, 24, 34,198, 44, 73,161,128, 75, 53,250, 92,143, 91, +167,126, 9, 6,126,110,188,150,163,192,102,157, 92,138,128, 94, 19,248, 27,119,157,244, 84,171,242,199, 29,216,190,254,213, 31, + 55,110,220,145,162,196, 36,107, 68,214, 39,189,196,151,190, 59,175,113,127, 33, 80,166,202,173, 97,167,108,233,202, 27,188,225, + 68,210,199,241, 11,187, 6,207, 57, 78,202,226, 50, 12,247,108,227,150, 13, 54,252,189, 32,132, 60,115,177,149,157,157, 45,127, + 26,177,229,231,231,215, 43, 63, 63,127,121,149,183, 10, 69, 81,203,155, 55,111, 62,239,143, 7,213,199,158,245,212, 44,203,142, +201,207,207,143,171,143, 51, 50, 50,210,247,248,241,227, 45,106,112,182, 0,208,162,182, 99, 93, 92, 92,216,110,221,186,101, 29, + 63,126, 92,110,235, 33,141, 18, 92, 86, 11,173,148,156,125, 83, 59, 25, 21, 21, 0,144, 98,193,241,143, 77,249, 25,104,118,233, +214, 5,111, 45, 13,107,238,134,114,173, 9,167,111,100,129,101,105,176, 12, 83,105,217, 98,192, 50, 52, 6,119,240, 64, 55,195, + 36,172,141, 78, 5,195,114, 75,234,227,124, 18,102,194,189,209,113,192,232,189, 28, 71,196, 18, 33, 79, 29,228,239,238, 53,253, +149, 14,188,169, 35,194,160, 55, 51,163,119,198,102,156, 79, 86, 98,179, 69,156,220,159,195, 19,145,218,246,177, 76,131,117,175, +199, 26,213,117, 64,159,158, 78,196,168, 6, 93,148,137,114, 29,141,204, 98, 26, 5,134, 50, 72, 40,133, 69,156, 28, 65,251,166, +126, 62,210,203,123, 62,127,232,206,215, 8,188,248,140, 72,204, 99,192,114,132, 79,202,146,140,110,193, 3,133, 85,126, 91,245, +149,211, 94,234,248, 86,175, 65,145,206, 57, 59, 39, 80,246, 65,131,225,213,201, 31, 15,227,182, 66,121, 35, 26,197,242, 44,202, +201, 80,134, 38,238,173, 48,116,204,107,248,246,181,206, 40,215,148,131,175,200,112, 22, 11, 37, 46,128,185, 86, 78,194, 98,204, +202,101, 95,251, 8,248,188, 71,237, 89,245, 98,105,232,141, 70,128,101, 96, 39,224, 64,145,170,239,104,176,180, 89,218,126,228, +231, 31, 0,236,181,134,234,158,172,196,174, 80, 79,244, 4, 71, 7, 19, 90, 15, 10,184,148,164,250, 67,252,132,120,225,141,231, + 6,191,211,147, 80,184,216,152,107, 20,238,142,168,136, 22, 14, 50,153, 38, 5,121,251, 63, 66, 6,236, 72,147,238,239,227,141, +119,167, 72, 55,109,218, 52, 28, 32,147,241,184,143, 90, 53,103,112, 19,254, 68,154,197, 60, 0,208,211,100,171,163,152,122,119, +229,238,120,119,240,255,200,240, 80,101,201,202, 40,230, 74,205, 49,115, 83,159,159, 30,221,167,221,237, 62,185, 20, 37,201,185, +112,223,168,182,166, 47, 89, 9, 27,167,141,243, 47,231,116,114,114,106,217,188,121,243,121, 52, 77,247, 18,137, 68, 77,204,102, + 51, 56,142, 43, 16,139,197, 23,179,178,178, 22,106, 52,154, 7,255,180,186,223,189,123,215, 26,177,213, 32,167, 80, 40, 68,106, +106,234,125, 43,196,214,217, 39,206,255,245,210,165, 75,216,187,119, 47, 0, 32, 45, 45, 13,109,218,180,145,213,118,226,195,135, + 15,101,125,250,244,249, 21,128,127,125,156,247,238,221,107,121,236,216, 49,236,223,191, 31, 0,144,154,154,138,160,160,160, 90, + 11,115,233,210, 37,254,155,111,190,217, 18,128,252,111,184, 70,255, 5,145, 85,243,253, 15,161, 21, 29, 29, 77,162,162,162,168, + 39,183,107, 65,102,128,171,184, 19, 12, 44, 0,100, 90, 91,130,228, 66, 44, 91,179,253,212,144,115,251,215,245,178, 19,241, 48, +127,243,244, 92, 85, 73,249,243, 2,234,209,244, 11, 67,192,115,117, 16,199, 47, 25,215, 33,160,180,194,128,163,191,231,199, 37, + 41,173, 51,145, 38, 41,112, 6,224, 92, 30,125, 98, 97,208, 43,131,198,125,123,102,247,238, 89, 67,218,127, 58,162, 61,142, 92, +201,250, 20, 96, 26,140,250, 78, 56, 14,132, 99,170,157,223, 43, 31, 29, 0,238,241, 4,190, 28,200,163,125,156,117, 22,173,222, +128,160,212, 11, 67, 29,165,226, 31, 38, 78, 28,239, 68,171,210, 81, 98, 18, 33,183,212,128, 2,189, 16, 21, 2, 47,228,167,220, + 99,121, 20,206, 52,104,114,161,160, 33,140,193,197, 85,236,192, 11, 31,248,129,159,230,228, 23,165, 98,138,225, 59,189,188,216, +165,232,220,170, 44, 70,171,210, 82, 20, 26, 12, 63,239,236,236,210,198, 80,156,197, 87,151, 22,193,197, 59, 12, 67, 70, 71,225, +171,200, 80,148,107,180, 80,149,196,147,214, 62, 78, 84,246,197, 29,152, 51, 52, 4,197,133, 10, 24,105,128,210, 26, 75, 12, 38, + 67, 69,157,237,200,195,198, 79,102,204,124,163,153,143,167,172,106, 81, 1,225, 88,116, 8, 9,196,192, 94, 93,113,230,210,101, + 92,191,151, 6,174,114, 81, 1,225, 56,228, 41, 75, 11, 13,102,118,171, 85, 13,202, 50, 32,180,161, 86, 33,134, 70, 76, 25,134, +123, 65,202, 2, 95,118,110,233,248,222,172,168,102,142, 50, 9, 5, 3,205,194, 96,162, 81,126,249, 7,184, 55,111, 7,169,157, + 29,213, 9,122,193, 45,212,222,182, 6, 26,243, 30, 40,202,124, 80, 81,128, 55, 7,134,125,188,109,201,135, 50,202,238, 81,215, +164,217,199, 45, 89,151, 23,116, 62,245,230,162,195, 49,123,247,189,238,251,237,103,111,245, 25, 60,109,107, 12,128,147,182,113, +203,134,127, 35, 94,125,245, 85,187,194,194,194, 88,127,127,255,208,129, 3, 7, 74,123,246,236, 9,173, 86,139,211,167, 79, 67, +171,213, 54,243,247,247,111,118,250,244,233,145, 57, 57, 57, 73, 77,155, 54,237,179,127,255,126,139,125,104, 43, 5, 16,191,122, + 8, 6, 24,138,162, 80,185,143,170,220,215,232, 60,183, 98,177, 24,217,217,217,207,220,178,149,159,159,127,191, 49,150,173,138, +138, 10,145,159,159, 31, 60, 61, 61,193,178, 44,180, 90, 45, 14, 31, 62, 12,181, 90, 13,142,227, 96,111,111,143,197, 43, 55, 35, +229, 86, 44,174, 93,187, 6,181, 90, 45,106,136, 51, 47, 47,143,234,208,161, 3,140, 70, 35, 24,134,129,193, 96,192,217,179,103, +171, 63, 11, 4, 2,204, 92,244, 29,210,110,196,226,246,237,219,200,203,203,251, 91,178,141, 88,161, 69,254,137,168, 51,102,214, +223,190,234,144,101,153,217,155,182,237,142,159, 61,233, 53, 76,121,125,128,255,194,117, 7, 7, 36, 23, 97, 27, 0,132,120, 96, +220,216,190,173, 3, 92,164, 66,124,181,243, 6, 64,200,236,167,253,189,196, 18,164,133, 54,225, 62, 61,116, 45, 59,246,139,215, + 58, 33,208,199,169, 77,169,184, 68,156,153,105, 65, 78, 65,142,129,171,131,164,237,176, 14,238, 39,193,113,112,113,148, 4,131, +101,224,226, 32,105, 59, 36,204,233, 55, 0,112,146, 10,131,107,179,124,213,133, 8,127,225, 4,169, 68, 48, 65,230,232, 18,240, +246,240,129,246,195,134,143,180,119, 16, 50, 40,190,118, 26, 26, 97, 83,208,110,205, 96,164, 75,144,247, 32,131, 61,119, 53, 57, +191,168,220, 56,189,193, 98, 18,196,229, 63, 72,245,108,217,126,160,107, 81,244, 28,101,203,119,118,182,224,129,227,149,239,120, +185, 80,230,213,197,254,247,204, 7, 21, 28,169,213,162,243, 24, 52,106,117, 22,205,194, 71,207, 10, 28, 51, 98,126,193,172,161, +237, 80, 90,162,132,193,204, 64,173,103,204,222, 46,118, 18,227,131, 4, 24,205, 12, 76, 52, 7,161,139, 31, 78,199,223, 43,226, +104,250,183,186, 56, 51,139,113, 59,243,240,109,135,154,251, 2, 61,208,225,115, 39,251,219,160,245,200,206,147, 99,219,241,248, + 78,153,197,184,253, 52,215,153,112,204,163,233,231, 26,150, 44,138,160,103, 99,156,224,131,189,208, 69,100, 39,250,126,249,167, +111,134,190, 16,228, 38,225,242,226, 65,113,102,200, 88, 1,244, 98, 22,206,254,129,224, 76,229, 68,103, 48,148, 37, 2,245, 93, +124, 62, 0, 16,179, 22,223,190, 21, 38,163, 92, 3,193,102,158,132,160,227, 4,208,149,214,254,140, 98,238,158, 57,102,110, 74, +183, 25,199,122, 47, 58,211, 55, 89,126,124,126,178,223,171, 63,116, 0,182, 54,183,221,174,109,248, 55,162,109,219,182,222,249, +249,249,137, 51,102,204,112,123,249,229,151,113,232,208, 33,104, 52, 26,108,221,186, 21,171, 87,175,198,130, 5, 11, 64,211, 52, + 54,109,218, 36, 61,112,224, 64,151,245,235,215,231, 5, 4, 4,132,229,228,228, 20, 52, 32,176, 40, 0, 18, 0,194,202,123, 23, + 5,128, 59,113,226, 4,134, 13, 27,134, 19, 39, 78,112,149,251, 88, 60,122,248,105, 84,238, 79,177, 88, 12,177, 88, 12,181, 90, +253, 76,196,150, 80, 40,132,131,131, 3,196, 98, 49,202,203,203,173, 22, 91, 12,195,240,243,242,242,160, 86,171, 49,112,248,112, +124,183,100, 9,250,246,237,139,129, 3, 7,130, 16,130,179,103,207, 98, 64,247,112,188,246, 98, 31, 36, 39, 39,131, 97, 24,139, +202, 91, 80, 80,128,194,194, 66, 12, 25, 62, 28,155,215,175, 71,215,174, 93,209,182,109, 91, 48, 12,131,216,216, 88,188, 58,184, + 59,236, 94, 26,128,180,180, 52, 91,167,182,220,154,245, 76,124,180,158, 26,137, 42, 92,229,142, 92,136,126,125,112,151,168,225, + 61, 66,177,121,207,185,175,225,169,217, 13, 0,238, 70,201,226,183,250, 6, 34, 41,167, 20,231,110,203,163,147,139,240, 76, 86, +107,112, 44, 60,220,157,164, 0, 95, 12,189,153, 99,156, 50, 27,118, 96,230, 8,129,180,215,231, 24, 59, 60,201,191,107,168,191, +127,213,170, 67,135, 97,171, 48,238,222,253,128,206,109,189, 3,192,210, 0, 75,195,233,181,157,192, 34, 89,131,229,232,222, 66, +124,230,147,169, 83,187, 13,125,105,180,189, 88,234, 12, 86,147, 11,186,224, 30,138,211,227,160,149,182, 65, 65,118, 38,246,158, +186,166, 78,207, 43,214,240,120, 56, 93,168, 54,126,150, 89,138,138,134,120, 13, 52,150,204,155, 51, 61,114,239,238, 61,142,146, +192, 30, 84,198, 15,195,212, 98, 1, 35,241,108,241, 28, 79,103,231, 65,190,217,186,199, 73,107,194,210,134,120,116, 90,205,193, +179,167, 79,190,214,186,101, 15,199,135,215,143, 67,111, 48,194, 72, 3, 97, 93,250,128,101,137,152,226, 81,156, 19,159, 79, 41, +139, 75, 65,209,108,225,197, 59, 15, 21,151,238,100,242,141,142, 88, 90,111,116,145, 39,213, 61,197,255,120,120,159,142, 0,173, +199,139,189,218,225,187, 29,231, 62, 2,216,119,158,238, 34, 63,178,104, 17,160, 71,168, 39, 54, 16,130, 30, 55, 14,175, 14,142, +120,233, 19, 88, 99,209, 10,243,192,208,144,150,190,191,124,183,248,115, 55,247,166,109,248, 20, 71,131,120,183, 7, 52,121,132, +202,139,135,179, 95, 87,176,190,221,177,105,237,138, 10,142, 35,187, 81, 79,104, 11,150, 3,184,156, 11, 96, 83, 14, 33, 51, 51, + 19, 30,205,110, 0, 20, 15,164,249, 67,152,153, 71,167, 25,205,228,248,154,173,199,250,126,214,111, 73,216,240, 96, 65, 64,252, +157, 12,229,232,119,125,165,207, 7,240,131,146, 20, 50, 94,145, 86,203,217,198, 47, 27,254, 77, 48, 24, 12, 7,151, 45, 91,230, + 22, 21, 21, 85,101,145, 65,124,124, 60,182,108,217, 2,153,236,241,113,114,216,176, 97, 32,132,184,205,159, 63,255, 32,128, 23, +234,226,236,214,173,219,240,219,183,111,203, 59,118,236,152, 89, 41,182, 68, 0,120, 9, 9, 9,188,220,220, 92,202,213,213,149, +248,250,250,210,114,185,156, 3,192,190,251,238,187,252,125,251,246,181,214,106,181, 23, 26, 43,180,196, 98,241, 51,241,217, 18, + 10,133,160, 40, 10, 98,177, 24, 34,145, 8,132, 16,171,196, 22,203,178,130, 19, 39, 78,224,198,141, 27, 88,208,177, 35, 62,245, +243,131,155,155, 27, 98, 99, 99, 65, 8,129, 76, 38, 67, 73, 73, 9,118,239,222,141,126,253,250,129, 97, 24,145, 37,188,251,247, +239,199,205,155, 55,177, 40, 34, 2,159, 58, 59,195,193,193, 1,103,207, 62,154, 13,148, 72, 36,200,206,206,198,217,179,103,209, +167, 79, 31, 91,167,126, 74, 88,220,121,122, 3,130, 18, 10,222,102,147, 30,132, 33, 0, 5,223,144, 16,136,146,147, 31,119,206, +177, 4, 60, 30,230,172,221, 22, 29,185,234,147,225,212,132, 17,157,124, 23,254, 18, 51, 25, 0,222,123, 37,200, 79, 42, 17, 96, +205,145, 36,194,227, 97,206,179,168, 96, 72, 8, 68, 84, 49, 38, 15,236,218, 22,242, 50, 19, 50,228,101,231,147, 1,139,178, 56, +159, 91, 53, 22,219,143,198,230,174,222,110, 72, 33,132,192,197, 65,210,118,220,221,140,128, 95, 78,220,204, 89,185,215,144, 66, + 56, 2, 23,169, 48,248,157,228,238, 13,174, 58,140,240, 23, 78,152, 54,125,122,247, 17,239,204,176, 99, 82,246,193,148,113, 10, +156, 89, 15,141, 89,132, 50,190, 55,242,114,114,240,205,166,232, 92,141,214,244, 90,162,202, 58,129,153, 94,140, 10, 1,165,121, +249,155,175,190, 56,179,100,241,124, 7,125,102,108, 5,159, 98,244,252,230,189, 5,139, 23,172,162,202,141,166,209,153,165, 40, +111,136,199,232,136,165,203, 86,174,141, 28, 63,102,100, 74, 80,155,222,238,172,252,129,187, 65,163, 81,238, 60,121,211,187,242, + 73,145, 2,128,140,188, 98,168,212, 90,134,101,232, 11,142, 66, 44, 76,178,196, 58, 88,137,150, 94,240,140,234, 17,246,166,167, +163, 8,250,138, 50,120, 57, 10, 49,184,107,171, 55,233,223,211, 62,127,160,180, 70,174, 61, 41,180,104, 16, 90,143,171, 75,251, + 5, 19,150, 14, 6, 75,195,124,247, 87,235, 45, 99, 20, 62,157,210,203,193,201,213,244,144, 7,173, 12,176,247, 0,229,212, 12, +112,110, 65, 9, 67, 70, 67,158,153,200,124,244,230,152,226, 7, 89,121, 63,121,216,215, 63,173, 77,115, 4, 92, 86, 44, 42, 10, + 51,144, 32, 55, 35, 76,249,104,182,221,169,240, 22, 88, 91,196, 28, 27,254,163,200,206,206,126,107,246,236,217,151,186,118,237, +218,196,195,195, 3,237,218,181,195,209,163, 71, 49, 99,198,140,234, 99, 58,118,236, 8, 66, 8, 74, 74, 74,176,108,217,178, 2, +185, 92,254, 86,189, 15,232,137,137, 41,219,183,111,239, 21, 26, 26,106, 22,137, 68,101, 0, 36,101,101,101,118, 37, 37, 37,148, +193, 96, 0,199,113,156,179,179, 51, 43,151,203,233,215, 94,123,205,120,229,202,149, 86, 90,173, 54,251,105, 44, 90,254,254,254, + 9,197,197,197,106,138,162,158, 58,244, 67,149,200,242,240,240,240,172,168,168,224, 0,148, 54, 38,244, 3,195, 48,136,136,136, +192,169,184, 91, 56,113,238, 10, 52,242, 84, 76, 30,255, 22,218,181,107,135, 83,167, 78, 53,250,154,117,232,208, 1, 39,207, 94, +194,165, 27,119,144,157,118, 23, 31, 77, 30,143,176,176, 48,156, 60,105,243, 94,176, 2,199,241,184,111,214,241, 39,133, 86,159, +232,232,232,170,161,255, 79,242, 53,216, 3, 29,132, 46,226, 95,231, 15,109, 21, 34, 28, 56, 31,148,208, 30,251,218,156,236, 62, +231,155, 31, 82,248, 94,217, 99, 18,148, 13,175, 14,123,236, 79,163, 68, 34,185,150,178,235, 78,114,240,155, 47,118,245,199,230, +163,210, 47, 1, 96,116,207,150,248, 61, 93,133,107,105,202, 93, 73, 42, 36, 62,109,173,195,189, 32,101,139,176,107,217,199, 35, +250, 52,107,234,141, 45,135, 46,129,162,112,208,162, 27, 46, 33,164,107,104, 51,172,222,254,228, 10, 67,239,128,149,123, 13, 41, +167, 19,203,135, 2,192,192, 96,233,111,157, 91,185, 6,144,154,142, 91,181,192, 94, 44,152, 56,116,228, 88, 59, 38,237, 40,144, +117, 22, 20, 99,132,222,204, 65, 81, 84, 14,157,179, 63, 98,227,239,232,213, 6,211, 39, 73,170,198, 89,241,146,139,144, 41,186, +126, 39,167, 66,171,247,145,122,182, 50,240,121, 28, 87, 97, 36,248, 61, 41, 75,147, 84,128, 84, 75, 56, 50, 51, 97,122,222,143, +233,185, 97,219,222,121, 66,145,120, 52,159, 2,229,229, 34,243,220,176,106, 17, 28, 29, 29,192,153, 42, 0,173, 10, 47,127,248, +141, 42, 65, 78,183, 4,128, 54,238,112,232,217, 82,184, 77,192,163,242, 98, 50,204,115, 27,250, 13,138,198,164, 49,131, 59, 10, + 57,147, 22, 31, 47,219,131,141,159,143,192,216,254, 33,194,227,151,211, 38, 1, 88,216,216,107, 77, 88, 6,132,214,227,133, 47, +226, 82, 40,224, 18, 1,122,220,216,187, 56, 24,184,101, 49, 71, 39, 64,200, 10, 91,182,255,223, 0, 0, 32, 0, 73, 68, 65, 84, +168,144,246, 1, 50, 17,151,119, 25, 92,222,101,194,247,239, 14, 42,160, 23, 69,121, 71,144,239,151, 47,208,110,222,188,229, 52, +199,195, 87, 22,132,202, 0,203, 1, 69,105,151, 96, 50,153, 64,179,128,193, 96,128, 86,171,133, 44,227,100,181,143,150, 72, 72, + 13,153,250,246,240, 14,164, 66,174, 59,150,194,228,108, 25, 31,252, 2,169,144,235,174,230,176,105, 69, 90,163,205,154,101,195, +191, 17,153,114,185,124,200,176, 97,195,206,157, 58,117,202, 45, 60, 60, 28, 0,112,227,198,141, 71, 15,157, 17, 17, 8, 10, 10, + 66, 97, 97, 33, 94,127,253,245, 34,133, 66, 49, 4, 13,248,252,150,151,151, 63,216,191,127,127, 19,173, 86,219,113,238,220,185, +202,102,205,154,105, 12, 6, 3, 85, 86, 86,198, 49, 12, 3, 87, 87, 87,113,199,142, 29,209,173, 91,183,138,248,248,248,230,185, +185,185,229, 0,178, 26, 83,248, 17, 35, 70, 32, 46,238,209,162,189,103, 17, 87, 75, 36, 18, 33, 60, 60,220, 47, 51, 51, 51,191, +242,222, 98,245, 24, 95,243,246,114,231,206, 29, 92,184,149, 7,129, 73, 15,177, 74,142,171,135,246, 99,248,196, 15,192, 48,141, +207, 45,127,231,206, 29, 28, 62,123, 21, 50,137, 0,169,169,137,216,191,127, 63, 38, 79,158,252, 84,156,141, 68,189, 90,228, 31, + 14, 5,234,240,211, 18, 0, 64, 84, 84,212,133, 42,107, 69, 77, 4, 6, 66, 44,169,192,252,129,157,252,102,142,238,209,138, 79, +107,228,224, 88, 14,124, 33,224,229,225,132, 95,127,221,213,114,215,158, 61,241,235,215,173, 95,203, 49,204,156, 4, 37,116, 86, + 20,106,254,170, 61,151, 70,255, 58,189,143, 96,242,208, 96, 55, 0, 16, 9,120, 88,115, 52,145, 1, 48,255,105,106,251,188, 31, +236, 42,104, 76,240,114,119,254,114,246,251,145,110,125, 34,130,112,225, 90, 2,214,238,143,143, 19, 43,177,221,226,206,205,209, +120, 82, 63,213,182,234, 16, 92,195,126,151, 44, 75,188, 69, 50, 87,152,179, 98, 0,179, 1, 6,163, 25,185,197, 44,114, 75, 12, + 16, 72, 69,184,145,150,167,119, 47, 64,244, 83, 84,155,146, 73,237,124,231,125,189,178,169, 65, 95,193,104, 74,139, 24,145,248, +170, 80,106, 47, 81, 88,227,170,112, 53, 31,134, 94, 45,132,207, 1, 28, 95,108, 71,116, 95, 76,123, 91,150,159,116, 10,173,121, +114, 80,132,192, 62, 36, 18,142,246,124, 81,143,230,194, 28, 0,144,201,164,226,101, 95,205,112,254,228,243,175, 26,244, 1, 11, + 1, 68, 65,129,222,159,132, 55,115, 69,220,205, 20,196,221,203, 78,140,187,145, 26,214,183,157, 47,130,154,186, 76, 21,151,150, + 45, 77,134,245, 22,210, 71, 23,134, 1,104, 67,245,170,195, 16, 47,188,209,121,244,220,186, 86, 27,214,138, 22, 0,151,198, 18, + 80,124, 62, 64,241, 30,173,128,204,189, 12,129, 75, 32,217,181,247,176,110,203,150,237,139,146,139, 44, 95,156, 65,179, 96, 53, + 26, 13,100, 50, 25, 78,166, 49,198,177,131, 69, 18, 30,143,135,220,180, 91,127, 56,195,187,241, 66, 69,125, 23, 7, 95, 94,208, +249,148,163,152,146,248, 70,126, 21,194,220,219,158,215,216,155,132, 13, 54,252, 19,160, 86,171,239, 38, 39, 39, 15,110,223,190, +253,214,143, 63,254,216,113,204,152, 49,190,227,199,143,231, 1, 64, 97, 97, 33,183,122,245,106,249,247,223,127,175, 46, 42, 42, +122,135,166,105, 75, 66,153, 16,133, 66,113,229,167,159,126, 82, 93,188,120, 49,172, 75,151, 46,146,231,158,123,142,115,117,117, + 21, 72, 36, 18,214,100, 50, 25,210,210,210,216,204,204, 76,159,178,178,178,251, 0, 50,208,136,140, 21,149,214,171,133,124, 62, +127, 30, 33, 36,252, 89,248,104, 73,165, 82, 95, 0,247, 41,138,106,109,237,180,225,159,110,216, 2, 1, 74, 75, 75,161, 43, 72, +132, 93, 94, 58,218,203,120, 8,117,117,128,147,147,211, 83,137, 34,181, 90, 13,104,243,113,233,210, 29,128, 97,224,236,236, 12, +103,103,231,191, 93,104,213,165, 69,254, 37,152, 80,203,190,250,125,180, 66, 61, 49,217,222,132,213, 19, 35, 91,137, 90, 4, 52, +133, 49,239, 6,238,228, 86, 96,206,243, 93,146,248, 18, 71,195,196,183, 70, 68,140,124,181, 57,250,116,235, 76,181,240,113,158, +186,116,213,143, 31,134,162,104, 70,146, 18,107, 44, 41, 81,146, 10, 15, 56, 40,183,196,220,205,155,212, 84,170, 7,199, 17,196, +220, 83,224, 94, 86,233,150, 20, 21, 30, 88, 83,187, 80, 31, 12, 16,128,183,135, 16, 98,231, 44,147,149,135, 6, 53,245, 24,240, + 66, 7,222,144,222, 17, 16,241,129, 75,191,223,193,167,171, 14, 94,229, 56, 18,121,203,194,105,195, 71, 43, 12, 31, 23, 80,143, + 86, 24,210,143,173, 48, 36,132,144, 71,171, 14,235, 55, 62,240,249, 84,129, 46,251,186,183,208,189, 13,244, 25, 49,200, 42,229, +144,173, 44,135, 70,224, 13, 99,126, 62, 64,184,156, 11,245, 59, 86,215, 11, 15, 15, 15,175,150,161, 65,173,126,216,182, 31,102, +157, 26, 15, 98,183,162,162, 84,129,197, 27,142,182,242,243,115,239,157,159,159,127,193,138,193, 38,232, 92,244, 46, 47, 16,128, + 47,148,224,248,250,189, 40,114,183,135,135, 84, 4,238,255,216, 59,239,176, 40,174, 54,138,159, 41,219, 88,150,206,210,139, 72, + 4, 68,177,247, 18, 53,182, 24, 49,246, 22,141, 45, 42, 49, 26, 53, 38,118,163, 49,198,110,196,216, 75,242,217,187,209,136, 73, + 84, 18,177,139, 93, 80, 17, 65, 81,122,239,236,178,101,202,247, 7, 44, 1,165,236,162,105,102,126,207, 51,207,108,153, 61, 59, +253,158,121,239,189,239, 85,103, 96,226,180, 17, 86,189,186,143,176, 2,128,231,143,238,192, 83,174, 54, 74, 87,103,135, 1, 67, +186,248, 89, 67,175,198,174, 95,239, 20,147,192,187,187,207,220,143,237, 82,223, 90, 54,164,131,167,205,226,228,220,129,200,170, + 93, 82, 81, 67, 68,171, 44,194, 87,139,222,134, 71, 0,182, 62,135,216,131, 87,210,205, 7,117,111, 46, 23,211, 4,193, 23, 38, +129, 55,179,199,230, 93,135, 11, 37,122,211, 70, 98,231,128,197,173,151, 61,253,178,228, 60,193,206, 94,203,110,126,116,118, 65, + 27,101,106,106, 42,116,165,117,135, 79,179,185,223, 63,236,222,128, 77,204,227,180,103,150,247, 31, 68,152, 41, 37, 95,172,218, + 29,198, 3, 66, 54,105,129,127, 53,106,181,250,150, 90,173,110,244,197, 23, 95, 12,159, 59,119,238,219,230,230,230,117, 1,160, +168,168,232,169, 94,175,191, 80,122,125,154,210, 59,144, 7, 16, 19, 27, 27,251, 52, 54, 54,214,113,239,222,189,214, 0,100,165, +223, 21, 3,200, 5,144,134, 87,232,113,104, 48, 85, 4, 65,124,249,186,246,131,193, 84, 17, 4, 81,175, 54,191, 39, 73,146, 37, + 8, 2, 4, 65, 64, 42,149,226,226,197,139, 24,220,187, 59, 30,158,202, 69,128,181, 2,173,198, 76,196,193,179,103, 65, 81, 20, + 8,130, 0, 69, 81, 38,149, 35, 52, 77,227,210,165, 75, 24, 57,108, 16,164, 52, 96,101,101,133, 47,190,248, 2, 39, 78,156, 0, + 77, 11,163,244,153,192,182,114,134,203,200, 60, 90, 4, 22,159,221,185, 84, 12, 86,143,147, 59, 87, 35, 36,178, 80,251, 40, 3, +243,252, 50, 16,124, 4, 5, 92,198,183,187,131,206, 94,138, 92, 53,118,104,160,252,157, 46,221,241, 78,231, 46,116,195,150,157, + 22, 0, 21,140, 86, 55, 84,147,107,131,229,240,245,182, 95,163, 38, 30, 12,139, 38,160, 43,192,208, 30, 45,121,150,195,215, 53, +108,204, 75,154, 86,102,138,131,151,174, 94,181,129,174, 16,207,238,252, 46,171, 83,247, 45,128,213, 33, 38,230, 49,214,239,250, +145, 11,187,254,104,143,150,193,167, 79,114, 80,100,172,102, 73, 73,201,192,202, 92,226,247,110, 67,203, 95, 56,240,176,150,139, +235,243, 28, 11,107,185,168,126,247,250,242, 95,120,158,231, 45,204, 68,245,121, 86, 95,163,166, 90,203,108,221,245,195,142, 53, +227,198,141, 51,207, 76, 76, 69,114,126, 36, 10, 37,174,208,203,221, 17,123,231,130, 90,165, 97,140, 41,196,171,220,159,153,153, +153,233,183,194,179,113,112,203, 50,232,181, 26,164, 39,150,120,213,228,204,124, 88,218,187, 94, 77, 74, 74, 50, 90, 83,199,112, +121, 3, 70, 76, 16,155, 89,192,108,228,128, 64, 73,108,150, 6,205, 92, 44, 74,110, 26,133, 25,120, 24,122, 9,157, 75,219,152, + 62, 73, 32,225,217,196,197,168,245,180,144,137, 63,237,213,220, 21, 79,227, 83,112,241,126,210,174,167,217, 72,102,163, 82,118, +197, 38,231, 6,245,109,227,129,181, 39, 30, 76, 1,244,251, 77,217,118,127, 7, 12,231,121,116, 40,105, 12,175, 6, 15,116,240, +119,192,112, 35,123, 26,190,164, 73,139,241,193,154, 95,158,207, 63,124, 35,179,239,204, 15, 58, 90,182,107,247,158, 4,140, 22, + 5,106,141,254, 97, 46,242, 77,209,204, 87,115, 91, 1,108, 53,124,113, 43,145,219,211,113,225,213, 11,251,199,187, 43, 13, 94, +253, 66,172,230, 42,128,171, 99, 91,155, 45, 16,119, 89,226,119,117,113,235,211, 17, 41,220,222, 11,177,101, 57,180,106,188,142, +106,137,160, 41,104,254, 21,154, 44,128, 61,122,189,126, 79,110,110,238,235,212, 76,198,203,121,157, 94,105,219,203, 87, 19,242, + 60, 79,151, 70,179,106,106, 12, 95,173,102,249,106, 66,158,231,127, 46,141,102,213, 20,213,170,160,201,113, 92,114,139, 22, 45, +108,251,244,233, 3,150,101,241,248,241, 99, 60, 79, 72, 64,183,160, 41,176,182,182,198,133,123,247,240,232,209, 35,124,249,229, +151,208,235,245, 56,126,252,120, 98, 77,154, 52, 77,235,222,122,235, 45,113,191,126,253,192, 48, 12,158, 60,121,130,164,164, 36, + 76,159, 62, 29, 86, 86, 86,184,117,235, 86,153,102,102,102, 38,104,154,214, 85, 18,221,250, 51,206,165,127, 59, 47,153,172,234, +141, 22,192,130,213, 35,239,236, 66,172,187, 8,157, 78,143,250, 15, 50, 16,247,224,143,136,212,102, 42,252,222,201,123,145, 81, + 79,111, 93,126, 71,130,244, 8,152,250, 36,241, 56, 11, 41, 22,178,130, 2,232, 10, 44,241,228, 23,196,165, 21, 20, 62,206, 66, +138,201, 79, 12, 28, 75, 64,167, 2, 82,110,226,202,133,243, 8,187,118, 23, 55, 34,162,216, 43,183,162, 15,146, 28,190,126,152, +133,199,181,120, 10,129,162,247, 90,140,142,136,241,104,233,235,232, 1,150, 1,207,233, 97, 53,116, 63,198, 60,104,231,209,210, +219,218,163, 36,146,165,135,205, 71,191, 3,107,100,213,234,221, 76,208,111,147,156, 56, 61,176, 32, 55,171, 77,215, 78,109,205, +173,252,123, 33, 51, 38, 26,143,239, 94, 82,223,138,140,189,114, 51, 65,191,237, 85,142,174,171,171,235,219, 93, 59,249, 97,232, +196, 57,208,169,242,240, 36,236, 7, 20,102,167,226,226, 85, 5,162,242,243,219, 2, 48, 58,162,117, 53,158,105,136,248, 28,180, +175, 35,138,183,128,198,233,195,192, 62,144, 18,197,224, 52,249, 32, 84,153,136, 77,210,230, 13,220,146,192, 2,128, 92, 74,208, +230,124,158,165, 81,145, 71, 79, 59, 31, 57,165,199,238,179,247,193,113, 37,195, 55,113, 28, 54,239,254, 61, 54,232,235,145,205, +208,192,195,166,201,157,164,116, 2, 38,132,252, 9, 30, 29,111, 28,252,170,126,241,111, 11, 0, 78,135, 75, 83,109,235,119, 92, +151,221, 17,181, 28,110, 39, 50, 25, 73, 0,130, 64,171,182, 78, 93,247,235,130, 22,103, 31,116,152,241, 81, 95, 75,240,175,165, +135,110,244,131, 84,246,237,214,203,159,159,230,248,138,245,185, 37,145, 45,127, 62, 57,159,191,115, 33, 86, 35,100,133, 23, 16, + 16, 0, 0, 20, 22, 22, 78, 28, 51,102,204, 86,145, 72,164, 4, 64,112, 28, 7,142,227,232, 85,171, 86,137, 88,150, 37, 73,146, +100, 41,138, 98,126,254,249,103, 61,203,178, 25,197,197,197, 19,107,210,100, 24, 38,118,210,164, 73,111,213,212, 67,241,192,129, + 3, 6,147, 21, 43, 28, 9,163, 76, 86,249,121, 89,148,139,174, 38, 72,251, 85,251,145, 11, 23, 2, 32,192, 99,209,131, 12,196, +189,184, 72, 68, 54,146, 27, 80,186,233, 13, 91,118, 90,104,248,141,169,107, 86,204,178,131, 90, 54,242, 61, 0, 0, 26,158, 29, + 89,155,173,203,215,168,135, 52,109,217,246, 32,199,243, 52,195,243, 59, 72, 14, 71,139, 25, 60, 52,166,167, 93, 85, 36,167,231, +222,234, 21, 96,197, 3, 37, 85,134,101,213,133,165,105, 28,120,158,231,203,170, 11, 87,203,144,153,167,169, 49, 15,212,229, 56, +109,119, 45,115, 99,194,153,203,119, 38,178, 44,239, 68, 81, 68,170, 90,203,108,125, 85,147, 5, 0, 73, 73, 73,231, 67,207, 38, +157,185,215,196,177,135,189,188, 52,202,165, 2, 50, 85, 56,147,148, 81,120,190, 54,154, 57, 69,250,190,115,131, 79,252, 36, 17, + 81, 52,120,190, 36,161, 40,207,163, 88,199,102, 95,141,103, 26, 2, 64, 35, 91,184,124,113,156, 57, 64, 81,196,243,154,244,194, + 31,165,172, 29,186, 60,244,243,251,207,114,118, 60,203, 69, 36, 0, 60,203, 69,228,161, 75,113, 11, 98, 83, 11, 62,143,124,158, +179, 26, 38,182,171,224, 9, 92,108, 57,116,225, 75,159,189,234,254,140, 74,193, 93, 0,253,129,196,238, 67,103,172,159, 65, 16, +120, 93,195, 79, 68,171,117,188,231,139, 31, 26, 34, 91,194,189, 74, 64,224,159,129, 33,170, 69,146,228,226,215,168,249, 51, 65, + 16,239, 1,136, 49,225,103,225,133,133,133,141, 94,243,230,101, 49, 12,147,101,204,130,127, 67,131,248,127, 43,219,254,174, 63, +238, 38,104,254,245,154,245,234,213,227, 77, 48, 44,194,254, 20, 52, 5, 77, 65,243, 63,165,201,243, 60,245, 42, 83, 21,154,196, +171, 76,194, 49,250,215, 51,161,170,247, 66, 75,183, 55,144,152,152, 24, 66,216, 11, 2, 2, 2, 2,149, 67, 16, 4,251, 39,104, + 10,217,241, 4, 12, 6,171, 66,116,139, 20,246,137,128,128,128,128,128,128,128,192,107, 49, 89,229,231, 37, 38, 28, 85,135,255, + 76,233, 77, 80,155, 16, 98,168,160, 41,104, 10,154,130,166,160, 41,104, 10,154,255, 57,205,154,180,133,222,140,127,178, 1, 19, + 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,191,167,249,111,166,202, 54, 90, 66,213,161,128,128,128,128,128,128,128,192,159, +132,208, 24, 94, 64, 64, 64, 64, 64, 64, 64,224,213,168,113, 80,105, 1, 1, 1, 1, 1, 1, 1, 1,129,218, 81,253,160,210, 2, + 2, 2, 2, 2, 2, 2, 2, 2,181,198,244, 65,165, 5, 4, 4, 4, 4, 4, 4, 4, 4,140, 98,155,176, 11, 4, 4, 4, 4, 4, + 4, 4, 4,254, 26, 42,246, 58, 12, 9, 9,225,203,207, 5, 4, 4, 4, 4, 4, 4, 4,254, 74,222, 84, 47, 34, 84, 29, 10, 8, + 8, 8, 8, 8, 8, 8,188, 26, 19, 4,163, 37, 32, 32, 32, 32, 32, 32, 32,240,231, 80,101, 27, 45, 67,194,210,206,165,161,186, +206,194,190, 18, 16, 16, 16, 16, 16, 16,248, 27,120,179,189,136,208, 62, 75, 64, 64, 64, 64, 64, 64, 64,240, 34, 2, 2, 2, 2, + 2, 2, 2, 2, 2,255, 36,132,177, 14, 5, 4, 4, 4, 4, 4, 4, 4,254, 98,195,245,167, 27, 45, 97,100,115, 65, 83,208, 20, + 52, 5, 77, 65, 83,208, 20, 52,255, 75, 38,171,130,217, 18,122, 29, 10, 8, 8, 8, 8, 8, 8, 8,188, 26, 53,246, 58, 20, 16, + 16, 16, 16, 16, 16, 16, 16,168, 29, 19, 0, 4,150,190, 14, 68,185,168,150, 16,209, 18, 16, 16, 16, 16, 16, 16, 16,120, 53,182, + 1,112, 46, 53, 88,167, 0,164, 8, 70, 75, 64, 64, 64, 64, 64, 64, 64,224,245, 80,190, 93, 86,239,114,230, 75, 48, 90, 2, 2, + 2, 2, 2, 2, 2, 2,175, 72,149,109,180, 8, 84,221,115, 32,212,132, 63,168, 77,239,131, 80, 65, 83,208, 20, 52, 5, 77, 65, + 83,208, 20, 52,255,115,154, 53,105,135,226,223,199, 4, 83,204,215,235, 68,232,250, 42,104, 10,154,130,166,160, 41,104, 10,154, +130,230,127,150,215,222,235,176, 25, 96, 38,236,214, 55, 18,199,210, 73, 64, 64, 64, 64, 64, 64,160,122,254,156, 94,135,254,192, + 71, 35, 2,148, 91,244,145, 25,150,145,128,170,186,101,149, 74,229, 86,185, 92, 62, 66,165, 82, 21, 17, 4,193, 25, 62,231,121, + 30, 0,202,143,117,244, 36, 35, 35,163, 99, 77,255, 45,145, 72,130, 29, 29, 29, 63, 42, 44, 44, 84, 17, 4,193, 19, 4, 1,130, + 32, 0,224,165, 57,203,178,137, 89, 89, 89, 45,254,213,135,144,231, 41,123, 71,199,235, 34,138,114, 53,245,167, 44,199,197,165, +167,165,181, 53,225, 39,203, 8, 2, 51, 75,254, 22, 43, 1,204,121,211,174, 8, 30,160,140, 89, 46, 0,176,136, 6,134,178, 36, + 57, 69, 4,108,212,112,220, 22, 0, 32, 0,182,182,255,173, 9,199, 91, 4,143, 38, 4, 1, 43,158, 71, 30, 79,224,174,180, 53, + 98,255,166, 93, 49, 64, 36, 18,245,181,180,180, 84,100,101,101,157, 7,112, 0,192, 48, 59, 59,187, 78,249,249,249,133,122,189, +254, 4,128, 99,181, 17,238,216, 4,179, 36, 98,209,216, 98,157,126,197,229,187,248,161, 83, 51,216, 49, 28,150,203,196,116, 71, +141,150, 89,121,233, 30,118,152, 40, 73,148, 78,134,123,134,201, 99,164, 29, 54,242,184, 3,192,113, 27, 27, 95,169,210,242, 55, +145,132,138,203, 77, 43, 28, 49, 40, 61, 61, 97,240, 43, 28,247,127, 34,246,246,246,163, 73,146,252,134,231,121,176, 44, 59, 47, + 59, 59,123,231,107,146,158, 7,192,186,244,117, 46,128,111, 94, 81,239, 57, 0,143,210,215,241, 0, 60,133,114,189,214,108,254, +241,199, 31,131,186,116,233,130,181,107,215, 98,243,230,205,207, 50, 50, 50,150, 3,216, 5, 64,251, 55,232, 8, 84, 69, 3,224, +189, 85, 61, 91,179,250,255,125,205,149,251,184, 91, 21, 23,243,247, 31,126,248,161,142,231,121,254,209,163, 71,188, 86,171,229, +245,122, 61,207, 48, 12,207, 48, 12,175,215,235,203, 38, 87, 87,215,164, 23,126,254,146, 38, 73,146,235, 6, 14, 28, 88,192,243, + 60,127,243,230, 77, 94,173, 86,243, 26,141,134,215,106,181,124,113,113, 49,175, 86,171, 43, 76,142,142,142,105,213,105, 90, 90, + 90,222,180,177,177, 73,179,177,177, 73,179,181,181, 77,179,181,181, 77,179,179,179, 43,155,236,237,237,203, 38,165, 82,153,166, + 84, 42,211,108,109,109,111,214,180,158,165,244, 4,112,222,136,169,103, 37,191,237, 86,222,104, 57, 59, 59,167,241,181,192,205, +205, 45,193,136,245, 52,224, 72, 16, 96, 13,191, 37, 8,112, 82,169,212,163,252,247,120, 57,210, 85, 99, 72,217,197,197,101,160, +179,179,115,168,179,179,243, 89, 23, 23,151,129, 70,156, 98, 21, 52, 45, 44, 44,110,218,219,219,167, 57, 57, 57,165, 27, 38,103, +103,231, 10,147,139,139, 75,217,228,232,232,152,102, 99, 99, 83,229, 49,226, 1,170,170, 41, 12,160,165,192, 59, 52, 69,133, 56, + 58, 58,230, 71, 68, 68,176, 60,207,243, 36, 73, 38, 25,150, 49,101,219, 95, 52, 89,170, 75,152,151,121, 78, 26, 94, 24,183, 60, + 47,243,156, 52, 92,117, 9,243, 52,225,120,171,182,154, 70, 82,153,230,168, 81,163, 70,221, 77, 75, 75, 75,202,205,205, 77,217, +178,101, 75,180, 76, 38,187,180,101,203,150,232,220,220,220,148,180,180,180,164, 81,163, 70,221, 5, 48,201, 4, 77, 0, 64,219, + 38,104, 51,110,128,179,234,238,241,145,170,119, 90,210,119,218, 7, 32,176,123, 91,113,210,134,217,254,170, 11,219, 59,168,186, + 52, 39, 35, 77,212, 36,104,154,110,231,225,225, 49, 86,169, 84,126, 88, 58,141, 52, 76, 78, 78, 78, 35,157,156,156, 70,218,216, +216, 12,174, 78,243, 48, 64, 25, 51,185,203,100,237, 6,215,245, 80, 61, 95,188,136,143,152, 54,133, 31,235,237,158, 63,200,193, +161,206,223,112,140,254, 84, 77, 7, 7,135,100,189, 94,207,235,116, 58,222,206,206, 46,249, 53,174,231,106,158,231, 87,243, 60, +191, 26,192,234,215,160, 89,118, 63, 51,193, 96, 87,167, 41,163, 73,114,134, 92, 34, 57, 43,165,233,116, 41, 77,167,203, 37,146, +179, 52, 73,126, 14, 64,246, 79, 58, 70,127,130,166, 66,169, 84, 62, 13, 14, 14,230, 85, 42, 21,175, 82,169,248,224,224, 96, 94, +169, 84, 62, 5,160, 48, 65,179,182, 58,111, 82, 4,235,197,233,245, 69,180,252,129, 22,239, 52,169,119,116,234,232,161,224,142, + 4, 19, 53, 60, 49,125,223,182, 69,139,177,187,118,237, 2, 0,140,232,219, 23, 61, 90,181,130,133,194, 28, 18, 73,201,234, 16, + 60, 1,177, 72,140,126,211, 63, 51,230,239, 87,246,235,215,239,131, 35, 71,142, 40, 0, 96,243,230,205, 24, 48, 96, 0,108,109, +109, 33,151,203, 33, 22,139, 33, 18,137, 42,204,107,130,162, 40,183,164,164, 36, 7,153, 76, 86, 22,101,227, 56,174,194,196,243, +188, 33,250, 6,134, 97,224,227,227, 99,236,238,154,157,151,151,247,118, 81, 81, 81,153, 70,101, 83,221,186,117, 1,224,180, 49, +130,223, 44,249, 26, 28, 83, 4,154, 6, 24, 6,208,232, 72,112,124,165,230, 6,147, 38, 77, 42, 91,239,218,208,187,119, 32, 65, + 16,196,145, 91,183,110, 29, 77, 79, 79,247,226, 56,118,124, 45, 35, 93,159, 60,126,252, 88, 1, 0,190,190,190,147, 0, 28, 53, +101, 61,104,154,118,187,119,239,158,131, 84, 42,173, 50,114, 89, 46,130, 9,157, 78,135,102,205,154, 49,166,252,135, 35,224,145, + 77,146,227,155, 54,111, 62, 97, 97,191,126,178,235,215,175,203, 72,146, 4,195, 48, 88,181,106, 21,195,243,188,117, 3,192,242, + 1,144, 95,141,204, 92, 0,163, 75, 11,131, 29, 0, 86, 85,112, 11, 60,154,168,245,210,192, 39,133,253, 90,181,174, 51, 11, 15, +238, 71,180,242, 86, 28,135, 5,173,137, 5,254,218,168,150,165,165,101,223,181,107,215, 42,119,236,216,145,255,232,209, 35,221, +150, 45, 91,148, 19, 39, 78,180,208,233,116, 8, 10, 10,202,240,243,243, 19,175, 93,187, 86,121,236,216,177,119,138,138,138, 54, +153,116,188, 8,124, 61,172,111, 15, 20,235, 73,232,245,140,210, 89,105,177,103,234,168,206, 34,158,215, 98,247,137, 91,208, 51, +220, 15, 38, 70,178,218, 14, 26, 52,200,123,255,254,253,116, 84, 84, 20, 93,191,126,125,112, 28, 7,150,101,161,215,235, 1, 0, + 28,199,161, 94,189,122,175,188, 95,198, 2,190,246,142,182,103,219,190,215,203,204, 89, 38,133,109, 78, 6,198,137,105,139,157, +114,205, 94, 0,237,222,168,200, 46,207,131,166,105, 36, 36, 36,192,193,193,193,140,227,184, 20, 0,139,114,114,114,182,225,205, +165,149,132,166,143,238,254, 97,157, 83,235,118,237, 40, 71,103, 7, 68, 63,142, 7, 77,176,221,238,221,184,213,121,236,199, 51, +166,106, 25,102, 32,128,235,111,218,134, 59,181,155,212,159, 32,169,205, 4,207,225,171, 13, 63, 21, 44, 91, 25, 44, 15, 26, 63, +138,154, 62,125, 58,220,221,221,189,250,247,239,191, 18,192,199, 53,234,180,158,212, 31, 20,185, 25, 60,143,133,235,127, 42, 88, +186, 50, 88,254,113, 45,116,254,229, 84,121,141,188,178,209,242, 7,188, 27,186, 59,156, 89, 54,243, 99, 17,255,203,255, 72, 85, + 86,122,149,203, 42,149,202,173,239,190,251,238,136,157, 59,255,136, 70,183, 13, 8, 64,255,119, 58,192,193,206, 10,114,115, 73, + 73,113,196, 17,184,251, 40,206, 40, 67,224,238,238, 30,116,244,232, 81, 69,121, 51, 33, 22,139,203,166,242, 38,203, 48, 25, 10, +224,234,144,201,100, 8, 13, 13, 5, 77,211,160, 40, 10, 52, 77,151, 77,229,223, 83, 20, 5, 71, 71,147,154, 46, 45,183,178,178, +106, 92, 80, 80, 96,153,155,155, 11, 15, 15,143,124, 0,247,202,125,223, 56, 35, 35,195,210, 20, 65,142, 41,194,244,113,254, 16, +105,175, 65, 43,106, 5, 53,221, 30, 87,110, 60, 68,200,233,243, 72, 74, 78, 69,135, 54, 77,241,225,240, 65, 56,123,246, 44, 88, +214,228,154,142, 52,158,199,202, 62,125, 2,103, 1, 4,209,173, 91,183,220,201,147, 39,147, 81, 81, 81, 31,244,239,223, 47,224, +241,227,152,210,168, 34, 49,147,231,177, 14, 64,154,145,186, 18, 0,184,112,225, 2, 0, 72,107,115,238, 73,165, 82, 92,189,122, + 21,134,106, 98,146, 36, 65,146, 36, 40,138,194,201, 24,123, 20,105, 73,168,210, 34, 49, 37,208, 3,117,235,214, 5, 73,214,220, + 36,177, 51, 32,187, 2,244, 39, 68,162,233,206, 46, 46, 94,157,188,189,229,161,161,161, 20, 0,120,122,122,242, 41, 41, 41,185, + 39, 78,156, 40,160,129,205,158, 60,191,171, 58,147,229,238,238,222, 62, 41, 41,233, 27,195, 62, 39, 8, 98,101,157, 58,117,190, + 44, 59,110, 28,135, 69, 63, 20,137,166, 78,157, 38,110,221,121, 62, 0,160,117,159,253,200,127,178,204,159,200,158,107,245, 87, +223, 37,242,243,243, 15,214,171, 87,143,202,202,202,186, 2,224,185, 94,175,159,189,103,207, 30,135,113,227,198,165,239,221,187, +119, 57, 0,151, 21, 43, 86,116, 46, 42, 42, 58,100,138,110,135,198,120,175,121,227,128, 54, 30,238,238, 56,127,229, 58,196, 18, +145,245,164,209,129, 80, 40,104,172,222,113,138,123,158,152, 61,249,210, 61,236, 50,193,100,181, 26, 52,104,144,215,254,253,251, + 37, 0,112,239,222, 61,164,166,166, 66,169, 84,194,204,204, 12, 34,145, 8, 20, 69, 65, 36, 18,189, 22,147,101,229,110, 23,126, +252,248, 9, 51, 91, 91,107,108,248,108, 42, 62, 76, 79,131,181,133, 2,250,194, 34,175, 55,172,160,240,237,216,177,163,140,101, + 89, 20, 21, 21, 33, 44, 44,204,202,204,204,204,202,205,205,109, 33, 76,232, 61, 37,147,201,210,138,139,139, 29, 74, 95,167, 23, + 23, 23, 59, 2,200,151, 74,165,134,251,116, 97,233,220,216,234,196,231,120,185,154, 48,158, 32,136,242,159,213,150,150,173, 90, + 54, 14, 61,118,100,159, 34,175, 32, 21,214, 54,233, 32,145,135,109,219, 54,194,204,204, 18, 11, 23,206,165,227,186,189,227,218, +243,189,129,161,247, 31, 70,119,123,227,204, 22, 79,108,235,214,103,132,173,153,220,162,180, 44,209, 99,231,246,169, 32, 73, 18, + 95,126,249, 37, 26, 54,108, 56,225,254,253,251,243, 1,100, 87, 47,131,109,141,222, 30, 98, 43,145,149, 28, 98,142,213, 99,203, +129,207, 75,116,230, 76,196,176, 62,117, 39,124, 49,232,233,175, 13,189, 81, 80,250, 96,174, 22,145,136, 39, 90,163,204, 48,132, +132,132,116, 10, 12, 12, 60, 95,213,251,127, 1,206,248, 35,127, 86, 5,243, 69,135,132,132,240,129,129,129, 68,185,141,171,240, +190, 58,154, 0,246, 54, 86,242,208,205,139,166, 42,232,107,167, 40,117,124, 12,146,139, 43, 20,228, 21,186,104,202,229,242, 17, + 59,119,238,172, 16, 82,242,112,116,128, 88, 44,130, 72, 76,192,186, 99, 73,246,250,220,139, 33, 32,136, 42, 77, 86, 5,205,162, +162,162,226, 59,119,238, 40,118,236,216, 1, 7, 7, 7,120,121,121, 65, 46,151, 67, 38,147, 85, 48, 87,229, 13, 87, 37, 70,171, +130,166,225,123,154,166, 65,146, 36,206,158, 61, 11,134, 97, 48,104,208,160,151, 76, 22, 77,211, 85, 25,183,170,186,167,158, 6, +112,143,231,249,183, 75, 11,224,123, 0, 58,149,251,190,167, 82,169,156, 13, 96,185,177,154, 20,197,131, 42,190, 2,206, 45, 24, +116,194, 84,104, 69, 77,112,238,210, 45,236,220,186, 22, 0,224, 85,191, 37, 6,247, 15, 44,139,198, 25,185,158,101,184,186,186, + 30,200,200,200,236,245,206, 59,239, 32, 39, 39, 71,191,104,209, 34, 52,110,220, 24,190,190,190, 70, 29,163, 42,158,156,211,238, +221,187,231,174, 86,171,193,243,188, 49,230,236, 37, 77,130, 32,176,103,207, 30, 20, 23, 23,191,180,176, 77,167,165,248,124,128, + 39,198, 76,217,133,149,143, 14, 97,211,166, 77,213,110,187, 28,104, 92,108, 85,111,157,132, 98, 26, 47,159,251,137,244,195, 15, + 63,164,198,140, 25,131,248,248,120,140, 27, 55,174,248,236,217,179,218,212,148,148, 19, 18,142,219,160,171,104,140,171,212,148, + 74,165,187, 79,159, 62,141, 67,135, 74,124, 73,116,116, 52,124,124,124,204, 43,152,228,236,195, 40,120,190, 1,225, 39,163,208, +186,207,126,132,159, 28, 14, 54,247,148,168,133, 15,242, 76,217,159,181,160, 50,205, 67, 89, 89, 89,101, 38,106,239,222,189,102, +123,247,238,237, 7,224, 39, 0,135, 0, 32, 59, 59,251, 91, 19, 53, 1, 2, 99,134, 12,232, 7, 90,108,129,168,152, 68,116,106, +219, 12,142, 14, 14,184,247, 48, 22,207,147,178,211, 8, 2,163,123,182,147, 44, 87,171,181,243, 47,222,197,247, 53,104, 18,110, +110,110,190,135, 15, 31, 22,151,139, 64,151, 93,227, 20, 69,149,189, 55, 24,239,218,156,159, 6,147,101,225,166, 8,255,122, 99, +123,243,240,136,189,240,241,124, 15, 54,239, 5,226,251, 51,103,240,248,254,131, 98,173,138,233,250, 55, 28,163, 63, 75,211,119, +192,128, 1, 87,246,237,219,103,157,144,144,128, 11, 23, 46,192,203,203, 11, 42,149,202,152, 7,222, 10,154,197,197,197, 14,134, +223, 16, 4,225, 96, 8,188,107,181, 90,195,193, 48, 92,136,214,229,150,179,174, 70,211,163,220,114, 6,115,229,249, 26,182, 93, + 34, 19,139, 15, 31, 63,118, 64,241, 32,234, 2,154, 54,105, 3,133, 85, 3,112,108, 42,178,178, 11,145, 19,147,140, 37, 75, 86, + 98,225,162,121,248,233,199, 35, 10, 63,255, 38, 71,181, 12, 83, 15, 64,241, 27,115,220, 9,126, 66,232,201,189,155, 9,158,131, + 58, 45, 74, 42, 42,122, 42, 31, 49,124, 32, 53,116,232, 80,252,244,211, 79,184,127,255,254,230,106, 76, 86,104,185,200,252,132, +200, 11,135, 54,131,231,161, 78,143,146,138,213, 79,229,163, 62, 24, 76,125, 56,172, 7,174,253,190, 14, 61,154, 62,141,116,113, + 64,255,156, 82,139, 77, 83,200,146,202,112,153, 15,199,181,114,102, 43, 12, 0, 81,206, 96,133,225,143, 54,152,255, 6,122,151, + 26,171, 9, 47, 62,152,208,181, 49, 88, 0,224, 3, 40, 8,137, 56,124,231,194, 79, 92,228,241,247,105, 77,228, 85, 36,107, 56, +126,203, 51,134,107, 6,152,221, 6,212, 47,254, 70,165, 82, 21,197,198,198,154,141,238,223, 31,237, 2, 2,224,108,103,135,122, +110,110, 48,147, 74, 32, 17,139, 42, 60,178, 26, 93,135, 64, 16,188,159,159, 31,250,244,233, 3,145, 72, 4,185, 92, 14,133, 66, + 1,137, 68, 82,105, 52,203,216,167, 92,158,231, 65, 81, 20, 34, 35, 35,241,252,249,115, 88, 91, 91,227,242,229,203,232,218,181, +235, 75, 81,173,242,230,204,148, 16,125, 37, 5,191,193,136,157, 54, 69,139,101, 9, 20,242, 77, 32,123, 54, 25, 42,162, 25, 52, + 26, 6, 26,141, 6,223, 95,210,225,122,108, 17,116, 58, 45, 52, 26, 77,117,255, 89, 21,164,139,139,203,136,122,245,234, 77, 26, + 62,124,184, 94, 34,145,160,168,168, 8, 42,149, 10,247,239,223,215,247,234,245, 94,110,159, 62,129, 86,167, 78,157,226, 75,171, + 14,211, 76,208,206,114,117,117,117, 47,173,158,205,170,205, 89, 77, 16, 68,153,137,121,145,209,223, 62, 0, 77,149, 28,147,205, +155, 55,131,101, 89,240, 60, 95,229, 65, 42, 38,136,223, 22, 45, 93, 99,181, 34,248, 7, 88,217, 58,226,252,249,243,236,175,191, +254, 90, 64, 0,209,143,239,223,255,246,125,224,231,195,128,206,148,245,203,201,201, 49,243,242,242,130,155,155, 27, 56,142,131, + 94,175, 47,139,190,100,101,101, 65,173, 86,195,214, 60, 23,111,217,185,129, 41, 8, 67, 74,228, 87,112, 86, 68, 97,215,105,173, +190,185, 47,238,254, 3,110, 28,255, 43,157, 94,241,169, 25,174, 14, 78,238, 32,121, 61,146,211,179,208,175,119, 15, 80, 98, 5, +226, 18, 50,209,164,129,183,243, 7,239,183,119,166, 8, 6, 51,151,239,159, 4,112,223,215, 36, 87, 88, 88,200, 70, 69, 69,225, +222,189, 18,191,107,105,105, 9,115,115,243, 10,215, 56, 73,146,175, 20,209, 50,152,172,165,155,187,154,147,162, 34,228,179,161, +216,177,231, 22,154,248, 5, 98, 75,248,141, 98, 54, 45,187,219,234,226,226,232, 3,255,226, 96,134,147,147,211, 68,142,227, 22, +242, 60,159,219,161, 67, 7,199,253,251,247,219, 36, 37, 37,225,214,173, 91,248,242,203, 47, 51, 88,150,101,120,158, 39,120,158, +255,234, 53,252, 29, 87,206, 96,189, 78, 68,114, 25,166,216, 91, 18,125,105,210,210,139,201, 47,140,203,212,242, 39, 84, 12,183, + 30,128,190,218,155, 27, 73,126,116,228,224,102, 23,123, 37,135,206,202,119,144,146,166,195,210,207, 70, 33, 43,171, 0,223,111, + 95, 6, 64, 2, 29, 67,225,237,206, 3,225,224,224,138, 9,227, 39, 56,109,222,186,229, 19,134,227, 86,227, 13, 33,245,202,166, + 31, 1,132, 42,149,202,251,159, 76,152,160,244,242, 26, 9,153, 76,134, 3, 7, 14, 96,255,134, 13,108, 48, 48, 88, 10,156, 11, + 2,126,172, 86, 39,252, 15,157,169, 65, 65, 74,127,255, 32, 72,165, 82,252,254,235,255, 80,156,186,167,160,119, 59,232, 84,197, +232, 93,167, 15,111,251,236, 36,145, 45, 18, 33, 6, 0, 68, 50,164, 0,120,177, 26,236,223,102,176, 12,156,194, 31,237,178, 38, + 84,136,104,213,250,222, 41,146, 68,108,159, 54,204,211, 17, 26, 66,123,233, 36,146, 52, 28,187,226,177,142,186,157,199,127,254, +176, 18,147, 85,122, 98,115, 30, 30, 30,120,167, 69, 11,244,239,216, 17, 52, 77, 67, 38, 17,195, 66,102, 6,158, 45,137,100, 25, +170, 14,171, 41, 19, 81, 89,244,201,206,206, 14, 98,177,184,204, 96,153, 16,205,170, 84,147,227, 56,208, 52,141,123,247,238,161, + 67,135, 14,112,119,119,199,161, 67,135,208,179,103,207,151,170, 18, 77, 53, 89, 6,163,245, 66, 53, 94, 79, 0,134, 72,150, 73, + 70,171, 88, 75, 32, 83,219, 4, 4, 17, 0,134, 1, 88, 30,208, 20, 23,131,231, 1,158, 7,244, 58, 45,138,139,139,203,254,211, +152, 42, 89, 39, 39, 39, 15, 51, 51,179,197,179,102,205,244,111,210,164, 41, 50, 50, 50,192,113, 28,204,205,205,161, 82,169, 96, +105,105,137,118,237,218,197, 45, 94,188, 56,133,231, 49,193, 68,147,245,202, 24,246,249,153, 51,103, 42, 84, 27, 26,166,162,148, + 68,140,249,116, 47, 36,116, 73,213,146,161, 13, 79,117,247,221, 46,111,183,199,149,219,209,204, 71, 51,215,105, 68, 89,183,150, + 59,113,220,206,196, 87,216, 46,158,231,145,153,153,137,180,180, 52,244,237,215, 15,251,247,237,195,179,103,207,208,160, 65, 3, +116,233,210, 5, 14, 14, 14,120,246,236, 25,174, 95,212, 64,147,147,141,108,237, 45,200, 45, 90,227,248,249, 88,205,151,155,117, +177,127,227, 13,163, 47,128, 81,150,150,150,117, 85, 42, 85, 10,195, 48,135, 1, 28, 6, 48,152,166,233,193,114,185,220, 57, 63, + 63,255, 41, 74,122, 19,157,168, 73,204, 76, 38,179,147,202, 44,193, 49, 26,208, 52, 13,119,119, 47,240,172, 22, 57,249,106,140, + 30,218, 7,183,239, 61,196,175,231,174, 49,122, 61,247,157, 49,187,149,162, 40,222,215,215, 23,233,233,233, 16,137, 68, 48, 51, + 51,131, 66,161,192,156, 57,115,176, 97,195,134, 50,147, 85, 91,163, 53, 22,240,181,244, 80, 92,251,102, 99,137,201, 74, 77, 78, + 65, 90,162, 8, 74, 59, 71,124,183, 33,184, 40,231, 89,106,235, 31,128,232,127,123, 33,203,113,220, 87, 73, 73, 73, 14, 52, 77, + 59, 49, 12,131,132,132, 4,220,188,121, 19,147, 39, 79, 78,203,202,202,234,140, 90,110,163, 76, 38, 75, 55, 68,178, 74,171, 14, +171,170, 78,204, 45, 23,201,202,173, 70,178,170,106, 66,111, 47, 55,139,179,219,215, 78,247,104,217,186, 29, 41,167, 45,115, 10, + 99, 82, 59, 92,186,112,190,221,228,181,223,127,242, 60,167,176, 7,128, 39, 85,137, 74, 69,162, 94,109,218,183,167,193,167,129, +150,116,192,202, 21, 67,145,145,153,143,156,236, 2,136,197,230,208,234, 41,176, 28,129,118, 29, 58,226,127,187, 14,162,225,248, +113,148, 68, 36,234,206,104,181,111,140,209, 42,101,217,250,245,235, 61,252,252,252,176,115,231, 78,156,219,189, 27, 31,230,229, +225, 60, 73, 82,122,145,200,254,103,189,126, 27,106, 48, 90,229,117, 26, 54,108,136, 31,126,248, 1,123,246,236,137, 31,209, 53, +253,232,244, 17,112,208,233,240,238,173, 71,176,173,211, 7,184,245, 8,182,205,253, 80,143,161, 17, 67, 16, 21,211, 65,133,132, +132,116, 42, 63,255,151,145,130, 42,170,216,105, 0,157, 67, 66, 66,248,242,243, 26,111,156, 74,159,160,101, 61,234,122, 6,188, +229, 65,232, 15,173, 67, 66, 17,163,157,255, 72, 39,121, 92,200, 79,127, 8, 4, 87,243, 4,193, 83, 20, 5, 11, 51, 51, 40,173, +173, 75,194,252, 36, 9,112, 0,167, 7, 8,182,196, 0,240, 28, 1,158, 53,233,134, 1,137, 68, 82,105,195,119, 83,219,102,149, +215, 44, 40, 40, 64, 92, 92, 28, 38, 76,152, 0,185, 92, 94,226,220, 83, 83,225,233,233, 9,154,166,145,148,148,132,223,127,255, + 29,117,235,214,133, 84, 42, 53,201,109,149,139, 46, 53, 70, 73, 47,195,198, 41, 41, 41,150,206,206,206, 48, 57,162,197,241, 80, +105, 8,104,181, 44, 30, 63,126,140,228,228,100,196, 61,141, 65,203,162,124,240,160,192,243,188, 73, 17, 45, 87, 87,215, 0,111, +111,239, 45,203,151, 47, 23,187,185,185,129,231,121,216,216, 88, 67,165, 82, 33, 51, 51, 11, 13, 26, 52,128,187,187, 59,150, 47, + 95, 14, 0,251,255,106,147,245,194, 57, 85,102,180,202, 27,174, 79,223,247, 64,118,182, 2, 20, 69,150, 25,231, 26,218,104,137, + 1,160,115,143, 1,244,217, 95,127, 54,103,128,197,169, 20,181,152,174,249, 56,234, 89,142,147, 87,245,125, 66, 66, 2, 68, 34, +155,237,138,119, 0, 0, 32, 0, 73, 68, 65, 84, 17,142, 28, 62,140,236,180, 52, 52,105,210, 4,173, 90,181, 66, 76, 76, 12,110, +223,190, 13, 59, 59, 59, 40,221,218,226,252, 83, 29, 30, 36,171, 97,101,101,133,216, 68,242,239, 76, 25, 48,190, 91,183,110, 95, +126,251,237,183, 14, 78, 78, 78,162,140,140, 12,191,141, 27, 55, 54,217,184,113,227,212, 79, 62,249,196,241,147, 79, 62,177, 81, + 42,149,116,106,106,170,239,103,159,125,214, 60, 52, 52,180, 46,128, 53,213, 9,154,155, 91,216, 82, 98,115, 16, 4, 13,107, 43, + 27,208, 18,115,112, 12, 13,150, 3, 44,173,148,184,114,251, 8, 46, 71, 20, 76, 76,207,194, 97,163,226, 99,165,199,221,206,206, +238,165, 72,245,228,201,147,177,125,251,246,178,106,196,218,154,172,165, 27,187, 42,136, 82,147,149,154, 64,131,208,212,197,201, + 31,175,230,230, 60, 75,237,240, 38,152, 44,195, 61,142,231,121, 60,125,250, 20, 42,149, 10, 23, 47, 94,196, 87, 95,125,149,241, +162,201,114,112,112, 24,111,105,105,185,168,176,176,112,101,106,106,234,186, 26, 31,252, 74, 76,148,225,181, 97, 94,105,117,162, +145,171,234, 89, 89, 36,203,221, 89,118,250,246,197,189,158, 86,252, 93, 2,207, 39, 0,143,243,239, 91,132, 59,188,253, 94,203, +222,100,179, 77, 95,215,105, 53,113,206,233,132,252, 98,191,170, 34, 91, 28,203, 54, 51, 87, 88, 0, 72,199,173,155, 97,101, 38, + 43, 43, 59, 15, 26, 29, 5,141,150, 64,177,142,196, 59,221,222,197,134, 45,123,144,148,158, 13,150,101, 27,189, 97, 38,203, 54, + 32, 32, 32,104,240,224,193, 88,188,120, 49, 66,191,253, 86,251, 49, 65,228,211, 0,127,138,101,193,241, 60, 65, 26,215,136,189, +130,206,234,213,171,127, 4, 48,108,249,100,180,205, 41,196,104,151, 62,188,109,157, 62, 37, 11, 14,154,197, 3,128,109, 70,104, +197, 34, 51, 48, 48,144, 48,212,172,153, 90,195,246, 79,135, 14, 12, 12, 60, 31, 18, 18,130,242,243,234,126, 96,225,232,247,222, + 23, 51, 38,173,104,217,179, 35,145, 50,163, 59,178,243,139,153,185, 15,116,146, 68,117,245, 38,171, 60, 95,108,220,136,219,209, + 37,215,177,155,131, 3,102,126,240, 1,120, 6,184,124,255, 1, 14,134,134, 98,104,183,110, 48,151,201,140,142,108,112, 28, 87, +105, 20,171,124, 52,203,212,168, 83,110,110, 46, 14, 31, 62,140, 86,173, 90, 65, 46,151,131,166,105, 52,110,220, 24, 15, 31, 62, +132,183,183, 55, 8,130,192,241,227,199,209,191,127,127, 60,121,242, 4,109,219,182, 85, 60,127,254,220,100,163,245,224,193, 3, + 75,158,231,223, 54, 68, 63,106,139, 70,163, 65, 84, 84, 20,250,244,233, 3, 27, 27, 27,184,186,238, 71,232,233,189,144, 7,124, + 8,130,128, 73, 70,139,101,217,177,189,123,247, 22, 19, 4, 1,181, 90, 5,153,204, 12,230,230, 10, 88, 88, 88,194,215,215, 15, +201,201,201,232,217,179,167, 54, 54, 54,118, 83, 74, 74,202, 33, 83,215,213,223,223,223,252,217,179,103, 31,214,169, 83, 71, 2, + 0,102,102,102, 13,188,189,189, 63,127,242,228, 73,129,169, 81, 45,131,193, 34, 8, 2, 20, 69,149, 25, 45,154, 36,225,236,228, + 80,246,190,180,125, 26, 81,141, 86,126, 82,150, 70, 10, 0, 30, 30, 30,216,176,245, 39,178,119,239,222,152, 58,117, 42,244,122, + 61, 54,109, 42,233,100, 55,124,248,112,232,116, 58, 28, 61, 90,210, 73,146,166,233,106,195, 38, 55,111,222,196,173, 91,183,160, +215,235,145,151,151,135, 95,126,249, 5,231, 47, 92,192,129,227,191,225,217,211, 24, 52,246,243,196,184,113, 99, 33, 18,137,176, +107,215, 46,116,232,208,225,111,189, 33,136, 68,162, 17,219,183,111,119,222,185,115,103,238,241,227,199,139,218,180,105, 35, 13, + 14, 14,118,216,176, 97,131, 82,171,213, 98,218,180,105,233,215,174, 93,211,244,235,215,207,124,219,182,109,206,111,189,245, 86, +119,134, 97, 42, 51, 90,230, 0,134, 2, 24,153, 83,160,165,115, 11,212,224, 24, 45,158, 62,139, 67, 94,161, 22, 28,171, 67,124, + 98, 50, 10,139, 89,100,101, 23,160,113,179, 30,235,195,194,194,230,233,116,186,185, 0, 66,106, 90,207,251,247,239,227,218,181, +107,120,246,236, 25,158, 62,125, 90,209, 41,142, 31,143, 61,123,246,152, 28,209,170,220,100, 81, 32, 52,222, 8, 57, 30,158,155, + 30,147,242,198,152,172,210,123,208, 66,103,103,231,133,206,206,206,178, 51,103,206, 88,213,169, 83, 7, 12,195,104, 95,140,100, +117,238,220,121,254,246,237,219,157,189,189,189, 39, 3, 88,247, 79, 88,119,146,196,248,149,155,131,236, 45, 36,241,201,120,188, +166, 52,151, 32, 5,168,242,129,176,125,160,219, 47,136,155,220,111,150,205,236,157,139,199,115,224,170,236, 33, 27,251, 36, 1, +155, 55,111,192,244,105,163,241,191,239, 87,130,227,104,104,244, 20, 60,188,218, 64,163,227, 64,144, 52,154, 52,107,129,115, 97, + 23, 33, 34,129,195, 59, 55,191, 97, 62, 11,217,145,145,145,155,142, 31, 63, 62,101,234,212,169,224, 56, 78,178,104,243,102,117, + 70, 70,198, 50,152,150,255,234, 69,157,254,155, 55,111,142,158,189, 33,227,199,233, 35, 64, 61, 59, 73,100,223,122, 4,219, 65, +179,120, 28, 89, 65,160,185, 31,178,229,149, 23,241, 23, 94,152,191, 25, 70,203,224, 36,203,207, 43,163,153, 79,221,175,173,108, +109,198,146, 22,174,246, 51,167,126, 76, 63, 73, 45,198,209, 58, 31, 20,254,190,251, 59,243, 84, 70,186, 62, 22,197,193,166,252, +241,193,223,127, 47,123,189,106,255,254, 74,191, 75, 25, 52,200,232, 39,179,170,162, 88,166, 70,178, 0, 64, 46,151, 91,119,239, +222, 29, 93,187,118,197,192,129, 3,203,218,100, 53,109,218, 20, 7, 14, 28,192,128, 1, 3,112,231,206, 29, 56, 59, 59,163,126, +253,250,168, 95,191, 62,126,254,249,103, 83,111,114, 96, 89, 22, 1, 1, 1,134, 94,135,141, 19, 19, 19, 45,107,123, 32, 53, 26, + 13,178,178,178, 96,107,107, 11,137, 68,130,214,173, 91, 97,202,167,173, 97,239,252, 3, 2,252,253, 80, 84, 84, 84,214,253,221, +136,194, 54,160, 94,189,122,200,200,200, 64, 70, 70, 6,148, 74, 37, 92, 92, 92,224,228,228,132, 53,107,214,240,235,214,173,251, + 85,167,211,109,202,204,204, 52, 57,146,229,228,228,212,145, 32,136,249,106,181, 90, 82,238, 9, 87,162, 84, 42, 79,168,213,234, +101, 41, 41, 41, 70, 55, 4, 37, 8, 2, 58,157, 14, 4, 65,224,212, 83, 23, 20,105, 9,228, 39,222,194,212,247, 61, 43, 24, 47, +145, 72, 84, 99,117, 41,207,243, 69,195,134, 13,115,112,119,119, 67, 66,236,125, 28, 57,194,227,219,111,191, 53,244,138, 68,116, +233,131,129,225,125,151, 46, 93,224,229,229, 5,222,132, 92, 25, 28,199,225,222,189,123,216,127,226, 60,156, 61,253, 17,255, 56, + 10,183,127, 62,137, 58, 74, 91, 52,108,214, 2,122,189,254,149, 82,111,188, 14,244,122,253, 14, 31, 31, 31, 94,171,213,158, 7, +176, 33, 34, 34, 98,116, 74, 74,202,180,159,126,250,201,101,240,224,193,201, 39, 79,158, 12, 6,176, 51, 34, 34, 34,104,201,146, + 37, 93, 25,134,169,180,183, 32, 69, 81,255,251,236,179,207, 58, 15, 30, 60,152, 16,147,122,237,153,211,187,104,134,209, 19, 95, +204,221,193,134, 93, 58, 79, 50,140,158, 24, 56,236, 51,238,231,223, 35,200,137,159,174, 98,155,182,233,141,200,200, 72,167,192, +192,192, 37,122,189,190, 90,163,101,136, 84, 85, 21,161,164, 40, 10,163, 71,143,198,129, 3,198,183,160, 26, 7,120, 91,122, 42, +174, 45,221,216, 77, 65,208,133,229, 76,214, 91, 8, 57, 30,158,155,246, 56,249,141, 50, 89, 0,144,149,149,181, 21,192, 86,142, +227,210,204,205,205, 81, 80, 80, 80,217,249, 39,139,136,136,144, 73, 36, 18,244,232,209,195, 54, 52, 52, 52,154, 36,201,117,201, +201,201, 85, 58,142,202,170, 9, 43,171, 78,196, 43,244, 58,180, 81, 34,176,117,199,102, 22,143,172, 22, 91,200,232,226, 59,117, +162,101,150, 4,128, 60,141,227,211, 43,207,135,230, 19,233,210,166, 45,186, 52,135, 37,109, 30,152,203, 20, 84,106,180, 72,138, +186,157,151,147,219, 43,191, 64,139, 75,151, 35, 49,108,104, 61,104,116, 4, 56,142, 68, 97,145, 6,160, 68, 32, 1, 12,255, 96, + 20,120,130, 70,118, 90, 50, 40,138,138, 0,195,224, 13, 99, 78, 80, 80, 80,175,185,115,231,214,157, 57,115, 38,102,206,156,233, +185,125,251,246,173, 75,151, 46,157,153,145,145,209, 8, 53, 36, 31,175, 70,167,206,201, 3, 11,102,156,184,184, 37,175,119, 59, +245,227,230,126, 37,145,175,230,126,200, 22,137, 16, 67, 83,200,226,249,138,205,140, 2, 3, 3, 59,149,159,255,203,120,177, 17, +124,217,123,163,218,104,213,171,235,250,110,179,166, 1,159,206,155, 59,207,226,225,149, 48,204,254,122, 3,239,211,162,123,193, +214,139,183,181,133,230, 94,189, 10, 51, 99, 46, 27,235, 47, 0,224,221,119, 6,160,113,131, 86, 47,125,217,161, 75, 73,178,246, + 75,231,110, 34, 45, 35,201,232,194,182,212, 28, 84,218, 38,203,152, 46,253, 47,162, 86,171,115, 35, 35, 35, 29, 18, 19, 19, 43, + 52,124,247,242,242, 2, 65, 16, 8, 15, 15,199,181,107,215, 48,108,216, 48,208, 52, 13,145, 72,132,243,231,207,155, 20,141, 41, + 23, 93, 50,244, 58,236,233,230,230, 86, 85,111,195, 26,181,212,106, 53,242,242,242,112,250,244,105,212,171, 87, 15, 75,151, 46, +133,139,179, 35,230,205,155, 1,142,227,144,159,159, 15,150,101,141,141,104,113,134,104, 17,199,113,200,200,200, 64,221,186,117, +177,113,227, 70, 4, 7, 7, 47, 73, 73, 73,249,201,212,117,116,119,119,183,102, 89,246,139,222,189,123,119,239,215,175, 31,122, +246,172,152,143,117,223,190,125, 22, 71,143, 30, 93,246,221,119,223,189,171,211,233,150,167,167,167,103, 24,163,251,195, 15, 37, +233,151,228,109, 22, 98,246,224, 58, 24, 57,105, 23,214,172, 57, 6,169, 84, 90,161,224, 93,188,120,113,181, 38,134,227,121, 31, +113,230,149,228, 25,179, 86, 59, 44, 91, 22,138,208,208,116,144, 36, 9,103,103,103,144, 36,137,184,184, 56,144, 36, 9, 79, 79, + 79,144, 36,137,164,164, 36, 67,155,192, 28, 84,210,235,177,242,167,112, 18,197,197,197, 72,136,127,134,196,216,104, 40,242, 83, +161,180,148, 35,231,254, 61, 52, 30, 55,190, 44,255,211,223,204, 30,173, 86,187,167,220,251,213, 39, 79,158,212, 18, 4, 49, 16, + 37,237, 52, 12, 17,141, 37, 12,195, 44,169, 74,164, 77,155, 54, 77,231,206,157, 43, 50,164,219,112,241,248,134,209,233,116, 28, + 0,248, 53,126,187,130,219,143,137,137,193,154, 53,107, 80, 84, 84, 4,177, 88, 44, 54,102, 63,112, 28, 87,214,195,176, 50, 19, +102,138,201, 2, 0, 59, 79,183,245,225,183,206,179,119, 99,183,168, 35, 30,253, 98,150, 18, 79,130,212,190,185, 38,235,197,200, +150,155,155,219, 66,142,227,120,158,231, 23,148,251, 74,234,225,225,113,241,204,153, 51,118, 12,195,224,187,239,190,179, 78, 77, + 77,181,126,251,237,183,103, 3,168,210,104, 85, 86, 77, 88, 89,117, 34,202,245, 58,148, 74,165,182, 90,109,149,193,147,151,122, + 29,178, 44,124, 45, 45,172,145,131, 68,104,236,245, 77,115,237,152,236,179, 41,227,239,184, 60,111,214,192,156,213,215, 37,243, +181,112,149, 91,131,227,249, 42,187, 70,107,244,250, 95,238,220,186,221,195,195,189, 30,245, 83,200, 5,244,237, 63, 24, 26, 13, +137, 98, 61, 1,130, 18,129,160,196,104,212,184, 25,234, 55,108, 12, 30,192,205,235, 87, 24,173, 94,127,246, 77, 58,246,206,237, +167, 12, 35, 8,172, 3,207,241,149,228,209,170,219,191,127,255,101, 0, 62,173, 73,199,161,205,148, 97, 36, 89,162, 83, 62,143, +214,103, 83,130,112,255,186,200,234,194,173, 21,226,158,109,112, 42, 35,148,128, 92,246, 71,175, 67, 17,249, 74,169, 57,254, 45, +134,171,102,163,229,238,238,110,109, 41,149,253,240,201,184,177, 22,207,239, 94, 69,234,131,112, 92,190, 16,157,115,240,232,177, +236,162,172,244,113, 38,152,172,178,106, 62, 59,167, 58,240,242,127,217,104,201, 20, 74, 0,128,151,127, 43, 80,230,166,165, 17, +170, 44,154, 85, 27,147, 85,254,134, 93, 89, 14,173,137, 19, 39, 98,251,246,237,104,223,190, 61,124,124,124,202,110,246,166, 70, +205, 42,137, 46,153,220,219,176, 60, 5, 5, 5,240,244,244,196,182,109,219, 16, 17, 17, 1, 11, 11, 11, 12, 27, 54, 12, 5, 5, + 5,101, 6,203,216,198,240, 60,207,199,156, 57,115,166,229,144, 33, 67,120,145, 72, 68,228,230,230,194,218,218, 26, 27, 55,110, + 44, 74, 73, 73, 57, 85, 11,147, 53, 88, 44, 22,207, 24, 58,116, 40,229,231,231,135,180,180, 52, 88, 90, 90,234, 9,130, 16, 1, +128,181,181,181,222,204,204, 12, 65, 65, 65,104,210,164, 73,199,153, 51,103,182,167,105,122, 99,114,114,242,174,234,206, 37,130, + 32,202, 10,212,113,235,162,160,213,150, 20,208,155, 54,109, 66,105, 91,183, 63,170, 8, 98, 99, 1, 35,122,178, 40, 20, 10,248, +248,248, 84,122,236, 59,118,236,136,155, 55,111,150, 84, 77,210, 52, 28, 28, 28,112,249,242,101,163,122, 82, 25, 18, 65, 70, 70, + 70,194,223,203, 30, 17,161,103, 96, 47, 23,161,137,139, 19,220, 58,118, 66,116,116,244,223, 25,205, 34, 80,210, 14,163, 91,233, + 57,184, 3,192,196,114,239, 55, 2, 88,111,138, 32,195, 48, 60, 73,146, 68, 66, 66,130, 78, 46,151, 19,182,182,182,180, 84, 42, +133, 70,163, 41, 51, 92, 49, 49, 49, 8, 9, 9, 65, 98, 98, 34,108,109,109, 73, 43, 43, 43,232,116,186, 28, 99,244,125,125,125, +225,228,228, 84,161,225,251,184,113,227,106,101,178, 70, 3, 1,219,191, 89, 94, 71, 74, 82, 86,254,246,239,226,105, 84, 92, 49, +169,133,236,191, 96,178, 0, 32, 55, 55,119, 43,128,173,134,247,246,246,246, 99, 40,138,154,167,209,104,172,206,159, 63,111,173, + 84, 42,137, 93,187,118,233, 23, 44, 88,144, 75, 81, 84, 14, 65, 16,107,255,126,115,136, 7,153,121,177,158, 34, 27, 23,238,110, + 49,127,101, 90,194,236,250, 57,162,122, 74,162, 97, 0,250,167, 63,188, 52,134,137,109,151,150,146, 74,242,224, 30, 84,115, 15, +222, 49,123,238,226, 47,162,163,110,123,200, 44,101,152, 24, 52, 23,167,126, 61, 7,130, 20,225,226,149,112,104,117, 44, 50,179, +243, 48,116,248, 8,184, 57,219,227,193,181,211, 25, 12,199,109,124,179, 76, 54,183,161, 71,223, 49, 54, 82, 51,121,233, 62, 97, +177,231,251, 25, 32,201,117,248,242,203, 47, 17, 16, 16, 48, 41, 50, 50,242, 43,212,144, 71,139, 32,184, 13,141, 58, 13,183, 17, + 75, 75,116,120,142,197,182,195,179, 75,243,104, 77,199,198,173, 71, 27, 53,244,122,186,168,186, 60, 90,111,144,201, 42, 63,175, +222,104,121,122,122, 74,205, 69,152, 32,162,232,153,159,124,208, 79,153, 30,123, 31,137, 15,111,151, 84, 47,232,212,186,212,199, + 15,141, 73,133,222, 13, 21,243,119,240,213, 85, 93, 21, 23, 27,245, 68, 95, 65,211, 80,224,190, 24,205, 50,209,100,189,164, 89, +222,108,149,207,155,229,238,238,142,101,203,150, 25,147, 71,235,197,109, 55,208, 19, 37, 13,224,203, 55,134,239,105,164,201,170, + 84, 83,169, 84, 34, 43,171, 36, 67, 66,231,206,157,209,185,243, 31,253, 25,116, 58, 93, 89, 20,203,194,194,162,178,136,214, 75, +154,102,102,102,179,143, 29, 59, 54,246,202,149, 43, 67, 62,255,252,115, 81,215,174, 93, 13,102, 78, 5,227,198,118,171,160,201, +178,108,208,233,211,167, 41,142,227,176,109,219, 54,220,188,121,147,151,203,229,243,229,114,249, 6, 51, 51, 51, 86,173, 86, 79, + 28, 63,126,252,136, 69,139, 22,145, 29, 59,118,196,213,171, 87,201,186,117,235,142, 2, 42, 36,177,172,116,219,195,195,195, 65, +146, 36,152,236,120, 76,154,125, 16,230,102, 52,162,162,162,144,157,157,253, 82, 18, 83, 99,246,103,249, 72,137, 97,234,216,177, + 99, 89, 53,100,235,214,173, 65, 81, 20,238,220,185, 83, 85, 53,108,121, 77,222,206,206,174,236,252, 16,139,197, 56,119,238, 28, +190,254,250,107,120,216, 90, 35,231, 97, 4,156, 58,191,131,238, 99,199, 99,216,176, 97,160, 40, 10,182,182,182,101,145, 95, 35, +206,165, 87,161,188,230, 88,127,127,255, 81, 15, 30, 60,112,107,212,168,145,115,100,100,100,151,128,128, 0,207,136,136, 8,195, +123, 41,140,107,155, 83,166,121,227,198,141, 35, 27, 54,108, 8, 26, 61,122,180,152,227, 56,246,249,243,231,122, 0,132,147,147, + 19,117,227,198, 13,238,167,159,126,130, 90,173,134,155,155, 27,233,234,234, 74,156, 61,123,150,123,248,240, 97, 56,207,243,115, +141,217,118,150,101, 43,164,113, 48,188,222,183,111,159,201,215,123,157,250,190, 75,187,190,237,231,158,153,124, 7, 41, 73,177, + 96,243,148,186,144,227, 39, 53, 38,154,172, 63,251, 24,253,149,154,139, 31, 63,126,236,170,209,104, 32,145, 72,176,105,211, 38, +221,178,101,203, 30,100,102,102,118, 64,229, 61,202, 43,104,214,178,215, 97,118, 53,154, 47,245, 58,204,203,194,169,227, 39,110, +180, 84,244,223,129, 73,201, 25,101, 13, 27,121,130,176, 61,230,216,160,131,188, 85,163, 36,242,231,133,100, 1,171, 58, 85,205, +182,107,213, 90,237,224,254, 3,134,255,118,224,192,126,197,130,133, 11,113, 57, 60, 2, 89,185,133,224,120, 10, 28, 65, 96,222, +188, 5,112,178,183, 69,126,242, 99,149, 70,167,235,143,138, 57,180,254,245,199,157, 32,200,201,103,127,218,181,142, 36,192, 21, +165, 61,146, 82, 5,177,242,145,195,250,211,131, 7, 15,198,177, 99,199, 16, 25, 25,185,165, 26,147, 85,166,201,243,228,228,136, +243, 7,215, 17, 0,167,206,120, 36,165, 11,159,202, 71,125,208,159, 30, 54,108, 24,126, 12,185,130, 3, 39,159,110, 62,112, 18, + 39,241,102, 99,122,102,120, 11, 26,145, 29, 26,120,187,118,108,214, 80, 70,179,106, 36, 62,140, 69,118, 81, 49,206,222,127,158, + 75,242,100,173,115,235,148,220, 32,197,136,143,127, 92,201,147,149,172,180, 64, 47, 54, 73,147, 36,201, 10,209,172, 87,137,100, +149, 95, 79, 71, 71,199, 10,195,185,148, 47,184, 13,109,128,106,145,218, 97,118,124,124,188,101,124,124, 60,120,158, 71,120,120, +184,101,235,214,173,103,191, 74, 52,107,198,140, 25,101, 81,171, 23,231,149,125, 86, 19,165,141,210,131,245,122,253,225,153, 51, +103, 78,106,221,186,117,143,133, 11, 23, 18, 48, 97, 0,222, 23,162, 57, 12,199,113, 8, 11, 11,195,177, 99,199, 88,157, 78, 55, + 33, 37, 37, 37,162,220, 34,223,221,186,117,235,236,128, 1, 3,118, 61,122,244,136,122,240,224, 1,120,190,230,126,167,106,181, + 26, 62, 62, 62, 96, 24, 6, 43, 38,185,163,160,160, 17, 24,134, 1,203,178, 48, 55, 55, 47,139,226,149, 55,207, 53,157, 71, 44, +203,190,100,180,194,195,195, 65, 81, 20, 58,116,232,128,219,183,111,151, 69,180,106,138, 64,233,116,186,120, 71, 71, 71,199,197, +139, 23,151,173, 87, 70, 70, 6,206,156, 57,131, 54,109,219,161,193,132,137, 72, 78, 78,198,218,181,107,225,226,226,130,165, 75, +151, 34, 59, 59, 27, 12,195,252,213,225,244, 94, 15, 30, 60,112,251,224,131, 15,210, 35, 34, 34,220, 66, 66, 66,172, 3, 3, 3, +205,135, 15, 31,158, 30, 17, 17,225, 70, 16, 68, 59,152,216, 8,154,227,184, 57,243,230,205,251,117,233,210,165,179, 63,253,244, +211,214,163, 71,143, 22,137, 68, 34, 46, 41, 41,137,217,191,127, 63,225,227,227, 67,138,197, 98,226,244,233,211,220,245,235,215, +175, 49, 12,179, 2,192, 69, 83, 34,206,229, 77, 22, 69, 81,198,154,172, 10, 76,115,144,142,178, 32, 51, 58,108,216,180,140,244, +243,114,211,237,222,127, 38,225,226,213,199, 79, 40, 13, 51,237,135,106, 82, 3,188,201, 80, 20,117,200,223,223,127,204,228,201, +147,205,122,246,236, 41, 93,180,104, 81, 94, 65, 65, 65, 85, 38,171,146, 7,230,191,164,215,225,247,115, 62, 15,153,246, 89,163, + 49,222, 31, 57,213, 65,104, 81, 58,114,104,138,180,180, 38,209,204,147, 66, 65,102,140,242,228,111, 59,227, 0,212,148,151,237, +198,173,123,145,221, 26, 54,106,122,116,197,210, 21, 14,243,103,205, 20, 29, 13,249, 5, 60,163, 67,248,249,243, 80,136, 89,254, +225,173,208, 52,141, 78,219, 15,111,224, 16, 60, 41,151,215, 31, 0,112,194,214,214,246,238,216,209,163,125,252,253,135, 67, 46, +151,227,200,145, 35,216,243,221,119,108, 48, 48, 68, 10,220, 14,170, 33,159, 94,250,181, 50,157, 59,227,199,142,245,109,214,236, + 35,200,229,114, 28, 62,124, 24,187,130,131,141,214,249,151, 99,200, 12,127, 10,127,100,136,175,161,141, 22, 73, 20, 92,123,252, +188, 48,252,241,243, 66,112, 60,207,241,188,134, 36,145, 80,164,211, 45,125,252, 52,169, 86,166,192, 80,117,184,228,155,201,175, +175,206,163,156,249,169,109,151,238, 74, 76, 86, 98,249, 49,210,202, 23,210, 85,189,214,235,245,137, 70,202, 47,247,240,240,120, +233,179,218,135,126,121,147, 76,150,177,121,180, 0, 32, 43, 43, 43, 5,192,252,171, 87,175,238,235,209,163,199,120, 0, 73,181, + 60, 70,219, 58,117,234, 52, 1, 0, 69, 16,196,150,228,228,228,136,151, 46,248,148,148,104, 23, 23,151, 85, 94, 94, 94, 19, 75, + 30, 76,137,109, 53, 20,228, 79, 27, 53,106,164,171,236, 88, 84,245,158,227,184, 26,143, 81,110,110, 46, 90,181,106,245,210,152, +150, 60,207,227,249,243,231,134,136, 83,217,190,175,206,192, 21, 22, 22, 78,156, 50,101,202, 86,145, 72,228, 1,128, 48,152, 92, +150,101,169,245,235,215,203, 88,150,165, 0, 16, 36, 73, 50, 34,145,168,248,216,177, 99, 12,195, 48,241, 26,141,102,226, 95,124, +131, 56, 76,148, 12,197, 80,244,224,193, 3,191,210, 72, 86, 98,100,100,228,157, 3, 7, 14, 40, 1, 28,172,165,238, 69,149, 74, +117,113,217,178,101, 29, 55,109,218, 52,103,226,196,137,173,134, 13, 27, 70,119,238,220, 25,167, 78,157, 98,195,194,194,194,213, +106,245,114, 83, 12, 86,233,177,204,115,119,119, 47, 51, 92, 53, 92,203,213, 54,228,181,243,148,110, 24,241,177,139,108,219,242, + 51,133,153,201,218, 43,250, 66,237,220,157, 64, 36,254,195,164,165,165,125, 14, 96,193,218,181,107,147,155, 52,105, 34, 21,139, +197, 90, 99, 77,214, 95, 8,195,229, 22,190,247,109,247, 65, 39, 58,205,155,226,213,189, 75, 7,185,123, 29, 7,215,135,177,105, +136,185,122,170,232,238,201,111,158,241,154,156,190, 0,140,105,185,126, 93,163,211,213,155, 49,115,198, 36,137, 72,212,131,101, +217,198, 93,207, 30,231, 41,138,138,208,234,245,103, 75,171, 11,139,223,224, 67,190,100,213,170, 85, 62,254,254,254, 56,114,228, + 8,206,238,221,139,161,153,153, 56, 71, 81, 20, 41, 22,219,157,212,233, 86,195, 56,131,180,100,205,154, 53,190, 1, 1, 1, 56, +116,232, 16, 78,239,218,133, 33,181,211,169,170,172,107, 9, 64, 89,250, 54, 19,192, 35, 0,205, 1,152, 1,208,160,100,104, 39, +251,242, 69, 88,233,119,134,239, 47, 16, 4,241,103, 54,132,173, 57, 51,252,139, 68,198, 60,107,254,186,215, 66,173, 86,103,251, +248,248,152,212,231, 90,175,215, 87, 91,135,203, 48, 76,162,183,183,183,209, 81, 11, 99, 76, 81,118,118,118,139, 63,241, 96,188, + 82, 91,172, 10,133, 8,199, 61,115,118,118,230, 12,133,126,101, 38,172,178,207,120, 32,206,148,255, 73, 77, 77,125, 4,224,179, +218,174,103,114,114,242, 81, 24, 49,104,180,177,203, 1, 64, 78, 78,206,107, 31,204,151,224,249,164, 69,139, 22,153,100,176,193, +243,213,153,207,136,194,194,194,214,198,252,183, 78,167,195,223,200,161,210,137,140,140,140, 28, 79, 16, 68, 79,148, 84, 9,108, +193,235,201,230,125, 49, 63, 63,255,226,202,149, 43, 59,110,219,182,109, 26,207,243,200,207,207, 15, 54,213, 96,149, 61, 61,167, +167,159,122, 93, 27,158,157,166,253,125,255,150,196,119,212,185,186,105,219, 11,181,187, 32, 80, 22,140,226,121,254,127, 35, 71, +142,108, 3, 96,231,171,138, 85,209,235,240, 85,137,227,114,242,154,156,155,241,245,216,115,214, 22,189,193,210,126,208,146, 39, +161,205, 58, 5,224, 7, 24,215,204,161,108,123, 25,142, 91,195,104,181,107,202, 21, 46,255,133,227,108, 27, 16, 16, 48,109,204, +152, 49, 88,176, 96, 1, 78,175, 94,173,251,152, 32,242, 68, 0,255,107,201,131, 38, 73, 0,179,140,213, 25, 53,106, 20, 22, 44, + 88,128,159, 87,172,168,173, 78,117, 40, 9,130, 8, 1,128,217,179,103,207, 93,182,108,153,205,156, 57,115, 26, 47, 95,190,124, +105,233,251,251,134,239, 75,203,186,192, 57,115,230, 52, 44,247,125, 1,128, 27,127,242,254,172, 52, 51,252,159, 77, 55, 65, 83, +208, 20, 52, 5, 77, 65, 83,208, 20, 52, 5,205, 87,129,231,249,222, 37,179,170,231, 85,189, 46, 55,255, 91,160, 33, 32, 32, 32, + 32, 32, 32, 32,240, 47,164,124, 20,171, 54,223,191, 70, 12,109,180,202,179, 13, 40,233,214, 93,149, 43, 53,165,215, 67,109,156, +109,168,160, 41,104, 10,154,130,166,160, 41,104, 10,154,255, 57,205,154,180, 95,250, 61,207,243,189, 9,130, 8,225,121, 62,176, +170,185,193, 88,189,248,186,220,252,181, 53, 59,168, 4, 67,219,172,151,218,104,253,217, 8, 97, 85, 65, 83,208, 20, 52, 5, 77, + 65, 83,208, 20, 52, 95, 9, 67, 21, 32, 0,126,246,236,217,115,254,129, 85,135,206,165, 38,171,252, 4,160,154,170, 67,158, 63, + 76, 37, 37,193, 82, 34,145,139, 1, 64,171, 85,233, 92, 93,145, 79, 16,131,255,206, 1,111, 5,254,157, 24,186,123,167,189,230, +101, 5, 4, 4, 4, 4,254, 27,100, 24, 34, 85, 0, 50, 0, 16,165,239,181,165,243,140, 82, 67,246,226,235, 10,223,255,137,164, +160,138, 72, 22, 93,149,201,202,204,148,219,211,116,142, 47,203, 22,215, 7, 0,154, 38,163, 50, 51,109,162,121,254,112,102,109, +204,150,189,131,195, 45, 17, 69,185, 26,179,172,158,101,147, 50,211,210, 42,166,142, 39,136, 55,193,224, 25,107, 34, 94,197,108, +252,233, 70,197,222,222,222,209,209,209,241,125, 75, 75,203,182,185,185,185,215, 51, 50, 50,126,172,102,220,195,101, 4,129,153, + 37,231, 21, 86, 2,152, 83,141,180, 41,203,190,136,143, 92, 46,159, 68, 16, 68, 64,233, 5, 22,169, 82,169, 54, 1,120,252, 31, +188, 33,153, 1,232, 71,211,244, 40,123,123,251, 86,169,169,169,139, 0,212, 54,155, 55, 13, 96,134,181,181,245, 80,107,107,107, +239,236,236,236, 39,249,249,249,135, 0,172, 1, 80, 99, 87,233, 69,159, 58,183,237,220,179,243,252,176,211, 97, 75, 22,125,151, +114,245,165,239,103, 56,219,245,232,222,126, 65,216,201, 43,139,231,110, 76,206, 54,113,221,200,210, 9, 40,233, 29,201,227,229, +100,175,175,138, 8, 64, 31, 0,157, 1,132, 1, 56,105,204,118, 87, 65, 27, 0,115, 75,215,121, 13,128,115,255,240,243,200,220, +209,209,113, 5,128, 62, 52, 77, 63, 72, 74, 74,154, 0, 32,241,111, 94, 39, 26, 64, 75, 0, 1, 40, 73,195,113, 3,198,165,112, +168, 17, 59, 59,187, 64,154,166, 39,149,166,118,217,148,149,149, 21,242, 79, 61, 48, 18,137, 36,216,201,201,233, 35,181, 90,173, + 34, 8,130, 47,159,239,145, 97,152,196,204,204,204, 22,111,218, 77,141, 32,136, 27,255,240, 85,156, 80,201,103, 85,231,209, 74, + 74,130, 37, 77,231,248,166,167, 70, 12, 77, 78,185, 55, 4, 0, 92,156, 27, 31,114,112,106,116, 48, 41, 73,162,115,242,235,175, + 16,201,233, 77, 20, 37,106, 90,172,213,216,139,104, 81,166,142,209,223, 33,181,252,164,212, 71, 63, 86,154,108, 81, 68, 81,174, +207,162,207, 57, 48,186,108,136,100, 46, 16,153,121, 84,185,182, 46, 46, 46,181,218, 74, 27, 27,111, 11,157, 84, 54, 77, 36,162, +186,115, 60, 19,192,115, 0, 73,136, 34, 25, 86,255,155, 88,163,249, 54, 39,231, 73, 65,109,247,160,159, 29,156,120, 96, 24, 8, +116, 7,143,179, 4,112,224, 81, 22, 82, 77,144, 48,214, 68,188,138,217, 40,255,219,181, 0, 62,127,221,103,146,171,171,171, 77, + 96, 96, 96,240,215, 95,127,109,166, 80, 40,136,248,248,248,158,179,102,205,122,251,230,205,155,159, 37, 37, 37, 37,191,104,250, + 8, 2, 51, 57,142, 39, 1,128, 36,137, 89, 74,165,131,156,162,168,151,114, 27,177, 44, 43,207,200, 72,159,204,113, 60, 81,186, +236, 76,158,199, 58, 99, 12,163, 76, 38, 27, 30,208,168,233,103, 43, 86,173, 81, 56, 58, 56,152, 51, 44,167,139,123,254, 76, 62, +127,246,231,173, 99, 99, 30,175, 43, 46, 46,222, 95,155,235,154,162,168,161, 82,169, 52, 16,128,127,233,103, 15, 53, 26, 77, 8, +203,178, 7,141, 45,208, 29, 29, 29, 47, 80, 20, 85,199,148, 63,102, 89, 54, 62, 45, 45,173, 67, 45, 15,209, 96, 15, 15,143, 31, + 58,117,234, 36,111,213,170, 21, 36, 18, 9, 22, 44, 88, 48, 35, 37, 37,165, 38,163, 69, 3,152, 33,151,203,135,154,155,155,123, + 23, 22, 22,198,170,213,234,163, 18,137,164,219,186,117,235,220,219,183,111,111,145,150,150, 70, 80, 20,229,248,243,207, 63,127, + 24, 28, 28,220,147, 97,152,174, 53, 21,114,121,177,252,124,105, 31,255,142,121,177,231,230, 3,232,245,226,247, 76,177,108, 20, + 79,185, 7,170,249,219, 9,165,230,195,104,147, 37, 18,137,214, 57, 57, 57,141, 41, 46,201, 21,192,191, 88,224, 0,128, 86,171, +205,201,205,205,245,171,205, 37, 15, 96,156,181,181,245,152, 47,190,248,194,166, 87,175, 94,216,187,119,239, 39,219,183,111,207, +201,207,207,255, 31, 74, 18, 97, 62, 50, 81,115,102,106,106,234,123, 34,145,136,112,119,119,167,212,106,181, 41, 70,203, 23, 37, +131, 48,223, 0,176, 9, 37,169, 11,186, 0, 37,215, 59,128,149, 6,227, 70,146,228, 38, 63, 63,191,247, 31, 62,124,184, 25,192, +146,218, 94,235, 78, 78, 78, 91, 55,110,220, 56,164,111,223,190, 84, 70, 70,134,107,147, 38, 77,246,165,166,166,118,124, 13,183, +145,177, 82,169,116,122,227,198,141, 27, 60,122,244, 40, 58, 63, 63,127, 77,233,254,172,238,154,114, 3,208,205,218,218,186,235, +188,121,243, 20,129,129,129,216,182,109,219,123,219,183,111, 47, 44, 40, 40,248, 13, 37,109,122, 94,201, 4,210, 52, 61, 41, 49, + 49,209,158,231,121, 56, 59, 59, 79, 2,240,143, 52, 90, 36, 73,174, 27, 48, 96,192,152,125,251,246,201,159, 61,123, 38,119,117, +117, 45, 75,158, 77, 16, 68,173,203, 79,129, 87,102, 91, 57,195, 85,115, 30, 45,137, 68, 46,102,217,226,250,201, 41,247,134,188, +221,105,189, 21, 0, 92, 56, 63,101,136,131, 83,195, 72,137, 68, 30, 45,181,148, 29, 27,208,167, 91,211, 65,129,157, 8, 55,103, + 7, 36,166,164, 59,126,127,224,244,187, 33,167,207, 29, 67, 73, 2,177, 74, 97,116,217, 48,211,133,226,209,165,239, 96,223, 57, + 25, 27,126, 78,196,213,187,113, 80,229,101,162,142,147, 25, 86, 77,235, 1, 39, 27,121,237, 30,189, 28,124,186, 48,180,244,224, + 7,195, 71, 90,189,223,207, 95,228,233,228, 4,158,151, 34, 58,182,176,221, 47,103,206,181, 60,122,120,255, 36,115,145,207,208, +162,244,199, 70,223,220,154, 57,195,172, 72,135,126, 52, 69,124,216,190, 69,131,174,195,223,235, 72, 54,240,175,135, 7,247, 31, +246, 56,241,123,248, 42,242,202,253,223, 24,150,223,109, 46,198,241,219, 41,213, 38,244,123,201,112,116,237,218,173,163, 84, 42, +173,144, 60, 73,163,209,136,127,251, 45,180, 77,109,204,134,225, 63,180, 90, 13, 41, 18, 73, 64,146,196,103, 1, 1,141,252, 51, + 51, 51,207, 17, 4,241, 67,114,178,105,209,130, 41,128, 36,135,166,155,147, 82,169, 51,171,213,218, 1, 0, 33,145,228,196,145, +100,163,121,115,231, 42, 40,138,226,178,178,178,160, 82,169,136,241,227,199,203, 98, 99, 99, 7, 36, 37, 37,125, 87,195, 19, 9, +182,111,223,238,235,236,236,252,210,232,177, 41, 41, 41,146,190,125,223,175,205,161,247,109,220,164,217,244,211,167,127,245,207, +207,206, 41,222,190,118,235, 45,189, 76,174,169,235,239, 39,218,180,109,151,213,132, 49, 35,166, 68, 69,221,191, 3,211,198,171, +243, 48, 51, 51, 59,182,122,245,234,128, 46, 93,186,136, 28, 28, 28,144,150,150,134,135, 15, 31, 6,252,254,251,239,253,118,237, +218, 53, 67,173, 86, 15, 0,140, 26, 16,213,231,183,221, 63, 56,152,219,218,129,213,235,225,210,184, 89, 89,126,179,152,223,207, +128,209,233,192,233,245,240, 15,236, 87, 26, 77,230,225,239,239, 95,219,172,187, 46, 13, 27, 54,220,179,116,233, 82,177, 70,163, + 65,120,120, 56,206,157, 59,199,165,164,164,212,148, 16,151, 38, 8,226,204,194,133, 11,221, 58,116,232, 96,145,153,153, 9,150, +101,237,143, 31, 63, 62,169,105,211,166,150,238,238,238,146,221,187,119,163,176,176, 16, 12,195,216,122,123,123,219, 14, 31, 62, + 92,187,123,247,238, 25, 0, 86, 84, 21,201,202,143,229,231,167, 16,222,239,250, 53, 31,133, 84,226,215,119,167,191,139, 95, 44, +223, 34,202, 34, 91,239,122,123, 91,228, 39,201,103, 41, 44, 27,217,230, 39,133,206,122,215,219,123,251,175, 79,140,122, 24, 34, + 75, 11,155, 15, 14, 28, 56, 32,127,248,240,161,220,223,223, 31, 28,199,149,101,224, 55, 36,156,245,241,241,169,205,126, 92, 30, + 20, 20, 52,107,200,144, 33,104,220,184,113, 89, 82,212, 47,191,252, 18,179,102,205,178,185,112,225,194,140,253,251,247,207,248, +241,199, 31, 87, 0,152,109, 98, 52,198,128,169,199,248,171,167, 79,159, 14, 62,118,236,216,136,153, 51,103,250, 0,152, 12, 96, + 65, 86, 86, 86,167,210,104,140,164,212,104,141,157, 49, 99,198,199,179,103,207,198,123,239,189,183, 32, 60, 60,252,155, 90, 70, +249, 40,134, 97,222,235,219,183, 47,165,215,235, 97,110,110, 14,189, 94,255,214,171, 6, 37, 0,108,156, 56,113,226,199, 65, 65, + 65,176,177,177,129, 94,175,247, 61,112,224,192,246, 5, 11, 22,180, 5, 48,174,138,117, 29,245,241,199, 31, 15, 28, 57,114, 36, + 90,180,104, 1,154, 46,217,141,171, 87,175,198,226,197,139, 21,103,206,156,233,183,123,247,238,126, 39, 78,156, 56,138,138,195, +118,153, 4,199,113,160,105, 26, 9, 9, 9,112,112,112,144,114, 28,119,154, 32,136,109,217,217,217, 63,254,131, 10,243,149,131, + 7, 15,254, 96,223,190,125, 10, 0, 88,181,106, 21,166, 79,159, 14, 71, 71, 71, 40, 20, 10,193,234,252,115, 34, 90, 19,106,140, +104,213,132, 74,165,106, 54,231,211, 15, 65,146, 37, 79,141,245,234,122, 96,217,220, 9,196,137,144,211,205,170,141,193,203, 92, +240,232,210,119,144,186, 79,131, 70,207,224,218,221,167, 56,187,170,103, 73,105,217,107, 30, 52,186,174,134,194,198, 86, 98,102, +182, 82,203,178,151,225,228, 20,142,231,207, 51,106, 50, 89, 74, 39,199,144, 45, 91, 86,152, 5,188,229, 7, 29,163, 71, 82,122, + 18, 8, 66, 10, 55, 87, 11,140, 29,213, 75,212,169,147,139,253, 87, 95,109, 61,149,202,161,191, 42,243,113,141, 9, 67,125,237, +177,179, 89,128,207,144,225,189, 59, 72, 27, 5, 52,132, 88,106, 86,246, 93,243, 22, 45,208,188, 69, 11,114,118, 97, 65,247,235, + 55,110,117, 63,114,230,154, 70,165,127,126, 40, 58, 19,163,107,184,201,148, 25,142,169, 83,167,194,209,209,177,194, 2,105,105, +105,248,253,247,223, 42,253,141, 9, 55,178,178,255,248,230,155,111, 44,114,114,114,122,237,216,177,227, 29,142,227,190, 73, 77, + 77,189,100,140,200, 72,160, 78,158, 84,218,117,204,154, 53, 92,211,247,223,167,172,157,156, 72,142,101,137,228, 39, 79,236,214, +126,247, 93,231,236,152, 24,179, 34, 91,219,236, 28,181, 90, 21, 29, 29, 13,153, 76, 70,208, 52,221,178, 18,169, 52,158,199, 74, +146, 36,102, 17, 4, 1,169, 84, 22, 29, 20, 20,116,187,244,187, 58, 39, 79,158,148,247,233,211, 71, 5,224, 25, 0, 72,165, 50, + 87,138, 34,125, 75, 50,177, 99,165, 49, 6,211,220,220,252,211, 37, 75, 87,152,231,103,231,170,117, 69, 69,122,165,165,130, 32, + 20, 22, 84,126, 94, 65, 65, 82, 74,134,102,222,162,197,212,196,177, 35, 63, 45, 42, 42,154,100,172,201,106,210,164,201,245, 99, +199,142, 57,216,217,217, 33, 55, 55, 23, 89, 89, 89,184,126,253, 58, 56,142,195,128, 1, 3,164,237, 90,183,106, 54,119,222,252, +171, 9, 73, 73,109,141, 49, 91,230,182,246, 88,213,161,105, 73, 97,253, 44,171,236,248,108, 27, 28, 88,182,204,226,196, 60, 67, +116,238, 85,134,144,106,219,181,107, 87, 49, 0,140, 27, 55, 46,191,160,160, 96, 25,128,125,168, 57,163,255,140,249,243,231,187, +214,173, 91,215,115,223,190,125, 40, 44, 44, 4, 0,135,186,117,235,194,215,215,151, 13, 11, 11,131,175,175, 47, 44, 44, 44,112, +225,194, 5, 92,189,122, 21, 45, 90,180,176, 16,139,197, 67,116, 58, 93,165, 70,171,115,207,206,243,165,125,252, 59,250, 53, 31, + 5,133,165, 51,182,239, 63,136, 71,183,118,117,212,232, 30,206, 23,179,231, 71,170,121,233,232,140,120,197,236, 58, 45, 58,217, +213,107,248, 62, 60,155,223,182, 47,102, 47, 62,215, 9,111,111, 0, 0, 32, 0, 73, 68, 65, 84,157,223,189,238,114, 90, 86,188, +107,209,154,148,172,170, 76, 22,128, 85, 3, 6, 12, 24,124,224,192, 1,107, 0,136,136,136, 64, 90, 90, 26,148, 74, 37,100, 50, + 25, 68, 34, 81,217,248,164,181,100,244,166, 77,155,202, 76, 27,195, 48,101,163, 0,200,229,114,188,253,246,219,104,218,180, 41, +126,252,241,199,209, 85, 24,173, 14,173, 91,183,222,235,233,233,233, 94,254,195,162,162, 34, 12, 27, 54, 12, 0,208,169, 83,167, +174,102,102,102,188,193, 16,166,164,164, 20,222,184,113,163, 59,128,240, 42,156,165, 58, 41, 41, 9, 95,124,241, 5,226,226,226, + 62,217,178,101,203,115, 0, 50,137, 68, 82,246,124, 12,192,183, 97,195,134,235,166, 79,159,142,216,216, 88, 60,120,240,224, 58, +106, 95,149,202,154,155,155,199,232,245,250, 22, 12,195, 64,173, 86,163,127,255,254,178,163, 71,143,166, 81, 20, 21,149,153,153, + 57, 2, 37,109, 82,140, 69, 6, 96, 77, 80, 80,208,199, 51,103,206,196,111,191,253,134, 19, 39, 78, 96,228,200,145,152, 54,109, + 26, 20, 10,197,152,105,211,166, 93, 69,201,128,230, 47,210,117,211,166, 77, 96, 89,246,165,107, 67, 38,147,161, 67,135, 14,104, +208,160, 1, 78,156, 56,209,245, 21,140,150,103,135, 14, 29, 36, 28,199,161,168,168, 8, 97, 97, 97, 10, 51, 51, 51,133,155,155, +219,120, 0,255, 24,163,229,233,233, 25,116,224,192, 1, 69,249,218, 31,169, 84,138,114,231,129,192,223, 31,209,170,246, 9,171, + 12,173, 86,165,163,105, 50,202,197,185,241,161, 11,231,167,148, 85, 29, 2,100,148, 86,171,210, 1, 0,203,241,200, 87, 49, 48, +147,146,120,150, 90,128,251, 79, 50, 43,147,170,208, 69, 83,100,230, 1,105,171,103,224,121, 30, 90, 29, 11, 77, 94, 42,150,157, + 82,225, 97, 98, 49,180, 69, 57,208,234, 74,154, 97,217,219,219,211,167, 79,255, 50, 61, 52,244,247,143,255,247,191,255, 81,137, + 86, 86, 15, 10,128,102,149,105,218,216,120, 91,112, 18,201,161,205, 91, 22,152,241,212, 19, 68,199, 23,161,158, 91, 43,216, 91, +187, 35, 53,179, 8,151, 31,252,140,168,199, 33,168,235,236,137,105,159,190, 43, 91,178,116,223, 65, 49,227,229,145,155, 27,151, + 95,213,122, 26,158,162,182,254, 26, 13, 38,251, 9,216,172, 88,176, 5,201, 47, 45,160, 80,122,160,121, 23, 87, 40,221,223,146, +142,158,182,120, 20, 80,193,104,149,215, 76, 35, 8,114, 51, 73, 18, 31, 19, 4,129,198,141,155, 36,174, 89,179,166,178, 84,224, +186,198,141,155, 36, 82, 20,233, 86,114, 99, 39, 55,241, 60,151, 86,195,122, 86, 48, 53, 18,137,116,102, 73,216,223, 57,225,212, +169, 83,186,193,131, 7, 99,245,234,213,146, 89,179,102,205,163, 40,106, 92, 37,213,123, 21, 52,251, 3, 30,214,111,189,213,227, +155,203,151,121,145, 94, 79,100, 95,191,158,159,155,146,194,164, 22, 20, 72, 14, 71, 69,189,247,209,231,159, 75,220,221,221,113, + 41, 36,196, 46,163,168,136,207,213,104,212,185,185,185, 60,195, 48,215,171,208,156,163, 84, 58,200,183,111,223,238, 27, 20, 20, +116, 59, 37, 37,101, 14, 0, 56, 59, 59, 47, 3,208, 0,192,179,114,159, 97,203,150,131, 73,227,199,143,143, 78, 79, 79,159, 83, +221,122,150,163,161,131,210, 65,190,127,235,238,123,182, 22,102,164,210,205,133, 20, 89, 91,211,140,196, 76,204, 1,234,186,238, +111,153, 3,104, 88,197,111, 95,212, 36,204,204,204,142,253,244,211, 79, 14, 34,145, 8, 44,203, 66,169, 84, 34, 46, 46, 14,185, +185,185, 40, 40, 40,192,211,168,135,240,114,119,199, 87,179,103, 57, 79,158, 53,251,152, 74,165,106,241, 66, 97,246,242, 0,200, +122,221, 75,145,189,202, 70, 49,120,177,218,203,200,227, 94,158,184,248,248,120, 40, 20, 10, 4, 4, 4, 40, 46, 95,190,124,177, + 26,147, 85,126, 16,224, 33,237,219,183,183,216,183,111, 31, 90,180,104, 1, 43, 43, 43,132,133,133, 33, 34, 34, 2, 58,157,142, + 44, 44, 44,132, 66,161,192,242,229,203,225,225,225,129,130,130, 2, 60,123,246,204, 78, 36, 18,217,191,144,209,190, 76, 51,236, +116,216,146,188,216,115,243, 83,137, 95,223,221,190,255, 32,198, 15, 31, 10, 39,254,201, 69,171,183,136, 37, 61,250,180,255,146, +167,220, 3,205, 45, 26,219,248, 4,244,129, 88,162,192,228,153,139, 17, 29,121,210, 70, 85,112,239, 19,130, 77,112, 95,180,230, +240,212, 74,182,157, 0, 64,186,187,187,127,116,248,240, 97,139,178,208, 11, 69,149,141,121, 88,126, 16,248,106, 6,124,175,113, +127, 18, 4,129,184,184, 56, 56, 56, 56, 64,161, 80,148, 13, 32,254,240,225, 67, 92,187,118, 13,134,209, 40,170,208, 28, 17, 26, + 26,234,110,110,110, 94, 97, 1,158,231,145,153,153, 9,134, 97, 32,151,203,193,178, 44,116, 58, 29,244,122, 61,138,139,139, 21, + 13, 26, 52,152,164,215,235,195, 43,211,228, 56,238,179, 33, 67,134,180, 15, 15, 15,247,254,238,187,239,160,213,106, 87,165,166, +166, 98,224,192,129,224, 56, 14, 93,187,118,109,195,243,252,163,121,243,230, 1, 0,166, 79,159,174, 47, 42, 42, 10,170,205,182, +151,210,160,121,243,230,222,191,253,246, 27, 58,118,236, 8,141, 70,131,213,171, 87, 91,110,217,178,197,114,247,238,221,202,153, + 51,103,254,144,145,145,209,179, 6, 77, 2,192, 42, 39, 39,167,143, 59,119,238,108, 86, 58,134, 41,118,237,218,133,175,190,250, +234, 0,128,121,191,252,242,203,194, 19, 39, 78,140,250,232,163,143,240,213, 87, 95, 77,203,205,205,221, 81,149,230,211,167, 79, +161, 84, 42, 97,105,105, 89,114,179,212,233,112,231,206, 29,156, 61,123, 22,245,235,215, 55,102,155,170, 90, 79,207, 1, 3, 6, +252,176,127,255,126,139,132,132, 4, 92,184,112, 1, 94, 94, 94, 80,169, 84,198,140, 13, 27,250, 39, 20,216, 85,106,170,213,234, +226,248,248,120,197,138, 21, 43,224,236,236, 12, 79, 79, 79,200,100, 50, 16, 4, 1,189, 94, 95,221,240,106, 53,174,103,167, 78, +160, 51,147,108,250, 90, 89,219,124,194,243, 60,157,151,151,179, 85,135,220, 35, 79,158, 64,251, 23,110,251,191,153,102, 0,110, +163,226,152,135, 41,101, 70, 43, 36, 36,132, 15, 12, 12, 36, 12,115, 87, 87,228,103,102,218, 68, 59, 56, 53, 58,232,224,212,176, +116,220, 47, 50,138,162,108,162, 29, 29, 85,249, 0,160, 99,120, 92,137,202,197,189,152, 84, 68,196,164,194, 92,106, 92,240, 69, +163, 99, 74, 90,172,242, 60,138, 11,255,120,104,213,169,114,160,209,149, 52,247,208,106, 84,200,203,120, 64, 12,238,223, 93,246, +241,199, 19,225,236,236,170,172, 74, 79, 39,149, 77,155, 60,253, 61,107, 91,107, 17, 66, 46,255,138, 54,245,251, 67, 38, 21, 33, + 43,175, 24, 32,128,199, 79,206, 2,156, 5, 34,163,227,209,186,161, 28, 61,123,248, 43,126, 60,242,232,115, 0, 11,140, 89, 95, + 38,241, 58,196, 62,189, 32, 98,245,208,103, 62, 2,151,251, 28, 48,119,130,154, 80, 32, 43,229, 57,162, 46, 30, 53,234,153,145, +227,184, 79,236,237,237,115,231,205,155,215,185, 94,189,122,186, 73,147, 38,221,125,254,252,249,103, 47, 60,173,124,187,105,211, + 38,196,196,196, 36,125,243,205, 55, 97,153,153,153,243, 77, 60,208,179,121, 30,193,165, 85,113,153,199,143, 31,111,126,254,252, +249,105,193,193,193,142, 83,166, 76,145, 76,153, 50,101, 44,128,175,171,171, 46,204,151, 74,187,125,115,225, 2,207, 36, 38,106, +246,172, 95, 47,217,120,229,202, 60, 29,199,185,216, 59, 56, 16,237, 90,183, 46,146,147,100,102, 86, 90, 26,163,244,246,166,226, +206,158,181,227,205,204,146,127,249,229,151,252,194,194,194, 42,135,206,161, 40, 74, 85, 89,117, 97,101, 56, 59, 59,107, 43,107, +195, 85, 77,129,152,207,241,188,206,186,110, 93,190, 71,215,182,245, 98, 30, 61,121, 34,179,182,166,124,234,121,249,221,143,138, +187,206,179,108, 49, 65, 16,249, 70,213,149, 80,212,208,224,224,224, 70,150,150,150,224, 56, 14, 86, 86, 86,200,200,200,128, 86, +171, 69,126,126, 62,180, 5,121,208,230,229, 33,226,121, 28,218,119,238,140,193,239,246,240,223,125,252,167,161, 44,203, 30,168, +182, 62,175,113,179,178, 72,214,226, 58,118,127,212, 5, 37,228,150,153,174, 21,205,124, 32, 86, 40,208,253,179,217,175,114,161, +223, 62,117,234,212,207, 3, 6, 12,120,239,243,207, 63, 39, 83, 82, 82,126,141,139,139,107, 15,224, 65,117, 63, 82, 40, 20,111, +101,102,102,162,176,176, 16, 86, 86, 86, 8, 14, 14,134,163,163, 35, 84, 42, 21,110,220,184,193,187,185,185, 17, 97, 97, 97,112, +115,115, 67, 86, 86, 22,116, 58, 29,212,106,117,170, 86,171,173,178,186,188,180,122,176,215,244,119,241,203,163, 91,187, 58,186, + 18, 79,111, 12,153,209, 41,230, 81, 68, 84,252,153,179,151,191,102,138,101, 9,185,137,161,179,234,182,188,109,255,201, 23, 95, + 97,195,170,133,120, 20,126, 33,219,209, 35,127,163, 25,161,217, 89,221,250, 22, 21, 21, 21, 71, 69, 69, 89,220,189,123, 23, 4, + 65,192,202,202, 10,114,185,188, 82,179, 85, 11,200,242, 17,168,162,162, 34,136,197, 98,216,217,217, 97,199,142, 29,101, 5,175, +151,151, 87,117, 26, 91,187,119,239, 62,212,195,195,195,162,252,135, 45, 91,182,196,196,137, 19,177,121,243,102, 92,185,114,165, +194,120,154,169,169,169, 41,122,189,190,186,237,206, 77, 75, 75,123,183,127,255,254,183, 46, 94,188,104,185, 99,199, 14, 48, 12, + 83,233,180,125,251,118, 92,187,118,109, 1,128,168, 90,158, 71,245, 7, 14, 28,120, 97,239,222,189,214, 25, 25, 25, 48,156, 27, + 69, 69, 69, 96, 89, 22,126,126,126, 4,195, 48, 53,181,123, 35, 41,138, 58,190,126,253,250, 62,227,199,143, 7, 77,211,208,106, +181, 88,191,126, 61,102,205,154,149, 86,250, 80,170, 3, 48,111,231,206,157,163,222,127,255,125, 52,105,210,196,255,220,185,170, + 91,118, 20, 22, 22,162,176,176, 16, 34,145, 8, 78, 78, 78, 88,178,100, 9,180,218,146,219,138,175,239,255,217,187,238,176, 40, +174,246,123,102,182,194,238,210,123, 81,172,160, 96,239, 5, 69,108,104,236, 29, 75,236, 26, 21,123, 67,141, 53, 81, 76, 52,177, + 43,214, 24,236, 61, 17, 27,138,138, 5, 43, 29, 81, 84,122, 19, 16,150,182,125,103,103,126,127, 80,130, 72, 89,208,228,251,126, +249,246, 60,207, 62,187,179, 59,115,246,157,123,239,204, 61,243,222,123,223,215,169,236, 50, 6,112,208,201,201,105, 72,108,108, +236,118, 20,207, 93,251, 12,214,214,214, 35, 24,134,153,165,209,104, 10,123,244,232, 97,118,250,244,105,131,180,180, 52,132,132, +132, 96,237,218,181, 98,154,166, 53, 52, 77, 19, 50,153, 44,222,210,210, 50,132,207,231,235, 75,165,210,220,156,156,156, 45, 0, +110,254,167,122,114,130, 32, 8, 14,135,131,233,211,167,131,205,102, 67, 95, 95, 31,114,185, 28,106,181,186, 76,204,163,150,195, +210, 77,155,138,204,216,224,206, 52, 49,112, 89, 52,102,225, 96, 11, 27, 91, 59, 24, 27,242, 17, 19,243,170,251,221,192,219,123, +120,236, 55,190,180, 82,237,251, 38, 49,255,111, 79,118, 95, 81,139,252, 63, 21, 90,159,229, 60,100, 87, 94,153, 99, 52, 12,115, +254, 99, 90, 26, 79,197,227, 9, 98, 75,189, 92, 86, 86,210, 2,130, 24,163,177,104, 49, 12,148, 74, 93,114,163, 96, 74, 94, 90, + 10, 45,181, 6,239,222, 68,225, 97,192,159, 48,151,166,225, 99,124, 91,128,219, 10, 74, 89, 62,228, 74, 85,137, 40,209, 32, 60, + 36, 16, 5,249,185,104,217, 97, 48, 64,146, 79,171,226, 51, 50, 35, 6,119,107,223,154,245, 46, 57, 10, 29,157, 70,163,177,125, + 15, 36,101, 20, 32,175, 72, 1,113,129, 28,109, 91,122, 35, 91, 44, 67,129, 84,142, 87,239,252, 96,103,219,152, 36,216,113,125, +180, 21, 90,138, 87,151,160,120,253, 7,184, 14,221,193,107, 54, 20, 44, 7, 87, 36, 71,220, 67,248,141, 29, 72,141,126, 4,134, +214,192,198,169,147,182, 23,201,158,155, 55,111,118,234,222,189, 59,187,111,223,190,109,174, 95,191,222, 38, 35, 35, 35,188, 68, + 96,180,233,219,183,111, 27, 11, 11, 11,236,218,181, 75, 70, 16,196,158, 58, 86,118,153, 7, 44, 43, 43,235, 57,128,205,151, 46, + 93,218, 51,123,246,108, 88, 90, 90,182, 74, 79, 79,175,242,192,108, 14,167,205,148, 45, 91, 24, 14,139,197,156,217,187,151,187, +241,230,205, 95,126, 59,126,156,219,219,221,157, 96, 24, 6, 97, 97, 97,130,159,246,238, 21, 76, 24, 54, 44, 49, 41, 43,139, 10, + 10, 14, 86,101,164,166, 22,102, 73, 36, 27, 51, 50, 50, 62,252, 39, 90,182, 90,173,126, 18,159, 16,111,215,161,115, 91,139,208, +152,248,104,143,222,221,186,145, 36, 73,190,137, 75, 10,182,176, 48, 20,220, 14,184,173, 82,171,213, 79,180,225,226,243,249,131, +123,247,238,205, 22,139,197,176,181,181, 69,118,118, 54,210,210,210,138, 61, 14,249, 98,168,242,243,161, 46,200,131, 70, 82,132, +248, 23,207,209,182,113, 35,254,121, 62,127,176, 84, 42,173, 86,104,149, 62,101, 86,150,232,186,244, 59,158,129, 1,120, 34, 17, +136,218, 15, 27, 14, 51, 54, 54, 94,153,151,151,119, 29,192,143, 42,149,202,107,229,202,149, 29,119,239,222,109,190,121,243,102, +195, 89,179,102,157, 47, 42, 42,106,139,226,164,170, 85,117, 96,239, 41,138, 50, 3, 96, 21, 24, 24, 8, 75, 75, 75,228,231,231, +151,122, 90,148, 82,169, 84, 47, 39, 39, 7, 10,133, 2, 74,165, 18,134,134,134,120,249,242,101, 46, 69, 81, 87,107, 50,206,176, + 9,241,163, 66, 21,243,189,153,179, 48, 93, 69,153,184,101,229,210,226, 13,191,100,108, 2,240,203,128,198,141, 15,171,232, 7, +241,111,163,174,154, 36,188,184,159,155,254, 86,210,248,200,245,248,234,230,104, 49, 0,104,130, 32, 24, 39, 39, 39,100,103,103, +131,197, 98, 65, 32, 16, 64, 36, 18, 97,213,170, 85,216,179,103, 79, 93,132,150,158, 80, 40,220, 66,146,228, 56,146, 36, 45, 52, + 26, 13,188,189,189, 49,100,200, 16,240,120, 60,168, 84,170, 50,143,102,169,151,170, 6, 79, 71,216,211,167, 79, 13,159, 62,253, +228,182,229,110,110,110,126, 87,161, 80, 32, 46, 46, 14, 87,174, 92,233, 5, 32,168,150,117, 29, 23, 22, 22, 54,192,213,213,245, +247,246,237,219, 55, 97, 24, 6,173, 90,181,130,167,167, 39,252,252,252, 16, 30, 30,142,252,252,124,250,246,237,219,191, 1,216, + 94,219, 62,188,164,124,155,141, 26, 53,234,209,169, 83,167, 76,114,114,114, 32,147,201, 32,145, 72,112,254,252,121,116,239,222, + 29,230,230,230, 56,121,242, 36,197, 48, 76,117,117, 79,146, 36,121,196,215,215,119,200,140, 25, 51,176,111,223, 62,156, 57,115, + 6, 67,135, 14,197,184,113,227,144,157,157,109,181,109,219,182,201, 37,195,132,235, 61, 61, 61, 81, 84, 84,132, 23, 47, 94,196, +104,121,205, 35, 47, 47, 15,121,121,121,208,215,215, 47,127,141, 17, 0,252,118,236,216, 49,126,209,162, 69,104,220,184,241,250, +248,248,248, 29,168,100,149, 40, 77,211,223,165,165,165,153,176,217,108, 51,138,162,144,146,146,130,151, 47, 95, 98,222,188,121, +185,185,185,185,179, 1, 36, 1, 88, 51,125,250,244, 31,151, 44, 89, 82,214,150,150, 44, 89,226,127,253,250,245, 1,255,180, 55, +199,201,201,184, 5,143,197, 95, 40, 46,100,153,137,197,226,178,123,135, 82,169,132, 66,161,248,196,147,197,229,114,204, 58,182, +173,127, 77, 38, 45, 92,253,234,109, 94,149, 9,210,157,155, 24,181, 22, 8,141, 22,117,239,209,123, 98,255, 1,195, 89,148, 90, +141, 91,183,174,226,232,209,253,112,119,117, 66,227,166,173, 48,127,193, 66, 35,133,146,242,190,125,251,230, 74,227,167, 15,111, + 22, 22,228,173,170,142,243,127, 28,215, 74,196,213,181, 74,135, 14, 43, 83,144, 37, 33, 28,196, 37,155,230, 38, 38, 38,123, 53, + 26,141,187,161,161, 33,232,188, 88,188,122,249, 12,185, 98, 14, 20, 50, 13,104,166, 88,108,105, 37, 92, 20, 74, 60,184,245, 7, +118,238,248, 5, 57, 57, 57,112,237,217, 11, 69,236,122,168, 95,175, 62,228, 50,105,201, 69, 3,168,148,106, 88, 88, 57, 32, 52, + 52, 92, 93, 32,145, 84,121, 67,226,234,169,156,235, 91, 57, 65,161,234, 10, 61, 30, 15,249,133, 74,136, 75, 68,214,201, 11, 99, +161,144,202, 64, 41, 85,160,148,106, 88,212, 31,133,230, 86,189, 65,107,174,182,168, 85,241,209, 26,168, 18, 30, 64,149,240, 0, +250, 93, 23,224, 79,159,241, 21, 58, 82,237,242,238,102,103,103,103, 69, 71, 71, 95, 13, 11, 11, 27, 49,118,236, 88,220,187,119, +111, 22,128, 57, 37,195, 55,179,198,142, 29,139,176,176, 48, 68, 71, 71, 95,205,206,206,206,250, 26, 53,207,227,241,100, 10, 69, +113, 31, 43, 16, 8,244,106,216,215,174,227,200,145,100,126,104,104,193,142,199,143,215, 31, 62,114,132,219,183, 79, 31, 66, 77, + 81,160, 53, 26, 52,117,116, 36,250,247,239, 47,244, 59,119,206,140,165, 86, 63, 93,238,229, 21,120, 96,210,164,194,231, 18,137, +182, 19,205, 27,148, 12, 25, 2, 64,131,106,190,211, 26, 10,133, 98,247,119, 51,167,246, 13,122,240,168, 94,253,122,118,134,183, +110, 7,133,243,245,121,100,227,134, 77, 88,226,252, 92,246,166,245,171,245, 21, 10,133,182,162,213,217,220,220, 28, 31, 62,124, +192,187,119,239,160, 80, 40,160, 86,171, 65, 75, 37, 80,138,243,160,204,207, 5, 33,151,129,175,209, 64,254, 49, 19, 13, 26, 55, + 2,254, 90,145, 88,227, 80, 84,101, 66,171,244, 93,207,208, 16, 92,161, 8, 36,135,163,117,114,116, 0,237, 59,117,234,116,238, +226,197,139,220,105,211,166,117,190,115,231,206, 94, 0, 73,105,105,105,125,214,174, 93,251,124,239,222,189,252,217,179,103, 55, +219,190,125,251,100, 0, 7,171, 34,145,203,229,231,174, 93,187, 54,193,193,193,193, 42, 50, 50, 18,114,185, 28, 52, 77, 99,224, +192,129, 64,241,220, 26, 0,192,155, 55,111,100,114,185, 60, 43, 42, 42,170, 32, 41, 41, 73, 5, 45, 86, 9,110,216,157,241,164, +224,195,131,145, 86,214,118, 79,245,244, 27, 52,100,138, 66, 71, 44, 30,109,183,109,199,133, 52,249,205,184,184,194,239,251, 53, +218, 42, 41,140,152,103,108, 95,180,239,166,127,188, 54, 19,225,203, 86, 23,154,153,153,129,205,102,131,195,225,128,203,229,130, + 32, 8, 44, 88,176, 0,135, 14, 29,170,105,232,240, 19,145,101, 96, 96, 16,189,113,227, 70,251,217,179,103,115,245,244,244, 32, + 22,139,113,242,228, 73, 76,159, 62, 29, 71,143, 30,173,116,254,139, 22, 67, 74, 21,189,165,139, 38, 77,154, 4,165, 82, 9, 79, + 79, 79, 28, 62,124,120,145, 70,163, 9,170,195, 37,253, 52, 60, 60,220, 49, 60, 60,220, 16,192,208,113,227,198, 29, 31, 53,106, + 20,130,130,130,112,245,234,213, 94, 40, 94,244, 33, 3,224, 3,192,178,228,189,186,235, 83,104,101,101,181,159,166,233,161, 22, + 22, 22,225, 78, 78, 78, 45, 79,157, 58,101,156,149,149, 85,186,248, 1, 9, 9, 9, 56,118,236, 88,198,145, 35, 71, 10, 52, 26, +141, 25, 73,146,215,242,242,242, 86, 85, 35,216,142,236,216,177, 99,106,201,112, 32, 46, 94,188,200,252,242,203, 47,196,218,181, +107, 33, 22,139,225,238,238, 14, 95, 95,223,133, 69, 69, 69,109,126,249,229,151,153, 99,198,140,193,166, 77,155, 32,145, 72,118, +212,244,176, 82,141,248, 34, 0,116,219,177, 99,135,195,162, 69,139,112,241,226, 69,180,111,223, 94, 63, 62, 62,254, 0,128, 25, +149,213, 31,195, 48,136,143,143,135, 84, 42,197,163, 71,143,176,126,253,122,113, 57,145,181,112,206,156, 57, 63, 46, 92,184, 16, + 91,182,108, 97, 34, 35, 35,179, 70,141, 26,101,117,232,208, 33, 86,211,166, 77, 23, 74,165,210,127, 76,104, 53,107,106,186,181, + 99,251, 30, 43,109,236,154,226,228,169,211,200,205,205, 45, 43,147,210,114, 97, 24, 6,133,133,133,248,240,225, 3,140, 12, 13, +176,109,251,143,223,204,157, 53,181, 30,138,195, 96,124,238,178,108,108,178,125,212,184,105, 75, 61, 39, 76, 69,100,120, 8,252, +142, 31, 68, 84,100, 88, 25, 31,165, 86, 33, 54,230, 37, 98, 99, 94,194,202,218, 1,253,251,246, 34,198,143, 31, 63,112,210,132, +113, 22, 0,254,182,208, 17,255,143,189, 89,192,231,113,180, 14,125, 34,180,106,112,215,153,155,152,152, 68,159, 61,123,214,204, +213,213,149, 69, 81, 20,110,222,186,133,121,115,190,197,228, 73,222, 80,193, 4,148,146, 11,154,171,167,149, 37, 50,153, 20, 12, + 24, 72, 36, 18, 4, 7, 7,131,161, 41,248, 29,250, 5, 12, 67,151, 9, 45,128,129, 82,165,130, 93,253,102,216,127,120, 51, 5, + 14,231, 57,212,149,135,174, 41,200, 97,105,212, 20,131,180,172,100, 36,103, 68,193,200,160, 62,216,156,250,200,201,147,130, 77, + 90, 67, 45,127, 3, 77,201,177, 82, 73, 42,100,170, 47,171, 63, 77, 37,222, 83,166, 22, 55, 93,153, 76,118,226,196,137, 19,223, +252,250,235,175,188, 65,131, 6, 57, 93,184,112,161, 27, 0, 12, 26, 52,200,201,208,208, 16, 39, 78,156, 80,202,100,178, 19, 95, +209,227,211,187, 83,167, 78, 16,139,197, 72, 72, 72, 8,175,246,220,148, 74, 51,145,165, 37, 43,235,222, 61,117,182, 88, 92,175, +119,239,222,132,154,162, 64, 18, 4,114,243,243,145,148,152, 8, 99, 99, 99, 34,250,205, 27,209,158,249,243, 47, 59,181,108,201, + 46, 93,145,168, 13,174, 94,189, 42, 64,241,188,172,106,191,171, 37, 36, 89,153, 31,166,122,121,121, 93, 62,113,226,164, 81,102, + 86,102, 44,159,199,163, 68, 34, 61,219, 73, 19,231,178,243,242,242, 38, 0, 40,210,150, 76, 44, 22, 35, 62, 62, 30,250,250,250, +224,114, 56,160,101, 82,104, 36, 69,144,231,102,131,165, 82,130,167,209,192, 84,192, 71, 61, 43, 43,212,183, 48,215,138,243,221, +221,128,178,137,239,229,135, 11,183,117,114, 6, 79, 40, 2,207, 64,132,185,254,247, 75,158, 70,185,192,218, 31,180,161, 53,183, +179,179,251,243,212,169, 83,220,236,236,108,132,133,133,133, 3,200, 7, 96, 0,128,142,137,137,185, 19, 21, 21, 53,184,100,213, + 93, 77,171,197,126,185,116,233, 82, 63, 87, 87, 87,170, 97,195,134,194,172,172,172,122, 98,177,152,206,200,200,248,196, 37, 20, + 16, 16,192, 47, 44, 44,148,208, 52,125,185, 68,100,213, 24,191,104,241,104, 59,189,224, 80, 44,112,243,104,208,202,208,188, 53, +114,169,208, 86, 79,195, 51, 22, 44, 30,109,183,123,199,133, 52,185, 62,161, 56, 78,104, 82,234,177,245,228,218, 78, 98,102,128, +226,185, 82,193,193,193, 72, 74, 74, 66,124,124,252, 39,130,106,214,172, 89,240,243,243,211,202,163, 37, 20, 10,183,108,216,176, +193,126,209,162, 69,220,114,162, 8, 94, 94, 94,200,207,207,199,225,195,135,225,229,229, 85,235,142,191, 2, 26,245,238,221,123, +144,141,141, 13,114,114,114, 96,109,109, 13, 87, 87,215, 33, 65, 65, 65, 13, 1, 36,212,177,221,207,245,240,240,248,113,227,198, +141, 80,171,213,152, 62,125, 58,222,190,125,123,238,237,219,183, 59,235,215,175,191, 96,197,138, 21, 86, 86, 86, 86, 24, 59,118, +172,144,162,168,145, 85,145,152,154,154,250, 28, 60,120,112,194,160, 65,131, 72,149, 74,213,243,238,221,187, 72, 76, 76,132, 82, +169, 4, 69, 81,120,255,254, 61,188,188,188, 50, 74, 86, 55,190,215,194,174,105,107,214,172,153,186, 96,193, 2,252,244,211, 79, +216,176, 97,195,111, 70, 70, 70, 45,219,182,109,219,110,195,134, 13, 88,190,124, 57, 28, 28, 28, 96,102,102,214,124,237,218,181, +206, 75,150, 44,193,238,221,187,177,126,253,250,223, 0, 28,171, 75, 65,208, 52, 77,108,221,186,181,205,142, 29, 59,108, 74, 69, + 22, 73,146, 56,123,246, 44, 66, 67, 67,135,196,197,197, 85,118,140,175,181,181,245, 44, 27, 27, 27,222,237,219,183, 69, 14, 14, + 14,160, 40, 74, 93, 34,178,246,212,175, 95,127,222,251,247,239, 49,104,208, 32,196,197,197,157, 0, 48,217,200,200, 72,178,100, +201, 18,129,190,190,190,145, 84, 42,253,167, 58,111,176, 72, 98,202,150, 77,203,241, 34,244, 13, 46, 93,226,226,197,139, 23,176, +178,178, 2,159,207, 7,195, 48, 80, 40, 20,200,206,206,134, 90,165, 64,171, 22,141,240,251,145,173,200,202,202, 6, 72,162,202, + 41, 55, 4, 73, 76,156,250,237, 8, 60,124,116, 11, 7, 14, 28, 68, 81,145,164,138,135,111, 61, 52,117,114,134,157,173, 37, 82, + 82, 83, 64,144, 48,255, 59,207,245,255,249,208, 97,217, 45, 8,218,132,119, 40, 15, 99, 99,227,157,103,206,156, 49,115,119,119, +103, 73, 36, 18,208, 52,141, 30,174,174, 88,176,104, 17,174,158, 58, 5,199,206,158, 32,148, 34, 80, 2,237, 86, 61,200,101, 82, +184,180,235,134, 49, 99,199, 33, 57, 41, 9, 30,131, 71, 65, 46,151,150, 61, 97,148,122,180,148, 74, 21,204, 45,235, 33, 32, 32, +128,133,233,211, 95, 97, 79,229, 78, 9,141,138, 23, 17,251, 94,222, 61, 79, 22,138,224, 23,126, 80, 41, 84,104,213,106, 45, 84, +180, 25, 44,237,103, 65,173,190,130,130,236,187,197,195, 24,102,238, 72, 77, 78, 6,201,226, 70,215,181, 4,105, 73,246, 23,221, +116,243,243,243,243,227,227,227, 47, 4, 7, 7, 79, 28, 57,114, 36, 2, 2, 2,102, 2,192,200,145, 35, 17, 28, 28,140,248,248, +248, 11,249,249,249,249, 95,163,182,109,108,108,134,246,234,213,203,179, 99,199,142,240,247,247, 7,195, 48, 15,181,186,176, 57, + 28,134, 36, 73,208, 52, 13, 2, 64, 78, 94, 30,222,190,125,139,156,143, 31,161, 86,171, 33, 41, 42,162,157,157,156,138, 24,154, + 54,168,141, 61,229, 87, 24,162,146, 85,135,165,223,213,225, 84,147,158, 63,125,156, 92, 88, 84,100, 97, 98,108, 82,200,227,241, + 52,226,188,188,252, 87,209,145, 74, 45, 59,135, 82,196, 68, 69, 69,181, 76, 79, 79, 71,114,114, 50, 40, 73, 33, 88, 10, 37, 72, +133, 20,125,186,117,133, 62, 24,232,129, 6,135, 86,131,195,226,160,176,120,117, 94,141,195, 29,154,114, 15, 9,165, 34,139, 32, +136,226,225, 66,161, 16, 60,145,193, 39, 30, 46,109,218, 19,159,207, 63,117,254,252,121, 27, 59, 59, 59,108,218,180, 9,246,246, +246,205,109,109,109,165, 70, 70, 70,250, 86, 86, 86,112,113,113, 65,183,110,221,112,227,198, 13,104, 81, 6, 20,195, 48,253, 31, + 62,124,184,244,241,227,199, 99,132, 66, 33, 49,127,254,124,246,192,129, 3,193,231,243, 33,149, 74, 33, 22,139,113,250,244,233, +143, 52, 77,151, 46, 74, 49, 19, 8, 4,199, 8,130, 72,144, 72, 36,139, 42, 18,254,254,107, 43,219,172, 92,122, 58, 83, 36, 24, +225,230,209,160, 85,111,143,190,104,228,216, 27,189, 61,146, 1, 96,171, 41, 59,209,243,231, 53,198,151,141, 13,136, 99, 1, 55, +111,175,119,117,235,189,102,101,209,189, 31,127, 58,148, 87,227,124, 58,130, 32, 64,211,244, 39,177,131, 42,254, 62,121,242,100, +156, 61,123,182,198,114, 36, 73,114,220,236,217,179,185, 21, 60,207, 72, 75, 75,195,224,193,131, 49,114,228,200, 79,132,150,185, +185, 57,172,173,173,145,152,152, 8, 0, 57, 90,182,171, 5,211,166, 77, 35,100, 50, 25,102,204,152,129,195,135, 15,195,211,211, +147, 8, 10, 10, 90, 0, 96, 81,109, 27, 59, 73,146,219, 86,172, 88,177,212,203,203, 11,185,185,185,184,126,253, 58, 6, 14, 28, +136,179,103,207, 90, 92,191,126,125,139,187,187, 59, 88, 44, 22,252,253,253, 65, 81, 84,181,177,190,184, 92,238,208, 65,131, 6, +145, 41, 41, 41,224,114,185,232,208,161, 3, 82, 83, 83, 33,149, 74,145,150,150,134,133, 11, 23,126,200,201,201,233,165,237,117, +196,229,114, 23, 45, 88,176, 0,103,206,156,129,183,183,247,113, 0, 51,242,243,243,199, 60,126,252,248,204,176, 97,195,144,150, +150,134,203,151, 47, 99,253,250,245,196,228,201,147,177,111,223, 62, 44, 92,184,240,183, 18,175, 83, 85, 13,191, 48, 43, 43,203, +168, 73,147, 38,200,204,204, 68, 81, 81, 17, 46, 95,190,108,121,227,198,141,134,118,118,118,134,241,241,241,154, 31,126,248,129, +183,104,209, 34,236,220,185, 19, 97, 97, 97,240,243,243, 67,239,222,189,169,184,184,184, 74,189,100, 37, 33, 27, 46, 51, 12,115, + 91, 40, 20,162,176,176,176,244,186, 91,230,237,237,237,229,227, 83,236,100, 79, 79, 79,199,148, 41, 83, 38, 5, 6, 6,210,238, +238,238, 2, 46,151, 11,185, 92, 46,249, 39,123,109, 90, 67, 3,160,209,176,158, 8,183,174, 30, 65, 72,120, 28, 66,194,163,192, +227, 23, 79,130,151,201,164,104,215,170, 41, 58,119,232,132,244,140, 52,156,240, 59, 2, 83,115,187,106,239, 35, 12,195,128,203, +214,192,217,201, 26,167,252, 14,194,255,122, 32,252, 78,156, 46,155,243,198,102,115,208,182, 93,103,116,232,224,138,184,248,247, + 56,114,228, 0, 44, 44,235,233, 6, 7,235,136,178,161,195,242,239, 21,148,127,111, 87, 87, 87, 86, 81, 81, 17,228,114, 57, 62, +124,248,128,196,196, 68, 24,155, 24, 35, 46, 61, 1,189, 4, 42,124,160, 11, 16, 19, 30,173, 33, 88,156,176,154,254,112,144, 91, + 91,192,173, 45,230, 77,243,172,230,145,149,129,208,208,188,120,232,134,162,222, 97,247,110,170, 42,161, 69,105,212,119,110,221, +190,219,105,218,228,161,156,128,187,135,161, 86,210,144,169,141, 32,145, 43, 33, 81,113, 64, 26, 13, 4, 62, 6,129,197,230,163, + 75,155,166,184,124,233,134,138,161,212,129, 90, 23,144, 85, 75, 80,153, 81,229,132, 86, 86,133,113, 7, 83,173,135, 14,203, 58, + 94,141,230,236,201,147, 39,135,119,237,218, 85,224,238,238,222,164,164,227, 84,157, 60,121, 82, 90, 18, 12,179,182,248, 36, 26, +188,181,181,117, 59, 46,151,235, 57,112,224,192,118, 83,167, 78,197,171, 87,175,112,226,196,137,216,166, 77,155,222,203,200,168, +122, 69, 54,139,199,203, 41,202,202, 50, 22, 53,108,200, 54, 49, 48, 72,191,113,253,186, 67,223,126,253,136,228,228,100,228,228, +228, 64, 46,151, 35, 44, 60,156,225,176, 88,169,132,161, 33,249, 38, 52,148,100,241,120, 57, 85,121, 27, 43, 65, 98, 13,171, 14, +125,234,234,221,170,103, 99,210,100,189,247,119,141,228, 10,121,203,130,130, 2,138,205,225,112,236,173,141,147,222,188,215,254, +158,168, 80, 40,252,239,220,185, 51,188,111,223,190,252,216,136, 48, 80,249,249, 80,230,139,193,165, 53, 48,109,215, 6, 44,149, + 2, 80,170, 97,231,204, 64,158, 39, 64,208,179, 55,106,133, 66, 81, 99, 80,195, 82,161, 69, 86, 16, 6, 60,145, 8,124, 3, 67, +240, 69,162,138,130,161,166, 39, 57, 65,255,254,253,251,116,233,210, 5, 12,195,224,208,161, 67, 80,169, 84, 60,149, 74, 5,165, + 82, 9,149, 74,133,130,130, 2,248,249,249, 97,255,254,253,143, 1,252,166,197,233, 83,250,250,250,195, 8,130,176,100,179,217, + 82, 11, 11, 11,225,217,179,103,203,194, 77,180,109,219, 22, 6, 6, 6, 92,148, 4,133,180,180,180,228, 28, 61,122,212,120,200, +144, 33, 15, 42, 29,238,104,213,124,121, 35,202,196, 77, 79,191, 65, 67, 67,243,214,104,228,216, 27, 0,208,111,240, 52, 52,106, + 90, 31, 5, 31, 35, 26,202,101,137, 35,184,108,177, 73,244,238,180, 87,250,131, 90, 78,149,100,221,127,139,202,151,247, 87,218, + 81,144, 36, 89,229,112,172, 54, 34,171, 88,179,144, 22,165,243,124, 0, 32, 39, 39, 7, 25, 25, 25,136,137,137, 65,179,102,205, +144,155,155, 11, 59, 59, 59, 40,149, 74,116,236,216, 17, 50,153, 12, 59,118,236,192,163, 71,143, 30, 3, 88,168,197,127,232, 59, + 58, 58, 78,105,215,174, 29,174, 95,191,142, 23, 47, 94,164,221,186,117,203,206,213,213, 21, 13, 27, 54,156,154,144,144,176,186, +100,168, 79, 91, 8, 93, 93, 93,231,123,121,121, 33, 42, 42, 10,223,125,247, 93, 78, 74, 74,202,229,115,231,206,205, 88,191,126, + 61,233,225,225,129,140,140, 12,108,219,182, 77,243,232,209,163,237, 0, 54,213, 80,142,175, 83, 82, 82,236,229,114, 57,114,115, +115, 65, 81, 20,164, 82, 41,110,220,184, 1, 63, 63,191,204, 18,145,245, 78, 91,227,218,180,105,227, 66,146, 36,206,156, 57, 3, + 0,223,163, 56, 98,255,229, 17, 35, 70,164,253,240,195, 15,118,171, 86,173,194,204,153, 51,161, 82,169,240,211, 79, 63, 97,213, +170, 85,215, 74, 68, 86,117, 55,209, 95,173,173,173,103,125,247,221,119,205,151, 44, 89,130,224,224, 96,203,151, 47, 95,118, 8, + 11, 11, 67,189,122,245,144,147,147,195, 54, 51, 51,195,206,157, 59,177,120,241,226,139, 0, 62, 62,121,242,100, 92,124,124,188, + 15,128,109, 53,136,118, 95, 59, 59,187, 89, 12,195, 48, 82,169, 52,209,219,219,123,219,230,205,155,177,120,241, 98, 68, 71, 71, + 35, 63, 63, 31, 6, 6, 6,196,138, 21, 43,166,124,255,253,247,152, 62,125, 58, 35,145, 72,246,255,211, 29, 53,195,104, 32, 21, + 71, 65,163, 48, 65,219, 86,205,208,182,101, 3,220,186, 27, 2, 0,232, 51,202, 21, 82, 73, 33,142, 31, 63,132,119,239,222,130, +205,225,192,216,212, 90, 27, 79, 32,148, 5,175,145,167,202, 64, 95,247, 14, 24,232,209, 11,191,253,126, 22,148, 90,133, 25,211, + 38, 64,156,151,135,223,127, 63,130,184,248,247, 96,115, 56, 48, 51,255,251, 3,161, 86,167, 69,254,223, 11, 45, 45,134,159, 64, +211, 52,210,210,210,240,242,229, 75, 36, 36, 36, 64, 32, 16, 64, 70,105,232, 3,119, 30,209, 4,193, 77,165, 25,230, 49, 67,149, + 69, 41,254,156, 67,163, 73, 43, 23,177,214,200,196,196,132,167, 80,200, 64, 81,234,114,189, 10, 1, 16, 0,151, 13,216,216, 54, + 66, 74,114, 10, 35,151,203,239, 87,251, 4,165,144,239,252,227,242,121,175,110,221, 93,205, 7,246,217,136,203, 87,214, 66, 92, + 80, 0,185,138, 3,137, 92, 5,169, 28, 48, 54,117, 66,199, 86,173,145,158,158,131,136, 23, 65, 69,108,133, 84,155,137,162,111, +247,172,153,230, 56,109,222,114,232, 59,116,135, 34,230, 50,232,162,204, 50,143,150,158,200, 4,166,245,157,145, 39, 81,224,124, + 96, 8, 80,139, 84, 47, 89, 89, 89, 82, 22,139,117,210,203,203,235,167,144,144,151,246, 0, 16, 18, 18,146,154,145,145,177, 50, + 43, 43,171,182, 62,233,210,104,240,132,158,158,126, 72,211,166, 77,211, 59,116,232, 96, 52, 98,196, 8,152,155,155, 35, 44, 44, + 12, 62, 62, 62,175, 85, 42,213,242,160,160,160,106,135,122,148, 74,101, 90,200,149, 43,134,189,190,253,214,120,249,144, 33,219, +188,188,188,118,110,218,180,137,227,232,232, 72,168, 85, 42, 68, 70, 70, 50,167, 78,158, 84,239, 95,181,106, 7, 79, 40,100, 63, +255,227, 15, 14,165, 80,164,253,167, 27,177,157,157,157,155,107,207, 30,206,219,127,221, 13,185,172, 8,207,130,175, 65, 44,206, +198,193, 67,151,156,237,236, 24,183,180,180,180, 32,109, 5,240,177, 99,199,150,118,110,215,174, 93,227,122,245, 16,153,148, 0, + 30,173, 1,151,162,192, 82, 41, 64, 82,114,212,107,201,128, 32, 13,144,241,161, 0,155,207, 92,136,210, 70, 24, 55,255,102, 40, + 54,165,230,131, 32, 8,252,210,181, 37,120, 6, 34,112,133, 34,204,253,243,110,153, 48,240,223,180, 10, 60,145, 8, 77, 58,107, + 21, 16, 94,122,239,222,189,151,145,145,145, 29, 91,182,108,137,165, 75,151, 34, 49, 49, 17, 52, 77, 35, 51, 51, 83,158,145,145, +145,150,157,157,157,136,226,248, 63,135,107,232,196,202,171, 14,187,160,160,160,178,225,134,192,192, 64,216,218,218,194,200,200, + 8, 5, 5, 5,152, 61,123,182,241,186,117,235, 0, 0, 47, 95,190, 68,121,129, 82, 17,145, 33, 49,219,243, 10, 25, 49, 83, 20, + 58, 34,151, 10,109,213,219, 35, 5,253, 6, 79,197,109,255,223,112,247,214, 29,152,178, 19, 19, 32, 44,188,241, 49,225, 99, 65, +170,196,209,215,185,253, 12, 86,134,228,150,239,252,161,177, 44, 27, 27,250,252,170, 3, 5,121,213,217,234,232,232, 8, 43, 43, +171,178, 57, 90,108, 54, 27,211,167, 79, 7,195, 48,218,138,172,146,190,134,206,150,203,229, 86,122,122,122,248,240,225, 3,222, +191,127,143,184,184,184,178,208, 1, 52, 77,171,151, 45, 91,198,153, 63,127, 62, 14, 28, 56,128,251,247,239, 63, 6,176, 17,128, +182, 15,107, 19,198,142, 29,107,160, 84, 42,113,250,244,105, 10,192,224,243,231,207,191,236,216,177, 35,123,192,128, 1, 6,251, +246,237,155, 80, 82, 71, 90, 11, 45, 67, 67, 67,174, 74,165,194,190,125,251,144,146,146,226, 6, 32,230,249,243,231,190, 99,199, +142,221,223,178,101,203,166, 81, 81, 81,111,139,138,138,230, 2,136,168,137, 44, 51, 51,115, 90,135, 14, 29,206,211, 52,237,208, +183,111, 95,225,175,191,254,106,248,230,205, 27,216,219,219,131,166,233, 72,212, 50,133,213,219,183,111, 99, 50, 50, 50,156,123, +245,234,133, 27, 55,110,108,213,104, 52, 91, 0,252, 52,103,206, 28,187,164,164, 36,180,107,215, 14,166,166,166,120,243,230, 77, + 97, 70, 70,198,126, 20,167, 36,170,201,133, 27, 15, 96,165,175,175,111,107, 95, 95, 95, 79, 83, 83,211, 46, 97, 97, 97,120,248, +240, 33,182,111,223,142,117,235,214,161, 71,143, 30, 88,186,116,233, 71, 0,158, 0,168,248,248, 71, 86,159,181, 0, 0, 32, 0, + 73, 68, 65, 84,120,173,226,230,149,122,182, 0,160,125,251,246,233, 62, 62, 62,152, 49, 99, 6,115,244,232,209, 93, 39, 79,158, + 92, 52, 97,194,132,178, 62,112,202,148, 41,204,137, 19, 39,166,160, 56, 13,211, 63, 9,181, 74,165,132,161,105, 35, 20,229, 37, + 35, 59, 37, 24, 2, 3,107,120,244,110, 3,169, 76,137,171,127, 92, 68, 68,100, 56, 72,146,132,149,117, 61, 24,155,152, 35, 54, +246, 45, 80,253,106, 99,181, 74,165,130,129, 73, 3, 20,229,167, 64,153, 21, 2,125,145, 37,166,126, 59, 2, 82,153, 10,151, 46, + 95, 68, 84, 84, 4, 88, 44, 22,172,109,234,193,200,184,152,147, 96,170, 95,193,172, 3,128, 74,226,105,213, 40,180, 88, 44,214, +189,155, 55,111,142,238,220,185, 51,251,221,187,119,120,247,174,248,225, 70, 44, 22, 83, 4, 52, 23,178, 34,255, 24, 95,205,225, +125, 81,178, 58,163,124,238, 66,145,129, 65,218,155,215, 49, 86,226,220, 76,132,135, 62,194,187,216, 72, 36,196,197, 64,165,146, +131, 69,146, 32, 89, 36, 26, 52,106,129, 71,143,131,149,114,138, 10,174,138,179,216,142,184, 66,161,165,227,184, 31, 55,173,246, + 95,188,124,131,254,152,209, 7, 16,241,230, 21,138, 40,107, 48, 12, 96,109, 38, 68,219,198, 43,144,150,158,141, 51,191,237,147, +210, 42,213,196, 10, 49,180, 62,227, 4, 0,171,143,112,217,127,232,183,233,135,253, 78,109, 88, 62,127,182,213,176,145, 19,193, +203,125, 5,117,122, 8, 26,117, 28, 8,130,111,140,235, 1,119, 17,244,242, 85, 38,173, 97, 54, 88,229,224,104,108, 13,156,229, +145,151,151,247,228,195,135, 12,251,114, 81,224,237,249,124,189,154, 86,199, 85,228,252, 36,226, 60,139, 69,182,255,241,199, 31, +213, 86, 86, 86,170,168,168, 40, 28, 56,112,128, 14, 9, 9, 9, 32, 73,114, 79, 70, 70,134,188, 38, 78, 11,181, 58,252,148,183, +183, 75,167,145, 35,153,241,243,231, 75,193,231, 47,216,246,203, 47,222,217, 98,177, 45, 67,211,176, 48, 53, 77,221,182,106,149, +207,232,177, 99,197,209,143, 30,233, 7, 95,185,162,207,163,168, 16, 45,236,252, 26,168,146, 51, 45, 45, 45,232,254,253,135, 56, +126,248, 87,168, 84, 10,100,164, 37, 1, 0, 62,230,228,163, 6,145, 85,145,147,145, 74,165, 35,191, 95,183,238,233,247,139, 23, + 89,247,236,211, 23,201,225, 97, 80,229,102,131, 80, 83,224, 16,108, 72,178, 4,200,202, 44,194,202, 19,231,178,138,164,210,145, +149,116, 18,149,218, 89,234,177,226, 27, 26,128, 43, 20,129, 39, 50,248,196,139,165,103,104, 8,158, 80, 4, 54,143, 87,217, 4, +238,207, 56,139,138,138, 70,141, 30, 61, 58,226,249,243,231, 38, 51,102,204, 64,183,110,221, 66,101, 50,153, 59,128,194,186,150, + 39, 77,211,105, 61,123,246, 36, 9,130, 16, 77,156, 56,145,159,157,157, 93, 22, 89,189,168,168, 8, 55,110,220, 64,179,102,197, +171,250,163,163,163,209,162, 69,139, 42, 57,103,174,140, 74, 3,176,105,241,104,187,109, 79,195, 51, 22, 0,216,218,168,105, 61, +220,189,117, 7, 15,239, 6,123,119,105, 73,239,254,102, 98,199, 31, 4,238, 99,151, 59,183,159,193, 18, 25,218,224,247, 75, 23, + 89, 49, 33, 71, 54, 75,165,145, 77,112,224,242,178,170,236, 36, 8, 2, 12,195,124, 22,202,129,197, 98,225,228,201,147,181, 61, +247,115,135, 15, 31,158,243,221,119,223,113, 51, 50, 50,240,250,245,107, 72, 36, 18,232,233,233,225,214,173, 91, 20,128,125, 39, + 79,158,188,117,242,228,201, 1, 40, 94, 77, 20, 88,155,246, 41, 20, 10,189, 60, 60, 60,240,250,245,107,188,120,241,226, 34,128, +136,208,208,208,139,239,222,189, 27,215,163, 71, 15,252,246,219,111, 94, 50,153,236,112,109, 56,105,154, 46, 31, 51,169, 52,227, + 67,120, 81, 81, 81,151,224,224,224,218,214,123, 70, 78, 78, 78,247, 18, 97,157, 98,101,101,101, 24, 30, 30,142,250,245,235, 67, +165, 82,117,174,109, 91,202,207,207,255,117,207,158, 61, 71,167, 77,155,134, 31,126,248, 97,226,185,115,231, 38,126,243,205, 55, + 24, 52,104, 16,142, 29, 59,134,136,136,136,173,208, 46,173, 88,101,231, 30, 1, 32,194,202,202,106, 94,189,122,245,176,125,251, +118, 68, 70, 70,250,108,218,180,105, 85, 68, 68, 4,154, 53,107,198,143,137,137,161,234,114, 15, 1, 0, 67, 67, 67, 67,181, 90, +141, 43, 87,174, 60, 3,176,120,226,196,137,150, 59,119,238,244, 20,137, 68,200,205,205,149, 69, 69, 69, 77, 0,240,199, 63,125, +175, 99, 8, 98,205,140,153, 11,124,103,206,152,160,215,161,125, 91, 72, 11, 82, 33, 43,202,132,180,240, 3,246, 28, 14, 0, 65, +144,176,176,176,129,165,181, 61,146,146,146,241,248,218,117,165, 68, 42,219,201, 83,211, 91,171,231,156, 95,204,217,174,152, 83, + 42,201,130,172, 40,171,140,211,210,210,182,132, 51, 9,143,130,175,203,101, 18,201,175, 74,134,248,249,111, 62,247,255,207,168, + 93,174,195,242, 16,139,197, 11,103,207,158,237,190,114,229, 74, 51,138,162, 88,166,166,166, 72, 74, 74,162, 46, 92,184,144, 91, + 84, 84,180,176, 46,214,176, 57,156, 8, 71,167,102,238,195,134, 13,163,134, 14, 29,194,157, 52,109, 0,219,194,210, 18,249,121, + 57,136,125, 29,134, 55,175, 66,224,216,172, 13,214,111,218, 1, 24, 27,215,152, 72,178, 36,173,206,224,141,223, 47, 59,219,221, +173,191, 97,179, 22,109,184,109,155, 24, 65,165,166,144,154,154,138, 63,174,132,171,162, 94, 62, 44,160, 41,229, 56,233, 71,237, + 82,240, 4, 1, 20,114,112,176,165,165,234,228,150,109,123,150,238, 59,120,124,249,202, 5, 51,132, 61, 92,251, 33,242,206,111, +184,232,127, 86, 34, 87, 40,183,113, 89,248, 37, 42, 7,210,216, 90,150,129, 92, 46, 87, 85,236, 79,229,114,185,234, 75,107,250, +216,177, 99,200,204,204, 84, 38, 38, 38,222,164, 40,234, 92, 53,201,158, 63,195, 30, 64, 57, 66,161,184,243,189,171,235,128,239, +111,221,210,155,178, 98,133,114,226,164, 73,203,160, 80,168,192,227, 49,108,161,144, 4,159,207,137,126,244, 72,127,215,156, 57, +166,132, 82,121,251,120, 53, 97, 3, 42,193, 87, 95,117, 88,234,209,234,213,171, 7,166,204, 88, 12, 89, 57,143,214,147, 23,177, + 80,168,160,181, 71,171, 4,201,137, 41, 41, 93, 22,172,249,254,210, 56,143, 62,206, 45, 29, 26,240, 45, 26, 54,128,200,218, 26, + 57,217,217,120,244,226,141,122,211,217, 75, 81, 37, 34, 75,171,184, 50, 52, 77, 23, 79,114, 7,208,103,225, 74, 16, 44, 22, 80, + 18,198,161,116,229, 80,195,142,221, 64,176,217,208, 48, 52, 20, 10,133, 54,147,254, 82,223,191,127, 63,106,226,196,137,129,254, +254,254,164,135,135, 71,219,203,151, 47,211, 95,210,118,100, 50, 89, 23, 0,208,211,211, 75, 48, 54, 54,182,155, 54,109, 26,212, +106, 53,164, 82, 41,242,243,243,145,154,154,154, 55,109,218, 52, 21, 0,232,235,235,243, 70,143, 30,109, 88, 19,231,142, 11,105, +242,197,163,237,118,155,178, 19, 61, 11, 62, 70, 52, 52,101, 39, 38,116,105, 73,239,222,113, 33, 77,110,104, 43,249,241, 99, 98, + 80,108,134,228,150,239,239,151, 46,178, 38,143, 24,165,177, 23,189,245,214,179,100, 46,212,196, 75, 16,196,103,193, 73,181, 20, + 89,159,160,176,176,112,213,218,181,107, 7,137,197, 98,251, 1, 3, 6,112,157,157,157,241,244,233, 83,248,251,251, 83, 79,158, + 60, 73,145, 72, 36,171, 1,200, 1, 4,212,165, 76,157,156,156, 26,178,217,236,210,161,180,189, 37, 95,239,189,124,249,242,184, + 25, 51,102,160, 65,131, 6, 46, 49, 49, 49,124,212,226, 58, 98, 24,166,108,148,225,107,130, 32,136,184, 93,187,118,217, 89, 91, + 91, 19, 55,110,220,160, 88, 44, 86, 93, 60, 55,199,142, 28, 57,210, 89,173, 86,207,156, 53,107, 22,220,220,220, 64, 81, 20, 78, +156, 56,129, 35, 71,142,104, 43,178,170, 69,108,108,108, 72, 74, 74, 74,207,101,203,150, 97,251,246,237,171,150, 45, 91,134,148, +148, 20,196,198,198,134,125, 9,111, 65, 65,129, 44, 57, 57, 89,208,181,107,215, 14, 81, 81, 81, 81,238,238,238, 45,102,204,152, +129,173, 91,183, 50,247,239,223, 31, 13,224,198,127,162,247,126,243, 46,215,143,163, 97,223,218,244,227,175,235,154, 52,110,248, +221,244,169, 99, 89, 78,142, 45, 32,201, 79,133,153,185, 21,236,235, 53, 66,118,214, 71,220,188,121, 67,243,241, 99,222, 49, 13, + 73,108,124,247, 46, 55,253, 75, 56,237,236, 27, 33, 43, 43, 11,215,175, 95,215,228,137, 11, 14, 65, 77,110,138, 73,202,203,132, + 14,218,120,178,102,161,154, 40,241,213,193,220,196,196,228,180,161,161, 97,166,161,161, 97,166,137,137,201,105, 64,171,213, 7, +125,203,221, 29, 88,159,188, 70,143,214,131,158, 94, 23,176,217, 75,140, 77, 76,110, 24, 25, 25,229,244,234,213, 75,233,235,235, + 43,143,137,137,166,211,210, 82, 24, 35, 35,163,252,178,253, 43,227,172, 0, 19,147,198, 6, 66,155, 22,235,140,236,219, 62, 18, +217,184, 20,138,108, 92, 10,141,236,219, 60, 22,218,184,108, 48, 49,105,108,160,149,157, 85,160,145, 37, 44, 28,205,177,175,153, + 5, 33,115, 52,199,190, 70,150,176,208,250,220,171, 31,246,211, 16, 4, 52, 40, 94,134,141, 58,112,150,114,208, 44, 22,235,184, +189,189,189, 13,106, 23,176,238, 51,206, 73, 64,131, 73,124,254,204,243,222,222, 83, 18,238,223,159, 88, 16, 31, 63, 62, 63, 46, +110,108,216,217,179,227,246,142, 27, 55,105, 60,159, 63,107, 52,208, 88, 91, 78, 27, 27, 27,159,144,144, 16,127,109, 95,229,132, +151,214,229,217,184,145,221, 45,143,190,157, 25,175,217, 35, 25,175,217, 35, 25,143,190,157,153,198,141,236,110,125, 65, 29, 17, + 44, 22,203, 83, 32, 16,156, 22, 10, 4,145, 66,129, 32, 82, 32, 16,156,102,177, 88,158,168,126, 14,213, 39,156,102,102,102, 47, +173,172,172, 50,107,243, 50, 55, 55, 15,173,133,157,227, 27, 54,108,152, 66,146,228,142, 90, 94,211,213,113, 58,234,235,235,199, + 9,133,194,212,242, 47,125,125,253,242,129,161,204, 4, 2,193, 85,161, 80,184, 83, 27,206,159,215,180, 88,247, 56, 96, 94,196, +207,107, 90,172,171,248,219,252,225, 38,211,158, 6,110,204,153, 63,220,100,154, 54,118, 90, 90, 90,222,183,180,180,204,176,180, +180,204,176,178,178,170,246,101,110,110,254, 82, 11, 78, 61, 3, 3,131,157, 6, 6, 6,153, 66,161, 80, 35, 18,137, 50,133, 66, +225, 14,148, 11,109, 81,215,242, 36, 73,114,171,139,139,139,156,197, 98, 29,173,240,211,246, 38, 77,154,200,217,108,246,182, 90, +114, 26,246,232,209, 67, 19, 30, 30,206,184,185,185, 49, 0, 76,190, 98,189, 91,155,152,152,220, 48, 52, 52, 76, 54, 48, 48,216, + 3, 64, 88, 71, 78, 2,128,167,157,157, 93, 88,239,222,189,165,118,118,118,193, 0,134,125, 69, 59, 7, 13, 31, 62,156, 78, 78, + 78,102, 24,134, 97,146,147,147,153,225,195,135,211, 40, 14, 20,249, 37,247,228, 53,115,230,204, 97,158, 60,121,194, 60,121,242, +132, 9, 14, 14,102, 6, 13, 26, 68, 3,248,246, 11,239,243,248, 90,231,238,220,200,188,113,243,166, 38,231, 38,140,114,165, 3, +254,216,193,172, 95,253, 29,211,207,173, 5,211,172,137,201, 37, 71, 71, 51,199,175,193,185,110,245,108,166,111, 79, 23,218,185, +177,201, 89,231, 70,230,141,255,225,115,255, 55,122,181,240,119, 79, 56,251,203,181,248,169, 88,170, 28,182,182,182,200,201,233, +172,199,102,187,242,249,124,119,146,197,186,151,155,157,189,168,228,113, 75,243, 79,185,106,171,237,208, 27,131, 87, 77, 74,130, +186,112,126, 50,145,189,142,156,181,225,208,138,179,170,164,210,180, 66,145,110, 70, 81, 47,247,160,218, 50,248,132,211,206,206, +110, 38, 77,211, 13,181, 53,136, 36,201,132,180,180,180,195,117, 41,207,166, 77,155, 50, 37,195,219,196,215,172,247,191,163, 45, +253, 47,113,254,254,107, 43,219,102,173,154, 47,143, 12,137,217, 94, 50,172, 88,134, 13,243, 77, 12, 92,123,247, 90,251,232,238, +253, 31, 54,236, 17, 23,254,135,207,157,132,150,115,218,190, 2,103,105,144,208, 90,113,114, 56, 28,223, 78,157, 58,205,124,250, +244,233, 81,141, 70, 51,235,127,180,125, 14, 98,177, 88,203,156,156,156,218,198,198,198,134,105, 52,154,237,168, 36, 80,100, 29, +236, 92,221,176, 97,195,185, 92, 46,151, 95, 84, 84, 36, 78, 79, 79, 95, 11,224,220,127, 91,121, 58, 55, 53,237,192, 48,101, 65, +183, 55,191,126,159,251,252,171,113, 50,180,134,102, 88, 63,198,198,231,132,254, 7,234,253,223, 38,178, 14,253, 19,127,220, 87, +199,169,227,212,113,234, 56,117,156, 95,157, 83, 95, 87,158, 58,206,127, 33,231,191, 18,108, 93, 17,232,160,131, 14, 58,252,191, +131, 76, 87, 4, 58,232,240, 95,135,242, 94,173, 50,111, 22, 81,141, 42,173,141, 75,176, 46,202,246,142,142, 83,199,169,227,212, +113,234, 56,117,156, 58,206,255, 57,206,127,171,200, 58, 84,205,246,223, 6,157, 91, 85,199,169,227,212,113,234, 56,117,156, 58, + 78, 29,231,255,130,208,170,116, 91, 55,116,168,195,223,142,221, 35, 96, 7, 0, 11, 46, 35,237,239,216, 95, 7, 29,116,208, 65, + 7, 29,254,195, 56,132, 42,134, 14,255, 27,132,150, 45,128, 46, 40, 78,124,251, 6,192, 67, 0,226, 47,224, 51, 7, 48,150, 32, +136, 49, 0,192, 48,204,121, 20,175, 26,249,168,205,193,122,122,122,153,114,185,220,178,228,115,150, 92, 46, 47,159,203,128,192, +231,171,217,152,114,175, 74,209,176, 97,195, 76,133, 66, 97,169,197,223,231, 51, 12, 19, 65,146,100,164, 72, 36,186, 27, 27, 27, +235, 95,155, 19,119,119,119,159,194, 98,177, 54, 3,128, 70,163, 89,115,239,222,189,227,127, 99,189,117,174,103,107,253,155, 74, +173,162, 50,179,115,215,226,243, 64,126, 0,128,125,131,225, 67, 80, 88, 94,242,121,219, 60,255,234,227,232,212,118,255,106,208, +129,195,225,120, 89, 89, 89, 13, 76, 77, 77,125, 9, 96, 5, 80,115, 84,227,122,245,234,125,203,102,179, 39,106, 52,154,198, 44, + 22, 43,142,162,168,147, 41, 41, 41,126,186,123,136, 14, 58,232,160,131, 14, 90,136,173,207, 80, 43,161,213,204, 12,214, 12,224, + 9, 2,253,192,224, 54, 1,156,121,147,131, 15,218, 30,255, 77, 51,168,213, 84,241,127,114, 73,104,110,188, 39, 15, 13, 28, 56, +208,126,254,252,249,232,214,173, 27,158, 62,125,218,245,216,177, 99,211,206,157, 59, 23, 65,211,244, 61, 0, 79, 1,173, 66, 41, + 8, 81, 28,167,101,194,192,129, 3,251,110,222,188,153,213,162, 69, 11,200,100, 50,220,191,127,223,117,219,182,109, 59, 31, 63, +126,124, 7,192,169, 18, 65, 80,101, 2, 60,185, 92,110, 89,154,140,147, 32, 8,203,209,163, 71, 63, 47, 47,174, 74,242,171, 17, + 12,195, 60, 33, 8, 34, 88,163,209, 60,189,112,225, 66, 74, 51,160,243,236,134,220, 11,139, 18, 84,246, 21, 57, 21, 10,133,229, +149,159,183,128,205,231, 67, 81, 88,128,174, 83,255, 18,189,183,215, 45, 7, 65, 83, 96,129, 17,187,255,184, 51, 2, 64,100,122, +122,122,132,155,155, 91, 66,109,107,152,197, 98,109,190,121,243,166, 13,195, 48,240,240,240,216, 12,224,239, 18, 90,252, 46, 29, +218,220,187,122,241,180, 94, 81,110, 38, 6, 12, 27,119,242,109, 74,214, 20, 0, 23, 63, 17, 77, 3, 97, 69, 16, 88, 62,103,203, + 41, 22, 0,236, 95, 61, 97,197,142,254,216,189, 56, 0, 31, 0,184,151,136, 31, 0,248, 25,192,189,125, 3, 97, 5, 96,229,156, + 45,167, 8, 0, 56,176,122,194,242,125, 3,177,107,222,141, 90,135,173,152, 59,101,202,148,221,155, 55,111,102,217,216,216, 32, + 45, 45,109,128,139,139,139, 83, 65, 65,129, 11,170,153, 68,220,160, 65,131,179, 61,122, 15,105, 52,114,140,167,192,194,220, 4, +233, 25, 31, 13,207,158, 62, 58,155,245,228,254,192,196,196,196,113,186,123,136, 14, 58,232,160,131, 14, 85,160,238,145,225,219, +217, 64, 95,162,194,112, 54,139,248,182,123, 7,151, 62,227,191,233, 65,186, 56, 55,197,171,232,152,254,127,220,125,182,141, 12, +142, 14,164, 52,140,159,144,139, 43,161, 25,213,175,132, 81, 83, 96, 7, 92, 57, 85,220, 19, 78,155,192,122,254,252,121,211,246, +237,219,151,165,134,233,211,167, 15,250,244,233, 67,236,223,191,191, 77, 64, 64, 64,155, 35, 71,142,168, 2, 3, 3,127, 67,245, +241, 81,188,154, 52,105,178,109,247,238,221,124, 55, 55, 55,240,249,252,178, 31, 68, 34, 17,134, 12, 25,130, 33, 67,134,176,210, +211,211, 61,174, 94,189,234,241,243,207, 63, 43,147,146,146,150,225,175, 40,205,213, 98,237,218,181, 29, 42,249,250, 38, 65, 16, +239, 41,138, 10,107,211,166, 77,138, 19,208,116,246, 55,221,110,207,237,238, 40, 92,180,234, 88,165, 60,108, 30, 15,191, 79, 41, +238,171,203, 11,173,132,187, 55, 32, 50, 52,200, 17, 24, 24, 68, 0,136, 4, 16,193, 48, 76,100, 92, 92, 92, 76,115,160, 77, 23, + 19,242,183,163, 98,186,117, 45,196, 22, 82, 82, 82, 96,100,100,164,239,230,230,150, 65, 16,196,134,251,247,239,127,237, 9,121, +157, 55, 44,159,203, 21, 39, 70,224,195,235, 39, 88, 50,198, 85,176,104,207,159, 63,200,149,234,139,213, 29, 68, 16, 36,249,115, + 48,237,141,226,100,188,107,115,114,114,220, 0,192,204,204,140, 7,224,222,142,103,248,102,113,119,226, 75, 98,187,113, 89, 44, +214,190, 99,199,142,205,248,246,219,111,139, 83, 71, 60,122, 4,145, 72,132, 77,155, 54, 53, 88,186,116,169, 15, 69, 81, 11,171, +242,100,245,232, 61,164,209,174,237, 63,184, 20,230,230, 43, 14,238, 59,247,194,182,101, 51,114,142,215, 82,131, 93, 42,133,181, + 70,163,249, 86,231,217,210, 65, 7, 29,116,208,161, 54,222,172, 26,133,150,147, 57,142,183,107,233, 56,118,252, 32, 87,126,171, +150, 45,192,229,255, 21,186,165,125,135, 14,104,223,161, 3,233, 93, 84,216,239,249,139,144,126, 23, 2,158, 42,164,234,164,115, +177, 31, 49, 69, 91,171, 74,147,210,110, 30,102,213, 91,146,151,165, 7, 0, 66, 99, 75,249,234, 43, 31,238,118,239,222, 29,246, +246,246,220,192,192,192,233, 53, 8,173,213,111,222,188,225,179, 88,213,199, 67,181,181,181,197,232,209,163,209,172, 89, 51, 94, +175, 94,189, 86, 87, 37,180,244,244,244,178, 8,130,176, 4, 0, 83, 83, 83,205,134, 13, 27,194,152, 98, 0, 0,195, 48,204, 19, +146, 36,159,210, 52,253,236,207, 63,255, 76,117, 1, 44, 7,180,111,246,112,238,164,209, 2,230,194,206, 42, 69,130,188,160,160, +210,239, 5, 34, 97,182,190, 80, 24,193, 23,232, 69,162, 56,151, 87,164,189,189,125,140, 11, 96,223,169, 89,195,128,253,139, 39, + 24, 28,157,245, 67,141,101,217,174, 93, 59,167,214,173, 91,235,105, 52, 26, 72, 36, 18, 28, 56,112,192, 72, 95, 95,223,104,224, +192,129,235,203, 55, 0,103,160,213, 40, 91,214,172,141,233,154,121,117,104, 72,198, 61,186,118, 72, 28, 61,100,160, 97,135, 46, + 61,240,246,222, 9,228,230, 22, 34, 63,175, 8, 52, 77,127, 22,215,103,222, 13,100,238, 27,140,109,251, 87, 77, 88, 73,144, 36, +209,102,196, 10, 12,181,206, 95,224,235,235, 27, 13,128,195,227,241,202,183, 67, 91,125,187,150,219,154,246,239,129, 3,107, 38, +129,161,105, 6,192,182, 90,120,179, 44, 13, 12, 12,254, 8, 8, 8,232,220,177, 99, 71, 60,125,250, 20,241,241,241,152, 59,119, +174,114,222,188,121,220,201,147, 39, 19, 75,150, 44,153,255,243,207, 63, 95, 0,240,248,179, 11,129,205,158, 56,108,228, 56, 94, + 81, 94,129, 92,169, 80, 41, 77,205,141,105,133, 68, 46,253, 40, 46,144,143,155, 48, 83, 25, 29,250,108, 34,128,207,132,214, 23, +150,167, 14, 58,232,160,131, 14, 90,128, 97,152,142, 0, 44, 0,100, 19, 4,241,162,252,118,201, 46,165,217, 90, 42,110,127, 68, +241,168,148, 89, 57,186,143, 40,158,238, 99, 1, 64, 3,224, 57, 65, 16,226, 47, 52,177,250, 85,134,254,254,254, 76,249,247,114, + 66,139, 97, 24,134, 81,231,188,103, 20,177, 55, 24,233,139,195,159,189,100,209, 23,153,140,231,231,152,103,167,214, 49, 78,230, +213,103, 97,255,166, 25,212, 19, 90,131,153,211, 17,204,194, 94,198,242,231,207,159, 7,210, 52,237,239,221, 3, 12,243,234, 20, +195,188, 58,197, 44,238, 10,230,194,133, 11, 55,125,124,124,252,253,252,252,252, 1,212, 52, 79, 41,179,240, 69, 48,243,204, 18, + 76, 85,120,243,230, 13,227,235,235,203,172, 90,181,138, 57,122,244, 40,131, 26, 34,168,123,120,120,220,143,138,138, 98, 38, 79, +158, 28,134,106, 2, 3, 58, 3,194,137, 13,172, 95, 43,206,238, 84, 41,191,109,197,136,123,234, 85,122,254, 54, 54, 54,159,216, +179,213,209,154,217,219,201,145, 57,222,175,253, 7,134, 97,110, 50, 12,179,149, 97,152,113, 12,195, 52, 3,128,118,128,225, 48, + 27,179,119,242,115,187,100,202, 89, 93,106,204,123,215,174, 93, 59,167,101,203,150,229, 42,149, 74, 38, 33, 33,129, 57,120,240, + 32,115,251,246,109,230,202,149, 43,140,171,171,107,122, 57,123,173,166, 53,115,200, 84, 30,217,168,168, 75, 43,226,176, 88,123, + 95,220,190,192,188,123,120,158,121,126,198,135, 57,249,253,120,102,254,176,206, 42, 67,125,190, 28, 64,239,170,142,155,215, 29, + 77,155, 53,176,136, 77, 74, 74, 98, 84, 42, 21, 51,117,234, 84,198,195,195,131,233,223,191, 63,211,183,111, 95,166, 79,159, 62, + 76,239,222,189,153,187,119,239, 50,233,233,233, 76,223, 30,237, 37,131,157,209,161, 22,166,181,116,112,112,248,144,144,144,192, +168, 84, 42, 38, 48, 48,144, 57,113,226, 4, 19, 24, 24,200,120,123,123, 51, 0,142,207,153, 51, 71, 38, 22,139, 25, 15, 15,143, + 84, 84, 18, 53,222,193,193, 33, 38, 42, 54, 37,101,199,150,195,119,127,223,123,250,238,165, 11,183,239,254,113,235,249,181, 43, +183, 94,156,123, 22, 30,119,197,193,193, 33,166,146,250,255,162,242,212, 65, 7, 29,116,208,161,102, 45, 82, 34,180, 6,149, 56, + 59, 6, 49, 12,211,183,194,246,160, 18,225,244,217,182,183,183,247,170,242,219,165,251,120,123,123,175, 2,192,116,237,218,245, + 52,195, 48, 77,191,130,249,179, 42,121,213,236,209, 42, 5,149,250, 28, 92,199,129,224,104,212, 80,127,124, 3, 58, 47, 9, 16, + 90, 67, 70,136,144,147,145,132,215, 15, 47, 86,159, 72,162, 4,215,223,128, 3, 32, 48, 38, 38, 6,175, 95,191, 70, 74, 74, 10, + 4, 2,193,103,251, 61,122,244, 8,250,250,250,176,177,177,209, 78,233, 42, 63,237,231, 34,218, 59, 64,212,213, 13, 31,199,127, +135,192,192, 64,100,101,101,129,203,229,130,199,227,129,162,168, 26,249, 72,178, 56,227,111,169, 23,171,178,125,220, 0, 54,223, + 84,116,117,255,250,133, 13,201, 39,254, 28, 89,242, 59,164,203, 53,218,121,242, 68, 66, 8,132,130, 12,125,125, 65,217,112, 33, +128, 72,130, 32,222,182, 3, 56, 66,145,222,213,223,126, 92, 98,205, 10, 13,212,147,189,139,168,148,163,111,223,190,179, 1,172, +103, 24, 38,175,117,235,214, 86,155, 55,111, 54, 73, 75, 75,195,171, 87,175,112,238,220,185,108,170,248, 68, 9,134, 97, 54, 2, + 64, 23, 64,207,216,194,248,214,222,117, 11, 13,112,239, 44,175, 46,173,200,200,121,200,181, 81,147,231,204,219,189,112, 8, 36, +133, 50,156,186, 29,138,155, 33,239,135, 2,120,132,106,230,189,237,123,140,119, 64,118,159,145, 35, 71,134, 61,120,240,192,252, +200,145, 35,160, 40,170,210,215,145, 35, 71,112,231, 97,200, 2, 0, 47,181, 52,203,182, 97,195,134,119,158, 61,123,102, 33, 16, + 8,112,251,246,109,228,229,229,149,121,178,166, 76,153, 66,228,229,229,121, 30, 56,112, 96, 84, 98, 98,226,246,135, 15, 31,230, +160, 56, 23,228, 39, 13,129,197, 98,189,167, 40, 85,115, 27,231,166,236, 49, 67,122,244, 40,202,137,128,200,172, 53,158,132,191, +191,154, 39,206,145,177, 88,172,247,229,247,255, 26,229,169,131, 14, 58,232,160, 67,237, 64, 16,132, 63,195, 48,131, 9,130,240, +175,248, 93,197,207,165,251,249,248,248,148,109,151, 30,179,117,235,214, 45,229,182,165, 95,201,188,106, 39,195,247, 42, 81,144, +189, 42,219, 73,241,234, 18, 20,175,255, 0,215,161, 59,120,205,134,130,229,224,138,228,136,123, 8,191,177, 3,169,209,143,192, +208, 26,216, 56,117,210,214, 16,121,243,230,205, 33,151, 23, 79,205, 82, 40, 20,224, 10, 77,228, 75,102, 77,208, 3, 0,154,173, +167, 40,167, 96,181, 34, 52,232,238,142, 78,153, 12,158, 91, 21, 59, 42, 58,101, 22, 31,247,227,212,169,224,114,185,224,114,185, + 32, 74,166,254,104, 35,180,136,146,157,233,226,225,171,202,140, 32,164,124,206,169, 51,235,189, 58,241, 19, 35,121,138,168, 39, + 72, 87,208,204,213, 76,205, 53,109,236, 21, 8, 5,105,250, 2, 65,164,190, 72, 88, 38,180, 8,130,120, 15, 0, 12,135,227,119, + 98,163, 87,107, 97,102,156, 80,254, 34, 16, 25,114, 90, 85, 5,205,198, 27, 55,110, 88,178,217,108,107,141, 70,131,228,228,100, + 68, 71, 71, 99,215,174, 93,153,133,133,133,189, 66, 67, 67, 99,203,107, 71,141, 62,239,156,223,166,133,141,216, 17, 65,122,138, +247, 81,181,110, 61,230, 45,135,123, 12,237,213,230,218,236, 73,107, 48,252,155,254,152,220,203,133, 73, 72,207,149, 3,184, 93, +226,122,173, 9,105,161,161,161,253,122,246,236,121,178,109,219,182,206, 12,195,160, 85,171, 86,240,244,244,132,159,159, 31,194, +195,195, 81, 80, 80,160, 10, 8, 8,216, 9,224,152,150,102, 9, 76, 76, 76,110,222,189,123,215, 66, 32, 16, 32, 32, 32, 0, 50, +153, 12, 54, 54, 54,152, 55,111, 30,111,235,214,173,191, 23, 20, 20,140,241,241,241,209, 75, 72, 72,216,123,235,214,173, 6, 40, +206, 59,247, 89, 35, 80, 42,149,135, 78,249, 29,223, 61,207,107,190,221,221,167,175, 2, 21, 69,133, 70, 14, 14, 41, 5, 22, 38, + 34,131,157, 63,109,172,175, 84, 42,103, 87, 94,158,247,235, 84,158, 58,232,160,131, 14, 58,124,134,106,181, 72,121,241, 84, 81, +108,213, 70,164, 1,144,121,123,123,175, 38, 8,194,223,219,219,123,181,143,143,143, 12, 64,250,223, 33,178,202,132,214,224,193, +131,131,252,253,253, 49,120,240,224,160, 42, 41,104, 13, 84, 9, 15,160, 74,120, 0,253,174, 11,240,167,207,248, 10, 39, 79,215, +217,186, 33,155,110,223, 85, 40, 20,236,227,199,143,151,205,219, 2, 0,141, 70,243,213,107,177, 54, 66,171, 68,232,125,102, 68, + 67,190, 40,232,208,226, 49, 93,204, 52, 82,142,242,209, 85,164, 41,104,106,251, 59,149,244, 69, 30,243,115, 85,156, 87, 22,205, + 70,202,195, 59, 16,136, 68, 41, 51, 30, 68,150,121,177, 74, 68, 86, 60, 0, 52,224, 27, 4,250, 46, 28,238,106,205, 5, 87,121, +237, 60,210, 21,180,194, 55, 81,125,172,138,198, 6,134, 97, 16, 31, 31, 15,169, 84,138,224,224, 96, 92,188,120, 49,187, 18,145, +133,134,124,209,253,163, 43, 38,118, 54, 44,252,192, 85,190,184,131,116, 5,173,213, 80,151,121,171,225,221,185, 36, 17, 64,144, + 44,253, 62, 93,156,176,104,230, 8,236, 56,250, 39,165,180,236, 49,120,247, 31,215,199, 22, 41, 84,171,181, 20, 89,101,206,198, +208,208, 80,151,208,208, 80, 62, 0,119, 79, 79,207,235,163, 70,141, 66, 80, 80, 16,174, 94,189,234, 8, 32,163,100,191, 77, 40, + 78,148,253, 51,128,184,170, 28,143, 92, 46,247,204,157, 59,119, 90,216,218,218,226,206,157, 59,144,201,100,152, 51,103,142,210, +203,203,139, 59,101,202, 20, 34, 63, 63,191,204,147, 21, 28, 28,156, 83,149,200, 2,128,180,180,180, 27, 23,207,157,232,214,179, +103,207, 17,141, 28,155, 25,198, 21, 22,100, 9, 4,122,250, 15,131,238,113, 95, 60,123,188, 55, 45, 45,237,121,229,229, 25,168, +117,121,234,160,131, 14, 58,232, 80, 53,180,210, 34, 21, 60, 83,181, 65,185,227, 56, 62, 62, 62,209, 62, 62, 62,159,120,188,190, + 16, 21, 87, 29, 94, 43,237,211,234, 20, 71, 75,147,159,252,249, 9,208,116,109, 78,246,179,239, 76, 76, 76, 40,125,125,253, 79, +132, 22,173, 37,103,238,229,211,136,155, 59,161,204,147, 85,234,217,194,128, 41, 95, 36,180,104,154, 14, 6,240,137, 17, 2, 75, +167,241, 59,135, 56,119,119,105,100, 71,170,207,237, 66,170,148,146,175,127,163,146,191, 46,100,134,198, 84, 50,201,186,140,147, + 82, 67, 79,168,159,164, 47, 18, 86, 20, 89,137, 0, 32,180,114, 28,181,125, 96,179, 94,109,154, 53, 33,169,179,191, 34, 77,170, + 46,242,142, 81,169,226, 36,204,165, 42,202,112,125,255,254,253,215,155,153,153,233,237,222,189,219,200,193,193, 1, 20, 69, 41, + 43,138, 44,129,165,211,248, 93,195, 91,118,119,178, 54, 33,213, 23,246, 32, 69,166,145,238,138, 83,255,174,141,200, 50, 55, 18, +221,242,221, 50, 87, 95,192,231, 64, 46,151, 99,235,254, 11, 8,120, 28, 53,248, 99,212,149, 91, 0,110,125, 65,131,156, 49,120, +240,224, 29,155, 54,109,130, 90,173,198,244,233,211,241,254,253,251,128, 55,111,222,236,170, 95,191,254,178, 21, 43, 86,216, 90, + 91, 91, 99,236,216,177, 92,181, 90, 61,165, 10,142,159, 78,157, 58, 53,184, 77,155, 54, 8, 10, 10, 66, 94, 94, 30,108,108,108, +224,229,229,197,243,241,241,249,189,160,160, 96,204,150, 45, 91,244,226,227,227,171,245,100,125,210,174, 53,154, 31, 15,238,152, +187,172, 99, 23, 87,242,221,187, 88, 42,185,147, 27,121,239,206,213, 7,102,102,102,191, 39, 39, 39,255, 85,158, 35, 90,213,186, + 60,117,208, 65, 7, 29,116,248, 58, 32, 8,226, 90,201,188,171, 79,188, 92, 21, 69, 88,169,199,170,252,118,197,253, 75,126,255, + 26, 15,203,135, 42, 17, 94,159,134,119, 24, 60,120,176,214,203,234,105, 73,182, 86,226,169, 34,190,105, 6,181,157, 8,236,213, +110, 36,184, 66, 19,249,144, 77,183,239, 86,181,175, 80, 40,212,218,163, 69, 43,228, 53, 85, 74,173,132, 86,201, 28,173,155, 12, +195,124, 34,180,140,172,156,220, 86,174, 88,184,211,117,212, 0, 50,115,102, 87,228, 21, 41, 20, 43, 94, 81,116,170,180,122,145, + 85,220,139,171, 19, 4, 66, 81,164,158, 80, 80, 94,100, 37, 3,128,158,101,147, 78,203, 23,205,219,223,123,252, 16, 34,123,142, + 43,196,121, 50,197,178,104,138, 72,147, 49, 99, 98,128,123,149,209,221,189,123,247, 32,128,131,110,110,110,153, 66,161, 16, 69, + 69, 69,159,213, 65,169,189,221, 71, 13, 32, 51,103,116, 70,174, 68,165, 88, 17, 77, 33, 93, 70,159,169, 73,100, 89, 24, 27,220, +242,221, 60, 87,144,158,154, 8, 46,151, 11,145, 72,132,219,143, 34,241, 49,250,143, 47, 17, 88, 32, 73,114,131,183,183,247,250, +121,243,230, 33, 39, 39, 7, 87,175, 94,197, 55,223,124,131,211,167, 79, 59, 92,191,126,125,135,187,187, 59, 88, 44, 22,252,253, +253,161, 86,171,223, 86, 65, 51, 98,214,172, 89,203, 70,141, 26,133,231,207,159, 35, 35, 35,227, 19, 79, 86, 94, 94,158,231,254, +253,251, 71, 37, 36, 36,212,232,201,170,128, 78, 13,155,180,227,174, 90,251, 11, 20,210, 44,118,118,218,211,160,192,219,228,147, +220,220, 92, 1,128,252,186,150,167, 14, 58,232,160,131, 14, 90,123,181,170,210, 34,217, 37, 34, 42,187,178,237,114, 2,171,178, +109,162,130, 23, 76, 89,225,247,240,191,243,156,180,242,104,177,173, 90,130,202,140, 42, 39,180,178, 62,249, 93,207,192, 84,171, +161, 67, 53, 5,182,239,177,178, 56, 90,122, 57, 57, 57,122,230,230,230,242,242, 2, 65, 32, 16,192,214,214, 22, 98,177, 24,135, + 14, 29, 2,106,158, 20, 77, 25,142,154,132, 78,227,167,227,133, 61, 15,140, 90, 85,230,217,242,157, 58,245, 19,177,197,229,114, + 75,231,134,213,212,233, 62, 43,241, 52, 61, 1,192,180,115,108,244,131,158, 80, 56, 85,207,188,158,249,162,185, 51, 56, 9, 89, + 10,220,117, 93,149,119,225,167,149,162, 20, 70, 52, 47, 25,249,143,107,224,139, 27,118,224, 68, 69, 79, 86,106, 91,199, 70,107, +244, 4,122, 51,121,166, 13,172,189,151,204,229, 36,100, 42,136,187,157, 86, 20, 92,252,121,133, 32, 30, 6,203, 82,145,119, 79, +139,234, 89,255,205, 55,223,172,103, 24,134,161,105,122, 45, 0,148,183,119,137,215, 76, 78,220, 7, 57, 2, 93,215,136, 47,254, +180,210, 32, 5,213,219,107,222,106,120,119, 43, 19,195, 91,190, 91,230, 9, 50,210,146,192,231,243, 97, 96, 96,128,148,204,124, +112,216, 44,217, 23,182, 55,126,143, 30, 61, 86,206,157, 59, 23,145,145,145,152, 51,103, 78, 70,114,114,242,165,179,103,207,206, + 89,183,110, 29,219,195,195, 3, 25, 25, 25,216,182,109,155,250,209,163, 71, 91, 0,108,171,180, 61,178,217, 51,126,248,225, 7, + 38, 61, 61,157,136,143,143,135,141,141, 13,230,207,159,207,219,178,101, 75,217,156,172,218,120,178, 74,145,150,150, 22, 20,112, +231, 9,134,222,216, 9, 74,173, 8,202,203, 73,126,240, 58, 78, 28,100,202,227, 45,181,107,215,170, 78,229,169,131, 14, 58,232, +160,195, 87,241, 98,189,168,110,251,191, 0,149, 13, 29,106, 37,180,222,238, 89, 51,205,113,218,188,229,208,119,232, 14, 69,204, +101,208, 69,153,101, 30, 45, 61,145, 9, 76,235, 59, 35, 79,162,192,249,192, 16, 0,120, 91, 27,171, 10, 11, 11,209,190,125,123, +236,155,226,212, 91, 94,152,163,167, 15, 64,193, 55,148, 95,225,245,184,123,253,250,117, 41, 77,211,103, 0, 92,175,129,102, 67, +139, 22, 45,246,254,242,203, 47, 60,231,241,211, 80,244,244, 97, 69, 15, 10,244,245,245,193,231,243, 17, 17, 17,129,187,119,239, + 42, 1,108,168,161, 66,159, 81, 20, 21,126,246,236,217,212,166,141,236, 6,180,111,219,122,193,234, 85,222, 6,175, 30, 6, 96, +237,150,189,116,211, 14, 30,249, 91, 79, 95, 41,204, 23,213,239, 35,203,120, 19,166,197,169,134, 87, 16, 89,233,205, 27,214,235, +221,182,101,139,229,107,215,174, 49,140,126,120, 27,235,126,246,101, 28,219,244,205,255,249,226, 31, 5, 31, 5, 13,250,203,179, + 94, 63,215,166, 12,131,130,130, 14, 2, 56, 88,186, 93,209, 94,239, 77,187,104,167,142, 3,196, 91, 79, 95,148, 20, 24,212,239, + 91,157,189, 22,206, 35,186,217, 91,152,220,218,243,227,119,130, 15,105,201,224,243,249, 16,137, 68, 72,206,200,195,250,157,231, + 36, 42,154, 30,240,165, 66,203,192,192,128,175, 82,169,176,111,223, 62, 36, 39, 39,119, 5,144,252,242,229, 75,223,113,227,198, +237,110,213,170, 85,243,232,232,232,183, 69, 69, 69,243, 0,188,174,138,196,216,216,184,171,133,133, 5,241,228,201, 19,124,247, +221,119,202,249,243,231,115, 39, 79,158, 76,136,197,226,186,122,178, 0, 0,118,118,118,110,253,250,116, 65,247,126,115,130,148, +242,188, 7, 9,175,127, 15, 34,153,199,122,117, 45, 79, 29,116,208, 65, 7, 29,254,103, 80,183,192,224,110, 0,219,201, 12,179, + 91,216,113, 63,248,253, 52,159, 41,140, 11,102,100,207, 15, 50, 5,151,103, 50,215,182, 77,102,174,239, 89,196,204, 25,212,130, +105,110, 73,124,112, 50,195,108,183,207,133,219, 39,217,189,191,105, 6,117,191, 38, 96,250, 53, 1, 51,200, 9,106, 0,171,219, +181,107,119,197,171,211, 95,113,180,188, 58,129, 1,240, 29, 0, 81, 21,102, 85,150, 49,220, 6,192,161,246,237,219, 83,247,238, +221, 99,222,140,233,203,132, 54, 55,103,230,205,155,199,172, 91,183,142,153, 48, 97, 2, 99, 97, 97, 65,149, 20,132, 77, 77,156, + 67,135, 14,181, 7,128,122,245,234, 25,119,112,110,250, 33, 34,240, 42,243,192,111, 55,115,212,107, 36,211,185,149,243, 71,235, +230, 61,195,245,109,154,181,173,161,248,202, 56,173,173,173, 87, 49, 12, 51,128, 97, 24, 27, 0,112,116, 52, 19,181,107,222, 52, + 61,252,206, 85,230,225,137,189,204, 81,175,145, 76,151,214, 46, 57,246,206,238,175,245, 44,155,119,210,134,179, 50, 84,106,111, +203,230, 31,173,154,118, 11,171,198,222, 50,206, 70,157,198,254,145,154,158,201, 60,123,246,140,185,126,253, 58,243,240,225, 67, +198,239,236, 31, 76,253,142, 99,138,204, 91, 13,239, 94,139,166, 83,149,157, 70,131, 6, 13, 98,222,190,125,203, 12, 28, 56,144, + 1, 96, 84, 71,206, 43, 9, 9, 9, 76, 84, 84, 20,179,122,245,106, 6,192,241,185,115,231,202,242,243,243,153,190,125,251, 38, +151, 8, 44,118, 93,236,108,220,208,110,235,136, 33, 61, 54,120,125, 55,202,237, 75,203,243, 43, 66,199,169,227,212,113,234, 56, +255, 23, 56,255, 63,195,166,196,171, 85,250,222, 78, 43,143, 86, 16, 64, 33, 7, 7, 91, 90,170, 78,110,217,182,103,233,190,131, +199,151,175, 92, 48, 67,216,195,181, 31, 34,239,252,134,139,254,103, 37,114,133,114, 27,151,133, 95,162,114, 32,141,173,193,138, +146, 56, 90,159, 32, 52, 52, 84, 96,218,228,175, 24, 76,239,138, 99,179,250,214,242, 4, 51, 0,204, 10, 9, 9,249,197,221,221, +125,243,204,238,157, 70,122,117,235, 13,181, 90, 13, 63, 63, 63, 36, 37, 37, 93, 2,176, 70, 91,143, 91,100,100,228, 71,151, 38, + 14, 11, 57, 44,147, 13,103, 68, 0, 0, 32, 0, 73, 68, 65, 84,246,242,121, 19, 70, 88,100,191,127,133,212,152, 80, 0,128, 66, + 33, 83,127,120,251,160, 77,109,140,211,215,215,127,102, 97, 97,241,198,194,194, 66,236,212,168,222, 44, 62, 56,107,231,120, 14, +179,204, 73,120,141,148,232,226,145, 81,133, 92,170, 74,125,123,175,121, 93,106,215,193,193,129, 47,228, 96,118,165,246, 42,229, +234,204,119,175,219,106,195, 35, 85, 40,183,108,220,225,215,255,199,229, 83,249,134,134,134, 8,137,122,135,181,191,158,150,200, +148,234, 1, 31, 35,175,124,149,225, 49,134, 97,160, 86,171,181, 94,232, 80, 5, 86,182,105,211,166,217,230,205,155, 29,167, 76, +153,130, 47,245,100,149, 71, 92, 66,154,183, 93,189,198, 46,239,222,132,184,155,234,115, 79,126, 73,121,234,160,131, 14, 58,232, +240, 63,131, 65, 37,206,156, 89,229,222, 67,107, 20, 90,165,136,202,130, 20,192,166, 70,172, 34,223, 85,155,119,172, 39,137,157, + 83,105,134,249,141, 34,177, 49, 62, 7,217, 95,104,156,148,195, 6,213,127,248, 4, 54, 0,112,216,117,235, 32, 75,240, 22,192, +168,195,143,159,119, 60,252,248,249,247, 37,223,253, 8,160, 86, 99,185, 6,108, 68,185,186, 52,182,235,209,174,133, 30, 75, 35, + 67,106,204,123,228, 74,228,184, 29,157,148, 71, 50,228,111,181, 53, 42, 62, 62,254, 62, 0, 88, 25, 9, 98,122,184, 52,169,223, +179,125, 11, 1,135, 80, 34,245, 85, 8,242,101, 74, 4, 68, 39,229,131, 32,234, 60,161,250,107,217,155, 25,249,199,139, 63, 65, +244, 37, 8,226,206,106,175,241,252,245,191,158,249,170, 34, 11,128, 52, 45, 45, 45, 71, 42,149,154,165,167,167, 43, 81,247, 32, +113,239, 10, 10, 10, 90, 45, 90,180,104,211,178,101,203,150,255,244,211, 79,220,186,204,201,170, 10,226,180,164,203, 61, 91,124, +189,250,215, 65, 7, 29,116,208,225,127, 2,179, 42,188, 67,107,161, 85, 38, 24,178,144, 13, 96, 94,227,198,204,146,184, 56, 40, +191,150,101,149,121,186,190, 16, 47, 0, 12,169,243,209, 36, 81,248,244,109, 82,209,179,183, 73, 69,160, 25,134,102, 24, 5, 73, + 34, 69,162, 82,109,121, 27,159, 86,247, 85,119, 4,161,121,241, 46, 89,246,242,125,138,156,161,105,134,102, 24, 37, 65,224,131, + 90, 77,111,137,142, 79,250,227,191,193,222,143,145, 87, 30,251, 83, 68,143,199,207,162,150, 72, 36,170,189, 31, 99,174, 4,127, +197,122, 81, 71, 70, 70, 78,236,218,181,235, 52,141, 70,227, 11, 64,253, 5, 92, 74,138,162, 86,110,221,186,245, 82,100,100,228, +185,224,224,224,140,175, 33,178,254,214,250,215, 65, 7, 29,116,208,225,223,138,186, 37,149,174, 10, 95, 83,100,253, 55, 34,234, + 93, 98,251,191,131, 55,250, 93, 98,203,255, 15,246,102,198, 92,126,153, 9,120,254, 77,197, 27,160,209,104, 2,190,166,168,190, +121,243,102, 67, 84,146, 86,231,191,173,254,117,208, 65, 7, 29,116,248,215, 98, 86, 85,226,139,173, 43, 27, 29,254, 5, 96,190, +150,200,210, 65, 7, 29,116,208, 65,135, 58,160, 74,143, 22,129,170, 87, 14,220,169,197, 31,212,101,245,193, 29, 29,167,142, 83, +199,169,227,212,113,234, 56,117,156,255,115,156,255, 70,216,160,120, 66,252,181,146,247,106,197,215,215,132,110,233,171,142, 83, +199,169,227,212,113,234, 56,117,156, 58,206,127, 59, 42,157, 8, 15, 20, 79, 30,214, 65, 7, 29,116,208, 65,135,255, 79,224,151, +188,234,250,187, 14, 58,252,221, 98,171, 76,112,213,101,142, 86,211,146,247,119,127,163,177, 94, 54, 54, 54,179, 90,183,110,237, +204,229,114,201,194,194,194,141,247,238,221,219, 80,113,167, 30, 46,236,151, 44, 18,246,127,125, 67, 0, 4, 11, 32, 73,104, 24, +164, 62,140,144,117,208,213,251,127, 53, 28,244, 13, 45,254, 36, 72, 22, 79, 67,169,160, 81,171, 80, 60,221,170, 24, 52, 77, 37, +105, 84, 10,143,170, 14,182,110, 51,162, 62,165,161,127, 2,152,125, 0, 57, 23,160,247, 19, 96,207, 97, 64, 29, 32,192,250, 14, + 44,230,103,104,136, 21,108, 14,107, 85, 70,232,133,148,127, 67,129,157, 63,127,158,245, 37,199,143, 25, 51,166,210, 4,162,182, +182,182,254, 2,129,160, 73, 85,199, 73, 36,146,140,140,140, 12,247,127,121,123,236, 9, 96, 15,128, 22, 21,190,127, 13, 96, 33, +128,192, 47,253, 3, 55,128,109, 5,204,230, 2, 43, 0, 64, 5,252,156, 9, 28, 12,250, 47,154, 99,104, 97, 97,241,128,205,102, + 59, 74, 36, 18, 73, 97, 97, 97, 99, 3, 3,131, 56,161, 80, 40,164, 40,234,109,118,118,118,207,234,142,101,138, 23,165,212,136, +150,128, 65, 44, 48, 78, 67,146,243, 57,192, 62, 5, 77,251,150,220,193,181, 73,112, 59, 23,127,165,231, 90, 14, 96,127, 45,127, +215, 65,135,191, 3, 95,180,234,208,169,248,254, 0, 55, 0, 61, 59,118,236,104, 37,145, 72,240,250,245,235, 76, 0, 15, 0, 4, +149,188, 98,191,134,165, 36, 73,110,223,177, 99,199,210,249,243,231,151, 37,131,142,136,136, 64,155, 54,159,199, 8,101,145,176, +191,119,245,142,229,139,200, 88,116,236, 59,186, 68,104,145,128, 36, 3,238,253, 58,213,213, 4, 3, 19, 19,147,141, 4, 65,140, + 33, 73,178,198,155, 6, 77,211, 26,134, 97,206,139,197,226,245, 0, 10,107,243, 71, 66, 1, 95, 77,105, 52,149,254, 7,155,197, +210, 72,164,138, 42,195, 94,152,154,154, 6,147, 36,217,168,124,194,108,224,211, 4,218, 85,253, 70, 81, 84,234,199,143, 31,181, + 17,161,122, 36,155,187,144, 32,184,253, 64,210, 78, 0, 1, 2,100, 44,173, 81,222,166, 41,213, 46, 0,242, 47, 17, 89, 54,245, + 26, 63, 92,188,102,171,125, 84,204,107,172,246,154,128,159,246, 28,199,170,133,211,176,235,208,105, 44,156, 53, 30, 46, 46, 45, +170,189,235,210,224,110, 89,179, 96, 76, 95,159,125,231, 92, 87,205, 27,195,247,217,119,190,199,106,175,113,188, 45,123,207,245, + 88,237, 53,150,239,179,247,156,235,170, 5, 99,244,183,236,191, 64, 3,152, 84, 23, 35,199, 59,218, 74, 8,138,170,244,201,152, + 97,179, 21,167,223,166, 11,255, 19, 87,244,148, 41, 83, 90,203,100,178,144, 9,253,218,109,109,235,100,151, 86,217, 62, 57, 31, +210,236,226,222,132,122,115,184,250,237,135,121, 31,143,168,214, 61,192,231, 55,122,253,250,181, 35, 77,211,208,104, 52,160, 40, +170,236, 93,169, 84,162,103,207,158, 95,107,225,204, 16, 0, 27,139, 47, 86,248, 0, 56,247, 5, 92, 34, 54,155,189,152,199,227, +185, 81, 20,229, 12, 0, 28, 14, 39, 70,161, 80, 4, 81, 20,181, 3, 64, 81, 45,249,118,166,165,165,185,136, 68, 34,168, 84,170, +178, 4,244, 44, 22,171,121,253,250,245,247,201,229,114,199, 47, 61,121, 43, 96,118, 55, 87,215, 93,147,151, 46,101,201, 30, 60, +192,174, 99,199,118,162,160, 0, 0,246,213,116, 44,143,199,187, 69,146,164, 67,109,254,143,166,233, 36,165, 82,233, 81,155, 99, +216,108,182, 99,122,122,186,165,173,173, 45, 10, 11, 11, 33, 20, 10,133,165,219, 95,130, 32,128, 24, 0,244,164, 88,172, 69,102, +230,230, 61, 66, 2, 2,132, 45, 91,182, 36, 89, 44,214, 42,104, 31,164,154, 15, 96, 27,195, 48,250, 37,253,197,174, 46, 93,186, +116, 37, 8,130, 2,192,208, 52, 77, 62,123,246,108, 60, 77,211,236,146,123,222, 54, 0,199, 0, 40,116, 58, 64,135,127,192,155, +117,168,182, 66,235, 58, 0,183,142, 29, 59,234,123,122,122,194,205,205, 13,142,142,142,208,211,211, 43,190,137,231,228, 88,133, +133,133,141,125,240,224,193,216,171, 87,175,226,213,171, 87, 50, 0,143, 0, 84,122, 81,247, 25,236, 58, 95, 79,196,223, 13, 0, +217,169, 57, 25,169,241, 89,187, 51, 50, 50,182, 1, 40, 31, 34,188,241,164, 73,147,150, 44, 88,176, 0,254,254,254, 56,125,250, + 52, 20, 10, 5, 10, 11,171,209, 47,210, 44,136,239,110, 5,132, 9, 64,114, 16, 32,176, 4,132, 86,117, 46, 41, 19, 19,147,141, + 11, 23, 46, 92,228,226,226, 82, 22,197, 92,173, 86,131,162, 40,168,213,106,136,197, 98, 44, 89,178,164,184,163,101, 24,208, 52, +141, 27, 55,110,204,159, 53,107, 22,196, 98,241,226,202, 56,187,180,175,247,146, 36, 72,251, 82, 95, 13,163,209,164, 62, 13, 75, +237, 64,105, 52, 44,185, 92, 85,105,166,114, 61, 61,110,181, 34,143,195,225,216,191,250,243, 79, 75,146,199, 3,163,209, 0, 52, + 13,134,166, 75,138,179,228,197, 20,127,199,104,104, 48,106, 13,104,138, 6, 37, 83,160,211,220,185,218, 20, 69, 55, 14, 79,255, +244,196,153, 75,173, 59,119,233,194,105, 80,207, 22,148,134,198,251,132, 84,235,144,151, 79,187,159,255,125,223, 28,165,172,112, + 60,128, 58,197,217,226, 9, 12, 3,246, 30, 56,108,255, 34, 44, 10,129,247, 30,224,206,221, 32, 0,192,173,123,193,165,130,187, +198,170, 2, 85,212,106,225,244,225,252,173,123,207,112, 22, 78, 31,193,250,105,239, 89,206,130,105,195, 88, 91,119,159,230, 46, +152, 54,140,181,117,207,105,238,130,233,195, 89, 62,187,142,182, 6, 96, 2, 64, 92, 21, 89, 85,117, 68, 80, 20,255,100, 92, 38, + 11, 0,178,125,125,161,206,202,130,237,250,245, 0,128,137,141,173,180, 30,154, 48, 55, 55,127,201,225,112,236,107,218, 79,173, + 86,215, 40,130,167, 76,153,210, 70, 38,147,189,164, 40,138, 97,179,217,222, 19, 70,244,191, 50,160, 71,155,156,242,251, 68, 68, +132,155,109,217,242,231,240,115, 33,133,204,216,246, 6, 33,254,219,167,116, 24,188,236,120,120, 53, 29, 50,169, 80, 40,240,246, +237, 91,148, 79,242, 94, 14,154, 58, 94, 82, 36,128, 93,102,102,102,157,115,114,114, 38, 2, 88, 93, 80, 80,208,154,197, 98,193, +212,212,116,181, 82,169,124,111,100,100,116, 36, 63, 63, 63,184,196,107,164,109,202,128,158,134,134,134,126,151, 47, 95, 54,105, +215,174, 29,249,241,227, 71, 52,108,216, 16,185,185,185,157, 30, 60,120,208,126,250,244,233,211, 11, 11, 11,191, 45,121, 24,212, + 22,205, 4, 2, 1, 51,121,242,100, 66,163,249,235,116,143, 30, 61, 10,143,150, 84, 19, 11, 99,129, 84,174,100,242, 3,223, 26, +125,199,229,114, 31, 37, 37, 37,229,215,182, 48,184,192,138,201, 75,151,178, 68,137,137, 16,133,135, 99, 98, 65, 1,251,167, 98, +239, 86,141, 66,139, 36, 73, 7,191,211,191, 57,242,120, 60, 80, 20, 85, 38, 6, 75,239, 81,106,181, 26, 42,149, 10,106,181, 26, + 26,141, 6,106,149, 26, 62, 63,254, 92,231,123,161, 64, 32, 16,216,216,216,100, 10, 4, 2,193, 23,138,203,250,185, 36, 57,179, +109,251,246,179,214, 15, 31,174,247,252,249,115, 61,146, 36, 65, 81, 20,182,109,219, 70, 49, 12, 99,236, 2, 24,190, 2, 10,106, +203,205,231,243,217,191,255,254,251,120, 30,143, 7, 0, 80, 42,149,104,217,178, 37,161,235,243,117,248, 15,138,173,207,188, 92, +213, 9,173,129, 5, 5, 5,208,104, 52, 48, 48, 48, 0,139,245,105,191,111,102,102,134,126,253,250,161,103,207,158,240,244,244, +196,171, 87,175,244, 61, 61, 61,251, 85, 69, 54, 97,233, 96,212,115,180, 42,233, 76,104,155,199,215,194,182, 30,253,225,130,197, +135, 15, 31,150,150,219,109,250,236,217,179,137,156,156, 28,140, 25, 51,230,129, 66,161, 24,138,106, 46, 62, 13,141, 84,119,207, +137,160, 25, 66,127,199,179,195,132, 82, 46, 99, 72,146,148,149, 14, 29,214,165,148, 8,130, 24, 99,107,107,139, 51,103,206, 64, +169,252, 60, 92,152,161,161, 33,162,163,163,255,242,170,177, 88,232,210,165, 11,139, 32,136, 49, 0, 22, 87,206, 73,218, 63,126, +145,104, 89,186, 61,184, 95, 11,110,151,246,100,102,122,166,132, 1, 64,172, 89,179,166, 76,184, 1,192,198,141, 27,181,177, 19, + 36,135,131,236,160,160,191,110,196,108, 18, 36,151, 0,193, 1, 72,118,241, 40, 42, 24,128,209, 0, 52, 5,208,106, 64,207,166, +158, 54,197,208,201,174,190,163,255,150, 95,247, 27, 43,212, 12,206,252, 17,136,132,132,120,176, 72, 18,141,155, 56,162,127,175, + 30,156,246, 29,187,214,251,121,195,210,171,233,201,239, 6, 2,120, 94,235,130,166, 25,189, 38,245,205,113,228,104, 8, 44, 76, + 68, 24, 51,252, 27,232,235,241,241,211,158,223,240,227, 42, 47, 56, 54,118,192,193,157,155,171, 60,220,200,200,104,147,179, 99, + 19,135,253,191, 95,131,115,243,230,172,253,126,215,224,236, 82,242,222,194,153,181,223,239, 26, 92, 90,184,176,246,251, 93, 67, +235, 22,205, 26,188,204,120,182, 41, 55, 55,215,171,234,242,172, 80, 71,253,139,235,136, 83, 68,151,221,180, 19,231,204, 1,128, + 50,161, 85, 27,112, 56, 28,251,244,244,116,203,154,246,171,201,107, 80,226,201,122, 73, 81, 20,178,178,178,136,188,188, 60,198, +216,216,120,248,205,131,171, 47,123,184,182,201, 5,128,240,240,112, 83, 31,159, 45,195,207,190, 44,128,236,233, 94,226,228,159, + 65,244,196,161,110, 47,255,216, 58,165, 61, 74, 82, 66, 84,132, 66,161, 72,104,219,182, 45, 83,242,217,142,207,231,115, 43,180, + 55,219,166, 77,155,126,230,181,214, 98, 72,113,215,147, 39, 79,188, 92, 92, 92,208,188,121,243,224,206,157, 59, 27, 10,133, 66, +220,188,121, 19,206,206,206, 45, 12, 13, 13,159,157, 63,127,158,179,114,229,202, 54,199,142, 29, 3,128,249, 90, 20,103, 95,119, +119,247, 51,254,254,254,122, 92, 46, 23, 50,153, 12,209,209,209, 48, 50, 50, 2,143,199,195,176, 97,195, 88,221,187,119, 55,235, +213,171,215,197,216,216,216,241,168,197, 10, 40,185, 92,206,172, 94,189, 26, 2,129, 0, 2,129, 0, 66,161, 16, 66,161, 16, 34, + 61, 16,190, 11,235,235, 47, 56,148,167,191,120,189,239, 86,191,253, 27,238,213,171, 71,175, 75, 73, 73,201,171,109, 91,144, 61, +120, 0, 81,120, 56, 80,238,218,213, 22, 70, 66, 83,120,123,123,215,228,145, 2,151,203, 69,183,110,221,106,228, 51, 53, 53,189, +196,102,179, 63,121, 50,165, 40, 74,207,219,219, 91, 19, 27, 27, 43, 36, 73, 82, 72,211, 52,188,189,189, 53, 20, 69,233, 89, 90, + 90, 6,211, 52,157,249,241,227,199,255, 99,239,186,195,162,184,214,247, 59,179,125,233,189,169,160,162, 40, 8,130, 13,197,134, + 93, 19, 49,177,198,216,141, 38,222, 36,150, 88, 18,177, 69, 99,131,196, 26, 19,141,154,196,104,188, 54,236, 98,239, 38,118, 5, +145,162,160, 72, 19, 22, 88,250,194,182,217,157,153,223, 31,176, 43, 32, 91,208,220,223, 45,217,247,121,246,217,157,157,217,119, +207,153,114,206,123,190,239, 59,223, 25,105,140,183, 15, 32,186, 5,140, 32,120,188,185,158, 94, 94, 45,194,125,125,173, 46, 93, +186,196, 1, 0, 31, 31, 31, 86, 34,145,148,157, 56,113, 66,198, 5,126,242, 97,217, 61,141, 16, 89, 42, 0, 95,146, 36,249,189, + 80, 40,228, 54,111,222, 60,107,217,178,101,183,107, 44,164, 96, 89,150,108,222,188,121,168, 88, 44,246, 81,169, 84, 90, 84,187, + 14, 45,214,172,255, 1,176, 44,219,169, 90,183,235,161, 6, 32,208, 25,240,171,123, 59,184,212,251, 30, 0,138,106, 6,138,238, + 6,182,139, 1, 36, 3,104, 11,192,173,102,223,125,130, 32, 74,222,160,152,134, 45, 90,177,177,177,250, 33,108, 68, 68,132,190, + 99,177,181,181,197,253,251,247, 65, 16, 4,108,109,109, 97,103,103, 7,123,123,123, 84, 84, 84, 32, 57, 57, 25, 79,158, 60, 65, +102,102, 38, 8,130,128,175,175, 47,116, 55,123, 45,232, 27,184,125, 27, 98, 33,178, 17,130, 32,128,142,253,130, 17,220, 59, 8, + 93,238,165,207,121,112,137,216, 41,145, 72,210, 0,112,131,130,130,166,117,235,214, 13, 27, 55,110,132, 74,165,218,104, 64,100, +233, 57,255, 72,214,118, 6, 0, 79, 79,207, 5,123,207, 61,183,154, 56,164,149, 92, 34,145,172,127,131,147, 83,167, 33, 46, 42, + 42, 50,123, 45, 62,134, 97, 80, 90, 90,106,148,179,190,133, 96,211,247, 63, 58,200,202, 11,176,234,219,189,208,104, 52,152, 63, +127, 62, 24,134,209,191,202,202,202,204, 42, 39, 75,211,175,219, 14,200,106,239, 41,193, 5,188,199, 86,235,138,236, 3, 63,130, + 96, 1,130, 6,240,122,189,234,119, 66, 34, 14, 95,124,112,197,183, 91, 28,226,158,188,196,137,203,113,160, 42,114, 33,121,116, +172,218,228,216,125, 28, 14,169, 56,232, 26,220, 10, 95, 44,249,206,113,233, 23,147, 14,170, 21, 50,127,212,117, 35, 94, 50,253, +208,208, 88,181,114, 37,118,110,217,136,239, 54,110, 65, 69,121, 25,120, 60,151,154,134,158, 6, 77,211,198,235,206,178, 67, 34, +231, 76, 37,190,253,233, 40, 66,219,121,226,200,185,123,232,217,193, 7,199, 46, 60, 64,239, 78, 45,112,226, 82, 28,250,117,109, +133, 51,215, 19,241,197,140,113,196,184,243,187,134, 52,230, 26,109,222,252,163,131,172,162, 0,177,107,246,160,112,235, 86,100, +205,156,137,208,154, 99,238, 17, 4,248, 77,155, 2,124,211,215,168, 62, 82, 82, 82,160, 82,169, 26, 26,153, 35, 32, 32,192,228, +117, 87, 40, 20, 15,181, 90, 45, 91, 80, 80, 64, 20, 20, 20,192,218,218,154, 72, 74, 74,164, 3, 3,131, 70,176, 79, 14,255, 12, + 0, 81, 81,107, 71, 28,122, 88, 1,249,173, 45, 80,220,254, 1,252, 22, 9,228,206,111,102, 80,159, 44,223,241,176,214, 51, 90, +167,156,249,249,249,239,228,231,231, 3, 0, 90,182,108,249, 36, 53, 53,181,173,206,213, 92,227, 66,228,107,181, 90, 63,157, 59, + 81,171,213, 66,165, 82, 97,192,128, 1, 28, 99,117,119,116,116,236, 22, 16, 16,128,184,184, 56,108,217,178,197,169,111,223,190, +120,246,236, 25, 8,130,192,218,181,107,137,118,237,218,241,138,138,138, 48,120,240, 96, 28, 61,122,180,123, 69, 69,133,169,243, +105,107,109,109,189,235,212,169, 83, 34,146, 36, 33,147,201,192, 48, 12,122,244,232, 1,146, 36,145,152,152,136, 37, 75,150,224, +232,209,163, 56,126,252,184,184, 83,167, 78,187,228,114,121, 0,234,186,245, 13, 93, 35, 86,169, 84,178, 66,161, 16, 66,161, 16, + 34,145, 8, 34,145, 8, 2,129, 0,149, 74,224,147, 77, 89, 42,142,200,133, 9,236,208,179,213,212,217,107,201,245,203, 62,186, + 2,224,132,185,247, 60, 80, 29,147,245,253,111,191,109,153, 80, 94, 78, 2,192, 47, 4,193, 80, 44,251,157, 57,207, 59, 0, 84, + 42,203,225,227,219, 20, 71, 14, 30,199,168,177,195, 27, 20, 89, 60, 30, 31,124, 30, 15,118, 78,214, 38, 57,249,124,190,251,147, + 39, 79,156,121, 60, 30, 88,150, 5, 77,211,160, 40,170, 96,233,210,165,174, 67,135, 14,181, 61,123,246, 44, 57,116,232, 80,198, +209,209,177,234,222,189,123,133, 90,173,214,185, 87,175, 94, 6, 57,173,128, 96,165,125,235,239, 5, 28,109,112,244,226,207,133, +147, 38, 77,226, 76,157, 58, 21,217,217,217,152, 54,109,154,242,226,197,139,234,124,137,228,132,128, 97,126,164,128, 4,115,219, +228,122,216, 22, 28, 28,220,241,216,177, 99, 31, 69, 70, 70, 62, 88,176, 96,193,170,218, 59,215,173, 91,183,242,204,153, 51, 62, + 35, 70,140,248,253,209,163, 71,219, 26,211, 46,189,109,223, 97,225,124, 59, 24,210, 34, 58,227, 40, 65, 16,177,181,218,236, 8, +221,118,100,100,228,226,168,168,168, 36,130, 32, 98,107,127,175, 59,174,102,176, 24,219,208,118,205,111,157, 22, 45, 90, 20, 20, + 29, 29,189, 54, 44, 44,236,192,173, 91,183, 94, 0,104,172,208, 50, 30,163,165,171, 80,237, 74,214,235,212, 80, 81, 81,129,138, +138, 10,228,228,228, 96,251,246,237, 53, 15, 52, 15, 92, 46, 23, 92, 46, 87, 31,207, 96, 8,151, 99,255,252, 1,192, 15, 29, 59, +118,228, 61,190, 29,115,246,171,157,179,251,119, 30,208,145,243,240,242,227,209,168, 94,143,240,157,201,147, 39,187, 0,192,158, + 61,123,138, 0,156,253, 55,169,230,152,180,180,180, 47, 60, 61, 61,245, 49, 42,181,221,135, 90,173, 22, 34,145, 8,186, 88, 22, +165, 82,137,237,219,183,107, 89,150,141, 49,194,137,212,164, 43, 72, 75,186, 90,253, 59,134, 1, 67,191,250,253,138, 21, 43,192, +178,172,190,179,255,180,198,114, 98, 82,228, 53,116,206,217,122,239,245,190,103,105,218,132,123,130, 63,123,244,164,153,158, 12, +193,197,201, 43,241,224,241,120, 96,106, 89, 51,121,156,234,209,114,210,179, 60,120,185, 7,226,189,113, 51, 60,142,253,254,227, +108, 45,165,252,182,177,231,218, 63, 56, 12,115,190,248, 2, 63,239,220,137, 37,203, 87,234, 21,128,150,166,161, 53, 89, 78,146, + 28,208, 35, 8,218,202, 60,112, 56, 28,244, 11,109, 5, 14,135,131,129, 97,109,192,225,112, 48,184,135, 63,184, 92, 46,134,244, +108,135,214,173, 91,131,203,229,146, 38,174, 59, 82,147, 46, 35, 45,233, 90, 45,209,203,130, 5, 64, 73, 36,175, 29,175,145, 72, +192,122, 59, 55,246,222,194,180,105,211,202,114,114,114,168,250,251,154, 53,107,198,191,113,227,134,131, 1,183,157, 30, 98,177, +184, 19,151,203,125, 88, 82, 82,194, 88, 89, 89,145, 12, 67, 51,129,129, 65,156,115, 59, 22, 31,211, 29,179,104,209,226, 99, 31, +116,178, 27,177, 55, 38,150,229, 55,239, 73, 16, 60,161,246,227,229, 59,248, 60,190,184, 19,160, 48,103,240, 64,170, 84, 42, 60, +125,250, 20,166,202,195,178,172, 81, 55, 77,105,105,233,228,128,128,128, 27, 63,252,240,131, 19, 65, 16,248,227,143, 63,192,225, +112,244,175,244,244,116,144, 36,137,175,190,250,138,170,168,168,152,110,170,108, 92, 46,247,139, 35, 71,142,216, 11, 4, 2,200, +100, 50,253,115,195,225,112,240,228,201, 19,172, 95,191, 30,147, 39, 79, 70,118,118, 54,188,188,188, 48,127,254,124,155,232,232, +232, 47, 40,138, 90,105,198, 37, 74, 80,171,213,157,173,172,172, 32, 18,137,160, 19, 92, 0,112, 33,137,151,168, 80, 40,218, 59, + 59,203, 61, 92,175,199,158,236,222,247,189, 16,103, 87,207, 48,137, 68,210,168,165,179,158, 3, 59, 51,104,122,233, 59,199,142, +185,221, 60,118,140,185,115,234,212, 75,161, 76,182,195,236,123, 72, 67, 34, 43,253, 37, 58,117,234,132,135, 15, 31,162, 83,167, + 78,181, 69, 19, 4, 2, 1,248,124, 62,248,124, 62, 92, 28,205, 10,161, 96, 73,146,196,205,155, 55, 65,211, 52,212,106, 53,212, +106, 53,218,181,107, 87,114,245,234, 85, 27, 0, 72, 79, 79,103, 39, 78,156, 88,118,247,238, 93,116,232, 96,124, 61,117, 37, 65, + 92, 94,177,118,131,253,183,155,119,193,222,201, 29,215,175, 95,167,207,157, 59, 39, 35,128,212,180,164,164,141,239, 1,103, 98, + 0,170, 49,231,204,221,221,253, 6,135,195,105, 94,251,187,226,226, 98,199,145, 35, 71,162,180,180,244,221,145, 35, 71,246,172, +105, 19,114, 15, 31, 62, 60, 17, 0, 4, 2, 1, 72,146,164, 97,193,127, 21, 76,105,145,218, 66,169,190,224,138,138,138,138,168, +255, 93,109, 81,213,208,231,218,191,141,142,142, 94, 91,139, 91,241, 6,197, 55, 29,163, 21, 27, 27,203, 54,160, 32,205,134, 41, +161,165, 67, 92, 92,156,198,203,203,235,231,180,248,204,254,173,130,125, 33,182, 22, 14, 2,240,131, 80, 40,156, 55,105,210, 36, +220,185,115, 7,137,137,137,191,226, 45,103,225, 4, 5, 5,157, 23, 10,133, 62, 6,220, 36, 89,137,137,137,131, 13,116, 12,203, + 79,157, 58, 5, 99,193,240, 87,174, 92,169,221, 41,213, 14,134,111,248,198, 96, 88,104, 40, 13,170,228,138, 87,157,120,141,208, +170,170,170,194,216,177, 99,235, 88,180, 10, 11, 11, 77,214,143, 32, 8,172, 63,113, 2, 23, 99, 98,240,110, 72, 8,142,222,187, +135,232, 73,227,225,239,211, 4, 44, 77,128, 37,128,236,253, 63,162,184,162, 18,251, 46,223, 68,137, 76,142, 9,189,122,193,207, +206,197, 56, 47,143, 63, 48,180, 91, 24,255,210,173,100,240,120, 92,144, 96,192,106,228,240, 10,232, 3, 14, 73,194,222,189, 5, +248, 60, 30,120, 60, 46,210,115,138, 16, 16,212, 69, 16, 43, 16, 13,124, 19,161,213,204,167, 5,104,154,198,228,201,147,113,224, +192, 1, 56,123,248,192,190, 89, 16, 86,111,220,137,119, 7,244, 50, 89,127,221, 8,158,203,229,130,195,225,188,246,174,251,108, +142,117,146,101, 88, 80,245,175, 17,195, 2, 44,139,166,107,214,160,233,154, 53,184, 87,243,159,237,170,170,160, 80, 40,128,174, +129,141, 18, 89,106,181, 26, 57, 57, 57, 84,126,126,190,123, 3,251, 11,212,106,181, 73, 97,179,123,247,238,132, 41, 83,166,116, +118,114,114,122,144,240,232,145, 38, 56, 36,132,119,118,251,226,227, 58,183, 33, 0,132,132,132,148, 44, 94,188,248,248,196, 49, + 17,195,183, 69,126, 72,127,182,242,119,174, 80, 44,238, 28,177, 96,119,194,254, 49, 99, 76,251,102, 84,170,140,224,224, 96,214, +156,122,201,229,242,124, 35,187,135, 1,248,166, 99,199,142,118,125,251,246,197,141, 27, 55, 48,106,212, 40, 21, 69, 81,105, 0, + 48,116,232,208, 54,251,246,237, 19, 36, 39, 39,195,213,213,149,151,149,149,181, 11, 38, 2,228, 5, 2, 65,159, 46, 93,186,144, + 42,149,234, 53,145, 21, 29, 29,141,113,227,198,161, 77,155, 54, 96, 24, 6,149,149,149,232,219,183, 47,111,203,150, 45,125,204, + 20, 90,115,252,253,253,215,163,122,214, 97,237,182, 48,165,198, 5,133,226,226,226,252,248,187,151,147,122, 13, 24,217,185,121, +235, 32,207,196,132,135, 70, 9,221,220,220, 22,145, 36,249, 1,195, 48,156,138,138,138,156,120,181,186,117, 59, 31, 31,247, 30, +195,135,163,156,199,227,124,127,249, 50, 89, 32,147,217, 0, 48,203, 5,169,212, 84,193,199,183, 58,212,111,212,216,225,120,248, +240, 33, 70,127, 56, 2,124, 62, 31, 92, 46,175,250,217,228, 87, 91,180, 28, 92,236,204,186, 55, 53, 26,141,190, 13,215,197,121, + 81, 20, 5, 93,104,150,149,149,149,126,159, 74,165, 2, 65, 16,198,238, 13,178,111,239, 30,184, 21,151,170,157,254,213,247, 42, + 94,241,195,104, 15,134,217,253, 18, 40,120,139,230,220,239,208,202,101,110, 98, 59,123,208, 26, 13, 2,135,143,214, 63, 39,119, +127,217, 38, 6,195,136,203,178, 50, 48, 43,230,212, 95,189,102,174, 5,255, 6,152,210, 34,181,133,210,219,130, 32,136,216,200, +200,200,197, 0,216,200,200,200,197,186,237,168,168, 40, 5,128,220, 55, 20, 91,175, 89,185,184,127,133,200,210,185, 23,140,161, +111,223,190,179,108,109,109,183,232,182,115,238,228, 34,231, 78, 46, 2,218, 6,246,232, 24,210,185,124,220,184,113,112,118,118, +198,130, 5, 11, 88, 0,191, 54,246,255,211, 83,147,108, 0,176,158,158,158, 11,106, 26,228,144,123,247,238,185,222,191,127, 31, + 93,186,116,121,101,186,167, 40,244,236,217,211, 24,149,172, 38,168,125,238, 95,103, 37, 99, 64, 81, 20,228,114, 5,212,106, 10, + 90, 13, 3,173, 86,139, 78,129,182,248,125,103,100,245,119, 90,157,245,172,218,106,214,212,195, 22,182, 54, 60, 13, 73, 18,138, + 7, 9,249, 13,182,152,106,181, 26, 9, 89, 89,120,148,153, 9, 0,120, 47,202,120,224,235,239,151,111,160, 93,187,118,166, 74, +219,170,169,151, 7,242, 46, 38, 84, 55,222,138, 28,220,255,243, 16,108,109,109, 0, 0,129,225, 19,192,231, 87, 11,173, 42, 5, + 5,151,182,205, 64,176,172,193,180, 0, 86,142, 30,231,185,124,145, 15, 75, 51, 96, 89, 6, 44, 67,131,101, 25,112,120,124,171, + 89,159,126, 4,134,161, 17, 26, 26, 10,130,195, 1,173, 81, 97,204,176,129, 40, 45,151,193,217,193,188, 78,130,207,231, 35, 60, + 60, 92,108,104,255,179,103,207, 20,181,133,153,241,107,164, 65, 85,149, 2, 42,149, 10,148, 90, 11, 74,163, 5,221,146,143, 85, + 75,199, 67, 75,105, 33,255, 48, 12,148, 70, 11,230,139, 17,160,212, 26,100, 91,145,100,112,128,139,134, 4,161,136, 79,145,218, +153, 18, 90, 58,113, 96, 8, 13,197, 4, 26, 16, 91,143,166, 76,153,210, 41, 56, 36,228,225, 7, 3, 66, 54, 60, 78, 76,202,123, +156,152,244,218,113, 62,109, 66, 50, 62,139, 62, 48,159,199, 23,119,138, 88, 96,124,214, 97,109,212,118, 35,190, 37, 22,203,100, +178, 96, 27, 27, 27,164,166,166,130,195,225,128, 32,136,103, 0,130, 1,192,211,211,243, 57,151,203,245,229,112, 56,216,186,117, + 43,193,229,114,219,135,133,133, 45, 86, 42,149,135,140, 12,232, 2,108,109,109,235, 88,179,248,124, 62, 34, 35, 35, 49,113,226, + 68,189,200,226,243,249,216,189,123, 55, 58,119,238, 12,181, 90, 29, 96,102,121,239, 3,232,101,134,197,143,168, 17,231, 38,197, +168, 86,171,157, 82,252,193, 7,173,113,253, 58,122,248,250,182,235,212,169, 19, 40,234,149, 65,199,215,215,183,153, 76, 38,203, + 87, 40, 20,255, 68,117, 26,130,120,163,162, 72,201, 32, 43,189, 58,252,244,225,195,135, 8, 13, 13,213, 91,176,106, 91,179,248, +124, 62,196, 2,155, 70, 9, 45,134,169,110,151,100, 50, 25,121,253,250,117, 23,127,127,127, 2, 0,252,253,253,137,248,248,120, + 39, 43, 43,171,162, 86,173, 90,153, 26, 0,243, 1,160,207,160,145,220,139,231,206, 88,107,129,149,249, 28,206, 74,174,201, 54, +146,213,208, 12, 99, 48,232, 94,108,103,143,221, 83,198, 2, 0,190, 30, 48, 68, 63,216, 58,247,205, 98,240,120, 60,244, 95,176, +248,181,103,137, 97, 24, 14, 44,248,159, 18, 89, 13, 89,180,222,174,111,126,101,209,138,138,138, 74,138,138,138,122,205, 58,214, + 72,152,182,104,213, 54,221, 53, 22,186,135,213, 16, 54,110,220,136,246,237,219, 27,237,136,182,108,217,130,189,123,247,110, 4, +144,222,104,147, 99,255,142,129,216,116, 44,201,183, 77, 32, 1, 0, 43,191, 24, 70, 86, 85, 85,225,230,205,155,176,183,183,199, +179,103,102,167,253,178,181,183,183,255,134, 36,201, 49,156,250, 51, 0, 26, 22,152, 52,195, 48, 49,229,229,229, 6,211, 59,176, + 44, 64,105,180,168,146, 43,161, 86,171,241,197, 87, 63,154, 44, 68, 20, 64, 80,106, 25, 55,188,119,152,216,144, 69, 39,180,125, + 31,124, 62,201,230,181,206,155, 67, 2, 36, 9,116, 8,173,182,184,196,223, 75, 2,195, 0, 52, 3,184,184, 57,226,215,253, 27, +140,138,124, 45,205,212,140,142,105, 84,170,104, 4,116,139,192,203,148,235,122, 11,146,128, 95,237, 50,230,243,120, 96, 88,162, + 58,235,131,161, 86, 87, 32,246, 41,149,164,251,237,140,125,140, 79, 34,218,227,240,165, 4,140, 30, 16,140,171,119,147,209,183, +107, 59, 36,165,101, 34,208,175, 57,182,238,138, 1,203, 66,246,211,166,213,249,175, 58, 52,109,150, 57, 22,173, 59,119,238, 40, +234, 91,177,106,191,179,166,251, 67,176,236, 43,139,150, 66,169,194,130, 69,102,165,222,169,190, 70,189,186,137,205, 57,216,152, +197,202, 28, 33, 86,223,178, 5, 19,233, 89, 90, 2,232, 12, 44,252,119, 54,156, 52, 77,227,244,233,211,250,235,209,208,117,172, +125,237,204, 16, 57,200,202,202, 66, 82, 82, 18,186,117,235,134,242,242,114,240, 72, 18,243, 31, 63, 70,187, 73,147,160,230,243, +193, 48, 12, 4, 2, 1,102,204,152, 97,246,249,108,100,235, 92, 19,120, 77,155, 34,223, 16, 22, 22,214, 58,181,170, 10, 73, 79, +158, 96,192,138, 21, 0,128, 51,103,206,212,185, 39,230,205,155, 39, 72, 78, 78,158,246,224,193,131,105,121,121,121, 27, 1,204, + 55,216,206,178, 42,125,140,214, 7,227, 71,161,181,127, 75,236,253,109,191,126,255,188, 47,231,128,199,227,131,199,231,193,193, +222,193,172,218,104, 52, 26,189,104,149,203,229,228,153, 51,103,154, 14, 28, 56,144, 63,103,206, 28, 2, 0,246,238,221, 75,254, +240,195, 15,214, 23, 47, 94,228, 55,105,210, 68, 98,194, 66, 80,145, 91,172, 18, 2,128,183,183, 55,126,220,113,146, 28, 58,116, + 40,230,204,153, 3,141, 70,131,109,219,170,159,171,113,227,198,129,162, 40, 28, 57,114, 68,247, 28, 27,181, 70,105, 41,234,181, +251,134, 32, 8,240,120, 60,240, 5,124,128, 97, 64, 16,132,245,186,117,235, 86, 38, 37, 37,117,241,247,247,135, 74,165,154,132, +234,201, 31,150, 60, 90,255,101, 98,203,152, 22,105, 40,214,170,198, 42,101, 8,210,218,113, 91,134,132, 90,237,152, 45,188,217, + 4, 10,243, 98,180, 26, 2,135,195, 49,105,173,210, 77,213, 53,134,121,243,230,193,214,214,214, 80, 7,196, 62,126,252, 56, 89, + 34,145,236, 4,240,227, 27, 93,156,203,113, 73,223,204, 29, 33, 67,141,111,213,193,193,161,168, 95,191,126,149, 0,168, 67,135, +234, 14,144, 85, 42,149,193, 14,220,222,222,254,155, 95,126,249,101,246,240,225,195,201,250, 41, 6,106,187,247,116, 47,141, 70, +131, 67,135, 14,205, 94,184,112, 33,202,203,203,231, 26,235,196,229, 85, 10, 40,106, 2,161,159, 39, 30, 54,183, 81, 55,184,203, +198,193, 19, 77, 91, 6, 27,236, 76, 72,126,117, 12,145,187,247,171, 14,204,214, 86, 4,218, 8, 39, 65,144,233,153,217,121, 77, +154,121, 56,225,121,142, 20,238,205,219,163, 52,247,213,121,224,114, 57,224,213,184, 14, 29,236,172, 33, 45, 44, 4, 73,114,140, + 10,227,213,251,226,112, 55, 49, 19, 71, 46,197,131, 82, 86, 97,211,158,115,160, 84,149,160,148, 85,160,148,213,239,107, 23,126, + 12,130, 64,190, 70, 85,213,166, 49,215,157,203,229,162,107,215,174, 6,133, 78,110,110,174,153, 22, 45, 86,111,209, 82, 40, 27, +121,141,204, 27, 57, 25,181, 88,233,246,191,169, 48,208,165,124, 16,139,197,157,119,239, 54,156,198,161, 33,120,120,120,156,181, +177,177,105, 97,238,241,141, 72, 94,186,214,193,193,225, 27,127,127,255,128, 77,155, 54,241, 56, 28, 14,250,247,239,223,198,195, +195, 35, 11, 0, 2, 3, 3,189,116,109,204,103,159,125,198,222,185,115, 39,177,122,140, 97, 24, 2,129,224,137,189,189,125,231, +190,125,251,162,188,188, 28, 57, 57, 57,176,182,182, 70,187, 13, 27,240,248,179,207, 16,178,125, 59,200,126,253, 64, 16, 4, 4, + 2, 1, 30, 63,126, 12,177, 88,252, 68,169, 52,152,242,173, 43,128,239, 0,244,192, 43,119, 33, 11,224, 38,170,211, 46,220,109, +160,189, 35, 1,128,102, 24, 83, 23,107,252,130, 5, 11, 80,198,227, 1, 67,135,130,159,158, 14,138,162,208,173, 91, 55,189,149, +189, 91,183,110,224,114,185, 8, 14, 14,134,151,151, 23,182,110,221, 58,222,152,208, 82, 86, 82,200, 74,127,137,176,176, 48,189, +229,106,232,208,161,122,139, 22,143,199,211, 91,182, 8,218,180,112, 37, 8,130,173, 61, 72,166,105,154,224,114,185,220,185,115, +231, 18,163, 70,141, 98,213,106, 53, 35, 16, 8,200, 35, 71,142, 16, 87,175, 94,229, 86, 85, 85,153,178, 54, 84,125,248,225,135, +110,205,154, 53, 69,206,243, 36, 28, 62,204, 98,227,198,141,184,113,163, 58,203, 70,106,106,245,196, 85,221,118,223,190,125,209, +162, 69, 11,176, 38,110,252,160, 17, 99,240,245,192,119,170,219,147, 22,174,224,241,121, 16,240,249, 88,240,228,165,254, 90,219, +237, 62, 32,136,142,142, 30,237,239,239, 95,237,218, 7,184,150, 60, 90,255, 93, 48, 97,232,145,214, 19, 73,234, 90,219, 82, 0, + 68,205,182,180,150,160,146, 18, 4,113,159,101,217, 46,245,142,213,237, 87,215,123,215,237,127,244, 6,197,215,173,117,248,154, +248, 50, 54, 34, 78,187,125,251,182, 95,167, 78,157,144,157,157,253,218, 76, 56, 93,199,101,109,109, 13,177, 88,140, 91,183,110, + 1, 64,154, 33,178,171, 87,175,254,128,234,172,203,168,113, 27,132,245,253,160,207,173,208, 33, 93,176, 47,106,127,185, 68, 34, + 9,198,171, 28, 58,132,151,151,215, 68,158,128, 59,214, 55,200, 59, 28, 12,243,221,229, 83, 55, 87, 24,171,161,111,155,192, 74, + 0, 10,221,172,195, 55,156,125, 8,146, 36,199, 12, 31, 62,156, 76, 78, 78,198,216,177, 99,177,119,239, 94,131,199, 78,156, 56, + 17, 7, 14, 28,192,240,225,195,201, 69,139, 22, 25, 76,239, 80,215, 90,162,254,203,110,202,212,103,143,240,251,129, 95, 12,198, + 32,185,185, 85,199, 99, 21, 22, 22,233,191,235,210,201,184,103,132,209,170, 47,198, 61,184, 23,214,189,119,127,126, 78, 65, 25, + 24,173, 10, 74,217,171,223,203,203, 10,192,106,149,224, 91, 57,193,195,197, 30, 15,111, 95, 80, 83,106,229, 69, 99,156,179,135, + 7,226,179, 97, 1, 0,203, 96,196,252, 95, 17,251,227, 44,253, 8,186,231,168, 57,184,124,232,123,179, 99,252,234,131,199,227, +225,241,227,199, 10, 67,214, 44, 14,135, 99, 78, 78,174, 26,171,163, 6,114,185, 2,114,133,242,175,108, 59, 92,221,221,221,127, +114,116,116, 20, 25, 16, 82,174,174,174,174, 63, 57, 59, 59,139,204,117, 29, 26, 18, 89, 53,121,181, 30, 76,153, 50,165, 81, 98, + 75, 40, 20,182, 72, 75, 75,211, 39, 43, 53,246,174, 86,171,209,183,111, 95,115,147,151,158, 2,240,194,211,211,243,102,187,118, +237,236,159, 63,127,142,253,251,247,243,121, 60,158,183,174,253,144,201,100,224,112, 56, 40, 44, 44,212, 0,248, 8, 38, 92,103, + 42,149,234,250,245,235,215, 59, 12, 27, 54,140,243,228,201, 19,112, 56,156,234,114,133,133, 33,100,251,118, 36,206,157,139,240, +204, 76, 40, 41, 10, 34,145, 8,231,207,159,167,228,114,249,117, 67,124, 98,177,120,103, 70, 70, 70,160, 72, 36, 2, 69, 81, 96, + 24, 6, 36, 73, 18, 92, 46,183,167,131,131,195, 22, 0, 93,234,139,229, 85,148, 0, 0, 32, 0, 73, 68, 65, 84, 93, 44,183,144, + 46,125,219,210, 90, 45, 45,201,126, 46, 53,117, 2,138,139,139,113,234,212, 41,116,235,214, 13,225,225,225,200,205,205, 69,122, +122, 58,222,125,247, 93,253, 49,143, 30, 61, 66, 92, 92, 28, 90,181,106,101,218,162, 71,106,208,170,109, 11,240,249,252,106,107, + 14,143, 95, 51,240,225,233, 45, 89,124, 30, 31, 60, 46, 15, 34,177,200,108,139, 22, 65, 16, 32, 73, 18, 4, 65, 64, 44, 22,235, + 6,217, 76,211,166, 77, 37, 37, 37, 37,158, 0, 56, 98,177, 24, 52, 77, 27, 29,180, 48, 44,235,199, 47,186,149, 55,127,225,122, +183,168,168, 75,184,116,169, 16, 36, 73,194,211,211, 19, 36, 73, 34, 35, 35, 3, 36, 73,194,199,199, 7, 36, 73, 34, 55, 55, 87, + 39, 18, 75, 97, 88, 12,235,159, 27,130, 32,244, 34,139, 47,224,235, 45, 91, 0, 80, 86, 86,166, 28, 62,124,248, 63, 85, 42,213, + 84,188,217,170, 39, 22,252, 7,131, 32,136,251,255,142,223, 54, 2, 67,107,132,213,107, 65,241,198,110,198,119,187,119,239,190, +125,220,184,113,253, 55,111,222, 12, 27, 27, 27, 72, 36, 18,125,135, 40, 16, 8,208,172, 89, 51,148,148,148, 96,199,142, 29,120, +249,242,229, 21, 0, 51,204, 45,145, 68, 34,185,243, 44, 62,173,184,239,232,238,206,129,221,219, 58,228,164,189,236, 38,145, 72, +110,213,136,172, 95,199,205,123,119,106,223,145,161,224, 11,120,200,121,150,143,203,167,110,254,191, 92, 76, 14,135,195, 33, 8, + 2, 99,199,142, 53,235,248, 15, 63,252, 16,215,175, 95,135, 49, 55, 35,163,179,104,201,149,168, 82,252,117, 3,171,207,103, 77, +196,231,179, 38,234,197,132, 57,174, 23, 0,240,242, 58,104, 68,104, 81,155, 99, 15,238,248,164, 99,104,152, 79,231,192, 22,184, +251, 32, 30,251,182,191, 50, 50,236,250, 97, 37,190,221,117, 5,205,220, 29, 65,169,170,112,246,240,207,249,148, 74,190,249, 13, +141,114,213,226,150, 32,192,178, 76,163,234,174, 19, 79, 60, 30, 15, 65, 65, 65, 6, 45, 90, 37, 37, 37, 10, 83,214, 44,253, 53, + 82,107, 80, 89,165,128, 66,254,151, 9,173,144,158, 61,123, 94,140,137,137,113,118,115,115, 67, 94, 94, 94,125,161, 21,210,163, + 71,143,139, 49, 49, 49,206,238,238,238,200,201,201, 49, 59,173, 72, 3, 34, 11, 82,169,148, 40, 45, 45,101, 28, 29, 29, 27, 37, +182, 72,146,132, 74,165, 66, 74, 74,138,185,127,107,246,108, 46,123,123,251,221, 7, 14, 28,176, 47, 42, 42, 2,135,195, 65, 74, + 74, 74,157, 89,135,186,215,175,191,254,202, 31, 49, 98,196, 47,101,101,101, 70,167,181,105,181,218,141, 19, 39, 78,156,150,155, +155,235,232,230,230, 6,137, 68, 2,129, 64, 0,150,101, 65,244,237,139, 94, 47, 94,128,162,105,136,197, 98,164,166,166, 98,231, +206,157, 85, 53,169, 98, 26, 52,144, 17, 4,225,199,231,243, 49, 97,194,132, 58, 59,246,236,217,131,247, 58,115, 58,187,218,115, + 43,181, 16,169, 10,196,239,156,229,112, 56, 68, 72,215,126,109,186,246, 30, 26,244, 52,241,238,115,105,193, 75, 83,141,146, 70, +173, 86,195,223,223, 31,247,239,223,199,165, 75,151,208,175, 95, 63,132,135,135, 35, 33, 33, 1, 23, 46, 92, 64, 92, 92, 28, 8, +130,128,179,179,179, 46,252,194,104, 12,134, 90,174, 69, 97, 94,241,107,214,171,250,219,124, 62, 31, 42,133,121,147,251,158, 60, +121,130,251,247,239,235, 83,203,112, 56, 28,237,164, 73,147,192,178, 44,155,145,145, 1, 91, 91, 91,118,202,148, 41, 52,151,203, +213,230,230,154, 23, 31,108, 99, 99, 3, 63, 63,191, 58, 3, 31,221,171, 87,175, 94,120,240,224, 1, 72,146, 4,151,203,133,155, +155, 27,110,222,188,105,242,198,215,137, 42,157,200,226,242,121,117, 68, 31,195, 48,178,132,132,132, 79, 0, 36,212, 88,178, 0, + 75, 30, 45, 11,254,255,112, 26,175, 47, 44,109,210,162,245, 2,192,128,253,251,247,143, 63,126,252,248,198, 45, 91,182,184, 70, + 68, 68,160,180,180, 20, 62, 62, 62,240,244,244, 68,108,108, 44,206,156, 57, 83, 68,211,244,124, 0, 13,153,126, 6,192, 72,206, +154,220,231,146, 24, 85,101,229,103,157,194, 3,112,229,208, 31, 81, 30, 30, 30, 51, 56, 28,206, 23, 83, 22,191, 63,181,207,240, + 46, 72,141,203,192,157, 11,143, 81,144, 93,100,146,179,126, 48,188,131,131,195, 52, 43, 43, 43, 1, 26,152, 74,220,192,172, 67, + 61, 39, 77,211,180, 90,173,198,193,131, 7,205, 18, 91,251,247,239,135, 82,169, 4,253,186,127, 85,207,201, 50, 44,193,229, 9, +225,213,204, 31, 20, 85, 5,134,121,227, 9,149,122, 78,221, 8,244,185, 64, 0,183,162, 34,220,189,123,215, 60,201, 61,116,168, +169,107,164, 84, 43,101, 19,190, 95,179, 32,118,102,228,119, 14,253,186,119,192,215, 27,246,128,162,118,129,228,144, 16, 11,249, +232, 20,218, 3, 28,168,240, 83,244,151,101,242,138,210, 9,120,125, 41,158, 58,156,172, 49, 15, 11, 11,208, 12,131, 75, 55,238, +153, 93,247, 90,110, 14,112,185, 92, 60,123,246, 76,209,208,108, 67, 14,167,218,205,169, 27,169, 27,227,100, 25,134,224,241, 69, +104,230,211, 14,106, 85,229, 95,114,141,220,220,220,190, 60,118,236,152,179, 46, 85, 66, 66, 66, 2, 8,130, 72,121,101,113,172, +222,175, 80, 40,144,152,152,136,132,132, 4,160,122,134,155,217,207,145,206,146, 37,149, 74, 9,137, 68, 2, 43, 43, 43, 50, 33, + 33, 65, 21, 28, 28,252,192,196,243,173,231, 84, 42,149,153,134,226, 39,149, 74,101, 19,145, 72,196,171,215,225,121,181,110,221, + 58,181, 1, 23,226,107,229, 44, 47, 47,191,187,112,225,194, 78, 67,134, 12,193,151, 95,126, 89,226,232,232,104,251,211, 79, 63, +113, 57, 28, 14, 49,115,230, 76,186,176,176,176,242,231,159,127,182, 63,126,252, 56,202,202,202,110,153, 81,119,153, 82,169,252, +164,123,247,238,123,206,157, 59,103,229,231,231,135,138,138, 10,176, 44,139,221,187,119, 99,230,204,153, 16,137, 68, 72, 77, 77, +197,123,239,189, 39,151,203,229,159,224,245,216, 73, 29, 39, 65, 16, 4,203, 48, 12,150, 45, 91,166, 79, 78,170, 75, 86,106, 43, + 38,176,115, 94, 75,235, 57, 63,151, 91,143,255,250,231, 73, 0, 64,107,181,244,211,196,187,207,119,255,248,245, 85, 62,159,127, +195,196, 53, 90, 50,103,206,156,159,134, 14, 29, 42,182,177,177, 65, 73, 73, 9,110,222,188,137,219,183,111,227,206,157, 59, 80, +171,213,112,118,118,134,163,163, 35, 36, 18, 9,158, 60,121,162, 0,176,196, 24,167,192,138, 7,223, 54,186,153,191,213, 22, 44, + 94,173,217,134,181,173, 91,124, 30,207,172,231,168,119,239,222,232,218,181,171, 78,172,208, 89, 89, 89, 18,149, 74, 69,212, 18, +253,185, 58, 65,238,237,237,173,221,187,119, 47,107,138,147, 97,152,215,196,116,175, 94,189,244,131,194,174, 93,187,130,195,225, + 32, 62, 62,222, 80,104, 74, 29,206, 59, 59,183,226,220,170, 37, 16,240,249,152,159,146,163, 23, 93,123,250,117, 4, 79,192, 71, +192,176, 81,181,127,187, 13,213,238, 66,212, 19, 89,198,250,163,183,126,222, 45,156,127,123, 72,240, 6, 75,240,232,176, 79,169, + 84,158,253,248,227,143,163, 67, 66, 66, 62,222,180,105, 19,193,231,243,177, 98,197, 10, 54, 47, 47,239,183,154, 17, 67,233,155, +148,138,101,217,223,174, 29,189,245,233,228,200,225,196,188,205, 83,122, 62,184,156,248,164,125,119, 63,180,239,238,135, 7, 87, +146,241,227,226,253,123,105, 13,189, 44, 63, 63, 63,219, 4,149,106, 64,143,182,245,131,225,157,175, 95,189,236,220,216, 89,135, + 12,195,196,236,223,191,127,246,200,145, 35,201,123,247,238,189, 22,147,165, 91,118,135, 97, 24, 92,188,120, 17, 20, 69,225,183, +223,126, 99, 24,134, 49,156, 71, 11,236,137,239, 55, 71, 79,254,237,247, 19, 2, 1,159,192,237, 27, 71, 80, 94,106,124, 86, 23, +159,207,195,175,187,143, 82,124, 62,239,105, 67,251, 41,138,202,185,124,249,178,251, 96,154,230,145, 36,217,144,128,106, 16, 49, + 49, 49, 26,134, 97,178, 76, 28,118,171,224,101,246,176,213, 95,126,180,127,232, 7, 31,187,119,239,222,147,231,226,230, 14,130, + 32, 80, 88, 80,136,212,196,123,154,179, 71,126, 41,168,146,155,183, 4,207, 71,235,175,233, 99,178, 0, 32, 98,230, 22,125,124, + 22, 0, 12,155,178, 16,125,187, 5,130, 48,199,244,244, 74,100, 49, 90,173, 22,214,214,214,208,106,181, 13,166,120,176,183,183, + 23, 43,149, 74, 69, 77, 34, 70,163, 35,102, 22,248,203,175, 17, 77,211, 1,165,165,165,168,170,170,194,237,219,183,217, 53,107, +214, 72,165, 82,169, 62,104, 83,163,209, 4,148,148,148,160,178,178, 18,183,110,221, 98,163,163,163,165,197,197,197,139, 27,243, + 12,137,197,226,206, 92, 46,247, 65,105,105, 41, 99,101,101, 69,106, 52, 26, 77,112,112,176, 80, 44, 22,155,189,160,186, 68, 34, + 25, 98,104,159,175,175,111, 90, 90, 90, 90,107,154,166,107,175,129,200, 87, 42,149,126,221,187,119, 55,167,253,152,179,107,215, + 46, 28, 61,122, 52,180,162,162, 98, 98, 86, 86,214, 30, 0,161, 92, 46, 23,241,241,241, 41, 74,165,114,220,200,145, 35,119,151, +150,150,222, 69,245, 18, 60,230,224, 92,106,106,234,132,128,128,128, 93,223,124,243,141, 77,120,120, 56,215,203,203, 11, 93,186, +116, 65,106,106, 42, 78,159, 62,173,217,182,109, 91,149, 92, 46,255, 8,192, 69,227,151, 29,132, 86,171,133, 64, 32,208,191,132, + 66, 33,248,124, 62,100, 10, 22,211, 55,164, 43,180, 16, 43, 54,174,248,228, 52, 11, 16,249, 57,233, 69,133,249, 57,119, 9,130, +184, 33,145, 72,202, 13,156, 51,129, 82,169,236,192,178, 44,135, 32,136,205, 20, 69, 77,153, 53,107,150,231,218,181,107,209,182, +109, 91, 20, 21, 21,193,218,218, 26,126,126,126,144, 74,165,184,119,239, 30, 45,151,203,183, 3, 88,137,154,248, 17, 67, 40, 43, +170, 64, 83, 15,239, 58,150, 79,150,101,193,210,128, 70, 69,131,166, 88,168, 9, 13,120, 60, 13,248,124,190, 57, 46, 21,150, 97, + 24,148,122,122,130, 73, 76,196,157, 59,119,192,178,172, 65,171,154,191,191,191, 89, 22, 82,154,166, 95, 19, 90,119,239,222, 5, +135,195, 65,207,158, 61, 17, 23, 23,167,183,104,153, 21,151,200, 50, 16, 8, 5,117,220,133, 4, 65,128, 47, 16,128, 39,224, 55, + 52, 27,199, 98,197,178,224, 63, 6,230,250,177,203, 0,204,120,244,232,209,158, 62,125,250,196,178, 44,203, 67,181, 63,242,143, +183,249,243,252,252,252,135,183, 78, 63, 92,228,222,212, 49,250,157,137, 61,209,182,131, 15,104, 45,141,155,103,226,241,219,218, +227, 7,114,115,114,167,192,140,181,207, 24,134,185,218,163,115, 91, 18,181,114,117,123,121,121, 49,111, 50,235,176,188,188,124, +249,252,249,243,241,229,151, 95,190,201,172,195, 6,241,248,137,116, 6, 1,182,233,176,119,122, 13, 6, 65,178,106,181,202, 72, +195, 7,125,230, 82, 62,159,247,244,126,130, 36,184,161,227,164, 82,233,224,169, 83,167, 94,228,114,185, 45, 26,115,206, 25,134, +201, 42, 40, 40,232,111,250, 72,237, 77,149,162,194,239,212,129, 29,115,207, 29,221, 53,152, 97,232, 86, 4, 0, 14,151,255, 92, + 67, 81,231, 85,138,138, 77, 48,115, 81,233,117, 51,194, 48,231,251, 11,216,250,229, 48,204,138, 62,132, 95,150, 77,199,162, 13, +251,241,221,151,115,176,102,203, 63,241,245,156, 9, 24, 61,126, 42,195, 18,228,159,230,214,131,195,225,156,219,177, 99,199,228, +233,211,167,235, 39, 45,176, 44, 91,167, 17,214,104, 52, 10,134, 97,176,125,251,118, 6,192, 57, 99,124,117,175, 17,193, 26,139, +151, 50,247, 26, 85, 84, 84,124, 20, 22, 22,182, 27,128,144,101,217,103,165,165,165,255, 0, 94, 45, 13, 85, 89, 89,249, 81,247, +238,221,119,179, 44, 43, 36, 8,226,181,253,230,160, 38,213, 67,103, 71, 71,199, 7, 53,150, 44,225,155, 4,196, 27, 59,213, 70, +220,138,230,184, 16, 25, 0,179,106,101,124, 95, 27, 26, 26, 90,123, 81,233,148,210,210,210,206,111, 80,174,139, 10,133, 34,112, +217,178,101,115, 69, 34, 81, 95,185, 92,222, 6, 0,172,173,173, 83, 85, 42,213, 85,133, 66,177, 9,166,115, 83,169, 25,134, 73, +213,106,181, 65,174,174,174,213, 51,106,107,196, 22, 0,156,124, 64, 63, 0,232, 46,213, 70,241,125,102, 23,236,204,153, 51,205, + 29, 29, 29, 7, 17, 4, 49,154,101, 89,127,153, 76,166, 90,182,108,217,173,152,152,152,242, 22, 45, 90,188, 51,116,232, 80,194, +201,201, 9,247,239,223,103,139,139,139,143, 0, 88, 12, 51,102, 90, 51, 12,147,181,110,221, 58, 52,246,121, 55,182,159,162,168, +252, 51,103,206,184, 12, 41, 44,228, 50, 12,131, 97,195,134,213, 17,112,245,241,244,233, 83,168, 84, 42,147,201, 28,203,202,202, + 16, 26, 26, 90,103,128,170,123,101,101,101,193,201,201,169,206,255,152, 26, 99,169,202, 75,209,111,238, 66,160,102, 70,169, 14, +213,150, 44, 22,172,218,162,171, 44,248,207,197,191,122,241, 77,179, 76,139,158,158,158, 99, 69,214,194,207,125,218,120, 6,231, +165, 23, 38,203,202,229,123, 37, 18,201, 14, 3, 13,185, 89,156,141, 76, 88,106, 49,255,254,139, 56, 95,229,209,162,193,178, 52, + 88,134, 5,203, 50, 96, 24,186,122,193,107,150, 1, 75,211, 4, 65,224, 79,181,194,104,102,240,250,229,116,116,113,113, 89,201, +178,236, 16, 14,135, 67,214,110,168,107,127,174,177,100,157,147, 74,165, 95, 55, 96,121,253,175, 59,159, 49, 49, 49, 13,138,127, +115,103, 29,142, 25, 51,134,110,228,179,121,213,218,218,218,179,161,125, 85, 85, 85,217, 18,137,100,208,127,200,249,172, 61, 99, +176, 49,156,141,158,117,104,138,211,199,199, 71, 72, 81, 84, 71, 0,126, 4, 65, 56, 0, 40,161, 40,234,124, 81, 81, 81, 1,128, +206, 0,150,213,252,102, 21,128, 7,255,230,231, 93,236,226,226,178,139, 36,201,166,230,252, 88,171,213,170, 75, 74, 74, 38,215, + 27, 16,188,114,193, 3, 28, 17,159,127, 15, 36,217,164,161,231,209,208,103,176,108,110,149, 66, 17, 74,188,106,243,245,156,206, +206,206, 15,184, 92,110, 83, 51,202,246,178,184,184,184,179,165, 77,254,175,230,252,111, 70,253, 32,120,131,153,226,255, 21, 66, +203,194,105,225,180,112, 90, 56, 45,156, 22, 78, 11,167,133,243,127, 93,104, 53,184,109,153, 2,107,129, 5, 22, 88, 96,129, 5, + 22, 88,240,118, 56, 93, 79,108,157,214,125, 32,140,168,210,198,152, 4,223, 68,217, 94,178,112, 90, 56, 45,156, 22, 78, 11,167, +133,211,194,249,183,227,180,224, 47,132,197,172,106,225,180,112, 90, 56, 45,156, 22, 78, 11,167,133,243,127, 29, 6, 93,135,164, +229,220, 88, 96,129, 5, 22, 88, 96,129, 5, 22,252,107, 96,182,208,178,118,247, 15,112,241, 9,222,237,216,180,125,130, 99,211, +246, 9, 46, 62,193,187,173,221,253, 3,254,166,231, 77, 12, 96, 60,151,203,189,232,225,225, 81, 1, 3, 75,239,252, 15,192, 14, +192,104, 84,231,247, 25, 1,192,234,175, 36, 15, 7,184, 99,129,207, 39, 1,217,147,128,236,177,192,231,225,255,131,113,131, 43, +102,123,134,221, 56, 59,254,236,138,217,158, 97, 13,238,159,239,233,124,231,194,152,239,215,126,238,229,244, 23,253,165,173,155, +155,219, 78,119,119,247, 76, 55, 55,183, 44, 55, 55,183, 93, 0,236, 45,205,157, 5, 22, 88, 96,193,191, 12,186, 24, 45,221, 75, + 31,163,197, 5,128,216,216,216,112, 0,215, 0,244,137,136,136,184, 94,255,215,142,222, 65,211, 91,181,108,245,229,234, 21,139, + 9, 15, 55, 23, 43, 45,205, 80, 25,153, 57,237,150,175,142, 62,156, 39,224,110, 44,205, 78,252,229, 13, 10, 69,112, 56,156,177, + 66,161, 48, 2,128, 78,176,165,168, 84,170, 88,154,166, 15,194,188,105,218,112,119,119,191,193,225,112,154, 55,230,143,105,154, +206, 46, 40, 40,232,249,134, 39,115,140,183,183,247,174,240,240,112,171,208,208, 80, 8, 4, 2, 44, 91,182,108,190, 68, 34,217, +100, 46,129,163,163,175, 45, 37, 20,125,193, 21, 8, 6,178, 26,117, 16, 11, 22, 32,133,137,140, 86,117,153,175, 82,109, 44, 45, + 77,151,153, 73,181, 24,192,148,154,115,245, 11,128,117,111,115,151, 76,238, 0,141,134,174,190, 39,248, 92,208, 39, 94,216, 95, + 91,178,100, 9, 55, 34, 34, 2,191,252,242, 75,207,157, 59,119,126, 34,147,201, 46, 3, 56, 9,224,249,219,222,149,238,192,140, +238, 61,123,126, 63,121,254,124,142,226,198, 13,124,191,107,215,102, 84,231, 91,218,218,216,123,137,207,199,104, 23, 23, 94, 4, +203,162, 35, 1, 16, 4, 16, 47, 45,102,206, 80, 20,125, 16,102,228, 98, 51,130,241,168, 59, 29,127, 95, 99, 9,202,159,179, 75, +133,195, 2,122,149, 63,191,186, 20,192, 59,245,247,107,149,162,201, 44,167, 89,132,130,141,203, 1,176,225, 45, 79,171,149,171, +171,107,194,137, 19, 39,154,134,134,134,114, 1,224,193,131, 7,147, 34, 34, 34,250, 73,165,210, 32, 0, 21,255,166, 70, 72,196, + 37,201,207, 5, 60,222, 64,154,166,219, 3, 0,135,195,121,172,214,104, 46,106, 25,102, 43,204,204,201,102,129, 5, 22,252,239, +194,148, 22,249, 15,135,193,204,240,186,202,177,181,223,107,195,218,173,109,187,110,253, 71, 61, 45,151,201,149,153,153,185,165, +243, 62, 95,115,241,147, 57,235,143,111,248, 57,246,204,245,187, 41,119, 2, 66, 7, 37, 91,187,181,109,103,128,218,144, 15,215, + 91, 44, 22, 63,220,182,109, 27,149,154,154,202,150,149,149,177, 79,159, 62,101,143, 28, 57,194,126,250,233,167, 74,177, 88,252, + 16,128,183, 57,156,238,238,238, 5, 79,175, 92, 96, 95, 38,196,177, 89, 15,238,178, 26,141,134,165, 40,138,165, 40,138, 77, 62, + 23,203, 38,156, 60,202,198, 31, 57,200,170,213,106, 86,173, 86,179, 42,149,138,109,217,178,101,158,153,229,172, 15,175,192,192, + 64,117,108,108, 44,123,248,240, 97,118,254,252,249,108, 72, 72, 8, 13, 96,166,185,117,183,118,243,235,107,219, 36, 88, 58, 61, +114, 43,117,250,214,121, 54,233, 69, 60,155,244, 34,141,141,185,148,194, 78, 89,176,133,178,109, 18, 34,181,118,243,235,107,170, +238,142,142,142,221, 8,130, 96,117, 0,192, 54,111,222,188,178,246,203,219,219,187,206,171, 89,179,102,149, 45, 90,180,120,238, +236,236,220,177, 33,206,113,237,193,178,201,251, 88, 54,121, 31,187,164, 55,216,164,164,164, 59, 44,203, 94,211,189, 20, 10,197, +181, 99,199,142, 93,123,255,253,247,175, 1,120,207,200,121, 50,235,124, 78, 2,178,101, 39, 78,176,236,166, 77, 44, 27, 30,206, +166, 0,236, 36, 32,187,145,156, 45, 61, 60,120,241,235,215,125,162, 62,113,226, 55,246,236,217,211,236,153, 51,177,236,241, 99, +187,216,205,155, 62,167,220,221,121,137, 0, 90, 55,130,147, 11, 96, 13,128,141,168,182, 92,166, 74,165, 82, 54, 63, 63,159, 5, +144, 90,243,221, 70, 87, 87,215, 13,104,216,250, 54,160,182, 37,107,238, 16,143,179, 31,188,211,147,149,149,231,177, 31,188,211, +147,157, 59,196,163,142,101,107,136,175,175,237,172, 97,237,165, 73, 15,246,210,179,134,181,151, 14,241,245,181,125,195,243, 73, +160,122,157,208,109, 87,174, 92,209,178,181,160,209,104,216, 61,123,246,208,142,142,142,191, 53,130,179,141,171,171,107,150,147, +147, 83,106,237, 47, 93,131, 71,116,247,239, 53,105,185,115,187,247,195, 27, 81,206, 80, 17,159,255,242,226,161,159,232,226,236, +199,172, 90, 81,192,150, 63,139, 99, 95,166,220, 97,247,236,216,168, 17,112,185, 47, 1,132,190,205,189,212, 72, 88, 56, 45,156, + 22,206,255, 64, 78, 99, 90,228,191, 25,220,250, 21,172, 15,161, 80, 16,185,124,201, 66,162,172,184, 76,161,172,144,169, 53, 74, +165,146,228,179,202,199,201, 47, 10, 73, 46,167,108,238,156,217,182,145,139,150, 68, 86, 1, 19,204,252, 79,239,144,144,144,123, + 71,143, 30,117,115,114,114, 66,121,121, 57,138,139,139,113,239,222, 61,176, 44,139,145, 35, 71, 10,187,118,233,210,113,233,178, +101,183, 95,230,230,134,193,112,199,251, 74,188, 56,185, 96, 93,207,234,181,104,191,206, 44,174,238,117, 8, 2, 59,199, 68,232, +143, 89,249,178,122,181, 12,145, 72,164, 95,144,248, 13, 16,214,191,127,127, 62, 0, 76,155, 54,173, 66, 38,147, 69,213, 88, 56, +204, 90,105,213,218,205,175,175,139,167, 87,236, 79,219,215,137,219,183,242, 3,165,209, 34, 43, 63, 15, 92,158, 3,154, 54,229, + 99,234,132,129,188,222,221,157, 92,214,172,218,121, 58,159,193, 8,121, 81,218,121, 67, 92, 14, 14, 14,123, 14, 30, 60,136, 67, +135, 14, 1, 0, 82, 83, 83,225,231,231,103,109,170, 12,137,137,137,190,239,189,247,222,129,226,226,226,214,166,142,173,159, 24, + 95, 40, 20,162,103,207,158,104,215,174, 29, 78,156, 56,209,167,198,178,245, 86, 80,220,184, 1,155, 71,143,128,235,111, 52,120, +105,217,169,147,207,157, 51,167,247,186,156, 62,147,130, 13, 27,118,225,249,243,106, 67,155,175,175, 47,198,143, 27,195,123,252, +248, 86,224,232,209,227,111,253,241,199,243,158, 53, 66,201, 20,190,249,249,231,159, 23,183,104,209, 2,163, 71,143, 30, 19, 24, + 24,232, 97,103,103,135, 29, 59,118,192,211,211,211, 87,173, 86, 63, 59,113,226,132, 87,126,126, 62,102,207,158,141,130,130,130, +249,134,136,250, 12,238,179, 84, 56, 44,160, 87,219, 78,147, 97, 99,231,137,159,247, 31,196,211,135,123,122,169,168,148,165,124, +250,250, 68, 5, 43,156, 34,205,182,137,108,222, 57,220,185,117,224,123,240,233, 20,231,162,164,255,120,177,116, 96,203,104,174, + 72,185,103,197, 6, 73,241,107,164,163, 99, 56, 65, 21, 79,156, 18, 47,162, 24, 88,193,232, 4,150,222, 90,203,226,189,222,189, +123,235, 47, 92,102,102, 38, 84, 42, 21, 2, 2, 2, 72,181, 90,221,215,204,243,218,102,208,160, 65,127,158, 57,115,198,185, 77, +155, 54,210,146,146, 18,253, 14, 15,103,135,193,215,143,110,158,189,230,251,127,250,255,206, 18,101,210,148,227,143, 77,112,133, +246,232,214,233,210,217,163,123,109,136,202, 28, 8, 28,138, 0,166, 24,233, 7,126, 5, 97,229,132,177,159,206,227,246,237,223, +175,201,192,119, 70, 93,122,154,246,188, 63,128,251,150,113,189, 5, 22,252,173,173, 90,236,255, 90,157,244, 66, 43, 34, 34,130, +104,168,130, 12,203, 4,187,187, 57,139, 55,175,223,125,159, 67,169,213,214, 14,246,106,158,189, 29, 67,216,218,115, 40,181,166, +210,199,215, 71,192,176, 76,176, 1,254,250, 83, 60, 9,177, 88,124,244,228,201,147,110, 60, 30, 15, 12,195,192,213,213, 21, 25, + 25, 25, 40, 43, 43,131, 76, 38,195,243,148, 20,180,240,110,134, 21,145, 11, 61,103, 47,140, 60, 42,151,203, 59,163,174, 27,241, +181,105,163,180,166,238,186,209,186, 37, 88, 94, 27,242,215,124,215,192, 62,115,167,162,102,100,103,103,195,198,198, 6, 65, 65, + 65, 54, 55,111,222,252,195,136,200,170,195,233,232,232,107,203, 8, 5,135,182,253,180, 76, 76,105, 18,145,156, 94,130,182, 45, +122,193,221,217, 27,121, 37,106,220,185,119, 18,137, 9,251,208,170,137, 55,102,126,218, 79, 20,189,238,240, 65,190,182,133,119, + 89, 89, 70, 69, 67,156, 21, 21, 21, 54, 45, 91,182,132,183,119,245,186,103, 52, 77, 35, 57, 57, 25, 52, 77,235,183,107,191,239, + 62,114, 5,218,138, 44, 76,158, 52, 9,197,197,197, 54, 13,113,242, 56,208,206,251,100, 60, 87,204, 3, 4,214, 78,234,202,202, + 74,253, 50, 28, 20, 69, 33, 62, 62, 30, 97, 97, 97,225, 49, 49, 49,166, 84,145, 89,231,147, 2,190,251,254,183,223,182, 76, 40, + 47, 39, 1,224, 23,130, 96, 40,150,253,206,220,123,201,205,141,119,228,220,217,223, 93, 56,228, 19, 56,217,127,139,123,247,178, + 64, 81,213,229, 45, 46, 46,196,172,207, 43,192,231,217,226,196,137,127, 58, 7, 4,244, 60,146,159, 79, 5,161,174, 27,177,161, +114,138,206,158, 61,139, 89,179,102, 33, 57, 57,217, 75,183, 70,155, 88, 44,198,250,245,235, 57, 1, 1, 1, 94,214,214,214, 56, +119,238, 28, 10, 10, 10, 8, 99,229,188,118,254,218,234,242,231, 87,151,230, 19,231,134,252,188,255, 32, 62, 30, 55, 22, 30,108, +250, 31,246,173,136,213,131,134,245,248,154,229, 52,139,176,182, 13,118,244, 11, 26, 6,190,192, 6, 51,191, 90,137,212,196, 83, +142,114, 89,194,231, 4,157,211,108,197,134,152, 57,175,149,243,240, 24,122,218,190,155,157, 46,122,223,247,121, 20,255,201, 93, + 73,220,206,132, 87, 66,203,151, 75,144,180, 61, 80,189,172,201,179,103,207,240,252,249,115,112,185, 92, 40, 20, 10,104,181,218, + 6,203,233,229,229, 53, 67,171,213,126, 93,115,157,119,139, 68,162,143,246,238,221,235, 92, 91,104,187, 6,143,232,238,108,107, +221,191,160,176,184,244,214,253,164,167,243,102,140,238,115,227, 78, 98, 14,197,123, 63,187, 60,225, 68,185,129,243, 41, 18, 11, + 4, 71,206, 29,251,167,141,230,197, 21, 88, 7,244, 1,207,198, 15,180, 38, 23,242,210, 42,200,158, 75,160,250,233, 71,116,248, +124, 46, 78, 29, 63,108, 19,216,190,115,140, 74,163,241, 3,160,126,131,103,179, 49,176,112, 90, 56, 45,156,255,153,156, 6,181, + 8,203,178,157, 0,184,215,108, 22,215,232, 2, 23, 0, 69,168, 94, 81,192,189,166,237, 16,212,250, 89,253,237,218,199,214,223, +174,253,185,184,230,179, 91,205,251,125,130, 32, 74, 76, 20,221, 19,213, 75, 19,158,174,121, 7,106, 92,137, 38, 3,143, 9,130, +172,160,105, 70,200,119,117, 83, 78,251,160,127,251, 11,151, 30,196, 91,185,216,113, 7,247,233, 24,126,239,241,139,219, 4, 73, +104, 8,130, 52, 43,238,131,195,225,140,221,188,121,115,123, 59, 59, 59, 48, 12, 3,123,123,123, 72,165, 82,168,213,106,148,151, +151, 67, 37,171, 0, 37,171,192,163,156, 76,244, 8,239,131, 81, 67, 6, 5,252,243,248,201,177, 52, 77, 31, 48,198,235, 21,220, + 81,111,201, 90,217,220,249,149,105, 34,167, 76, 47,186,190,237,232, 7,190,141, 13, 6,206,139,124,155,123, 32,238,244,233,211, +103, 71,142, 28,249,206,130, 5, 11, 72,137, 68,114, 46, 35, 35,163, 7,128,100,147,162, 66, 40,250,226,179, 47, 34, 28, 29,109, + 88,196, 92, 60,137,222, 29,199,193, 74,192, 65,113, 5, 5,130, 0, 82,146,142,130, 32,156,144,144, 42, 65,175, 14,118, 24, 52, + 56,192,230,248,225,148, 5,120, 21, 31,244,218,165, 41, 45, 45, 69, 97, 97, 33, 52, 26, 13, 52, 26, 13, 70,143, 25,131,223,247, +236, 65, 85, 85, 21, 20, 10, 5,212,106, 53,104,154, 6, 73,146,184, 24, 27,131,156, 23, 41,232, 30, 22, 6, 24, 88,122,105, 79, + 60,120, 0,238, 60,125,250, 20, 41, 41, 41,120,249,242, 37, 68, 34, 17, 60, 60, 60,176,114,229, 74,168, 84,213,235,137,141, 25, + 51, 38, 28,192,227,183,125,160,158, 3, 59, 51,104,122,233, 59,199,142,185,221, 60,118,140,185,115,234,212, 75,161, 76,182,195, +156,223,242,249, 24,189,238,187, 79,219, 90, 91, 91,227,101,246,102,248,251,243, 49,127,174, 51,162,190, 45, 2, 0,204,158,213, + 20, 93, 58,187,160,162,236, 48, 92,220, 22, 99,203,150, 57,173,166, 76,217, 56, 73, 46,167,119,155,160, 94,122,242,228,201, 81, +126,126,126, 77,226,226,226, 8,129, 64, 0,177, 88, 12,177, 88, 12,145, 72,132,194,194, 66,100,100,100,176,235,214,173,203, 5, +176,212, 24,209,138, 45,146,219, 0,222,153, 59, 4,103,159, 62,220,211,171, 9,231,197,163, 81, 51,123,102, 38,220,137,147, 93, +184,120,115,149, 86, 41,202, 41,123,121,105, 97,203, 46,113, 46,159,127,249, 13,126, 92,183, 28, 79,239,222, 40,113,247,174,216, + 42, 38, 84, 13,150, 51, 60,124, 5,215,211,221, 73, 59, 99,202, 40,135, 83,238,183,102,156,225, 18,210,252,162,135,235,145, 17, +167, 16,182,238, 56,177,141, 47,169,190,114,229,138,184,119,239,222, 80, 42,149,122,203,228,222,189,123, 25,173, 86,123,181,193, +123,147,162,190,206,205,205,245, 84, 40, 20, 24, 50,100,200,236,245,235,215, 91,235,214,147,163,105,186,142, 37,107,245,166,223, +207,127,241,245,214,171,231, 15,124,235,181, 58,242,163, 62, 19,102,174,185, 10, 3,235, 72,114, 73,242,243, 83,199,118,121,136, + 28, 53, 16, 59, 13,130,178, 64,129,167, 59, 63,134,188, 66,137, 46,171,191, 1, 32,128, 90, 67, 98,199,176,209,224, 57,123, 97, +249,244,143,188,150,236,248,249, 83,134, 97, 54, 91,198,245, 22, 88, 96, 65, 61,184, 19, 4, 17, 11, 0,145,145,145,139,163,162, +162,146, 8,130,136,101, 89, 54,162,198,128, 18,203,178,108,132,238,152, 26,113,246,218,182,238,216,250,219,245, 63, 47, 90,180, + 40, 48, 58, 58,122,109, 88, 88,216,129, 91,183,110,189, 0, 96, 74,104, 13,173, 17, 86,175, 45,189, 67,234, 20,100,237,247, 58, + 22, 45,134,185,241,236, 69,166,124,208,128,174, 77, 99,175, 63,190, 63,117,234,208,254, 99,135,245, 30,156,145, 93,156,210,202, +199,195, 37, 41,233,177, 29,195, 48, 55,204, 57, 75, 66,161, 48,162, 95,191,126,220,210,210, 82, 88, 89, 89, 65, 42,149, 34, 55, + 55, 23, 20, 69, 65, 89, 94, 6, 85,121, 25,148,101,165,160,202, 75,241,252,193, 61, 4,183,242, 21,214, 4,203, 27,133,206,234, + 82,223, 82, 85,219,178, 37,176,181,133,208,214, 22, 68,227,221,134,239, 59, 56, 56,220,209,117,170, 20, 69,125,190,112,225,194, + 34,134, 97,176,102,205, 26, 59, 27, 27,155, 24, 0, 66, 83, 36,182,174,156,136,176, 14, 65,228,147,140, 4,244, 12,153,140, 54, + 45,223, 69, 70,129, 2, 69, 50, 10,133,101, 20,186,244,254, 1,205, 67,190, 65,179, 14, 81, 72,201, 42,129, 87, 19, 63, 18, 92, +161,209,197,159,115,114,114,234,108, 31,216,191, 31,114,185, 28,173, 90,181,194,184,113,227,176,112,225, 66,140, 27, 55, 14, 94, + 94, 94,152,240,193,123, 88,190,124, 57,242,243,243, 77, 21, 85,213,166, 77, 27,149,143,143,143,202,199,199, 71, 69, 81, 20, 42, + 43, 43, 81, 86, 86, 86,255,124,207,105,236,137,116,115,115, 91,228,225,225,145,224,230,230,150, 36, 20, 10,207,196, 19,196, 19, +165,143,143,123,143,225,195,137,118, 31,124,192,201, 18,139,137,235,128,141, 57, 92, 46, 78,188,161,125,251,189, 35, 40, 43,221, +165, 55, 82,125, 52,213, 21,127, 94, 15,196,205, 63, 58, 99,214,231,173, 64,144, 34, 16,164, 0,242,170, 43,232, 26, 26,198,119, +112, 32, 76,221, 75,227, 1,196,247,232,209,195,107,230,204,153,132, 80, 40,196,236,217,179,169,233,211,167,167,141, 27, 55, 46, +237,242,229,203,180,143,143, 15,154, 53,107, 70, 52,107,214,204, 19, 64,124,205,111,140,194,174, 21,177, 90, 69,165,252,225,224, +103,253,130,134, 75,247, 74,141,112,244,138, 13,146,226,213,219, 94,108,200,120, 42,247,125,122,247, 70,113, 90,226, 41, 38,227, +254,181,162,188, 52,153,239,234,109, 47, 54, 44,222,154,215,224, 67,125,253, 58,152,163,177,215, 41,121,149,156, 59,124, 88, 95, +249,140,105, 99,219, 56,217, 4,238, 69,147, 65, 33,205,189,155, 78, 88,190,118, 11, 53,253,211, 47,168, 95,126,221,197,202,100, + 50, 84, 84, 84, 96,203,150, 45,218, 83,167, 78,229,210, 52,253,133,161, 49, 16, 0,104, 52, 26,204,152, 49,195,218,206,206, 14, + 57, 57, 57,122,139, 40, 0, 72,164,197,143,111,222, 79,124, 50,239, 31, 99,194,171, 84, 42,213,249,107, 15, 82,218,249,249, 52, + 37, 8,214,224, 68, 20, 1,143, 55,176,115,215,174, 28,150, 45, 3,193,245,198,243, 61,235, 80,145, 95,130,138,194, 18,112,120, +214,208, 66, 8, 13, 35,128, 67,112, 40, 82,239,199,161,137,171, 59, 87,200,227, 13,182,244, 39, 22, 88,240,247,132, 49, 45, 82, + 91, 44, 69, 71, 71,175, 53,182,191,214,187,186,222,182, 94, 72,213, 23, 97,181, 63, 3, 64,116,116,244, 90,150,101, 35,110,221, +186,181, 31,128,194,204, 42,124, 82,235,221,252, 60, 90, 28,165, 58,106,193,194,165,112,180, 23,219,135,118,244,243, 56,113,238, +250,131, 27,183, 30,164, 52,111,230,226,202,106,212,142,223,109,252,177, 41, 33, 87, 68,155, 89,136, 0, 23, 23, 23, 80, 20,133, +103,207,158,225,229,203,151,160, 40, 10,218,170, 42,168,202,202,160, 44, 45, 5, 93, 37, 3,159,166,161,144, 22,194,217, 74, 4, +188,154,145,104,194,242, 70, 52, 40,180,116,239, 34, 59, 59, 8,109,237, 64,242,120, 38, 87,138,175,133, 78,161,161,161,135, 18, + 19, 19,187, 14, 24, 48, 96, 21,170,167,200,103,229,230,230,246, 95,182,108,153,202,221,221, 29, 51,102,204,104, 11, 96,178, 73, +145, 41, 80, 7,248,120,180, 69, 27,223,201,104,222,172, 31,202,170, 52,144, 86,104, 80, 88, 70, 97,199, 15, 97, 56,242, 75, 40, +254, 60,210, 11,137,231, 7,162, 76,227, 1, 27,175,247,193,210,234, 64, 99,156, 23, 47, 94,196,202,149, 43,177,106,213, 42,172, + 89,179, 6,171, 86,173, 66,110,110, 46,130,130,130,144,157,157,141,179,103,207, 66, 34,145,192,197,197, 5,247,238,221,195,166, + 77,155,240,231,159,127,154,172,180, 78,184,154,113, 76,163,124,233, 90,173,118,138,100,248,240,246, 5, 78, 78,237, 58,118,236, +248,206,236,217,179,125,123,244,232,161,223,239,235,235,235, 45, 22,139,243, 81, 61,131,178,131, 49, 46, 6,232,232,234, 26, 4, +181,234, 73,205, 53,230,129, 32, 68,232, 55, 48, 5, 61,122, 61, 0,165,225,131, 36,132, 32, 73, 17,180,218, 98, 56, 58,122,129, +101,137, 32, 19, 69, 92, 38,149, 74,253, 46, 93,186, 68,102,100,100, 64, 36, 18, 1, 64,230,138, 21, 43,126,220,176, 97, 67,178, +179,179, 51, 29, 27, 27,139,227,199,143, 35, 34, 34,130, 51,125,250,116,191,102,205,154,109, 55, 85,239, 21, 91, 36,183,247,109, + 60,251, 33, 79,227,216, 65, 36,110,222, 2, 85, 54,239,127, 22,238, 98, 13, 0,231,210,211,101,110,222, 21,209, 85,178,132,108, +135,166,149,223,158, 75, 55, 53,227,116, 5,243, 48,237,201,157,125,199,206,149, 23, 22,148,242, 58,182, 15, 84, 68,173,252,146, +223,188, 69,235,239,150, 47,252,135, 71,110,133,168,108,224,236,179, 79,142,158,187, 87, 57,113,234,199,218,105,159,204, 84,158, + 61,119,241, 24,195, 48,237, 97, 96,198, 33,195, 48,144, 72, 36, 72, 74, 74, 66,122,122, 58,164, 82, 41,138,138,138, 32,147,201, +244,238, 70, 43, 89,197,233, 31,127, 59,245,200, 90, 44,182,234,218,222,207,251,110, 92,114,161,181, 88,108,229,215,194,187, 13, +176,162,193,118,132,166,233,246, 34, 43, 49, 0, 2,101,137, 55, 80, 89, 90,137,202,178, 74,200, 74, 42,161,162, 56, 80,170, 72, + 40,212, 36,124,194, 7,161,178, 74,137,202,226,114, 48, 52, 29, 98,233,110, 44,176,192, 2, 35,125,125,108,100,100,228, 98, 51, +143, 53,219,189, 89, 95,120, 69, 70, 70, 46, 38, 8, 34,118,209,162, 69,129, 48, 60,161,170, 54,118, 54,240, 2, 96, 70,122,135, +226,226,180, 74, 91, 34, 96,228,220,175,190, 62,187,255,215, 31,220, 84, 42,121,182,179,163, 13,109, 99, 37,112,153, 54, 99, 13, +100,149,165, 35,170,204, 79, 71,128,210,210, 82,188,120,241, 2, 98,177, 24,124, 30, 15,180, 66, 1, 90, 81, 5, 69,105, 49, 72, + 74, 5, 62, 77,195,201, 74, 12, 31, 47, 15, 52,119,247, 48,139,243,217,149, 11,250,192,247,218,238,194,117,161, 1, 16, 88,219, + 64, 96,107,131,207, 98,175, 1, 0,248,124, 62,176,108,149, 89, 70,147, 38, 77,154,156,220,183,111, 31, 95, 42,149, 34, 62, 62, +254, 17,128,114, 0,182, 0,152,148,148,148, 75,137,137,137, 17,126,126,126, 0,208,202, 20, 89, 69, 17, 73,107,180, 44,114,242, + 51,145,241, 50, 14, 78,246, 45,193,179,106,131,194, 50, 10, 66,113, 75,104, 84,175,188,143,202,138, 44, 40, 40,142, 89,117, 87, +171,213,208,106,181,208,106,181, 80,171,213,248,228,147, 79,112,243,214, 45, 28, 56,126, 25, 47,158,167,162,109, 11, 15, 76,154, + 52, 17,161,161,161,184,117,235,150, 81,174,201, 29,160,105, 98, 3,238,198,119, 72, 8,108,156, 85,221, 22,158,191,107, 74,108, + 17, 4,193,194,128, 43,178, 30, 54,132,133,133,181, 78,173,170, 66,210,147, 39, 24,176, 98, 5, 0,224,204,153, 51,117,234, 50, +111,222, 60, 65,114,114,242,180, 7, 15, 30, 76,203,203,203,219, 8,160,225, 96,115, 22, 56,125,250, 54,254,241,143,100, 72,165, + 82, 0,192,193,253,175,116,105,198, 11, 10, 67,134, 86,123,180, 28, 28, 28,176,113, 99,144, 89,231,147,166,105,236,220,185, 83, +239, 46, 4, 0, 46,151,219, 99,222,188,121, 35, 27, 58,190,117,235,214,124, 83,156,115, 71, 55, 17,253,249,136,253,220,190,117, +243, 64, 59,151, 96, 20,107,226,130,226,114, 37,179,230,142,110,178,121,211,225, 92,165,152, 80,237, 38,232,156,102, 92,145,114, +143, 57,101, 76, 63,247,131,186,216,103,202,158,124,105,197,146,153, 31,143,119,182,115,112,171,250,229,199, 40, 71,146, 67,178, + 39, 31, 80,101,129,190,206, 14,239,119,251,190,242, 31,115,151,197,169,181, 57, 51,145,115, 50, 21, 70, 82, 92,213,158,247, 9, + 0, 0, 32, 0, 73, 68, 65, 84,208, 52,141,188,188, 60, 72,165, 82,100,103,103,163,168,168,218,253, 90, 84, 84, 4,134, 97,222, +166, 65,132, 34, 59, 27, 89,199,126, 65,243,137, 19,209,101,213, 74,208, 12, 23, 10, 57,141,141,221,251,163,180, 92, 1, 21, 67, +192,171, 83,119,124,124,230, 15,144, 44, 13,236,216,106,233, 73, 44,176,224,111, 10,115,210, 59,232, 4, 81, 84, 84, 84,196, 95, +253,255,181,197, 86, 84, 84, 84, 82, 84, 84, 84, 99,254,171,190,203, 80,191,173,139,209,186, 86, 43, 0,237,181, 78, 83, 86,148, +146,158,156,204,205,171, 82, 84, 89,185,187,185,170,172, 68, 66,166,188, 66,198,137,123,252,136,170,202,127,254,180, 17,245, 72, + 73, 76, 76, 12,202,203,203, 67,118, 86, 22,180,138, 42,144, 42, 53, 88,165, 28, 3,122,118,135, 8,128,136, 36,192,103, 40,112, + 57, 2,200, 42, 43, 0, 32,197,100,231,168,209,188,102,217, 34, 8, 2, 2, 91, 91, 8,172,173, 33,176,177,173, 99,225, 50,199, + 98, 35, 20, 10,247,197,196,196,120, 54,105,210, 4, 43, 87,174, 68,211,166, 77,253,189,188,188,228,246,246,246, 98,119,119,119, +180,107,215, 14,221,187,119,199,217,179,103, 1, 51,114, 74,105,180,162,132,167,153,232, 81, 84,114, 11,127, 92,251, 9,106,133, + 10, 29,195,127, 2,197,109, 14,215,192,111,192, 60,219, 11,121,254,137,106,235,129,199, 48,188,204,206, 4,193, 17, 36,153,107, +121,210,125,126,244,232, 17,246,159,184, 14, 79,159, 0,100,167, 61,193,147,171,151,112,211,213, 25, 62, 1,237,244,110, 32,131, +101,164,193, 93,189,181, 58, 77,212,210,207,199, 11, 75, 74, 74,132, 78, 78, 78, 42,221,185,243,244,244,124, 27,177, 53,126,193, +130, 5, 40,227,241,128,161, 67,193, 79, 79, 7, 69, 81,232,214,173, 27,186,116,233, 2, 0,232,214,173, 27,184, 92, 46,130,131, +131,225,229,229,133,173, 91,183,142, 55, 36,180, 72, 2,241, 90,109,177,191,175,175,175, 94,104,237,249, 93,138,184, 7, 3, 65, + 64,128, 45, 63, 62,211, 31,235,237,237,141,124, 73, 58, 8,130, 77, 52, 81,198, 85, 30, 30, 30,203, 60, 61, 61,125, 55,108,216, +192, 17,137, 68,248,244,211, 79, 91, 86, 86, 86, 54,175, 49, 37, 99,209,162, 69, 0,128,229,203,151, 99,197,138, 21, 80,169, 84, +114, 67,100,123, 54,182,247, 42, 44, 97,166,177,149, 86, 35,250,186, 52,111,223,111,240, 0,180,244,235,135,126,131,179, 1, 96, +173, 19, 55,243,131,239,150, 56, 28,115,176, 37,118, 93, 56,119,113,121,207,240,126, 75, 22, 86, 94, 93,253,237,206, 50,147, 49, +143,229, 89,187,101, 79, 5, 99, 55,253,176,253,247, 77, 95, 47,154, 35,202,150,170, 75,115, 75,217, 74, 27, 33,215,166,149, 59, + 97, 51,235,171, 85, 47,242,242,210,231, 35,231,156,201,153,150, 12,195, 32, 61, 61, 93, 31,211,167, 84, 42, 81, 85, 85,133,156, +156, 28,253, 61,163,176,182, 27, 50,115,234,176,144, 42,133, 66,126,247,113, 90,246,210,217, 19,194,170, 20, 10,121, 90, 70,118, + 42,176,165, 65, 53, 70,146,228, 99,185, 76, 62, 64, 94,166,132, 52,254, 41,154,246,247,129, 70, 75, 64,173,165, 33, 45,150, 65, +165, 5,104,146,135,192, 15, 38,129, 38,184, 40,202,203, 5,201,225, 60, 66,221,160,125, 11, 44,176,224,239, 3,163, 90, 68,103, +209, 10, 11, 11, 59, 80,219,234,164,251, 12, 64, 5,227,161, 60,210,218, 98, 74,231, 78, 52,244, 63,245,120,205,197,107, 49, 90, + 38,211, 59,232,254,179,153,125,133,215,186,229, 19,154, 50, 90,109,219,194,162, 2, 45,151, 43,228, 53,179, 87, 72, 74,178,205, +255,119,149, 74, 21,123,233,210,165,225, 3, 7, 14, 20,166, 61,126, 4,117,121, 57,212,229,101,224, 49, 90, 56,137, 59,131,164, + 84, 32,212,106, 52,241,103,160,148,137,113,253,102,162, 70,165, 82,197,154, 43,180, 72, 14,167,110, 92,150,141, 13,132,182,118, + 16,218,216,212,119, 45,154, 18, 5, 86,131, 6, 13,234,223,173, 91, 55,176, 44,139,157, 59,119,130,162, 40, 1, 69, 81, 80,171, +213,160, 40, 10, 21, 21, 21,248,253,247,223,177,109,219,182,155, 0,126, 51,217,153,105,213,151,206, 95,188, 18,250,209,132, 8, +222,153,216,141,208,170,105, 40,136,166,168,170,210,160, 82,109, 5,218,121, 34, 80,112, 26, 28,174, 8, 97,193, 45,113,226,240, + 81, 10, 90,213,101, 51, 85,120, 29,171, 80, 78,118, 38, 94, 62, 79,133, 77, 69, 62, 92,237,172, 32, 79, 79, 69,199, 73,147,223, +200, 58,209,172, 89, 51, 48, 12,131,190,125,251,234,131,171,223, 84,108, 21, 23, 23,227,212,169, 83,232,214,173, 27,194,195,195, +145,155,155,139,244,244,116,188,251,238,187,250, 99, 30, 61,122,132,184,184, 56,180,106,101,220, 72, 88, 84,162, 57,243, 50, 39, +126,204,251,239,191,207,191,115,231, 14, 88,150,133,159,159, 29,236,108,173, 65,144, 66, 4, 4,184, 1,168, 30, 3,244,233,211, + 7, 21, 21,233,218,210, 82,246,140,137,234,238, 3,112, 92,173, 86, 63,235,221,187,183,215,243,231,207, 49,119,238, 92,238,193, +131, 7,117,166,100, 68, 70,214,157, 76,161, 80, 24,118,221,183,109,239,255,101, 75,173, 99,184, 72,220,188,133,157, 75, 48, 90, +250,245, 3, 0, 12,140,248, 8, 45, 91,123,163,162, 40,161,133, 82,145, 57,130,207, 45,117, 76,216,146,155, 44, 30, 26, 52, 85, + 89,120, 45, 13,213,174, 83,147,151, 93,145,118,176, 32,155, 55,241,208,241,147,103,103,188, 27,241, 30, 79, 67,107,181, 65, 62, + 60,135,152, 99,167, 11,115,179,178,191, 71,246,185,196, 87,246, 63,163, 86, 60,186,162,162, 2,214,214,214, 72, 76, 76, 84, 13, + 29, 58, 84, 72,146, 36,158, 61,123,166, 23, 90,110, 46, 78,237,122,116, 9,242, 95,189,233,247,243,214, 66,161,112,112,159,206, + 1,201,105, 89, 47, 89,150,200, 52,104,109,213,104, 46, 62,142,127,212,215,213,171, 53, 39,253,218, 29, 56,247,122, 23, 42, 21, + 9,133,154,129, 74, 11,104, 57,124,120,118,232, 10,135, 86, 1, 96, 1,220,191,115, 83,163,210,104,206, 91,250, 26, 11, 44,248, + 91, 91,181, 88, 99, 34,169,230,115, 9,128,204,168,168,168,162, 90,214, 38, 41,128, 71, 0, 66,106,142,147,214,251,157,148, 32, +136,251, 44,203,118,169,197, 35,173, 37,184,106,127, 86,215, 59,230, 81, 35, 68, 86,237,247,186, 66,203,208,148, 74, 0,112,113, +113,113,235,216,177,115,171,159,127, 61, 4,150,101,241, 52,110, 61, 74, 11,159, 96,217,218,219,173,154, 52,105, 18,158,155,155, +123,221,156, 18,208, 52,125,112,215,174, 93,243,187,118,234,216,177, 69,211,166,120,148,153, 1, 62, 75,131, 79,211, 32, 41, 21, +184,180, 26, 77,131,104,144,132, 13,242,242,202, 17,189,239, 80, 98, 77,150,120,163,240,127,247, 61,172,124, 89, 14,130, 32,176, + 33, 44, 8, 2, 91, 27,240,173,109,240,217,201, 43,122,113, 21,187,114, 17, 4, 54, 54,104,213,213,172,132,240,242,171, 87,175, + 62,120,252,248,113,151,160,160, 32,204,159, 63, 31,153,153,153, 96, 24, 6, 5, 5, 5, 74,137, 68,146, 43,149, 74, 51, 1, 28, + 3,240, 51,204,200, 60,206, 87, 41, 55,199, 30,217, 51, 51,172,103,184,203,251, 35,182,225,248,225,121, 40, 43,175,128, 92, 43, + 70,149, 82,139, 42, 21, 7, 78,206,237,209, 53, 56, 24,121,185,133, 72,186,115,190,146,171,146,175,111,204, 13, 74, 16, 4,226, +226,226,224,235,101,139,212, 63,174,195,197,138,135, 16, 47, 15,120,245,232,169,207, 47,101, 12, 60, 14,180,227,199,143,215,103, +134, 31, 52,104, 80,198,196,137, 19, 61,231,205,155,135, 95,127,253, 21, 55,111,222,124, 45, 64, 59, 60, 60, 28, 55,110,220,248, + 6,192,114, 83, 70, 61,181, 90, 13,127,127,127,220,191,127, 31,151, 46, 93, 66,191,126,253, 16, 30, 30,142,132,132, 4, 92,184, +112, 1,113,113,113, 32, 8, 2,206,206,206,208, 84,139,103,141, 33, 50,138, 66,204,183,223,237, 90,188,105,211,182,192, 9, 19, + 38,224,200,145, 3,248,104,106, 91, 16,164, 16, 4, 33,196,123,195,218, 98,229,170,251,232,218,181, 15, 92, 92,120,216,180,241, +196, 11,133,130,254,221,140,211,184,250,194,133, 11, 94, 74,165, 18,101,101,101,172,141,141, 13, 81, 92, 92, 61,163,181, 33,139, +150, 92, 46, 23, 25, 34,122,252, 48,101,125,153,140, 45,101, 43,227, 70,148,104,227,218,247, 27,156,131,129, 17, 83,113, 49,246, + 55, 92, 57,127, 9, 78,220,204, 12, 88,203,206, 22,101, 20, 85, 72,170,252,182, 7,116,154,206,121, 89,117,126,251,172,247, 82, + 57,158,158, 76,204,162,159, 42,202,140, 9, 45, 0, 68, 73,242,222,147,199, 88,188,215, 61,172,107,235, 32,111, 79, 65,105, 81, + 33,123,248,196,217, 68, 42,227,200,169, 90, 2,139, 53, 33,212, 87, 70, 70, 70,126, 93,243,121,247,210,165, 75,167, 71, 71, 71, +187,230,231,231,235, 99,180, 10,139, 74,174,116, 31, 58,139, 46, 46, 43, 87,239,218,244,213,104,177, 72, 40, 88, 26,189,235,154, +134,131, 59,134,120,181, 12,179,245,131,185,203,230,164, 61,141,107,210, 92, 44,192,137,175,150,227,209,133,171,208,144,124,252, +227,210, 93,168, 40, 26,101, 69,197,184, 60,237,115,216,184, 59, 98,219,181, 35, 5, 12,195,252,100,233,106, 44,176,224,239, 11, + 67, 90,132, 32,136,134,114,236, 21, 52,240,221,125, 99,191, 51,192,243, 87,192, 96, 86,120,179,166,224, 21, 21, 21, 21,222,184, +113, 23,215, 98, 87,227,122,236,106, 36,197, 61, 66, 94,174, 26,185, 5, 74,216,217,217,221, 54,242,211,250,153, 99, 89,185, 92, + 62,114,233,178,175,243, 69, 98, 43,244,238,223, 31, 30,174,110,176,226,243,192,209, 50,224, 16, 60, 84, 74, 29,144,154, 32,199, +194, 93,123, 11, 43,229,242,145, 13,116, 18, 3, 12,137, 12,130, 32, 32,180,179,133,192,198, 22, 66, 91,187, 58,110, 68,145,157, + 29, 68,182,118,224, 10, 4, 13, 5,195,191,198, 89, 89, 89, 57,106,244,232,209,165,229,229,229,152, 62,125, 58,174, 95,191, 30, +119,254,252,121,187,132,132, 4,177, 84, 42,109, 13, 96, 16,128, 29, 70, 68, 86, 29,206,210,210,116, 25,171, 85,141,141,250,250, + 11,133, 82,235,140, 49,147, 15,194,154,204,129,150,102,192, 2,240,114, 18,160,199,128, 85, 40, 84,119,199,193,237,107,228, 12, +165,156, 80, 47,135, 86, 29, 78,150,101, 89,119,119,247,215,206,193,165, 75,151, 48,102,244, 40, 12, 30, 49, 28,174, 45,124,225, + 54,224, 93, 12,158,254, 15,108,223,190, 29, 36, 73,194,197,197,165,126,199,171,231,220, 19, 15,222,254,199, 32,246, 63, 6,177, + 59, 14, 92, 0,147,246,238,221,251,109, 72, 72,200,213,155, 55,111,174, 7, 48,182,246,127,213,194,138,122,214,172,134,174,209, +146, 57,115,230, 40,210,210,210, 96,109,109, 13,173, 86,139,155, 55,111, 98,219,182,109,216,176, 97, 3,226,226,226,224,236,236, +140, 86,173, 90, 65,165, 82,225,254,253,251, 10, 0, 75,140,112, 50, 82,169,118,212,150, 45,209,197, 17, 17,189,176,107,215,143, +240,240,232, 14, 30,215, 3, 92,158, 43,172,109,252,241,203,207,223,226,157,119, 58,226,228,137, 67, 37, 69,197,218, 81, 0,180, +102,220, 75,202,187,119,239, 98,251,246,237, 24, 61,122,116,238,152, 49, 99,232,242,242,114,189, 69,139,101, 89,176, 44,139, 21, + 53, 49,102, 42,149, 74,104,136,243,227,133,137,185, 95,173, 73, 90, 89,144,159,219,237,250,213,219,227,175,156,191,132, 23,105, + 87,112,229,252, 37,252,113,229, 86,100, 65,126,110,183,142,161,109,248, 35,167,207,252,114,207,209, 35, 28, 27, 59, 79,236, 57, +122,132, 51,110,214, 23,107, 58, 15,238,183,196,212, 61, 95,115, 29,217,202,194,130, 69,107,215,255, 80,169,165,148,228,186,239, +183,230, 41,164,146, 37,181,238, 75,214,212,253,169, 80, 40,118, 40,149, 74, 47,165, 82,233,165, 82,169,150,100,102,102,246,158, + 63,127,190,148,166,105,189,181, 84,154,124,242,246,147, 63,119,175,117,115,113, 20,119,239, 18,216,118,227,142,195,215,178,115, + 10,254, 89, 43,135, 86, 67,229, 84, 86, 42,148,163,134,143,156, 88, 85, 86,170, 66,216, 23,145, 96, 68, 54, 80,209,128,134,229, + 64, 75,112,241,120,245, 70,136,157,108,177, 47,227,161,188, 92, 67,141, 66,221, 28, 90,198,234,254, 54,176,112, 90, 56, 45,156, +255,153,156,255,205,240, 68,221,181, 14, 61,235, 88,180, 76, 77,169,108,210,164, 73,239,247,223, 27,128, 62, 17, 75,193,178, 44, +158, 60,252, 14,165,210,167,104,226, 33, 68,122,118, 69, 24,128,235,141, 40, 76,118,102, 78, 78,183, 57, 75,150, 30, 29, 51,168, +127, 64, 80,139, 22,194,230,205,125, 96,237,230,134,162, 34, 41,254,188,147,172, 89,179, 63, 38,177, 70,100,153,229,152,100, 24, +166, 58,200, 29, 64,255, 57, 11, 65,112, 56, 64, 77, 26, 7, 93,199,216,162, 75,119, 16, 92, 46,104,150,129, 74,165, 50,103,182, +220,203,231,207,159,143,154, 48, 97,194,229,216,216, 88,114,240,224,193, 29,142, 29, 59,246, 54,107,230,161,170, 48,237, 42,128, +136, 53,139,102, 28,236,214,111,184,157, 95, 96,103,126,231,230, 28, 80, 26, 2,121,185, 89,136, 61,122,143, 74,190,123,190,130, +213, 42,199,202,139,210,174, 26,227,162, 40, 42,187,117,235,214,238,219,183,111,215, 7,195,211, 52,141,162,162, 34,220,190,125, + 27,237,187,116, 69,192,212,105,144, 74,165,216,178,101, 11,188,189,189, 49,108,216, 48,148,148,148, 64,171,213,154,235,240,165, + 1,156,175,121,161,158,200, 34,106,150, 0, 50,234, 54,244,245,245, 21, 40,149,202, 14, 44,203,114, 8,130,216,172, 86,171,167, + 44, 90,180,200,115,237,218,181,104,219,182, 45,138,138,138, 96,109,109, 13, 63, 63, 63, 72,165, 82,220,187,119,143,150,203,229, +219, 81,189,144,181,212, 68,249,158,221,187,151,209,109,246,236,207,142,126, 27, 61,195, 79,169,234, 35,112,114,234, 9,150,213, + 66, 42,205,132,172,226, 38,181,106,229,111,207, 11, 10, 53, 35, 1,164,153, 89,231,229, 51,103,206, 4, 0, 17,128,165,233,233, +233,241, 1, 1, 1,126,134, 44, 90,230, 96,211,225, 92, 37,128,253,163, 6,123,205,173, 40, 74,240,115,226,102,102,116, 11, 98, +182,108, 58,156,171,180,243,170, 90, 93,148,121, 61, 85, 82,117,126,251,158,163, 71, 56,147, 71,140,162,155,218,164, 69,138,220, +216,195,102, 80,179, 33, 33, 33,205, 8,162,164,101, 97,241,211, 7, 31, 77,159,241,129, 61, 95,113, 38,164,105,113, 43,210,187, +163, 40, 46, 46, 46, 3,141,156, 25, 90,131,212,220,220,220,222,139, 22, 45, 58,207,178,108,157,216,132,194,162,146, 43, 97, 17, + 51,217,178,178,242,120,105,202, 73,115,114,169,221,187,247, 48,174,127, 80,251,142, 71,190, 93, 27,237,222,103,206,124,110,234, +213,107, 0,173, 65,214,245,107,160,133,106,102,227,173,139, 5,229, 20, 53, 2,150,172,240, 22, 88,240,183,183,102, 25,211, 34, +255,225, 24, 10, 3,193,240,102, 87,198,183,101,147,243,109,253,154, 15,242,110,234, 10, 0, 72,207,200, 67,122, 70,238,133,244, + 23,185,131, 77, 40, 94, 67,211, 43,245,139, 74, 19, 53, 41, 28, 88,243, 22,149,174,195,233,236,236,252,128,203,229, 54,109,204, +217,160,105, 58,175,168,168,168,163,153,229, 28,215,162, 69,139,232,172,172,172,163, 12,195,204,109,164,218,111,144, 83,183,168, + 52,201, 21, 12, 96,181,234,246, 0, 64,112, 5,230, 44, 42, 93,155,179,189,141,141,205, 14, 30,143,231,173,187,142,186, 24, 44, +154,166, 57, 20, 69,137,104,154,230, 0, 32, 72,146,212,242,120, 60, 37, 65, 16, 90,173, 86,155,173, 82,169,102,224, 85,194, 81, + 99,117, 55,217,209,215, 8, 45, 52, 96,209,186, 4, 0,105,105,105,109, 28, 29, 29,199, 18, 4, 49,154,101, 89,127,153, 76,166, + 90,182,108, 89, 92, 76, 76, 76, 69,139, 22, 45,134, 12, 29, 58,148, 72, 72, 72, 64, 98, 98, 34, 91, 92, 92,124,184,198,138,149, +222,200,123,137, 20, 10, 57, 31, 58, 57,145, 67, 89, 22, 33, 96, 65, 16, 36, 30,151,151, 51,103,228,114,250,159, 53,130,177,177, +247,167, 14,227,155, 55,111,254, 91, 70, 70, 6,207,144, 37,213, 80,221,235,227,187, 37,129, 75,195,122,245, 26,117,251,143, 63, +142,125,181, 38,105,101,237,125,179,134, 59,126, 52,238,243, 57,223,237,223,250,253, 87, 63, 28, 47,221,101, 78, 57, 59,116,232, +224, 75, 16,196, 88, 0, 65, 44,203,182,102, 89, 66, 68, 16,108, 41, 65, 16, 73, 0, 18,212,106,117,108,114,114,242,203,183,168, +251,155,140,112, 13,113,234, 23,149, 6, 77, 7,211, 0,107,230,162,210,255,223,229,180,112, 90, 56, 45,156,255, 62,206,255,102, +124,210,192,119,230,101,134,215, 33,253, 69,238,224,244, 23,185,104,221,186, 53,251,236,217,179, 70,137, 52, 67,157, 52, 77,211, + 7,228,114,249,129,183, 33, 41, 46, 46,238,252, 47, 62,121,251, 51, 50, 50,246,255,149,132, 53, 66,106,101,205,235, 77,241,184, +178,178,178,171,185, 7, 83, 20,245,175, 56, 55, 68,141, 53,235, 27, 67, 7, 12, 26, 52, 40,139,162,168, 75, 0,114, 8,130,112, + 0, 80, 66, 81,212,121,173, 86, 91,240,236,217,179,206, 27, 55,110,212,101,190, 95, 5,224,193, 27,150,131, 81,169,232,125,121, +121,244,190,127, 65, 29,247,169,213,234,121,206,206,206,173,148, 74,165, 64,169, 84,242,107, 79, 62, 16,139,197, 82, 99, 1,241, +181,225, 96, 75,236,230,115, 75,157, 29,108,137,250, 66, 10, 78, 77,112, 68, 81,149,216,214,169, 9,142,152, 91,176,248,248,248, +244,144,144,144,189, 36, 73,182, 96, 89,214, 29, 96,237, 89, 22, 82,150,101,139,184, 92,110,110,114,114,114,238,127, 80, 35,164, +212, 50,204,122,173, 90,253, 42,238,208, 50,187,208, 2, 11, 44,248,223,129,193, 24, 45,110, 99,153,158, 61,123, 70, 88,206,167, + 5,181,197,150,177,157, 89, 89, 89, 42, 0,183,106, 94,245,241, 0,192,176,255,244, 10, 74, 36,146,142,134,246,153, 43,178,128, +234,152, 45, 32,177,193,236,236, 43,126, 40,149,225,135,163, 95, 54,182,108,143, 30, 61,202,134,153, 46,118, 11, 44,176,192, 2, + 11,254,101,120,123,139,150, 5, 22, 88, 96,129, 5, 22, 88, 96,129, 5, 13, 98,103, 45,193, 85,199,186, 69,192,240,204,129,198, +248, 94,223,100,246,193, 37, 11,167,133,211,194,105,225,180,112, 90, 56, 45,156,127, 59,206,255, 85,188, 38,178,254, 63, 96,153, +250,106,225,180,112, 90, 56, 45,156, 22, 78, 11,167,133,243,239, 32,178,234,191, 0, 88, 92,135, 22, 88, 96,193,223, 24, 49, 49, + 49,102, 45, 42,250,225, 87,191, 68,216,216, 56, 46,171,172, 40,143,254, 63,246,174, 59, 46,138,171,107, 63, 51,179,179,125, 23, +216,165, 46,197, 2, 10, 34,160,128, 5,123, 68, 77,140,189, 68, 44, 81,177,151, 24, 53, 49,106,212,168,209, 88,227,107, 98,137, + 38,246,222, 91, 20,236,189, 87, 52, 86,172,244, 46,117, 97,123,153,249,254,128, 37,168,148, 5, 77,222,228,253, 56,191,223, 56, +206, 48,243,236,189,119,110,121,238,185,231,158,179,123,233,176, 67,150,251, 97, 97, 97,230,234, 82,172,150,106,169, 22, 84,197, + 24,222,211,211,221,143, 52, 51, 45, 89,150,164, 88,146, 53, 18, 74,205,158, 87, 57, 57,111,184, 29,240,240,240,176,163, 73,116, + 35, 88, 86, 76, 16,140,153,161,200,171, 49, 49, 73,143, 43,145, 48,158, 76, 38,251,146,203,229,118,208,235,245,238, 36, 73, 38, +233,116,186, 51,106,181,122, 21,222,117, 92,248, 95, 19, 31, 31,159, 1, 23, 46, 92,176,107,213,170,149, 78, 40, 20,154, 52, 26, + 13,231,196,137, 19,252, 78,157, 58,229,190,124,249,178, 74, 59, 18, 93, 93, 93,219,109,216,176,193,179, 99,199,142,168, 91,183, +174,170, 95,191,126,220,230,205,155,115, 71,140, 24, 17,147,146,146,114,174,146,112,126, 4, 65,108, 35, 8,130, 98, 24,102, 48, +254,116,221,240,161,133, 36, 73,114, 52, 65, 16,189, 88,150,245, 34, 8,226, 21,203,178,135, 24,134, 41,207,113,107,121,242, 25, +128,206, 36, 73, 6, 3, 0,195, 48,119, 1, 28, 3,172,223,121,247,119, 98,138, 68,162, 32, 0, 80,171,213,247, 62, 20, 38, 65, + 16, 65, 0,192,178,108, 85, 49,135, 10,133,194,145, 0,160,209,104,214,195,138,112, 80,111, 11,187,198,151, 13,158, 27, 13, 0, +184,251,189, 47, 0,160, 50,215,196,152,104,162, 50,191, 85, 26, 94,101, 48, 74,145,206, 3, 7, 14, 92,184, 99,199,142,239, 1, + 28,254, 43, 42,190,139,139,199,170,159, 86,172,115,253,234,203,225,139, 81, 24, 17,162,252, 6, 9,124,204,163,168,238,122,179, +249,242, 99, 96, 31, 0,142, 92, 46, 31,192,227,241,218,232,245,122, 5,135,195, 73,213,235,245,151,242,242,242,118,161,156, 8, + 8, 86,151,235, 19,200, 12,106,184, 16,204,159,113,222, 88, 18, 58,174, 8,105, 68,125,228,252, 3,186, 81, 18,192,196,162,188, +110, 68,217,238, 60,202,235,124,190,114,117,117,237,165, 84, 42,213, 20, 69,177, 40,220,245, 92,248, 79,225,223, 9,134, 97, 50, +178,179,179, 7, 87,132, 37,174,129,122, 60, 49,177,205,108,132,198,164, 99,199,170, 18, 17, 45,241, 64, 11, 22, 24,204, 2,181, + 73,138,116,100, 24, 38, 21,192, 57,210,132,136,130, 20,188,248,135, 14,238, 53,139,202,181, 86,209, 53, 13,192, 25,192,125, 0, + 95, 1, 40,168,230, 63,127,155,188,109, 12,127, 20, 64,106, 49,209, 42,225,238,190,109,215,174, 93, 47,122,122,186,251,245,233, +217,123,225,152,209, 99, 9,138, 34,241,240,209, 35,206,231,131,135,126, 34,147,201,220, 36, 58, 93,125, 16, 4,163, 22, 8, 30, + 42,149,121,201,251,118,237,144,250,214,171,103, 54,155, 25,172, 89,251, 91,167,253,191, 31,156, 97, 37,217,242,113,113,113,217, + 54,109,218, 52,151,238,221,187, 83, 46, 46, 46,136,139,139,179,219,189,123,119,189, 95,126,249,165,111, 78, 78,206, 96, 0,207, +170,144,217,214, 46,114,242, 19,169,144,104,143,124, 51,242,141, 56,155,166,193, 41, 0,151,171, 90,122,106,181,122,188, 90,173, + 14,105,210,164, 9,187,113,227, 70, 98,200,144, 33, 44, 65, 16,132, 70,163,217, 2,160, 74, 68, 75, 44, 22,175,238,216,177,163, +183,183,183,247,171,151, 47, 95,118,222,187,119,239,177,240,240,112, 47,177, 88,252, 28,128, 79, 37,225, 54,103,101,101, 5,106, + 52, 26,184,187,187,111, 4,208,232, 47,168, 68, 4, 69, 81,135,220,220,220,216, 37, 75,150, 28, 14, 12, 12,116,206,206,206, 54, + 77,153, 50,165,195,141, 27, 55, 58,153,205,230,238,149, 32, 91, 50,130, 32,214, 58, 59, 59, 59, 44, 94,188,248, 69,227,198,141, +239,243,249,124,222,243,231,207, 69,147, 38, 77,250,250,217,179,103,125, 89,150, 29, 13, 84,106,128,144, 17, 4,177,214,213,213, +213, 97,225,194,133,113,193,193,193, 15,185, 92, 46,247,249,243,231,226,111,191,253,246,171,232,232,232, 42, 97,146, 36,185, 38, + 36, 36, 68,246,253,247,223, 63,169, 87,175,222, 53,138,162,120, 73, 73, 73,228,156, 57,115,190, 60,125,250,116, 24,195, 48, 99, +170,146, 78, 39, 39, 39,217,156, 57,115,158, 52,111,222,252, 6,151,203,229, 62,125,250,148,156, 54,109,218,151, 47, 94,188,176, + 58,157,114,185, 60,148, 32,136,117,105,105,105, 28, 0, 80, 40, 20, 77,109,108,108,126, 41, 25,211,210,226,138,194,104, 52,230, +107,181,218,129,217,217,217,165, 58,194, 29, 50,125,101, 55, 0,248,197, 96,185, 46, 60, 87,116, 13,172,137,176, 38,211, 65, 46, +133,126,241,126, 82, 13,235, 9, 0, 3,138, 66,133,255,164, 2, 56, 28, 14, 19,228,242, 21,123, 47,173, 82, 46, 99,122,180,107, +215,110,206,185,115,231,126,107,219,182,237,183,219,183,111,119, 74, 76, 76,252,241,242,229,203, 30,253,251,247, 31,114,246,236, +217, 69,153,153,153,251, 63, 84,229,231,113,249,124,130, 36, 32, 20,136,108,172,121,158, 38,201,174,215,122,244, 24,185,254,233, +211,224, 95,162,163, 61, 85, 10, 69,200,132, 9, 19,156,123,247,238, 77,122,120,120,224,197,139, 23,246,219,183,111,175,191,126, +253,250, 94,185,185,185, 19, 1,196,191, 15,201, 82,229,162,129, 78,143, 96,150,133, 93,113,131, 37,144,203, 55,224, 46,251, 4, + 15,254, 1,100,107,246,230,205,155,191,127,241,226, 5, 22, 45, 90, 4, 0,171, 42,249,254,164, 30, 61,122,116, 57,120,240,160, +112,223,190,125,194, 38, 77,154,192,197,197, 5, 69,147,169, 98,199,212,158,158,158,214,149, 25,131,159,150, 31, 27,214,232, 97, +246,113,172,238,157,182, 72,232, 14, 83,139, 30,222,189,186, 14, 9,134,173,163, 8, 2, 9, 7,185, 89,202,128,167,119, 19, 59, +158,223,251,226,199, 23, 81,175, 23,171, 18, 48, 27,101,251,228,251,175,136,189,189,253,198,152,152,152, 80,177, 88,252,198,253, + 87,175, 94, 5,121,123,123,231, 1,248,166,178,196,205,209,209,113, 39,195, 48,186,172,172,172,225, 0, 32,149, 74,119,136,197, + 98, 89,106,106,234,140,191,106, 34, 99,145,183,185,200,191, 92,163, 85,108,175, 85, 90,172, 67,130, 52, 51, 45,199,140, 30, 75, +244, 27,208, 63,237,197,171, 24,134, 67,243, 6,156, 56,121, 82,228,231,231, 71,234, 86,173,130,233,245,107, 24,191,254,186,197, +153, 51,103,140, 97, 3, 6,105,104,138,216,236,229, 89, 91,180,103,215,110,151,131, 7,246,183, 4, 80, 17,209,226,185,184,184, +108,187,112,225,130,155,167,167, 39,114,115,115, 17, 23, 23, 7,149, 74,133,190,125,251,210, 45, 91,182,116,235,211,167,207,182, +188,188,188, 86,149,208,108, 57,215,117,231, 68,142, 30,218,219,167,211, 39, 45,197,110, 30,117,192,166,105,145,248, 50,186, 73, +228,133, 27, 19, 54, 31, 56,246,236, 69, 30,219, 21,165,199, 70, 42, 87, 50, 51, 51,167,246,234,213,235, 64,104,104,168, 35,159, +207,135,171,171, 43,209,189,123,247,140,148,148,148,185, 85,102, 45, 69, 33,108, 72,146, 52,151, 60,151, 18, 30,200, 26,113,151, +201,100,144,201,100, 0,224,246,190, 51, 79, 59, 59,187, 85, 82,169,180,143, 82,169,212,144, 36,201, 18, 4,193,234,245,122,161, + 76, 38,251,227, 73,244, 51, 87,157, 78, 87,119,233,242,245, 43,218,181, 14,180, 57,125,250, 52,122,247,238,205,158, 58,117,106, +180,181,113,234, 8,130, 88,219,171, 87, 47,245,172, 89,179,180, 47, 94,197,185, 61,121,246,138, 16, 11,120,140,131,131, 3,125, +235,214, 45,206,178,101,203, 4,115,230,204, 89,203,178,108,159, 74,148,231,218,254,253,251, 27, 38, 79,158,156,250,244, 69,140, +211,131, 39, 47, 88,137,128, 54, 57, 56,216, 83, 55,110,220, 96,170,130, 73,146,228,154,169, 83,167, 42, 71,143, 30,157,147,149, +157,231,146,163, 44, 96,249, 52,101,116,113,113,225, 28, 62,124, 88,183,115,231, 78,114,228,200,145,107, 24,134, 9,171, 68,249, +174,233,222,189,123,254,180,105,211,114,159,191,138,117,121,240,248, 25, 68,124,218,232,236,236, 68,221,190,125,219,176,116,233, + 82,114,254,252,249, 86,165, 83, 44, 22,111,221,187,119, 47,231,240,225,194,190,239,250,245,235,164,151,151,151,168,228, 51, 26, +173, 14, 36, 1,100,102,102,138,154, 55,111,190, 21,192, 59,206,125,131,231, 70, 99,200,116, 96,252,248,241,169,149,173, 44,193, +138, 9, 21, 62, 99,254,205,151, 93,166, 30,214,147,195,225, 48, 35, 71,142, 76,123,251,239, 90,173,150, 0,208, 29, 63, 90, 79, +182, 58,119,238,252,221,209,163, 71,235,108,223,190,253,231,157, 59,119,234, 1, 64, 32, 16, 56,236,222,189,123, 81,223,190,125, +209,183,111,223, 89,251,247,239,255, 96, 68,203,204,154, 13, 0,192, 23,240,249,209,209,209,132,175,175,111,185, 30,247, 13, 12, +115,103,253,211,167,141,191,240,245,109,146,205, 48,117,185,157, 58, 21, 76,154, 52, 41, 83,169, 84, 34, 46, 46, 14, 6,131, 1, + 67,134, 12,161,218,182,109,235,218,183,111,223,149,249,249,249,159, 1, 48, 88, 81, 39,151,186,185,185,141,202,203,203, 43,176, +104,117, 90, 13, 54,115,218, 4,153,248, 13,235, 26,121, 92,202,196,237,246, 53, 67,156, 90, 69,168,124, 61,113, 5, 0,184,106, +188,174,228,100,160, 84,177,113,135,167,153,198,124, 71,119, 97,187,215,241,154, 31, 84, 9,229,146,165,207,196, 98,113, 79,149, + 74,181,191,104,112,246,233,218,181, 43,110,220,184, 1, 0, 45,139,136, 86, 59,146, 36, 63,103, 24,102, 3,128,242, 66,185, 77, +232,209,163,199,199, 7, 15, 30,148, 2,192,254,253,251, 97, 52, 26,225,229,229, 5, 46,151, 11, 30,143, 7,154,166,139,163,131, + 88, 41, 10, 71, 71, 7, 56,216,210,144,201,197,157,190,253,181, 7,167,134,159, 13, 50,204,143,144,205,230,194,196,234,192,181, + 23,163, 94, 71, 59, 4,127,210,142,140, 88,243,112, 70,196,234, 39,141,213, 36,186, 33, 30,186,127,202,200, 78,146, 36,255,254, +253,251,112,117,117,125,227, 62, 69, 81, 0,208,166, 10,144,179, 94,189,122,213, 60, 42, 42, 10,161,161,161,179, 26, 52,104,240, +233,197,139, 23, 93,178,178,178, 16, 26, 26,186, 50, 41, 41,233,240, 95,157,167,146, 92,228,127, 69,213, 69,190,197, 36,219, 22, +206,130, 73,138,162, 72,196,188,138, 51,134,134,182, 15, 79, 72, 72,144,132,132,132,144, 52, 77, 67,117,238, 28,180,183,111, 67, + 34,145,160, 87,175, 94,244,165, 75,151,108,108, 36, 54, 35, 98, 99, 98,243, 41,138, 4,203,146, 21,218, 60,200,100,178, 47,103, +204,152,225,226,237,237, 13,147,201, 84,236,209,220,100, 50, 33, 49, 49, 17, 18,137, 4,131, 7, 15,118, 18,137, 68, 95, 90,153, +143, 90, 62, 94, 78,119, 47, 28, 91,219,104,210,152,206, 98, 31,209,105,136, 19, 39, 66,178,255, 11,212, 79, 57,129,105, 61, 67, +196,167, 86,207, 10,174,227, 42,191, 91, 66,197,106,181,232,116,186, 43, 15, 31, 62, 28,113,241,226, 69, 6, 0,206,159, 63,207, + 62,121,242,100,244,251,204, 66, 25,134, 65,110,110, 46, 24,134,161,138,174, 45,231,255,106,125,176,177,177, 89,243,233,167,159, +246,143,143,143, 23, 30, 63,126,220, 62, 33, 33,193, 33, 54, 54,214,209,199,199,135,179,104,209,162,163, 90,157,129, 50,154, 89, +189,201,108,204, 79,125,244,232, 85, 78,122,250,221, 77,155, 54,105, 8,130,232,101,229,111,124,166, 80, 40,236,167, 79,159, 14, +130, 22, 53,173, 87,191,129, 55, 69, 11,109, 73,154,103,171,209,104,205, 49, 49, 49,137,211,167, 79,175, 29, 24, 24,232,138,194, +229, 53,171, 48, 93, 93, 93, 29, 38, 79,158, 12, 14, 95, 26,212, 48, 48,184, 14,143, 47,150, 82,180, 80, 26, 18, 18,210,246,213, +171, 87, 41,211,166, 77, 83, 52,105,210,164, 82,152, 77,154, 52,145,141, 28, 57,210, 36, 16, 74,155,123,122,122,213,111,232, 95, +191,139,143,143, 79, 79, 14,135, 99,122,253,250,117,252,224,193,131, 21,221,186,117,115,174, 12,166,147,147,147,108,218,180,105, + 38,143,154, 94, 29, 59,126,252, 73, 51,174, 80,106,203,225,137,237,212,106,173,249,233,211,167,241, 51,103,206, 84, 4, 5, 5, + 57, 89,131,169, 86,171,105, 7, 7, 7, 4, 4, 4,192,207,203, 11,121,121,121, 56,120,240, 32, 54,111,222,140, 13, 27, 54, 96, +215,174, 93,104,220,234, 19, 72,165, 82,164,164,164, 64,169, 84,210,127,119,133, 50,255,230,203,254,162, 31,213,125,236,216,177, + 41, 35, 71,142, 76, 19, 10,133,204,219,135, 92, 46, 55, 15, 28, 56, 48,125,240,183,203,187, 91,150, 22, 43,208,100,221, 63,118, +236,216,203,237,219,183,195,207,207, 15, 29, 59,118,228, 1,192,151, 95,126,201,235,219,183, 47,246,238,221,139,253,251,247, 63, +246,246,246,190, 10,160,135, 53,233, 28, 60,120,112,171,176,176,176,203, 97, 97, 97,247,250,245,235,183,110,244,232,209,111,140, + 92,169, 41, 73,119,244,122, 61, 2,131,155,136,230,109,188, 57,176, 34,188, 39,192,246,117,209,209,155, 23, 63,122, 20, 63,203, +207,207,174,102,108,172,124,203,210,165, 14,150, 32,221, 70,163, 17,137,137,137,144,201,100, 24, 56,112,160, 3,159,207, 31,108, + 69, 50,151,245,232,209, 99,104, 66, 66,130,100,253,250,245,138,123,247,238,185,166,166,166, 42,206,158, 57,233, 56,229,155, 47, +165,182, 18, 30, 47,229, 53, 75, 0, 64,108, 10,196,209, 49,104,197,178,176, 43,185,156, 88, 37, 81, 64, 40,116,199, 47,117, 90, +217, 61,155,188, 55,168,223,180,200, 96, 7,153,130, 63,189,156, 55, 26, 46, 89,178,100, 95, 68, 68,196,128, 86,173, 90, 29, 0, + 32, 44,229, 25, 65,227,198,141, 15,238,221,187,119,104,235,214,173,175, 0, 8, 40,115, 22,233,238,222,235,247,223,127,183,183, + 92, 59, 56, 56, 64, 32, 16,188, 67,178,184, 92, 46, 72,146,172,116,246, 22,236, 30,192,145,215,215,225, 97,206, 49,236, 93,114, + 31, 75, 58, 61,101, 22,182,136,213,173, 26, 28,141, 83,123,239, 35, 3,247,209,249,139, 58, 24, 48, 51,176,131,200,140,249,255, +164, 1,252,245,235,215,159,183,105,211,102, 95,231,206,157,117, 81, 81, 81,120,253,250, 53,220,220,138,231,218,105, 85,128,148, +139, 68, 34,120,120,120,192,219,219,123,192,165, 75,151, 92,140, 70, 35, 98, 99, 99,145,145,145,113,247,239,200, 83, 73, 46,242, + 47,147,183, 13,225,143,190, 67,180,138, 98, 11, 93, 0, 0,150, 32, 84,247, 31, 62,164, 41, 30,111,208,142,157, 59,249, 92, 46, + 23,241,241,241,120,252,248, 49,212,103,207, 66,115,237, 26,210,211,211, 81, 80, 80, 0,103,103,103,172,221,184, 81,172, 55,179, +195,158, 62,123, 70,177, 36, 91,210,222,160,212, 45,158,124, 62,191, 67,239,222,189,203, 36,100, 41, 41, 41,232,220,185, 51, 77, + 81, 84,105,187, 26,222,198, 36, 92, 29,137,136,179, 7,230, 41, 20,188,199,192,139, 73, 64,254, 93,128,213, 1, 38, 61,144,252, + 0, 56, 58, 23, 53, 11,162,137,147,243,194, 93,220, 68,156,136, 82,152,114, 69, 91, 81,189,124,125,125, 55, 12, 26, 52,136, 4, +128,118,237,218, 17,190,190,190,235, 0,120,149,243,206,153, 10, 6,201, 27, 57, 57, 57,232,219,183,175,125,157, 58,117,206,244, +237,219,215,222,114,191,170,152, 22,109,178,159,159, 95,150, 64, 32,216, 5, 88,213,193, 22, 99,218,217,217,173,234,220,185,115, +159,157, 59,119,114, 1,224,194,133, 11,136,136,136,192,163, 71,143,240,252,249,115, 38, 56, 56,216,113,249,134,125,107, 86,253, +182,117, 89,207,150,129,174,109,155, 6,215,151, 20,228, 20, 56, 59, 59,183,100, 89,214,203,202,116,118,158, 59,119,238,227, 39, + 47,227,109, 73, 14,205,225,210, 28,190,141,141,216, 89, 38, 21,187,203, 69, 2, 55, 62, 73, 72,212,106,117,218,174, 93,187, 24, + 0,157,173,197,156, 55,111, 94,204,147, 23,241,118, 4,201,225,208, 28,154, 43,145,136,236, 58,117, 12,109, 2, 0, 92,176, 92, +165, 82,153,190,121,243,102, 67,101, 48,191,255,254,251,135,217,185, 5, 50, 14, 77,211, 28, 14, 85, 92,150, 98,161,208, 81,196, +231,243,116, 58, 93,242,138, 21, 43, 52,149,193,156, 59,119,238,227,167, 47, 19,228, 36, 65, 80, 4, 65,114,108,164, 98,123,123, + 91,145,163,163, 68,232, 32,226, 80, 60,165, 82,153,188,109,219, 54,171, 48, 13, 6, 3, 55, 61, 61, 29, 79,158, 60,129, 71,147, + 38, 56,125,250, 52,106,212,168,129,190,125,251,162,127,255,254, 16, 10,133,104,215,188, 1,166, 79,159,142,151, 47, 95,194, 96, + 48,240, 75,195,180,216, 73,189, 45,174,174,174, 81, 21, 85,158,183,222,125, 35,157, 65, 46, 96,127,209,143,234, 94,146, 96,149, +133, 47,151,203,205,165,105,187,222,198,236,220,185,243,119,103,207,158,173,179,109,219,182,238,131, 7, 15,190,178,109,219, 54, + 52,107,214, 12, 79,158, 60, 65,237,218,181,177,101,203, 22,244,239,223,255,202,202,149, 43,187, 71, 69, 69, 5,122,122,122,206, +168, 8,179, 95,191,126,227,130,130,130,206,165,165,165, 53,207,206,206, 14, 56,120,240,224,176, 94,189,122,197, 12, 24, 48,160, +125, 49, 97, 52, 26,119, 30, 61,114, 0, 93,186,247, 70, 61,255,128, 53, 67,102,108,111, 80, 65,219,100, 31, 1,235, 54,167,166, +190,222,169,213,170,251,210,180, 72,116,243,166,124,255,111,191, 57,148,140, 44,144,156,156,140,110,221,186,209, 92, 46,183,117, + 5,233, 92,210,179,103,207,190, 7, 15, 30,148, 89,180, 58,215,174, 93,195,131, 7, 15, 16, 23, 23,135,220,220, 92,180, 31, 93, +128,177,139, 10,177,199, 46, 98,241,201,151,172,184,138,125, 72,177, 8,107,192,197,222,134,115,117,216,138,122, 95,142, 90,227, +199,145,200,105,236,248,246, 57, 50, 99,117,251,203,192, 36,154, 55,111,190, 61, 44, 44,140,208,235,245,208,235,245,122, 0,165, +122,245,117,115,115, 19, 52,108,216, 16,163, 71,143, 38,109,108,108, 86,150,149, 78,149, 74,165, 59,118,236, 24, 6, 15, 30,140, +137, 19, 39,162,110,221,186,144,201,100,160,105, 26, 91,183,239,113,232, 63,108,140, 79,163, 86,109, 2,253, 26, 53,107,152,175, +163,154,208, 66,217,200, 50,180, 33,165,230,189,192, 41, 10, 15, 99,175,227,151,238, 73,204,173, 45,234,130, 41,159,255, 39,250, +233,197,244, 71, 51,194,214, 61, 90,247, 12,164, 0, 0, 32, 0, 73, 68, 65, 84,100,175,183,200,220,254, 85, 2,210,141, 79,208, +186,111, 77,120, 6,201,190, 22,123,192,183,170,229,105,165, 84, 10,179, 65,131, 6,173,110,221,186,197,111,211,166, 13,226,227, +227, 65,211,197,243, 41,243,251,164,115,238,220,185,124,173, 86,139, 63,254,248, 3,225,225,225,201, 6,131,225,235,247, 73,103, +101, 52, 90, 22, 46,242, 47,147,117,111, 29,169,101,105,180,230, 2,128,145, 65,196,160,240, 97,234,200,200, 72, 17,143,199, 67, +124,124, 60, 82, 83, 83,177,117,243,102,115, 59, 39,167,252,142,110,110,202,173,155, 55,179,122,189, 30, 44,203,194,215,215, 23, +125,250,244, 17,126,214,119, 64, 6,161,212,236,177, 98,153, 71, 97, 89, 95, 31, 54,108,216, 59,127,159, 50,101, 10,108,108,108, + 64, 16,132,139, 21,153, 11,155, 48,183,167,187,204,211, 46,157, 77,219,154, 13, 74, 0,112,164, 0,199, 6, 16,216, 2,124, 41, +192, 19, 65, 23,117, 46,155,100, 59,198,245,110, 61,220, 13, 64,101,150,122,224,234,234, 58,235,220,185,115,142, 81, 81, 81,172, + 82,169, 68,106,106, 42,187,112,225, 66, 71, 87, 87,215, 89, 85,253, 34, 41, 41, 41,243,186,116,233,146, 30, 30, 30,110,123,226, +196, 9,143,240,240,112,219, 46, 93,186,164,167,164,164,204,123,159, 47,205,229,114,169, 71,143, 30,201,231,207,159,223, 31,192, + 29,127,127,255, 44, 55, 55,183, 59, 40, 52,154, 44, 87,164, 82,105, 49,201,178,104,215, 56, 28, 14,104,154,134,171,171,171, 62, + 59, 59,219,220,186,145,151,208,215,150, 52,186,242,185, 66,185, 80,224, 46,181,177, 13,201,202,202,186, 79, 16,196, 43, 43,151, +248,130,154, 54,109, 74,155, 89,154, 25, 59,168,157,235,151, 67, 67,157,126,157, 63,178,198,138,121,163,220,150,204, 25,225, 59, +111,234,192, 80,146, 97,180,181,107,215,118,177, 24,180, 91,161, 62, 15,110,220,184, 49,135, 1,141, 39,207,226,210,227,147,146, +243, 63,110,219,188, 88,115,233, 23, 20,220,209,209,209,177,141,175,175,111, 99,130, 32,172,218,146, 44, 20, 10,131,234,213,171, +199, 33, 41,154,176,151, 73, 61,164, 18,161,115,241, 18,138,157, 93, 11,185,163, 99, 24,201,178,121, 10,133,194, 73, 40, 20, 6, + 85, 34,239, 28, 6, 92, 56, 59,201,109, 29, 29,236, 36, 29, 67, 91,214,109,222,162,185, 79,131,144,102,205,253, 27, 53,254,140, + 48,153,148, 94, 94, 94, 78, 22, 35,249, 10, 52,173,130,157, 59,119, 98,254,252,249,104, 88,179, 38,220,220,220,224,228,228,132, +107,215,174,225,214,173, 91,144,201,100,200,200,200,192,210,165, 75,113,232,208, 33, 24, 12, 6,105,101,235,147, 53,100,171, 60, + 49,153, 76,228,219, 4,171, 44,124,161, 80,200, 88,140,228,203,146, 99,199,142,109,183,104,178,190,250,234,171, 86,203,151, 47, +191, 18, 29, 29, 13,137, 68,130, 91,183,110, 97,216,176, 97, 87, 86,174, 92,217,106,204,152, 49,216,188,121, 51, 98, 98, 98, 54, +150,135,215,175, 95,191, 57, 35, 70,140, 88,113,241,226, 69,210,217,217, 25, 50,153, 12, 61,123,246,196,198,141, 27, 57, 38,147, +105, 83, 88, 88,216,189,176,176,176,123,230,196, 83,223,237,219,176,240,218,195,251,247, 48,110,194,100,158,222,100,156,102, 69, +246, 89,141, 68,146,111,106,211, 38,123,175,209,168,238,199,229,138,108,239,221,147, 71,108,218, 84, 76,182,166, 79,159, 14, 91, + 91, 91,160,208,128, 25,229,104,117, 70, 29, 58,116,168,184, 63,180,183,183, 7,143,199, 3,151,203, 5, 77,211,160, 40, 10,103, +214,136,241,219,244, 66,126,241,219,116, 2,167, 86, 17,170,247,249,118, 34, 55, 4,200,156,121,247,190,216,226, 31, 24,208,222, + 30,215,118,167, 97, 97,151,168,164, 91,123, 95, 79,210,102,224,167, 50, 94,107, 52,101,202, 20,191,140,140, 12,220,190,125, 27, +183,111,223, 46, 75, 3,164, 61,114,228,200,143, 5, 5, 5,240,244,244, 68,143, 30, 61,218, 0,104, 82, 70,187, 65,227,198,141, +209,173, 91, 55,132,134,134,162, 97,195,134,208, 27, 76,116,216,160, 81,245, 30,197,188,118, 91,184,116,161,232,220,249,131,228, +149, 43, 23,169,237, 7, 78,217, 54, 15,253,100, 5, 87,170,184, 1,161,189,194,154,124,170,205, 89, 8, 82,116,194,186,179, 19, +200, 95, 46,132, 75,182, 70,252,226, 37,149, 74,137,187,183,239, 25,183,174,222,155, 16, 32,238,145,113, 99,119, 22,212, 68, 26, +218, 15,245, 36, 25,160,207, 63,101,100, 23, 8, 4,203, 47, 94,188,232, 98, 48, 24,240,240,225, 67, 76,156, 56, 81,251,158,144, +197, 10, 16, 15, 15, 15, 92,184,112, 1, 3, 7, 14,212,166,167,167, 95,255,187,242, 84,146,139,252,175, 8,167, 4,131, 44,150, +196,196,196, 92,153, 76,230, 86,175, 94, 61, 82,175,215, 23, 46, 73,236,223,111,222,176,105,211, 81,173, 86, 59, 1, 0,119,213, +175,191,174,113,115,119, 15, 29, 52,120, 48, 97, 52, 26,209,165, 75, 23, 94,100,100,164,253,171,140,140,124, 43, 6,156, 55,126, +111,200,144, 33, 88,190,124, 57, 0, 96,252,248,241,197,170,117,194, 10,131, 37,137, 45, 58,119,236,218,216, 38, 81,252,139,141, +161,133,177,160,214, 75,233, 13,113,129,176, 49, 72, 30, 7, 2, 10,140,193,104,122,158,209,235,206,203,231,245,253,132,217, 89, +181, 59,248,127,132, 13,167,183,117, 86,155,181,123,173,238,112, 68,162,166, 18,137, 4,119,238,220,201,110,220,184,113, 46,203, +178,182,243,230,205,115, 16,137, 68, 77,223,163,236, 99,159, 61,123,214,166,101,203,150, 95,146, 36,217,129, 97,152, 51,233,233, +233,171, 0,196, 90,249,254, 88, 0,223, 3, 40,158, 89,234,245,122,144, 36, 9,150,101,209,175, 95, 63, 76,159, 62,221,239,193, +131, 7, 56,119,238,156,188, 67,135, 14, 55, 0,228, 2, 24, 14,160, 84,173,153, 82,169,212,220,186,117, 75,120,238,220, 57, 48, + 12, 3,185, 92, 14, 27, 27, 27,240,249,124,244,236,217, 83, 50,109,218,180,246, 39, 79,158,204, 80,214,170, 65, 9, 82,147, 85, +124,137, 68, 10, 23,183,214, 99, 6,124, 30,205,178,236,161, 74,116, 14, 60, 33,199,164, 37,204, 58,114,201,236,149,164,136,203, + 37, 4, 92, 14,248,140, 26,223,253,184,128,224,178,102, 14, 42,185, 62,207,229,114,185, 82, 62,244, 20,143, 50,138, 8,176, 31, +162,113, 80, 20,197, 19,112,203,182,199,160, 73,146, 36, 73,146, 11,192,234,160,125,124, 62,159, 43,229,179,101, 98, 10, 41,130, + 34, 8,130,135, 50,118,162, 5,185,128,181,104,145,120, 19, 94,233, 74,146,226,214,173, 91,227,232,185, 59,216, 31,113, 6,153, +241,247, 49,243,219,175,208,164, 73, 19, 68, 70, 70,150,155, 38,139,141, 86, 89,218,101, 87, 87,215,168,148,148,148, 70,101,189, + 91,222,146, 97, 25, 90,170,119,241,103,219, 34,120,110, 52, 42,176,209,234,209,186,117,235,113, 59,119,238,212,127,250,233,167, +188,126,253,250, 33, 32, 32,160,213,208,161, 67, 1, 0, 29, 58,116,192,242,229,203, 91, 13, 29, 58, 20,123,246,236,193,193,131, + 7,117,109,219,182,253,246,194,133, 11,201, 40,220,209,249,142, 48, 12,211,109,237,218,181,111,107, 10, 97, 50,153, 96, 52, 26, + 21, 38,147, 73, 81,212, 23, 97,197,138,149,153,167, 78, 70,226,219, 25,115,225,228,232, 18,100,101, 29, 34,134, 76,158,156,185, +101,233, 82, 44,221,179, 7,147,107,215, 22,109,123,252, 24,167,180, 90,236, 61,119, 46,179,232,119, 42,180,205, 84,169, 84,154, + 99,199,142,217,236,221,187, 23,118,118,118,168, 91,183, 46,228,114, 57,104,154, 6, 73, 9, 65,113,101,168,231,223, 20,192, 45, + 0, 64,109, 87,168,124, 61,113,133, 32,144,203,146,149,183, 41,226,215, 64, 45, 7,119,193,197,113,155, 3,236,108,156,184, 56, +177, 42, 1, 39,127, 73, 60,164,205,196,207, 48,225, 41,202,182,249,106,236,233,233,137,140,140, 12, 28, 59,118, 76, 5,148, 73, +200,192, 48,204,143,191,254,250,235,148, 25, 51,102,240,125,125,125, 1, 32, 8,192,237,210,158, 21,139,197,112,115,115, 43, 38, +150,253,194,199,120,141,158, 52, 70,216,235,147, 80,112, 56, 14,200, 85, 25,145,149,111,132,204, 65,130,111, 39,133, 9,206, 52, +118,107,178,118,229,142, 35, 26, 13,154, 0,239,246, 7, 4,129,219, 55,239, 95,105, 32,240, 5, 8, 18, 72, 36,207,131, 0,129, + 2,194, 8,130,162, 88,179,217,140,132,132, 4,176, 44,139,129,189,134, 37,142, 90,120,208,169,213, 64, 37, 60,234,185,130, 96, +241,209, 63,133, 8,216,219,219, 7,101,101,101, 33, 54, 54, 22,225,225,225,201,153,153,153,167, 85, 42,213,176,148,148, 20, 0, +200,174, 2,100, 49,153, 15, 10, 10, 66,211,166, 77,209,183,111, 95,129, 90,173, 14,243,242,242,114,123,253,250,117,139,191, 50, + 63,111,115,145,255, 41,162, 85,106, 67, 51, 26,235,233,214,172,129,234,204, 25,240, 78,157,194, 94, 87,215, 2,173, 86,251, 13, +128,196,162,134,255,213,230, 45, 91,174,118,191,126,221, 70, 31, 29, 13,175, 7, 15, 64,219,217, 5, 85, 54, 1,155, 54,109,130, + 82,169, 68, 94, 94, 30, 0,224,151, 95,126,129, 82,169,132,201,202,128,179, 28, 46, 90,185, 56,213, 70, 26,158,131,225,144,146, +184,122,234,102, 18,173, 52,197, 45,193, 89,149, 71,186, 33, 58, 62, 68,172,201,210, 55, 35, 40, 61,180,153,106,184,181,172, 11, + 14, 56,173, 42,147, 70,203,186, 63,135,195,201,126,246,236, 89, 55, 31, 31,159, 8, 0, 14, 85,177, 7,120, 75, 94,164,167,167, + 79,168,202,139, 20, 69,125, 31, 19, 19,227,180,113,227,198, 47,231,205,155,199,150, 36, 90,150,255,115, 56, 28,176, 44, 11, 91, + 91, 91,208, 52,237,124,237,218, 53,231,144,144,144,213, 12,195, 4,149,145, 79, 54, 32, 32, 0, 49, 49, 49,224,112, 56,176,181, +181, 5, 99, 50, 96,238,164, 49, 48, 83,124,206,212,169, 83,131,122,247,238,253,112,227,198,141, 70,155,230, 45, 91,100,101,101, + 61, 26, 55,112,208,195,195,135, 15,235,139, 92, 60, 84, 60,197,103,217,123,207,159, 63,167,220, 93,157, 41,214,164,102,196, 92, + 64,112,127, 5,203,147,184, 64,192,161, 88, 46, 65,130, 47, 16,218,198, 38, 37,101, 49, 12,243,196, 26, 76,134, 97,238,198,196, +196, 8,157,157,236, 57,106,141,190, 64, 72,179,188,184,187,119, 94,213, 10,110,236, 5, 0,218,187,183, 46,240,235,213, 23,198, +165,191, 22,215,174, 93,219, 42, 76,141, 70,115, 47, 57, 57,153,114,118,118,230,196, 39, 38, 29,177,147,136, 29,109,236,236,154, + 1,128, 33, 63,239, 22,169,211,189,166,104,142,243,235,172,172,108,141, 70, 19, 99,109,222, 95,190,124,201, 81, 40,156,168, 19, +167,206, 70, 56,139,248, 78, 82, 30,199,134, 79, 16,132,136, 34,148, 92, 19,147, 41, 16,137,156, 98,147,146,178, 89,150, 45, 83, + 67,184, 56,119, 80,175,194,239, 53,119, 79, 9,108,220,191,127, 31,199,175, 60,129,152,213,131,208,230,225,212,230,245, 24, 56, +117,198,123,219,253, 85, 68,182,170,164,205, 90, 91, 63,234, 45,124,164, 86, 96, 8, 63,112,224,192,185,219,183,111, 47, 54, 64, +121,242,228, 9,218,181,107,103, 89,230, 64,199,142, 29, 17, 18, 18,130, 39, 79,158,192,219,219, 27,231,206,157,227, 83, 20,197, + 31, 52,104,208,194, 29, 59,118, 28,171, 80,239,191,110, 29,134, 13, 27, 86,154, 97,245, 75, 0, 90, 66,230, 91, 48,125,241, 86, +135,236,172, 76,100,188, 78,187,103,109, 57, 16, 4,129, 33,147, 39,103,174,213,235,177,243,230, 77, 12, 22,139, 69, 91, 94,188, + 64,151,144, 16, 52,104,215, 46,211,154,190,206,162,213,209,106,181,160,105, 26, 54, 54, 54,176,183,183, 7,151,203, 5, 69,187, +130,195, 11, 4,201,229, 34,184,117, 32,150,126, 35, 86,135,119,194, 74,130, 64, 46,159,135,187, 92, 81,153,182, 58,132,184, 6, +122,178, 44,148,234, 68,156,183, 16, 18,219,154,176,165,165,244,169, 17,171,125,237,108,156,184, 56,190, 50, 30,167, 86, 39, 29, +208,166, 97,102, 81, 89, 48,229, 76, 36, 26,216,217,217, 33, 49, 49, 17, 9, 9, 9,143, 81,190,129,191,250,201,147, 39,175,248, +124,190,159,163,163, 35, 0,120,150, 53, 49,103, 24,166,216, 14,107,219,206,125, 14, 65,109,188, 4, 31,183,242,195,214,136, 5, +248, 34,108, 37,104,138,128,217,108,192,207,203,187,194,172, 43, 64, 88,247, 81,196, 71, 29,188, 3,207, 68,232, 71, 24, 53, 57, +235,223,153, 8,112, 48,255, 63,253,175,217,241, 37,100, 3, 48,132,157,131,131,147,152,203,229,194,222, 70,161,159, 49,250,235, + 84,150,101,139,219, 13, 77,113,141,100,190, 92,147,149, 86, 32,180,163, 53, 0, 75,214,170,154, 55,155, 15, 47, 73, 73, 73, 19, +218,180,105,179, 48, 63, 63, 63, 71,165, 82, 13, 4, 0, 79, 79,207,154, 36, 73,242, 1,148,183, 58, 82, 19,165,187,133,224, 62, +120,240, 0, 82,169, 20,201,201,201, 37,149, 47, 96, 24,230, 31,179, 9,224, 31, 42,193, 0,238, 2, 80, 0,232,130, 18,238, 29, +200, 34, 85,221, 71,145,145,145,108,100,100,228, 71,197,131, 23,203, 50,166,236,108,176,186,194,178,165,105,154, 5, 80,114, 71, +147,200,206,206,142,160,221,221, 65,240, 11, 77, 63,216, 15,184,245,213,104,180,206,181, 12, 99, 6, 5,194, 0,182,196,164, 69, + 37, 32,176,192,161, 61, 38,240,102, 33,141,103, 87,114,164, 3, 76, 44,204, 96,168, 74, 38,135, 85,169, 84, 48,153, 76,178, 58, +117,234, 28, 53,153, 76,178,162,193,141,253,111,125, 81,179,217,252,138,162, 40,124,249,229,151,176,104,127,244,122, 61,210,210, +210,160,211,233,160,215,235, 17, 19, 19,131,188,188, 60,232,245,122, 60,122,244, 8,158,158,158,160, 40, 74, 81, 78,103,206,178, + 44, 11, 15, 15, 15,212,170, 85, 11, 20,193, 98,195,146, 57,248,110,226, 24,244,247,100,176,105,213,207,104,219,182,109,253,218, +181,107, 55,231,112, 56,102, 23, 23, 23,238,193,131, 7,143,152,205,230,158,176,190,231, 57, 54,125,250,244, 90,254,254,254, 78, +118, 54, 82, 35,159, 71,129,103, 84,177,124, 93, 22,203, 81,103,194,195,163,166, 9, 66,145,247,224,193,131,205,101,105, 33, 74, +195,252,230,155,111, 20,190,190,190,182, 50, 59,169,138, 71, 83, 25, 92,176,153,121,247,111,223, 0, 0,158,163,147, 22, 2,145, + 95,120,120,184,169, 50,152,179,102,205,242,116,116,116,180, 35,193,230,155, 13,134, 63,215,219,117,250, 44,130,166, 53,224,242, + 26,143, 31, 63,158,168, 12,230,148, 41, 83,106,251,249,249,217,217,217,136, 11, 56, 52,149,202,101,152, 84, 1,152, 52, 90,111, +200, 17, 56, 58,168, 33,146, 4, 15, 30, 60,184, 76, 76,139, 54,107,218,180,105,137,111, 17,111,100,103,103, 67,155,246, 16,220, +228,104, 4, 74,104, 52,113,148,129,207,231, 23,111,125, 47,171,186,150,101,163, 85, 26,217,178,246,221,198, 63,148,179, 4,184, +182,126,212,219,126,179, 82, 82, 82,160, 80, 40,202,109, 79, 59,118,236,152, 17, 26, 26,154,209,177, 99, 71,253,209,163, 71, 65, + 16, 4,206,157, 59,135,228,228,100,116,236,216, 17, 44,203, 90,118,181,225,222,189,123,232,208,161,131,190, 77,155, 54,201, 69, +254,181, 42,148, 97,195,134,193,104, 52,162,160,160, 0,217,217,217,136,140,140, 68, 96, 96, 32, 43, 18,137,122, 83, 30,159, 44, + 8, 27, 49,163, 69, 64,195, 32,172, 94,185, 84,207,227,208,139, 43,211, 94, 9,130, 64,248, 55,223,100,230, 5, 7,103,111, 83, +169,212, 67,108,108, 68,117, 18, 19,229,119, 78,158,116, 48, 24, 12, 86, 97, 88,180, 58,238,238,238,197, 36,139,203,229,130,195, +115, 4, 37,110, 0,158,125, 71,136, 92,122,227,252, 93,190,206, 86,140, 67, 82, 9, 78,136,237,202,118,237, 32,242,192,130, 22, +253, 20, 7, 91,246, 87,156, 21,213,192,198,162,241,128,100, 57,196,193,161, 63,251,212,113,172, 37,196,245,125,105, 56,181, 58, +233,119,109, 26,230, 0,120, 81, 81, 59, 55, 24, 12, 90,179,217, 12,146, 36,193,225,112, 74,218, 4, 94,253,253,247,223,113,231, +206, 29,160,132,219,158,252,252,124, 51, 69, 81, 16, 8, 4, 0, 32, 41,167,191, 3, 77,211,160,105, 26, 23,110, 92,178,239,255, + 89, 87,226,218, 31,167,209, 50,112, 0,178, 10, 12, 72,207, 51, 32, 87, 13,248, 55,153,137,128, 14,135,112, 63, 38, 31, 65, 13, + 3, 40,138, 39, 14, 47, 13, 79, 27,139, 68, 85, 2,250,100, 61,102,234,234,147,132,199,175, 31,126,242,248,210,254,251,143,118, +255, 26,241,162, 69,147, 54,170, 34,101, 2, 10, 10, 10, 88,130, 32,216,175, 71,206,120,181,109, 88,142,121,229,192,251, 12, 71, + 39,120,249, 55,118,245, 53, 29, 29, 29,175,217,219,219,159, 43, 34, 71, 53,165, 82,233, 85,133, 66, 17,141,194,141, 30,135, 83, + 83, 83,125, 85, 42, 85, 75, 20,110,206,138,207,202,202,106, 87,164,121,138, 47, 71, 19,182, 81,169, 84,126,101, 54,155,187, 23, + 29,157,204,102,115,208,243,231,207,253,130,130,130, 30,123,121,121,221,243,242,242, 58,238,229,229,117,196,203,203,235, 72,104, +104,232,114,139,187,135,191,120,217,240, 29, 46,242, 47, 35, 90, 40, 34, 89,235,138,206, 40, 38, 90, 0, 46,188,109,128,102,226, +243, 31,153,198,141,131,221,145, 35,160,159, 63,199,208,240,112, 27,145, 72,180, 18,133, 62,154, 90, 74, 36,146,213,115,230,204, +145, 58, 44, 90, 4,215, 75,151, 16, 23, 25, 9, 35, 77,223,174, 74,234, 52, 26, 13, 56, 28, 78,177, 38, 70, 44, 22,195,108, 54, +163, 52,149,239, 59, 13,208,132,235,201,233,209,224,161, 22, 24,176, 5, 39,148,109,110, 14,120, 53,211, 41, 82,233,233,253, 66, +197,245,254,193,177,153,211,202,154,173,110,170, 8, 78, 1,207, 78,128,132,132, 68,152,193, 84,106,189, 89,171,213,230,169, 84, + 42, 4, 5, 5,217,223,185,115,167, 78, 96, 96,160,188,232,254,173,247,252, 48,205, 93, 93, 93,247,185,185,185,197,186,186,186, +238, 3,208,188, 18,239,110,188,124,249, 50, 40,138,194,156, 57,115,144,159,159, 15,131,193,128,172,172, 44, 36, 36, 36, 64,175, +215, 35, 41, 41, 9, 79,159, 62,133, 94,175, 71, 92, 92, 28,116,186,138, 39, 36, 12,195,192,198,198, 6, 90, 77, 1,126, 91,240, + 29,102, 77,155,132,188,151, 81, 72, 74, 73,135,157,173, 24, 19, 38, 76,160,100, 50, 25,195, 48, 76, 45,179,217,220,129, 97,152, + 53,214,124,167, 18,245,237,138,135,135, 71,192,146, 37, 75,252,190, 91,176,134,107,195, 41, 96,249, 82, 1,195,147,242, 89, 94, +253,102, 24, 54,115, 37,119,197,178,159,158, 93,191,126, 61, 25,214, 57,239, 36, 1, 92, 9, 14, 14,246, 73, 78, 78, 14,244,245, +245,173,231, 80,179, 54,159,175,112,203,229, 42,106, 40, 89,157,246, 38,225, 86,163,245,154, 53,107, 30, 94,189,122, 53,165, 50, +152, 98,177,184,254,214,173, 91, 3,156,157,157, 3,104,161, 80,160,206,203,219,107, 82,171,246, 81,118, 50, 1,105, 99,215,233, +208,161, 67, 81, 7, 14, 28, 72,171, 12,166,183,183,183,239,130, 5, 11,252, 27, 52,104,224,239,226, 89,135, 47,116,243,200, 18, +184,215,204, 18, 54, 8,228,195,189,214,167,171, 87,175,190,119,253,250,117,171, 48, 41,138, 50,145, 36, 9,154,166, 33, 18,137, +112,226,196, 9,140, 27, 49, 0, 30,110,246,168,231,235,139,246, 95,124,133, 3, 7, 14, 20,219,240, 80, 20, 85,230,136,190,101, +209,132,136, 96, 5, 17,133,181,245,163,176,182,126, 84,176,130,136, 42,147,108, 21,253,189,180,103,172,234,141,202, 88,110,180, +130,108, 29,187,112,225,194,143, 67,134, 12,225,117,238,220, 25, 55,111,222,196,176, 97,195,174, 28, 60,120, 16, 0,112,243,230, + 77,124,253,245,215, 87,206,158, 61,139, 49, 99,198,160, 93,187,118,188,203,151, 47,175,134, 21,190,127, 76, 38, 19, 54,109,218, + 4,147,201, 4,137, 68, 2,185, 92,142,174, 93,187,226,225,195,135, 99, 54,111,222, 28, 77,209,244,231, 93,186,127,134,163, 71, + 14,226,233,163,135, 99,182, 44, 28, 84,105,167,192, 36, 73,162,115,120,120,102,166,191,127,246, 22,165, 82, 61, 92, 38, 19,249, +166,165,201,207,239,219,231, 96, 5, 81, 35,204,102,115, 49,185,178,144, 14,203,193,225, 57,130, 35, 14, 0, 71,218, 4,247, 95, +112,141,220, 16,220,229, 53,193,147,242,252,103,209, 60,114, 88,239,239, 60,209,251, 59, 79,244,152, 90,123,168,168, 6, 54,136, +107, 96,108,231,137,181, 66,189,154,216, 66,153, 97, 64,228,207,113,241,218, 44, 44, 2,240,212,154,118,206, 48,204,227,228,228, +100,240,120, 60,212,168, 81,195, 7,128,197, 46,112,227,200,145, 35,199,255,240,195, 15,147, 0,252, 80,116, 79, 18, 26, 26,234, + 95, 80, 80,128,231,207,159, 3,192,157,114,180,193,197,187, 12,179,149,113,252,218,174, 13, 16, 88,127, 52,100,178,134, 72,206, +214, 35, 37, 91,143, 13,191,245, 68,212,229,249,184,115,106, 48,226,211,210, 32,116,233, 5,179, 73, 23, 96,197,164,222,245,143, + 63,254, 32, 46, 95,190, 76, 48, 12, 3,163,209,200,230, 43,149,236,221, 43, 87,160,185,120,145,176,177,177, 33, 90, 53,109, 83, +176,101,254,209, 91,135, 86, 93,185, 99, 80, 87,122,162,254, 62, 50,235,213,171, 87,205,247,237,219, 23, 10, 96, 86,131, 6, 13, +174, 39, 36, 36,180,184,116,233, 82, 61,119,119,247,149, 85, 5,181,184,133,136,139,139,123,227, 40,114, 11,161, 47, 34, 13,157, +139,200, 92, 15, 0, 95,227, 61,118,217, 87, 66, 46,252,139,141,225,143,226,173,221,134,111, 19,173,146,142,194,224, 37,147, 73, +141, 70, 67,210,233,211,167, 13, 36, 73, 66, 36, 18, 97,200,176, 97,228,111,191,254,218,122, 64,243,230,231, 70,125,252,241,241, +115,103,207, 6,135,132,132,128,101, 89,144, 36,137, 61,123,246,104,180, 90, 77,150,135,135,135,157, 53,157, 70,201, 6,164, 84, + 42,139,137, 86, 94, 94, 30,156,157,157,173, 94, 58, 84, 41,113,230,236,137,168, 28,214,252, 69, 66,231, 23,203, 12,139,211,122, +134,228, 50,102, 78,158,217,136, 60, 13,139,124, 45, 56, 55, 73,121,200, 16,239, 94,134,152, 14, 33, 79, 47, 70, 95,203,210,154, +181,149,218, 45,145,145,145,241, 93, 88, 88, 88,150, 66,161, 32,108,108,108,224,230,230, 70,246,232,209, 35, 51, 49, 49,241,135, +170,126, 17,123,123,251,254,161,161,161, 17,201,201,201,125, 46, 94,188, 88,235,210,165, 75,125, 66, 67, 67, 35,236,237,237,251, + 91, 9,177,119,198,140, 25, 42, 30,143,135,102,205,154, 33, 63, 63, 31, 69,187,124,202, 61,172, 89, 34,229,114,185, 88,187,228, +123,204,154, 54, 9,217,209, 55,113,255,202,105, 92, 72, 35, 48,115,193, 79,224,114,185, 85,242,245, 85,215, 81,212,160,129,171, +244,201,215,195,250,165, 76,159, 54, 77,122,239,222, 61,122,252,196,175,217,184,212,108,240, 58, 47,165,240,209,119,228, 31, 42, + 71,116,233,212, 30,115,102, 77,110, 80,228,180,179, 92,169,239, 40,106, 16,224, 42,125, 60,121,212,128, 87, 19, 39, 78, 20, 46, + 94,188, 88,219,188,121,115, 77,122,122,186, 80, 44,147,251,114,108,237, 2,226, 82,211, 36,205,155, 55,143,249,226,139, 47,114, + 43,139, 57,115,230, 76,209,201,147, 39, 57, 97, 97, 97,166,156,156, 28, 9, 45, 20, 6, 17,124, 65,211,215, 57, 57,182,125,194, +194, 94,244,233,211, 71, 93,228,176,212,106,204,217,179,103,139,158, 62,125,202,105,222,188,185, 49, 45, 45, 77, 42,182,119, 8, +164,236,228, 77, 98, 83,211,109,154,134,132,188, 28, 63,126,188,170,188,116,150, 36, 41, 82,169, 52,185,101,203,150,248,249,231, +159,177, 98,197, 10,124,250,233,167,120,248,232, 33,186,140,159, 4,191,177, 95,227,200,181, 27, 72, 78, 78,198,188,121,243, 16, + 24, 24, 8, 46,151,251,180,212,246, 56, 38,154,184,151, 6,226, 94, 26, 8, 98, 76, 52, 97,185, 46, 83,179,245, 67, 30, 74, 62, + 95,218,115,119,102,151,174,233, 10, 86, 16, 81,229,217, 97, 85, 68,182,250,244,233, 51,206,226,194, 97,248,240,225, 87, 86,174, + 92,217,106,248,240,194,137,118,179,102,205, 48,127,254,252, 86, 51,103,206,188,178, 96,193, 2,180,111,223, 30, 94, 94, 94, 21, +110,124, 49,155,205, 48,153, 76, 24, 48, 96, 0, 76, 38, 19, 94,191,126,141,103,207,158, 97,221,186,117, 96, 89, 86, 0, 0, 10, + 87,247,198, 60, 30, 15,127,220,189,173,158, 53, 60,100, 71, 37, 52, 89, 68,201, 73, 76, 65, 65, 1,250,140, 29,155,153, 84,183, +110,246,154,204, 76,245, 8,153, 76, 84, 59, 62, 94, 46,213,235,221, 80,142, 93, 34, 65, 16, 96, 24,166,152, 88, 89, 8,215,219, + 71,209, 64,105,149, 24,212,204,177, 75,219, 83, 0, 0,109, 6,185,162,199,212,218, 67, 21,222,162, 95, 90, 15, 44, 84,122, 31, +152,255,138,205, 79, 49, 47,134, 17,143, 43,161,177,190,121,243,230, 77,216,217,217, 33, 44, 44,140, 79,146,228, 34,203,124, 21, +133,190,179,150, 89,176,248,124,254,210,193,131, 7,147,185,185,185,184,127,255, 62, 0,156, 45,171, 95, 98, 89,182, 56,239, 5, +217, 4,204, 12, 15, 87,239,158,192,169, 75,251, 17,155,252, 26,241, 25, 90,128, 99, 11,173, 42, 9, 6, 77, 50,244,185,119,161, +212,137,172, 74, 48,151,203,125,221,160, 65, 3,182, 73,147, 38, 44,203,178,120,249,242,165, 41, 46, 62,222,116,123,249,114,246, +193,232,209,132,244,217, 51,174, 80, 40, 36, 60, 61, 61, 33, 16, 8, 24,129, 64,144,245, 55, 14,222,127,137,187,133,191,192, 45, +196,135,212,106,177,248,119, 74, 42,222,220,109, 88,236,192,180, 52,135,165, 96,109,132,253,246,175,254,205, 54,108,192, 32, 85, + 96, 96,160,204,205,205, 13, 4, 65,160,103,175, 94, 68,232,197,139, 82,218,213, 21,246,141, 26, 21, 47, 71,156, 57,125, 26, 39, + 78,156, 80, 29,253,253,144,219,176, 17, 35,186, 1,216, 90, 78, 98, 56,124, 62,191,248,119, 83, 83, 83,193,231,243,139,109, 34, +148, 74, 37, 28, 29, 29,145,154,154, 10, 43, 87,230,182, 77,159,118, 99, 90, 70,200,119,158, 33, 82,154, 56,174, 74,131,153,101, + 65, 19,102, 64,195,194,104, 6,116, 70, 22,141,107, 83,242, 83, 26,147, 44,242,230,193, 24, 0,219, 42, 83,122, 58,157,238,252, +189,123,247, 70, 51, 12,179, 31, 0,121,241,226, 69,230,241,227,199,227, 96,189,225,250,187,106,123,145,104,234,185,115,231,228, + 83,167, 78,205,137,140,140,204,235,218,181,171,237,186,117,235,228,237,218,181,155,154,149,149,181,219, 26, 69, 96, 66, 66,194, +214,196,196,196,113, 77,154, 52, 65,118,118, 54, 12, 6, 3,162,162,162,224,237,237,141, 59,119,238,192,199,199, 7,183,111,223, + 70,189,122,245, 96, 54,155,161,213,106,193, 48,140,185,162,206, 60, 59,243, 53,144,149,128,148,155,199,241,236, 65, 20,206,165, + 16, 88,181, 59, 2, 53,106,121, 86,201, 79,141,143,147,200, 95,225,104,127,106,241,220,217, 78,113,231,247,224,224,166, 85,204, +133,227,199,253,120, 82,140,254,104,192, 87,159,233,141,168, 9,128,215, 34,164, 9, 58,203,158,154, 69,181,144,118,238,113,249, + 14, 22,125,156, 68,254,206, 14,246, 39,255,179,232, 7,233,203, 19, 91,176,119,237,207,236,129,237,187, 2,181, 64,136,191,191, +127,103,146, 36,237, 0,104,139,236,188,172, 10,109, 83, 26,230,153,136,136, 96, 45, 16,114,248,240,225,206, 34,145,200, 5,128, + 81,173, 86,191,122, 31,204,179,145,145,193,150,116, 18, 4,225, 4,192,192,178,236, 75, 84, 50, 4, 79,223,190,125,231,127,253, +245,215,211,204,102,179, 99,137,217, 57,181,116,233, 82, 14,195, 48, 20,203,178, 6,146, 36, 13, 39, 79,158, 52,155, 76,166, 20, +173, 86, 59,246,125,122,145,207, 62,251, 12, 55,110,220,152,139,194, 77, 24,214,106,171,223,176,211, 42, 10,217, 83,101,252,139, + 23, 47,206,251,252,243,207,167,239,222,189,251,217,202,149, 43,187,143, 25, 51, 6,123,246,236, 65,221,186,117,241,199, 31,127, +224,187,239,190, 3,128, 86, 51,103,206, 60,178,113,227, 70,175,184,184,184,165, 86,104, 52, 96, 50,153,176,107,215, 46,244,236, +217, 19,142,142,142,112,117,117, 5, 65, 16,231, 71,140, 24,241, 43, 0, 80, 4,197, 5, 0,157, 86,167,243,245,109, 98,181, 6, +151,203,229, 22,247,117,105,105,105,197, 59, 5, 63,249,252,243,204, 13,139, 23, 99,135, 70,131, 17, 50,153, 40,201,221, 93,113, +228,229,203, 81,143, 10, 59,103,182, 60,173, 78, 69, 36,203, 90,147, 6, 77, 42,102,252,190, 48,214, 5,192,167,109, 6,185,162, +205, 32, 87, 52,233,225, 68,144, 20,129, 7,167,178,240,240, 76,246, 1,163, 18,231, 81,185,112, 57,143, 23, 45, 90,116,228,163, +143, 62,234, 94,191,126,125,140, 28, 57,242,139, 77,155, 54,113,141, 70,227, 68,252,233,230,193,150, 36,201, 31,214,174, 93, 59, + 74, 46,151,227,242,229,203,184,116,233,210,121, 0, 9,101,245, 75, 0,138,125,102,213,240,240,209, 62,141, 43, 16,101, 36, 95, +197,149,203,191,163,110,224, 87, 16,186,116,131,220,119, 1, 12,209, 43,160,207, 58, 5,185, 71, 87, 36,197,189, 4,197,225, 63, +172,200, 8,133,101,217, 71, 73, 73, 73, 94, 94, 94, 94, 68,108,108,172, 9, 0,107, 54,155, 89, 67,235,214, 70,191,197,139,233, +135, 95,124, 65,180,120,250,148, 98, 9,130,137,138,138, 2,128, 39,255,141, 81,220,226,110,225,225,195,135,101,185, 91,168,148, + 52,104,208,160,213,165, 75,151,248, 90,173, 22, 23, 46, 92, 64,211,166,197,123,187,254,171,222,239, 75,114,145,127,153,140, 42, +229,222,186, 55, 52, 90,111, 84,108,134,160,235,249,248,152,185, 36, 54,247,236,214, 77,125,239,222,189,226, 89,159,246,214, 45, +168, 78,156,128,217,108, 6,203,178,184,116,241, 34, 6, 15, 26, 84, 64, 83,196,134,218,181,107,177, 4,251,134,239,150, 14,165, +204, 30,194,194,194,194,138, 59,159,196,196, 68,136,197, 98,240,120, 60, 48, 12, 3,147,201, 4,138,162, 96,107,107, 11,147,201, + 84,154, 10,230,109, 76,163, 57, 91,213,103, 99,151,129,169,174, 5, 6,118,180, 93,109,212,228, 10,139, 27,167,139, 13,129,238, +129, 52, 28, 56, 25,236,217,165, 31,167, 48,186,172, 62,120,119, 71, 87, 69, 91,254,125, 26, 54,108,248,235,224,193,131, 73, 0, +232,208,161, 3,217,176, 97,195, 95, 80,126,168,156,114, 49, 5, 2, 1, 31, 0, 34, 34, 34,178,159, 61,123,246,105, 68, 68, 68, +118,201,251, 86, 98,174, 91,178,100, 9, 68, 34, 17, 76, 38, 19,244,122,125,177,125, 86,201,179,193, 96,128,131,131, 3,142, 30, + 61, 10,179,217,124,180,162,116,122,212,172, 5,194,177, 14,182, 70,156,195,165, 76,110, 85, 72, 86, 49,102, 29, 23,113, 61, 23, + 7,251,211,255, 89, 56,207, 49,231, 69, 20,146,146,146,216,147, 39,142, 94,215, 2,201,121,249,152,149,171, 66, 61,141, 30,130, +166, 94, 72, 56,189,246, 91,118,102, 27, 24, 81,250,174,193, 98, 76, 63, 23,113, 61, 55, 71,251,147, 63,253,103,161, 52,247, 69, + 20, 82,211,210,112,236,104,196, 61, 45, 96, 89,110, 28,202, 48, 76, 0,195, 48, 1, 0,134,150, 67, 94, 42,133,169, 86,171, 27, +168,213,234, 6, 31, 18,147,101,217, 6, 44,203, 90,141, 89,210, 38,106,217,178,101,209,169,169,169,131, 51, 50, 50, 58, 90,142, +156,156,156, 14, 5, 5, 5,109,213,106,117,107,205,178, 90,182,106,181,218,169,160,160, 64,161,213,106, 27, 3,136,170, 68,157, + 47,150,146, 94,167, 83, 83, 83,231,164,166,166, 18, 21,165,147, 26, 27, 77,236,252,105,242,239,107,215,174, 85,188, 39,254, 27, +233,204,204,204,220,191,123,247,238, 32, 79, 79, 79,175,161, 67,135, 98,205,154, 53, 88,185,114,165, 14, 0, 54,110,220,168, 43, +161,201,242,136,139,139,107, 82,198,178, 97,135, 18,218,146,109,159,124,242, 9,123,233,210, 37,244,236,217,179,216,145,232,250, +245,235, 97, 50,153,148,237,219,183,103, 0, 64,163, 85, 43, 89,134,133,222, 80,230,250,251, 59,229,201,227,241, 58,149,244, 23, +104,113,198,204,227,241,192,178, 44,234,181,106,149,153, 27, 24,152,189, 41, 47, 79, 61,167, 65, 3,155, 81,190,190, 67,235, 3, +131, 74,195, 36, 8,226, 13,173,206,219, 71, 37, 52, 89, 37,211,153,161, 73,193,200,223, 23,198,158,176,104,182, 4, 18, 14,180, +249, 38, 28, 90, 28,251, 90,251, 26,235,203, 34, 63,229,229, 61, 59, 59,123,252,226,197,139,117, 50,153, 12,159,125,246, 25, 22, + 44, 88, 48,162, 85,171, 86,121, 78, 78, 78, 55,234,214,173,251,160, 95,191,126,169, 81, 81, 81,227, 67, 67, 67,241,252,249,115, +252,244,211, 79,185, 57, 57, 57, 3,203,195, 36, 8,162, 88,147,215,163, 75,135,236,223,126,249,153,105,255,209, 56,136,132, 54, + 48,210, 30,200, 46, 48, 34, 71,197, 66,207, 15, 1,143,203, 71,199,230,254,184,113,114,139,218,172, 87,109,173,168,206, 23, 20, + 20, 28, 24, 50,100,136,146,203,229, 66,175,215,179, 52, 77,131, 95,104,119,204,208,159,126,106,104,241,248,177,201,204,178, 12, + 65, 16,248,230,155,111, 84, 57, 57, 57,187,171,210,142, 42, 33, 37, 49, 63,148,187,133, 14,111,141, 63, 31,194, 45,196, 95,145, +247,127,179,172, 43,229,248, 83,163,101,217, 82,105, 57, 19, 4, 99, 54,155, 25,212,246,172, 45,141,139, 77, 88,213,183,111,216, +240,206,157,187,136,186,116,233, 34,240,143, 46,156,141, 70, 68, 68,224,224,193,131,234, 83,167, 78, 41,249, 52,181,209,163,134, +135,179,217,204,128, 32,152,114,217,176, 84, 42,157, 56, 99,198, 12, 97, 94, 94, 30, 86,174, 92,201, 4, 5, 5,145, 98,177, 24, + 6,131, 1, 27, 55,110, 52,250,251,251,211, 36, 73, 34, 47, 47, 15, 36, 73, 62,181, 50,131,247,243, 18,146, 59,254, 26,218,251, + 96,147, 47,135,217,251,133,182,144,181,245,112,131,177, 17,139,148,196, 88, 60, 59,123, 42,231,209,201,229, 89,208,166,247, 70, +197,225,129, 74, 27, 8,190, 63,117,234,148,211,248,241,227, 89,173, 86, 75, 36, 36, 36,176, 11, 23, 46,116, 26, 57,114,228,247, + 41, 41, 41,253,171,248, 81,136,220,220, 92, 16, 4,193, 20,117, 36,150, 89,127,101,214,229, 30,110,221,186,245,112,175, 94,189, +122,180,111,223, 30,209,209,209,197, 75,132, 37,137,150,101,247,225,162, 69,139,114, 1, 76,175, 8,148,166,105,172,220,186, 31, +185, 57,153,112,118,118,133, 64, 40, 68, 85,119, 88,242, 72,114,206,143,243,102, 59,101, 62,185, 65, 60,188,126,142,217,119, 63, + 61,195,100,102, 75,247,248,159,159,194, 22,177,255,242,103, 51, 36, 53,231,199,133, 63,216, 90,150, 53,119,223, 77, 85, 18,102, +118,252,123, 53,145,127, 11,230,223, 44,174,174,174, 72, 77, 77, 37, 92, 93, 93,217, 34, 27, 45,182, 28,162,245,102, 5, 47, 92, + 46, 35,202, 91, 54,172, 42,126, 76, 76,204,194, 70,141, 26, 77,126,254,252,249, 62, 63, 63,191, 49, 0,106,232,116,186,220,153, + 51,103,254,103,227,198,141,195,173,209,100, 1,192,158, 61,123,150, 15, 27, 54,236, 68,183,110,221,190,101, 24,166, 97,137,129, + 61,198,201,201,169,120, 9,247,117,122,218,180,209,195, 7, 76, 43, 40,200,177,218,207,157, 68, 34, 25, 53,115,230, 76,129, 74, +165,194,234,213,171, 25,127,127,127,210, 50, 41,218,190,125,187,201,199,199,135, 19, 54,110, 92,230,178,180, 52,204,191,124, 89, + 53, 45, 32, 32,104,211,179,103,141,193, 48,219,202,210,234,148,166,201,178,152, 93, 84, 81, 82,138,200,214,122, 0,159,182,232, +235,130,195, 75, 98,145, 19,167,255, 15, 76,120, 9, 43,194, 2,149, 34, 73, 7, 14, 28,232,152,158,158,126,120,246,236,217,182, +141, 27, 55, 70, 64, 64, 0, 45,145, 72, 66, 44,238, 98,242,242,242,112,230,204, 25,172, 89,179, 70,255,232,209,163, 94,229, 45, + 87,153,205,230, 12, 31, 31, 31, 75, 57,176, 4, 65,100, 41,117,132,237,222,250, 33,146,161,163,247, 17, 87,110, 95, 67,138,129, +129,206,200,160,182,103, 48,218,126,186, 12, 71,142, 63, 48,167,196, 61,126,108,212,228,108,176, 34,189, 47, 95,188,120,113,104, +222,188,121,125,191,253,246, 91, 97,102,102,166, 89,167,211, 49,251,247,239,167,134, 14, 29,106,102, 57, 28,134,203,225, 96,226, +196,137,154,220,220,220,223,129,191, 53,192,244, 95,226,110,225, 47,112, 11,241,193,180, 89, 37,207,255, 43, 82,106, 11,101, 40, +242,234,154,181,191,117,218,179,107,183, 11, 69,145, 46, 47, 95,189,186,221,189,119,159,228,211,167, 79,203,185,182,182, 77, 1, + 48,250, 49, 99,174, 27,116,154,236,200,195,135,107,214,174, 93, 43,176, 40,168, 52,203, 80,228,213,242,126,176,160,160, 64,117, +249,242,101,245,244,233,211,137,196,196,196,157,206,206,206,253,142, 31, 63, 46,233,221,187,183, 38, 58, 58,250,128,139,139, 75, +143,208,208, 80,233,228,201,147,117, 5, 5, 5,149, 9, 60,250,152,125,157, 83,255,214,236,165,159,223, 90,242,219,199,224, 80, + 45,161,163, 1,198,120, 21,134,252,211, 0,118,162, 18,254,142, 74,138, 88, 44, 14, 20,137, 68,184,119,239, 94, 78, 72, 72,136, + 94,171,213,114, 23, 44, 88, 96, 47, 22,139, 3,171, 90,240, 44,203,178, 57, 57,179, 49,226,226, 0, 0, 32, 0, 73, 68, 65, 84, + 57, 96, 24,134, 3,128, 40, 58,131,169,252, 94,252,254,221,187,119, 63,188,119,239,222, 79,186,116,233, 2, 47, 47, 47, 24,141, + 70,248,248,248, 64,175,215,195,219,219, 27, 58,157, 14,115,231,206, 69, 94, 94,222, 36,148, 19,243,140, 32, 8,152, 76,166, 98, + 99, 91, 55,247,154,133,126,122,222,195,141,133,152, 38,189,158, 70,110, 66, 70, 86, 38,179,247,143,244,116,181,193,220,241,197, +107,245,163,183,159, 83,155,161, 10, 29, 58, 33, 25, 0,116, 76,249, 17,231,197, 60,120, 61, 59,186, 30,233, 25,153,216,115, 55, + 53, 87,101, 96, 62,125, 86, 10,102,165,210,249, 47,193, 12,158, 27,141, 62, 19,172,127,246,125,196, 90, 66, 85,150,220, 75, 3, +113, 71,180,137,197,218, 77,165,250,200,122, 79,252,195,207,159, 63, 63, 12, 0,143, 31, 63, 78, 28, 48, 96,192,180,216,216,216, +121, 0,142,197,197,197,173,173, 12,208,166, 77,155,158, 3, 24, 86,222, 51,187,151, 14, 59, 4,224, 80,101,112,243,243,243,181, + 81, 81, 81,218,201,147, 39, 19,137,137,137,199, 93, 92, 92, 62, 57,113,226,132,168,119,239,222,186,135, 15, 31,158,117,117,117, +109,211,161, 67, 7,201,177,155, 55,147,213, 47, 95, 70, 70,198,198,186, 27, 25, 38,178,188,246,249,129, 73,214, 27,100,235,208, +252,216, 31, 15,255, 24,219,129,209,225,128, 62, 7,215, 1, 36,189, 7,230,165,171, 87,175,250, 13, 26, 52,104,111,215,174, 93, + 91,248,249,249,161, 70,141, 26,120,246,236, 25, 94,191,126,141,251,247,239, 35, 34, 34, 34, 66,171,213, 86, 24, 80, 59, 59, 59, +251,221,240, 68, 2,185,235,150,213,115, 34,110, 95,105,234,211,186,203, 16, 97,128, 43, 3,189,129, 69, 98,252, 75,204,157,181, + 65,157, 26,255,252,177,193,100,232, 5, 43, 55,234,104, 52,154,117, 43, 86,172,160, 35, 35, 35,187,172, 90,181, 74, 90,179,102, + 77,138,203,229,146, 0,216, 59,119,238,176, 19, 38, 76, 80,101,102,102, 30, 85, 42,149,235,254,230, 49,250,210,171, 87,175,130, + 41,138,250,160,238, 22,222,195, 45, 68,181,124, 72,241,244,116,247,171, 83,211,117,140, 87, 13,247,113,158, 53, 61,194, 75, 51, +114,247,146,201,164,158,181,220, 70,121,213,112, 31, 87,167,166,235, 24, 79, 79,119, 63, 43, 84,139, 94, 54, 54, 54,199, 21, 10, + 69, 16, 0,216,218,218,246,176,179,179,123,100,107,107,219,163,104, 22,216, 67, 34,145, 60,241,247,247, 31,249, 55,170, 43,203, +197,244,241,241, 25, 80, 80, 80,240,133,143,143,207, 0,203,245,203,151, 47,139,175,171,130,233,225,225,209,254,206,157, 59,253, +151, 46, 93,250, 89,221,186,117,123, 44, 92,184,240,179,223,127,255,189,191,187,187,123,227, 42, 96,242, 1,236,160,105, 58,157, +199,227,101,208, 52,157,110, 57, 56, 28, 78, 58, 69, 81,233, 0,214,150,161, 45,235, 80, 98,150,115,197,217,217, 57,206,217,217, + 57,206,197,197, 37,206,197,197, 37, 78,161, 80,188,115, 56, 56, 56, 92,177,182, 60,125, 93, 36,173, 66,106, 72,175, 54, 80, 72, +174,212,119, 22,251,126,136,111,228,235, 34,105,213,180,134,237,213, 6, 10,233,229,255,111,152, 65, 46, 96,217, 53,190, 44,187, +198,151, 13,114, 1, 91,209,245,135, 84,251, 43, 20, 10, 86,161, 80,204,249,171,150, 18,202,192,255,219,219,251, 7,196,244,146, + 74,165,187,107,212,168, 97,233,235,186,217,216,216,156,151, 72, 36,221,138,250,186,110, 98,177,248,162,191,191,255,144,138, 48, +229,114,249, 29, 39, 39,167,180,162, 35,213,217,217, 57,213,217,217, 57,213,201,201, 41,197,201,201, 41,197,209,209, 49,217,114, +216,217,217,221,168, 98,222,157, 0, 52, 3,208, 24,128,205, 7, 44, 79, 79, 0,163,139,250,160,197, 0, 70, 2,104,248, 1,190, + 17, 65, 11,229, 99,249,118, 30, 87,105,137, 99, 62, 45,113,204,231,219,186, 95, 45, 39, 4,143, 53,152,245,228,114,249, 2, 27, + 27,155,223,165, 82,233,101,169, 84,122,216,193,193, 97, 33,128,122,255,165,186, 36, 1,176, 17,133,254,153,142,161,112, 41,252, + 48, 10, 55, 21,212,252, 7,214,249,255,207, 50,234,191,245,195, 29,170, 49,171, 49,171, 49,171, 49,171, 49,171, 49,255,133,152, +100,117,121, 86, 19,173, 74, 18,173,183, 15, 0,229,120,134,175,150,106,169,150,106,169,150,106,249,127, 44, 76,117, 17, 84, 75, + 37,165,212,165,101,162, 28, 86, 90, 25, 95, 83, 85, 97,182,103,170, 49,171, 49,171, 49,171, 49,171, 49,171, 49,171, 49,255,223, + 97, 86,203, 7,148,106,181,106, 53,102, 53,102, 53,102, 53,102, 53,102, 53,102, 53,230,255,186, 84, 47, 29, 86, 75,181, 84, 75, +181, 84, 75,181, 84, 75,181,252, 69,178,174, 4,225,122, 99, 9,177,154,104, 85, 94, 72, 0, 95, 0,232, 3,160, 14, 10,163,217, +239, 7,240, 43,170,182,166,111, 3, 96, 26,128,150, 40,220,157, 19, 3,224, 50, 10,119,231, 20, 84, 23,119,233,226,224,224, 48, +131,166,105, 59,160, 48,180,137,229, 92,242,255,102,179, 57, 87,169, 84, 46,252,139,146, 64,193, 74, 15,202,150,180,150, 76, 91, +201,179,209,104,252, 43,211, 89, 45,255, 76,241,145,203,229, 59,178,179,179, 7,162, 68,144,229,106,169,150,255, 5,113,116,116, + 28, 99, 48, 24,102,114,185,220, 5,175, 95,191,254,237,255, 81,214,223, 33, 89,111, 16,173,200,200,200,139, 0,208,181,107,215, +143, 0,192,206,206,238, 26, 73,146,158,149,249, 5,134, 97, 98,114,115,115,203,116,160,102,103,103,119,141,162,168,119, 48,141, + 70,163,148,195,225,228,151,246,142,201,100, 74, 82, 42,149,141,255, 33,133, 72, 0,136,148,201,100,218,121,243,230,253,218,182, +109, 91,143,148,148, 20,211,212,169, 83,219,252,241,199, 31, 93, 0,116,170, 36,217,106, 78, 16,196,150,160,160,160, 67,225,225, +225,123, 67, 66, 66,120, 89, 89, 89,210,253,251,247,187,109,221,186, 53,138, 97,152,129, 40, 39,208,234,255,103,161,105,218, 46, + 41, 41, 73, 10, 20,134, 38, 41, 34, 86, 48, 26,141, 48, 26,141, 80,169, 84, 8, 12, 12,252,224,191,235,226,226, 18, 76, 16,196, + 42,137, 68,210,184,160,160,224, 54,128,113,169,169,169,127, 84, 38,173, 38,147, 9, 44,203, 22,167,211,207,207,175,250,131, 86, + 78, 70,240,120,188, 79,189,189,189,155,234,116,186,156,152,152,152, 91,102,179,121, 54, 62, 92,140, 54, 91, 0,179,249,124,126, + 72,157, 58,117, 60,158, 63,127,158,104, 48, 24,110,162, 48, 24,114,222,135, 32, 89, 31,125,244,209,149,213,171, 87,219,143, 29, + 59,246,202,229,203,151, 91, 85,147,173,106,249,111,137,135,135,135,157, 74,165,218, 0, 32,152,166,105, 23,129, 64, 0,161, 80, +152,198,231,243,239, 9,133,194,225, 87,175, 94,205,173, 44,166,217,108,158, 29, 23, 23,231,210,172, 89,179, 37, 78, 78, 78,115, + 51, 51, 51,181, 6,131,225,108, 78, 78,206, 36, 0,202,242,222,125,155,139,252,203, 72, 86,201, 51, 44,164,139, 83,148, 49, 22, + 64,219, 55, 24, 24,135,227, 30, 31, 31,239, 36, 16, 8,192, 48, 76,241, 96,246,246, 97,185,175,215,235, 17, 16, 16, 96,168, 96, +192,241, 72, 76, 76,116,226,241,120,197,247,244,122, 61,220,220,220,152,164,164, 36,167,162,176, 7,197,162,211,233,224,238,238, +254, 79,138,121,244,133, 92, 46,207, 75, 72, 72, 12,212,234, 12, 63,140, 28, 63,125,198,192, 62, 31,203,174, 93,187,198,116,234, +212, 73,119,241,226,197, 47, 80, 24, 56,213,170,206,156, 32,136,173, 83,167, 78,157, 43, 16,217,216,159,187,246, 88,183,117,255, +209,228, 32,159,218,196,164, 73,147,168, 9, 19, 38, 92, 10, 14, 14,222,193, 48, 76, 35, 84, 66,179, 37,147,201, 78,240,249,252, + 90, 69,229,151,144,147,147,243,201, 63,176, 66,114,240,174,243,216,210,238, 85, 40, 89, 89, 89,208,104, 52,239, 28,126,126,126, +214,198,202,172, 84,186,105,154, 62,188,104,209, 34,183,180,212, 84,252,188,108, 89, 51, 20,106, 50,155, 89,243,114, 70, 70,198, + 59,233,244,245,245, 69,181, 84, 74,166,205,157, 59,119,209,231,159,127, 14,179,217, 12,141, 70,227,250,226,197, 11,255,153, 51, +103,246,122,249,242,101, 83, 0,175,222,119, 50,238,237,237, 29,253,213, 87, 95,201,155, 54,109,138,162, 40, 21,174,151, 47, 95, +110,182,113,227,198,193, 9, 9, 9,190, 0, 94,191,207, 15,200,229,242, 29,235,215,175,183, 23,137, 68, 56,114,228,136,125,251, +246,237, 47,223,189,123,183,245,123,144, 45,210,222,222,126, 2,128,118, 12,195,240, 0,220,204,201,201,153,143,202,123,117, 87, + 72, 36,146, 3, 36, 73,214, 6,254,244, 70, 79,146,164, 3, 65, 16,153,150,123, 4, 65, 56, 49, 12,115, 61, 59, 59,187, 69,117, +117,252,119,139,189,189,253,136,244,244,244,213,124, 62,159, 43,147,201, 32, 18,137,192,225,112,192,225,112,106,240,249,252, 26, +124, 62,191,115,104,104,232,184,243,231,207,151,235, 97,191,121,144,243, 80,144,196, 15, 20, 65, 82, 0, 64,210, 98, 27, 91, 91, + 91,252,240,195, 15,226, 30, 61,122,136, 1,224,202,149, 43,225, 67,134, 12,105,159,148,148, 20, 80, 22,217, 42,141,139,252,139, +100, 93,121, 3, 30,138,216,227,197, 55, 90, 46, 73,130,199,227,225,198,141, 27,176,198, 89,185, 37, 68, 66,185,189, 65,145,135, +241, 63,254,248, 83, 1, 96, 25,104,120, 60, 30,174, 94,125,211,169,124,243,230,205,139, 27,251,223, 37,125,252, 10,157, 60,238, +251,178, 48, 93, 97,171, 10,189,107,239,251,210, 23,109,126,138, 71,159, 9,115,250,169,181,134, 38, 0, 84,185, 57, 57, 57,183, + 15, 30, 76, 9,242,241,225,238,216,177,163,169,155,155, 91,159, 74, 16,173,105,141, 26, 53, 58, 64, 9,109, 29,194,135, 12, 13, + 31,206, 33, 13,131, 71, 79, 94,144,152,154,169, 26, 53,106,212,193, 35, 71,142,132,255,248,227,143, 79,166, 76,153, 50, 13,192, +119,214,166, 95, 32, 16,212,122,250,244,169,183,217,108,134,159,159,223, 63, 49,140, 65, 16, 10,157,239,125, 14, 96, 87,209,189, + 1, 40,244,220, 31, 12,224, 94,101,192, 44, 26,172,210,142, 15, 45,110,110,110,190,131, 6, 13,114,200,206,204,196,207,203,150, + 89,110, 55, 70, 5,203,136,150,246,163,215,235,241,217,103,159, 13, 50,155,205, 28, 11, 9,212,233,116,250,188,188, 60, 45,254, + 52, 44,125, 13,224, 99, 43,146,227, 41, 22,139,255, 3, 32, 88,163,209,184, 1,128, 88, 44, 78,102, 24,230,144, 74,165,250, 14, +127, 6,240,173,244, 4, 23,128, 63,202, 14, 5,197, 46, 90,180,232,249,244,233,211, 95,253, 23, 48,107, 57, 59, 59, 47, 12, 11, + 11,195,209,163, 71,113,236,216, 49,163, 80, 40,228, 12, 25, 50,132, 24, 55,110,156,236,171,175,190,234, 12, 96,197,123,126,230, +206,115,231,206,149,215,175, 95, 31,251,247,239,199,253,251,247, 53,222,222,222,194,182,109,219,130,195,225,200,103,204,152,209, + 9,192,150,247,249,129,236,236,236,249,147, 39, 79,222,186,107,215, 46,105, 76, 76, 12, 86,173, 90,229,208,175, 95,191,139, 9, + 9, 9, 31, 85,130,108,241, 1, 76, 0, 16, 74, 81, 84,235, 33, 67,134,152,198,143, 31, 79,147, 36,105, 92,182,108,153,227,198, +141, 27,251,209, 52, 29,156,149,149,101,205, 36,141, 4,240,195,240,225,195,135,157, 63,127, 94,118,235,214, 45,158,189,189, 61, +204,102,115,177,166,152, 97, 24, 39, 75,157, 53,153, 76,240,245,245,117, 47,241,190,240,223, 74, 52, 72,146, 52, 48, 12, 67, 3, + 16, 0,208, 85,116,253,191, 68,178,228,114,249,216,236,236,236, 95, 93, 92, 92,224,236,236,252,206, 88,171,211,233, 32, 16, 8, +184, 46, 46, 46,235,123,244,232, 65, 31, 62,124,184,204, 37, 64,130, 34,102, 31,217, 61,207, 77, 46,147, 2, 0,150,175, 57,169, + 6,128,223,127,255, 29, 41, 41, 41,144,201,100, 8, 8, 8,160,230,205,155,167,152, 52,105,210,207, 57, 57, 57,195,203,194,122, +155,139,252,203, 52, 90,235, 74,187, 46,215, 70,139,101,217,226, 56,121, 86, 86,218,183,111,157,121, 11,143,208,235,245,120, 91, +163,101,105,188, 52, 77,191,173,126, 4, 65, 16,108,121,152,165,200, 16,177, 88, 28,168, 82,169,126,169,196,236,182, 24,115,223, +151,190,216,202,159, 58,192, 18,137,180,243,228,194,243, 86, 0,215, 98,135,175, 90,253,209, 71,110, 19,102,173,156,163,201, 74, +201,156, 49,168, 91, 45,111, 23,123,161, 56, 55, 35, 79, 94,175, 94,199,183, 52, 50, 21,165,179, 77,120,120,248,182, 83, 55,226, + 8,129,128,203,229, 80, 20,221,170,129,143,189,135, 45,101, 43, 5,108, 19, 95, 61,191, 54,116,232,208, 6, 83,166, 76,105, 93, + 9, 76, 20, 13,184,216,190,125, 59, 8,130, 32, 43,147,247, 15, 40,103,202, 35, 89, 44,203,130, 32,136,157, 37, 6,149,157, 69, +247,238,150, 32, 91,156,242,202,211,162, 77,181,144,170, 33, 67,134, 12, 50,153, 76,156, 18,157,196,219, 4,166, 52, 18, 99, 85, +222, 21, 10,197, 41, 0, 31, 19, 4, 1,189, 86,171,255,207, 79, 63,149,252,243,157,183, 72,214,153,178,218,146,209,104,132,217, +108,230,220,189,123,151, 46, 81,215,105, 0, 98, 0, 14, 44,203,130, 36,201, 7, 86,148,167,175, 72, 36,186, 22, 17, 17, 97,211, +184,113, 99,130,199,227,193,100, 50,225,225,195,135, 30, 63,254,248,227,232, 51,103,206,116, 82,169, 84,126,120, 55,120,186, 53, +223,200,255,242,229,203, 42, 47, 47,175, 82,137,163, 82,169,228,248,248,248,124, 84, 6, 41,250,171, 49,147,210,211,211,123,126, +252,241,199, 99,210,210,210,162, 77, 38,211,183, 0, 2, 28, 28, 28,238,246,238,221, 27, 66,161, 48, 84,163,209,172,120,159, 58, +239,228,228,212,163, 69,139, 22, 88,181,106, 21,126,252,241,199, 14, 0,206, 2,104,175, 84, 42,207,116,239,222, 29,118,118,118, + 61,115,115,115,183,188, 71, 59,242,105,211,166,205,250, 31,126,248, 65,122,244,232, 81,120,123,123, 35, 63, 63, 31,223,124,243, +141,211,247,223,127,127, 33, 55, 55,183,109,137,118, 81, 22,166, 31,159,207,223,178,107,215, 46,137,151,151,151, 23,151,203, 37, +189,188,188,144,157,157, 13,173, 86,203, 95,176, 96, 65, 3,161, 80,248,199,138, 21, 43,182, 0,232, 93, 65, 58, 73, 0,243,215, +174, 93, 59,102,212,168, 81,118,131, 6, 13, 50,235,245,122,236,221,187, 23, 20, 69,129,166,105,136, 68,162,226,224,213, 92, 46, + 23,245,234,189,227, 36,253, 72, 57,249,205, 67,161, 29,170, 29, 42,183,236,122,166, 28,188,226,165, 15,154,166, 33, 16, 8, 32, + 16, 8,192,231,243,241,244,233,211, 89, 2,129, 96, 25, 65, 16, 38,107, 48,137, 63,217, 69, 32,128, 91, 21, 93,227, 93,211,144, +191,179,255,180,136, 59, 65, 16,203, 1,132, 22, 14,187,228, 69, 7, 7,135,137,233,233,233,241,214, 98, 42, 20, 10,251,172,172, +172, 21, 10,133, 2,206,206,206,197,227,183,155,155, 27,140, 70, 35,210,211,211,193,178, 44,114,115,115, 33, 18,137,224,234,234, +186, 98,212,168, 81,251,215,173, 91,151, 85, 42, 38,131, 31,187,247,155, 57,155,162, 40, 18, 0, 40,142, 68,242,213,116,160, 86, +173, 90,104,213,170, 21,180, 90, 45,242,242,242,224,239,239,207, 33, 8, 34,156, 32, 8, 27,150,101,127, 3,112,238,127, 80, 81, + 88,166, 49,252,220,183,215, 69, 45,209,226,185, 92,174, 85, 68,171,232,249,138, 52, 40,164,209,104, 4,151,203,125, 67, 35, 65, + 16, 4,204,102,243, 27,247, 45, 68,171, 42, 68,125,220,184,113,204,250,245,235,199,228,228,228,172, 65, 21,151, 18,194,195,195, +223,177,247,152, 52,105, 82, 82, 70, 70, 6,251, 89,199, 64,113,244,241,148,212, 58, 50,137,208, 81, 42,173, 45,144,201,237,178, +178,178,174, 23,117, 38,214, 74,221, 70,141, 26, 9,183, 30,188,156, 52,242,235, 69,243, 26,123,217,219, 52,116,119,144,185,216, + 10,121, 18,146, 80, 9, 76,198, 36,185, 92,238, 93,217,116, 91,250, 5,145, 72, 4,146, 36,255, 73, 26, 45,142,133,100,101,103, +103,227,232,209,163,232,210,165,203, 93, 11, 9, 81, 42,149, 72, 77, 77,133, 66,161,184, 91,164,249,168,112, 25,145, 97, 24, 24, + 12, 6, 24, 12,134, 98, 2, 83,162, 14, 21, 19, 24,203,179, 20, 69, 61,168, 98,218,231,201,100,178, 54,161,161,161,188,221,123, +247,242, 88,150, 85,161, 48,134, 90, 1,203,150, 17, 32,251, 45, 49,153, 76,197, 90, 54,154,166,145,144,144, 80, 60,112, 89, 98, + 75, 10, 4, 2,235, 84, 25,124,254,228, 61,123,246,216, 52,109,218,148,200,202,202, 2,195, 48,197,157,228,175,191,254, 42,232, +211,167,143, 91, 84, 84,212, 12,157, 78, 55,183, 10,121, 37,202, 34, 68, 0, 96, 99, 99, 99,130,117, 30,179, 43,196, 52,153, 76, + 68,203,150, 45,167,100,102,102, 54,208,104, 52, 11,172, 41, 70, 0, 71,146,146,146, 74, 14,236,127, 68, 71, 71,107,250,246,237, + 43,172, 93,187,118,200,227,199,143,223,171,146,250,248,248, 52,167,105, 26, 55,111,222,212, 1,176,204,172, 47,222,191,127, 95, +215,187,119,111,190,135,135, 71,243,220, 92,171, 77, 86,124,124,125,125, 79, 59, 57, 57, 9, 45,125,168,163,163, 35,189,110,221, + 58,105,114,114, 50, 12, 6, 3,166, 77,155,134,174, 93,187,194,193,193, 1,147, 38, 77,114, 94,178,100,201,142,130,130,130, 70, +229, 41,173,121, 60,222,182, 23, 47, 94,120, 43, 20, 10,225,141, 27, 55,208,176, 97, 67,100,102,102, 34, 45, 45, 13, 5, 5, 5, + 72, 75, 75,195,240,225,195,157,126,254,249,103, 87, 43, 52, 89,197, 36,107,221,186,117,185, 7, 14, 28,160, 54,108,216, 32,165, +105,186,152,104,113, 56,156, 98,162,101,137,173, 88,133,149,134,220, 34,210,102,151,151,151,247, 62,118,110,124, 0,188,146, 36, +139,207,231,131,207,231, 67, 32, 16,188, 87, 92,214,127,137,184, 17, 4,241,152,203,229,242, 69, 34, 17,151, 36, 73,240,249,252, +142,114,185,252, 81, 64, 64, 64,192,233,211,167,227,172, 1,209,106,181,219,248,124, 62,237,228,228, 4, 0,240,246,246, 70,195, +134, 13,161, 82,169,152,188,188, 60,216,217,217,145,241,241,241,208,104, 52, 72, 77, 77, 69,205,154, 53,105,146, 36,183,161,208, + 14,249, 29,185,118, 55,109, 13,128, 53,150,107, 7, 7,135,244,146,154, 78,129, 64, 0, 55, 55, 55, 36, 39, 39, 67, 42,149, 82, +223,127,255,125,239,189,123,247,246,186,118,237, 90, 56,128,237, 37,160,230,254,139,109,180, 44, 36,171,228,249, 79,162,213,181, +107,215, 57,145,145,145, 31,149, 54, 11,167,105,250,131,217,186, 88, 8,149,141,141,205,219, 90, 43, 48, 12, 83,150, 70,171,210, +191, 35, 16, 8,132, 99,199,142,205,255,237,183,223, 42, 77,182,194, 86, 69, 23,107,177,222,153, 70,250,249, 93,155, 49, 99, 70, +143,243,231,207, 39, 55,246,170,205, 17,167,196, 23, 8,108,236,236,224, 94,163,203,144,158,189,239,163,112,247,161,181,242, 34, + 63, 63, 95, 88,199, 93,164, 39, 73, 45, 81,131,207,145, 42,196, 92,190,139, 76,230,198,213,235, 50,108,100, 50,158, 78,167,203, + 69, 57, 65,160, 1,192,217,217,249,164, 80, 40,172,105,185,150,201,100,182, 44,203, 66, 36, 18, 65,161, 80, 72, 40,138,122, 86, +162,113,197,167,167,167,119,172, 40, 97,118,118,118, 39,249,124,126, 77,146, 36, 65, 16, 4, 40,138, 2, 73,146, 32, 73,178,248, +255, 20, 69,129, 32, 8,168,213,234,248,184,184,184,142, 86,228,215, 4, 32,152, 32,136,187, 71,143, 30, 69, 72, 72, 8,142, 31, + 63,142, 79, 63,253, 20,121,121,121,120,248,240, 33,218,180,105, 3, 20, 46, 41, 90, 37, 37,141,223, 45,147,130,167, 79,159, 22, + 19,151,146,135, 84, 42,125, 31, 21,251,149,176,176, 48,172, 95,191,158, 45,154, 76,136, 9,130,104,104,107,107,251,244,201,147, + 39, 86,217,193,176, 44, 11,131,225,207, 71, 45,131, 87,145, 61, 68,165,130, 3, 83, 20,213,177, 81,163, 70, 68, 94, 94,158,133, + 64,130,195,225,128,162, 40, 80, 20,133,213,171, 87, 11,155, 54,109, 58,147,207,231, 79,225,114,185, 74,163,209,184, 91,171,213, + 46, 0,144,251, 79,234,145, 90,183,110,253,117, 98, 98, 98,215,154, 53,107, 70,188, 7, 12,107, 52, 26,245, 0,132, 20, 69,209, + 31,160,143,162,138,234,150,182, 4,217, 55, 21, 93,243, 81,184, 76,108,149, 56, 56, 56,236, 56,118,236,152,123,205,154, 53, 97, + 52, 26, 97, 50,153, 80, 80, 80,128,139, 23, 47, 66,167,211,193,100, 50,193,219,219, 27,179,103,207,214, 78,156, 56, 81,176,118, +237,218,140,130,130,130,129, 21,192, 78,220,191,127,191, 88,161, 80, 8, 53, 26, 13, 94,189,122,133, 70,141, 26, 33, 63, 63, 31, + 42,149, 10,106,181, 26, 6,131, 1, 74,165,210,206,108, 54,235, 43,192,154, 85,146,100,141, 30, 61,250, 1,143,199,107, 52,126, +252,120, 36, 37, 37, 21,183,249,145, 35, 71,194,217,217,185,184, 45, 21,245,201,149,234,152, 57, 28, 14,248,124, 62,184, 92,110, +110,141, 26, 53, 64, 16,132, 32, 62, 62,190, 42, 75,113, 54, 0,148, 52, 77,243, 74, 18, 44, 62,159,143,155, 55,111,206,224,241, +120,101,105,179,202,106,151,108,101,174,255,219, 66, 16,196,114, 46,151,203,151,203,229,220, 18, 19, 78,174, 68, 34,129,147,147, +211, 42, 0,157,173,204,119,144, 92, 46, 47,238,223, 3, 3, 3,145,152,152,120, 40, 47, 47,111,112, 70, 70, 6, 72,146,220, 70, +146,100, 47,203, 36, 53, 39, 39, 7, 30, 30, 30, 65,101,225,181, 8,118, 25, 3,130,125, 67,163,245,214, 4, 13, 54, 54, 54,136, +141,141,133, 74,165, 98,159, 63,127, 78,140, 29, 59,150,208,235,245,155,163,162,162,174,163,112,183,125,153, 92,228, 95, 34,149, +183,209,178,104,180,172, 29, 0, 8,130,168,112, 54, 97, 52, 26, 37,254,254,254,165, 25,124, 17,165, 17,173,162,229,164, 42, 85, +116,154,166,165, 85, 37, 91,111, 75,196,129, 93,206, 63,206,158, 54, 91,238, 90,187,206,148, 41,179, 56,221,186,117,187,177,117, +235, 86,179,188,126,231,246,231, 78,110,119, 94,241,205,212,227,199,142, 29, 3, 10, 13,163,173,149, 43,145,145,145, 46,147, 38, +140,195,236,201, 19, 79,216,120, 59,240, 36,132, 92, 44,208,169, 94, 75,192,106,248,117,125,187, 30,140,136, 72, 5, 16, 85, 30, +136, 72, 36,170,249,248,241, 99,239,146, 27, 9,244,122, 61, 68, 34, 17,206,157, 59,231, 40, 20, 10, 29, 1, 64,163,209, 32, 32, + 32,192, 90,141, 73,205,103,207,158,121, 75,165, 82,168,213,106,232,116, 58, 24,141, 70, 48, 12, 3,130, 32, 64,211, 52,120, 60, + 30,196, 98,113,101,119,246,221, 3,240,121,151, 46, 93,118, 30, 63,126, 28,254,254,254,200,201,201, 65,116,116,180,133,100, 85, +202, 70,203,162, 37, 42,105,143,197,225,112,176,195,203, 11, 35, 83, 82,138, 9,204,114, 91, 91,204,102,170, 22, 77, 35, 32, 32, +128,189,114,229, 10, 78,156, 56,129,238,221,187, 19,135, 15, 31, 54,152,205,102,110, 74, 74,202,131,148,148, 20,171, 48,152,255, +107,239, 58,195,155,184,210,238,153, 25,117, 89,150,123,197, 96, 3, 1, 76, 7,211,123, 13, 16, 32, 75, 18,218, 38,212,133,152, + 16,216, 44, 36, 11, 36, 31,201,134, 56,148, 64, 96, 33,129, 80,188, 16,218, 66, 18, 90,232, 16, 74,108, 76,232, 54, 4, 99, 27, +211,221,155, 44,171, 90, 86,153,209,124, 63, 44, 41,178,113,145,108,153,146,213,121,158,121,172,209,140,142,239,220,185,229,220, +247,190,247,189,102,179, 45,173,214,118,219, 94, 96, 57, 43,180,104,154,246,228,243,249, 40, 43, 43,131,213,242, 96,127, 52,107, +214, 12,114,185,156,163, 82,169, 56,185,185,185,226,165, 75,151,254, 61, 46, 46, 46, 68,173, 86,191,253, 60, 91,161, 77,155, 54, +133,191,251,238,187,153, 28, 14,135, 29, 49, 98,196,228,140,140,140, 55, 66, 66, 66,206,253,250,235,175,107, 0,180,114,150,207, +223,223,255, 6,135,195, 9, 83,169, 84,188,125,251,246,153,212,106, 53, 47, 32, 32,160,192,218,118, 88,243,218,100, 50, 57,180, +114,217,223,223,255,134, 76, 38,227,173, 95,191,222, 84, 92, 92,204, 11, 10, 10, 42,176,242, 40, 20, 10,222,190,125,251, 76, 42, +149,138,231,229,229,117, 67,169, 84,214,202, 39,147,201, 38, 77,157, 58, 53,225,220,185,115,254, 20, 69, 33, 35, 35, 3,197,197, +197,240,246,246,198,174, 93,187, 16, 30, 30,142,253,251,247,203,229,114,249,204,175,191,254,250, 83,139,200,170,205, 71,171,127, +143, 30, 61,194, 21, 10, 5,188,189,189,161,213,106,113,227,198, 13,180,109,219, 22,185,185,185, 32, 73, 18,222,222,222,216,184, +113, 99, 41, 65, 16,242,154,136, 68, 34,209, 27,209,209,209,222, 0, 16, 29, 29,237, 29, 29, 29, 93,101, 7,215,171, 87, 47,108, +216,176,161,178,208,114,102, 96, 96,179, 58,217,137,163,178,158, 61,123, 34, 46, 46,110,161,147,226,200, 96, 21,109,149,173, 89, + 2,129,192,233,197, 52,102,179,153,135,114,151, 6,194,145,243, 23, 0, 3, 68, 34, 17,175,242,151,165,165,165,188,144,144,144, +126, 78, 8, 95, 63,145,168,220,224, 20, 30, 30, 14,165, 82,201, 24, 12,134,137,187,119,239, 54, 1, 64, 84, 84,212, 68,134, 97, +202,104,154,166,248,124, 62,180, 90, 45, 2, 3, 3,253,106,176,141, 46, 58,242,195,210,224,202, 62, 90, 33, 33, 33,136,138,138, +130, 94,175, 71, 94, 94, 30,226,227,227, 77, 12,195,236,217,180,105,147, 57, 32, 32,224,111, 99,199,142,165, 18, 19, 19,231, 2, +152, 95,157, 22,121,201,172, 89,177,213, 10, 45,139,130,140, 3, 48,176,242, 67, 86, 22, 63, 53, 9,173,218,166, 14,249,124,190, + 34, 51, 51,211,195,190, 83,161,105, 26,161,161,161,102,150,101,137,170,132, 86,125, 76,193, 92, 46,215,243,147, 79, 62, 81,108, +218,180,105,210,227,199,143,151, 56,242,155,125,115, 91, 99,103, 37,145,181,121,101,204,134,245, 43,151,250, 62, 56,181, 29, 91, +191, 93,205, 48, 12, 18, 59,116,232,208, 79,163,209,112,188, 60, 76,144, 41,112,210, 34,178, 28, 21,133, 36,128,239,175, 93,187, +150, 56,114,228,200,223,190,255,241,160,111,238,195,135,151, 5, 42, 89,158,180, 69, 75, 14,175, 81,248,155,234,178, 50,222,196, +137, 19, 3, 0,140,173,173, 17, 83, 40, 20,200,207,207,175, 44,192,112,247,238,221,167,238,117, 40,113, 36, 9,134, 97,112,224, +192, 1,136,197, 98,120,120,120, 84, 56,172, 34,171,142, 11, 21,210, 1, 96,196,136, 17,144,203,229,144, 72, 36, 14,167,171,178, +120, 97, 89, 22, 6,131, 1, 6,131, 1, 70,163,145, 1,192,229,112, 56,152,145,157,109,179,242, 56, 35, 96, 42,163, 67,135, 14, +236,165, 75,151,240,219,111,191, 65,171,213, 98,253,250,245, 8, 9, 9, 25, 12,224, 51,103,185,236,156,244, 25,149, 74,197, 85, +169, 84, 54,235, 32,151,203,181, 89, 15, 28,180,228,241, 56, 28,142,109, 52,106, 61,236,173, 90, 20, 69, 33, 40, 40, 8,193,193, +193,216,188,121, 51,175,105,211,166,163,159,103, 11,180,106,213,170, 22,235,214,173,219,182,115,231,206,147,147, 38, 77,250, 41, + 57, 57,121,186,151,151,215,237,243,231,207, 47, 21, 8, 4,230, 58,214,239,176,220,220,220, 64,251,175,204,102,179,152,166,105, +155,176, 45, 45, 45,117,120,128,193,229,114,195, 82, 82, 82,196, 0,176,116,233, 82, 46, 0,177,213, 25,220,202, 89, 90, 90,202, +109,219,182,109,152,163,101, 61, 33, 33,161,223,208,161, 67, 47,157, 57,115,198, 39, 60, 60, 28, 57, 57, 57,200,201,201, 65,139, + 22, 45,176,124,249,114,173, 74,165,234, 3, 32, 93,163,209, 28,118,144, 51,212,199,199,135,155,153,153, 9,154,166,209,185,115, +103,108,220,184, 17, 19, 39, 78, 68,251,246,237,161, 82,169,144,146,146,130, 29, 59,118,248,240,120,188, 26,219, 14,157, 78,119, + 56, 54, 54,182,113,101,139,214,228,201,147, 61, 10, 10, 10,108,101, 50, 38, 38,166,194, 20,162, 51,109,178,101,106,171,218,163, + 46,160,105, 90, 42, 20, 10, 85, 2,129,128,111,245,207,138,143,143,119,218,154, 85,105, 0,232,204,249,115,131, 85,180, 86,209, +183, 34, 56, 56,216, 97, 30,129, 64, 64, 88,219, 70,154,166,161, 84, 42,153,144,144, 16,219,244,126, 82, 82, 18, 19, 17, 17,193, + 80, 20, 69,241,249,124, 16, 4, 1,177, 88, 92,109,131,207, 50,108,204,235, 19, 63,171,176,234,112,222, 39,128,209,104, 68, 82, + 82, 18,140, 70, 35,226,227,227, 77, 95,127,253,117,174, 66,161,152, 7,128,115,250,244,233,169, 11, 23, 46,164, 2, 3, 3,135, + 22, 22, 22,162, 54, 45,242, 18,137,173,167,172, 92,214, 94, 40,110,244,232,209,132,101,105, 37, 97, 21, 78,206, 8, 45, 75,229, +171,181,231, 37, 8, 2,121,121,121,182,243,192,192, 64,167,255,151,163,240,243,243,211,246,234,213,203, 83, 38,147, 29, 94,181, +106, 85,157, 44, 89,155, 87,198,108, 88,241,229,231,190,242,212, 43,200,206,205,131,188,208,148,120,241,246,227, 67, 0, 14, 1, + 0,182,180,137, 35,222, 75,251,206, 81,206,214,254,162, 78, 92, 30,231,208,171, 35, 71, 55,158, 16, 61,159,124,255,253,247,251, + 78,157, 58, 85, 57,105,210,164, 15, 36, 18, 73, 43,163,209, 88,114,240,248,241, 39, 19, 38, 76,104,202, 48,204, 84,212, 18,115, + 68,167,211,101, 12, 28, 56,208, 62, 63,165,103,207,158, 13,122,242,228, 9,230,204,153, 83,148,147,147,163,176,191,215,145, 52, + 26,141,198,140, 78,157, 58, 85, 59, 93,104,157, 82, 4, 0,181, 90,157,225, 68,150,190, 13,139,227,123,113,113, 49,238,222,189, + 11, 14,135,131,158, 61,123,226,226,197,139,232,219,183,111,146, 51, 86,173,178,178, 50,132,135,135,163,172,172, 12, 90,173,182, + 20,128, 96, 87,211,166, 0,128,185,197,197,184,241,245,215,184,178, 98, 5,236,203,179,163,232,216,177, 35,123,229,202, 21,220, +190,125, 27,122,189, 30, 51,103,206, 4, 0,194, 82,118,157, 9,153,209,156,162,168, 17, 35, 71,142, 12, 5, 0,173, 86, 75, 92, +187,118, 13, 66,161,208, 86, 23,142, 30, 61,138,156,156, 28, 16, 4, 1, 31, 31,159,176,146,146,146,166, 0, 30,215, 96,246, 39, + 30, 63,126,140,175,190,250, 10,102,179, 25, 11, 23, 46, 68,203,150, 45,109, 2, 43, 35, 35, 3, 75,151, 46, 5,195, 48,248,252, +243,207,209,162, 69, 11,152, 76, 38, 33,234, 24, 66,195, 21,248,240,195, 15, 31, 28, 58,116,232,100, 86, 86,214,107, 43, 87,174, + 28, 64, 16,132,121,193,130, 5, 95, 73,165, 82,166, 62,188, 37, 74, 53,238,222,207,176, 9,161,202, 71,128,191,175,211,124,247, + 30,102,217,126,207, 48,246,124, 12,252,124,125,156, 77, 98,169,201,100,210,190,249,230,155,222, 7, 14, 28, 32, 90,180,104,129, + 71,143, 30, 89, 45, 67,165,112, 62,164, 67,142, 92, 46,111, 73, 81, 20,239,254,253,251,136,136,136, 64,143, 30, 61,176,108,217, + 50,200,100, 50,208, 52,141,192,192, 64,179,201,100, 74, 50, 26,141, 23,106,225,138,153, 53,107, 22, 15,192,123, 22,203, 86,135, +121,243,230,153, 87,175, 94,141,164,164, 36,155, 5,203,222, 25,222,217,169, 67,123,171,147,253, 17, 31, 31,191,144,207,231,179, + 0,174,194,249, 64,207,134,202, 22,173,186, 88,179, 26, 10, 13,185,146, 49, 36, 36, 36,222,211,211,115,116, 73, 73, 73, 5,171, + 86,159, 62,125,140, 65, 65, 65, 9,142,242, 72, 36,146, 18,138,162,252, 0, 32, 39, 39, 7, 30, 30, 30,188,135, 15, 31,174, 64, +121,240,108, 52,109,218,116,133, 92, 46,231, 53,181,180,167,193,193,193, 48, 24, 12,213,186,177, 92,190, 89,176, 29,192,118,235, +185,175,175,111,158, 82,169, 20,173, 94,189, 90,179, 98,197, 10, 29,195, 48,122, 0,231, 21, 10,133, 45,142, 86,126,126,190,146, +203,229,250,122,123,123, 55,178, 10,173,170,180,200, 75,134,234, 45, 90, 22, 37,201, 86, 22, 68, 4, 65, 60,229,160, 94,139,208, +170, 85,100, 49, 12, 83,193,202, 96,117,120,175,234,127, 89, 58,245, 58, 77, 29, 90, 68,150,240,224,193,131,187, 86,173, 90,117, +213,209,223,217,251,104,109, 89,243,229, 74,171,200,250,253,183, 51, 56,156,166,148, 45, 92,177,118, 93, 93,223, 64, 27,127,113, +199,160, 32,191,184,175,151,199, 72, 31,156,218,129,159,182,252,155,253,253,250,245,238,215,175, 95,159, 50,103,206,156, 38,150, +130, 37, 7,112, 11,192, 4, 56,176, 74, 39, 39, 39,103,120,165, 78, 56,157,199,227, 5,137,197, 98,228,228,228,104,238,221,187, +231,244,148,140, 76, 38, 27,222, 0, 5,144, 99, 21, 89, 50,153, 12, 41, 41, 41, 24, 52,104, 16, 0,224,226,197,139,232,211,167, + 15, 18, 19, 19,209,165, 75,151, 36, 0,221, 80, 75,160, 86,147,201,164,104,211,166,141,205,186,165, 84, 42,205, 0, 16,157,151, +135,216,144, 16,112, 56, 28, 92, 89,177, 2,139, 77, 38, 44,115, 82,192,119,234,212,137,189,118,237, 26,158, 60,121, 2,154,166, + 49,102,204, 24,212,177,210,183,111,221,186,245,217,243,231,207, 7, 72, 36, 18,104,181, 90,104, 52, 26, 76,155, 54, 13, 19, 39, + 78,132, 94,175,199,190,125,251,112,228,200, 17,120,122,122, 66,171,213, 66,171,213,250,140, 26, 53,234, 82,122,122,122,127, 0, +247,171, 17, 90,236,240,225,195,145,144,144, 0,138,162,208,189,123,119, 20, 23,255,177, 24, 40, 40, 40,168,170,107,212,243, 20, + 90, 28, 14,135,141,143,143, 95, 57, 96,192, 0,100,101,101,189,214,165, 75,151,245,211,167, 79,207,169, 47,175,143,151, 39, 58, +181,109, 14,189, 94, 15,189, 94,143,208,208, 80,168,213,106, 60,120,240, 0,122,189, 30, 65,129,222, 78,243, 69,181,111, 97,227, + 11, 12, 12,132, 86,171,197,227,199,143, 97, 48, 24,224,239,239,148,208,106, 60,124,248,240, 95,247,236,217,227,183, 99,199, 14, +195,192,129, 3,249,235,215,175, 39,164, 82, 41,236, 58, 22,103, 17,127,241,226,197,240,161, 67,135, 70,166,166,166, 34, 62, 62, + 30, 6,131, 1, 81, 81, 81,184,119,239, 30,122,245,234, 5,141, 70,115,245,250,245,235, 71, 28, 49, 12, 3,248,116,214,172, 89, +176,138,173,132,132, 4,228,229,229,193,211,211,243, 41,161,101,245,125,180,172, 26, 15,117, 36,177, 86, 65,100,103,121, 90,236, +237,237,109, 4,176,174,142,214, 39, 0, 64, 86, 86,150,160, 67,135, 14,122,161, 80,200,183,136,182,181,245,225,115, 37, 92,176, +146,177, 90, 4, 7, 7,207,243,247,247, 31,218,172, 89, 51, 20, 20, 20,240,248,124, 62,250,244,233, 99,236,214,173,155, 49, 56, + 56,120,174,163, 60, 2,129, 32,149,199,227,245, 47, 31, 76, 48,200,204,204, 4,203,178, 11,219,183,111,255, 15,181, 90,141,226, +226, 98,190, 84, 42,181, 13,170, 35, 35, 35,161,215,235, 83,157,176,188,197, 68, 68, 68,124,202,227,241,150,201,100,178,170,194, + 66,240,189,189,189,165, 60, 30, 15, 70,163,177,130,216,172,172, 69, 94,118,145, 85, 65,104,217,169,200, 10, 66,199, 25,139,150, + 35, 86, 3,171,131,189,253,185, 85,212, 85,254, 95,117,141,161,229,229,229,165,183,138,172,101,203,150, 93,173, 11,199,254, 61, +187, 67,188,204,165,141,115,175,158, 64,250,237, 68, 28, 74, 81,200, 22,174, 88,251,193,235, 99,223, 46,168, 44,204, 28, 65,203, + 0,113,251,160, 64,191,184, 53,171, 86, 72,229,169, 87,144,151,159,143, 19, 87,175, 39, 26,129, 20, 0, 11, 93,105, 90, 6,202, +167, 14, 41,138,122,145, 10,172,205, 25, 62, 47, 47,207, 42,178,162, 0,160,111,223,190, 73, 22,145, 5, 71, 45, 90, 10,133,162, +242,150, 53, 67, 1,248, 91,159,159,195,225,160,207,167,159, 58, 45,178, 0,176,137,137,137,144,203,229,214,145, 98, 93, 69, 22, +130,131,131,255,121,254,252,249,128,239,191,255, 94,181,115,231,206, 98,179,217,204,237,212,169, 83, 88,215,174, 93,137, 93,187, +118, 1, 0, 38, 76,152,128,133, 11, 23,226,206,157, 59,240,240,240, 64,223,190,125,153, 37, 75,150, 4,206,155, 55,111,110, 65, + 65,193, 7, 85,246,142,102, 51, 79, 40, 20,158, 3, 48, 56, 53, 53, 21, 0, 46,161,124, 11, 39,171, 21,161,218,107,142,116,190, +106,181,154,235,233,233, 89,101,104, 8, 94,249,104,200, 89, 11,132,141,243,183,223,126,251,106,205,154, 53,135, 62,250,232,163, +251,245,228,172,210,162, 53,122,244,104,232,244, 70,100, 23, 40,193, 48, 52,116,198, 66,167,249,236, 45, 90,163, 71,143, 70,105, +153, 1,153,121,114,208, 52, 3,181,206,225,190, 92,252,234,171,175,158,254,225,135, 31,130, 47, 95,190, 12,134, 97,204,247,238, +221,123,252,230,155,111, 74, 23, 44, 88,224, 87,143, 69, 70,223,190,253,246,219,227,126,251,237, 55,121,100,100,164,239,213,171, + 87, 81, 88, 88, 8,154,166, 49,120,240, 96,240,249,252,204, 21, 43, 86,240, 0,124,235,232,187,177,136, 45,227,245,235,215,223, +189,114,229,138,175,175,175, 47,223,220,186, 53,242,206,156,193,129, 3, 7,158,250,193,150, 45, 91, 0, 7,163,240, 91, 45, 78, +215,174, 93,115,137,192,170,208, 83,243,249,117,158,126,124, 89,113,237,218,181,156,247,223,127,191,173, 84, 42, 93,215,175, 95, +191, 65,126,126,126,164,143,143, 79,124,163, 70,141,254,209,169, 83, 39,135,103, 23,184, 92,238,116, 15, 15,143, 7, 52, 77, 83, +195,213,223, 10, 0, 0, 32, 0, 73, 68, 65, 84, 26,141, 6, 90,173,182,188,145,166,105, 62, 73,146,104,218,180,169,173, 47,233, +222,189, 59,130,131,131,153,180,180,180,233,142,242, 23, 21, 21, 85, 88,133, 88, 5,102,245,233,211,135,163,215,235,241,228,201, +147,139,246, 23,170,210, 34, 47, 9,162,107, 20, 95,214,135,178,127,184, 70,141, 26,101,153, 76, 38, 54, 5, 96,111,221,186,197, + 70, 71, 71,215,120,148,149,149,177,129,129,129,121, 85,116,126,176,231,212,235,245, 21,126,167,215,235,217,160,160, 32, 70,167, +211, 61,197,169,211,233,216,176,176,176,156,154, 56,171,192,180,155, 55,111,110, 90,188,120,113, 15, 39, 50,200,198,201,110,110, +205,238,216,177,227,175, 44,203, 14,232,215, 54,252,246,248, 78, 65,108,159,150,129,185, 71,246,239,153,200,178,236,128,202,135, + 53,192,105, 77,156,173,131, 60,218, 12,105,215,164,228,247, 83,123,217,243,171,255,206,174, 25,211,146,237, 18,230,169,104,237, + 47,114,118,143,152, 90,119, 75,111,215,174, 93,186,217,108,102, 13, 6, 3,219,174, 93,187,123,174,224,172, 3,106,226,236,140, +114, 95,182,183,171,248,174,115, 61,210,249, 59,203,178,172, 92, 46,103, 53, 26, 13,171,215,235, 89,134, 97, 88,123, 0,248,221, + 1, 78,214,104, 52,178, 37, 37, 37, 44, 28,247,185,171,146, 51, 36, 36,228,241,195,135, 15,217, 87, 94,121, 37,203, 98,142,159, +167,213,106,217,202,208,106,181,236,160, 65,131,216,123,247,238,177, 17, 17, 17,101,247,238,221, 99, 67, 66, 66,238,214,146,206, +102,141, 27, 55, 62,231,239,239, 31, 15,160,165, 19,215,106,204,207,125,251,246, 53,103, 89,118, 38,203,178,209,213, 28, 51, 89, +150,109,253,188, 57, 45,249, 91,192,178, 44, 91, 90, 90,202,202,229,114, 54, 55, 55,151, 45, 45, 45,101, 53, 26, 13,123,243,230, + 77,246,242,229,203,236,237,219,183, 89, 95, 95,223, 2, 71, 56,173,124, 6,131,129, 85,169, 84,108, 97, 97, 33,171,211,233, 88, +173, 86,203, 38, 39, 39,179, 55,110,220, 96, 83, 83, 83,171,226,123,138,211,207,207,111, 75,126,126,190,230,210,165, 75,165,155, + 55,111, 46, 13, 14, 14, 78, 5, 16, 14,160,149,143,143, 79,254,223,255,254,119, 86, 34,145,100,212,177, 30,181,229,114,185, 55, + 87,174, 92,121,237,216,177, 99, 5, 71,142, 28, 49,108,219,182, 45,123,206,156, 57, 23, 56, 28,206, 77, 0,109,235, 88,143, 2, +189,189,189, 47, 93,189,122,149, 46, 41, 41, 97, 21, 10, 5,171, 82,169, 88,173, 86,203,234,116, 58,214, 96, 48,176, 38,147,137, +189,112,225, 2, 27, 20, 20,100, 63, 45,185,168,134,129,245,124,150,101,255,201,178, 44,199,213,109,157, 29,119, 63, 87,113,186, +162,173, 35, 73,210,104,105, 59,122,150,159,214,124,254,188,210, 57,100,200,144,207, 39, 78,156,200,142, 24, 49,130,141,138,138, +122,234,232,210,165, 11, 59,123,246,108,246,216,177, 99,236,215, 95,127,253,185, 11,210,201, 65,249,162,151,229, 67,134, 12, 49, + 37, 36, 36,176, 19, 38, 76, 96, 1, 12,175, 73,139,252, 25, 4,151, 53,188, 3, 97,255, 23, 0,140, 70, 99, 86,122,122,122, 72, + 36, 77, 83, 0,240,221,119,223, 61,101,153,178, 71, 66, 66, 2, 77, 16,196,131,154,254,187,209,104,204, 58,127,254,124,208,134, + 13, 27,184,118, 38, 96,208, 52,109,206,205,205, 37,215,175, 95, 95,225,254,184,184, 56,154,166,233, 76, 39, 31,114, 71,231,206, +157,119,184, 34,183, 46,220,121,242,143,211, 39,126,246,239,217,163,159, 66,234,235, 91,229, 40,108,223,220,214, 32,222,171,217, +170, 69,112,200,101, 43,151,199,120, 91,167, 32,127, 76,202, 87,148,233,153, 65,105, 50,221,239,174,126,195, 26,141,230,137,117, + 37,160, 86,171,205,124, 1, 11,225, 77,148,199,184,162, 43,125,215, 13,245,116, 58, 53,155,205,240,242,242,178, 89, 67,235, 96, + 17,101,173, 22, 86,235,171,171, 79,122, 88,150,253, 45, 57, 57, 57, 98,218,180,105,158, 59,119,238,124,200, 48, 12,119,198,140, + 25,198,224,224, 96,222,197,139, 23, 77, 0,136, 1, 3, 6,112,242,243,243,217,156,156, 28,249, 95,254,242, 23,245,187,239,190, +235,119,235,214, 45,190,217,108,174, 45,104,225,163,172,172,172, 33,117,184, 86, 35,198,143, 31,255, 16,245,223,198,166,193, 57, +173,144, 43, 84,120,248, 36,199, 18,193,220, 12, 38,163,192,230, 87,101, 50,209,144,171,138,157,182,104, 61,120,156, 99,217, 98, +140, 1,195,228, 90,248,202, 29,226,217,146,210,218,123, 19, 14,167,239,146, 37, 75, 70,146, 36, 73, 94,185,114, 69,191,106,213, +170,172,162,162,162, 49, 0, 50, 1,160,164,164,100,224,142, 29, 59,254,235, 64, 40,135,234,144, 98, 50,153,122, 45, 90,180,232, + 3, 0,125, 1, 52,177,112, 95,180, 88,178,234, 26,193,188, 80,161, 80, 12, 27, 57,114,228, 25,138,162,154,218,213, 35,127, 0, + 50,107,189, 96, 89, 54,176,160,160,224, 53, 71, 8, 9,130, 88,219, 80, 13, 73, 67,114,215,179, 29,122, 41, 86, 50,158, 59,119, +238,139, 49, 99,198,112,194,195,195,255, 47, 60, 60,156, 44, 41, 41,129, 70,163, 1, 73,146, 8, 14, 14, 70,187,118,237, 16, 28, + 28,108, 78, 77, 77, 93,254,241,199, 31,215, 26,147,175, 77,155, 54,205, 77, 38,211, 43, 36, 73, 54, 7,208,156,101,217,230, 4, + 65, 52, 7,224, 11, 0, 82,169, 84, 26, 17, 17,193,233,217,179, 39,122,244,232,129,184,184, 56,236,223,191,127, 59,128,211,246, +214,172,202, 90,228, 69, 64, 74,103,176,109,111,130,184,211, 5, 3, 8, 51,226, 88, 18, 3,219, 37,218,226,236, 85, 22, 89,213, +111, 42, 93,133,233,111,248,224,193,131,109, 21,206,129, 78,229, 73,109,149,175,168,168,104,248,244,233,211, 43,112, 50, 12,163, + 47, 46, 46,126,191,119,239,222, 27, 41,138, 18, 84, 42,176, 25,133,133,133,207,116,175,190,202,113,180,134,143,124, 67, 86, 95, + 78, 9,143,124, 37,253,248,127, 80, 80, 40,195,143, 73,249, 37,106, 3, 51,240,158,172, 52,185, 33,210,159,145,145, 49,226, 37, + 80,252, 85,137,214,250,110,158, 93,228, 64, 64,210,218,246,168, 35, 44,225, 68, 92, 82,201,243,243,243, 87,127,250,233,167,195, +150, 47, 95, 30,112,242,228, 73,169,117,128,242,214, 91,111, 21, 38, 39, 39,247, 3, 32, 40, 43, 43, 59,187,124,249,242,128,152, +152, 24, 63, 0,126, 0, 48,106,212,168,130,130,130,130, 13,112,163, 70,152, 76,166,236,118,109, 34,109, 3, 63,251,144, 14,246, +159,105,154,206,118,134,175, 42, 30,251,115,134, 97,106,228,163, 40,234,163, 30, 61,122, 80, 31,125,244, 81,193,201,147, 39,173, + 27,233,218, 43,180,244, 90,130,146, 58, 2, 61,128, 85,150,195,149,208,202,229,242, 94, 78,254,134,113,151,198, 42, 7,148,206, +156, 63, 23, 28, 62,124,248,179, 9, 19, 38,236,240,245,245,221,221,188,121,243,200,160,160, 32,169, 72, 36,130, 94,175, 87, 27, + 12,134,187,233,233,233,147, 62,251,236,179, 71, 14, 89, 56,118,236,160, 0,240,204,102,179,144, 36, 73, 15, 0, 82,130, 32,124, +172, 66,139, 32, 8, 24,141, 70, 60,121,242, 4,139, 23, 47,102,206,157, 59,247, 53,128,207,157, 24,184,118, 3, 16, 96,215,142, + 7, 0, 48,160, 60,128,109, 17, 65, 16,215, 27, 58,191, 8, 51,226,218,222, 4,145,210, 25, 85,245, 19, 53,111, 42, 93, 93,133, + 43, 42, 42,234,229,234, 74, 92, 29,103, 81, 81, 81,248,139, 82, 67,166,234, 87,237,197,150, 85, 21,246, 57,180,138,176,170,206, +107,131, 82, 71,207,249,246,244,157,213,122,154, 53, 27,105,243,223,238, 21,149,166,184,219, 33,151,227, 85, 87,213, 37, 23,166, + 41, 57, 45, 45,173,247,156, 57,115, 62, 19,139,197,221, 1,160,180,180,244, 74,110,110,238,151,176,172, 42,172,237,186, 27,213, + 67, 38,147,117,125, 17,249, 12, 6,195, 63,122,247,238,253, 13,195, 48,107,104,154,190,248, 63,240, 42,202,220,165,241,229,197, + 79, 63,253,244, 8, 64, 47, 0, 24, 55,110, 28, 5, 0,251,247,239,119, 90, 60, 79,155, 54,141, 97, 89,214,104, 41, 15, 90,148, +175, 46, 44,177,182,169, 90,173,182, 36, 55, 55, 55,149, 97,152, 84, 0,255,133,243, 43,110, 3, 8,130, 56,198,178,236,104,139, +112, 59,198,178,236,104,251,239, 26,218,170, 85,203, 45,181, 59,195,187, 81,142,253, 41, 32, 42, 79, 5,214,118, 94, 27,210, 11, +180,241, 0,186,184,115,247,127, 18, 15,115,115,115,167,214,227,186, 27, 47, 31, 50, 13, 6,195,152,255,161,231, 85,186, 95,249, +159,164,255,171,131,192,178, 34, 53, 53,181,193, 92, 4,158, 55,218,222,172, 56, 0,175,124,110,135,232,170,132,151, 91,104,185, +225,134, 27,110,184, 81, 31, 40,220, 89,224,198,159, 25, 86,223, 44,235,121, 53, 62, 90,149,253,179,108,231, 4,170, 95, 57,224, +204,174,228,117, 89, 37,113,214,205,233,230,116,115,186, 57,221,156,207,157,211, 27, 64, 4,128,149,181,220, 87,121,117, 97, 1, + 0, 25, 0,147, 59, 63,221,156,245,208, 15, 14,129,101,217, 81, 53, 77, 29, 18, 4,113,188,161,132,150,205, 25,190, 51,150,180, +187,137, 37,214,115, 71,133, 86, 67, 99,168,155,211,205,233,230,116,115,186, 57,221,156,110, 78, 55,103, 61,133,214,160,143, 63, +254,248, 19,148,135,198, 96, 63,254,248,227, 79, 88,150, 29, 85,126,137, 29,213,144,255,251, 78, 23, 12, 72,233, 12,214,122,220, +233,130, 1,213,220, 26,109,119,216,224,158, 58,116,195, 13, 55,220,112,195, 13, 55, 94,116, 92, 90,177, 98, 69,233,138, 21, 43, +172,142,239, 69, 0, 8,139,133,171,168, 33,255,177,101,154,208,145,133, 82, 53,111,193,243, 28, 16, 74,114,120,147,185, 60,193, + 32,176,230,118, 0, 0,146,186,195, 24,202,126,165,105,227,110, 0,185,117, 37,110, 13,180,105,225, 45, 58,162,103, 24, 94,150, +218, 48, 46,173,124,155, 3,167, 49, 14,232, 35,224,243,127, 17,120,123,139,170,186,174, 87, 40,116,122,131, 97,216,126,224, 55, +119, 29,112,195, 13, 55,220,112,227, 37,129,135,143,143,207, 57,146, 36,195,173, 95,216,199, 29,172, 28,131,144, 97,152, 60,185, + 92, 62, 12,229, 83,197,207,146,211,254,247, 6,212,177, 47,119, 53,156,157, 58,228, 0, 21,162,176, 62,147, 29,179, 41,174,224, + 93, 79, 47,239,101,127,157,254, 15,191,150,173, 34,137,198,141, 27, 1, 44,144,153,149, 29,244,224,254,189, 33, 63,237,252,246, + 67,149, 82,190,216,164,215,255,199, 89,238, 54,128, 71, 19,137,224,226,127, 62,126,199,155, 3, 26,111, 47,221,115,138,208, 24, + 27,167,150, 47, 55,117, 74,100,121,251,249,157, 94,113,246,172,200,167, 99,199, 10,215, 88,150, 45,223, 95,239,247,223, 69,255, + 55,108,216,233,113,114,249,112,183,216,250, 83, 34, 88, 42,149,206,227,114,185, 3,141, 70, 99, 56,159,207,207, 98, 24, 38,190, +164,164,100, 29,128, 28,119,246,252,185, 17, 25,236,209, 47,178,121,248,158,220,252,130, 36, 85,153, 97, 70,122,174, 70,238,206, + 21,167, 81,211,254,154,207,109,239, 77, 0,144, 72, 36, 55, 72,146, 12,179, 23, 1,214, 61,123,173,231,149,255,154,205,230, 71, +114,185,188,119, 13,180,205,125,125,125, 55, 2,232, 86, 91,192,100, 75,108,182,235,114,185,252,125, 84,191, 90,207,211,199,199, +231, 11,130, 32,198,147, 36, 73,213,246, 76,102,179,153, 97, 89,118, 95, 73, 73,201,231, 0,212,213,221,231,227,227,115, 54, 45, + 45,173, 91, 96, 96, 96,173, 86, 26,154,166,145,153,153, 25,208,189,123,247, 11,114,185,188,117, 67,114, 62,107, 45, 82, 87,212, +176,234,176,218,130, 14,160,194,254, 66, 13, 26,145,149, 39,148, 28,233,213,127,248,160,217, 31,124,228,113, 51,249, 46,126,137, +187, 12,149, 86, 15,138, 36,225,237, 41, 70,171, 86,175, 16,107, 99, 15,248,111,223,188,118,205,149,132, 51,163,202,180,202,191, + 56, 37,211,197,156,197, 11,223,236,238,225,231,203, 0,102, 6,255, 28,217,201,227,255,142, 37, 45, 70, 41,253,137,211, 34,235, +220, 57,113, 97, 65, 1, 98, 66, 67,193,161,105, 8, 73, 18, 66,130,128,144, 36,225, 33, 20, 98,196,182,109,248,242,228, 73,241, +103,175,189,230, 22, 91,127, 50, 72, 36,146,233,161,161,161,171,182,110,221,234,215,172, 89, 51,120,120,120, 64, 46,151,251,167, +167,167,119,158, 63,127,254,212,188,188,188, 79, 85, 42,213, 22,119, 78,253,121, 97, 54, 99,242,247,203,222,111,148,151,113,191, +209,172,229,123, 91, 17,126,204,192,187,197,186,124,119,206, 56,140,206, 0,146, 80,245,254,165, 53, 93,171, 22, 66,161,176,160, +172,172, 44,176,166,123,248,124,126,161,193, 96, 8,170,141,139, 36,201,176,156,156,156, 64,177, 88, 12,134, 97, 44,187, 1,152, +109, 3,105,251,221, 79, 44,129,106,209,186,117,107, 99, 77,156,158,158,158,223, 21, 22, 22, 14,181,238, 19,104, 39,168,170, 68, + 78, 78,206,208,182,109,219,126,167, 86,171,135, 85, 35, 94,190,248,224,131, 15,230,181,111,223,222,106, 5,178,236,130, 80,254, + 87, 38,147, 97,206,156, 57,182,255, 97, 54,155,113,230,204,153, 15,166, 79,159,142,146,146,146,249, 53, 60,123,120, 96, 96, 32, + 97,217, 80,188, 90, 44, 89,178, 4, 75,150, 44,193,183,223,126, 75,112,185, 92,239, 90,242,211, 37,156,207, 74,139,212,197,130, + 85, 75,100,248,227,168,232,155,117,252, 41,161,245, 44, 64,113, 5,127,235,214,123,232,192, 57,243, 22,122,236,253,249, 60,210, + 83,127, 71,218,197, 31, 42,220,211,117,216,116,228,203,212,152, 62,251,159, 18,130,226, 12, 76, 56,123,248,111, 38,189,238,123, + 7,173, 89, 65,225, 2,254,223,123,118,111,199,205, 17,165, 35,216, 71,132,190, 93, 90,112, 27,159,190,253,119, 45,232,111, 82, +203, 87,201, 56, 37,178,182,190,243, 14,250,153, 76, 8,164, 40, 80, 4, 1, 10, 0, 73, 16, 40,211,235,113,125,242,100,116,223, +181, 11,159, 31, 61, 42,254,226,245,215,157, 18, 91, 30, 30, 30, 55, 9,130,240,209,104, 52,163, 80,190,177,244,203,128,182, 18, +137,228, 56,203,178, 37, 90,173,182,243, 11,148,174, 16,148,207,209, 87, 30, 29,243, 80,190,162,202,169,157,133, 5, 2,193,187, +227,198,141, 91,187, 97,195, 6,113, 65, 65, 1,114,115,115,193, 48, 12,132, 66, 33, 90,182,108, 73,156, 61,123,214,111,225,194, +133,171,143, 31, 63, 46, 80,171,213,223, 56, 51,176,225,114,185,177,190,190,190,175, 5, 5, 5,121, 20, 22, 22,150, 42, 20,138, + 51,122,189,254, 93,212,125,219, 20,146,203,229, 78,138,136,136,120, 35, 52, 52, 52, 40, 39, 39, 71,150,157,157,125, 68,175,215, +111, 71, 29, 55,106,182,203,211,142,176, 68,171, 7,144, 23, 17, 17,113,231,201,147, 39,133, 46,228,204,141,136,136, 72,169, 3, +167, 7,128,159, 0,132,214,114, 95, 46,128, 9,112,210,154,109,203, 88,214,124, 98,233,186,173, 51, 98,166,245, 37,190,159, 63, +180,229,123,223,158,189, 76,242,216,254,169,121,101, 89,110, 13,229,152,200,178,108,105, 85, 89, 80,213,116,173, 70,232,245,250, + 0,163,209, 8,110, 53,155,197,107,181, 90,120,122,122, 6, 56,154, 72,145, 72,132, 31,126,248, 1, 92, 46, 23, 92, 46, 23, 37, + 37, 37, 8, 11, 11,179,157,243,120, 60,219,231, 38, 77,154,212,202,199, 48, 76,119,138,162,160,209,104,192, 48,140,237, 80, 40, + 20, 96, 89, 22, 2,129, 0, 12, 83,190,157,147,221,245,238,213,241, 17, 4, 49, 62, 52, 52, 20,123,247,238,133,193, 96,120,234, +186, 84, 42, 69,114,242, 31,155,140, 80, 20,133, 30, 61,122,144, 4, 65,140, 7, 48,191, 6, 94, 22, 0,162,163,163, 65, 81, 20, + 40,138, 2, 73,146,182,207,214,131, 97, 24, 44, 89,178, 4,149,182, 38,123,102,156, 47, 26,106,137, 12,159,135,106,124,180,200, + 6, 78,151,253, 18,207, 80,177,135,244,171,247,255,241, 79,201,241, 11,183,145,153,149,249,148,200, 2,128, 27,191,108, 71, 94, +110, 14,146,210,178, 49,233,111,115, 37, 82,169,247, 87,149, 26,212,106,151,141,122,121,242,190,254,120, 66, 95,161,198,148, 11, +181, 15, 64, 53,231,131, 43,214, 98,225,232,142, 2,169, 39,111,149, 35,233, 20,240,249,191,172, 56,123,214, 38,178,250,232,245, + 16, 48, 12,104,134,177,137, 44, 3, 77, 67,103, 48, 32, 68,163,193,131,233,211,193,154, 76,248,244,208, 33,177,128,207,255,197, +145,116, 2, 0,143,199, 11, 57,114,228, 72,147, 14, 29, 58,196,193,241, 96,166,103, 27,248, 29,213,132, 46,157, 58,117,138,223, +181,107, 87, 19, 30,143, 23,226, 10, 78,161, 80, 56,214,195,195,163, 72, 40, 20,142,173, 99, 58, 73, 0, 75,103,204,152,145,248, +202, 43,175,156,183, 8, 43,155,168,121,229,149, 87,206,206,152, 49,227, 38,128, 37,213,148,245,170, 56, 27,133,134,134, 46,219, +176, 97,131,248,222,189,123,200,201,201,129,201,100,194,219,111,191, 13,134, 97,160,211,233, 96, 48, 24,176,114,229, 74, 15, 63, + 63,191,197, 40,223, 40,216,145,103,231,121,121,121,221,219,185,115,231,184,199,143, 31, 75,206,159, 63, 79, 36, 39, 39,123,172, + 94,189,122,140,159,159, 95, 58, 0, 65, 29,242,147, 12, 9, 9,249,254,240,225,195,239, 39, 39, 39,135, 29, 60,120,144,123,229, +202,149,144,205,155, 55,207, 12, 9, 9,217, 5,128,170,227, 59,234, 44, 22,139,135, 44, 88,176,192,124,233,210,165,156, 75,151, + 46,229,172, 93,187, 22,253,250,245,235, 19, 19, 19, 19, 85, 71,206, 46,158,158,158,131, 23, 44, 88, 96, 78, 72, 72,200,189,122, +245,106,246,234,213,171,201,193,131, 7,247, 93,182,108, 89, 71, 39, 57,127,186,116,233,210,128,172,172,172,102,217,217,217, 77, +179,179,179, 35,178,179,179, 35,114,114,114,194,243,242,242,154,228,231,231, 55, 46, 44, 44,108, 28, 31, 31,223, 23,192, 30, 71, + 56, 35,131, 60,222,159,255,246,208,210,197,127, 27,201,126, 50,229, 85,118,225,219, 3,216,215,250,119,248,153,226,112,136,171, + 41,153, 8,243, 2,182,207,233, 22,222,216,223, 35,185,157,175,164,213, 11, 86, 55, 95, 52, 78,142, 85, 72,201,229,114, 28, 63, +126, 28, 22,235, 85,103,123,145,165, 82,169,144,151,151,103,189,198,113, 36,157, 82,169,244,220,214,173, 91,217,178,178, 50, 40, +149, 74, 20, 22, 22, 34, 43, 43, 11, 15, 30, 60, 64,113,113, 49,238,222,189, 11,177, 88,124,206,145,116, 18, 4, 1,134, 97,108, + 66,234,204,153, 51,152, 49, 99, 6,228,114,185,237, 59, 14,135, 99,251,108,253, 77,109,156, 86,203, 19,195, 48,184,122,245, 42, +102,205,154,133,181,107,215, 98,207,158, 61, 56,118,236, 24,228,114,185, 77,108,209, 52, 93, 43,167, 76, 38,131,217,236,216,152, +137,101, 89, 40,149, 74,135,223,187,189, 0,226,112, 56, 79,137, 34,235,225, 76, 89,170, 39,231, 11, 11, 7, 34,195, 87, 63,194, +182,126,176,152,234, 6, 54, 84, 34, 73, 14,111,210,248,105, 31,248,101, 23,170,144, 83,160, 4, 69,254,209,239, 69, 13,157, 6, + 14, 69,226,218,233,114,195, 21, 73, 81, 80,106,245, 80,104,140, 24, 55,109,158,239,127,214,254,107, 18,109, 44,171, 49,198, 75, +123,160,101, 59,137,228,205,182,109,155,144,169,130, 52, 68,189,118, 17,140, 25, 96, 19, 94, 71,231,146, 64,170,245, 47,252, 55, +181,106,227,178,100,224, 94,141,214, 12,111,111,145, 79,199,142,136, 9, 13, 69,127,147, 9, 60,150,197,171, 5, 5,248,125,222, + 60,232, 15, 28, 0, 9,128, 55,118, 44, 6,173, 91,135, 11,161,161, 8,214,233,160,248,240, 67, 4,156, 58, 5,158, 84, 42, 66, +145, 99,139, 31, 8,130,192,192,129, 3,113,246,236, 89,191, 17, 35, 70,156,190,125,251,246, 91, 52, 77, 95,168, 75,222,122,121, +121,221,224,112, 56, 97,181,221, 71,211,116,182, 82,169,116,122,155, 17, 14,135,211,191, 71,143, 30,135, 14, 30, 60,232, 99, 52, + 26, 93, 50, 10,225,243,249, 35,198,140, 25,179,117,211,166, 77,210,153, 51,103,110, 61,118,236, 88,169,193, 96, 56,229, 76,145, + 2,176,116,203,150, 45,239, 69, 71, 71,123,207,156, 57,147,125,240,224,129,189,245, 42,160, 95,191,126,175,108,221,186, 53,184, + 91,183,110, 31,204,154, 53,139, 7,224,211,218,172, 60, 18,137,100,246,214,173, 91,253,101, 50, 25, 52, 26,141,173,145,205,206, +206,134, 72, 36, 2, 73,146, 32, 73, 18, 92, 46, 23, 95,125,245,149,223,236,217,179,231,201,229,242,121, 14, 88,201, 98, 55,110, +220, 24, 48,108,216, 48,242,241,227,199, 32, 73, 18, 66,161, 16,239,188,243, 14,169,211,233,124, 98, 98, 98,118,104,181,218,137, +206,228, 33,151,203,157, 20, 27, 27,219,170, 79,159, 62,156,180,180, 52,244,234,213, 11,215,174, 93,195,216,177, 99,185,106,181, +186,233,194,133, 11,103,232,245,122,103,227,184,132,136,197,226,246,191,254,250,107, 86,227,198,141,109, 13, 75,211,166, 77,153, + 81,163, 70,201,211,210,210, 34, 47, 93,186, 84,220,187,119,111,103, 54, 44,111, 36, 22,139, 91,159, 56,113, 34, 47, 38, 38,102, +200,150, 45, 91,198, 0, 64,247,238,221,143,124,249,229,151,231,229,114,121,187, 11, 23, 46,200,251,247,239,159,237, 32, 95,104, + 72, 72, 8, 51,103,206, 28, 73, 77, 55,109,219,182, 77,129,242, 13,151,155, 1,168,113,191,182,200,136,224,197,171,230,141, 23, +129, 49,130, 53,233, 0, 99, 41, 96,212,192,108, 40, 5,193, 19, 1, 38, 29, 2, 4,114,252, 52, 59, 82,186,104,239,195, 84,230, + 46, 49, 42, 77,166, 62, 5, 55,170,108,106, 0, 68, 17, 4,145,116,252,248,113,244,232,209, 3,199,143, 31,199,168, 81,163,146, +236,197, 64,114,114, 50,250,247,239, 15,139, 69,203, 33, 95, 45,165, 82,249,241,146, 37, 75, 18, 38, 77,154, 36,174,208, 24,144, + 36,188,189,189, 49,114,228,200, 50,173, 86,251,177,163, 9,101, 24, 6, 28, 14, 7,217,217,217,216,182,109, 27,150, 47, 95,142, +150, 45, 91,194,100, 50, 61, 37,182, 44,237,158, 67,141, 31, 77,211,184,126,253, 58,118,239,218,133, 79, 23, 47,134,167,167, 39, + 0,192,104, 52, 66, 94, 82, 2,161, 80,104, 19, 99,181, 8,167,125,247,239,223,159, 23, 22, 22, 86, 97,202,208,250,215,210,102, +193,108, 54,131,166,105,148,149,149, 97,237,218,181, 52,203,178,251,106,235,127,172,162,104,222,188,121,208,235,255, 48,168,119, +180,248, 36, 71, 68, 68,160, 83,167, 78,182,115,146, 36, 89, 71, 57,255,211,187, 61,116,118,119, 71, 46, 89, 13, 0, 8, 11, 11, + 67,100,100, 36, 66, 66, 66,170,229,108,104, 45, 82, 23, 56, 17, 25,190,122,161,245, 44,118,202,230,242,132,131,154,183,104, 69, +100,230,201,193,225,112,224,225,229,143,222,111,204, 7, 69,145,144,120,251,131, 96,116,127, 40, 98,146, 2,135,226, 64,174,214, + 33,162, 89, 11, 82, 32, 20, 13,210,214, 34,180,164, 94,220,141, 11, 38,246, 22, 22,211,217, 16, 53, 17,130,177,118,167,161,124, +144,126,106,124, 52,162,165, 40,250,200,237,141, 80,154, 6, 59,146, 94,138,166, 17, 72, 81, 48,178, 44,126,159, 55, 15, 81,177, +177, 72,178, 10,195,216, 88, 36, 69, 71,195,151,203,133,128, 36,193,154, 76, 79,205,233, 59, 34,180, 0, 32, 43, 43, 11, 7, 14, + 28,240, 29, 63,126,252,161,228,228,228, 73, 78,138, 13, 43,151,255,213,171, 87, 3,155, 53,107, 86,237, 61,143, 30, 61, 66,215, +174, 93,157,158,158,226,243,249, 35, 6, 15, 30,188,247,192,129, 3, 94, 41, 41, 41, 8, 12, 12,172,183,208, 18, 8, 4,253,135, + 14, 29,186,119,231,206,157,210,162,162, 34,196,198,198, 74, 95,127,253,245, 61,137,137,137,111,232,245,122, 71,196,102, 5,145, + 21, 27, 27,171,216,182,109,219,127, 80,113,138, 48,111,219,182,109,223,119,235,214,237,253,232,232,104,111, 0,239, 89,124, 7, +106, 20, 91, 2,129, 96, 96,243,230,205, 43,140,106, 5,130,114, 99,147,135,135, 7,188,188,188,192,227,241,160,215,235, 17, 21, + 21, 69,240,249,252,190,142, 60,179,167,167,231,208, 55,223,124,147,188,120,241, 34,242,243,243,225,237,237, 13,137, 68, 2,134, + 97, 48,115,230, 76,106,237,218,181, 3,181, 90,231,102,184, 26, 55,110, 60,102,200,144, 33,156, 59,119,238,224,241,227,199,208, +235,245, 72, 79, 79,135, 84, 42,197,148, 41, 83,120,171, 86,173,122, 61, 39, 39,199, 89,161,213, 62, 58, 58,186,192, 94,100, 89, +225,225,225, 65,180,106,213, 74,238,231,231,215, 5,128, 51, 66,171,253,220,185,115, 11, 87,172, 88,209,255,236,217,179,182,160, +151,103,207,158, 93, 8, 0,223,124,243, 77, 66, 64, 64, 64, 23, 0,142, 10, 45,176, 44,107,254,235, 95,255,154,193,231,243,193, +229,114,193,231,243, 43, 28, 60, 30, 15, 36, 73,122, 90,171,115,109,124,169,143,243, 87,206, 92,184,122,181,135,144,226,254,227, +141, 14,104,226,205, 3, 68,190,224,245, 95, 4,194,187,220,104,201,202, 31, 1,191, 44,194,154, 55,229,100,244,127,203,126, 54, + 50, 62, 1, 15, 75, 74,212,207,185, 15,232, 6,224,223, 40,223, 92,119, 49,128,171, 47, 72,223,116, 19, 64,212,168, 81,163,108, + 98,235,228,201,147, 24, 49, 98, 4, 20, 10, 5,238,220,185, 99, 47,178,156,217, 96,249,166,201,100,186,245,195, 15, 63,244, 30, + 63,126, 60, 97, 87,191,144,146,146,130,187,119,239, 38, 57,202, 71,146, 36,204,102, 51,184, 92, 46, 86,175, 94, 13,163,209,136, +255,254,247,191,216,191,127, 63, 72,146, 4, 65, 16, 32, 8, 2, 82,169, 20,223,126,251,173, 83,237, 30,195, 48,216,177, 99, 7, + 22, 45, 92,104, 19, 89,150,153, 12, 4, 7, 5,193,207,223, 31, 15, 31, 62,172, 85,104,149,148,148,124,126,244,232, 81,212,228, + 12,127,244,232, 81,219,231, 74,206,240,181,247,115, 20, 5,189, 94,143, 87, 95,253, 99,171,216,185,115,231,218, 62,203,229,114, + 80, 20,101,205, 11,194, 81, 78, 29, 11,188, 33,252,227,187,145, 31,125, 84,193, 66, 87, 29,231,179,208, 34,174,178,110, 85, 33, +182,162, 44,214,217, 16, 0,163, 80,238,163,149, 7, 60, 67, 31, 45,150, 53,183, 14,107, 20,138, 91, 15,146,193,161, 40,240,189, +252,225,229, 27, 4, 51,109,128,178,240, 49,226, 14,126, 7, 0,216,178, 99, 31, 72,146, 4,135, 67, 65,111, 96,208,178, 73, 40, +204,102,115,235,154,184,219, 0,189, 7, 6,249,247,104, 28,238, 77,220,241,121,140, 86,129,126,149, 38, 66, 4,104,153, 43, 33, +122, 73, 68,221, 75,148,170,222,169,192,165, 90,197, 0, 73,130, 36, 8,136,121, 60,232, 15, 28, 40,247,218,140, 45,239,179,146, +162,163, 65,254,252, 51, 60, 5, 2, 80, 4, 1,142,197, 4, 93, 23,168, 84, 42, 16, 4,129,221,187,119,251, 76,153, 50,101,207, +157, 59,119,162,203,202,202, 14, 56,195,161, 80, 40, 70,245,233,211,231,252,142, 29, 59, 2,130,131,131,159,186,158,159,159,143, +105,211,166, 21, 41, 20, 10,167,130,186, 9,133,194,177, 99,198,140,217,186,125,251,118,233,253,251,247,161,209,104, 16, 16, 16, + 80,223,162,208,165,103,207,158,135, 14, 28, 56,224,149,159,159, 15,165, 82, 9,189, 94,143,221,187,119,123,143, 28, 57,242, 64, + 90, 90,218, 8, 0,137,181,112,124,102, 47,178,102,205,154,117, 27, 64, 32,128,141,149, 53,168,229, 90, 7, 59,177,165, 4,176, +170,134,145,104,184,135,135, 7, 10, 11, 11, 49,109,218, 52,220,187,247,135, 1, 52, 52, 52,212, 54,210,123,248,240, 33, 2, 2, + 2, 64, 16, 68,160, 35, 15, 29, 16, 16, 32, 49, 24, 12,152, 49, 99, 6,178,178,178, 42,112,102,103,103,131, 32, 8,177,179, 25, + 25, 20, 20, 20,164,211,233,208,175, 95, 63,148,149,149,239,235, 59, 97,194, 4,112,185, 92, 20, 22, 22,130,203,229,250,215,225, +253,248,143, 26, 53,170,218,208, 42, 82,169,212,232,227,227,211,198, 73, 78,191,215, 95,127, 61, 39, 54, 54,246,169,133, 45,215, +174, 93,251,139,175,175,239, 89, 95, 95,223, 86, 78,114,154,237, 69, 21,143,199,171, 32,180,184, 92, 46, 72,146,116,216, 71,237, + 94,161,118, 3,135,200,235,180, 98,206,176,105, 77, 2,189,192,106, 10,192, 27,252, 57,110, 21,137,176,122,237, 9, 0,192, 63, +223,233,138,142, 67,151,194,176,125, 24,230,245,162,248,147,179,245, 11, 0,124,246,156,219,252,175, 1, 88, 87,193,109, 2,208, +233, 5,234,143,108, 98,235,228,201,147,104,215,174, 29, 74, 74, 74,144,150,150, 86, 87,145,101,109,239, 22,125,241,197, 23,191, +188,245,214, 91, 30,214, 65,171, 72, 36,194,135, 31,126,168,211,104, 52,139,156, 42, 68,102, 51, 56, 28,142,109,144, 44, 20, 10, + 17, 21, 21,101, 19, 89, 4, 65,160,180,180, 20, 28, 14,199,186, 34,145,112, 48,141, 8, 9, 14,134,167,167, 39, 90,180,108,137, +251,150,118,196,250, 89, 32, 16,128, 32, 8,208,116,173,134, 60,181,197,169,125,190,171,187,100,171, 40,170,209,116, 28, 26, 10, +179,217,108, 21,153,172, 43, 56,253,253,253,161,209,104, 28,229,124, 33, 81,141, 69,203, 42,180, 70,161,220, 87,235,169,240, 14, + 3, 0,196,161, 1,151, 84, 18, 96, 9, 51,203,130, 67,145,150,185, 91, 10, 20, 69, 66, 94,148,135,117,159,191,103, 17, 89,251, +113, 60, 33, 13, 97,205,219,253, 49,143, 75, 16, 0, 91,115,225, 14,240,226,197,206,126,171,167,168,128,200,131,119,168, 24, 66, + 97, 37,253,232,195, 3, 17, 65, 98,206,192, 48,241,245,163,101,177,169, 74, 99,173, 29,133,144, 36,203,157,223, 9,162, 74,231, + 30,210,114,141, 34, 8,176, 44, 11,214,236,156,223,177, 85,200,139, 68, 34, 24,141, 70, 80, 20,133,245,235,215,123, 15, 29, 58, +116,163,179, 66, 11, 64, 74, 65, 65,193,200,153, 51,103,158,220,183,111,159,191,191,191,127,133,209,195,204,153, 51,101, 5, 5, + 5, 35,225,164,211, 61,151,203,221,184,105,211, 38,233,147, 39, 79, 80, 90, 90, 10,145, 72,100,107,124,234, 90, 62,187,119,239, +126,250,212,169, 83, 62, 74,165, 18, 70,163, 17, 34,145, 8, 44,203,130,162, 40,252,248,227,143,126,163, 71,143, 62,145,153,153, + 57,184,166,180,138, 68,162, 55, 44,194, 9,209,209,209,222,209,209,209, 3,128,106, 35,245,218, 16, 29, 29,237, 61,127,254,252, +215,117, 58,221,170, 26,158, 57, 75, 46,151, 7,139, 68, 34, 28, 60,120, 16, 18,137, 4, 98,177, 24,161,161,161,144,203,229, 16, +139,197, 96, 89, 22, 38,147,201,218, 88, 20, 59,242,224, 69, 69, 69, 26,154,166,189, 78,158, 60,137,226,226, 63,126,210,164, 73, + 19, 40, 20, 10,152,205,230, 82,103, 51, 51, 55, 55,183,128, 32,136,198,183,110,221,194,147, 39, 79, 48, 98,196, 8,252,252,243, +207,232,218,181,124,118,216, 96, 48,212, 37,136, 31, 67, 81, 20, 91, 67,185, 37, 0,248,184,146,211,210,121, 57,197,105, 54,155, +205, 86,145,101,255,215, 94,124,213,242, 63, 43, 84,231, 54, 65,146,109, 43,102, 15,153, 54,172,157, 63,116, 69,143, 33,244,244, + 7,225, 29,129,213,107, 79,224,206,163,242,247,181,122,207, 13,236,141, 25, 9,136,124, 17,233, 37, 67,176, 39,231,205,187,133, +207, 93,104,121,217,143, 19, 94,212,142,105,196,136, 17,144,203,229,144, 72, 36,174,240,207,185,172,211,233,210, 15, 31, 62,220, +101,212,168, 81,224,243,249, 72, 79, 79, 71, 98, 98, 98, 26,128,203,206, 10, 45, 46,151,139, 47,190,248, 2,239,189,247, 30,130, +130,130,176,104,209, 34,112, 56, 28,219, 65, 16,132,205,194,229, 12, 2,131,106, 94,248,104,117,136,175,205, 24,238,229,229,245, + 5, 73,146,227, 41, 7, 50,142, 97, 24,198,108, 54,239, 83, 42,149, 53,134,119,176, 58,174, 59,242, 46,236,243,160,150, 62,173, +222,156,207, 66,139,212, 5,149, 87, 27, 86, 99,209,178,174, 58,124,106, 43, 32,235, 83,198, 89, 76,118,113, 13,149, 80,130,164, +238,102,231,228,194,207, 71, 98, 17, 89,150,131, 36,209,177, 93,249, 96,246,120, 66, 26,194,154,181, 3,135,162,192,161, 40, 72, + 68, 2, 20,228,231,129,195, 33,239, 86,199,219,158,194, 91,111,181,106, 28,225,227,199,133, 44,192,128,144,160,106, 12, 3, 93, + 60, 17, 22,194,199,112, 63, 97,120,123, 10,111,213,108,125, 99,109, 66,203, 72,211,224,141, 29,107,155, 46, 76,138,142, 70, 84, +108, 44,152, 49, 99,160, 53, 26, 43,152,138,235, 42,180, 68, 34, 17,212,106, 53, 38, 77,154, 36, 55,153, 76,239,215, 49,139, 19, +139,139,139,199, 77,158, 60,185,216, 42, 96,140, 70, 35, 38, 79,158, 92, 92, 92, 92, 60,206, 1, 43,209, 83, 48,153, 76,239,119, +237,218, 85, 46,147,201,108,233,172, 75,131, 99,133,175,175,239,241,109,219,182,249,234,245,122,208, 52,109,227, 20,137, 68,160, + 40, 10, 1, 1, 1,216,187,119,111,128,175,175,111,141,123, 86,233,116,186,195,177,177,177, 10, 0,136,141,141, 85, 16, 4, 17, + 79, 16,196,102,130, 32, 54, 85, 58, 54, 19, 4, 17,111,127,175, 78,167, 59, 84, 19,183,193, 96,136, 79, 75, 75, 99,197, 98, 49, + 40,138,130,209,104,132, 80, 40,180,153,196, 85, 42, 21,116,186,242,105,238,196,196, 68,152, 76,166,139,142, 60,187, 90,173, 62, +183, 99,199, 14,115,147, 38, 77,208,174, 93, 59, 68, 69, 69,161,103,207,158, 8, 15, 15,199,151, 95,126,201,104,181, 90,167,235, + 94,110,110,238,241,159,126,250,201,212,184,113, 99,116,233,210, 5, 2,129, 0, 29, 59,118, 68,104,104, 40,150, 47, 95,110, 80, + 42,149, 39,235,240,154, 50,147,147,147,169, 26, 68,174, 20, 14,172,222,173,132,172,235,215,175, 83, 61,123,246, 60, 82,249, 66, +247,238,221,143, 72, 36, 18, 47,171,137,221,153, 17,185,189,184, 18, 8, 4,182,195,250, 61,135,195,113,100,244, 67,182, 9,146, +108,251,234,189, 65,211,134,181,243,193,145,115, 87,193, 51, 42, 0, 67, 13, 51,130,140, 9, 4,207, 3, 65, 94,220,176, 23,160, + 15,152, 7,224, 54,202,227, 48, 45,194,139, 5,155,227,123,113,113, 49,210,210,210,144,152,152,136,158, 61,123,226,226,197,139, +192, 31, 14,242, 78, 67,169, 84, 46,138,137,137,209, 90, 87,242, 45, 94,188, 88,167, 86,171, 23, 57,219, 6,179, 44, 11, 46,151, +139,200,200, 72,204,159, 63, 31, 39, 78,156, 64,122,122, 58, 76, 38,147, 77, 8, 89,125, 50,157,177,104,241,120, 60, 4, 5, 5, +193,100, 50,217,172, 89, 0,112,255,222, 61,112, 56, 28,152,205,102, 24, 12,134, 90, 45, 90, 94, 94, 94, 95,108,221,186,245, 3, +153, 76, 22, 82, 84, 84, 20,104,127, 20, 20, 20, 4,230,229,229, 5,230,228,228, 4,102,101,101, 5,102,100,100, 4, 62,126,252, + 56,100,229,202,149, 31,120,121,121,125,225, 72, 58, 41,138, 66,199,142, 29, 49,119,238, 92,219,177, 97,195, 6,219, 17, 23, 23, +231,180,243, 58, 69, 81,136, 92,178, 26, 35,139, 88,219,113, 34,128,176, 29,119,254, 57,171, 38,206, 6,215, 34,117,210, 47,150, +213,134,246, 27, 75, 87, 1,235,170, 67,107, 91,102,115,219,168,236, 12,223, 96,160, 13,101,231, 31, 61,184, 55, 40,178,125, 55, + 50, 95,166,169,176,252, 51,106,224, 56, 16, 4,129, 70,205,218,129,226,112, 64, 81, 36, 56, 20, 5,111,169, 16,105,183,110,153, +245, 58,221,249,170, 56, 7, 0, 28,190,136,191,225,157,225, 29,133,185,252, 66, 4,132,120,128,199, 45,215,142,236,163,113,149, +122, 8, 14,208,222, 19,211,115,252, 68,231, 11,202, 54,248,104,141, 71,226,171, 25, 1,154,205,102, 72, 4, 2,148,233,245,208, +209, 52, 6,174, 91,103,155, 46, 36, 9, 2, 55, 1,116, 88,183, 14,151, 14, 28,128,148,207, 7, 4, 2,135, 87,133, 84, 37,180, +100, 50, 25,166, 78,157, 90,156,151,151, 55,165, 46, 62, 90, 86,232,245,250, 11,249,249,249, 83,198,141, 27,183,251,224,193,131, +190,227,198,141,147,231,231,231, 79,113,208,239,233, 41,148,149,149, 29,200,202,202, 42,157, 58,117,234,174, 61,123,246,248,249, +251,251,219, 70, 34,117, 42,172, 4, 33, 27, 50,100,136,192,145,251,106,185, 37,198,226,220,254,158,197,178,213, 97,214,172, 89, +151, 80,238,127,101,143, 37, 91,182,108,153, 96, 55,197,184, 25,192,186,154,136, 85, 42,213,166,249,243,231,255,237,194,133, 11, +254, 66,161, 16, 4, 65,128,199,227,161, 69,139, 22,182, 85, 52, 92, 46, 23, 44,203,226,163,143, 62,146, 21, 22, 22,126,227,224, +187,153, 21, 19, 19,211,191,172,172,204,103,234,212,169,148, 80, 40, 68, 65, 65, 1,214,174, 93,203,108,223,190, 93,161,213,106, +167,213, 65, 8,239,248,215,191,254, 53, 80,163,209, 52,155, 57,115, 38, 79,169, 84, 66,167,211, 97,193,130, 5,134,239,191,255, + 62, 91,167,211, 57, 29,240,183, 87,175, 94, 15, 50, 50, 50,250,150,150,150,150,136,197,226,202,214, 62,194,195,195,163, 27,128, + 93,206,112, 70, 69, 69, 61,204,204,204,236,185,116,233,210,120,147,201,196,189,118,237,154,205, 25,126,253,250,245,113, 66,161, +112, 8,156,220,124,149, 32, 8,179, 64, 32,168, 96,193,170,252,153,195,225,212,218,166,181, 14, 22, 47,253,234,221,254,211, 94, +109,227,133,195,231,110, 32,230,208,163,187, 45,167, 5, 68,190,226, 83, 4,115, 81, 26,254,249, 78, 87,172,222,115, 3, 64,249, +212,161,185,240, 14,216,146,135, 96, 61, 27,227,246, 78,196,155, 0, 0, 10,184, 73, 68, 65, 84,177, 92,150,251, 2,244, 1,113, + 40, 15,153,241,162,161,130,200,186,115,231, 14, 6, 13, 26, 4, 0,184,120,241, 34,250,244,233,131,139, 23, 47,162,111,223,190, + 78,199,210,178,224, 87,149, 74,149, 17, 23, 23,215,182,113,227,198,184,124,249,242, 99, 0,191, 58,155, 72,171,208,226,112, 56, +120,251,237,183, 49,116,232, 80, 52,105,210,164,194,106, 67,235,103,103,196, 6, 77,211,104,223,190, 61,244, 6, 3,120, 60,158, +109,106,146,195,225, 32, 32, 48, 16, 15, 30, 60,112,200,162, 69,146,228,248, 55,222,120,131, 76, 73, 73,193,196,137, 19,177,123, +247,238,106,239,157, 60,121, 50,126,248,225, 7,188,241,198, 27,228, 39,159,124, 82, 99,120, 7,171, 19,186, 35,207,100,237,167, +107,107,247, 93,197,217,208, 90,164, 62,176, 11,237, 80,229,164, 73, 21,223,197, 86, 16, 90,118, 65,194, 26, 70,104,209,198,221, + 63,255,247,187,249, 61, 55,246, 13, 8, 9,244,130, 92,169,179,137,173,164,184,253, 0,128,183,102, 45, 3,135, 42,159, 82,148, + 74,132, 16,241, 40, 28,216,249,141,204,104, 44,171,178,116,169,185,228,123,159,244,110,225,197,247, 48, 65, 21,204,162, 93,192, + 31, 59,229, 16,205,246, 63, 45,184, 58,251,192,255, 78, 9,222,121, 69, 34,253, 38, 69,241, 30, 76,230, 13, 79,117,136, 10,133, + 78,113,235,150,104,196,214,173,184, 54,101, 10, 26, 49, 12,226, 67, 67,225,203,229,194, 75, 32, 0, 73, 16,208, 29, 59,134, 75, + 7, 15, 34, 72, 32, 0, 60, 61, 65,127,249, 37,244,105,105, 48,169,213,186, 58,140,204, 48, 97,194, 4,153, 76, 38, 27,103, 48, + 24, 46,212, 55,159,117, 58,221,169,172,172,172,247,122,245,234,181,209,100, 50,189,175,211,233,234,181, 50,202, 96, 48,156,202, +207,207, 31, 59, 97,194,132,253,135, 14, 29,242,247,246,246,174, 51, 87,113,113,113, 87, 23, 21, 39, 51,128, 79, 45,206,237,239, + 69, 71, 71,123, 95,191,126,253,111,219,182,109,219,104, 55,154, 8,156, 49, 99,198,187,149, 68, 86,173,171, 14, 1,100, 22, 22, + 22,126,249,225,135, 31, 46, 91,179,102,141,196,234,248,254,251,239,191,131,166,105,112,185, 92, 48, 12,131, 25, 51,102,104,138, +139,139, 87,163,250,136,206, 79, 21, 45,149, 74,213, 98,233,210,165,219,214,173, 91, 55,148,162, 40, 15,134, 97,180,165,165,165, +241,101,101,101,211, 80,183, 56, 90,230,162,162,162,169,159,125,246,217,212,181,107,215,190, 65,146,100, 32, 77,211, 50,181, 90, +125, 84,167,211,125,143, 58, 76, 37, 93,190,124,185,232,157,119,222,121, 84, 84, 84,212, 58, 44, 44, 76, 41,145, 72, 12, 6,131, +129, 18,137, 68, 82, 15, 15,143, 40, 0,151, 9,130, 72,117,134, 51, 41, 41, 41,127,230,204,153, 79,244,122,125,228,230,205,155, + 19,164, 82,233, 57,130, 32, 8, 30,143,231, 35, 18,137, 6, 1,136, 39, 8,226,190, 51,156, 36, 73,154,237,173, 87,149,253,179, +248,124,190, 67, 62, 90,205, 2,196,211,135,182,224,224,240,249, 27,136, 57,156,185,131, 97,217,131, 7,147, 74,142, 45,234, 3, + 24,247,189,131,142,227,118,149, 79, 23, 2, 48, 23,222,129,113,223,100, 16, 98,127, 36,228,112,161,212, 25,143,195,141,170, 96, + 11,239, 32,147,201,144,146,146, 98, 21, 89, 81, 0,208,183,111,223, 36,171,216, 74, 76, 76, 68,151, 46, 93,146, 0,112,157, 45, +175, 42,149,234,195, 73,147, 38,157,178, 12,142, 63,172,195,192,207, 38,180,172,130,170, 73,147, 38,182,115,251,195,206, 71,203, + 33, 48, 12, 3, 30,143, 7, 14,135,131,144,208, 80,219,255, 98, 89, 22, 15, 30, 60,128, 92, 46,119, 72,104, 81, 20, 69, 17, 4, +129,137, 19, 29, 91,144,252,215,191,254, 21,241,241,241,160, 28, 84,133, 20, 69, 33, 34, 34,162,214,123,172,186,212, 81,206,176, +176,176, 58,115, 54,180, 22,169,171,192,170,234,115, 85,162,170,186, 10,241,172,144,171,209, 40, 63,221,185,117,253,154, 25,179, + 63,146,220,121, 88, 0,165, 70, 15,138, 34,237, 27, 79,112, 56, 20,164, 30, 66, 52, 14,246,194,158,255,252, 91,173, 86, 41, 62, + 67, 53,251, 30, 54,241,228,205, 26,210,237, 21, 1, 47, 68,139,200, 14, 19, 64, 9,255, 16, 1,108,126, 53,179,131,125,126,193, +107,153, 90,225,207,153,218, 89, 55, 75, 12, 79, 11, 45,131, 97,216,226,225,195, 79,199,156, 56, 33,238,190, 99, 7, 30,206,152, +129, 80,157, 14, 2,203, 84, 34, 73, 16,144,240,120,144,240,120,229, 34,107,237, 90,232,104, 26,235,166, 76, 41,213, 27, 12,195, +157,169,228,197,197,197, 24, 51,102, 76, 81,110,110,238, 72,212, 97,106,175, 58,104,181,218, 3, 0, 14,184,138, 79,175,215, 95, +200,206,206,126,109,204,152, 49, 39, 78,157, 58, 21,240,130, 4,153,179,138, 45,227,245,235,215,223, 77, 72, 72,120,136,138, 27, +139, 42, 18, 18, 18, 30,206,156, 57,147,216,182,109,219,247, 0,254, 5, 7, 3,120,106,181,218,245,103,206,156, 65,255,254,253, +255,181, 98,197, 10,191,174, 93,187, 34, 48, 48, 16,106,181, 26,137,137,137,152, 55,111,158, 92,165, 82,173, 80, 40, 20,107,156, + 76,179, 81,175,215, 79,182, 95, 74,237,138,124,208,235,245,219,243,242,242,182,187,138,112,206,156, 57,191, 63,120,240,160, 56, + 32, 32,160, 7,143,199,235,128,114, 63,160,124, 0,223, 59, 43,136,172,152, 61,123,246,173, 7, 15, 30,200, 26, 53,106,212,211, +194,233,141,242,109,140,182,214,129, 51,247,198,141, 27, 97,221,186,117, 35,185, 92, 46, 75, 81, 20,184, 92, 46,203,225,112, 88, +139, 95, 13, 11, 0, 71,143, 30, 21, 0,168,113,219,156,135,133,186,165,147,255,253,219, 39,169,249,101, 7,211, 10, 74,231, 3, + 96,247,221, 17,255,210, 49,128, 26, 54,172, 85, 54,244,177,125, 65, 72,203, 3, 85,178,154, 60, 16, 30, 65,200, 54, 55,194,146, + 35,119,243,105, 16,171,220,154,170,234,113, 53, 44,225, 29,242,242,242,236, 69,150,213,106, 21,213,183,111,223, 36,139,200,178, + 94,171,139,127,217, 89,179,217, 92,175, 62,140,101, 89,196,196,196, 96,203,150, 45,168, 45,162,185,101,117, 31, 81, 27,159,213, +162,197, 48, 12,140, 70, 35,238,220,185, 99,139,217,101,157, 46,180,134,118,160,105,186,198,213,234, 12,195, 48, 6,131, 1, 63, +254,248,163, 67, 98,107,239,222,189, 40, 43, 43, 3, 83,139,130,179, 15,197,208,169, 83, 39,200,229,114,219, 98,159,168,168, 63, + 66,229, 25,141, 70,167,132,171,149, 51, 50, 50, 18, 50,153, 12, 86,127,225,198, 83,254, 48,246,208, 90,237,159,181,220, 87,107, +209,122,230, 61,166, 64, 44, 61,213,181,247,208, 62, 83,222,157,231,161,209, 51,120,242, 36, 3, 69,133,121, 32, 9, 18, 33,141, +194, 16, 30, 30, 1, 17,159,196,238,216, 53,218,164, 75,231,126,211,168, 75, 70, 84,199, 53,202,139,119,105,237,216, 62, 61,155, + 55,247, 36, 64,155, 0,198, 4,208, 38,192,108,249,107,253,206, 92,177,204,165,164, 40,216, 79,110,202,175, 28, 87, 26,171,220, +179,106, 28,208,199,219,215,247,244,146,163, 71,197,102,163, 17,197, 31,126, 8, 49, 77, 67,104, 25,149,148, 63,136, 0,244,151, + 95,150,139,172,201,147, 75,149, 10,133, 83, 91,240,248,251,251,223, 32, 8,194,191,168,168,232,165,138, 12, 31, 16, 16,112,156, +101, 89,153, 76, 38,235,250, 2,165, 43, 16,128, 2,128,177,138,129, 68, 0,156,247,255,177, 34, 34, 32, 32,224, 19,146, 36,123, +177, 44,235, 71,146,100,137,217,108,190, 92, 88, 88,184, 18,192, 3,119,127,250,220, 96,141, 12,223,180,150,251, 10, 1,252, 3, +229, 78,193, 79, 28, 37,239,232,229,229,165,231,155, 14,253,165,157, 96,224,248, 40, 47, 52, 11,246, 4,151, 39, 68,174,138,198, +217, 84, 21,182,198,229,103,233, 76,204,232,123, 69,165,201,238, 87, 81, 35, 92,190, 5,143, 43,225,235,235,123,245,244,233,211, + 93,155, 53,107, 70,218, 59,188, 91, 99,229, 89,167,183, 56,156,114, 45,119,225,194, 5,122,226,196,137,151, 11, 10, 10,250, 87, +199,233,233,233,249,203,237,219,183, 95, 85, 42,149, 79, 9, 42,251, 72,241,214,115,173, 86,139,217,179,103,159,169,110, 11, 30, + 47, 47,175,181,107,214,172,249,224,173,183,222, 34,173,225, 40,236, 15,235,118, 65,214,195,104, 52, 98,215,174, 93,230,111,190, +249,230, 91,165, 82, 89,237,212, 97, 72, 72, 72, 86,110,110,110,152, 53,212,130, 35, 65, 69, 35, 34, 34,242, 50, 50, 50, 66,159, + 37,231, 75, 44,184, 42, 88,183,158,139,105,130, 43, 18,205,241,148,248,124,254,214,164,185,126, 17,205, 91, 18, 65, 33,141, 64, +128, 68, 65,126, 14, 50, 30,221, 99, 15,253,247,187, 98,173, 74,254,133, 78,167,253,174, 38,158, 54, 64,243,166, 82,222, 62, 62, +131, 86,176, 10,160, 74,251, 83, 61, 53,226, 0, 96,228,146,119,159,168, 77, 19, 82,107,152,246,177,138,173, 79, 15, 29, 18,243, + 91,181,122, 42, 80,156,217,108,134, 62, 45, 13,235,166, 76,113, 90,100,185,225,134, 27, 46, 65, 51,212, 30, 35,203,132,242,248, + 92,206, 90, 76,136,200, 64,143, 9, 44, 48,158,132,185, 61, 73, 16,124,154, 69, 58, 88,252, 34,230,148,110, 76,202,131,206,157, +253, 14,225,133,221, 84, 26,128,135,175,175,239, 57,138,162,194,173, 22, 25,123,107,125, 21, 27, 74, 63, 41, 40, 40, 24, 2,160, +166, 21,194,205, 61, 61, 61,191, 99, 24,166,187, 35,155, 74, 83, 20,117, 77,173, 86,207, 65, 13,155, 74, 55,196,170, 67, 63, 63, +191, 7, 25, 25, 25,205,173,171,168,237,251,202,170, 86,150,223,191,127, 31, 3, 6, 12,200,200,207,207,143,120,150,156, 47, 42, +170, 89,117,248,226, 88,180,236, 16,202, 19, 72,166,242, 69,194,193,102, 19, 29, 9, 2,224,112,185,119, 13,101,186,243,122,157, +102, 39,170,153, 46,124,150, 24, 7,244, 17,240,249,191,240,164, 82, 81, 85,162,205,164, 86,235,244, 6,195, 48,183,200,114,195, + 13, 55,220,112,227, 37, 66, 43, 95, 95,223,211, 92, 46, 87, 96, 47, 38, 43,127,182,130,166,233,178,162,162,162, 17, 0,210,159, + 49,231,255, 38,156,116, 82, 27,234, 40,167,229, 24,240,162,115, 54,224,179,179, 46,228, 28, 96,225, 92,242,146,164,115,192,139, +202,105,125, 94, 39,120,135, 58, 83,142, 92,149,159,118,233,100, 93,157,206,134,226,116, 85, 61,170, 34,157,108, 3,188,247, 37, + 47, 73, 58, 7,188,104,156,149,203,143,131,188, 78,113, 58, 88,166,156, 77, 39,235,234,116, 54, 20,103,125,235, 81, 13,233,100, +235, 91,150,170,121,247, 75,240, 18, 34,165, 51,216,148,206, 96,239,116,169, 50,110, 99,116,117,191,115,202,145,176,161, 86, 2, + 88,195,238, 91,248,137, 23,149,211, 62, 31, 92,185, 85, 64, 3,108, 59, 16,231,106,206, 74,249,233, 42, 44,177,172, 48,137,135, + 3, 1, 71,157,121,118, 87,188,247, 74,207,234, 18,222, 58,136, 44,167, 56, 93, 85,238, 27,154,211, 85,117,169, 50,167, 43,202, +125, 85,239,189, 1,223,145,171,210,233,146,186,212, 16,101,190,138,242, 83,111,222,202,156,174,168, 75,149, 57, 93, 81,238,159, + 5,167, 43,234, 82, 85,156,174, 40,247,213,189,251,151,213,208,100,157, 46,180,132,120, 32, 28, 16, 91,177, 0, 64,214, 37,211, + 26,208, 82, 54,208,213,156,174, 78,115, 67,136, 77, 39, 44, 48,207,157,211,197,239,104,137,133,211,149,163,155,129,174,122, 71, + 13, 81,222,237, 57, 93,197, 95,153,199, 21,239,169, 42,206,250,166,183,154,116,186,252,217,235, 91,238,159, 21,167,139,223,145, + 75,234, 82, 37,206,129, 46, 30, 12, 12,180, 59, 95,226, 74, 78, 87,213,165, 42,210, 89,239,247, 84, 21,103,125,211, 91, 77, 58, + 93,254,236,174,232, 67, 26,138,247,121, 90,180, 88,178,218, 50, 17, 91,233,120, 38, 66,227,185, 77,201, 57,201,253,167,226,116, +114,122,102,104, 3,188,251,231,154, 78, 87,114, 86, 78,163, 43,167,123, 26, 50,157,174,228,116, 34,173,127, 58,206,151,237,189, +191,136,249, 89, 29, 95,125,166,165,170,179,142, 54, 68, 58, 93,201,233, 32,247,159,130,179, 30,239,254, 79, 7,206,139,146, 16, +107,198,187,120,100, 2, 23, 91, 96, 26,236,185, 93,156,206,129, 13, 97, 33,108, 0,184, 60,157,150,145,242,231, 13,240,236, 47, + 75,158,186,235,146,187, 46,189,112,117,169, 82,153, 28,232, 66, 75,145, 75, 45,207,149, 57, 93,241, 63,236, 57, 92, 85, 70, 27, +250,217, 93, 89,151, 26,226,221,191,108,248,127,192,195,143, 90, 43, 71,167,194, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, 0}; diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index cdc4c492d56..ef7b8ed3a41 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -592,8 +592,8 @@ DEF_ICON(MOD_DYNAMICPAINT) DEF_ICON(MOD_REMESH) DEF_ICON(MOD_OCEAN) DEF_ICON(MOD_WARP) +DEF_ICON(MOD_SKIN) #ifndef DEF_ICON_BLANK_SKIP - DEF_ICON(BLANK165) DEF_ICON(BLANK166) DEF_ICON(BLANK167) DEF_ICON(BLANK168) From 39f2f997943430249a3cb753cb7c2bebfa1ed0f7 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Tue, 22 May 2012 15:19:19 +0000 Subject: [PATCH 107/159] fix for bmesh api example worth noticing is that the example in bpy.types.Mesh is wrong too (Mesh type does not have an uv element) but I would prefer someone more familiar with bmesh to take a look at those --- doc/python_api/rst/include__bmesh.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/python_api/rst/include__bmesh.rst b/doc/python_api/rst/include__bmesh.rst index 212ab4e4708..f3d3b0257be 100644 --- a/doc/python_api/rst/include__bmesh.rst +++ b/doc/python_api/rst/include__bmesh.rst @@ -99,8 +99,8 @@ Here are some examples ... uv_lay = bm.loops.layers.uv.active for face in bm.faces: - for loop in f.loops: - uv = loop[uv_lay] + for loop in face.loops: + uv = loop[uv_lay].uv print("Loop UV: %f, %f" % (uv.x, uv.y)) From 5e22802fae30feb9fe0dc5f1ee5ddd565f3d1c4d Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:19:33 +0000 Subject: [PATCH 108/159] Add new BMesh length query functions. BMEdge *BM_face_find_shortest_edge(BMFace *f); BMEdge *BM_face_find_longest_edge(BMFace *f); Reviewed by Campbell Barton. --- source/blender/bmesh/intern/bmesh_queries.c | 43 +++++++++++++++++++++ source/blender/bmesh/intern/bmesh_queries.h | 3 ++ 2 files changed, 46 insertions(+) diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index f61f9666d6d..549cc44c338 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -951,6 +951,49 @@ float BM_vert_calc_mean_tagged_edge_length(BMVert *v) } +/** + * Returns the shortest edge in f. + */ +BMEdge *BM_face_find_shortest_edge(BMFace *f) +{ + BMIter iter; + BMEdge *shortest_edge = NULL, *e; + float shortest_len = FLT_MAX; + + BM_ITER_ELEM(e, &iter, f, BM_EDGES_OF_FACE) { + float len = BM_edge_calc_length(e); + + if (len <= shortest_len) { + shortest_edge = e; + shortest_len = len; + } + } + + return shortest_edge; +} + +/** + * Returns the longest edge in f. + */ +BMEdge *BM_face_find_longest_edge(BMFace *f) +{ + BMIter iter; + BMEdge *longest_edge = NULL, *e; + float longest_len = 0; + + BM_ITER_ELEM(e, &iter, f, BM_EDGES_OF_FACE) { + float len = BM_edge_calc_length(e); + + if (len >= longest_len) { + longest_edge = e; + longest_len = len; + } + } + + return longest_edge; +} + + /** * Returns the edge existing between v1 and v2, or NULL if there isn't one. * diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 08e15884b3f..9712c0066b7 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -67,6 +67,9 @@ float BM_vert_calc_edge_angle(BMVert *v); float BM_vert_calc_shell_factor(BMVert *v); float BM_vert_calc_mean_tagged_edge_length(BMVert *v); +BMEdge *BM_face_find_shortest_edge(BMFace *f); +BMEdge *BM_face_find_longest_edge(BMFace *f); + BMEdge *BM_edge_exists(BMVert *v1, BMVert *v2); int BM_face_exists_overlap(BMesh *bm, BMVert **varr, int len, BMFace **r_existface); From f7b116e0bdedf68631cbc20eb99e2fb22b4325fa Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:28:44 +0000 Subject: [PATCH 109/159] Add Mesh equivalent to BM_edge_other_vert(). /* Return the index of the edge vert that is not equal to 'v'. If * neither edge vertex is equal to 'v', returns -1. */ int BKE_mesh_edge_other_vert(const struct MEdge *e, int v); --- source/blender/blenkernel/BKE_mesh.h | 4 ++++ source/blender/blenkernel/intern/mesh.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index c168c39fd9f..7abec074647 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -111,6 +111,10 @@ int poly_find_loop_from_vert(const struct MPoly *poly, int poly_get_adj_loops_from_vert(unsigned adj_r[3], const struct MPoly *poly, const struct MLoop *mloop, unsigned vert); +/* Return the index of the edge vert that is not equal to 'v'. If + * neither edge vertex is equal to 'v', returns -1. */ +int BKE_mesh_edge_other_vert(const struct MEdge *e, int v); + /* update the hide flag for edges and polys from the corresponding * flag in verts */ void BKE_mesh_flush_hidden_from_verts(const struct MVert *mvert, diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index a89cb042884..9eb74986b29 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2996,6 +2996,18 @@ int poly_get_adj_loops_from_vert(unsigned adj_r[3], const MPoly *poly, return corner; } +/* Return the index of the edge vert that is not equal to 'v'. If + * neither edge vertex is equal to 'v', returns -1. */ +int BKE_mesh_edge_other_vert(const MEdge *e, int v) +{ + if (e->v1 == v) + return e->v2; + else if (e->v2 == v) + return e->v1; + else + return -1; +} + /* update the hide flag for edges and faces from the corresponding * flag in verts */ void BKE_mesh_flush_hidden_from_verts(const MVert *mvert, From 8801330c18b063e341e8263131c91695cd1b7bdf Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:29:01 +0000 Subject: [PATCH 110/159] Add skin modifier: DNA, RNA, UI, and MOD_skin.c implementation. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier Implementation based in part off the paper "B-Mesh: A Fast Modeling System for Base Meshes of 3D Articulated Shapes" (Zhongping Ji, Ligang Liu, Yigang Wang) Note that to avoid confusion with Blender's BMesh data structure, this tool is renamed as the Skin modifier. The B-Mesh paper is current available here: http://www.math.zju.edu.cn/ligangliu/CAGD/Projects/BMesh/ The main missing features in this code compared to the paper are: * No mesh evolution. The paper suggests iteratively subsurfing the skin output and adapting the output to better conform with the spheres of influence surrounding each vertex. * No mesh fairing. The paper suggests re-aligning output edges to follow principal mesh curvatures. * No auxiliary balls. These would serve to influence mesh evolution, which as noted above is not implemented. The code also adds some features not present in the paper: * Loops in the input edge graph. * Concave surfaces around branch nodes. The paper does not discuss how to handle non-convex regions; this code adds a number of cleanup operations to handle many (though not all) of these cases. --- .../startup/bl_ui/properties_data_modifier.py | 24 + source/blender/makesdna/DNA_modifier_types.h | 27 + source/blender/makesrna/RNA_access.h | 1 + source/blender/makesrna/intern/rna_modifier.c | 40 + source/blender/modifiers/CMakeLists.txt | 1 + source/blender/modifiers/MOD_modifiertypes.h | 1 + source/blender/modifiers/intern/MOD_skin.c | 1854 +++++++++++++++++ source/blender/modifiers/intern/MOD_util.c | 1 + 8 files changed, 1949 insertions(+) create mode 100644 source/blender/modifiers/intern/MOD_skin.c diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 218585c320f..72429743c93 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -959,5 +959,29 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.separator() self.vertex_weight_mask(layout, ob, md) + def SKIN(self, layout, ob, md): + layout.operator("object.skin_armature_create", text="Create Armature") + + layout.separator() + layout.prop(md, "branch_smoothing") + layout.prop(md, "use_smooth_shade") + + layout.label(text="Selected Vertices:") + split = layout.split() + + col = split.column(align=True) + col.operator("object.skin_loose_mark_clear", text="Mark Loose").action = "MARK" + col.operator("object.skin_loose_mark_clear", text="Clear Loose").action = "CLEAR" + + col = split.column() + col.operator("object.skin_root_mark", text="Mark Root") + col.operator("object.skin_radii_equalize", text="Equalize Radii") + + layout.label(text="Symmetry Axes:") + col = layout.column() + col.prop(md, "use_x_symmetry") + col.prop(md, "use_y_symmetry") + col.prop(md, "use_z_symmetry") + if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 971ce613edc..a5a540ff6b4 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -77,6 +77,7 @@ typedef enum ModifierType { eModifierType_Ocean, eModifierType_DynamicPaint, eModifierType_Remesh, + eModifierType_Skin, NUM_MODIFIER_TYPES } ModifierType; @@ -1065,4 +1066,30 @@ typedef struct RemeshModifierData { char pad; } RemeshModifierData; +/* Skin modifier */ + +typedef struct SkinModifierData { + ModifierData modifier; + + float branch_smoothing; + + char flag; + + char symmetry_axes; + + char pad[2]; +} SkinModifierData; + +/* SkinModifierData.symmetry_axes */ +enum { + MOD_SKIN_SYMM_X = 1, + MOD_SKIN_SYMM_Y = 2, + MOD_SKIN_SYMM_Z = 4, +}; + +/* SkinModifierData.flag */ +enum { + MOD_SKIN_SMOOTH_SHADING = 1 +}; + #endif diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 1f3529d2f65..5ecbc1fea7d 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -466,6 +466,7 @@ extern StructRNA RNA_ShapeKeyPoint; extern StructRNA RNA_ShrinkwrapConstraint; extern StructRNA RNA_ShrinkwrapModifier; extern StructRNA RNA_SimpleDeformModifier; +extern StructRNA RNA_SkinModifier; extern StructRNA RNA_SmokeCollSettings; extern StructRNA RNA_SmokeDomainSettings; extern StructRNA RNA_SmokeFlowSettings; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 4a7050b47e9..659c04015df 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -75,6 +75,7 @@ EnumPropertyItem modifier_type_items[] = { {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""}, {eModifierType_Remesh, "REMESH", ICON_MOD_REMESH, "Remesh", ""}, {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""}, + {eModifierType_Skin, "SKIN", ICON_MOD_SKIN, "Skin", ""}, {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {0, "", 0, N_("Deform"), ""}, @@ -207,6 +208,8 @@ static StructRNA *rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_DynamicPaintModifier; case eModifierType_Remesh: return &RNA_RemeshModifier; + case eModifierType_Skin: + return &RNA_SkinModifier; default: return &RNA_Modifier; } @@ -3196,6 +3199,42 @@ static void rna_def_modifier_ocean(BlenderRNA *brna) /* XXX how to update? */ } +static void rna_def_modifier_skin(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "SkinModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Skin Modifier", "Generate Skin"); + RNA_def_struct_sdna(srna, "SkinModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_SKIN); + + prop = RNA_def_property(srna, "branch_smoothing", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_text(prop, "Branch Smoothing", "Smooth complex geometry around branches"); + RNA_def_property_ui_range(prop, 0, 1, 1, 0); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "use_smooth_shade", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SKIN_SMOOTH_SHADING); + RNA_def_property_ui_text(prop, "Smooth Shading", "Output faces with smooth shading rather than flat shaded"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "use_x_symmetry", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "symmetry_axes", MOD_SKIN_SYMM_X); + RNA_def_property_ui_text(prop, "X", "Avoid making unsymmetric quads across the X axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "use_y_symmetry", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "symmetry_axes", MOD_SKIN_SYMM_Y); + RNA_def_property_ui_text(prop, "Y", "Avoid making unsymmetric quads across the Y axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "use_z_symmetry", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "symmetry_axes", MOD_SKIN_SYMM_Z); + RNA_def_property_ui_text(prop, "Z", "Avoid making unsymmetric quads across the Z axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); +} + void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -3301,6 +3340,7 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_dynamic_paint(brna); rna_def_modifier_ocean(brna); rna_def_modifier_remesh(brna); + rna_def_modifier_skin(brna); } #endif diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index 90ae423f8a3..83e7ea81ca5 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -77,6 +77,7 @@ set(SRC intern/MOD_shapekey.c intern/MOD_shrinkwrap.c intern/MOD_simpledeform.c + intern/MOD_skin.c intern/MOD_smoke.c intern/MOD_smooth.c intern/MOD_softbody.c diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index ea5574a378e..bf411c3b2fc 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -74,6 +74,7 @@ extern ModifierTypeInfo modifierType_WeightVGMix; extern ModifierTypeInfo modifierType_WeightVGProximity; extern ModifierTypeInfo modifierType_DynamicPaint; extern ModifierTypeInfo modifierType_Remesh; +extern ModifierTypeInfo modifierType_Skin; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[]); diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c new file mode 100644 index 00000000000..ed227284e0a --- /dev/null +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -0,0 +1,1854 @@ +/* + * ***** 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): Nicholas Bishop + * + * ***** END GPL LICENSE BLOCK ***** + * + */ + +/** \file blender/modifiers/intern/MOD_skin.c + * \ingroup modifiers + */ + +/* Implementation based in part off the paper "B-Mesh: A Fast Modeling + * System for Base Meshes of 3D Articulated Shapes" (Zhongping Ji, + * Ligang Liu, Yigang Wang) + * + * Note that to avoid confusion with Blender's BMesh data structure, + * this tool is renamed as the Skin modifier. + * + * The B-Mesh paper is current available here: + * http://www.math.zju.edu.cn/ligangliu/CAGD/Projects/BMesh/ + * + * The main missing features in this code compared to the paper are: + * + * + No mesh evolution. The paper suggests iteratively subsurfing the + * skin output and adapting the output to better conform with the + * spheres of influence surrounding each vertex. + * + * + No mesh fairing. The paper suggests re-aligning output edges to + * follow principal mesh curvatures. + * + * + No auxiliary balls. These would serve to influence mesh + * evolution, which as noted above is not implemented. + * + * The code also adds some features not present in the paper: + * + * + Loops in the input edge graph. + * + * + Concave surfaces around branch nodes. The paper does not discuss + * how to handle non-convex regions; this code adds a number of + * cleanup operations to handle many (though not all) of these + * cases. + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_modifier_types.h" + +#include "BLI_utildefines.h" +#include "BLI_array.h" +#include "BLI_heap.h" +#include "BLI_listbase.h" +#include "BLI_math.h" +#include "BLI_string.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_deform.h" +#include "BKE_DerivedMesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_tessmesh.h" + +#include "MOD_util.h" + +typedef struct { + float mat[3][3]; + /* Vert that edge is pointing away from, no relation to + MEdge.v1 */ + int origin; +} EMat; + +typedef enum { + CAP_START = 1, + CAP_END = 2, + SEAM_FRAME = 4, +} SkinNodeFlag; + +typedef struct Frame { + /* Index in the MVert array */ + BMVert *verts[4]; + /* Location of each corner */ + float co[4][3]; + /* Indicates which corners have been merged with another + * frame's corner (so they share an MVert index) */ + struct { + /* Merge to target frame/corner (no merge if frame is null) */ + struct Frame *frame; + int corner; + } merge[4]; + + /* For hull frames, whether each vertex is detached or not */ + int inside_hull[4]; + /* Whether any part of the frame (corner or edge) is detached */ + int detached; +} Frame; + +#define MAX_SKIN_NODE_FRAMES 2 +typedef struct { + Frame frames[MAX_SKIN_NODE_FRAMES]; + int totframe; + + SkinNodeFlag flag; + + /* Used for hulling a loop seam */ + int seam_edges[2]; +} SkinNode; + +typedef struct { + BMesh *bm; + SkinModifierData *smd; + int mat_nr; +} SkinOutput; + +static void add_poly(SkinOutput *so, + BMVert *v1, + BMVert *v2, + BMVert *v3, + BMVert *v4); + +/***************************** Convex Hull ****************************/ + +static int is_quad_symmetric(BMVert *quad[4], + const SkinModifierData *smd) +{ + const float threshold = 0.0001; + int axis; + + for (axis = 0; axis < 3; axis++) { + if (smd->symmetry_axes & (1 << axis)) { + float a[3]; + + copy_v3_v3(a, quad[0]->co); + a[axis] = -a[axis]; + + if (len_v3v3(a, quad[1]->co) < threshold) { + copy_v3_v3(a, quad[2]->co); + a[axis] = -a[axis]; + if (len_v3v3(a, quad[3]->co) < threshold) + return 1; + } + else if (len_v3v3(a, quad[3]->co) < threshold) { + copy_v3_v3(a, quad[2]->co); + a[axis] = -a[axis]; + if (len_v3v3(a, quad[1]->co) < threshold) + return 1; + } + } + } + + return 0; +} + +/* Returns true if the quad crosses the plane of symmetry, false otherwise */ +static int quad_crosses_symmetry_plane(BMVert *quad[4], + const SkinModifierData *smd) +{ + int axis; + + for (axis = 0; axis < 3; axis++) { + if (smd->symmetry_axes & (1 << axis)) { + int i, left = 0, right = 0; + + for (i = 0; i < 4; i++) { + if (quad[i]->co[axis] < 0) + left = 1; + else if (quad[i]->co[axis] > 0) + right = 1; + + if (left && right) + return TRUE; + } + } + } + + return FALSE; +} + +/* Returns true if the frame is filled by precisely two faces (and + * outputs those faces to fill_faces), otherwise returns false. */ +static int skin_frame_find_contained_faces(const Frame *frame, + BMFace *fill_faces[2]) +{ + BMEdge *diag; + + /* See if the frame is bisected by a diagonal edge */ + diag = BM_edge_exists(frame->verts[0], frame->verts[2]); + if (!diag) + diag = BM_edge_exists(frame->verts[1], frame->verts[3]); + + if (diag) + return BM_edge_face_pair(diag, &fill_faces[0], &fill_faces[1]); + else + return FALSE; +} + +/* Returns TRUE if hull is successfully built, FALSE otherwise */ +static int build_hull(SkinOutput *so, Frame **frames, int totframe) +{ + BMesh *bm = so->bm; + BMOperator op; + BMIter iter; + BMOIter oiter; + BMVert *v; + BMFace *f; + BMEdge *e; + int i, j; + + BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, FALSE); + + for (i = 0; i < totframe; i++) { + for (j = 0; j < 4; j++) { + BM_elem_flag_enable(frames[i]->verts[j], BM_ELEM_TAG); + } + } + + /* Deselect all faces so that only new hull output faces are + * selected after the operator is run */ + BM_mesh_elem_hflag_disable_all(bm, BM_ALL, BM_ELEM_SELECT, 0); + + BMO_op_initf(bm, &op, "convex_hull input=%hv", BM_ELEM_TAG); + BMO_op_exec(bm, &op); + + if (BMO_error_occurred(bm)) { + BMO_op_finish(bm, &op); + return FALSE; + } + + /* Apply face attributes to hull output */ + BMO_ITER (f, &oiter, bm, &op, "geomout", BM_FACE) { + if (so->smd->flag & MOD_SKIN_SMOOTH_SHADING) + BM_elem_flag_enable(f, BM_ELEM_SMOOTH); + f->mat_nr = so->mat_nr; + } + + /* Mark interior frames */ + BMO_ITER (v, &oiter, bm, &op, "interior_geom", BM_VERT) { + for (i = 0; i < totframe; i++) { + Frame *frame = frames[i]; + + if (!frame->detached) { + for (j = 0; j < 4; j++) { + if (frame->verts[j] == v) { + frame->inside_hull[j] = TRUE; + frame->detached = TRUE; + break; + } + } + } + } + } + + /* Also mark frames as interior if an edge is not in the hull */ + for (i = 0; i < totframe; i++) { + Frame *frame = frames[i]; + + if (!frame->detached && + (!BM_edge_exists(frame->verts[0], frame->verts[1]) || + !BM_edge_exists(frame->verts[1], frame->verts[2]) || + !BM_edge_exists(frame->verts[2], frame->verts[3]) || + !BM_edge_exists(frame->verts[3], frame->verts[0]))) + { + frame->detached = TRUE; + } + } + + /* Remove triangles that would fill the original frames -- skip if + * frame is partially detached */ + BM_mesh_elem_hflag_disable_all(bm, BM_ALL, BM_ELEM_TAG, FALSE); + for (i = 0; i < totframe; i++) { + Frame *frame = frames[i]; + if (!frame->detached) { + BMFace *fill_faces[2]; + + /* Check if the frame is filled by precisely two + * triangles. If so, delete the triangles and their shared + * edge. Otherwise, give up and mark the frame as + * detached. */ + if (skin_frame_find_contained_faces(frame, fill_faces)) { + BM_elem_flag_enable(fill_faces[0], BM_ELEM_TAG); + BM_elem_flag_enable(fill_faces[1], BM_ELEM_TAG); + } + else + frame->detached = TRUE; + } + } + + /* Check if removing triangles above will create wire triangles, + * mark them too */ + BMO_ITER (e, &oiter, bm, &op, "geomout", BM_EDGE) { + int is_wire = TRUE; + BM_ITER_ELEM (f, &iter, e, BM_FACES_OF_EDGE) { + if (!BM_elem_flag_test(f, BM_ELEM_TAG)) { + is_wire = FALSE; + break; + } + } + if (is_wire) + BM_elem_flag_enable(e, BM_ELEM_TAG); + } + + BMO_op_finish(bm, &op); + + BMO_op_callf(bm, "del geom=%hef context=%i", BM_ELEM_TAG, DEL_ONLYTAGGED); + + return TRUE; +} + +/* Returns the average frame side length (frames are rectangular, so + * just the average of two adjacent edge lengths) */ +static float frame_len(const Frame *frame) +{ + return (len_v3v3(frame->co[0], frame->co[1]) + + len_v3v3(frame->co[1], frame->co[2])) * 0.5f; +} + +static void merge_frame_corners(Frame **frames, int totframe) +{ + float dist, side_a, side_b, thresh, mid[3]; + int i, j, k, l; + + for (i = 0; i < totframe; i++) { + side_a = frame_len(frames[i]); + + /* For each corner of each frame... */ + for (j = 0; j < 4; j++) { + + /* Ensure the merge target is not itself a merge target */ + if (frames[i]->merge[j].frame) + continue; + + for (k = i + 1; k < totframe; k++) { + BLI_assert(frames[i] != frames[k]); + + side_b = frame_len(frames[k]); + thresh = MIN2(side_a, side_b) / 2.0f; + + /* Compare with each corner of all other frames... */ + for (l = 0; l < 4; l++) { + if (frames[k]->merge[l].frame) + continue; + + /* Some additional concerns that could be checked + * further: + * + * + Vertex coords are being used for the + * edge-length test, but are also being + * modified, might cause symmetry problems. + * + * + A frame could be merged diagonally across + * another, would generate a weird (bad) T + * junction + */ + + /* Check if corners are near each other, where + * 'near' is based in the frames' minimum side + * length */ + dist = len_v3v3(frames[i]->co[j], + frames[k]->co[l]); + if (dist < thresh) { + mid_v3_v3v3(mid, + frames[i]->co[j], + frames[k]->co[l]); + + copy_v3_v3(frames[i]->co[j], mid); + copy_v3_v3(frames[k]->co[l], mid); + + frames[k]->merge[l].frame = frames[i]; + frames[k]->merge[l].corner = j; + + /* Can't merge another corner into the same + * frame corner, so move on to frame k+1 */ + break; + } + } + } + } + } +} + +static Frame **collect_hull_frames(int v, SkinNode *frames, + const MeshElemMap *emap, const MEdge *medge, + int *tothullframe) +{ + SkinNode *f; + Frame **hull_frames; + int nbr, i; + + (*tothullframe) = emap[v].count; + hull_frames = MEM_callocN(sizeof(Frame **) * (*tothullframe), + "hull_from_frames.hull_frames"); + i = 0; + for (nbr = 0; nbr < emap[v].count; nbr++) { + const MEdge *e = &medge[emap[v].indices[nbr]]; + f = &frames[BKE_mesh_edge_other_vert(e, v)]; + /* Can't have adjacent branch nodes yet */ + if (f->totframe) + hull_frames[i++] = &f->frames[0]; + else + (*tothullframe)--; + } + + return hull_frames; +} + + +/**************************** Create Frames ***************************/ + +static void node_frames_init(SkinNode *nf, int totframe) +{ + int i; + + nf->totframe = totframe; + memset(nf->frames, 0, sizeof(nf->frames)); + + nf->flag = 0; + for (i = 0; i < 2; i++) + nf->seam_edges[i] = -1; +} + +static void create_frame(Frame *frame, const float co[3], + const float radius[2], + float mat[3][3], float offset) +{ + float rx[3], ry[3], rz[3]; + int i; + + mul_v3_v3fl(ry, mat[1], radius[0]); + mul_v3_v3fl(rz, mat[2], radius[1]); + + add_v3_v3v3(frame->co[3], co, ry); + add_v3_v3v3(frame->co[3], frame->co[3], rz); + + sub_v3_v3v3(frame->co[2], co, ry); + add_v3_v3v3(frame->co[2], frame->co[2], rz); + + sub_v3_v3v3(frame->co[1], co, ry); + sub_v3_v3v3(frame->co[1], frame->co[1], rz); + + add_v3_v3v3(frame->co[0], co, ry); + sub_v3_v3v3(frame->co[0], frame->co[0], rz); + + mul_v3_v3fl(rx, mat[0], offset); + for (i = 0; i < 4; i++) + add_v3_v3v3(frame->co[i], frame->co[i], rx); +} + +static float half_v2(const float v[2]) +{ + return (v[0] + v[1]) * 0.5f; +} + +static void end_node_frames(int v, SkinNode *skin_nodes, const MVert *mvert, + const MVertSkin *nodes, const MeshElemMap *emap, + EMat *emat) +{ + const float *rad = nodes[v].radius; + float mat[3][3]; + + if (emap[v].count == 0) { + float avg = half_v2(rad); + + /* For solitary nodes, just build a box (two frames) */ + node_frames_init(&skin_nodes[v], 2); + skin_nodes[v].flag |= (CAP_START | CAP_END); + + /* Hardcoded basis */ + zero_m3(mat); + mat[0][2] = mat[1][0] = mat[2][1] = 1; + + /* Caps */ + create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, avg); + create_frame(&skin_nodes[v].frames[1], mvert[v].co, rad, mat, -avg); + } + else { + /* For nodes with an incoming edge, create a single (capped) frame */ + node_frames_init(&skin_nodes[v], 1); + skin_nodes[v].flag |= CAP_START; + + /* Use incoming edge for orientation */ + copy_m3_m3(mat, emat[emap[v].indices[0]].mat); + if (emat[emap[v].indices[0]].origin != v) + negate_v3(mat[0]); + + /* End frame */ + create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, 0); + } +} + +/* Returns 1 for seam, 0 otherwise */ +static int connection_node_mat(float mat[3][3], int v, const MeshElemMap *emap, EMat *emat) +{ + float axis[3], angle, ine[3][3], oute[3][3]; + EMat *e1, *e2; + + e1 = &emat[emap[v].indices[0]]; + e2 = &emat[emap[v].indices[1]]; + + if (e1->origin != v && e2->origin == v) { + copy_m3_m3(ine, e1->mat); + copy_m3_m3(oute, e2->mat); + } + else if (e1->origin == v && e2->origin != v) { + copy_m3_m3(ine, e2->mat); + copy_m3_m3(oute, e1->mat); + } + else + return 1; + + /* Get axis and angle to rotate frame by */ + angle = angle_normalized_v3v3(ine[0], oute[0]) / 2.0f; + cross_v3_v3v3(axis, ine[0], oute[0]); + + /* Build frame matrix (don't care about X axis here) */ + copy_v3_v3(mat[0], ine[0]); + rotate_normalized_v3_v3v3fl(mat[1], ine[1], axis, angle); + rotate_normalized_v3_v3v3fl(mat[2], ine[2], axis, angle); + + return 0; +} + +static void connection_node_frames(int v, SkinNode *skin_nodes, const MVert *mvert, + const MVertSkin *nodes, const MeshElemMap *emap, + EMat *emat) +{ + const float *rad = nodes[v].radius; + float mat[3][3]; + EMat *e1, *e2; + + if (connection_node_mat(mat, v, emap, emat)) { + float avg = half_v2(rad); + + /* Get edges */ + e1 = &emat[emap[v].indices[0]]; + e2 = &emat[emap[v].indices[1]]; + + /* Handle seam separately to avoid twisting */ + /* Create two frames, will be hulled to neighbors later */ + node_frames_init(&skin_nodes[v], 2); + skin_nodes[v].flag |= SEAM_FRAME; + + copy_m3_m3(mat, e1->mat); + if (e1->origin != v) negate_v3(mat[0]); + create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, avg); + skin_nodes[v].seam_edges[0] = emap[v].indices[0]; + + copy_m3_m3(mat, e2->mat); + if (e2->origin != v) negate_v3(mat[0]); + create_frame(&skin_nodes[v].frames[1], mvert[v].co, rad, mat, avg); + skin_nodes[v].seam_edges[1] = emap[v].indices[1]; + + return; + } + + /* Build regular frame */ + node_frames_init(&skin_nodes[v], 1); + create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, 0); +} + +static SkinNode *build_frames(const MVert *mvert, int totvert, + const MVertSkin *nodes, const MeshElemMap *emap, + EMat *emat) +{ + SkinNode *skin_nodes; + int v; + + skin_nodes = MEM_callocN(sizeof(SkinNode) * totvert, "build_frames.skin_nodes"); + + for (v = 0; v < totvert; v++) { + if (emap[v].count <= 1) + end_node_frames(v, skin_nodes, mvert, nodes, emap, emat); + else if (emap[v].count == 2) + connection_node_frames(v, skin_nodes, mvert, nodes, emap, emat); + else { + /* Branch node generates no frames */ + } + } + + return skin_nodes; +} + +/**************************** Edge Matrices ***************************/ + +static void calc_edge_mat(float mat[3][3], const float a[3], const float b[3]) +{ + float Z[3] = {0, 0, 1}; + float dot; + + /* X = edge direction */ + sub_v3_v3v3(mat[0], b, a); + normalize_v3(mat[0]); + + dot = dot_v3v3(mat[0], Z); + if (dot > -1 + FLT_EPSILON && dot < 1 - FLT_EPSILON) { + /* Y = Z cross x */ + cross_v3_v3v3(mat[1], Z, mat[0]); + normalize_v3(mat[1]); + + /* Z = x cross y */ + cross_v3_v3v3(mat[2], mat[0], mat[1]); + normalize_v3(mat[2]); + } + else { + mat[1][0] = 1; + mat[1][1] = 0; + mat[1][2] = 0; + mat[2][0] = 0; + mat[2][1] = 1; + mat[2][2] = 0; + } +} + +static void build_emats_rec(int *visited_e, EMat *emat, + const MeshElemMap *emap, const MEdge *medge, + const MVertSkin *vs, const MVert *mvert, + int parent_v, float parent_mat[3][3]) +{ + float axis[3], angle; + int i, e, v, parent_is_branch; + + parent_is_branch = ((emap[parent_v].count > 2) || + (vs[parent_v].flag & MVERT_SKIN_ROOT)); + + for (i = 0; i < emap[parent_v].count; i++) { + e = emap[parent_v].indices[i]; + + /* Ignore edge if already visited */ + if (visited_e[e]) continue; + visited_e[e] = 1; + + v = BKE_mesh_edge_other_vert(&medge[e], parent_v); + emat[e].origin = parent_v; + + /* If parent is a branch node, start a new edge chain */ + if (parent_is_branch) { + calc_edge_mat(emat[e].mat, mvert[parent_v].co, + mvert[v].co); + } + else { + /* Build edge matrix guided by parent matrix */ + sub_v3_v3v3(emat[e].mat[0], mvert[v].co, mvert[parent_v].co); + normalize_v3(emat[e].mat[0]); + angle = angle_normalized_v3v3(parent_mat[0], emat[e].mat[0]); + cross_v3_v3v3(axis, parent_mat[0], emat[e].mat[0]); + normalize_v3(axis); + rotate_normalized_v3_v3v3fl(emat[e].mat[1], parent_mat[1], axis, angle); + rotate_normalized_v3_v3v3fl(emat[e].mat[2], parent_mat[2], axis, angle); + } + + build_emats_rec(visited_e, emat, emap, medge, + vs, mvert, v, emat[e].mat); + } +} + +static EMat *build_edge_mats(MVertSkin *vs, MVert *mvert, int totvert, + MEdge *medge, MeshElemMap *emap, int totedge) +{ + EMat *emat; + float mat[3][3]; + int *visited_e, v; + + visited_e = MEM_callocN(sizeof(int) * totedge, "build_edge_mats.visited_e"); + emat = MEM_callocN(sizeof(EMat) * totedge, "build_edge_mats.emat"); + + /* Build edge matrices recursively from the root nodes */ + for (v = 0; v < totvert; v++) { + if (vs[v].flag & MVERT_SKIN_ROOT) { + if (emap[v].count >= 1) { + const MEdge *e = &medge[emap[v].indices[0]]; + calc_edge_mat(mat, mvert[v].co, + mvert[BKE_mesh_edge_other_vert(e, v)].co); + build_emats_rec(visited_e, emat, emap, medge, vs, mvert, v, mat); + } + } + } + + MEM_freeN(visited_e); + + return emat; +} + + +/************************** Input Subdivision *************************/ + +/* Returns number of edge subdivisions, taking into account the radius + * of the endpoints and the edge length. If both endpoints are branch + * nodes, at least two intermediate frames are required. (This avoids + * having any special cases for dealing with sharing a frame between + * two hulls.) */ +static int calc_edge_subdivisions(const MVert *mvert, const MVertSkin *nodes, + const MEdge *e, int *degree) +{ + const MVertSkin *evs[2] = {&nodes[e->v1], &nodes[e->v2]}; + float edge_len, avg[2]; + int v1_branch = degree[e->v1] > 2; + int v2_branch = degree[e->v2] > 2; + int num_subdivisions; + + /* If either end is a branch node marked 'loose', don't subdivide + * the edge (or subdivide just twice if both are branches) */ + if ((v1_branch && (evs[0]->flag & MVERT_SKIN_LOOSE)) || + (v2_branch && (evs[1]->flag & MVERT_SKIN_LOOSE))) { + if (v1_branch && v2_branch) + return 2; + else + return 0; + } + + edge_len = len_v3v3(mvert[e->v1].co, mvert[e->v2].co); + + avg[0] = half_v2(evs[0]->radius); + avg[1] = half_v2(evs[1]->radius); + num_subdivisions = (int)((float)edge_len / (avg[0] + avg[1])); + + /* If both ends are branch nodes, two intermediate nodes are + * required */ + if (num_subdivisions < 2 && v1_branch && v2_branch) + num_subdivisions = 2; + + return num_subdivisions; +} + +/* Take a DerivedMesh and subdivide its edges to keep skin nodes + * reasonably close. */ +static DerivedMesh *subdivide_base(DerivedMesh *orig) +{ + DerivedMesh *dm; + MVertSkin *orignode, *outnode; + MVert *origvert, *outvert; + MEdge *origedge, *outedge, *e; + MDeformVert *origdvert, *outdvert; + int totorigvert, totorigedge; + int totsubd, *degree, *edge_subd; + int i, j, k, u, v; + float radrat; + + orignode = CustomData_get_layer(&orig->vertData, CD_MVERT_SKIN); + origvert = orig->getVertArray(orig); + origedge = orig->getEdgeArray(orig); + origdvert = orig->getVertDataArray(orig, CD_MDEFORMVERT); + totorigvert = orig->getNumVerts(orig); + totorigedge = orig->getNumEdges(orig); + + /* Get degree of all vertices */ + degree = MEM_callocN(sizeof(int) * totorigvert, "degree"); + for (i = 0; i < totorigedge; i++) { + degree[origedge[i].v1]++; + degree[origedge[i].v2]++; + } + + /* Per edge, store how many subdivisions are needed */ + edge_subd = MEM_callocN(sizeof(int) * totorigedge, "edge_subd"); + for (i = 0, totsubd = 0; i < totorigedge; i++) { + edge_subd[i] += calc_edge_subdivisions(origvert, orignode, + &origedge[i], degree); + totsubd += edge_subd[i]; + } + + MEM_freeN(degree); + + /* Allocate output derivedmesh */ + dm = CDDM_from_template(orig, + totorigvert + totsubd, + totorigedge + totsubd, + 0, 0, 0); + + outvert = dm->getVertArray(dm); + outedge = dm->getEdgeArray(dm); + outnode = CustomData_get_layer(&dm->vertData, CD_MVERT_SKIN); + outdvert = CustomData_get_layer(&dm->vertData, CD_MDEFORMVERT); + + /* Copy original vertex data */ + CustomData_copy_data(&orig->vertData, + &dm->vertData, + 0, 0, totorigvert); + + /* Subdivide edges */ + for (i = 0, v = totorigvert; i < totorigedge; i++) { + struct { + /* Vertex group number */ + int def_nr; + float w1, w2; + } *vgroups = NULL, *vg; + int totvgroup = 0; + + e = &origedge[i]; + + if (origdvert) { + const MDeformVert *dv1 = &origdvert[e->v1]; + const MDeformVert *dv2 = &origdvert[e->v2]; + vgroups = MEM_callocN(sizeof(*vgroups) * dv1->totweight, "vgroup"); + + /* Only want vertex groups used by both vertices */ + for (j = 0; j < dv1->totweight; j++) { + vg = NULL; + for (k = 0; k < dv2->totweight; k++) { + if (dv1->dw[j].def_nr == dv2->dw[k].def_nr) { + vg = &vgroups[totvgroup]; + totvgroup++; + break; + } + } + + if (vg) { + vg->def_nr = dv1->dw[j].def_nr; + vg->w1 = dv1->dw[j].weight; + vg->w1 = dv2->dw[k].weight; + } + } + } + + u = e->v1; + radrat = (half_v2(outnode[e->v2].radius) / + half_v2(outnode[e->v1].radius)); + radrat = (radrat + 1) / 2; + + /* Add vertices and edge segments */ + for (j = 0; j < edge_subd[i]; j++, v++, outedge++) { + float r = (j + 1) / (float)(edge_subd[i] + 1); + float t = powf(r, radrat); + + /* Interpolate vertex coord */ + interp_v3_v3v3(outvert[v].co, outvert[e->v1].co, + outvert[e->v2].co, t); + + /* Interpolate skin radii */ + interp_v3_v3v3(outnode[v].radius, + orignode[e->v1].radius, + orignode[e->v2].radius, t); + + /* Interpolate vertex group weights */ + for (k = 0; k < totvgroup; k++) { + float weight; + + vg = &vgroups[k]; + weight = interpf(vg->w2, vg->w1, t); + + if (weight > 0) + defvert_add_index_notest(&outdvert[v], vg->def_nr, weight); + } + + outedge->v1 = u; + outedge->v2 = v; + u = v; + } + + if (vgroups) + MEM_freeN(vgroups); + + /* Link up to final vertex */ + outedge->v1 = u; + outedge->v2 = e->v2; + outedge++; + } + + MEM_freeN(edge_subd); + + return dm; +} + +/******************************* Output *******************************/ + +/* Can be either quad or triangle */ +static void add_poly(SkinOutput *so, + BMVert *v1, + BMVert *v2, + BMVert *v3, + BMVert *v4) +{ + BMVert *verts[4] = {v1, v2, v3, v4}; + BMEdge *edges[4]; + BMFace *f; + + BLI_assert(v1 != v2 && v1 != v3 && v1 != v4); + BLI_assert(v2 != v3 && v2 != v4); + BLI_assert(v3 != v4); + BLI_assert(v1 && v2 && v3); + + edges[0] = BM_edge_create(so->bm, v1, v2, NULL, TRUE); + edges[1] = BM_edge_create(so->bm, v2, v3, NULL, TRUE); + if (v4) { + edges[2] = BM_edge_create(so->bm, v3, v4, NULL, TRUE); + edges[3] = BM_edge_create(so->bm, v4, v1, NULL, TRUE); + } + else { + edges[2] = BM_edge_create(so->bm, v3, v1, NULL, TRUE); + edges[3] = NULL; + } + + f = BM_face_create(so->bm, verts, edges, v4 ? 4 : 3, TRUE); + if (so->smd->flag & MOD_SKIN_SMOOTH_SHADING) + BM_elem_flag_enable(f, BM_ELEM_SMOOTH); + f->mat_nr = so->mat_nr; +} + +static void connect_frames(SkinOutput *so, + BMVert *frame1[4], + BMVert *frame2[4]) +{ + BMVert *q[4][4] = {{frame2[0], frame2[1], frame1[1], frame1[0]}, + {frame2[1], frame2[2], frame1[2], frame1[1]}, + {frame2[2], frame2[3], frame1[3], frame1[2]}, + {frame2[3], frame2[0], frame1[0], frame1[3]}}; + float p[3], no[3]; + int i, swap; + + /* Check if frame normals need swap */ + sub_v3_v3v3(p, q[3][0]->co, q[0][0]->co); + normal_quad_v3(no, + q[0][0]->co, q[0][1]->co, + q[0][2]->co, q[0][3]->co); + swap = dot_v3v3(no, p) > 0; + + for (i = 0; i < 4; i++) { + if (swap) + add_poly(so, q[i][3], q[i][2], q[i][1], q[i][0]); + else + add_poly(so, q[i][0], q[i][1], q[i][2], q[i][3]); + } +} + +static void output_frames(BMesh *bm, + SkinNode *sn, + const MDeformVert *input_dvert) +{ + Frame *f; + int i, j; + + /* Output all frame verts */ + for (i = 0; i < sn->totframe; i++) { + f = &sn->frames[i]; + for (j = 0; j < 4; j++) { + if (!f->merge[j].frame) { + BMVert *v = f->verts[j] = BM_vert_create(bm, f->co[j], NULL); + + if (input_dvert) { + MDeformVert *dv; + dv = CustomData_bmesh_get(&bm->vdata, + v->head.data, + CD_MDEFORMVERT); + + BLI_assert(dv->totweight == 0); + defvert_copy(dv, input_dvert); + } + } + } + } +} + +#define PRINT_HOLE_INFO 0 + +static void calc_frame_center(float center[3], const Frame *frame) +{ + add_v3_v3v3(center, frame->verts[0]->co, frame->verts[1]->co); + add_v3_v3(center, frame->verts[2]->co); + add_v3_v3(center, frame->verts[3]->co); + mul_v3_fl(center, 0.25f); +} + +/* Does crappy fan triangulation of poly, may not be so accurate for + * concave faces */ +static int isect_ray_poly(const float ray_start[3], + const float ray_dir[3], + BMFace *f, + float *r_lambda) +{ + BMVert *v, *v_first = NULL, *v_prev = NULL; + BMIter iter; + float best_dist = FLT_MAX; + int hit = 0; + + BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE) { + if (!v_first) + v_first = v; + else if (v_prev != v_first) { + float dist; + int curhit; + + curhit = isect_ray_tri_v3(ray_start, ray_dir, + v_first->co, v_prev->co, v->co, + &dist, NULL); + if (curhit && dist < best_dist) { + hit = TRUE; + best_dist = dist; + } + } + + v_prev = v; + } + + *r_lambda = best_dist; + return hit; +} + +/* Reduce the face down to 'n' corners by collapsing the edges; + * returns the new face. + * + * The orig_verts should contain the vertices of 'f' + */ +static BMFace *collapse_face_corners(BMesh *bm, BMFace *f, int n, + BMVert **orig_verts) +{ + int orig_len = f->len; + + BLI_assert(n >= 3); + BLI_assert(f->len > n); + if (f->len <= n) + return f; + + /* Collapse shortest edge for now */ + while (f->len > n) { + BMFace *vf; + BMEdge *shortest_edge; + BMVert *v_safe, *v_merge; + BMOperator op; + BMIter iter; + int i; + + shortest_edge = BM_face_find_shortest_edge(f); + BMO_op_initf(bm, &op, "weldverts"); + + /* Note: could probably calculate merges in one go to be + * faster */ + + v_safe = shortest_edge->v1; + v_merge = shortest_edge->v2; + mid_v3_v3v3(v_safe->co, v_safe->co, v_merge->co); + BMO_slot_map_ptr_insert(bm, &op, "targetmap", v_merge, v_safe); + BMO_op_exec(bm, &op); + BMO_op_finish(bm, &op); + + /* Find the new face */ + f = NULL; + BM_ITER_ELEM(vf, &iter, v_safe, BM_FACES_OF_VERT) { + int wrong_face = FALSE; + + for (i = 0; i < orig_len; i++) { + if (orig_verts[i] == v_merge) + orig_verts[i] = NULL; + else if (orig_verts[i] && + !BM_vert_in_face(vf, orig_verts[i])) + { + wrong_face = TRUE; + break; + } + } + + if (!wrong_face) { + f = vf; + break; + } + } + + BLI_assert(f); + } + + return f; +} + +/* Choose a good face to merge the frame with, used in case the frame + * is completely inside the hull. */ +static BMFace *skin_hole_target_face(BMesh *bm, Frame *frame) +{ + BMFace *f, *isect_target_face, *center_target_face; + BMIter iter; + float frame_center[3]; + float frame_normal[3]; + float best_isect_dist = FLT_MAX; + float best_center_dist = FLT_MAX; + + calc_frame_center(frame_center, frame); + normal_quad_v3(frame_normal, frame->verts[3]->co, + frame->verts[2]->co, frame->verts[1]->co, + frame->verts[0]->co); + + /* Use a line intersection test and nearest center test against + * all faces */ + isect_target_face = center_target_face = NULL; + BM_ITER_MESH(f, &iter, bm, BM_FACES_OF_MESH) { + float dist, poly_center[3]; + int hit; + + /* Intersection test */ + hit = isect_ray_poly(frame_center, frame_normal, f, &dist); + if (hit && dist < best_isect_dist) { + isect_target_face = f; + best_isect_dist = dist; + } + + /* Nearest test */ + BM_face_calc_center_mean(f, poly_center); + dist = len_v3v3(frame_center, poly_center); + if (dist < best_center_dist) { + center_target_face = f; + best_center_dist = dist; + } + } + + f = isect_target_face; + if (!f || best_center_dist < best_isect_dist / 2) + f = center_target_face; + + /* This case is unlikely now, but could still happen. Should look + * into splitting edges to make new faces. */ +#if PRINT_HOLE_INFO + if (!f) { + printf("no good face found\n"); + } +#endif + + return f; +} + +/* Use edge-length heuristic to choose from eight possible polygon bridges */ +static void skin_choose_quad_bridge_order(BMVert *a[4], BMVert *b[4], + int best_order[4]) +{ + int orders[8][4]; + float shortest_len; + int i, j; + + /* Enumerate all valid orderings */ + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + orders[i][j] = (j + i) % 4; + orders[i + 4][j] = 3 - ((j + i) % 4); + } + } + + shortest_len = FLT_MAX; + for (i = 0; i < 8; i++) { + float len = 0; + + /* Get total edge length for this configuration */ + for (j = 0; j < 4; j++) + len += len_squared_v3v3(a[j]->co, b[orders[i][j]]->co); + + if (len < shortest_len) { + shortest_len = len; + memcpy(best_order, orders[i], sizeof(int) * 4); + } + } +} + +static void skin_fix_hole_no_good_verts(BMesh *bm, Frame *frame, BMFace *split_face) +{ + BMFace *f; + BMVert *verts[4]; + BMVert **vert_buf = NULL; + BLI_array_declare(vert_buf); + BMOIter oiter; + BMOperator op; + int i, best_order[4]; + + BLI_assert(split_face->len >= 3); + + /* Extrude the split face */ + BMO_mesh_flag_disable_all(bm, NULL, BM_FACE, 1); + BMO_elem_flag_enable(bm, split_face, 1); + BMO_op_initf(bm, &op, "extrude_face_indiv faces=%ff", 1); + BMO_op_exec(bm, &op); + + /* Update split face (should only be one new face created + * during extrusion) */ + split_face = NULL; + BMO_ITER(f, &oiter, bm, &op, "faceout", BM_FACE) { + BLI_assert(!split_face); + split_face = f; + } + + BMO_op_finish(bm, &op); + + if (split_face->len == 3) { + BMEdge *longest_edge; + + /* Need at least four ring edges, so subdivide longest edge if + * face is a triangle */ + longest_edge = BM_face_find_longest_edge(split_face); + BMO_mesh_flag_disable_all(bm, NULL, BM_EDGE, 1); + BMO_elem_flag_enable(bm, longest_edge, 1); + BMO_op_callf(bm, "esubd edges=%fe numcuts=%i quadcornertype=%i", + 1, 1, SUBD_STRAIGHT_CUT); + } + else if (split_face->len > 4) { + /* Maintain a dynamic vert array containing the split_face's + * vertices, avoids frequent allocs in collapse_face_corners() */ + if (BLI_array_count(vert_buf) < split_face->len) { + BLI_array_grow_items(vert_buf, (split_face->len - + BLI_array_count(vert_buf))); + } + + /* Get split face's verts */ + BM_iter_as_array(bm, BM_VERTS_OF_FACE, split_face, + (void **)verts, split_face->len); + + /* Earlier edge split operations may have turned some quads + * into higher-degree faces */ + split_face = collapse_face_corners(bm, split_face, 4, vert_buf); + } + + /* Done with dynamic array, split_face must now be a quad */ + BLI_array_free(vert_buf); + BLI_assert(split_face->len == 4); + if (split_face->len != 4) + return; + + /* Get split face's verts */ + BM_iter_as_array(bm, BM_VERTS_OF_FACE, split_face, (void **)verts, 4); + skin_choose_quad_bridge_order(verts, frame->verts, best_order); + + /* Delete split face and merge */ + BM_face_kill(bm, split_face); + BMO_op_init(bm, &op, "weldverts"); + for (i = 0; i < 4; i++) { + BMO_slot_map_ptr_insert(bm, &op, "targetmap", + verts[i], frame->verts[best_order[i]]); + } + BMO_op_exec(bm, &op); + BMO_op_finish(bm, &op); +} + +/* If the frame has some vertices that are inside the hull (detached) + * and some attached, duplicate the attached vertices and take the + * whole frame off the hull. */ +static void skin_hole_detach_partially_attached_frame(BMesh *bm, Frame *frame) +{ + int i, attached[4], totattached = 0; + + /* Get/count attached frame corners */ + for (i = 0; i < 4; i++) { + if (!frame->inside_hull[i]) + attached[totattached++] = i; + } + + /* Detach everything */ + for (i = 0; i < totattached; i++) { + BMVert **av = &frame->verts[attached[i]]; + (*av) = BM_vert_create(bm, (*av)->co, *av); + } +} + + +static void quad_from_tris(BMesh *bm, BMEdge *e, BMFace *adj[2], BMVert *ndx[4]) +{ + BMVert *tri[2][3]; + BMVert *opp = NULL; + int i, j; + + BLI_assert(adj[0]->len == 3 && adj[1]->len == 3); + + BM_iter_as_array(bm, BM_VERTS_OF_FACE, adj[0], (void **)tri[0], 3); + BM_iter_as_array(bm, BM_VERTS_OF_FACE, adj[1], (void **)tri[1], 3); + + /* Find what the second tri has that the first doesn't */ + for (i = 0; i < 3; i++) { + if (tri[1][i] != tri[0][0] && + tri[1][i] != tri[0][1] && + tri[1][i] != tri[0][2]) + { + opp = tri[1][i]; + break; + } + } + BLI_assert(opp); + + for (i = 0, j = 0; i < 3; i++, j++) { + ndx[j] = tri[0][i]; + /* When the triangle edge cuts across our quad-to-be, + * throw in the second triangle's vertex */ + if ((tri[0][i] == e->v1 || tri[0][i] == e->v2) && + (tri[0][(i + 1) % 3] == e->v1 || tri[0][(i + 1) % 3] == e->v2)) + { + j++; + ndx[j] = opp; + } + } +} + +static void add_quad_from_tris(SkinOutput *so, BMEdge *e, BMFace *adj[2]) +{ + BMVert *quad[4]; + + quad_from_tris(so->bm, e, adj, quad); + + add_poly(so, quad[0], quad[1], quad[2], quad[3]); +} + +/* Returns the number of faces that are adjacent to both f1 and f2 */ +static int BM_face_share_face_count(BMFace *f1, BMFace *f2) +{ + BMIter iter1, iter2; + BMEdge *e; + BMFace *f; + int count = 0; + + BM_ITER_ELEM (e, &iter1, f1, BM_EDGES_OF_FACE) { + BM_ITER_ELEM(f, &iter2, e, BM_FACES_OF_EDGE) { + if (f != f1 && f != f2 && BM_face_share_edge_count(f, f2)) + count++; + } + } + + return count; +} + +static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd) +{ + BMIter iter; + BMEdge *e; + Heap *heap; + float score; + + heap = BLI_heap_new(); + + BM_mesh_elem_hflag_disable_all(so->bm, BM_FACE, BM_ELEM_TAG, FALSE); + + /* Build heap */ + BM_ITER_MESH (e, &iter, so->bm, BM_EDGES_OF_MESH) { + BMFace *adj[2]; + + /* Only care if the edge is used by exactly two triangles */ + if (BM_edge_face_pair(e, &adj[0], &adj[1])) { + if (adj[0]->len == 3 && adj[1]->len == 3) { + BMVert *quad[4]; + + /* Construct quad using the two triangles adjacent to + * the edge */ + quad_from_tris(so->bm, e, adj, quad); + + /* Calculate a score for the quad, higher score for + * triangles being closer to coplanar */ + score = ((BM_face_calc_area(adj[0]) + + BM_face_calc_area(adj[1])) * + dot_v3v3(adj[0]->no, adj[1]->no)); + + /* Check if quad crosses the axis of symmetry */ + if (quad_crosses_symmetry_plane(quad, smd)) { + /* Increase score if the triangles form a + * symmetric quad, otherwise don't use it */ + if (is_quad_symmetric(quad, smd)) + score *= 10; + else + continue; + } + + /* Don't use the quad if it's concave */ + if (!is_quad_convex_v3(quad[0]->co, quad[1]->co, + quad[2]->co, quad[3]->co)) + { + continue; + } + + BLI_heap_insert(heap, -score, e); + } + } + } + + while (!BLI_heap_empty(heap)) { + BMFace *adj[2]; + + e = BLI_heap_popmin(heap); + + if (BM_edge_face_pair(e, &adj[0], &adj[1])) { + /* If both triangles still free, and if they don't already + * share a border with another face, output as a quad */ + if (!BM_elem_flag_test(adj[0], BM_ELEM_TAG) && + !BM_elem_flag_test(adj[1], BM_ELEM_TAG) && + !BM_face_share_face_count(adj[0], adj[1])) + { + add_quad_from_tris(so, e, adj); + BM_elem_flag_enable(adj[0], BM_ELEM_TAG); + BM_elem_flag_enable(adj[1], BM_ELEM_TAG); + BM_elem_flag_enable(e, BM_ELEM_TAG); + } + } + } + + BMO_op_callf(so->bm, "del geom=%hef context=%i", BM_ELEM_TAG, DEL_ONLYTAGGED); + + BLI_heap_free(heap, NULL); +} + +static void skin_merge_close_frame_verts(SkinNode *skin_nodes, int totvert, + const MeshElemMap *emap, + const MEdge *medge) +{ + Frame **hull_frames; + int v, tothullframe; + + for (v = 0; v < totvert; v++) { + /* Only check branch nodes */ + if (!skin_nodes[v].totframe) { + hull_frames = collect_hull_frames(v, skin_nodes, + emap, medge, + &tothullframe); + merge_frame_corners(hull_frames, tothullframe); + MEM_freeN(hull_frames); + } + } +} + +static void skin_update_merged_vertices(SkinNode *skin_nodes, int totvert) +{ + int v; + + for (v = 0; v < totvert; ++v) { + SkinNode *sn = &skin_nodes[v]; + int i, j; + + for (i = 0; i < sn->totframe; i++) { + Frame *f = &sn->frames[i]; + + for (j = 0; j < 4; j++) { + if (f->merge[j].frame) { + /* Merge chaining not allowed */ + BLI_assert(!f->merge[j].frame->merge[f->merge[j].corner].frame); + + f->verts[j] = f->merge[j].frame->verts[f->merge[j].corner]; + } + } + } + } +} + +static void skin_fix_hull_topology(BMesh *bm, SkinNode *skin_nodes, + int totvert) +{ + int v; + + for (v = 0; v < totvert; v++) { + SkinNode *sn = &skin_nodes[v]; + int j; + + for (j = 0; j < sn->totframe; j++) { + Frame *f = &sn->frames[j]; + + if (f->detached) { + BMFace *target_face; + + skin_hole_detach_partially_attached_frame(bm, f); + + target_face = skin_hole_target_face(bm, f); + if (target_face) + skin_fix_hole_no_good_verts(bm, f, target_face); + } + } + } +} + +static void skin_output_end_nodes(SkinOutput *so, SkinNode *skin_nodes, + int totvert) +{ + int v; + + for (v = 0; v < totvert; ++v) { + SkinNode *sn = &skin_nodes[v]; + /* Assuming here just two frames */ + if (sn->flag & SEAM_FRAME) { + BMVert *v_order[4]; + int i, order[4]; + + skin_choose_quad_bridge_order(sn->frames[0].verts, + sn->frames[1].verts, + order); + for (i = 0; i < 4; i++) + v_order[i] = sn->frames[1].verts[order[i]]; + connect_frames(so, sn->frames[0].verts, v_order); + } + else if (sn->totframe == 2) { + connect_frames(so, + sn->frames[0].verts, + sn->frames[1].verts); + } + + if (sn->flag & CAP_START) { + add_poly(so, + sn->frames[0].verts[3], + sn->frames[0].verts[2], + sn->frames[0].verts[1], + sn->frames[0].verts[0]); + } + if (sn->flag & CAP_END) { + add_poly(so, + sn->frames[1].verts[3], + sn->frames[1].verts[2], + sn->frames[1].verts[1], + sn->frames[1].verts[0]); + } + } +} + +static void skin_output_connections(SkinOutput *so, SkinNode *skin_nodes, + const MEdge *medge, + int totedge) +{ + int e; + + for (e = 0; e < totedge; e++) { + SkinNode *a, *b; + a = &skin_nodes[medge[e].v1]; + b = &skin_nodes[medge[e].v2]; + + if (a->totframe && b->totframe) { + if ((a->flag & SEAM_FRAME) || (b->flag & SEAM_FRAME)) { + Frame *fr[2] = {&a->frames[0], &b->frames[0]}; + BMVert *v_order[4]; + int i, order[4]; + + if ((a->flag & SEAM_FRAME) && (e != a->seam_edges[0])) + fr[0]++; + if ((b->flag & SEAM_FRAME) && (e != b->seam_edges[0])) + fr[1]++; + + skin_choose_quad_bridge_order(fr[0]->verts, fr[1]->verts, order); + for (i = 0; i < 4; i++) + v_order[i] = fr[1]->verts[order[i]]; + connect_frames(so, fr[0]->verts, v_order); + } + else { + connect_frames(so, + a->frames[0].verts, + b->frames[0].verts); + } + } + } +} + +static void skin_smooth_hulls(BMesh *bm, SkinNode *skin_nodes, + int totvert, const SkinModifierData *smd) +{ + BMIter iter, eiter; + BMVert *v; + int i, j, k, skey; + + if (smd->branch_smoothing == 0) + return; + + /* Mark all frame vertices */ + BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, FALSE); + for (i = 0; i < totvert; i++) { + for (j = 0; j < skin_nodes[i].totframe; j++) { + Frame *frame = &skin_nodes[i].frames[j]; + + for (k = 0; k < 4; k++) + BM_elem_flag_enable(frame->verts[k], BM_ELEM_TAG); + } + } + + /* Add temporary shapekey layer to store original coordinates */ + BM_data_layer_add(bm, &bm->vdata, CD_SHAPEKEY); + skey = CustomData_number_of_layers(&bm->vdata, CD_SHAPEKEY) - 1; + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + copy_v3_v3(CustomData_bmesh_get_n(&bm->vdata, v->head.data, + CD_SHAPEKEY, skey), v->co); + } + + /* Smooth vertices, weight unmarked vertices more strongly (helps + * to smooth frame vertices, but don't want to alter them too + * much) */ + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + BMEdge *e; + float avg[3]; + float weight = smd->branch_smoothing; + int totv = 1; + + if (BM_elem_flag_test(v, BM_ELEM_TAG)) + weight *= 0.5f; + + copy_v3_v3(avg, v->co); + BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) { + BMVert *other = BM_edge_other_vert(e, v); + + add_v3_v3(avg, CustomData_bmesh_get_n(&bm->vdata, + other->head.data, + CD_SHAPEKEY, skey)); + totv++; + } + + if (totv > 1) { + mul_v3_fl(avg, 1.0f / (float)totv); + interp_v3_v3v3(v->co, v->co, avg, weight); + } + } + + /* Done with original coordinates */ + BM_data_layer_free_n(bm, &bm->vdata, CD_SHAPEKEY, skey); +} + +/* Returns TRUE if all hulls are successfully built, FALSE otherwise */ +static int skin_output_branch_hulls(SkinOutput *so, SkinNode *skin_nodes, + int totvert, const MeshElemMap *emap, + const MEdge *medge) +{ + int result = TRUE, v; + + for (v = 0; v < totvert; v++) { + SkinNode *sn = &skin_nodes[v]; + + /* Branch node hulls */ + if (!sn->totframe) { + Frame **hull_frames; + int tothullframe; + + hull_frames = collect_hull_frames(v, skin_nodes, + emap, medge, + &tothullframe); + if (!build_hull(so, hull_frames, tothullframe)) + result = FALSE; + + MEM_freeN(hull_frames); + } + } + + return result; +} + +static BMesh *build_skin(SkinNode *skin_nodes, + int totvert, const MeshElemMap *emap, + const MEdge *medge, int totedge, + const MDeformVert *input_dvert, + SkinModifierData *smd) +{ + SkinOutput so; + int v; + + so.smd = smd; + so.bm = BM_mesh_create(&bm_mesh_allocsize_default); + so.mat_nr = 0; + + if (input_dvert) + BM_data_layer_add(so.bm, &so.bm->vdata, CD_MDEFORMVERT); + + /* Check for mergeable frame corners around hulls before + * outputting vertices */ + skin_merge_close_frame_verts(skin_nodes, totvert, emap, medge); + + /* Write out all frame vertices to the mesh */ + for (v = 0; v < totvert; ++v) { + if (skin_nodes[v].totframe) + output_frames(so.bm, &skin_nodes[v], + input_dvert ? &input_dvert[v] : NULL); + } + + /* Update vertex pointers for merged frame corners */ + skin_update_merged_vertices(skin_nodes, totvert); + + if (!skin_output_branch_hulls(&so, skin_nodes, totvert, emap, medge)) + modifier_setError(&smd->modifier, "Hull error"); + + /* Merge triangles here in the hope of providing better target + * faces for skin_fix_hull_topology() to connect to */ + hull_merge_triangles(&so, smd); + + /* Using convex hulls may not generate a nice manifold mesh. Two + * problems can occur: an input frame's edges may be inside the + * hull, and/or an input frame's vertices may be inside the hull. + * + * General fix to produce manifold mesh: for any frame that is + * partially detached, first detach it fully, then find a suitable + * existing face to merge with. (Note that we do this after + * creating all hull faces, but before creating any other + * faces. + */ + skin_fix_hull_topology(so.bm, skin_nodes, totvert); + + skin_smooth_hulls(so.bm, skin_nodes, totvert, smd); + + skin_output_end_nodes(&so, skin_nodes, totvert); + skin_output_connections(&so, skin_nodes, medge, totedge); + hull_merge_triangles(&so, smd); + + return so.bm; +} + +static void skin_set_orig_indices(DerivedMesh *dm) +{ + int *orig, totpoly, i; + + totpoly = dm->getNumPolys(dm); + orig = CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, + CD_CALLOC, 0, totpoly); + for (i = 0; i < totpoly; i++) + orig[i] = ORIGINDEX_NONE; +} + +/* + * 0) Subdivide edges (in caller) + * 1) Generate good edge matrices (uses root nodes) + * 2) Generate node frames + * 3) Output vertices and polygons from frames, connections, and hulls + */ +static DerivedMesh *base_skin(DerivedMesh *origdm, + SkinModifierData *smd) +{ + BMEditMesh fake_em; + DerivedMesh *result; + MVertSkin *nodes; + BMesh *bm; + EMat *emat; + SkinNode *skin_nodes; + MeshElemMap *emap; + int *emapmem; + MVert *mvert; + MEdge *medge; + MDeformVert *dvert; + int totvert, totedge; + + nodes = CustomData_get_layer(&origdm->vertData, CD_MVERT_SKIN); + + mvert = origdm->getVertArray(origdm); + dvert = origdm->getVertDataArray(origdm, CD_MDEFORMVERT); + medge = origdm->getEdgeArray(origdm); + totvert = origdm->getNumVerts(origdm); + totedge = origdm->getNumEdges(origdm); + + create_vert_edge_map(&emap, &emapmem, medge, totvert, totedge); + + emat = build_edge_mats(nodes, mvert, totvert, medge, emap, totedge); + skin_nodes = build_frames(mvert, totvert, nodes, emap, emat); + MEM_freeN(emat); + emat = NULL; + + bm = build_skin(skin_nodes, totvert, emap, medge, totedge, dvert, smd); + + MEM_freeN(skin_nodes); + MEM_freeN(emap); + MEM_freeN(emapmem); + + if (!bm) + return NULL; + + fake_em.bm = bm; + result = CDDM_from_BMEditMesh(&fake_em, NULL, FALSE, FALSE); + BM_mesh_free(bm); + + CDDM_calc_edges(result); + CDDM_calc_normals(result); + + skin_set_orig_indices(result); + + return result; +} + +static DerivedMesh *final_skin(SkinModifierData *smd, + DerivedMesh *origdm) +{ + DerivedMesh *dm; + + /* Skin node layer is required */ + if (!CustomData_get_layer(&origdm->vertData, CD_MVERT_SKIN)) + return origdm; + + origdm = subdivide_base(origdm); + dm = base_skin(origdm, smd); + + origdm->release(origdm); + + return dm; +} + + +/**************************** Skin Modifier ***************************/ + +static void initData(ModifierData *md) +{ + SkinModifierData *smd = (SkinModifierData*) md; + + /* Enable in editmode by default */ + md->mode |= eModifierMode_Editmode; + + smd->branch_smoothing = 0; + smd->flag = 0; + smd->symmetry_axes = MOD_SKIN_SYMM_X; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SkinModifierData *smd = (SkinModifierData*) md; + SkinModifierData *tsmd = (SkinModifierData*) target; + + *tsmd = *smd; +} + +static DerivedMesh *applyModifierEM(ModifierData *md, + Object *UNUSED(ob), + BMEditMesh *UNUSED(em), + DerivedMesh *dm) +{ + DerivedMesh *result; + + if (!(result = final_skin((SkinModifierData*)md, dm))) + return dm; + return result; +} + +static DerivedMesh *applyModifier(ModifierData *md, + Object *UNUSED(ob), + DerivedMesh *dm, + ModifierApplyFlag UNUSED(flag)) +{ + DerivedMesh *result; + + if (!(result = final_skin((SkinModifierData*)md, dm))) + return dm; + return result; +} + +static CustomDataMask requiredDataMask(Object *UNUSED(ob), + ModifierData *UNUSED(md)) +{ + return CD_MASK_MVERT_SKIN | CD_MASK_MDEFORMVERT; +} + +ModifierTypeInfo modifierType_Skin = { + /* name */ "Skin", + /* structName */ "SkinModifierData", + /* structSize */ sizeof(SkinModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ NULL, + /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, + /* deformMatricesEM */ NULL, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ NULL, + /* isDisabled */ NULL, + /* updateDepgraph */ NULL, + /* dependsOnTime */ NULL, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ NULL, + /* foreachIDLink */ NULL, +}; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 98fa6e8e26d..1dbbe14e643 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -276,5 +276,6 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(WeightVGProximity); INIT_TYPE(DynamicPaint); INIT_TYPE(Remesh); + INIT_TYPE(Skin); #undef INIT_TYPE } From 6485b32909e8e9d89891ac3808099425148514dc Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:29:15 +0000 Subject: [PATCH 111/159] Add new theme-able color, TH_SKIN_ROOT. Bumped file version from 263.5 to 263.6 to ensure the default TH_SKIN_ROOT color gets set. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- source/blender/editors/include/UI_resources.h | 4 +++- source/blender/editors/interface/resources.c | 12 ++++++++++++ source/blender/makesdna/DNA_userdef_types.h | 4 ++++ source/blender/makesrna/intern/rna_userdef.c | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index 35376412628..2d409879ba3 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -198,7 +198,9 @@ enum { TH_STITCH_PREVIEW_ACTIVE, TH_MATCH, /* highlight color for search matches */ - TH_SELECT_HIGHLIGHT /* highlight color for selected outliner item */ + TH_SELECT_HIGHLIGHT, /* highlight color for selected outliner item */ + + TH_SKIN_ROOT }; /* XXX WARNING: previous is saved in file, so do not change order! */ diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index ae42d6d7f58..0d16e0f4dc0 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -469,6 +469,10 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo case TH_SELECT_HIGHLIGHT: cp = ts->selected_highlight; break; + + case TH_SKIN_ROOT: + cp = ts->skin_root; + break; } } } @@ -702,6 +706,8 @@ void ui_theme_init_default(void) rgba_char_args_set(btheme->tv3d.bundle_solid, 200, 200, 200, 255); rgba_char_args_set(btheme->tv3d.camera_path, 0x00, 0x00, 0x00, 255); + + rgba_char_args_set(btheme->tv3d.skin_root, 180, 77, 77, 255); /* space buttons */ /* to have something initialized */ @@ -1808,6 +1814,12 @@ void init_userdef_do_versions(void) } } + if (bmain->versionfile < 263 || (bmain->versionfile == 263 && bmain->subversionfile < 6)) { + bTheme *btheme; + for (btheme = U.themes.first; btheme; btheme = btheme->next) + rgba_char_args_set(btheme->tv3d.skin_root, 180, 77, 77, 255); + } + /* GL Texture Garbage Collection (variable abused above!) */ if (U.textimeout == 0) { U.texcollectrate = 60; diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 94c4d141a57..b0874eefa4a 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -261,6 +261,10 @@ typedef struct ThemeSpace { char match[4]; /* outliner - filter match */ char selected_highlight[4]; /* outliner - selected item */ + + char skin_root[4]; /* Skin modifier root color */ + + int pad4; } ThemeSpace; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index b2dbc6b4632..c21fa2614a8 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1199,6 +1199,11 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna) RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Camera Path", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop = RNA_def_property(srna, "skin_root", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Skin Root", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); } From 417ac6932095f83750b4065bce9a58812023295e Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:29:27 +0000 Subject: [PATCH 112/159] Draw skin vertex roots in edit mode. Roots are drawn with a view-oriented dashed red circle around the vertex location. The circle's radius is the average if the skin vertex's X and Y radii. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- source/blender/blenkernel/intern/customdata.c | 2 +- .../blenkernel/intern/editderivedmesh.c | 14 +++++ .../blender/editors/space_view3d/drawobject.c | 63 ++++++++++++++++--- .../editors/space_view3d/view3d_draw.c | 3 + 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 3fd8c34ad21..645267fce34 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -1161,7 +1161,7 @@ const CustomDataMask CD_MASK_EDITMESH = CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_SHAPEKEY | CD_MASK_RECAST | CD_MASK_PAINT_MASK | - CD_MASK_GRID_PAINT_MASK; + CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN; const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO | diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index f1000a95e95..e0c3b257273 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -1688,6 +1688,20 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em, } } + if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) { + BMIter iter; + BMVert *eve; + int i; + + DM_add_vert_layer(&bmdm->dm, CD_MVERT_SKIN, CD_CALLOC, NULL); + + BM_ITER_MESH_INDEX (eve, &iter, bmdm->tc->bm, BM_VERTS_OF_MESH, i) { + DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN, + CustomData_bmesh_get(&bm->vdata, eve->head.data, + CD_MVERT_SKIN)); + } + } + if (vertexCos) { BMFace *efa; BMVert *eve; diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 000f81a4f32..8d72e5d47ac 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -143,6 +143,17 @@ typedef struct drawDMVerts_userData { int sel; BMVert *eve_act; + + /* cached theme values */ + unsigned char th_editmesh_active[4]; + unsigned char th_vertex_select[4]; + unsigned char th_vertex[4]; + unsigned char th_skin_root[4]; + float th_vertex_size; + + /* for skin node drawing */ + int has_vskin; + float imat[4][4]; } drawDMVerts_userData; typedef struct drawDMEdgesSel_userData { @@ -2400,20 +2411,37 @@ static void draw_dm_verts__mapFunc(void *userData, int index, const float co[3], BMVert *eve = EDBM_vert_at_index(data->em, index); if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && BM_elem_flag_test(eve, BM_ELEM_SELECT) == data->sel) { + /* skin nodes: draw a red circle around the root + node(s) */ + if(data->has_vskin) { + const MVertSkin *vs = CustomData_bmesh_get(&data->em->bm->vdata, + eve->head.data, + CD_MVERT_SKIN); + if (vs->flag & MVERT_SKIN_ROOT) { + float radius = (vs->radius[0] + vs->radius[1]) * 0.5f; + bglEnd(); + + glColor4ubv(data->th_skin_root); + drawcircball(GL_LINES, co, radius, data->imat); + + glColor4ubv(data->sel ? data->th_vertex_select : data->th_vertex); + bglBegin(GL_POINTS); + } + } + /* draw active larger - need to stop/start point drawing for this :/ */ if (eve == data->eve_act) { - float size = UI_GetThemeValuef(TH_VERTEX_SIZE); - UI_ThemeColor4(TH_EDITMESH_ACTIVE); + glColor4ubv(data->th_editmesh_active); bglEnd(); - glPointSize(size); + glPointSize(data->th_vertex_size); bglBegin(GL_POINTS); bglVertex3fv(co); bglEnd(); - - UI_ThemeColor4(data->sel ? TH_VERTEX_SELECT : TH_VERTEX); - glPointSize(size); + + glColor4ubv(data->sel ? data->th_vertex_select : data->th_vertex); + glPointSize(data->th_vertex_size); bglBegin(GL_POINTS); } else { @@ -2422,13 +2450,27 @@ static void draw_dm_verts__mapFunc(void *userData, int index, const float co[3], } } -static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert *eve_act) +static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert *eve_act, + RegionView3D *rv3d) { drawDMVerts_userData data; data.sel = sel; data.eve_act = eve_act; data.em = em; + /* Cache theme values */ + UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, data.th_editmesh_active); + UI_GetThemeColor4ubv(TH_VERTEX_SELECT, data.th_vertex_select); + UI_GetThemeColor4ubv(TH_VERTEX, data.th_vertex); + UI_GetThemeColor4ubv(TH_SKIN_ROOT, data.th_skin_root); + data.th_vertex_size = UI_GetThemeValuef(TH_VERTEX_SIZE); + + /* For skin root drawing */ + data.has_vskin = CustomData_has_layer(&em->bm->vdata, CD_MVERT_SKIN); + /* view-aligned matrix */ + mult_m4_m4m4(data.imat, rv3d->viewmat, em->ob->obmat); + invert_m4(data.imat); + bglBegin(GL_POINTS); dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data); bglEnd(); @@ -2711,7 +2753,8 @@ static void draw_dm_bweights(BMEditMesh *em, Scene *scene, DerivedMesh *dm) /* EditMesh drawing routines*/ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, - BMEditMesh *em, DerivedMesh *cageDM, BMVert *eve_act) + BMEditMesh *em, DerivedMesh *cageDM, BMVert *eve_act, + RegionView3D *rv3d) { ToolSettings *ts = scene->toolsettings; int sel; @@ -2750,7 +2793,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, if (ts->selectmode & SCE_SELECT_VERTEX) { glPointSize(size); glColor4ubv(col); - draw_dm_verts(em, cageDM, sel, eve_act); + draw_dm_verts(em, cageDM, sel, eve_act, rv3d); } if (check_ob_drawface_dot(scene, v3d, obedit->dt)) { @@ -3228,7 +3271,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act); } if (em) { - draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act); + draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act, rv3d); if (me->drawflag & ME_DRAWNORMALS) { UI_ThemeColor(TH_NORMAL); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 0c6e13051bb..bec07d81b84 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2335,6 +2335,9 @@ CustomDataMask ED_view3d_object_datamask(Scene *scene) if (ob->mode & OB_MODE_WEIGHT_PAINT) { mask |= CD_MASK_PREVIEW_MCOL; } + + if (ob->mode & OB_MODE_EDIT) + mask |= CD_MASK_MVERT_SKIN; } return mask; From 0cdd5892faa0524fc9f18fa76ce06cd66c5d75f6 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:29:37 +0000 Subject: [PATCH 113/159] Ensure skin nodes get created when adding modifier. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- .../blender/editors/object/object_modifier.c | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 47748fbd53b..60a11f59f0e 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -85,6 +85,8 @@ #include "object_intern.h" +static void modifier_skin_customdata_ensure(struct Object *ob); + /******************************** API ****************************/ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type) @@ -157,6 +159,10 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc /* ensure that grid paint mask layer is created */ ED_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md); } + else if(type == eModifierType_Skin) { + /* ensure skin-node customdata exists */ + modifier_skin_customdata_ensure(ob); + } } DAG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -1327,6 +1333,41 @@ void OBJECT_OT_multires_base_apply(wmOperatorType *ot) } +/************************** skin modifier ***********************/ + +static void modifier_skin_customdata_ensure(Object *ob) +{ + Mesh *me = ob->data; + BMesh *bm = me->edit_btmesh ? me->edit_btmesh->bm : NULL; + MVertSkin *vs; + + if (bm && !CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) { + BMVert *v; + BMIter iter; + + BM_data_layer_add(bm, &bm->vdata, CD_MVERT_SKIN); + + /* Mark an arbitrary vertex as root */ + BM_ITER_MESH(v, &iter, bm, BM_VERTS_OF_MESH) { + vs = CustomData_bmesh_get(&bm->vdata, v->head.data, + CD_MVERT_SKIN); + vs->flag |= MVERT_SKIN_ROOT; + break; + } + } + else if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) { + vs = CustomData_add_layer(&me->vdata, + CD_MVERT_SKIN, + CD_DEFAULT, + NULL, + me->totvert); + + /* Mark an arbitrary vertex as root */ + vs->flag |= MVERT_SKIN_ROOT; + } +} + + /************************ mdef bind operator *********************/ static int meshdeform_poll(bContext *C) From 11309a19e2cdeaeed3a2462b1bcb4138084cd7bf Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:29:44 +0000 Subject: [PATCH 114/159] Add skin vertex operators. * Add operator to mark selected vertices as skin roots. * Add operator to mark/clear selected vertices as loose. * Add operator to equalize skin radii. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- source/blender/editors/object/object_intern.h | 3 + .../blender/editors/object/object_modifier.c | 175 ++++++++++++++++++ source/blender/editors/object/object_ops.c | 3 + 3 files changed, 181 insertions(+) diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index e834c93b0d8..2bd53a3c0a7 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -160,6 +160,9 @@ void OBJECT_OT_multires_external_pack(struct wmOperatorType *ot); void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot); void OBJECT_OT_explode_refresh(struct wmOperatorType *ot); void OBJECT_OT_ocean_bake(struct wmOperatorType *ot); +void OBJECT_OT_skin_root_mark(struct wmOperatorType *ot); +void OBJECT_OT_skin_loose_mark_clear(struct wmOperatorType *ot); +void OBJECT_OT_skin_radii_equalize(struct wmOperatorType *ot); /* object_constraint.c */ void OBJECT_OT_constraint_add(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 60a11f59f0e..e98ff4a6984 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1367,6 +1367,181 @@ static void modifier_skin_customdata_ensure(Object *ob) } } +static int skin_edit_poll(bContext *C) +{ + return (CTX_data_edit_object(C) && + edit_modifier_poll_generic(C, &RNA_SkinModifier, (1<vdata, + v2->head.data, + CD_MVERT_SKIN); + + /* clear vertex root flag and add to visited set */ + vs->flag &= ~MVERT_SKIN_ROOT; + BLI_ghash_insert(visited, v2, v2); + + skin_root_clear(bm, v2, visited); + } + } +} + +static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Object *ob= CTX_data_edit_object(C); + Mesh *me = ob->data; + BMesh *bm = me->edit_btmesh->bm; + BMVert *bm_vert; + BMIter bm_iter; + GHash *visited; + + visited = BLI_ghash_ptr_new("skin_root_mark_exec visited"); + + modifier_skin_customdata_ensure(ob); + + BM_ITER_MESH(bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { + if(!BLI_ghash_lookup(visited, bm_vert) && + bm_vert->head.hflag & BM_ELEM_SELECT) + { + MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, + bm_vert->head.data, + CD_MVERT_SKIN); + + /* mark vertex as root and add to visited set */ + vs->flag |= MVERT_SKIN_ROOT; + BLI_ghash_insert(visited, bm_vert, bm_vert); + + /* clear root flag from all connected vertices (recursively) */ + skin_root_clear(bm, bm_vert, visited); + } + } + + BLI_ghash_free(visited, NULL, NULL); + + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_skin_root_mark(wmOperatorType *ot) +{ + ot->name = "Skin Root Mark"; + ot->description = "Mark selected vertices as roots"; + ot->idname = "OBJECT_OT_skin_root_mark"; + + ot->poll = skin_edit_poll; + ot->exec = skin_root_mark_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +typedef enum { + SKIN_LOOSE_MARK, + SKIN_LOOSE_CLEAR, +} SkinLooseAction; + +static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_edit_object(C); + Mesh *me = ob->data; + BMesh *bm = me->edit_btmesh->bm; + BMVert *bm_vert; + BMIter bm_iter; + SkinLooseAction action = RNA_enum_get(op->ptr, "action"); + + BM_ITER_MESH(bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { + if (bm_vert->head.hflag & BM_ELEM_SELECT) { + MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, + bm_vert->head.data, + CD_MVERT_SKIN); + + + switch (action) { + case SKIN_LOOSE_MARK: + vs->flag |= MVERT_SKIN_LOOSE; + break; + case SKIN_LOOSE_CLEAR: + vs->flag &= ~MVERT_SKIN_LOOSE; + break; + } + } + } + + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_skin_loose_mark_clear(wmOperatorType *ot) +{ + static EnumPropertyItem action_items[] = { + {SKIN_LOOSE_MARK, "MARK", 0, "Mark", "Mark selected vertices as loose"}, + {SKIN_LOOSE_CLEAR, "CLEAR", 0, "Clear", "Set selected vertices as not loose"}, + {0, NULL, 0, NULL, NULL}}; + + ot->name = "Skin Mark/Clear Loose"; + ot->description = "Mark/clear selected vertices as loose"; + ot->idname = "OBJECT_OT_skin_loose_mark_clear"; + + ot->poll = skin_edit_poll; + ot->exec = skin_loose_mark_clear_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "action", action_items, SKIN_LOOSE_MARK, "Action", NULL); +} + +static int skin_radii_equalize_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Object *ob= CTX_data_edit_object(C); + Mesh *me = ob->data; + BMesh *bm = me->edit_btmesh->bm; + BMVert *bm_vert; + BMIter bm_iter; + + BM_ITER_MESH(bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { + if (bm_vert->head.hflag & BM_ELEM_SELECT) { + MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, + bm_vert->head.data, + CD_MVERT_SKIN); + float avg = (vs->radius[0] + vs->radius[1]) * 0.5f; + + vs->radius[0] = vs->radius[1] = avg; + } + } + + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_skin_radii_equalize(wmOperatorType *ot) +{ + ot->name = "Skin Radii Equalize"; + ot->description = "Make skin radii of selected vertices equal"; + ot->idname = "OBJECT_OT_skin_radii_equalize"; + + ot->poll = skin_edit_poll; + ot->exec = skin_radii_equalize_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + /************************ mdef bind operator *********************/ diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index d618d17f797..1f09d8fd5e4 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -139,6 +139,9 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_multires_base_apply); WM_operatortype_append(OBJECT_OT_multires_external_save); WM_operatortype_append(OBJECT_OT_multires_external_pack); + WM_operatortype_append(OBJECT_OT_skin_root_mark); + WM_operatortype_append(OBJECT_OT_skin_loose_mark_clear); + WM_operatortype_append(OBJECT_OT_skin_radii_equalize); WM_operatortype_append(OBJECT_OT_meshdeform_bind); WM_operatortype_append(OBJECT_OT_explode_refresh); WM_operatortype_append(OBJECT_OT_ocean_bake); From 45265b326a2854a59327c3d171a3f4797944cc79 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:29:57 +0000 Subject: [PATCH 115/159] Add operator to extract armature and vertex groups from skin. * The operator creates bones for each input edge (does not subdivide them like the skin operator does), adds a fake root bone for skin roots with multiple children. * The operator adds vertex weight groups to the original mesh. * Make copy_object_transform() public, used to match the armature object to the mesh object. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- source/blender/blenkernel/BKE_object.h | 1 + source/blender/blenkernel/intern/customdata.c | 2 +- source/blender/blenkernel/intern/object.c | 4 +- source/blender/editors/object/object_intern.h | 1 + .../blender/editors/object/object_modifier.c | 194 ++++++++++++++++++ source/blender/editors/object/object_ops.c | 2 + 6 files changed, 201 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 1cdf2ee2e14..890fc40c284 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -53,6 +53,7 @@ struct MovieClip; void BKE_object_workob_clear(struct Object *workob); void BKE_object_workob_calc_parent(struct Scene *scene, struct Object *ob, struct Object *workob); +void BKE_object_transform_copy(struct Object *ob_tar, const struct Object *ob_src); struct SoftBody *copy_softbody(struct SoftBody *sb); struct BulletSoftBody *copy_bulletsoftbody(struct BulletSoftBody *sb); void BKE_object_copy_particlesystems(struct Object *obn, struct Object *ob); diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 645267fce34..04bce0a8f63 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -1168,7 +1168,7 @@ const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_PREVIEW_MLOOPCOL | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_PREVIEW_MCOL | CD_MASK_NORMAL | CD_MASK_SHAPEKEY | CD_MASK_RECAST | - CD_MASK_ORIGINDEX | CD_MASK_POLYINDEX; + CD_MASK_ORIGINDEX | CD_MASK_POLYINDEX | CD_MASK_MVERT_SKIN; const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 6f6881ce317..8de832e508d 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1090,7 +1090,7 @@ Object *BKE_object_pose_armature_get(Object *ob) return NULL; } -static void copy_object_transform(Object *ob_tar, Object *ob_src) +void BKE_object_transform_copy(Object *ob_tar, const Object *ob_src) { copy_v3_v3(ob_tar->loc, ob_src->loc); copy_v3_v3(ob_tar->rot, ob_src->rot); @@ -1365,7 +1365,7 @@ void BKE_object_make_proxy(Object *ob, Object *target, Object *gob) BKE_object_apply_mat4(ob, ob->obmat, FALSE, TRUE); } else { - copy_object_transform(ob, target); + BKE_object_transform_copy(ob, target); ob->parent = target->parent; /* libdata */ copy_m4_m4(ob->parentinv, target->parentinv); } diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 2bd53a3c0a7..4b33c5663ba 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -163,6 +163,7 @@ void OBJECT_OT_ocean_bake(struct wmOperatorType *ot); void OBJECT_OT_skin_root_mark(struct wmOperatorType *ot); void OBJECT_OT_skin_loose_mark_clear(struct wmOperatorType *ot); void OBJECT_OT_skin_radii_equalize(struct wmOperatorType *ot); +void OBJECT_OT_skin_armature_create(struct wmOperatorType *ot); /* object_constraint.c */ void OBJECT_OT_constraint_add(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index e98ff4a6984..e13e15e2a69 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -35,6 +35,7 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" +#include "DNA_armature_types.h" #include "DNA_curve_types.h" #include "DNA_key_types.h" #include "DNA_mesh_types.h" @@ -42,6 +43,7 @@ #include "DNA_object_force.h" #include "DNA_scene_types.h" +#include "BLI_bitmap.h" #include "BLI_math.h" #include "BLI_listbase.h" #include "BLI_string.h" @@ -1367,6 +1369,12 @@ static void modifier_skin_customdata_ensure(Object *ob) } } +static int skin_poll(bContext *C) +{ + return (!CTX_data_edit_object(C) && + edit_modifier_poll_generic(C, &RNA_SkinModifier, (1<flag = OPTYPE_REGISTER|OPTYPE_UNDO; } +static void skin_armature_bone_create(Object *skin_ob, + MVert *mvert, MEdge *medge, + bArmature *arm, + BLI_bitmap edges_visited, + const MeshElemMap *emap, + EditBone *parent_bone, + int parent_v) +{ + int i; + + for(i = 0; i < emap[parent_v].count; i++) { + int endx = emap[parent_v].indices[i]; + const MEdge *e = &medge[endx]; + EditBone *bone; + bDeformGroup *dg; + int v; + + /* ignore edge if already visited */ + if(BLI_BITMAP_GET(edges_visited, endx)) + continue; + BLI_BITMAP_SET(edges_visited, endx); + + v = (e->v1 == parent_v ? e->v2 : e->v1); + + bone = MEM_callocN(sizeof(EditBone), + "skin_armature_bone_create EditBone"); + + bone->parent = parent_bone; + bone->layer = 1; + bone->flag |= BONE_CONNECTED; + + copy_v3_v3(bone->head, mvert[parent_v].co); + copy_v3_v3(bone->tail, mvert[v].co); + bone->rad_head = bone->rad_tail = 0.25; + BLI_snprintf(bone->name, sizeof(bone->name), "Bone.%.2d", endx); + + BLI_addtail(arm->edbo, bone); + + /* add bDeformGroup */ + if((dg = ED_vgroup_add_name(skin_ob, bone->name))) { + ED_vgroup_vert_add(skin_ob, dg, parent_v, 1, WEIGHT_REPLACE); + ED_vgroup_vert_add(skin_ob, dg, v, 1, WEIGHT_REPLACE); + } + + skin_armature_bone_create(skin_ob, + mvert, medge, + arm, + edges_visited, + emap, + bone, + v); + } +} + +static Object *modifier_skin_armature_create(struct Scene *scene, + Object *skin_ob) +{ + BLI_bitmap edges_visited; + DerivedMesh *deform_dm; + MVert *mvert; + Mesh *me = skin_ob->data; + Object *arm_ob; + bArmature *arm; + MVertSkin *mvert_skin; + MeshElemMap *emap; + int *emap_mem; + int v; + + deform_dm = mesh_get_derived_deform(scene, skin_ob, CD_MASK_BAREMESH); + mvert = deform_dm->getVertArray(deform_dm); + + /* add vertex weights to original mesh */ + CustomData_add_layer(&me->vdata, + CD_MDEFORMVERT, + CD_CALLOC, + NULL, + me->totvert); + + arm_ob = BKE_object_add(scene, OB_ARMATURE); + BKE_object_transform_copy(arm_ob, skin_ob); + arm = arm_ob->data; + arm->layer = 1; + arm_ob->dtx |= OB_DRAWXRAY; + arm->drawtype = ARM_LINE; + arm->edbo = MEM_callocN(sizeof(ListBase), "edbo armature"); + + mvert_skin = CustomData_get_layer(&me->vdata, CD_MVERT_SKIN); + create_vert_edge_map(&emap, &emap_mem, + me->medge, me->totvert, me->totedge); + + edges_visited = BLI_BITMAP_NEW(me->totedge, "edge_visited"); + + /* note: we use EditBones here, easier to set them up and use + * edit-armature functions to convert back to regular bones */ + for(v = 0; v < me->totvert; v++) { + if(mvert_skin[v].flag & MVERT_SKIN_ROOT) { + EditBone *bone = NULL; + + /* Unless the skin root has just one adjacent edge, create + a fake root bone (have it going off in the Y direction + (arbitrary) */ + if (emap[v].count > 1) { + bone = MEM_callocN(sizeof(EditBone), "EditBone"); + + copy_v3_v3(bone->head, me->mvert[v].co); + copy_v3_v3(bone->tail, me->mvert[v].co); + bone->layer = 1; + + bone->head[1] = 1.0f; + bone->rad_head = bone->rad_tail = 0.25; + + BLI_addtail(arm->edbo, bone); + } + + if(emap[v].count >= 1) { + skin_armature_bone_create(skin_ob, + mvert, me->medge, + arm, + edges_visited, + emap, + bone, + v); + } + } + } + + MEM_freeN(edges_visited); + MEM_freeN(emap); + MEM_freeN(emap_mem); + + ED_armature_from_edit(arm_ob); + ED_armature_edit_free(arm_ob); + + return arm_ob; +} + +static int skin_armature_create_exec(bContext *C, wmOperator *op) +{ + Main *bmain = CTX_data_main(C); + Scene *scene = CTX_data_scene(C); + Object *ob = CTX_data_active_object(C), *arm_ob; + ModifierData *skin_md; + ArmatureModifierData *arm_md; + + /* create new armature */ + arm_ob = modifier_skin_armature_create(scene, ob); + + /* add a modifier to connect the new armature to the mesh */ + arm_md= (ArmatureModifierData*)modifier_new(eModifierType_Armature); + if (arm_md) { + skin_md = edit_modifier_property_get(op, ob, eModifierType_Skin); + BLI_insertlinkafter(&ob->modifiers, skin_md, arm_md); + + arm_md->object = arm_ob; + arm_md->deformflag = ARM_DEF_VGROUP | ARM_DEF_QUATERNION; + DAG_scene_sort(bmain, scene); + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + } + + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + + return OPERATOR_FINISHED; +} + +static int skin_armature_create_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) +{ + if (edit_modifier_invoke_properties(C, op)) + return skin_armature_create_exec(C, op); + else + return OPERATOR_CANCELLED; +} + +void OBJECT_OT_skin_armature_create(wmOperatorType *ot) +{ + ot->name = "Skin Armature Create"; + ot->description = "Create an armature that parallels the skin layout"; + ot->idname = "OBJECT_OT_skin_armature_create"; + + ot->poll = skin_poll; + ot->invoke = skin_armature_create_invoke; + ot->exec = skin_armature_create_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); +} /************************ mdef bind operator *********************/ diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 1f09d8fd5e4..01f6b641709 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -142,6 +142,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_skin_root_mark); WM_operatortype_append(OBJECT_OT_skin_loose_mark_clear); WM_operatortype_append(OBJECT_OT_skin_radii_equalize); + WM_operatortype_append(OBJECT_OT_skin_armature_create); + WM_operatortype_append(OBJECT_OT_meshdeform_bind); WM_operatortype_append(OBJECT_OT_explode_refresh); WM_operatortype_append(OBJECT_OT_ocean_bake); From ec29e2620ea41a14fbf2ee78389bcd7e3649a87f Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:30:05 +0000 Subject: [PATCH 116/159] Clear skin root flag on new vertices created by extruding. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- source/blender/bmesh/operators/bmo_extrude.c | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/source/blender/bmesh/operators/bmo_extrude.c b/source/blender/bmesh/operators/bmo_extrude.c index 4bac54794bf..09b79376ff6 100644 --- a/source/blender/bmesh/operators/bmo_extrude.c +++ b/source/blender/bmesh/operators/bmo_extrude.c @@ -26,9 +26,13 @@ #include "MEM_guardedalloc.h" +#include "DNA_meshdata_types.h" + #include "BLI_math.h" #include "BLI_array.h" +#include "BKE_customdata.h" + #include "bmesh.h" #include "intern/bmesh_operators_private.h" /* own include */ @@ -167,6 +171,16 @@ static void bm_extrude_copy_face_loop_attributes(BMesh *bm, BMFace *f, BMEdge *e BM_elem_attrs_copy(bm, bm, l_src_1, l_dst_b); } +/* Disable the skin root flag on the input vert, assumes that the vert + data includes an CD_MVERT_SKIN layer */ +static void bm_extrude_disable_skin_root(BMesh *bm, BMVert *v) +{ + MVertSkin *vs; + + vs = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_MVERT_SKIN); + vs->flag &= ~MVERT_SKIN_ROOT; +} + void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op) { BMOIter siter; @@ -184,6 +198,13 @@ void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op) BMO_op_initf(bm, &dupeop, "dupe geom=%fve", EXT_INPUT); BMO_op_exec(bm, &dupeop); + /* disable root flag on all new skin nodes */ + if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) { + BMO_ITER(v1, &siter, bm, &dupeop, "newout", BM_VERT) { + bm_extrude_disable_skin_root(bm, v1); + } + } + for (e = BMO_iter_new(&siter, bm, &dupeop, "boundarymap", 0); e; e = BMO_iter_step(&siter)) { e2 = BMO_iter_map_value(&siter); e2 = *(BMEdge **)e2; @@ -224,9 +245,12 @@ void bmo_extrude_vert_indiv_exec(BMesh *bm, BMOperator *op) BMOIter siter; BMVert *v, *dupev; BMEdge *e; + const int has_vskin = CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN); for (v = BMO_iter_new(&siter, bm, op, "verts", BM_VERT); v; v = BMO_iter_step(&siter)) { dupev = BM_vert_create(bm, v->co, v); + if (has_vskin) + bm_extrude_disable_skin_root(bm, v); e = BM_edge_create(bm, v, dupev, NULL, FALSE); @@ -324,6 +348,13 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op) BMO_slot_copy(op, &dupeop, "edgefacein", "geom"); BMO_op_exec(bm, &dupeop); + /* disable root flag on all new skin nodes */ + if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) { + BMO_ITER(v, &siter, bm, &dupeop, "newout", BM_VERT) { + bm_extrude_disable_skin_root(bm, v); + } + } + if (bm->act_face && BMO_elem_flag_test(bm, bm->act_face, EXT_INPUT)) bm->act_face = BMO_slot_map_ptr_get(bm, &dupeop, "facemap", bm->act_face); From 6c67fc83ead6f54efb9d5a4c57e21362b6d888a2 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:30:14 +0000 Subject: [PATCH 117/159] Add vertex skin radii scaling as a transform operator. Add a new transform operator, "Skin Resize", which scales the X and Y axes of the radius field in MVertSkin. It's bound to CTRL+AKEY. Skin modifier documentation: http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier --- source/blender/editors/include/ED_transform.h | 1 + source/blender/editors/transform/transform.c | 95 ++++++++++++++++++- source/blender/editors/transform/transform.h | 3 + .../editors/transform/transform_conversions.c | 22 ++++- .../blender/editors/transform/transform_ops.c | 36 +++++++ 5 files changed, 154 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h index 1cc82f19515..3bef1f56655 100644 --- a/source/blender/editors/include/ED_transform.h +++ b/source/blender/editors/include/ED_transform.h @@ -58,6 +58,7 @@ enum { TFM_TRANSLATION, TFM_ROTATION, TFM_RESIZE, + TFM_SKIN_RESIZE, TFM_TOSPHERE, TFM_SHEAR, TFM_WARP, diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index cefc6837e5f..496488922a5 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1633,6 +1633,9 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int case TFM_RESIZE: initResize(t); break; + case TFM_SKIN_RESIZE: + initSkinResize(t); + break; case TFM_TOSPHERE: initToSphere(t); break; @@ -2701,7 +2704,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) constraintSizeLim(t, td); } - + /* For individual element center, Editmode need to use iloc */ if (t->flag & T_POINTS) sub_v3_v3v3(vec, td->iloc, center); @@ -2799,6 +2802,96 @@ int Resize(TransInfo *t, const int mval[2]) return 1; } +/* ************************** SKIN *************************** */ + +void initSkinResize(TransInfo *t) +{ + t->mode = TFM_SKIN_RESIZE; + t->transform = SkinResize; + + initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP); + + t->flag |= T_NULL_ONE; + t->num.flag |= NUM_NULL_ONE; + t->num.flag |= NUM_AFFECT_ALL; + if (!t->obedit) { + t->flag |= T_NO_ZERO; + t->num.flag |= NUM_NO_ZERO; + } + + t->idx_max = 2; + t->num.idx_max = 2; + t->snap[0] = 0.0f; + t->snap[1] = 0.1f; + t->snap[2] = t->snap[1] * 0.1f; + + t->num.increment = t->snap[1]; +} + +int SkinResize(TransInfo *t, const int UNUSED(mval[2])) +{ + TransData *td; + float size[3], mat[3][3]; + float ratio; + int i; + char str[200]; + + ratio = t->values[0]; + size[0] = size[1] = size[2] = ratio; + + snapGrid(t, size); + + if (hasNumInput(&t->num)) { + applyNumInput(&t->num, size); + constraintNumInput(t, size); + } + + applySnapping(t, size); + + if (t->flag & T_AUTOVALUES) { + copy_v3_v3(size, t->auto_values); + } + + copy_v3_v3(t->values, size); + + size_to_mat3(mat, size); + + headerResize(t, size, str); + + for (i = 0, td = t->data; i < t->total; i++, td++) { + float tmat[3][3], smat[3][3]; + float fsize[3]; + + if (td->flag & TD_NOACTION) + break; + + if (td->flag & TD_SKIP) + continue; + + if (t->flag & T_EDIT) { + mul_m3_m3m3(smat, mat, td->mtx); + mul_m3_m3m3(tmat, td->smtx, smat); + } + else { + copy_m3_m3(tmat, mat); + } + + if (t->con.applySize) { + t->con.applySize(t, NULL, tmat); + } + + mat3_to_size(fsize, tmat); + td->val[0] = td->ext->isize[0] * (1 + (fsize[0] - 1) * td->factor); + td->val[1] = td->ext->isize[1] * (1 + (fsize[1] - 1) * td->factor); + } + + recalcData(t); + + ED_area_headerprint(t->sa, str); + + return 1; +} + /* ************************** TOSPHERE *************************** */ void initToSphere(TransInfo *t) diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index f902659a5c5..2d26de63471 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -464,6 +464,9 @@ int Shear(TransInfo *t, const int mval[2]); void initResize(TransInfo *t); int Resize(TransInfo *t, const int mval[2]); +void initSkinResize(TransInfo *t); +int SkinResize(TransInfo *t, const int mval[2]); + void initTranslation(TransInfo *t); int Translation(TransInfo *t, const int mval[2]); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 330be0a1628..8289cd0b10f 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1885,7 +1885,8 @@ static void get_edge_center(float cent_r[3], BMVert *eve) } /* way to overwrite what data is edited with transform */ -static void VertsToTransData(TransInfo *t, TransData *td, BMEditMesh *em, BMVert *eve, float *bweight) +static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx, + BMEditMesh *em, BMVert *eve, float *bweight) { td->flag = 0; //if (key) @@ -1919,12 +1920,23 @@ static void VertsToTransData(TransInfo *t, TransData *td, BMEditMesh *em, BMVert td->val = bweight; td->ival = bweight ? *(bweight) : 1.0f; } + else if(t->mode == TFM_SKIN_RESIZE) { + MVertSkin *vs = CustomData_bmesh_get(&em->bm->vdata, + eve->head.data, + CD_MVERT_SKIN); + /* skin node size */ + td->ext = tx; + copy_v3_v3(tx->isize, vs->radius); + tx->size = vs->radius; + td->val = vs->radius; + } } static void createTransEditVerts(bContext *C, TransInfo *t) { ToolSettings *ts = CTX_data_tool_settings(C); TransData *tob = NULL; + TransDataExtension *tx = NULL; BMEditMesh *em = BMEdit_FromObject(t->obedit); BMesh *bm = em->bm; BMVert *eve; @@ -2030,6 +2042,10 @@ static void createTransEditVerts(bContext *C, TransInfo *t) else t->total = countsel; tob= t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(Mesh EditMode)"); + if (t->mode == TFM_SKIN_RESIZE) { + tx = t->ext = MEM_callocN(t->total * sizeof(TransDataExtension), + "TransObData ext"); + } copy_m3_m4(mtx, t->obedit->obmat); invert_m3_m3(smtx, mtx); @@ -2081,7 +2097,9 @@ static void createTransEditVerts(bContext *C, TransInfo *t) if (propmode || selstate[a]) { float *bweight = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_BWEIGHT); - VertsToTransData(t, tob, em, eve, bweight); + VertsToTransData(t, tob, tx, em, eve, bweight); + if (tx) + tx++; /* selected */ if (selstate[a]) tob->flag |= TD_SELECTED; diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index b75e42c4df5..6fd8e07d34a 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -27,6 +27,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "RNA_access.h" @@ -63,6 +64,7 @@ static char OP_TRANSLATION[] = "TRANSFORM_OT_translate"; static char OP_ROTATION[] = "TRANSFORM_OT_rotate"; static char OP_TOSPHERE[] = "TRANSFORM_OT_tosphere"; static char OP_RESIZE[] = "TRANSFORM_OT_resize"; +static char OP_SKIN_RESIZE[] = "TRANSFORM_OT_skin_resize"; static char OP_SHEAR[] = "TRANSFORM_OT_shear"; static char OP_WARP[] = "TRANSFORM_OT_warp"; static char OP_SHRINK_FATTEN[] = "TRANSFORM_OT_shrink_fatten"; @@ -79,6 +81,7 @@ static void TRANSFORM_OT_translate(struct wmOperatorType *ot); static void TRANSFORM_OT_rotate(struct wmOperatorType *ot); static void TRANSFORM_OT_tosphere(struct wmOperatorType *ot); static void TRANSFORM_OT_resize(struct wmOperatorType *ot); +static void TRANSFORM_OT_skin_resize(struct wmOperatorType *ot); static void TRANSFORM_OT_shear(struct wmOperatorType *ot); static void TRANSFORM_OT_warp(struct wmOperatorType *ot); static void TRANSFORM_OT_shrink_fatten(struct wmOperatorType *ot); @@ -97,6 +100,7 @@ static TransformModeItem transform_modes[] = {OP_ROTATION, TFM_ROTATION, TRANSFORM_OT_rotate}, {OP_TOSPHERE, TFM_TOSPHERE, TRANSFORM_OT_tosphere}, {OP_RESIZE, TFM_RESIZE, TRANSFORM_OT_resize}, + {OP_SKIN_RESIZE, TFM_SKIN_RESIZE, TRANSFORM_OT_skin_resize}, {OP_SHEAR, TFM_SHEAR, TRANSFORM_OT_shear}, {OP_WARP, TFM_WARP, TRANSFORM_OT_warp}, {OP_SHRINK_FATTEN, TFM_SHRINKFATTEN, TRANSFORM_OT_shrink_fatten}, @@ -118,6 +122,7 @@ EnumPropertyItem transform_mode_types[] = {TFM_TRANSLATION, "TRANSLATION", 0, "Translation", ""}, {TFM_ROTATION, "ROTATION", 0, "Rotation", ""}, {TFM_RESIZE, "RESIZE", 0, "Resize", ""}, + {TFM_SKIN_RESIZE, "SKIN_RESIZE", 0, "Skin Resize", ""}, {TFM_TOSPHERE, "TOSPHERE", 0, "Tosphere", ""}, {TFM_SHEAR, "SHEAR", 0, "Shear", ""}, {TFM_WARP, "WARP", 0, "Warp", ""}, @@ -542,6 +547,35 @@ static void TRANSFORM_OT_resize(struct wmOperatorType *ot) Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP|P_OPTIONS); } +static int skin_resize_poll(bContext *C) +{ + struct Object *obedit = CTX_data_edit_object(C); + if (obedit && obedit->type == OB_MESH) { + BMEditMesh *em = BMEdit_FromObject(obedit); + return (em && CustomData_has_layer(&em->bm->vdata, CD_MVERT_SKIN)); + } + return 0; +} + +static void TRANSFORM_OT_skin_resize(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Skin Resize"; + ot->description = "Scale selected vertices' skin radii"; + ot->idname = OP_SKIN_RESIZE; + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; + + /* api callbacks */ + ot->invoke = transform_invoke; + ot->exec = transform_exec; + ot->modal = transform_modal; + ot->cancel = transform_cancel; + ot->poll = skin_resize_poll; + + RNA_def_float_vector(ot->srna, "value", 3, VecOne, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX); + + Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP|P_OPTIONS); +} static void TRANSFORM_OT_trackball(struct wmOperatorType *ot) { @@ -901,6 +935,8 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac kmi = WM_keymap_add_item(keymap, OP_RESIZE, TKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); RNA_boolean_set(kmi->ptr, "texture_space", TRUE); + WM_keymap_add_item(keymap, OP_SKIN_RESIZE, AKEY, KM_PRESS, KM_CTRL, 0); + break; case SPACE_ACTION: kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0); From cdba862223230ed0fd69df333296b800e156e961 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 15:49:41 +0000 Subject: [PATCH 118/159] use faces longest edge when orienting the manipulator to the active face also small speedup for finding the longest edge --- source/blender/bmesh/intern/bmesh_marking.c | 16 +------ source/blender/bmesh/intern/bmesh_queries.c | 49 ++++++++++++++------- source/blender/bmesh/intern/bmesh_queries.h | 3 ++ 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index a69558eeeca..4e3f50b1106 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -691,21 +691,9 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3]) } } else { - /* BMESH_TODO (not urgent, use longest ngon edge for alignment) */ + BMLoop *l_long = BM_face_find_longest_loop(efa); - /* start with v1-2 */ - sub_v3_v3v3(r_plane, verts[0]->co, verts[1]->co); - - /* test the edge between v2-3, use if longer */ - sub_v3_v3v3(vec, verts[1]->co, verts[2]->co); - if (dot_v3v3(r_plane, r_plane) < dot_v3v3(vec, vec)) - copy_v3_v3(r_plane, vec); - - /* test the edge between v1-3, use if longer */ - sub_v3_v3v3(vec, verts[2]->co, verts[0]->co); - if (dot_v3v3(r_plane, r_plane) < dot_v3v3(vec, vec)) { - copy_v3_v3(r_plane, vec); - } + sub_v3_v3v3(r_plane, l_long->v->co, l_long->next->v->co); } } diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 549cc44c338..94b221797b4 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -954,45 +954,60 @@ float BM_vert_calc_mean_tagged_edge_length(BMVert *v) /** * Returns the shortest edge in f. */ -BMEdge *BM_face_find_shortest_edge(BMFace *f) +BMLoop *BM_face_find_shortest_loop(BMFace *f) { - BMIter iter; - BMEdge *shortest_edge = NULL, *e; + BMLoop *shortest_loop = NULL; float shortest_len = FLT_MAX; - BM_ITER_ELEM(e, &iter, f, BM_EDGES_OF_FACE) { - float len = BM_edge_calc_length(e); + BMLoop *l_iter; + BMLoop *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + + do { + const float len = len_squared_v3v3(l_iter->v->co, l_iter->next->v->co); if (len <= shortest_len) { - shortest_edge = e; + shortest_loop = l_iter; shortest_len = len; } - } + } while ((l_iter = l_iter->next) != l_first); - return shortest_edge; + return shortest_loop; } /** * Returns the longest edge in f. */ -BMEdge *BM_face_find_longest_edge(BMFace *f) +BMLoop *BM_face_find_longest_loop(BMFace *f) { - BMIter iter; - BMEdge *longest_edge = NULL, *e; - float longest_len = 0; + BMLoop *longest_loop = NULL; + float longest_len = 0.0f; - BM_ITER_ELEM(e, &iter, f, BM_EDGES_OF_FACE) { - float len = BM_edge_calc_length(e); + BMLoop *l_iter; + BMLoop *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + + do { + const float len = len_squared_v3v3(l_iter->v->co, l_iter->next->v->co); if (len >= longest_len) { - longest_edge = e; + longest_loop = l_iter; longest_len = len; } - } + } while ((l_iter = l_iter->next) != l_first); - return longest_edge; + return longest_loop; } +BMEdge *BM_face_find_shortest_edge(BMFace *f) +{ + return BM_face_find_shortest_loop(f)->e; +} + +BMEdge *BM_face_find_longest_edge(BMFace *f) +{ + return BM_face_find_longest_loop(f)->e; +} /** * Returns the edge existing between v1 and v2, or NULL if there isn't one. diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 9712c0066b7..697990046be 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -70,6 +70,9 @@ float BM_vert_calc_mean_tagged_edge_length(BMVert *v); BMEdge *BM_face_find_shortest_edge(BMFace *f); BMEdge *BM_face_find_longest_edge(BMFace *f); +BMLoop *BM_face_find_shortest_loop(BMFace *f); +BMLoop *BM_face_find_longest_loop(BMFace *f); + BMEdge *BM_edge_exists(BMVert *v1, BMVert *v2); int BM_face_exists_overlap(BMesh *bm, BMVert **varr, int len, BMFace **r_existface); From 2d0c5b90179b14cd9d36807188e6cdca96e9124a Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 22 May 2012 15:50:13 +0000 Subject: [PATCH 119/159] Long old UI annoyance: The up/down triangle icon for menus was not drawing when a menu had an icon; even though space was reserved there. Note: this can only work now with removing the ugly "down triangle" icon from buttons like next to the Material list box (button pops up menu with tools). Looks nicer this way anyway. --- .../startup/bl_ui/properties_data_armature.py | 2 +- .../startup/bl_ui/properties_data_mesh.py | 4 ++-- .../startup/bl_ui/properties_material.py | 2 +- .../startup/bl_ui/properties_texture.py | 4 ++-- .../editors/interface/interface_widgets.c | 22 ++++++++++++++----- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py index 6bec652045e..1b7a8f4a66e 100644 --- a/release/scripts/startup/bl_ui/properties_data_armature.py +++ b/release/scripts/startup/bl_ui/properties_data_armature.py @@ -130,7 +130,7 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel): col.active = (ob.proxy is None) col.operator("pose.group_add", icon='ZOOMIN', text="") col.operator("pose.group_remove", icon='ZOOMOUT', text="") - col.menu("DATA_PT_bone_group_specials", icon='DOWNARROW_HLT', text="") + col.menu("DATA_PT_bone_group_specials", icon='BLANK1', text="") if group: col.separator() col.operator("pose.group_move", icon='TRIA_UP', text="").direction = 'UP' diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index 7ca464ce055..e23db7c59a1 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -149,7 +149,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel): col = row.column(align=True) col.operator("object.vertex_group_add", icon='ZOOMIN', text="") col.operator("object.vertex_group_remove", icon='ZOOMOUT', text="") - col.menu("MESH_MT_vertex_group_specials", icon='DOWNARROW_HLT', text="") + col.menu("MESH_MT_vertex_group_specials", icon='BLANK1', text="") if group: col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP' col.operator("object.vertex_group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' @@ -208,7 +208,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel): sub = col.column(align=True) sub.operator("object.shape_key_add", icon='ZOOMIN', text="").from_mix = False sub.operator("object.shape_key_remove", icon='ZOOMOUT', text="") - sub.menu("MESH_MT_shape_key_specials", icon='DOWNARROW_HLT', text="") + sub.menu("MESH_MT_shape_key_specials", icon='BLANK1', text="") if kb: col.separator() diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 6e66bd0d98b..d2fe40fe9dc 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -110,7 +110,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel): col.operator("object.material_slot_add", icon='ZOOMIN', text="") col.operator("object.material_slot_remove", icon='ZOOMOUT', text="") - col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="") + col.menu("MATERIAL_MT_specials", icon='BLANK1', text="") if ob.mode == 'EDIT': row = layout.row(align=True) diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py index 1d5e96cf701..976684ea742 100644 --- a/release/scripts/startup/bl_ui/properties_texture.py +++ b/release/scripts/startup/bl_ui/properties_texture.py @@ -130,7 +130,7 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, Panel): col = row.column(align=True) col.operator("texture.slot_move", text="", icon='TRIA_UP').type = 'UP' col.operator("texture.slot_move", text="", icon='TRIA_DOWN').type = 'DOWN' - col.menu("TEXTURE_MT_specials", icon='DOWNARROW_HLT', text="") + col.menu("TEXTURE_MT_specials", icon='BLANK1', text="") split = layout.split(percentage=0.65) col = split.column() @@ -511,7 +511,7 @@ class TEXTURE_PT_envmap(TextureTypePanel, Panel): row = layout.row() row.prop(env, "source", expand=True) - row.menu("TEXTURE_MT_envmap_specials", icon='DOWNARROW_HLT', text="") + row.menu("TEXTURE_MT_envmap_specials", icon='BLANK1', text="") if env.source == 'IMAGE_FILE': layout.template_ID(tex, "image", open="image.open") diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 42c6bfc3870..3824dcf0724 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -161,10 +161,12 @@ static unsigned int scroll_circle_face[14][3] = { {6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9} }; -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 float menu_tria_vert[6][2]= { +{-0.33, 0.16}, {0.33, 0.16}, {0, 0.82}, +{0, -0.82}, {-0.33, -0.16}, {0.33, -0.16}}; + + static unsigned int menu_tria_face[2][3] = {{2, 0, 1}, {3, 5, 4}}; @@ -3126,10 +3128,18 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct case MENU: case BLOCK: case ICONTEXTROW: + /* new node-link button, not active yet XXX */ if (but->flag & UI_BUT_NODE_LINK) wt = widget_type(UI_WTYPE_MENU_NODE_LINK); - else if (!but->str[0] && but->icon) - wt = widget_type(UI_WTYPE_MENU_ICON_RADIO); + + /* no text, with icon */ + else if (!but->str[0] && but->icon) { + if (but->flag & UI_ICON_PREVIEW) + wt= widget_type(UI_WTYPE_MENU_ICON_RADIO); /* no arrows */ + else + wt= widget_type(UI_WTYPE_MENU_RADIO); /* with arrows */ + } + /* with menu arrows */ else wt = widget_type(UI_WTYPE_MENU_RADIO); break; From d227d07112b9604f232223040a5ac4f15b1723d2 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 15:55:02 +0000 Subject: [PATCH 120/159] Fix for compiling with player after skin modifier commits. Removed the bad_level_call_stubs for BLI_heap functions; player is being linked with blenlib, so this gives multiple-definition linker errors. --- source/blenderplayer/bad_level_call_stubs/stubs.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index aa243edd96e..4c0115bc794 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -122,15 +122,6 @@ void EDBM_mesh_make(struct ToolSettings *ts, struct Scene *scene, struct Object void EDBM_mesh_normals_update(struct BMEditMesh *em) {} void *g_system; -struct Heap* BLI_heap_new (void){return NULL;} -void BLI_heap_free(struct Heap *heap, void *ptrfreefp) {} -struct HeapNode* BLI_heap_insert (struct Heap *heap, float value, void *ptr){return NULL;} -void BLI_heap_remove(struct Heap *heap, struct HeapNode *node) {} -int BLI_heap_empty(struct Heap *heap) {return 0;} -int BLI_heap_size(struct Heap *heap){return 0;} -struct HeapNode* BLI_heap_top (struct Heap *heap){return NULL;} -void* BLI_heap_popmin (struct Heap *heap){return NULL;} - void BLI_smallhash_init(struct SmallHash *hash) {} void BLI_smallhash_release(struct SmallHash *hash) {} void BLI_smallhash_insert(struct SmallHash *hash, uintptr_t key, void *item) {} From e1eeb817927a280b91a71d25b5b5166161096a90 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 15:57:42 +0000 Subject: [PATCH 121/159] style cleanu: skin modifier --- source/blender/modifiers/intern/MOD_skin.c | 278 ++++++++++----------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index ed227284e0a..c20ae734828 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -83,7 +83,7 @@ typedef struct { float mat[3][3]; /* Vert that edge is pointing away from, no relation to - MEdge.v1 */ + * MEdge.v1 */ int origin; } EMat; @@ -130,17 +130,17 @@ typedef struct { } SkinOutput; static void add_poly(SkinOutput *so, - BMVert *v1, - BMVert *v2, - BMVert *v3, - BMVert *v4); + BMVert *v1, + BMVert *v2, + BMVert *v3, + BMVert *v4); /***************************** Convex Hull ****************************/ static int is_quad_symmetric(BMVert *quad[4], - const SkinModifierData *smd) + const SkinModifierData *smd) { - const float threshold = 0.0001; + const float threshold = 0.0001f; int axis; for (axis = 0; axis < 3; axis++) { @@ -170,7 +170,7 @@ static int is_quad_symmetric(BMVert *quad[4], /* Returns true if the quad crosses the plane of symmetry, false otherwise */ static int quad_crosses_symmetry_plane(BMVert *quad[4], - const SkinModifierData *smd) + const SkinModifierData *smd) { int axis; @@ -196,7 +196,7 @@ static int quad_crosses_symmetry_plane(BMVert *quad[4], /* Returns true if the frame is filled by precisely two faces (and * outputs those faces to fill_faces), otherwise returns false. */ static int skin_frame_find_contained_faces(const Frame *frame, - BMFace *fill_faces[2]) + BMFace *fill_faces[2]) { BMEdge *diag; @@ -272,10 +272,10 @@ static int build_hull(SkinOutput *so, Frame **frames, int totframe) Frame *frame = frames[i]; if (!frame->detached && - (!BM_edge_exists(frame->verts[0], frame->verts[1]) || - !BM_edge_exists(frame->verts[1], frame->verts[2]) || - !BM_edge_exists(frame->verts[2], frame->verts[3]) || - !BM_edge_exists(frame->verts[3], frame->verts[0]))) + (!BM_edge_exists(frame->verts[0], frame->verts[1]) || + !BM_edge_exists(frame->verts[1], frame->verts[2]) || + !BM_edge_exists(frame->verts[2], frame->verts[3]) || + !BM_edge_exists(frame->verts[3], frame->verts[0]))) { frame->detached = TRUE; } @@ -328,7 +328,7 @@ static int build_hull(SkinOutput *so, Frame **frames, int totframe) static float frame_len(const Frame *frame) { return (len_v3v3(frame->co[0], frame->co[1]) + - len_v3v3(frame->co[1], frame->co[2])) * 0.5f; + len_v3v3(frame->co[1], frame->co[2])) * 0.5f; } static void merge_frame_corners(Frame **frames, int totframe) @@ -373,11 +373,11 @@ static void merge_frame_corners(Frame **frames, int totframe) * 'near' is based in the frames' minimum side * length */ dist = len_v3v3(frames[i]->co[j], - frames[k]->co[l]); + frames[k]->co[l]); if (dist < thresh) { mid_v3_v3v3(mid, - frames[i]->co[j], - frames[k]->co[l]); + frames[i]->co[j], + frames[k]->co[l]); copy_v3_v3(frames[i]->co[j], mid); copy_v3_v3(frames[k]->co[l], mid); @@ -396,16 +396,16 @@ static void merge_frame_corners(Frame **frames, int totframe) } static Frame **collect_hull_frames(int v, SkinNode *frames, - const MeshElemMap *emap, const MEdge *medge, - int *tothullframe) + const MeshElemMap *emap, const MEdge *medge, + int *tothullframe) { SkinNode *f; Frame **hull_frames; int nbr, i; (*tothullframe) = emap[v].count; - hull_frames = MEM_callocN(sizeof(Frame **) * (*tothullframe), - "hull_from_frames.hull_frames"); + hull_frames = MEM_callocN(sizeof(Frame * *) * (*tothullframe), + "hull_from_frames.hull_frames"); i = 0; for (nbr = 0; nbr < emap[v].count; nbr++) { const MEdge *e = &medge[emap[v].indices[nbr]]; @@ -436,8 +436,8 @@ static void node_frames_init(SkinNode *nf, int totframe) } static void create_frame(Frame *frame, const float co[3], - const float radius[2], - float mat[3][3], float offset) + const float radius[2], + float mat[3][3], float offset) { float rx[3], ry[3], rz[3]; int i; @@ -468,8 +468,8 @@ static float half_v2(const float v[2]) } static void end_node_frames(int v, SkinNode *skin_nodes, const MVert *mvert, - const MVertSkin *nodes, const MeshElemMap *emap, - EMat *emat) + const MVertSkin *nodes, const MeshElemMap *emap, + EMat *emat) { const float *rad = nodes[v].radius; float mat[3][3]; @@ -537,8 +537,8 @@ static int connection_node_mat(float mat[3][3], int v, const MeshElemMap *emap, } static void connection_node_frames(int v, SkinNode *skin_nodes, const MVert *mvert, - const MVertSkin *nodes, const MeshElemMap *emap, - EMat *emat) + const MVertSkin *nodes, const MeshElemMap *emap, + EMat *emat) { const float *rad = nodes[v].radius; float mat[3][3]; @@ -575,8 +575,8 @@ static void connection_node_frames(int v, SkinNode *skin_nodes, const MVert *mve } static SkinNode *build_frames(const MVert *mvert, int totvert, - const MVertSkin *nodes, const MeshElemMap *emap, - EMat *emat) + const MVertSkin *nodes, const MeshElemMap *emap, + EMat *emat) { SkinNode *skin_nodes; int v; @@ -628,15 +628,15 @@ static void calc_edge_mat(float mat[3][3], const float a[3], const float b[3]) } static void build_emats_rec(int *visited_e, EMat *emat, - const MeshElemMap *emap, const MEdge *medge, - const MVertSkin *vs, const MVert *mvert, - int parent_v, float parent_mat[3][3]) + const MeshElemMap *emap, const MEdge *medge, + const MVertSkin *vs, const MVert *mvert, + int parent_v, float parent_mat[3][3]) { float axis[3], angle; int i, e, v, parent_is_branch; parent_is_branch = ((emap[parent_v].count > 2) || - (vs[parent_v].flag & MVERT_SKIN_ROOT)); + (vs[parent_v].flag & MVERT_SKIN_ROOT)); for (i = 0; i < emap[parent_v].count; i++) { e = emap[parent_v].indices[i]; @@ -651,7 +651,7 @@ static void build_emats_rec(int *visited_e, EMat *emat, /* If parent is a branch node, start a new edge chain */ if (parent_is_branch) { calc_edge_mat(emat[e].mat, mvert[parent_v].co, - mvert[v].co); + mvert[v].co); } else { /* Build edge matrix guided by parent matrix */ @@ -665,12 +665,12 @@ static void build_emats_rec(int *visited_e, EMat *emat, } build_emats_rec(visited_e, emat, emap, medge, - vs, mvert, v, emat[e].mat); + vs, mvert, v, emat[e].mat); } } static EMat *build_edge_mats(MVertSkin *vs, MVert *mvert, int totvert, - MEdge *medge, MeshElemMap *emap, int totedge) + MEdge *medge, MeshElemMap *emap, int totedge) { EMat *emat; float mat[3][3]; @@ -685,7 +685,7 @@ static EMat *build_edge_mats(MVertSkin *vs, MVert *mvert, int totvert, if (emap[v].count >= 1) { const MEdge *e = &medge[emap[v].indices[0]]; calc_edge_mat(mat, mvert[v].co, - mvert[BKE_mesh_edge_other_vert(e, v)].co); + mvert[BKE_mesh_edge_other_vert(e, v)].co); build_emats_rec(visited_e, emat, emap, medge, vs, mvert, v, mat); } } @@ -705,7 +705,7 @@ static EMat *build_edge_mats(MVertSkin *vs, MVert *mvert, int totvert, * having any special cases for dealing with sharing a frame between * two hulls.) */ static int calc_edge_subdivisions(const MVert *mvert, const MVertSkin *nodes, - const MEdge *e, int *degree) + const MEdge *e, int *degree) { const MVertSkin *evs[2] = {&nodes[e->v1], &nodes[e->v2]}; float edge_len, avg[2]; @@ -716,7 +716,7 @@ static int calc_edge_subdivisions(const MVert *mvert, const MVertSkin *nodes, /* If either end is a branch node marked 'loose', don't subdivide * the edge (or subdivide just twice if both are branches) */ if ((v1_branch && (evs[0]->flag & MVERT_SKIN_LOOSE)) || - (v2_branch && (evs[1]->flag & MVERT_SKIN_LOOSE))) { + (v2_branch && (evs[1]->flag & MVERT_SKIN_LOOSE))) { if (v1_branch && v2_branch) return 2; else @@ -769,7 +769,7 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) edge_subd = MEM_callocN(sizeof(int) * totorigedge, "edge_subd"); for (i = 0, totsubd = 0; i < totorigedge; i++) { edge_subd[i] += calc_edge_subdivisions(origvert, orignode, - &origedge[i], degree); + &origedge[i], degree); totsubd += edge_subd[i]; } @@ -777,9 +777,9 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) /* Allocate output derivedmesh */ dm = CDDM_from_template(orig, - totorigvert + totsubd, - totorigedge + totsubd, - 0, 0, 0); + totorigvert + totsubd, + totorigedge + totsubd, + 0, 0, 0); outvert = dm->getVertArray(dm); outedge = dm->getEdgeArray(dm); @@ -788,8 +788,8 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) /* Copy original vertex data */ CustomData_copy_data(&orig->vertData, - &dm->vertData, - 0, 0, totorigvert); + &dm->vertData, + 0, 0, totorigvert); /* Subdivide edges */ for (i = 0, v = totorigvert; i < totorigedge; i++) { @@ -828,7 +828,7 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) u = e->v1; radrat = (half_v2(outnode[e->v2].radius) / - half_v2(outnode[e->v1].radius)); + half_v2(outnode[e->v1].radius)); radrat = (radrat + 1) / 2; /* Add vertices and edge segments */ @@ -838,12 +838,12 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) /* Interpolate vertex coord */ interp_v3_v3v3(outvert[v].co, outvert[e->v1].co, - outvert[e->v2].co, t); + outvert[e->v2].co, t); /* Interpolate skin radii */ interp_v3_v3v3(outnode[v].radius, - orignode[e->v1].radius, - orignode[e->v2].radius, t); + orignode[e->v1].radius, + orignode[e->v2].radius, t); /* Interpolate vertex group weights */ for (k = 0; k < totvgroup; k++) { @@ -879,10 +879,10 @@ static DerivedMesh *subdivide_base(DerivedMesh *orig) /* Can be either quad or triangle */ static void add_poly(SkinOutput *so, - BMVert *v1, - BMVert *v2, - BMVert *v3, - BMVert *v4) + BMVert *v1, + BMVert *v2, + BMVert *v3, + BMVert *v4) { BMVert *verts[4] = {v1, v2, v3, v4}; BMEdge *edges[4]; @@ -911,8 +911,8 @@ static void add_poly(SkinOutput *so, } static void connect_frames(SkinOutput *so, - BMVert *frame1[4], - BMVert *frame2[4]) + BMVert *frame1[4], + BMVert *frame2[4]) { BMVert *q[4][4] = {{frame2[0], frame2[1], frame1[1], frame1[0]}, {frame2[1], frame2[2], frame1[2], frame1[1]}, @@ -924,8 +924,8 @@ static void connect_frames(SkinOutput *so, /* Check if frame normals need swap */ sub_v3_v3v3(p, q[3][0]->co, q[0][0]->co); normal_quad_v3(no, - q[0][0]->co, q[0][1]->co, - q[0][2]->co, q[0][3]->co); + q[0][0]->co, q[0][1]->co, + q[0][2]->co, q[0][3]->co); swap = dot_v3v3(no, p) > 0; for (i = 0; i < 4; i++) { @@ -937,8 +937,8 @@ static void connect_frames(SkinOutput *so, } static void output_frames(BMesh *bm, - SkinNode *sn, - const MDeformVert *input_dvert) + SkinNode *sn, + const MDeformVert *input_dvert) { Frame *f; int i, j; @@ -953,8 +953,8 @@ static void output_frames(BMesh *bm, if (input_dvert) { MDeformVert *dv; dv = CustomData_bmesh_get(&bm->vdata, - v->head.data, - CD_MDEFORMVERT); + v->head.data, + CD_MDEFORMVERT); BLI_assert(dv->totweight == 0); defvert_copy(dv, input_dvert); @@ -977,16 +977,16 @@ static void calc_frame_center(float center[3], const Frame *frame) /* Does crappy fan triangulation of poly, may not be so accurate for * concave faces */ static int isect_ray_poly(const float ray_start[3], - const float ray_dir[3], - BMFace *f, - float *r_lambda) + const float ray_dir[3], + BMFace *f, + float *r_lambda) { BMVert *v, *v_first = NULL, *v_prev = NULL; BMIter iter; float best_dist = FLT_MAX; int hit = 0; - BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE) { + BM_ITER_ELEM (v, &iter, f, BM_VERTS_OF_FACE) { if (!v_first) v_first = v; else if (v_prev != v_first) { @@ -994,8 +994,8 @@ static int isect_ray_poly(const float ray_start[3], int curhit; curhit = isect_ray_tri_v3(ray_start, ray_dir, - v_first->co, v_prev->co, v->co, - &dist, NULL); + v_first->co, v_prev->co, v->co, + &dist, NULL); if (curhit && dist < best_dist) { hit = TRUE; best_dist = dist; @@ -1015,7 +1015,7 @@ static int isect_ray_poly(const float ray_start[3], * The orig_verts should contain the vertices of 'f' */ static BMFace *collapse_face_corners(BMesh *bm, BMFace *f, int n, - BMVert **orig_verts) + BMVert **orig_verts) { int orig_len = f->len; @@ -1048,14 +1048,14 @@ static BMFace *collapse_face_corners(BMesh *bm, BMFace *f, int n, /* Find the new face */ f = NULL; - BM_ITER_ELEM(vf, &iter, v_safe, BM_FACES_OF_VERT) { + BM_ITER_ELEM (vf, &iter, v_safe, BM_FACES_OF_VERT) { int wrong_face = FALSE; for (i = 0; i < orig_len; i++) { if (orig_verts[i] == v_merge) orig_verts[i] = NULL; else if (orig_verts[i] && - !BM_vert_in_face(vf, orig_verts[i])) + !BM_vert_in_face(vf, orig_verts[i])) { wrong_face = TRUE; break; @@ -1087,13 +1087,13 @@ static BMFace *skin_hole_target_face(BMesh *bm, Frame *frame) calc_frame_center(frame_center, frame); normal_quad_v3(frame_normal, frame->verts[3]->co, - frame->verts[2]->co, frame->verts[1]->co, - frame->verts[0]->co); + frame->verts[2]->co, frame->verts[1]->co, + frame->verts[0]->co); /* Use a line intersection test and nearest center test against * all faces */ isect_target_face = center_target_face = NULL; - BM_ITER_MESH(f, &iter, bm, BM_FACES_OF_MESH) { + BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { float dist, poly_center[3]; int hit; @@ -1130,7 +1130,7 @@ static BMFace *skin_hole_target_face(BMesh *bm, Frame *frame) /* Use edge-length heuristic to choose from eight possible polygon bridges */ static void skin_choose_quad_bridge_order(BMVert *a[4], BMVert *b[4], - int best_order[4]) + int best_order[4]) { int orders[8][4]; float shortest_len; @@ -1180,7 +1180,7 @@ static void skin_fix_hole_no_good_verts(BMesh *bm, Frame *frame, BMFace *split_f /* Update split face (should only be one new face created * during extrusion) */ split_face = NULL; - BMO_ITER(f, &oiter, bm, &op, "faceout", BM_FACE) { + BMO_ITER (f, &oiter, bm, &op, "faceout", BM_FACE) { BLI_assert(!split_face); split_face = f; } @@ -1196,19 +1196,19 @@ static void skin_fix_hole_no_good_verts(BMesh *bm, Frame *frame, BMFace *split_f BMO_mesh_flag_disable_all(bm, NULL, BM_EDGE, 1); BMO_elem_flag_enable(bm, longest_edge, 1); BMO_op_callf(bm, "esubd edges=%fe numcuts=%i quadcornertype=%i", - 1, 1, SUBD_STRAIGHT_CUT); + 1, 1, SUBD_STRAIGHT_CUT); } else if (split_face->len > 4) { /* Maintain a dynamic vert array containing the split_face's * vertices, avoids frequent allocs in collapse_face_corners() */ if (BLI_array_count(vert_buf) < split_face->len) { BLI_array_grow_items(vert_buf, (split_face->len - - BLI_array_count(vert_buf))); + BLI_array_count(vert_buf))); } /* Get split face's verts */ BM_iter_as_array(bm, BM_VERTS_OF_FACE, split_face, - (void **)verts, split_face->len); + (void **)verts, split_face->len); /* Earlier edge split operations may have turned some quads * into higher-degree faces */ @@ -1230,7 +1230,7 @@ static void skin_fix_hole_no_good_verts(BMesh *bm, Frame *frame, BMFace *split_f BMO_op_init(bm, &op, "weldverts"); for (i = 0; i < 4; i++) { BMO_slot_map_ptr_insert(bm, &op, "targetmap", - verts[i], frame->verts[best_order[i]]); + verts[i], frame->verts[best_order[i]]); } BMO_op_exec(bm, &op); BMO_op_finish(bm, &op); @@ -1271,8 +1271,8 @@ static void quad_from_tris(BMesh *bm, BMEdge *e, BMFace *adj[2], BMVert *ndx[4]) /* Find what the second tri has that the first doesn't */ for (i = 0; i < 3; i++) { if (tri[1][i] != tri[0][0] && - tri[1][i] != tri[0][1] && - tri[1][i] != tri[0][2]) + tri[1][i] != tri[0][1] && + tri[1][i] != tri[0][2]) { opp = tri[1][i]; break; @@ -1285,7 +1285,7 @@ static void quad_from_tris(BMesh *bm, BMEdge *e, BMFace *adj[2], BMVert *ndx[4]) /* When the triangle edge cuts across our quad-to-be, * throw in the second triangle's vertex */ if ((tri[0][i] == e->v1 || tri[0][i] == e->v2) && - (tri[0][(i + 1) % 3] == e->v1 || tri[0][(i + 1) % 3] == e->v2)) + (tri[0][(i + 1) % 3] == e->v1 || tri[0][(i + 1) % 3] == e->v2)) { j++; ndx[j] = opp; @@ -1311,7 +1311,7 @@ static int BM_face_share_face_count(BMFace *f1, BMFace *f2) int count = 0; BM_ITER_ELEM (e, &iter1, f1, BM_EDGES_OF_FACE) { - BM_ITER_ELEM(f, &iter2, e, BM_FACES_OF_EDGE) { + BM_ITER_ELEM (f, &iter2, e, BM_FACES_OF_EDGE) { if (f != f1 && f != f2 && BM_face_share_edge_count(f, f2)) count++; } @@ -1347,8 +1347,8 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd) /* Calculate a score for the quad, higher score for * triangles being closer to coplanar */ score = ((BM_face_calc_area(adj[0]) + - BM_face_calc_area(adj[1])) * - dot_v3v3(adj[0]->no, adj[1]->no)); + BM_face_calc_area(adj[1])) * + dot_v3v3(adj[0]->no, adj[1]->no)); /* Check if quad crosses the axis of symmetry */ if (quad_crosses_symmetry_plane(quad, smd)) { @@ -1362,7 +1362,7 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd) /* Don't use the quad if it's concave */ if (!is_quad_convex_v3(quad[0]->co, quad[1]->co, - quad[2]->co, quad[3]->co)) + quad[2]->co, quad[3]->co)) { continue; } @@ -1381,8 +1381,8 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd) /* If both triangles still free, and if they don't already * share a border with another face, output as a quad */ if (!BM_elem_flag_test(adj[0], BM_ELEM_TAG) && - !BM_elem_flag_test(adj[1], BM_ELEM_TAG) && - !BM_face_share_face_count(adj[0], adj[1])) + !BM_elem_flag_test(adj[1], BM_ELEM_TAG) && + !BM_face_share_face_count(adj[0], adj[1])) { add_quad_from_tris(so, e, adj); BM_elem_flag_enable(adj[0], BM_ELEM_TAG); @@ -1398,8 +1398,8 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd) } static void skin_merge_close_frame_verts(SkinNode *skin_nodes, int totvert, - const MeshElemMap *emap, - const MEdge *medge) + const MeshElemMap *emap, + const MEdge *medge) { Frame **hull_frames; int v, tothullframe; @@ -1408,8 +1408,8 @@ static void skin_merge_close_frame_verts(SkinNode *skin_nodes, int totvert, /* Only check branch nodes */ if (!skin_nodes[v].totframe) { hull_frames = collect_hull_frames(v, skin_nodes, - emap, medge, - &tothullframe); + emap, medge, + &tothullframe); merge_frame_corners(hull_frames, tothullframe); MEM_freeN(hull_frames); } @@ -1440,7 +1440,7 @@ static void skin_update_merged_vertices(SkinNode *skin_nodes, int totvert) } static void skin_fix_hull_topology(BMesh *bm, SkinNode *skin_nodes, - int totvert) + int totvert) { int v; @@ -1465,7 +1465,7 @@ static void skin_fix_hull_topology(BMesh *bm, SkinNode *skin_nodes, } static void skin_output_end_nodes(SkinOutput *so, SkinNode *skin_nodes, - int totvert) + int totvert) { int v; @@ -1477,38 +1477,38 @@ static void skin_output_end_nodes(SkinOutput *so, SkinNode *skin_nodes, int i, order[4]; skin_choose_quad_bridge_order(sn->frames[0].verts, - sn->frames[1].verts, - order); + sn->frames[1].verts, + order); for (i = 0; i < 4; i++) v_order[i] = sn->frames[1].verts[order[i]]; connect_frames(so, sn->frames[0].verts, v_order); } else if (sn->totframe == 2) { connect_frames(so, - sn->frames[0].verts, - sn->frames[1].verts); + sn->frames[0].verts, + sn->frames[1].verts); } if (sn->flag & CAP_START) { add_poly(so, - sn->frames[0].verts[3], - sn->frames[0].verts[2], - sn->frames[0].verts[1], - sn->frames[0].verts[0]); + sn->frames[0].verts[3], + sn->frames[0].verts[2], + sn->frames[0].verts[1], + sn->frames[0].verts[0]); } if (sn->flag & CAP_END) { add_poly(so, - sn->frames[1].verts[3], - sn->frames[1].verts[2], - sn->frames[1].verts[1], - sn->frames[1].verts[0]); + sn->frames[1].verts[3], + sn->frames[1].verts[2], + sn->frames[1].verts[1], + sn->frames[1].verts[0]); } } } static void skin_output_connections(SkinOutput *so, SkinNode *skin_nodes, - const MEdge *medge, - int totedge) + const MEdge *medge, + int totedge) { int e; @@ -1535,15 +1535,15 @@ static void skin_output_connections(SkinOutput *so, SkinNode *skin_nodes, } else { connect_frames(so, - a->frames[0].verts, - b->frames[0].verts); + a->frames[0].verts, + b->frames[0].verts); } } } } static void skin_smooth_hulls(BMesh *bm, SkinNode *skin_nodes, - int totvert, const SkinModifierData *smd) + int totvert, const SkinModifierData *smd) { BMIter iter, eiter; BMVert *v; @@ -1568,7 +1568,7 @@ static void skin_smooth_hulls(BMesh *bm, SkinNode *skin_nodes, skey = CustomData_number_of_layers(&bm->vdata, CD_SHAPEKEY) - 1; BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { copy_v3_v3(CustomData_bmesh_get_n(&bm->vdata, v->head.data, - CD_SHAPEKEY, skey), v->co); + CD_SHAPEKEY, skey), v->co); } /* Smooth vertices, weight unmarked vertices more strongly (helps @@ -1588,8 +1588,8 @@ static void skin_smooth_hulls(BMesh *bm, SkinNode *skin_nodes, BMVert *other = BM_edge_other_vert(e, v); add_v3_v3(avg, CustomData_bmesh_get_n(&bm->vdata, - other->head.data, - CD_SHAPEKEY, skey)); + other->head.data, + CD_SHAPEKEY, skey)); totv++; } @@ -1605,8 +1605,8 @@ static void skin_smooth_hulls(BMesh *bm, SkinNode *skin_nodes, /* Returns TRUE if all hulls are successfully built, FALSE otherwise */ static int skin_output_branch_hulls(SkinOutput *so, SkinNode *skin_nodes, - int totvert, const MeshElemMap *emap, - const MEdge *medge) + int totvert, const MeshElemMap *emap, + const MEdge *medge) { int result = TRUE, v; @@ -1619,8 +1619,8 @@ static int skin_output_branch_hulls(SkinOutput *so, SkinNode *skin_nodes, int tothullframe; hull_frames = collect_hull_frames(v, skin_nodes, - emap, medge, - &tothullframe); + emap, medge, + &tothullframe); if (!build_hull(so, hull_frames, tothullframe)) result = FALSE; @@ -1632,10 +1632,10 @@ static int skin_output_branch_hulls(SkinOutput *so, SkinNode *skin_nodes, } static BMesh *build_skin(SkinNode *skin_nodes, - int totvert, const MeshElemMap *emap, - const MEdge *medge, int totedge, - const MDeformVert *input_dvert, - SkinModifierData *smd) + int totvert, const MeshElemMap *emap, + const MEdge *medge, int totedge, + const MDeformVert *input_dvert, + SkinModifierData *smd) { SkinOutput so; int v; @@ -1655,7 +1655,7 @@ static BMesh *build_skin(SkinNode *skin_nodes, for (v = 0; v < totvert; ++v) { if (skin_nodes[v].totframe) output_frames(so.bm, &skin_nodes[v], - input_dvert ? &input_dvert[v] : NULL); + input_dvert ? &input_dvert[v] : NULL); } /* Update vertex pointers for merged frame corners */ @@ -1671,7 +1671,7 @@ static BMesh *build_skin(SkinNode *skin_nodes, /* Using convex hulls may not generate a nice manifold mesh. Two * problems can occur: an input frame's edges may be inside the * hull, and/or an input frame's vertices may be inside the hull. - * + * * General fix to produce manifold mesh: for any frame that is * partially detached, first detach it fully, then find a suitable * existing face to merge with. (Note that we do this after @@ -1695,7 +1695,7 @@ static void skin_set_orig_indices(DerivedMesh *dm) totpoly = dm->getNumPolys(dm); orig = CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, - CD_CALLOC, 0, totpoly); + CD_CALLOC, 0, totpoly); for (i = 0; i < totpoly; i++) orig[i] = ORIGINDEX_NONE; } @@ -1707,7 +1707,7 @@ static void skin_set_orig_indices(DerivedMesh *dm) * 3) Output vertices and polygons from frames, connections, and hulls */ static DerivedMesh *base_skin(DerivedMesh *origdm, - SkinModifierData *smd) + SkinModifierData *smd) { BMEditMesh fake_em; DerivedMesh *result; @@ -1759,7 +1759,7 @@ static DerivedMesh *base_skin(DerivedMesh *origdm, } static DerivedMesh *final_skin(SkinModifierData *smd, - DerivedMesh *origdm) + DerivedMesh *origdm) { DerivedMesh *dm; @@ -1780,7 +1780,7 @@ static DerivedMesh *final_skin(SkinModifierData *smd, static void initData(ModifierData *md) { - SkinModifierData *smd = (SkinModifierData*) md; + SkinModifierData *smd = (SkinModifierData *) md; /* Enable in editmode by default */ md->mode |= eModifierMode_Editmode; @@ -1792,38 +1792,38 @@ static void initData(ModifierData *md) static void copyData(ModifierData *md, ModifierData *target) { - SkinModifierData *smd = (SkinModifierData*) md; - SkinModifierData *tsmd = (SkinModifierData*) target; + SkinModifierData *smd = (SkinModifierData *) md; + SkinModifierData *tsmd = (SkinModifierData *) target; *tsmd = *smd; } static DerivedMesh *applyModifierEM(ModifierData *md, - Object *UNUSED(ob), - BMEditMesh *UNUSED(em), - DerivedMesh *dm) + Object *UNUSED(ob), + BMEditMesh *UNUSED(em), + DerivedMesh *dm) { DerivedMesh *result; - if (!(result = final_skin((SkinModifierData*)md, dm))) + if (!(result = final_skin((SkinModifierData *)md, dm))) return dm; return result; } static DerivedMesh *applyModifier(ModifierData *md, - Object *UNUSED(ob), - DerivedMesh *dm, - ModifierApplyFlag UNUSED(flag)) + Object *UNUSED(ob), + DerivedMesh *dm, + ModifierApplyFlag UNUSED(flag)) { DerivedMesh *result; - if (!(result = final_skin((SkinModifierData*)md, dm))) + if (!(result = final_skin((SkinModifierData *)md, dm))) return dm; return result; } static CustomDataMask requiredDataMask(Object *UNUSED(ob), - ModifierData *UNUSED(md)) + ModifierData *UNUSED(md)) { return CD_MASK_MVERT_SKIN | CD_MASK_MDEFORMVERT; } From 3fc3c9f3b4003dd26e1df8282942622cbdb9e954 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 16:09:31 +0000 Subject: [PATCH 122/159] style cleanup: relating to skin modifier --- source/blender/bmesh/intern/bmesh_marking.c | 2 - .../blender/editors/object/object_modifier.c | 42 +++++++++---------- .../blender/editors/space_view3d/drawobject.c | 2 +- source/blender/python/bmesh/bmesh_py_types.c | 6 +-- 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index 4e3f50b1106..1720ee4f55a 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -612,8 +612,6 @@ void BM_editselection_normal(BMEditSelection *ese, float r_normal[3]) } } -/* ref - editmesh_lib.cL:EM_editselection_plane() */ - /* Calculate a plane that is rightangles to the edge/vert/faces normal * also make the plane run along an axis that is related to the geometry, * because this is used for the manipulators Y axis. */ diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index e13e15e2a69..47557f49b9f 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1350,19 +1350,19 @@ static void modifier_skin_customdata_ensure(Object *ob) BM_data_layer_add(bm, &bm->vdata, CD_MVERT_SKIN); /* Mark an arbitrary vertex as root */ - BM_ITER_MESH(v, &iter, bm, BM_VERTS_OF_MESH) { + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { vs = CustomData_bmesh_get(&bm->vdata, v->head.data, - CD_MVERT_SKIN); + CD_MVERT_SKIN); vs->flag |= MVERT_SKIN_ROOT; break; } } else if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) { vs = CustomData_add_layer(&me->vdata, - CD_MVERT_SKIN, - CD_DEFAULT, - NULL, - me->totvert); + CD_MVERT_SKIN, + CD_DEFAULT, + NULL, + me->totvert); /* Mark an arbitrary vertex as root */ vs->flag |= MVERT_SKIN_ROOT; @@ -1372,13 +1372,13 @@ static void modifier_skin_customdata_ensure(Object *ob) static int skin_poll(bContext *C) { return (!CTX_data_edit_object(C) && - edit_modifier_poll_generic(C, &RNA_SkinModifier, (1<vdata, - v2->head.data, - CD_MVERT_SKIN); + v2->head.data, + CD_MVERT_SKIN); /* clear vertex root flag and add to visited set */ vs->flag &= ~MVERT_SKIN_ROOT; @@ -1416,13 +1416,13 @@ static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op)) modifier_skin_customdata_ensure(ob); - BM_ITER_MESH(bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { + BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { if(!BLI_ghash_lookup(visited, bm_vert) && bm_vert->head.hflag & BM_ELEM_SELECT) { MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, - bm_vert->head.data, - CD_MVERT_SKIN); + bm_vert->head.data, + CD_MVERT_SKIN); /* mark vertex as root and add to visited set */ vs->flag |= MVERT_SKIN_ROOT; @@ -1456,7 +1456,7 @@ void OBJECT_OT_skin_root_mark(wmOperatorType *ot) typedef enum { SKIN_LOOSE_MARK, - SKIN_LOOSE_CLEAR, + SKIN_LOOSE_CLEAR } SkinLooseAction; static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op) @@ -1468,11 +1468,11 @@ static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op) BMIter bm_iter; SkinLooseAction action = RNA_enum_get(op->ptr, "action"); - BM_ITER_MESH(bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { + BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { if (bm_vert->head.hflag & BM_ELEM_SELECT) { MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, - bm_vert->head.data, - CD_MVERT_SKIN); + bm_vert->head.data, + CD_MVERT_SKIN); switch (action) { @@ -1520,11 +1520,11 @@ static int skin_radii_equalize_exec(bContext *C, wmOperator *UNUSED(op)) BMVert *bm_vert; BMIter bm_iter; - BM_ITER_MESH(bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { + BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { if (bm_vert->head.hflag & BM_ELEM_SELECT) { MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, - bm_vert->head.data, - CD_MVERT_SKIN); + bm_vert->head.data, + CD_MVERT_SKIN); float avg = (vs->radius[0] + vs->radius[1]) * 0.5f; vs->radius[0] = vs->radius[1] = avg; diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 8d72e5d47ac..6ba506bbc5c 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -3007,7 +3007,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS BMLoop *loop; int is_first = TRUE; - BM_ITER_ELEM(loop, &liter, efa, BM_LOOPS_OF_FACE) { + BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) { if (is_face_sel || (do_moving && BM_elem_flag_test(loop->v, BM_ELEM_SELECT))) { float angle; diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index be5b4844ae6..6ca4ad15859 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -2065,7 +2065,7 @@ static PyObject *bpy_bmelemseq_index_update(BPy_BMElemSeq *self) int index = 0; const char htype = bm_iter_itype_htype_map[self->itype]; - BM_ITER_BPY_BM_SEQ(ele, &iter, self) { + BM_ITER_BPY_BM_SEQ (ele, &iter, self) { BM_elem_index_set(ele, index); /* set_dirty! */ index++; } @@ -2278,7 +2278,7 @@ static Py_ssize_t bpy_bmelemseq_length(BPy_BMElemSeq *self) BMHeader *ele; Py_ssize_t tot = 0; - BM_ITER_BPY_BM_SEQ(ele, &iter, self) { + BM_ITER_BPY_BM_SEQ (ele, &iter, self) { tot++; } return tot; @@ -2409,7 +2409,7 @@ static int bpy_bmelemseq_contains(BPy_BMElemSeq *self, PyObject *value) if (value_bm_ele->bm == self->bm) { BMElem *ele, *ele_test = value_bm_ele->ele; BMIter iter; - BM_ITER_BPY_BM_SEQ(ele, &iter, self) { + BM_ITER_BPY_BM_SEQ (ele, &iter, self) { if (ele == ele_test) { return 1; } From f16f545c6e78f8d677408b566dd2001dbb90e7f8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 16:24:09 +0000 Subject: [PATCH 123/159] style cleanup also fix example for mesh uv's --- doc/python_api/examples/bpy.types.Mesh.py | 2 +- .../editors/interface/interface_widgets.c | 16 +-- .../blender/editors/object/object_modifier.c | 115 +++++++++--------- .../blender/editors/sculpt_paint/paint_mask.c | 4 +- source/blender/editors/space_file/fsmenu.c | 2 +- source/blender/modifiers/intern/MOD_skin.c | 6 +- 6 files changed, 74 insertions(+), 71 deletions(-) diff --git a/doc/python_api/examples/bpy.types.Mesh.py b/doc/python_api/examples/bpy.types.Mesh.py index 1ee5118df6d..d30303f3b05 100644 --- a/doc/python_api/examples/bpy.types.Mesh.py +++ b/doc/python_api/examples/bpy.types.Mesh.py @@ -28,7 +28,7 @@ This example script prints the vertices and UV's for each polygon, assumes the a import bpy me = bpy.context.object.data -uv_layer = me.uv.layers.active.data +uv_layer = me.uv_layers.active.data for poly in me.polygons: print("Polygon index: %d, length: %d" % (poly.index, poly.loop_total)) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 3824dcf0724..2edc2b22e7e 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1165,11 +1165,13 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b if (fstyle->kerning == 1) BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT); - - // ui_rasterpos_safe(x, y, but->aspect); -// if (but->type==IDPOIN) transopts= 0; // no translation, of course! -// else transopts= ui_translate_buttons(); - + +#if 0 + ui_rasterpos_safe(x, y, but->aspect); + if (but->type == IDPOIN) transopts = 0; // no translation, of course! + else transopts = ui_translate_buttons(); +#endif + /* cut string in 2 parts - only for menu entries */ if ((but->block->flag & UI_BLOCK_LOOP)) { if (ELEM5(but->type, SLI, NUM, TEX, NUMSLI, NUMABS) == 0) { @@ -3135,9 +3137,9 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct /* no text, with icon */ else if (!but->str[0] && but->icon) { if (but->flag & UI_ICON_PREVIEW) - wt= widget_type(UI_WTYPE_MENU_ICON_RADIO); /* no arrows */ + wt = widget_type(UI_WTYPE_MENU_ICON_RADIO); /* no arrows */ else - wt= widget_type(UI_WTYPE_MENU_RADIO); /* with arrows */ + wt = widget_type(UI_WTYPE_MENU_RADIO); /* with arrows */ } /* with menu arrows */ else diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 47557f49b9f..9e891353f35 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -161,7 +161,7 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc /* ensure that grid paint mask layer is created */ ED_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md); } - else if(type == eModifierType_Skin) { + else if (type == eModifierType_Skin) { /* ensure skin-node customdata exists */ modifier_skin_customdata_ensure(ob); } @@ -1139,7 +1139,7 @@ static int multires_reshape_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - CTX_DATA_BEGIN (C, Object *, selob, selected_editable_objects) + CTX_DATA_BEGIN(C, Object *, selob, selected_editable_objects) { if (selob->type == OB_MESH && selob != ob) { secondob = selob; @@ -1372,13 +1372,13 @@ static void modifier_skin_customdata_ensure(Object *ob) static int skin_poll(bContext *C) { return (!CTX_data_edit_object(C) && - edit_modifier_poll_generic(C, &RNA_SkinModifier, (1<vdata, v2->head.data, CD_MVERT_SKIN); @@ -1405,7 +1405,7 @@ static void skin_root_clear(BMesh *bm, BMVert *bm_vert, GHash *visited) static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_edit_object(C); + Object *ob = CTX_data_edit_object(C); Mesh *me = ob->data; BMesh *bm = me->edit_btmesh->bm; BMVert *bm_vert; @@ -1417,8 +1417,8 @@ static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op)) modifier_skin_customdata_ensure(ob); BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) { - if(!BLI_ghash_lookup(visited, bm_vert) && - bm_vert->head.hflag & BM_ELEM_SELECT) + if (!BLI_ghash_lookup(visited, bm_vert) && + bm_vert->head.hflag & BM_ELEM_SELECT) { MVertSkin *vs = CustomData_bmesh_get(&bm->vdata, bm_vert->head.data, @@ -1436,7 +1436,7 @@ static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op)) BLI_ghash_free(visited, NULL, NULL); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; } @@ -1451,7 +1451,7 @@ void OBJECT_OT_skin_root_mark(wmOperatorType *ot) ot->exec = skin_root_mark_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } typedef enum { @@ -1461,7 +1461,7 @@ typedef enum { static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_edit_object(C); + Object *ob = CTX_data_edit_object(C); Mesh *me = ob->data; BMesh *bm = me->edit_btmesh->bm; BMVert *bm_vert; @@ -1487,7 +1487,7 @@ static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op) } DAG_id_tag_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; } @@ -1495,9 +1495,10 @@ static int skin_loose_mark_clear_exec(bContext *C, wmOperator *op) void OBJECT_OT_skin_loose_mark_clear(wmOperatorType *ot) { static EnumPropertyItem action_items[] = { - {SKIN_LOOSE_MARK, "MARK", 0, "Mark", "Mark selected vertices as loose"}, - {SKIN_LOOSE_CLEAR, "CLEAR", 0, "Clear", "Set selected vertices as not loose"}, - {0, NULL, 0, NULL, NULL}}; + {SKIN_LOOSE_MARK, "MARK", 0, "Mark", "Mark selected vertices as loose"}, + {SKIN_LOOSE_CLEAR, "CLEAR", 0, "Clear", "Set selected vertices as not loose"}, + {0, NULL, 0, NULL, NULL} + }; ot->name = "Skin Mark/Clear Loose"; ot->description = "Mark/clear selected vertices as loose"; @@ -1507,14 +1508,14 @@ void OBJECT_OT_skin_loose_mark_clear(wmOperatorType *ot) ot->exec = skin_loose_mark_clear_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; RNA_def_enum(ot->srna, "action", action_items, SKIN_LOOSE_MARK, "Action", NULL); } static int skin_radii_equalize_exec(bContext *C, wmOperator *UNUSED(op)) { - Object *ob= CTX_data_edit_object(C); + Object *ob = CTX_data_edit_object(C); Mesh *me = ob->data; BMesh *bm = me->edit_btmesh->bm; BMVert *bm_vert; @@ -1532,7 +1533,7 @@ static int skin_radii_equalize_exec(bContext *C, wmOperator *UNUSED(op)) } DAG_id_tag_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; } @@ -1547,20 +1548,20 @@ void OBJECT_OT_skin_radii_equalize(wmOperatorType *ot) ot->exec = skin_radii_equalize_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } static void skin_armature_bone_create(Object *skin_ob, - MVert *mvert, MEdge *medge, - bArmature *arm, - BLI_bitmap edges_visited, - const MeshElemMap *emap, - EditBone *parent_bone, - int parent_v) + MVert *mvert, MEdge *medge, + bArmature *arm, + BLI_bitmap edges_visited, + const MeshElemMap *emap, + EditBone *parent_bone, + int parent_v) { int i; - for(i = 0; i < emap[parent_v].count; i++) { + for (i = 0; i < emap[parent_v].count; i++) { int endx = emap[parent_v].indices[i]; const MEdge *e = &medge[endx]; EditBone *bone; @@ -1568,14 +1569,14 @@ static void skin_armature_bone_create(Object *skin_ob, int v; /* ignore edge if already visited */ - if(BLI_BITMAP_GET(edges_visited, endx)) + if (BLI_BITMAP_GET(edges_visited, endx)) continue; BLI_BITMAP_SET(edges_visited, endx); v = (e->v1 == parent_v ? e->v2 : e->v1); bone = MEM_callocN(sizeof(EditBone), - "skin_armature_bone_create EditBone"); + "skin_armature_bone_create EditBone"); bone->parent = parent_bone; bone->layer = 1; @@ -1589,23 +1590,23 @@ static void skin_armature_bone_create(Object *skin_ob, BLI_addtail(arm->edbo, bone); /* add bDeformGroup */ - if((dg = ED_vgroup_add_name(skin_ob, bone->name))) { + if ((dg = ED_vgroup_add_name(skin_ob, bone->name))) { ED_vgroup_vert_add(skin_ob, dg, parent_v, 1, WEIGHT_REPLACE); ED_vgroup_vert_add(skin_ob, dg, v, 1, WEIGHT_REPLACE); } skin_armature_bone_create(skin_ob, - mvert, medge, - arm, - edges_visited, - emap, - bone, - v); + mvert, medge, + arm, + edges_visited, + emap, + bone, + v); } } static Object *modifier_skin_armature_create(struct Scene *scene, - Object *skin_ob) + Object *skin_ob) { BLI_bitmap edges_visited; DerivedMesh *deform_dm; @@ -1623,10 +1624,10 @@ static Object *modifier_skin_armature_create(struct Scene *scene, /* add vertex weights to original mesh */ CustomData_add_layer(&me->vdata, - CD_MDEFORMVERT, - CD_CALLOC, - NULL, - me->totvert); + CD_MDEFORMVERT, + CD_CALLOC, + NULL, + me->totvert); arm_ob = BKE_object_add(scene, OB_ARMATURE); BKE_object_transform_copy(arm_ob, skin_ob); @@ -1638,19 +1639,19 @@ static Object *modifier_skin_armature_create(struct Scene *scene, mvert_skin = CustomData_get_layer(&me->vdata, CD_MVERT_SKIN); create_vert_edge_map(&emap, &emap_mem, - me->medge, me->totvert, me->totedge); + me->medge, me->totvert, me->totedge); edges_visited = BLI_BITMAP_NEW(me->totedge, "edge_visited"); /* note: we use EditBones here, easier to set them up and use - * edit-armature functions to convert back to regular bones */ - for(v = 0; v < me->totvert; v++) { - if(mvert_skin[v].flag & MVERT_SKIN_ROOT) { + * edit-armature functions to convert back to regular bones */ + for (v = 0; v < me->totvert; v++) { + if (mvert_skin[v].flag & MVERT_SKIN_ROOT) { EditBone *bone = NULL; /* Unless the skin root has just one adjacent edge, create - a fake root bone (have it going off in the Y direction - (arbitrary) */ + * a fake root bone (have it going off in the Y direction + * (arbitrary) */ if (emap[v].count > 1) { bone = MEM_callocN(sizeof(EditBone), "EditBone"); @@ -1664,14 +1665,14 @@ static Object *modifier_skin_armature_create(struct Scene *scene, BLI_addtail(arm->edbo, bone); } - if(emap[v].count >= 1) { + if (emap[v].count >= 1) { skin_armature_bone_create(skin_ob, - mvert, me->medge, - arm, - edges_visited, - emap, - bone, - v); + mvert, me->medge, + arm, + edges_visited, + emap, + bone, + v); } } } @@ -1698,7 +1699,7 @@ static int skin_armature_create_exec(bContext *C, wmOperator *op) arm_ob = modifier_skin_armature_create(scene, ob); /* add a modifier to connect the new armature to the mesh */ - arm_md= (ArmatureModifierData*)modifier_new(eModifierType_Armature); + arm_md = (ArmatureModifierData *)modifier_new(eModifierType_Armature); if (arm_md) { skin_md = edit_modifier_property_get(op, ob, eModifierType_Skin); BLI_insertlinkafter(&ob->modifiers, skin_md, arm_md); @@ -1709,7 +1710,7 @@ static int skin_armature_create_exec(bContext *C, wmOperator *op) DAG_id_tag_update(&ob->id, OB_RECALC_DATA); } - WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); return OPERATOR_FINISHED; } @@ -1733,7 +1734,7 @@ void OBJECT_OT_skin_armature_create(wmOperatorType *ot) ot->exec = skin_armature_create_exec; /* flags */ - ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; edit_modifier_properties(ot); } @@ -1926,7 +1927,7 @@ static void oceanbake_free(void *customdata) /* called by oceanbake, only to check job 'stop' value */ static int oceanbake_breakjob(void *UNUSED(customdata)) { - //OceanBakeJob *ob= (OceanBakeJob *)customdata; + //OceanBakeJob *ob = (OceanBakeJob *)customdata; //return *(ob->stop); /* this is not nice yet, need to make the jobs list template better diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index 000f43b0dec..919d2173bd2 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -106,13 +106,13 @@ static int mask_flood_fill_exec(bContext *C, wmOperator *op) } BLI_pbvh_vertex_iter_end; BLI_pbvh_node_mark_update(nodes[i]); - if(BLI_pbvh_type(pbvh) == PBVH_GRIDS) + if (BLI_pbvh_type(pbvh) == PBVH_GRIDS) multires_mark_as_modified(ob, MULTIRES_COORDS_MODIFIED); } sculpt_undo_push_end(); - if(nodes) + if (nodes) MEM_freeN(nodes); ED_region_tag_redraw(ar); diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c index ac3cc15fe88..6d2381e64d5 100644 --- a/source/blender/editors/space_file/fsmenu.c +++ b/source/blender/editors/space_file/fsmenu.c @@ -440,7 +440,7 @@ void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks) } /* Finally get user favorite places */ - if(read_bookmarks) { + if (read_bookmarks) { list = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL); pathesArray = LSSharedFileListCopySnapshot(list, &seed); pathesCount = CFArrayGetCount(pathesArray); diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index c20ae734828..9d2ce657bde 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -600,17 +600,17 @@ static SkinNode *build_frames(const MVert *mvert, int totvert, static void calc_edge_mat(float mat[3][3], const float a[3], const float b[3]) { - float Z[3] = {0, 0, 1}; + const float z_up[3] = {0, 0, 1}; float dot; /* X = edge direction */ sub_v3_v3v3(mat[0], b, a); normalize_v3(mat[0]); - dot = dot_v3v3(mat[0], Z); + dot = dot_v3v3(mat[0], z_up); if (dot > -1 + FLT_EPSILON && dot < 1 - FLT_EPSILON) { /* Y = Z cross x */ - cross_v3_v3v3(mat[1], Z, mat[0]); + cross_v3_v3v3(mat[1], z_up, mat[0]); normalize_v3(mat[1]); /* Z = x cross y */ From 931146731d896a20b15e1fe847479025b2922db5 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Tue, 22 May 2012 17:33:58 +0000 Subject: [PATCH 124/159] Fix memory leak when deleting all vertices from mesh with certain modifiers (bevel and array among them) and VBO are enabled. --- source/blender/gpu/intern/gpu_buffers.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 833aefc20aa..6da7d9e10e3 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -102,7 +102,7 @@ static GPUBufferPool *gpu_buffer_pool_new(void) if (useVBOs == -1) useVBOs = (GLEW_ARB_vertex_buffer_object ? 1 : 0); - pool = MEM_callocN(sizeof(GPUBufferPool), "GPUBuffer"); + pool = MEM_callocN(sizeof(GPUBufferPool), "GPUBuffer_Pool"); pool->maxsize = MAX_FREE_GPU_BUFFERS; pool->buffers = MEM_callocN(sizeof(GPUBuffer *) * pool->maxsize, @@ -192,6 +192,12 @@ GPUBuffer *GPU_buffer_alloc(int size) GPUBuffer *buf; int i, bufsize, bestfit = -1; + /* bad case, leads to leak of buf since buf->pointer will allocate + * NULL, leading to return without cleanup. In any case better detect early + * psy-fi */ + if(size == 0) + return NULL; + pool = gpu_get_global_buffer_pool(); /* not sure if this buffer pool code has been profiled much, From 89b1a2bbcf422da0e982280a9819904bc15d6e6f Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Tue, 22 May 2012 17:57:03 +0000 Subject: [PATCH 125/159] Collada: Added a Preset selector --- source/blender/windowmanager/intern/wm_operators.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index d7cfe6c5544..4c396d2d6d3 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2189,6 +2189,8 @@ static void WM_OT_collada_export(wmOperatorType *ot) ot->invoke = wm_collada_export_invoke; ot->exec = wm_collada_export_exec; ot->poll = WM_operator_winactive; + + ot->flag |= OPTYPE_PRESET; WM_operator_properties_filesel(ot, FOLDERFILE | COLLADAFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY); RNA_def_boolean(ot->srna, "selected", 0, "Selection Only", From 800e79c0888215c545a2ce01badea2402a1670ca Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Tue, 22 May 2012 18:14:34 +0000 Subject: [PATCH 126/159] expanding bmesh example (py api) --- doc/python_api/rst/include__bmesh.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/python_api/rst/include__bmesh.rst b/doc/python_api/rst/include__bmesh.rst index f3d3b0257be..a55bf71b60f 100644 --- a/doc/python_api/rst/include__bmesh.rst +++ b/doc/python_api/rst/include__bmesh.rst @@ -101,7 +101,9 @@ Here are some examples ... for face in bm.faces: for loop in face.loops: uv = loop[uv_lay].uv - print("Loop UV: %f, %f" % (uv.x, uv.y)) + print("Loop UV: %f, %f" % uv[:]) + vert = loop.vert + print("Loop Vert: (%f,%f,%f)" % vert.co[:]) .. code-block:: python From fc4d5cf37ee426c1dd0f00938759a42c5adc2778 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 22 May 2012 18:20:07 +0000 Subject: [PATCH 127/159] Skin Modifier: * Show Modifier Icon in Outliner. --- source/blender/editors/space_outliner/outliner_draw.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 7813bbcd9a6..3662cfb4e3f 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -1009,6 +1009,8 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto UI_icon_draw(x, y, ICON_MOD_OCEAN); break; case eModifierType_Warp: UI_icon_draw(x, y, ICON_MOD_WARP); break; + case eModifierType_Skin: + UI_icon_draw(x, y, ICON_MOD_SKIN); break; default: UI_icon_draw(x, y, ICON_DOT); break; } From 89fcec812af20faa1022bf9a6e6ba62985244f02 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Tue, 22 May 2012 18:40:31 +0000 Subject: [PATCH 128/159] Code cleanup: better warning in case of modifier icons in outliner. Modified the switch statement to use the ModifierType enum and changed the default case to use specific missing values. Compiler can then issue warnings when new modifier types are added (at least gcc 4.6.3 does) --- source/blender/editors/space_outliner/outliner_draw.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 3662cfb4e3f..fddd7af93f1 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -932,7 +932,7 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto { Object *ob = (Object *)tselem->id; ModifierData *md = BLI_findlink(&ob->modifiers, tselem->nr); - switch (md->type) { + switch ((ModifierType)md->type) { case eModifierType_Subsurf: UI_icon_draw(x, y, ICON_MOD_SUBSURF); break; case eModifierType_Armature: @@ -986,6 +986,7 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto case eModifierType_Explode: UI_icon_draw(x, y, ICON_MOD_EXPLODE); break; case eModifierType_Collision: + case eModifierType_Surface: UI_icon_draw(x, y, ICON_MOD_PHYSICS); break; case eModifierType_Fluidsim: UI_icon_draw(x, y, ICON_MOD_FLUIDSIM); break; @@ -1011,7 +1012,11 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto UI_icon_draw(x, y, ICON_MOD_WARP); break; case eModifierType_Skin: UI_icon_draw(x, y, ICON_MOD_SKIN); break; - default: + + /* Default */ + case eModifierType_None: + case eModifierType_ShapeKey: + case NUM_MODIFIER_TYPES: UI_icon_draw(x, y, ICON_DOT); break; } break; From 1a81499d413e748a26b5f51c5488f257b404e48e Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 22 May 2012 19:16:20 +0000 Subject: [PATCH 129/159] Node UI: * Made the new custom theme options a bit better and more compact. * Added a few separators to better distinguish these settings from the actual node buttons. --- .../blender/editors/space_node/node_buttons.c | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index 16810e0fdec..c5ccfb7863a 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -89,7 +89,7 @@ static void active_node_panel(const bContext *C, Panel *pa) SpaceNode *snode= CTX_wm_space_node(C); bNodeTree *ntree= (snode) ? snode->edittree : NULL; bNode *node = (ntree) ? nodeGetActive(ntree) : NULL; // xxx... for editing group nodes - uiLayout *layout, *row, *col; + uiLayout *layout, *row, *col, *sub; PointerRNA ptr, opptr; /* verify pointers, and create RNA pointer for the node */ @@ -100,7 +100,6 @@ static void active_node_panel(const bContext *C, Panel *pa) //else RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr); - /* XXX nicer way to make sub-layout? */ layout = uiLayoutColumn(pa->layout, 0); uiLayoutSetContextPointer(layout, "node", &ptr); @@ -112,26 +111,35 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle"); uiItemS(layout); + uiItemS(layout); row = uiLayoutRow(layout, 0); - uiItemM(row, (bContext *)C, "NODE_MT_node_color_presets", NULL, 0); - uiItemM(row, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_DOWNARROW_HLT); - uiItemO(row, "", ICON_ZOOMIN, "node.node_color_preset_add"); - opptr = uiItemFullO(row, "node.node_color_preset_add", "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); - RNA_boolean_set(&opptr, "remove_active", 1); - - row = uiLayoutRow(layout, 0); - uiItemR(row, &ptr, "use_custom_color", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE); - col = uiLayoutColumn(row, 0); + + col = uiLayoutColumn(row, 1); + uiItemM(col, (bContext *)C, "NODE_MT_node_color_presets", NULL, 0); + uiItemR(col, &ptr, "use_custom_color", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE); + sub = uiLayoutRow(col, 0); if (!(node->flag & NODE_CUSTOM_COLOR)) - uiLayoutSetEnabled(col, 0); - uiItemR(col, &ptr, "color", 0, "", 0); - + uiLayoutSetEnabled(sub, 0); + uiItemR(sub, &ptr, "color", 0, "", 0); + + col = uiLayoutColumn(row, 1); + uiItemO(col, "", ICON_ZOOMIN, "node.node_color_preset_add"); + opptr = uiItemFullO(col, "node.node_color_preset_add", "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_boolean_set(&opptr, "remove_active", 1); + uiItemM(col, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_BLANK1); + /* draw this node's settings */ - if (node->typeinfo && node->typeinfo->uifuncbut) + if (node->typeinfo && node->typeinfo->uifuncbut) { + uiItemS(layout); + uiItemS(layout); node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); - else if (node->typeinfo && node->typeinfo->uifunc) + } + else if (node->typeinfo && node->typeinfo->uifunc) { + uiItemS(layout); + uiItemS(layout); node->typeinfo->uifunc(layout, (bContext *)C, &ptr); + } } static int node_sockets_poll(const bContext *C, PanelType *UNUSED(pt)) From d2a37d464a81959eb3409115f320c83af4398934 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 21:16:59 +0000 Subject: [PATCH 130/159] code cleanup: double promotion warnings --- source/blender/blenkernel/intern/brush.c | 2 +- source/blender/blenkernel/intern/constraint.c | 2 +- source/blender/blenkernel/intern/pointcache.c | 6 ++--- .../editors/interface/interface_regions.c | 2 +- source/blender/editors/mesh/editmesh_tools.c | 4 ++-- source/blender/editors/space_node/drawnode.c | 24 +++++++++---------- source/blender/editors/transform/transform.c | 20 +++++++--------- .../editors/transform/transform_conversions.c | 4 ++-- .../editors/transform/transform_input.c | 4 ++-- 9 files changed, 33 insertions(+), 35 deletions(-) diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index f019287144d..741d4b729ae 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -1329,7 +1329,7 @@ struct ImBuf *BKE_brush_gen_radial_control_imbuf(Brush *br) for (i = 0; i < side; ++i) { for (j = 0; j < side; ++j) { - float magn = sqrt(pow(i - half, 2) + pow(j - half, 2)); + float magn = sqrtf(powf(i - half, 2) + powf(j - half, 2)); im->rect_float[i * side + j] = BKE_brush_curve_strength_clamp(br, magn, half); } } diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index a1f87762db7..da9350cc7b9 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -3155,7 +3155,7 @@ static void clampto_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *tar /* find bounding-box range where target is located */ if (ownLoc[clamp_axis] < curveMin[clamp_axis]) { /* bounding-box range is before */ - offset = curveMin[clamp_axis] - ceil((curveMin[clamp_axis] - ownLoc[clamp_axis]) / len) * len; + offset = curveMin[clamp_axis] - ceilf((curveMin[clamp_axis] - ownLoc[clamp_axis]) / len) * len; /* now, we calculate as per normal, except using offset instead of curveMin[clamp_axis] */ curvetime = (ownLoc[clamp_axis] - offset) / (len); diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index f483fd7dc8a..f676cfb2fb8 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -3292,9 +3292,9 @@ void BKE_ptcache_update_info(PTCacheID *pid) mb = (bytes > 1024.0f * 1024.0f); BLI_snprintf(mem_info, sizeof(mem_info), "%i frames in memory (%.1f %s)", - totframes, - bytes / (mb ? 1024.0f * 1024.0f : 1024.0f), - mb ? "Mb" : "kb"); + totframes, + bytes / (mb ? 1024.0f * 1024.0f : 1024.0f), + mb ? "Mb" : "kb"); } if (cache->flag & PTCACHE_OUTDATED) { diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index a36b2dd2c45..5459f689e9f 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -442,7 +442,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) if (ELEM(but->type, ROW, MENU)) { EnumPropertyItem *item; int i, totitem, free; - int value = (but->type == ROW) ? but->hardmax : ui_get_but_val(but); + int value = (but->type == ROW) ? (int)but->hardmax : (int)ui_get_but_val(but); RNA_property_enum_items_gettexted(C, &but->rnapoin, but->rnaprop, &item, &totitem, &free); diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 507ed2de07f..361244e9f13 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -4541,7 +4541,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, wmEvent *event) mdiff[1] = opdata->mcenter[1] - event->mval[1]; factor = len_v2(mdiff) / opdata->initial_length; - factor = MAX2(1.0 - factor, 0.0); + factor = MAX2(1.0f - factor, 0.0f); RNA_float_set(op->ptr, "percent", factor); @@ -4837,7 +4837,7 @@ static int edbm_inset_modal(bContext *C, wmOperator *op, wmEvent *event) else { amount = opdata->old_thickness - (len_v2(mdiff) - opdata->initial_length) / opdata->initial_length; - amount = MAX2(amount, 0.0); + amount = MAX2(amount, 0.0f); RNA_float_set(op->ptr, "thickness", amount); } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 8b7e0dd0db1..76003be8dc9 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2281,15 +2281,15 @@ void node_composit_backdrop_viewer(SpaceNode* snode, ImBuf* backdrop, bNode* nod void node_composit_backdrop_boxmask(SpaceNode* snode, ImBuf* backdrop, bNode* node, int x, int y) { - NodeBoxMask * boxmask = node->storage; + NodeBoxMask *boxmask = node->storage; const float backdropWidth = backdrop->x; const float backdropHeight = backdrop->y; const float aspect = backdropWidth/backdropHeight; - const float rad = DEG2RAD(-boxmask->rotation); - const float cosine = cos(rad); - const float sine = sin(rad); - const float halveBoxWidth = backdropWidth*(boxmask->width/2.0f); - const float halveBoxHeight = backdropHeight*(boxmask->height/2.0f)*aspect; + const float rad = DEG2RADF(-boxmask->rotation); + const float cosine = cosf(rad); + const float sine = sinf(rad); + const float halveBoxWidth = backdropWidth * (boxmask->width / 2.0f); + const float halveBoxHeight = backdropHeight * (boxmask->height / 2.0f) * aspect; float cx, cy, x1, x2, x3, x4; float y1, y2, y3, y4; @@ -2325,12 +2325,12 @@ void node_composit_backdrop_ellipsemask(SpaceNode* snode, ImBuf* backdrop, bNode NodeEllipseMask * ellipsemask = node->storage; const float backdropWidth = backdrop->x; const float backdropHeight = backdrop->y; - const float aspect = backdropWidth/backdropHeight; - const float rad = DEG2RAD(-ellipsemask->rotation); - const float cosine = cos(rad); - const float sine = sin(rad); - const float halveBoxWidth = backdropWidth*(ellipsemask->width/2.0f); - const float halveBoxHeight = backdropHeight*(ellipsemask->height/2.0f)*aspect; + const float aspect = backdropWidth / backdropHeight; + const float rad = DEG2RADF(-ellipsemask->rotation); + const float cosine = cosf(rad); + const float sine = sinf(rad); + const float halveBoxWidth = backdropWidth * (ellipsemask->width / 2.0f); + const float halveBoxHeight = backdropHeight * (ellipsemask->height / 2.0f) * aspect; float cx, cy, x1, x2, x3, x4; float y1, y2, y3, y4; diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 496488922a5..fea6f7266b2 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5554,7 +5554,7 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, else #endif { - val= floorf(val+0.5f); + val = floor(val + 0.5); } /* convert frame out of nla-action time */ @@ -5640,7 +5640,7 @@ static void headerTimeTranslate(TransInfo *t, char *str) /* apply snapping + frame->seconds conversions */ if (autosnap == SACTSNAP_STEP) { if (do_time) - val= floorf((double)val/secf + 0.5f); + val= floorf((double)val / secf + 0.5); else val= floorf(val + 0.5f); } @@ -5688,9 +5688,9 @@ static void applyTimeTranslate(TransInfo *t, float UNUSED(sval)) if (autosnap == SACTSNAP_STEP) { if (do_time) - deltax= (float)(floor((deltax/secf) + 0.5f) * secf); + deltax = (float)(floor(((double)deltax / secf) + 0.5) * secf); else - deltax= (float)(floor(deltax + 0.5f)); + deltax = (float)(floor(deltax + 0.5f)); } val = BKE_nla_tweakedit_remap(adt, td->ival, NLATIME_CONVERT_MAP); @@ -5702,9 +5702,9 @@ static void applyTimeTranslate(TransInfo *t, float UNUSED(sval)) if (autosnap == SACTSNAP_STEP) { if (do_time) - val= (float)(floor((deltax/secf) + 0.5f) * secf); + val = (float)(floor(((double)deltax / secf) + 0.5) * secf); else - val= (float)(floor(val + 0.5f)); + val = (float)(floor(val + 0.5f)); } *(td->val) = td->ival + val; @@ -5954,9 +5954,9 @@ static void applyTimeScale(TransInfo *t) if (autosnap == SACTSNAP_STEP) { if (do_time) - fac= (float)(floor(fac/secf + 0.5f) * secf); + fac = (float)(floor((double)fac / secf + 0.5) * secf); else - fac= (float)(floor(fac + 0.5f)); + fac = (float)(floor(fac + 0.5f)); } /* check if any need to apply nla-mapping */ @@ -5964,9 +5964,7 @@ static void applyTimeScale(TransInfo *t) startx= BKE_nla_tweakedit_remap(adt, startx, NLATIME_CONVERT_UNMAP); /* now, calculate the new value */ - *(td->val) = td->ival - startx; - *(td->val) *= fac; - *(td->val) += startx; + *(td->val) = ((td->ival - startx) * fac) + startx; /* apply nearest snapping */ doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 8289cd0b10f..213a22b2c10 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -3722,9 +3722,9 @@ void flushTransGraphData(TransInfo *t) switch (sipo->autosnap) { case SACTSNAP_FRAME: /* snap to nearest frame (or second if drawing seconds) */ if (sipo->flag & SIPO_DRAWTIME) - td2d->loc[0] = (float)(floorf((td2d->loc[0]/secf) + 0.5f) * secf); + td2d->loc[0] = floorf((td2d->loc[0] / secf) + 0.5) * secf; else - td2d->loc[0] = (float)(floorf(td2d->loc[0]+0.5f)); + td2d->loc[0] = floorf(td2d->loc[0] + 0.5); break; case SACTSNAP_MARKER: /* snap to nearest marker */ diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index f12961df0d9..9c485e17dc7 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -206,10 +206,10 @@ static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, const int mva mdx = mval[0] - data[2]; mdy = mval[1] - data[3]; - distance = (length != 0.0) ? (mdx * dx + mdy * dy) / length: 0.0; + distance = (length != 0.0) ? (mdx * dx + mdy * dy) / length : 0.0; } - output[0] = (length != 0.0) ? (double)(distance / length) : 0.0f; + output[0] = (length != 0.0) ? (double)(distance / length) : 0.0; } } From dab1d8e4874564f182d7b73b603f66a4f34565ad Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 May 2012 22:03:41 +0000 Subject: [PATCH 131/159] style cleanup --- source/blender/blenkernel/intern/cloth.c | 12 ++++---- source/blender/blenkernel/intern/collision.c | 15 +++++----- source/blender/blenkernel/intern/customdata.c | 10 +++---- source/blender/blenkernel/intern/object.c | 8 +++-- source/blender/blenloader/intern/readfile.c | 4 +-- source/blender/blenloader/intern/writefile.c | 10 +++---- .../blender/editors/sculpt_paint/paint_mask.c | 4 +-- source/blender/editors/space_node/drawnode.c | 4 +-- source/blender/editors/space_node/node_edit.c | 2 +- .../blender/editors/space_view3d/drawobject.c | 8 ++--- source/blender/editors/transform/transform.c | 8 +++-- .../editors/transform/transform_conversions.c | 6 ++-- source/blender/gpu/intern/gpu_buffers.c | 2 +- .../nodes/composite/node_composite_tree.c | 30 +++++++++---------- source/blender/nodes/intern/node_common.c | 2 +- source/blender/python/intern/bpy_interface.c | 2 +- source/blender/python/intern/bpy_rna.c | 2 +- .../render/intern/source/convertblender.c | 2 +- 18 files changed, 66 insertions(+), 65 deletions(-) diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index b38f0f78cdb..e067b7195ce 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -429,10 +429,10 @@ static DerivedMesh *cloth_to_triangles(DerivedMesh *dm) MFace *mface2 = NULL; /* calc faces */ - for(i = 0; i < numfaces; i++) - { - if(mface[i].v4) + for (i = 0; i < numfaces; i++) { + if (mface[i].v4) { quads++; + } } result = CDDM_from_template(dm, dm->getNumVerts(dm), 0, numfaces + quads, 0, 0); @@ -443,8 +443,7 @@ static DerivedMesh *cloth_to_triangles(DerivedMesh *dm) DM_ensure_tessface(result); mface2 = result->getTessFaceArray(result); - for(i = 0, j = numfaces; i < numfaces; i++) - { + for (i = 0, j = numfaces; i < numfaces; i++) { // DG TODO: is this necessary? mface2[i].v1 = mface[i].v1; mface2[i].v2 = mface[i].v2; @@ -453,8 +452,7 @@ static DerivedMesh *cloth_to_triangles(DerivedMesh *dm) mface2[i].v4 = 0; //test_index_face(&mface2[i], &result->faceData, i, 3); - if(mface[i].v4) - { + if (mface[i].v4) { DM_copy_tessface_data(dm, result, i, j, 1); mface2[j].v1 = mface[i].v1; diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index a93653537c7..7c5cf68affa 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -345,19 +345,17 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM } } - if(result) - { + if (result) { int i = 0; - for(i = 0; i < 3; i++) - { - if(cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[i]) < ABS(i1[i])) + for (i = 0; i < 3; i++) { + if (cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[i]) < ABS(i1[i])) cloth1->verts[collpair->ap1].impulse[i] = i1[i]; - if(cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[i]) < ABS(i2[i])) + if (cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[i]) < ABS(i2[i])) cloth1->verts[collpair->ap2].impulse[i] = i2[i]; - if(cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[i]) < ABS(i3[i])) + if (cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[i]) < ABS(i3[i])) cloth1->verts[collpair->ap3].impulse[i] = i3[i]; } } @@ -681,8 +679,9 @@ static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, Collision } } - if(!result) + if (!result) { break; + } } return ret; } diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 04bce0a8f63..4e7653e2473 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -997,22 +997,22 @@ static void layerDefault_mvert_skin(void *data, int count) MVertSkin *vs = data; int i; - for(i = 0; i < count; i++) { + for (i = 0; i < count; i++) { copy_v3_fl(vs[i].radius, 0.25f); vs[i].flag = 0; } } - + static void layerInterp_mvert_skin(void **sources, float *weights, - float *UNUSED(sub_weights), - int count, void *dest) + float *UNUSED(sub_weights), + int count, void *dest) { float radius[3], w; MVertSkin *vs; int i; zero_v3(radius); - for(i = 0; i < count; i++) { + for (i = 0; i < count; i++) { w = weights ? weights[i] : 1.0f; vs = sources[i]; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 8de832e508d..6b9253e9657 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -3030,10 +3030,12 @@ int BKE_object_is_animated(Scene *scene, Object *ob) ModifierData *md; for (md = modifiers_getVirtualModifierList(ob); md; md = md->next) - if(modifier_dependsOnTime(md) && - (modifier_isEnabled(scene, md, eModifierMode_Realtime) || - modifier_isEnabled(scene, md, eModifierMode_Render))) + if (modifier_dependsOnTime(md) && + (modifier_isEnabled(scene, md, eModifierMode_Realtime) || + modifier_isEnabled(scene, md, eModifierMode_Render))) + { return 1; + } return 0; } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 54b68e2828e..63df006aa66 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3826,7 +3826,7 @@ static void direct_link_customdata(FileData *fd, CustomData *data, int count) layer->data = newdataadr(fd, layer->data); if (layer->type == CD_MDISPS) direct_link_mdisps(fd, count, layer->data, layer->flag & CD_FLAG_EXTERNAL); - else if(layer->type == CD_GRID_PAINT_MASK) + else if (layer->type == CD_GRID_PAINT_MASK) direct_link_grid_paint_mask(fd, count, layer->data); i++; } @@ -7437,7 +7437,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } - for(cu = main->curve.first; cu; cu = cu->id.next) { + for (cu = main->curve.first; cu; cu = cu->id.next) { if (cu->bevfac2 == 0.0f) { cu->bevfac1 = 0.0f; cu->bevfac2 = 1.0f; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 297eb6027ae..f14837f096e 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1662,17 +1662,17 @@ static void write_mdisps(WriteData *wd, int count, MDisps *mdlist, int external) static void write_grid_paint_mask(WriteData *wd, int count, GridPaintMask *grid_paint_mask) { - if(grid_paint_mask) { + if (grid_paint_mask) { int i; writestruct(wd, DATA, "GridPaintMask", count, grid_paint_mask); - for(i = 0; i < count; ++i) { + for (i = 0; i < count; ++i) { GridPaintMask *gpm = &grid_paint_mask[i]; - if(gpm->data) { + if (gpm->data) { const int gridsize = ccg_gridsize(gpm->level); writedata(wd, DATA, - sizeof(*gpm->data) * gridsize * gridsize, - gpm->data); + sizeof(*gpm->data) * gridsize * gridsize, + gpm->data); } } } diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index 919d2173bd2..298ecf764d6 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -64,7 +64,7 @@ static void mask_flood_fill_set_elem(float *elem, PaintMaskFloodMode mode, float value) { - switch(mode) { + switch (mode) { case PAINT_MASK_FLOOD_VALUE: (*elem) = value; break; @@ -96,7 +96,7 @@ static int mask_flood_fill_exec(bContext *C, wmOperator *op) sculpt_undo_push_begin("Mask flood fill"); - for(i = 0; i < totnode; i++) { + for (i = 0; i < totnode; i++) { PBVHVertexIter vi; sculpt_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 76003be8dc9..db75198bcd4 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2296,7 +2296,7 @@ void node_composit_backdrop_boxmask(SpaceNode* snode, ImBuf* backdrop, bNode* no /* keep this, saves us from a version patch */ - if(snode->zoom==0.0f) snode->zoom= 1.0f; + if (snode->zoom == 0.0f) snode->zoom = 1.0f; glColor3f(1.0, 1.0, 1.0); @@ -2337,7 +2337,7 @@ void node_composit_backdrop_ellipsemask(SpaceNode* snode, ImBuf* backdrop, bNode /* keep this, saves us from a version patch */ - if(snode->zoom==0.0f) snode->zoom= 1.0f; + if (snode->zoom == 0.0f) snode->zoom = 1.0f; glColor3f(1.0, 1.0, 1.0); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 5000e0f2163..c4ea8c4025f 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2521,7 +2521,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) /* when linking to group outputs, update the socket type */ /* XXX this should all be part of a generic update system */ if (!link->tonode) { - if(link->tosock->type != link->fromsock->type) + if (link->tosock->type != link->fromsock->type) nodeSocketSetType(link->tosock, link->fromsock->type); } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 6ba506bbc5c..9633917344f 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2412,11 +2412,11 @@ static void draw_dm_verts__mapFunc(void *userData, int index, const float co[3], if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && BM_elem_flag_test(eve, BM_ELEM_SELECT) == data->sel) { /* skin nodes: draw a red circle around the root - node(s) */ - if(data->has_vskin) { + * node(s) */ + if (data->has_vskin) { const MVertSkin *vs = CustomData_bmesh_get(&data->em->bm->vdata, - eve->head.data, - CD_MVERT_SKIN); + eve->head.data, + CD_MVERT_SKIN); if (vs->flag & MVERT_SKIN_ROOT) { float radius = (vs->radius[0] + vs->radius[1]) * 0.5f; bglEnd(); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index fea6f7266b2..45e5fb10bc0 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -617,7 +617,7 @@ static void transform_event_xyz_constraint(TransInfo *t, short key_type, char cm char axis; /* Initialize */ - switch(key_type) { + switch (key_type) { case XKEY: axis = 'X'; constraint_axis = CON_AXIS0; @@ -1141,9 +1141,11 @@ int calculateTransformCenter(bContext *C, int centerMode, float *cent3d, int *ce calculateCenter(t); - if(cent2d) + if (cent2d) { copy_v2_v2_int(cent2d, t->center2d); - if(cent3d) { + } + + if (cent3d) { // Copy center from constraint center. Transform center can be local copy_v3_v3(cent3d, t->con.center); } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 213a22b2c10..1e22179a432 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1920,10 +1920,10 @@ static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx td->val = bweight; td->ival = bweight ? *(bweight) : 1.0f; } - else if(t->mode == TFM_SKIN_RESIZE) { + else if (t->mode == TFM_SKIN_RESIZE) { MVertSkin *vs = CustomData_bmesh_get(&em->bm->vdata, - eve->head.data, - CD_MVERT_SKIN); + eve->head.data, + CD_MVERT_SKIN); /* skin node size */ td->ext = tx; copy_v3_v3(tx->isize, vs->radius); diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 6da7d9e10e3..f09310e53c7 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -195,7 +195,7 @@ GPUBuffer *GPU_buffer_alloc(int size) /* bad case, leads to leak of buf since buf->pointer will allocate * NULL, leading to return without cleanup. In any case better detect early * psy-fi */ - if(size == 0) + if (size == 0) return NULL; pool = gpu_get_global_buffer_pool(); diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index b266af15060..8099f6d3f13 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -586,9 +586,9 @@ static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_pr int totnode, curnode, rendering= 1, n; bNodeTreeExec *exec= ntree->execdata; - if(ntree==NULL) return; + if (ntree == NULL) return; - if(do_preview) + if (do_preview) ntreeInitPreview(ntree, 0, 0); if (!ntree->execdata) { @@ -598,7 +598,7 @@ static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_pr ntree_composite_texnode(ntree, 1); /* prevent unlucky accidents */ - if(G.background) + if (G.background) rd->scemode &= ~R_COMP_CROP; /* setup callerdata for thread callback */ @@ -613,15 +613,15 @@ static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_pr BLI_init_threads(&threads, exec_composite_node, rd->threads); - while(rendering) { + while (rendering) { - if(BLI_available_threads(&threads)) { + if (BLI_available_threads(&threads)) { nodeexec= getExecutableNode(exec); - if(nodeexec) { + if (nodeexec) { node = nodeexec->node; - if(ntree->progress && totnode) + if (ntree->progress && totnode) ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode)); - if(ntree->stats_draw) { + if (ntree->stats_draw) { char str[128]; BLI_snprintf(str, sizeof(str), "Compositing %d %s", curnode, node->name); ntree->stats_draw(ntree->sdh, str); @@ -640,21 +640,21 @@ static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_pr rendering= 0; /* test for ESC */ - if(ntree->test_break && ntree->test_break(ntree->tbh)) { - for(node= ntree->nodes.first; node; node= node->next) + 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) { + 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) { + 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) + if (rd->scemode & R_COMP_FREE) freeExecutableNode(exec); } } @@ -670,7 +670,7 @@ static void ntreeCompositExecTreeOld(bNodeTree *ntree, RenderData *rd, int do_pr void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int rendering, int do_preview) { - if(G.rt == 200) + if (G.rt == 200) ntreeCompositExecTreeOld(ntree, rd, do_preview); else COM_execute(ntree, rendering); diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 21aad779f89..fa1af821a2d 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -552,7 +552,7 @@ static bNodeSocket *group_verify_socket(bNodeTree *ntree, ListBase *lb, int in_o sock->groupsock = gsock; BLI_strncpy(sock->name, gsock->name, sizeof(sock->name)); - if(gsock->type != sock->type) + if (gsock->type != sock->type) nodeSocketSetType(sock, gsock->type); /* XXX hack: group socket input/output roles are inverted internally, diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 9fa02046e49..1d3099db189 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -178,7 +178,7 @@ void BPY_modules_update(bContext *C) /* refreshes the main struct */ BPY_update_rna_module(); - if(bpy_context_module) + if (bpy_context_module) bpy_context_module->ptr.data = (void *)C; } diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index e25fac9b310..fe18fd040eb 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -6347,7 +6347,7 @@ PyObject *BPY_rna_module(void) void BPY_update_rna_module(void) { - if(rna_module_ptr) { + if (rna_module_ptr) { #if 0 RNA_main_pointer_create(G.main, rna_module_ptr); #else diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index eb628b87b3d..150bfae4731 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -4318,7 +4318,7 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset) /* Baking lets us define a quad split order */ split_quads(obr, re->r.bake_quad_split); } - else if(BKE_object_is_animated(re->scene, ob)) + else if (BKE_object_is_animated(re->scene, ob)) split_quads(obr, 1); else { if ((re->r.mode & R_SIMPLIFY && re->r.simplify_flag & R_SIMPLE_NO_TRIANGULATE) == 0) From c319d999ef4d6acca0a3473043b07f0efb395fb5 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 23 May 2012 03:36:03 +0000 Subject: [PATCH 132/159] Motion Paths Gui - Restoring a "Calculate" button to the Motion Paths panel Iterating on previous design, a Calculate button is now present in this panel again. Most people just wouldn't have a clue to try the toolbar... --- release/scripts/startup/bl_ui/properties_animviz.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_animviz.py b/release/scripts/startup/bl_ui/properties_animviz.py index 3c1f910814a..3011f55fcb3 100644 --- a/release/scripts/startup/bl_ui/properties_animviz.py +++ b/release/scripts/startup/bl_ui/properties_animviz.py @@ -70,8 +70,12 @@ class MotionPathButtonsPanel(): else: col.operator("object.paths_update", text="Update Paths", icon='OBJECT_DATA') else: - col.label(text="Not available yet...", icon='ERROR') - col.label(text="Calculate Paths first", icon='INFO') + sub = col.column(align=True) + sub.label(text="Nothing to show yet...", icon='ERROR') + if bones: + sub.operator("pose.paths_calculate", text="Calculate...", icon='BONE_DATA') + else: + sub.operator("object.paths_calculate", text="Calculate...", icon='OBJECT_DATA') # Display Settings split = layout.split() From 795edb74fab61a1f73512070bd1b0043b3afb36c Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 23 May 2012 03:49:42 +0000 Subject: [PATCH 133/159] scons - Added option to not remove and unpack python modules bundle every compile --- build_files/scons/tools/Blender.py | 9 +++++++-- build_files/scons/tools/btools.py | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py index 5a066470225..0c5d37f77fe 100644 --- a/build_files/scons/tools/Blender.py +++ b/build_files/scons/tools/Blender.py @@ -869,12 +869,17 @@ class BlenderEnvironment(SConsEnvironment): lenv.AddPostAction(prog,Action(AppIt,strfunction=my_appit_print)) elif os.sep == '/' and lenv['OURPLATFORM'] != 'linuxcross': # any unix (except cross-compilation) if lenv['WITH_BF_PYTHON']: - if not lenv['WITHOUT_BF_INSTALL'] and not lenv['WITHOUT_BF_PYTHON_INSTALL'] and not BlenderEnvironment.PyBundleActionAdded: + if (not lenv['WITHOUT_BF_INSTALL'] and + not lenv['WITHOUT_BF_PYTHON_INSTALL'] and + not lenv['WITHOUT_BF_PYTHON_UNPACK'] and + not BlenderEnvironment.PyBundleActionAdded): lenv.AddPostAction(prog,Action(UnixPyBundle,strfunction=my_unixpybundle_print)) BlenderEnvironment.PyBundleActionAdded = True elif lenv['OURPLATFORM'].startswith('win') or lenv['OURPLATFORM'] == 'linuxcross': # windows or cross-compilation if lenv['WITH_BF_PYTHON']: - if not lenv['WITHOUT_BF_PYTHON_INSTALL'] and not BlenderEnvironment.PyBundleActionAdded: + if (not lenv['WITHOUT_BF_PYTHON_INSTALL'] and + not lenv['WITHOUT_BF_PYTHON_UNPACK'] and + not BlenderEnvironment.PyBundleActionAdded): lenv.AddPostAction(prog,Action(WinPyBundle,strfunction=my_winpybundle_print)) BlenderEnvironment.PyBundleActionAdded = True return prog diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py index 1ad0b886cc4..d3a334b3c96 100644 --- a/build_files/scons/tools/btools.py +++ b/build_files/scons/tools/btools.py @@ -134,7 +134,7 @@ def validate_arguments(args, bc): 'BF_CXX', 'WITH_BF_STATICCXX', 'BF_CXX_LIB_STATIC', 'BF_TWEAK_MODE', 'BF_SPLIT_SRC', 'WITHOUT_BF_INSTALL', - 'WITHOUT_BF_PYTHON_INSTALL', + 'WITHOUT_BF_PYTHON_INSTALL', 'WITHOUT_BF_PYTHON_UNPACK', 'WITHOUT_BF_OVERWRITE_INSTALL', 'WITH_BF_OPENMP', 'BF_OPENMP', 'BF_OPENMP_LIBPATH', 'WITH_GHOST_COCOA', @@ -519,6 +519,7 @@ def read_opts(env, cfg, args): (BoolVariable('BF_SPLIT_SRC', 'Split src lib into several chunks if true', False)), (BoolVariable('WITHOUT_BF_INSTALL', 'dont install if true', False)), (BoolVariable('WITHOUT_BF_PYTHON_INSTALL', 'dont install Python modules if true', False)), + (BoolVariable('WITHOUT_BF_PYTHON_UNPACK', 'dont remove and unpack Python modules everytime if true', False)), (BoolVariable('WITHOUT_BF_OVERWRITE_INSTALL', 'dont remove existing files before breating the new install directory (set to False when making packages for others)', False)), (BoolVariable('BF_FANCY', 'Enable fancy output if true', True)), (BoolVariable('BF_QUIET', 'Enable silent output if true', True)), From f6d5b7ffd7de0d21ac62a5a8aaba9d2b0ae08a6e Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Wed, 23 May 2012 04:01:05 +0000 Subject: [PATCH 134/159] Fix for [#31276] Action Actuator, Priorities higher than 1 break Playback: The code was looking to see if the priority was strictly greater than the current priority, but it seems that an equal priority should also override (at least the report seems to suggest that this is the behavior from 2.49). --- source/gameengine/Ketsji/BL_Action.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/gameengine/Ketsji/BL_Action.cpp b/source/gameengine/Ketsji/BL_Action.cpp index c187199c8d0..15be4c46894 100644 --- a/source/gameengine/Ketsji/BL_Action.cpp +++ b/source/gameengine/Ketsji/BL_Action.cpp @@ -127,7 +127,7 @@ bool BL_Action::Play(const char* name, // Only start playing a new action if we're done, or if // the new action has a higher priority - if (priority != 0 && !IsDone() && priority >= m_priority) + if (!IsDone() && priority > m_priority) return false; m_priority = priority; bAction* prev_action = m_action; From 523a6b0424030972c4f077495439f7ee9955a301 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 23 May 2012 04:15:50 +0000 Subject: [PATCH 135/159] Scons - only go to the trouble of making these directories if they don't already exist! --- SConstruct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index 46ce989e9c0..bbf3dff0394 100644 --- a/SConstruct +++ b/SConstruct @@ -553,7 +553,7 @@ if env['OURPLATFORM']!='darwin': source=[os.path.join(dp, f) for f in df if not f.endswith(".pyc")] # To ensure empty dirs are created too - if len(source)==0: + if len(source)==0 and not os.path.exists(dir): env.Execute(Mkdir(dir)) scriptinstall.append(env.Install(dir=dir,source=source)) if env['WITH_BF_CYCLES']: From f537691c6b2c72b2fb738785e3dc5713c95fa9fa Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 06:25:31 +0000 Subject: [PATCH 136/159] fix solidify modifier flipping of rim polygons. --- source/blender/modifiers/intern/MOD_solidify.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 39b88fccd22..5462bf2f97a 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -32,7 +32,6 @@ * \ingroup modifiers */ - #include "DNA_meshdata_types.h" #include "MEM_guardedalloc.h" @@ -51,7 +50,6 @@ #include "MOD_modifiertypes.h" #include "MOD_util.h" - typedef struct EdgeFaceRef { int f1; /* init as -1 */ int f2; @@ -168,7 +166,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3]) } } } - + static void initData(ModifierData *md) { SolidifyModifierData *smd = (SolidifyModifierData *) md; @@ -176,7 +174,7 @@ static void initData(ModifierData *md) smd->offset_fac = -1.0f; smd->flag = MOD_SOLIDIFY_RIM; } - + static void copyData(ModifierData *md, ModifierData *target) { SolidifyModifierData *smd = (SolidifyModifierData *) md; @@ -366,7 +364,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, /* if the original has it, get the result so we can update it */ face_nors_result = CustomData_get_layer(&result->polyData, CD_NORMAL); - /*flip normals*/ + /* flip normals */ mp = mpoly + numFaces; for (i = 0; i < dm->numPolyData; i++, mp++) { MLoop *ml2; @@ -614,10 +612,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, if (fidx >= numFaces) { fidx -= numFaces; - flip = 1; + flip = TRUE; } else { - flip = 0; + flip = FALSE; } ed = medge + eidx; @@ -640,7 +638,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, CustomData_copy_data(&dm->loopData, &result->loopData, k2, numLoops * 2 + j + 2, 1); CustomData_copy_data(&dm->loopData, &result->loopData, k1, numLoops * 2 + j + 3, 1); - if (flip) { + if (flip == FALSE) { ml[j].v = ed->v1; ml[j++].e = eidx; @@ -782,7 +780,7 @@ ModifierTypeInfo modifierType_Solidify = { /* isDisabled */ NULL, /* updateDepgraph */ NULL, /* dependsOnTime */ NULL, - /* dependsOnNormals */ NULL, + /* dependsOnNormals */ NULL, /* foreachObjectLink */ NULL, /* foreachIDLink */ NULL, /* foreachTexLink */ NULL, From 8f886b3958b7cdc55c00e51dbbcf7b417879a110 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 06:32:02 +0000 Subject: [PATCH 137/159] solidify modifier - replace VECADDFAC with inline function. --- source/blender/modifiers/intern/MOD_solidify.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 5462bf2f97a..92a3f6735ff 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -55,6 +55,14 @@ typedef struct EdgeFaceRef { int f2; } EdgeFaceRef; +/* spesific function for solidify - define locally */ +BLI_INLINE void madd_v3v3short_fl(float r[3], const short a[3], const float f) +{ + r[0] += (float)a[0] * f; + r[1] += (float)a[1] * f; + r[2] += (float)a[2] * f; +} + static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3]) { int i, numVerts, numEdges, numFaces; @@ -422,7 +430,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, scalar_short_vgroup = (offset_fac_vg + (scalar_short_vgroup * offset_fac_vg_inv)) * scalar_short; dv++; } - VECADDFAC(mv->co, mv->co, mv->no, scalar_short_vgroup); + madd_v3v3short_fl(mv->co, mv->no, scalar_short_vgroup); } } @@ -437,7 +445,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, scalar_short_vgroup = (offset_fac_vg + (scalar_short_vgroup * offset_fac_vg_inv)) * scalar_short; dv++; } - VECADDFAC(mv->co, mv->co, mv->no, scalar_short_vgroup); + madd_v3v3short_fl(mv->co, mv->no, scalar_short_vgroup); } } From 27220c33402a0a30ea628cf2ebf4f2d55860a84b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 06:39:29 +0000 Subject: [PATCH 138/159] solidify modifier - replace define, no longer needed since switching to bmesh. --- .../blender/modifiers/intern/MOD_solidify.c | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 92a3f6735ff..059218ecb60 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -107,25 +107,10 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3]) EdgeFaceRef *edge_ref; float edge_normal[3]; - /* This function adds an edge hash if its not there, and adds the face index */ -#define NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(EDV1, EDV2); \ - { \ - const unsigned int ml_v1 = EDV1; \ - const unsigned int ml_v2 = EDV2; \ - edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, ml_v1, ml_v2); \ - if (!edge_ref) { \ - edge_ref = &edge_ref_array[edge_ref_count]; edge_ref_count++; \ - edge_ref->f1 = i; \ - edge_ref->f2 =- 1; \ - BLI_edgehash_insert(edge_hash, ml_v1, ml_v2, edge_ref); \ - } \ - else { \ - edge_ref->f2 = i; \ - } \ - } - /* --- end define --- */ - + /* This loop adds an edge hash if its not there, and adds the face index */ for (i = 0; i < numFaces; i++, mp++) { + unsigned int ml_v1; + unsigned int ml_v2; int j; f_no = face_nors[i]; @@ -133,8 +118,23 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3]) mesh_calc_poly_normal(mp, mloop + mp->loopstart, mvert, f_no); ml = mloop + mp->loopstart; - for (j = 0; j < mp->totloop; j++, ml++) { - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(ml->v, ME_POLY_LOOP_NEXT(mloop, mp, j)->v); + + for (j = 0, ml_v1 = ml->v, ml_v2 = ml[mp->totloop - 1].v; + j < mp->totloop; + j++, ml++, ml_v2 = ml_v1, ml_v1 = ml->v) + { + /* --- add edge ref to face --- */ + edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, ml_v1, ml_v2); + if (!edge_ref) { + edge_ref = &edge_ref_array[edge_ref_count++]; + edge_ref->f1 = i; + edge_ref->f2 = -1; + BLI_edgehash_insert(edge_hash, ml_v1, ml_v2, edge_ref); + } + else { + edge_ref->f2 = i; + } + /* --- done --- */ } } From 88fc57359669b2fd32a42cd0b82bc052639c39a8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 09:46:32 +0000 Subject: [PATCH 139/159] non-proportional edge slide patch by XercesBlue remmoved edge-visibility check from the patch which gives nice functionality but calculates and BVH and throws it away every update. --- source/blender/editors/transform/transform.c | 234 ++++++++++++++++++- source/blender/editors/transform/transform.h | 15 +- 2 files changed, 238 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 45e5fb10bc0..651f255f1fa 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -536,6 +536,12 @@ static void view_editmove(unsigned short UNUSED(event)) #define TFM_MODAL_AUTOIK_LEN_INC 22 #define TFM_MODAL_AUTOIK_LEN_DEC 23 +#define TFM_MODAL_EDGESLIDE_UP 24 +#define TFM_MODAL_EDGESLIDE_DOWN 25 + +#define TFM_WHEEL_DOWN_EVT TFM_MODAL_PROPSIZE_DOWN|TFM_MODAL_EDGESLIDE_DOWN +#define TFM_WHEEL_UP_EVT TFM_MODAL_PROPSIZE_UP|TFM_MODAL_EDGESLIDE_UP + /* called in transform_ops.c, on each regeneration of keymaps */ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) { @@ -563,6 +569,8 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) {TFM_MODAL_PROPSIZE_DOWN, "PROPORTIONAL_SIZE_DOWN", 0, "Decrease Proportional Influence", ""}, {TFM_MODAL_AUTOIK_LEN_INC, "AUTOIK_CHAIN_LEN_UP", 0, "Increase Max AutoIK Chain Length", ""}, {TFM_MODAL_AUTOIK_LEN_DEC, "AUTOIK_CHAIN_LEN_DOWN", 0, "Decrease Max AutoIK Chain Length", ""}, + {TFM_MODAL_EDGESLIDE_UP, "EDGESLIDE_EDGE_NEXT", 0, "Select next Edge Slide Edge", ""}, + {TFM_MODAL_EDGESLIDE_DOWN, "EDGESLIDE_PREV_NEXT", 0, "Select previous Edge Slide Edge", ""}, {0, NULL, 0, NULL, NULL}}; wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map"); @@ -595,8 +603,8 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP); WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN); - WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP); - WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN); + WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_WHEEL_UP_EVT); + WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, TFM_WHEEL_DOWN_EVT); WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC); WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC); @@ -861,7 +869,7 @@ int transformEvent(TransInfo *t, wmEvent *event) removeSnapPoint(t); t->redraw |= TREDRAW_HARD; break; - case TFM_MODAL_PROPSIZE_UP: + case TFM_WHEEL_UP_EVT: if (t->flag & T_PROP_EDIT) { t->prop_size*= 1.1f; if (t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO) @@ -870,7 +878,7 @@ int transformEvent(TransInfo *t, wmEvent *event) } t->redraw |= TREDRAW_HARD; break; - case TFM_MODAL_PROPSIZE_DOWN: + case TFM_WHEEL_DOWN_EVT: if (t->flag & T_PROP_EDIT) { t->prop_size*= 0.90909090f; calculatePropRatio(t); @@ -1392,6 +1400,7 @@ static void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(a drawConstraint(t); drawPropCircle(C, t); drawSnapping(C, t); + drawNonPropEdge(C, t); } #if 0 @@ -4468,6 +4477,42 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, return NULL; } +static void calcNonProportionalEdgeSlide(TransInfo *t, SlideData *sld, const float mval[2]) +{ + TransDataSlideVert *sv = sld->sv; + + if (sld->totsv > 0) { + int i = 0; + + float v_proj[3]; + float dist = 0; + float min_dist = FLT_MAX; + + float up_p[3]; + float dw_p[3]; + + for (i = 0; i < sld->totsv; i++, sv++) { + /* Set length */ + add_v3_v3v3(up_p, sv->origvert.co, sv->upvec); + add_v3_v3v3(dw_p, sv->origvert.co, sv->downvec); + sv->edge_len = len_v3v3(dw_p, up_p); + + mul_v3_m4v3(v_proj, t->obedit->obmat, sv->v->co); + project_float_noclip(t->ar, v_proj, v_proj); + + dist = len_squared_v2v2(mval, v_proj); + if (dist < min_dist) { + min_dist = dist; + sld->curr_sv = sv; + sld->curr_sv_index = i; + } + } + } + else { + sld->curr_sv = sv; + } +} + static int createSlideVerts(TransInfo *t) { Mesh *me = t->obedit->data; @@ -4485,10 +4530,16 @@ static int createSlideVerts(TransInfo *t) RegionView3D *rv3d = t->ar ? t->ar->regiondata : NULL; /* background mode support */ ARegion *ar = t->ar; float projectMat[4][4]; + float mval[2] = {(float)t->mval[0], (float)t->mval[1]}; float start[3] = {0.0f, 0.0f, 0.0f}, dir[3], end[3] = {0.0f, 0.0f, 0.0f}; float vec[3], vec2[3], lastvec[3] /*, size, dis=0.0, z */ /* UNUSED */; int numsel, i, j; + sld->is_proportional = TRUE; + sld->curr_sv = NULL; + sld->curr_sv_index = 0; + sld->flipped_vtx = FALSE; + if (!v3d) { /* ok, let's try to survive this */ unit_m4(projectMat); @@ -4751,7 +4802,10 @@ static int createSlideVerts(TransInfo *t) BLI_smallhash_insert(&sld->vhash, (uintptr_t)sv_array->v, sv_array); } - + + calcNonProportionalEdgeSlide(t, sld, mval); + + sld->origfaces_init = TRUE; sld->em = em; @@ -4760,7 +4814,7 @@ static int createSlideVerts(TransInfo *t) /*dir holds a vector along edge loop*/ copy_v3_v3(end, dir); - mul_v3_fl(end, 0.5); + mul_v3_fl(end, 0.5f); sld->start[0] = t->mval[0] + start[0]; sld->start[1] = t->mval[1] + start[1]; @@ -4985,7 +5039,8 @@ void initEdgeSlide(TransInfo *t) t->mode = TFM_EDGE_SLIDE; t->transform = EdgeSlide; - + t->handleEvent = handleEventEdgeSlide; + if (!createSlideVerts(t)) { t->state= TRANS_CANCEL; return; @@ -5013,6 +5068,136 @@ void initEdgeSlide(TransInfo *t) t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } +int handleEventEdgeSlide(struct TransInfo *t, struct wmEvent *event) +{ + if (t->flag & TFM_EDGE_SLIDE) { + SlideData *sld = t->customData; + + if (sld) { + switch (event->type) { + case EKEY: + if (event->val == KM_PRESS) { + sld->is_proportional = !sld->is_proportional; + return 1; + } + break; + case FKEY: { + if (event->val == KM_PRESS) { + if (sld->is_proportional == FALSE) { + sld->flipped_vtx = !sld->flipped_vtx; + } + return 1; + } + break; + } + case EVT_MODAL_MAP: { + switch (event->val) { + case TFM_WHEEL_DOWN_EVT: { + if (sld->curr_sv_index == 0) { + sld->curr_sv = sld->sv + (sld->totsv - 1); + sld->curr_sv_index = sld->totsv - 1; + } + else { + sld->curr_sv = sld->curr_sv - 1; + sld->curr_sv_index = sld->curr_sv_index - 1; + } + break; + } + case TFM_WHEEL_UP_EVT: { + if (sld->totsv == sld->curr_sv_index + 1) { + sld->curr_sv = sld->sv; + sld->curr_sv_index = 0; + } + else { + sld->curr_sv = sld->curr_sv + 1; + sld->curr_sv_index = sld->curr_sv_index + 1; + } + break; + } + } + } + default: + break; + } + } + } + return 0; +} + +void drawNonPropEdge(const struct bContext *C, TransInfo *t) +{ + if (t->flag & TFM_EDGE_SLIDE) { + SlideData *sld = (SlideData *)t->customData; + /* Non-Prop mode */ + if (sld && sld->is_proportional == FALSE) { + View3D *v3d = CTX_wm_view3d(C); + float marker[3]; + float v1[3], v2[3]; + float interp_v; + TransDataSlideVert *v = sld->curr_sv; + const float ctrl_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 1.5; + const float guide_size = ctrl_size - 0.5f; + const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f; + const int alpha_shade = -30; + + add_v3_v3v3(v1, v->origvert.co, v->upvec); + add_v3_v3v3(v2, v->origvert.co, v->downvec); + + interp_v = (sld->perc + 1.0f) / 2.0f; + interp_v3_v3v3(marker, v2, v1, interp_v); + + if (v3d && v3d->zbuf) + glDisable(GL_DEPTH_TEST); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT | GL_POINT_BIT); + glPushMatrix(); + + glMultMatrixf(t->obedit->obmat); + + glLineWidth(line_size); + UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade); + glBegin(GL_LINES); + glVertex3fv(v->up->co); + glVertex3fv(v->origvert.co); + glVertex3fv(v->down->co); + glVertex3fv(v->origvert.co); + bglEnd(); + + + UI_ThemeColorShadeAlpha(TH_SELECT, -30, alpha_shade); + glPointSize(ctrl_size); + if (sld->flipped_vtx) { + bglBegin(GL_POINTS); + bglVertex3fv(v->down->co); + bglEnd(); + } + else { + bglBegin(GL_POINTS); + bglVertex3fv(v->up->co); + bglEnd(); + } + + UI_ThemeColorShadeAlpha(TH_SELECT, 255, alpha_shade); + glPointSize(guide_size); + bglBegin(GL_POINTS); + bglVertex3fv(marker); + bglEnd(); + + + glPopMatrix(); + glPopAttrib(); + + glDisable(GL_BLEND); + + if (v3d && v3d->zbuf) + glEnable(GL_DEPTH_TEST); + } + } +} + static int doEdgeSlide(TransInfo *t, float perc) { SlideData *sld = t->customData; @@ -5024,6 +5209,30 @@ static int doEdgeSlide(TransInfo *t, float perc) sv = svlist; for (i=0; itotsv; i++, sv++) { + if (sld->is_proportional == FALSE) { + TransDataSlideVert *curr_tsv = sld->curr_sv; + float cur_sel = curr_tsv->edge_len; + float cur_sv = sv->edge_len; + float extd = 0.0f; + float recip_cur_sv = 0.0f; + + if (cur_sel == 0.0f) cur_sel = 1.0f; + if (cur_sv == 0.0f) cur_sv = 1.0f; + + recip_cur_sv = 1.0f / cur_sv; + + if (!sld->flipped_vtx) { + extd = (cur_sv - cur_sel) * recip_cur_sv; + } + else { + extd = (cur_sel - cur_sv) * recip_cur_sv; + } + + extd += (sld->perc * cur_sel) * recip_cur_sv; + CLAMP(extd, -1.0f, 1.0f); + perc = extd; + } + if (perc > 0.0f) { copy_v3_v3(vec, sv->upvec); mul_v3_fl(vec, perc); @@ -5043,8 +5252,11 @@ static int doEdgeSlide(TransInfo *t, float perc) int EdgeSlide(TransInfo *t, const int UNUSED(mval[2])) { - char str[50]; + char str[128]; float final; + SlideData *sld = t->customData; + int flipped = sld->flipped_vtx; + int is_proportional = sld->is_proportional; final = t->values[0]; @@ -5060,10 +5272,12 @@ int EdgeSlide(TransInfo *t, const int UNUSED(mval[2])) outputNumInput(&(t->num), c); - sprintf(str, "Edge Slide: %s", &c[0]); + BLI_snprintf(str, sizeof(str), "Edge Slide: %s (E)ven: %s, (F)lipped: %s", + &c[0], !is_proportional ? "ON" : "OFF", flipped ? "ON" : "OFF" ); } else { - sprintf(str, "Edge Slide: %.2f", final); + BLI_snprintf(str, sizeof(str), "Edge Slide: %.2f (E)ven: %s, (F)lipped: %s", + final, !is_proportional ? "ON" : "OFF", flipped ? "ON" : "OFF" ); } CLAMP(final, -1.0f, 1.0f); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 2d26de63471..04459af6ec9 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -194,6 +194,8 @@ typedef struct TransDataSlideVert { struct BMVert *up, *down; struct BMVert *v; + float edge_len; + float upvec[3], downvec[3]; } TransDataSlideVert; @@ -206,9 +208,17 @@ typedef struct SlideData { int start[2], end[2]; struct BMEditMesh *em; - float perc; + /* flag that is set when origfaces is initialized */ int origfaces_init; + + float perc; + + int is_proportional; + int flipped_vtx; + + int curr_sv_index; + struct TransDataSlideVert *curr_sv; } SlideData; typedef struct TransData { @@ -511,6 +521,7 @@ void initBoneRoll(TransInfo *t); int BoneRoll(TransInfo *t, const int mval[2]); void initEdgeSlide(TransInfo *t); +int handleEventEdgeSlide(TransInfo *t, struct wmEvent *event); int EdgeSlide(TransInfo *t, const int mval[2]); void initTimeTranslate(TransInfo *t); @@ -653,6 +664,8 @@ void resetTransRestrictions(TransInfo *t); void drawLine(TransInfo *t, float *center, float *dir, char axis, short options); +void drawNonPropEdge(const struct bContext *C, TransInfo *t); + /* DRAWLINE options flags */ #define DRAWLIGHT 1 From f8481fed476b7e0815164a26b307e5418b0b9edb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 23 May 2012 09:46:33 +0000 Subject: [PATCH 140/159] Fix: cycles not supporting scene background sets. --- intern/cycles/blender/blender_object.cpp | 75 +++++++++++----------- source/blender/makesrna/intern/rna_scene.c | 2 +- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index 405c7eada1d..14d4c2f3ddf 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -285,52 +285,55 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) /* object loop */ BL::Scene::objects_iterator b_ob; + BL::Scene b_sce = b_scene; - for(b_scene.objects.begin(b_ob); b_ob != b_scene.objects.end(); ++b_ob) { - bool hide = (render_layer.use_viewport_visibility)? b_ob->hide(): b_ob->hide_render(); - uint ob_layer = get_layer(b_ob->layers()); + for(; b_sce; b_sce = b_sce.background_set()) { + for(b_sce.objects.begin(b_ob); b_ob != b_sce.objects.end(); ++b_ob) { + bool hide = (render_layer.use_viewport_visibility)? b_ob->hide(): b_ob->hide_render(); + uint ob_layer = get_layer(b_ob->layers()); - if(!hide && (ob_layer & scene_layer)) { - if(b_ob->is_duplicator()) { - /* dupli objects */ - object_create_duplilist(*b_ob, b_scene); + if(!hide && (ob_layer & scene_layer)) { + if(b_ob->is_duplicator()) { + /* dupli objects */ + object_create_duplilist(*b_ob, b_scene); - BL::Object::dupli_list_iterator b_dup; - int b_index = 0; + BL::Object::dupli_list_iterator b_dup; + int b_index = 0; - for(b_ob->dupli_list.begin(b_dup); b_dup != b_ob->dupli_list.end(); ++b_dup) { - Transform tfm = get_transform(b_dup->matrix()); - BL::Object b_dup_ob = b_dup->object(); - bool dup_hide = (b_v3d)? b_dup_ob.hide(): b_dup_ob.hide_render(); + for(b_ob->dupli_list.begin(b_dup); b_dup != b_ob->dupli_list.end(); ++b_dup) { + Transform tfm = get_transform(b_dup->matrix()); + BL::Object b_dup_ob = b_dup->object(); + bool dup_hide = (b_v3d)? b_dup_ob.hide(): b_dup_ob.hide_render(); - if(!(b_dup->hide() || dup_hide)) - sync_object(*b_ob, b_index, b_dup_ob, tfm, ob_layer, motion); + if(!(b_dup->hide() || dup_hide)) + sync_object(*b_ob, b_index, b_dup_ob, tfm, ob_layer, motion); - b_index++; - } + b_index++; + } - object_free_duplilist(*b_ob); + object_free_duplilist(*b_ob); - hide = true; - } - - /* check if we should render or hide particle emitter */ - BL::Object::particle_systems_iterator b_psys; - bool render_emitter = false; - - for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys) { - if(b_psys->settings().use_render_emitter()) { - hide = false; - render_emitter = true; - } - else if(!render_emitter) hide = true; - } + } - if(!hide) { - /* object itself */ - Transform tfm = get_transform(b_ob->matrix_world()); - sync_object(*b_ob, 0, *b_ob, tfm, ob_layer, motion); + /* check if we should render or hide particle emitter */ + BL::Object::particle_systems_iterator b_psys; + bool render_emitter = false; + + for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys) { + if(b_psys->settings().use_render_emitter()) { + hide = false; + render_emitter = true; + } + else if(!render_emitter) + hide = true; + } + + if(!hide) { + /* object itself */ + Transform tfm = get_transform(b_ob->matrix_world()); + sync_object(*b_ob, 0, *b_ob, tfm, ob_layer, motion); + } } } } diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index e6a0401175d..5b355e56911 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -4214,7 +4214,7 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); RNA_def_property_pointer_funcs(prop, NULL, "rna_Scene_set_set", NULL, NULL); RNA_def_property_ui_text(prop, "Background Scene", "Background set scene"); - RNA_def_property_update(prop, NC_SCENE | NA_EDITED, NULL); + RNA_def_property_update(prop, NC_SCENE | NA_EDITED, "rna_Scene_glsl_update"); prop = RNA_def_property(srna, "world", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); From c0f59c44f8f4a15368335337adc7b9aafbe3fca6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 09:55:48 +0000 Subject: [PATCH 141/159] edit to last commit, remove pointer to active slide vert, only need to store the index. --- source/blender/editors/transform/transform.c | 44 +++++++------------- source/blender/editors/transform/transform.h | 1 - 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 651f255f1fa..43fdb779470 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4503,13 +4503,12 @@ static void calcNonProportionalEdgeSlide(TransInfo *t, SlideData *sld, const flo dist = len_squared_v2v2(mval, v_proj); if (dist < min_dist) { min_dist = dist; - sld->curr_sv = sv; sld->curr_sv_index = i; } } } else { - sld->curr_sv = sv; + sld->curr_sv_index = 0; } } @@ -4536,7 +4535,6 @@ static int createSlideVerts(TransInfo *t) int numsel, i, j; sld->is_proportional = TRUE; - sld->curr_sv = NULL; sld->curr_sv_index = 0; sld->flipped_vtx = FALSE; @@ -5093,25 +5091,11 @@ int handleEventEdgeSlide(struct TransInfo *t, struct wmEvent *event) case EVT_MODAL_MAP: { switch (event->val) { case TFM_WHEEL_DOWN_EVT: { - if (sld->curr_sv_index == 0) { - sld->curr_sv = sld->sv + (sld->totsv - 1); - sld->curr_sv_index = sld->totsv - 1; - } - else { - sld->curr_sv = sld->curr_sv - 1; - sld->curr_sv_index = sld->curr_sv_index - 1; - } + sld->curr_sv_index = ((sld->curr_sv_index - 1) + sld->totsv) % sld->totsv; break; } case TFM_WHEEL_UP_EVT: { - if (sld->totsv == sld->curr_sv_index + 1) { - sld->curr_sv = sld->sv; - sld->curr_sv_index = 0; - } - else { - sld->curr_sv = sld->curr_sv + 1; - sld->curr_sv_index = sld->curr_sv_index + 1; - } + sld->curr_sv_index = (sld->curr_sv_index + 1) % sld->totsv; break; } } @@ -5134,14 +5118,14 @@ void drawNonPropEdge(const struct bContext *C, TransInfo *t) float marker[3]; float v1[3], v2[3]; float interp_v; - TransDataSlideVert *v = sld->curr_sv; + TransDataSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; const float ctrl_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 1.5; const float guide_size = ctrl_size - 0.5f; const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f; const int alpha_shade = -30; - add_v3_v3v3(v1, v->origvert.co, v->upvec); - add_v3_v3v3(v2, v->origvert.co, v->downvec); + add_v3_v3v3(v1, curr_sv->origvert.co, curr_sv->upvec); + add_v3_v3v3(v2, curr_sv->origvert.co, curr_sv->downvec); interp_v = (sld->perc + 1.0f) / 2.0f; interp_v3_v3v3(marker, v2, v1, interp_v); @@ -5160,10 +5144,10 @@ void drawNonPropEdge(const struct bContext *C, TransInfo *t) glLineWidth(line_size); UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade); glBegin(GL_LINES); - glVertex3fv(v->up->co); - glVertex3fv(v->origvert.co); - glVertex3fv(v->down->co); - glVertex3fv(v->origvert.co); + glVertex3fv(curr_sv->up->co); + glVertex3fv(curr_sv->origvert.co); + glVertex3fv(curr_sv->down->co); + glVertex3fv(curr_sv->origvert.co); bglEnd(); @@ -5171,12 +5155,12 @@ void drawNonPropEdge(const struct bContext *C, TransInfo *t) glPointSize(ctrl_size); if (sld->flipped_vtx) { bglBegin(GL_POINTS); - bglVertex3fv(v->down->co); + bglVertex3fv(curr_sv->down->co); bglEnd(); } else { bglBegin(GL_POINTS); - bglVertex3fv(v->up->co); + bglVertex3fv(curr_sv->up->co); bglEnd(); } @@ -5210,8 +5194,8 @@ static int doEdgeSlide(TransInfo *t, float perc) sv = svlist; for (i=0; itotsv; i++, sv++) { if (sld->is_proportional == FALSE) { - TransDataSlideVert *curr_tsv = sld->curr_sv; - float cur_sel = curr_tsv->edge_len; + TransDataSlideVert *curr_sv = &sld->sv[sld->curr_sv_index]; + float cur_sel = curr_sv->edge_len; float cur_sv = sv->edge_len; float extd = 0.0f; float recip_cur_sv = 0.0f; diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 04459af6ec9..6051fd2577b 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -218,7 +218,6 @@ typedef struct SlideData { int flipped_vtx; int curr_sv_index; - struct TransDataSlideVert *curr_sv; } SlideData; typedef struct TransData { From a4257c888073bce1f6f95267c81b17e6445f9055 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 23 May 2012 10:31:16 +0000 Subject: [PATCH 142/159] * Stopped flickering of preview images * Solved crash when first input socket of brightness node is not connected --- source/blender/compositor/nodes/COM_BrightnessNode.cpp | 5 ++--- .../compositor/operations/COM_PreviewOperation.cpp | 1 - source/blender/nodes/composite/node_composite_tree.c | 10 ++++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.cpp b/source/blender/compositor/nodes/COM_BrightnessNode.cpp index 2bcf7250173..c4fac50334c 100644 --- a/source/blender/compositor/nodes/COM_BrightnessNode.cpp +++ b/source/blender/compositor/nodes/COM_BrightnessNode.cpp @@ -28,12 +28,11 @@ BrightnessNode::BrightnessNode(bNode *editorNode): Node(editorNode) { } -/// @todo: add anti alias when not FSA + void BrightnessNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { BrightnessOperation *operation = new BrightnessOperation(); - - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2),true, 2, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cpp b/source/blender/compositor/operations/COM_PreviewOperation.cpp index 2b02546a8f9..a7b6fc93b25 100644 --- a/source/blender/compositor/operations/COM_PreviewOperation.cpp +++ b/source/blender/compositor/operations/COM_PreviewOperation.cpp @@ -93,7 +93,6 @@ void PreviewOperation::executeRegion(rcti *rect, unsigned int tileNumber, Memory color[2] = 0.0f; color[3] = 1.0f; input->read(color, rx, ry, COM_PS_NEAREST, memoryBuffers); - /// @todo: linear conversion only when scene color management is selected, also check predivide. linearrgb_to_srgb_v4(color, color); F4TOCHAR4(color, outputBuffer+offset); offset +=4; diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 8099f6d3f13..5bc2e1fc004 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -143,6 +143,16 @@ static void localize(bNodeTree *localtree, bNodeTree *ntree) } } + /* copy over the preview buffers to update graduatly */ + if (node->preview) { + bNodePreview *preview = MEM_callocN(sizeof(bNodePreview), "Preview"); + preview->pad = node->preview->pad; + preview->xsize = node->preview->xsize; + preview->ysize = node->preview->ysize; + preview->rect = MEM_dupallocN(node->preview->rect); + node->new_node->preview = preview; + } + 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); From 487fa055def89911d7b4e982717afd9f0c56ca58 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 23 May 2012 11:38:00 +0000 Subject: [PATCH 143/159] Set "a" version character to put the version at 2.63a, this is apparently needed for package managers to stay ahead of the 2.63a bugfix release. --- source/blender/blenkernel/BKE_blender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 596c4a7d7b8..e0b734faddb 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -49,7 +49,7 @@ extern "C" { /* used by packaging tools */ /* can be left blank, otherwise a,b,c... etc with no quotes */ -#define BLENDER_VERSION_CHAR +#define BLENDER_VERSION_CHAR a /* alpha/beta/rc/release, docs use this */ #define BLENDER_VERSION_CYCLE alpha From 9b45f607c927028960406bb558a9fe7d9f67c0ba Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 23 May 2012 12:45:07 +0000 Subject: [PATCH 144/159] cleanup relink code --- .../compositor/intern/COM_InputSocket.cpp | 100 +++++++++--------- .../compositor/intern/COM_InputSocket.h | 6 +- .../compositor/nodes/COM_AlphaOverNode.cpp | 6 +- .../nodes/COM_BilateralBlurNode.cpp | 4 +- .../blender/compositor/nodes/COM_BlurNode.cpp | 12 +-- .../compositor/nodes/COM_BokehBlurNode.cpp | 12 +-- .../compositor/nodes/COM_BoxMaskNode.cpp | 4 +- .../compositor/nodes/COM_BrightnessNode.cpp | 6 +- .../compositor/nodes/COM_ChannelMatteNode.cpp | 4 +- .../compositor/nodes/COM_ChromaMatteNode.cpp | 4 +- .../compositor/nodes/COM_ColorBalanceNode.cpp | 4 +- .../nodes/COM_ColorCorrectionNode.cpp | 4 +- .../compositor/nodes/COM_ColorCurveNode.cpp | 8 +- .../compositor/nodes/COM_ColorMatteNode.cpp | 4 +- .../compositor/nodes/COM_ColorRampNode.cpp | 2 +- .../compositor/nodes/COM_ColorSpillNode.cpp | 4 +- .../compositor/nodes/COM_ColorToBWNode.cpp | 2 +- .../compositor/nodes/COM_CombineRGBANode.cpp | 8 +- .../compositor/nodes/COM_ConvertAlphaNode.cpp | 2 +- .../blender/compositor/nodes/COM_CropNode.cpp | 2 +- .../compositor/nodes/COM_DefocusNode.cpp | 8 +- .../nodes/COM_DifferenceMatteNode.cpp | 4 +- .../compositor/nodes/COM_DilateErodeNode.cpp | 6 +- .../nodes/COM_DirectionalBlurNode.cpp | 2 +- .../compositor/nodes/COM_DisplaceNode.cpp | 8 +- .../nodes/COM_DistanceMatteNode.cpp | 4 +- .../nodes/COM_DoubleEdgeMaskNode.cpp | 4 +- .../compositor/nodes/COM_EllipseMaskNode.cpp | 4 +- .../compositor/nodes/COM_FilterNode.cpp | 4 +- .../blender/compositor/nodes/COM_FlipNode.cpp | 2 +- .../compositor/nodes/COM_GammaNode.cpp | 4 +- .../compositor/nodes/COM_GlareNode.cpp | 6 +- .../compositor/nodes/COM_GroupNode.cpp | 4 +- .../COM_HueSaturationValueCorrectNode.cpp | 4 +- .../nodes/COM_HueSaturationValueNode.cpp | 4 +- .../compositor/nodes/COM_IDMaskNode.cpp | 2 +- .../compositor/nodes/COM_InvertNode.cpp | 4 +- .../nodes/COM_LensDistortionNode.cpp | 4 +- .../nodes/COM_LuminanceMatteNode.cpp | 2 +- .../compositor/nodes/COM_MapUVNode.cpp | 4 +- .../compositor/nodes/COM_MapValueNode.cpp | 2 +- .../blender/compositor/nodes/COM_MathNode.cpp | 4 +- .../blender/compositor/nodes/COM_MixNode.cpp | 6 +- .../nodes/COM_MovieDistortionNode.cpp | 2 +- .../compositor/nodes/COM_NormalNode.cpp | 2 +- .../compositor/nodes/COM_NormalizeNode.cpp | 2 +- .../compositor/nodes/COM_RotateNode.cpp | 4 +- .../compositor/nodes/COM_ScaleNode.cpp | 16 +-- .../compositor/nodes/COM_SeparateRGBANode.cpp | 8 +- .../compositor/nodes/COM_SetAlphaNode.cpp | 4 +- .../compositor/nodes/COM_SplitViewerNode.cpp | 4 +- .../compositor/nodes/COM_Stabilize2dNode.cpp | 2 +- .../compositor/nodes/COM_SwitchNode.cpp | 4 +- .../compositor/nodes/COM_TextureNode.cpp | 4 +- .../compositor/nodes/COM_TonemapNode.cpp | 2 +- .../compositor/nodes/COM_TransformNode.cpp | 10 +- .../compositor/nodes/COM_TranslateNode.cpp | 6 +- .../compositor/nodes/COM_VectorBlurNode.cpp | 6 +- .../compositor/nodes/COM_VectorCurveNode.cpp | 2 +- .../compositor/nodes/COM_ViewLevelsNode.cpp | 4 +- .../compositor/nodes/COM_ViewerNode.cpp | 2 +- .../compositor/nodes/COM_ZCombineNode.cpp | 12 +-- 62 files changed, 192 insertions(+), 198 deletions(-) diff --git a/source/blender/compositor/intern/COM_InputSocket.cpp b/source/blender/compositor/intern/COM_InputSocket.cpp index 881aa58ec6b..7227773e117 100644 --- a/source/blender/compositor/intern/COM_InputSocket.cpp +++ b/source/blender/compositor/intern/COM_InputSocket.cpp @@ -127,60 +127,8 @@ void InputSocket::fireActualDataTypeSet() this->getNode()->notifyActualDataTypeSet(this, this->getActualDataType()); } void InputSocket::relinkConnections(InputSocket *relinkToSocket) -{ - this->relinkConnections(relinkToSocket, false, -1, NULL); -} - -void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem *graph) -{ - if (!duplicate) { - this->relinkConnections(relinkToSocket, autoconnect, editorNodeInputSocketIndex, graph); - } - else { - if (!this->isConnected() && autoconnect) { - Node *node = (Node*)this->getNode(); - switch (this->getActualDataType()) { - case COM_DT_UNKNOWN: - case COM_DT_COLOR: - node->addSetColorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); - break; - case COM_DT_VECTOR: - node->addSetVectorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); - break; - case COM_DT_VALUE: - node->addSetValueOperation(graph, relinkToSocket, editorNodeInputSocketIndex); - break; - } - return; - } - SocketConnection * newConnection = new SocketConnection(); - OutputSocket * fromSocket = this->getConnection()->getFromSocket(); - newConnection->setToSocket(relinkToSocket); - newConnection->setFromSocket(fromSocket); - relinkToSocket->setConnection(newConnection); - fromSocket->addConnection(newConnection); - graph->addSocketConnection(newConnection); - } -} - -void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem *graph) { if (!isConnected()) { - if (autoconnect) { - Node *node = (Node*)this->getNode(); - switch (this->getActualDataType()) { - case COM_DT_UNKNOWN: - case COM_DT_COLOR: - node->addSetColorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); - break; - case COM_DT_VECTOR: - node->addSetVectorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); - break; - case COM_DT_VALUE: - node->addSetValueOperation(graph, relinkToSocket, editorNodeInputSocketIndex); - break; - } - } return; } SocketConnection *connection = this->getConnection(); @@ -189,6 +137,54 @@ void InputSocket::relinkConnections(InputSocket *relinkToSocket, bool autoconnec this->setConnection(NULL); } +void InputSocket::relinkConnectionsDuplicate(InputSocket *relinkToSocket, int editorNodeInputSocketIndex, ExecutionSystem *graph) +{ + if (!this->isConnected()) { + Node *node = (Node*)this->getNode(); + switch (this->getActualDataType()) { + case COM_DT_UNKNOWN: + case COM_DT_COLOR: + node->addSetColorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VECTOR: + node->addSetVectorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VALUE: + node->addSetValueOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + } + return; + } + SocketConnection * newConnection = new SocketConnection(); + OutputSocket * fromSocket = this->getConnection()->getFromSocket(); + newConnection->setToSocket(relinkToSocket); + newConnection->setFromSocket(fromSocket); + relinkToSocket->setConnection(newConnection); + fromSocket->addConnection(newConnection); + graph->addSocketConnection(newConnection); +} + +void InputSocket::relinkConnections(InputSocket *relinkToSocket, int editorNodeInputSocketIndex, ExecutionSystem *graph) +{ + if (isConnected()) { + relinkConnections(relinkToSocket); + } else { + Node *node = (Node*)this->getNode(); + switch (this->getActualDataType()) { + case COM_DT_UNKNOWN: + case COM_DT_COLOR: + node->addSetColorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VECTOR: + node->addSetVectorOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + case COM_DT_VALUE: + node->addSetValueOperation(graph, relinkToSocket, editorNodeInputSocketIndex); + break; + } + } +} + const ChannelInfo *InputSocket::getChannelInfo(const int channelnumber) { if (this->isConnected() && this->connection->getFromSocket()) { diff --git a/source/blender/compositor/intern/COM_InputSocket.h b/source/blender/compositor/intern/COM_InputSocket.h index e01793317a5..b1c75e34844 100644 --- a/source/blender/compositor/intern/COM_InputSocket.h +++ b/source/blender/compositor/intern/COM_InputSocket.h @@ -126,17 +126,15 @@ public: * @param editorNodeInputSocketIndex index of the socket number of the bNode (used to retrieve the value for autoconnection) * @param system ExecutionSystem to update to */ - void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, ExecutionSystem *system); + void relinkConnections(InputSocket *relinkToSocket, int editorNodeInputSocketIndex, ExecutionSystem *system); /** * @brief move all connections of this input socket to another socket * @param relinkToSocket the socket to move to connections to - * @param autoconnect will a set operation be added when no connections exist * @param editorNodeInputSocketIndex index of the socket number of the bNode (used to retrieve the value for autoconnection) - * @param duplicate instead of move do a copy of the connection. * @param system ExecutionSystem to update to */ - void relinkConnections(InputSocket *relinkToSocket, bool autoconnect, int editorNodeInputSocketIndex, bool duplicate, ExecutionSystem *system); + void relinkConnectionsDuplicate(InputSocket *relinkToSocket, int editorNodeInputSocketIndex, ExecutionSystem *system); /** * @brief set the resize mode diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp index 0037480d2e9..eb3cd821172 100644 --- a/source/blender/compositor/nodes/COM_AlphaOverNode.cpp +++ b/source/blender/compositor/nodes/COM_AlphaOverNode.cpp @@ -64,9 +64,9 @@ void AlphaOverNode::convertToOperations(ExecutionSystem *graph, CompositorContex else { convertProg->setResolutionInputSocketIndex(0); } - valueSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); - color1Socket->relinkConnections(convertProg->getInputSocket(1), true, 1, graph); - color2Socket->relinkConnections(convertProg->getInputSocket(2), true, 2, graph); + valueSocket->relinkConnections(convertProg->getInputSocket(0), 0, graph); + color1Socket->relinkConnections(convertProg->getInputSocket(1), 1, graph); + color2Socket->relinkConnections(convertProg->getInputSocket(2), 2, graph); outputSocket->relinkConnections(convertProg->getOutputSocket(0)); graph->addOperation(convertProg); } diff --git a/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp b/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp index 436d92df7f8..fa654d35785 100644 --- a/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BilateralBlurNode.cpp @@ -36,8 +36,8 @@ void BilateralBlurNode::convertToOperations(ExecutionSystem *graph, CompositorCo BilateralBlurOperation *operation = new BilateralBlurOperation(); operation->setQuality(context->getQuality()); operation->setData(data); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_BlurNode.cpp b/source/blender/compositor/nodes/COM_BlurNode.cpp index 789a6a6eee2..90b2481cc7d 100644 --- a/source/blender/compositor/nodes/COM_BlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BlurNode.cpp @@ -50,8 +50,8 @@ void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c if (data->filtertype == R_FILTER_FAST_GAUSS) { FastGaussianBlurOperation *operationfgb = new FastGaussianBlurOperation(); operationfgb->setData(data); - this->getInputSocket(0)->relinkConnections(operationfgb->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operationfgb->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operationfgb->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operationfgb->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operationfgb->getOutputSocket(0)); graph->addOperation(operationfgb); addPreviewOperation(graph, operationfgb->getOutputSocket(), 5); @@ -60,8 +60,8 @@ void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c GaussianXBlurOperation *operationx = new GaussianXBlurOperation(); operationx->setData(data); operationx->setQuality(quality); - this->getInputSocket(0)->relinkConnections(operationx->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operationx->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operationx->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operationx->getInputSocket(1), 1, graph); graph->addOperation(operationx); GaussianYBlurOperation *operationy = new GaussianYBlurOperation(); operationy->setData(data); @@ -75,8 +75,8 @@ void BlurNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c else { GaussianBokehBlurOperation *operation = new GaussianBokehBlurOperation(); operation->setData(data); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); operation->setQuality(quality); graph->addOperation(operation); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp index 9e80d024bd2..d6f4f58fe70 100644 --- a/source/blender/compositor/nodes/COM_BokehBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_BokehBlurNode.cpp @@ -45,9 +45,9 @@ void BokehBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContex converter->setCameraObject(camob); operation->setMaxBlur(16); operation->setQuality(context->getQuality()); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); - this->getInputSocket(2)->relinkConnections(converter->getInputSocket(0), true, 2, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); + this->getInputSocket(2)->relinkConnections(converter->getInputSocket(0), 2, graph); addLink(graph, converter->getOutputSocket(), operation->getInputSocket(2)); graph->addOperation(operation); graph->addOperation(converter); @@ -55,9 +55,9 @@ void BokehBlurNode::convertToOperations(ExecutionSystem *graph, CompositorContex } else { BokehBlurOperation *operation = new BokehBlurOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); - this->getInputSocket(3)->relinkConnections(operation->getInputSocket(2), true, 3, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(2), 3, graph); operation->setSize(((bNodeSocketValueFloat*)this->getInputSocket(2)->getbNodeSocket()->default_value)->value); operation->setQuality(context->getQuality()); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_BoxMaskNode.cpp b/source/blender/compositor/nodes/COM_BoxMaskNode.cpp index 322b5893096..e99252663d0 100644 --- a/source/blender/compositor/nodes/COM_BoxMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_BoxMaskNode.cpp @@ -34,8 +34,8 @@ void BoxMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext BoxMaskOperation *operation; operation = new BoxMaskOperation(); operation->setData((NodeBoxMask*)this->getbNode()->storage); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); operation->setMaskType(this->getbNode()->custom1); diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.cpp b/source/blender/compositor/nodes/COM_BrightnessNode.cpp index c4fac50334c..9ccb58a45de 100644 --- a/source/blender/compositor/nodes/COM_BrightnessNode.cpp +++ b/source/blender/compositor/nodes/COM_BrightnessNode.cpp @@ -32,9 +32,9 @@ BrightnessNode::BrightnessNode(bNode *editorNode): Node(editorNode) void BrightnessNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) { BrightnessOperation *operation = new BrightnessOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); - this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2),true, 2, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp index 08980de8d98..dbe5b9936dc 100644 --- a/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ChannelMatteNode.cpp @@ -64,13 +64,13 @@ void ChannelMatteNode::convertToOperations(ExecutionSystem *graph, CompositorCon SetAlphaOperation *operationAlpha = new SetAlphaOperation(); if (convert) { - inputSocketImage->relinkConnections(convert->getInputSocket(0), true, 0, graph); + inputSocketImage->relinkConnections(convert->getInputSocket(0), 0, graph); addLink(graph, convert->getOutputSocket(), operation->getInputSocket(0)); addLink(graph, convert->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); graph->addOperation(convert); } else { - inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocketImage->relinkConnections(operation->getInputSocket(0), 0, graph); addLink(graph, operation->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0)); } diff --git a/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp b/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp index 45176cb007c..dd3b3855e3f 100644 --- a/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ChromaMatteNode.cpp @@ -44,8 +44,8 @@ void ChromaMatteNode::convertToOperations(ExecutionSystem *graph, CompositorCont bNode *editorsnode = getbNode(); operation->setSettings((NodeChroma*)editorsnode->storage); - inputSocketImage->relinkConnections(operationRGBToYCC_Image->getInputSocket(0), true, 0, graph); - inputSocketKey->relinkConnections(operationRGBToYCC_Key->getInputSocket(0), true, 0, graph); + inputSocketImage->relinkConnections(operationRGBToYCC_Image->getInputSocket(0), 0, graph); + inputSocketKey->relinkConnections(operationRGBToYCC_Key->getInputSocket(0), 0, graph); addLink(graph, operationRGBToYCC_Image->getOutputSocket(), operation->getInputSocket(0)); addLink(graph, operationRGBToYCC_Key->getOutputSocket(), operation->getInputSocket(1)); diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp index 32c9e50874e..7b852678191 100644 --- a/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.cpp @@ -63,8 +63,8 @@ void ColorBalanceNode::convertToOperations(ExecutionSystem *graph, CompositorCon operation = operationCDL; } - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputImageSocket->relinkConnections(operation->getInputSocket(1), true, 0, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); + inputImageSocket->relinkConnections(operation->getInputSocket(1), 0, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp index 995d66fcf23..4909f1b9895 100644 --- a/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.cpp @@ -33,8 +33,8 @@ void ColorCorrectionNode::convertToOperations(ExecutionSystem *graph, Compositor { ColorCorrectionOperation *operation = new ColorCorrectionOperation(); bNode *editorNode = getbNode(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); operation->setData((NodeColorCorrection*)editorNode->storage); operation->setRedChannelEnabled((editorNode->custom1&1)>0); diff --git a/source/blender/compositor/nodes/COM_ColorCurveNode.cpp b/source/blender/compositor/nodes/COM_ColorCurveNode.cpp index a96fdf72b11..d7cde21a984 100644 --- a/source/blender/compositor/nodes/COM_ColorCurveNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorCurveNode.cpp @@ -33,10 +33,10 @@ void ColorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorConte { ColorCurveOperation *operation = new ColorCurveOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); - this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, graph); - this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, graph); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), 3, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_ColorMatteNode.cpp b/source/blender/compositor/nodes/COM_ColorMatteNode.cpp index e5231a48e05..860d1a01194 100644 --- a/source/blender/compositor/nodes/COM_ColorMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorMatteNode.cpp @@ -42,8 +42,8 @@ void ColorMatteNode::convertToOperations(ExecutionSystem *graph, CompositorConte bNode *editorsnode = getbNode(); operation->setSettings((NodeChroma*)editorsnode->storage); - inputSocketImage->relinkConnections(operationRGBToHSV_Image->getInputSocket(0), true, 0, graph); - inputSocketKey->relinkConnections(operationRGBToHSV_Key->getInputSocket(0), true, 1, graph); + inputSocketImage->relinkConnections(operationRGBToHSV_Image->getInputSocket(0), 0, graph); + inputSocketKey->relinkConnections(operationRGBToHSV_Key->getInputSocket(0), 1, graph); addLink(graph, operationRGBToHSV_Image->getOutputSocket(), operation->getInputSocket(0)); addLink(graph, operationRGBToHSV_Key->getOutputSocket(), operation->getInputSocket(1)); diff --git a/source/blender/compositor/nodes/COM_ColorRampNode.cpp b/source/blender/compositor/nodes/COM_ColorRampNode.cpp index 1873cad5d57..c6090120467 100644 --- a/source/blender/compositor/nodes/COM_ColorRampNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorRampNode.cpp @@ -47,6 +47,6 @@ void ColorRampNode::convertToOperations(ExecutionSystem *graph, CompositorContex graph->addOperation(operation2); } operation->setColorBand((ColorBand*)editorNode->storage); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp index 88043653b4f..503ca3c8bd3 100644 --- a/source/blender/compositor/nodes/COM_ColorSpillNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorSpillNode.cpp @@ -49,8 +49,8 @@ void ColorSpillNode::convertToOperations(ExecutionSystem *graph, CompositorConte operation->setSpillChannel(editorsnode->custom1-1); // Channel for spilling - inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputSocketFac->relinkConnections(operation->getInputSocket(1), true, 1, graph); + inputSocketImage->relinkConnections(operation->getInputSocket(0), 0, graph); + inputSocketFac->relinkConnections(operation->getInputSocket(1), 1, graph); outputSocketImage->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_ColorToBWNode.cpp b/source/blender/compositor/nodes/COM_ColorToBWNode.cpp index 7ff7ee1c13e..ed2869d35f2 100644 --- a/source/blender/compositor/nodes/COM_ColorToBWNode.cpp +++ b/source/blender/compositor/nodes/COM_ColorToBWNode.cpp @@ -35,7 +35,7 @@ void ColourToBWNode::convertToOperations(ExecutionSystem *graph, CompositorConte OutputSocket *valueSocket = this->getOutputSocket(0); ConvertColorToBWOperation *convertProg = new ConvertColorToBWOperation(); - colourSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); + colourSocket->relinkConnections(convertProg->getInputSocket(0), 0, graph); valueSocket->relinkConnections(convertProg->getOutputSocket(0)); graph->addOperation(convertProg); } diff --git a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp index d5fef1e756a..e6fcc48ac5b 100644 --- a/source/blender/compositor/nodes/COM_CombineRGBANode.cpp +++ b/source/blender/compositor/nodes/COM_CombineRGBANode.cpp @@ -55,10 +55,10 @@ void CombineRGBANode::convertToOperations(ExecutionSystem *graph, CompositorCont else { operation->setResolutionInputSocketIndex(3); } - inputRSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputGSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); - inputBSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); - inputASocket->relinkConnections(operation->getInputSocket(3), true, 3, graph); + inputRSocket->relinkConnections(operation->getInputSocket(0), 0, graph); + inputGSocket->relinkConnections(operation->getInputSocket(1), 1, graph); + inputBSocket->relinkConnections(operation->getInputSocket(2), 2, graph); + inputASocket->relinkConnections(operation->getInputSocket(3), 3, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp index 94139c132fb..0b4326a17ca 100644 --- a/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp +++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.cpp @@ -37,7 +37,7 @@ void ConvertAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorCon operation = new ConvertKeyToPremulOperation(); } - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_CropNode.cpp b/source/blender/compositor/nodes/COM_CropNode.cpp index 52329be3034..c58fcc874cb 100644 --- a/source/blender/compositor/nodes/COM_CropNode.cpp +++ b/source/blender/compositor/nodes/COM_CropNode.cpp @@ -43,7 +43,7 @@ void CropNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c } operation->setCropSettings(cropSettings); operation->setRelative(relative); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_DefocusNode.cpp b/source/blender/compositor/nodes/COM_DefocusNode.cpp index 77f7baaef98..e4e19fdbe27 100644 --- a/source/blender/compositor/nodes/COM_DefocusNode.cpp +++ b/source/blender/compositor/nodes/COM_DefocusNode.cpp @@ -52,7 +52,7 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext SetValueOperation *maxRadius = new SetValueOperation(); maxRadius->setValue(data->maxblur); MathMinimumOperation *minimize = new MathMinimumOperation(); - this->getInputSocket(1)->relinkConnections(multiply->getInputSocket(0), true, 1, graph); + this->getInputSocket(1)->relinkConnections(multiply->getInputSocket(0), 1, graph); addLink(graph, multiplier->getOutputSocket(), multiply->getInputSocket(1)); addLink(graph, maxRadius->getOutputSocket(), minimize->getInputSocket(1)); addLink(graph, multiply->getOutputSocket(), minimize->getInputSocket(0)); @@ -68,7 +68,7 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext converter->setCameraObject(camob); converter->setfStop(data->fstop); converter->setMaxRadius(data->maxblur); - this->getInputSocket(1)->relinkConnections(converter->getInputSocket(0), true, 1, graph); + this->getInputSocket(1)->relinkConnections(converter->getInputSocket(0), 1, graph); graph->addOperation(converter); radiusOperation = converter; } @@ -98,7 +98,7 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext if (data->gamco) { GammaCorrectOperation * correct = new GammaCorrectOperation(); GammaUncorrectOperation * inverse = new GammaUncorrectOperation(); - this->getInputSocket(0)->relinkConnections(correct->getInputSocket(0), 0, true, graph); + this->getInputSocket(0)->relinkConnections(correct->getInputSocket(0), 0, graph); addLink(graph, correct->getOutputSocket(), operation->getInputSocket(0)); addLink(graph, operation->getOutputSocket(), inverse->getInputSocket(0)); this->getOutputSocket()->relinkConnections(inverse->getOutputSocket()); @@ -106,7 +106,7 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext graph->addOperation(inverse); } else { - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, true, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); } diff --git a/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp b/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp index ab6917f3a59..c26fb4e5c5d 100644 --- a/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_DifferenceMatteNode.cpp @@ -38,8 +38,8 @@ void DifferenceMatteNode::convertToOperations(ExecutionSystem *graph, Compositor DifferenceMatteOperation * operationSet = new DifferenceMatteOperation(); operationSet->setSettings((NodeChroma*)editorNode->storage); - inputSocket->relinkConnections(operationSet->getInputSocket(0), true, 0, graph); - inputSocket2->relinkConnections(operationSet->getInputSocket(1), true, 1, graph); + inputSocket->relinkConnections(operationSet->getInputSocket(0), 0, graph); + inputSocket2->relinkConnections(operationSet->getInputSocket(1), 1, graph); outputSocketMatte->relinkConnections(operationSet->getOutputSocket(0)); graph->addOperation(operationSet); diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp index 8f53c1ff8cc..cc96f672ebd 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp @@ -40,7 +40,7 @@ void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorCont operation->setDistance(editorNode->custom2); operation->setInset(editorNode->custom3); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); if (editorNode->custom3 < 2.0f) { AntiAliasOperation * antiAlias = new AntiAliasOperation(); @@ -57,14 +57,14 @@ void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorCont if (editorNode->custom2 > 0) { DilateStepOperation * operation = new DilateStepOperation(); operation->setIterations(editorNode->custom2); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } else { ErodeStepOperation * operation = new ErodeStepOperation(); operation->setIterations(-editorNode->custom2); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp b/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp index cefeffcfc07..d63fbbdb092 100644 --- a/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_DirectionalBlurNode.cpp @@ -36,7 +36,7 @@ void DirectionalBlurNode::convertToOperations(ExecutionSystem *graph, Compositor DirectionalBlurOperation *operation = new DirectionalBlurOperation(); operation->setQuality(context->getQuality()); operation->setData(data); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_DisplaceNode.cpp b/source/blender/compositor/nodes/COM_DisplaceNode.cpp index 5fe9591bfd4..9604db378bc 100644 --- a/source/blender/compositor/nodes/COM_DisplaceNode.cpp +++ b/source/blender/compositor/nodes/COM_DisplaceNode.cpp @@ -36,10 +36,10 @@ void DisplaceNode::convertToOperations(ExecutionSystem *graph, CompositorContext else operation = new DisplaceOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); - this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, graph); - this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, graph); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), 3, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp b/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp index 3fc4a882eaf..d7b4e481ec2 100644 --- a/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp @@ -38,8 +38,8 @@ void DistanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorCo bNode *editorsnode = getbNode(); operation->setSettings((NodeChroma*)editorsnode->storage); - inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputSocketKey->relinkConnections(operation->getInputSocket(1), true, 1, graph); + inputSocketImage->relinkConnections(operation->getInputSocket(0), 0, graph); + inputSocketKey->relinkConnections(operation->getInputSocket(1), 1, graph); if (outputSocketMatte->isConnected()) { outputSocketMatte->relinkConnections(operation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp index 1ac273a52cb..ab9e101dad8 100644 --- a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.cpp @@ -38,8 +38,8 @@ void DoubleEdgeMaskNode::convertToOperations(ExecutionSystem *system, Compositor operation->setAdjecentOnly(bnode->custom1); operation->setKeepInside(bnode->custom2); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, system); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); system->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp b/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp index 7e327a306b6..f5003c4be94 100644 --- a/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_EllipseMaskNode.cpp @@ -34,8 +34,8 @@ void EllipseMaskNode::convertToOperations(ExecutionSystem *graph, CompositorCont EllipseMaskOperation *operation; operation = new EllipseMaskOperation(); operation->setData((NodeEllipseMask*)this->getbNode()->storage); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); operation->setMaskType(this->getbNode()->custom1); diff --git a/source/blender/compositor/nodes/COM_FilterNode.cpp b/source/blender/compositor/nodes/COM_FilterNode.cpp index a1d405c0dff..bdba69dc47d 100644 --- a/source/blender/compositor/nodes/COM_FilterNode.cpp +++ b/source/blender/compositor/nodes/COM_FilterNode.cpp @@ -73,8 +73,8 @@ void FilterNode::convertToOperations(ExecutionSystem *graph, CompositorContext * break; } - inputImageSocket->relinkConnections(operation->getInputSocket(0), true, 1, graph); - inputSocket->relinkConnections(operation->getInputSocket(1), true, 0, graph); + inputImageSocket->relinkConnections(operation->getInputSocket(0), 1, graph); + inputSocket->relinkConnections(operation->getInputSocket(1), 0, graph); outputSocket->relinkConnections(operation->getOutputSocket()); addPreviewOperation(graph, operation->getOutputSocket(0), 5); diff --git a/source/blender/compositor/nodes/COM_FlipNode.cpp b/source/blender/compositor/nodes/COM_FlipNode.cpp index a4924aaae40..0830c757833 100644 --- a/source/blender/compositor/nodes/COM_FlipNode.cpp +++ b/source/blender/compositor/nodes/COM_FlipNode.cpp @@ -49,7 +49,7 @@ void FlipNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c break; } - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_GammaNode.cpp b/source/blender/compositor/nodes/COM_GammaNode.cpp index e5391e54e72..58b05607618 100644 --- a/source/blender/compositor/nodes/COM_GammaNode.cpp +++ b/source/blender/compositor/nodes/COM_GammaNode.cpp @@ -33,8 +33,8 @@ void GammaNode::convertToOperations(ExecutionSystem *graph, CompositorContext * { GammaOperation *operation = new GammaOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_GlareNode.cpp b/source/blender/compositor/nodes/COM_GlareNode.cpp index e882c16814a..9382e726d76 100644 --- a/source/blender/compositor/nodes/COM_GlareNode.cpp +++ b/source/blender/compositor/nodes/COM_GlareNode.cpp @@ -49,7 +49,7 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * SetValueOperation * mixvalueoperation = new SetValueOperation(); MixBlendOperation * mixoperation = new MixBlendOperation(); - this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); + this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system); addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0)); addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2)); @@ -75,7 +75,7 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * SetValueOperation * mixvalueoperation = new SetValueOperation(); MixBlendOperation * mixoperation = new MixBlendOperation(); mixoperation->setResolutionInputSocketIndex(1); - this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); + this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system); addLink(system, thresholdOperation->getOutputSocket(), bluroperation->getInputSocket(0)); addLink(system, valueoperation->getOutputSocket(), bluroperation->getInputSocket(1)); addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); @@ -109,7 +109,7 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext * SetValueOperation * mixvalueoperation = new SetValueOperation(); MixBlendOperation * mixoperation = new MixBlendOperation(); - this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), true, 0, system); + this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system); addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0)); addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0)); addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2)); diff --git a/source/blender/compositor/nodes/COM_GroupNode.cpp b/source/blender/compositor/nodes/COM_GroupNode.cpp index 67e829a5cf6..076d4f1501a 100644 --- a/source/blender/compositor/nodes/COM_GroupNode.cpp +++ b/source/blender/compositor/nodes/COM_GroupNode.cpp @@ -47,12 +47,12 @@ void GroupNode::ungroup(ExecutionSystem &system) if (editorInput->groupsock) { if (inputSocket->isConnected()) { SocketProxyNode * proxy = new SocketProxyNode(this->getbNode(), editorInput, editorInput->groupsock); - inputSocket->relinkConnections(proxy->getInputSocket(0), true, index, &system); + inputSocket->relinkConnections(proxy->getInputSocket(0), index, &system); ExecutionSystemHelper::addNode(system.getNodes(), proxy); } else { OutputSocketProxyNode * proxy = new OutputSocketProxyNode(this->getbNode(), editorInput, editorInput->groupsock); - inputSocket->relinkConnections(proxy->getInputSocket(0), true, index, &system); + inputSocket->relinkConnections(proxy->getInputSocket(0), index, &system); ExecutionSystemHelper::addNode(system.getNodes(), proxy); } } diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp index 80c786ef6d7..ae96a8c9fb8 100644 --- a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp +++ b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.cpp @@ -51,12 +51,12 @@ void HueSaturationValueCorrectNode::convertToOperations(ExecutionSystem *graph, HueSaturationValueCorrectOperation *changeHSV = new HueSaturationValueCorrectOperation(); MixBlendOperation * blend = new MixBlendOperation(); - colourSocket->relinkConnections(rgbToHSV->getInputSocket(0), true, 0, graph); + colourSocket->relinkConnections(rgbToHSV->getInputSocket(0), 1, graph); addLink(graph, rgbToHSV->getOutputSocket(), changeHSV->getInputSocket(0)); addLink(graph, changeHSV->getOutputSocket(), hsvToRGB->getInputSocket(0)); addLink(graph, hsvToRGB->getOutputSocket(), blend->getInputSocket(2)); addLink(graph, rgbToHSV->getInputSocket(0)->getConnection()->getFromSocket(), blend->getInputSocket(1)); - valueSocket->relinkConnections(blend->getInputSocket(0), true, 0, graph); + valueSocket->relinkConnections(blend->getInputSocket(0), 0, graph); outputSocket->relinkConnections(blend->getOutputSocket()); changeHSV->setCurveMapping(storage); diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp b/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp index d78592884c6..32c7d4719a4 100644 --- a/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp +++ b/source/blender/compositor/nodes/COM_HueSaturationValueNode.cpp @@ -49,12 +49,12 @@ void HueSaturationValueNode::convertToOperations(ExecutionSystem *graph, Composi ChangeHSVOperation *changeHSV = new ChangeHSVOperation(); MixBlendOperation * blend = new MixBlendOperation(); - colourSocket->relinkConnections(rgbToHSV->getInputSocket(0), true, 0, graph); + colourSocket->relinkConnections(rgbToHSV->getInputSocket(0), 0, graph); addLink(graph, rgbToHSV->getOutputSocket(), changeHSV->getInputSocket(0)); addLink(graph, changeHSV->getOutputSocket(), hsvToRGB->getInputSocket(0)); addLink(graph, hsvToRGB->getOutputSocket(), blend->getInputSocket(2)); addLink(graph, rgbToHSV->getInputSocket(0)->getConnection()->getFromSocket(), blend->getInputSocket(1)); - valueSocket->relinkConnections(blend->getInputSocket(0), true, 0, graph); + valueSocket->relinkConnections(blend->getInputSocket(0), 0, graph); outputSocket->relinkConnections(blend->getOutputSocket()); changeHSV->setHue(storage->hue); diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.cpp b/source/blender/compositor/nodes/COM_IDMaskNode.cpp index ea9e279009c..82d3ae8ca29 100644 --- a/source/blender/compositor/nodes/COM_IDMaskNode.cpp +++ b/source/blender/compositor/nodes/COM_IDMaskNode.cpp @@ -36,7 +36,7 @@ void IDMaskNode::convertToOperations(ExecutionSystem *graph, CompositorContext * operation = new IDMaskOperation(); operation->setObjectIndex(bnode->custom1); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0)); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); if (bnode->custom2==0 || context->getScene()->r.scemode & R_FULL_SAMPLE) { this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); } diff --git a/source/blender/compositor/nodes/COM_InvertNode.cpp b/source/blender/compositor/nodes/COM_InvertNode.cpp index 616a63ae948..5d039239fbe 100644 --- a/source/blender/compositor/nodes/COM_InvertNode.cpp +++ b/source/blender/compositor/nodes/COM_InvertNode.cpp @@ -37,8 +37,8 @@ void InvertNode::convertToOperations(ExecutionSystem *graph, CompositorContext * operation->setColor(node->custom1 & CMP_CHAN_RGB); operation->setAlpha(node->custom1 & CMP_CHAN_A); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0),true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1),true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp index 5719f31180b..e55dd5e64d8 100644 --- a/source/blender/compositor/nodes/COM_LensDistortionNode.cpp +++ b/source/blender/compositor/nodes/COM_LensDistortionNode.cpp @@ -37,7 +37,7 @@ void LensDistortionNode::convertToOperations(ExecutionSystem *graph, CompositorC if (data->proj) { ProjectorLensDistortionOperation *operation = new ProjectorLensDistortionOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); operation->setDispertion(this->getInputSocket(2)->getStaticValues()[0]); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); @@ -48,7 +48,7 @@ void LensDistortionNode::convertToOperations(ExecutionSystem *graph, CompositorC else { ScreenLensDistortionOperation *operation = new ScreenLensDistortionOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); operation->setDistortion(this->getInputSocket(1)->getStaticValues()[0]); operation->setDispertion(this->getInputSocket(2)->getStaticValues()[0]); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); diff --git a/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp b/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp index 8c9ebeed1cf..eb78657f3c4 100644 --- a/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp +++ b/source/blender/compositor/nodes/COM_LuminanceMatteNode.cpp @@ -39,7 +39,7 @@ void LuminanceMatteNode::convertToOperations(ExecutionSystem *graph, CompositorC bNode *editorsnode = getbNode(); operationSet->setSettings((NodeChroma*)editorsnode->storage); - inputSocket->relinkConnections(rgbToYUV->getInputSocket(0), true, 0, graph); + inputSocket->relinkConnections(rgbToYUV->getInputSocket(0), 0, graph); addLink(graph, rgbToYUV->getOutputSocket(), operationSet->getInputSocket(0)); if (outputSocketMatte->isConnected()) { diff --git a/source/blender/compositor/nodes/COM_MapUVNode.cpp b/source/blender/compositor/nodes/COM_MapUVNode.cpp index 32db5ac13a8..e0e7e2594ed 100644 --- a/source/blender/compositor/nodes/COM_MapUVNode.cpp +++ b/source/blender/compositor/nodes/COM_MapUVNode.cpp @@ -31,8 +31,8 @@ void MapUVNode::convertToOperations(ExecutionSystem *graph, CompositorContext * { MapUVOperation *operation = new MapUVOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); bNode *node = this->getbNode(); diff --git a/source/blender/compositor/nodes/COM_MapValueNode.cpp b/source/blender/compositor/nodes/COM_MapValueNode.cpp index 4ca93113dd5..f56662b1d64 100644 --- a/source/blender/compositor/nodes/COM_MapValueNode.cpp +++ b/source/blender/compositor/nodes/COM_MapValueNode.cpp @@ -36,7 +36,7 @@ void MapValueNode::convertToOperations(ExecutionSystem *graph, CompositorContext TexMapping *storage = (TexMapping*)this->getbNode()->storage; MapValueOperation *convertProg = new MapValueOperation(); convertProg->setSettings(storage); - colourSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); + colourSocket->relinkConnections(convertProg->getInputSocket(0), 0, graph); valueSocket->relinkConnections(convertProg->getOutputSocket(0)); graph->addOperation(convertProg); } diff --git a/source/blender/compositor/nodes/COM_MathNode.cpp b/source/blender/compositor/nodes/COM_MathNode.cpp index a5c4aa01721..eabd0481e38 100644 --- a/source/blender/compositor/nodes/COM_MathNode.cpp +++ b/source/blender/compositor/nodes/COM_MathNode.cpp @@ -84,8 +84,8 @@ void MathNode::convertToOperations(ExecutionSystem *graph, CompositorContext * c } if (operation != NULL) { - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_MixNode.cpp b/source/blender/compositor/nodes/COM_MixNode.cpp index 63ab83834f2..86ca5ebc237 100644 --- a/source/blender/compositor/nodes/COM_MixNode.cpp +++ b/source/blender/compositor/nodes/COM_MixNode.cpp @@ -121,9 +121,9 @@ void MixNode::convertToOperations(ExecutionSystem *graph, CompositorContext * co } convertProg->setUseValueAlphaMultiply(this->getbNode()->custom2); - valueSocket->relinkConnections(convertProg->getInputSocket(0), true, 0, graph); - color1Socket->relinkConnections(convertProg->getInputSocket(1), true, 1, graph); - color2Socket->relinkConnections(convertProg->getInputSocket(2), true, 2, graph); + valueSocket->relinkConnections(convertProg->getInputSocket(0), 0, graph); + color1Socket->relinkConnections(convertProg->getInputSocket(1), 1, graph); + color2Socket->relinkConnections(convertProg->getInputSocket(2), 2, graph); outputSocket->relinkConnections(convertProg->getOutputSocket(0)); addPreviewOperation(graph, convertProg->getOutputSocket(0), 5); diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp index 55e51baf7da..bdf4c53fa72 100644 --- a/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp +++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.cpp @@ -41,7 +41,7 @@ void MovieDistortionNode::convertToOperations(ExecutionSystem *system, Composito operation->setMovieClip(clip); operation->setFramenumber(context->getFramenumber()); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, system); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, system); outputSocket->relinkConnections(operation->getOutputSocket(0)); system->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_NormalNode.cpp b/source/blender/compositor/nodes/COM_NormalNode.cpp index 58b6ba1f410..0b1faafe302 100644 --- a/source/blender/compositor/nodes/COM_NormalNode.cpp +++ b/source/blender/compositor/nodes/COM_NormalNode.cpp @@ -50,7 +50,7 @@ void NormalNode::convertToOperations(ExecutionSystem *graph, CompositorContext * if (outputSocketDotproduct->isConnected()) { DotproductOperation *operation = new DotproductOperation(); outputSocketDotproduct->relinkConnections(operation->getOutputSocket(0)); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); addLink(graph, operationSet->getOutputSocket(0), operation->getInputSocket(1)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_NormalizeNode.cpp b/source/blender/compositor/nodes/COM_NormalizeNode.cpp index f3fe8579a86..11173b3a73f 100644 --- a/source/blender/compositor/nodes/COM_NormalizeNode.cpp +++ b/source/blender/compositor/nodes/COM_NormalizeNode.cpp @@ -31,7 +31,7 @@ void NormalizeNode::convertToOperations(ExecutionSystem *graph, CompositorContex { NormalizeOperation *operation = new NormalizeOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_RotateNode.cpp b/source/blender/compositor/nodes/COM_RotateNode.cpp index f5fdf19398d..48acc567739 100644 --- a/source/blender/compositor/nodes/COM_RotateNode.cpp +++ b/source/blender/compositor/nodes/COM_RotateNode.cpp @@ -53,8 +53,8 @@ void RotateNode::convertToOperations(ExecutionSystem *system, CompositorContext addLink(system, sampler->getOutputSocket(), operation->getInputSocket(0)); - inputSocket->relinkConnections(sampler->getInputSocket(0), true, 0, system); - inputDegreeSocket->relinkConnections(operation->getInputSocket(1), true, 1, system); + inputSocket->relinkConnections(sampler->getInputSocket(0), 0, system); + inputDegreeSocket->relinkConnections(operation->getInputSocket(1), 1, system); outputSocket->relinkConnections(operation->getOutputSocket(0)); system->addOperation(sampler); system->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_ScaleNode.cpp b/source/blender/compositor/nodes/COM_ScaleNode.cpp index fe5862da018..d709781299f 100644 --- a/source/blender/compositor/nodes/COM_ScaleNode.cpp +++ b/source/blender/compositor/nodes/COM_ScaleNode.cpp @@ -42,9 +42,9 @@ void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * case CMP_SCALE_RELATIVE: { ScaleOperation *operation = new ScaleOperation(); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputXSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); - inputYSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); + inputXSocket->relinkConnections(operation->getInputSocket(1), 1, graph); + inputYSocket->relinkConnections(operation->getInputSocket(2), 2, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } @@ -53,7 +53,7 @@ void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * SetValueOperation * scaleFactorOperation = new SetValueOperation(); scaleFactorOperation->setValue(context->getScene()->r.size/100.0f); ScaleOperation * operation = new ScaleOperation(); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); addLink(graph, scaleFactorOperation->getOutputSocket(), operation->getInputSocket(1)); addLink(graph, scaleFactorOperation->getOutputSocket(), operation->getInputSocket(2)); outputSocket->relinkConnections(operation->getOutputSocket(0)); @@ -67,7 +67,7 @@ void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * ScaleFixedSizeOperation * operation = new ScaleFixedSizeOperation(); operation->setNewWidth(data->xsch*data->size/100.0f); operation->setNewHeight(data->ysch*data->size/100.0f); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); operation->getInputSocket(0)->getConnection()->setIgnoreResizeCheck(true); graph->addOperation(operation); @@ -77,9 +77,9 @@ void ScaleNode::convertToOperations(ExecutionSystem *graph, CompositorContext * case CMP_SCALE_ABSOLUTE: { ScaleAbsoluteOperation *operation = new ScaleAbsoluteOperation(); // TODO: what is the use of this one.... perhaps some issues when the ui was updated.... - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputXSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); - inputYSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); + inputXSocket->relinkConnections(operation->getInputSocket(1), 1, graph); + inputYSocket->relinkConnections(operation->getInputSocket(2), 2, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp b/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp index 7079762d465..dd154fe604d 100644 --- a/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp +++ b/source/blender/compositor/nodes/COM_SeparateRGBANode.cpp @@ -44,28 +44,28 @@ void SeparateRGBANode::convertToOperations(ExecutionSystem *graph, CompositorCon if (outputRSocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(0); - imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph); outputRSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } if (outputGSocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(1); - imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph); outputGSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } if (outputBSocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(2); - imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph); outputBSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } if (outputASocket->isConnected()) { SeparateChannelOperation *operation = new SeparateChannelOperation(); operation->setChannel(3); - imageSocket->relinkConnections(operation->getInputSocket(0), true, 0, true, graph); + imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph); outputASocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp index 90db6682184..1d09b81c4d2 100644 --- a/source/blender/compositor/nodes/COM_SetAlphaNode.cpp +++ b/source/blender/compositor/nodes/COM_SetAlphaNode.cpp @@ -28,8 +28,8 @@ void SetAlphaNode::convertToOperations(ExecutionSystem *graph, CompositorContext { SetAlphaOperation *operation = new SetAlphaOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); graph->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp index d1a2cccf758..9f9efbd8fe5 100644 --- a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp +++ b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp @@ -43,8 +43,8 @@ void SplitViewerNode::convertToOperations(ExecutionSystem *graph, CompositorCont splitViewerOperation->setActive(this->getbNode()->flag & NODE_DO_OUTPUT); splitViewerOperation->setSplitPercentage(this->getbNode()->custom1); splitViewerOperation->setXSplit(!this->getbNode()->custom2); - image1Socket->relinkConnections(splitViewerOperation->getInputSocket(0), true, 1, graph); - image2Socket->relinkConnections(splitViewerOperation->getInputSocket(1), true, 1, graph); + image1Socket->relinkConnections(splitViewerOperation->getInputSocket(0), 0, graph); + image2Socket->relinkConnections(splitViewerOperation->getInputSocket(1), 1, graph); addPreviewOperation(graph, splitViewerOperation->getInputSocket(0), 0); graph->addOperation(splitViewerOperation); } diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp index 047b4fa4bf6..7234e71a43c 100644 --- a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp @@ -65,7 +65,7 @@ void Stabilize2dNode::convertToOperations(ExecutionSystem *graph, CompositorCont yAttribute->setFramenumber(context->getFramenumber()); yAttribute->setMovieClip(clip); - imageInput->relinkConnections(scaleOperation->getInputSocket(0), true, 0, graph); + imageInput->relinkConnections(scaleOperation->getInputSocket(0), 0, graph); addLink(graph, scaleAttribute->getOutputSocket(), scaleOperation->getInputSocket(1)); addLink(graph, scaleAttribute->getOutputSocket(), scaleOperation->getInputSocket(2)); diff --git a/source/blender/compositor/nodes/COM_SwitchNode.cpp b/source/blender/compositor/nodes/COM_SwitchNode.cpp index c65d7fbdc61..58c60a96de8 100644 --- a/source/blender/compositor/nodes/COM_SwitchNode.cpp +++ b/source/blender/compositor/nodes/COM_SwitchNode.cpp @@ -35,10 +35,10 @@ void SwitchNode::convertToOperations(ExecutionSystem *graph, CompositorContext * int switchFrame = this->getbNode()->custom1; if (!switchFrame) { - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); } else { - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(0), true, 1, graph); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(0), 1, graph); } this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_TextureNode.cpp b/source/blender/compositor/nodes/COM_TextureNode.cpp index 5e59d86e7d9..be8bb623f4c 100644 --- a/source/blender/compositor/nodes/COM_TextureNode.cpp +++ b/source/blender/compositor/nodes/COM_TextureNode.cpp @@ -34,8 +34,8 @@ void TextureNode::convertToOperations(ExecutionSystem *system, CompositorContext Tex *texture = (Tex*)editorNode->id; TextureOperation *operation = new TextureOperation(); this->getOutputSocket(1)->relinkConnections(operation->getOutputSocket()); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, system); operation->setTexture(texture); operation->setScene(context->getScene()); system->addOperation(operation); diff --git a/source/blender/compositor/nodes/COM_TonemapNode.cpp b/source/blender/compositor/nodes/COM_TonemapNode.cpp index 7e170ea1704..80f02f3edbb 100644 --- a/source/blender/compositor/nodes/COM_TonemapNode.cpp +++ b/source/blender/compositor/nodes/COM_TonemapNode.cpp @@ -35,7 +35,7 @@ void TonemapNode::convertToOperations(ExecutionSystem *system, CompositorContext TonemapOperation *operation = data->type==1?new PhotoreceptorTonemapOperation():new TonemapOperation(); operation->setData(data); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, system); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); system->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_TransformNode.cpp b/source/blender/compositor/nodes/COM_TransformNode.cpp index 6762cb0687a..da3e85036a5 100644 --- a/source/blender/compositor/nodes/COM_TransformNode.cpp +++ b/source/blender/compositor/nodes/COM_TransformNode.cpp @@ -57,18 +57,18 @@ void TransformNode::convertToOperations(ExecutionSystem *graph, CompositorContex break; } - imageInput->relinkConnections(sampler->getInputSocket(0), true, 0, graph); + imageInput->relinkConnections(sampler->getInputSocket(0), 0, graph); addLink(graph, sampler->getOutputSocket(), scaleOperation->getInputSocket(0)); - scaleInput->relinkConnections(scaleOperation->getInputSocket(1), true, 4, graph); + scaleInput->relinkConnections(scaleOperation->getInputSocket(1), 4, graph); addLink(graph, scaleOperation->getInputSocket(1)->getConnection()->getFromSocket(), scaleOperation->getInputSocket(2)); // xscale = yscale addLink(graph, scaleOperation->getOutputSocket(), rotateOperation->getInputSocket(0)); rotateOperation->setDoDegree2RadConversion(false); - angleInput->relinkConnections(rotateOperation->getInputSocket(1), true, 3, graph); + angleInput->relinkConnections(rotateOperation->getInputSocket(1), 3, graph); addLink(graph, rotateOperation->getOutputSocket(), translateOperation->getInputSocket(0)); - xInput->relinkConnections(translateOperation->getInputSocket(1), true, 1, graph); - yInput->relinkConnections(translateOperation->getInputSocket(2), true, 2, graph); + xInput->relinkConnections(translateOperation->getInputSocket(1), 1, graph); + yInput->relinkConnections(translateOperation->getInputSocket(2), 2, graph); this->getOutputSocket()->relinkConnections(translateOperation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_TranslateNode.cpp b/source/blender/compositor/nodes/COM_TranslateNode.cpp index f594db3c160..407c6da4e4d 100644 --- a/source/blender/compositor/nodes/COM_TranslateNode.cpp +++ b/source/blender/compositor/nodes/COM_TranslateNode.cpp @@ -37,9 +37,9 @@ void TranslateNode::convertToOperations(ExecutionSystem *graph, CompositorContex OutputSocket *outputSocket = this->getOutputSocket(0); TranslateOperation *operation = new TranslateOperation(); - inputSocket->relinkConnections(operation->getInputSocket(0), true, 0, graph); - inputXSocket->relinkConnections(operation->getInputSocket(1), true, 1, graph); - inputYSocket->relinkConnections(operation->getInputSocket(2), true, 2, graph); + inputSocket->relinkConnections(operation->getInputSocket(0), 0, graph); + inputXSocket->relinkConnections(operation->getInputSocket(1), 1, graph); + inputYSocket->relinkConnections(operation->getInputSocket(2), 2, graph); outputSocket->relinkConnections(operation->getOutputSocket(0)); graph->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_VectorBlurNode.cpp b/source/blender/compositor/nodes/COM_VectorBlurNode.cpp index 4baa2315799..596256eb6af 100644 --- a/source/blender/compositor/nodes/COM_VectorBlurNode.cpp +++ b/source/blender/compositor/nodes/COM_VectorBlurNode.cpp @@ -39,9 +39,9 @@ void VectorBlurNode::convertToOperations(ExecutionSystem *system, CompositorCont VectorBlurOperation *operation = new VectorBlurOperation(); operation->setVectorBlurSettings(vectorBlurSettings); operation->setQuality(context->getQuality()); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); - this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, system); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, system); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, system); this->getOutputSocket()->relinkConnections(operation->getOutputSocket()); system->addOperation(operation); } diff --git a/source/blender/compositor/nodes/COM_VectorCurveNode.cpp b/source/blender/compositor/nodes/COM_VectorCurveNode.cpp index 2f216b5d5bd..908e1a19f16 100644 --- a/source/blender/compositor/nodes/COM_VectorCurveNode.cpp +++ b/source/blender/compositor/nodes/COM_VectorCurveNode.cpp @@ -33,7 +33,7 @@ void VectorCurveNode::convertToOperations(ExecutionSystem *graph, CompositorCont { VectorCurveOperation *operation = new VectorCurveOperation(); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); operation->setCurveMapping((CurveMapping*)this->getbNode()->storage); diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp index 9aa922faa5d..cedf81e3f2a 100644 --- a/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.cpp @@ -41,7 +41,7 @@ void ViewLevelsNode::convertToOperations(ExecutionSystem *graph, CompositorConte if (socket->isConnected()) { // calculate mean operation CalculateMeanOperation * operation = new CalculateMeanOperation(); - input->relinkConnections(operation->getInputSocket(0), true, 0, graph); + input->relinkConnections(operation->getInputSocket(0), 0, graph); firstOperationConnected = true; operation->setSetting(this->getbNode()->custom1); socket->relinkConnections(operation->getOutputSocket()); @@ -56,7 +56,7 @@ void ViewLevelsNode::convertToOperations(ExecutionSystem *graph, CompositorConte addLink(graph, inputSocket, operation->getInputSocket(0)); } else { - input->relinkConnections(operation->getInputSocket(0), true, 0, graph); + input->relinkConnections(operation->getInputSocket(0), 0, graph); } operation->setSetting(this->getbNode()->custom1); socket->relinkConnections(operation->getOutputSocket()); diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp index d518976143d..7609928bc15 100644 --- a/source/blender/compositor/nodes/COM_ViewerNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp @@ -48,7 +48,7 @@ void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * viewerOperation->setChunkOrder((OrderOfChunks)editorNode->custom1); viewerOperation->setCenterX(editorNode->custom3); viewerOperation->setCenterY(editorNode->custom4); - imageSocket->relinkConnections(viewerOperation->getInputSocket(0), true, 0, graph); + imageSocket->relinkConnections(viewerOperation->getInputSocket(0), 0, graph); alphaSocket->relinkConnections(viewerOperation->getInputSocket(1)); graph->addOperation(viewerOperation); addPreviewOperation(graph, viewerOperation->getInputSocket(0), 0); diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.cpp b/source/blender/compositor/nodes/COM_ZCombineNode.cpp index 25d9a6e97d2..2495d1a5ab2 100644 --- a/source/blender/compositor/nodes/COM_ZCombineNode.cpp +++ b/source/blender/compositor/nodes/COM_ZCombineNode.cpp @@ -41,10 +41,10 @@ void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContex operation = new ZCombineOperation(); } - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); - this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, system); - this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, system); + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, system); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, system); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), 3, system); this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); system->addOperation(operation); if (this->getOutputSocket(1)->isConnected()) { @@ -58,8 +58,8 @@ void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContex else { if (this->getOutputSocket(1)->isConnected()) { MathMinimumOperation * zoperation = new MathMinimumOperation(); - this->getInputSocket(1)->relinkConnections(zoperation->getInputSocket(0), true, 1, system); - this->getInputSocket(3)->relinkConnections(zoperation->getInputSocket(1), true, 3, system); + this->getInputSocket(1)->relinkConnections(zoperation->getInputSocket(0), 1, system); + this->getInputSocket(3)->relinkConnections(zoperation->getInputSocket(1), 3, system); this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); system->addOperation(zoperation); } From 28002edb6bf295d7d58c71cc402fd86d260faf2f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 23 May 2012 14:24:40 +0000 Subject: [PATCH 145/159] Finish changes in up/down arrows for menus Restored single triangle for special menus, which still isn't perfect but probably makes more sense. Added drawflag bit flags to button, which is currently used to declare, that button need to have up/down arrows. This is needed because it's tricky to distinguish if button should have such arrows. For example, ID search buttons is a simple block button which doesn't directly mean it'll have pop-up menu and not all buttons which cases pop-up menu to display need to have such arrows. So currently only ID selector button is forcing up/down arrows to be displayed, all the rest buttons now behaves in the same way as it used to be before. --- .../scripts/startup/bl_ui/properties_data_armature.py | 2 +- release/scripts/startup/bl_ui/properties_data_mesh.py | 4 ++-- release/scripts/startup/bl_ui/properties_material.py | 2 +- release/scripts/startup/bl_ui/properties_texture.py | 4 ++-- source/blender/editors/include/UI_interface.h | 6 ++++++ source/blender/editors/interface/interface.c | 10 ++++++++++ source/blender/editors/interface/interface_intern.h | 2 +- source/blender/editors/interface/interface_templates.c | 3 +++ source/blender/editors/interface/interface_widgets.c | 6 +++--- 9 files changed, 29 insertions(+), 10 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py index 1b7a8f4a66e..6bec652045e 100644 --- a/release/scripts/startup/bl_ui/properties_data_armature.py +++ b/release/scripts/startup/bl_ui/properties_data_armature.py @@ -130,7 +130,7 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel): col.active = (ob.proxy is None) col.operator("pose.group_add", icon='ZOOMIN', text="") col.operator("pose.group_remove", icon='ZOOMOUT', text="") - col.menu("DATA_PT_bone_group_specials", icon='BLANK1', text="") + col.menu("DATA_PT_bone_group_specials", icon='DOWNARROW_HLT', text="") if group: col.separator() col.operator("pose.group_move", icon='TRIA_UP', text="").direction = 'UP' diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index e23db7c59a1..7ca464ce055 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -149,7 +149,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel): col = row.column(align=True) col.operator("object.vertex_group_add", icon='ZOOMIN', text="") col.operator("object.vertex_group_remove", icon='ZOOMOUT', text="") - col.menu("MESH_MT_vertex_group_specials", icon='BLANK1', text="") + col.menu("MESH_MT_vertex_group_specials", icon='DOWNARROW_HLT', text="") if group: col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP' col.operator("object.vertex_group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' @@ -208,7 +208,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel): sub = col.column(align=True) sub.operator("object.shape_key_add", icon='ZOOMIN', text="").from_mix = False sub.operator("object.shape_key_remove", icon='ZOOMOUT', text="") - sub.menu("MESH_MT_shape_key_specials", icon='BLANK1', text="") + sub.menu("MESH_MT_shape_key_specials", icon='DOWNARROW_HLT', text="") if kb: col.separator() diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index d2fe40fe9dc..6e66bd0d98b 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -110,7 +110,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel): col.operator("object.material_slot_add", icon='ZOOMIN', text="") col.operator("object.material_slot_remove", icon='ZOOMOUT', text="") - col.menu("MATERIAL_MT_specials", icon='BLANK1', text="") + col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="") if ob.mode == 'EDIT': row = layout.row(align=True) diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py index 976684ea742..1d5e96cf701 100644 --- a/release/scripts/startup/bl_ui/properties_texture.py +++ b/release/scripts/startup/bl_ui/properties_texture.py @@ -130,7 +130,7 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, Panel): col = row.column(align=True) col.operator("texture.slot_move", text="", icon='TRIA_UP').type = 'UP' col.operator("texture.slot_move", text="", icon='TRIA_DOWN').type = 'DOWN' - col.menu("TEXTURE_MT_specials", icon='BLANK1', text="") + col.menu("TEXTURE_MT_specials", icon='DOWNARROW_HLT', text="") split = layout.split(percentage=0.65) col = split.column() @@ -511,7 +511,7 @@ class TEXTURE_PT_envmap(TextureTypePanel, Panel): row = layout.row() row.prop(env, "source", expand=True) - row.menu("TEXTURE_MT_envmap_specials", icon='BLANK1', text="") + row.menu("TEXTURE_MT_envmap_specials", icon='DOWNARROW_HLT', text="") if env.source == 'IMAGE_FILE': layout.template_ID(tex, "image", open="image.open") diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index c0f9d6dd5cd..b82a0c5e480 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -171,6 +171,9 @@ typedef struct uiLayout uiLayout; #define UI_PANEL_WIDTH 340 #define UI_COMPACT_PANEL_WIDTH 160 +/* uiBut->drawflag */ +#define UI_BUT_DRAW_ENUM_ARROWS (1 << 0) /* draw enum-like up/down arrows for button */ + /* scale fixed button widths by this to account for DPI * 8.4852 == sqrtf(72.0f)) */ #define UI_DPI_FAC (sqrtf((float)U.dpi) / 8.48528137423857f) @@ -427,6 +430,9 @@ int UI_but_active_drop_name(struct bContext *C); void uiButSetFlag(uiBut *but, int flag); void uiButClearFlag(uiBut *but, int flag); +void uiButSetDrawFlag(uiBut *but, int flag); +void uiButClearDrawFlag(uiBut *but, int flag); + /* special button case, only draw it when used actively, for outliner etc */ int uiButActiveOnly(const struct bContext *C, uiBlock *block, uiBut *but); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 0c13b5de02e..c0cd17d16d2 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3356,6 +3356,16 @@ void uiButClearFlag(uiBut *but, int flag) but->flag &= ~flag; } +void uiButSetDrawFlag(uiBut *but, int flag) +{ + but->drawflag |= flag; +} + +void uiButClearDrawFlag(uiBut *but, int flag) +{ + but->drawflag &= ~flag; +} + int uiButGetRetVal(uiBut *but) { return but->retval; diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 2c4ec9ac482..5d12bdf71da 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -150,7 +150,7 @@ typedef struct { struct uiBut { struct uiBut *next, *prev; - int flag; + int flag, drawflag; short type, pointype, bit, bitnr, retval, strwidth, ofs, pos, selsta, selend, alignnr; short pad1; diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 6b0ffb1b54e..6d1766c8bf1 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -376,6 +376,9 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str else if (flag & UI_ID_BROWSE) { but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 1.6, UI_UNIT_Y, TIP_(template_id_browse_tip(type))); + + uiButSetDrawFlag(but, UI_BUT_DRAW_ENUM_ARROWS); + if (type) { but->icon = RNA_struct_ui_icon(type); /* default dragging of icon for id browse buttons */ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 2edc2b22e7e..4d483b69ca2 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -3136,10 +3136,10 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct /* no text, with icon */ else if (!but->str[0] && but->icon) { - if (but->flag & UI_ICON_PREVIEW) - wt = widget_type(UI_WTYPE_MENU_ICON_RADIO); /* no arrows */ - else + if (but->drawflag & UI_BUT_DRAW_ENUM_ARROWS) wt = widget_type(UI_WTYPE_MENU_RADIO); /* with arrows */ + else + wt = widget_type(UI_WTYPE_MENU_ICON_RADIO); /* no arrows */ } /* with menu arrows */ else From 1cee8d1f1dde5616f5574b504f042689af7f263d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 23 May 2012 16:19:04 +0000 Subject: [PATCH 146/159] Movie clip: remove workaround for #27997 it's not actually helps, but only confuses system when using openexr movie clips. --- source/blender/blenkernel/intern/movieclip.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 5dcec603b91..ccf64639967 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -540,10 +540,6 @@ static ImBuf *get_undistorted_ibuf(MovieClip *clip, struct MovieDistortion *dist { ImBuf *undistibuf; - /* XXX: because of #27997 do not use float buffers to undistort, - * otherwise, undistorted proxy can be darker than it should */ - imb_freerectfloatImBuf(ibuf); - if (distortion) undistibuf = BKE_tracking_distortion_exec(distortion, &clip->tracking, ibuf, ibuf->x, ibuf->y, 0.0f, 1); else From 66aac12e242ca22a92baf12e66596fda6d3e48a2 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Wed, 23 May 2012 16:34:41 +0000 Subject: [PATCH 147/159] Node Editor UI: * Added back the single triangle icon for node color special menu, showed empty after recent changes in r46939. --- source/blender/editors/space_node/node_buttons.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index c5ccfb7863a..f2ec2289ad1 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -127,7 +127,7 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemO(col, "", ICON_ZOOMIN, "node.node_color_preset_add"); opptr = uiItemFullO(col, "node.node_color_preset_add", "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); RNA_boolean_set(&opptr, "remove_active", 1); - uiItemM(col, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_BLANK1); + uiItemM(col, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_DOWNARROW_HLT); /* draw this node's settings */ if (node->typeinfo && node->typeinfo->uifuncbut) { From 6bb45ac67bfc48ee5e6741f2d886bb83e822cde9 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 23 May 2012 16:53:33 +0000 Subject: [PATCH 148/159] Camera tracking: imbuf (un)distoriton used to set RECT_INVALID flag for source image instead of destination This lead to wrong proxies generated for openexr float image sequences --- source/blender/blenkernel/intern/tracking.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 8339e973d43..b0745ebf1c8 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -2916,7 +2916,7 @@ ImBuf *BKE_tracking_distortion_exec(MovieDistortion *distortion, MovieTracking * } #endif - ibuf->userflags |= IB_RECT_INVALID; + resibuf->userflags |= IB_RECT_INVALID; } else { #ifdef WITH_LIBMV From 59aaaaaa168c5d9ff1ee3e561e25727eb75dc33e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 17:16:53 +0000 Subject: [PATCH 149/159] increase memory limit for sequencer cache to 32gig --- source/blender/makesrna/intern/rna_userdef.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index c21fa2614a8..8f7bb33fa2a 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -3053,7 +3053,7 @@ static void rna_def_userdef_system(BlenderRNA *brna) prop = RNA_def_property(srna, "memory_cache_limit", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "memcachelimit"); - RNA_def_property_range(prop, 0, (sizeof(void *) == 8) ? 1024 * 16 : 1024); /* 32 bit 2 GB, 64 bit 16 GB */ + RNA_def_property_range(prop, 0, (sizeof(void *) == 8) ? 1024 * 32 : 1024); /* 32 bit 2 GB, 64 bit 16 GB */ RNA_def_property_ui_text(prop, "Memory Cache Limit", "Memory cache limit (in megabytes)"); RNA_def_property_update(prop, 0, "rna_Userdef_memcache_update"); From 7505102668cf5339c391c0f7407f326541b2811b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 17:26:49 +0000 Subject: [PATCH 150/159] style cleanup: also correct comment --- .../compositor/intern/COM_ExecutionSystem.cpp | 4 ++-- .../compositor/intern/COM_InputSocket.cpp | 3 ++- .../compositor/nodes/COM_ViewerNode.cpp | 4 ++-- .../COM_ColorCorrectionOperation.cpp | 8 ++++---- .../operations/COM_CompositorOperation.cpp | 3 ++- .../operations/COM_LensGhostOperation.cpp | 18 +++++++++--------- .../operations/COM_MathBaseOperation.cpp | 4 ++-- source/blender/makesrna/intern/rna_userdef.c | 2 +- 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cpp b/source/blender/compositor/intern/COM_ExecutionSystem.cpp index 84b5bb8f5fc..0d4c7cde68f 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cpp +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cpp @@ -105,7 +105,7 @@ ExecutionSystem::~ExecutionSystem() void ExecutionSystem::execute() { unsigned int order = 0; - for ( vector::iterator iter = this->operations.begin(); iter != operations.end(); ++iter ) { + for (vector::iterator iter = this->operations.begin(); iter != operations.end(); ++iter) { NodeBase *node = *iter; NodeOperation *operation = (NodeOperation*) node; if (operation->isReadBufferOperation()) { @@ -273,7 +273,7 @@ void ExecutionSystem::groupOperations() } } ExecutionSystemHelper::findOutputNodeOperations(&outputOperations, this->getOperations(), this->context.isRendering()); - for ( vector::iterator iter = outputOperations.begin(); iter != outputOperations.end(); ++iter ) { + for (vector::iterator iter = outputOperations.begin(); iter != outputOperations.end(); ++iter) { operation = *iter; ExecutionGroup *group = new ExecutionGroup(); group->addOperation(this, operation); diff --git a/source/blender/compositor/intern/COM_InputSocket.cpp b/source/blender/compositor/intern/COM_InputSocket.cpp index 7227773e117..4d96d077901 100644 --- a/source/blender/compositor/intern/COM_InputSocket.cpp +++ b/source/blender/compositor/intern/COM_InputSocket.cpp @@ -168,7 +168,8 @@ void InputSocket::relinkConnections(InputSocket *relinkToSocket, int editorNode { if (isConnected()) { relinkConnections(relinkToSocket); - } else { + } + else { Node *node = (Node*)this->getNode(); switch (this->getActualDataType()) { case COM_DT_UNKNOWN: diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp index 7609928bc15..3282929af52 100644 --- a/source/blender/compositor/nodes/COM_ViewerNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp @@ -39,8 +39,8 @@ void ViewerNode::convertToOperations(ExecutionSystem *graph, CompositorContext * if (imageSocket->isConnected()) { bNode *editorNode = this->getbNode(); ViewerOperation *viewerOperation = new ViewerOperation(); - viewerOperation->setColorManagement( context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT); - viewerOperation->setColorPredivide( context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE); + viewerOperation->setColorManagement(context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT); + viewerOperation->setColorPredivide(context->getScene()->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE); viewerOperation->setbNodeTree(context->getbNodeTree()); viewerOperation->setImage(image); viewerOperation->setImageUser(imageUser); diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp index 0a257b22ab8..45750244d87 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp @@ -64,7 +64,7 @@ void ColorCorrectionOperation::executePixel(float *output, float x, float y, Pix float levelHighlights = 0.0; #define MARGIN 0.10 #define MARGIN_DIV (0.5/MARGIN) - if ( level < this->data->startmidtones-MARGIN) { + if (level < this->data->startmidtones-MARGIN) { levelShadows = 1.0f; } else if (level < this->data->startmidtones+MARGIN) { @@ -95,9 +95,9 @@ void ColorCorrectionOperation::executePixel(float *output, float x, float y, Pix float invgamma = 1.0f/gamma; float luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; - r = ( luma + saturation * (r - luma)); - g = ( luma + saturation * (g - luma)); - b = ( luma + saturation * (b - luma)); + r = (luma + saturation * (r - luma)); + g = (luma + saturation * (g - luma)); + b = (luma + saturation * (b - luma)); CLAMP (r, 0.0f, 1.0f); CLAMP (g, 0.0f, 1.0f); CLAMP (b, 0.0f, 1.0f); diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp index 8b343374f1c..5a919965ede 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cpp +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -74,7 +74,8 @@ void CompositorOperation::deinitExecution() re = NULL; } BKE_image_signal(BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), NULL, IMA_SIGNAL_FREE); - } else { + } + else { if (this->outputBuffer) { MEM_freeN(this->outputBuffer); } diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp index e99bbb536f7..bbf6df6c1e5 100644 --- a/source/blender/compositor/operations/COM_LensGhostOperation.cpp +++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp @@ -314,24 +314,24 @@ public: float rs01 = -sin(theta0-theta1)/sin(theta0+theta1); float rp01 = tan( theta0-theta1)/tan(theta0+theta1); - float ts01 = 2 * sin ( theta1 ) * cos ( theta0 ) / sin ( theta0+theta1 ) ; + float ts01 = 2 * sin( theta1 ) * cos( theta0 ) / sin( theta0+theta1 ) ; float tp01 = ts01*cos(theta0-theta1); // amplitude for inner reflection - float rs12 = -sin ( theta1-theta2 ) / sin ( theta1+theta2 ) ; - float rp12 = +tan ( theta1-theta2 ) / tan ( theta1+theta2 ) ; + float rs12 = -sin( theta1-theta2 ) / sin( theta1+theta2 ) ; + float rp12 = +tan( theta1-theta2 ) / tan( theta1+theta2 ) ; // after passing through first surface twice : // 2 transmissions and 1 reflection float ris = ts01 * ts01 * rs12 ; float rip = tp01 * tp01 * rp12 ; // phase difference between outer and inner reflections float dy = d1 * n1 ; - float dx = tan ( theta1 ) * dy ; - float delay = sqrt ( dx * dx+dy * dy ) ; - float relPhase = 4 * M_PI / lambda * ( delay-dx * sin ( theta0 ) ) ; + float dx = tan( theta1 ) * dy ; + float delay = sqrt( dx * dx+dy * dy ) ; + float relPhase = 4 * M_PI / lambda * ( delay-dx * sin( theta0 ) ) ; // Add up sines of different phase and amplitude - float out_s2 = rs01 * rs01 + ris * ris + 2 * rs01 * ris * cos ( relPhase ) ; - float out_p2 = rp01 * rp01 + rip * rip + 2 * rp01 * rip * cos ( relPhase ) ; - return ( out_s2+out_p2 ) / 2 ; + float out_s2 = rs01 * rs01 + ris * ris + 2 * rs01 * ris * cos( relPhase ) ; + float out_p2 = rp01 * rp01 + rip * rip + 2 * rp01 * rip * cos( relPhase ) ; + return (out_s2 + out_p2) / 2 ; } void detectHit(Ray *result, Ray *inputRay, Bounce *bounce) { diff --git a/source/blender/compositor/operations/COM_MathBaseOperation.cpp b/source/blender/compositor/operations/COM_MathBaseOperation.cpp index 2f315855652..3a287cb7239 100644 --- a/source/blender/compositor/operations/COM_MathBaseOperation.cpp +++ b/source/blender/compositor/operations/COM_MathBaseOperation.cpp @@ -174,7 +174,7 @@ void MathPowerOperation::executePixel(float *outputValue, float x, float y, Pixe inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if ( inputValue1[0] >= 0 ) { + if (inputValue1[0] >= 0) { outputValue[0] = pow(inputValue1[0], inputValue2[0]); } else { @@ -197,7 +197,7 @@ void MathLogarithmOperation::executePixel(float *outputValue, float x, float y, inputValue1Operation->read(&inputValue1[0], x, y, sampler, inputBuffers); inputValue2Operation->read(&inputValue2[0], x, y, sampler, inputBuffers); - if ( inputValue1[0] > 0 && inputValue2[0] > 0 ) + if (inputValue1[0] > 0 && inputValue2[0] > 0) outputValue[0] = log(inputValue1[0]) / log(inputValue2[0]); else outputValue[0] = 0.0; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 8f7bb33fa2a..96d9653839b 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -3053,7 +3053,7 @@ static void rna_def_userdef_system(BlenderRNA *brna) prop = RNA_def_property(srna, "memory_cache_limit", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "memcachelimit"); - RNA_def_property_range(prop, 0, (sizeof(void *) == 8) ? 1024 * 32 : 1024); /* 32 bit 2 GB, 64 bit 16 GB */ + RNA_def_property_range(prop, 0, (sizeof(void *) == 8) ? 1024 * 32 : 1024); /* 32 bit 2 GB, 64 bit 32 GB */ RNA_def_property_ui_text(prop, "Memory Cache Limit", "Memory cache limit (in megabytes)"); RNA_def_property_update(prop, 0, "rna_Userdef_memcache_update"); From 7f7ba3243d843a1d7702cd1c8bab0dd1a5b9fb35 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 23 May 2012 17:55:34 +0000 Subject: [PATCH 151/159] Fix cycles render issue with a (useless) mix node that has the same shader plugged into both sockets. --- intern/cycles/render/graph.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index d9486de47c9..77bc9cf27ec 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -325,6 +325,25 @@ void ShaderGraph::remove_proxy_nodes(vector& removed) removed[proxy->id] = true; } + + /* remove useless mix closures nodes */ + MixClosureNode *mix = dynamic_cast(node); + + if(mix) { + if(mix->outputs[0]->links.size() && mix->inputs[1]->link == mix->inputs[2]->link) { + ShaderOutput *output = mix->inputs[1]->link; + vector inputs = mix->outputs[0]->links; + + foreach(ShaderInput *sock, mix->inputs) + if(sock->link) + disconnect(sock); + + foreach(ShaderInput *input, inputs) { + disconnect(input); + connect(output, input); + } + } + } } } From 3136e8dce80bb3538290ed0aa0b778b7eeabbd20 Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Wed, 23 May 2012 19:55:00 +0000 Subject: [PATCH 152/159] Feature request implemented: [#31572] Mixdown selects blend filename, should initialize name from filetype as images do. --- source/blender/editors/sound/sound_ops.c | 92 ++++++++++++++++++++---- 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index e91b29ff0c1..17c4dc37371 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -362,6 +362,81 @@ static int sound_mixdown_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static EnumPropertyItem container_items[] = { +#ifdef WITH_FFMPEG + {AUD_CONTAINER_AC3, "AC3", 0, "ac3", "Dolby Digital ATRAC 3"}, +#endif + {AUD_CONTAINER_FLAC, "FLAC", 0, "flac", "Free Lossless Audio Codec"}, +#ifdef WITH_FFMPEG + {AUD_CONTAINER_MATROSKA, "MATROSKA", 0, "mkv", "Matroska"}, + {AUD_CONTAINER_MP2, "MP2", 0, "mp2", "MPEG-1 Audio Layer II"}, + {AUD_CONTAINER_MP3, "MP3", 0, "mp3", "MPEG-2 Audio Layer III"}, +#endif + {AUD_CONTAINER_OGG, "OGG", 0, "ogg", "Xiph.Org Ogg Container"}, + {AUD_CONTAINER_WAV, "WAV", 0, "wav", "Waveform Audio File Format"}, + {0, NULL, 0, NULL, NULL}}; + +static const char *snd_ext_sound[] = { + ".ac3", + ".flac", + ".mkv", + ".mp2", + ".mp3", + ".ogg", + ".wav", + NULL +}; + +static int sound_mixdown_check(bContext *UNUSED(C), wmOperator *op) +{ + AUD_Container container = RNA_enum_get(op->ptr, "container"); + + const char* extension = NULL; + + EnumPropertyItem* item = container_items; + while(item->identifier != NULL) + { + if(item->value == container) + { + const char** ext = snd_ext_sound; + while(*ext != NULL) + { + if(!strcmp(*ext + 1, item->name)) + { + extension = *ext; + break; + } + + ext++; + } + } + item++; + } + + if (extension) { + PropertyRNA *prop; + char filepath[FILE_MAX]; + + int check; + + prop = RNA_struct_find_property(op->ptr, "filepath"); + RNA_property_string_get(op->ptr, prop, filepath); + + if(BLI_testextensie_array(filepath, snd_ext_sound)) + check = BLI_replace_extension(filepath, FILE_MAX, extension); + else + check = BLI_ensure_extension(filepath, FILE_MAX, extension); + + if(!check) + return check; + + RNA_property_string_set(op->ptr, prop, filepath); + return TRUE; + } + + return FALSE; +} + static int sound_mixdown_invoke(bContext *C, wmOperator *op, wmEvent *event) { if (RNA_struct_property_is_set(op->ptr, "filepath")) @@ -544,20 +619,6 @@ static void SOUND_OT_mixdown(wmOperatorType *ot) {AUD_FORMAT_FLOAT64, "F64", 0, "F64", "64 bit floating point"}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem container_items[] = { -#ifdef WITH_FFMPEG - {AUD_CONTAINER_AC3, "AC3", 0, "ac3", "Dolby Digital ATRAC 3"}, -#endif - {AUD_CONTAINER_FLAC, "FLAC", 0, "flac", "Free Lossless Audio Codec"}, -#ifdef WITH_FFMPEG - {AUD_CONTAINER_MATROSKA, "MATROSKA", 0, "mkv", "Matroska"}, - {AUD_CONTAINER_MP2, "MP2", 0, "mp2", "MPEG-1 Audio Layer II"}, - {AUD_CONTAINER_MP3, "MP3", 0, "mp3", "MPEG-2 Audio Layer III"}, -#endif - {AUD_CONTAINER_OGG, "OGG", 0, "ogg", "Xiph.Org Ogg Container"}, - {AUD_CONTAINER_WAV, "WAV", 0, "wav", "Waveform Audio File Format"}, - {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem codec_items[] = { #ifdef WITH_FFMPEG {AUD_CODEC_AAC, "AAC", 0, "AAC", "Advanced Audio Coding"}, @@ -582,6 +643,7 @@ static void SOUND_OT_mixdown(wmOperatorType *ot) /* api callbacks */ ot->exec = sound_mixdown_exec; ot->invoke = sound_mixdown_invoke; + ot->check = sound_mixdown_check; #ifdef WITH_AUDASPACE ot->ui = sound_mixdown_draw; @@ -590,7 +652,7 @@ static void SOUND_OT_mixdown(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY); + WM_operator_properties_filesel(ot, FOLDERFILE | SOUNDFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH, FILE_DEFAULTDISPLAY); #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"); From 5d82173a780735a0bb1d3d54e2ffae1ddb6644aa Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 23 May 2012 20:19:40 +0000 Subject: [PATCH 153/159] Image.gl_touch - routine to prevent the image to be cleared by blender cache garbage collection system * if the image is not loaded (bindcode == 0) load the image This needs to be called often. If the image is 'cleaned' by Blender, it will not help to load it after. [ gl_load returns the errors: GL_STACK_OVERFLOW(1283) or GL_STACK_UNDERFLOW (1284) ] Thanks Campbell for the suggestion on how to handle this (BKE_image_tag_time) --- .../blender/makesrna/intern/rna_image_api.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c index 3d937fc561d..cf19002f44e 100644 --- a/source/blender/makesrna/intern/rna_image_api.c +++ b/source/blender/makesrna/intern/rna_image_api.c @@ -224,6 +224,19 @@ static int rna_Image_gl_load(Image *image, ReportList *reports, int filter, int return error; } +static int rna_Image_gl_touch(Image *image, ReportList *reports, int filter, int mag) +{ + unsigned int *bind = &image->bindcode; + int error = GL_NO_ERROR; + + BKE_image_tag_time(image); + + if (*bind == 0) + error = rna_Image_gl_load(image, reports, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR); + + return error; +} + static void rna_Image_gl_free(Image *image) { GPU_free_image(image); @@ -274,6 +287,17 @@ void RNA_api_image(StructRNA *srna) parm = RNA_def_int(func, "height", 0, 1, 10000, "", "Height", 1, 10000); RNA_def_property_flag(parm, PROP_REQUIRED); + func = RNA_def_function(srna, "gl_touch", "rna_Image_gl_touch"); + RNA_def_function_ui_description(func, "Delay the image from being cleaned from the cache due inactivity"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", + "The texture minifying function to use if the image wan't loaded", -INT_MAX, INT_MAX); + RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", + "The texture magnification function to use if the image wan't loaded", -INT_MAX, INT_MAX); + /* return value */ + parm = RNA_def_int(func, "error", 0, -INT_MAX, INT_MAX, "Error", "OpenGL error value", -INT_MAX, INT_MAX); + RNA_def_function_return(func, parm); + func = RNA_def_function(srna, "gl_load", "rna_Image_gl_load"); RNA_def_function_ui_description(func, "Load the image into OpenGL graphics memory"); RNA_def_function_flag(func, FUNC_USE_REPORTS); From 5b8cbbe3fd3cbc8a9f828fbc3fa5269bba25957e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 21:39:39 +0000 Subject: [PATCH 154/159] code cleanup: fix possible use of uninitialized value and remove dead initializations. --- .../blender/blenkernel/intern/cdderivedmesh.c | 22 +++++++++---------- source/blender/bmesh/operators/bmo_slide.c | 1 + .../editors/sculpt_paint/paint_vertex.c | 10 ++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 4a07e4b56c7..f6eee44b92c 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1471,9 +1471,9 @@ static void cdDM_foreachMappedFaceCenter( void *userData) { CDDerivedMesh *cddm = (CDDerivedMesh *)dm; - MVert *mv = cddm->mvert; - MPoly *mp = cddm->mpoly; - MLoop *ml = cddm->mloop; + MVert *mvert = cddm->mvert; + MPoly *mp; + MLoop *ml; int i, j, orig, *index; index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX); @@ -1492,23 +1492,23 @@ static void cdDM_foreachMappedFaceCenter( ml = &cddm->mloop[mp->loopstart]; cent[0] = cent[1] = cent[2] = 0.0f; for (j = 0; j < mp->totloop; j++, ml++) { - add_v3_v3v3(cent, cent, mv[ml->v].co); + add_v3_v3v3(cent, cent, mvert[ml->v].co); } mul_v3_fl(cent, 1.0f / (float)j); ml = &cddm->mloop[mp->loopstart]; if (j > 3) { normal_quad_v3(no, - mv[(ml + 0)->v].co, - mv[(ml + 1)->v].co, - mv[(ml + 2)->v].co, - mv[(ml + 3)->v].co); + mvert[(ml + 0)->v].co, + mvert[(ml + 1)->v].co, + mvert[(ml + 2)->v].co, + mvert[(ml + 3)->v].co); } else { normal_tri_v3(no, - mv[(ml + 0)->v].co, - mv[(ml + 1)->v].co, - mv[(ml + 2)->v].co); + mvert[(ml + 0)->v].co, + mvert[(ml + 1)->v].co, + mvert[(ml + 2)->v].co); } func(userData, orig, cent, no); diff --git a/source/blender/bmesh/operators/bmo_slide.c b/source/blender/bmesh/operators/bmo_slide.c index 5a91fdee533..238cc5ac66f 100644 --- a/source/blender/bmesh/operators/bmo_slide.c +++ b/source/blender/bmesh/operators/bmo_slide.c @@ -88,6 +88,7 @@ void bmo_vertex_slide_exec(BMesh *bm, BMOperator *op) } /* Make sure we get the correct edge. */ + slide_edge = NULL; BM_ITER_ELEM (edge, &iter, vertex, BM_EDGES_OF_VERT) { if (BMO_elem_flag_test(bm, edge, EDGE_MARK) && BM_vert_in_edge(edge, vertex)) { slide_edge = edge; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 513b5bbaa98..c5c08a94ae5 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -259,8 +259,6 @@ static void do_shared_vertex_tesscol(Mesh *me) void do_shared_vertexcol(Mesh *me, int do_tessface) { const int use_face_sel = (me->editflag & ME_EDIT_PAINT_MASK); - MLoop *ml = me->mloop; - MLoopCol *lcol = me->mloopcol; MPoly *mp; float (*scol)[4]; int i, j, has_shared = 0; @@ -274,8 +272,8 @@ void do_shared_vertexcol(Mesh *me, int do_tessface) for (i = 0, mp = me->mpoly; i < me->totpoly; i++, mp++) { if ((use_face_sel == FALSE) || (mp->flag & ME_FACE_SEL)) { - ml = me->mloop + mp->loopstart; - lcol = me->mloopcol + mp->loopstart; + MLoop *ml = me->mloop + mp->loopstart; + MLoopCol *lcol = me->mloopcol + mp->loopstart; for (j = 0; j < mp->totloop; j++, ml++, lcol++) { scol[ml->v][0] += lcol->r; scol[ml->v][1] += lcol->g; @@ -295,8 +293,8 @@ void do_shared_vertexcol(Mesh *me, int do_tessface) for (i = 0, mp = me->mpoly; i < me->totpoly; i++, mp++) { if ((use_face_sel == FALSE) || (mp->flag & ME_FACE_SEL)) { - ml = me->mloop + mp->loopstart; - lcol = me->mloopcol + mp->loopstart; + MLoop *ml = me->mloop + mp->loopstart; + MLoopCol *lcol = me->mloopcol + mp->loopstart; for (j = 0; j < mp->totloop; j++, ml++, lcol++) { lcol->r = scol[ml->v][0]; lcol->g = scol[ml->v][1]; From 57b488574a0720eb749e9daa16df1979db9bbe6f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 23 May 2012 22:45:39 +0000 Subject: [PATCH 155/159] style cleanup: comma placement --- source/blender/blenkernel/intern/blender.c | 3 ++- source/blender/blenkernel/intern/deform.c | 2 +- .../blender/blenkernel/intern/particle_system.c | 2 +- source/blender/blenkernel/intern/unit.c | 2 +- source/blender/blenlib/intern/noise.c | 16 ++++++++-------- source/blender/editors/mesh/editmesh_tools.c | 2 +- .../editors/transform/transform_conversions.c | 2 +- source/blender/imbuf/intern/radiance_hdr.c | 8 ++++---- source/blender/windowmanager/intern/wm_window.c | 2 +- 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 2ba4ab5d100..e6333ed74aa 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -336,7 +336,8 @@ static int handle_subversion_warning(Main *main, ReportList *reports) (main->minversionfile == BLENDER_VERSION && main->minsubversionfile > BLENDER_SUBVERSION)) { - BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile); + BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary: %d.%d, expect loss of data!", + main->minversionfile, main->minsubversionfile); } return 1; diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 0396733760f..547a64a70d4 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -538,7 +538,7 @@ void flip_side_name(char name[MAX_VGROUP_NAME], const char from_name[MAX_VGROUP_ break; } } - /* case; beginning with r R l L , with separator after it */ + /* case; beginning with r R l L, with separator after it */ else if (is_char_sep(name[1])) { switch (name[0]) { case 'l': diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 941e2990a4b..9497a81d386 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -4135,7 +4135,7 @@ static void particles_fluid_step(ParticleSimulationData *sim, int UNUSED(cfra)) pa->dietime = sim->scene->r.efra + 1; pa->lifetime = sim->scene->r.efra; pa->alive = PARS_ALIVE; - //if (a < 25) fprintf(stderr,"FSPARTICLE debug set %s , a%d = %f,%f,%f , life=%f\n", filename, a, pa->co[0],pa->co[1],pa->co[2], pa->lifetime ); + //if (a < 25) fprintf(stderr,"FSPARTICLE debug set %s, a%d = %f,%f,%f, life=%f\n", filename, a, pa->co[0],pa->co[1],pa->co[2], pa->lifetime ); } else { // skip... diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index 03afc97f324..aa9cc40f71f 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -663,7 +663,7 @@ int bUnit_ReplaceString(char *str, int len_max, const char *str_prev, double sca if (*ch == ' ' || *ch == '\t') { /* do nothing */ } - else if (ch_is_op(*ch) || *ch == ',') { /* found an op, no need to insert a ,*/ + else if (ch_is_op(*ch) || *ch == ',') { /* found an op, no need to insert a ',' */ op_found = 1; break; } diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index f591dc17f5b..cad4addc87b 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -302,14 +302,14 @@ static float newPerlin(float x, float y, float z) w = npfade(z); A = hash[X ]+Y; AA = hash[A]+Z; AB = hash[A+1]+Z; // HASH COORDINATES OF B = hash[X+1]+Y; BA = hash[B]+Z; BB = hash[B+1]+Z; // THE 8 CUBE CORNERS, - return lerp(w, lerp(v, lerp(u, grad(hash[AA ], x , y , z ), // AND ADD - grad(hash[BA ], x-1, y , z )), // BLENDED - lerp(u, grad(hash[AB ], x , y-1, z ), // RESULTS - grad(hash[BB ], x-1, y-1, z ))),// FROM 8 - lerp(v, lerp(u, grad(hash[AA+1], x , y , z-1 ), // CORNERS - grad(hash[BA+1], x-1, y , z-1 )), // OF CUBE - lerp(u, grad(hash[AB+1], x , y-1, z-1 ), - grad(hash[BB+1], x-1, y-1, z-1 )))); + return lerp(w, lerp(v, lerp(u, grad(hash[AA ], x, y, z ), // AND ADD + grad(hash[BA ], x - 1, y, z )), // BLENDED + lerp(u, grad(hash[AB ], x, y - 1, z ), // RESULTS + grad(hash[BB ], x - 1, y - 1, z ))), // FROM 8 + lerp(v, lerp(u, grad(hash[AA + 1], x, y, z - 1), // CORNERS + grad(hash[BA + 1], x - 1, y, z - 1)), // OF CUBE + lerp(u, grad(hash[AB + 1], x, y - 1, z - 1), + grad(hash[BB + 1], x - 1, y - 1, z - 1)))); } /* for use with BLI_gNoise()/BLI_gTurbulence(), returns unsigned improved perlin noise */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 361244e9f13..708273df109 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -4317,7 +4317,7 @@ typedef struct { static void edbm_bevel_update_header(wmOperator *op, bContext *C) { - static char str[] = "Confirm: Enter/LClick, Cancel: (Esc/RClick), factor: %f, , Use Dist (D): %s: Use Even (E): %s"; + static char str[] = "Confirm: Enter/LClick, Cancel: (Esc/RMB), factor: %f, Use Dist (D): %s: Use Even (E): %s"; char msg[HEADER_LENGTH]; ScrArea *sa = CTX_wm_area(C); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 1e22179a432..d9e4619fb59 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -4861,7 +4861,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t) /* marker transform, not especially nice but we may want to move markers * at the same time as keyframes in the dope sheet. */ if ((sseq->flag & SEQ_MARKER_TRANS) && (canceled == 0)) { - /* cant use , TFM_TIME_EXTEND + /* cant use TFM_TIME_EXTEND * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead */ if (t->mode == TFM_SEQ_SLIDE) { diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c index 4f4ab9e72d0..29c2e63637d 100644 --- a/source/blender/imbuf/intern/radiance_hdr.c +++ b/source/blender/imbuf/intern/radiance_hdr.c @@ -65,9 +65,9 @@ #define STR_MAX 540 typedef unsigned char RGBE[4]; typedef float fCOLOR[3]; + /* copy source -> dest */ -#define copy_rgbe(c1, c2) (c2[RED] = c1[RED], c2[GRN] = c1[GRN], c2[BLU] = c1[BLU], c2[EXP] = c1[EXP]) -#define copy_fcol(f1, f2) (f2[RED] = f1[RED], f2[GRN] = f1[GRN], f2[BLU] = f1[BLU]) +#define COPY_RGBE(c1, c2) (c2[RED] = c1[RED], c2[GRN] = c1[GRN], c2[BLU] = c1[BLU], c2[EXP] = c1[EXP]) /* read routines */ static unsigned char *oldreadcolrs(RGBE *scan, unsigned char *mem, int xmax) @@ -80,7 +80,7 @@ static unsigned char *oldreadcolrs(RGBE *scan, unsigned char *mem, int xmax) scan[0][EXP] = *mem++; if (scan[0][RED] == 1 && scan[0][GRN] == 1 && scan[0][BLU] == 1) { for (i = scan[0][EXP] << rshift; i > 0; i--) { - copy_rgbe(scan[-1], scan[0]); + COPY_RGBE(scan[-1], scan[0]); scan++; len--; } @@ -272,7 +272,7 @@ static int fwritecolrs(FILE *file, int width, int channels, unsigned char *ibufs fcol[BLU] = (float)((channels >= 3) ? ibufscan[j + 2] : ibufscan[j]) / 255.f; } FLOAT2RGBE(fcol, rgbe); - copy_rgbe(rgbe, rgbe_scan[i]); + COPY_RGBE(rgbe, rgbe_scan[i]); j += channels; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 95af8aa1d9e..e6eff908e33 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -477,7 +477,7 @@ wmWindow *WM_window_open(bContext *C, rcti *rect) /* uses screen->temp tag to define what to do, currently it limits * to only one "temp" window for render out, preferences, filewindow, etc */ -/* type is #define in WM_api.h */ +/* type is defined in WM_api.h */ void WM_window_open_temp(bContext *C, rcti *position, int type) { From 8e97203f7d1101d8069b22f0f9a5666812704e22 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 24 May 2012 01:25:31 +0000 Subject: [PATCH 156/159] Restoring Group Colours for Animation Channels - Part 1 This commit restores the group colours support for F-Curves and F-Curve Groups in the DopeSheet and Graph Editors. Currently the relevant settings for groups are only exposed via RNA, but a followup commit will add support for automatically setting these colours. By default, DopeSheet and Graph Editors are set to display these colours if/when they are available. This functionality used to be in 2.48, and is a useful mechanism for visually distinguishing between channels for different controls when animating (if group colours are used on the rigs too). --- .../scripts/startup/bl_ui/space_dopesheet.py | 1 + release/scripts/startup/bl_ui/space_graph.py | 1 + .../editors/animation/anim_channels_defines.c | 64 +++++++++--- source/blender/makesdna/DNA_action_types.h | 2 +- source/blender/makesdna/DNA_space_types.h | 2 + source/blender/makesrna/RNA_enum_types.h | 2 + source/blender/makesrna/intern/rna_action.c | 6 +- source/blender/makesrna/intern/rna_internal.h | 3 + source/blender/makesrna/intern/rna_pose.c | 97 +++++++++++-------- source/blender/makesrna/intern/rna_space.c | 12 +++ 10 files changed, 128 insertions(+), 62 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index e39ed4ec326..8e955338480 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -149,6 +149,7 @@ class DOPESHEET_MT_view(Menu): layout.prop(st, "use_realtime_update") layout.prop(st, "show_frame_indicator") layout.prop(st, "show_sliders") + layout.prop(st, "show_group_colors") layout.prop(st, "use_auto_merge_keyframes") layout.prop(st, "use_marker_sync") diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py index 8c28835fa99..972b4ebe721 100644 --- a/release/scripts/startup/bl_ui/space_graph.py +++ b/release/scripts/startup/bl_ui/space_graph.py @@ -75,6 +75,7 @@ class GRAPH_MT_view(Menu): layout.prop(st, "show_frame_indicator") layout.prop(st, "show_cursor") layout.prop(st, "show_sliders") + layout.prop(st, "show_group_colors") layout.prop(st, "use_auto_merge_keyframes") layout.separator() diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index dd9a0600725..c4fca2d4ea5 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -146,18 +146,39 @@ static void acf_generic_dataexpand_backdrop(bAnimContext *ac, bAnimListElem *ale glRectf(offset, yminc, v2d->cur.xmax + EXTRA_SCROLL_PAD, ymaxc); } +/* helper method to test if group colors should be drawn */ +static short acf_show_channel_colors(bAnimContext *ac) +{ + short showGroupColors = 0; + + if (ac->sl) { + switch (ac->spacetype) { + case SPACE_ACTION: + { + SpaceAction *saction = (SpaceAction *)ac->sl; + showGroupColors = !(saction->flag & SACTION_NODRAWGCOLORS); + } + break; + case SPACE_IPO: + { + SpaceIpo *sipo = (SpaceIpo *)ac->sl; + showGroupColors = !(sipo->flag & SIPO_NODRAWGCOLORS); + } + break; + } + } + + return showGroupColors; +} + /* get backdrop color for generic channels */ static void acf_generic_channel_color(bAnimContext *ac, bAnimListElem *ale, float r_color[3]) { bAnimChannelType *acf = ANIM_channel_get_typeinfo(ale); - SpaceAction *saction = NULL; bActionGroup *grp = NULL; short indent = (acf->get_indent_level) ? acf->get_indent_level(ac, ale) : 0; + short showGroupColors = acf_show_channel_colors(ac); - /* get context info needed... */ - if ((ac->sl) && (ac->spacetype == SPACE_ACTION)) - saction = (SpaceAction *)ac->sl; - if (ale->type == ANIMTYPE_FCURVE) { FCurve *fcu = (FCurve *)ale->data; grp = fcu->grp; @@ -167,9 +188,7 @@ static void acf_generic_channel_color(bAnimContext *ac, bAnimListElem *ale, floa * - use 3 shades of color group/standard color for 3 indention level * - only use group colors if allowed to, and if actually feasible */ - if ( (saction && !(saction->flag & SACTION_NODRAWGCOLORS)) && - ((grp) && (grp->customCol)) ) - { + if (showGroupColors && (grp) && (grp->customCol)) { unsigned char cp[3]; if (indent == 2) { @@ -730,13 +749,30 @@ static bAnimChannelType ACF_OBJECT = /* Group ------------------------------------------- */ /* get backdrop color for group widget */ -static void acf_group_color(bAnimContext *UNUSED(ac), bAnimListElem *ale, float r_color[3]) +static void acf_group_color(bAnimContext *ac, bAnimListElem *ale, float r_color[3]) { - /* highlight only for action group channels */ - if (ale->flag & AGRP_ACTIVE) - UI_GetThemeColorShade3fv(TH_GROUP_ACTIVE, 10, r_color); - else - UI_GetThemeColorShade3fv(TH_GROUP, 20, r_color); + bActionGroup *agrp = (bActionGroup *)ale->data; + short showGroupColors = acf_show_channel_colors(ac); + + if (showGroupColors && agrp->customCol) { + unsigned char cp[3]; + + /* highlight only for active */ + if (ale->flag & AGRP_ACTIVE) + copy_v3_v3_char((char *)cp, agrp->cs.active); + else + copy_v3_v3_char((char *)cp, agrp->cs.solid); + + /* copy the colors over, transforming from bytes to floats */ + rgb_uchar_to_float(r_color, cp); + } + else { + /* highlight only for active */ + if (ale->flag & AGRP_ACTIVE) + UI_GetThemeColorShade3fv(TH_GROUP_ACTIVE, 10, r_color); + else + UI_GetThemeColorShade3fv(TH_GROUP, 20, r_color); + } } /* backdrop for group widget */ diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 30b3e75255d..9cb5ca5da55 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -612,7 +612,7 @@ typedef enum eSAction_Flag { /* show pose-markers (local to action) in Action Editor mode */ SACTION_POSEMARKERS_SHOW = (1<<6), /* don't draw action channels using group colors (where applicable) */ - SACTION_NODRAWGCOLORS = (1<<7), // XXX depreceated... irrelevant for current groups implementation + SACTION_NODRAWGCOLORS = (1<<7), /* don't draw current frame number beside frame indicator */ SACTION_NODRAWCFRANUM = (1<<8), /* temporary flag to force channel selections to be synced with main */ diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 0bc91907d6e..375258cb92b 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -763,6 +763,8 @@ enum FileSortTypeE { #define SIPO_NOREALTIMEUPDATES (1<<11) /* don't draw curves with AA ("beauty-draw") for performance */ #define SIPO_BEAUTYDRAW_OFF (1<<12) + /* draw grouped channels with colors set in group */ +#define SIPO_NODRAWGCOLORS (1<<13) /* SpaceIpo->mode (Graph Editor Mode) */ enum { diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 21eba3faf02..d2eeaa72fed 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -55,6 +55,8 @@ extern EnumPropertyItem image_type_items[]; extern EnumPropertyItem image_color_mode_items[]; extern EnumPropertyItem image_depth_mode_items[]; +extern EnumPropertyItem color_sets_items[]; + extern EnumPropertyItem beztriple_keyframe_type_items[]; extern EnumPropertyItem beztriple_handle_type_items[]; extern EnumPropertyItem beztriple_interpolation_mode_items[]; diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c index c264210fd91..b63109ed137 100644 --- a/source/blender/makesrna/intern/rna_action.c +++ b/source/blender/makesrna/intern/rna_action.c @@ -480,10 +480,8 @@ static void rna_def_action_group(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Expanded", "Action Group is expanded"); RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL); - prop = RNA_def_property(srna, "custom_color", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "customCol"); - RNA_def_property_ui_text(prop, "Custom Color", "Index of custom color set"); - RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL); + /* color set */ + rna_def_actionbone_group_common(srna, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL); } /* fcurve.keyframe_points */ diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index a2054622031..cb90211eff9 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -193,6 +193,9 @@ void rna_def_mtex_common(struct BlenderRNA *brna, struct StructRNA *srna, const const char *structname_slots, const char *update); void rna_def_render_layer_common(struct StructRNA *srna, int scene); +void rna_def_actionbone_group_common(struct StructRNA *srna, int update_flag, const char *update_cb); +void rna_ActionGroup_colorset_set(struct PointerRNA *ptr, int value); + void rna_ID_name_get(struct PointerRNA *ptr, char *value); int rna_ID_name_length(struct PointerRNA *ptr); void rna_ID_name_set(struct PointerRNA *ptr, const char *value); diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 6ec0932dba8..83d40b26cd0 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -60,6 +60,33 @@ EnumPropertyItem posebone_rotmode_items[] = { {0, NULL, 0, NULL, NULL} }; +/* Bone and Group Color Sets */ +EnumPropertyItem color_sets_items[] = { + {0, "DEFAULT", 0, "Default Colors", ""}, + {1, "THEME01", 0, "01 - Theme Color Set", ""}, + {2, "THEME02", 0, "02 - Theme Color Set", ""}, + {3, "THEME03", 0, "03 - Theme Color Set", ""}, + {4, "THEME04", 0, "04 - Theme Color Set", ""}, + {5, "THEME05", 0, "05 - Theme Color Set", ""}, + {6, "THEME06", 0, "06 - Theme Color Set", ""}, + {7, "THEME07", 0, "07 - Theme Color Set", ""}, + {8, "THEME08", 0, "08 - Theme Color Set", ""}, + {9, "THEME09", 0, "09 - Theme Color Set", ""}, + {10, "THEME10", 0, "10 - Theme Color Set", ""}, + {11, "THEME11", 0, "11 - Theme Color Set", ""}, + {12, "THEME12", 0, "12 - Theme Color Set", ""}, + {13, "THEME13", 0, "13 - Theme Color Set", ""}, + {14, "THEME14", 0, "14 - Theme Color Set", ""}, + {15, "THEME15", 0, "15 - Theme Color Set", ""}, + {16, "THEME16", 0, "16 - Theme Color Set", ""}, + {17, "THEME17", 0, "17 - Theme Color Set", ""}, + {18, "THEME18", 0, "18 - Theme Color Set", ""}, + {19, "THEME19", 0, "19 - Theme Color Set", ""}, + {20, "THEME20", 0, "20 - Theme Color Set", ""}, + {-1, "CUSTOM", 0, "Custom Color Set", ""}, + {0, NULL, 0, NULL, NULL} +}; + #ifdef RNA_RUNTIME #include "BIK_api.h" @@ -107,7 +134,8 @@ static char *rna_PoseBone_path(PointerRNA *ptr) return BLI_sprintfN("pose.bones[\"%s\"]", ((bPoseChannel *)ptr->data)->name); } -static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value) +/* shared for actions groups and bone groups */ +void rna_ActionGroup_colorset_set(PointerRNA *ptr, int value) { bActionGroup *grp = ptr->data; @@ -622,34 +650,31 @@ static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values) #else +/* common properties for Action/Bone Groups - related to color */ +void rna_def_actionbone_group_common(StructRNA *srna, int update_flag, const char *update_cb) +{ + PropertyRNA *prop; + + /* color set + colors */ + prop = RNA_def_property(srna, "color_set", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "customCol"); + RNA_def_property_enum_items(prop, color_sets_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_ActionGroup_colorset_set", NULL); + RNA_def_property_ui_text(prop, "Color Set", "Custom color set to use"); + RNA_def_property_update(prop, update_flag, update_cb); + + /* TODO: editing the colors for this should result in changes to the color type... */ + prop = RNA_def_property(srna, "colors", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_struct_type(prop, "ThemeBoneColorSet"); + /* NOTE: the DNA data is not really a pointer, but this code works :) */ + RNA_def_property_pointer_sdna(prop, NULL, "cs"); + RNA_def_property_ui_text(prop, "Colors", "Copy of the colors associated with the group's color set"); + RNA_def_property_update(prop, update_flag, update_cb); +} + static void rna_def_bone_group(BlenderRNA *brna) { - static EnumPropertyItem prop_colorSets_items[] = { - {0, "DEFAULT", 0, "Default Colors", ""}, - {1, "THEME01", 0, "01 - Theme Color Set", ""}, - {2, "THEME02", 0, "02 - Theme Color Set", ""}, - {3, "THEME03", 0, "03 - Theme Color Set", ""}, - {4, "THEME04", 0, "04 - Theme Color Set", ""}, - {5, "THEME05", 0, "05 - Theme Color Set", ""}, - {6, "THEME06", 0, "06 - Theme Color Set", ""}, - {7, "THEME07", 0, "07 - Theme Color Set", ""}, - {8, "THEME08", 0, "08 - Theme Color Set", ""}, - {9, "THEME09", 0, "09 - Theme Color Set", ""}, - {10, "THEME10", 0, "10 - Theme Color Set", ""}, - {11, "THEME11", 0, "11 - Theme Color Set", ""}, - {12, "THEME12", 0, "12 - Theme Color Set", ""}, - {13, "THEME13", 0, "13 - Theme Color Set", ""}, - {14, "THEME14", 0, "14 - Theme Color Set", ""}, - {15, "THEME15", 0, "15 - Theme Color Set", ""}, - {16, "THEME16", 0, "16 - Theme Color Set", ""}, - {17, "THEME17", 0, "17 - Theme Color Set", ""}, - {18, "THEME18", 0, "18 - Theme Color Set", ""}, - {19, "THEME19", 0, "19 - Theme Color Set", ""}, - {20, "THEME20", 0, "20 - Theme Color Set", ""}, - {-1, "CUSTOM", 0, "Custom Color Set", ""}, - {0, NULL, 0, NULL, NULL} - }; - StructRNA *srna; PropertyRNA *prop; @@ -667,22 +692,8 @@ static void rna_def_bone_group(BlenderRNA *brna) /* TODO: add some runtime-collections stuff to access grouped bones */ - /* color set + colors */ - prop = RNA_def_property(srna, "color_set", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "customCol"); - RNA_def_property_enum_items(prop, prop_colorSets_items); - RNA_def_property_enum_funcs(prop, NULL, "rna_BoneGroup_color_set_set", NULL); - RNA_def_property_ui_text(prop, "Color Set", "Custom color set to use"); - RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update"); - - /* TODO: editing the colors for this should result in changes to the color type... */ - prop = RNA_def_property(srna, "colors", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_NEVER_NULL); - RNA_def_property_struct_type(prop, "ThemeBoneColorSet"); - /* NOTE: the DNA data is not really a pointer, but this code works :) */ - RNA_def_property_pointer_sdna(prop, NULL, "cs"); - RNA_def_property_ui_text(prop, "Colors", "Copy of the colors associated with the group's color set"); - RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update"); + /* color set */ + rna_def_actionbone_group_common(srna, NC_OBJECT | ND_POSE, "rna_Pose_update"); } static EnumPropertyItem prop_iksolver_items[] = { diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 0e2fc6e8f11..e4d380ef48c 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -2262,6 +2262,12 @@ static void rna_def_space_dopesheet(BlenderRNA *brna) "(Action and Shape Key Editors only)"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, NULL); + prop = RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NODRAWGCOLORS); + RNA_def_property_ui_text(prop, "Show Group Colors", + "Draw groups and channels with colours matching their corresponding groups"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, NULL); + /* editing */ prop = RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOTRANSKEYCULL); @@ -2367,6 +2373,12 @@ static void rna_def_space_graph(BlenderRNA *brna) "(disable for better performance)"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL); + prop = RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NODRAWGCOLORS); + RNA_def_property_ui_text(prop, "Show Group Colors", + "Draw groups and channels with colours matching their corresponding groups"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL); + /* editing */ prop = RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOTRANSKEYCULL); From 8bce17877b30e10f4058048de7a107b40bb22f1e Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 24 May 2012 04:21:57 +0000 Subject: [PATCH 157/159] Code Cleanup - DNA_space_types.h - Replaced all #define-lists with enums * All lists of #defines now replaced with enums * All flags are now defined using the "(1 << x)" style, which is easier to read/maintain than the other variations --- source/blender/makesdna/DNA_space_types.h | 543 ++++++++++++---------- 1 file changed, 310 insertions(+), 233 deletions(-) diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 375258cb92b..f8081d78031 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -96,13 +96,13 @@ typedef struct SpaceInfo { } SpaceInfo; /* SpaceInfo.rpt_mask */ -enum { - INFO_RPT_DEBUG = 1<<0, - INFO_RPT_INFO = 1<<1, - INFO_RPT_OP = 1<<2, - INFO_RPT_WARN = 1<<3, - INFO_RPT_ERR = 1<<4, -}; +typedef enum eSpaceInfo_RptMask { + INFO_RPT_DEBUG = (1 << 0), + INFO_RPT_INFO = (1 << 1), + INFO_RPT_OP = (1 << 2), + INFO_RPT_WARN = (1 << 3), + INFO_RPT_ERR = (1 << 4), +} eSpaceInfo_RptMask; /* 'Graph' Editor (formerly known as the IPO Editor) */ typedef struct SpaceIpo { @@ -120,7 +120,7 @@ typedef struct SpaceIpo { short mode; /* mode for the Graph editor (eGraphEdit_Mode) */ short autosnap; /* time-transform autosnapping settings for Graph editor (eAnimEdit_AutoSnap in DNA_action_types.h) */ - int flag; /* settings for Graph editor */ + int flag; /* settings for Graph editor (eGraphEdit_Flag) */ float cursorVal; /* cursor value (y-value, x-value is current frame) */ int around; /* pivot point for transforms */ @@ -414,21 +414,28 @@ typedef struct SpaceNode { } SpaceNode; /* snode->flag */ -#define SNODE_BACKDRAW 2 -#define SNODE_DISPGP 4 -#define SNODE_USE_ALPHA 8 -#define SNODE_SHOW_ALPHA 16 -#define SNODE_AUTO_RENDER 32 +typedef enum eSpaceNode_Flag { + SNODE_BACKDRAW = (1 << 1), + SNODE_DISPGP = (1 << 2), /* XXX: Grease Pencil - deprecated? */ + SNODE_USE_ALPHA = (1 << 3), + SNODE_SHOW_ALPHA = (1 << 4), + SNODE_AUTO_RENDER = (1 << 5), +} eSpaceNode_Flag; /* snode->texfrom */ -#define SNODE_TEX_OBJECT 0 -#define SNODE_TEX_WORLD 1 -#define SNODE_TEX_BRUSH 2 +typedef enum eSpaceNode_TexFrom { + SNODE_TEX_OBJECT = 0, + SNODE_TEX_WORLD, + SNODE_TEX_BRUSH, +} eSpaceNode_TexFrom; /* snode->shaderfrom */ -#define SNODE_SHADER_OBJECT 0 -#define SNODE_SHADER_WORLD 1 +typedef enum eSpaceNode_ShaderFrom { + SNODE_SHADER_OBJECT = 0, + SNODE_SHADER_WORLD, +} eSpaceNode_ShaderFrom; +/* Logic Editor */ typedef struct SpaceLogic { SpaceLink *next, *prev; ListBase regionbase; /* storage of regions for inactive spaces */ @@ -456,12 +463,12 @@ typedef struct ConsoleLine { } ConsoleLine; /* ConsoleLine.type */ -enum { +typedef enum eConsoleLine_Type { CONSOLE_LINE_OUTPUT=0, CONSOLE_LINE_INPUT, CONSOLE_LINE_INFO, /* autocomp feedback */ CONSOLE_LINE_ERROR -}; +} eConsoleLine_Type; typedef struct SpaceConsole { SpaceLink *next, *prev; @@ -491,7 +498,6 @@ typedef struct SpaceUserPref { int pad; char filter[64]; /* search term for filtering in the UI */ - } SpaceUserPref; typedef struct SpaceClip { @@ -566,20 +572,24 @@ typedef struct SpaceClip { #define BUTS_EFFECTS 14 /* buts->mainb new */ -#define BCONTEXT_RENDER 0 -#define BCONTEXT_SCENE 1 -#define BCONTEXT_WORLD 2 -#define BCONTEXT_OBJECT 3 -#define BCONTEXT_DATA 4 -#define BCONTEXT_MATERIAL 5 -#define BCONTEXT_TEXTURE 6 -#define BCONTEXT_PARTICLE 7 -#define BCONTEXT_PHYSICS 8 -#define BCONTEXT_BONE 9 -#define BCONTEXT_MODIFIER 10 -#define BCONTEXT_CONSTRAINT 12 -#define BCONTEXT_BONE_CONSTRAINT 13 -#define BCONTEXT_TOT 14 +typedef enum eSpaceButtons_Context { + BCONTEXT_RENDER = 0, + BCONTEXT_SCENE, + BCONTEXT_WORLD, + BCONTEXT_OBJECT, + BCONTEXT_DATA, + BCONTEXT_MATERIAL, + BCONTEXT_TEXTURE, + BCONTEXT_PARTICLE, + BCONTEXT_PHYSICS, + BCONTEXT_BONE, + BCONTEXT_MODIFIER, + BCONTEXT_CONSTRAINT, + BCONTEXT_BONE_CONSTRAINT, + + /* always as last... */ + BCONTEXT_TOT +} eSpaceButtons_Context; /* sbuts->flag */ #define SB_PRV_OSA 1 @@ -589,16 +599,20 @@ typedef struct SpaceClip { #define SB_SHADING_CONTEXT 16 /* sbuts->texture_context */ -#define SB_TEXC_MAT_OR_LAMP 0 -#define SB_TEXC_WORLD 1 -#define SB_TEXC_BRUSH 2 -#define SB_TEXC_PARTICLES 3 +typedef enum eSpaceButtons_Texture_Context { + SB_TEXC_MAT_OR_LAMP = 0, + SB_TEXC_WORLD, + SB_TEXC_BRUSH, + SB_TEXC_PARTICLES, +} eSpaceButtons_Texture_Context; /* sbuts->align */ -#define BUT_FREE 0 -#define BUT_HORIZONTAL 1 -#define BUT_VERTICAL 2 -#define BUT_AUTO 3 +typedef enum eSpaceButtons_Align { + BUT_FREE = 0, + BUT_HORIZONTAL, + BUT_VERTICAL, + BUT_AUTO, +} eSpaceButtons_Align; /* sbuts->scaflag */ #define BUTS_SENS_SEL 1 @@ -647,127 +661,150 @@ enum FileSortTypeE { #define FILE_LOADLIB 1 #define FILE_MAIN 2 #define FILE_LOADFONT 3 + /* filesel op property -> action */ -#define FILE_OPENFILE 0 -#define FILE_SAVE 1 +typedef enum eFileSel_Action { + FILE_OPENFILE = 0, + FILE_SAVE, +} eFileSel_Action; /* sfile->params->flag and simasel->flag */ -#define FILE_SHOWSHORT (1<<0) -#define FILE_RELPATH (1<<1) /* was FILE_STRINGCODE */ -#define FILE_LINK (1<<2) -#define FILE_HIDE_DOT (1<<3) -#define FILE_AUTOSELECT (1<<4) -#define FILE_ACTIVELAY (1<<5) -/* #define FILE_ATCURSOR (1<<6) */ /* deprecated */ -#define FILE_DIRSEL_ONLY (1<<7) -#define FILE_FILTER (1<<8) -#define FILE_BOOKMARKS (1<<9) -#define FILE_GROUP_INSTANCE (1<<10) +typedef enum eFileSel_Params_Flag { + FILE_SHOWSHORT = (1 << 0), + FILE_RELPATH = (1 << 1), /* was FILE_STRINGCODE */ + FILE_LINK = (1 << 2), + FILE_HIDE_DOT = (1 << 3), + FILE_AUTOSELECT = (1 << 4), + FILE_ACTIVELAY = (1 << 5), +/* FILE_ATCURSOR = (1 << 6), */ /* deprecated */ + FILE_DIRSEL_ONLY = (1 << 7), + FILE_FILTER = (1 << 8), + FILE_BOOKMARKS = (1 << 9), + FILE_GROUP_INSTANCE = (1 << 10), +} eFileSel_Params_Flag; /* files in filesel list: file types */ -#define BLENDERFILE (1<<2) -#define BLENDERFILE_BACKUP (1<<3) -#define IMAGEFILE (1<<4) -#define MOVIEFILE (1<<5) -#define PYSCRIPTFILE (1<<6) -#define FTFONTFILE (1<<7) -#define SOUNDFILE (1<<8) -#define TEXTFILE (1<<9) -#define MOVIEFILE_ICON (1<<10) /* movie file that preview can't load */ -#define FOLDERFILE (1<<11) /* represents folders for filtering */ -#define BTXFILE (1<<12) -#define COLLADAFILE (1<<13) -#define OPERATORFILE (1<<14) /* from filter_glob operator property */ - +typedef enum eFileSel_File_Types { + BLENDERFILE = (1 << 2), + BLENDERFILE_BACKUP = (1 << 3), + IMAGEFILE = (1 << 4), + MOVIEFILE = (1 << 5), + PYSCRIPTFILE = (1 << 6), + FTFONTFILE = (1 << 7), + SOUNDFILE = (1 << 8), + TEXTFILE = (1 << 9), + MOVIEFILE_ICON = (1 << 10), /* movie file that preview can't load */ + FOLDERFILE = (1 << 11), /* represents folders for filtering */ + BTXFILE = (1 << 12), + COLLADAFILE = (1 << 13), + OPERATORFILE = (1 << 14), /* from filter_glob operator property */ +} eFileSel_File_Types; /* Selection Flags in filesel: struct direntry, unsigned char selflag */ -/* #define ACTIVE_FILE (1<<1) */ /* UNUSED */ -#define HILITED_FILE (1<<2) -#define SELECTED_FILE (1<<3) -#define EDITING_FILE (1<<4) +typedef enum eDirEntry_SelectFlag { +/* ACTIVE_FILE = (1 << 1), */ /* UNUSED */ + HILITED_FILE = (1 << 2), + SELECTED_FILE = (1 << 3), + EDITING_FILE = (1 << 4), +} eDirEntry_SelectFlag; /* SpaceImage->dt_uv */ -#define SI_UVDT_OUTLINE 0 -#define SI_UVDT_DASH 1 -#define SI_UVDT_BLACK 2 -#define SI_UVDT_WHITE 3 +typedef enum eSpaceImage_UVDT { + SI_UVDT_OUTLINE = 0, + SI_UVDT_DASH, + SI_UVDT_BLACK, + SI_UVDT_WHITE, +} eSpaceImage_UVDT; /* SpaceImage->dt_uvstretch */ -#define SI_UVDT_STRETCH_ANGLE 0 -#define SI_UVDT_STRETCH_AREA 1 +typedef enum eSpaceImage_UVDT_Stretch { + SI_UVDT_STRETCH_ANGLE = 0, + SI_UVDT_STRETCH_AREA, +} eSpaceImage_UVDT_Stretch; /* SpaceImage->sticky * Note DISABLE should be 0, however would also need to re-arrange icon order, * also, sticky loc is the default mode so this means we don't need to 'do_versons' */ -#define SI_STICKY_LOC 0 -#define SI_STICKY_DISABLE 1 -#define SI_STICKY_VERTEX 2 +typedef enum eSpaceImage_Sticky { + SI_STICKY_LOC = 0, + SI_STICKY_DISABLE = 1, + SI_STICKY_VERTEX = 2, +} eSpaceImage_Sticky; /* SpaceImage->flag */ -#define SI_BE_SQUARE (1<<0) -#define SI_EDITTILE (1<<1) -#define SI_CLIP_UV (1<<2) -#define SI_DRAWTOOL (1<<3) -#define SI_NO_DRAWFACES (1<<4) -#define SI_DRAWSHADOW (1<<5) -/* #define SI_SELACTFACE (1<<6) */ /* deprecated */ -#define SI_DEPRECATED2 (1<<7) -#define SI_DEPRECATED3 (1<<8) /* stick UV selection to mesh vertex (UVs wont always be touching) */ -#define SI_COORDFLOATS (1<<9) -#define SI_PIXELSNAP (1<<10) -#define SI_LIVE_UNWRAP (1<<11) -#define SI_USE_ALPHA (1<<12) -#define SI_SHOW_ALPHA (1<<13) -#define SI_SHOW_ZBUF (1<<14) - /* next two for render window dislay */ -#define SI_PREVSPACE (1<<15) -#define SI_FULLWINDOW (1<<16) -#define SI_DEPRECATED4 (1<<17) -#define SI_DEPRECATED5 (1<<18) +typedef enum eSpaceImage_Flag { + SI_BE_SQUARE = (1 << 0), + SI_EDITTILE = (1 << 1), + SI_CLIP_UV = (1 << 2), + SI_DRAWTOOL = (1 << 3), + SI_NO_DRAWFACES = (1 << 4), + SI_DRAWSHADOW = (1 << 5), +/* SI_SELACTFACE = (1 << 6), */ /* deprecated */ + SI_DEPRECATED2 = (1 << 7), + SI_DEPRECATED3 = (1 << 8), /* stick UV selection to mesh vertex (UVs wont always be touching) */ + SI_COORDFLOATS = (1 << 9), + SI_PIXELSNAP = (1 << 10), + SI_LIVE_UNWRAP = (1 << 11), + SI_USE_ALPHA = (1 << 12), + SI_SHOW_ALPHA = (1 << 13), + SI_SHOW_ZBUF = (1 << 14), + + /* next two for render window display */ + SI_PREVSPACE = (1 << 15), + SI_FULLWINDOW = (1 << 16), + + SI_DEPRECATED4 = (1 << 17), + SI_DEPRECATED5 = (1 << 18), + /* this means that the image is drawn until it reaches the view edge, - * in the image view, its unrelated to the 'tile' mode for texface */ -#define SI_DRAW_TILE (1<<19) -#define SI_SMOOTH_UV (1<<20) -#define SI_DRAW_STRETCH (1<<21) -#define SI_DISPGP (1<<22) -#define SI_DRAW_OTHER (1<<23) + * in the image view, its unrelated to the 'tile' mode for texface + */ + SI_DRAW_TILE = (1 << 19), + SI_SMOOTH_UV = (1 << 20), + SI_DRAW_STRETCH = (1 << 21), + SI_DISPGP = (1 << 22), /* DEPRECATED */ + SI_DRAW_OTHER = (1 << 23), -#define SI_COLOR_CORRECTION (1<<24) + SI_COLOR_CORRECTION = (1 << 24), +} eSpaceImage_Flag; /* SpaceIpo->flag (Graph Editor Settings) */ +typedef enum eGraphEdit_Flag { /* OLD DEPRECEATED SETTING */ -#define SIPO_LOCK_VIEW (1<<0) + /* SIPO_LOCK_VIEW = (1 << 0), */ + /* don't merge keyframes on the same frame after a transform */ -#define SIPO_NOTRANSKEYCULL (1<<1) + SIPO_NOTRANSKEYCULL = (1 << 1), /* don't show any keyframe handles at all */ -#define SIPO_NOHANDLES (1<<2) + SIPO_NOHANDLES = (1 << 2), /* don't show current frame number beside indicator line */ -#define SIPO_NODRAWCFRANUM (1<<3) + SIPO_NODRAWCFRANUM = (1 << 3), /* show timing in seconds instead of frames */ -#define SIPO_DRAWTIME (1<<4) + SIPO_DRAWTIME = (1 << 4), /* only show keyframes for selected F-Curves */ -#define SIPO_SELCUVERTSONLY (1<<5) + SIPO_SELCUVERTSONLY = (1 << 5), /* draw names of F-Curves beside the respective curves */ /* NOTE: currently not used */ -#define SIPO_DRAWNAMES (1<<6) + SIPO_DRAWNAMES = (1 << 6), /* show sliders in channels list */ -#define SIPO_SLIDERS (1<<7) + SIPO_SLIDERS = (1 << 7), /* don't show the horizontal component of the cursor */ -#define SIPO_NODRAWCURSOR (1<<8) + SIPO_NODRAWCURSOR = (1 << 8), /* only show handles of selected keyframes */ -#define SIPO_SELVHANDLESONLY (1<<9) + SIPO_SELVHANDLESONLY = (1 << 9), /* temporary flag to force channel selections to be synced with main */ -#define SIPO_TEMP_NEEDCHANSYNC (1<<10) + SIPO_TEMP_NEEDCHANSYNC = (1 << 10), /* don't perform realtime updates */ -#define SIPO_NOREALTIMEUPDATES (1<<11) + SIPO_NOREALTIMEUPDATES = (1 << 11), /* don't draw curves with AA ("beauty-draw") for performance */ -#define SIPO_BEAUTYDRAW_OFF (1<<12) + SIPO_BEAUTYDRAW_OFF = (1 << 12), /* draw grouped channels with colors set in group */ -#define SIPO_NODRAWGCOLORS (1<<13) + SIPO_NODRAWGCOLORS = (1 << 13), +} eGraphEdit_Flag; /* SpaceIpo->mode (Graph Editor Mode) */ -enum { +typedef enum eGraphEdit_Mode { /* all animation curves (from all over Blender) */ SIPO_MODE_ANIMATION = 0, /* drivers only */ @@ -775,50 +812,62 @@ enum { } eGraphEdit_Mode; /* SpaceText flags (moved from DNA_text_types.h) */ - -#define ST_SCROLL_SELECT 0x0001 // scrollable -#define ST_CLEAR_NAMESPACE 0x0010 // clear namespace after script - // execution (see BPY_main.c) -#define ST_FIND_WRAP 0x0020 -#define ST_FIND_ALL 0x0040 -#define ST_SHOW_MARGIN 0x0080 -#define ST_MATCH_CASE 0x0100 - +typedef enum eSpaceText_Flags { + /* scrollable */ + ST_SCROLL_SELECT = (1 << 0), + /* clear namespace after script execution (BPY_main.c) */ + ST_CLEAR_NAMESPACE = (1 << 4), + + ST_FIND_WRAP = (1 << 5), + ST_FIND_ALL = (1 << 6), + ST_SHOW_MARGIN = (1 << 7), + ST_MATCH_CASE = (1 << 8), +} eSpaceText_Flags; /* stext->findstr/replacestr */ #define ST_MAX_FIND_STR 256 + /* SpaceOops->flag */ -#define SO_TESTBLOCKS 1 -#define SO_NEWSELECTED 2 -#define SO_HIDE_RESTRICTCOLS 4 -#define SO_HIDE_KEYINGSETINFO 8 +typedef enum eSpaceOutliner_Flag { + SO_TESTBLOCKS = (1 << 0), + SO_NEWSELECTED = (1 << 1), + SO_HIDE_RESTRICTCOLS = (1 << 2), + SO_HIDE_KEYINGSETINFO = (1 << 3), +} eSpaceOutliner_Flag; /* SpaceOops->outlinevis */ -#define SO_ALL_SCENES 0 -#define SO_CUR_SCENE 1 -#define SO_VISIBLE 2 -#define SO_SELECTED 3 -#define SO_ACTIVE 4 -#define SO_SAME_TYPE 5 -#define SO_GROUPS 6 -#define SO_LIBRARIES 7 -#define SO_VERSE_SESSION 8 -#define SO_VERSE_MS 9 -#define SO_SEQUENCE 10 -#define SO_DATABLOCKS 11 -#define SO_USERDEF 12 -#define SO_KEYMAP 13 +typedef enum eSpaceOutliner_Mode { + SO_ALL_SCENES = 0, + SO_CUR_SCENE, + SO_VISIBLE, + SO_SELECTED, + SO_ACTIVE, + SO_SAME_TYPE, + SO_GROUPS, + SO_LIBRARIES, + SO_VERSE_SESSION, + SO_VERSE_MS, + SO_SEQUENCE, + SO_DATABLOCKS, + SO_USERDEF, + SO_KEYMAP, +} eSpaceOutliner_Mode; /* SpaceOops->storeflag */ -#define SO_TREESTORE_CLEANUP 1 +typedef enum eSpaceOutliner_StoreFlag { + /* rebuild tree */ + SO_TREESTORE_CLEANUP = (1 << 0), /* if set, it allows redraws. gets set for some allqueue events */ -#define SO_TREESTORE_REDRAW 2 + SO_TREESTORE_REDRAW = (1 << 1), +} eSpaceOutliner_StoreFlag; /* 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) +typedef enum eSpaceOutliner_Search_Flags { + SO_FIND_CASE_SENSITIVE = (1 << 0), + SO_FIND_COMPLETE = (1 << 1), + SO_SEARCH_RECURSIVE = (1 << 2), +} eSpaceOutliner_Search_Flags; /* headerbuttons: 450-499 */ @@ -826,115 +875,142 @@ enum { #define B_IMASELREMOVEBIP 452 /* nla->flag */ -/* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old blenders */ +typedef enum eSpaceNla_Flag { + /* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old verisons */ + /* draw timing in seconds instead of frames */ -#define SNLA_DRAWTIME (1<<2) + SNLA_DRAWTIME = (1 << 2), /* don't draw frame number beside frame indicator */ -#define SNLA_NODRAWCFRANUM (1<<4) + SNLA_NODRAWCFRANUM = (1 << 4), /* don't draw influence curves on strips */ -#define SNLA_NOSTRIPCURVES (1<<5) + SNLA_NOSTRIPCURVES = (1 << 5), /* don't perform realtime updates */ -#define SNLA_NOREALTIMEUPDATES (1<<6) + SNLA_NOREALTIMEUPDATES = (1 << 6), +} eSpaceNla_Flag; /* time->flag */ +typedef enum eTimeline_Flag { /* show timing in frames instead of in seconds */ -#define TIME_DRAWFRAMES 1 + TIME_DRAWFRAMES = (1 << 0), /* show time indicator box beside the frame number */ -#define TIME_CFRA_NUM 2 + TIME_CFRA_NUM = (1 << 1), /* only keyframes from active/selected channels get shown */ -#define TIME_ONLYACTSEL 4 + TIME_ONLYACTSEL = (1 << 2), +} eTimeline_Flag; /* time->redraws (now screen->redraws_flag) */ -#define TIME_REGION 1 -#define TIME_ALL_3D_WIN 2 -#define TIME_ALL_ANIM_WIN 4 -#define TIME_ALL_BUTS_WIN 8 -#define TIME_WITH_SEQ_AUDIO 16 // deprecated -#define TIME_SEQ 32 -#define TIME_ALL_IMAGE_WIN 64 -#define TIME_CONTINUE_PHYSICS 128 -#define TIME_NODES 256 -#define TIME_CLIPS 512 +typedef enum eScreen_Redraws_Flag { + TIME_REGION = (1 << 0), + TIME_ALL_3D_WIN = (1 << 1), + TIME_ALL_ANIM_WIN = (1 << 2), + TIME_ALL_BUTS_WIN = (1 << 3), + TIME_WITH_SEQ_AUDIO = (1 << 4), /* DEPRECATED */ + TIME_SEQ = (1 << 5), + TIME_ALL_IMAGE_WIN = (1 << 6), + TIME_CONTINUE_PHYSICS = (1 << 7), + TIME_NODES = (1 << 8), + TIME_CLIPS = (1 << 9), +} eScreen_Redraws_Flag; /* time->cache */ -#define TIME_CACHE_DISPLAY 1 -#define TIME_CACHE_SOFTBODY 2 -#define TIME_CACHE_PARTICLES 4 -#define TIME_CACHE_CLOTH 8 -#define TIME_CACHE_SMOKE 16 -#define TIME_CACHE_DYNAMICPAINT 32 +typedef enum eTimeline_Cache_Flag { + TIME_CACHE_DISPLAY = (1 << 0), + TIME_CACHE_SOFTBODY = (1 << 1), + TIME_CACHE_PARTICLES = (1 << 2), + TIME_CACHE_CLOTH = (1 << 3), + TIME_CACHE_SMOKE = (1 << 4), + TIME_CACHE_DYNAMICPAINT = (1 << 5), +} eTimeline_Cache_Flag; /* sseq->mainb */ -#define SEQ_DRAW_SEQUENCE 0 -#define SEQ_DRAW_IMG_IMBUF 1 -#define SEQ_DRAW_IMG_WAVEFORM 2 -#define SEQ_DRAW_IMG_VECTORSCOPE 3 -#define SEQ_DRAW_IMG_HISTOGRAM 4 +typedef enum eSpaceSeq_RegionType { + SEQ_DRAW_SEQUENCE = 0, + SEQ_DRAW_IMG_IMBUF, + SEQ_DRAW_IMG_WAVEFORM, + SEQ_DRAW_IMG_VECTORSCOPE, + SEQ_DRAW_IMG_HISTOGRAM, +} eSpaceSeq_RegionType; /* sseq->flag */ -#define SEQ_DRAWFRAMES 1 -#define SEQ_MARKER_TRANS 2 -#define SEQ_DRAW_COLOR_SEPARATED 4 -#define SEQ_DRAW_SAFE_MARGINS 8 -#define SEQ_DRAW_GPENCIL 16 -#define SEQ_NO_DRAW_CFRANUM 32 +typedef enum eSpaceSeq_Flag { + SEQ_DRAWFRAMES = (1 << 0), + SEQ_MARKER_TRANS = (1 << 1), + SEQ_DRAW_COLOR_SEPARATED = (1 << 2), + SEQ_DRAW_SAFE_MARGINS = (1 << 3), + SEQ_DRAW_GPENCIL = (1 << 4), /* DEPRECATED */ + SEQ_NO_DRAW_CFRANUM = (1 << 5), +} eSpaceSeq_Flag; /* sseq->view */ -#define SEQ_VIEW_SEQUENCE 1 -#define SEQ_VIEW_PREVIEW 2 -#define SEQ_VIEW_SEQUENCE_PREVIEW 3 +typedef enum eSpaceSeq_Displays { + SEQ_VIEW_SEQUENCE = 1, + SEQ_VIEW_PREVIEW, + SEQ_VIEW_SEQUENCE_PREVIEW, +} eSpaceSeq_Dispays; /* sseq->render_size */ -#define SEQ_PROXY_RENDER_SIZE_NONE -1 -#define SEQ_PROXY_RENDER_SIZE_SCENE 0 -#define SEQ_PROXY_RENDER_SIZE_25 25 -#define SEQ_PROXY_RENDER_SIZE_50 50 -#define SEQ_PROXY_RENDER_SIZE_75 75 -#define SEQ_PROXY_RENDER_SIZE_100 99 -#define SEQ_PROXY_RENDER_SIZE_FULL 100 +typedef enum eSpaceSeq_Proxy_RenderSize { + SEQ_PROXY_RENDER_SIZE_NONE = -1, + SEQ_PROXY_RENDER_SIZE_SCENE = 0, + SEQ_PROXY_RENDER_SIZE_25 = 25, + SEQ_PROXY_RENDER_SIZE_50 = 50, + SEQ_PROXY_RENDER_SIZE_75 = 75, + SEQ_PROXY_RENDER_SIZE_100 = 99, + SEQ_PROXY_RENDER_SIZE_FULL = 100 +} eSpaceSeq_Proxy_RenderSize; /* SpaceClip->flag */ -#define SC_SHOW_MARKER_PATTERN (1<<0) -#define SC_SHOW_MARKER_SEARCH (1<<1) -#define SC_LOCK_SELECTION (1<<2) -#define SC_SHOW_TINY_MARKER (1<<3) -#define SC_SHOW_TRACK_PATH (1<<4) -#define SC_SHOW_BUNDLES (1<<5) -#define SC_MUTE_FOOTAGE (1<<6) -#define SC_HIDE_DISABLED (1<<7) -#define SC_SHOW_NAMES (1<<8) -#define SC_SHOW_GRID (1<<9) -#define SC_SHOW_STABLE (1<<10) -#define SC_MANUAL_CALIBRATION (1<<11) -/*#define SC_SHOW_GPENCIL (1<<12)*/ /* UNUSED */ -#define SC_SHOW_FILTERS (1<<13) -#define SC_SHOW_GRAPH_FRAMES (1<<14) -#define SC_SHOW_GRAPH_TRACKS (1<<15) -/*#define SC_SHOW_PYRAMID_LEVELS (1<<16) */ /* UNUSED */ -#define SC_LOCK_TIMECURSOR (1<<17) -#define SC_SHOW_SECONDS (1<<18) +typedef enum eSpaceClip_Flag { + SC_SHOW_MARKER_PATTERN = (1 << 0), + SC_SHOW_MARKER_SEARCH = (1 << 1), + SC_LOCK_SELECTION = (1 << 2), + SC_SHOW_TINY_MARKER = (1 << 3), + SC_SHOW_TRACK_PATH = (1 << 4), + SC_SHOW_BUNDLES = (1 << 5), + SC_MUTE_FOOTAGE = (1 << 6), + SC_HIDE_DISABLED = (1 << 7), + SC_SHOW_NAMES = (1 << 8), + SC_SHOW_GRID = (1 << 9), + SC_SHOW_STABLE = (1 << 10), + SC_MANUAL_CALIBRATION = (1 << 11), +/* SC_SHOW_GPENCIL = (1 << 12),*/ /* UNUSED */ + SC_SHOW_FILTERS = (1 << 13), + SC_SHOW_GRAPH_FRAMES = (1 << 14), + SC_SHOW_GRAPH_TRACKS = (1 << 15), +/* SC_SHOW_PYRAMID_LEVELS = (1 << 16), */ /* UNUSED */ + SC_LOCK_TIMECURSOR = (1 << 17), + SC_SHOW_SECONDS = (1 << 18), +} eSpaceClip_Flag; /* SpaceClip->mode */ -#define SC_MODE_TRACKING 0 -#define SC_MODE_RECONSTRUCTION 1 -#define SC_MODE_DISTORTION 2 +typedef enum eSpaceClip_Mode { + SC_MODE_TRACKING = 0, + SC_MODE_RECONSTRUCTION, + SC_MODE_DISTORTION, +} eSpaceClip_Mode; /* SpaceClip->view */ -#define SC_VIEW_CLIP 0 -#define SC_VIEW_GRAPH 1 -#define SC_VIEW_DOPESHEET 2 +typedef enum eSpaceClip_View { + SC_VIEW_CLIP = 0, + SC_VIEW_GRAPH, + SC_VIEW_DOPESHEET, +} eSpaceClip_View; /* SpaceClip->dope_sort */ -#define SC_DOPE_SORT_NAME 0 -#define SC_DOPE_SORT_LONGEST 1 -#define SC_DOPE_SORT_TOTAL 2 +typedef enum eSpaceClip_Dopesheet_Sort { + SC_DOPE_SORT_NAME = 0, + SC_DOPE_SORT_LONGEST, + SC_DOPE_SORT_TOTAL, +} eSpaceClip_Dopesheet_Sort; /* SpaceClip->dope_flag */ -#define SC_DOPE_SORT_INVERSE 1 +typedef enum eSpaceClip_Dopesheet_Flag { + SC_DOPE_SORT_INVERSE = (1 << 0), +} eSpaceClip_Dopesheet_Flag; /* space types, moved from DNA_screen_types.h */ /* Do NOT change order, append on end. types are hardcoded needed */ -enum { +typedef enum eSpace_Type { SPACE_EMPTY, SPACE_VIEW3D, SPACE_IPO, @@ -956,7 +1032,8 @@ enum { SPACE_CONSOLE, SPACE_USERPREF, SPACE_CLIP, + SPACEICONMAX = SPACE_CLIP -}; +} eSpace_Type; #endif From c52a85fa7b1c16fa086aba8e81c69f21ba79259c Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 24 May 2012 04:46:01 +0000 Subject: [PATCH 158/159] Code Cleanup - DNA_space_types.h - Part 2 - Rearranging Stuff * Moved all enums to immediately follow the struct(s) that they are used for/by. Less jumping around the file to find these * Reshuffled the order of a few structs/editor groupings. For example, now all animation editors are grouped together, and most general/property editors are grouped together. --- source/blender/makesdna/DNA_space_types.h | 1211 +++++++++++---------- 1 file changed, 634 insertions(+), 577 deletions(-) diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index f8081d78031..8f3062655b7 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -68,12 +68,14 @@ struct wmTimer; struct MovieClip; struct MovieClipScopes; - /** - * The base structure all the other spaces - * are derived (implicitly) from. Would be - * good to make this explicit. - */ +/* SpaceLink (Base) ==================================== */ + +/** + * The base structure all the other spaces + * are derived (implicitly) from. Would be + * good to make this explicit. + */ typedef struct SpaceLink { struct SpaceLink *next, *prev; ListBase regionbase; /* storage of regions for inactive spaces */ @@ -82,17 +84,19 @@ typedef struct SpaceLink { short blockhandler[8] DNA_DEPRECATED; /* XXX make deprecated */ } SpaceLink; + +/* Space Info ========================================== */ + +/* Info Header */ typedef struct SpaceInfo { SpaceLink *next, *prev; ListBase regionbase; /* storage of regions for inactive spaces */ int spacetype; float blockscale DNA_DEPRECATED; - short blockhandler[8] DNA_DEPRECATED; /* XXX make deprecated */ char rpt_mask; char pad[7]; - } SpaceInfo; /* SpaceInfo.rpt_mask */ @@ -104,28 +108,10 @@ typedef enum eSpaceInfo_RptMask { INFO_RPT_ERR = (1 << 4), } eSpaceInfo_RptMask; -/* 'Graph' Editor (formerly known as the IPO Editor) */ -typedef struct SpaceIpo { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - short blockhandler[8] DNA_DEPRECATED; - View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ - - struct bDopeSheet *ads; /* settings for filtering animation data (NOTE: we use a pointer due to code-linking issues) */ - - ListBase ghostCurves; /* sampled snapshots of F-Curves used as in-session guides */ - - short mode; /* mode for the Graph editor (eGraphEdit_Mode) */ - short autosnap; /* time-transform autosnapping settings for Graph editor (eAnimEdit_AutoSnap in DNA_action_types.h) */ - int flag; /* settings for Graph editor (eGraphEdit_Flag) */ - - float cursorVal; /* cursor value (y-value, x-value is current frame) */ - int around; /* pivot point for transforms */ -} SpaceIpo; +/* Properties Editor ==================================== */ +/* Properties Editor */ typedef struct SpaceButs { SpaceLink *next, *prev; ListBase regionbase; /* storage of regions for inactive spaces */ @@ -149,400 +135,6 @@ typedef struct SpaceButs { void *texuser; } SpaceButs; -typedef struct SpaceSeq { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - short blockhandler[8] DNA_DEPRECATED; - - View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ - - float xof DNA_DEPRECATED, yof DNA_DEPRECATED; /* deprecated: offset for drawing the image preview */ - short mainb; /* weird name for the sequencer subtype (seq, image, luma... etc) */ - short render_size; - short chanshown; - short zebra; - int flag; - float zoom DNA_DEPRECATED; /* deprecated, handled by View2D now */ - int view; /* see SEQ_VIEW_* below */ - int pad; - - struct bGPdata *gpd; /* grease-pencil data */ -} SpaceSeq; - -typedef struct FileSelectParams { - char title[32]; /* title, also used for the text of the execute button */ - char dir[1056]; /* directory, FILE_MAX_LIBEXTRA, 1024 + 32, this is for extreme case when 1023 length path - * needs to be linked in, where foo.blend/Armature need adding */ - char file[256]; /* file */ - char renamefile[256]; - char renameedit[256]; /* annoying but the first is only used for initialization */ - - char filter_glob[64]; /* list of filetypes to filter */ - - int active_file; - int sel_first; - int sel_last; - - /* short */ - short type; /* XXXXX for now store type here, should be moved to the operator */ - short flag; /* settings for filter, hiding dots files,... */ - short sort; /* sort order */ - short display; /* display mode flag */ - short filter; /* filter when (flags & FILE_FILTER) is true */ - - /* XXX --- still unused -- */ - short f_fp; /* show font preview */ - char fp_str[8]; /* string to use for font preview */ - - /* XXX --- end unused -- */ -} FileSelectParams; - - -typedef struct SpaceFile { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - int scroll_offset; - - struct FileSelectParams *params; /* config and input for file select */ - - struct FileList *files; /* holds the list of files to show */ - - ListBase *folders_prev; /* holds the list of previous directories to show */ - ListBase *folders_next; /* holds the list of next directories (pushed from previous) to show */ - - /* operator that is invoking fileselect - * op->exec() will be called on the 'Load' button. - * if operator provides op->cancel(), then this will be invoked - * on the cancel button. - */ - struct wmOperator *op; - - struct wmTimer *smoothscroll_timer; - - struct FileLayout *layout; - - short recentnr, bookmarknr; - short systemnr, pad2; -} SpaceFile; - -typedef struct SpaceOops { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - short blockhandler[8] DNA_DEPRECATED; - - View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ - - ListBase tree; - struct TreeStore *treestore; - - /* search stuff */ - char search_string[32]; - struct TreeStoreElem search_tse; - - short flag, outlinevis, storeflag, search_flags; -} SpaceOops; - -typedef struct SpaceImage { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - - int flag; - - struct Image *image; - struct ImageUser iuser; - struct CurveMapping *cumap; - - struct Scopes scopes; /* histogram waveform and vectorscope */ - struct Histogram sample_line_hist; /* sample line histogram */ - - struct bGPdata *gpd; /* grease pencil data */ - - float cursor[2]; /* UV editor 2d cursor */ - float xof, yof; /* user defined offset, image is centered */ - float zoom; /* user defined zoom level */ - float centx, centy; /* storage for offset while render drawing */ - - short curtile; /* the currently active tile of the image when tile is enabled, is kept in sync with the active faces tile */ - short pad; - short lock; - short pin; - char dt_uv; /* UV draw type */ - char sticky; /* sticky selection type */ - char dt_uvstretch; - char around; -} SpaceImage; - -typedef struct SpaceNla { - struct SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - short blockhandler[8] DNA_DEPRECATED; - - short autosnap; /* this uses the same settings as autosnap for Action Editor */ - short flag; - int pad; - - struct bDopeSheet *ads; - View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ -} SpaceNla; - -typedef struct SpaceText { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - short blockhandler[8] DNA_DEPRECATED; - - struct Text *text; - - int top, viewlines; - short flags, menunr; - - short lheight; /* user preference */ - char cwidth, linenrs_tot; /* runtime computed, character width and the number of chars to use when showing line numbers */ - int left; - int showlinenrs; - int tabnumber; - - short showsyntax; - short line_hlight; - short overwrite; - short live_edit; /* run python while editing, evil */ - float pix_per_line; - - struct rcti txtscroll, txtbar; - - int wordwrap, doplugins; - - char findstr[256]; /* ST_MAX_FIND_STR */ - char replacestr[256]; /* ST_MAX_FIND_STR */ - - short margin_column; /* column number to show right margin at */ - char pad[6]; - - void *drawcache; /* cache for faster drawing */ -} SpaceText; - -typedef struct Script { - ID id; - - void *py_draw; - void *py_event; - void *py_button; - void *py_browsercallback; - void *py_globaldict; - - int flags, lastspace; - /* store the script file here so we can re-run it on loading blender, if "Enable Scripts" is on */ - char scriptname[1024]; /* 1024 = FILE_MAX */ - char scriptarg[256]; /* 1024 = FILE_MAX */ -} Script; -#define SCRIPT_SET_NULL(_script) _script->py_draw = _script->py_event = _script->py_button = _script->py_browsercallback = _script->py_globaldict = NULL; _script->flags = 0 - -typedef struct SpaceScript { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - struct Script *script; - - short flags, menunr; - int pad1; - - void *but_refs; -} SpaceScript; - -# /* Only store the data array in the cache to avoid constant reallocation. */ -# /* No need to store when saved. */ -typedef struct SpaceTimeCache { - struct SpaceTimeCache *next, *prev; - float *array; -} SpaceTimeCache; - -typedef struct SpaceTime { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ - - ListBase caches; - - int cache_display; - int flag; -} SpaceTime; - -typedef struct SpaceNode { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - short blockhandler[8] DNA_DEPRECATED; - - View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ - - struct ID *id, *from; /* context, no need to save in file? well... pinning... */ - short flag, pad1; /* menunr: browse id block in header */ - float aspect; - - float xof, yof; /* offset for drawing the backdrop */ - float zoom, padf; /* zoom for backdrop */ - float mx, my; /* mousepos for drawing socketless link */ - - struct bNodeTree *nodetree, *edittree; - int treetype; /* treetype: as same nodetree->type */ - short texfrom; /* texfrom object, world or brush */ - short shaderfrom; /* shader from object or world */ - short recalc; /* currently on 0/1, for auto compo */ - short pad[3]; - ListBase linkdrag; /* temporary data for modal linking operator */ - - struct bGPdata *gpd; /* grease-pencil data */ -} SpaceNode; - -/* snode->flag */ -typedef enum eSpaceNode_Flag { - SNODE_BACKDRAW = (1 << 1), - SNODE_DISPGP = (1 << 2), /* XXX: Grease Pencil - deprecated? */ - SNODE_USE_ALPHA = (1 << 3), - SNODE_SHOW_ALPHA = (1 << 4), - SNODE_AUTO_RENDER = (1 << 5), -} eSpaceNode_Flag; - -/* snode->texfrom */ -typedef enum eSpaceNode_TexFrom { - SNODE_TEX_OBJECT = 0, - SNODE_TEX_WORLD, - SNODE_TEX_BRUSH, -} eSpaceNode_TexFrom; - -/* snode->shaderfrom */ -typedef enum eSpaceNode_ShaderFrom { - SNODE_SHADER_OBJECT = 0, - SNODE_SHADER_WORLD, -} eSpaceNode_ShaderFrom; - -/* Logic Editor */ -typedef struct SpaceLogic { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; - - short blockhandler[8] DNA_DEPRECATED; - - short flag, scaflag; - int pad; - - struct bGPdata *gpd; /* grease-pencil data */ -} SpaceLogic; - -typedef struct ConsoleLine { - struct ConsoleLine *next, *prev; - - /* keep these 3 vars so as to share free, realloc funcs */ - int len_alloc; /* allocated length */ - int len; /* real len - strlen() */ - char *line; - - int cursor; - int type; /* only for use when in the 'scrollback' listbase */ -} ConsoleLine; - -/* ConsoleLine.type */ -typedef enum eConsoleLine_Type { - CONSOLE_LINE_OUTPUT=0, - CONSOLE_LINE_INPUT, - CONSOLE_LINE_INFO, /* autocomp feedback */ - CONSOLE_LINE_ERROR -} eConsoleLine_Type; - -typedef struct SpaceConsole { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - float blockscale DNA_DEPRECATED; // XXX are these needed? - - short blockhandler[8] DNA_DEPRECATED; // XXX are these needed? - - /* space vars */ - int lheight, pad; - - ListBase scrollback; /* ConsoleLine; output */ - ListBase history; /* ConsoleLine; command history, current edited line is the first */ - char prompt[256]; - char language[32]; /* multiple consoles are possible, not just python */ - - int sel_start; - int sel_end; -} SpaceConsole; - -typedef struct SpaceUserPref { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - - int pad; - - char filter[64]; /* search term for filtering in the UI */ -} SpaceUserPref; - -typedef struct SpaceClip { - SpaceLink *next, *prev; - ListBase regionbase; /* storage of regions for inactive spaces */ - int spacetype; - - float xof, yof; /* user defined offset, image is centered */ - float xlockof, ylockof; /* user defined offset from locked position */ - float zoom; /* user defined zoom level */ - - struct MovieClipUser user; /* user of clip */ - struct MovieClip *clip; /* clip data */ - struct MovieClipScopes scopes; /* different scoped displayed in space panels */ - - int flag; /* flags */ - short mode; /* editor mode (editing context being displayed) */ - short view; /* type of the clip editor view */ - - int path_length; /* length of displaying path, in frames */ - - /* current stabilization data */ - float loc[2], scale, angle; /* pre-composed stabilization data */ - int pad; - float stabmat[4][4], unistabmat[4][4]; /* current stabilization matrix and the same matrix in unified space, - * defined when drawing and used for mouse position calculation */ - - /* movie postprocessing */ - int postproc_flag, pad2; - - void *draw_context; - - /* dopesheet */ - short dope_sort; /* sort order in dopesheet view */ - short dope_flag; /* dopsheet view flags */ - - int pad3; -} SpaceClip; - -/* view3d Now in DNA_view3d_types.h */ - - - -/* **************** SPACE DEFINES ********************* */ - /* button defines (deprecated) */ /* warning: the values of these defines are used in sbuts->tabs[8] */ /* sbuts->mainb new */ @@ -628,6 +220,361 @@ typedef enum eSpaceButtons_Align { #define BUTS_ACT_STATE 1024 #define BUTS_CONT_INIT_STATE 2048 + +/* Outliner =============================================== */ + +/* Outliner */ +typedef struct SpaceOops { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + short blockhandler[8] DNA_DEPRECATED; + + View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ + + ListBase tree; + struct TreeStore *treestore; + + /* search stuff */ + char search_string[32]; + struct TreeStoreElem search_tse; + + short flag, outlinevis, storeflag, search_flags; +} SpaceOops; + + +/* SpaceOops->flag */ +typedef enum eSpaceOutliner_Flag { + SO_TESTBLOCKS = (1 << 0), + SO_NEWSELECTED = (1 << 1), + SO_HIDE_RESTRICTCOLS = (1 << 2), + SO_HIDE_KEYINGSETINFO = (1 << 3), +} eSpaceOutliner_Flag; + +/* SpaceOops->outlinevis */ +typedef enum eSpaceOutliner_Mode { + SO_ALL_SCENES = 0, + SO_CUR_SCENE, + SO_VISIBLE, + SO_SELECTED, + SO_ACTIVE, + SO_SAME_TYPE, + SO_GROUPS, + SO_LIBRARIES, + SO_VERSE_SESSION, + SO_VERSE_MS, + SO_SEQUENCE, + SO_DATABLOCKS, + SO_USERDEF, + SO_KEYMAP, +} eSpaceOutliner_Mode; + +/* SpaceOops->storeflag */ +typedef enum eSpaceOutliner_StoreFlag { + /* rebuild tree */ + SO_TREESTORE_CLEANUP = (1 << 0), + /* if set, it allows redraws. gets set for some allqueue events */ + SO_TREESTORE_REDRAW = (1 << 1), +} eSpaceOutliner_StoreFlag; + +/* outliner search flags (SpaceOops->search_flags) */ +typedef enum eSpaceOutliner_Search_Flags { + SO_FIND_CASE_SENSITIVE = (1 << 0), + SO_FIND_COMPLETE = (1 << 1), + SO_SEARCH_RECURSIVE = (1 << 2), +} eSpaceOutliner_Search_Flags; + + +/* Graph Editor ========================================= */ + +/* 'Graph' Editor (formerly known as the IPO Editor) */ +typedef struct SpaceIpo { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + short blockhandler[8] DNA_DEPRECATED; + + View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ + + struct bDopeSheet *ads; /* settings for filtering animation data (NOTE: we use a pointer due to code-linking issues) */ + + ListBase ghostCurves; /* sampled snapshots of F-Curves used as in-session guides */ + + short mode; /* mode for the Graph editor (eGraphEdit_Mode) */ + short autosnap; /* time-transform autosnapping settings for Graph editor (eAnimEdit_AutoSnap in DNA_action_types.h) */ + int flag; /* settings for Graph editor (eGraphEdit_Flag) */ + + float cursorVal; /* cursor value (y-value, x-value is current frame) */ + int around; /* pivot point for transforms */ +} SpaceIpo; + + +/* SpaceIpo->flag (Graph Editor Settings) */ +typedef enum eGraphEdit_Flag { + /* OLD DEPRECEATED SETTING */ + /* SIPO_LOCK_VIEW = (1 << 0), */ + + /* don't merge keyframes on the same frame after a transform */ + SIPO_NOTRANSKEYCULL = (1 << 1), + /* don't show any keyframe handles at all */ + SIPO_NOHANDLES = (1 << 2), + /* don't show current frame number beside indicator line */ + SIPO_NODRAWCFRANUM = (1 << 3), + /* show timing in seconds instead of frames */ + SIPO_DRAWTIME = (1 << 4), + /* only show keyframes for selected F-Curves */ + SIPO_SELCUVERTSONLY = (1 << 5), + /* draw names of F-Curves beside the respective curves */ + /* NOTE: currently not used */ + SIPO_DRAWNAMES = (1 << 6), + /* show sliders in channels list */ + SIPO_SLIDERS = (1 << 7), + /* don't show the horizontal component of the cursor */ + SIPO_NODRAWCURSOR = (1 << 8), + /* only show handles of selected keyframes */ + SIPO_SELVHANDLESONLY = (1 << 9), + /* temporary flag to force channel selections to be synced with main */ + SIPO_TEMP_NEEDCHANSYNC = (1 << 10), + /* don't perform realtime updates */ + SIPO_NOREALTIMEUPDATES = (1 << 11), + /* don't draw curves with AA ("beauty-draw") for performance */ + SIPO_BEAUTYDRAW_OFF = (1 << 12), + /* draw grouped channels with colors set in group */ + SIPO_NODRAWGCOLORS = (1 << 13), +} eGraphEdit_Flag; + +/* SpaceIpo->mode (Graph Editor Mode) */ +typedef enum eGraphEdit_Mode { + /* all animation curves (from all over Blender) */ + SIPO_MODE_ANIMATION = 0, + /* drivers only */ + SIPO_MODE_DRIVERS, +} eGraphEdit_Mode; + + +/* NLA Editor ============================================= */ + +/* NLA Editor */ +typedef struct SpaceNla { + struct SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + short blockhandler[8] DNA_DEPRECATED; + + short autosnap; /* this uses the same settings as autosnap for Action Editor */ + short flag; + int pad; + + struct bDopeSheet *ads; + View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ +} SpaceNla; + +/* nla->flag */ +typedef enum eSpaceNla_Flag { + /* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old verisons */ + + /* draw timing in seconds instead of frames */ + SNLA_DRAWTIME = (1 << 2), + /* don't draw frame number beside frame indicator */ + SNLA_NODRAWCFRANUM = (1 << 4), + /* don't draw influence curves on strips */ + SNLA_NOSTRIPCURVES = (1 << 5), + /* don't perform realtime updates */ + SNLA_NOREALTIMEUPDATES = (1 << 6), +} eSpaceNla_Flag; + + +/* Timeline =============================================== */ + +/* Pointcache drawing data */ +# /* Only store the data array in the cache to avoid constant reallocation. */ +# /* No need to store when saved. */ +typedef struct SpaceTimeCache { + struct SpaceTimeCache *next, *prev; + float *array; +} SpaceTimeCache; + +/* Timeline View */ +typedef struct SpaceTime { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + + View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ + + ListBase caches; + + int cache_display; + int flag; +} SpaceTime; + + +/* time->flag */ +typedef enum eTimeline_Flag { + /* show timing in frames instead of in seconds */ + TIME_DRAWFRAMES = (1 << 0), + /* show time indicator box beside the frame number */ + TIME_CFRA_NUM = (1 << 1), + /* only keyframes from active/selected channels get shown */ + TIME_ONLYACTSEL = (1 << 2), +} eTimeline_Flag; + +/* time->redraws (now screen->redraws_flag) */ +typedef enum eScreen_Redraws_Flag { + TIME_REGION = (1 << 0), + TIME_ALL_3D_WIN = (1 << 1), + TIME_ALL_ANIM_WIN = (1 << 2), + TIME_ALL_BUTS_WIN = (1 << 3), + TIME_WITH_SEQ_AUDIO = (1 << 4), /* DEPRECATED */ + TIME_SEQ = (1 << 5), + TIME_ALL_IMAGE_WIN = (1 << 6), + TIME_CONTINUE_PHYSICS = (1 << 7), + TIME_NODES = (1 << 8), + TIME_CLIPS = (1 << 9), +} eScreen_Redraws_Flag; + +/* time->cache */ +typedef enum eTimeline_Cache_Flag { + TIME_CACHE_DISPLAY = (1 << 0), + TIME_CACHE_SOFTBODY = (1 << 1), + TIME_CACHE_PARTICLES = (1 << 2), + TIME_CACHE_CLOTH = (1 << 3), + TIME_CACHE_SMOKE = (1 << 4), + TIME_CACHE_DYNAMICPAINT = (1 << 5), +} eTimeline_Cache_Flag; + + +/* Sequence Editor ======================================= */ + +/* Sequencer */ +typedef struct SpaceSeq { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + + short blockhandler[8] DNA_DEPRECATED; + + View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ + + float xof DNA_DEPRECATED, yof DNA_DEPRECATED; /* deprecated: offset for drawing the image preview */ + short mainb; /* weird name for the sequencer subtype (seq, image, luma... etc) */ + short render_size; + short chanshown; + short zebra; + int flag; + float zoom DNA_DEPRECATED; /* deprecated, handled by View2D now */ + int view; /* see SEQ_VIEW_* below */ + int pad; + + struct bGPdata *gpd; /* grease-pencil data */ +} SpaceSeq; + + +/* sseq->mainb */ +typedef enum eSpaceSeq_RegionType { + SEQ_DRAW_SEQUENCE = 0, + SEQ_DRAW_IMG_IMBUF, + SEQ_DRAW_IMG_WAVEFORM, + SEQ_DRAW_IMG_VECTORSCOPE, + SEQ_DRAW_IMG_HISTOGRAM, +} eSpaceSeq_RegionType; + +/* sseq->flag */ +typedef enum eSpaceSeq_Flag { + SEQ_DRAWFRAMES = (1 << 0), + SEQ_MARKER_TRANS = (1 << 1), + SEQ_DRAW_COLOR_SEPARATED = (1 << 2), + SEQ_DRAW_SAFE_MARGINS = (1 << 3), + SEQ_DRAW_GPENCIL = (1 << 4), /* DEPRECATED */ + SEQ_NO_DRAW_CFRANUM = (1 << 5), +} eSpaceSeq_Flag; + +/* sseq->view */ +typedef enum eSpaceSeq_Displays { + SEQ_VIEW_SEQUENCE = 1, + SEQ_VIEW_PREVIEW, + SEQ_VIEW_SEQUENCE_PREVIEW, +} eSpaceSeq_Dispays; + +/* sseq->render_size */ +typedef enum eSpaceSeq_Proxy_RenderSize { + SEQ_PROXY_RENDER_SIZE_NONE = -1, + SEQ_PROXY_RENDER_SIZE_SCENE = 0, + SEQ_PROXY_RENDER_SIZE_25 = 25, + SEQ_PROXY_RENDER_SIZE_50 = 50, + SEQ_PROXY_RENDER_SIZE_75 = 75, + SEQ_PROXY_RENDER_SIZE_100 = 99, + SEQ_PROXY_RENDER_SIZE_FULL = 100 +} eSpaceSeq_Proxy_RenderSize; + + +/* File Selector ========================================== */ + +/* Config and Input for File Selector */ +typedef struct FileSelectParams { + char title[32]; /* title, also used for the text of the execute button */ + char dir[1056]; /* directory, FILE_MAX_LIBEXTRA, 1024 + 32, this is for extreme case when 1023 length path + * needs to be linked in, where foo.blend/Armature need adding */ + char file[256]; /* file */ + char renamefile[256]; + char renameedit[256]; /* annoying but the first is only used for initialization */ + + char filter_glob[64]; /* list of filetypes to filter */ + + int active_file; + int sel_first; + int sel_last; + + /* short */ + short type; /* XXXXX for now store type here, should be moved to the operator */ + short flag; /* settings for filter, hiding dots files,... */ + short sort; /* sort order */ + short display; /* display mode flag */ + short filter; /* filter when (flags & FILE_FILTER) is true */ + + /* XXX --- still unused -- */ + short f_fp; /* show font preview */ + char fp_str[8]; /* string to use for font preview */ + + /* XXX --- end unused -- */ +} FileSelectParams; + +/* File Browser */ +typedef struct SpaceFile { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + + int scroll_offset; + + struct FileSelectParams *params; /* config and input for file select */ + + struct FileList *files; /* holds the list of files to show */ + + ListBase *folders_prev; /* holds the list of previous directories to show */ + ListBase *folders_next; /* holds the list of next directories (pushed from previous) to show */ + + /* operator that is invoking fileselect + * op->exec() will be called on the 'Load' button. + * if operator provides op->cancel(), then this will be invoked + * on the cancel button. + */ + struct wmOperator *op; + + struct wmTimer *smoothscroll_timer; + + struct FileLayout *layout; + + short recentnr, bookmarknr; + short systemnr, pad2; +} SpaceFile; + + /* FileSelectParams.display */ enum FileDisplayTypeE { FILE_DEFAULTDISPLAY = 0, @@ -709,6 +656,41 @@ typedef enum eDirEntry_SelectFlag { EDITING_FILE = (1 << 4), } eDirEntry_SelectFlag; +/* Image/UV Editor ======================================== */ + +/* Image/UV Editor */ +typedef struct SpaceImage { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + + int flag; + + struct Image *image; + struct ImageUser iuser; + struct CurveMapping *cumap; + + struct Scopes scopes; /* histogram waveform and vectorscope */ + struct Histogram sample_line_hist; /* sample line histogram */ + + struct bGPdata *gpd; /* grease pencil data */ + + float cursor[2]; /* UV editor 2d cursor */ + float xof, yof; /* user defined offset, image is centered */ + float zoom; /* user defined zoom level */ + float centx, centy; /* storage for offset while render drawing */ + + short curtile; /* the currently active tile of the image when tile is enabled, is kept in sync with the active faces tile */ + short pad; + short lock; + short pin; + char dt_uv; /* UV draw type */ + char sticky; /* sticky selection type */ + char dt_uvstretch; + char around; +} SpaceImage; + + /* SpaceImage->dt_uv */ typedef enum eSpaceImage_UVDT { SI_UVDT_OUTLINE = 0, @@ -769,47 +751,46 @@ typedef enum eSpaceImage_Flag { SI_COLOR_CORRECTION = (1 << 24), } eSpaceImage_Flag; -/* SpaceIpo->flag (Graph Editor Settings) */ -typedef enum eGraphEdit_Flag { - /* OLD DEPRECEATED SETTING */ - /* SIPO_LOCK_VIEW = (1 << 0), */ - - /* don't merge keyframes on the same frame after a transform */ - SIPO_NOTRANSKEYCULL = (1 << 1), - /* don't show any keyframe handles at all */ - SIPO_NOHANDLES = (1 << 2), - /* don't show current frame number beside indicator line */ - SIPO_NODRAWCFRANUM = (1 << 3), - /* show timing in seconds instead of frames */ - SIPO_DRAWTIME = (1 << 4), - /* only show keyframes for selected F-Curves */ - SIPO_SELCUVERTSONLY = (1 << 5), - /* draw names of F-Curves beside the respective curves */ - /* NOTE: currently not used */ - SIPO_DRAWNAMES = (1 << 6), - /* show sliders in channels list */ - SIPO_SLIDERS = (1 << 7), - /* don't show the horizontal component of the cursor */ - SIPO_NODRAWCURSOR = (1 << 8), - /* only show handles of selected keyframes */ - SIPO_SELVHANDLESONLY = (1 << 9), - /* temporary flag to force channel selections to be synced with main */ - SIPO_TEMP_NEEDCHANSYNC = (1 << 10), - /* don't perform realtime updates */ - SIPO_NOREALTIMEUPDATES = (1 << 11), - /* don't draw curves with AA ("beauty-draw") for performance */ - SIPO_BEAUTYDRAW_OFF = (1 << 12), - /* draw grouped channels with colors set in group */ - SIPO_NODRAWGCOLORS = (1 << 13), -} eGraphEdit_Flag; +/* Text Editor ============================================ */ + +/* Text Editor */ +typedef struct SpaceText { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + short blockhandler[8] DNA_DEPRECATED; + + struct Text *text; + + int top, viewlines; + short flags, menunr; + + short lheight; /* user preference */ + char cwidth, linenrs_tot; /* runtime computed, character width and the number of chars to use when showing line numbers */ + int left; + int showlinenrs; + int tabnumber; + + short showsyntax; + short line_hlight; + short overwrite; + short live_edit; /* run python while editing, evil */ + float pix_per_line; + + struct rcti txtscroll, txtbar; + + int wordwrap, doplugins; + + char findstr[256]; /* ST_MAX_FIND_STR */ + char replacestr[256]; /* ST_MAX_FIND_STR */ + + short margin_column; /* column number to show right margin at */ + char pad[6]; + + void *drawcache; /* cache for faster drawing */ +} SpaceText; -/* SpaceIpo->mode (Graph Editor Mode) */ -typedef enum eGraphEdit_Mode { - /* all animation curves (from all over Blender) */ - SIPO_MODE_ANIMATION = 0, - /* drivers only */ - SIPO_MODE_DRIVERS, -} eGraphEdit_Mode; /* SpaceText flags (moved from DNA_text_types.h) */ typedef enum eSpaceText_Flags { @@ -827,137 +808,206 @@ typedef enum eSpaceText_Flags { /* stext->findstr/replacestr */ #define ST_MAX_FIND_STR 256 +/* Script View (Obsolete) ================================== */ -/* SpaceOops->flag */ -typedef enum eSpaceOutliner_Flag { - SO_TESTBLOCKS = (1 << 0), - SO_NEWSELECTED = (1 << 1), - SO_HIDE_RESTRICTCOLS = (1 << 2), - SO_HIDE_KEYINGSETINFO = (1 << 3), -} eSpaceOutliner_Flag; +/* Script Runtime Data - Obsolete (pre 2.5) */ +typedef struct Script { + ID id; -/* SpaceOops->outlinevis */ -typedef enum eSpaceOutliner_Mode { - SO_ALL_SCENES = 0, - SO_CUR_SCENE, - SO_VISIBLE, - SO_SELECTED, - SO_ACTIVE, - SO_SAME_TYPE, - SO_GROUPS, - SO_LIBRARIES, - SO_VERSE_SESSION, - SO_VERSE_MS, - SO_SEQUENCE, - SO_DATABLOCKS, - SO_USERDEF, - SO_KEYMAP, -} eSpaceOutliner_Mode; + void *py_draw; + void *py_event; + void *py_button; + void *py_browsercallback; + void *py_globaldict; -/* SpaceOops->storeflag */ -typedef enum eSpaceOutliner_StoreFlag { - /* rebuild tree */ - SO_TREESTORE_CLEANUP = (1 << 0), - /* if set, it allows redraws. gets set for some allqueue events */ - SO_TREESTORE_REDRAW = (1 << 1), -} eSpaceOutliner_StoreFlag; + int flags, lastspace; + /* store the script file here so we can re-run it on loading blender, if "Enable Scripts" is on */ + char scriptname[1024]; /* 1024 = FILE_MAX */ + char scriptarg[256]; /* 1024 = FILE_MAX */ +} Script; +#define SCRIPT_SET_NULL(_script) _script->py_draw = _script->py_event = _script->py_button = _script->py_browsercallback = _script->py_globaldict = NULL; _script->flags = 0 -/* outliner search flags (SpaceOops->search_flags) */ -typedef enum eSpaceOutliner_Search_Flags { - SO_FIND_CASE_SENSITIVE = (1 << 0), - SO_FIND_COMPLETE = (1 << 1), - SO_SEARCH_RECURSIVE = (1 << 2), -} eSpaceOutliner_Search_Flags; +/* Script View - Obsolete (pre 2.5) */ +typedef struct SpaceScript { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + struct Script *script; -/* headerbuttons: 450-499 */ + short flags, menunr; + int pad1; + + void *but_refs; +} SpaceScript; -#define B_IMASELHOME 451 -#define B_IMASELREMOVEBIP 452 +/* Nodes Editor =========================================== */ -/* nla->flag */ -typedef enum eSpaceNla_Flag { - /* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old verisons */ +/* Node Editor */ +typedef struct SpaceNode { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + short blockhandler[8] DNA_DEPRECATED; + + View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */ + + struct ID *id, *from; /* context, no need to save in file? well... pinning... */ + short flag, pad1; /* menunr: browse id block in header */ + float aspect; + + float xof, yof; /* offset for drawing the backdrop */ + float zoom, padf; /* zoom for backdrop */ + float mx, my; /* mousepos for drawing socketless link */ + + struct bNodeTree *nodetree, *edittree; + int treetype; /* treetype: as same nodetree->type */ + short texfrom; /* texfrom object, world or brush */ + short shaderfrom; /* shader from object or world */ + short recalc; /* currently on 0/1, for auto compo */ + short pad[3]; + ListBase linkdrag; /* temporary data for modal linking operator */ + + struct bGPdata *gpd; /* grease-pencil data */ +} SpaceNode; - /* draw timing in seconds instead of frames */ - SNLA_DRAWTIME = (1 << 2), - /* don't draw frame number beside frame indicator */ - SNLA_NODRAWCFRANUM = (1 << 4), - /* don't draw influence curves on strips */ - SNLA_NOSTRIPCURVES = (1 << 5), - /* don't perform realtime updates */ - SNLA_NOREALTIMEUPDATES = (1 << 6), -} eSpaceNla_Flag; +/* snode->flag */ +typedef enum eSpaceNode_Flag { + SNODE_BACKDRAW = (1 << 1), + SNODE_DISPGP = (1 << 2), /* XXX: Grease Pencil - deprecated? */ + SNODE_USE_ALPHA = (1 << 3), + SNODE_SHOW_ALPHA = (1 << 4), + SNODE_AUTO_RENDER = (1 << 5), +} eSpaceNode_Flag; -/* time->flag */ -typedef enum eTimeline_Flag { - /* show timing in frames instead of in seconds */ - TIME_DRAWFRAMES = (1 << 0), - /* show time indicator box beside the frame number */ - TIME_CFRA_NUM = (1 << 1), - /* only keyframes from active/selected channels get shown */ - TIME_ONLYACTSEL = (1 << 2), -} eTimeline_Flag; +/* snode->texfrom */ +typedef enum eSpaceNode_TexFrom { + SNODE_TEX_OBJECT = 0, + SNODE_TEX_WORLD, + SNODE_TEX_BRUSH, +} eSpaceNode_TexFrom; -/* time->redraws (now screen->redraws_flag) */ -typedef enum eScreen_Redraws_Flag { - TIME_REGION = (1 << 0), - TIME_ALL_3D_WIN = (1 << 1), - TIME_ALL_ANIM_WIN = (1 << 2), - TIME_ALL_BUTS_WIN = (1 << 3), - TIME_WITH_SEQ_AUDIO = (1 << 4), /* DEPRECATED */ - TIME_SEQ = (1 << 5), - TIME_ALL_IMAGE_WIN = (1 << 6), - TIME_CONTINUE_PHYSICS = (1 << 7), - TIME_NODES = (1 << 8), - TIME_CLIPS = (1 << 9), -} eScreen_Redraws_Flag; +/* snode->shaderfrom */ +typedef enum eSpaceNode_ShaderFrom { + SNODE_SHADER_OBJECT = 0, + SNODE_SHADER_WORLD, +} eSpaceNode_ShaderFrom; -/* time->cache */ -typedef enum eTimeline_Cache_Flag { - TIME_CACHE_DISPLAY = (1 << 0), - TIME_CACHE_SOFTBODY = (1 << 1), - TIME_CACHE_PARTICLES = (1 << 2), - TIME_CACHE_CLOTH = (1 << 3), - TIME_CACHE_SMOKE = (1 << 4), - TIME_CACHE_DYNAMICPAINT = (1 << 5), -} eTimeline_Cache_Flag; +/* Game Logic Editor ===================================== */ -/* sseq->mainb */ -typedef enum eSpaceSeq_RegionType { - SEQ_DRAW_SEQUENCE = 0, - SEQ_DRAW_IMG_IMBUF, - SEQ_DRAW_IMG_WAVEFORM, - SEQ_DRAW_IMG_VECTORSCOPE, - SEQ_DRAW_IMG_HISTOGRAM, -} eSpaceSeq_RegionType; +/* Logic Editor */ +typedef struct SpaceLogic { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; + + short blockhandler[8] DNA_DEPRECATED; + + short flag, scaflag; + int pad; + + struct bGPdata *gpd; /* grease-pencil data */ +} SpaceLogic; -/* sseq->flag */ -typedef enum eSpaceSeq_Flag { - SEQ_DRAWFRAMES = (1 << 0), - SEQ_MARKER_TRANS = (1 << 1), - SEQ_DRAW_COLOR_SEPARATED = (1 << 2), - SEQ_DRAW_SAFE_MARGINS = (1 << 3), - SEQ_DRAW_GPENCIL = (1 << 4), /* DEPRECATED */ - SEQ_NO_DRAW_CFRANUM = (1 << 5), -} eSpaceSeq_Flag; +/* Console ================================================ */ -/* sseq->view */ -typedef enum eSpaceSeq_Displays { - SEQ_VIEW_SEQUENCE = 1, - SEQ_VIEW_PREVIEW, - SEQ_VIEW_SEQUENCE_PREVIEW, -} eSpaceSeq_Dispays; +/* Console content */ +typedef struct ConsoleLine { + struct ConsoleLine *next, *prev; + + /* keep these 3 vars so as to share free, realloc funcs */ + int len_alloc; /* allocated length */ + int len; /* real len - strlen() */ + char *line; + + int cursor; + int type; /* only for use when in the 'scrollback' listbase */ +} ConsoleLine; -/* sseq->render_size */ -typedef enum eSpaceSeq_Proxy_RenderSize { - SEQ_PROXY_RENDER_SIZE_NONE = -1, - SEQ_PROXY_RENDER_SIZE_SCENE = 0, - SEQ_PROXY_RENDER_SIZE_25 = 25, - SEQ_PROXY_RENDER_SIZE_50 = 50, - SEQ_PROXY_RENDER_SIZE_75 = 75, - SEQ_PROXY_RENDER_SIZE_100 = 99, - SEQ_PROXY_RENDER_SIZE_FULL = 100 -} eSpaceSeq_Proxy_RenderSize; +/* ConsoleLine.type */ +typedef enum eConsoleLine_Type { + CONSOLE_LINE_OUTPUT = 0, + CONSOLE_LINE_INPUT, + CONSOLE_LINE_INFO, /* autocomp feedback */ + CONSOLE_LINE_ERROR +} eConsoleLine_Type; + + +/* Console View */ +typedef struct SpaceConsole { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + float blockscale DNA_DEPRECATED; // XXX are these needed? + short blockhandler[8] DNA_DEPRECATED; // XXX are these needed? + + /* space vars */ + int lheight, pad; + + ListBase scrollback; /* ConsoleLine; output */ + ListBase history; /* ConsoleLine; command history, current edited line is the first */ + char prompt[256]; + char language[32]; /* multiple consoles are possible, not just python */ + + int sel_start; + int sel_end; +} SpaceConsole; + + +/* User Preferences ======================================= */ + +/* User Preferences View */ +typedef struct SpaceUserPref { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + + int pad; + + char filter[64]; /* search term for filtering in the UI */ +} SpaceUserPref; + +/* Motion Tracking ======================================== */ + +/* Clip Editor */ +typedef struct SpaceClip { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + + float xof, yof; /* user defined offset, image is centered */ + float xlockof, ylockof; /* user defined offset from locked position */ + float zoom; /* user defined zoom level */ + + struct MovieClipUser user; /* user of clip */ + struct MovieClip *clip; /* clip data */ + struct MovieClipScopes scopes; /* different scoped displayed in space panels */ + + int flag; /* flags */ + short mode; /* editor mode (editing context being displayed) */ + short view; /* type of the clip editor view */ + + int path_length; /* length of displaying path, in frames */ + + /* current stabilization data */ + float loc[2], scale, angle; /* pre-composed stabilization data */ + int pad; + float stabmat[4][4], unistabmat[4][4]; /* current stabilization matrix and the same matrix in unified space, + * defined when drawing and used for mouse position calculation */ + + /* movie postprocessing */ + int postproc_flag, pad2; + + void *draw_context; + + /* dopesheet */ + short dope_sort; /* sort order in dopesheet view */ + short dope_flag; /* dopsheet view flags */ + + int pad3; +} SpaceClip; /* SpaceClip->flag */ typedef enum eSpaceClip_Flag { @@ -1008,6 +1058,13 @@ typedef enum eSpaceClip_Dopesheet_Flag { SC_DOPE_SORT_INVERSE = (1 << 0), } eSpaceClip_Dopesheet_Flag; +/* **************** SPACE DEFINES ********************* */ + +/* headerbuttons: 450-499 */ +#define B_IMASELHOME 451 +#define B_IMASELREMOVEBIP 452 + + /* space types, moved from DNA_screen_types.h */ /* Do NOT change order, append on end. types are hardcoded needed */ typedef enum eSpace_Type { From 5f677f995d204c378f7aad3de826b2e193276487 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 24 May 2012 06:16:05 +0000 Subject: [PATCH 159/159] * removed clamp from color correction --- .../compositor/operations/COM_ColorCorrectionOperation.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp index 45750244d87..af28b776892 100644 --- a/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp +++ b/source/blender/compositor/operations/COM_ColorCorrectionOperation.cpp @@ -98,9 +98,6 @@ void ColorCorrectionOperation::executePixel(float *output, float x, float y, Pix r = (luma + saturation * (r - luma)); g = (luma + saturation * (g - luma)); b = (luma + saturation * (b - luma)); - CLAMP (r, 0.0f, 1.0f); - CLAMP (g, 0.0f, 1.0f); - CLAMP (b, 0.0f, 1.0f); r = 0.5+((r-0.5)*contrast); g = 0.5+((g-0.5)*contrast);