                 // 次のタイミングで.Completedに遷移するため、ここには来ないはず
                 _readers.removeAtIndex(0)
             default:
-                assert(false, "Invalid state \(Int(target.status.rawValue)). Something is wrong.")
+                NSLog("Invalid state[\(Int(target.status.rawValue))]. Something is wrong.")
                 _readers.removeAtIndex(0)
             }
         }

            // アセットの総時間が最大時間よりも少ないため、先頭が起点になる
            (indexAtZero, timeAtZero) = (0, kCMTimeZero)
        } else {
            if let current = _current {
                let targets = reverse(_assets[0...current.index])
                // 現在の再生場所を起点にrate=0.0地点を探索するが、
                // ループの中で先頭だけを特別視するのを避けるため(すべてdurationで計算したい)、
                // ここでゲタを履かせておく
                let initialOffsetTime = current.asset.duration - _currentPresentationTimestamp
                var offset = maxDuration * _currentPosition + initialOffsetTime

                if let resultAtZero = _positionAt(targets, offset: offset, reverseOrder: true) {
                    (indexAtZero, timeAtZero) = resultAtZero
                    expectedOffset += timeAtZero
                } else {
                    return nil
                }
            } else {
                return nil
            }

    {

        var offset = offset
        for (i, asset) in enumerate(targets) {

            if offset <= asset.duration {
                let time = reverseOrder ? asset.duration - offset : offset
                return (i, time)
            }
            offset -= asset.duration
        }
        return nil
    }
