import sys

input = sys.stdin.readline



from bisect import bisect_left, bisect_right



INF = 10**18 + 100

N,A,B = list(map(int,input().split()))

S = [-INF] + [int(x) for x in sys.stdin.read().split()]



MOD = 10**9 + 7



dpX = [0] * (N+1) # 最後にYを選んだとして、直前に選んだXがどこにあるか

dpY = [0] * (N+1) # 最後にXを選んだとして、直前に選んだYがどこにあるか

dpX[0] = 1

dpY[0] = 1

dpX_cum = [1] * (N+1) + [0] # -1

dpY_cum = [1] * (N+1) + [0] # -1

dpX_left = 0

dpY_left = 0

for n,x in enumerate(S[2:],2):

    iA = bisect_right(S,x-A)

    iB = bisect_right(S,x-B)

    # ....XY

    xy = dpY_cum[iB-1] - dpY_cum[dpY_left-1] if iB >= dpY_left else 0

    # ....YX

    yx = dpX_cum[iA-1] - dpX_cum[dpX_left-1] if iA >= dpX_left else 0

    # ....XX が不可能なら捨てる。明示的に捨てるのではなく、生きている番号だけ持つ

    if iA != n:

        dpY_left = n-1

    if iB != n:

        dpX_left = n-1

    dpX[n-1] = xy

    dpX_cum[n-1] = (dpX_cum[n-2] + xy) % MOD

    dpX_cum[n] = dpX_cum[n-1]

    dpY[n-1] = yx

    dpY_cum[n-1] = (dpY_cum[n-2] + yx) % MOD

    dpY_cum[n] = dpY_cum[n-1]



answer = dpX_cum[N-1] - dpX_cum[dpX_left-1]

answer += dpY_cum[N-1] - dpY_cum[dpY_left-1]

answer %= MOD

print(answer)
import sys

import numpy as np



read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



MOD = 10**9 + 7



def main(N, A, B, S):

    if N == 1:

        return 2

    INF = 1 << 62

    S = np.append(S, INF)

    if A > B:

        A, B = B, A

    if np.min(S[2:] - S[:-2]) < A:

        return 0

    # A 未満でたどって、Xがどこまで置けるか

    X = np.zeros_like(S)

    for i in range(1, N + 1):

        if S[i] - S[i - 1] >= A:

            X[i] = X[i - 1]

        else:

            X[i] = i

    # 直前の Y としてありうる最も右

    Y = np.searchsorted(S, S - B, side='right') - 1

    dp = np.zeros_like(S)

    dp_cum = np.zeros_like(S)



    dp[0] = 1

    dp_cum[0] = 1

    for n in range(1, N + 1):

        if X[n - 1] == 0:

            # 初出の Y

            dp[n] = 1

        # 直前の Y の範囲

        l, r = max(0, X[n - 1] - 1), min(n - 1, Y[n])

        if l <= r:

            dp[n] += dp_cum[r] - dp_cum[l] + dp[l]

        dp[n] %= MOD

        dp_cum[n] = (dp_cum[n - 1] + dp[n]) % MOD

    return dp[-1]



signature = '(i8,i8,i8,i8[:],)'

if sys.argv[-1] == 'ONLINE_JUDGE':

    from numba.pycc import CC

    cc = CC('my_module')

    cc.export('main', signature)(main)

    cc.compile()



from my_module import main



N, A, B = list(map(int, readline().split()))

S = np.array(read().split(), np.int64)



print((main(N, A, B, S)))
import sys

input = sys.stdin.readline
from bisect import bisect_left, bisect_right

INF = 10**18 + 100
N, A, B = list(map(int, input().split()))
S = [-INF] + [int(x) for x in sys.stdin.read().split()]
MOD = 10**9 + 7
dpX = [0] * (N + 1)  # 最後にYを選んだとして、直前に選んだXがどこにあるか
dpY = [0] * (N + 1)  # 最後にXを選んだとして、直前に選んだYがどこにあるか
dpX[0] = 1
dpY[0] = 1
dpX_cum = [1] * (N + 1) + [0]  # -1
dpY_cum = [1] * (N + 1) + [0]  # -1
dpX_left = 0
dpY_left = 0
for n, x in enumerate(S[2:], 2):
    iA = bisect_right(S, x - A)
    iB = bisect_right(S, x - B)
    # ....XY
    xy = dpY_cum[iB - 1] - dpY_cum[dpY_left - 1] if iB >= dpY_left else 0
    # ....YX
    yx = dpX_cum[iA - 1] - dpX_cum[dpX_left - 1] if iA >= dpX_left else 0
    # ....XX が不可能なら捨てる。明示的に捨てるのではなく、生きている番号だけ持つ
    if iA != n:
        dpY_left = n - 1
    if iB != n:
        dpX_left = n - 1
    dpX[n - 1] = xy
    dpX_cum[n - 1] = (dpX_cum[n - 2] + xy) % MOD
    dpX_cum[n] = dpX_cum[n - 1]
    dpY[n - 1] = yx
    dpY_cum[n - 1] = (dpY_cum[n - 2] + yx) % MOD
    dpY_cum[n] = dpY_cum[n - 1]
answer = dpX_cum[N - 1] - dpX_cum[dpX_left - 1]
answer += dpY_cum[N - 1] - dpY_cum[dpY_left - 1]
answer %= MOD
print(answer)

import sys
import numpy as np

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
MOD = 10**9 + 7


def main(N, A, B, S):
    if N == 1:
        return 2
    INF = 1 << 62
    S = np.append(S, INF)
    if A > B:
        A, B = B, A
    if np.min(S[2:] - S[:-2]) < A:
        return 0
    # A 未満でたどって、Xがどこまで置けるか
    X = np.zeros_like(S)
    for i in range(1, N + 1):
        if S[i] - S[i - 1] >= A:
            X[i] = X[i - 1]
        else:
            X[i] = i
    # 直前の Y としてありうる最も右
    Y = np.searchsorted(S, S - B, side="right") - 1
    dp = np.zeros_like(S)
    dp_cum = np.zeros_like(S)
    dp[0] = 1
    dp_cum[0] = 1
    for n in range(1, N + 1):
        if X[n - 1] == 0:
            # 初出の Y
            dp[n] = 1
        # 直前の Y の範囲
        l, r = max(0, X[n - 1] - 1), min(n - 1, Y[n])
        if l <= r:
            dp[n] += dp_cum[r] - dp_cum[l] + dp[l]
        dp[n] %= MOD
        dp_cum[n] = (dp_cum[n - 1] + dp[n]) % MOD
    return dp[-1]


signature = "(i8,i8,i8,i8[:],)"
if sys.argv[-1] == "ONLINE_JUDGE":
    from numba.pycc import CC

    cc = CC("my_module")
    cc.export("main", signature)(main)
    cc.compile()
from my_module import main

N, A, B = list(map(int, readline().split()))
S = np.array(read().split(), np.int64)
print((main(N, A, B, S)))

+import numpy as np -input = sys.stdin.readline -from bisect import bisect_left, bisect_right +read = sys.stdin.buffer.read +readline = sys.stdin.buffer.readline +readlines = sys.stdin.buffer.readlines +MOD = 10**9 + 7 -INF = 10**18 + 100 -N, A, B = list(map(int, input().split())) -S = [-INF] + [int(x) for x in sys.stdin.read().split()] -MOD = 10**9 + 7 -dpX = [0] * (N + 1)  # 最後にYを選んだとして、直前に選んだXがどこにあるか -dpY = [0] * (N + 1)  # 最後にXを選んだとして、直前に選んだYがどこにあるか -dpX[0] = 1 -dpY[0] = 1 -dpX_cum = [1] * (N + 1) + [0]  # -1 -dpY_cum = [1] * (N + 1) + [0]  # -1 -dpX_left = 0 -dpY_left = 0 -for n, x in enumerate(S[2:], 2): -    iA = bisect_right(S, x - A) -    iB = bisect_right(S, x - B) -    # ....XY -    xy = dpY_cum[iB - 1] - dpY_cum[dpY_left - 1] if iB >= dpY_left else 0 -    # ....YX -    yx = dpX_cum[iA - 1] - dpX_cum[dpX_left - 1] if iA >= dpX_left else 0 -    # ....XX が不可能なら捨てる。明示的に捨てるのではなく、生きている番号だけ持つ -    if iA != n: -        dpY_left = n - 1 -    if iB != n: -        dpX_left = n - 1 -    dpX[n - 1] = xy -    dpX_cum[n - 1] = (dpX_cum[n - 2] + xy) % MOD -    dpX_cum[n] = dpX_cum[n - 1] -    dpY[n - 1] = yx -    dpY_cum[n - 1] = (dpY_cum[n - 2] + yx) % MOD -    dpY_cum[n] = dpY_cum[n - 1] -answer = dpX_cum[N - 1] - dpX_cum[dpX_left - 1] -answer += dpY_cum[N - 1] - dpY_cum[dpY_left - 1] -answer %= MOD -print(answer) + +def main(N, A, B, S): +    if N == 1: +        return 2 +    INF = 1 << 62 +    S = np.append(S, INF) +    if A > B: +        A, B = B, A +    if np.min(S[2:] - S[:-2]) < A: +        return 0 +    # A 未満でたどって、Xがどこまで置けるか +    X = np.zeros_like(S) +    for i in range(1, N + 1): +        if S[i] - S[i - 1] >= A: +            X[i] = X[i - 1] +        else: +            X[i] = i +    # 直前の Y としてありうる最も右 +    Y = np.searchsorted(S, S - B, side="right") - 1 +    dp = np.zeros_like(S) +    dp_cum = np.zeros_like(S) +    dp[0] = 1 +    dp_cum[0] = 1 +    for n in range(1, N + 1): +        if X[n - 1] == 0: +            # 初出の Y +            dp[n] = 1 +        # 直前の Y の範囲 +        l, r = max(0, X[n - 1] - 1), min(n - 1, Y[n]) +        if l <= r: +            dp[n] += dp_cum[r] - dp_cum[l] + dp[l] +        dp[n] %= MOD +        dp_cum[n] = (dp_cum[n - 1] + dp[n]) % MOD +    return dp[-1] + + +signature = "(i8,i8,i8,i8[:],)" +if sys.argv[-1] == "ONLINE_JUDGE": +    from numba.pycc import CC + +    cc = CC("my_module") +    cc.export("main", signature)(main) +    cc.compile() +from my_module import main + +N, A, B = list(map(int, readline().split())) +S = np.array(read().split(), np.int64) +print((main(N, A, B, S)))