 		dispatchBubblingEventOnMouseDownedDisplayObject(scrollEndEvent);
     }
     
-    
 }
+    
+import spark.effects.easing.EaseInOutBase;
+    
+/**
+ *  @private
+ *  A custom ease-out-only easer class which animates along a specified 
+ *  portion of an exponential curve.  
+ */
+class PartialExponentialCurve extends EaseInOutBase
+{
+    public function PartialExponentialCurve(exponent:Number,xscale:Number)
+    {
+        super(0);
+        _exponent = exponent;
+        _xscale = xscale;
+        _ymult = 1 / (1 - Math.pow(1 - _xscale,_exponent));
+    }
+    
+    override protected function easeOut(fraction:Number):Number
+    {
+        return _ymult * (1 - Math.pow(1 - fraction*_xscale, _exponent)); 
+    }
+    private var _xscale:Number;
+    private var _ymult:Number;
+    private var _exponent:Number;
+}
+

        var newHSP:Number = hspBeforeTouchScroll - xMove;
        var newVSP:Number = vspBeforeTouchScroll - yMove;
        
        // use min and max to clamp hsp/vsp values for now.  At some point we may allow them to 
        // "pull" it in to the negatives, but now not
        var hsp:Number = viewport.horizontalScrollPosition;
        var viewportWidth:Number = isNaN(viewport.width) ? 0 : viewport.width;
        var cWidth:Number = viewport.contentWidth;
        var maxWidth:Number = Math.max(0, (cWidth == 0) ? viewport.horizontalScrollPosition : cWidth - viewportWidth);
        
        var vsp:Number = viewport.verticalScrollPosition;
        var viewportHeight:Number = isNaN(viewport.height) ? 0 : viewport.height;
        var cHeight:Number = viewport.contentHeight;
        var maxHeight:Number = Math.max(0, (cHeight == 0) ? viewport.verticalScrollPosition : cHeight - viewportHeight);
        
        // clamp the values here
        newHSP = Math.min(Math.max(newHSP,0), maxWidth);
        newVSP = Math.min(Math.max(newVSP,0), maxHeight);
            
        viewport.horizontalScrollPosition = newHSP;
        viewport.verticalScrollPosition = newVSP;

    
    /**
     *  @private
     *  Stop the effect if it's currently playing and prepare for a possible scroll
     */
    private function stopThrowEffectOnMouseDown():void
    {
        if (throwEffect && throwEffect.isPlaying)
        {
            // stop the effect.  we don't want to move it to its final value...we want to stop it in place
            stoppedPreemptively = true;
            throwEffect.stop();
                    
            // Snap the scroll position to the content in case the empty space beyond the edge was visible
            // due to bounce/pull.
            var maxHsp:Number = viewport.contentWidth > viewport.width ? viewport.contentWidth-viewport.width : 0; 
            viewport.horizontalScrollPosition = Math.min(Math.max(0,viewport.horizontalScrollPosition),maxHsp);
            var maxVsp:Number = viewport.contentHeight > viewport.height ? viewport.contentHeight-viewport.height : 0; 
            viewport.verticalScrollPosition = Math.min(Math.max(0,viewport.verticalScrollPosition),maxVsp);
            
            // get new values in case we start scrolling again
            hspBeforeTouchScroll = viewport.horizontalScrollPosition;
            vspBeforeTouchScroll = viewport.verticalScrollPosition;
        }
    }
    
    /**
     *  @private
     *  Event listeners added while a scroll/throw animation is in effect
     */
    private function touchScrolling_captureMouseHandler(event:MouseEvent):void
