#include <cstdio>
#include <cstring>
#include <queue>
#include <utility>

const int N = 30;
const int N2 = N * 2 + 1;
const int M = 1000000;
const int MOD = (int)1e9 + 7;
const int DELTA_X[] = {-1, 0, 0, 1};
const int DELTA_Y[] = {0, -1, 1, 0};

void update(int& x, int a)
{
    x += a;
    if (x >= MOD) {
        x -= MOD;
    }
}

int extra(int* c, int* id, int* sz, int w, int h, int n)
{
    int up = h - c[0], down = (1LL * w * h - n - up) % MOD, result = id[0] = 0;
    sz[0] = 1;
    for (int i = 1; i < w; ++ i) {
        id[i] = id[i - 1];
        if (!c[i - 1] && !c[i]) {
            update(result, 1LL * up * down % MOD);
        } else {
            id[i] ++;
        }
        sz[id[i]] ++;
        update(up, h - c[i]);
        update(down, MOD - h + c[i]);
    }
    return result;
}

int h, w, n, x[N], y[N], cx[M], cy[M], idx[M], idy[M], szx[N2], szy[N2], blk[N2][N2], dis[N2][N2];

int sz(int x, int y)
{
    return 1LL * szx[x] * szy[y] % MOD;
}

int main()
{
#ifdef LOCAL_JUDGE
    freopen("I.in", "r", stdin);
#endif
    scanf("%d%d%d", &h, &w, &n);
    for (int i = 0; i < n; ++ i) {
        scanf("%d%d", x + i, y + i);
        cx[x[i]] ++, cy[y[i]] ++;
    }
    int result = (2LL * (extra(cx, idx, szx, h, w, n) + extra(cy, idy, szy, w, h, n))) % MOD;
    for (int i = 0; i < n; ++ i) {
        blk[idx[x[i]]][idy[y[i]]] = true;
    }
    for (int sx = 0; sx <= idx[h - 1]; ++ sx) {
        for (int sy = 0; sy <= idy[w - 1]; ++ sy) {
            if (!blk[sx][sy]) {
                memset(dis, -1, sizeof(dis));
                dis[sx][sy] = 0;
                std::queue<std::pair<int, int>> q;
                q.emplace(sx, sy);
                while (!q.empty()) {
                    int x = q.front().first;
                    int y = q.front().second;
                    q.pop();
                    update(result, 1LL * sz(sx, sy) * sz(x, y) % MOD * dis[x][y] % MOD);
                    for (int k = 0; k < 4; ++ k) {
                        int xx = x + DELTA_X[k];
                        int yy = y + DELTA_Y[k];
                        if (0 <= xx && xx <= idx[h - 1] && 0 <= yy && yy <= idy[w - 1] && !blk[xx][yy] && !~dis[xx][yy]) {
                            dis[xx][yy] = dis[x][y] + 1;
                            q.emplace(xx, yy);
                        }
                    }
                }
            }
        }
    }
    printf("%d\n", static_cast<int>(500000004LL * result % MOD));
}
