                 let entryPoint = AnimationDirection.entryPoint(range.location, middle: middle) * self.charAnimationOffset * Double(self.numberOfAttributionStages)
                 
                 var idx = Int(offset - entryPoint)
-                idx = min(self.numberOfAttributionStages, max(0, idx))
+                idx = min(self.numberOfAttributionStages - 1, max(0, idx))
                 
                 var attributionStage: NSMutableDictionary = self.attributionStages[idx]
                 let kerning = attributionStage[kernPercentageAttributeName] as CGFloat

            dispatch_async(dispatch_get_main_queue(), {
                let stage = self.currentAttributionStage
                
                if (self.currentAttributionStage++ > self.numberOfAttributionStages) {
                    self.endAnimation()
                } else {
                    self.applyAttributedStringForStage(stage, string: self.attributedText.string)

    @lazy var attributionStages: NSMutableDictionary[] = self.attributionStagesForNumberOfStages(self.numberOfAttributionStages)
    
    convenience init(frame: CGRect) {
        self.init(frame: frame, animationDuration: 0.21, charAnimationOffset: 0.25, fps: 60)
    }
    
    init(frame: CGRect, animationDuration: Double, charAnimationOffset: Double, fps: Int) {
