merged changes to revisio 23915
authorMaxime Curioni <maxime.curioni@gmail.com>
Sun, 18 Oct 2009 05:19:46 +0000 (05:19 +0000)
committerMaxime Curioni <maxime.curioni@gmail.com>
Sun, 18 Oct 2009 05:19:46 +0000 (05:19 +0000)
Updated buttons_render.py to have Freestyle buttons
Added "empty" BlenderTextureManager as preliminary step to remove last remnants of OpenGL and to allow Freestyle to run on my machine.

146 files changed:
intern/ghost/GHOST_C-api.h
intern/ghost/GHOST_IWindow.h
intern/ghost/GHOST_Rect.h
intern/ghost/GHOST_Types.h
intern/ghost/intern/GHOST_C-api.cpp
intern/ghost/intern/GHOST_SystemCocoa.mm
intern/ghost/intern/GHOST_SystemX11.cpp
intern/ghost/intern/GHOST_Window.cpp
intern/ghost/intern/GHOST_Window.h
intern/ghost/intern/GHOST_WindowCocoa.h
intern/ghost/intern/GHOST_WindowCocoa.mm
intern/ghost/intern/GHOST_WindowX11.cpp
intern/ghost/intern/GHOST_WindowX11.h
release/datafiles/blenderbuttons
release/scripts/io/add_mesh_torus.py
release/scripts/io/engine_render_pov.py
release/scripts/io/mesh_skin.py
release/scripts/io/netrender/operators.py
release/scripts/io/netrender/ui.py
release/scripts/modules/bpy_ops.py
release/scripts/ui/buttons_data_armature.py
release/scripts/ui/buttons_data_mesh.py
release/scripts/ui/buttons_game.py
release/scripts/ui/buttons_material.py
release/scripts/ui/buttons_object_constraint.py
release/scripts/ui/buttons_particle.py
release/scripts/ui/buttons_render.py [new file with mode: 0644]
release/scripts/ui/buttons_scene.py
release/scripts/ui/buttons_texture.py
release/scripts/ui/space_filebrowser.py
release/scripts/ui/space_info.py
release/scripts/ui/space_outliner.py
release/scripts/ui/space_userpref.py
release/scripts/ui/space_view3d.py
source/blender/blenkernel/BKE_key.h
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/intern/context.c
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/key.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/packedFile.c
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/pointcache.c
source/blender/blenkernel/intern/smoke.c
source/blender/blenlib/BLI_arithb.h
source/blender/blenlib/BLI_storage.h
source/blender/blenlib/intern/storage.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/animation/anim_channels_defines.c
source/blender/editors/animation/anim_channels_edit.c
source/blender/editors/animation/anim_filter.c
source/blender/editors/animation/keyframing.c
source/blender/editors/animation/keyingsets.c
source/blender/editors/armature/editarmature_sketch.c
source/blender/editors/armature/poselib.c
source/blender/editors/datafiles/blenderbuttons.c
source/blender/editors/include/ED_anim_api.h
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/UI_icons.h
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/interface/interface_widgets.c
source/blender/editors/mesh/editmesh.c
source/blender/editors/mesh/editmesh_mods.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/mesh/mesh_intern.h
source/blender/editors/mesh/mesh_ops.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_edit.c
source/blender/editors/object/object_group.c
source/blender/editors/object/object_intern.h
source/blender/editors/object/object_modifier.c
source/blender/editors/object/object_ops.c
source/blender/editors/object/object_relations.c
source/blender/editors/object/object_select.c
source/blender/editors/object/object_shapekey.c
source/blender/editors/object/object_vgroup.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/editors/space_action/action_draw.c
source/blender/editors/space_action/action_header.c
source/blender/editors/space_buttons/buttons_context.c
source/blender/editors/space_buttons/buttons_header.c
source/blender/editors/space_buttons/space_buttons.c
source/blender/editors/space_file/file_intern.h
source/blender/editors/space_file/file_ops.c
source/blender/editors/space_file/filesel.c
source/blender/editors/space_file/space_file.c
source/blender/editors/space_graph/graph_buttons.c
source/blender/editors/space_graph/graph_draw.c
source/blender/editors/space_outliner/outliner_header.c [deleted file]
source/blender/editors/space_outliner/space_outliner.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_ops.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/editors/transform/transform_ops.c
source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
source/blender/ikplugin/intern/itasc_plugin.cpp
source/blender/makesdna/DNA_action_types.h
source/blender/makesdna/DNA_anim_types.h
source/blender/makesdna/DNA_constraint_types.h
source/blender/makesdna/DNA_curve_types.h
source/blender/makesdna/DNA_key_types.h
source/blender/makesdna/DNA_mesh_types.h
source/blender/makesdna/DNA_meta_types.h
source/blender/makesdna/DNA_object_types.h
source/blender/makesdna/DNA_scene_types.h
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/RNA_enum_types.h
source/blender/makesrna/RNA_types.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_constraint.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_fcurve.c
source/blender/makesrna/intern/rna_image.c
source/blender/makesrna/intern/rna_key.c
source/blender/makesrna/intern/rna_material.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_object_force.c
source/blender/makesrna/intern/rna_particle.c
source/blender/makesrna/intern/rna_rna.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_sculpt_paint.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_texture.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm.c
source/blender/python/intern/bpy_rna.c
source/blender/render/intern/source/pipeline.c
source/blender/render/intern/source/texture.c
source/blender/render/intern/source/zbuf.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_cursors.c
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/intern/wm_operators.c

index 00d2cdb1e3b62d75f754346a47a11715da01e245..bd812177f17d6633a028dc3b21fc36c1e59d6c94 100644 (file)
@@ -372,11 +372,13 @@ extern GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle,
  * events when the mouse is outside the window. X11 only, others
  * do this automatically.
  * @param windowhandle The handle to the window
- * @param      grab The new grab state of the cursor.
+ * @param      mode The new grab state of the cursor.
+ * @param      bounds The grab ragion (optional) - left,top,right,bottom
  * @return     Indication of success.
  */
 extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
-                                                                                 int grab, int warp, int restore);
+                                                                                               GHOST_TGrabCursorMode mode,
+                                                                                               int* bounds);
 
 /***************************************************************************************
  ** Access to mouse button and keyboard states.
index 993b41a4d4fd282c398b367fb148fe3926ecd451..512fad877cb1d2cc6a3842537cddcf70236d9f95 100644 (file)
@@ -271,7 +271,7 @@ public:
         * @param       grab The new grab state of the cursor.
         * @return      Indication of success.
         */
-       virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp, bool restore) { return GHOST_kSuccess; };
+       virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { return GHOST_kSuccess; };
 
 };
 
index 6271ecad408ebbac5d4aafebeda7d553b51ebef7..6a29b1ffc262e494be83d9529b6173517ee7ea61 100644 (file)
@@ -126,6 +126,13 @@ public:
         */
        virtual inline void unionPoint(GHOST_TInt32 x, GHOST_TInt32 y);
 
+       /**
+        * Grows the rectangle to included a point.
+        * @param       x       The x-coordinate of the point.
+        * @param       y       The y-coordinate of the point.
+        */
+       virtual inline void wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs);
+
        /**
         * Returns whether the point is inside this rectangle.
         * Point on the boundary is considered inside.
@@ -221,6 +228,20 @@ inline void GHOST_Rect::unionPoint(GHOST_TInt32 x, GHOST_TInt32 y)
        if (y < m_t) m_t = y;
        if (y > m_b) m_b = y;
 }
+#include <stdio.h>
+inline void GHOST_Rect::wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs)
+{
+       GHOST_TInt32 w= getWidth();
+       GHOST_TInt32 h= getHeight();
+
+       /* highly unlikely but avoid eternal loop */
+       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);
+}
 
 inline bool GHOST_Rect::isInside(GHOST_TInt32 x, GHOST_TInt32 y) const
 {
index 14e3c4bb5f7bb0fcda55842fa402b9aae783a8b0..e98e58740ada8a723cea9c6d561be4e42b540efa 100644 (file)
@@ -341,6 +341,12 @@ typedef enum {
        GHOST_kKeyF24
 } 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_TGrabCursorMode;
 
 typedef void* GHOST_TEventDataPtr;
 
index e225ad4fd90a719c4efb9d13469f1d159395f5f5..0160df552cc10df5f04bf3b841ab383bc2a5d057 100644 (file)
@@ -355,11 +355,21 @@ GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle,
 
 
 GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
-                                                                  int grab, int warp, int restore)
+                                                                               GHOST_TGrabCursorMode mode,
+                                                                               int *bounds)
 {
        GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;
+       GHOST_Rect bounds_rect, bounds_win;
+
+       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);
+               window->clientToScreen(bounds[2], bounds_win.getHeight() - bounds[3], bounds_rect.m_r, bounds_rect.m_b);
+
+       }
        
-       return window->setCursorGrab(grab?true:false, warp?true:false, restore?true:false);
+       return window->setCursorGrab(mode, bounds ? &bounds_rect:NULL);
 }
 
 
index 3e0d58b46a6c95cf37c28f13f9a1c99860b0e350..62f0c538e7e2b62b270915151dd4e0652875eac8 100644 (file)
@@ -635,6 +635,7 @@ GHOST_TSuccess GHOST_SystemCocoa::init()
                                
                                [mainMenubar addItem:menuItem];
                                [menuItem release];
+                               [NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; //Needed for 10.5
                                [appMenu release];
                                
                                //Create the window menu
@@ -815,7 +816,7 @@ GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32
 
 GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys& keys) const
 {
-       NSUInteger modifiers = [[NSApp currentEvent] modifierFlags];
+       unsigned int modifiers = [[NSApp currentEvent] modifierFlags];
        //Direct query to modifierFlags can be used in 10.6
 
     keys.set(GHOST_kModifierKeyCommand, (modifiers & NSCommandKeyMask) ? true : false);
@@ -1153,9 +1154,12 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
                case NSScrollWheel:
                        {
                                GHOST_TInt32 delta;
-                               delta = [event deltaY] > 0 ? 1 : -1;
-                               pushEvent(new GHOST_EventWheel(getMilliSeconds(), window, delta));
-
+                               
+                               double deltaF = [event deltaY];
+                               if (deltaF == 0.0) break; //discard trackpad delta=0 events
+                               
+                               delta = deltaF > 0.0 ? 1 : -1;
+                               pushEvent(new GHOST_EventWheel([event timestamp], window, delta));
                        }
                        break;
                        
@@ -1172,7 +1176,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr)
 {
        NSEvent *event = (NSEvent *)eventPtr;
        GHOST_IWindow* window = m_windowManager->getActiveWindow();
-       NSUInteger modifiers;
+       unsigned int modifiers;
        NSString *characters;
        GHOST_TKey keyCode;
        unsigned char ascii;
index 8c87abf16bc2e34d5897c7b6f24d0b3e25ec3468..774fd025b854ef25f35db3ac25fb1c65d90a8110 100644 (file)
@@ -388,31 +388,36 @@ GHOST_SystemX11::processEvent(XEvent *xe)
                {
                        XMotionEvent &xme = xe->xmotion;
                        
-                       if(window->getCursorWarp()) {
-                               /* Calculate offscreen location and re-center the mouse */
-                               GHOST_TInt32 x_warp, y_warp,  x_new, y_new, x_accum, y_accum;
-
-                               window->getCursorWarpPos(x_warp, y_warp);
-                               getCursorPosition(x_new, y_new);
-
-                               if(x_warp != x_new || y_warp != y_new) {
-                                       window->getCursorWarpAccum(x_accum, y_accum);
-                                       x_accum += x_new - x_warp;
-                                       y_accum += y_new - y_warp;
-
-                                       window->setCursorWarpAccum(x_accum, y_accum);
-                                       setCursorPosition(x_warp, y_warp); /* reset */
-
-                                       g_event = new
-                                       GHOST_EventCursor(
-                                               getMilliSeconds(),
-                                               GHOST_kEventCursorMove,
-                                               window,
-                                               x_warp + x_accum,
-                                               y_warp + y_accum
-                                       );
-
+                       if(window->getCursorGrabMode() != GHOST_kGrabDisable && window->getCursorGrabMode() != GHOST_kGrabNormal)
+                       {
+                               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)
+                                       window->getClientBounds(bounds);
+
+                               /* could also clamp to screen bounds
+                                * wrap with a window outside the view will fail atm  */
+                               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 != xme.x_root || y_new != xme.y_root) {
+                                       setCursorPosition(x_new, y_new); /* wrap */
+                                       window->setCursorGrabAccum(x_accum + (xme.x_root - x_new), y_accum + (xme.y_root - y_new));
                                }
+
+                               g_event = new
+                               GHOST_EventCursor(
+                                       getMilliSeconds(),
+                                       GHOST_kEventCursorMove,
+                                       window,
+                                       xme.x_root + x_accum,
+                                       xme.y_root + y_accum
+                               );
+
                        }
                        else {
                                g_event = new
index 94feb83e003b6d4a54d5386ceb4387ad10e3f1c1..33484284d7c64d1314fa2b62074b2b90566ba3c9 100644 (file)
@@ -48,15 +48,14 @@ GHOST_Window::GHOST_Window(
 :
        m_drawingContextType(type),
        m_cursorVisible(true),
-       m_cursorGrabbed(false),
-       m_cursorWarp(false),
+       m_cursorGrab(GHOST_kGrabDisable),
        m_cursorShape(GHOST_kStandardCursorDefault),
        m_stereoVisual(stereoVisual)
 {
        m_isUnsavedChanges = false;
        
-    m_cursorWarpAccumPos[0] = 0;
-    m_cursorWarpAccumPos[1] = 0;
+    m_cursorGrabAccumPos[0] = 0;
+    m_cursorGrabAccumPos[1] = 0;
 
     m_fullScreen = state == GHOST_kWindowStateFullScreen;
     if (m_fullScreen) {
@@ -98,13 +97,19 @@ GHOST_TSuccess GHOST_Window::setCursorVisibility(bool visible)
        }
 }
 
-GHOST_TSuccess GHOST_Window::setCursorGrab(bool grab, bool warp, bool restore)
+GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds)
 {
-       if(m_cursorGrabbed == grab)
+       if(m_cursorGrab == mode)
                return GHOST_kSuccess;
 
-       if (setWindowCursorGrab(grab, warp, restore)) {
-               m_cursorGrabbed = grab;
+       if (setWindowCursorGrab(mode)) {
+
+               if(mode==GHOST_kGrabDisable)
+                       m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1;
+               else if (bounds) {
+                       m_cursorGrabBounds= *bounds;
+               }
+               m_cursorGrab = mode;
                return GHOST_kSuccess;
        }
        else {
@@ -112,6 +117,12 @@ GHOST_TSuccess GHOST_Window::setCursorGrab(bool grab, bool warp, bool restore)
        }
 }
 
+GHOST_TSuccess GHOST_Window::getCursorGrabBounds(GHOST_Rect& bounds)
+{
+       bounds= m_cursorGrabBounds;
+       return (bounds.m_l==-1 && bounds.m_r==-1) ? GHOST_kFailure : GHOST_kSuccess;
+}
+
 GHOST_TSuccess GHOST_Window::setCursorShape(GHOST_TStandardCursor cursorShape)
 {
        if (setWindowCursorShape(cursorShape)) {
index 786918716c51ce57cf69dcc74861cce248dd45d6..0986fc5743058b6b64ad755c6fa2fb5d473ddf5d 100644 (file)
@@ -158,10 +158,9 @@ public:
         * @return      The visibility state of the cursor.
         */
        inline virtual bool getCursorVisibility() const;
-       inline virtual bool getCursorWarp() const;
-       inline virtual bool getCursorWarpPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
-       inline virtual bool getCursorWarpAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
-       inline virtual bool setCursorWarpAccum(GHOST_TInt32 x, GHOST_TInt32 y);
+       inline virtual GHOST_TGrabCursorMode getCursorGrabMode() const;
+       inline virtual void getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
+       inline virtual void setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y);
 
        /**
         * Shows or hides the cursor.
@@ -172,10 +171,16 @@ public:
 
        /**
         * Sets the cursor grab.
-        * @param       grab The new grab state of the cursor.
+        * @param       mode The new grab state of the cursor.
         * @return      Indication of success.
         */
-       virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp, bool restore);
+       virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds);
+
+       /**
+        * Gets the cursor grab region, if unset the window is used.
+        * reset when grab is disabled.
+        */
+       virtual GHOST_TSuccess getCursorGrabBounds(GHOST_Rect& bounds);
 
        /**
         * Sets the window "modified" status, indicating unsaved changes
@@ -247,7 +252,7 @@ protected:
         * Sets the cursor grab on the window using
         * native window system calls.
         */
-       virtual GHOST_TSuccess setWindowCursorGrab(bool grab, bool warp, bool restore) { return GHOST_kSuccess; };
+       virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode) { return GHOST_kSuccess; };
        
        /**
         * Sets the cursor shape on the window using
@@ -274,16 +279,16 @@ protected:
        bool m_cursorVisible;
 
        /** The current grabbed state of the cursor */
-       bool m_cursorGrabbed;
-       
-       /** The current warped state of the cursor */
-       bool m_cursorWarp;
+       GHOST_TGrabCursorMode m_cursorGrab;
 
        /** Initial grab location. */
-       GHOST_TInt32 m_cursorWarpInitPos[2];
+       GHOST_TInt32 m_cursorGrabInitPos[2];
+
+       /** Accumulated offset from m_cursorGrabInitPos. */
+       GHOST_TInt32 m_cursorGrabAccumPos[2];
 
-       /** Accumulated offset from m_cursorWarpInitPos. */
-       GHOST_TInt32 m_cursorWarpAccumPos[2];
+       /** Wrap the cursor within this region. */
+       GHOST_Rect m_cursorGrabBounds;
 
        /** The current shape of the cursor */
        GHOST_TStandardCursor m_cursorShape;
@@ -317,40 +322,21 @@ inline bool GHOST_Window::getCursorVisibility() const
        return m_cursorVisible;
 }
 
-inline bool GHOST_Window::getCursorWarp() const
-{
-       return m_cursorWarp;
-}
-
-inline bool GHOST_Window::getCursorWarpPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const
+inline GHOST_TGrabCursorMode GHOST_Window::getCursorGrabMode() const
 {
-       if(m_cursorWarp==false)
-               return GHOST_kFailure;
-
-       x= m_cursorWarpInitPos[0];
-       y= m_cursorWarpInitPos[1];
-       return GHOST_kSuccess;
+       return m_cursorGrab;
 }
 
-inline bool GHOST_Window::getCursorWarpAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const
+inline void GHOST_Window::getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const
 {
-       if(m_cursorWarp==false)
-               return GHOST_kFailure;
-
-       x= m_cursorWarpAccumPos[0];
-       y= m_cursorWarpAccumPos[1];
-       return GHOST_kSuccess;
+       x= m_cursorGrabAccumPos[0];
+       y= m_cursorGrabAccumPos[1];
 }
 
-inline bool GHOST_Window::setCursorWarpAccum(GHOST_TInt32 x, GHOST_TInt32 y)
+inline void GHOST_Window::setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y)
 {
-       if(m_cursorWarp==false)
-               return GHOST_kFailure;
-
-       m_cursorWarpAccumPos[0]= x;
-       m_cursorWarpAccumPos[1]= y;
-
-       return GHOST_kSuccess;
+       m_cursorGrabAccumPos[0]= x;
+       m_cursorGrabAccumPos[1]= y;
 }
 
 inline GHOST_TStandardCursor GHOST_Window::getCursorShape() const
index d6c154535a9f4e549c062bbd3d887c0dd42e6848..e5fff75c66ed7d3d236a22eadd4b91eea00ce9a4 100644 (file)
@@ -239,7 +239,7 @@ protected:
        /**
         * Sets the cursor warp accumulator. Overriden for workaround due to Cocoa next event after cursor set giving delta values non zero
         */
-       inline virtual bool setCursorWarpAccum(GHOST_TInt32 x, GHOST_TInt32 y);
+       inline virtual bool setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y);
        
        /**
         * Sets the cursor grab on the window using
index fd68b6200eefef220e1e276649f620a8781207bb..e41c773a4c3fb781a7c49a385e189e6fcf1eb17a 100644 (file)
 
 
 // Pixel Format Attributes for the windowed NSOpenGLContext
-static const NSOpenGLPixelFormatAttribute pixelFormatAttrsWindow[] =
+static NSOpenGLPixelFormatAttribute pixelFormatAttrsWindow[] =
 {
        NSOpenGLPFADoubleBuffer,
        NSOpenGLPFAAccelerated,
-       NSOpenGLPFAAllowOfflineRenderers,   // NOTE: Needed to connect to secondary GPUs
-       NSOpenGLPFADepthSize, 32,
-       0
+       //NSOpenGLPFAAllowOfflineRenderers,   // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway
+       NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 32,
+       (NSOpenGLPixelFormatAttribute) 0
 };
 
 #pragma mark Cocoa window delegate object
@@ -187,7 +187,7 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
                return;
        }
        
-       [m_window setTitle:[NSString stringWithUTF8String:title]];
+       setTitle(title);
        
                        
        //Creates the OpenGL View inside the window
@@ -271,7 +271,38 @@ void GHOST_WindowCocoa::setTitle(const STR_String& title)
 
        NSString *windowTitle = [[NSString alloc] initWithUTF8String:title];
        
-       [m_window setTitle:windowTitle];
+       //Set associated file if applicable
+       if ([windowTitle hasPrefix:@"Blender"])
+       {
+               NSRange fileStrRange;
+               NSString *associatedFileName;
+               int len;
+               
+               fileStrRange.location = [windowTitle rangeOfString:@"["].location+1;
+               len = [windowTitle rangeOfString:@"]"].location - fileStrRange.location;
+       
+               if (len >0)
+               {
+                       fileStrRange.length = len;
+                       associatedFileName = [windowTitle substringWithRange:fileStrRange];
+                       @try {
+                               [m_window setRepresentedFilename:associatedFileName];
+                       }
+                       @catch (NSException * e) {
+                               printf("\nInvalid file path given in window title");
+                       }
+                       [m_window setTitle:[associatedFileName lastPathComponent]];
+               }
+               else {
+                       [m_window setTitle:windowTitle];
+                       [m_window setRepresentedFilename:@""];
+               }
+
+       } else {
+               [m_window setTitle:windowTitle];
+               [m_window setRepresentedFilename:@""];
+       }
+
        
        [windowTitle release];
        [pool drain];
@@ -501,7 +532,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state)
                                                                                  defer:YES];
                                //Copy current window parameters
                                [tmpWindow setTitle:[m_window title]];
-                               [tmpWindow setRepresentedURL:[m_window representedURL]];
+                               [tmpWindow setRepresentedFilename:[m_window representedFilename]];
                                [tmpWindow setReleasedWhenClosed:NO];
                                [tmpWindow setAcceptsMouseMovedEvents:YES];
                                [tmpWindow setDelegate:[m_window delegate]];
@@ -557,7 +588,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state)
                                                                                                                defer:YES];
                                //Copy current window parameters
                                [tmpWindow setTitle:[m_window title]];
-                               [tmpWindow setRepresentedURL:[m_window representedURL]];
+                               [tmpWindow setRepresentedFilename:[m_window representedFilename]];
                                [tmpWindow setReleasedWhenClosed:NO];
                                [tmpWindow setAcceptsMouseMovedEvents:YES];
                                [tmpWindow setDelegate:[m_window delegate]];
@@ -873,7 +904,10 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(bool grab, bool warp, bool
                                setCursorWarpAccum(-x_new, -y_new);
                        }
                        else {
-                               m_systemCocoa->setCursorPosition(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1]);
+                               GHOST_TInt32 x_new, y_new;
+                               //get/set cursor position works in screen coordinates
+                               clientToScreen(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1], x_new, y_new);
+                               m_systemCocoa->setCursorPosition(x_new, y_new);
                                setCursorWarpAccum(0, 0);
                        }
                        
@@ -898,8 +932,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorShape(GHOST_TStandardCursor sha
        return GHOST_kSuccess;
 }
 
-#if 0
-/** Reverse the bits in a GHOST_TUns8 */
+/** Reverse the bits in a GHOST_TUns8
 static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch)
 {
        ch= ((ch>>1)&0x55) | ((ch<<1)&0xAA);
@@ -907,7 +940,7 @@ static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch)
        ch= ((ch>>4)&0x0F) | ((ch<<4)&0xF0);
        return ch;
 }
-#endif
+*/
 
 
 /** Reverse the bits in a GHOST_TUns16 */
@@ -923,43 +956,68 @@ 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 y;
+       int y,nbUns16;
        NSPoint hotSpotPoint;
+       NSBitmapImageRep *cursorImageRep;
        NSImage *cursorImage;
+       NSSize imSize;
+       GHOST_TUns16 *cursorBitmap;
+       
+       
+       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        
        if (m_customCursor) {
                [m_customCursor release];
                m_customCursor = nil;
        }
-       /*TODO: implement this (but unused inproject at present)
-       cursorImage = [[NSImage alloc] initWithData:bitmap];
        
-       for (y=0; y<16; y++) {
+
+       cursorImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
+                                                                                                                        pixelsWide:sizex
+                                                                                                                        pixelsHigh:sizey
+                                                                                                                 bitsPerSample:1 
+                                                                                                               samplesPerPixel:2
+                                                                                                                          hasAlpha:YES
+                                                                                                                          isPlanar:YES
+                                                                                                                colorSpaceName:NSDeviceBlackColorSpace
+                                                                                                                       bytesPerRow:(sizex/8 + (sizex%8 >0 ?1:0))
+                                                                                                                  bitsPerPixel:1];
+       
+       
+       cursorBitmap = (GHOST_TUns16*)[cursorImageRep bitmapData];
+       nbUns16 = [cursorImageRep bytesPerPlane]/2;
+       
+       for (y=0; y<nbUns16; 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));
+               cursorBitmap[y] = uns16ReverseBits((bitmap[2*y]<<0) | (bitmap[2*y+1]<<8));
+               cursorBitmap[nbUns16+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));
+               cursorBitmap[y] = uns16ReverseBits((bitmap[2*y+1]<<0) | (bitmap[2*y]<<8));
+               cursorBitmap[nbUns16+y] = uns16ReverseBits((mask[2*y+1]<<0) | (mask[2*y]<<8));
 #endif
-                       
+               
        }
        
        
+       imSize.width = sizex;
+       imSize.height= sizey;
+       cursorImage = [[NSImage alloc] initWithSize:imSize];
+       [cursorImage addRepresentation:cursorImageRep];
+       
        hotSpotPoint.x = hotX;
        hotSpotPoint.y = hotY;
        
+       //foreground and background color parameter is not handled for now (10.6)
        m_customCursor = [[NSCursor alloc] initWithImage:cursorImage
-                                                                foregroundColorHint:<#(NSColor *)fg#>
-                                                                backgroundColorHint:<#(NSColor *)bg#>
                                                                                         hotSpot:hotSpotPoint];
        
+       [cursorImageRep release];
        [cursorImage release];
        
        if ([m_window isVisible]) {
                loadCursor(getCursorVisibility(), GHOST_kStandardCursorCustom);
        }
-       */
+       [pool drain];
        return GHOST_kSuccess;
 }
 
@@ -968,36 +1026,3 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 bitmap[
 {
        return setWindowCustomCursorShape((GHOST_TUns8*)bitmap, (GHOST_TUns8*) mask, 16, 16, hotX, hotY, 0, 1);
 }
-
-#pragma mark Old carbon stuff to remove
-
-#if 0
-void GHOST_WindowCocoa::setMac_windowState(short value)
-{
-       mac_windowState = value;
-}
-
-short GHOST_WindowCocoa::getMac_windowState()
-{
-       return mac_windowState;
-}
-
-void GHOST_WindowCocoa::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);
-       out[0] = num;
-}
-
-
-void GHOST_WindowCocoa::mac2gen(const Str255 in, STR_String& out) const
-{
-       char tmp[256];
-       ::memcpy(tmp, in+1, in[0]);
-       tmp[in[0]] = '\0';
-       out = tmp;
-}
-
-#endif
\ No newline at end of file
index d197b5343526f08961d7b5fa3aa970937824daea..dba1be1b86275b8521e73bfcfc236e3557f74794 100644 (file)
@@ -1400,47 +1400,28 @@ setWindowCursorVisibility(
        GHOST_TSuccess
 GHOST_WindowX11::
 setWindowCursorGrab(
-       bool grab, bool warp, bool restore
+       GHOST_TGrabCursorMode mode
 ){
-       if(grab) {
-               if(warp) {
-                       m_system->getCursorPosition(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1]);
+       if(mode != GHOST_kGrabDisable) {
+               if(mode != GHOST_kGrabNormal) {
+                       m_system->getCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
+                       setCursorGrabAccum(0, 0);
+
+                       if(mode == GHOST_kGrabHide)
+                               setWindowCursorVisibility(false);
 
-                       setCursorWarpAccum(0, 0);
-                       setWindowCursorVisibility(false);
-                       m_cursorWarp= true;
                }
                XGrabPointer(m_display, m_window, True, ButtonPressMask| ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
        }
        else {
-               if(m_cursorWarp) { /* are we exiting warp */
+               if (m_cursorGrab==GHOST_kGrabHide) {
+                       m_system->setCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
                        setWindowCursorVisibility(true);
-                       /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
-                       if(restore) {
-                               GHOST_Rect bounds;
-                               GHOST_TInt32 x_new, y_new, x_rel, y_rel;
-
-                               getClientBounds(bounds);
-
-                               x_new= m_cursorWarpInitPos[0]+m_cursorWarpAccumPos[0];
-                               y_new= m_cursorWarpInitPos[1]+m_cursorWarpAccumPos[1];
-
-                               screenToClient(x_new, y_new, x_rel, y_rel);
-
-                               if(x_rel < 0)           x_new = (x_new-x_rel) + 2;
-                               if(y_rel < 0)           y_new = (y_new-y_rel) + 2;
-                               if(x_rel > bounds.getWidth())   x_new -= (x_rel-bounds.getWidth()) + 2;
-                               if(y_rel > bounds.getHeight())  y_new -= (y_rel-bounds.getHeight()) + 2;
-                               m_system->setCursorPosition(x_new, y_new);
-
-                       }
-                       else {
-                               m_system->setCursorPosition(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1]);
-                       }
-
-                       setCursorWarpAccum(0, 0);
-                       m_cursorWarp= false;
                }
+
+               /* 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 */
                XUngrabPointer(m_display, CurrentTime);
        }
 
index eb0689ab4105c9b99abe401cd56e800183c8339f..0dba1776553a30311671be88574ee1ff57c7f192 100644 (file)
@@ -256,9 +256,12 @@ protected:
         */
                GHOST_TSuccess 
        setWindowCursorGrab(
-               bool grab, bool warp, bool restore
+               GHOST_TGrabCursorMode mode
        );
 
+               GHOST_TGrabCursorMode
+       getWindowCursorGrab() const;
+
        /**
         * Sets the cursor shape on the window using
         * native window system calls.
index aa7870f67122eea54bb6c6b0d471527a7f88c140..f9a4b93496947d4132f4fa2f6b10e3f96cb16368 100644 (file)
Binary files a/release/datafiles/blenderbuttons and b/release/datafiles/blenderbuttons differ
index a0f41db15d67808931270b0c77ae0fd57bce4698..f413fe72e4d15a88374929a51e2fa064e4ee7726 100644 (file)
@@ -92,7 +92,7 @@ bpy.ops.add(MESH_OT_primitive_torus_add)
 # Add to a menu
 import dynamic_menu
 import space_info
-menu_item = dynamic_menu.add(bpy.types.INFO_MT_mesh_add, (lambda self, context: self.layout.itemO("mesh.primitive_torus_add", text="Add Torus")) )
+menu_item = dynamic_menu.add(bpy.types.INFO_MT_mesh_add, (lambda self, context: self.layout.itemO("mesh.primitive_torus_add", text="Torus", icon='ICON_MESH_DONUT')) )
 
 if __name__ == "__main__":
        bpy.ops.mesh.primitive_torus_add()
\ No newline at end of file
index f0247ce532a8981761338d26c107cb69d5e574f0..f69c8a267e0ea6f621190e0fa67744456da03ac7 100644 (file)
@@ -826,12 +826,12 @@ class PovrayRender(bpy.types.RenderEngine):
 bpy.types.register(PovrayRender)
 
 # Use some of the existing buttons.
-import buttons_scene
-buttons_scene.SCENE_PT_render.COMPAT_ENGINES.add('POVRAY_RENDER')
-buttons_scene.SCENE_PT_dimensions.COMPAT_ENGINES.add('POVRAY_RENDER')
-buttons_scene.SCENE_PT_antialiasing.COMPAT_ENGINES.add('POVRAY_RENDER')
-buttons_scene.SCENE_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER')
-del buttons_scene
+import buttons_render
+buttons_render.RENDER_PT_render.COMPAT_ENGINES.add('POVRAY_RENDER')
+buttons_render.RENDER_PT_dimensions.COMPAT_ENGINES.add('POVRAY_RENDER')
+buttons_render.RENDER_PT_antialiasing.COMPAT_ENGINES.add('POVRAY_RENDER')
+buttons_render.RENDER_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER')
+del buttons_render
 
 # Use only a subset of the world panels
 import buttons_world
@@ -852,14 +852,14 @@ del buttons_material
 class RenderButtonsPanel(bpy.types.Panel):
        __space_type__ = 'PROPERTIES'
        __region_type__ = 'WINDOW'
-       __context__ = "scene"
+       __context__ = "render"
        # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
        
        def poll(self, context):
                rd = context.scene.render_data
                return (rd.use_game_engine==False) and (rd.engine in self.COMPAT_ENGINES)
 
-class SCENE_PT_povray_radiosity(RenderButtonsPanel):
+class RENDER_PT_povray_radiosity(RenderButtonsPanel):
        __label__ = "Radiosity"
        COMPAT_ENGINES = set(['POVRAY_RENDER'])
 
@@ -909,4 +909,4 @@ class SCENE_PT_povray_radiosity(RenderButtonsPanel):
                        col = split.column()
                        col.itemR(scene, "pov_radio_always_sample")
 
-bpy.types.register(SCENE_PT_povray_radiosity)
+bpy.types.register(RENDER_PT_povray_radiosity)
index 5487b6ba10bc1fef710fa66176b1680026e5eb2b..f6fafc411114b7e82c9ba98d15243bdf2458cacc 100644 (file)
@@ -221,20 +221,22 @@ def face_edge_keys(f):
        
        return ord_ind(verts[0], verts[1]),  ord_ind(verts[1], verts[2]),  ord_ind(verts[2], verts[3]),  ord_ind(verts[3], verts[0])
        
-def mesh_faces_extend(me, faces):
+def mesh_faces_extend(me, faces, mat_idx = 0):
        orig_facetot = len(me.faces)
        new_facetot = len(faces)
        me.add_geometry(0, 0, new_facetot)
        tot = orig_facetot+new_facetot
        me_faces = me.faces
-       i= orig_facetot
-       while i < tot:
+       i= 0
+       while i < new_facetot:
                
                f = [v.index for v in faces[i]]
                if len(f)==4 and f[3]==0:
                        f = f[1], f[2], f[3], f[0]
-                       
-               me_faces[orig_facetot+i].verts_raw =  f
+               
+               mf = me_faces[orig_facetot+i]
+               mf.verts_raw =  f
+               mf.material_index = mat_idx
                i+=1
 # end utils
 
@@ -605,7 +607,7 @@ def main(context):
                except: pass
        
        if 1: # 2.5
-               mesh_faces_extend(me, faces)
+               mesh_faces_extend(me, faces, ob.active_material_index)
                me.update(calc_edges=True)
        else:
                me.faces.extend(faces, smooth = True)
index 42d1f6a0b860e894fe738254760070cfec7bfeea..e46b0c7b88862071f1b092011b301fa68cf091d6 100644 (file)
@@ -9,11 +9,9 @@ import netrender.model
 
 @rnaOperator
 class RENDER_OT_netclientanim(bpy.types.Operator):
-       '''
-       Operator documentation text, will be used for the operator tooltip and python docs.
-       '''
+       '''Start rendering an animation on network'''
        __idname__ = "render.netclientanim"
-       __label__ = "Net Render Client Anim"
+       __label__ = "Animation on network"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -42,11 +40,9 @@ class RENDER_OT_netclientanim(bpy.types.Operator):
 
 @rnaOperator
 class RENDER_OT_netclientsend(bpy.types.Operator):
-       '''
-       Operator documentation text, will be used for the operator tooltip and python docs.
-       '''
+       '''Send Render Job to the Network'''
        __idname__ = "render.netclientsend"
-       __label__ = "Net Render Client Send"
+       __label__ = "Send job"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -73,9 +69,9 @@ class RENDER_OT_netclientsend(bpy.types.Operator):
 
 @rnaOperator
 class RENDER_OT_netclientstatus(bpy.types.Operator):
-       '''Operator documentation text, will be used for the operator tooltip and python docs.'''
+       '''Refresh the status of the current jobs'''
        __idname__ = "render.netclientstatus"
-       __label__ = "Net Render Client Status"
+       __label__ = "Client Status"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -120,7 +116,7 @@ class RENDER_OT_netclientstatus(bpy.types.Operator):
 class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
        '''Operator documentation text, will be used for the operator tooltip and python docs.'''
        __idname__ = "render.netclientblacklistslave"
-       __label__ = "Net Render Client Blacklist Slave"
+       __label__ = "Client Blacklist Slave"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -155,7 +151,7 @@ class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
 class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
        '''Operator documentation text, will be used for the operator tooltip and python docs.'''
        __idname__ = "render.netclientwhitelistslave"
-       __label__ = "Net Render Client Whitelist Slave"
+       __label__ = "Client Whitelist Slave"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -189,9 +185,9 @@ class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
 
 @rnaOperator
 class RENDER_OT_netclientslaves(bpy.types.Operator):
-       '''Operator documentation text, will be used for the operator tooltip and python docs.'''
+       '''Refresh status about available Render slaves'''
        __idname__ = "render.netclientslaves"
-       __label__ = "Net Render Client Slaves"
+       __label__ = "Client Slaves"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -239,9 +235,9 @@ class RENDER_OT_netclientslaves(bpy.types.Operator):
 
 @rnaOperator
 class RENDER_OT_netclientcancel(bpy.types.Operator):
-       '''Operator documentation text, will be used for the operator tooltip and python docs.'''
+       '''Cancel the selected network rendering job.'''
        __idname__ = "render.netclientcancel"
-       __label__ = "Net Render Client Cancel"
+       __label__ = "Client Cancel"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -273,9 +269,9 @@ class RENDER_OT_netclientcancel(bpy.types.Operator):
        
 @rnaOperator
 class RENDER_OT_netclientcancelall(bpy.types.Operator):
-       '''Operator documentation text, will be used for the operator tooltip and python docs.'''
+       '''Cancel all running network rendering jobs.'''
        __idname__ = "render.netclientcancelall"
-       __label__ = "Net Render Client Cancel All"
+       __label__ = "Client Cancel All"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -305,9 +301,9 @@ class RENDER_OT_netclientcancelall(bpy.types.Operator):
 
 @rnaOperator
 class netclientdownload(bpy.types.Operator):
-       '''Operator documentation text, will be used for the operator tooltip and python docs.'''
+       '''Download render results from the network'''
        __idname__ = "render.netclientdownload"
-       __label__ = "Net Render Client Download"
+       __label__ = "Client Download"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -357,7 +353,7 @@ class netclientdownload(bpy.types.Operator):
 class netclientscan(bpy.types.Operator):
        '''Operator documentation text, will be used for the operator tooltip and python docs.'''
        __idname__ = "render.netclientscan"
-       __label__ = "Net Render Client Scan"
+       __label__ = "Client Scan"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
@@ -393,9 +389,9 @@ class netclientscan(bpy.types.Operator):
 
 @rnaOperator
 class netclientweb(bpy.types.Operator):
-       '''Operator documentation text, will be used for the operator tooltip and python docs.'''
+       '''Open new window with information about running rendering jobs'''
        __idname__ = "render.netclientweb"
-       __label__ = "Net Render Client Web"
+       __label__ = "Open Master Monitor"
        
        # List of operator properties, the attributes will be assigned
        # to the class instance from the operator settings before calling.
index fba834ed9e0e229e34e9d5ea139765aaa9cfad5f..7d7f3c29630f6b9c15621c777cb2f01321adecc0 100644 (file)
@@ -20,7 +20,7 @@ ERROR = 3
 class RenderButtonsPanel(bpy.types.Panel):
        __space_type__ = "PROPERTIES"
        __region_type__ = "WINDOW"
-       __context__ = "scene"
+       __context__ = "render"
        # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
        
        def poll(self, context):
@@ -29,14 +29,10 @@ class RenderButtonsPanel(bpy.types.Panel):
 
 # Setting panel, use in the scene for now.
 @rnaType
-class SCENE_PT_network_settings(RenderButtonsPanel):
+class RENDER_PT_network_settings(RenderButtonsPanel):
        __label__ = "Network Settings"
        COMPAT_ENGINES = set(['NET_RENDER'])
 
-       def draw_header(self, context):
-               layout = self.layout
-               scene = context.scene
-
        def draw(self, context):
                layout = self.layout
 
@@ -48,7 +44,6 @@ class SCENE_PT_network_settings(RenderButtonsPanel):
                split = layout.split()
                
                col = split.column()
-               
                col.itemR(scene.network_render, "mode")
                col.itemR(scene.network_render, "path")
                col.itemR(scene.network_render, "server_address")
@@ -60,7 +55,7 @@ class SCENE_PT_network_settings(RenderButtonsPanel):
                        col.itemO("render.netclientscan", icon="ICON_FILE_REFRESH", text="")
 
 @rnaType
-class SCENE_PT_network_job(RenderButtonsPanel):
+class RENDER_PT_network_job(RenderButtonsPanel):
        __label__ = "Job Settings"
        COMPAT_ENGINES = set(['NET_RENDER'])
        
@@ -79,16 +74,16 @@ class SCENE_PT_network_job(RenderButtonsPanel):
                split = layout.split()
                
                col = split.column()
-               
-               col.itemO("render.netclientanim", icon='ICON_RENDER_ANIMATION', text="Animation on network")
-               col.itemO("render.netclientsend", icon="ICON_FILE_BLEND", text="Send job")
-               col.itemO("render.netclientweb", icon="ICON_QUESTION", text="Open Master Monitor")
+               col.itemO("render.netclientanim", icon='ICON_RENDER_ANIMATION')
+               col.itemO("render.netclientsend", icon="ICON_FILE_BLEND")
+               col.itemO("render.netclientweb", icon="ICON_QUESTION")
                col.itemR(scene.network_render, "job_name")
-               col.itemR(scene.network_render, "priority")
-               col.itemR(scene.network_render, "chunks")
+               row = col.row()
+               row.itemR(scene.network_render, "priority")
+               row.itemR(scene.network_render, "chunks")
 
 @rnaType
-class SCENE_PT_network_slaves(RenderButtonsPanel):
+class RENDER_PT_network_slaves(RenderButtonsPanel):
        __label__ = "Slaves Status"
        COMPAT_ENGINES = set(['NET_RENDER'])
        
@@ -105,11 +100,9 @@ class SCENE_PT_network_slaves(RenderButtonsPanel):
                row = layout.row()
                row.template_list(netsettings, "slaves", netsettings, "active_slave_index", rows=2)
 
-               col = row.column()
-
-               subcol = col.column(align=True)
-               subcol.itemO("render.netclientslaves", icon="ICON_FILE_REFRESH", text="")
-               subcol.itemO("render.netclientblacklistslave", icon="ICON_ZOOMOUT", text="")
+               sub = row.column(align=True)
+               sub.itemO("render.netclientslaves", icon="ICON_FILE_REFRESH", text="")
+               sub.itemO("render.netclientblacklistslave", icon="ICON_ZOOMOUT", text="")
                
                if len(bpy.data.netrender_slaves) == 0 and len(netsettings.slaves) > 0:
                        while(len(netsettings.slaves) > 0):
@@ -126,7 +119,7 @@ class SCENE_PT_network_slaves(RenderButtonsPanel):
                        layout.itemL(text="Stats: " + slave.stats)
 
 @rnaType
-class SCENE_PT_network_slaves_blacklist(RenderButtonsPanel):
+class RENDER_PT_network_slaves_blacklist(RenderButtonsPanel):
        __label__ = "Slaves Blacklist"
        COMPAT_ENGINES = set(['NET_RENDER'])
        
@@ -143,10 +136,8 @@ class SCENE_PT_network_slaves_blacklist(RenderButtonsPanel):
                row = layout.row()
                row.template_list(netsettings, "slaves_blacklist", netsettings, "active_blacklisted_slave_index", rows=2)
 
-               col = row.column()
-
-               subcol = col.column(align=True)
-               subcol.itemO("render.netclientwhitelistslave", icon="ICON_ZOOMOUT", text="")
+               sub = row.column(align=True)
+               sub.itemO("render.netclientwhitelistslave", icon="ICON_ZOOMOUT", text="")
 
                if len(bpy.data.netrender_blacklist) == 0 and len(netsettings.slaves_blacklist) > 0:
                        while(len(netsettings.slaves_blacklist) > 0):
@@ -163,7 +154,7 @@ class SCENE_PT_network_slaves_blacklist(RenderButtonsPanel):
                        layout.itemL(text="Stats: " + time.ctime(slave.stats))
 
 @rnaType
-class SCENE_PT_network_jobs(RenderButtonsPanel):
+class RENDER_PT_network_jobs(RenderButtonsPanel):
        __label__ = "Jobs"
        COMPAT_ENGINES = set(['NET_RENDER'])
        
@@ -180,13 +171,11 @@ class SCENE_PT_network_jobs(RenderButtonsPanel):
                row = layout.row()
                row.template_list(netsettings, "jobs", netsettings, "active_job_index", rows=2)
 
-               col = row.column()
-
-               subcol = col.column(align=True)
-               subcol.itemO("render.netclientstatus", icon="ICON_FILE_REFRESH", text="")
-               subcol.itemO("render.netclientcancel", icon="ICON_ZOOMOUT", text="")
-               subcol.itemO("render.netclientcancelall", icon="ICON_PANEL_CLOSE", text="")
-               subcol.itemO("render.netclientdownload", icon='ICON_RENDER_ANIMATION', text="")
+               sub = row.column(align=True)
+               sub.itemO("render.netclientstatus", icon="ICON_FILE_REFRESH", text="")
+               sub.itemO("render.netclientcancel", icon="ICON_ZOOMOUT", text="")
+               sub.itemO("render.netclientcancelall", icon="ICON_PANEL_CLOSE", text="")
+               sub.itemO("render.netclientdownload", icon='ICON_RENDER_ANIMATION', text="")
 
                if len(bpy.data.netrender_jobs) == 0 and len(netsettings.jobs) > 0:
                        while(len(netsettings.jobs) > 0):
@@ -303,8 +292,8 @@ NetRenderSettings.EnumProperty(attr="mode",
                                                                                ("RENDER_MASTER", "Master", "Act as render master"),
                                                                                ("RENDER_SLAVE", "Slave", "Act as render slave"),
                                                                        ),
-                                               name="network mode",
-                                               description="mode of operation of this instance",
+                                               name="Network mode",
+                                               description="Mode of operation of this instance",
                                                default="RENDER_CLIENT")
 
 NetRenderSettings.CollectionProperty(attr="slaves", type=NetRenderSlave, name="Slaves", description="")
index 022c0581a81954ebe281e62db0f713ed5060ad33..6772a3771cb9f614434e8501f51cf59604336b05 100644 (file)
@@ -153,66 +153,80 @@ class MESH_OT_delete_edgeloop(bpy.types.Operator):
                bpy.ops.mesh.remove_doubles()
                return ('FINISHED',)
 
-class WM_OT_context_set(bpy.types.Operator):
+rna_path_prop = bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= "")
+
+class WM_OT_context_set_boolean(bpy.types.Operator):
        '''Set a context value.'''
-       __idname__ = "wm.context_set"
+       __idname__ = "wm.context_set_boolean"
        __label__ = "Context Set"
-       __register__ = True
-       __undo__ = True
-       
-       __props__ = [
-               bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
-               bpy.props.StringProperty(attr="value", name="Value", description="Assignment value (as a string)", maxlen= 1024, default= "")
-       ]
-       
+       __props__ = [rna_path_prop, bpy.props.BoolProperty(attr="value", name="Value", description="Assignment value", default= True)]
        def execute(self, context):
                exec("context.%s=%s" % (self.path, self.value)) # security nuts will complain.
                return ('FINISHED',)
 
+class WM_OT_context_set_int(bpy.types.Operator): # same as enum
+       '''Set a context value.'''
+       __idname__ = "wm.context_set_int"
+       __label__ = "Context Set"
+       __props__ = [rna_path_prop, bpy.props.IntProperty(attr="value", name="Value", description="Assignment value", default= 0)]
+       def execute(self, context):
+               exec("context.%s=%d" % (self.path, self.value)) # security nuts will complain.
+               return ('FINISHED',)
+               
+class WM_OT_context_set_float(bpy.types.Operator): # same as enum
+       '''Set a context value.'''
+       __idname__ = "wm.context_set_int"
+       __label__ = "Context Set"
+       __props__ = [rna_path_prop, bpy.props.FloatProperty(attr="value", name="Value", description="Assignment value", default= 0.0)]
+       def execute(self, context):
+               exec("context.%s=%f" % (self.path, self.value)) # security nuts will complain.
+               return ('FINISHED',)
+
+class WM_OT_context_set_string(bpy.types.Operator): # same as enum
+       '''Set a context value.'''
+       __idname__ = "wm.context_set_string"
+       __label__ = "Context Set"
+       __props__ = [rna_path_prop, bpy.props.StringProperty(attr="value", name="Value", description="Assignment value", maxlen= 1024, default= "")]
+       def execute(self, context):
+               exec("context.%s='%s'" % (self.path, self.value)) # security nuts will complain.
+               return ('FINISHED',)
+
+class WM_OT_context_set_enum(bpy.types.Operator):
+       '''Set a context value.'''
+       __idname__ = "wm.context_set_enum"
+       __label__ = "Context Set"
+       __props__ = [rna_path_prop, bpy.props.StringProperty(attr="value", name="Value", description="Assignment value (as a string)", maxlen= 1024, default= "")]
+       def execute(self, context):
+               exec("context.%s='%s'" % (self.path, self.value)) # security nuts will complain.
+               return ('FINISHED',)
+
 class WM_OT_context_toggle(bpy.types.Operator):
        '''Toggle a context value.'''
        __idname__ = "wm.context_toggle"
        __label__ = "Context Toggle"
-       __register__ = True
-       __undo__ = True
-       
-       __props__ = [
-               bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
-       ]
-       
+       __props__ = [rna_path_prop]
        def execute(self, context):
                exec("context.%s=not (context.%s)" % (self.path, self.path)) # security nuts will complain.
                return ('FINISHED',)
 
-class WM_OT_context_toggle_values(bpy.types.Operator):
+class WM_OT_context_toggle_enum(bpy.types.Operator):
        '''Toggle a context value.'''
-       __idname__ = "wm.context_toggle_values"
+       __idname__ = "wm.context_toggle_enum"
        __label__ = "Context Toggle Values"
-       __register__ = True
-       __undo__ = True
-       
        __props__ = [
-               bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
-               bpy.props.StringProperty(attr="value_1", name="Value", description="Toggle value (as a string)", maxlen= 1024, default= ""),
-               bpy.props.StringProperty(attr="value_2", name="Value", description="Toggle value (as a string)", maxlen= 1024, default= "")
+               rna_path_prop,
+               bpy.props.StringProperty(attr="value_1", name="Value", description="Toggle enum", maxlen= 1024, default= ""),
+               bpy.props.StringProperty(attr="value_2", name="Value", description="Toggle enum", maxlen= 1024, default= "")
        ]
-       
        def execute(self, context):
-               exec("context.%s = [%s, %s][context.%s!=%s]" % (self.path, self.value_1, self.value_2, self.path, self.value_2)) # security nuts will complain.
+               exec("context.%s = ['%s', '%s'][context.%s!='%s']" % (self.path, self.value_1, self.value_2, self.path, self.value_2)) # security nuts will complain.
                return ('FINISHED',)
 
 class WM_OT_context_cycle_enum(bpy.types.Operator):
        '''Toggle a context value.'''
        __idname__ = "wm.context_cycle_enum"
        __label__ = "Context Enum Cycle"
-       __register__ = True
-       __undo__ = True
-       
-       __props__ = [
-               bpy.props.StringProperty(attr="path", name="Context Attributes", description="rna context string", maxlen= 1024, default= ""),
-               bpy.props.BoolProperty(attr="reverse", name="Reverse", description="Cycle backwards", default= False)
-       ]
-       
+       __props__ = [rna_path_prop, bpy.props.BoolProperty(attr="reverse", name="Reverse", description="Cycle backwards", default= False)]
        def execute(self, context):
                orig_value = eval("context.%s" % self.path) # security nuts will complain.
                
@@ -245,8 +259,12 @@ class WM_OT_context_cycle_enum(bpy.types.Operator):
 
 bpy.ops.add(MESH_OT_delete_edgeloop)
 
-bpy.ops.add(WM_OT_context_set)
+bpy.ops.add(WM_OT_context_set_boolean)
+bpy.ops.add(WM_OT_context_set_int)
+bpy.ops.add(WM_OT_context_set_float)
+bpy.ops.add(WM_OT_context_set_string)
+bpy.ops.add(WM_OT_context_set_enum)
 bpy.ops.add(WM_OT_context_toggle)
-bpy.ops.add(WM_OT_context_toggle_values)
+bpy.ops.add(WM_OT_context_toggle_enum)
 bpy.ops.add(WM_OT_context_cycle_enum)
 
index 9344294ff9e185d56cb6e8e99f64d0980f0928f8..bbec295a165b9348ba2ff0a74dd105f7a4a4a004 100644 (file)
@@ -88,7 +88,7 @@ class DATA_PT_bone_groups(DataButtonsPanel):
                pose = ob.pose
                
                row = layout.row()
-               row.template_list(pose, "bone_groups", pose, "active_bone_group_index")
+               row.template_list(pose, "bone_groups", pose, "active_bone_group_index", rows=2)
                
                col = row.column(align=True)
                col.active = (ob.proxy == None)
index 055cbb02e3fd62d9619fdf0d19d9cbcfee4e498f..35d0ecafdf1b5176af835d33c74ef0a1448c302c 100644 (file)
@@ -60,6 +60,9 @@ class DATA_PT_settings(DataButtonsPanel):
                
                col = split.column()
                col.itemR(mesh, "texture_mesh")
+               
+               col = split.column()
+               col.itemR(mesh, "use_mirror_x")
 
 class DATA_PT_vertex_groups(DataButtonsPanel):
        __label__ = "Vertex Groups"
@@ -79,9 +82,9 @@ class DATA_PT_vertex_groups(DataButtonsPanel):
                col.itemO("object.vertex_group_add", icon='ICON_ZOOMIN', text="")
                col.itemO("object.vertex_group_remove", icon='ICON_ZOOMOUT', text="")
 
-               col.itemO("object.vertex_group_copy", icon='ICON_COPYDOWN', text="")
+               col.itemO("object.vertex_group_copy", icon='ICON_COPY_ID', text="")
                if ob.data.users > 1:
-                       col.itemO("object.vertex_group_copy_to_linked", icon='ICON_COPYDOWN', text="")
+                       col.itemO("object.vertex_group_copy_to_linked", icon='ICON_LINK_AREA', text="")
 
                group = ob.active_vertex_group
                if group:
@@ -122,13 +125,14 @@ class DATA_PT_shape_keys(DataButtonsPanel):
                subcol = col.column(align=True)
                subcol.itemO("object.shape_key_add", icon='ICON_ZOOMIN', text="")
                subcol.itemO("object.shape_key_remove", icon='ICON_ZOOMOUT', text="")
+               subcol.itemO("object.shape_key_mirror", icon='ICON_MOD_MIRROR', text="")
 
                if kb:
                        col.itemS()
 
                        subcol = col.column(align=True)
                        subcol.itemR(ob, "shape_key_lock", icon='ICON_UNPINNED', text="")
-                       subcol.itemR(kb, "mute", icon='ICON_MUTE_IPO_ON', text="")
+                       subcol.itemR(kb, "mute", icon='ICON_MUTE_IPO_OFF', text="")
 
                        if key.relative:
                                row = layout.row()
@@ -142,7 +146,8 @@ class DATA_PT_shape_keys(DataButtonsPanel):
                                        
                                        row = layout.row()
                                        row.enabled = ob.shape_key_lock == False
-                                       row.itemR(kb, "value", slider=True)
+                                       row.itemR(kb, "value")
+                                       row.itemO("object.shape_key_clear", icon='ICON_X', text="")
                                        
                                        split = layout.split()
                                        sub = split.column(align=True)
index 5f5d4f916d0ca39021a33b3c62f2b758188a5912..bf25289333ff1a60774b172980291ed16b4f7934 100644 (file)
@@ -158,16 +158,16 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel):
 bpy.types.register(PHYSICS_PT_game_physics)
 bpy.types.register(PHYSICS_PT_game_collision_bounds)
 
-class SceneButtonsPanel(bpy.types.Panel):
+class RenderButtonsPanel(bpy.types.Panel):
        __space_type__ = 'PROPERTIES'
        __region_type__ = 'WINDOW'
-       __context__ = "scene"
+       __context__ = "render"
 
        def poll(self, context):
                rd = context.scene.render_data
                return (rd.engine == 'BLENDER_GAME')
 
-class SCENE_PT_game(SceneButtonsPanel):
+class RENDER_PT_game(RenderButtonsPanel):
        __label__ = "Game"
 
        def draw(self, context):
@@ -177,7 +177,7 @@ class SCENE_PT_game(SceneButtonsPanel):
                row.itemO("view3d.game_start", text="Start")
                row.itemL()
 
-class SCENE_PT_game_player(SceneButtonsPanel):
+class RENDER_PT_game_player(RenderButtonsPanel):
        __label__ = "Standalone Player"
 
        def draw(self, context):
@@ -208,7 +208,7 @@ class SCENE_PT_game_player(SceneButtonsPanel):
                if gs.framing_type == 'LETTERBOX':
                        col.itemR(gs, "framing_color", text="")
 
-class SCENE_PT_game_stereo(SceneButtonsPanel):
+class RENDER_PT_game_stereo(RenderButtonsPanel):
        __label__ = "Stereo"
 
        def draw(self, context):
@@ -257,7 +257,7 @@ class SCENE_PT_game_stereo(SceneButtonsPanel):
                
                        layout.itemR(gs, "dome_text")
 
-class SCENE_PT_game_shading(SceneButtonsPanel):
+class RENDER_PT_game_shading(RenderButtonsPanel):
        __label__ = "Shading"
 
        def draw(self, context):
@@ -279,7 +279,7 @@ class SCENE_PT_game_shading(SceneButtonsPanel):
                        col.itemR(gs, "glsl_nodes", text="Nodes")
                        col.itemR(gs, "glsl_extra_textures", text="Extra Textures")
 
-class SCENE_PT_game_performance(SceneButtonsPanel):
+class RENDER_PT_game_performance(RenderButtonsPanel):
        __label__ = "Performance"
 
        def draw(self, context):
@@ -301,7 +301,7 @@ class SCENE_PT_game_performance(SceneButtonsPanel):
                col.itemR(gs, "all_frames")
                col.itemR(gs, "display_lists")
                
-class SCENE_PT_game_sound(SceneButtonsPanel):
+class RENDER_PT_game_sound(RenderButtonsPanel):
        __label__ = "Sound"
 
        def draw(self, context):
@@ -313,12 +313,12 @@ class SCENE_PT_game_sound(SceneButtonsPanel):
                layout.itemR(scene, "speed_of_sound", text="Speed")
                layout.itemR(scene, "doppler_factor")
 
-bpy.types.register(SCENE_PT_game)
-bpy.types.register(SCENE_PT_game_player)
-bpy.types.register(SCENE_PT_game_stereo)
-bpy.types.register(SCENE_PT_game_shading)
-bpy.types.register(SCENE_PT_game_performance)
-bpy.types.register(SCENE_PT_game_sound)
+bpy.types.register(RENDER_PT_game)
+bpy.types.register(RENDER_PT_game_player)
+bpy.types.register(RENDER_PT_game_stereo)
+bpy.types.register(RENDER_PT_game_shading)
+bpy.types.register(RENDER_PT_game_performance)
+bpy.types.register(RENDER_PT_game_sound)
 
 class WorldButtonsPanel(bpy.types.Panel):
        __space_type__ = 'PROPERTIES'
index fbd2df381e0ec3803adf7a0e926c038783761c40..e38eb583447ee2a8ca564a2629ca0ea146bb7148 100644 (file)
@@ -59,7 +59,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel):
                        col = row.column(align=True)
                        col.itemO("object.material_slot_add", icon='ICON_ZOOMIN', text="")
                        col.itemO("object.material_slot_remove", icon='ICON_ZOOMOUT', text="")
-                       col.itemO("object.material_slot_copy", icon='ICON_COPYDOWN', text="")
+                       col.itemO("object.material_slot_copy", icon='ICON_COPY_ID', text="")
 
                        if ob.mode == 'EDIT':
                                row = layout.row(align=True)
@@ -202,6 +202,9 @@ class MATERIAL_PT_options(MaterialButtonsPanel):
                col.itemR(mat, "sky")
                col.itemR(mat, "exclude_mist")
                col.itemR(mat, "invert_z")
+               sub = col.row()
+               sub.itemR(mat, "z_offset")
+               sub.active = mat.transparency and mat.transparency_method == 'Z_TRANSPARENCY'
                sub = col.column(align=True)
                sub.itemL(text="Light Group:")
                sub.itemR(mat, "light_group", text="")
index 6be166e8af0158230c41b9bd57b2751af09bf4ba..63fe27f2e4b5b50da573ad494e7f9e6308062b23 100644 (file)
@@ -50,6 +50,7 @@ class ConstraintButtonsPanel(bpy.types.Panel):
                                layout.item_pointerR(con, "subtarget", con.target, "vertex_groups", text="Vertex Group")
 
        def ik_template(self, layout, con):
+               # only used for iTaSC
                layout.itemR(con, "pole_target")
        
                if con.pole_target and con.pole_target.type == 'ARMATURE':
@@ -60,14 +61,14 @@ class ConstraintButtonsPanel(bpy.types.Panel):
                        row.itemL()
                        row.itemR(con, "pole_angle")
                
-               split = layout.split()
+               split = layout.split(percentage=0.33)
                col = split.column()
                col.itemR(con, "tail")
                col.itemR(con, "stretch")
 
                col = split.column()
-               col.itemR(con, "iterations")
                col.itemR(con, "chain_length")
+               col.itemR(con, "targetless")
 
        def CHILD_OF(self, context, layout, con):
                self.target_template(layout, con)
@@ -115,24 +116,74 @@ class ConstraintButtonsPanel(bpy.types.Panel):
                        layout.itemR(con, "ik_type")
                        getattr(self, "IK_"+con.ik_type)(context, layout, con)
                else:
-                       self.IK_COPY_POSE(context, layout, con)
+                       # Legacy IK constraint
+                       self.target_template(layout, con)
+                       layout.itemR(con, "pole_target")
+       
+                       if con.pole_target and con.pole_target.type == 'ARMATURE':
+                               layout.item_pointerR(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone")
+               
+                       if con.pole_target:
+                               row = layout.row()
+                               row.itemL()
+                               row.itemR(con, "pole_angle")
+               
+                       split = layout.split()
+                       col = split.column()
+                       col.itemR(con, "tail")
+                       col.itemR(con, "stretch")
+
+                       col = split.column()
+                       col.itemR(con, "iterations")
+                       col.itemR(con, "chain_length")
+                       
+                       split = layout.split()
+                       col = split.column()
+                       col.itemL()
+                       col.itemR(con, "targetless")
+                       col.itemR(con, "rotation")
+
+                       col = split.column()
+                       col.itemL(text="Weight:")
+                       col.itemR(con, "weight", text="Position", slider=True)
+                       sub = col.column()
+                       sub.active = con.rotation
+                       sub.itemR(con, "orient_weight", text="Rotation", slider=True)
 
        def IK_COPY_POSE(self, context, layout, con):
                self.target_template(layout, con)
                self.ik_template(layout, con)
-
-               split = layout.split()
-               col = split.column()
-               col.itemL()
-               col.itemR(con, "targetless")
-               col.itemR(con, "rotation")
-
-               col = split.column()
-               col.itemL(text="Weight:")
-               col.itemR(con, "weight", text="Position", slider=True)
-               sub = col.column()
-               sub.active = con.rotation
-               sub.itemR(con, "orient_weight", text="Rotation", slider=True)
+       
+               row = layout.row()
+               row.itemL(text="Axis Ref:")
+               row.itemR(con, "axis_reference", expand=True)
+               split = layout.split(percentage=0.33)
+               split.row().itemR(con, "position")
+               row = split.row()
+               row.itemR(con, "weight", text="Weight", slider=True)
+               row.active = con.position
+               split = layout.split(percentage=0.33)
+               row = split.row()
+               row.itemL(text="Lock:")
+               row = split.row()
+               row.itemR(con, "pos_lock_x", text="X")
+               row.itemR(con, "pos_lock_y", text="Y")
+               row.itemR(con, "pos_lock_z", text="Z")
+               split.active = con.position
+               
+               split = layout.split(percentage=0.33)
+               split.row().itemR(con, "rotation")
+               row = split.row()
+               row.itemR(con, "orient_weight", text="Weight", slider=True)
+               row.active = con.rotation
+               split = layout.split(percentage=0.33)
+               row = split.row()
+               row.itemL(text="Lock:")
+               row = split.row()
+               row.itemR(con, "rot_lock_x", text="X")
+               row.itemR(con, "rot_lock_y", text="Y")
+               row.itemR(con, "rot_lock_z", text="Z")
+               split.active = con.rotation
                
        def IK_DISTANCE(self, context, layout, con):
                self.target_template(layout, con)
@@ -610,20 +661,13 @@ class BONE_PT_inverse_kinematics(ConstraintButtonsPanel):
                split.itemL()
 
                if ob.pose.ik_solver == "ITASC":
-                       layout.itemL(text="Joint constraint:")
-                       split = layout.split(percentage=0.3)
-                       row = split.row()
-                       row.itemR(pchan, "ik_rot_control", text="Rotation")
-                       row = split.row()
+                       row = layout.row()
+                       row.itemR(pchan, "ik_rot_control", text="Control Rotation")
                        row.itemR(pchan, "ik_rot_weight", text="Weight", slider=True)
-                       row.active = pchan.ik_rot_control
                        # not supported yet
-                       #split = layout.split(percentage=0.3)
-                       #row = split.row()
-                       #row.itemR(pchan, "ik_lin_control", text="Size")
-                       #row = split.row()
+                       #row = layout.row()
+                       #row.itemR(pchan, "ik_lin_control", text="Joint Size")
                        #row.itemR(pchan, "ik_lin_weight", text="Weight", slider=True)
-                       #row.active = pchan.ik_lin_control
 
 class BONE_PT_iksolver_itasc(ConstraintButtonsPanel):
        __label__ = "iTaSC parameters"
index 81ddab40ec9e157bd6b62755a3df118159067f4a..b0be974727aa4a6b732e3c0c46e76232c2962112 100644 (file)
@@ -6,8 +6,8 @@ from buttons_physics_common import effector_weights_ui
 from buttons_physics_common import basic_force_field_settings_ui
 from buttons_physics_common import basic_force_field_falloff_ui
 
-def particle_panel_enabled(psys):
-       return psys.point_cache.baked==False and psys.edited==False
+def particle_panel_enabled(context, psys):
+       return psys.point_cache.baked==False and psys.edited==False and (not context.particle_system_editable)
        
 def particle_panel_poll(context):
        psys = context.particle_system
@@ -78,7 +78,7 @@ class PARTICLE_PT_particles(ParticleButtonsPanel):
                                        return
                                
                                row=col.row()
-                               row.enabled = particle_panel_enabled(psys)
+                               row.enabled = particle_panel_enabled(context, psys)
                                row.itemR(part, "type", text="")
                                row.itemR(psys, "seed")
                                
@@ -89,7 +89,7 @@ class PARTICLE_PT_particles(ParticleButtonsPanel):
                                        else:
                                                split.itemL(text="")
                                        row = split.row()
-                                       row.enabled = particle_panel_enabled(psys)
+                                       row.enabled = particle_panel_enabled(context, psys)
                                        row.itemR(part, "hair_step")
                                        if psys.edited==True:
                                                if psys.global_hair:
@@ -99,7 +99,7 @@ class PARTICLE_PT_particles(ParticleButtonsPanel):
                                                        layout.itemO("particle.disconnect_hair")
                                                        layout.itemL(text="")
                                elif part.type=='REACTOR':
-                                       split.enabled = particle_panel_enabled(psys)
+                                       split.enabled = particle_panel_enabled(context, psys)
                                        split.itemR(psys, "reactor_target_object")
                                        split.itemR(psys, "reactor_target_particle_system", text="Particle System")
                
@@ -118,7 +118,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel):
                psys = context.particle_system
                part = psys.settings
                
-               layout.enabled = particle_panel_enabled(psys) and not psys.multiple_caches
+               layout.enabled = particle_panel_enabled(context, psys) and not psys.multiple_caches
                
                row = layout.row()
                row.active = part.distribution != 'GRID'
@@ -221,7 +221,7 @@ class PARTICLE_PT_cache(ParticleButtonsPanel):
 
                psys = context.particle_system
                
-               point_cache_ui(self, psys.point_cache, particle_panel_enabled(psys), not psys.hair_dynamics, 0)
+               point_cache_ui(self, psys.point_cache, particle_panel_enabled(context, psys), not psys.hair_dynamics, 0)
 
 class PARTICLE_PT_velocity(ParticleButtonsPanel):
        __label__ = "Velocity"
@@ -239,7 +239,7 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel):
                psys = context.particle_system
                part = psys.settings
                
-               layout.enabled = particle_panel_enabled(psys)
+               layout.enabled = particle_panel_enabled(context, psys)
        
                split = layout.split()
                        
@@ -284,7 +284,7 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel):
                psys = context.particle_system
                part = psys.settings
                
-               layout.enabled = particle_panel_enabled(psys)
+               layout.enabled = particle_panel_enabled(context, psys)
                
                split = layout.split()
                split.itemL(text="Initial Rotation:")
@@ -322,7 +322,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel):
                psys = context.particle_system
                part = psys.settings
                
-               layout.enabled = particle_panel_enabled(psys)
+               layout.enabled = particle_panel_enabled(context, psys)
 
                row = layout.row()
                row.itemR(part, "physics_type", expand=True)
@@ -461,7 +461,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel):
                boids = context.particle_system.settings.boids
                layout = self.layout
                
-               layout.enabled = particle_panel_enabled(context.particle_system)
+               layout.enabled = particle_panel_enabled(context, context.particle_system)
                
                # Currently boids can only use the first state so these are commented out for now.
                #row = layout.row()
diff --git a/release/scripts/ui/buttons_render.py b/release/scripts/ui/buttons_render.py
new file mode 100644 (file)
index 0000000..cd7a901
--- /dev/null
@@ -0,0 +1,488 @@
+
+import bpy
+
+class RenderButtonsPanel(bpy.types.Panel):
+       __space_type__ = 'PROPERTIES'
+       __region_type__ = 'WINDOW'
+       __context__ = "render"
+       # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
+       
+       def poll(self, context):
+               rd = context.scene.render_data
+               return (context.scene and rd.use_game_engine==False) and (rd.engine in self.COMPAT_ENGINES)
+
+class RENDER_PT_render(RenderButtonsPanel):
+       __label__ = "Render"
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+       
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+
+               row = layout.row()
+               row.itemO("screen.render", text="Image", icon='ICON_RENDER_STILL')
+               row.item_booleanO("screen.render", "animation", True, text="Animation", icon='ICON_RENDER_ANIMATION')
+
+               layout.itemR(rd, "display_mode", text="Display")
+
+class RENDER_PT_layers(RenderButtonsPanel):
+       __label__ = "Layers"
+       __default_closed__ = True
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+       
+       def draw(self, context):
+               layout = self.layout
+               
+               scene = context.scene
+               rd = scene.render_data
+
+               row = layout.row()
+               row.template_list(rd, "layers", rd, "active_layer_index", rows=2)
+
+               col = row.column(align=True)
+               col.itemO("scene.render_layer_add", icon='ICON_ZOOMIN', text="")
+               col.itemO("scene.render_layer_remove", icon='ICON_ZOOMOUT', text="")
+
+               rl = rd.layers[rd.active_layer_index]
+               
+               if rl:
+                       layout.itemR(rl, "name")
+
+               split = layout.split()
+               
+               col = split.column()
+               col.itemR(scene, "visible_layers", text="Scene")
+               col = split.column()
+               col.itemR(rl, "visible_layers", text="Layer")
+
+               layout.itemR(rl, "light_override", text="Light")
+               layout.itemR(rl, "material_override", text="Material")
+               
+               layout.itemS()
+               layout.itemL(text="Include:")
+               
+               split = layout.split()
+
+               col = split.column()
+               col.itemR(rl, "zmask")
+               row = col.row()
+               row.itemR(rl, "zmask_negate", text="Negate")
+               row.active = rl.zmask
+               col.itemR(rl, "all_z")
+
+               col = split.column()
+               col.itemR(rl, "solid")
+               col.itemR(rl, "halo")
+               col.itemR(rl, "ztransp")
+               col.itemR(rl, "sky")
+
+               col = split.column()
+               col.itemR(rl, "edge")
+               col.itemR(rl, "strand")
+               col.itemR(rl, "freestyle")
+
+               if rl.zmask:
+                       split = layout.split()
+                       split.itemL(text="Zmask Layers:")
+                       split.column().itemR(rl, "zmask_layers", text="")
+               
+               layout.itemS()
+               
+               split = layout.split()
+               
+               col = split.column()
+               col.itemL(text="Passes:")
+               col.itemR(rl, "pass_combined")
+               col.itemR(rl, "pass_z")
+               col.itemR(rl, "pass_vector")
+               col.itemR(rl, "pass_normal")
+               col.itemR(rl, "pass_uv")
+               col.itemR(rl, "pass_mist")
+               col.itemR(rl, "pass_object_index")
+
+               col = split.column()
+               col.itemL()
+               col.itemR(rl, "pass_color")
+               col.itemR(rl, "pass_diffuse")
+               row = col.row()
+               row.itemR(rl, "pass_specular")
+               row.itemR(rl, "pass_specular_exclude", text="", icon='ICON_X')
+               row = col.row()
+               row.itemR(rl, "pass_shadow")
+               row.itemR(rl, "pass_shadow_exclude", text="", icon='ICON_X')
+               row = col.row()
+               row.itemR(rl, "pass_ao")
+               row.itemR(rl, "pass_ao_exclude", text="", icon='ICON_X')
+               row = col.row()
+               row.itemR(rl, "pass_reflection")
+               row.itemR(rl, "pass_reflection_exclude", text="", icon='ICON_X')
+               row = col.row()
+               row.itemR(rl, "pass_refraction")
+               row.itemR(rl, "pass_refraction_exclude", text="", icon='ICON_X')
+
+               if rl.freestyle:
+                       layout.itemS()
+
+                       split = layout.split()
+
+                       col = split.column()
+                       col.itemL(text="Freestyle:")
+                       freestyle = rl.freestyle_settings
+                       col.itemR(freestyle, "sphere_radius", text="Sphere Radius")
+                       col.itemR(freestyle, "ridges_and_valleys", text="Ridges and Valleys")
+                       col.itemR(freestyle, "suggestive_contours", text="Suggestive Contours")
+                       col.itemR(freestyle, "dkr_epsilon", text="Dkr Epsilon")
+
+                       col.itemO("scene.freestyle_module_add", text="Add Style Module")
+
+                       for i, module in enumerate(freestyle.modules):
+                               box = layout.box()
+                               box.set_context_pointer("freestyle_module", module)
+                               row = box.row(align=True)
+                               row.itemR(module, "is_displayed", text="")
+                               row.itemR(module, "module_path", text="")
+                               row.itemO("scene.freestyle_module_remove", icon='ICON_X', text="")
+                               props = row.itemO("scene.freestyle_module_move_up", icon='VICON_MOVE_UP', text="", properties=True)
+                               props.active = (i > 0)
+                               props = row.itemO("scene.freestyle_module_move_down", icon='VICON_MOVE_DOWN', text="", properties=True)
+                               props.active = (i < len(freestyle.modules) - 1)
+
+class RENDER_PT_shading(RenderButtonsPanel):
+       __label__ = "Shading"
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+               
+               split = layout.split()
+               
+               col = split.column()
+               col.itemR(rd, "render_textures", text="Textures")
+               col.itemR(rd, "render_shadows", text="Shadows")
+               col.itemR(rd, "render_sss", text="Subsurface Scattering")
+               col.itemR(rd, "render_envmaps", text="Environment Map")
+               
+               col = split.column()
+               col.itemR(rd, "render_raytracing", text="Ray Tracing")
+               col.itemR(rd, "color_management")
+               col.itemR(rd, "alpha_mode", text="Alpha")
+
+class RENDER_PT_performance(RenderButtonsPanel):
+       __label__ = "Performance"
+       __default_closed__ = True
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+
+               split = layout.split()
+               
+               col = split.column(align=True)
+               col.itemL(text="Threads:")
+               col.row().itemR(rd, "threads_mode", expand=True)
+               sub = col.column()
+               sub.enabled = rd.threads_mode == 'THREADS_FIXED'
+               sub.itemR(rd, "threads")
+               col.itemL(text="Tiles:")
+               col.itemR(rd, "parts_x", text="X")
+               col.itemR(rd, "parts_y", text="Y")
+
+               col = split.column()
+               col.itemL(text="Memory:")
+               sub = col.column()
+               sub.itemR(rd, "save_buffers")
+               sub.enabled = not rd.full_sample
+               sub = col.column()
+               sub.active = rd.use_compositing
+               sub.itemR(rd, "free_image_textures")
+               sub = col.column()
+               sub.active = rd.render_raytracing
+               sub.itemL(text="Acceleration structure:")
+               sub.itemR(rd, "raytrace_structure", text="")
+               if rd.raytrace_structure == "OCTREE":
+                       sub.itemR(rd, "octree_resolution", text="Resolution")
+               else:
+                       sub.itemR(rd, "use_instances", text="Instances")
+               sub.itemR(rd, "use_local_coords", text="Local Coordinates")
+
+class RENDER_PT_post_processing(RenderButtonsPanel):
+       __label__ = "Post Processing"
+       __default_closed__ = True
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+
+               split = layout.split()
+
+               col = split.column()
+               col.itemR(rd, "use_compositing")
+               col.itemR(rd, "use_sequencer")
+               
+               col = split.column()
+               col.itemR(rd, "dither_intensity", text="Dither", slider=True)
+               
+               layout.itemS()
+                               
+               split = layout.split()
+               
+               col = split.column()
+               col.itemR(rd, "fields", text="Fields")
+               sub = col.column()
+               sub.active = rd.fields
+               sub.row().itemR(rd, "field_order", expand=True)
+               sub.itemR(rd, "fields_still", text="Still")
+               
+               col = split.column()
+               col.itemR(rd, "edge")
+               sub = col.column()
+               sub.active = rd.edge
+               sub.itemR(rd, "edge_threshold", text="Threshold", slider=True)
+               sub.itemR(rd, "edge_color", text="")
+               
+               layout.itemS()
+
+               split = layout.split()
+               col = split.column()
+               col.itemR(rd, "freestyle", text="Freestyle")
+               
+class RENDER_PT_output(RenderButtonsPanel):
+       __label__ = "Output"
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+               
+               layout.itemR(rd, "output_path", text="")
+
+               split = layout.split()
+               col = split.column()
+               col.itemR(rd, "file_format", text="")
+               col.row().itemR(rd, "color_mode", text="Color", expand=True)
+
+               col = split.column()
+               col.itemR(rd, "file_extensions")
+               col.itemR(rd, "use_overwrite")
+               col.itemR(rd, "use_placeholder")
+
+               if rd.file_format in ('AVIJPEG', 'JPEG'):
+                       split = layout.split()
+                       split.itemR(rd, "quality", slider=True)
+                       
+               elif rd.file_format == 'OPENEXR':
+                       split = layout.split()
+                       
+                       col = split.column()
+                       col.itemL(text="Codec:")
+                       col.itemR(rd, "exr_codec", text="")
+
+                       subsplit = split.split()
+                       col = subsplit.column()
+                       col.itemR(rd, "exr_half")
+                       col.itemR(rd, "exr_zbuf")
+                       col = subsplit.column()
+                       col.itemR(rd, "exr_preview")
+               
+               elif rd.file_format == 'JPEG2000':
+                       split = layout.split()
+                       col = split.column()
+                       col.itemL(text="Depth:")
+                       col.row().itemR(rd, "jpeg2k_depth", expand=True)
+
+                       col = split.column()
+                       col.itemR(rd, "jpeg2k_preset", text="")
+                       col.itemR(rd, "jpeg2k_ycc")
+                       
+               elif rd.file_format in ('CINEON', 'DPX'):
+                       split = layout.split()
+                       col = split.column()
+                       col.itemR(rd, "cineon_log", text="Convert to Log")
+
+                       col = split.column(align=True)
+                       col.active = rd.cineon_log
+                       col.itemR(rd, "cineon_black", text="Black")
+                       col.itemR(rd, "cineon_white", text="White")
+                       col.itemR(rd, "cineon_gamma", text="Gamma")
+                       
+               elif rd.file_format == 'TIFF':
+                       split = layout.split()
+                       split.itemR(rd, "tiff_bit")
+
+class RENDER_PT_encoding(RenderButtonsPanel):
+       __label__ = "Encoding"
+       __default_closed__ = True
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+       
+       def poll(self, context):
+               rd = context.scene.render_data
+               return rd.file_format in ('FFMPEG', 'XVID', 'H264', 'THEORA')
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+
+               split = layout.split()
+               
+               split.itemR(rd, "ffmpeg_format")
+               if rd.ffmpeg_format in ('AVI', 'QUICKTIME', 'MKV', 'OGG'):
+                       split.itemR(rd, "ffmpeg_codec")
+               else:
+                       split.itemL()
+
+               split = layout.split()
+       
+               col = split.column()
+               col.itemR(rd, "ffmpeg_video_bitrate")
+               col.itemL(text="Rate:")
+               col.itemR(rd, "ffmpeg_minrate", text="Minimum")
+               col.itemR(rd, "ffmpeg_maxrate", text="Maximum")
+               col.itemR(rd, "ffmpeg_buffersize", text="Buffer")
+               
+               col = split.column()
+               col.itemR(rd, "ffmpeg_gopsize")
+               col.itemR(rd, "ffmpeg_autosplit")
+               col.itemL(text="Mux:")
+               col.itemR(rd, "ffmpeg_muxrate", text="Rate")
+               col.itemR(rd, "ffmpeg_packetsize", text="Packet Size")
+               
+               row = layout.row()
+               row.itemL(text="Audio:")
+               row = layout.row()
+               row.itemR(rd, "ffmpeg_audio_codec")
+               
+               split = layout.split()
+
+               col = split.column()
+               col.itemR(rd, "ffmpeg_audio_bitrate")
+               col.itemR(rd, "ffmpeg_audio_mixrate")
+               col = split.column()
+               col.itemR(rd, "ffmpeg_multiplex_audio")
+               col.itemR(rd, "ffmpeg_audio_volume")
+
+class RENDER_PT_antialiasing(RenderButtonsPanel):
+       __label__ = "Anti-Aliasing"
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw_header(self, context):
+               rd = context.scene.render_data
+
+               self.layout.itemR(rd, "antialiasing", text="")
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+
+               layout.active = rd.antialiasing
+
+               split = layout.split()
+               
+               col = split.column()
+               col.row().itemR(rd, "antialiasing_samples", expand=True)
+               col.itemR(rd, "full_sample")
+
+               col = split.column()
+               col.itemR(rd, "pixel_filter", text="")
+               col.itemR(rd, "filter_size", text="Size", slider=True)
+       
+class RENDER_PT_dimensions(RenderButtonsPanel):
+       __label__ = "Dimensions"
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw(self, context):
+               layout = self.layout
+               
+               scene = context.scene
+               rd = scene.render_data
+               
+               split = layout.split()
+               
+               col = split.column()
+               sub = col.column(align=True)
+               sub.itemL(text="Resolution:")
+               sub.itemR(rd, "resolution_x", text="X")
+               sub.itemR(rd, "resolution_y", text="Y")
+               sub.itemR(rd, "resolution_percentage", text="")
+               
+               sub.itemL(text="Aspect Ratio:")
+               sub.itemR(rd, "pixel_aspect_x", text="X")
+               sub.itemR(rd, "pixel_aspect_y", text="Y")
+
+               row = col.row()
+               row.itemR(rd, "use_border", text="Border")
+               rowsub = row.row()
+               rowsub.active = rd.use_border
+               rowsub.itemR(rd, "crop_to_border", text="Crop")
+               
+               col = split.column(align=True)
+               col.itemL(text="Frame Range:")
+               col.itemR(scene, "start_frame", text="Start")
+               col.itemR(scene, "end_frame", text="End")
+               col.itemR(scene, "frame_step", text="Step")
+               
+               col.itemL(text="Frame Rate:")
+               col.itemR(rd, "fps")
+               col.itemR(rd, "fps_base",text="/")
+
+class RENDER_PT_stamp(RenderButtonsPanel):
+       __label__ = "Stamp"
+       __default_closed__ = True
+       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+
+       def draw_header(self, context):
+               rd = context.scene.render_data
+
+               self.layout.itemR(rd, "render_stamp", text="")
+
+       def draw(self, context):
+               layout = self.layout
+               
+               rd = context.scene.render_data
+
+               layout.active = rd.render_stamp
+
+               split = layout.split()
+               
+               col = split.column()
+               col.itemR(rd, "stamp_time", text="Time")
+               col.itemR(rd, "stamp_date", text="Date")
+               col.itemR(rd, "stamp_render_time", text="RenderTime")
+               col.itemR(rd, "stamp_frame", text="Frame")
+               col.itemR(rd, "stamp_scene", text="Scene")
+               col.itemR(rd, "stamp_camera", text="Camera")
+               col.itemR(rd, "stamp_filename", text="Filename")
+               col.itemR(rd, "stamp_marker", text="Marker")
+               col.itemR(rd, "stamp_sequence_strip", text="Seq. Strip")
+
+               col = split.column()
+               col.active = rd.render_stamp
+               col.itemR(rd, "stamp_foreground", slider=True)
+               col.itemR(rd, "stamp_background", slider=True)
+               col.itemR(rd, "stamp_font_size", text="Font Size")
+
+               row = layout.split(percentage=0.2)
+               row.itemR(rd, "stamp_note", text="Note")
+               sub = row.row()
+               sub.active = rd.stamp_note
+               sub.itemR(rd, "stamp_note_text", text="")
+
+bpy.types.register(RENDER_PT_render)
+bpy.types.register(RENDER_PT_layers)
+bpy.types.register(RENDER_PT_dimensions)
+bpy.types.register(RENDER_PT_antialiasing)
+bpy.types.register(RENDER_PT_shading)
+bpy.types.register(RENDER_PT_output)
+bpy.types.register(RENDER_PT_encoding)
+bpy.types.register(RENDER_PT_performance)
+bpy.types.register(RENDER_PT_post_processing)
+bpy.types.register(RENDER_PT_stamp)
index 1025d11284e64739e086a2eef4fef5e6b3819b29..ed6421d0646ca56627d51c22e244147cd311fd15 100644 (file)
@@ -1,4 +1,3 @@
-
 import bpy
 
 class SceneButtonsPanel(bpy.types.Panel):
@@ -7,483 +6,22 @@ class SceneButtonsPanel(bpy.types.Panel):
        __context__ = "scene"
        
        def poll(self, context):
-               return (context.scene != None)
-
-class RenderButtonsPanel(bpy.types.Panel):
-       __space_type__ = 'PROPERTIES'
-       __region_type__ = 'WINDOW'
-       __context__ = "scene"
-       # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
-       
-       def poll(self, context):
-               rd = context.scene.render_data
-               return (rd.use_game_engine==False) and (rd.engine in self.COMPAT_ENGINES)
+               return context.scene
 
-class SCENE_PT_render(RenderButtonsPanel):
-       __label__ = "Render"
+class SCENE_PT_scene(SceneButtonsPanel):
+       __label__ = "Scene"
        COMPAT_ENGINES = set(['BLENDER_RENDER'])
-       
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-
-               row = layout.row()
-               row.itemO("screen.render", text="Image", icon='ICON_RENDER_STILL')
-               row.item_booleanO("screen.render", "animation", True, text="Animation", icon='ICON_RENDER_ANIMATION')
 
-               layout.itemR(rd, "display_mode", text="Display")
-
-class SCENE_PT_layers(RenderButtonsPanel):
-       __label__ = "Layers"
-       __default_closed__ = True
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-       
        def draw(self, context):
                layout = self.layout
                
                scene = context.scene
-               rd = scene.render_data
-
-               row = layout.row()
-               row.template_list(rd, "layers", rd, "active_layer_index", rows=2)
-
-               col = row.column(align=True)
-               col.itemO("scene.render_layer_add", icon='ICON_ZOOMIN', text="")
-               col.itemO("scene.render_layer_remove", icon='ICON_ZOOMOUT', text="")
-
-               rl = rd.layers[rd.active_layer_index]
-
-               split = layout.split()
-               
-               col = split.column()
-               col.itemR(scene, "visible_layers", text="Scene")
-               col = split.column()
-               col.itemR(rl, "visible_layers", text="Layer")
-
-               layout.itemR(rl, "light_override", text="Light")
-               layout.itemR(rl, "material_override", text="Material")
-               
-               layout.itemS()
-               layout.itemL(text="Include:")
-               
-               split = layout.split()
-
-               col = split.column()
-               col.itemR(rl, "zmask")
-               row = col.row()
-               row.itemR(rl, "zmask_negate", text="Negate")
-               row.active = rl.zmask
-               col.itemR(rl, "all_z")
-
-               col = split.column()
-               col.itemR(rl, "solid")
-               col.itemR(rl, "halo")
-               col.itemR(rl, "ztransp")
-               col.itemR(rl, "sky")
-
-               col = split.column()
-               col.itemR(rl, "edge")
-               col.itemR(rl, "strand")
-               col.itemR(rl, "freestyle")
-
-               if rl.zmask:
-                       split = layout.split()
-                       split.itemL(text="Zmask Layers:")
-                       split.column().itemR(rl, "zmask_layers", text="")
-               
-               layout.itemS()
-               
-               split = layout.split()
-               
-               col = split.column()
-               col.itemL(text="Passes:")
-               col.itemR(rl, "pass_combined")
-               col.itemR(rl, "pass_z")
-               col.itemR(rl, "pass_vector")
-               col.itemR(rl, "pass_normal")
-               col.itemR(rl, "pass_uv")
-               col.itemR(rl, "pass_mist")
-               col.itemR(rl, "pass_object_index")
-
-               col = split.column()
-               col.itemL()
-               col.itemR(rl, "pass_color")
-               col.itemR(rl, "pass_diffuse")
-               row = col.row()
-               row.itemR(rl, "pass_specular")
-               row.itemR(rl, "pass_specular_exclude", text="", icon='ICON_X')
-               row = col.row()
-               row.itemR(rl, "pass_shadow")
-               row.itemR(rl, "pass_shadow_exclude", text="", icon='ICON_X')
-               row = col.row()
-               row.itemR(rl, "pass_ao")
-               row.itemR(rl, "pass_ao_exclude", text="", icon='ICON_X')
-               row = col.row()
-               row.itemR(rl, "pass_reflection")
-               row.itemR(rl, "pass_reflection_exclude", text="", icon='ICON_X')
-               row = col.row()
-               row.itemR(rl, "pass_refraction")
-               row.itemR(rl, "pass_refraction_exclude", text="", icon='ICON_X')
-
-               if rl.freestyle:
-                       layout.itemS()
-
-                       split = layout.split()
-
-                       col = split.column()
-                       col.itemL(text="Freestyle:")
-                       freestyle = rl.freestyle_settings
-                       col.itemR(freestyle, "sphere_radius", text="Sphere Radius")
-                       col.itemR(freestyle, "ridges_and_valleys", text="Ridges and Valleys")
-                       col.itemR(freestyle, "suggestive_contours", text="Suggestive Contours")
-                       col.itemR(freestyle, "dkr_epsilon", text="Dkr Epsilon")
-
-                       col.itemO("scene.freestyle_module_add", text="Add Style Module")
-
-                       for i, module in enumerate(freestyle.modules):
-                               box = layout.box()
-                               box.set_context_pointer("freestyle_module", module)
-                               row = box.row(align=True)
-                               row.itemR(module, "is_displayed", text="")
-                               row.itemR(module, "module_path", text="")
-                               row.itemO("scene.freestyle_module_remove", icon='ICON_X', text="")
-                               props = row.itemO("scene.freestyle_module_move_up", icon='VICON_MOVE_UP', text="", properties=True)
-                               props.active = (i > 0)
-                               props = row.itemO("scene.freestyle_module_move_down", icon='VICON_MOVE_DOWN', text="", properties=True)
-                               props.active = (i < len(freestyle.modules) - 1)
 
-class SCENE_PT_shading(RenderButtonsPanel):
-       __label__ = "Shading"
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-               
-               split = layout.split()
-               
-               col = split.column()
-               col.itemR(rd, "render_textures", text="Textures")
-               col.itemR(rd, "render_shadows", text="Shadows")
-               col.itemR(rd, "render_sss", text="Subsurface Scattering")
-               col.itemR(rd, "render_envmaps", text="Environment Map")
-               
-               col = split.column()
-               col.itemR(rd, "render_raytracing", text="Ray Tracing")
-               col.itemR(rd, "color_management")
-               col.itemR(rd, "alpha_mode", text="Alpha")
-
-class SCENE_PT_performance(RenderButtonsPanel):
-       __label__ = "Performance"
-       __default_closed__ = True
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
+               layout.itemR(scene, "camera")
+               layout.itemR(scene, "set", text="Background")
 
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-
-               split = layout.split()
-               
-               col = split.column(align=True)
-               col.itemL(text="Threads:")
-               col.row().itemR(rd, "threads_mode", expand=True)
-               sub = col.column()
-               sub.enabled = rd.threads_mode == 'THREADS_FIXED'
-               sub.itemR(rd, "threads")
-               col.itemL(text="Tiles:")
-               col.itemR(rd, "parts_x", text="X")
-               col.itemR(rd, "parts_y", text="Y")
-
-               col = split.column()
-               col.itemL(text="Memory:")
-               sub = col.column()
-               sub.itemR(rd, "save_buffers")
-               sub.enabled = not rd.full_sample
-               sub = col.column()
-               sub.active = rd.use_compositing
-               sub.itemR(rd, "free_image_textures")
-               sub = col.column()
-               sub.active = rd.render_raytracing
-               sub.itemL(text="Acceleration structure:")
-               sub.itemR(rd, "raytrace_structure", text="")
-               if rd.raytrace_structure == "OCTREE":
-                       sub.itemR(rd, "octree_resolution", text="Resolution")
-               else:
-                       sub.itemR(rd, "use_instances", text="Instances")
-               sub.itemR(rd, "use_local_coords", text="Local Coordinates")
-
-class SCENE_PT_post_processing(RenderButtonsPanel):
-       __label__ = "Post Processing"
-       __default_closed__ = True
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-
-               split = layout.split()
-
-               col = split.column()
-               col.itemR(rd, "use_compositing")
-               col.itemR(rd, "use_sequencer")
-               
-               col = split.column()
-               col.itemR(rd, "dither_intensity", text="Dither", slider=True)
-               
-               layout.itemS()
-                               
-               split = layout.split()
-               
-               col = split.column()
-               col.itemR(rd, "fields", text="Fields")
-               sub = col.column()
-               sub.active = rd.fields
-               sub.row().itemR(rd, "field_order", expand=True)
-               sub.itemR(rd, "fields_still", text="Still")
-               
-               col = split.column()
-               col.itemR(rd, "edge")
-               sub = col.column()
-               sub.active = rd.edge
-               sub.itemR(rd, "edge_threshold", text="Threshold", slider=True)
-               sub.itemR(rd, "edge_color", text="")
-               
-               layout.itemS()
-
-               split = layout.split()
-               col = split.column()
-               col.itemR(rd, "freestyle", text="Freestyle")
-
-
-class SCENE_PT_output(RenderButtonsPanel):
-       __label__ = "Output"
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-               
-               layout.itemR(rd, "output_path", text="")
-
-               split = layout.split()
-               col = split.column()
-               col.itemR(rd, "file_format", text="")
-               col.row().itemR(rd, "color_mode", text="Color", expand=True)
-
-               col = split.column()
-               col.itemR(rd, "file_extensions")
-               col.itemR(rd, "use_overwrite")
-               col.itemR(rd, "use_placeholder")
-
-               if rd.file_format in ('AVIJPEG', 'JPEG'):
-                       split = layout.split()
-                       split.itemR(rd, "quality", slider=True)
-                       
-               elif rd.file_format == 'OPENEXR':
-                       split = layout.split()
-                       
-                       col = split.column()
-                       col.itemL(text="Codec:")
-                       col.itemR(rd, "exr_codec", text="")
-
-                       subsplit = split.split()
-                       col = subsplit.column()
-                       col.itemR(rd, "exr_half")
-                       col.itemR(rd, "exr_zbuf")
-                       col = subsplit.column()
-                       col.itemR(rd, "exr_preview")
-               
-               elif rd.file_format == 'JPEG2000':
-                       split = layout.split()
-                       col = split.column()
-                       col.itemL(text="Depth:")
-                       col.row().itemR(rd, "jpeg2k_depth", expand=True)
-
-                       col = split.column()
-                       col.itemR(rd, "jpeg2k_preset", text="")
-                       col.itemR(rd, "jpeg2k_ycc")
-                       
-               elif rd.file_format in ('CINEON', 'DPX'):
-                       split = layout.split()
-                       col = split.column()
-                       col.itemR(rd, "cineon_log", text="Convert to Log")
-
-                       col = split.column(align=True)
-                       col.active = rd.cineon_log
-                       col.itemR(rd, "cineon_black", text="Black")
-                       col.itemR(rd, "cineon_white", text="White")
-                       col.itemR(rd, "cineon_gamma", text="Gamma")
-                       
-               elif rd.file_format == 'TIFF':
-                       split = layout.split()
-                       split.itemR(rd, "tiff_bit")
-
-class SCENE_PT_encoding(RenderButtonsPanel):
-       __label__ = "Encoding"
-       __default_closed__ = True
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-       
-       def poll(self, context):
-               rd = context.scene.render_data
-               return rd.file_format in ('FFMPEG', 'XVID', 'H264', 'THEORA')
-
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-
-               split = layout.split()
-               
-               split.itemR(rd, "ffmpeg_format")
-               if rd.ffmpeg_format in ('AVI', 'QUICKTIME', 'MKV', 'OGG'):
-                       split.itemR(rd, "ffmpeg_codec")
-               else:
-                       split.itemL()
-
-               split = layout.split()
-       
-               col = split.column()
-               col.itemR(rd, "ffmpeg_video_bitrate")
-               col.itemL(text="Rate:")
-               col.itemR(rd, "ffmpeg_minrate", text="Minimum")
-               col.itemR(rd, "ffmpeg_maxrate", text="Maximum")
-               col.itemR(rd, "ffmpeg_buffersize", text="Buffer")
-               
-               col = split.column()
-               col.itemR(rd, "ffmpeg_gopsize")
-               col.itemR(rd, "ffmpeg_autosplit")
-               col.itemL(text="Mux:")
-               col.itemR(rd, "ffmpeg_muxrate", text="Rate")
-               col.itemR(rd, "ffmpeg_packetsize", text="Packet Size")
-               
-               row = layout.row()
-               row.itemL(text="Audio:")
-               row = layout.row()
-               row.itemR(rd, "ffmpeg_audio_codec")
-               
-               split = layout.split()
-
-               col = split.column()
-               col.itemR(rd, "ffmpeg_audio_bitrate")
-               col.itemR(rd, "ffmpeg_audio_mixrate")
-               col = split.column()
-               col.itemR(rd, "ffmpeg_multiplex_audio")
-               col.itemR(rd, "ffmpeg_audio_volume")
-
-class SCENE_PT_antialiasing(RenderButtonsPanel):
-       __label__ = "Anti-Aliasing"
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-
-       def draw_header(self, context):
-               rd = context.scene.render_data
-
-               self.layout.itemR(rd, "antialiasing", text="")
-
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-
-               layout.active = rd.antialiasing
-
-               split = layout.split()
-               
-               col = split.column()
-               col.row().itemR(rd, "antialiasing_samples", expand=True)
-               col.itemR(rd, "full_sample")
-
-               col = split.column()
-               col.itemR(rd, "pixel_filter", text="")
-               col.itemR(rd, "filter_size", text="Size", slider=True)
-       
-class SCENE_PT_dimensions(RenderButtonsPanel):
-       __label__ = "Dimensions"
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-
-       def draw(self, context):
-               layout = self.layout
-               
-               scene = context.scene
-               rd = scene.render_data
-               
-               split = layout.split()
-               
-               col = split.column()
-               sub = col.column(align=True)
-               sub.itemL(text="Resolution:")
-               sub.itemR(rd, "resolution_x", text="X")
-               sub.itemR(rd, "resolution_y", text="Y")
-               sub.itemR(rd, "resolution_percentage", text="")
-               
-               sub.itemL(text="Aspect Ratio:")
-               sub.itemR(rd, "pixel_aspect_x", text="X")
-               sub.itemR(rd, "pixel_aspect_y", text="Y")
-
-               row = col.row()
-               row.itemR(rd, "use_border", text="Border")
-               rowsub = row.row()
-               rowsub.active = rd.use_border
-               rowsub.itemR(rd, "crop_to_border", text="Crop")
-               
-               col = split.column(align=True)
-               col.itemL(text="Frame Range:")
-               col.itemR(scene, "start_frame", text="Start")
-               col.itemR(scene, "end_frame", text="End")
-               col.itemR(scene, "frame_step", text="Step")
-               
-               col.itemL(text="Frame Rate:")
-               col.itemR(rd, "fps")
-               col.itemR(rd, "fps_base",text="/")
-
-class SCENE_PT_stamp(RenderButtonsPanel):
-       __label__ = "Stamp"
-       __default_closed__ = True
-       COMPAT_ENGINES = set(['BLENDER_RENDER'])
-
-       def draw_header(self, context):
-               rd = context.scene.render_data
-
-               self.layout.itemR(rd, "render_stamp", text="")
-
-       def draw(self, context):
-               layout = self.layout
-               
-               rd = context.scene.render_data
-
-               layout.active = rd.render_stamp
-
-               split = layout.split()
-               
-               col = split.column()
-               col.itemR(rd, "stamp_time", text="Time")
-               col.itemR(rd, "stamp_date", text="Date")
-               col.itemR(rd, "stamp_frame", text="Frame")
-               col.itemR(rd, "stamp_scene", text="Scene")
-               col.itemR(rd, "stamp_camera", text="Camera")
-               col.itemR(rd, "stamp_filename", text="Filename")
-               col.itemR(rd, "stamp_marker", text="Marker")
-               col.itemR(rd, "stamp_sequence_strip", text="Seq. Strip")
-
-               col = split.column()
-               col.active = rd.render_stamp
-               col.itemR(rd, "stamp_foreground", slider=True)
-               col.itemR(rd, "stamp_background", slider=True)
-               col.itemR(rd, "stamp_font_size", text="Font Size")
-
-               row = layout.split(percentage=0.2)
-               row.itemR(rd, "stamp_note", text="Note")
-               sub = row.row()
-               sub.active = rd.stamp_note
-               sub.itemR(rd, "stamp_note_text", text="")
-
-class SCENE_PT_unit(RenderButtonsPanel):
+class SCENE_PT_unit(SceneButtonsPanel):
        __label__ = "Units"
-       __default_closed__ = True
        COMPAT_ENGINES = set(['BLENDER_RENDER'])
 
        def draw(self, context):
@@ -501,16 +39,12 @@ class SCENE_PT_unit(RenderButtonsPanel):
                
 class SCENE_PT_keying_sets(SceneButtonsPanel):
        __label__ = "Keying Sets"
-       __default_closed__ = True
        
        def draw(self, context):
                layout = self.layout
                
                scene = context.scene
                
-               row = layout.row()
-               row.itemL(text="Keying Sets:")
-               
                row = layout.row()
                
                col = row.column()
@@ -535,7 +69,6 @@ class SCENE_PT_keying_sets(SceneButtonsPanel):
                        
 class SCENE_PT_keying_set_paths(SceneButtonsPanel):
        __label__ = "Active Keying Set"
-       __default_closed__ = True
        
        def poll(self, context):
                return (context.scene != None) and (context.scene.active_keying_set != None)
@@ -562,8 +95,8 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel):
                if ksp:
                        col = layout.column()
                        col.itemL(text="Target:")
-                       col.itemR(ksp, "id")
-                       col.itemR(ksp, "rna_path")
+                       col.template_any_ID(ksp, "id", "id_type")
+                       col.template_path_builder(ksp, "rna_path", ksp.id)
                        
                        
                        row = layout.row()
@@ -579,11 +112,8 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel):
                        col.itemR(ksp, "grouping")
                        if ksp.grouping == 'NAMED':
                                col.itemR(ksp, "group")
-                               
-                       
-                       
 
-class SCENE_PT_physics(RenderButtonsPanel):
+class SCENE_PT_physics(SceneButtonsPanel):
        __label__ = "Gravity"
        COMPAT_ENGINES = set(['BLENDER_RENDER'])
 
@@ -599,18 +129,9 @@ class SCENE_PT_physics(RenderButtonsPanel):
 
                layout.itemR(scene, "gravity", text="")
 
-               
-bpy.types.register(SCENE_PT_render)
-bpy.types.register(SCENE_PT_layers)
-bpy.types.register(SCENE_PT_dimensions)
-bpy.types.register(SCENE_PT_antialiasing)
-bpy.types.register(SCENE_PT_shading)
-bpy.types.register(SCENE_PT_output)
-bpy.types.register(SCENE_PT_encoding)
-bpy.types.register(SCENE_PT_performance)
-bpy.types.register(SCENE_PT_post_processing)
-bpy.types.register(SCENE_PT_stamp)
+bpy.types.register(SCENE_PT_scene)             
 bpy.types.register(SCENE_PT_unit)
 bpy.types.register(SCENE_PT_keying_sets)
 bpy.types.register(SCENE_PT_keying_set_paths)
 bpy.types.register(SCENE_PT_physics)
+
index 0313a98674940d3e60d3cfb567a6675b531b0b7a..270ecaf19aad380688736c121cd7c7d223653079 100644 (file)
@@ -177,28 +177,7 @@ class TEXTURE_PT_mapping(TextureSlotPanel):
                                split.itemL(text="Object:")
                                split.itemR(tex, "object", text="")
                        
-               if type(idblock) == bpy.types.Material:
-                       split = layout.split(percentage=0.3)
-                       split.itemL(text="Projection:")
-                       split.itemR(tex, "mapping", text="")
-
-                       split = layout.split()
-                       
-                       col = split.column()
-                       if tex.texture_coordinates in ('ORCO', 'UV'):
-                               col.itemR(tex, "from_dupli")
-                       elif tex.texture_coordinates == 'OBJECT':
-                               col.itemR(tex, "from_original")
-                       else:
-                               col.itemL()
-                       
-                       col = split.column()
-                       row = col.row()
-                       row.itemR(tex, "x_mapping", text="")
-                       row.itemR(tex, "y_mapping", text="")
-                       row.itemR(tex, "z_mapping", text="")
-
-               elif type(idblock) == bpy.types.Brush:
+               if type(idblock) == bpy.types.Brush:
                        layout.itemR(tex, "map_mode", expand=True)
                        
                        row = layout.row()
@@ -209,9 +188,32 @@ class TEXTURE_PT_mapping(TextureSlotPanel):
                        row.active = tex.map_mode in ('TILED', '3D')
                        row.column().itemR(tex, "size")
                else:
+                       if type(idblock) == bpy.types.Material:
+                               split = layout.split(percentage=0.3)
+                               split.itemL(text="Projection:")
+                               split.itemR(tex, "mapping", text="")
+
+                               split = layout.split()
+                               
+                               col = split.column()
+                               if tex.texture_coordinates in ('ORCO', 'UV'):
+                                       col.itemR(tex, "from_dupli")
+                               elif tex.texture_coordinates == 'OBJECT':
+                                       col.itemR(tex, "from_original")
+                               else:
+                                       col.itemL()
+                               
+                               col = split.column()
+                               row = col.row()
+                               row.itemR(tex, "x_mapping", text="")
+                               row.itemR(tex, "y_mapping", text="")
+                               row.itemR(tex, "z_mapping", text="")
+                       
+                       # any non brush
                        row = layout.row()
                        row.column().itemR(tex, "offset")
                        row.column().itemR(tex, "size")
+                       
 
 class TEXTURE_PT_influence(TextureSlotPanel):
        __label__ = "Influence"
index f1ea5555787bdb69df73644f21a12ba9bdb49815..5b0c189464f83e4f37d2777b0d2e8ee37221ca55 100644 (file)
@@ -12,11 +12,17 @@ class FILEBROWSER_HT_header(bpy.types.Header):
                
                layout.template_header(menus=False)
                
+               row = layout.row()
+               row.itemS()
+               
                row = layout.row(align=True)
+               row.itemO("file.previous", text="", icon='ICON_BACK')
+               row.itemO("file.next", text="", icon='ICON_FORWARD')
                row.itemO("file.parent", text="", icon='ICON_FILE_PARENT')
                row.itemO("file.refresh", text="", icon='ICON_FILE_REFRESH')
-               row.itemO("file.previous", text="", icon='ICON_PREV_KEYFRAME')
-               row.itemO("file.next", text="", icon='ICON_NEXT_KEYFRAME')
+               
+               row = layout.row()
+               row.itemS()
                
                row = layout.row(align=True)
                row.itemO("file.directory_new", text="", icon='ICON_NEWFOLDER')
@@ -24,8 +30,8 @@ class FILEBROWSER_HT_header(bpy.types.Header):
                layout.itemR(params, "display", expand=True, text="")
                layout.itemR(params, "sort", expand=True, text="")
                
-               layout.itemR(params, "hide_dot")
-               layout.itemR(params, "do_filter")
+               layout.itemR(params, "hide_dot", text="Hide Invisible")
+               layout.itemR(params, "do_filter", text="", icon='ICON_FILTER')
                
                row = layout.row(align=True)
                row.itemR(params, "filter_folder", text="");
index aef90d818d1e1e94602755da8a6449eacabc768a..7246159be7a66378a8d40f9387a47f3e673ae6ce 100644 (file)
@@ -48,19 +48,19 @@ class INFO_MT_file(bpy.types.Menu):
                layout = self.layout
 
                layout.operator_context = "EXEC_AREA"
-               layout.itemO("wm.read_homefile", text="New")
+               layout.itemO("wm.read_homefile", text="New", icon='ICON_NEW')
                layout.operator_context = "INVOKE_AREA"
-               layout.itemO("wm.open_mainfile", text="Open...")
+               layout.itemO("wm.open_mainfile", text="Open...", icon='ICON_FILE_FOLDER')
                layout.item_menu_enumO("wm.open_recentfile", "file", text="Open Recent")
                layout.itemO("wm.recover_last_session")
 
                layout.itemS()
 
                layout.operator_context = "EXEC_AREA"
-               layout.itemO("wm.save_mainfile", text="Save")
+               layout.itemO("wm.save_mainfile", text="Save", icon='ICON_FILE_TICK')
                layout.operator_context = "INVOKE_AREA"
                layout.itemO("wm.save_as_mainfile", text="Save As...")
-               layout.itemO("screen.userpref_show", text="User Preferences...")
+               layout.itemO("screen.userpref_show", text="User Preferences...", icon='ICON_PREFERENCES')
 
                layout.itemS()
                layout.operator_context = "INVOKE_AREA"
@@ -78,7 +78,7 @@ class INFO_MT_file(bpy.types.Menu):
                layout.itemS()
 
                layout.operator_context = "EXEC_AREA"
-               layout.itemO("wm.exit_blender", text="Quit")
+               layout.itemO("wm.exit_blender", text="Quit", icon='ICON_QUIT')
 
 
 # test for expanding menus
@@ -124,20 +124,20 @@ class INFO_MT_file_external_data(bpy.types.Menu):
 
 
 class INFO_MT_mesh_add(dynamic_menu.DynMenu):
-       __label__ = "Add Mesh"
+       __label__ = "Mesh"
        def draw(self, context):
                layout = self.layout
                layout.operator_context = 'INVOKE_REGION_WIN'
-               layout.itemO("mesh.primitive_plane_add", icon='ICON_MESH_PLANE')
-               layout.itemO("mesh.primitive_cube_add", icon='ICON_MESH_CUBE')
-               layout.itemO("mesh.primitive_circle_add", icon='ICON_MESH_CIRCLE')
-               layout.itemO("mesh.primitive_uv_sphere_add", icon='ICON_MESH_UVSPHERE')
-               layout.itemO("mesh.primitive_ico_sphere_add", icon='ICON_MESH_ICOSPHERE')
-               layout.itemO("mesh.primitive_cylinder_add", icon='ICON_MESH_TUBE')
-               layout.itemO("mesh.primitive_cone_add", icon='ICON_MESH_CONE')
+               layout.itemO("mesh.primitive_plane_add", icon='ICON_MESH_PLANE', text="Plane")
+               layout.itemO("mesh.primitive_cube_add", icon='ICON_MESH_CUBE', text="Cube")
+               layout.itemO("mesh.primitive_circle_add", icon='ICON_MESH_CIRCLE', text="Circle")
+               layout.itemO("mesh.primitive_uv_sphere_add", icon='ICON_MESH_UVSPHERE', text="UV Sphere")
+               layout.itemO("mesh.primitive_ico_sphere_add", icon='ICON_MESH_ICOSPHERE', text="Icosphere")
+               layout.itemO("mesh.primitive_cylinder_add", icon='ICON_MESH_TUBE', text="Tube")
+               layout.itemO("mesh.primitive_cone_add", icon='ICON_MESH_CONE', text="Cone")
                layout.itemS()
-               layout.itemO("mesh.primitive_grid_add", icon='ICON_MESH_GRID')
-               layout.itemO("mesh.primitive_monkey_add", icon='ICON_MESH_MONKEY')
+               layout.itemO("mesh.primitive_grid_add", icon='ICON_MESH_GRID', text="Grid")
+               layout.itemO("mesh.primitive_monkey_add", icon='ICON_MESH_MONKEY', text="Monkey")
 
 class INFO_MT_add(bpy.types.Menu):
        __label__ = "Add"
@@ -212,7 +212,7 @@ class INFO_MT_help(bpy.types.Menu):
        def draw(self, context):
                layout = self.layout
 
-               layout.itemO("help.manual", icon='ICON_URL')
+               layout.itemO("help.manual", icon='ICON_HELP')
                layout.itemO("help.release_logs", icon='ICON_URL')
 
                layout.itemS()
index f3c45983d7625c91e6ddeb9855ec4e0ff2804e1f..87c31e1aa949db29641c9e2cd9977d6b959b7cbd 100644 (file)
@@ -5,9 +5,11 @@ class OUTLINER_HT_header(bpy.types.Header):
        __space_type__ = 'OUTLINER'
 
        def draw(self, context):
-               so = context.space_data
-               sce = context.scene
                layout = self.layout
+               
+               space = context.space_data
+               scene = context.scene
+               ks = context.scene.active_keying_set
 
                row = layout.row(align=True)
                row.template_header()
@@ -15,37 +17,40 @@ class OUTLINER_HT_header(bpy.types.Header):
                if context.area.show_menus:
                        sub = row.row(align=True)
                        sub.itemM("OUTLINER_MT_view")
-                       
-               row = layout.row()
-               row.itemR(so, "display_mode", text="")
+
+               layout.itemR(space, "display_mode", text="")
                
-               if so.display_mode == 'DATABLOCKS':
-                       row = layout.row(align=True)
-                       row.itemO("anim.keyingset_add_new", text="", icon=31)
-                       # row.itemR(sce, "active_keyingset", text="KS: ")
-                       # ks = sce.keyingsets[sce.active_keyingset - 1]
-                       # row.itemR(ks, "name", text="")
-                       ## row.itemR(sce, "keyingsets")
-                       
-                       row = layout.row()
-                       row.itemO("outliner.keyingset_add_selected", text="", icon=31)
-                       row.itemO("outliner.keyingset_remove_selected", text="", icon=32)
-                       
-                       row.itemO("anim.insert_keyframe", text="", icon=514)
-                       row.itemO("anim.delete_keyframe", text="", icon=513)
+               layout.itemS()
                
+               if space.display_mode == 'DATABLOCKS':
+                       row = layout.row(align=True)
+                       row.itemO("outliner.keyingset_add_selected", icon='ICON_ZOOMIN', text="")
+                       row.itemO("outliner.keyingset_remove_selected", icon='ICON_ZOOMOUT', text="")
+                       if ks:
+                               row.item_pointerR(scene, "active_keying_set", scene, "keying_sets", text="")
+                               
+                               row = layout.row(align=True)
+                               row.itemO("anim.insert_keyframe", text="", icon='ICON_KEY_HLT')
+                               row.itemO("anim.delete_keyframe", text="", icon='ICON_KEY_DEHLT')
+                       else:
+                               row.itemL(text="No Keying Set active")
 
 class OUTLINER_MT_view(bpy.types.Menu):
        __label__ = "View"
 
        def draw(self, context):
                layout = self.layout
-               so = context.space_data
+               
+               space = context.space_data
 
                col = layout.column()
-               col.itemR(so, "show_restriction_columns")
-               #layout.itemO("text.new")
+               if space.display_mode not in ('DATABLOCKS', 'USER_PREFERENCES', 'KEYMAPS'):
+                       col.itemR(space, "show_restriction_columns")
+                       col.itemS()
+                       col.itemO("outliner.show_active")
+
+               col.itemO("outliner.show_one_level")
+               col.itemO("outliner.show_hierarchy")
 
 bpy.types.register(OUTLINER_HT_header)
 bpy.types.register(OUTLINER_MT_view)
-
index 7af8766e256e3991c8122e4b1c044d19e05b9dca..46a56f7d133b2ac458b2d493d05afaf13e6fcf07 100644 (file)
@@ -469,13 +469,13 @@ class USERPREF_PT_input(bpy.types.Panel):
                        row = subcol.row()
 
                        if kmi.expanded:
-                               row.itemR(kmi, "expanded", text="", icon="ICON_TRIA_DOWN")
+                               row.itemR(kmi, "expanded", text="", icon="ICON_TRIA_RIGHT")
                        else:
                                row.itemR(kmi, "expanded", text="", icon="ICON_TRIA_RIGHT")
 
                        itemrow = row.row()
                        itemrow.enabled = km.user_defined
-                       itemrow.itemR(kmi, "active", text="", icon="ICON_DOT")
+                       itemrow.itemR(kmi, "active", text="", icon="ICON_CHECKBOX_DEHLT")
 
                        itemcol = itemrow.column()
                        itemcol.active = kmi.active
@@ -519,7 +519,7 @@ class USERPREF_PT_input(bpy.types.Panel):
                                        subrow.itemR(kmi, "shift")
                                        subrow.itemR(kmi, "ctrl")
                                        subrow.itemR(kmi, "alt")
-                                       subrow.itemR(kmi, "oskey")
+                                       subrow.itemR(kmi, "oskey", text="Cmd")
                                        sub.itemR(kmi, "key_modifier", text="", event=True)
 
                                flow = itemcol.column_flow(columns=2)
index cb3f91ad687d0c041ac85fb20477dc6715cb4f58..b4300710dab94213fef9b8736ae18be98f88114f 100644 (file)
@@ -172,8 +172,8 @@ class VIEW3D_MT_select_object(bpy.types.Menu):
                layout.itemO("object.select_random", text="Random")
                layout.itemO("object.select_mirror", text="Mirror")
                layout.itemO("object.select_by_layer", text="Select All by Layer")
-               layout.item_enumO("object.select_by_type", "type", "", text="Select All by Type...")
-               layout.itemO("object.select_grouped", text="Select Grouped...")
+               layout.item_menu_enumO("object.select_by_type", "type", "", text="Select All by Type...")
+               layout.item_menu_enumO("object.select_grouped", "type", text="Select Grouped...")
                layout.itemO("object.select_pattern", text="Select Pattern...")
 
 class VIEW3D_MT_select_pose(bpy.types.Menu):
@@ -395,6 +395,7 @@ class VIEW3D_MT_object(bpy.types.Menu):
                layout = self.layout
 
                layout.itemM("VIEW3D_MT_object_clear")
+               layout.itemM("VIEW3D_MT_object_apply")
                layout.itemM("VIEW3D_MT_snap")
                
                layout.itemS()
@@ -408,6 +409,8 @@ class VIEW3D_MT_object(bpy.types.Menu):
                layout.item_booleanO("object.duplicate", "linked", True, text="Duplicate Linked")
                layout.itemO("object.delete", text="Delete...")
                layout.itemO("object.proxy_make", text="Make Proxy...")
+               layout.item_menu_enumO("object.make_local", "type", text="Make Local...")
+               layout.itemM("VIEW3D_MT_make_single_user")
                
                layout.itemS()
                
@@ -437,6 +440,20 @@ class VIEW3D_MT_object_clear(bpy.types.Menu):
                layout.itemO("object.scale_clear", text="Scale")
                layout.itemO("object.origin_clear", text="Origin")
                
+class VIEW3D_MT_object_apply(bpy.types.Menu):
+       __label__ = "Apply"
+
+       def draw(self, context):
+               layout = self.layout
+               
+               layout.itemO("object.location_apply", text="Location")
+               layout.itemO("object.rotation_apply", text="Rotation")
+               layout.itemO("object.scale_apply", text="Scale")
+               layout.itemS()
+               layout.itemO("object.visual_transform_apply", text="Visual Transform")
+               layout.itemO("object.duplicates_make_real")
+               
+
 class VIEW3D_MT_object_parent(bpy.types.Menu):
        __label__ = "Parent"
 
@@ -488,6 +505,27 @@ class VIEW3D_MT_object_showhide(bpy.types.Menu):
                layout.itemO("object.restrictview_set", text="Hide Selected")
                layout.item_booleanO("object.restrictview_set", "unselected", True, text="Hide Unselected")
 
+class VIEW3D_MT_make_single_user(bpy.types.Menu):
+       __label__ = "Make Single User"
+
+       def draw(self, context):
+               layout = self.layout
+               
+               props = layout.itemO("object.make_single_user", properties=True, text="Object")
+               props.object = True
+               
+               props = layout.itemO("object.make_single_user", properties=True, text="Object & ObData")
+               props.object = props.obdata = True
+               
+               props = layout.itemO("object.make_single_user", properties=True, text="Object & ObData & Materials+Tex")
+               props.object = props.obdata = props.material = props.texture = True
+               
+               props = layout.itemO("object.make_single_user", properties=True, text="Materials+Tex")
+               props.material = props.texture = True
+               
+               props = layout.itemO("object.make_single_user", properties=True, text="Animation")
+               props.animation = True
+
 # ********** Vertex paint menu **********      
        
 class VIEW3D_MT_paint_vertex(bpy.types.Menu):
@@ -737,7 +775,7 @@ class VIEW3D_MT_edit_mesh(bpy.types.Menu):
                layout.itemS()
                
                layout.itemR(settings, "automerge_editing")
-               layout.itemR(settings, "proportional_editing")
+               layout.item_menu_enumR(settings, "proportional_editing")
                layout.item_menu_enumR(settings, "proportional_editing_falloff")
                
                layout.itemS()
@@ -756,18 +794,18 @@ class VIEW3D_MT_edit_mesh_specials(bpy.types.Menu):
                layout.itemO("mesh.subdivide", text="Subdivide")
                layout.item_floatO("mesh.subdivide", "smoothness", 1.0, text="Subdivide Smooth")
                layout.itemO("mesh.merge", text="Merge...")
-               layout.itemO("mesh.remove_doubles", text="Remove Doubles")
+               layout.itemO("mesh.remove_doubles")
                layout.itemO("mesh.hide", text="Hide")
                layout.itemO("mesh.reveal", text="Reveal")
-               layout.itemO("mesh.select_inverse", text="Select Inverse")
+               layout.itemO("mesh.select_inverse")
                layout.itemO("mesh.flip_normals")
                layout.itemO("mesh.vertices_smooth", text="Smooth")
                # layout.itemO("mesh.bevel", text="Bevel")
                layout.itemO("mesh.faces_shade_smooth")
                layout.itemO("mesh.faces_shade_flat")
-               # layout.itemO("mesh.blend_from_shape", text="Blend From Shape")
-               # layout.itemO("mesh.shape_propagate_to_all", text="Propagate to All Shapes")
-               layout.itemO("mesh.select_vertex_path", text="Select Vertex Path")
+               layout.itemO("mesh.blend_from_shape")
+               # layout.itemO("mesh.shape_propagate_to_all")
+               layout.itemO("mesh.select_vertex_path")
 
 class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu):
        __label__ = "Vertices"
@@ -786,9 +824,9 @@ class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu):
                layout.itemO("mesh.vertices_smooth")
                layout.itemO("mesh.remove_doubles")
                
-               layout.itemO("mesh.select_vertex_path", text="Select Vertex Path")
+               layout.itemO("mesh.select_vertex_path")
                
-               # uiItemO(layout, "Blend From Shape", 0, "mesh.blend_from_shape");
+               layout.itemO("mesh.blend_from_shape")
                # uiItemO(layout, "Propagate to All Shapes", 0, "mesh.shape_propagate_to_all");
 
 class VIEW3D_MT_edit_mesh_edges(bpy.types.Menu):
@@ -1191,8 +1229,11 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel):
 
        def draw(self, context):
                layout = self.layout
+
                view = context.space_data
                gs = context.scene.game_data
+               ob = context.object
+               mesh = context.active_object.data
                
                col = layout.column()
                col.itemR(view, "display_floor", text="Grid Floor")
@@ -1202,13 +1243,14 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel):
                col.itemR(view, "outline_selected")
                col.itemR(view, "all_object_centers")
                col.itemR(view, "relationship_lines")
+               if ob.type =='MESH':
+                       col.itemR(mesh, "all_edges")
                
                col = layout.column()
                col.itemL(text="Shading:")
                col.itemR(gs, "material_mode", text="")
                col.itemR(view, "textured_solid")
 
-
 # XXX - the Quad View options don't work yet           
 #              layout.itemS()
 #              
@@ -1235,8 +1277,6 @@ class VIEW3D_PT_3dview_meshdisplay(bpy.types.Panel):
                col = layout.column()
                col.itemL(text="Overlays:")
                col.itemR(mesh, "draw_edges", text="Edges")
-               col.itemR(mesh, "all_edges")
-               col.itemS()
                col.itemR(mesh, "draw_faces", text="Faces")
                col.itemR(mesh, "draw_creases", text="Creases")
                col.itemR(mesh, "draw_bevel_weights", text="Bevel Weights")
@@ -1333,12 +1373,11 @@ class VIEW3D_PT_transform_orientations(bpy.types.Panel):
                col.itemR(view, "transform_orientation")
                col.itemO("tfm.create_orientation", text="Create")
                
-#              orientation_index = view.__rna__.properties["transform_orientation"].items[view.transform_orientation].value
-#              
-#              if orientation_index >= 4:
-#                      orientation = context.scene.orientations[orientation_index - 4]
-#                      col.itemR(orientation, "name")
-               col.itemO("tfm.delete_orientation", text="Delete")
+               orientation = view.current_orientation
+               
+               if orientation:
+                       col.itemR(orientation, "name")
+                       col.itemO("tfm.delete_orientation", text="Delete")
 
 # Operators 
 
@@ -1397,12 +1436,15 @@ bpy.types.register(VIEW3D_MT_select_edit_armature)
 bpy.types.register(VIEW3D_MT_select_face) # XXX todo
 
 bpy.types.register(VIEW3D_MT_object) # Object Menu
+bpy.types.register(VIEW3D_MT_object_apply)
 bpy.types.register(VIEW3D_MT_object_clear)
 bpy.types.register(VIEW3D_MT_object_parent)
 bpy.types.register(VIEW3D_MT_object_track)
 bpy.types.register(VIEW3D_MT_object_group)
 bpy.types.register(VIEW3D_MT_object_constraints)
 bpy.types.register(VIEW3D_MT_object_showhide)
+bpy.types.register(VIEW3D_MT_make_single_user)
+
 
 bpy.types.register(VIEW3D_MT_sculpt) # Sculpt Menu
 
index 4bfa6a41099d5c1e51beeb4e9008c82bb3768bd1..1b4cbc1cf2a6dba0e2bc480e3965b22586f22c14 100644 (file)
@@ -65,6 +65,7 @@ struct Key *ob_get_key(struct Object *ob);
 struct KeyBlock *ob_get_keyblock(struct Object *ob);
 struct KeyBlock *key_get_keyblock(struct Key *key, int index);
 struct KeyBlock *key_get_named_keyblock(struct Key *key, const char name[]);
+char *key_get_curValue_rnaPath(struct Key *key, struct KeyBlock *kb);
 // needed for the GE
 void do_rel_key(int start, int end, int tot, char *basispoin, struct Key *key, int mode);
 
index 1cb6efeb83859339042d613a3ff0339800693ffc..aeb33cd362879a5852a7aea5147e944d5351a8aa 100644 (file)
@@ -114,7 +114,7 @@ int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3
 void object_handle_update(struct Scene *scene, struct Object *ob);
 
 float give_timeoffset(struct Object *ob);
-int give_obdata_texspace(struct Object *ob, int **texflag, float **loc, float **size, float **rot);
+int give_obdata_texspace(struct Object *ob, short **texflag, float **loc, float **size, float **rot);
 
 int object_insert_ptcache(struct Object *ob);
 // void object_delete_ptcache(struct Object *ob, int index);
index e9285782a1e4aab19408d6cabbc54243b6523cfa..2291601bd4761ecadaf42ba42d93dde7c6b8cc92 100644 (file)
@@ -200,6 +200,7 @@ struct Object *psys_get_lattice(struct ParticleSimulationData *sim);
 
 int psys_in_edit_mode(struct Scene *scene, struct ParticleSystem *psys);
 int psys_check_enabled(struct Object *ob, struct ParticleSystem *psys);
+int psys_check_edited(struct ParticleSystem *psys);
 
 void psys_check_group_weights(struct ParticleSettings *part);
 
index bbfe077c15ece69c67ca83fd7810b0ba0973b626..d5cc31d918ace6c0a9ad9698b366f48d0331705e 100644 (file)
@@ -441,7 +441,7 @@ static void *ctx_data_pointer_get(const bContext *C, const char *member)
 {
        bContextDataResult result;
 
-       if(ctx_data_get((bContext*)C, member, &result))
+       if(C && ctx_data_get((bContext*)C, member, &result))
                return result.ptr.data;
 
        return NULL;
index ec054bc47cd527a9b0f1160ca0ff9fa352852f5d..d60a26e8feb563d88a89b4f0887a97d486f8ecdb 100644 (file)
@@ -2037,7 +2037,6 @@ static void dag_object_time_update_flags(Object *ob)
                                if(me->key) {
                                        if(!(ob->shapeflag & OB_SHAPE_LOCK)) {
                                                ob->recalc |= OB_RECALC_DATA;
-                                               ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
                                        }
                                }
                                if(ob->particlesystem.first)
@@ -2049,7 +2048,6 @@ static void dag_object_time_update_flags(Object *ob)
                                if(cu->key) {
                                        if(!(ob->shapeflag & OB_SHAPE_LOCK)) {
                                                ob->recalc |= OB_RECALC_DATA;
-                                               ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
                                        }
                                }
                                break;
@@ -2063,7 +2061,6 @@ static void dag_object_time_update_flags(Object *ob)
                                if(lt->key) {
                                        if(!(ob->shapeflag & OB_SHAPE_LOCK)) {
                                                ob->recalc |= OB_RECALC_DATA;
-                                               ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
                                        }
                                }
                                        break;
@@ -2216,7 +2213,7 @@ void DAG_id_flush_update(ID *id, short flag)
                        else if(ob->type==OB_CURVE || ob->type==OB_SURF)
                                id= NULL;
                        /* also for locked shape keys we make an exception */
-                       else if(ob_get_key(ob) && (ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)))
+                       else if(ob_get_key(ob) && (ob->shapeflag & OB_SHAPE_LOCK))
                                id= NULL;
                }
        }
@@ -2238,7 +2235,18 @@ void DAG_id_flush_update(ID *id, short flag)
                                }
                        }
                }
-
+               
+               /* set flags based on ShapeKey */
+               if(idtype == ID_KE) {
+                       for(obt=bmain->object.first; obt; obt= obt->id.next) {
+                               Key *key= ob_get_key(obt);
+                               if(!(ob && obt == ob) && ((ID *)key == id)) {
+                                       obt->flag |= (OB_RECALC|OB_RECALC_DATA);
+                                       BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
+                               }
+                       }
+               }
+               
                /* set flags based on particle settings */
                if(idtype == ID_PA) {
                        ParticleSystem *psys;
index 09d150341b2df51d24561c3b659dbf91af489d5a..efe53f6f8ef1f78a5821e329c450eaa869f70519 100644 (file)
@@ -964,6 +964,7 @@ typedef struct StampData {
        char    camera[64];
        char    scene[64];
        char    strip[64];
+       char    rendertime[64];
 } StampData;
 
 static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
@@ -1087,6 +1088,20 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
        } else {
                stamp_data->strip[0] = '\0';
        }
+
+       {
+               Render *re= RE_GetRender(scene->id.name);
+               RenderStats *stats= re ? RE_GetStats(re):NULL;
+
+               if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) {
+                       BLI_timestr(stats->lastframetime, text);
+
+                       if (do_prefix)          sprintf(stamp_data->rendertime, "RenderTime %s", text);
+                       else                            sprintf(stamp_data->rendertime, "%s", text);
+               } else {
+                       stamp_data->rendertime[0] = '\0';
+               }
+       }
 }
 
 // XXX - Bad level call.
@@ -1116,7 +1131,12 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
                return;
        
        stampdata(scene, &stamp_data, 1);
-       stamp_font_begin(12);
+
+       /* TODO, do_versions */
+       if(scene->r.stamp_font_id < 8)
+               scene->r.stamp_font_id= 12;
+
+       stamp_font_begin(scene->r.stamp_font_id);
 
        BLF_buffer(rectf, rect, width, height, channels);
        BLF_buffer_col(scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0);
@@ -1166,6 +1186,21 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
 
                BLF_position(x, y, 0.0);
                BLF_draw_buffer(stamp_data.date);
+
+               /* the extra pixel for background. */
+               y -= 4;
+       }
+
+       /* Top left corner, below File, Date or Note */
+       if (stamp_data.rendertime[0]) {
+               BLF_width_and_height(stamp_data.rendertime, &w, &h);
+               y -= h;
+
+               /* and space for background. */
+               buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3);
+
+               BLF_position(x, y, 0.0);
+               BLF_draw_buffer(stamp_data.rendertime);
        }
 
        x= 0;
index 39f9ed808fddb0e70a9bdab604e30d07beef2a86..3fffdef478bf81464d03a2ff1b9164e10f83ca3a 100644 (file)
@@ -35,6 +35,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_blenlib.h"
+
 #include "DNA_anim_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_key_types.h"
@@ -57,7 +59,7 @@
 #include "BKE_object.h"
 #include "BKE_utildefines.h"
 
-#include "BLI_blenlib.h"
+#include "RNA_access.h"
 
 
 #ifdef HAVE_CONFIG_H
@@ -1368,7 +1370,7 @@ int do_ob_key(Scene *scene, Object *ob)
        if(key==NULL)
                return 0;
                
-       if(ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)) {
+       if(ob->shapeflag & OB_SHAPE_LOCK) {
                KeyBlock *kb= BLI_findlink(&key->block, ob->shapenr-1);
                
                if (G.f & G_DEBUG) printf("ob %s, key %s locked \n", ob->id.name+2, key->id.name+2);
@@ -1489,3 +1491,24 @@ KeyBlock *key_get_named_keyblock(Key *key, const char name[])
        
        return NULL;
 }
+
+/* Get RNA-Path for 'value' setting of the given ShapeKey 
+ * NOTE: the user needs to free the returned string once they're finishe with it
+ */
+char *key_get_curValue_rnaPath(Key *key, KeyBlock *kb)
+{
+       PointerRNA ptr;
+       PropertyRNA *prop;
+       
+       /* sanity checks */
+       if ELEM(NULL, key, kb)
+               return NULL;
+       
+       /* create the RNA pointer */
+       RNA_pointer_create(key, &RNA_ShapeKey, kb, &ptr);
+       /* get pointer to the property too */
+       prop= RNA_struct_find_property(&ptr, "value");
+       
+       /* return the path */
+       return RNA_path_from_ID_to_property(&ptr, prop);
+}
index 8494fdae954e50458392f617d79bba3135b96cc7..eb5beb734a160631f70f89109b27146210ee0c32 100644 (file)
@@ -1102,7 +1102,7 @@ ParticleSystem *copy_particlesystem(ParticleSystem *psys)
                        pa->hair = MEM_dupallocN(pa->hair);
        }
 
-       if(psysn->particles->keys || psysn->particles->boid) {
+       if(psysn->particles && (psysn->particles->keys || psysn->particles->boid)) {
                ParticleKey *key = psysn->particles->keys;
                BoidParticle *boid = psysn->particles->boid;
 
@@ -2475,7 +2475,7 @@ float give_timeoffset(Object *ob) {
        }
 }
 
-int give_obdata_texspace(Object *ob, int **texflag, float **loc, float **size, float **rot) {
+int give_obdata_texspace(Object *ob, short **texflag, float **loc, float **size, float **rot) {
        
        if (ob->data==NULL)
                return 0;
index 0de97b9c703733efe9b158826466a0b40e75be12..036cadebbe86a2d1341cc8b70bf0a8cd709b7fa4 100644 (file)
@@ -176,6 +176,11 @@ PackedFile *newPackedFile(ReportList *reports, char *filename)
        char name[FILE_MAXDIR+FILE_MAXFILE];
        void *data;
        
+       /* render result has no filename and can be ignored
+        * any other files with no name can be ignored too */
+       if(filename[0]=='\0')
+               return NULL;
+
        //XXX waitcursor(1);
        
        // convert relative filenames to absolute filenames
@@ -188,7 +193,7 @@ PackedFile *newPackedFile(ReportList *reports, char *filename)
 
        file= open(name, O_BINARY|O_RDONLY);
        if (file <= 0) {
-               BKE_reportf(reports, RPT_ERROR, "Can't open file: %s", name);
+               BKE_reportf(reports, RPT_ERROR, "Can't open file: \"%s\"", name);
        } else {
                filelen = BLI_filesize(file);
 
index 011d5c3f1342c862921fc40c260b6b6913d223dd..ea8562c0ca8b35a66ad4eb2243f8fc9ce9c0189b 100644 (file)
@@ -298,6 +298,14 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys)
        return 1;
 }
 
+int psys_check_edited(ParticleSystem *psys)
+{
+       if(psys->part && psys->part->type==PART_HAIR)
+               return (psys->flag & PSYS_EDITED || (psys->edit && psys->edit->edited));
+       else
+               return (psys->pointcache->edit && psys->pointcache->edit->edited);
+}
+
 void psys_check_group_weights(ParticleSettings *part)
 {
        ParticleDupliWeight *dw, *tdw;
index fa0d5cba604bd9bfa54f9708da5db135fcc93ee7..68f0e33a98f19cfb0c5162645b651a21f205d08d 100644 (file)
@@ -84,9 +84,6 @@
   #include "BLI_winstuff.h"
 #endif
 
-static void ptcache_data_to(void **data, int type, int index, void *to);
-static void ptcache_data_from(void **data, int type, void *from);
-
 #define PTCACHE_DATA_FROM(data, type, from)            if(data[type]) { memcpy(data[type], from, ptcache_data_size[type]); }
 #define PTCACHE_DATA_TO(data, type, index, to) if(data[type]) { memcpy(to, (char*)data[type] + (index ? index * ptcache_data_size[type] : 0), ptcache_data_size[type]); }
 
index fbc052db6f39b44d8d6a38f7ae3802d8a310a624..ab56623ed5ec2d4ea7bbe01a847e8de8b01be88e 100644 (file)
@@ -1027,7 +1027,7 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
                        {
                                SmokeModifierData *smd2 = (SmokeModifierData *)md;
 
-                               if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)
+                               if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll && smd2->coll->points)
                                {
                                        // we got nice collision object
                                        SmokeCollSettings *scs = smd2->coll;
index e6aded12f3b2ed294aa692a6e354edd49532dfb0..fdccb3854a609f666c820b23a2964f46e60e547e 100644 (file)
@@ -457,6 +457,7 @@ void i_window(
 #define BLI_CS_CIE             2
 
 #define RAD2DEG(_rad) ((_rad)*(180.0/M_PI))
+#define DEG2RAD(_deg) ((_deg)*(M_PI/180.0))
 
 void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
 void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
index fa44bb36e150358431071bd306dca09696235e77..96e88ec8e89ff2584cb414d052cfc106cb5a7ba8 100644 (file)
@@ -66,6 +66,9 @@ int    BLI_exist(char *name);
         * @param name The name of the file to read.
         * @retval A list of strings representing the file lines.
         */
+
+int BLI_is_dir(char *file);
+
 struct LinkNode *BLI_read_file_as_lines(char *name);
 
        /**
index cdc5cec705fb714ce879a906c0a8b394a3065b08..b48b6784c23695322287f9cc5c4a225fb3a99139 100644 (file)
@@ -468,6 +468,15 @@ int BLI_exist(char *name)
        return(st.st_mode);
 }
 
+/* would be better in fileops.c except that it needs stat.h so add here */
+int BLI_is_dir(char *file) {
+#ifdef WIN32
+       return 1; /* XXX - TODO */
+#else
+       return S_ISDIR(BLI_exist(file));
+#endif
+}
+
 LinkNode *BLI_read_file_as_lines(char *name)
 {
        FILE *fp= fopen(name, "r");
index 282977e3e90670e479fc386b2bc09c70d3177045..2ee5a13c47a534eb93da8446c1e94471d57ea2ee 100644 (file)
@@ -6435,7 +6435,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                }
        }
        if(main->versionfile <= 140) {
-               /* r-g-b-fac in texure */
+               /* r-g-b-fac in texture */
                Tex *tex = main->tex.first;
                while (tex) {
                        if ((tex->rfac == 0.0) &&
index a4423d43339e3aa1ba5874a1698fc2857f9e6948..54a08cf4702979f0d4409f5c3840adcb177aec07 100644 (file)
@@ -280,11 +280,13 @@ static void acf_generic_idblock_name(bAnimListElem *ale, char *name)
 
 /* Settings ------------------------------------------- */
 
+#if 0
 /* channel type has no settings */
 static short acf_generic_none_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
 {
        return 0;
 }
+#endif
 
 /* check if some setting exists for this object-based data-expander (category only) */
 static short acf_generic_dsexpand_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
@@ -372,6 +374,50 @@ static int acf_summary_icon(bAnimListElem *ale)
        return ICON_BORDERMOVE;
 }
 
+/* check if some setting exists for this channel */
+static short acf_summary_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+       /* only expanded is supported, as it is used for hiding all stuff which the summary covers */
+       return (setting == ACHANNEL_SETTING_EXPAND);
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_summary_setting_flag(int setting, short *neg)
+{
+       if (setting == ACHANNEL_SETTING_EXPAND) {
+               /* expanded */
+               *neg= 1;
+               return ADS_FLAG_SUMMARY_COLLAPSED;
+       }
+       else {
+               /* unsupported */
+               *neg= 0;
+               return 0;
+       }
+}
+
+/* get pointer to the setting */
+static void *acf_summary_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+       bAnimContext *ac= (bAnimContext *)ale->data;
+       
+       /* if data is valid, return pointer to active dopesheet's relevant flag 
+        *      - this is restricted to DopeSheet/Action Editor only
+        */
+       if ((ac->sa) && (ac->spacetype == SPACE_ACTION) && (setting == ACHANNEL_SETTING_EXPAND)) {
+               SpaceAction *saction= (SpaceAction *)ac->sa->spacedata.first;
+               bDopeSheet *ads= &saction->ads;
+               
+               /* return pointer to DopeSheet's flag */
+               GET_ACF_FLAG_PTR(ads->flag);
+       }
+       else {
+               /* can't return anything useful - unsupported */
+               *type= 0;
+               return 0;
+       }
+}
+
 /* all animation summary (DopeSheet only) type define */
 static bAnimChannelType ACF_SUMMARY = 
 {
@@ -382,9 +428,9 @@ static bAnimChannelType ACF_SUMMARY =
        acf_summary_name,                                       /* name */
        acf_summary_icon,                                       /* icon */
        
-       acf_generic_none_setting_valid,         /* has setting */
-       NULL,                                                           /* flag for setting */
-       NULL                                                            /* pointer for setting */
+       acf_summary_setting_valid,                      /* has setting */
+       acf_summary_setting_flag,                       /* flag for setting */
+       acf_summary_setting_ptr                         /* pointer for setting */
 };
 
 /* Scene ------------------------------------------- */
@@ -1340,7 +1386,7 @@ static int acf_dsskey_setting_flag(int setting, short *neg)
        
        switch (setting) {
                case ACHANNEL_SETTING_EXPAND: /* expanded */
-                       return KEYBLOCK_DS_EXPAND;
+                       return KEY_DS_EXPAND;
                        
                case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
                        return ADT_NLA_EVAL_OFF;
@@ -1691,28 +1737,91 @@ static bAnimChannelType ACF_DSARM=
 
 
 /* ShapeKey Entry  ------------------------------------------- */
-// XXX ... this is currently obsolete...
 
-#if 0
-static void dummy_olddraw_shapekeys ()
+/* name for ShapeKey */
+static void acf_shapekey_name(bAnimListElem *ale, char *name)
 {
-       case ANIMTYPE_SHAPEKEY: /* shapekey channel */
-       {
-               KeyBlock *kb = (KeyBlock *)ale->data;
+       KeyBlock *kb= (KeyBlock *)ale->data;
+       
+       /* just copy the name... */
+       if (kb && name) {
+               /* if the KeyBlock had a name, use it, otherwise use the index */
+               if (kb->name[0])
+                       strcpy(name, kb->name);
+               else
+                       sprintf(name, "Key %d", ale->index);
+       }
+}
+
+/* check if some setting exists for this channel */
+static short acf_shapekey_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+       switch (setting) {
+               case ACHANNEL_SETTING_SELECT: /* selected */
+               case ACHANNEL_SETTING_MUTE: /* muted */
+               case ACHANNEL_SETTING_PROTECT: /* protected */
+                       return 1;
+                       
+               /* nothing else is supported */
+               default:
+                       return 0;
+       }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_shapekey_setting_flag(int setting, short *neg)
+{
+       /* clear extra return data first */
+       *neg= 0;
+       
+       switch (setting) {
+               case ACHANNEL_SETTING_MUTE: /* mute */
+                       return KEYBLOCK_MUTE;
                
-               indent = 0;
-               special = -1;
+               case ACHANNEL_SETTING_SELECT: /* selected */
+                       return KEYBLOCK_SEL;
                
-               offset= (ale->id) ? 21 : 0;
+               case ACHANNEL_SETTING_PROTECT: /* locked */
+                       return KEYBLOCK_LOCKED;
                
-               if (kb->name[0] == '\0')
-                       sprintf(name, "Key %d", ale->index);
-               else
-                       strcpy(name, kb->name);
+               default: /* unsupported */
+                       return 0;
        }
-               break;
 }
-#endif
+
+/* get pointer to the setting */
+static void *acf_shapekey_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+       KeyBlock *kb= (KeyBlock *)ale->data;
+       
+       /* clear extra return data first */
+       *type= 0;
+       
+       switch (setting) {
+               case ACHANNEL_SETTING_SELECT: /* selected */
+               case ACHANNEL_SETTING_MUTE: /* muted */
+               case ACHANNEL_SETTING_PROTECT: /* protected */
+                       GET_ACF_FLAG_PTR(kb->flag)
+               
+               default: /* unsupported */
+                       return NULL;
+       }
+}
+
+/* shapekey expander type define */
+static bAnimChannelType ACF_SHAPEKEY= 
+{
+       acf_generic_channel_backdrop,   /* backdrop */
+       acf_generic_indention_0,                /* indent level */
+       acf_generic_basic_offset,               /* offset */
+       
+       acf_shapekey_name,                              /* name */
+       NULL,                                                   /* icon */
+       
+       acf_shapekey_setting_valid,             /* has setting */
+       acf_shapekey_setting_flag,              /* flag for setting */
+       acf_shapekey_setting_ptr                /* pointer for setting */
+};
 
 /* Grease Pencil entries  ------------------------------------------- */
 // XXX ... this is currently not restored yet
@@ -1877,7 +1986,7 @@ void ANIM_init_channel_typeinfo_data (void)
                animchannelTypeInfo[type++]= &ACF_DSMBALL;              /* MetaBall Channel */
                animchannelTypeInfo[type++]= &ACF_DSARM;                /* Armature Channel */
                
-               animchannelTypeInfo[type++]= NULL;                              /* ShapeKey */ // XXX this is no longer used for now...
+               animchannelTypeInfo[type++]= &ACF_SHAPEKEY;             /* ShapeKey */
                
                        // XXX not restored yet
                animchannelTypeInfo[type++]= NULL;                              /* Grease Pencil Datablock */ 
@@ -2038,7 +2147,7 @@ void ANIM_channel_setting_set (bAnimContext *ac, bAnimListElem *ale, int setting
 // XXX hardcoded size of icons
 #define ICON_WIDTH             17
 // XXX hardcoded width of sliders
-#define SLIDER_WIDTH   70
+#define SLIDER_WIDTH   80
 
 /* Draw the given channel */
 // TODO: make this use UI controls for the buttons
@@ -2143,7 +2252,7 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
 
 /* ------------------ */
 
-/* callback for widget settings - send notifiers */
+/* callback for (normal) widget settings - send notifiers */
 static void achannel_setting_widget_cb(bContext *C, void *poin, void *poin2)
 {
        WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
@@ -2191,7 +2300,57 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
        }
 }
 
-
+/* callback for shapekey widget sliders - insert keyframes */
+static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, void *kb_poin)
+{
+       Key *key= (Key *)key_poin;
+       KeyBlock *kb= (KeyBlock *)kb_poin;
+       char *rna_path= key_get_curValue_rnaPath(key, kb);
+       
+       Scene *scene= CTX_data_scene(C);
+       PointerRNA id_ptr, ptr;
+       PropertyRNA *prop;
+       short flag=0, done=0;
+       float cfra;
+       
+       /* get current frame */
+       // NOTE: this will do for now...
+       cfra= (float)CFRA;
+       
+       /* get flags for keyframing */
+       if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+               flag |= INSERTKEY_NEEDED;
+       if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+               flag |= INSERTKEY_MATRIX;
+       if (IS_AUTOKEY_MODE(scene, EDITKEYS))
+               flag |= INSERTKEY_REPLACE;
+       
+       
+       /* get RNA pointer, and resolve the path */
+       RNA_id_pointer_create((ID *)key, &id_ptr);
+       
+       /* try to resolve the path stored in the F-Curve */
+       if (RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop)) {
+               /* find or create new F-Curve */
+               // XXX is the group name for this ok?
+               bAction *act= verify_adt_action((ID *)key, 1);
+               FCurve *fcu= verify_fcurve(act, NULL, rna_path, 0, 1);
+               
+               /* set the special 'replace' flag if on a keyframe */
+               if (fcurve_frame_has_keyframe(fcu, cfra, 0))
+                       flag |= INSERTKEY_REPLACE;
+               
+               /* insert a keyframe for this F-Curve */
+               done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+               
+               if (done)
+                       WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
+       }
+       
+       /* free the path */
+       if (rna_path)
+               MEM_freeN(rna_path);
+}
 
 /* Draw a widget for some setting */
 static void draw_setting_widget (bAnimContext *ac, bAnimListElem *ale, bAnimChannelType *acf, uiBlock *block, int xpos, int ypos, int setting)
@@ -2399,7 +2558,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b
                 *        and wouldn't be able to auto-keyframe...
                 *      - slider should start before the toggles (if they're visible) to keep a clean line down the side
                 */
-               if ((draw_sliders) && (ale->type == ANIMTYPE_FCURVE)) {
+               if ((draw_sliders) && ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_SHAPEKEY)) {
                        /* adjust offset */
                        offset += SLIDER_WIDTH;
                        
@@ -2407,20 +2566,49 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b
                        uiBlockSetEmboss(block, UI_EMBOSS);
                        
                        if (ale->id) { /* Slider using RNA Access -------------------- */
-                               FCurve *fcu= (FCurve *)ale->data;
                                PointerRNA id_ptr, ptr;
                                PropertyRNA *prop;
+                               char *rna_path = NULL;
+                               int array_index = 0;
+                               short free_path = 0;
                                
-                               /* get RNA pointer, and resolve the path */
-                               RNA_id_pointer_create(ale->id, &id_ptr);
+                               /* get destination info */
+                               if (ale->type == ANIMTYPE_FCURVE) {
+                                       FCurve *fcu= (FCurve *)ale->data;
+                                       
+                                       rna_path= fcu->rna_path;
+                                       array_index= fcu->array_index;
+                               }
+                               else if (ale->type == ANIMTYPE_SHAPEKEY) {
+                                       KeyBlock *kb= (KeyBlock *)ale->data;
+                                       Key *key= (Key *)ale->id;
+                                       
+                                       rna_path= key_get_curValue_rnaPath(key, kb);
+                                       free_path= 1;
+                               }
                                
-                               /* try to resolve the path */
-                               if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
-                                       uiBut *but;
+                               /* only if RNA-Path found */
+                               if (rna_path) {
+                                       /* get RNA pointer, and resolve the path */
+                                       RNA_id_pointer_create(ale->id, &id_ptr);
+                                       
+                                       /* try to resolve the path */
+                                       if (RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop)) {
+                                               uiBut *but;
+                                               
+                                               /* create the slider button, and assign relevant callback to ensure keyframes are inserted... */
+                                               but= uiDefAutoButR(block, &ptr, prop, array_index, "", 0, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
+                                               
+                                               /* assign keyframing function according to slider type */
+                                               if (ale->type == ANIMTYPE_SHAPEKEY)
+                                                       uiButSetFunc(but, achannel_setting_slider_shapekey_cb, ale->id, ale->data);
+                                               else
+                                                       uiButSetFunc(but, achannel_setting_slider_cb, ale->id, ale->data);
+                                       }
                                        
-                                       /* create the slider button, and assign relevant callback to ensure keyframes are inserted... */
-                                       but= uiDefAutoButR(block, &ptr, prop, fcu->array_index, "", 0, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
-                                       uiButSetFunc(but, achannel_setting_slider_cb, ale->id, fcu);
+                                       /* free the path if necessary */
+                                       if (free_path)
+                                               MEM_freeN(rna_path);
                                }
                        }
                        else { /* Special Slider for stuff without RNA Access ---------- */
index 7ee591f8cab07114114b5a55befb090bc39b24d4..efdad53f89f053c576faeffb79da0faad7389036 100644 (file)
@@ -238,6 +238,10 @@ void ANIM_deselect_anim_channels (void *data, short datatype, short test, short
                                        if (ale->flag & FCURVE_SELECTED)
                                                sel= ACHANNEL_SETFLAG_CLEAR;
                                        break;
+                               case ANIMTYPE_SHAPEKEY:
+                                       if (ale->flag & KEYBLOCK_SEL)
+                                               sel= ACHANNEL_SETFLAG_CLEAR;
+                                       break;
                                case ANIMTYPE_NLATRACK:
                                        if (ale->flag & NLATRACK_SELECTED)
                                                sel= ACHANNEL_SETFLAG_CLEAR;
@@ -307,6 +311,13 @@ void ANIM_deselect_anim_channels (void *data, short datatype, short test, short
                                fcu->flag &= ~FCURVE_ACTIVE;
                        }
                                break;
+                       case ANIMTYPE_SHAPEKEY:
+                       {
+                               KeyBlock *kb= (KeyBlock *)ale->data;
+                               
+                               ACHANNEL_SET_FLAG(kb, sel, KEYBLOCK_SEL);
+                       }
+                               break;
                        case ANIMTYPE_NLATRACK:
                        {
                                NlaTrack *nlt= (NlaTrack *)ale->data;
@@ -904,28 +915,14 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op)
                if (vis == ACHANNEL_SETFLAG_CLEAR) 
                        break;
                
-               if ((ale->type == ANIMTYPE_FCURVE) && (ale->flag & FCURVE_VISIBLE))
-                       vis= ACHANNEL_SETFLAG_CLEAR;
-               else if ((ale->type == ANIMTYPE_GROUP) && !(ale->flag & AGRP_NOTVISIBLE))
+               /* set the setting in the appropriate way (if available) */
+               if (ANIM_channel_setting_get(&ac, ale, ACHANNEL_SETTING_VISIBLE))
                        vis= ACHANNEL_SETFLAG_CLEAR;
        }
                
        /* Now set the flags */
        for (ale= anim_data.first; ale; ale= ale->next) {
-               switch (ale->type) {
-                       case ANIMTYPE_FCURVE: /* F-Curve */
-                       {
-                               FCurve *fcu= (FCurve *)ale->data;
-                               ACHANNEL_SET_FLAG(fcu, vis, FCURVE_VISIBLE);
-                       }
-                               break;
-                       case ANIMTYPE_GROUP: /* Group */
-                       {
-                               bActionGroup *agrp= (bActionGroup *)ale->data;
-                               ACHANNEL_SET_FLAG_NEG(agrp, vis, AGRP_NOTVISIBLE);
-                       }
-                               break;
-               }
+               ANIM_channel_setting_set(&ac, ale, ACHANNEL_SETTING_VISIBLE, vis);
        }
        
        /* cleanup */
@@ -1531,6 +1528,24 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
                        if (fcu->flag & FCURVE_SELECTED)
                                ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
                                
+                       notifierFlags |= ND_ANIMCHAN_SELECT;
+               }
+                       break;
+               case ANIMTYPE_SHAPEKEY: 
+               {
+                       KeyBlock *kb= (KeyBlock *)ale->data;
+                       
+                       /* select/deselect */
+                       if (selectmode == SELECT_INVERT) {
+                               /* inverse selection status of this ShapeKey only */
+                               kb->flag ^= KEYBLOCK_SEL;
+                       }
+                       else {
+                               /* select ShapeKey by itself */
+                               ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+                               kb->flag |= KEYBLOCK_SEL;
+                       }
+                               
                        notifierFlags |= ND_ANIMCHAN_SELECT;
                }
                        break;
@@ -1571,9 +1586,6 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
 #endif // XXX future of this is unclear
                }
                        break;
-               case ANIMTYPE_SHAPEKEY:
-                       /* TODO: shapekey channels cannot be selected atm... */
-                       break;
                default:
                        printf("Error: Invalid channel type in mouse_anim_channels() \n");
        }
index 7aba237ffb1ce76fec852e5883a63f4bb2eca37f..96bdb9aa848309111f1db80cc3c110e5682734d4 100644 (file)
@@ -78,6 +78,7 @@
 
 #include "BKE_animsys.h"
 #include "BKE_action.h"
+#include "BKE_fcurve.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_key.h"
@@ -647,6 +648,36 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
                                ale->datatype= ALE_FCURVE;
                        }
                                break;
+                               
+                       case ANIMTYPE_SHAPEKEY:
+                       {
+                               KeyBlock *kb= (KeyBlock *)data;
+                               Key *key= (Key *)ale->id;
+                               
+                               ale->flag= kb->flag;
+                               
+                               /* whether we have keyframes depends on whether there is a Key block to find it from */
+                               if (key) {
+                                       /* index of shapekey is defined by place in key's list */
+                                       ale->index= BLI_findindex(&key->block, kb);
+                                       
+                                       /* the corresponding keyframes are from the animdata */
+                                       if (ale->adt && ale->adt->action) {
+                                               bAction *act= ale->adt->action;
+                                               char *rna_path = key_get_curValue_rnaPath(key, kb);
+                                               
+                                               /* try to find the F-Curve which corresponds to this exactly,
+                                                * then free the MEM_alloc'd string
+                                                */
+                                               if (rna_path) {
+                                                       ale->key_data= (void *)list_find_fcurve(&act->curves, rna_path, 0);
+                                                       MEM_freeN(rna_path);
+                                               }
+                                       }
+                                       ale->datatype= (ale->key_data)? ALE_FCURVE : ALE_NONE;
+                               }
+                       }       
+                               break;
                        
                        case ANIMTYPE_GPLAYER:
                        {
@@ -892,7 +923,55 @@ static int animdata_filter_nla (ListBase *anim_data, bDopeSheet *ads, AnimData *
        /* return the number of items added to the list */
        return items;
 }
+
+/* Include ShapeKey Data for ShapeKey Editor */
+static int animdata_filter_shapekey (ListBase *anim_data, Key *key, int filter_mode)
+{
+       bAnimListElem *ale;
+       int items = 0;
+       
+       /* check if channels or only F-Curves */
+       if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {
+               KeyBlock *kb;
+               
+               /* loop through the channels adding ShapeKeys as appropriate */
+               for (kb= key->block.first; kb; kb= kb->next) {
+                       /* skip the first one, since that's the non-animateable basis */
+                       // XXX maybe in future this may become handy?
+                       if (kb == key->block.first) continue;
+                       
+                       /* only work with this channel and its subchannels if it is editable */
+                       if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_SHAPEKEY(kb)) {
+                               /* only include this track if selected in a way consistent with the filtering requirements */
+                               if ( ANIMCHANNEL_SELOK(SEL_SHAPEKEY(kb)) ) {
+                                       // TODO: consider 'active' too?
+                                       
+                                       /* owner-id here must be key so that the F-Curve can be resolved... */
+                                       ale= make_new_animlistelem(kb, ANIMTYPE_SHAPEKEY, NULL, ANIMTYPE_NONE, (ID *)key);
+                                       
+                                       if (ale) {
+                                               BLI_addtail(anim_data, ale);
+                                               items++;
+                                       }
+                               }
+                       }
+               }
+       }
+       else {
+               /* just use the action associated with the shapekey */
+               // FIXME: is owner-id and having no owner/dopesheet really fine?
+               if (key->adt) {
+                       if (filter_mode & ANIMFILTER_ANIMDATA)
+                               ANIMDATA_ADD_ANIMDATA(key)
+                       else if (key->adt->action)
+                               items= animdata_filter_action(anim_data, NULL, key->adt->action, filter_mode, NULL, ANIMTYPE_NONE, (ID *)key);
+               }
+       }
+       
+       /* return the number of items added to the list */
+       return items;
+}
+
 #if 0
 // FIXME: switch this to use the bDopeSheet...
 static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter_mode)
@@ -1520,21 +1599,6 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bAnimContext *ac, bDo
                return 0;
        }
        
-       /* dopesheet summary 
-        *      - only for drawing and/or selecting keyframes in channels, but not for real editing 
-        *      - only useful for DopeSheet Editor, where the summary is useful
-        */
-       // TODO: we should really check if some other prohibited filters are also active, but that can be for later
-       if ((filter_mode & ANIMFILTER_CHANNELS) && (ads->filterflag & ADS_FILTER_SUMMARY)) {
-               ale= make_new_animlistelem(ac, ANIMTYPE_SUMMARY, NULL, ANIMTYPE_NONE, NULL);
-               if (ale) {
-                       BLI_addtail(anim_data, ale);
-                       items++;
-               }
-               
-               // TODO: if the summary gets a collapse widget, then we could make the other stuff not get shown... 
-       }
-       
        /* scene-linked animation */
        // TODO: sequencer, composite nodes - are we to include those here too?
        {
@@ -1887,6 +1951,50 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bAnimContext *ac, bDo
        return items;
 }
 
+/* Summary track for DopeSheet/Action Editor 
+ *     - return code is whether the summary lets the other channels get drawn
+ */
+static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim_data, int filter_mode, int *items)
+{
+       bDopeSheet *ads = NULL;
+       
+       /* get the DopeSheet information to use 
+        *      - we should only need to deal with the DopeSheet/Action Editor, 
+        *        since all the other Animation Editors won't have this concept
+        *        being applicable.
+        */
+       if ((ac && ac->sa) && (ac->sa->spacetype == SPACE_ACTION)) {
+               SpaceAction *saction= (SpaceAction *)ac->sa->spacedata.first;
+               ads= &saction->ads;
+       }
+       else {
+               /* invalid space type - skip this summary channels */
+               return 1;
+       }
+       
+       /* dopesheet summary 
+        *      - only for drawing and/or selecting keyframes in channels, but not for real editing 
+        *      - only useful for DopeSheet Editor, where the summary is useful
+        */
+       // TODO: we should really check if some other prohibited filters are also active, but that can be for later
+       if ((filter_mode & ANIMFILTER_CHANNELS) && (ads->filterflag & ADS_FILTER_SUMMARY)) {
+               bAnimListElem *ale= make_new_animlistelem(ac, ANIMTYPE_SUMMARY, NULL, ANIMTYPE_NONE, NULL);
+               if (ale) {
+                       BLI_addtail(anim_data, ale);
+                       (*items)++;
+               }
+               
+               /* if summary is collapsed, don't show other channels beneath this 
+                *      - this check is put inside the summary check so that it doesn't interfere with normal operation
+                */ 
+               if (ads->flag & ADS_FLAG_SUMMARY_COLLAPSED)
+                       return 0;
+       }
+       
+       /* the other channels beneath this can be shown */
+       return 1;
+}  
+
 /* ----------- Public API --------------- */
 
 /* This function filters the active data source to leave only animation channels suitable for
@@ -1907,23 +2015,43 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
                
                /* firstly filter the data */
                switch (datatype) {
-                       case ANIMCONT_ACTION:
-                               items= animdata_filter_action(anim_data, NULL, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+                       case ANIMCONT_ACTION:   /* 'Action Editor' */
+                       {
+                               /* the check for the DopeSheet summary is included here since the summary works here too */
+                               if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
+                                       items += animdata_filter_action(anim_data, NULL, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+                       }
                                break;
                                
-                       case ANIMCONT_SHAPEKEY:
-                               //items= animdata_filter_shapekey(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+                       case ANIMCONT_SHAPEKEY: /* 'ShapeKey Editor' */
+                       {
+                               /* the check for the DopeSheet summary is included here since the summary works here too */
+                               if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
+                                       items= animdata_filter_shapekey(anim_data, data, filter_mode);
+                       }
                                break;
                                
                        case ANIMCONT_GPENCIL:
+                       {
                                //items= animdata_filter_gpencil(anim_data, data, filter_mode);
+                       }
                                break;
                                
-                       case ANIMCONT_DOPESHEET:
-                       case ANIMCONT_FCURVES:
-                       case ANIMCONT_DRIVERS:
-                       case ANIMCONT_NLA:
-                               items= animdata_filter_dopesheet(anim_data, ac, data, filter_mode);
+                       case ANIMCONT_DOPESHEET: /* 'DopeSheet Editor' */
+                       {
+                               /* the DopeSheet editor is the primary place where the DopeSheet summaries are useful */
+                               if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
+                                       items += animdata_filter_dopesheet(anim_data, ac, data, filter_mode);
+                       }
+                               break;
+                               
+                       case ANIMCONT_FCURVES: /* Graph Editor -> FCurves/Animation Editing */
+                       case ANIMCONT_DRIVERS: /* Graph Editor -> Drivers Editing */
+                       case ANIMCONT_NLA: /* NLA Editor */
+                       {
+                               /* all of these editors use the basic DopeSheet data for filtering options, but don't have all the same features */
+                               items = animdata_filter_dopesheet(anim_data, ac, data, filter_mode);
+                       }
                                break;
                }
                        
index 75218e6ea6e30eb75d7ea8a805fe6ac77445f762..6a16d6d0ee1f306aa8f5fbbc64f53b4b1d4b81f8 100644 (file)
@@ -1430,7 +1430,7 @@ int autokeyframe_cfra_can_key(Scene *scene, ID *id)
 short fcurve_frame_has_keyframe (FCurve *fcu, float frame, short filter)
 {
        /* quick sanity check */
-       if (fcu == NULL)
+       if (ELEM(NULL, fcu, fcu->bezt))
                return 0;
        
        /* we either include all regardless of muting, or only non-muted  */
index a044e867d560d5892e15a683ccaeb46ae7309595..bf859ac6017bef76a532fc136441b8b353a9eda5 100644 (file)
@@ -142,6 +142,9 @@ static int add_default_keyingset_exec (bContext *C, wmOperator *op)
        
        scene->active_keyingset= BLI_countlist(&scene->keyingsets);
        
+       /* send notifiers */
+       WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL);
+       
        return OPERATOR_FINISHED;
 }
 
@@ -182,6 +185,9 @@ static int remove_active_keyingset_exec (bContext *C, wmOperator *op)
        /* the active one should now be the previously second-to-last one */
        scene->active_keyingset--;
        
+       /* send notifiers */
+       WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL);
+       
        return OPERATOR_FINISHED;
 }
 
@@ -219,7 +225,7 @@ static int add_empty_ks_path_exec (bContext *C, wmOperator *op)
        /* don't use the API method for this, since that checks on values... */
        ksp= MEM_callocN(sizeof(KS_Path), "KeyingSetPath Empty");
        BLI_addtail(&ks->paths, ksp);
-       ks->active_path= BLI_countlist(&ks->paths) + 1;
+       ks->active_path= BLI_countlist(&ks->paths);
        
        ksp->groupmode= KSP_GROUP_KSNAME; // XXX?
        
index ce328ea8a8279958c25d42a42f025957c2a767a6..b3dd8f35137f5a74077fd8c4c0a302e26e1162d5 100644 (file)
@@ -1083,7 +1083,7 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
 
                mvalf[0]= dd->mval[0];
                mvalf[1]= dd->mval[1];
-               peelObjectsContext(C, &sketch->depth_peels, dd->mval);
+               peelObjectsContext(C, &sketch->depth_peels, mvalf);
 
                if (stk->nb_points > 0 && stk->points[stk->nb_points - 1].type == PT_CONTINUOUS)
                {
index d6f937575052ee67aee392ed78184cc215c314a6..f67c94eebc30c9b7e3157f2a07c6db518754598f 100644 (file)
@@ -432,9 +432,6 @@ static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *ptr,
        int totitem= 0;
        int i= 0;
 
-       if (C == NULL)
-               return NULL;
-
        memset(&item_tmp, 0, sizeof(item_tmp));
        
        /* check that the action exists */
@@ -448,12 +445,10 @@ static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *ptr,
                }
        }
 
-       if (i > 0) {
-               *free= 1;
-               return item;
-       }
-       else
-               return NULL;
+       RNA_enum_item_end(&item, &totitem);
+       *free= 1;
+
+       return item;
 }
 
 static int poselib_remove_exec (bContext *C, wmOperator *op)
index 8d8cb8af4d62d330127d7022b0796d68a71c05b4..8b8c349e851b7336868c8cc6a33a952a046d26f8 100644 (file)
-/* DataToC output of file <blenderbuttons> */
+/* DataToC output of file </Users/William/blender25/blender/release/datafiles/blenderbuttons> */
 
-int datatoc_blenderbuttons_size= 190499;
+int datatoc_blenderbuttons_size= 195438;
 char datatoc_blenderbuttons[]= {
-137, 80, 78,
- 71, 13, 10, 26, 10,  0,  0,  0, 13, 73, 72, 68, 82,  0,  0,  2, 88,  0,  0,  2,128,  8,  6,  0,  0,  0, 64, 11,  6,158,  0,  0,
-  0,  9,112, 72, 89,115,  0,  0, 13,215,  0,  0, 13,215,  1, 66, 40,155,120,  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, 32, 99, 72, 82, 77,  0,  0,122, 37,  0,  0,128,131,  0,  0,
-249,255,  0,  0,128,233,  0,  0,117, 48,  0,  0,234, 96,  0,  0, 58,152,  0,  0, 23,111,146, 95,197, 70,  0,  2,221, 78, 73, 68,
- 65, 84,120,218,236, 93,119,120, 83, 85, 31,126,207,189, 55, 59,105,186, 91,104,203,104,153,101, 79,217,  8,178, 28,108,113,128,
- 11, 20,  5,  4, 62, 21,193,130,136,128, 76, 23, 67,100, 56, 89,178,101,136,202, 82,217, 75, 64,100,239, 89, 74,247,110,118,114,
-207,247, 71,115, 99, 26,210, 38,133, 50,196,243, 62,207,125,146,187,222,123,246,121,207,239, 44, 66, 41,  5,  3,  3,  3,  3,  3,
-  3,  3,  3, 67,217,129, 48,129,197,192,192,192,192,192,192,192, 80,182,224, 74,173,200,  8,161,165,120,182,163,191,156,206,227,
-209,  7,157,243, 46,250,157,150, 33,231,163, 78,206,241,255, 18,119, 62,250,160,114, 74,254,245,151,183, 52,156,254,166,169, 82,
-186,147,150,181, 59,239, 22,103, 89,229, 35, 47,238,164,119, 33,222,199,255, 75,220,249,232,131,198,233,153,126,252,225, 45, 45,
-167, 63,105,234, 54,220, 73,203,218,157,119,139,243, 78,243, 81,  9,238,164,119,154,150,138,137,251,241,248, 15, 64,184, 91,226,
-170, 52,160,148, 18, 55,126,242,160,114,186,135,131,196, 95,150,110, 45, 67,108, 47,107, 78,143,240, 44, 43,140,167,148, 18, 66,
-200, 14,  0,143,150,165,223,203, 34,222, 61,252, 90, 38,188,165, 21, 87,165,229, 44,171,116,127,183, 57,203, 42, 47,121,114,150,
- 69,186,247, 22,239,119, 49,142,202,202,157,101,146,151,238, 70,154,247,146,126,238,152,215,147,179, 44,242,146, 39,103, 89,164,
-251,123,193, 89, 22,121,201, 27,103, 89,164,251,226,226,158, 89,176,238,141, 16,240,204,216,237, 30,100, 33,116,183, 68,166,191,
- 22,151,  7,129,179,140,227,104,188,147,179, 44, 91, 51,237,202, 42,142,238, 70,122,119,231, 44, 43,126, 79,158,178,136, 39,111,
-156,119,234,222, 98,220, 89,230,126,191,211,116,127,175, 56,203, 56,142,202, 36, 47,121,112,182, 43,227, 70, 64, 59,183,243,241,
-101,201, 89, 86,121,201,139, 59,239, 56,158,188,113,222,169,123,139,113,103,153,251,189, 44,234,144,187,197,251,208, 89,176,238,
-166,184,186, 91,149, 89, 89,114,223, 13, 43,206,221,178,180,149,149, 21,199, 11,239,142, 50,164,219, 94,214,238,116,186,143,220,
- 45,107,235,131, 14,150,151, 88, 94,122,208,242,146,183,116, 67, 41, 29, 79,  8,249,240, 65,107, 60,187,115,150,149, 16,242,226,
-247, 59,202, 75,158,239,150, 69, 94,242,193, 73,238,134,255,203, 58, 63, 61,136,224, 30, 20,135,248, 59,190,231, 54,248,218, 61,
-200, 17,112,151,220,217,238,223,224,247,187,225, 78, 66,200,248,187,228,247,127, 75,152,178,188,196,242,210,  3,151,151, 60,210,
-100,187,178,178, 12,149,117, 67,202,147,179, 44,190,225,206, 81, 86,105,244,110,251,189, 44,243,210,221,136,251,127, 11, 74,109,
-193,186,219,221, 38, 15, 50,231,221,224,190, 75,126,223,113, 55, 90,  7,119, 97, 92, 87,153,187,147, 82, 58, 30,101,216,229, 40,
-249,185, 44,221,122, 55,187,  9,239, 70,218,188,155,233,189, 44,199,121,220, 37,191,255, 91,226,189,204,221, 89, 86,121,201, 75,
-156,223,177, 91,189,133, 95, 89,119, 97,151,101,218,188,155,156,101,193,125, 55,220,121,183,226,254,223,  4, 14, 12, 12, 12, 12,
- 12, 12, 12, 12, 12,101, 10,182, 14, 22,  3,  3,  3,  3,  3,  3,  3,195,189, 18, 88,209,209,209, 27, 53, 26, 77,213,226, 94, 44,
- 40, 40,184,153,148,148,212,158,  5, 33,  3,  3,131,207,130,134, 16, 14,255, 88,204, 69,  0,148,178,214, 29,  3,  3,195, 67,140,
- 98,199, 96, 41,149,202,184,211,167, 79, 87, 23, 69, 17, 14,135,  3,118,187,221,245,107,177, 88,208,182,109,219, 82,143,223, 42,
- 87,174,220, 78,158,231, 43,151,230, 29,135,195,113, 45, 57, 57,185,117,  9,  5,247, 94,  0,113,132, 16,247,107, 37,254,  2, 72,
-178, 90,173,141, 74,226, 36,132,196,121,242, 21,195, 37,253, 47,145, 51, 40, 40,232,144, 32,  8, 49,222,184,138,251, 47,138,226,
-165,212,212,212,150, 44,153,222, 27,148, 43, 87,110,167, 32,  8,165, 78,159, 55,111,222, 44, 54,125, 70, 68, 68,252,197,113, 92,
-148,175, 52,201,113,133,218,131, 82,202,139,162,120, 54, 41, 41,169,117,113,  2,132,227, 56,159,105,222,243, 63,128, 68,171,213,
-218,196, 87, 62,242, 55, 15, 57,127, 75,228,116, 23, 87,130, 32, 76,139,136,136, 24,108, 48, 24, 76,  0, 40,207,243, 52, 52, 52,
- 20,132, 16, 23,167,221,110, 79,203,202,202,170,203, 82, 34,  3,  3,195, 67, 45,176, 68, 81,228,204,102, 51,206,157, 59,135, 98,
-202,121,199,109,124,175,250,137,223,183, 70,168,195, 35,225,176, 89,161, 12, 13,119,113,103,159, 62,  1,209,106,133,195,106, 65,
- 88,147,230, 82,229,133,218,181,107,243, 62, 56, 99,166, 79,159, 30, 17, 16, 16,  0,147,201,  4,147,201,  4,179,217, 12,147,201,
-  4,139,197,  2,139,197,  2,171,213, 10,171,213, 10,187,221, 14,179,217,140,109,219,182,249,114,123,204,228,201,147, 35,244,122,
-189,139, 79, 58, 36, 78,137,215,102,179,193,100, 50,225,247,223,127, 47,145, 83, 16,132,152,164,164,164,  8,185, 92, 14, 74, 41,
- 68, 81,  4,165,180,200,225,137, 42, 85,170, 88, 89, 18,189,167,168,190,111,209,183, 17,202,144, 80,136, 54, 27, 66, 27, 52,150,
- 68, 15,146,126,223, 12,135,213, 10,209,102, 67,165,110,189, 93,215,227,227,227, 75, 76,159,148,210, 74,187,191,156, 25, 36, 15,
-  8,128,221,100, 66,108,215, 94,174,123, 39,231,207,132,104,179,130,218,172,168,247,206, 88,  0, 64,122,122,186,177,106,213,170,
- 73, 40, 28,  8, 74,139, 17, 44, 49,  5,  5,  5, 17,146, 27, 60, 69, 17,199,113, 69,142, 61,123,246,160, 99, 71,159,139, 46,199,
-204,158, 61, 59, 66,202, 35,158,233,220,110,183,187,126,237,118, 59, 76, 38, 19, 54,109,218,228,175,229,106,122,167, 78,157,  6,
-252,252,243,207,218,117,235,214,105, 43, 87,174, 12,185, 92, 14,158,231,193,243, 60, 56,142,131, 32,  8,104,214,172, 25, 97, 73,
-144,129,129,225,161, 23, 88,102,179,249,114,195,134, 13,169,243,127,180, 82,169,148,123, 20,156, 81,213,171, 87, 63,235,249,158,
-175,174, 67,117,120, 36,190,139, 13,  1,  0, 60,115, 49,195, 85, 49,172,110,211,192,245, 76,223,171, 57,133,207,170,213, 32, 30,
-205,112,111,208,106,181,232,212,169, 19, 20, 10,  5,154, 52,105,  2,153, 76,230,245,144,203,229,144,201,100,254, 84, 10,208,233,
-116,152, 48, 97,130, 36,142,160, 85, 41, 49,172,101, 19,168, 64,241,213,137,243,176,136, 20,130, 32,184, 14,127, 56,229,114, 57,
-142, 31, 63, 14, 65, 16,192,243,188,235, 87,250,191, 97,195,  6,244,233,211,  7,130, 32, 64,173, 86,  3,255,161,217, 22, 15, 10,
- 84,161, 97, 88,221,182, 33,  0,224,133,235,121,174,184,251,245,185,174,174,103, 94,186, 81,224,138, 79,201,242, 84, 28, 56,142,
-131, 60, 32,  0,191,244,121,  2,  0,208,251, 92, 42,100, 50, 25,  4, 65,192,177,207, 39, 65,166, 80, 64,144,203, 81,239,157,177,
- 72, 79, 79, 55,246,234,213,107,119, 64, 64,192,230,220,220, 92,248, 16,110,184,126,253, 58,  4, 65, 40, 54,189,115, 28,135,133,
- 11, 23,226,234,213,171,126,249,221,104, 52, 98,234,212,169, 32,132, 20,201, 47,197,253,247, 83, 92, 77,234,220,185,243,139, 63,
-255,252,115, 48, 33,  4,115,230,204,129, 92, 46,199,147, 79, 62,137,208,208, 80,108,217,178,  5,114,185, 28,163, 70,141, 98,137,
-143,129,129,161, 36,200,  0, 52,  0, 16,238, 52,240,228,  1,  8,114,187,159,230,252, 13,119, 59,255,211, 11, 79, 83,231, 51,210,
-125,233,220,  2, 64,225,229,122,  6,  0,181,243, 48,  3,216, 11,160,142,219,119,164,247,224,249, 93,193, 89, 16, 62, 10, 96, 59,
-128,118,210,226,119, 55,111,222,124,194,205,146,114,250,236,217,179, 53, 37,173,227,236, 42,148,219,237,246,234, 82,183,161,212,
-242,237,216,177, 99,137, 45,122,135,205,122,139,240,240,166,161,188,117,121, 20, 39, 92,172, 86, 43,158,125,246,217,194, 24, 40,
-166,178,113, 63,252,208,108,176, 88, 44, 16,  4,  1, 53, 42,132,227,131, 46, 13,241,  8,181,161, 32,159,192,158, 83,128, 30, 58,
- 27, 78,215,106,132,  5,215,210,112, 53, 55, 31,130, 32,248,197, 41,138, 98,177,226,138,231,121,204,155, 55, 15,207, 63,255, 60,
-120,158,247,139,143,161,236,225,176, 90,189,166,195,226,210,172, 63,241,100, 55,153, 10,197,150,192,187,196,149, 76, 38,131, 76,
-169,132, 32,151, 67, 80,200,145,158,158,110,236,216,177,227,126,133, 66,177, 40, 50, 50, 50, 41, 49, 49,209,167,192, 42,194,229,
-165, 49,241,253,247,223, 99,241,226,197,104,214,172,153, 95,249,200, 98,177, 64, 46,151, 99,210,164, 73,183,220,159, 63,127,254,
- 45,  2,171, 36, 78,103,195,136,139,138,138, 26,178,105,211, 38,189,244,108, 88, 88, 24,100, 50, 25,234,214,173,139,128,128,  0,
-236,222,189, 27, 14,135,195,239,124,201,192,192,240,240,194,155, 22,113, 67,219,209,163, 71, 55,153, 54,109,218,148, 22, 45, 90,
- 44,223,187,119,239, 50, 66,200, 70,183, 50,177,171,147, 99,163,219,121, 83, 15,145, 37,  3, 16, 78,  8,217, 40, 61,239,126,238,
-118,189, 35,  0,133,116, 62,122,244,232, 58,211,166, 77,155,146,144,144, 48,102,234,212,169,242,209,163, 71,215,155, 54,109,218,
- 20,233, 59,222,220,225,110,193, 42,113, 21, 96,169,187,240,204,153, 51,240, 53, 46,213,215,250, 25,202,208,112,151,229,106, 85,
-149, 80,215,245,231,175,100,187, 42,174, 95, 30,169, 10,133, 78,139, 38, 31,126,226,151,101,200, 98,177, 32, 53, 53,213,213,242,
-246,117,248,203,169, 81,171,176,237,237,186,184,158,161,192,248,125,153,248,249,232,  5,200,100, 50, 60, 94,171, 46,158,144,  7,
- 96,108, 37,  5,222, 62,127,  5, 54, 63,199,234, 82, 74,189, 10, 43,233,191,212, 85,194,  4,214,253, 67,104,131,198, 46,203,213,
-210, 10,  1,183, 88,173,  0, 96, 67,163,202, 80,  6,232, 80,247,127,  9,126,165,165,216,174,189, 92,150,171,159, 27,199,130,151,
-201, 32, 83, 40,240,204,241, 27,  0, 10,187,  5,219,215,141,223,145,205, 43, 22,190,248,226,139,151,255,248,227, 15,181, 47, 78,
-169, 49,225, 41,176, 36,241,243,253,247,223, 99,201,146, 37, 16,  4,  1, 86,171,127, 61,205,102,179,185,216,252,225,205,130,229,
- 79, 26, 45, 40, 40,176,172, 95,191, 30, 95,124,241,  5, 66, 67, 67,209,185,115,103,148, 47, 95, 30,171, 86,173,  2,165, 20, 67,
-135, 14,133, 90,173,150,172,213, 44,  1, 50, 48,252,183, 81,146, 22, 81, 78,155, 54,109,138,187,128,241, 20, 52,238,194,201, 67,
- 68,185,139,180, 58, 62,202,215,141,158,162, 73,250, 46, 33,100,227,212,169, 83,187,250,112, 71,154,167,192, 42,113,153,125,179,
-217,124,185,126,253,250,126,169,  8,131,193,144,236, 75,100,120,107,249,187, 91,  5,148,  1, 58, 40,117, 58,112,126,174,210,101,
-179,217, 92,  2,101,235,214,173, 80,171,213,120,242,201, 39,239,200,130,101,181, 90,161,144,203,192,133, 69,226,229, 25,127, 32,
- 35,207,232,170,208,182, 95,186,140, 35, 41,169,120,187, 69,  7,104,213,169,200,183, 88,252,178, 16,136,162,120,139,184, 18,  4,
-  1,207, 62,251, 44,204,102, 51,  8, 33, 69,198,165,128,117, 17,222,207,150,148,215,115, 66,  8, 84,250,  0, 40,180, 90,240, 60,
-239, 23,151,187,181, 73, 80, 40, 32, 83, 42, 32, 56,133,140,100,185,202,230, 21, 11,111,220,184,177, 31,128,234,145, 71, 30, 81,
-251,195,235, 46,176,220,  5,144,187,184,226,121, 30, 54,155,205, 47,255,154,205,102,200,229,255,140,  4,184,118,237, 90,137,  2,
-203,135,159, 41, 33, 68,  4, 32,198,197,197,185,222, 45, 87,174, 28,130,130,130, 32,138, 34, 68, 81,132, 74,165,130, 90,173, 46,
-242, 93,  6,  6,134,255,116,217, 91,156,214, 48, 38, 36, 36,140, 33,132,108,116, 90,146, 78,148, 32,164,188,161,169,135, 72, 75,
- 43,166,236,234,234, 77,100,185,255,151, 48,122,244,232, 58, 94,220,241,231, 45,  2,203, 77, 53,222,  2,247,238,194,178,170,188,
- 74,170,192,212,122, 61,228, 90, 45, 56,142,243,185,191,146,212, 69, 40,141, 57, 25, 60,120,112,137,227, 82,252, 29, 47,101,181,
- 90,193,  9, 60,110,150,139,133,131,219,245, 79,  5,233, 60, 56, 65,134,171,229,106,130, 63,243, 23,100,162,120, 91, 22,172,161,
- 67,135,226,235,175,191,150,252,  9, 66,  8,  4, 65, 64,181,106,213,112,249,242,101,150,211,238,  3, 40,165,197,138,101,233,186,
- 42, 32,  0, 10,157, 14,188,159,105,201, 93, 12,201,149, 74,  8, 10, 57,  4,121, 97,183, 96,183,110,221,118,100,103,103, 47,172,
- 93,187,246,121, 20, 46, 99,192,249,155,135,  4, 65, 40, 34,124,188,137, 43, 65, 16, 96,183,219,253,110, 84,120, 10,157,201,147,
- 39,223,242,220,211, 79, 63,237,111, 67,133,114, 28, 71,229,114, 57, 58,117,234,132,122,245,234, 97,221,186,117, 16, 69, 17,111,
-190,249, 38,212,106, 53,102,206,156,  9,187,221,142,233,211,167, 51, 11, 22,  3,  3, 67, 73, 90,196, 60,117,234,212, 19, 83,167,
- 78,117, 89,146, 60, 45, 88,197,224, 41,167,152, 10,151,196, 25, 10,199, 82,253, 89,130, 27,186, 22, 39,188,220,175, 77,155, 54,
-109,138, 23,119,184,186, 37,239,249,102,207,217,167,142,187,  6, 17,187,119, 11,110,106, 89, 19, 74,157, 22, 74,157, 14,173,214,
-237,114,181,154,  1,223,221, 48, 54,155,205, 37,176, 50, 50, 50, 74, 20, 87,165,177, 96,113, 10,  1,171, 99,178, 64, 21, 50,  8,
- 22, 91, 17,129,197, 11, 50, 92, 15,141,  5, 39,147, 67,112,248, 87,129, 81, 74,111,233, 18,124,229,149, 87, 64,  8,113,205,248,
-170, 95,191,190, 59, 23,171,113,238, 49,146,126,223,236, 26,208,238,222, 45,184,241,145,170, 80,  5,232,160,208,106,209,246,167,
-189, 46,107, 35,222,159,236,147,243,236,183, 95,226,248,204, 41,144, 41, 20,232,253,215, 85,151,229,170,101,141,170,251, 45, 90,
-253,194,107,215,174,237,  7,192, 61,247,220,115, 65,245,235,215,247,153, 39, 37, 65, 94,146,184,114, 23, 88,254, 90,176,164,134,
-138, 63,150, 51,127, 44, 78,148, 82, 26, 18, 18,  2,142,227,160,215,235,161,211,233, 92, 51,104, 85, 42, 21, 52, 26,141,107,252,
-166, 63,223,101, 96, 96,248, 79, 35, 88, 18, 56, 78,145, 84,196,178, 68, 41,237,234, 46,130,138,235, 42,116, 90,156,118,250,248,
-214,207, 78, 97,230, 21,146, 37,205,163, 12,221,232, 41,206,  4, 73, 49,186,255,150, 47, 95,254, 87,157, 78, 23,235,175,175, 75,
-179,232,168,251, 32, 98, 73, 92, 17, 66,160,210,233,160,208,105,161, 12,208, 21,107,229, 42, 73, 96, 73, 21,138, 84,217, 44, 90,
-180,  8, 58,157, 14,253,251,247, 47,245, 24, 44,151,192,146,115,216,162,252, 29,188, 66, 40, 34,174,  4, 65,  0, 47,147, 33, 89,
- 87, 30,156, 76,  6,193,238,159, 37, 35, 39, 39,  7,130, 32,224,131, 15, 62,112,181,216,221,197, 85,105,252,204,112,119, 32,186,
-137,145, 34, 86,213,128,  0, 87,250, 44,205,  0,119,  0,160,118, 27,100, 74, 37,100, 10,185, 75, 92,117,235,214,109,135, 69,171,
- 95, 88,179,102, 77,151,229, 74,163,209, 72,179, 71,125,130,227,184, 34,105,122,225,194,133, 69,196,149,167,  5,203, 31, 62,201,
-130,245,245,215, 95,151, 40,162,228,114, 57,228,114,185,223,254,231, 56, 14, 59,118,236,192,145, 35, 71, 48,120,240, 96,168,213,
-106,204,158, 61, 27,118,187, 29, 31,125,244, 17,212,106, 53, 20, 10,  5, 75,124, 12, 12,204,122, 85,210,190,162,105, 30,227,156,
-136,135,165, 41,205,155,176,114,239, 14,116,251,111,243,194,107,241,232, 58,244,188, 46,253,102, 76,157, 58,245, 15,201,114,229,
-118,189,136, 59,138,181, 96, 41,149,202,216,115,231,206,185, 22, 25, 45,233,215, 98,177,160,125,251,246,126, 91,194, 68,231, 44,
- 66,206, 57,144,219, 53,238, 74,175,131,210,217,245,226, 33, 52,136,175,194, 91,106,  1,187, 11,172, 15, 63,252, 16,130, 32,224,
-235,175,191,  6,  0,188,251,238,187,126,143,193,146, 56,225, 32, 72,164, 23,209,112, 70, 31, 88,150,218,144,178,231,111,  8,130,
-128,136,230, 79, 64,124,164, 15, 12,106, 29,  4,135,221,239, 89,132,153,153,153,184,124,249, 50,120,158,199, 59,239,188, 83,100,
-173, 34,207,153,105, 91,183,110,101, 22,172,251, 40,176, 56,231,248, 42,111,233,211, 67, 92, 17, 95,194,154, 58,236,133,227,174,
-228,255,204, 22,204,206,206, 94,120,237,218,181,  3,  0,184, 23, 95,124, 49, 72,163,209,224,219,111,191, 53,  0, 80,172, 90,181,
-202,231, 32,119, 41,221, 20, 39,174,110,167,139, 80,178,  4,187,143,235, 42, 73, 96,249,  3,201,173,132, 16, 56, 28, 14,168,213,
-234, 34,150, 43,149, 74,  5,165, 82,201, 18, 30,  3,  3,131, 47,252, 89,138,103,155,186,137,165, 63,111,147,247,207, 59,117,176,
- 80,156,192, 48,155,205, 56,117,234,148,191, 60,126, 47, 58, 26,218,184, 25,250, 94,205,  1, 33,  4, 91,218,212,118,117,187,180,
- 92,179,195, 85,  9, 92,157,250, 46,100, 90, 29, 66,219,116,246,171,  0,151, 42,  6,119,129,149,157,157, 13,153, 76,134, 73,147,
- 38,129,227, 56, 76,159, 62, 29,209,209,209,184,121,243, 38, 86,173, 90,229,151,  5,139,119,240, 40,255, 82, 60, 52,175,  4, 66,
-255, 82, 91,  4,119,250, 16, 55, 44,  2,246,154, 52,104,107, 58,  9,197,150, 89,176,136, 14,191,198,117,  1,128,221,110,199,142,
- 29, 59, 60,  7,178,131, 82,234, 90, 37,223,102,179,193,106,181, 98,250,244,233, 96, 59,137,220,123, 84,120,170, 39, 94, 78, 50,
-  0,  0,126,117,235,182,110,189,118,151, 43,125, 94,158,252, 14,100, 90, 29,130,155,182,241,139,179,214,155, 35, 81,235,205,145,
- 72, 79, 79, 55,118,104, 80,123,103,190, 92,243,125,221,186,117,139, 88,174, 84, 42, 21,113,158,251, 37,170, 57,142,  3,207,243,
- 46,113, 37,137, 41,111,  2,203,223,113,135, 54,155, 13,114,185,220,111,129, 85, 26, 11,214,171,175,190,138,242,229,203,187, 44,
- 87, 19, 39, 78,132, 90,173,198,232,209,163, 97,179,217, 48,107,214, 44,150,248, 24, 24, 24,238,135, 24,187,107,240, 90,242,154,
- 76,166, 43,245,234,213, 67, 49,247,162, 85, 42,149,204,163,112,142,170, 94,189,250, 89,207,174, 66, 66, 72, 71, 74,233, 54,111,
-133,185,251,108, 44,165,135,213, 74, 30,160,135, 76,171,  3,231,165, 59,207, 27,167,180,142,142,187,192,146,142,156,156, 28,200,
-100, 50,124,241,197, 23,208,235,245, 48,155,205, 62, 57,  9, 33,176,219,237,224,121, 30,134,235,121, 56, 61,101, 27, 20,170,189,
-168,218,249,121,148,151,169, 33,223,253, 35,140, 14, 91,137, 11,141,122,227,172, 94,189, 58,198,141, 27,119,203,242, 12,197, 33,
- 58, 58,218,167,223,239, 20,140,211, 59,167, 63,233,147, 87, 42,189, 77,214,184, 37,222,129,127,102, 11,230,203, 53,223, 95,190,
-124, 89,178, 92,  5,106, 52, 26,204,159, 63,223,  0,128,251,232,163,143, 52,149, 42, 85,226,253, 73, 75, 60,207, 99,209,162, 69,
-183, 12,104,247, 38,174,188, 45,251,225,205,239,118,187,253, 22,129,245,236,179,207,222, 50,123,176, 56, 11,150, 55, 78,201,173,
-161,161,161, 46,203,149,195,225,112,205, 30,180,217,108,176,219,237,197, 54, 38, 88,250,100,156,140,243,191,195,249,176,193,107,
-237,158,148,148,244,120,113, 47, 84,173, 90,245,220,185,115,231,170, 57, 28, 14,247, 61, 10,229, 38,147,169,122,203,150, 45,125,
- 54,149, 69, 81,132, 82,169,  4,165, 20, 13,199, 78,  3, 33,183,142,183, 10,106,217,  1, 68, 16,224,112, 56, 96,177, 88,124,206,
- 34, 52, 26,141,174,202,164,184,  1,238,249,249,249,174,117,126, 56, 63,214,127, 48,153, 76, 69, 42, 42, 66, 69, 92,253,109,229,
- 45,179,  9,165,195,223,214,188, 74,165, 42,210,197, 83, 18,124,173, 41,198, 80,246,144,150, 84,160,148,162,246,176,247, 10,227,
-201,217, 93, 40,137,128,192, 38,109, 64,100,  2, 68,  0,102,179,217,151,153,145, 72, 99,174, 40,165,223,245,232,209,227, 44, 10,
-103,176, 80,157, 78,167,148,201,100, 34,128, 76,  0, 52, 43, 43, 43,240,198,141, 27,162,201,100,170,232,203,157, 59,118,236,192,
-133, 11, 23,208,184,113, 99,215,150, 77, 82,183,155, 36, 98,220,  5,150,191, 22, 44,111,107,106, 21,183,154,187,191,105,158,231,
-121,  4,  6,  6,186, 22, 49,149,203,229,208,104, 52,  0,128, 89,179,102,185,194,156,129,129,129,225,161, 23, 88,190,202,203, 18,
-186, 15, 75,236, 42,180,219,237,137,149, 42, 85, 42,213,199, 28, 14, 71,138, 15,193,150,184,106,213, 42,185,187,181,192,215, 47,
-165, 52,197, 71, 37,155,184, 97,195,  6,185,167, 21,162,184,255,132, 16,159,156, 14,135, 35,177,114,229,202, 94,121,138,131,205,
-102,187,193,146,232,189,131,195,225, 72,172, 88,177, 56,109,243,214,109,165, 79,187,221,126, 62, 54, 54, 54, 41, 40, 40,232,231,
-200,200,200,140, 61,123,246,132, 54,109,218, 52,212,253,153,166, 77,155,150,247,120,205,130, 98,246, 33,148,210,124,151, 46, 93,
-188,166,121,111,105, 83, 74,211,190,210,252,111,191,253,230, 87, 62,146,254,139,162,152,232,135, 96,189,218,176, 97, 67,206,157,
-163,184,180,111,179,217,210, 88, 42,100, 96, 96,248,207, 10, 44,163,209,120,189, 94,189,122,246, 98,238, 93, 43,233,221,244,244,
-244, 38,101,237,  1,171,213,218,242,223,192,153,150,150,214,132, 37,183,  7, 27,119, 35,142, 82, 82, 82, 30,249, 55,164, 79,139,
-197,210,242,110,132,105, 70, 70, 70, 11,150,178, 24, 24, 24,152,192,242,  3,254, 46,199,192,192,192,192,192,192,192,192,240, 95,
-  5,199,130,128,129,129,129,129,129,129,129,161,108, 65, 80,184,107,244, 45, 40,205,236,  0, 66, 72,199,210,126,216, 23, 63,227,
-100,156,140,147,113, 50, 78,198,201, 56, 31, 62, 78, 95,220, 15,205,236, 68, 74,233, 93, 59,  0,116,100,156,140,147,113, 50, 78,
-198,201, 56, 25, 39,227,252,175, 29,172,139,144,129,129,129,129,129,129,129,161,140, 33,176, 32,184, 63, 32,132,240,148, 82, 71,
- 25, 82,  6,  3, 40,110, 67, 55, 11,128,172,219,113, 38,  0,185,243,144, 22, 42,178,  1,176, 58, 15, 63,150,154,159,192, 37, 37,
-  5,215,161, 14, 89, 83, 74,136, 76, 20,113,180, 98,197, 10,127,  1,143, 91,  0, 64, 87,174, 86, 45,157, 86,221,209,108,181,196,
- 42,101,138, 83,217,  5,249, 91, 77, 41,103,175,176, 20,194,192,112, 95,202,165,110,  0, 38, 56,243,254, 84, 74,233, 74, 22, 42,
- 12, 12,101, 44,176,  2,  2,  2, 14,113, 28, 23,227,190,102,141,180, 48,102,113,235,226, 56, 28,142,196,204,204,204, 38,126,102,
-100,  1,192, 51, 58,157,174,189, 76, 38,107,  5,  0, 54,155,109, 79,126,126,254, 31,  0, 86, 81, 74,237,183, 89, 64,232,  1, 60,
- 11,160,159,243,210, 15,  0, 86, 82, 74,115,111,147,175, 94, 96, 96,224, 26,153, 76, 70,211,211,211,155,  3, 64,104,104,232,126,
-155,205, 70,114,115,115,159,166,148, 30, 43, 37, 31, 39,151,203,167,181,105,211,166, 53, 33,100, 49,165,116, 94, 25,197,165,146,
-227, 56,175,194, 68, 20,197,202,183,193, 39,  7, 16,248,197, 23, 95,132, 46, 89,178,164, 97, 98, 98, 98, 93,  0,136,137,137, 57,
-254,226,139, 47,254, 53,108,216,176, 12,  0, 57, 78,161, 85, 44,146,146,130,235,164, 38, 95, 26,156,146,122,234, 89,  0, 40, 87,
-190,238, 74,158,231,228,209,209, 71,246,105,194,250,133,213,168, 89,101,208,242,111,191,144, 87,142,173,128,223,247, 30,105, 48,
-236,127, 99,234,168, 34,107,124,198, 68,214,189,131, 94,175, 63,196,113, 92, 76, 73,121,220, 91,158,119, 56, 28,137, 25, 25, 25,
- 77,138,227, 20,  4, 33,166,164,242,194,219, 53, 81, 20, 47,165,165,165,121, 93, 50, 34, 48, 48,112,159, 32,  8,177,254,114, 73,
-191,118,187, 61,177,184, 37, 98,  2,  3,  3, 15,241, 60, 31,227,107,205, 47,207, 95, 81, 20, 47,165,166,166, 22,231,206, 91,252,
- 94, 22,238,188, 29,206,146,220, 41,149, 71,  0,102,133,134,134, 54,203,200,200,120,  1,192,152,220,220,220,250, 60,207, 35, 36,
- 36,100, 12, 33,228, 66, 96, 96,224, 55, 57, 57, 57,123,  1,252,143, 82, 42,178, 28,195,192,112,135,  2,139,227,184,152, 27, 55,
-110, 68,104,181, 90,  0,255,236,151, 39,109,242, 44,138, 34, 40,165,174, 95,187,221,142,248,248,120,127, 69, 70, 93,189, 94,191,
-122,244,232,209, 21,159,121,230, 25,133,180, 37, 76, 82, 82, 82,245, 53,107,214,188, 48,105,210,164, 15,  9, 33,125, 40,165,199,
-253, 21, 45,  0, 58,  0,120,165, 97,195,134,189, 39, 78,156, 40,127,236,177,199,224,112, 56,240,203, 47,191,180,249,232,163,143,
-190, 32,132,252,  8, 96, 33,128,223,252, 45, 36,  8, 33,173,203,149, 43,183,108,247,238,221,229, 47, 95,190,236,120,230,153,103,
- 86,  0,192,161, 67,135,226, 28, 14,  7,105,222,188,249,207,132,144,190,148,210,221,165,  8,243, 30,195,134, 13,235, 51,116,232,
-208,240,254,253,251,191,  4, 96,158,243, 91,210, 46,226,165,221,128,208,101,185,162,148,150,180,  3,111,185, 82, 88,178,180,151,
- 47, 95, 14,110,217,178,229,144,212,212,212,183,221,121, 83, 82, 82,112,248,240, 97,235,148, 41, 83,102,236,221,187,119,110,108,
-108,108, 22,128,130,226,136,168, 67,214, 52, 37,245,212,179,109, 91,124, 17,  8,  0,171, 54, 12,121,254,224, 95,105,  1, 27, 55,
- 45,120, 65,161,146,155,151,124, 53, 67, 94,173,106,101,108, 63,116, 30,  7, 78,101,146,186,173,187, 10, 57, 27, 23,119,  2,176,
-128,101,207,123,  3,158,231,163, 19, 19, 19, 35, 52, 26,141,215, 13,221, 61,198, 93, 72, 11,235,162,122,245,234,197, 23, 44,130,
- 16,115,227,198,141,  8,149, 74,229, 42, 59, 60,203, 12,169, 92,113,165, 21, 74, 81,163, 70, 13,107,  9,101, 82,165,107,215,174,
- 69,104, 52, 26, 23,143, 55,247,121, 10,141, 26, 53,106,148,228,247, 34,238,244,135,147, 82,138,106,213,170, 57,124,249, 93,218,
-177,194,151,191, 37,206,216,216, 88, 90, 26, 78,127,220, 89,165, 74, 21,171,143,232,159,117,246,236,217,161, 21, 42, 84, 64,181,
-106,213,246, 54,107,214, 76,175,213,106,177,105,211, 38,212,170, 85,171,142, 94,175, 63,176,106,213, 42,217,168, 81,163, 26,124,
-255,253,247,  0, 48,140,229, 24,  6,134, 59, 20, 88,132, 16,104,181, 90,172, 88,177,194,181, 61,140,180, 77,134,183,255,197,175,
-128,125, 11,111,147,216,216,216, 29,187,119,239, 86,151, 47,255,207,  2,214, 22,139,  5,193,193,193,120,243,205, 55, 21,221,186,
-117,171,214,185,115,231,253,132,144, 71, 41,165,135,124,240,245, 14, 15, 15,159,243,193,  7, 31, 68, 62,247,220,115,  8, 13, 45,
-178, 72, 54,158,121,230, 25, 60,253,244,211,242,179,103,207, 62,191,104,209,162,231,231,205,155,151, 76,  8, 25, 70, 41,253,177,
- 36, 94,141, 70,211,163,106,213,170,243,119,239,222, 29, 17, 17, 17,129,184,184, 56,110,212,168, 81,213,170, 87,175,174,142,137,
-137,225,110,222,188,137,117,235,214, 69,247,237,219,119,181, 66,161, 24,100,177, 88,214,251,225,119, 69, 72, 72,200,200, 55,222,
-120, 35, 52, 55, 55,215,126,228,200,145,243,210,117,165, 82, 57,174,121,243,230,141,  8, 33, 43, 40,165, 11,111,199,114,229,180,
-210,121,238, 57, 98,147,238,251,105,201, 82, 28, 61,122, 52,164, 69,139, 22, 63,154,205,230, 70,131,  7, 15,190, 54,101,202, 20,
-181, 94,175,215,  3, 32,185,185,185, 89, 19, 38, 76,176,204,156, 57,243,189, 90,181,106,117,216,183,111, 95,239,  6, 13, 26,216,
-156,226,237, 86,129, 69,136,203, 61,215,111,164, 97,199, 94, 81, 49,110,244,187, 49, 31, 79,142,189,250,231,201,235,162,160,214,
-227,167,157, 39,144,146,145,143, 95,247,157, 68,185,208,  0, 34, 87,202,234,  4,197,212,121, 52,231,198,201,157,148,237,120,125,
-215, 65,  8,129, 70,163,193, 79, 63,253,116,203, 22, 83,222,182,159, 18,  4,  1, 65, 65, 65, 62,119, 35, 80,169, 84,216,186,117,
-107,145,237,165,188,253,151,126,  3,  3,  3,129, 18, 54,187, 38,132, 64,165, 82, 97,207,158, 61,224, 56,238,150,247, 61,221, 44,
-  8,  2,180, 90, 45,184, 18,246,164,146, 56,119,238,220,233,147, 75,250,213,233,116,  0, 80,226,254, 67, 74,165, 18,187,119,239,
- 46,214,207,158,255,117,206,253, 46,125,113,238,217,179,167,200, 22, 93,158, 91,119,185,159,107,181, 90, 87,195,173,216,214, 89,
-112,112,243,152,152, 24, 28, 60,120, 16,171, 86,173, 10,169, 83,167, 14,206,159, 63, 15, 66,  8,166, 76,153, 66,106,215,174, 45,
- 75, 78, 78, 70,155, 54,109,176,118,237,218,150, 44,183, 48,220, 71,200,  0, 52,  0, 16,142,194, 93, 99,242,  0,  4, 57,235, 30,
-  5,128, 12,  0,106,231, 97,  6,144, 15, 32,204,249,110,186,179,108,113, 23,  8,105, 40,186, 41,116, 83, 39,183,180,163, 68,184,
-219, 61,233, 27,158,231,158,191, 69,184,  5,103, 33, 35, 85, 98,237, 40,165, 59,138,248,200, 15,113, 37,237, 35,230,153,151,189,
-108,252,170,212,106,181,107,246,239,223,175, 14, 15,255,199,237,102,179, 25,121,121,121,200,207,207, 71, 94, 94, 30,  2,  2,  2,
-176,106,213, 42,117,135, 14, 29,214, 16, 66,170, 83, 74,205,197,113,  2,152,113,243,230,205, 72,187,221, 14,133, 66, 81, 92,203,
- 23,241,241,241, 24, 51,102, 12,186,116,233, 82,174,125,251,246, 51,  0,252, 88,  2, 39, 52, 26,205,252,195,135, 15, 71,104, 52,
- 26,156, 59,119, 14,137,137,137, 24, 49, 98, 68,  5, 81, 20,113,253,250,117,156, 63,127, 30, 55,110,220,192,162, 69,139, 34,122,
-246,236, 57, 31,192,250,146,252,238,196,192,119,222,121,167,122, 72, 72,  8,247,201, 39,159,228,228,231,231,127,229,188, 62,122,
-214,172, 89,125,219,182,109, 27,254,218,107,175,129, 16,178,156, 82,122,139, 96,241,224,244,102,185,114,  0, 56,237,241, 90,188,
-135,101,171,156, 51,241,101,123,225, 36,  0,  2, 59,119,238,252,142,217,108,110,180,123,247,238, 11,173, 90,181,170,  4,224,166,
-148,232,  2,  3,  3,181, 51,102,204,136,236,218,181,235,217,199, 30,123,172, 81,231,206,157,223, 73, 75, 75,155,226,188, 79, 61,
- 57, 69, 17, 71,203,149,175,187,114,231,190, 97,207,110,223, 99,145,191,251,191, 15,175, 85,172, 80, 57,231,232,185, 76,199,201,
- 75,105,200, 51,218,209,235,177,194,141,197,155,215,173,136, 57, 43,118,227,205,183,222,151,253,184,114,241,211, 23, 40,180,  0,
-126, 46, 33, 60,239,  8,140,243, 31,145, 33,138, 34,100, 50, 25,158,120,226,  9, 16, 66,110,217,107, 83, 38,147, 97,223,190,125,
-120,236,177,199, 32,147,201,240,234,171,175,250,197, 41,  8,  2, 58,119,238, 12,187,221,126, 11,159,167, 88,240,166,  5, 60,253,
- 78, 41,133, 32,  8,224, 56,206,171,248,241,182, 71,168,175,114, 73,114,103, 73, 92,238,247,124,185, 83,178, 30,249, 43,174,252,
-229,148,220, 41,  8,  2, 90,182,108,137,191,254,250,171, 68,177,229, 77, 87,122,250, 61, 43, 43,235,229,234,213,171,239,252,226,
-139, 47, 66,  0, 32, 35, 35,195,181, 17, 61,207,243, 56,115,230, 12, 44, 22, 11,198,143, 31,111,205,205,205,125,141,229, 35,198,
-121, 55, 57, 75,210, 34,  0,218,142, 30, 61,186,201,180,105,211,166,180,104,209, 98,249,222,189,123,151, 17, 66, 54, 82, 74,187,
- 74,191,163, 71,143,174, 51,109,218,180, 41,  9,  9,  9, 99,166, 78,157,122,130, 16,178, 17,  0, 60,207,157,238,239,234, 33,222,
-194, 37, 30,167, 91,138, 60,235,237,220,243,215,147, 91,112,187, 64,156,158, 35,238,133,153,191,  2,203,159,189,245,  4, 65, 24,
- 58,101,202,148,200,146,196, 85,126,126, 62,146,146,146, 80,169, 82, 37,188,250,234,171,145, 95,124,241,197, 80,  0,159,150, 64,
- 43,231,121, 30,  7, 15, 30, 68,106,106, 42,234,213,171,135,216,216,216, 34, 15, 92,188,120, 17,191,252,242, 11,178,179,179,209,
-184,113, 99,160,112,124,145, 87, 52,104,208, 96,124,124,124,124,231,206,157, 59,219,213,106, 53,142, 30, 61,138, 70,141, 26, 97,
-197,138, 21,168, 88,177, 34, 52, 26, 13,206,158, 61,139,122,245,234, 97,199,142, 29,  8, 15, 15, 71,195,134, 13,237,141, 27, 55,
-222,149,153,153,249,199,149, 43, 87,198, 23,147,112,228,209,209,209, 99,222,120,227, 13, 69, 82, 82,146,184,104,209,162,189,148,
-210,189,132,144, 65,239,191,255,254, 75, 93,186,116,  9, 63,114,228, 72,238,159,127,254,249,167, 55,113,229,167,229,202,238, 89,
- 25, 57, 28, 14,179,209,104,180,152,205,102, 27,199,113, 87,  8, 33, 22,135,195, 81, 92,223,142,234,149, 87, 94,169,146,158,158,
-254,230, 91,111,189,117,217, 41,174,206,160,112, 96, 59,  0,192,110,183,155,243,243,243,115, 91,180,104, 81,169,111,223,190, 23,
-150, 45, 91,246,230, 43,175,188,178,106,225,194,133,249,  0,140,158,132, 21, 43, 86,248,139,231, 57,121, 65, 94,200,165,213,171,
-190,121,251,151, 13, 67, 43, 92,191,126,163, 90,104, 88,120,129, 92, 23,158,180,234,135,239, 15,  1,176, 36,165,229,226,216,197,
-100,200,100, 60, 78, 93,207, 65,219,199,159,145, 93, 56, 55,185,181, 36,176, 24,238, 42,168,180, 57,244,246,237,219, 75,180, 96,
-237,219,183, 15, 50,153, 12,106,181, 26, 51,103,206, 44,145, 84, 18,  4,146,117,200,151,136,225, 56,174,196,114, 68, 18, 25,210,
-  6,236,158,199,151, 95,126,137,183,222,122,171,200, 55,156, 34,131,248,226, 44,206,125,149, 42, 87, 70,106, 74, 74,145,107,254,
-108, 22,239,112, 56, 32,147,201,240,245,215, 95,163,107,215,174,216,184,113, 99,137,191, 79, 60,241,  4, 56,142,163,254,132,103,
-203,150, 45, 97,181, 90, 93,110, 62,115,230,140, 87,222,121,243,230,249,170,204,186,  1,152,208,168, 81, 35,125,251,246,237,177,
-115,231, 78, 60,253,244,211,102,171,213,122, 14,  0,158,122,234,169, 26, 95,124,241,133,226,240,225,195,  8, 13, 13,149, 93,187,
-118,237, 59, 66,  8, 27,248,206,112,119, 11, 35, 47, 90, 68,170,243,166, 77,155, 54,197, 67, 24, 21,129,116,159, 16,178,113,234,
-212,169, 93,221,197,144,251,185,155,149,201, 93,188,213,113,183, 64,185,139,167, 98, 68,153,167,187,221,159, 79, 43, 34,176,156,
- 30,106,231,110,245,145, 10, 93, 95,226,170,184,150,162, 39,  2,  3,  3,159,236,213,171,151, 75,220,152, 76, 38,151,176,146,196,
-149,116,126,246,236, 89, 52,105,210, 68, 30, 24, 24,248,164, 15,129, 37,137, 55, 68, 69, 69, 33, 61, 61, 29,199,143, 31, 71,165,
- 74,149, 96,179,217,176,121,243,102,228,228,228, 64, 38,147, 65, 46,151,195,106, 45,121, 72, 66,124,124,252, 19, 75,150, 44,105,
-178,120,241,226, 44,169,  5,247,195, 15, 63,128, 82,138,240,240,112, 24, 12,  6,164,164,164,224,143, 63,254,128,221,110,135, 78,
-167, 67, 92, 92,156,162, 71,143, 30,173, 39, 76,152, 32,  3, 48,190, 24,234,102, 79, 63,253,180, 94,175,215,227,127,255,251, 31,
-181, 90,173,159, 18, 66,154,247,238,221,123,204,176, 97,195, 66,174, 92,185, 98, 25, 56,112,224, 33,171,213, 58,195, 25, 31, 50,
- 74,169,205, 71, 66, 44,214,114,101,179,217,164, 48,189,156,159,159,143,176,176,176, 74, 62,198,104,  1,128,124,207,158, 61, 45,
-  1,240, 31,125,244,145, 10, 64,138,187,184,178, 88, 44,200,207,207, 71, 65, 65,129, 45, 39, 39, 39,117,228,200,145,246,101,203,
-150,241,206,119, 78,121, 19, 88,192,227,150,218,181,181, 10, 74,249,247, 23, 44, 88,160,235,210,165, 11,167,211,233,144,151,151,
-167,255,117,211, 38, 93,135,246,173,227,166, 76,251,120,139, 62,166, 94,202,158,163,151,112, 35, 57,  7, 22,155, 13,113,229,  3,
- 11,237, 95, 12,119, 29,206,  9, 42, 46, 11,150,187,152,216,185,115, 39, 30,127,252,113, 87, 94,151,203,229, 69, 44, 93,190, 56,
-  5, 65,192,227,143, 63,126,139, 69,103,251,246,237, 94,173, 77,190,224, 46,134, 60, 69,145, 55,225,197,113, 28,124,245, 50, 75,
-214, 59,111, 34,203,221,138,239, 33,218,124, 85, 18, 16,  4,  1,195,134, 13,131, 76, 38,195,168, 81,163, 32,  8,  2, 26, 54,108,
-  8, 65, 16,208,162, 69, 11,200,100, 50, 60,246,216, 99,165,246,251,254,253,251,209,168, 81, 35,151,155, 26, 54,108,136,166, 77,
-155, 66, 16,  4,180,105,211,  6, 50,153, 12,157, 59,119,246,135,115, 76, 94, 94, 94,125,157, 78,135,179,103,207,130,231,121, 16,
- 66,206, 83, 74,235,  3,192, 27,111,188,113,193, 96, 48, 84, 49,153, 76,120,227,141, 55,136,197, 98,169, 55,106,212,168,247,  1,
- 48,129,197,112, 55,203,163, 34, 90,196, 13,198,132,132,132, 49,132,144,141,146, 69,202,211,210,228,237,220, 11,191, 36,130,164,
-238,193,166, 30,226, 77,234, 58,124,170,132,119, 45, 30,130,202,179,139,240, 79,159, 22, 44,169,208,245, 87, 96,249,130,201,100,
-106, 16, 17, 17, 81,172,184,114,255,181, 88, 44,136,141,141,133,201,100,106, 80,218,202,162,124,249,242,176, 90,173,248,230,155,
-111, 32,151,203, 33,151,255,163, 43, 44,150,146,141, 67, 39, 79,158,188,188,127,255,254, 70,141, 27, 55, 14, 94,187,118,109,218,
-163,143, 62, 26,222,165, 75, 23,168,213,106, 24,141, 70,216,108, 54, 52,111,222, 28,241,241,241, 72, 76, 76,196,175,191,254,154,
- 94,189,122,245,176,  3,  7, 14,136,201,201,201, 87, 75,160,238,208,161, 67,  7, 16, 66,240,235,175,191,102, 80, 74, 15,171,213,
-234,181, 83,166, 76,  9,178, 88, 44,226, 75, 47,189,116, 61, 51, 51,115, 36,  0,155, 82,169,252,180, 75,151, 46,205,120,158, 95,
-225,112, 56,230,148, 54,129,122,134,109, 65, 65,  1, 84, 42,149, 63, 75, 66,200, 50, 51, 51,235,  2,128, 86,171, 13,  1,112,193,
-149,178,141,198, 34, 34,216, 98,177,152, 66, 66, 66,180,  0,224,124, 71, 86, 76,124,132,107, 52,154,213, 87,175, 94, 10,112, 31,
- 31, 23, 20, 20,132,126,125,251,114,173, 90,182, 84,212,111,208,160,243,216,207, 22,175,136, 10,213, 91,226,162, 66, 97,115,216,
-176,109,203,102,145,138,182, 45,172,184,185, 55,  2, 75, 18, 25,158, 22, 44,153, 76,134, 29, 59,118,220,114, 77, 46,151,227,171,
-175,190,242, 75, 16, 72, 98,170,184, 46, 50,143, 46, 45,226, 75,184,200,100, 50,240, 60,143,175,191,254, 26,162, 40,226,237,183,
-223, 46,210,109,232,206,239,103,139,217,245, 78,252,135, 34,  0, 11, 18, 63, 87,186,222,247,116,175, 84, 94,250, 99, 21,251,226,
-139, 47,252,178, 96, 61,245,212, 83, 62,  5,171,123,143,130,187,187,254,250,235, 47,175,188, 11, 22, 44,240, 25,158, 14,135,  3,
- 63,255,252,179, 75,156, 74,248,224,131, 15,222,136,137,137,137,220,181,107, 23,146,147,147, 81, 80, 80,128,252,252,124, 52,111,
-222, 60,174, 99,199,142, 71,147,147,147,175,156, 60,121,178, 23,203, 61, 12,247,208,130,101,158, 58,117,234,137,169, 83,167,122,
-181, 80,121, 90,146, 74,178, 52,185,  9,171, 63,225,236, 26, 76, 72, 72, 24,131,194,225, 51,127,250,241,174,194,179,139,208,171,
-225,199, 67, 53, 78,240, 86,232,250,211, 77,232,167,217, 92, 32,132,192,100, 50,121, 21, 86,238,162,192,106,181, 34, 51, 51, 19,
- 14,135, 67,184,131,136,186,229,154, 47,129,117,252,248,241,254,  3,  6, 12, 72, 10, 12, 12,172,159,150,150,150, 42,138,226, 99,
-251,246,237, 11, 23,  4,  1,122,189, 30,122,189, 30,191,252,242, 11, 52, 26, 13,134, 13, 27,150,234,112, 56,118,  6,  4,  4,132,
- 26,141,198,191,147,147,147,199, 22,171, 92,100,178, 14,109,219,182,197,225,195,135,145,157,157,253, 59, 33,164,254,107,175,189,
-214,169, 66,133, 10,100,242,228,201,166, 11, 23, 46,124,  9, 32, 77,171,213,126,179,100,201,146, 71, 27, 55,110,172,123,241,197,
- 23, 65,  8,249,150, 82,106,242,215,207,  5,  5,  5, 69,132, 85,110,110, 46,242,242,242,160,213,106,237,126,134,153, 12,133, 99,
-169,164,241, 84,174,184,113, 90,175,164,248,161,130, 32,208,194, 71,168,172, 56, 62,173, 86,251,209,226,197,139,213,158,147, 15,
- 28, 14,  7, 82, 82, 82,160,215,235,241,193,216,177,242,137, 35, 94,107,196,235, 34,247,113, 28,129,197, 74,179,169,104,217, 92,
-144,242,220, 46, 86,220,220, 27, 72,130,160,123,247,238,183,116, 11,202,229,114,108,221,186, 21, 61,123,246,116, 53, 88, 26, 55,
-110,236,179, 81, 37,  9,130,110,221,186,185, 44, 65,155, 55,111,246,218,189, 39, 89,160,252, 17,130,210,179,195,135, 15,135, 32,
-  8,152, 51,103, 14,222,121,231, 29,112, 28,135,207, 63,255, 28, 28,199, 97,220,184,113,126,139, 75,119,225,114,229,227,194,223,
-152,119,114,145, 49, 47, 18,  0, 16,160,215, 75, 30, 42, 85,217, 35,  8,130,203,114,213,160, 65,  3,200,100, 50,180,104,209,  2,
-130, 32,184, 44, 87, 79, 62,249,164,123, 56, 82,127, 56,  5, 65,192,185,115,231, 92,110,110,209,162, 69, 17,203,149, 32,  8,120,
-234,169,167,252,113,230,148,160,160,160,  9,241,241,241,181,102,204,152, 33,227,121, 30, 29, 58,116,168, 49,112,224,192,171,161,
-161,161,161, 31,125,244,145,198,203, 59,106,  0,245,107,213,170,165,101,185,134,225, 46, 90,176, 38,120,185, 21,236, 62,166,170,
- 20,124, 27,221,159,151, 56, 60, 69,145,211, 34,182,211, 23,151,183,119,139,131, 80, 82,107,172, 52,  2,203,105, 94, 46,241, 99,
- 26,141,230, 88,106,106,106, 11,181, 90, 93, 68, 92,121, 19, 90, 60,207, 35, 57, 57, 25, 26,141,230, 88, 89, 70,158,175, 46, 66,
-167,152, 25,225, 22,160, 29,159,124,242,201,133, 91,183,110, 45,191,109,219, 54, 28, 56,112,  0,225,225,225,248,226,139, 47,110,
-166,164,164,244,167,148,110,245,231,187, 85,170, 84,169,173,213,106,177,119,239, 94,  0,216,  5,224,149, 55,223,124,147,216,237,
-118,204,157, 59,215,  0, 96,107, 96, 96,224,143,107,214,172,105, 80,175, 94, 61,197,182,109,219,242, 14, 28, 56,176,221, 79,113,
-229, 16, 69,241, 22, 97,229, 30,166,  1,  1,  1,254, 88,176,108,129,129,129,199,115,115,115,159, 49, 26,141,185, 74,165, 50, 32,
- 55, 55,215,236, 46,172, 36,126, 65, 16,100,231,206,157, 75,  2, 16, 23, 24, 24,120, 28,110, 93,137, 69, 18,152, 32,116,232,208,
-161,131,224, 25,  7, 41, 41, 41, 72, 78, 78,134,213,106, 69,227,198,141,  9, 79,108,124,230,181,191,223, 96,197,203,253, 41,208,
-164,188, 46,205,250,243, 54,115,112,243,230,205,174,115,142,227,224,156,182,239, 83, 12,109,221,186,181,196,129,232, 30, 93,132,
- 62, 77,225,210,243,115,231,206, 45,220,142,194,105,185,226, 56, 14,  9,  9,  9, 80, 42,149,152, 60,121, 50, 18, 18, 18, 32,  8,
-130,207, 46, 66,119,225, 82,121,148,193,189, 81, 84,152, 41,156,227,157,  8, 33,238, 34,139,248, 43,218, 74,178,222,249, 99,249,
-119,231,148,222, 83,169, 84,197, 14,112,247,224, 36, 37,248,251, 39, 66,200,165,242,229,203,239,105,209,162, 69,224,161, 67,135,
-240,249,231,159,203,205,102,115,197,109,219,182,185,190,235, 45,188, 10, 10, 10,212, 44,231, 48,220, 13,235, 85,  9,183,211, 60,
-198, 79, 17,247,238,186, 18,126, 61,159,135,219, 53,119,222, 52,143,122,204,253,186,167,168,242,252,134,251, 51,105,183, 88,176,
-124, 21, 18,190,132,150, 63, 22, 44,131,193,240,219,166, 77,155,154,246,237,219, 87, 40,169,123,176,160,160,  0,145,145,145, 56,
-113,226,132,221, 96, 48,252,230,135,101,172,204,  4,150,151,  8,223, 86,174, 92, 57,222,102,179,161, 90,181,106,136,142,142,134,
-201,100, 66,118,118, 54,239,175,184, 34,132,200,155, 52,105,194,  3, 64, 86, 86, 22, 80, 56,157,180,122,245,234,213,113,248,240,
- 97,100,101,101,173,  7,208,113,226,196,137, 13,155, 53,107, 38, 95,177, 98,133, 97,240,224,193,235,109, 54,219,100, 63,173, 15,
- 22,187,221, 30,203,113,156, 53, 59, 59,251,134,123,120, 70, 70, 70,134,104,181, 90,146,146,146, 98,243, 71, 96,213,175, 95,255,
-224,181,107,215,240,209, 71, 31,165, 77,153, 50,165,122, 94, 94, 94, 86, 78, 78,142,221, 93,100,153, 76, 38, 46, 44, 44, 76, 57,
-111,222, 60, 53,  0,212,175, 95,255, 96,113,  2,171,160,160,160,130, 70,243, 79, 67,216,108, 54, 35, 57, 57, 25,201,201,201, 72,
- 73, 73, 65, 94, 94, 30,226,226,226, 96, 48, 24, 42,177,226,229,190,  9,172, 34,221,100,238,249,219,189,  2, 47, 77, 94,119, 23,
- 46,221,187,119,119,141,221,146, 44, 98,210,177,122,245,106,207,129,227,126,  9,172,185,115,231, 98,248,240,225, 80,169, 84,152,
- 49, 99, 70,145, 46, 66, 79, 81, 32,138, 34,241,199,239,177,239, 25,145, 60, 59,  4, 50,153, 12,161,131, 83,138,116,197,121, 17,
- 26,126,185,115,202,148, 41,101,210, 69,232,206, 89,169, 82, 97, 86,249,250,235,175,241,204, 51,207, 96,215,174, 93,183,221, 69,
- 88,167, 78,157, 31, 54,110,220, 24,120,242,228, 73,228,230,230, 34, 45, 45, 13,102,179, 25,137,137,137,197,246,  2, 56,203,114,
- 21,203, 57, 12,247, 24,127,222, 99,222, 59,254,158,224,163,226,246, 91, 96,249, 99,193, 50,155,205, 51,254,247,191,255,189,217,
-177, 99,199,144,128,128,  0, 36, 37, 37,221, 34,174,242,243,243,161,211,233, 96, 52, 26,177, 97,195,134, 92,179,217, 60,195,151,
- 40,176,217,108,136,136,136, 64,122,122, 58,196, 98,198, 69,115, 28,  7,181, 90,141,252,252,124, 20, 39,  6, 74,170, 40,172, 86,
- 43,108, 54, 27,108, 54, 27,172, 86, 43, 74,185, 60,147, 90, 90,176,181,160,160,  0,  0, 10,162,162,162,170,168, 84, 42, 92,190,
-124, 25,  0,206,  1,104,223,165, 75, 23, 89, 70, 70,  6, 29, 56,112,224, 62, 74,233, 48, 31,171,217, 91,118,238,220, 25, 11,  0,
-106,181,250, 44,  0, 36, 38, 38,218,178,179,179,139, 88,  6, 53, 26, 13,237,217,179,103,121, 74, 41,118,238,220, 25, 43,151,203,
- 41,138, 89,179, 10,128,105,253,250,245, 39,  3,  3,  3,151, 77,155, 54,173,111,215,174, 93, 79,212,173, 91, 55,182,160,160, 32,
-213,104, 52, 26, 77, 38, 19,229,121, 94, 30, 28, 28,172,218,178,101,203,133,125,251,246,117,212,235,245,203,214,175, 95,127, 18,
-128, 87, 75,155, 86,171, 77, 52, 24, 12,149,165, 56,117, 23, 87,201,201,201,160,148,226,210,165, 75,208,104, 52,215, 88,249,113,
- 95, 91,142,183,  8, 43,111, 98,203, 95,113,229, 46,  8,182,108,217, 82,226, 26, 88,254,114,186,139,161,119,222,121,  7,179,103,
-207,190,197,130, 53,121,114, 97,155,100,236,216,177,126,143,193,146,172, 85,201,179, 67, 80,110,120,102, 17,183,  3,  0,145,220,
- 87,202, 37,217,  4, 65,192, 71, 31,125,116,203,224,115,247, 46, 60, 63,187,242,138,184, 51, 53, 53, 21,130, 32, 32, 36, 36,  4,
-253,250,245, 67,231,206,157, 93, 93,141,165,229, 61,125,250,244,158,247,222,123,175, 94,157, 58,117, 48,105,210,164,204,160,160,
-160,128,215, 95,127, 93,200,206,206, 38, 37, 89,176,152,192, 98, 96,184,  3,129, 37,101, 44,127,103, 17,122, 43, 36,  9, 33, 29,
-221,215,202,160,148,230, 16, 66,250,117,234,212,105,237,202,149, 43,213, 85,170, 84,193,233,211,167,145,153,153,  9,139,197,  2,
-185, 92,142,242,229,203, 35, 59, 59, 27,223,127,255,189,209, 96, 48,244,163,148,230,148,196,  9,224,253, 38, 77,154,204,255,244,
-211, 79, 85, 13, 27, 54, 68,102,102, 38,242,243,243,139,172, 58,173,215,235,161, 86,171,113,240,224, 65,108,222,188,217,  8,224,
-125, 31,156,222, 84, 28,172, 86,171, 75,104,249, 18, 88, 30,156, 90,201,138, 99, 48, 24,  0,192, 94,177, 98,197, 72,  0,184,116,
-233, 18,  0, 92,141,139,139, 27, 91,181,106, 85,178,100,201, 18, 74, 41,221,230, 77, 92,121,112,102,182,105,211, 38, 11, 64, 57,
-139,197, 34,  7,128,156,156, 28,107, 88, 88, 88,132, 82,169, 20,213,106,181,168, 82,169,196,164,164, 36,187,221,110,151,  3, 64,
-155, 54,109, 44,  0,146,225, 54,214,195,131, 83,  4,144,187, 96,193,130,  9, 47,190,248, 98,139,150, 45, 91,214, 25, 50,100,200,
-241,129,  3,  7,114,209,209,209,193,121,121,121,166,243,231,207,103,125,246,217,103,121,251,247,239,239, 40,147,201,174, 46, 88,
-176, 96,  2,128, 92,231,187,183,112,218,237,246,223,182,109,219,214,191,107,215,174,194,141, 27, 55,144,146,146,226, 18, 87, 41,
- 41, 41,136,143,143,199,190,125,251, 28, 86,171,117, 91, 41,194,179,172, 44, 55,140,179,176,241, 65,165,188, 94,156,176,146, 26,
- 81,254,114,186,139,161,103,158,121,166,136,213, 74, 46,151, 99,205,154, 53, 94,203, 13, 47, 43,146,119,244, 92, 15, 74,114,211,
-123,239,189, 87, 68,172,125,240,193,  7,197, 58,205, 87,120, 74, 60, 57, 95, 71, 23,157, 69, 88, 76, 62, 47,201,157, 82,217, 41,
-147,201,240,193,  7, 31,248,109,193,130,199, 24, 44,111,156,146,223, 31,125,244, 81, 24, 12,  6,151,128, 45,206,130,229, 43, 60,
- 29, 14,199,240,217,179,103, 83,189, 94,223, 44, 55, 55,247,133,107,215,174, 45, 50, 24, 12,143,228,228,228,148,104,193, 50,155,
-205, 74,150,143, 24,231,221, 88, 11,235, 63, 33,176,156,149, 35, 42, 84,168, 80,100,111, 43,142,227,138, 28,165, 25, 71,224,204,
-176, 91,  8, 33,189, 91,181,106,181,116,248,240,225,  1, 13, 27, 54,148, 85,174, 92, 25,  5,  5,  5,184,124,249, 50, 78,156, 56,
- 97, 95,191,126,125,174,193, 96,120,129, 82,186,197, 15,190,197,132,144,205, 93,186,116, 25,215,188,121,243, 65, 31,126,248, 33,
- 95,163, 70, 13,228,228,228, 32, 56, 56, 24, 17, 17, 17, 56,115,230, 12, 54,108,216,224, 72, 79, 79,159, 15, 96, 34,165, 52,173,
-180, 13,124,171,213,138,231,159,127, 30,162, 40, 98,230,204,153,238, 11,162,249,  3,171,213,106,165,  0, 72,122,122, 58,  0, 24,
- 36,193,117,254,252,121,  0,184, 86,185,114,101, 29,  0,108,219,182,141,  0,216,235,175,187,220, 45, 89,241,241,241,151, 61, 11,
- 69,201,114, 37, 89,189,224,123,131,102,211,179,207, 62,155,106, 48, 24,186,188,243,206, 59,227,230,206,157,219,119,238,220,185,
-183, 60,164,215,235,151,125,254,249,231, 19,159,125,246,217,212,226,172, 87, 78,139,221,216,151, 95,126,249,217, 99,199,142,  5,
-168, 84, 42, 20, 20, 20, 32, 35, 35,  3, 86,171, 21,113,113,113, 72, 77, 77,197,226,197,139,243,140, 70,227,120,150, 29,239, 15,
-220,  5, 65,113, 86, 44, 95,226,170, 36, 43,206, 79, 63,253,228,117,141,169,210,114,122,138, 12,127,215,166, 42,169, 49, 36, 45,
- 47,227,109,233,135,210,148,107,222,120,  5, 65,192, 39,159,124,226, 90,108,213,155,229,170, 52, 22, 44,137, 51, 36, 36,  4,  0,
- 32,109,109,244,212, 83, 79,221, 54,175,115,219,176, 97,110,223,152, 50,114,228,200,  9,241,241,241, 53,  0, 40,221,195,128,109,
-170,192,192, 80, 70,  2,203,225,112, 36,214,172, 89,179, 72,193,230,107,147, 81,155,205,150,232,103,166,222, 76,  8,137,251,252,
-243,207,255,167,213,106, 59, 26, 12,134,122,206,  2,227, 88, 65, 65,193, 54,179,217, 60,171, 52,155, 51, 59,  5,211, 80, 66,200,
-204, 46, 93,186, 76,126,236,177,199,250,140, 24, 49,130, 80, 74, 49,111,222, 60,122,241,226,197,213,  0,222,167,148, 94,188,157,
- 64, 10,  9,  9, 57,249,253,247,223, 71,174, 93,187, 22, 54,155, 13,179,102,205, 66, 64, 64,192,201,210,184, 79, 16,132,165, 45,
- 91,182,236,187,111,223,190,101,148,210,227, 74,165,242,135, 54,109,218,244,219,187,119,239, 74, 74,233, 41, 65, 16,126,104,209,
-162, 69,191,131,  7, 15,254, 72, 41,253,187, 20,206,115, 89,178,236,118,239, 61,138,222, 44, 87, 62,144, 59, 96,192,  0,235,128,
-  1,  3, 70, 60,251,236,179,223,252,249,231,159,143,100,103,103,215,  3,128,160,160,160, 99, 77,155, 54, 61,184,114,229,202, 51,
- 78,203,149,201,151,223,  9, 33, 61,235,213,171,247,227,164, 73,147,180,117,234,212, 17,170, 85,171,134, 43, 87,174,224,248,241,
-227,246,239,190,251, 46,223,104, 52,118,167,148,102,177,236,120,255,  4, 22,165, 20, 65, 65, 65, 69, 26, 79,210,212,253,210,118,
- 11,186, 87,200,210,150, 58,158,188,197,113,250, 24,228, 10,  0,208,233,116,174, 69, 73,253, 25,154, 32,138, 37,175,167, 70, 41,
-117,113, 74,135, 31,226,202,231,140, 63,231, 86, 53,126,115,250,179, 76,131, 86,171,133,205,102,115,241,250, 49,147,147,148, 50,
-206,126,  2,240, 83,181,106,213,206,  3,168,202, 68, 21,  3,195, 93, 16, 88,153,153,153, 77,238,230,135,157,  2,106,162,243, 40,
- 43,206,139,  0,158, 37,132,124,250,251,239,191, 75,253,  5, 31,249,218,207,208, 23, 78,159, 62,221, 85, 38,147,125,181,108,217,
-178,230,148, 82,  4,  6,  6,238,191,114,229,202,235,165,225,176,219,237,131,  8, 33,111, 75,179,  2,205,102,243, 32, 66,200,187,
-148,210,  2,183,251,174,243,210,122, 29,128,153, 82, 26, 85,204,125,115, 41,196,149,203,146,  5,192,178,114,229,202,124,  0, 71,
-241,207, 58, 87, 54,231, 97,130, 91,183,160,143,120,249,131, 16, 82,237,131, 15, 62,152,194,243,124,135,130,130,130,104,173, 86,
-123,221,110,183,255,102, 48, 24,222,167,148,102,176,172,120,255, 96,177, 88,110,212,172, 89, 83,240,214,112, 42,169,  2, 47,169,
- 65,229,112, 56, 18,171, 87,175,238,179, 81,230,133,243, 70,  9,233,232,106, 92, 92, 28,231, 47,151,  4,171,213,154, 90,146, 59,
-227,226,226, 80, 90, 78, 95,126,143,141,141,245,234,119, 31, 66,240, 70,  9,229,199,109,113,150, 20,158, 37,193,104, 52,102,133,
-135,135,231,155, 76, 38,153,217,108,150,217,237,246, 34,230, 70,181, 90,157,198,114, 14,  3,195,109, 10,172,127, 51,156,130,170,
- 91, 25,242,153,  1,188, 84,  6, 60, 38,143,243,130,146,206, 75,137,187, 97,  1, 18,  1, 24,202, 40, 12,211,  1, 12,100, 89,238,
-193, 67,122,122,122,179,178,230,204,200,200, 40,243,  6, 90, 90, 90, 90,139,187,224,247, 38,255, 85,206,146,112,227,198,141,102,
- 44,103, 48, 48,220, 25, 56, 22,  4, 12, 12, 12, 12, 12, 12, 12, 12,101, 11,  2,160,163,183, 27,165,153, 29, 64,  8,233, 88,218,
- 15,251,226,103,156,140,147,113, 50, 78,198,201, 56, 25,231,195,199,233,139,251,161,153,157, 72, 41,189,107,  7,128,142,140,147,
-113, 50, 78,198,201, 56, 25, 39,227,100,156,255,181,131,117, 17, 50, 48, 48, 48, 48, 48, 48, 48,148, 49,152,192, 98, 96, 96, 96,
- 96, 96, 96, 96, 96,  2,139,129,129,129,129,129,129,129,129,  9, 44,  6,  6,  6,  6,  6,  6,134,255, 24,  8, 33,117,  9, 33,245,
-254,171,254, 23, 88, 18, 96, 96, 96, 96, 96, 96, 96, 40, 35, 81,165,  4,240, 12, 33,228,205,186,117,235, 54,117,110,200,190,159,
- 82, 58, 19,192, 90,111,251,236, 62,180, 97,225,182, 41,242, 14,  0,160,148, 62,202,146,  8,  3,  3,  3,  3,  3,  3, 67, 41,132,
- 85,101,  0,131,116, 58,221,107,237,218,181, 11,238,222,189, 59, 66, 67, 67, 97,183,219,113,253,250,117,108,220,184, 17,123,247,
-238, 77,178, 88, 44,179,  1,124, 77, 41,205, 46,134,231,161,209, 34,132, 82, 42,109, 92,220,206,233,169, 29, 44,169, 48, 48, 48,
- 48, 48, 48, 48,248, 41,174, 18,122,247,238, 61, 57, 50, 50,146,171, 91,183, 46,202,151, 47, 15,179,217, 12,163,209,  8, 74, 41,
-  4, 65,  0,165, 20, 57, 57, 57,216,185,115, 39,254,248,227, 15,115, 86, 86,214,247,  0,102, 81, 74,207,185,241, 60, 84, 90,196,
- 37,176, 74,187, 41, 40,  3,  3,  3,  3,  3,  3,  3,  3, 33,228,236,233,211,167,171, 59, 28, 14,164,167,167,195,108, 54,195, 96,
- 48,184,  4, 22,207,243,160,148,194,110, 47,236, 29, 20, 69, 17,135, 15, 31,198,182,109,219,232,165, 75,151, 62,164,148,126, 36,
-  9,172,135, 73,139,176, 65,238, 12, 12, 12, 12, 12, 12, 12,119,  4,139,197,130, 37, 75,150, 32, 61, 61, 29, 21, 42, 84, 64,116,
-116, 52,130,130,130,160, 86,171,  1,192, 37,174,  0,128,227, 56, 52,109,218, 20, 67,135, 14, 37,  0,250, 61,172, 97, 34, 13,114,
-159,192,198, 96, 49, 48, 48, 48, 48, 48, 48,220,  6,108, 22,139,  5, 77,154, 52,193,229,203,151,113,248,240, 97, 52,106,212,  8,
-181,106,213, 66,122,122, 58,146,146,146,138, 60,124,240,224, 65, 28, 57,114,  4,109,219,182,245,228,153,240,208,141,193,  2,  0,
- 66,200,163, 78, 79,237, 96,105,133,129,129,129,129,129,129,193, 47, 33, 65, 72,207,168,168,168,239,222,124,243,205,192,230,205,
-155, 35, 49, 49, 17, 55,110,220, 64, 86, 86, 22, 26, 54,108,136, 58,117,234,224,226,197,139,216,188,121, 51,142, 28, 57,  2,165,
- 82,137,152,152, 24,232,150, 45,199, 87,  4, 39, 41,165,117,220,184, 30, 26, 45,226, 18, 88, 12, 12, 12, 12, 12, 12, 12, 12,183,
- 41,178,  2,  0,140,140,139,139,123,119,240,224,193,202,218,181,107, 35, 49, 49, 17,105,105,105,200,202,202,194,254,253,251,  1,
-  0,209,209,209,136,142,142,198,153, 51,103,176,103,207,158,220,252,252,252,  1,148,210,181, 15,101,152, 48,129,197,192,192,192,
-192,192,192, 80, 70, 66, 43,  2,192,216,218,181,107, 15,122,237,181,215,132, 74,149, 42,225,198,141, 27,248,253,247,223, 81,181,
-106, 85, 92,191,126, 29,127,252,241,135, 37, 45, 45,109, 38,128,105,148,210,156,135, 53, 44,184,187, 28,208, 29, 25, 39,227,100,
-156,140,147,113, 50, 78,198,249,223,224,164,148,166, 82, 74,135,157, 60,121,178,218, 91,111,189,181,116,210,164, 73,162, 40,138,
-136,136,136,192,170, 85,171,196, 21, 43, 86,124,151,150,150, 86,133, 82,154,240, 48,139, 43,128,173,228,206,192,192,192,192,192,
-192, 80,198,160,148, 94,  1,240, 34, 33,228,227,195,135, 15,191, 15,128,  2,152, 68, 41, 61,245, 95,  9,  3, 38,176, 24, 24, 24,
- 24, 24, 24, 24,238,150,208, 58,  1,224,185,255,162,223,217, 58, 88, 12, 12, 12, 12, 12, 12, 12, 12, 76, 96, 49, 48, 48, 48, 48,
- 48, 48, 48, 48,129,197,192,192,192,192,192,192,192,240,159,  2,  1, 80,220, 76,128,109,126,147,220,198, 12,  5, 95,252,140,147,
-113, 50, 78,198,201, 56, 25, 39,227,124,248, 56,125,113,151, 70,127, 60,208,160,148,250, 60,224, 92, 47,171,180,  7,128,142,183,
-243, 30,227,100,156,140,147,113, 50,206,127, 47,167,179,241, 78, 80,216, 75,194, 73,231, 15,178,223,111,167,158,187, 87,126,255,
-175,112, 62,108,135,224, 67, 93,186,  2,137, 16, 34,  2, 16,105, 25,172, 76, 74,  8,145, 34,160, 76,248, 24,238,130,105,179, 48,
-142,200, 63, 58,156,197, 19,  3,  3, 67,169,202, 14,222,173,146,117,  0,112, 16, 66,240,160,149, 37,101, 89,207,221, 13,191,255,
-151, 57,255,237, 16, 74, 10, 40,158,231,183,132,133,133,181, 79, 79, 79, 23,157,215,161, 80, 40,192,113, 28,100, 50,153, 49, 47,
- 47, 79,127, 27,145,240,109,100,100,228, 43, 25, 25, 25, 34,199,113, 80,169, 84, 32,132,184, 56,179,179,179,245,247, 59, 80, 42,
- 87,174,156,101, 52, 26,117,158,215, 85, 42,149,233,234,213,171,  1,255,133,  2, 82, 46,151,247, 14,  9,  9,  9, 74, 75, 75,163,
- 28,199, 65, 46,151,131,231,121, 56,255,219,179,179,179, 23,250,203, 23, 18, 18,114, 48, 36, 36, 36, 72,122,159, 16,130,140,140,
-140,236,148,148,148, 71,  0, 64,173, 86,239,209,106,181,161,130, 32,128,231,121,240, 60, 15,131,193,144,145,158,158,222,138, 85,
- 87,255, 78,172, 94,189,154,239, 18,253,106, 85,129, 26,235,115, 28, 13, 20, 69,146, 99, 39,234,191, 55,223,248,246,130, 63,239,
-247,233,211,199,113,159,243, 64, 69,  0,118, 74,105, 82, 25,241, 61,  1,224,121,231,169,  9, 64, 58,128,243,  0, 86, 83, 74,141,
-247, 59,190,148, 74,229,204,200,200,200,215,242,243,243, 13,132, 16, 74,  8, 65, 97, 53,128, 91,126, 29, 14, 71, 98,122,122,122,
- 19, 31,149,172, 76,161, 80,124, 30, 25, 25,249,114, 65, 65,129,193,201, 71,  9, 33,136,140,140,188,133,211,110,183, 39,166,165,
-165, 53,241,199,173, 17, 17, 17, 11, 52, 26,205, 11,  6,131,161,192, 41,136, 92,189, 49, 40, 92,107, 73,194,197,212,212,212, 54,
-190,  4,129, 66,161,152, 21, 25, 25,217,223,233,119, 16, 66,104,120,120,248, 93,241,123, 68, 68,132, 87,206,226,252,238,141,211,
-221,157,132, 16,132,135,135,223,177, 59, 31, 68,206,135, 86, 96,  1,224,  8, 33,235, 91,181,106,213,110,199,142, 29,220,233,211,
-167,185,248,248,120, 56, 28, 14,136, 98, 97,122,142,137,137,209,220, 70, 33,179,168, 77,155, 54,207,239,220,185,147, 91,191,126,
- 61,215,180,105, 83, 16, 66,224,112, 56,224,112, 56, 80,183,110, 93,245, 29, 22, 98, 58, 65, 16,222, 86, 40, 20,143,218,237,246,
- 90,  0, 32,147,201, 78,153,205,230, 29,118,187,125,  6,165, 52,223, 31, 30,171,213,170, 73, 77, 77,189, 37,108,226,226,226, 20,
-183,235, 54,189, 94,191,151,227,184, 56, 87,  0, 59,133,134,183, 76, 44,253, 82, 74, 47,165,165,165,181, 44,142, 51, 56, 56,216,
-197, 89, 28,135,231, 53, 81, 20, 47,165,166,166,182,244, 33,174,158,110,211,166, 77,224,182,109,219,200,245,235,215,137, 90,173,
-134, 40,138,112, 56, 28,176,217,108,168, 93,187,118,169,214, 79, 11, 10, 10,210, 39, 36, 36, 84,125,226,137, 39,176,102,205, 26,
-188,244,210, 75,104,221,186,245, 57,233,190, 86,171, 13, 61,121,242,100,245,144,144, 16, 24, 12,  6,228,228,228,160, 83,167, 78,
-255,250,204,213,188, 81,133, 73,132, 35, 33,174, 10,192,238,200,220,127,244,198,216, 59,229, 13, 10, 10, 58,162, 80, 40, 34,165,
-120,229, 56,206,107, 92,187, 95, 51,153, 76, 41,233,233,233,141,124,228,159,202,  0,186,241, 60, 95, 77, 16,132,154,  0, 42,219,
-237,246, 72,  0,144,203,229, 41, 60,207, 95,177,217,108,103, 44, 22,203,121,  0, 63, 57, 23, 18,244,138, 46,209,175, 86, 37,118,
- 67,159, 60,179,248,164,166,202,180, 26,134,139,  9,103, 53, 74,195, 47, 93,162, 95, 93,237,175,200,186,143,226, 42, 54, 42, 42,
-234, 19,231,255,145,148,210,203,101, 64,251, 60,165, 52, 16,  0,114,114,114,  2,175, 95,191, 94,238,167,159,126,170, 59,101,202,
-148,199,  8, 33,211,125, 45,190,216,162, 73,197, 67, 28,199,197, 72,242, 65,164,142,196,125,135,174,151, 73,197,196,243,252,172,
- 94,189,122,245, 95,189,122,181,230,240,225,195,154, 90,181,106,185,202, 39, 81, 20,225,105,120,136,141,141, 45, 49,248,  0,  8,
- 28,199,205,236,213,171, 87,223,101,203,150,105,206,156, 57,163,137,141,141, 45, 82,230, 73,233, 82,186, 22, 21, 21,229,151, 91,
-195,195,195,191,125,252,241,199, 95, 92,180,104,145,108,243,230,205,234,136,136,  8,132,132,132, 64,161,184,181,104,110,220,184,
-177,232,131,142,227, 56,110, 86,143, 30, 61, 94, 92,177, 98,133,230,192,129,  3,154,186,117,235,130,231,249, 59,246,123,207,158,
- 61,251, 46, 95,190, 92,115,236,216, 49, 77,181,106,213,192,113, 28, 56,142,187,133,143,227, 56, 84,168, 80,193, 47,206,238,221,
-187,247, 93,185,114,165,230,200,145, 35,154,154, 53,107,186,194,206,173,123,174,212,238,124,192, 57, 31, 62,129,229, 52,151, 46,
-105,213,170, 85,151, 29, 59,118,240,  0,112,228,200, 17,100,102,102, 34, 58, 58, 26, 58,157, 14, 74,165, 18, 38,147,137,150,178,
-208,250,214, 41,174,100,  0,240,227, 11, 61,113, 73,  6, 12, 75,181, 64, 46,151,227,226,197,139,224,121,158,222, 65,161,216, 86,
-175,215, 47, 94,187,118,109,112,163, 70,141,184,244,244,116,196,198,198, 34, 51, 51,243,145,157, 59,119, 54,126,245,213, 87, 95,
- 37,132,188, 68, 41,221,233, 47,231, 47,191,252,  2,173, 86, 11,141, 70,  3,173, 86, 11,139,197, 66,110, 59,160,  5, 33,230,202,
-149, 43, 17, 58,157, 14,162, 40,186, 14,143,254,107, 23, 68, 81, 68,245,234,213,173, 62, 10,198,152,171, 87,175, 70,168,213,106,
- 80, 74,139,240, 57, 28, 14, 40,149, 74,247,150,  2, 28, 14,  7,226,226,226,172,190, 44, 87,146,184,  2,128,101,203,150,161, 92,
-185,114,136,136,136,128, 86,171,133, 90,173, 46, 82,161,251, 89,128,163, 75,151, 46, 24, 63,126, 60,166, 77,155,134,145, 35, 71,
- 22, 41,104,101, 50, 25, 66, 66, 66,176,105,211, 38,232,245,122, 84,170, 84,  9, 50,153,236,223,111,  9,228, 72,200,190, 67,215,
- 92, 22,217,199, 31,139, 23,154, 55,174, 52,215, 25,195,224, 56, 64, 20, 11,171, 76, 66, 64,237, 54, 49,235,207,191,111,140,243,
- 35, 60,163,174, 94,189, 26,161, 84, 42,253,114,135,195,225, 64,116,116, 52,239, 35,255, 60, 89,167, 78,157, 31,135, 12, 25, 34,
-175, 86,173, 26,145,203,229, 16,  4,  1,130, 32, 72,233,177, 18,165,180,146, 40,138,237, 82, 82, 82,232, 23, 95,124,241, 49, 33,
-164, 23,165,244, 23,175,233,157, 26,235,231,153,197, 39,119,253,133, 71,250,116,124, 15,155, 86, 37, 60,210,166,161,136,  0,141,
-241,  2,128,  7, 86, 96, 17, 66,244,106,181,250,131, 85,171, 86,201,  1,160, 99,199,142, 31, 16, 66,222,162,148,230,150,213, 55,
-  2,  3,  3, 17, 24, 24,136,186,117,235,162,119,239,222, 65, 13, 27, 54, 28, 73,  8,121,157, 82,106, 45, 94,  9,240, 49,123, 14,
- 94,142,144,206,187,119,169, 39,111,217,180, 82, 74, 97, 67,204,243,105, 10,209, 33, 38, 30,248, 43,177,137, 31,254,253,184,119,
-239,222,253, 86,175, 94,173,  3,128,121,243,230,161,119,239,222,  8,  9,  9,129, 70,163,129, 92, 46,135, 76, 38, 43,242,235,195,
- 34,196,  3,248,248,233,167,159,238,179,108,217,178,  0,  0, 88,180,104, 17,186,118,237,138,208,208, 80,232,245,122, 40,149, 74,
- 40, 20, 10,200,229,242, 34,229,128, 63,226,170,101,147, 38,  3, 22, 45, 90,  4,  0, 24, 61,108, 24, 58, 54,110, 12,157, 70, 13,
-141, 90,  1, 41, 44, 20,188, 12,189,223, 75,240,229,111, 14,192,167,189,123,247,126,118,197,138, 21,  1,  0,112,248,240, 97,164,
-166,166, 34, 50, 50, 18,106,181, 26, 10,133,194,229,103, 66,  8,212,106,181, 95,126,239,221,187,119,159,229,203,151,187,252,222,
-165, 75, 23,132,134,134, 34, 32, 32,  0, 74,165, 18,114,185,188,200, 81, 92, 24,184,115,246,234,213,171,207,202,149, 43,  3,  0,
- 96,225,194,133,232,216,177, 35,130,131,131, 17, 16, 16,224, 10,203,210,198,209,131,204,249, 80, 10, 44,105,108, 84,100,100,228,
-179,187,118,237,226,220,196,  1,148, 74,165, 43, 99, 72,221,132,165, 40,180, 72,100,100,228, 43, 59,119,238,116,189,100,161,183,
-152,168, 75, 93,113,187,241,119,108,223,190,253,242,141, 27, 55,170,228,114, 57,140, 70, 35, 78,156, 56,129,192,192, 64, 40, 20,
- 10,244,232,209,131,111,213,170, 85,104,187,118,237,214, 16, 66,250,250, 51, 67,129, 82, 10,157, 78, 87, 68, 96,221,105, 23,178,
- 90,173,198,134, 13, 27,192,243,188,215,130,203,253,127, 68, 68,132, 63,254,134, 82,169,196,222,189,123,193,243, 60,100, 50, 25,
-  4, 65,128, 76, 38,195,207, 63,255,140, 17, 35, 70, 32, 61, 61, 29,132, 16,200,100, 50,  4,  4,248,236,221, 36, 33, 33, 33, 65,
-146,184,146,196,143, 90,173,134, 76, 38, 35,130, 32, 16,169, 11,143, 16, 66,252,237, 83,231, 56, 14, 75,151, 46,197,244,233,211,
- 49,106,212, 40, 44, 88,176,  0,245,235,215,119, 23,159,200,205,205, 69,112,112, 48,130,131,131,161, 82,169,110, 59, 45, 60, 72,
-240, 12,157,207,103,204,214, 64,164, 40, 28,228, 33,  2, 34, 64, 65, 33, 82, 17, 41, 55, 46,224,195,241,159,240,165,232,210,193,
-158, 61,123, 92, 34, 72, 16,  4, 16, 66,224, 46,140,164,163, 92,185,114, 62,249,228,114,249,132,117,235,214, 41,150, 46, 93,138,
- 21, 43, 86,184,210,150, 86,171, 69, 80, 80, 16, 66, 67, 67, 93, 71, 76, 76, 12,249,238,187,239,228,245,235,215,159,  0,224, 23,
-239,113, 78,  3, 53, 85,166,213,232,211,241, 61,  0, 64,159,247, 40,178,206, 77,110,192,101,143, 11,124,128,197,149,  0, 96,244,
-156, 57,115, 66, 27, 55,110, 12,  0,152, 51,103, 78,232,128,  1,  3, 70, 19, 66,198, 82, 74,237,119, 64,191,156, 16,242,188,179,
- 28, 80,117,234,212, 73,241,229,151, 95,162,102,205,154, 24, 62,124,120,200,199, 31,127,220, 29,192,234,146,202, 35,119,124, 49,
-103,110, 16,165,133,233,135,138,180,200,111,102,234, 21,188,245,206,135,126, 57,170, 66,133, 10,131,214,172, 89,227, 26, 14, 17,
- 21, 21, 85,164,242,119, 47,163,164,163,  4, 81, 68,  0,112, 21, 43, 86, 28,176,114,229, 74, 23,103, 88, 88, 24,228,114,121,145,
- 10,246,196,209,195,248,230,179,  9,208,135,149,195,251, 83,103,249,116,103, 68, 68,196,130, 39,159,124,242,133,239,191,255,222,
-117,237,145,154, 53,241, 84,171,102,136,  8,211, 35, 44,184,176,108,163, 34,193,223,103, 46,251,172,143,  0,112, 21, 42, 84,120,
-117,213,170, 85, 58,247,134,160,228, 87,  0, 48, 24, 12, 46,171,189,197, 98, 65,147, 38, 77,252,242,187, 59,103,104,104,168,203,
-239, 82,248,185,135,173,212,128, 41,137,179, 66,133, 10,  3, 36,  1, 12,  0, 33, 33, 33, 69, 56,100, 50, 25, 86,109, 90,124, 75,
-221,112,167,156,165,141,119, 79,206, 43, 87,174, 96,202,148, 41,174, 50, 73,178,226, 17, 66, 16, 29, 29,141,217,179,103,151, 74,
- 96,  3,104, 10, 32,220,237,220,  2, 64,225,246,155,  6,224, 79, 47,207, 73,215,101,  0, 26, 56,239, 57,  0,228,  1,  8,242,194,
- 87, 28, 79, 58, 10,187,160,195, 61,158,247,252, 78, 81,129, 69,  8,145,114,111,123,  0,123,210,211,211,197,211,167, 79,115,135,
- 15, 31,134, 76, 38, 67, 68, 68,  4,154, 54,109, 42,117,159, 65, 38,147, 65,171,213,146,160,160,160, 20,169,194,149,  2,207,102,
-179,185,250,147,221,132, 12,151,153,153, 41,110,221,186,149, 91,210,171, 51, 44, 20,104,248,193, 84,116,233,218, 21,155,163, 21,
-224,  1, 60,114, 58, 29, 26,141, 70,144,201,100, 54, 41, 18, 36, 78,247,177, 89,158,226,136, 16, 18,160,213,106,191,251,233,167,
-159, 84, 28,199, 33, 47, 47, 15,162, 40,162, 85,171, 86,224, 56, 14,199,143, 31,199,251,239,191,143, 31,127,252, 17,235,214,173,
- 83, 55,106,212,232, 59, 66, 72, 45, 74,105,158, 91,225,181,205, 91,226, 12,  8,  8,128, 70,163,113,  9, 44,201,207,146,251,220,
-187, 99, 40,165, 55,210,211,211, 27,151,196,233,112, 56,208,179,103, 79, 16, 66,192,243,188, 75, 12,121,254,202,229,114, 28, 63,
-126,252,150,196,231, 77, 24,138,162,136,214,173, 91,  3,  0, 52, 26, 13,116, 58, 29,182,111,223,238,186,223,176, 97, 67, 88, 44,
- 22,132,133,133,225,212,169, 83,222, 10,238, 34,156,105,105,105, 52, 41, 41,137, 44, 89,178,  4, 50,153, 12,161,161,161,208,104,
- 52,100,241,226,197,163,229,114,121,140,201,100, 18, 45, 22, 11, 20, 10,197,108,201,154, 37,  8, 66, 65, 78, 78, 78,104,113,156,
- 60,207, 99,200,144, 33,120,247,221,119,177, 96,193,  2,188,241,198, 27,183, 88,184, 76, 38, 19,194,194,194, 92, 34,203, 31,191,
-223,185,  0,186,203,156, 34,197,137, 35,155,113,242,216, 54,136, 14, 17, 14,145,130, 82,  7, 68, 59,112,120,235,254,234, 55, 47,
- 37, 69, 83, 80,192,217,145,161,204,201,183,183, 11, 83,214,  4,176,126,123,186,121,166,175,244, 41,  8,  2,108, 54, 27,126,250,
-233, 39, 92,184,112,  1, 91,182,108,129,209,104,116,133, 99,139, 22, 45, 48, 96,192,  0,175,  2,203,147,147, 82,186,232,250,245,
-235, 13, 91,183,110, 77,178,179,179,145,157,157, 13,163,209,  8,135,195,  1,187,221, 14, 65, 16,160, 82,169,160, 86,171, 17, 25,
- 25,  9,147,201, 68,205,102,243,162,226, 56, 69,145,228, 24, 46, 38,156,221,180, 42,225,145, 62,239, 81,172,158, 78, 80,181,162,
-210,240,219,161,128,  1,235,119,143,236,  4,128,138,206, 82,135,  3,168,205, 33,166,191, 59,250,179,161,247, 60,142,138, 98,208,
-219,111,191, 93,171, 95,191,126,174, 11,253,250,245,195,137, 19, 39,106,205,152, 49, 99, 16,128, 57,165,229, 36,132, 68, 59,239,
-255, 10,224, 87,169,130, 95,191,126,125, 47,  0,175,172, 91,183, 14,125,251,246,197,199, 31,127, 92,215, 83, 96,185,115, 82, 74,
-113,229,220, 46, 92, 57,191, 27,162, 72,221,172,224,222,255, 83, 63,221, 89, 80, 80, 96,250,235,175,191,116,223,124,243, 13, 34,
- 34, 34, 16, 27, 27, 11,141, 70,  3,149, 74, 85,164,114,117,175,112,125,229,205,130,130,  2,211,233,211,167,117,203,151, 47, 71,
- 72, 72,  8, 42, 85,170,  4,141, 70,227,178,222, 40, 20, 10,108,252,113, 37, 62,121,171, 55,110, 92, 56,142,161,253,186,250,116,
-167, 70,163,121,225,251,239,191, 47, 98,242,136, 14, 15,131, 32,227,192,203,  8,130, 59,244,  2,  0,100,253,190,182,216,213, 29,
- 61, 56, 73, 94, 94,158,233,192,129,  3,186, 67,135, 14, 65, 20, 69, 84,174, 92, 25,  6,131,  1,122,189,222,229,255,173, 91,183,
-162, 71,143, 30, 88,186,116, 41, 90,180,104,225,211,239,249,249,249,166, 99,199,142,233,126,248,225,  7,132,132,132,160, 66,133,
- 10,208,104, 52, 46,195,132, 36,180,120,158, 71, 92, 92, 28,114,114,114,160,211,233,124,134,231,225,195,135,117, 63,252,240,  3,
-130,131,131, 17, 19, 19,227,178,176, 73,162,104,250,220,241, 69, 56, 84,164,252, 29,115,222, 78,188,187,115,246,236,217, 19, 85,
-171, 86,133, 94,175,135, 86,171,117,113,151,196,233,166, 69,218, 81, 74,119,120, 26, 49,  9, 33, 27,221,190,223,149, 16,178,209,
-253,183,184,231,156,127,219,142, 30, 61,186,201,180,105,211,166,180,104,209, 98,249,222,189,123,151, 21,199, 87, 28,207,232,209,
-163,235, 76,155, 54,109,138,251,243, 94,190,115,171,  5,139, 82, 74,156,158, 19,  0, 32, 62, 62, 30,153,153,153, 80, 42,149,104,
-218,180, 41,210,211,211,161,211,233, 32,151,203, 65, 41,197,208,161, 67,249,145, 35, 71, 70,112, 28,  7,187,221,238, 42,240,139,
-233, 75, 23, 57,142, 67,203,150, 45,113,194,217,243,211,165,107, 87,196,196,196, 64, 26,196,161, 82,169, 48,116,232, 80, 50, 98,
-196,  8, 65,178, 94, 80, 74, 97, 52, 26, 81,190,124,121,117,  9, 93,111,111,173, 89,179, 38, 80,161, 80, 32, 47, 47,207,213, 69,
-198,243, 60, 78,159, 62,141, 79, 63,253, 20, 47,191,252, 50,174, 93,187,134,168,168, 40,188,251,238,187,186,105,211,166,189,  5,
- 96,162,175,130, 88,167,211,185,196,149, 70,163,193, 91,111,189, 37,180,106,213, 42, 66,167,211, 33, 32, 32,  0, 82,119,159,195,
-225, 64,149, 42, 85,124, 74,113, 81, 20,177,121,243,102,  8,130,224,211,130,229, 76,120,126,113, 30, 56,112,192, 37,206,220, 91,
- 69,132, 16,156, 56,113,194, 37,230,252,224,164, 28,199, 65,171,213,162, 92,185,114, 80,171,213,208,104, 52,100,249,242,229, 99,
- 99, 99, 99,203,143, 24, 49,130,203,205,205,229, 90,182,108,137,222,189,123, 11,162, 40,194,106,181,162, 78,157, 58, 62, 45,109,
- 59,118,236,192,252,249,243,241,198, 27,111,120,181, 96, 73,131, 32,245,250,251, 62,199,161,204, 32,  2,176,218,109, 48,228, 27,
- 93, 93,184, 14,135,  3,199,182, 31,173,126,233,232,185, 58, 27,151, 47,149,  1,128,105,251, 90,247,215,202,247,158,187,178, 70,
-187, 16,249,129,237,153,214,  3,190, 44,131,195,135, 15,199,184,113,227,240,220,115,207, 97,235,214,173,120,255,253,247,241,234,
-171,175, 22,177, 96,249,  3,155,205,246,213, 75, 47,189,244,198,234,213,171,107,190,247,222,123,156,100,193,210,104, 52,210, 24,
- 46,152,205,102, 24,141, 70,156, 57,115, 70, 28, 56,112,224, 89,139,197,242, 85,113,124,118,162,254, 91,163, 52,252, 82, 37,134,
-171, 90,112,249,147,128,214,205, 42, 27,137,186,113, 78,175, 26, 29,233,147,175, 84, 14,  6,165,160, 34, 32, 82,192,108, 46,192,
-208,161,255,227,239,103, 92, 17, 66,158,236,212,169, 83,231,201,147, 39,223,114,111,242,228,201, 56,117,234, 84,103, 66,200,149,
-226,186, 68,139,225,140, 41, 87,174,220, 76,231,255,183, 40,165,137, 82,111, 49,128, 30, 91,183,110,  5,  0, 84,172, 88, 17,  0,
-234, 16, 66,150,  0, 88,238, 20, 99,183,152, 67,109, 54, 59,140, 70,115,137,194, 74, 58,167, 84,244,215,141,180,102,205,154,232,
-214,173, 27,100, 50,153,171,145,230,222, 61,230, 41,180, 74, 42, 63,  0,136,132, 16,196,197,197,161,115,231,206,144,203,229,208,
-106,181, 46,209,162, 80, 40,192,243, 60, 30,237,208, 25,147,103, 77,192,132,151, 91, 97,124,143,202,216,126,236,106,137,238, 52,
- 26,141,249,251,247,239, 87,143, 24, 56, 16,205,227,227, 17, 30, 20,132,184,168,242, 80, 43, 21,144,187,187,137,248, 54,170,211,
-194,202, 78,228,121, 30,117,235,214, 69, 74, 74, 10, 46, 95,190,140,203,151, 47,131,227, 56,180,110,221,218,101,117, 57,127,254,
- 60, 38, 78,156,  8,179,217,236,183,223,171, 85,171,134,199, 30,123, 12, 10,133,  2, 26,141,166, 72,215,160, 20,166,121,121,121,
-168, 90,181, 42,214,175, 95,143, 26, 53,106,248,228,140,143,143,199,163,143, 62, 10,185, 92,238,138, 35,181, 90,237,170, 55,  0,
-224,250,129,124,215, 55,162,163,163, 75,197,185,229,224, 53,124,179,245, 15,152, 45, 34,114, 13,182, 34, 47,148, 15,211, 99,247,
- 15,239,249,229,119,137,243,235,175,191, 70,118,118,182,171, 12,146,140, 37,146,113,162, 66,133, 10,152, 55,111, 94,113,241, 35,
-105, 17, 82,204,253,174,126, 54,164,164,231, 82, 36,195,255,180,105,211,166,120,190,239,139,207,253,190,199,251, 22, 15, 81,150,
- 82, 98, 23,161, 84, 47, 72,170, 50, 58, 58, 26,210, 56, 15, 41,211,185, 10, 80,187, 29, 63,254,248, 35, 34, 34, 34, 92, 71, 96,
- 96, 96,177,  9, 90, 26, 39, 52, 60,173,112,152,193,166, 40, 57,174,  0,120, 42,173, 48, 67, 72, 99,132,214,172, 89,  3,119,  1,
- 19, 16, 16, 80, 98,119,145, 66,161,104,215,180,105, 83,206,108, 54,223, 34,174,166, 77,155,134,190,125,251,162, 70,141, 26, 16,
- 69, 17,249,249,249,104,223,190,189,108,246,236,217,237, 74, 35,176, 52,154,194,241,252, 22,139,  5,219,183,111, 71,112,112, 48,
- 66, 67, 67, 17, 18, 18,130,128,128,  0,105, 38, 36,245, 37, 50, 40,165,232,217,179,167, 43,209,185, 91,173, 60,197,214,222,189,
-123,253,234,122,163,148,162, 89,179,102,208,106,181,208,233,116,208,233,116,216,188,121,243, 63,102,244, 71, 30,129, 40,138,136,
-136,136,192,190,125,251, 74,236,230,164,148, 82,185, 92,238,122, 94, 38,147,145,197,139, 23,143,142,139,139, 43,255,206, 59,239,
-112, 60,207,227,200,145, 35, 56,121,242, 36, 42, 87,174,236,247,152,172,236,236,236,155,163, 71,143,118,140, 30, 61, 26,  0, 80,
-167, 78, 29,100,103,103,167, 74,247,115,115,115, 51, 58,119,238, 12,158,255,167,142, 77, 79, 79,207,248,215, 11, 44, 81,132,221,
-106,135,193,100, 66,126,158,193,101, 13, 74, 77, 74,  9,122,111,196,219,178, 79,135,246,  7,  0,140,152, 57,  7,121, 11,254, 41,
-192,214,142,120, 62,162,215,103, 43, 18,  0,244, 40,137,223, 96, 48,192,108, 54,163, 82,165, 74, 56,120,240, 32,242,242,242,208,
-177, 99,199, 34, 22, 82, 41, 76,125,153,226, 41,165, 22, 66, 72,171,174, 93,187,254, 57, 99,198,140, 42,181,106,213, 34,  5,  5,
-  5, 48, 24, 12,112,255, 61,118,236, 24, 93,182,108,217, 37,131,193,208,146, 82,106, 41,142,111,243,141,111, 47,116,137,126,117,
-245,111, 71,248,174, 17, 85,207,234,111,100, 85,177,103,220, 80, 22,228, 26,207,152, 28,244, 36,168,  3,112, 64,  4,181,139,112,
- 56,187,183,238,163,184,138,169, 94,189,250,235, 75,151, 46, 45,146,  6,221, 45,172, 75,151, 46, 69,235,214,173, 95, 39,132,156,
- 46,105,112,191, 27,167, 66, 38,147, 37,172, 92,185, 82, 14,  0,143, 61,246, 88,  2, 33,228, 29, 74,169,165, 94,189,122,125,246,
-238,221, 27, 40,149, 43,129,129,129,160,148,242,  6,131, 33,176,101,203,150,125, 36, 75, 87,145,248, 17,  1,155,205,  6,163,209,
-140,156,156, 60, 88,172, 54,103,153, 41,194,225,176, 59,127, 69,216,157,229,168, 66, 46,  4, 52,174, 87, 62,159, 82, 10,142,144,
-236, 67,199,110, 86, 40,174, 92, 42,174, 43,203, 31,235,149, 23, 56,164,178, 48, 52, 52, 20, 10,133,  2, 91, 55,174,197,229,191,
-182, 67,198,  3,162,221,  6,135,221, 10,135,205,  2,129,231,113,224,228, 53,180,136,211,248, 19, 71, 52, 52, 52, 20, 29, 26, 53,
- 66,215, 22, 45, 10,167,171,  9,  2,116, 74, 37, 52,114, 85,161,229, 10,  0,117,112,128,127,&