#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200100;
const int md=1e9+7;
struct node{
	int x,v;
}a[maxn];
bool cmp(const node &A,const node &B){
	if(A.x==B.x) return A.v>B.v;
	return A.x<B.x;
}
struct Line{
	int l,r;
}b[maxn];
int c[maxn],tr[maxn];
int num;
void updata(int x,int v){
	while(x<=num){
		tr[x]=(tr[x]+v)%md;
		x+=x&(-x);
	}
}
int qury(int x){
	if(x<0) return 0;
	int res=1;
	while(x){
		res=(res+tr[x])%md;
		x-=x&(-x);
	}
	return res;
}
int main(){
//	freopen("E.in","r",stdin);
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&a[i].x,&a[i].v);

	for(int i=1;i<=n;i++)
		c[i]=a[i].v;
	sort(c+1,c+n+1);
	num=unique(c+1,c+n+1)-(c+1);
	for(int i=1;i<=n;i++)
		a[i].v=lower_bound(c+1,c+num+1,a[i].v)-c;

	sort(a+1,a+n+1,cmp);

	int mx=a[1].v,mn=a[n].v;
	for(int i=1;i<=n;i++)
	{
		if(a[i].v>mx) mx=a[i].v;
		b[i].r=mx;
	}
	for(int i=n;i>=1;i--)
	{
		if(a[i].v<mn) mn=a[i].v;
		b[i].l=mn;
	}

	int ans=0,res=0;
	for(int i=1;i<=n;i++){
		res=(qury(b[i].r)-qury(b[i].l-2)+md)%md;
		if(b[i].r==num) ans=(ans+res)%md;
		updata(b[i].r,res);
	}
	printf("%d\n",ans);
	return 0;
}
