bool barrier(int i, int j, int**Arr, int n){// Функция проверяет преграда ячейка или нет
for(int k =0; k < n; k++){
if(i == Arr[k][0]-1&& j == Arr[k][1]-1){
returntrue;
}
}
returnfalse;
}
int main(){
int n,m,k;
int row =0;
int col =0;
cin>> n >> m;// Размер клеточной доски
unsignedlong**possible =newunsignedlong*[n];
for(int i =0; i < n; i++)
possible[i]=newunsignedlong[m];
cin>> k;// Количество преград
int**Arr =newint*[2];
for(int i =0; i < k; i++)
Arr[i]=newint[2];
if(k >0){
for(int i =0; i < k; i++){// Заносим координаты преград
for(int j =0; j <2; j++){
cin>> Arr[i][j];
}
}
}
possible[row][col]=1;
bool start =false;
for(int i =0; i < n; i++){// Считаем для каждой ячейки - сколькими способами можно до нее добраться
for(int j =0; j < m; j++){
if(barrier(i, j, Arr, k)){// Если ячейка преграда, делаем кол-во способов добраться до нее 0, чтобы дальнейшие ячейки не могли иметь путь через нее
possible[i][j]=0;
continue;
}
if(start){
if(i ==0){
possible[i][j]= possible[i][j-1];// Если ячейки из верхней строчки, то можем попасть в нее только с левой ячейки, получаем из нее коли-чество способов добраться
continue;
}
if(j ==0){// Если ячейка из левого столбика, то можем попасть в нее только сверху, получаем из нее коли-чество способов добраться
possible[i][j]= possible[i-1][j];
continue;
}
possible[i][j]= possible[i][j-1]+ possible[i-1][j];// В иных случаях прибавляем кол-во способов добраться из верхней ячейки и левой
}
else{
start =true;
}
}
}
cout<< possible[n-1][m-1]%1000000007;// Выводим остаток от деления на 1000000007